Cgo8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CiAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CiAgICA8aGVhZD4KICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CiAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvdGl0bGU+CiAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CiAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IlN0ZWZhbiBCb2Rld2lnIj4KICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iYm9kZXdpZ0BhcGFjaGUub3JnIj4KICAgICAgPC9oZWFkPgoKICAgIDxib2R5PgogICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgICA8L3A+CgogICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CiAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CiAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgogICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgogICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Ib21lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuL3Byb2plY3RzL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPlByb2plY3RzPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAKICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KCiAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QXBhY2hlIEFudAogICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9saWNlbnNlLmh0bWwiPkxpY2Vuc2U8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9hbnRuZXdzLmh0bWwiPk5ld3M8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvYW50L0Zyb250UGFnZSI+V2lraTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2JsZW1zLmh0bWwiPkhhdmluZyBQcm9ibGVtcz88L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCiAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Db250cmlidXRpbmcKICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYWlsLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9zdm4uaHRtbCI+U3VidmVyc2lvbiBSZXBvc2l0b3JpZXM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9uaWdodGxpZXMuaHRtbCI+TmlnaHRseSBCdWlsZHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9idWdzLmh0bWwiPkJ1ZyBEYXRhYmFzZTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWlzc2lvbi5odG1sIj5BcGFjaGUgQW50IE1pc3Npb248L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9ieWxhd3MuaHRtbCI+UHJvamVjdCBCeWxhd3M8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9sZWdhbC5odG1sIj5MZWdhbDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgPC9kaXY+CiAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgogICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1yaWdodC5naWYiPgogIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgogIDxkaXYgY2xhc3M9Im1haW4iPgogIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgPGgxIGNsYXNzPSJ0aXRsZSI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2gxPgogICAgCiAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj5RdWVzdGlvbnM8L2gzPgogICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJ0b2MiPkFib3V0IHRoaXMgRkFRPC9oND4KICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2xhdGVzdC12ZXJzaW9uIj4KICBXaGVyZSBkbyBJIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMKICAgICAgICBkb2N1bWVudD8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2FkZGluZy1mYXFzIj4KICBIb3cgY2FuIEkgY29udHJpYnV0ZSB0byB0aGlzIEZBUT8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2NyZWF0aW5nLWZhcSI+CiAgSG93IGRvIHlvdSBjcmVhdGUgdGhlIEhUTUwgdmVyc2lvbiBvZiB0aGlzCiAgICAgICAgRkFRPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5HZW5lcmFsPC9oND4KICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3doYXQtaXMtYW50Ij4KICBXaGF0IGlzIEFwYWNoZSBBbnQ/CiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNhbnQtbmFtZSI+CiAgV2h5IGRvIHlvdSBjYWxsIGl0IEFudD8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2hpc3RvcnkiPgogIFRlbGwgdXMgYSBsaXR0bGUgYml0IGFib3V0IEFudCdzIGhpc3RvcnkuCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJ0b2MiPkluc3RhbGxhdGlvbjwvaDQ+CiAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNuby1nbnUtdGFyIj4KICBJIGdldCBjaGVja3N1bSBlcnJvcnMgd2hlbiBJIHRyeSB0byBleHRyYWN0IHRoZQogICAgICA8Y29kZT50YXIuZ3o8L2NvZGU+IGRpc3RyaWJ1dGlvbiBmaWxlLiBXaHk/CiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNSZWRIYXRfRVNfMyI+CiAgSG93IGRvIHlvdSBnZXQgYW50LTEuNi54IChvciBhbnkgdmVyc2lvbiBsYXRlciB0aGFuCiAgICAgIDEuNS4yKSB0byB3b3JrIG9uIG9uIFJlZEhhdCBFUyAzPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5Ib3cgZG8gSSAuLi48L2g0PgogICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjaW1wbGVtZW50LW9zLXNwZWNpZmljLWNvbmZpZ3VyYXRpb24iPgogIEhvdyBkbyBJIHJlYWxpemUgb3MtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjYWRkaW5nLWV4dGVybmFsLXRhc2tzIj4KICBIb3cgZG8gSSBhZGQgYW4gZXh0ZXJuYWwgdGFzayB0aGF0IEkndmUgd3JpdHRlbiB0byB0aGUKICAgICAgcGFnZSAiRXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzIj8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2NyZWF0ZS1leHRlbnNpb25zIj4KICBIb3cgZG8gSSBjcmVhdGUgbmV3IHRhc2tzPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcGFzc2luZy1jbGktYXJncyI+CiAgSG93IGRvIEkgcGFzcyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBteQogICAgICAgIGJ1aWxkIGZpbGU/CiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNqaWtlcy1zd2l0Y2hlcyI+CiAgSG93IGNhbiBJIHVzZSBKaWtlcy1zcGVjaWZpYyBjb21tYW5kLWxpbmUKICAgICAgICBzd2l0Y2hlcz8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3NoZWxsLXJlZGlyZWN0LTEiPgogIEhvdyBkbyBJIGluY2x1ZGUgYSAmbHQ7IGNoYXJhY3RlciBpbiBteSBjb21tYW5kLWxpbmUgYXJndW1lbnRzPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjc2hlbGwtcmVkaXJlY3QtMiI+CiAgSG93IGRvIEkgcmVkaXJlY3Qgc3RhbmRhcmQgaW5wdXQgb3Igc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgaW4gdGhlIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzaz8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2JhdGNoLXNoZWxsLWV4ZWN1dGUiPgogIEhvdyBkbyBJIGV4ZWN1dGUgYSBiYXRjaCBmaWxlIG9yIHNoZWxsIHNjcmlwdCBmcm9tIEFudD8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI211bHRpLWNvbmRpdGlvbnMiPgogIEkgd2FudCB0byBleGVjdXRlIGEgcGFydGljdWxhciB0YXJnZXQgb25seSBpZgogICAgICAgIG11bHRpcGxlIGNvbmRpdGlvbnMgYXJlIHRydWUuCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNlbmNvZGluZyI+CiAgSG93IGNhbiBJIGluY2x1ZGUgbmF0aW9uYWwgY2hhcmFjdGVycyBsaWtlIEdlcm1hbgogICAgICAgIHVtbGF1dHMgaW4gbXkgYnVpbGQgZmlsZT8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3VzZS16aXAtaW5zdGVhZC1vZi1qYXIiPgogIEhvdyBkbyBJIHVzZSA8Y29kZT5qYXI8L2NvZGU+J3MgPGNvZGU+TTwvY29kZT4gc3dpdGNoPwogICAgICBJIGRvbid0IHdhbnQgYSBNQU5JRkVTVC4KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3Byb3BlcnR5dmFsdWUtYXMtbmFtZS1mb3ItcHJvcGVydHkiPgogIEhvdyBjYW4gSSBkbyBzb21ldGhpbmcgbGlrZSA8Y29kZT4mbHQ7cHJvcGVydHkgbmFtZT0icHJvcCIKICAgICAgdmFsdWU9IiR7JHthbm90aGVycHJvcH19Ii8mZ3Q7PC9jb2RlPiAoZG91YmxlIGV4cGFuZGluZyB0aGUgcHJvcGVydHkpPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5JdCBkb2Vzbid0IHdvcmsgKGFzIGV4cGVjdGVkKTwvaDQ+CiAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNnZW5yYWwtYWR2aWNlIj4KICBHZW5lcmFsIEFkdmljZQogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjYWx3YXlzLXJlY29tcGlsZXMiPgogIFdoeSBkb2VzIEFudCBhbHdheXMgcmVjb21waWxlIGFsbCBteSBKYXZhIGZpbGVzPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZGVmYXVsdGV4Y2x1ZGVzIj4KICBJJ3ZlIHVzZWQgYSA8Y29kZT4mbHQ7ZGVsZXRlJmd0OzwvY29kZT4gdGFzayB0bwogICAgICBkZWxldGUgdW53YW50ZWQgU291cmNlU2FmZSBjb250cm9sIGZpbGVzIChDVlMgZmlsZXMsIGVkaXRvcgogICAgICBiYWNrdXAgZmlsZXMsIGV0Yy4pLCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIHdvcms7IHRoZSBmaWxlcwogICAgICBuZXZlciBnZXQgZGVsZXRlZC4gV2hhdCdzIHdyb25nPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjc3RvcC1kZXBlbmRlbmN5Ij4KICBJIGhhdmUgYSB0YXJnZXQgSSB3YW50IHRvIHNraXAgaWYgYSBwcm9wZXJ0eSBpcyBzZXQsCiAgICAgIHNvIEkgaGF2ZSA8Y29kZT51bmxlc3M9InByb3BlcnR5IjwvY29kZT4gYXMgYW4gYXR0cmlidXRlCiAgICAgIG9mIHRoZSB0YXJnZXQsIGJ1dCBhbGwgdGhlIHRhcmdldHMgdGhpcyB0YXJnZXQKICAgICAgZGVwZW5kcyBvbiBhcmUgc3RpbGwgZXhlY3V0ZWQuIFdoeT8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2luY2x1ZGUtb3JkZXIiPgogIEluIG15IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sIEkndmUgcHV0IGluIGFuCiAgICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gb2YgYWxsIGZpbGVzIGZvbGxvd2VkIGJ5IGFuCiAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gb2YganVzdCB0aGUgZmlsZXMgSSB3YW50LCBidXQgaXQKICAgICAgaXNuJ3QgZ2l2aW5nIG1lIGFueSBmaWxlcyBhdCBhbGwuIFdoYXQncyB3cm9uZz8KICAgICAgCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNwcm9wZXJ0aWVzLW5vdC10cmltbWVkIj4KICA8Y29kZT5hbnQ8L2NvZGU+IGZhaWxlZCB0byBidWlsZCBteSBwcm9ncmFtIHZpYSBqYXZhYwogICAgICBldmVuIHdoZW4gSSBwdXQgdGhlIG5lZWRlZCBqYXJzIGluIGFuIGV4dGVybmFsCiAgICAgIDxjb2RlPmJ1aWxkLnByb3BlcnRpZXM8L2NvZGU+IGZpbGUgYW5kIHJlZmVyZW5jZSB0aGVtIGJ5CiAgICAgIDxjb2RlPnBhdGhlbGVtZW50PC9jb2RlPiBvciA8Y29kZT5jbGFzc3BhdGggcmVmaWQ8L2NvZGU+LgogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjd2luemlwLWxpZXMiPgogIEFudCBjcmVhdGVzIFdBUiBmaWxlcyB3aXRoIGEgbG93ZXItY2FzZQogICAgICAgIDxjb2RlPndlYi1pbmY8L2NvZGU+IG9yIEpBUiBmaWxlcyB3aXRoIGEgbG93ZXItY2FzZQogICAgICAgIDxjb2RlPm1ldGEtaW5mPC9jb2RlPiBkaXJlY3RvcnkuCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNOb0NsYXNzRGVmRm91bmRFcnJvciI+CiAgSSBpbnN0YWxsZWQgQW50IDEuNi54IGFuZCBub3cgZ2V0CiAgICAgICAgPGNvZGU+RXhjZXB0aW9uIGluIHRocmVhZCAibWFpbiIgamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yOgogICAgICAgIDwvY29kZT4KICAgICAgCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNJbnN0YW50aWF0aW9uRXhjZXB0aW9uIj4KICBJIGluc3RhbGxlZCBBbnQgMS42LnggYW5kIG5vdyBnZXQKICAgICAgICA8Y29kZT5qYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjogb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbjwvY29kZT4KICAgICAgCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNtYW5nbGVkLW1hbmlmZXN0Ij4KICAKICAgICAgICBXaGVuZXZlciBJIHVzZSB0aGUgQW50IGphciBvciBtYW5pZmVzdCByZWxhdGVkIHRhc2tzLCBsb25nIGxpbmVzIGluCiAgICAgICAgbXkgbWFuaWZlc3QgYXJlIHdyYXBwZWQgYXQgNzAgY2hhcmFjdGVycyBhbmQgdGhlIHJlc3VsdGluZyBqYXIgZG9lcwogICAgICAgIG5vdCB3b3JrIGluIG15IGFwcGxpY2F0aW9uIHNlcnZlci4gV2h5IGRvZXMgQW50IGRvIHRoaXM/CiAgICAgIAogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5BbnQgYW5kIElERXMvRWRpdG9yczwvaDQ+CiAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNpbnRlZ3JhdGlvbiI+CiAgSXMgQW50IHN1cHBvcnRlZCBieSBteSBJREUvRWRpdG9yPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZW1hY3MtbW9kZSI+CiAgV2h5IGRvZXNuJ3QgKFgpRW1hY3MvdmkvTWFjT1MgWCdzIHByb2plY3QgYnVpbGRlcgogICAgICBjb3JyZWN0bHkgcGFyc2UgdGhlIGVycm9yIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBBbnQ/CiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJ0b2MiPkFkdmFuY2VkIElzc3VlczwvaDQ+CiAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNkdGQiPgogIElzIHRoZXJlIGEgRFREIHRoYXQgSSBjYW4gdXNlIHRvIHZhbGlkYXRlIG15IGJ1aWxkCiAgICAgIGZpbGVzPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjeG1sLWVudGl0eS1pbmNsdWRlIj4KICBIb3cgZG8gSSBpbmNsdWRlIGFuIFhNTCBzbmlwcGV0IGluIG15IGJ1aWxkIGZpbGU/CiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNtYWlsLWxvZ2dlciI+CiAgSG93IGRvIEkgc2VuZCBhbiBlbWFpbCB3aXRoIHRoZSByZXN1bHQgb2YgbXkgYnVpbGQKICAgICAgICBwcm9jZXNzPwogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjbGlzdGVuZXItcHJvcGVydGllcyI+CiAgSG93IGRvIEkgZ2V0IGF0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgQW50IHdhcyBydW5uaW5nCiAgICAgIHdpdGggZnJvbSBpbnNpZGUgQnVpbGRMaXN0ZW5lcj8KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InRvYyI+S25vd24gUHJvYmxlbXM8L2g0PgogICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcmVtb3ZlLWNyIj4KICAmbHQ7Y2htb2QmZ3Q7IG9yICZsdDtleGVjJmd0OyBkb2Vzbid0IHdvcmsgaW4gQW50CiAgICAgICAgMS4zIG9uIFVuaXgKICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2phdmFkb2MtY2Fubm90LWV4ZWN1dGUiPgogIEphdmFEb2MgZmFpbGVkOiBqYXZhLmlvLklPRXhjZXB0aW9uOiBqYXZhZG9jOiBjYW5ub3QgZXhlY3V0ZQogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZGVsZWdhdGluZy1jbGFzc2xvYWRlciI+CiAgJmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKICAgICAgJmx0O2NsYXNzcGF0aCZndDsKICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij4KICAmbHQ7c3R5bGUmZ3Q7IG9yICZsdDtqdW5pdCZndDsgaWdub3JlcyBteQogICAgICAmbHQ7Y2xhc3NwYXRoJmd0OyAtIEFudCAxLjUueCB2ZXJzaW9uCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyLTEuNiI+CiAgJmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKICAgICAgJmx0O2NsYXNzcGF0aCZndDsgLSBBbnQgMS42LnggdmVyc2lvbgogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjd2lueHAtamRrMTQtYW50MTQiPgogIFdoZW4gcnVubmluZyBBbnQgMS40IG9uIFdpbmRvd3MgWFAgYW5kIEpESyAxLjQsIEkgZ2V0CiAgICAgIHZhcmlvdXMgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4sIGZvcmsKICAgICAgPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiBvciBhY2Nlc3MgZW52aXJvbm1lbnQKICAgICAgdmFyaWFibGVzLgogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjMS41LWN5Z3dpbi1zaCI+CiAgVGhlIDxjb2RlPmFudDwvY29kZT4gd3JhcHBlciBzY3JpcHQgb2YgQW50IDEuNSBmYWlscwogICAgICBmb3IgQ3lnd2luIGlmIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBpcyBzZXQgdG8gYSBXaW5kb3dzIHN0eWxlCiAgICAgIHBhdGguCiAgICAgIDwvYT48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiMxLjUuMi16aXAtYnJva2VuIj4KICA8Y29kZT4mbHQ7emlwJmd0OzwvY29kZT4gaXMgYnJva2VuIGluIEFudCAxLjUuMi4KICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3Vua25vd25lbGVtZW50LnRhc2tjb250YWluZXIiPgogIAogICAgICAgIFdoeSBkbyBteSBjdXN0b20gdGFzayBjb250YWluZXJzIHNlZSBVbmtub3duIEVsZW1lbnRzIGluIEFudCAxLjYKICAgICAgICAtIHRoZXkgd29ya2VkIGluIEFudCAxLjU/CiAgICAgIAogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjamF2YS5leGNlcHRpb24uc3RhY2t0cmFjZSI+CiAgCiAgICAgICAgVGhlIHByb2dyYW0gSSBydW4gdmlhICZsdDtqYXZhJmd0OyB0aHJvd3MgYW4gZXhjZXB0aW9uIGJ1dCBJCiAgICAgICAgY2FuJ3Qgc2VlbSB0byBnZXQgdGhlIGZ1bGwgc3RhY2sgdHJhY2UuCiAgICAgIAogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjanVuaXQtbm8tcnVudGltZS14bWwiPgogIAogICAgICAgIFVzaW5nIGZvcm1hdD0ieG1sIiwgJmx0O2p1bml0Jmd0OyBmYWlscyB3aXRoIGEKICAgICAgICA8Y29kZT5Ob0NsYXNzRGVmRm91bmRFcnJvcjwvY29kZT4gaWYgZm9ya2VkLgogICAgICAKICAgICAgPC9hPjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3hhbGFuLWpkazEuNSI+CiAgCiAgICAgICAgPGNvZGU+Jmx0O2p1bml0cmVwb3J0Jmd0OzwvY29kZT4gZG9lc24ndCB3b3JrIHdpdGggSkRLIDEuNSBidXQKICAgICAgICB3b3JrZWQgZmluZSB3aXRoIEpESyAxLjQuCiAgICAgIAogICAgICA8L2E+PC9saT4KICAgICAgICAgICAgPC91bD4KICAgIAogICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPkFuc3dlcnM8L2gzPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJsYXRlc3QtdmVyc2lvbiI+PC9hPgogICAgICBXaGVyZSBkbyBJIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMKICAgICAgICBkb2N1bWVudD8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+VGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQgYXQgQW50J3MgaG9tZXBhZ2UKICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCI+aHR0cDovL2FudC5hcGFjaGUub3JnL2ZhcS5odG1sPC9hPi48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImFkZGluZy1mYXFzIj48L2E+CiAgICAgIEhvdyBjYW4gSSBjb250cmlidXRlIHRvIHRoaXMgRkFRPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5UaGUgcGFnZSB5b3UgYXJlIGxvb2tpbmcgaXQgaXMgZ2VuZXJhdGVkIGZyb20KICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsveGRvY3MvZmFxLnhtbCI+dGhpczwvYT4KICAgICAgICAgIGRvY3VtZW50LiAgSWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IHF1ZXN0aW9uLCBwbGVhc2Ugc3VibWl0CiAgICAgICAgICBhIHBhdGNoIGFnYWluc3QgdGhpcyBkb2N1bWVudCB0byBvbmUgb2YgQW50J3MgbWFpbGluZyBsaXN0czsKICAgICAgICAgIGhvcGVmdWxseSwgdGhlIHN0cnVjdHVyZSBpcyBzZWxmLWV4cGxhbmF0b3J5LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBhIHBhdGNoLCBzZWUgdGhlIHBhdGNoZXMKICAgICAgICAgIHNlY3Rpb24gb2YgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL3NvdXJjZS5odG1sIj50aGlzCiAgICAgICAgICBwYWdlPC9hPi48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImNyZWF0aW5nLWZhcSI+PC9hPgogICAgICBIb3cgZG8geW91IGNyZWF0ZSB0aGUgSFRNTCB2ZXJzaW9uIG9mIHRoaXMKICAgICAgICBGQVE/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPldlIHVzZQogICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvYW5ha2lhLmh0bWwiPkFuYWtpYTwvYT4KICAgICAgICB0byByZW5kZXIgdGhlIEhUTUwgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBYTUwgZmlsZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBWZWxvY2l0eSBzdHlsZXNoZWV0cyB1c2VkIHRvIHByb2Nlc3MgdGhlIFhNTCBmaWxlcyBjYW4KICAgICAgICBiZSBmb3VuZCBpbiB0aGUgPGNvZGU+eGRvY3Mvc3R5bGVzaGVldHM8L2NvZGU+IHN1YmRpcmVjdG9yeSBvZgogICAgICAgIEFudCdzIFNWTiByZXBvc2l0b3J5IC0gdGhlIGJ1aWxkIGZpbGUKICAgICAgICA8Y29kZT5kb2NzLnhtbDwvY29kZT4gYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgYW50IFNWTgogICAgICAgIG1vZHVsZSAodHJ1bmspIGlzIHVzZWQgdG8gZHJpdmUgQW5ha2lhLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmaWxlIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSB0aGUKICAgICAgICA8Y29kZT5qYWthcnRhLXNpdGUyPC9jb2RlPiBDVlMgbW9kdWxlIGNoZWNrZWQgb3V0IGFzIHdlbGwsIGJ1dAogICAgICAgIGlmIHlvdSBmb2xsb3cgdGhlIGluc3RydWN0aW9uIGZyb20gQW5ha2lhJ3MgaG9tZXBhZ2UsIHlvdQogICAgICAgIHNob3VsZCBnZXQgaXQgdG8gd29yayB3aXRob3V0IHRoYXQuICBKdXN0IG1ha2Ugc3VyZSBhbGwKICAgICAgICByZXF1aXJlZCBqYXJzIGFyZSBpbiB0aGUgdGFzaydzIGNsYXNzcGF0aC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9IndoYXQtaXMtYW50Ij48L2E+CiAgICAgIFdoYXQgaXMgQXBhY2hlIEFudD8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+IEFudCBpcyBhIEphdmEtYmFzZWQgYnVpbGQgdG9vbC4gSW4gdGhlb3J5LCBpdCBpcyBraW5kIG9mCiAgICAgICAgbGlrZSBNYWtlLCB3aXRob3V0IE1ha2UncyB3cmlua2xlcyBhbmQgd2l0aCB0aGUgZnVsbAogICAgICAgIHBvcnRhYmlsaXR5IG9mIHB1cmUgSmF2YSBjb2RlLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iYW50LW5hbWUiPjwvYT4KICAgICAgV2h5IGRvIHlvdSBjYWxsIGl0IEFudD8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+QWNjb3JkaW5nIHRvIEFudCdzIG9yaWdpbmFsIGF1dGhvciwgSmFtZXMgRHVuY2FuCiAgICAgICAgRGF2aWRzb24sIHRoZSBuYW1lIGlzIGFuIGFjcm9ueW0gZm9yICJBbm90aGVyIE5lYXQKICAgICAgICBUb29sIi48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkxhdGVyIGV4cGxhbmF0aW9ucyBnbyBhbG9uZyB0aGUgbGluZXMgb2YgImFudHMKICAgICAgICBkbyBhbiBleHRyZW1lbHkgZ29vZCBqb2IgYXQgYnVpbGRpbmcgdGhpbmdzIiwgb3IKICAgICAgICAiYW50cyBhcmUgdmVyeSBzbWFsbCBhbmQgY2FuIGNhcnJ5IGEgd2VpZ2h0IGRvemVucyBvZiB0aW1lcwogICAgICAgIHRoZWlyIG93biIgLSBkZXNjcmliaW5nIHdoYXQgQW50IGlzIGludGVuZGVkIHRvCiAgICAgICAgYmUuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJoaXN0b3J5Ij48L2E+CiAgICAgIFRlbGwgdXMgYSBsaXR0bGUgYml0IGFib3V0IEFudCdzIGhpc3RvcnkuCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPkluaXRpYWxseSwgQW50IHdhcyBwYXJ0IG9mIHRoZSBUb21jYXQgY29kZSBiYXNlLCB3aGVuIGl0IHdhcwogICAgICAgIGRvbmF0ZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJdCB3YXMKICAgICAgICBjcmVhdGVkIGJ5IEphbWVzIER1bmNhbiBEYXZpZHNvbiwgd2hvIGlzIGFsc28gdGhlIG9yaWdpbmFsCiAgICAgICAgYXV0aG9yIG9mIFRvbWNhdC4gQW50IHdhcyB0aGVyZSB0byBidWlsZCBUb21jYXQsIG5vdGhpbmcKICAgICAgICBlbHNlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+U29vbiB0aGVyZWFmdGVyLCBzZXZlcmFsIG9wZW4gc291cmNlIEphdmEgcHJvamVjdHMgcmVhbGl6ZWQKICAgICAgICB0aGF0IEFudCBjb3VsZCBzb2x2ZSB0aGUgcHJvYmxlbXMgdGhleSBoYWQgd2l0aCBNYWtlZmlsZXMuCiAgICAgICAgU3RhcnRpbmcgd2l0aCB0aGUgcHJvamVjdHMgaG9zdGVkIGF0IEpha2FydGEgYW5kIHRoZSBvbGQgSmF2YQogICAgICAgIEFwYWNoZSBwcm9qZWN0LCBBbnQgc3ByZWFkIGxpa2UgYSB2aXJ1cyBhbmQgaXMgbm93IHRoZSBidWlsZAogICAgICAgIHRvb2wgb2YgY2hvaWNlIGZvciBhIGxvdCBvZiBwcm9qZWN0cy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkluIEphbnVhcnkgMjAwMCwgQW50IHdhcyBtb3ZlZCB0byBhIHNlcGFyYXRlIENWUyBtb2R1bGUgYW5kCiAgICAgICAgd2FzIHByb21vdGVkIHRvIGEgcHJvamVjdCBvZiBpdHMgb3duLCBpbmRlcGVuZGVudCBvZgogICAgICAgIFRvbWNhdCwgYW5kIGJlY2FtZSBBcGFjaGUgQW50LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGZpcnN0IHZlcnNpb24gb2YgQW50IHRoYXQgd2FzIGV4cG9zZWQgdG8gYSBsYXJnZXIgYXVkaWVuY2UKICAgICAgICB3YXMgdGhlIG9uZSB0aGF0IHNoaXBwZWQgd2l0aCBUb21jYXQncyAzLjEgcmVsZWFzZSBvbiAxOSBBcHJpbAogICAgICAgIDIwMDAuICBUaGlzIHZlcnNpb24gaGFzIGxhdGVyIGJlZW4gcmVmZXJyZWQgdG8gYXMgQW50CiAgICAgICAgMC4zLjEuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBvZiBBbnQgYXMgYSBzdGFuZC1hbG9uZSBwcm9kdWN0IHdhcwogICAgICAgIEFudCAxLjEsIHJlbGVhc2VkIG9uIDE5IEp1bHkgMjAwMC4gIFRoZSBjb21wbGV0ZSByZWxlYXNlCiAgICAgICAgaGlzdG9yeTo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgQW50IFZlcnNpb24KICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIFJlbGVhc2UgRGF0ZQogICAgICA8L3RoPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuMQogICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMTkgSnVseSAyMDAwCiAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMS4yCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAyNCBPY3RvYmVyIDIwMDAKICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxLjMKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDMgTWFyY2ggMjAwMQogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNAogICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMyBTZXB0ZW1iZXIgMjAwMQogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNC4xCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxMSBPY3RvYmVyIDIwMDEKICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxLjUKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEwIEp1bHkgMjAwMgogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNS4xCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAzIE9jdG9iZXIgMjAwMgogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNS4yCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAzIE1hcmNoIDIwMDMKICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxLjUuMwogICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgOSBBcHJpbCAyMDAzCiAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMS41LjQKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEyIEF1Z3VzdCAyMDAzCiAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMS42LjAKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDE4IERlY2VtYmVyIDIwMDMKICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxLjYuMQogICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMTIgRmVicnVhcnkgMjAwNAogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNi4yCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxNiBKdWx5IDIwMDQKICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxLjYuMwogICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgMjggQXByaWwgMjAwNQogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNi40CiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxOSBNYXkgMjAwNQogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNi41CiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAyIEp1bmUgMjAwNQogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIDEuNy4wCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAxOSBEZWNlbWJlciAyMDA2CiAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJuby1nbnUtdGFyIj48L2E+CiAgICAgIEkgZ2V0IGNoZWNrc3VtIGVycm9ycyB3aGVuIEkgdHJ5IHRvIGV4dHJhY3QgdGhlCiAgICAgIDxjb2RlPnRhci5nejwvY29kZT4gZGlzdHJpYnV0aW9uIGZpbGUuIFdoeT8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+QW50J3MgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIGZpbGUgbmFtZXMgdGhhdCBhcmUgbG9uZ2VyCiAgICAgICAgdGhhbiAxMDAgY2hhcmFjdGVycywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3RhbmRhcmQKICAgICAgICB0YXIgZmlsZSBmb3JtYXQuIFNldmVyYWwgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0YXIgdXNlCiAgICAgICAgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2F5cyB0byB3b3JrIGFyb3VuZCB0aGlzCiAgICAgICAgcmVzdHJpY3Rpb24uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQncyAmbHQ7dGFyJmd0OyB0YXNrIGNhbiBjcmVhdGUgdGFyIGFyY2hpdmVzIHRoYXQgdXNlCiAgICAgICAgdGhlIEdOVSB0YXIgZXh0ZW5zaW9uLCBhbmQgdGhpcyBoYXMgYmVlbiB1c2VkIHdoZW4gcHV0dGluZwogICAgICAgIHRvZ2V0aGVyIHRoZSBkaXN0cmlidXRpb24uIElmIHlvdSBhcmUgdXNpbmcgYSBkaWZmZXJlbnQKICAgICAgICB2ZXJzaW9uIG9mIHRhciAoZm9yIGV4YW1wbGUsIHRoZSBvbmUgc2hpcHBpbmcgd2l0aCBTb2xhcmlzKSwKICAgICAgICB5b3UgY2Fubm90IHVzZSBpdCB0byBleHRyYWN0IHRoZSBhcmNoaXZlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIHNvbHV0aW9uIGlzIHRvIGVpdGhlciBpbnN0YWxsIEdOVSB0YXIsIHdoaWNoIGNhbiBiZQogICAgICAgIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvdGFyLmh0bWwiPmhlcmU8L2E+LAogICAgICAgIG9yIHVzZSB0aGUgemlwIGFyY2hpdmUgaW5zdGVhZCAoeW91IGNhbiBleHRyYWN0IGl0IHVzaW5nCiAgICAgICAgPGNvZGU+amFyIHhmPC9jb2RlPikuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJSZWRIYXRfRVNfMyI+PC9hPgogICAgICBIb3cgZG8geW91IGdldCBhbnQtMS42LnggKG9yIGFueSB2ZXJzaW9uIGxhdGVyIHRoYW4KICAgICAgMS41LjIpIHRvIHdvcmsgb24gb24gUmVkSGF0IEVTIDM/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPlJlZGhhdCBFUyAzLjAgY29tZXMgaW5zdGFsbGVkIHdpdGggYW50IDEuNS4yLiBFdmVuIGlmIHlvdQogICAgICAgIGhhdmUgeW91ciBQQVRIIGFuZCBBTlRfSE9NRSB2YXJpYWJsZXMgc2V0IGNvcnJlY3RseSB0byBhIGxhdGVyCiAgICAgICAgdmVyc2lvbiBvZiBhbnQsIHlvdSB3aWxsIGFsd2F5cyBiZSBmb3JjZWQgdG8gdXNlIHRoZQogICAgICAgIHByZWluc3RhbGxlZCB2ZXJzaW9uLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VG8gdXNlIGEgbGF0ZXIgdmVyc2lvbiBvZiBhbnQgb24gdGhpcyBPUyB5b3UgY291bGQgZG8gdGhlCiAgICAgICAgZm9sbG93aW5nOjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CiQgYW50IC12ZXJzaW9uCkFwYWNoZSBBbnQgdmVyc2lvbiAxLjUuMi0yMyBjb21waWxlZCBvbiBOb3ZlbWJlciAxMiAyMDAzCiQgc3UgLQojIHJwbSAtZSBhbnQgYW50LWxpYnMKIyBleGl0CiQgaGFzaCAtcgokIGFudCAtdmVyc2lvbgpBcGFjaGUgQW50IHZlcnNpb24gMS42LjIgY29tcGlsZWQgb24gSnVseSAxNiAyMDA0CjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJpbXBsZW1lbnQtb3Mtc3BlY2lmaWMtY29uZmlndXJhdGlvbiI+PC9hPgogICAgICBIb3cgZG8gSSByZWFsaXplIG9zLS1zcGVjaWZpYyBjb25maWd1cmF0aW9ucz8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvcmUgaWRlYSBpcyB1c2luZyBwcm9wZXJ0eSBmaWxlcyB3aGljaCBuYW1lIGFjY29yZHMgdG8gdGhlCiAgICAgICAgb3MtbmFtZS4gVGhlbiBzaW1wbHkgdXNlIHRoZSBidWlsZC1pbiBwcm9wZXJ0eSA8dHQ+b3MubmFtZTwvdHQ+LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGJldHRlciB1c2UgeW91IHNob3VsZCBhbHNvIHByb3ZpZGUgYSBmaWxlIHdpdGggZGVmYXVsIHZhbHVlcy4KICAgICAgICBCdXQgYmUgY2FyZWZ1bCB3aXRoIHRoZSBjb3JyZWN0IG9zLW5hbWVzLiBGb3IgdGVzdCBzaW1wbHkgJmx0O2VjaG8mZ3Q7CiAgICAgICAgdGhlICR7b3MubmFtZX0gb24gYWxsIG1hY2hpbmVzIGFuZCB5b3UgY2FuIGJlIHN1cmUgdG8gdXNlIHRoZSByaWdodAogICAgICAgIGZpbGUgbmFtZXMuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KICAgICAgICAgICZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90OyR7b3MubmFtZX0ucHJvcGVydGllcyZxdW90Oy8mZ3Q7CiAgICAgICAgICAmbHQ7cHJvcGVydHkgZmlsZT0mcXVvdDtkZWZhdWx0LnByb3BlcnRpZXMmcXVvdDsvJmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iYWRkaW5nLWV4dGVybmFsLXRhc2tzIj48L2E+CiAgICAgIEhvdyBkbyBJIGFkZCBhbiBleHRlcm5hbCB0YXNrIHRoYXQgSSd2ZSB3cml0dGVuIHRvIHRoZQogICAgICBwYWdlICJFeHRlcm5hbCBUb29scyBhbmQgVGFza3MiPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5Kb2luIGFuZCBwb3N0IGEgbWVzc2FnZSB0byB0aGUgZGV2IG9yIHVzZXIgbWFpbGluZwogICAgICAgIGxpc3QgKG9uZSBsaXN0IGlzIGVub3VnaCksIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nCiAgICAgICAgaW5mb3JtYXRpb246PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+dGhlIG5hbWUgb2YgdGhlIHRhc2svdG9vbDwvbGk+CiAgICAgICAgICA8bGk+YSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay90b29sPC9saT4KICAgICAgICAgIDxsaT5hIENvbXBhdGliaWxpdHk6IGVudHJ5IHN0YXRpbmcgd2l0aCB3aGljaCB2ZXJzaW9uKHMpIG9mCiAgICAgICAgICBBbnQgdGhlIHRvb2wvdGFzayBpcyBjb21wYXRpYmxlIHRvPC9saT4KICAgICAgICAgIDxsaT5hIFVSTDogZW50cnkgbGlua2luZyB0byB0aGUgbWFpbiBwYWdlIG9mIHRoZSB0b29sL3Rhc2s8L2xpPgogICAgICAgICAgPGxpPmEgQ29udGFjdDogZW50cnkgY29udGFpbmluZyB0aGUgZW1haWwgYWRkcmVzcyBvciB0aGUgVVJMCiAgICAgICAgICBvZiBhIHdlYnBhZ2UgZm9yIHRoZSBwZXJzb24gb3IgbGlzdCB0byBjb250YWN0IGZvciBpc3N1ZXMKICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIHRvb2wvdGFzay4gIDxzdHJvbmc+Tm90ZSB0aGF0IHdlJ2xsIGFkZCBhCiAgICAgICAgICBsaW5rIG9uIHRoZSBwYWdlLCBzbyBhbnkgZW1haWwgYWRkcmVzcyBhZGRlZCB0aGVyZSBpcyBub3QKICAgICAgICAgIG9iZnVzY2F0ZWQgYW5kIGNhbiAoYW5kIHByb2JhYmx5IHdpbGwpIGJlIGFidXNlZCBieSByb2JvdHMKICAgICAgICAgIGhhcnZlc3Rpbmcgd2Vic2l0ZXMgZm9yIGFkZHJlc3NlcyB0byBzcGFtLjwvc3Ryb25nPjwvbGk+CiAgICAgICAgICA8bGk+YSBMaWNlbnNlOiBlbnRyeSBjb250YWluaW5nIHRoZSB0eXBlIG9mIGxpY2Vuc2UgZm9yIHRoZQogICAgICAgICAgdG9vbC90YXNrPC9saT4KICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgcHJlZmVycmVkIGZvcm1hdCBmb3IgdGhpcyBpbmZvcm1hdGlvbiBpcyBhIHBhdGNoIHRvIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsveGRvY3MvZXh0ZXJuYWwueG1sIj50aGlzPC9hPgogICAgICAgIGRvY3VtZW50LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGhhdmUgd3JpdHRlbiBzb21ldGhpbmcgYmlnZ2VyIHRoYW4gYSAnc2ltcGxlIHBsdWdpbicgdG8gQW50IGl0CiAgICAgICAgbWF5IGJlIGJldHRlciB0byBhZGQgdGhlIGxpbmsgdG8gPGEgaHJlZj0icHJvamVjdHMuaHRtbCI+cHJvamVjdHMuaHRtbDwvYT4uCiAgICAgICAgVGhlIHByb2NlZHVyZSB0byBhZGQgaXQgaXMgdGhlIHNhbWUuIFRoZSBmaWxlIHRvIHBhdGNoIGlzIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsveGRvY3MvcHJvamVjdHMueG1sIj50aGlzPC9hPgogICAgICAgIGRvY3VtZW50LiBUaGUgc3ludGF4IG9mIHRoYXQgZmlsZSBpcyB0aGUgc2FtZS48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImNyZWF0ZS1leHRlbnNpb25zIj48L2E+CiAgICAgIEhvdyBkbyBJIGNyZWF0ZSBuZXcgdGFza3M/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPkFwYXJ0IGZyb20gYSBsb3Qgb2YgaW5mb3JtYXRpb24gb24gdXNpbmcgQW50LCB0aGUKICAgICAgICA8YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPiBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uCiAgICAgICAgb24gaG93IHRvIGV4dGVuZCBBbnQgd2l0aCBuZXcgdGFza3MuIFRoaXMgaW5mb3JtYXRpb24KICAgICAgICBjYW4gYmUgZm91bmQgdW5kZXIgIkRldmVsb3Bpbmcgd2l0aCBBbnQiLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q2hhbmNlcyBhcmUgdGhhdCBzb21lb25lIGVsc2UgYWxyZWFkeSBjcmVhdGVkIHRoZSB0YXNrIHlvdQogICAgICAgIHdhbnQgdG8gY3JlYXRlLCBpdCBtYXkgYmUgd2lzZSB0byBzZWUKICAgICAgICA8YSBocmVmPSJleHRlcm5hbC5odG1sIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2E+IGFuZAogICAgICAgIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+IGZpcnN0LjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0icGFzc2luZy1jbGktYXJncyI+PC9hPgogICAgICBIb3cgZG8gSSBwYXNzIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvIG15CiAgICAgICAgYnVpbGQgZmlsZT8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+VXNlIHByb3BlcnRpZXMuIFVzaW5nIDxjb2RlPmFudAogICAgICAgIC1EPGVtPm5hbWU8L2VtPj08ZW0+dmFsdWU8L2VtPjwvY29kZT4gbGV0cyB5b3UgZGVmaW5lIHZhbHVlcyBmb3IKICAgICAgICBwcm9wZXJ0aWVzIG9uIHRoZSBBbnQgY29tbWFuZCBsaW5lLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiB0aGVuIGJlCiAgICAgICAgdXNlZCB3aXRoaW4geW91ciBidWlsZCBmaWxlIGFzCiAgICAgICAgYW55IG5vcm1hbCBwcm9wZXJ0eTogPGNvZGU+JHs8ZW0+bmFtZTwvZW0+fTwvY29kZT4gd2lsbCBwdXQgaW4KICAgICAgICA8Y29kZT48ZW0+dmFsdWU8L2VtPjwvY29kZT4uPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJqaWtlcy1zd2l0Y2hlcyI+PC9hPgogICAgICBIb3cgY2FuIEkgdXNlIEppa2VzLXNwZWNpZmljIGNvbW1hbmQtbGluZQogICAgICAgIHN3aXRjaGVzPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5BIGNvdXBsZSBvZiBzd2l0Y2hlcyBhcmUgc3VwcG9ydGVkIHZpYSAibWFnaWMiCiAgICAgICAgICBwcm9wZXJ0aWVzOjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJGb3JyZXN0VGFibGUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICBzd2l0Y2gKICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIHByb3BlcnR5CiAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICBkZWZhdWx0CiAgICAgIDwvdGg+CiAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgK0UKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyLmVtYWNzCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICBmYWxzZSA9PSBub3Qgc2V0CiAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgK1AKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyLnBlZGFudGljCiAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICBmYWxzZSA9PSBub3Qgc2V0CiAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgK0YKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIGZhbHNlID09IG5vdCBzZXQKICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCiAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8c3Ryb25nPihPbmx5IGZvciBBbnQgJmx0OyAxLjQ7IHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgICAgICAgPGNvZGU+PHN0cm9uZz5ub3dhcm48L3N0cm9uZz48L2NvZGU+CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPjxzdHJvbmc+Jmx0O2phdmFjJmd0Ozwvc3Ryb25nPjwvY29kZT4KICAgICAgICAgICAgICAgIHRhc2sgYWZ0ZXIgdGhhdC4pPC9zdHJvbmc+PGJyIC8+LW5vd2FybgogICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgogICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgogICAgICAgICAgYnVpbGQuY29tcGlsZXIud2FybmluZ3MKICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgIHRydWUgPT0gbm90IHNldAogICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBBbnQgJmd0Oz0gMS41LCB5b3UgY2FuIGFsc28gdXNlIG5lc3RlZAogICAgICAgICAgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4gZWxlbWVudHMgd2l0aCB0aGUKICAgICAgICAgIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2suPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJzaGVsbC1yZWRpcmVjdC0xIj48L2E+CiAgICAgIEhvdyBkbyBJIGluY2x1ZGUgYSAmbHQ7IGNoYXJhY3RlciBpbiBteSBjb21tYW5kLWxpbmUgYXJndW1lbnRzPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5UaGUgc2hvcnQgYW5zd2VyIGlzICJVc2U6IDxjb2RlPiZhbXA7bHQ7PC9jb2RlPiIuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgbG9uZyBhbnN3ZXIgaXMgdGhhdCB0aGlzIHByb2JhYmx5IHdvbid0IGRvIHdoYXQgeW91CiAgICAgICAgd2FudCBhbnl3YXkgKHNlZSA8YSBocmVmPSIjc2hlbGwtcmVkaXJlY3QtMiI+dGhlIG5leHQKICAgICAgICBzZWN0aW9uPC9hPikuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJzaGVsbC1yZWRpcmVjdC0yIj48L2E+CiAgICAgIEhvdyBkbyBJIHJlZGlyZWN0IHN0YW5kYXJkIGlucHV0IG9yIHN0YW5kYXJkIG91dHB1dAogICAgICAgIGluIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2s/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPlNheSB5b3Ugd2FudCB0byByZWRpcmVjdCB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBvZiB0aGUKICAgICAgICA8Y29kZT5tNDwvY29kZT4gY29tbWFuZCB0byB3cml0ZSB0byBhIGZpbGUsIHNvbWV0aGluZwogICAgICAgIGxpa2U6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4Kc2hlbGwtcHJvbXB0Jmd0OyBtNCBmb28ubTQgJmd0OyBmb28KPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPmFuZCB0cnkgdG8gdHJhbnNsYXRlIGl0IGludG88L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7ZXhlYyBleGVjdXRhYmxlPSZxdW90O200JnF1b3Q7Jmd0OwogICZsdDthcmcgdmFsdWU9JnF1b3Q7Zm9vLm00JnF1b3Q7LyZndDsKICAmbHQ7YXJnIHZhbHVlPSZxdW90OyZhbXA7Z3Q7JnF1b3Q7LyZndDsKICAmbHQ7YXJnIHZhbHVlPSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CiZsdDsvZXhlYyZndDsKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgd2lsbCBub3QgZG8gd2hhdCB5b3UgZXhwZWN0LiAgVGhlIG91dHB1dCByZWRpcmVjdGlvbiBpcwogICAgICAgIHBlcmZvcm1lZCBieSB5b3VyIHNoZWxsLCBub3QgdGhlIGNvbW1hbmQgaXRzZWxmLCBzbyB0aGlzCiAgICAgICAgc2hvdWxkIHJlYWQ6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KJmx0O2V4ZWMgZXhlY3V0YWJsZT0mcXVvdDsvYmluL3NoJnF1b3Q7Jmd0OwogICZsdDthcmcgdmFsdWU9JnF1b3Q7LWMmcXVvdDsgLyZndDsKICAmbHQ7YXJnIHZhbHVlPSZxdW90O200IGZvby5tNCAmYW1wO2d0OyBmb28mcXVvdDsgLyZndDsKJmx0Oy9leGVjJmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm90ZSB0aGF0IHlvdSBtdXN0IHVzZSB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGF0dHJpYnV0ZSBvZgogICAgICAgIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBpbiB0aGUgbGFzdCBlbGVtZW50LCBpbiBvcmRlciB0byBoYXZlCiAgICAgICAgdGhlIGNvbW1hbmQgcGFzc2VkIGFzIGEgc2luZ2xlLCBxdW90ZWQgYXJndW1lbnQuIEFsdGVybmF0aXZlbHksCiAgICAgICAgeW91IGNhbiB1c2U6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KJmx0O2V4ZWMgZXhlY3V0YWJsZT0mcXVvdDsvYmluL3NoJnF1b3Q7Jmd0OwogICZsdDthcmcgbGluZT0nLWMgJnF1b3Q7bTQgZm9vLm00ICZhbXA7Z3Q7IGZvbyZxdW90OycvJmd0OwombHQ7L2V4ZWMmZ3Q7CjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3RlIHRoZSBkb3VibGUtcXVvdGVzIG5lc3RlZCBpbnNpZGUgdGhlIHNpbmdsZS1xdW90ZXMuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJiYXRjaC1zaGVsbC1leGVjdXRlIj48L2E+CiAgICAgIEhvdyBkbyBJIGV4ZWN1dGUgYSBiYXRjaCBmaWxlIG9yIHNoZWxsIHNjcmlwdCBmcm9tIEFudD8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+T24gbmF0aXZlIFVuaXggc3lzdGVtcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biBzaGVsbCBzY3JpcHRzCiAgICAgICAgICAgZGlyZWN0bHkuIE9uIHN5c3RlbXMgcnVubmluZyBhIFVuaXgtdHlwZSBzaGVsbCAoZm9yIGV4YW1wbGUsIEN5Z3dpbgogICAgICAgICAgIG9uIFdpbmRvd3MpIGV4ZWN1dGUgdGhlIChjb21tYW5kKSBzaGVsbCBpbnN0ZWFkIC0gPGNvZGU+Y21kPC9jb2RlPgogICAgICAgICAgIGZvciBiYXRjaCBmaWxlcywgPGNvZGU+c2g8L2NvZGU+IGZvciBzaGVsbCBzY3JpcHRzIC0gdGhlbiBwYXNzIHRoZQogICAgICAgICAgIGJhdGNoIGZpbGUgb3Igc2hlbGwgc2NyaXB0IChwbHVzIGFueSBhcmd1bWVudHMgdG8gdGhlIHNjcmlwdCkKICAgICAgICAgICBhcyBhIHNpbmdsZSBjb21tYW5kLCB1c2luZyB0aGUgPGNvZGU+L2M8L2NvZGU+IG9yCiAgICAgICAgICAgPGNvZGU+LWM8L2NvZGU+IHN3aXRjaCwgcmVzcGVjdGl2ZWx5LiBTZWUKICAgICAgICAgICA8YSBocmVmPSIjc2hlbGwtcmVkaXJlY3QtMiI+dGhlIGFib3ZlIHNlY3Rpb248L2E+CiAgICAgICAgICAgZm9yIGV4YW1wbGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrcwogICAgICAgICAgIGV4ZWN1dGluZyA8Y29kZT5zaDwvY29kZT4uIEZvciBiYXRjaCBmaWxlcywgdXNlIHNvbWV0aGluZyBsaWtlOjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CiZsdDtleGVjIGRpcj0mcXVvdDsuJnF1b3Q7IGV4ZWN1dGFibGU9JnF1b3Q7Y21kJnF1b3Q7IG9zPSZxdW90O1dpbmRvd3MgTlQmcXVvdDsmZ3Q7CiAgJmx0O2FyZyBsaW5lPSZxdW90Oy9jIHRlc3QuYmF0JnF1b3Q7LyZndDsKJmx0Oy9leGVjJmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0ibXVsdGktY29uZGl0aW9ucyI+PC9hPgogICAgICBJIHdhbnQgdG8gZXhlY3V0ZSBhIHBhcnRpY3VsYXIgdGFyZ2V0IG9ubHkgaWYKICAgICAgICBtdWx0aXBsZSBjb25kaXRpb25zIGFyZSB0cnVlLgogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5UaGVyZSBhcmUgYWN0dWFsbHkgc2V2ZXJhbCBhbnN3ZXJzIHRvIHRoaXMgcXVlc3Rpb24uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgaGF2ZSBvbmx5IG9uZSBzZXQgYW5kIG9uZSB1bnNldCBwcm9wZXJ0eSB0byB0ZXN0LAogICAgICAgIHlvdSBjYW4gc3BlY2lmeSBib3RoIGFuIDxjb2RlPmlmPC9jb2RlPiBhbmQgYW4gPGNvZGU+dW5sZXNzPC9jb2RlPgogICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHRhcmdldCwgYW5kIHRoZXkgd2lsbCBhY3QgYXMgaWYgdGhleQogICAgICAgIGFyZSAiYW5kZWQiIHRvZ2V0aGVyLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgQW50IDEuMyBvciBlYXJsaWVyLCB0aGUKICAgICAgICB3YXkgdG8gd29yayB3aXRoIGFsbCBvdGhlciBjYXNlcyBpcyB0byBjaGFpbiB0YXJnZXRzIHRvZ2V0aGVyCiAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBzdGF0ZSB5b3Ugd2FudCB0byB0ZXN0IGZvci48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvIHNlZSBob3cgdGhpcyB3b3JrcywgYXNzdW1lIHlvdSBoYXZlIHRocmVlIHByb3BlcnRpZXM6CiAgICAgICAgPGNvZGU+cHJvcDE8L2NvZGU+LCA8Y29kZT5wcm9wMjwvY29kZT4sIGFuZCA8Y29kZT5wcm9wMzwvY29kZT4uCiAgICAgICAgWW91IHdhbnQgdG8gdGVzdCB0aGF0IDxjb2RlPnByb3AxPC9jb2RlPiBhbmQgPGNvZGU+cHJvcDI8L2NvZGU+CiAgICAgICAgYXJlIHNldCwgYW5kIHRoYXQgPGNvZGU+cHJvcDM8L2NvZGU+IGlzIG5vdC4gSWYgdGhlIGNvbmRpdGlvbgogICAgICAgIGhvbGRzIHRydWUgeW91IHdhbnQgdG8gZWNobyAieWVzIi48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhlcmUgaXMgdGhlIGltcGxlbWVudGF0aW9uIGluIEFudCAxLjMgYW5kIGVhcmxpZXI6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbmQmcXVvdDsgZGVwZW5kcz0mcXVvdDtjb25kLWlmJnF1b3Q7LyZndDsKCiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtjb25kLWlmJnF1b3Q7IGlmPSZxdW90O3Byb3AxJnF1b3Q7Jmd0OwogICZsdDthbnRjYWxsIHRhcmdldD0mcXVvdDtjb25kLWlmLTImcXVvdDsvJmd0OwombHQ7L3RhcmdldCZndDsKCiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtjb25kLWlmLTImcXVvdDsgaWY9JnF1b3Q7cHJvcDImcXVvdDsmZ3Q7CiAgJmx0O2FudGNhbGwgdGFyZ2V0PSZxdW90O2NvbmQtaWYtMyZxdW90Oy8mZ3Q7CiZsdDsvdGFyZ2V0Jmd0OwoKJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbmQtaWYtMyZxdW90OyB1bmxlc3M9JnF1b3Q7cHJvcDMmcXVvdDsmZ3Q7CiAgJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDt5ZXMmcXVvdDsvJmd0OwombHQ7L3RhcmdldCZndDsKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vdGU6IDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4gdGFza3MgZG8gPGVtPm5vdDwvZW0+IHBhc3MKICAgICAgICBwcm9wZXJ0eSBjaGFuZ2VzIGJhY2sgdXAgdG8gdGhlIGVudmlyb25tZW50IHRoZXkgd2VyZSBjYWxsZWQKICAgICAgICBmcm9tLCBzbyB5b3Ugd291bGRuJ3QgYmUgYWJsZSB0bywgZm9yIGV4YW1wbGUsIHNldCBhCiAgICAgICAgPGNvZGU+cmVzdWx0PC9jb2RlPiBwcm9wZXJ0eSBpbiB0aGUgPGNvZGU+Y29uZC1pZi0zPC9jb2RlPiB0YXJnZXQsCiAgICAgICAgdGhlbiBkbwogICAgICAgIDxjb2RlPiZsdDtlY2hvIG1lc3NhZ2U9InJlc3VsdCBpcyAke3Jlc3VsdH0iLyZndDs8L2NvZGU+CiAgICAgICAgaW4gdGhlIDxjb2RlPmNvbmQ8L2NvZGU+IHRhcmdldC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNCwgeW91IGNhbiB1c2UgdGhlCiAgICAgICAgPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IHRhc2suPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbmQmcXVvdDsgZGVwZW5kcz0mcXVvdDtjb25kLWlmLGNvbmQtZWxzZSZxdW90Oy8mZ3Q7CgombHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y2hlY2stY29uZCZxdW90OyZndDsKICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2NvbmQtaXMtdHJ1ZSZxdW90OyZndDsKICAgICZsdDthbmQmZ3Q7CiAgICAgICZsdDtub3QmZ3Q7CiAgICAgICAgJmx0O2VxdWFscyBhcmcxPSZxdW90OyR7cHJvcDF9JnF1b3Q7IGFyZzI9JnF1b3Q7JCR7cHJvcDF9JnF1b3Q7IC8mZ3Q7CiAgICAgICZsdDsvbm90Jmd0OwogICAgICAmbHQ7bm90Jmd0OwogICAgICAgICZsdDtlcXVhbHMgYXJnMT0mcXVvdDske3Byb3AyfSZxdW90OyBhcmcyPSZxdW90OyQke3Byb3AyfSZxdW90OyAvJmd0OwogICAgICAmbHQ7L25vdCZndDsKICAgICAgJmx0O2VxdWFscyBhcmcxPSZxdW90OyR7cHJvcDN9JnF1b3Q7IGFyZzI9JnF1b3Q7JCR7cHJvcDN9JnF1b3Q7IC8mZ3Q7CiAgICAmbHQ7L2FuZCZndDsKICAmbHQ7L2NvbmRpdGlvbiZndDsKJmx0Oy90YXJnZXQmZ3Q7CgombHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29uZC1pZiZxdW90OyBkZXBlbmRzPSZxdW90O2NoZWNrLWNvbmQmcXVvdDsgaWY9JnF1b3Q7Y29uZC1pcy10cnVlJnF1b3Q7Jmd0OwogICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7eWVzJnF1b3Q7LyZndDsKJmx0Oy90YXJnZXQmZ3Q7CgombHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29uZC1lbHNlJnF1b3Q7IGRlcGVuZHM9JnF1b3Q7Y2hlY2stY29uZCZxdW90OyB1bmxlc3M9JnF1b3Q7Y29uZC1pcy10cnVlJnF1b3Q7Jmd0OwogICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7bm8mcXVvdDsvJmd0OwombHQ7L3RhcmdldCZndDsKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgdmVyc2lvbiB0YWtlcyBhZHZhbnRhZ2Ugb2YgdHdvIHRoaW5nczo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgIDxsaT5JZiBhIHByb3BlcnR5IDxjb2RlPmE8L2NvZGU+IGhhcyBub3QgYmVlbiBzZXQsCiAgICAgICAgICA8Y29kZT4ke2F9PC9jb2RlPiB3aWxsIGV2YWx1YXRlIHRvIDxjb2RlPiR7YX08L2NvZGU+LjwvbGk+CgogICAgICAgICAgPGxpPlRvIGdldCBhIGxpdGVyYWwgPGNvZGU+JDwvY29kZT4gaW4gQW50LCB5b3UgaGF2ZSB0bwogICAgICAgICAgZXNjYXBlIGl0IHdpdGggYW5vdGhlciA8Y29kZT4kPC9jb2RlPiAtIHRoaXMgd2lsbCBhbHNvIGJyZWFrCiAgICAgICAgICB0aGUgc3BlY2lhbCB0cmVhdG1lbnQgb2YgdGhlIDxjb2RlPiR7PC9jb2RlPiBzZXF1ZW5jZS48L2xpPgogICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJlY2F1c2UgdGVzdGluZyBmb3IgYSBsaXRlcmFsIDxjb2RlPiR7cHJvcGVydHl9PC9jb2RlPiBzdHJpbmcKICAgICAgICBpc24ndCBhbGwgdGhhdCByZWFkYWJsZSBvciBlYXN5IHRvIHVuZGVyc3RhbmQsCiAgICAgICAgcG9zdC0xLjQuMSBBbnQgaW50cm9kdWNlcyB0aGUgPGNvZGU+Jmx0O2lzc2V0Jmd0OzwvY29kZT4gZWxlbWVudAogICAgICAgIHRvIHRoZSA8Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT4gdGFzay48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhlcmUgaXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgZG9uZSB1c2luZwogICAgICAgIDxjb2RlPiZsdDtpc3NldCZndDs8L2NvZGU+OjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtjaGVjay1jb25kJnF1b3Q7Jmd0OwogICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7Y29uZC1pcy10cnVlJnF1b3Q7Jmd0OwogICAgJmx0O2FuZCZndDsKICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSZxdW90O3Byb3AxJnF1b3Q7LyZndDsKICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSZxdW90O3Byb3AyJnF1b3Q7LyZndDsKICAgICAgJmx0O25vdCZndDsKICAgICAgICAmbHQ7aXNzZXQgcHJvcGVydHk9JnF1b3Q7cHJvcDMmcXVvdDsvJmd0OwogICAgICAmbHQ7L25vdCZndDsKICAgICZsdDsvYW5kJmd0OwogICZsdDsvY29uZGl0aW9uJmd0OwombHQ7L3RhcmdldCZndDsKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBsYXN0IG9wdGlvbiBpcyB0byB1c2UgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gc2V0IHRoZQogICAgICAgIHByb3BlcnRpZXMuIFRoaXMgY2FuIGJlIHBhcnRpY3VsYXJseSBoYW5keSB3aGVuIHlvdSBuZWVkIG11Y2gKICAgICAgICBmaW5lciBjb250cm9sIHRoYW4gdGhlIHNpbXBsZSBjb25kaXRpb25zIHNob3duIGhlcmUgYnV0LCBvZgogICAgICAgIGNvdXJzZSwgY29tZXMgd2l0aCB0aGUgb3ZlcmhlYWQgb2YgYWRkaW5nIEpBUiBmaWxlcyB0byBzdXBwb3J0CiAgICAgICAgdGhlIGxhbmd1YWdlLCB0byBzYXkgbm90aGluZyBvZiB0aGUgYWRkZWQgbWFpbnRlbmFuY2UgaW4gcmVxdWlyaW5nCiAgICAgICAgdHdvIGxhbmd1YWdlcyB0byBpbXBsZW1lbnQgYSBzaW5nbGUgc3lzdGVtLiBTZWUgdGhlCiAgICAgICAgPGEgaHJlZj0ibWFudWFsL09wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPgogICAgICAgIDxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPiB0YXNrIGRvY3VtZW50YXRpb248L2E+IGZvciBtb3JlCiAgICAgICAgZGV0YWlscy48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImVuY29kaW5nIj48L2E+CiAgICAgIEhvdyBjYW4gSSBpbmNsdWRlIG5hdGlvbmFsIGNoYXJhY3RlcnMgbGlrZSBHZXJtYW4KICAgICAgICB1bWxhdXRzIGluIG15IGJ1aWxkIGZpbGU/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPllvdSBuZWVkIHRvIHRlbGwgdGhlIFhNTCBwYXJzZXIgd2hpY2ggY2hhcmFjdGVyIGVuY29kaW5nCiAgICAgICAgeW91ciBidWlsZCBmaWxlIHVzZXMsIHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNiNzZWMtcHJvbG9nLWR0ZCI+WE1MCiAgICAgICAgZGVjbGFyYXRpb248L2E+LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+QnkgZGVmYXVsdCB0aGUgcGFyc2VyIGFzc3VtZXMgeW91IGFyZSB1c2luZyB0aGUgVVRGLTgKICAgICAgICBlbmNvZGluZyBpbnN0ZWFkIG9mIHlvdXIgcGxhdGZvcm0ncyBkZWZhdWx0LiAgRm9yIG1vc3QgV2VzdGVybgogICAgICAgIEV1cm9wZWFuIGNvdW50cmllcyB5b3Ugc2hvdWxkIHNldCB0aGUgZW5jb2RpbmcgdG8KICAgICAgICA8Y29kZT5JU08tODg1OS0xPC9jb2RlPi4gIFRvIGRvIHNvLCBtYWtlIHRoZSB2ZXJ5IGZpcnN0IGxpbmUKICAgICAgICBvZiB5b3UgYnVpbGQgZmlsZSByZWFkIGxpa2U8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtJU08tODg1OS0xJnF1b3Q7ID8mZ3Q7CjwvcHJlPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJ1c2UtemlwLWluc3RlYWQtb2YtamFyIj48L2E+CiAgICAgIEhvdyBkbyBJIHVzZSA8Y29kZT5qYXI8L2NvZGU+J3MgPGNvZGU+TTwvY29kZT4gc3dpdGNoPwogICAgICBJIGRvbid0IHdhbnQgYSBNQU5JRkVTVC4KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+QSBKQVIgYXJjaGl2ZSBpcyBhIFpJUCBmaWxlLCBzbyBpZiB5b3UgZG9uJ3Qgd2FudCBhCiAgICAgICAgTUFOSUZFU1QgeW91IGNhbiBzaW1wbHkgdXNlIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPi48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdXIgZmlsZSBuYW1lcyBjb250YWluIG5hdGlvbmFsIGNoYXJhY3RlcnMgeW91IHNob3VsZAogICAgICAgIGtub3cgdGhhdCBTdW4ncyA8Y29kZT5qYXI8L2NvZGU+IHV0aWxpdHkgbGlrZSBBbnQncwogICAgICAgIDxjb2RlPiZsdDtqYXImZ3Q7PC9jb2RlPiB1c2VzIFVURi04IHRvIGVuY29kZSB0aGVpciBuYW1lcyB3aGlsZQogICAgICAgIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiB1c2VzIHlvdXIgcGxhdGZvcm1zIGRlZmF1bHQgZW5jb2RpbmcuCiAgICAgICAgVXNlIHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgb2YgPGNvZGU+Jmx0O3ppcCZndDs8L2NvZGU+IGlmCiAgICAgICAgbmVjZXNzYXJ5LjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0icHJvcGVydHl2YWx1ZS1hcy1uYW1lLWZvci1wcm9wZXJ0eSI+PC9hPgogICAgICBIb3cgY2FuIEkgZG8gc29tZXRoaW5nIGxpa2UgPGNvZGU+Jmx0O3Byb3BlcnR5IG5hbWU9InByb3AiCiAgICAgIHZhbHVlPSIkeyR7YW5vdGhlcnByb3B9fSIvJmd0OzwvY29kZT4gKGRvdWJsZSBleHBhbmRpbmcgdGhlIHByb3BlcnR5KT8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+V2l0aG91dCBhbnkgZXh0ZXJuYWwgaGVscCB5b3UgY2FuIG5vdC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPldpdGggJmx0O3NjcmlwdC8mZ3Q7LCB3aGljaCBuZWVkcyBleHRlcm5hbCBsaWJyYXJpZXMsIHlvdSBjYW4gZG88L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7c2NyaXB0IGxhbmd1YWdlPSZxdW90O2phdmFzY3JpcHQmcXVvdDsmZ3Q7CiAgICBwcm9wbmFtZSA9IHByb2plY3QuZ2V0UHJvcGVydHkoJnF1b3Q7YW5vdGhlcnByb3AmcXVvdDspOwogICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgmcXVvdDtwcm9wJnF1b3Q7LCBwcm9wbmFtZSk7CiZsdDsvc2NyaXB0Jmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBBbnRDb250cmliIChleHRlcm5hbCB0YXNrIGxpYnJhcnkpIHlvdSBjYW4gZG8gPGNvZGU+CiAgICAgICAgICZsdDtwcm9wZXJ0eWNvcHkgbmFtZT0icHJvcCIgZnJvbT0iJHthbm90aGVycHJvcH0iLyZndDs8L2NvZGU+LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBBbnQgMS42IHlvdSBjYW4gc2ltdWxhdGUgdGhlIEFudENvbnRyaWJzICZsdDtwcm9wZXJ0eWNvcHkmZ3Q7CiAgICAgICAgIGFuZCBhdm9pZCB0aGUgbmVlZCBvZiBhbiBleHRlcm5hbCBsaWJyYXJ5OjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CiZsdDttYWNyb2RlZiBuYW1lPSZxdW90O3Byb3BlcnR5Y29weSZxdW90OyZndDsKICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7bmFtZSZxdW90Oy8mZ3Q7CiAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O2Zyb20mcXVvdDsvJmd0OwogICZsdDtzZXF1ZW50aWFsJmd0OwogICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7QHtuYW1lfSZxdW90OyB2YWx1ZT0mcXVvdDske0B7ZnJvbX19JnF1b3Q7LyZndDsKICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CiZsdDsvbWFjcm9kZWYmZ3Q7CjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJnZW5yYWwtYWR2aWNlIj48L2E+CiAgICAgIEdlbmVyYWwgQWR2aWNlCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPlRoZXJlIGFyZSBtYW55IHJlYXNvbnMgd2h5IEFudCBkb2Vzbid0IGJlaGF2ZSBhcwogICAgICAgIGV4cGVjdGVkLCBub3QgYWxsIG9mIHRoZW0gYXJlIGR1ZSB0byBBbnQgYnVncy4gIFNlZSBvdXIgPGEgaHJlZj0icHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4gcGFnZSBmb3IgaGludHMgdGhhdAogICAgICAgIG1heSBoZWxwIHBpbm5pbmcgZG93biB0aGUgcmVhc29ucyBmb3IgeW91ciBwcm9ibGVtLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iYWx3YXlzLXJlY29tcGlsZXMiPjwvYT4KICAgICAgV2h5IGRvZXMgQW50IGFsd2F5cyByZWNvbXBpbGUgYWxsIG15IEphdmEgZmlsZXM/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPkluIG9yZGVyIHRvIGZpbmQgb3V0IHdoaWNoIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZCwgQW50CiAgICAgICAgY29tcGFyZXMgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHNvdXJjZSBmaWxlcyB0byB0aG9zZSBvZiB0aGUKICAgICAgICByZXN1bHRpbmcgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcy4gIE9wZW5pbmcgYWxsIHNvdXJjZSBmaWxlcwogICAgICAgIHRvIGZpbmQgb3V0IHdoaWNoIHBhY2thZ2UgdGhleSBiZWxvbmcgdG8gd291bGQgYmUgdmVyeQogICAgICAgIGluZWZmaWNpZW50LiBJbnN0ZWFkLCBBbnQgZXhwZWN0cyB5b3UgdG8gcGxhY2UgeW91cgogICAgICAgIHNvdXJjZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSBoaWVyYXJjaHkgdGhhdCBtaXJyb3JzIHlvdXIKICAgICAgICBwYWNrYWdlIGhpZXJhcmNoeSBhbmQgdG8gcG9pbnQgQW50IHRvIHRoZSByb290IG9mIHRoaXMKICAgICAgICBkaXJlY3RvcnkgdHJlZSB3aXRoIHRoZSA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNheSB5b3UgaGF2ZSA8Y29kZT4mbHQ7amF2YWMgc3JjZGlyPSJzcmMiCiAgICAgICAgZGVzdGRpcj0iZGVzdCIvJmd0OzwvY29kZT4uICBJZiBBbnQgZmluZHMgYSBmaWxlCiAgICAgICAgPGNvZGU+c3JjL2EvYi9DLmphdmE8L2NvZGU+LCBpdCBleHBlY3RzIGl0IHRvIGJlIGluIHBhY2thZ2UKICAgICAgICA8Y29kZT5hLmI8L2NvZGU+IHNvIHRoYXQgdGhlIHJlc3VsdGluZyA8Y29kZT4uY2xhc3M8L2NvZGU+CiAgICAgICAgZmlsZSBpcyBnb2luZyB0byBiZSA8Y29kZT5kZXN0L2EvYi9DLmNsYXNzPC9jb2RlPi48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdXIgc291cmNlLXRyZWUgZGlyZWN0b3J5IHN0cnVjdHVyZSBkb2VzIG5vdCBtYXRjaCB5b3VyCiAgICAgICAgcGFja2FnZSBzdHJ1Y3R1cmUsIEFudCdzIGhldXJpc3RpYyB3b24ndCB3b3JrLCBhbmQKICAgICAgICBpdCB3aWxsIHJlY29tcGlsZSBjbGFzc2VzIHRoYXQgYXJlIHVwLXRvLWRhdGUuICBBbnQgaXMgbm90IHRoZQogICAgICAgIG9ubHkgdG9vbCB0aGF0IGV4cGVjdHMgYSBzb3VyY2UtdHJlZSBsYXlvdXQgbGlrZSB0aGlzLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGhhdmUgSmF2YSBzb3VyY2UgZmlsZXMgdGhhdCBhcmVuJ3QgZGVjbGFyZWQgdG8KICAgICAgICBiZSBwYXJ0IG9mIGFueSBwYWNrYWdlLCB5b3UgY2FuIHN0aWxsIHVzZSB0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4KICAgICAgICB0YXNrIHRvIGNvbXBpbGUgdGhlc2UgZmlsZXMgY29ycmVjdGx5IC0ganVzdCBzZXQgdGhlCiAgICAgICAgPGNvZGU+c3JjZGlyPC9jb2RlPiBhbmQgPGNvZGU+ZGVzdGRpcjwvY29kZT4gYXR0cmlidXRlcyB0bwogICAgICAgIHRoZSBhY3R1YWwgZGlyZWN0b3J5IHRoZSBzb3VyY2UKICAgICAgICBmaWxlcyBsaXZlIGluIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBjbGFzcyBmaWxlcyBzaG91bGQgZ28gaW50bywKICAgICAgICByZXNwZWN0aXZlbHkuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJkZWZhdWx0ZXhjbHVkZXMiPjwvYT4KICAgICAgSSd2ZSB1c2VkIGEgPGNvZGU+Jmx0O2RlbGV0ZSZndDs8L2NvZGU+IHRhc2sgdG8KICAgICAgZGVsZXRlIHVud2FudGVkIFNvdXJjZVNhZmUgY29udHJvbCBmaWxlcyAoQ1ZTIGZpbGVzLCBlZGl0b3IKICAgICAgYmFja3VwIGZpbGVzLCBldGMuKSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrOyB0aGUgZmlsZXMKICAgICAgbmV2ZXIgZ2V0IGRlbGV0ZWQuIFdoYXQncyB3cm9uZz8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+VGhpcyBpcyBwcm9iYWJseSBoYXBwZW5pbmcgYmVjYXVzZSwgYnkgZGVmYXVsdCwgQW50IGV4Y2x1ZGVzCiAgICAgICAgU291cmNlU2FmZSBjb250cm9sIGZpbGVzICg8Y29kZT52c3N2ZXIuc2NjPC9jb2RlPikgYW5kIGNlcnRhaW4gb3RoZXIKICAgICAgICBmaWxlcyBmcm9tIEZpbGVTZXRzLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SGVyZSdzIHdoYXQgeW91IHByb2JhYmx5IGRpZDo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7ZGVsZXRlJmd0OwogICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2J1aWxkLnNyY30mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovdnNzdmVyLnNjYyZxdW90Oy8mZ3Q7CiZsdDsvZGVsZXRlJmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IG5lZWQgdG8gc3dpdGNoIG9mZiB0aGUgZGVmYXVsdCBleGNsdXNpb25zLAogICAgICAgICAgIGFuZCBpdCB3aWxsIHdvcms6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KJmx0O2RlbGV0ZSZndDsKICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtidWlsZC5zcmN9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqL3Zzc3Zlci5zY2MmcXVvdDsKICAgICAgICAgICBkZWZhdWx0ZXhjbHVkZXM9JnF1b3Q7bm8mcXVvdDsvJmd0OwombHQ7L2RlbGV0ZSZndDsKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZvciBhIGNvbXBsZXRlIGxpc3Rpbmcgb2YgdGhlIHBhdHRlcm5zIHRoYXQgYXJlIGV4Y2x1ZGVkCiAgICAgICAgYnkgZGVmYXVsdCwgc2VlIDxhIGhyZWY9Im1hbnVhbC9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+dGhlIHVzZXIKICAgICAgICBtYW51YWw8L2E+LjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0ic3RvcC1kZXBlbmRlbmN5Ij48L2E+CiAgICAgIEkgaGF2ZSBhIHRhcmdldCBJIHdhbnQgdG8gc2tpcCBpZiBhIHByb3BlcnR5IGlzIHNldCwKICAgICAgc28gSSBoYXZlIDxjb2RlPnVubGVzcz0icHJvcGVydHkiPC9jb2RlPiBhcyBhbiBhdHRyaWJ1dGUKICAgICAgb2YgdGhlIHRhcmdldCwgYnV0IGFsbCB0aGUgdGFyZ2V0cyB0aGlzIHRhcmdldAogICAgICBkZXBlbmRzIG9uIGFyZSBzdGlsbCBleGVjdXRlZC4gV2h5PwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5UaGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgaXMgZ2VuZXJhdGVkIGJ5IEFudCBiZWZvcmUgYW55IG9mIHRoZQogICAgICAgIHRhcmdldHMgYXJlIHJ1bi4gVGhpcyBhbGxvd3MgZGVwZW5kZW50IHRhcmdldHMsIHN1Y2ggYXMgYW4KICAgICAgICA8Y29kZT5pbml0PC9jb2RlPiB0YXJnZXQsIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgY2FuIGNvbnRyb2wgdGhlCiAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgdGFyZ2V0cyBoaWdoZXIgaW4gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIFRoaXMKICAgICAgICAgICAgICBpcyBhIGdvb2QgdGhpbmcuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Ib3dldmVyLCB3aGVuIHlvdXIgZGVwZW5kZW5jaWVzIGJyZWFrIGRvd24gdGhlCiAgICAgICAgaGlnaGVyLWxldmVsIHRhc2sKICAgICAgICBpbnRvIHNldmVyYWwgc21hbGxlciBzdGVwcywgdGhpcyBiZWhhdmlvdXIgYmVjb21lcwogICAgICAgIGNvdW50ZXItaW50dWl0aXZlLiBUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygc29sdXRpb25zIGF2YWlsYWJsZToKICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvbD4KICAgICAgICAgIDxsaT5QdXQgdGhlIHNhbWUgY29uZGl0aW9uIG9uIGVhY2ggb2YgdGhlIGRlcGVuZGVudCB0YXJnZXRzLjwvbGk+CgogICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHN0ZXBzIHVzaW5nIDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4sCiAgICAgICAgICBpbnN0ZWFkIG9mIHNwZWNpZnlpbmcgdGhlbSBpbnNpZGUgdGhlIDxjb2RlPmRlcGVuZHM8L2NvZGU+CiAgICAgICAgICBhdHRyaWJ1dGUuPC9saT4KICAgICAgICA8L29sPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJpbmNsdWRlLW9yZGVyIj48L2E+CiAgICAgIEluIG15IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sIEkndmUgcHV0IGluIGFuCiAgICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gb2YgYWxsIGZpbGVzIGZvbGxvd2VkIGJ5IGFuCiAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gb2YganVzdCB0aGUgZmlsZXMgSSB3YW50LCBidXQgaXQKICAgICAgaXNuJ3QgZ2l2aW5nIG1lIGFueSBmaWxlcyBhdCBhbGwuIFdoYXQncyB3cm9uZz8KICAgICAgCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPlRoZSBvcmRlciBvZiB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKICAgICAgICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IHRhZ3Mgd2l0aGluIGEgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgogICAgICAgIGlzIGlnbm9yZWQgd2hlbiB0aGUgRmlsZVNldCBpcyBjcmVhdGVkLiBJbnN0ZWFkLCBhbGwgb2YgdGhlCiAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgcHJvY2Vzc2VkIHRvZ2V0aGVyLAogICAgICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgogICAgICAgIGVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KICAgICAgICBlbGVtZW50cyBvbmx5IGFwcGx5IHRvIHRoZSBmaWxlIGxpc3QgcHJvZHVjZWQgYnkgdGhlCiAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvIGdldCB0aGUgZmlsZXMgeW91IHdhbnQsIGZvY3VzIG9uIGp1c3QgdGhlCiAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBwYXR0ZXJucyB0aGF0IHdvdWxkIGJlIG5lY2Vzc2FyeQogICAgICAgIHRvIGdldCB0aGVtLiBJZiB5b3UgZmluZCB5b3UgbmVlZCB0byB0cmltIHRoZSBsaXN0IHRoYXQgdGhlCiAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBwcm9kdWNlLCB0aGVuIHVzZQogICAgICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJwcm9wZXJ0aWVzLW5vdC10cmltbWVkIj48L2E+CiAgICAgIDxjb2RlPmFudDwvY29kZT4gZmFpbGVkIHRvIGJ1aWxkIG15IHByb2dyYW0gdmlhIGphdmFjCiAgICAgIGV2ZW4gd2hlbiBJIHB1dCB0aGUgbmVlZGVkIGphcnMgaW4gYW4gZXh0ZXJuYWwKICAgICAgPGNvZGU+YnVpbGQucHJvcGVydGllczwvY29kZT4gZmlsZSBhbmQgcmVmZXJlbmNlIHRoZW0gYnkKICAgICAgPGNvZGU+cGF0aGVsZW1lbnQ8L2NvZGU+IG9yIDxjb2RlPmNsYXNzcGF0aCByZWZpZDwvY29kZT4uCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPldoZW4gPGNvZGU+YW50PC9jb2RlPiBsb2FkcyBwcm9wZXJ0aWVzIGZyb20gYW4gZXh0ZXJuYWwKICAgICAgICBmaWxlIGl0IGRvZXNuJ3QgdG91Y2ggdGhlIHZhbHVlIG9mIHByb3BlcnRpZXMsIHRyYWlsaW5nIGJsYW5rcwogICAgICAgIHdpbGwgbm90IGJlIHRyaW1tZWQgZm9yIGV4YW1wbGUuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB0aGUgdmFsdWUgcmVwcmVzZW50cyBhIGZpbGUgcGF0aCwgbGlrZSBhIGphciBuZWVkZWQgdG8KICAgICAgICBjb21waWxlLCB0aGUgdGFzayB3aGljaCByZXF1aXJlcyB0aGUgdmFsdWUsIGphdmFjIGZvciBleGFtcGxlCiAgICAgICAgd291bGQgZmFpbCB0byBjb21waWxlIHNpbmNlIGl0IGNhbid0IGZpbmQgdGhlIGZpbGUgZHVlIHRvCiAgICAgICAgdHJhaWxpbmcgc3BhY2VzLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0id2luemlwLWxpZXMiPjwvYT4KICAgICAgQW50IGNyZWF0ZXMgV0FSIGZpbGVzIHdpdGggYSBsb3dlci1jYXNlCiAgICAgICAgPGNvZGU+d2ViLWluZjwvY29kZT4gb3IgSkFSIGZpbGVzIHdpdGggYSBsb3dlci1jYXNlCiAgICAgICAgPGNvZGU+bWV0YS1pbmY8L2NvZGU+IGRpcmVjdG9yeS4KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+Tm8gaXQgZG9lc24ndC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBtYXkgaGF2ZSBzZWVuIHRoZXNlIGxvd2VyLWNhc2UgZGlyZWN0b3J5IG5hbWVzIGluCiAgICAgICAgV2luWklQLCBidXQgV2luWklQIGlzIHRyeWluZyB0byBiZSBoZWxwZnVsIChhbmQgZmFpbHMpLiAgSWYKICAgICAgICBXaW5aSVAgZW5jb3VudGVycyBhIGZpbGVuYW1lIHRoYXQgaXMgYWxsIHVwcGVyLWNhc2UsIGl0CiAgICAgICAgYXNzdW1lcyBpdCBoYXMgY29tZSBmcm9tIGFuIG9sZCBET1MgYm94IGFuZCBjaGFuZ2VzIHRoZSBjYXNlIHRvCiAgICAgICAgYWxsIGxvd2VyLWNhc2UgZm9yIHlvdS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBleHRyYWN0IChvciBqdXN0IGNoZWNrKSB0aGUgYXJjaGl2ZSB3aXRoIGphciwgeW91CiAgICAgICAgd2lsbCBzZWUgdGhhdCB0aGUgbmFtZXMgaGF2ZSB0aGUgY29ycmVjdCBjYXNlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBXaW5aSVAgKHZlcnNpb24gOC4xIGF0IGxlYXN0KSwgdGhpcyBjYW4gYmUgY29ycmVjdGVkIGluIHRoZQogICAgICAgIGNvbmZpZ3VyYXRpb24uICBJbiB0aGUgT3B0aW9ucy9Db25maWd1cmF0aW9uIG1lbnUsIGluIHRoZSBWaWV3IHRhYiwgR2VuZXJhbAogICAgICAgIHNlY3Rpb24sIGNoZWNrIHRoZSAiQWxsb3cgYWxsIHVwcGVyIGNhc2UgZmlsZXMgbmFtZXMiIGJveC4gIFRoZSBNRVRBLUlORiBhbmQKICAgICAgICBXRUItSU5GIHdpbGwgbG9vayBjb3JyZWN0LjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iTm9DbGFzc0RlZkZvdW5kRXJyb3IiPjwvYT4KICAgICAgSSBpbnN0YWxsZWQgQW50IDEuNi54IGFuZCBub3cgZ2V0CiAgICAgICAgPGNvZGU+RXhjZXB0aW9uIGluIHRocmVhZCAibWFpbiIgamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yOgogICAgICAgIDwvY29kZT4KICAgICAgCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgVGhlIGNhdXNlIG9mIHRoaXMgaXMgdGhhdCB0aGVyZSBpcyBhbiBvbGQgdmVyc2lvbiBvZiBhbnQgc29tZXdoZXJlIGluIHRoZQogICAgICAgICAgY2xhc3MgcGF0aCBvciBjb25maWd1cmF0aW9uLgogICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICBBIHZlcnNpb24gb2YgdGhpcyBwcm9ibGVtIGhhcHBlbnMgd2l0aCBqYXJzIHRoYXQgYXJlIGluIHRoZSBjbGFzc3BhdGgKICAgICAgICAgIHRoYXQgaW5jbHVkZSBhbiBlbWJlZGRlZCBjb3B5IG9mIGFudCBjbGFzc2VzLgogICAgICAgICAgQW4gZXhhbXBsZSBvZiB0aGlzIGlzIHNvbWUgY29waWVzIG9mIHdlYmxvZ2ljLmphci4KICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgIE9uZSBjYW4gY2hlY2sgaWYgdGhpcyBpcyB0aGUgY2FzZSBieSBkb2luZyAob24gdW5peC9zaCk6CiAgICAgICAgPGNvZGU+PHByZT4KICAgICAgICB1bnNldCBDTEFTU1BBVEgKICAgICAgICBhbnQgLXZlcnNpb24KICAgICAgICA8L3ByZT4KICAgICAgICA8L2NvZGU+CiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIj48L2E+CiAgICAgIEkgaW5zdGFsbGVkIEFudCAxLjYueCBhbmQgbm93IGdldAogICAgICAgIDxjb2RlPmphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uOiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluPC9jb2RlPgogICAgICAKICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICBUaGUgY2F1c2Ugb2YgdGhpcyBpcyB0aGF0IHRoZXJlIGlzIGFuIG9sZCB2ZXJzaW9uIG9mIGFudCBzb21ld2hlcmUgaW4gdGhlCiAgICAgICAgICBjbGFzcyBwYXRoIG9yIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgIEEgdmVyc2lvbiBvZiB0aGlzIHByb2JsZW0gbWF5IGJlIHNlZW4gb24gc29tZSBsaW51eCBzeXN0ZW1zLgogICAgICAgICAgU29tZSBsaW51eCBzeXN0ZW1zIChGZWRvcmEgQ29yZSAyIGZvciBleGFtcGxlKSwgY29tZXMgd2l0aCBhIHZlcnNpb24KICAgICAgICAgIG9mIGFudCBwcmUtaW5zdGFsbGVkLiBUaGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBjYWxsZWQKICAgICAgICAgIDxjb2RlPi9ldGMvYW50LmNvbmY8L2NvZGU+IHdoaWNoIGlmIHByZXNlbnQsIHRoZSBhbnQgc2hlbGwKICAgICAgICAgIHNjcmlwdCB3aWxsICdkb3QnIGluY2x1ZGUuIE9uIEZlZG9yYSBDb3JlIDIsIHRoZSAvZXRjL2FudC5jb25mCiAgICAgICAgICBmaWxlIHJlc2V0cyB0aGUgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIHRvCiAgICAgICAgICA8Y29kZT4vdXNyL3NoYXJlL2FudDwvY29kZT4uIFRoaXMgY2F1c2VzIHRoZSBwcm9ibGVtIHRoYXQKICAgICAgICAgIGFuIG9sZCB2ZXJzaW9uIG9mIGFudCAoMS41LnggaW4gdGhpcyBjYXVzZSkgd2lsbCBiZSB1c2VkCiAgICAgICAgICB3aXRoIGEgbmV3IHZlcnNpb24gb2YgdGhlIGFudCBzY3JpcHQgZmlsZS4KICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgT25lIGNhbiBjaGVjayBpZiB0aGlzIGlzIHRoZSBjYXNlIGJ5IGRvaW5nCiAgICAgICAgICA8Y29kZT5hbnQgLS1ub2NvbmZpZyAtdmVyc2lvbjwvY29kZT4uCiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgogICAgICA8YSBuYW1lPSJtYW5nbGVkLW1hbmlmZXN0Ij48L2E+CiAgICAgIAogICAgICAgIFdoZW5ldmVyIEkgdXNlIHRoZSBBbnQgamFyIG9yIG1hbmlmZXN0IHJlbGF0ZWQgdGFza3MsIGxvbmcgbGluZXMgaW4KICAgICAgICBteSBtYW5pZmVzdCBhcmUgd3JhcHBlZCBhdCA3MCBjaGFyYWN0ZXJzIGFuZCB0aGUgcmVzdWx0aW5nIGphciBkb2VzCiAgICAgICAgbm90IHdvcmsgaW4gbXkgYXBwbGljYXRpb24gc2VydmVyLiBXaHkgZG9lcyBBbnQgZG8gdGhpcz8KICAgICAgCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgQW50IGltcGxlbWVudHMgdGhlIEphdmEKICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2d1aWRlL2phci9qYXIuaHRtbCI+SmFyCiAgICAgICAgICBmaWxlIHNwZWNpZmljYXRpb248L2E+LiBQbGVhc2UgcmVmZXIgdG8gdGhlIG5vdGVzIHNlY3Rpb24gd2hlcmUgaXQKICAgICAgICAgIGRpc2N1c3NlcyB0aGUgbWF4aW11bSBhbGxvd2FibGUgbGVuZ3RoIG9mIGEgbGluZSBhbmQgdGhlIGNvbmNlcHQgb2YKICAgICAgICAgIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXJzLgogICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICBJZiBhIGphciBmaWxlIHByb2R1Y2VkIGJ5IEFudCBkb2VzIG5vdCB3b3JrIGluIHlvdXIgYXBwc2VydmVyLCBhbmQKICAgICAgICAgIHRoYXQgZmFpbHVyZSBpcyBkdWUgdG8gdGhlIHdyYXBwZWQgbWFuaWZlc3QsIHRoZW4geW91IG5lZWQKICAgICAgICAgIHRvIGNvbnN1bHQgeW91ciBhcHBzZXJ2ZXIgcHJvdmlkZXIsIGFzIGl0IGlzIGEgYnVnIGluIHRoZWlyCiAgICAgICAgICBhcHBzZXJ2ZXIuIEZhciBtb3JlIGxpa2VseSwgaG93ZXZlciwgaXMgYSBwcm9ibGVtIGluIHlvdXIKICAgICAgICAgIHNwZWNpZmljYXRpb24gb2YgeW91ciBjbGFzc3BhdGguIEl0IGlzIG5vdCBBbnQncyB3cmFwcGluZyBvZiB5b3VyCiAgICAgICAgICBjbGFzc3BhdGggdGhhdCBpcyB0aGUgcHJvYmxlbS4KICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgRG8gbm90IHJhaXNlIGEgYnVnIGFib3V0IHRoaXMgaXNzdWUgdW50aWwgeW91IGhhdmUgY2hlY2tlZCB0byBlbnN1cmUKICAgICAgICAgIHRoYXQgdGhlIHByb2JsZW0gaXMgbm90IGR1ZSB0byB5b3VyIGNsYXNzcGF0aCBzcGVjaWZpY2F0aW9uLgogICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iaW50ZWdyYXRpb24iPjwvYT4KICAgICAgSXMgQW50IHN1cHBvcnRlZCBieSBteSBJREUvRWRpdG9yPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5TZWUgdGhlIDxhIGhyZWY9ImV4dGVybmFsLmh0bWwjSURFIGFuZCBFZGl0b3IgSW50ZWdyYXRpb24iPnNlY3Rpb24KICAgICAgICBvbiBJREUgaW50ZWdyYXRpb248L2E+IG9uIG91ciBFeHRlcm5hbCBUb29scyBhbmQgVGFza3MgcGFnZS48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImVtYWNzLW1vZGUiPjwvYT4KICAgICAgV2h5IGRvZXNuJ3QgKFgpRW1hY3MvdmkvTWFjT1MgWCdzIHByb2plY3QgYnVpbGRlcgogICAgICBjb3JyZWN0bHkgcGFyc2UgdGhlIGVycm9yIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBBbnQ/CiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPkFudCBhZGRzIGEgImJhbm5lciIgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudAogICAgICAgIHRhc2sgaW4gZnJvbnQgb2YgYWxsIGxvZ2dpbmcgbWVzc2FnZXMgLSBhbmQgdGhlcmUgYXJlIG5vIGJ1aWx0LWluCiAgICAgICAgcmVndWxhciBleHByZXNzaW9ucyBpbiB5b3VyIGVkaXRvciB0aGF0IHdvdWxkIGFjY291bnQgZm9yCiAgICAgICAgdGhpcy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gZGlzYWJsZSB0aGlzIGJhbm5lciBieSBpbnZva2luZyBBbnQgd2l0aCB0aGUKICAgICAgICA8Y29kZT4tZW1hY3M8L2NvZGU+IHN3aXRjaC4gIFRvIG1ha2UgQW50IGF1dG9kZXRlY3QKICAgICAgICBFbWFjcycgY29tcGlsZSBtb2RlLCBwdXQgdGhpcyBpbnRvIHlvdXIKICAgICAgICA8Y29kZT4uYW50cmM8L2NvZGU+IChjb250cmlidXRlZCBieSBWaWxsZSBTa3l0dOQpLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CiMgRGV0ZWN0IChYKUVtYWNzIGNvbXBpbGUgbW9kZQppZiBbICZxdW90OyRFTUFDUyZxdW90OyA9ICZxdW90O3QmcXVvdDsgXSA7IHRoZW4KICBBTlRfQVJHUz0mcXVvdDskQU5UX0FSR1MgLWVtYWNzJnF1b3Q7CiAgQU5UX09QVFM9JnF1b3Q7JEFOVF9PUFRTIC1EYnVpbGQuY29tcGlsZXIuZW1hY3M9dHJ1ZSZxdW90OwpmaQo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBzbmlwcGV0IHRvIHlvdXIKICAgICAgICA8Y29kZT4uZW1hY3M8L2NvZGU+IHRvIG1ha2UgRW1hY3MgdW5kZXJzdGFuZCBBbnQncwogICAgICAgIG91dHB1dC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgoocmVxdWlyZSAnY29tcGlsZSkKKHNldHEgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0CiAgKGFwcGVuZCAobGlzdAogICAgIDs7IHdvcmtzIGZvciBqaWtlcwogICAgICcoJnF1b3Q7Xlxccy0qXFxbW15dXSpcXF1cXHMtKlxcKC4rXFwpOlxcKFswLTldK1xcKTpcXChbMC05XStcXCk6WzAtOV0rOlswLTldKzomcXVvdDsgMSAyIDMpCiAgICAgOzsgd29ya3MgZm9yIGphdmFjCiAgICAgJygmcXVvdDteXFxzLSpcXFtbXl1dKlxcXVxccy0qXFwoLitcXCk6XFwoWzAtOV0rXFwpOiZxdW90OyAxIDIpKQogIGNvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cC1hbGlzdCkpCjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5ZZXQgYW5vdGhlciBhbHRlcm5hdGl2ZSB0aGF0IHByZXNlcnZlcyBtb3N0IG9mIEFudCdzCiAgICAgICAgZm9ybWF0dGluZyBpcyB0byBwaXBlIEFudCdzIG91dHB1dCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgUGVybAogICAgICAgIHNjcmlwdCBieSBEaXJrLVdpbGxlbSB2YW4gR3VsaWs6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KIyEvdXNyL2Jpbi9wZXJsCiMKIyBNYXkgMjAwMSBkaXJreEBhcGFjaGUub3JnIC0gcmVtb3ZlIGFueQojIFtmb29dIGxpbmVzIGZyb20gdGhlIG91dHB1dDsga2VlcGluZwojIHNwYWNpbmcgbW9yZSBvciBsZXNzIHRoZXJlLgojCiR8PTE7CndoaWxlKCZsdDtTVERJTiZndDspIHsKICAgICAgICBpZiAocy9eKFxzKylcWyhcdyspXF0vLykgewogICAgICAgICAgICAgICAgaWYgKCQyIG5lICRsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICZxdW90OyQxXFskMlxdJnF1b3Q7OwogICAgICAgICAgICAgICAgICAgICAgICAkcyA9ICcgJyB4IGxlbmd0aCgkMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAmcXVvdDskMSAkcyAmcXVvdDs7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJGxhc3QgPSAkMjsKICAgICAgICB9OwogICAgICAgIHByaW50Owp9Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iZHRkIj48L2E+CiAgICAgIElzIHRoZXJlIGEgRFREIHRoYXQgSSBjYW4gdXNlIHRvIHZhbGlkYXRlIG15IGJ1aWxkCiAgICAgIGZpbGVzPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5BbiBpbmNvbXBsZXRlIERURCBjYW4gYmUgY3JlYXRlZCBieSB0aGUKICAgICAgICAgIDxjb2RlPiZsdDthbnRzdHJ1Y3R1cmUmZ3Q7PC9jb2RlPiB0YXNrIC0gYnV0IHRoaXMgb25lCiAgICAgICAgICBoYXMgYSBmZXcgcHJvYmxlbXM6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT5JdCBkb2Vzbid0IGtub3cgYWJvdXQgcmVxdWlyZWQgYXR0cmlidXRlcy4gIE9ubHkKICAgICAgICAgICAgbWFudWFsIHR3ZWFraW5nIG9mIHRoaXMgZmlsZSBjYW4gaGVscCBoZXJlLjwvbGk+CgogICAgICAgICAgICA8bGk+SXQgaXMgbm90IGNvbXBsZXRlIC0gaWYgeW91IGFkZCBuZXcgdGFza3MgdmlhCiAgICAgICAgICAgIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gaXQgd29uJ3Qga25vdyBhYm91dCBpdC4gIFNlZQogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNkdi5mci9wYWdlcy9jYXNhL2h0bWwvYW50LWR0ZC5lbi5odG1sIj50aGlzCiAgICAgICAgICAgIHBhZ2U8L2E+IGJ5IE1pY2hlbCBDYXNhYmlhbmNhIGZvciBhIHNvbHV0aW9uIHRvIHRoaXMKICAgICAgICAgICAgcHJvYmxlbS4gIE5vdGUgdGhhdCB0aGUgRFREIHlvdSBjYW4gZG93bmxvYWQgYXQgdGhpcyBwYWdlCiAgICAgICAgICAgIGlzIGJhc2VkIG9uIEFudCAwLjMuMS48L2xpPgoKICAgICAgICAgICAgPGxpPkl0IG1heSBldmVuIGJlIGFuIGludmFsaWQgRFRELiAgQXMgQW50IGFsbG93cyB0YXNrcwogICAgICAgICAgICB3cml0ZXJzIHRvIGRlZmluZSBhcmJpdHJhcnkgZWxlbWVudHMsIG5hbWUgY29sbGlzaW9ucyB3aWxsCiAgICAgICAgICAgIGhhcHBlbiBxdWl0ZSBmcmVxdWVudGx5IC0gaWYgeW91ciB2ZXJzaW9uIG9mIEFudCBjb250YWlucwogICAgICAgICAgICB0aGUgb3B0aW9uYWwgPGNvZGU+Jmx0O3Rlc3QmZ3Q7PC9jb2RlPiBhbmQKICAgICAgICAgICAgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFza3MsIHRoZXJlIGFyZSB0d28gWE1MCiAgICAgICAgICAgIGVsZW1lbnRzIG5hbWVkIDxjb2RlPnRlc3Q8L2NvZGU+ICh0aGUgdGFzayBhbmQgdGhlIG5lc3RlZCBjaGlsZAogICAgICAgICAgICBlbGVtZW50IG9mIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+KSB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGUKICAgICAgICAgICAgbGlzdHMuICBUaGlzIHByb2JsZW0gY2Fubm90IGJlIHNvbHZlZDsgRFREcyBkb24ndCBnaXZlIGEKICAgICAgICAgICAgc3ludGF4IHJpY2ggZW5vdWdoIHRvIHN1cHBvcnQgdGhpcy48L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0ieG1sLWVudGl0eS1pbmNsdWRlIj48L2E+CiAgICAgIEhvdyBkbyBJIGluY2x1ZGUgYW4gWE1MIHNuaXBwZXQgaW4gbXkgYnVpbGQgZmlsZT8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiB1c2UgWE1MJ3Mgd2F5IG9mIGluY2x1ZGluZyBleHRlcm5hbCBmaWxlcyBhbmQgbGV0CiAgICAgICAgdGhlIHBhcnNlciBkbyB0aGUgam9iIGZvciBBbnQ6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDs/Jmd0OwoKJmx0OyFET0NUWVBFIHByb2plY3QgWwogICAgICAgJmx0OyFFTlRJVFkgY29tbW9uIFNZU1RFTSAmcXVvdDtjb21tb24ueG1sJnF1b3Q7Jmd0OwpdJmd0OwoKJmx0O3Byb2plY3QgbmFtZT0mcXVvdDt0ZXN0JnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7dGVzdCZxdW90OyBiYXNlZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CgogICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtzZXR1cCZxdW90OyZndDsKICAgIC4uLgogICZsdDsvdGFyZ2V0Jmd0OwoKICAmYW1wO2NvbW1vbjsKCiAgLi4uCgombHQ7L3Byb2plY3QmZ3Q7CjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICA8cD53aWxsIGxpdGVyYWxseSBpbmNsdWRlIHRoZSBjb250ZW50cyBvZiA8Y29kZT5jb21tb24ueG1sPC9jb2RlPiB3aGVyZQogICAgICAgIHlvdSd2ZSBwbGFjZWQgdGhlIDxjb2RlPiZhbXA7Y29tbW9uOzwvY29kZT4gZW50aXR5LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+KFRoZSBmaWxlbmFtZSA8Y29kZT5jb21tb24ueG1sPC9jb2RlPiBpbiB0aGlzIGV4YW1wbGUgaXMgcmVzb2x2ZWQKICAgICAgICByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBYTUwgZmlsZSBieSB0aGUgWE1MIHBhcnNlci4gWW91IG1heSBhbHNvIHVzZQogICAgICAgIGFuIGFic29sdXRlIDxjb2RlPmZpbGU6PC9jb2RlPiBwcm90b2NvbCBVUkkuKTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW4gY29tYmluYXRpb24gd2l0aCBhIERURCwgdGhpcyB3b3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7IURPQ1RZUEUgcHJvamVjdCBQVUJMSUMgJnF1b3Q7LS8vQU5ULy9EVEQgcHJvamVjdC8vRU4mcXVvdDsgJnF1b3Q7YW50LmR0ZCZxdW90OyBbCiAgICZsdDshRU5USVRZIGluY2x1ZGUgU1lTVEVNICZxdW90O2hlYWRlci54bWwmcXVvdDsmZ3Q7Cl0mZ3Q7CjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5TdGFydGluZyB3aXRoIEFudCAxLjYsIHRoZXJlIGlzIGEgbmV3CiAgICAgICAgPGNvZGU+Jmx0O2ltcG9ydCZndDs8L2NvZGU+IHRhc2sgdGhhdCBjYW4gKGFsc28pIGJlIHVzZWQgdG8KICAgICAgICBpbmNsdWRlIGJ1aWxkIGZpbGUgZnJhZ21lbnRzLiAgVW5saWtlIHRoZSBzbmlwcGV0cyB1c2VkIHdpdGgKICAgICAgICBlbnRpdHkgaW5jbHVkZXMsIHRoZSByZWZlcmVuY2VkIGZpbGVzIGhhdmUgdG8gYmUgY29tcGxldGUgQW50CiAgICAgICAgYnVpbGQgZmlsZXMsIHRob3VnaC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBleGFtcGxlIGFib3ZlIHdvdWxkIGJlY29tZTo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90Oz8mZ3Q7CiZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7dGVzdCZxdW90OyBkZWZhdWx0PSZxdW90O3Rlc3QmcXVvdDsgYmFzZWRpcj0mcXVvdDsuJnF1b3Q7Jmd0OwoKICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7c2V0dXAmcXVvdDsmZ3Q7CiAgICAuLi4KICAmbHQ7L3RhcmdldCZndDsKCiAgJmx0O2ltcG9ydCBmaWxlPSZxdW90Oy4vY29tbW9uLnhtbCZxdW90Oy8mZ3Q7CgogIC4uLgoKJmx0Oy9wcm9qZWN0Jmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VW5saWtlIGVudGl0eSBpbmNsdWRlcywgPGNvZGU+Jmx0O2ltcG9ydCZndDs8L2NvZGU+IHdpbGwKICAgICAgICBsZXQgeW91IHVzZSBBbnQgcHJvcGVydGllcyBpbiB0aGUgZmlsZSBuYW1lLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0ibWFpbC1sb2dnZXIiPjwvYT4KICAgICAgSG93IGRvIEkgc2VuZCBhbiBlbWFpbCB3aXRoIHRoZSByZXN1bHQgb2YgbXkgYnVpbGQKICAgICAgICBwcm9jZXNzPwogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgYXJlIHVzaW5nIGEgbmlnaHRseSBidWlsZCBvZiBBbnQgMS41IGFmdGVyCiAgICAgICAgMjAwMS0xMi0xNCwgeW91IGNhbiB1c2UgdGhlIGJ1aWx0LWluIE1haWxMb2dnZXI6PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KICAgICAgICAgYW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuTWFpbExvZ2dlcgo8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rL2RvY3MvbWFudWFsL2xpc3RlbmVycy5odG1sIj5MaXN0ZW5lcnMKICAgICAgICAmYW1wOyBMb2dnZXJzPC9hPiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBwcm9wZXJ0aWVzCiAgICAgICAgcmVxdWlyZWQuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Gb3Igb2xkZXIgdmVyc2lvbnMgb2YgQW50LCB5b3UgY2FuIHVzZSBhIGN1c3RvbQogICAgICAgIEJ1aWxkTGlzdGVuZXIgdGhhdCBzZW5kcyBvdXQgYW4gZW1haWwKICAgICAgICBpbiB0aGUgYnVpbGRGaW5pc2hlZCgpIG1ldGhvZC4gIFdpbGwgR2xvemVyCiAgICAgICAgJmx0O3dpbGwuZ2xvemVyQGpkYS5jb20mZ3Q7IGhhcyB3cml0dGVuIHN1Y2ggYSBsaXN0ZW5lciBiYXNlZAogICAgICAgIG9uIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvIj5KYXZhTWFpbDwvYT4uCiAgICAgICAgVGhlIHNvdXJjZSBpczo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgppbXBvcnQgamF2YS5pby4qOwppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZheC5tYWlsLio7CmltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lio7CmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwoKLyoqCiAqIEEgc2ltcGxlIGxpc3RlbmVyIHRoYXQgd2FpdHMgZm9yIGEgYnVpbGQgdG8gZmluaXNoIGFuZCBzZW5kcyBhbiBlbWFpbAogKiBvZiB0aGUgcmVzdWx0cy4gIFRoZSBzZXR0aW5ncyBhcmUgc3RvcmVkIGluICZxdW90O21vbml0b3IucHJvcGVydGllcyZxdW90OyBhbmQKICogYXJlIGZhaXJseSBzZWxmIGV4cGxhbmF0b3J5LgogKgogKiBAYXV0aG9yICAgICAgV2lsbCBHbG96ZXIKICogQHZlcnNpb24gICAgIDEuMDVhIDA5LzA2LzIwMDAKICovCnB1YmxpYyBjbGFzcyBCdWlsZE1vbml0b3IgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIHByb3BzOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IEJ1aWxkTW9uaXRvci4KICAgICAqLwogICAgcHVibGljIEJ1aWxkTW9uaXRvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgmcXVvdDttb25pdG9yLnByb3BlcnRpZXMmcXVvdDspOwogICAgICAgIHByb3BzLmxvYWQoaXMpOwogICAgICAgIGlzLmNsb3NlKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZSkgewogICAgfQoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lIHRoZSBzdGF0dXMgb2YgdGhlIGJ1aWxkIGFuZCB0aGUgYWN0aW9ucyB0byBmb2xsb3csIG5vdyB0aGF0CiAgICAgKiB0aGUgYnVpbGQgaGFzIGNvbXBsZXRlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gICAgICAgZSAgICAgICBFdmVudCBkZXNjcmliaW5nIHRoZSBidWlsZCBzdGF0dXMuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBlKSB7CiAgICAgICAgVGhyb3dhYmxlIHRoID0gZS5nZXRFeGNlcHRpb24oKTsKICAgICAgICBTdHJpbmcgc3RhdHVzID0gKHRoICE9IG51bGwpID8gJnF1b3Q7ZmFpbGVkJnF1b3Q7IDogJnF1b3Q7c3VjY2VlZGVkJnF1b3Q7OwoKICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJpbmcga2V5ID0gJnF1b3Q7YnVpbGQuJnF1b3Q7ICsgc3RhdHVzOwogICAgICAgICAgICBpZiAocHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgJnF1b3Q7Lm5vdGlmeSZxdW90OykuZXF1YWxzSWdub3JlQ2FzZSgmcXVvdDtmYWxzZSZxdW90OykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IFNlc3Npb24uZ2V0RGVmYXVsdEluc3RhbmNlKHByb3BzLCBudWxsKTsKCiAgICAgICAgICAgIE1pbWVNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWltZU1lc3NhZ2Uoc2Vzc2lvbik7CiAgICAgICAgICAgIG1lc3NhZ2UuYWRkUmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUuVE8sIHBhcnNlQWRkcmVzc2VzKAogICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgJnF1b3Q7LmVtYWlsLnRvJnF1b3Q7KSkpOwogICAgICAgICAgICBtZXNzYWdlLnNldFN1YmplY3QocHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgJnF1b3Q7LmVtYWlsLnN1YmplY3QmcXVvdDspKTsKCiAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKAogICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoJnF1b3Q7YnVpbGQubG9nJnF1b3Q7KSkpOwogICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CgogICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7CiAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHN3LndyaXRlKGxpbmUpOwogICAgICAgICAgICAgICAgc3cud3JpdGUoJnF1b3Q7XG4mcXVvdDspOwogICAgICAgICAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnIuY2xvc2UoKTsKCiAgICAgICAgICAgIG1lc3NhZ2Uuc2V0VGV4dChzdy50b1N0cmluZygpLCAmcXVvdDtVVEYtOCZxdW90Oyk7CiAgICAgICAgICAgIHN3LmNsb3NlKCk7CgogICAgICAgICAgICBUcmFuc3BvcnQgdHJhbnNwb3J0ID0gc2Vzc2lvbi5nZXRUcmFuc3BvcnQoKTsKICAgICAgICAgICAgdHJhbnNwb3J0LmNvbm5lY3QoKTsKICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQobWVzc2FnZSk7CiAgICAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7QnVpbGRNb25pdG9yIGZhaWxlZCB0byBzZW5kIGVtYWlsISZxdW90Oyk7CiAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaW50ZXJuZXQgZW1haWwgYWRkcmVzc2VzLgogICAgICoKICAgICAqIEBwYXJhbSAgICAgICBzICAgICAgIFRoZSBsaXN0IG9mIGFkZHJlc3Nlcy4KICAgICAqIEByZXR1cm4gICAgICBBcnJheSBvZiBBZGRyZXNzZXMuCiAgICAgKi8KICAgIHByb3RlY3RlZCBBZGRyZXNzW10gcGFyc2VBZGRyZXNzZXMoU3RyaW5nIHMpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgJnF1b3Q7LCZxdW90Oyk7CiAgICAgICAgQWRkcmVzc1tdIGFkZHJzID0gbmV3IEFkZHJlc3Nbc3QuY291bnRUb2tlbnMoKV07CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgYWRkcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgYWRkcnNbaV0gPSBuZXcgSW50ZXJuZXRBZGRyZXNzKHN0Lm5leHRUb2tlbigpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZHJzOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBlKSB7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGUpIHsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGUpIHsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGUpIHsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBlKSB7CiAgICB9Cn0KPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPldpdGggYSA8Y29kZT5tb25pdG9yLnByb3BlcnRpZXM8L2NvZGU+IGxpa2UgdGhpczo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgojIGNvbmZpZ3VyYXRpb24gZm9yIGJ1aWxkIG1vbml0b3IKCm1haWwudHJhbnNwb3J0LnByb3RvY29sPXNtdHAKbWFpbC5zbXRwLmhvc3Q9Jmx0O2hvc3QmZ3Q7Cm1haWwuZnJvbT1XaWxsIEdsb3plciAmbHQ7d2lsbC5nbG96ZXJAamRhLmNvbSZndDsKCmJ1aWxkLmxvZz1idWlsZC5sb2cKCmJ1aWxkLmZhaWxlZC5ub3RpZnk9dHJ1ZQpidWlsZC5mYWlsZWQuZW1haWwudG89d2lsbC5nbG96ZXJAamRhLmNvbQpidWlsZC5mYWlsZWQuZW1haWwuc3ViamVjdD1OaWdodGx5IGJ1aWxkIGZhaWxlZCEKCmJ1aWxkLnN1Y2NlZWRlZC5ub3RpZnk9dHJ1ZQpidWlsZC5zdWNjZWVkZWQuZW1haWwudG89d2lsbC5nbG96ZXJAamRhLmNvbQpidWlsZC5zdWNjZWVkZWQuZW1haWwuc3ViamVjdD1OaWdodGx5IGJ1aWxkIHN1Y2NlZWRlZCEKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxjb2RlPm1vbml0b3IucHJvcGVydGllczwvY29kZT4gc2hvdWxkIGJlIHBsYWNlZCByaWdodCBuZXh0CiAgICAgICAgdG8geW91ciBjb21waWxlZCA8Y29kZT5CdWlsZE1vbml0b3IuY2xhc3M8L2NvZGU+LiAgVG8gdXNlIGl0LAogICAgICAgIGludm9rZSBBbnQgbGlrZTo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgphbnQgLWxpc3RlbmVyIEJ1aWxkTW9uaXRvciAtbG9nZmlsZSBidWlsZC5sb2cKPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPk1ha2Ugc3VyZSB0aGF0IDxjb2RlPm1haWwuamFyPC9jb2RlPiBmcm9tIEphdmFNYWlsIGFuZAogICAgICAgIDxjb2RlPmFjdGl2YXRpb24uamFyPC9jb2RlPiBmcm9tIHRoZQogICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YWJlYW5zL2dsYXNnb3cvamFmLmh0bWwiPkphdmEKICAgICAgICBCZWFucyBBY3RpdmF0aW9uIEZyYW1ld29yazwvYT4gYXJlIGluIHlvdXIgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9Imxpc3RlbmVyLXByb3BlcnRpZXMiPjwvYT4KICAgICAgSG93IGRvIEkgZ2V0IGF0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgQW50IHdhcyBydW5uaW5nCiAgICAgIHdpdGggZnJvbSBpbnNpZGUgQnVpbGRMaXN0ZW5lcj8KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiBnZXQgYXQgYSBoYXNodGFibGUgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBBbnQKICAgICAgICBoYXMgYmVlbiB1c2luZyB0aHJvdWdoIHRoZSBCdWlsZEV2ZW50IHBhcmFtZXRlci4gRm9yCiAgICAgICAgZXhhbXBsZTo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgpwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZSkgewogICAgSGFzaHRhYmxlIHRhYmxlID0gZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpOwogICAgU3RyaW5nIGJ1aWxkcGF0aCA9IChTdHJpbmcpdGFibGUuZ2V0KCZxdW90O2J1aWxkLnBhdGgmcXVvdDspOwogICAgLi4uCn0KPC9wcmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIGp1c3QgcmVhZGluZyB0aGUgc2FtZSBwcm9wZXJ0eQogICAgICAgIGZpbGVzIHRoYXQgeW91ciBwcm9qZWN0IGRvZXMsIHNpbmNlIGl0IHdpbGwgZ2l2ZSB0aGUgY29ycmVjdAogICAgICAgIHJlc3VsdHMgZm9yIHByb3BlcnRpZXMgdGhhdCB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgQW50IGNvbW1hbmQgbGluZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9InJlbW92ZS1jciI+PC9hPgogICAgICAmbHQ7Y2htb2QmZ3Q7IG9yICZsdDtleGVjJmd0OyBkb2Vzbid0IHdvcmsgaW4gQW50CiAgICAgICAgMS4zIG9uIFVuaXgKICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+VGhlIDxjb2RlPmFudFJ1bjwvY29kZT4gc2NyaXB0IGluIDxjb2RlPkFOVF9IT01FL2JpbjwvY29kZT4KICAgICAgICBoYXMgRE9TIGluc3RlYWQgb2YgVW5peCBsaW5lIGVuZGluZ3M7IHlvdSBtdXN0IHJlbW92ZSB0aGUKICAgICAgICBjYXJyaWFnZS1yZXR1cm4gY2hhcmFjdGVycyBmcm9tIHRoaXMgZmlsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkKICAgICAgICB1c2luZyBBbnQncyA8Y29kZT4mbHQ7Zml4Y3JsZiZndDs8L2NvZGU+IHRhc2sKICAgICAgICBvciBzb21ldGhpbmcgbGlrZTo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgp0ciAtZCAnXHInICZsdDsgJEFOVF9IT01FL2Jpbi9hbnRSdW4gJmd0OyAvdG1wL2ZvbwptdiAvdG1wL2ZvbyAkQU5UX0hPTUUvYmluL2FudFJ1bgo8L3ByZT4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iamF2YWRvYy1jYW5ub3QtZXhlY3V0ZSI+PC9hPgogICAgICBKYXZhRG9jIGZhaWxlZDogamF2YS5pby5JT0V4Y2VwdGlvbjogamF2YWRvYzogY2Fubm90IGV4ZWN1dGUKICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+VGhlcmUgaXMgYSBidWcgaW4gdGhlIFNvbGFyaXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mCiAgICAgICAgdGhlIEpESyAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MjMwMzk5Lmh0bWwiPmh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MjMwMzk5Lmh0bWw8L2E+KS4KICAgICAgICBUaGlzIGFsc28gYXBwZWFycyB0byBiZSB0cnVlIHVuZGVyIExpbnV4LiBNb3ZpbmcgdGhlIEpESyB0bwogICAgICAgIHRoZSBmcm9udCBvZiB0aGUgUEFUSCBmaXhlcyB0aGUgcHJvYmxlbS48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImRlbGVnYXRpbmctY2xhc3Nsb2FkZXIiPjwvYT4KICAgICAgJmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKICAgICAgJmx0O2NsYXNzcGF0aCZndDsKICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS43LjAsICZsdDtqdW5pdCZndDsgd2lsbCBob25vciB5b3VyCiAgICAgICAgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlc2UgdGFza3MgZG9uJ3QgaWdub3JlIHlvdXIgY2xhc3NwYXRoIHNldHRpbmcsIHlvdQogICAgICAgIGFyZSBmYWNpbmcgYSBjb21tb24gcHJvYmxlbSB3aXRoIGRlbGVnYXRpbmcgY2xhc3Nsb2FkZXJzLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBxdWVzdGlvbiBjb2xsZWN0cyBhIGNvbW1vbiB0eXBlIG9mIHByb2JsZW06IEEgdGFzawogICAgICAgIG5lZWRzIGFuIGV4dGVybmFsIGxpYnJhcnkgYW5kIGl0IGhhcyBhIG5lc3RlZCBjbGFzc3BhdGgKICAgICAgICBlbGVtZW50IHNvIHRoYXQgeW91IGNhbiBwb2ludCBpdCB0byB0aGlzIGV4dGVybmFsIGxpYnJhcnksIGJ1dAogICAgICAgIHRoYXQgZG9lc24ndCB3b3JrIHVubGVzcyB5b3UgcHV0IHRoZSBleHRlcm5hbCBsaWJyYXJ5CiAgICAgICAgaW50byB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBvciBwbGFjZSBpdCBpbgogICAgICAgIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Tb21lIGJhY2tncm91bmQgaXMgbmVjZXNzYXJ5IGJlZm9yZSB3ZSBjYW4gZGlzY3VzcwogICAgICAgIHNvbHV0aW9ucyBmb3IgPGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij5BbnQKICAgICAgICAxLjUueDwvYT4gYW5kIDxhIGhyZWY9IiNkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyLTEuNiI+QW50CiAgICAgICAgMS42Lng8L2E+LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2hlbiB5b3Ugc3BlY2lmeSBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gaW4KICAgICAgICBBbnQsIEFudCBjcmVhdGVzIGEgbmV3IGNsYXNzIGxvYWRlciB0aGF0IHVzZXMgdGhlIHBhdGggeW91CiAgICAgICAgaGF2ZSBzcGVjaWZpZWQuICBJdCB0aGVuIHRyaWVzIHRvIGxvYWQgYWRkaXRpb25hbCBjbGFzc2VzIGZyb20KICAgICAgICB0aGlzIGNsYXNzbG9hZGVyLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW4gbW9zdCBjYXNlcyAtIGZvciBleGFtcGxlIHVzaW5nICZsdDtzdHlsZSZndDsgb3IKICAgICAgICAmbHQ7anVuaXQmZ3Q7IC0gQW50IGRvZXNuJ3QgbG9hZCB0aGUgZXh0ZXJuYWwgbGlicmFyeQogICAgICAgIGRpcmVjdGx5LCBpdCBpcyB0aGUgbG9hZGVkIGNsYXNzIHRoYXQgZG9lcyBzby48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkluIHRoZSBjYXNlIG9mIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IGl0IGlzIHRoZSB0YXNrCiAgICAgICAgaW1wbGVtZW50YXRpb24gaXRzZWxmIGFuZCBpbiB0aGUgY2FzZSBvZgogICAgICAgIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGl0IGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTGlhaXNvbjwvY29kZT4KICAgICAgICBjbGFzcy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxlbT5BcyBvZiBBbnQgMS43PC9lbT4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gbm8gbG9uZ2VyCiAgICAgICAgcmVxdWlyZXMgeW91IHRvIGhhdmUgPGNvZGU+anVuaXQuamFyPC9jb2RlPiBpbiBBbnQncyBzdGFydHVwCiAgICAgICAgY2xhc3NwYXRoIGV2ZW4gaWYgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4gaXMgcHJlc2VudCB0aGVyZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCdzIGNsYXNzIGxvYWRlciBpbXBsZW1lbnRhdGlvbiB1c2VzIEphdmEncwogICAgICAgIGRlbGVnYXRpb24gbW9kZWwsIHNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9hcGkvamF2YS9sYW5nL0NsYXNzTG9hZGVyLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2FwaS9qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuaHRtbDwvYT4KICAgICAgICB0aGUgcGFyYWdyYXBoPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8YmxvY2txdW90ZT5UaGUgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IGNsYXNzIHVzZXMgYQogICAgICAgIGRlbGVnYXRpb24gbW9kZWwgdG8gc2VhcmNoIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuIEVhY2gKICAgICAgICBpbnN0YW5jZSBvZiA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gaGFzIGFuIGFzc29jaWF0ZWQgcGFyZW50CiAgICAgICAgY2xhc3MgbG9hZGVyLiAgV2hlbiBjYWxsZWQgdXBvbiB0byBmaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2UsIGEKICAgICAgICA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gaW5zdGFuY2Ugd2lsbCBkZWxlZ2F0ZSB0aGUgc2VhcmNoIGZvcgogICAgICAgIHRoZSBjbGFzcyBvciByZXNvdXJjZSB0byBpdHMgcGFyZW50IGNsYXNzIGxvYWRlciBiZWZvcmUKICAgICAgICBhdHRlbXB0aW5nIHRvIGZpbmQgdGhlIGNsYXNzIG9yIHJlc291cmNlIGl0c2VsZi4gVGhlIHZpcnR1YWwKICAgICAgICBtYWNoaW5lJ3MgYnVpbHQtaW4gY2xhc3MgbG9hZGVyLCBjYWxsZWQgdGhlIGJvb3RzdHJhcAogICAgICAgIGNsYXNzIGxvYWRlciwgZG9lcyBub3QgaXRzZWxmIGhhdmUgYSBwYXJlbnQgYnV0IG1heSBzZXJ2ZSBhcwogICAgICAgIHRoZSBwYXJlbnQgb2YgYSA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4KICAgICAgICBpbnN0YW5jZS48L2Jsb2NrcXVvdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBwb3NzaWJsZSBzb2x1dGlvbnMgZGVwZW5kIG9uIHRoZSB2ZXJzaW9uIG9mIEFudCB5b3UKICAgICAgICB1c2UsIHNlZSB0aGUgbmV4dCBzZWN0aW9ucy48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImRlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij48L2E+CiAgICAgICZsdDtzdHlsZSZndDsgb3IgJmx0O2p1bml0Jmd0OyBpZ25vcmVzIG15CiAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7IC0gQW50IDEuNS54IHZlcnNpb24KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIHJlYWQgPGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXIiPnRoZSBwcmV2aW91cwogICAgICAgIGVudHJ5PC9hPiBiZWZvcmUgeW91IGdvIGFoZWFkLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rmlyc3Qgb2YgYWxsIGxldCdzIHN0YXRlIHRoYXQgQW50J3Mgd3JhcHBlciBzY3JpcHQKICAgICAgICAoPGNvZGU+YW50PC9jb2RlPiBvciA8Y29kZT5hbnQuYmF0PC9jb2RlPikgYWRkcyBhbGwKICAgICAgICA8Y29kZT4uamFyPC9jb2RlPiBmaWxlcyBmcm9tIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4gdG8KICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LCB0aGVyZWZvcmUgImluCiAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiIgc2hhbGwgbWVhbiAiZWl0aGVyIGluIHlvdXIKICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIG9yCiAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiIgZm9yIHRoZSByZXN0IG9mIHRoaXMKICAgICAgICBhbnN3ZXIuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgcm9vdCBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBjbGFzcyB0aGF0IG5lZWRzIHRoZQogICAgICAgIGV4dGVybmFsIGxpYnJhcnkgaXMgb24gdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5MZXQncyBzZWUgd2hhdCBoYXBwZW5zIHdoZW4geW91IGxvYWQgdGhlICZsdDtqdW5pdCZndDsKICAgICAgICB0YXNrLiAgQW50J3MgY2xhc3MgbG9hZGVyIHdpbGwgY29uc3VsdCB0aGUKICAgICAgICBib290c3RyYXAgY2xhc3MgbG9hZGVyIGZpcnN0LCB3aGljaCB0cmllcyB0byBsb2FkIGNsYXNzZXMgZnJvbQogICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uICBUaGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlcgogICAgICAgIGRvZXNuJ3Qga25vdyBhbnl0aGluZyBhYm91dCBBbnQncyBjbGFzcyBsb2FkZXIgb3IKICAgICAgICBldmVuIHRoZSBwYXRoIHlvdSBoYXZlIHNwZWNpZmllZC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyIGNhbiBsb2FkIHRoZSBjbGFzcyBBbnQgaGFzCiAgICAgICAgYXNrZWQgaXQgdG8gbG9hZCAod2hpY2ggaXQgY2FuIGlmIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gaXMKICAgICAgICBwYXJ0IG9mIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4pLCB0aGlzIGNsYXNzIHdpbGwgdHJ5IHRvIGxvYWQKICAgICAgICB0aGUgZXh0ZXJuYWwgbGlicmFyeSBmcm9tIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gYXMgd2VsbCAtIGl0CiAgICAgICAgZG9lc24ndCBrbm93IGFueXRoaW5nIGVsc2UgLSBhbmQgd2lsbCBub3QgZmluZCBpdCB1bmxlc3MKICAgICAgICB0aGUgbGlicmFyeSBpcyBpbiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGFzIHdlbGwuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5UbyBzb2x2ZSB0aGlzLCB5b3UgaGF2ZSB0d28gbWFqb3Igb3B0aW9uczo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvbD4KICAgICAgICAgIDxsaT5wdXQgYWxsIGV4dGVybmFsIGxpYnJhcmllcyB5b3UgbmVlZCBpbgogICAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBhcyB3ZWxsIHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQsCiAgICAgICAgICBvdGhlcndpc2UgeW91IHdvdWxkbid0IGhhdmUgZm91bmQgdGhpcyBGQVEgZW50cnkuPC9saT4KCiAgICAgICAgICA8bGk+cmVtb3ZlIHRoZSBjbGFzcyB0aGF0IGxvYWRzIHRoZSBleHRlcm5hbCBsaWJyYXJ5IGZyb20KICAgICAgICAgIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LjwvbGk+CiAgICAgICAgPC9vbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gcmVtb3ZlCiAgICAgICAgPGNvZGU+b3B0aW9uYWwuamFyPC9jb2RlPiBmcm9tIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4uICBJZgogICAgICAgIHlvdSBkbyBzbywgeW91IHdpbGwgaGF2ZSB0byA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGFsbAogICAgICAgIG9wdGlvbmFsIHRhc2tzIGFuZCB1c2UgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPgogICAgICAgIGVsZW1lbnRzIGluIHRoZSA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IHRhc2tzIHRoYXQgcG9pbnQKICAgICAgICB0byB0aGUgbmV3IGxvY2F0aW9uIG9mIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4uICBBbHNvLAogICAgICAgIGRvbid0IGZvcmdldCB0byBhZGQgdGhlIG5ldyBsb2NhdGlvbiBvZgogICAgICAgIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gdG8gdGhlCiAgICAgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IG9mIHlvdXIKICAgICAgICA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPgogICAgICAgIHRhc2suPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3Ugd2FudCB0byBhdm9pZCB0byA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGFsbAogICAgICAgIG9wdGlvbmFsIHRhc2tzIHlvdSBuZWVkLCB0aGUgb25seSBvdGhlciBvcHRpb24gaXMgdG8gcmVtb3ZlCiAgICAgICAgdGhlIGNsYXNzZXMgdGhhdCBzaG91bGQgbm90IGJlIGxvYWRlZCB2aWEgdGhlIGJvb3RzdHJhcCBjbGFzcwogICAgICAgIGxvYWRlciBmcm9tIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gYW5kIHB1dCB0aGVtIGludG8gYQogICAgICAgIHNlcGFyYXRlIGFyY2hpdmUuIEFkZCB0aGlzIHNlcGFyYXRlIGFyY2hpdmUgdG8gdGhlCiAgICAgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IG9mIHlvdXIKICAgICAgICA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrCiAgICAgICAgLSBhbmQgbWFrZSBzdXJlIHRoZSBzZXBhcmF0ZSBhcmNoaXZlIGlzIG5vdCBpbgogICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5JbiB0aGUgY2FzZSBvZiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB5b3UnZCBoYXZlCiAgICAgICAgdG8gcmVtb3ZlIGFsbCBjbGFzc2VzIHRoYXQgYXJlIGluIHRoZQogICAgICAgIDxjb2RlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0PC9jb2RlPgogICAgICAgIGRpcmVjdG9yeSwgaW4gdGhlIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGNhc2UgaXQgaXMgb25lIG9mCiAgICAgICAgdGhlIDxjb2RlPipMaWFpc29uPC9jb2RlPiBjbGFzc2VzIGluCiAgICAgICAgPGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWw8L2NvZGU+LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IHVzZSB0aGUgb3B0aW9uIHRvIGJyZWFrIHVwIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4KICAgICAgICBmb3IgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gb3IgcmVtb3ZlCiAgICAgICAgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4sIHlvdSBzdGlsbCBoYXZlIHRvIHVzZSBhCiAgICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiB3aXRoIGEgbmVzdGVkCiAgICAgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IHRvIGRlZmluZSB0aGUganVuaXQgdGFzay48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImRlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS42Ij48L2E+CiAgICAgICZsdDtzdHlsZSZndDsgb3IgJmx0O2p1bml0Jmd0OyBpZ25vcmVzIG15CiAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7IC0gQW50IDEuNi54IHZlcnNpb24KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIHJlYWQgPGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXIiPnRoZSBnZW5lcmFsCiAgICAgICAgZW50cnk8L2E+IGJlZm9yZSB5b3UgZ28gYWhlYWQuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgd3JhcHBlciBzY3JpcHQgb2YgQW50IDEuNi54IG5vIGxvbmdlciBhZGRzIHRoZSBjb250ZW50cwogICAgICAgIG9mIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4gdG8gPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiwKICAgICAgICBpbnN0ZWFkIEFudCB3aWxsIGNyZWF0ZSBhIGNsYXNzbG9hZGVyIG9uIHRvcCBvZiB0aGUgYm9vdHN0cmFwCiAgICAgICAgY2xhc3Nsb2FkZXIgLSBsZXQncyBjYWxsIGl0IHRoZSBjb3JlbG9hZGVyIGZvciB0aGUgcmVzdCBvZgogICAgICAgIHRoaXMgYW5zd2VyIC0gd2hpY2ggaG9sZHMgdGhlIGNvbnRlbnRzIG9mCiAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPi4gIEFudCdzIGNvcmUgYW5kIGl0cyB0YXNrcyB3aWxsIGJlCiAgICAgICAgbG9hZGVkIHRocm91Z2ggdGhpcyBjbGFzc2xvYWRlciBhbmQgbm90IHRoZSBib290c3RyYXAKICAgICAgICBjbGFzc2xvYWRlci48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgY2F1c2VzIHNvbWUgc21hbGwgYnV0IG5vdGFibGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBBbnQKICAgICAgICAxLjUueCBhbmQgMS42LnguICBNb3N0IGltcG9ydGFudGx5LCBhIHRoaXJkLXBhcnR5IHRhc2sgdGhhdCBpcwogICAgICAgIHBhcnQgb2YgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiB3aWxsIG5vIGxvbmdlciB3b3JrIGluIEFudAogICAgICAgIDEuNi54IHNpbmNlIHRoZSB0YXNrIG5vdyBjYW4ndCBmaW5kIEFudCdzIGNsYXNzZXMuICBJbiBhIHNlbnNlCiAgICAgICAgdGhpcyBpcyB0aGUgc2FtZSBwcm9ibGVtIHRoaXMgZW50cnkgaXMgYWJvdXQsIG9ubHkKICAgICAgICA8Y29kZT5hbnQuamFyPC9jb2RlPiBoYXMgYmVjb21lIHRoZSBleHRlcm5hbCBsaWJyYXJ5IGluCiAgICAgICAgcXVlc3Rpb24gbm93LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBjb3JlbG9hZGVyIGFsc28gaG9sZHMgdGhlIGNvbnRlbnRzIG9mCiAgICAgICAgPGNvZGU+fi8uYW50L2xpYjwvY29kZT4gYW5kIGFueSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGhhcwogICAgICAgIGJlZW4gc3BlY2lmaWVkIHVzaW5nIEFudCdzIDxjb2RlPi1saWI8L2NvZGU+IGNvbW1hbmQgbGluZQogICAgICAgIGFyZ3VtZW50LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+TGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBsb2FkIHRoZSAmbHQ7anVuaXQmZ3Q7CiAgICAgICAgdGFzay4gIEFudCdzIGNsYXNzIGxvYWRlciB3aWxsIGNvbnN1bHQgdGhlIGJvb3RzdHJhcAogICAgICAgIGNsYXNzIGxvYWRlciBmaXJzdCwgd2hpY2ggdHJpZXMgdG8gbG9hZCBjbGFzc2VzIGZyb20KICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LiAgVGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIKICAgICAgICBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgQW50J3MgY2xhc3MgbG9hZGVyIG9yCiAgICAgICAgZXZlbiB0aGUgcGF0aCB5b3UgaGF2ZSBzcGVjaWZpZWQuICBJZiBpdCBmYWlscyB0byBmaW5kIHRoZQogICAgICAgIGNsYXNzIHVzaW5nIHRoZSBib290c3RyYXAgY2xhc3Nsb2FkZXIgaXQgd2lsbCB0cnkgdGhlCiAgICAgICAgY29yZWxvYWRlciBuZXh0LiAgQWdhaW4sIHRoZSBjb3JlbG9hZGVyIGRvZXNuJ3Qga25vdyBhbnl0aGluZwogICAgICAgIGFib3V0IHlvdXIgcGF0aC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHRoZSBjb3JlbG9hZGVyIGNhbiBsb2FkIHRoZSBjbGFzcyBBbnQgaGFzIGFza2VkIGl0IHRvCiAgICAgICAgbG9hZCAod2hpY2ggaXQgY2FuIGlmIDxjb2RlPmFudC1qdW5pdC5qYXI8L2NvZGU+IGlzIGluCiAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiksIHRoaXMgY2xhc3Mgd2lsbCB0cnkgdG8gbG9hZCB0aGUKICAgICAgICBleHRlcm5hbCBsaWJyYXJ5IGZyb20gY29yZWxvYWRlciBhcyB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgIGtub3cgYW55dGhpbmcgZWxzZSAtIGFuZCB3aWxsIG5vdCBmaW5kIGl0IHVubGVzcyB0aGUgbGlicmFyeQogICAgICAgIGlzIGluIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gb3IgdGhlIGNvcmVsb2FkZXIgYXMgd2VsbC48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvIHNvbHZlIHRoaXMsIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgbWFqb3Igb3B0aW9uczo8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvbD4KICAgICAgICAgIDxsaT5wdXQgYWxsIGV4dGVybmFsIGxpYnJhcmllcyB5b3UgbmVlZCBpbgogICAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBhcyB3ZWxsIHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQsCiAgICAgICAgICBvdGhlcndpc2UgeW91IHdvdWxkbid0IGhhdmUgZm91bmQgdGhpcyBGQVEgZW50cnkuPC9saT4KCiAgICAgICAgICA8bGk+cHV0IGFsbCBleHRlcm5hbCBsaWJyYXJpZXMgeW91IG5lZWQgaW4KICAgICAgICAgIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4gb3IgPGNvZGU+LmFudC9saWI8L2NvZGU+LiAgVGhpcwogICAgICAgICAgcHJvYmFibHkgc3RpbGwgaXNuJ3Qgd2hhdCB5b3Ugd2FudCwgYnV0IHlvdSBtaWdodCByZWNvbnNpZGVyCiAgICAgICAgICB0aGUgPGNvZGU+LmFudC9saWI8L2NvZGU+IG9wdGlvbi48L2xpPgoKICAgICAgICAgIDxsaT5BbHdheXMgc3RhcnQgQW50IHdpdGggdGhlIDxjb2RlPi1saWI8L2NvZGU+IGNvbW1hbmQgbGluZQogICAgICAgICAgc3dpdGNoIGFuZCBwb2ludCB0byB5b3VyIGV4dGVybmFsIGxpYnJhcmllcyAob3IgdGhlCiAgICAgICAgICBkaXJlY3RvcmllcyBob2xkaW5nIHRoZW0pLjwvbGk+CgogICAgICAgICAgPGxpPnJlbW92ZSB0aGUgY2xhc3MgdGhhdCBsb2FkcyB0aGUgZXh0ZXJuYWwgbGlicmFyeSBmcm9tCiAgICAgICAgICB0aGUgY29yZWxvYWRlci48L2xpPgogICAgICAgIDwvb2w+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkluIEFudCAxLjYgPGNvZGU+b3B0aW9uYWwuamFyPC9jb2RlPiBoYXMgYmVlbiBzcGxpdCBpbnRvCiAgICAgICAgbXVsdGlwbGUgamFycywgZWFjaCBvbmUgY29udGFpbmluZyBjbGFzc2VzIHdpdGggdGhlIHNhbWUKICAgICAgICBkZXBlbmRlbmNpZXMgb24gZXh0ZXJuYWwgbGlicmFyaWVzLiAgWW91IGNhbiBtb3ZlIHRoZQogICAgICAgICJvZmZlbmRpbmciIGphciBvdXQgb2YgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPi4gIEZvciB0aGUKICAgICAgICA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrIGl0IHdvdWxkIGJlCiAgICAgICAgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4gYW5kIGZvciA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPgogICAgICAgIGl0IHdvdWxkIGJlIDxjb2RlPmFudC10cmF4LmphcjwvY29kZT4KICAgICAgICBvciA8Y29kZT5hbnQteHNscC5qYXI8L2NvZGU+IC0gCiAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzb3IgeW91IHVzZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBkbyBzbywgeW91IHdpbGwgaGF2ZSB0byA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+CiAgICAgICAgYWxsIG9wdGlvbmFsIHRhc2tzIHRoYXQgbmVlZCB0aGUgZXh0ZXJuYWwgbGlicmFyeSBhbmQgdXNlCiAgICAgICAgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUKICAgICAgICA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IHRhc2tzIHRoYXQgcG9pbnQgdG8gdGhlIG5ldwogICAgICAgIGxvY2F0aW9uIG9mIDxjb2RlPmFudC0qLmphcjwvY29kZT4uICBBbHNvLCBkb24ndCBmb3JnZXQKICAgICAgICB0byBhZGQgdGhlIG5ldyBsb2NhdGlvbiBvZiA8Y29kZT5hbnQtKi5qYXI8L2NvZGU+IHRvIHRoZQogICAgICAgIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBvZiB5b3VyCiAgICAgICAgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4KICAgICAgICB0YXNrLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGV4YW1wbGU8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgogICAgJmx0O3Rhc2tkZWYgbmFtZT0mcXVvdDtqdW5pdCZxdW90OwogICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRhc2smcXVvdDsmZ3Q7CiAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CiAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O0hPTUUtT0YvanVuaXQuamFyJnF1b3Q7LyZndDsKICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7TkVXLUhPTUUtT0YvYW50LWp1bml0LmphciZxdW90Oy8mZ3Q7CiAgICAgICZsdDsvY2xhc3NwYXRoJmd0OwogICAgJmx0Oy90YXNrZGVmJmd0Owo8L3ByZT4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0id2lueHAtamRrMTQtYW50MTQiPjwvYT4KICAgICAgV2hlbiBydW5uaW5nIEFudCAxLjQgb24gV2luZG93cyBYUCBhbmQgSkRLIDEuNCwgSSBnZXQKICAgICAgdmFyaW91cyBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiwgZm9yawogICAgICA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IG9yIGFjY2VzcyBlbnZpcm9ubWVudAogICAgICB2YXJpYWJsZXMuCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPkFudCAmbHQ7IDEuNSBkb2Vzbid0IHJlY29nbml6ZSBXaW5kb3dzIFhQIGFzIGEgZmxhdm9yCiAgICAgICAgb2YgV2luZG93cyB0aGF0IHJ1bnMgPGNvZGU+Q01ELkVYRTwvY29kZT4gaW5zdGVhZCBvZgogICAgICAgIDxjb2RlPkNPTU1BTkQuQ09NPC9jb2RlPi4gIEpESyAxLjMgd2lsbCB0ZWxsIEFudCB0aGF0IFdpbmRvd3MKICAgICAgICBYUCBpcyBXaW5kb3dzIDIwMDAgc28gdGhlIHByb2JsZW0gZG9lc24ndCBzaG93IHVwCiAgICAgICAgdGhlcmUuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFydCBmcm9tIHVwZ3JhZGluZyB0byBBbnQgMS41IG9yIGJldHRlciwgc2V0dGluZyB0aGUKICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5BTlRfT1BUUzwvY29kZT4gdG8KICAgICAgICA8Y29kZT4tRG9zLm5hbWU9V2luZG93c19OVDwvY29kZT4gcHJpb3IgdG8gaW52b2tpbmcgQW50IGhhcwogICAgICAgIGJlZW4gY29uZmlybWVkIGFzIGEgd29ya2Fyb3VuZC48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9IjEuNS1jeWd3aW4tc2giPjwvYT4KICAgICAgVGhlIDxjb2RlPmFudDwvY29kZT4gd3JhcHBlciBzY3JpcHQgb2YgQW50IDEuNSBmYWlscwogICAgICBmb3IgQ3lnd2luIGlmIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBpcyBzZXQgdG8gYSBXaW5kb3dzIHN0eWxlCiAgICAgIHBhdGguCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPlRoaXMgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCBvbmx5IGhvdXJzIGFmdGVyIEFudCAxLjUgaGFzCiAgICAgICAgYmVlbiByZWxlYXNlZCwgc2VlIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTA2NjQiPkJ1ZwogICAgICAgIDEwNjY0PC9hPiBhbmQgYWxsIGl0cyBkdXBsaWNhdGVzLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSBmaXhlZCB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIHNjcmlwdCBjYW4gYmUgZm91bmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL29sZC1yZWxlYXNlcy92MS41L2VycmF0YS8iPmhlcmU8L2E+LgogICAgICAgIFNpbXBseSByZXBsYWNlIHlvdXIgc2NyaXB0IHdpdGggdGhpcyB2ZXJzaW9uLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0iMS41LjItemlwLWJyb2tlbiI+PC9hPgogICAgICA8Y29kZT4mbHQ7emlwJmd0OzwvY29kZT4gaXMgYnJva2VuIGluIEFudCAxLjUuMi4KICAgIDwvcD4KICAgICAgICAgICAgICAgICAgPHA+WWVzLCBpdCBpcy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBwcm9ibGVtIHJlcG9ydGVkIGJ5IG1vc3QgcGVvcGxlIC0gc2VlIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTc2NDgiPkJ1ZwogICAgICAgIDE3NjQ4PC9hPiBhbmQgYWxsIGl0cyBkdXBsaWNhdGVzIC0gaXMgdGhhdCBBbnQgY3JlYXRlcwogICAgICAgIGFyY2hpdmVzIHRoYXQgYSBwYXJ0aWFsbHkgdW5yZWFkYWJsZSBieSBXaW5aSVAuICBMdWNraWx5CiAgICAgICAgPGNvZGU+amFyPC9jb2RlPiBkZWFscyB3aXRoIHRoZSBhcmNoaXZlcyBhbmQgc28gdGhlIGdlbmVyYXRlZAogICAgICAgIGphcnMvd2Fycy9lYXJzIHdpbGwgbW9zdCBsaWtlbHkgd29yayBmb3IgeW91IGFueXdheS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZXJlIGFyZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBzZWUgYnVncyA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3NzgwIj5CdWcKICAgICAgICAxNzc4MDwvYT4sIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTc4NzEiPkJ1ZwogICAgICAgIDE3ODcxPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xODQwMyI+QnVnCiAgICAgICAgMTg0MDM8L2E+LiAgQWxsIG9mIHRoZW0gYXJlIHN1cHBvc2VkIHRvIGJlIGZpeGVkIHdpdGggQW50CiAgICAgICAgMS41LjMgKGFuZCBvbmx5IDE4NDAzIHNob3VsZCBleGlzdCBpbiAxLjUuM2JldGExKS48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9InVua25vd25lbGVtZW50LnRhc2tjb250YWluZXIiPjwvYT4KICAgICAgCiAgICAgICAgV2h5IGRvIG15IGN1c3RvbSB0YXNrIGNvbnRhaW5lcnMgc2VlIFVua25vd24gRWxlbWVudHMgaW4gQW50IDEuNgogICAgICAgIC0gdGhleSB3b3JrZWQgaW4gQW50IDEuNT8KICAgICAgCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgVGhlIG9iamVjdHMgYWRkZWQgaW4gVGFza0NvbnRhaW5lci5hZGRUYXNrKFRhc2sgdGFzaykKICAgICAgICAgIGhhdmUgY2hhbmdlZCBmcm9tICBUYXNrcyB0byBVbmtub3duRWxlbWVudHMuCiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgIFRoZXJlIHdhcyBhIG51bWJlciBvZiB2YWxpZCByZWFzb25zIGZvciB0aGlzIGNoYW5nZS4gQnV0IHRoZSBiYWNrd2FyZAogICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3ZXJlIG5vdCBub3RpY2VkIHVudGlsIGFmdGVyIEFudCAxLjYuMCB3YXMKICAgICAgICAgIHJlbGVhc2VkLgogICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICBZb3VyIGNvbnRhaW5lciBjbGFzcyB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gY2hlY2sgaWYgdGhlIFRhc2sKICAgICAgICAgIGlzIGFuIFVua25vd25FbGVtZW50IGFuZCBjYWxsIHBlcmZvcm0gb24gaXQgdG8KICAgICAgICAgIGNvbnZlcnQgaXQgdG8gYSBUYXNrIGFuZCB0byBleGVjdXRlIGl0LgogICAgICAgICAgKHNlZSBhcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNlcXVlbnRpYWwpCiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdSB3YW50IHRvIGRvIG1vcmUgcHJvY2Vzc2luZyBvbiB0aGUgdGFzaywKICAgICAgICAgIHlvdSBuZWVkIHRvIHVzZSB0aGUgdGVjaG5pcXVlcyBpbiBhcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudGxpYiNleGVjdXRlKCkKICAgICAgICAgIFRoaXMgZG9lcyBtYWtlIHVzZSBvZiBvbmUgMS42IG1ldGhvZCBjYWxsIChVRSNnZXRSZWFsT2JqZWN0KCkpLAogICAgICAgICAgeW91IG5lZWQgdG8gdXNlIFVFI2dldFRhc2soKSBpbnN0ZWFkIC0gdGhpcyB3aWxsCiAgICAgICAgICByZXR1cm4gbnVsbCBmb3Igbm9uIHRhc2tzICh0eXBlcyBsaWtlIGZpbGVzZXQgaWQ9eCkuCiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgIFNvLi4gaXRlcmF0ZSBvdmVyIHRoZSB0YXNrcywgaWYgdGhleSBhcmUgVUVzLCBjb252ZXJ0IHRoZW0gdG8KICAgICAgICAgIHRhc2tzLCB1c2luZyBVRSNtYXliZUNvbmZpZ3VyZSBhbmQgVUUjZ2V0VGFzaygpCiAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKICAgICAgICAgICBUYXNrIHQgPSAoVGFzaykgaS5uZXh0KCk7CiAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgewogICAgICAgICAgICAgICgoVW5rbm93bkVsZW1lbnQpIHQpLm1heWJlQ29uZmlndXJlKCk7CiAgICAgICAgICAgICAgdCA9ICgoVW5rbm93bkVsZW1lbnQpIHQpLmdldFRhc2soKTsKICAgICAgICAgICAgICBpZiAodCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgLy8gLi4uLiBvcmlnaW5hbCBDdXN0b20gY29kZQogICAgICAgIH0KICAgICAgICA8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICBUaGlzIGFwcHJvYWNoIHNob3VsZCB3b3JrIGZvciBhbnQxLjUgYW5kIGFudDEuNi4KICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9ImphdmEuZXhjZXB0aW9uLnN0YWNrdHJhY2UiPjwvYT4KICAgICAgCiAgICAgICAgVGhlIHByb2dyYW0gSSBydW4gdmlhICZsdDtqYXZhJmd0OyB0aHJvd3MgYW4gZXhjZXB0aW9uIGJ1dCBJCiAgICAgICAgY2FuJ3Qgc2VlbSB0byBnZXQgdGhlIGZ1bGwgc3RhY2sgdHJhY2UuCiAgICAgIAogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIGEga25vdyBidWcgdGhhdCBoYXMgYmVlbiBmaXhlZCBhZnRlciB0aGUgcmVsZWFzZSBvZgogICAgICAgIEFudCAxLjYuMS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFzIGEgd29ya2Fyb3VuZCwgcnVuIHlvdXIgJmx0O2phdmEmZ3Q7IHRhc2sgd2l0aAogICAgICAgIDxjb2RlPmZvcms9InRydWUiPC9jb2RlPiBhbmQgQW50IHdpbGwgZGlzcGxheSB0aGUgZnVsbAogICAgICAgIHRyYWNlLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KICAgICAgPGEgbmFtZT0ianVuaXQtbm8tcnVudGltZS14bWwiPjwvYT4KICAgICAgCiAgICAgICAgVXNpbmcgZm9ybWF0PSJ4bWwiLCAmbHQ7anVuaXQmZ3Q7IGZhaWxzIHdpdGggYQogICAgICAgIDxjb2RlPk5vQ2xhc3NEZWZGb3VuZEVycm9yPC9jb2RlPiBpZiBmb3JrZWQuCiAgICAgIAogICAgPC9wPgogICAgICAgICAgICAgICAgICA8cD5UaGUgWE1MIGZvcm1hdHRlciBuZWVkcyB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvRE9NLyI+RE9NIGNsYXNzZXM8L2E+IHRvIHdvcmsuICBJZiB5b3UKICAgICAgICBhcmUgdXNpbmcgSkRLIDEuNCBvciBsYXRlciB0aGV5IGFyZSBpbmNsdWRlZCB3aXRoIHlvdXIgSmF2YQogICAgICAgIFJ1bnRpbWUgYW5kIHRoaXMgcHJvYmxlbSB3b24ndCBvY2N1ci4gIElmIHlvdSBhcmUgcnVubmluZyBKREsKICAgICAgICAxLjMgb3IgZWFybGllciwgdGhlIERPTSBjbGFzc2VzIGhhdmUgdG8gYmUgb24geW91cgogICAgICAgICZsdDtqdW5pdCZndDsgdGFzaydzICZsdDtjbGFzc3BhdGgmZ3Q7LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+UHJpb3IgdG8gQW50IDEuNi4wIEFudCB3b3VsZCBpbmNsdWRlIHRoZSBET00gY2xhc3NlcyBmcm9tCiAgICAgICAgdGhlIFhNTCBwYXJzZXIgdGhhdCBpcyB1c2VkIGJ5IEFudCBpdHNlbGYgaWYgeW91IHNldCB0aGUKICAgICAgICBpbmNsdWRlQW50UnVudGltZSBhdHRyaWJ1dGUgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLiAgV2l0aCBBbnQKICAgICAgICAxLjYuMCB0aGlzIGhhcyBiZWVuIGNoYW5nZWQgYXMgdGhpcyBiZWhhdmlvciBtYWRlIGl0CiAgICAgICAgaW1wb3NzaWJsZSB0byB1c2UgYSBkaWZmZXJlbnQgWE1MIHBhcnNlciBpbiB5b3VyIHRlc3RzLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGUgRE9NIGNsYXNzZXMKICAgICAgICBleHBsaWNpdGx5IHN0YXJ0aW5nIHdpdGggQW50IDEuNi4wLiAgSWYgeW91IGRvbid0IG5lZWQgdG8gc2V0CiAgICAgICAgdXAgYSBkaWZmZXJlbnQgWE1MIHBhcnNlciBmb3IgeW91ciB0ZXN0cywgdGhlIGVhc2llc3Qgc29sdXRpb24KICAgICAgICBpcyB0byBhZGQ8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgombHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2FudC5ob21lfS9saWIveG1sLWFwaXMuamFyOiR7YW50LmhvbWV9L2xpYi94ZXJjZXNJbXBsLmphciZxdW90Oy8mZ3Q7CjwvcHJlPgogICAgICAgICAgICAgICAgICAgICAgICA8cD50byB5b3VyIHRhc2sncyAmbHQ7Y2xhc3NwYXRoJmd0Oy48L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CiAgICAgIDxhIG5hbWU9InhhbGFuLWpkazEuNSI+PC9hPgogICAgICAKICAgICAgICA8Y29kZT4mbHQ7anVuaXRyZXBvcnQmZ3Q7PC9jb2RlPiBkb2Vzbid0IHdvcmsgd2l0aCBKREsgMS41IGJ1dAogICAgICAgIHdvcmtlZCBmaW5lIHdpdGggSkRLIDEuNC4KICAgICAgCiAgICA8L3A+CiAgICAgICAgICAgICAgICAgIDxwPldoaWxlIEpESyAxLjQueCBjb250YWlucyBhIHZlcnNpb24gb2YgWGFsYW4tSiAyLCBKREsgMS41CiAgICAgICAgKGFuZCBsYXRlcj8pIGhhdmUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2NvbXBhdGliaWxpdHkuaHRtbCM0OTU5NzgzIj5tb3ZlZAogICAgICAgIHRvIFhTTFRDPC9hPi4gIFNpbmNlIHRoaXMgdGFzayB1c2VzIFhhbGFuJ3MgcmVkaXJlY3QKICAgICAgICBleHRlbnNpb25zIGZvciBpdHMgaW50ZXJuYWwgc3R5bGVzaGVldCwgQW50IHByaW9yIHRvIDEuNi4yIGRpZG4ndCBzdXBwb3J0CiAgICAgICAgWFNMVEMuICBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdG8gaW5zdGFsbCA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8iPlhhbGFuLUogMjwvYT4gaW4gb3JkZXIKICAgICAgICB0byB1c2UgdGhpcyB0YXNrIHdpdGggSkRLIDEuNSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBBbnQuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5TdGFydGluZyB3aXRoIEFudCAxLjYuMiA8Y29kZT4mbHQ7anVuaXRyZXBvcnQmZ3Q7PC9jb2RlPgogICAgICAgIHN1cHBvcnRzIEpESyAxLjUuPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogIDwvZGl2PgoKICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CiAgICAgICAgICAgICAgLy8gIC0tPgogICAgICAgIDwvc2NyaXB0PgogICAgICA8L3A+CiAgICA8L2JvZHk+CiAgPC9odG1sPgoKCgoKCgoKCgoKCg==