PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5TaGFyZWQgT2JqZWN0IENhY2hlIGluIEFwYWNoZSBIVFRQIFNlcnZlciAtIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDIuNDwvdGl0bGU+CjxsaW5rIGhyZWY9Ii4vc3R5bGUvY3NzL21hbnVhbC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJNYWluIHN0eWxlc2hlZXQiIC8+CjxsaW5rIGhyZWY9Ii4vc3R5bGUvY3NzL21hbnVhbC1sb29zZS0xMDBwYy5jc3MiIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iTm8gU2lkZWJhciAtIERlZmF1bHQgZm9udCBzaXplIiAvPgo8bGluayBocmVmPSIuL3N0eWxlL2Nzcy9tYW51YWwtcHJpbnQuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJwcmludCIgdHlwZT0idGV4dC9jc3MiIC8+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZS9jc3MvcHJldHRpZnkuY3NzIiAvPgo8c2NyaXB0IHNyYz0iLi9zdHlsZS9zY3JpcHRzL3ByZXR0aWZ5Lm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPC9zY3JpcHQ+Cgo8bGluayBocmVmPSIuL2ltYWdlcy9mYXZpY29uLmljbyIgcmVsPSJzaG9ydGN1dCBpY29uIiAvPjwvaGVhZD4KPGJvZHkgaWQ9Im1hbnVhbC1wYWdlIiBjbGFzcz0ibm8tc2lkZWJhciI+PGRpdiBpZD0icGFnZS1oZWFkZXIiPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4vbW9kL2RpcmVjdGl2ZXMuaHRtbCI+RGlyZWN0aXZlczwvYT4gfCA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2h0dHBkL0ZBUSI+RkFRPC9hPiB8IDxhIGhyZWY9Ii4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPgo8cCBjbGFzcz0iYXBhY2hlIj5BcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAyLjQ8L3A+CjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZmVhdGhlci5wbmciIC8+PC9kaXY+CjxkaXYgY2xhc3M9InVwIj48YSBocmVmPSIuLyI+PGltZyB0aXRsZT0iJmx0Oy0iIGFsdD0iJmx0Oy0iIHNyYz0iLi9pbWFnZXMvbGVmdC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYXRoIj4KPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlPC9hPiAmZ3Q7IDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnLyI+SFRUUCBTZXJ2ZXI8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8iPkRvY3VtZW50YXRpb248L2E+ICZndDsgPGEgaHJlZj0iLi8iPlZlcnNpb24gMi40PC9hPjwvZGl2PjxkaXYgaWQ9InBhZ2UtY29udGVudCI+PGRpdiBpZD0icHJlYW1ibGUiPjxoMT5TaGFyZWQgT2JqZWN0IENhY2hlIGluIEFwYWNoZSBIVFRQIFNlcnZlcjwvaDE+CjxkaXYgY2xhc3M9InRvcGxhbmciPgo8cD48c3Bhbj5BdmFpbGFibGUgTGFuZ3VhZ2VzOiA8L3NwYW4+PGEgaHJlZj0iLi9lbi9zb2NhY2hlLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuL2ZyL3NvY2FjaGUuaHRtbCIgaHJlZmxhbmc9ImZyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkZyYW7nYWlzIj4mbmJzcDtmciZuYnNwOzwvYT48L3A+CjwvZGl2PgoKICAgIDxwPlRoZSBTaGFyZWQgT2JqZWN0IENhY2hlIHByb3ZpZGVzIGEgbWVhbnMgdG8gc2hhcmUgc2ltcGxlIGRhdGEKICAgIGFjcm9zcyBhbGwgYSBzZXJ2ZXIncyB3b3JrZXJzLCByZWdhcmRsZXNzIG9mIDxhIGhyZWY9Im1wbS5odG1sIj50aHJlYWQKICAgIGFuZCBwcm9jZXNzIG1vZGVsczwvYT4uICBJdCBpcyB1c2VkIHdoZXJlIHRoZSBhZHZhbnRhZ2VzIG9mIHNoYXJpbmcKICAgIGRhdGEgYWNyb3NzIHByb2Nlc3NlcyBvdXR3ZWlnaCB0aGUgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgb2YKICAgIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbi48L3A+CiAgPC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0icHJvdmlkZXJzIiBpZD0icHJvdmlkZXJzIj5TaGFyZWQgT2JqZWN0IENhY2hlIFByb3ZpZGVyczwvYT48L2gyPgogICAgCiAgICA8cD5UaGUgc2hhcmVkIG9iamVjdCBjYWNoZSBhcyBzdWNoIGlzIGFuIGFic3RyYWN0aW9uLiAgRm91ciBkaWZmZXJlbnQKICAgIG1vZHVsZXMgaW1wbGVtZW50IGl0LiAgVG8gdXNlIHRoZSBjYWNoZSwgb25lIG9yIG1vcmUgb2YgdGhlc2UgbW9kdWxlcwogICAgbXVzdCBiZSBwcmVzZW50LCBhbmQgY29uZmlndXJlZC48L3A+CiAgICA8cD5UaGUgb25seSBjb25maWd1cmF0aW9uIHJlcXVpcmVkIGlzIHRvIHNlbGVjdCB3aGljaCBjYWNoZSBwcm92aWRlcgogICAgdG8gdXNlLiAgVGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgbW9kdWxlcyB1c2luZyB0aGUgY2FjaGUsIGFuZAogICAgdGhleSBlbmFibGUgc2VsZWN0aW9uIHVzaW5nIGRpcmVjdGl2ZXMgc3VjaCBhcwogICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX2NhY2hlX3NvY2FjaGUuaHRtbCNjYWNoZXNvY2FjaGUiPkNhY2hlU29jYWNoZTwvYT48L2NvZGU+LAogICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX2F1dGhuX3NvY2FjaGUuaHRtbCNhdXRobmNhY2hlc29jYWNoZSI+QXV0aG5DYWNoZVNPQ2FjaGU8L2E+PC9jb2RlPiwKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL21vZF9zc2wuaHRtbCNzc2xzZXNzaW9uY2FjaGUiPlNTTFNlc3Npb25DYWNoZTwvYT48L2NvZGU+LCBhbmQKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL21vZF9zc2wuaHRtbCNzc2xzdGFwbGluZ2NhY2hlIj5TU0xTdGFwbGluZ0NhY2hlPC9hPjwvY29kZT4uPC9wPgogICAgPHA+Q3VycmVudGx5IGF2YWlsYWJsZSBwcm92aWRlcnMgYXJlOjwvcD4KICAgIDxkbD4KICAgIDxkdD4iZGJtIiAoPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi9tb2QvbW9kX3NvY2FjaGVfZGJtLmh0bWwiPm1vZF9zb2NhY2hlX2RibTwvYT48L2NvZGU+KTwvZHQ+CiAgICA8ZGQ+VGhpcyBtYWtlcyB1c2Ugb2YgYSBEQk0gaGFzaCBmaWxlLgogICAgIFRoZSBjaG9pY2Ugb2YgdW5kZXJseWluZyBEQk0gdXNlZCBtYXkgYmUgY29uZmlndXJhYmxlCiAgICAgaWYgdGhlIGluc3RhbGxlZCBBUFIgdmVyc2lvbiBzdXBwb3J0cyBtdWx0aXBsZSBEQk0gaW1wbGVtZW50YXRpb25zLjwvZGQ+CiAgICA8ZHQ+ImRjIiAoPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi9tb2QvbW9kX3NvY2FjaGVfZGMuaHRtbCI+bW9kX3NvY2FjaGVfZGM8L2E+PC9jb2RlPik8L2R0PgogICAgPGRkPlRoaXMgbWFrZXMgdXNlIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vZGlzdGNhY2hlLnNvdXJjZWZvcmdlLm5ldC8iPmRpc3RjYWNoZTwvYT4KICAgIGRpc3RyaWJ1dGVkIHNlc3Npb24gY2FjaGluZyBsaWJyYXJpZXMuPC9kZD4KICAgIDxkdD4ibWVtY2FjaGUiICg8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuL21vZC9tb2Rfc29jYWNoZV9tZW1jYWNoZS5odG1sIj5tb2Rfc29jYWNoZV9tZW1jYWNoZTwvYT48L2NvZGU+KTwvZHQ+CiAgICA8ZGQ+VGhpcyBtYWtlcyB1c2Ugb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly9tZW1jYWNoZWQub3JnLyI+bWVtY2FjaGVkPC9hPgogICAgaGlnaC1wZXJmb3JtYW5jZSwgZGlzdHJpYnV0ZWQgbWVtb3J5IG9iamVjdCBjYWNoaW5nIHN5c3RlbS48L2RkPgogICAgPGR0PiJzaG1jYiIgKDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4vbW9kL21vZF9zb2NhY2hlX3NobWNiLmh0bWwiPm1vZF9zb2NhY2hlX3NobWNiPC9hPjwvY29kZT4pPC9kdD4KICAgIDxkZD5UaGlzIG1ha2VzIHVzZSBvZiBhIGhpZ2gtcGVyZm9ybWFuY2UgY3ljbGljIGJ1ZmZlciBpbnNpZGUgYQogICAgIHNoYXJlZCBtZW1vcnkgc2VnbWVudC48L2RkPgogICAgPC9kbD4KCiAgICA8cD5UaGUgQVBJIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD5jb25zdCBjaGFyICpjcmVhdGUoYXBfc29jYWNoZV9pbnN0YW5jZV90ICoqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF90ICp0bXAsIGFwcl9wb29sX3QgKnApOzwvZHQ+CiAgICAgIDxkZD5DcmVhdGUgYSBzZXNzaW9uIGNhY2hlIGJhc2VkIG9uIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIHN0cmluZy4KICAgICAgVGhlIGluc3RhbmNlIHBvaW50ZXIgcmV0dXJuZWQgaW4gdGhlIGluc3RhbmNlIHBhcmFtZXRlciB3aWxsIGJlCiAgICAgIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc3Vic2VxdWVudCBpbnZvY2F0aW9ucy48L2RkPgoKICAgICAgPGR0PmFwcl9zdGF0dXNfdCBpbml0KGFwX3NvY2FjaGVfaW5zdGFuY2VfdCAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmNuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFwX3NvY2FjaGVfaGludHMgKmhpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3JlYyAqcywgYXByX3Bvb2xfdCAqcG9vbCk8L2R0PgogICAgICA8ZGQ+SW5pdGlhbGl6ZSB0aGUgY2FjaGUuICBUaGUgY25hbWUgbXVzdCBiZSBvZiBtYXhpbXVtIGxlbmd0aCAxNgogICAgICBjaGFyYWN0ZXJzLCBhbmQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgY29uc3VtZXIgb2YgdGhlIGNhY2hlCiAgICAgIHdpdGhpbiB0aGUgc2VydmVyOyB1c2luZyB0aGUgbW9kdWxlIG5hbWUgaXMgcmVjb21tZW5kZWQsIGUuZy4KICAgICAgIm1vZF9zc2wtc2VzcyIuICBUaGlzIHN0cmluZyBtYXkgYmUgdXNlZCB3aXRoaW4gYSBmaWxlc3lzdGVtCiAgICAgIHBhdGggc28gdXNlIG9mIG9ubHkgYWxwaGFudW1lcmljIFthLXowLTlfLV0gY2hhcmFjdGVycyBpcwogICAgICByZWNvbW1lbmRlZC4gIElmIGhpbnRzIGlzIG5vbi1OVUxMLCBpdCBnaXZlcyBhIHNldCBvZiBoaW50cyBmb3IKICAgICAgdGhlIHByb3ZpZGVyLiAgUmV0dXJuIEFQUiBlcnJvciBjb2RlLjwvZGQ+CgogICAgICA8ZHQ+dm9pZCBkZXN0cm95KGFwX3NvY2FjaGVfaW5zdGFuY2VfdCAqaW5zdGFuY2UsIHNlcnZlcl9yZWMgKnMpPC9kdD4KICAgICAgPGRkPkRlc3Ryb3kgYSBnaXZlbiBjYWNoZSBpbnN0YW5jZSBvYmplY3QuPC9kZD4KCiAgICAgIDxkdD5hcHJfc3RhdHVzX3Qgc3RvcmUoYXBfc29jYWNoZV9pbnN0YW5jZV90ICppbnN0YW5jZSwgc2VydmVyX3JlYyAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppZCwgdW5zaWduZWQgaW50IGlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl90aW1lX3QgZXhwaXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wb29sX3QgKnBvb2wpPC9kdD4KICAgICAgPGRkPlN0b3JlIGFuIG9iamVjdCBpbiBhIGNhY2hlIGluc3RhbmNlLjwvZGQ+CgogICAgICA8ZHQ+YXByX3N0YXR1c190IHJldHJpZXZlKGFwX3NvY2FjaGVfaW5zdGFuY2VfdCAqaW5zdGFuY2UsIHNlcnZlcl9yZWMgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaWQsIHVuc2lnbmVkIGludCBpZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgKmRhdGFsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3Bvb2xfdCAqcG9vbCk8L2R0PgogICAgICA8ZGQ+UmV0cmlldmUgYSBjYWNoZWQgb2JqZWN0LjwvZGQ+CgogICAgICA8ZHQ+YXByX3N0YXR1c190IHJlbW92ZShhcF9zb2NhY2hlX2luc3RhbmNlX3QgKmluc3RhbmNlLCBzZXJ2ZXJfcmVjICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppZCwgdW5zaWduZWQgaW50IGlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfcG9vbF90ICpwb29sKTwvZHQ+CiAgICAgIDxkZD5SZW1vdmUgYW4gb2JqZWN0IGZyb20gdGhlIGNhY2hlLjwvZGQ+CgogICAgICA8ZHQ+dm9pZCBzdGF0dXMoYXBfc29jYWNoZV9pbnN0YW5jZV90ICppbnN0YW5jZSwgcmVxdWVzdF9yZWMgKnIsIGludCBmbGFncyk8L2R0PgogICAgICA8ZGQ+RHVtcCB0aGUgc3RhdHVzIG9mIGEgY2FjaGUgaW5zdGFuY2UgZm9yIG1vZF9zdGF0dXMuPC9kZD4KCiAgICAgIDxkdD5hcHJfc3RhdHVzX3QgaXRlcmF0ZShhcF9zb2NhY2hlX2luc3RhbmNlX3QgKmluc3RhbmNlLCBzZXJ2ZXJfcmVjICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmN0eCwgYXBfc29jYWNoZV9pdGVyYXRvcl90ICppdGVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wb29sX3QgKnBvb2wpPC9kdD4KICAgICAgPGRkPkR1bXAgYWxsIGNhY2hlZCBvYmplY3RzIHRocm91Z2ggYW4gaXRlcmF0b3IgY2FsbGJhY2suPC9kZD4KICAgIDwvZGw+CgogIDwvZGl2PjwvZGl2Pgo8ZGl2IGNsYXNzPSJib3R0b21sYW5nIj4KPHA+PHNwYW4+QXZhaWxhYmxlIExhbmd1YWdlczogPC9zcGFuPjxhIGhyZWY9Ii4vZW4vc29jYWNoZS5odG1sIiB0aXRsZT0iRW5nbGlzaCI+Jm5ic3A7ZW4mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi9mci9zb2NhY2hlLmh0bWwiIGhyZWZsYW5nPSJmciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+PC9wPgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgYWx0PSJ0b3AiIC8+PC9hPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxoMj48YSBpZD0iY29tbWVudHNfc2VjdGlvbiIgbmFtZT0iY29tbWVudHNfc2VjdGlvbiI+Q29tbWVudHM8L2E+PC9oMj48ZGl2IGNsYXNzPSJ3YXJuaW5nIj48c3Ryb25nPk5vdGljZTo8L3N0cm9uZz48YnIgLz5UaGlzIGlzIG5vdCBhIFEmYW1wO0Egc2VjdGlvbi4gQ29tbWVudHMgcGxhY2VkIGhlcmUgc2hvdWxkIGJlIHBvaW50ZWQgdG93YXJkcyBzdWdnZXN0aW9ucyBvbiBpbXByb3ZpbmcgdGhlIGRvY3VtZW50YXRpb24gb3Igc2VydmVyLCBhbmQgbWF5IGJlIHJlbW92ZWQgYWdhaW4gYnkgb3VyIG1vZGVyYXRvcnMgaWYgdGhleSBhcmUgZWl0aGVyIGltcGxlbWVudGVkIG9yIGNvbnNpZGVyZWQgaW52YWxpZC9vZmYtdG9waWMuIFF1ZXN0aW9ucyBvbiBob3cgdG8gbWFuYWdlIHRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgc2hvdWxkIGJlIGRpcmVjdGVkIGF0IGVpdGhlciBvdXIgSVJDIGNoYW5uZWwsICNodHRwZCwgb24gRnJlZW5vZGUsIG9yIHNlbnQgdG8gb3VyIDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2xpc3RzLmh0bWwiPm1haWxpbmcgbGlzdHM8L2E+LjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQp2YXIgY29tbWVudHNfc2hvcnRuYW1lID0gJ2h0dHBkJzsKdmFyIGNvbW1lbnRzX2lkZW50aWZpZXIgPSAnaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8yLjQvc29jYWNoZS5odG1sJzsKKGZ1bmN0aW9uKHcsIGQpIHsKICAgIGlmICh3LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT0gImh0dHBkLmFwYWNoZS5vcmciKSB7CiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj48XC9kaXY+Jyk7CiAgICAgICAgdmFyIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgIHMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIHMuYXN5bmMgPSB0cnVlOwogICAgICAgIHMuc3JjID0gJ2h0dHBzOi8vY29tbWVudHMuYXBhY2hlLm9yZy9zaG93X2NvbW1lbnRzLmx1YT9zaXRlPScgKyBjb21tZW50c19zaG9ydG5hbWUgKyAnJnBhZ2U9JyArIGNvbW1lbnRzX2lkZW50aWZpZXI7CiAgICAgICAgKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSB8fCBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0pLmFwcGVuZENoaWxkKHMpOwogICAgfQogICAgZWxzZSB7IAogICAgICAgIGQud3JpdGUoJzxkaXYgaWQ9ImNvbW1lbnRzX3RocmVhZCI+Q29tbWVudHMgYXJlIGRpc2FibGVkIGZvciB0aGlzIHBhZ2UgYXQgdGhlIG1vbWVudC48XC9kaXY+Jyk7CiAgICB9Cn0pKHdpbmRvdywgZG9jdW1lbnQpOwovLy0tPjwhXV0+PC9zY3JpcHQ+PC9kaXY+PGRpdiBpZD0iZm9vdGVyIj4KPHAgY2xhc3M9ImFwYWNoZSI+Q29weXJpZ2h0IDIwMTggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4vbW9kL2RpcmVjdGl2ZXMuaHRtbCI+RGlyZWN0aXZlczwvYT4gfCA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2h0dHBkL0ZBUSI+RkFRPC9hPiB8IDxhIGhyZWY9Ii4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPjwvZGl2PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCmlmICh0eXBlb2YocHJldHR5UHJpbnQpICE9PSAndW5kZWZpbmVkJykgewogICAgcHJldHR5UHJpbnQoKTsKfQovLy0tPjwhXV0+PC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+