PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjx0aXRsZT5ELiBDb2RlIGZvciBBZGQgQXR0cmlidXRlIEV4YW1wbGU8L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNTAuMCI+PGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InByZXZpb3VzIiBocmVmPSJhcGMuaHRtbCIgdGl0bGU9IkMuIENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGUiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iYXBlLmh0bWwiIHRpdGxlPSJFLiBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxlIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9Im5hdmhlYWRlciI+PHRhYmxlIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGhlYWRlciI+PHRyPjx0aCBjb2xzcGFuPSIzIiBhbGlnbj0iY2VudGVyIj5ELiBDb2RlIGZvciBBZGQgQXR0cmlidXRlIEV4YW1wbGU8L3RoPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0ibGVmdCI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJhcGMuaHRtbCI+UHJldjwvYT6gPC90ZD48dGggd2lkdGg9IjYwJSIgYWxpZ249ImNlbnRlciI+oDwvdGg+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBlLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9ImFwcGVuZGl4Ij48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9ImFkZGF0dHJpYnV0ZWFwcGVuZGl4Ij48L2E+RC4gQ29kZSBmb3IgQWRkIEF0dHJpYnV0ZSBFeGFtcGxlPC9oMj48cD4KICAgICAgPHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgojaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwveG1sbWVtb3J5LmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwvcGFyc2VyLmgmZ3Q7CgoKeG1sRG9jUHRyCnBhcnNlRG9jKGNoYXIgKmRvY25hbWUsIGNoYXIgKnVyaSkgewoKCXhtbERvY1B0ciBkb2M7Cgl4bWxOb2RlUHRyIGN1cjsKCXhtbE5vZGVQdHIgbmV3bm9kZTsKCXhtbEF0dHJQdHIgbmV3YXR0cjsKCglkb2MgPSB4bWxQYXJzZUZpbGUoZG9jbmFtZSk7CgkKCWlmIChkb2MgPT0gTlVMTCApIHsKCQlmcHJpbnRmKHN0ZGVyciwmcXVvdDtEb2N1bWVudCBub3QgcGFyc2VkIHN1Y2Nlc3NmdWxseS4gXG4mcXVvdDspOwoJCXJldHVybiAoTlVMTCk7Cgl9CgkKCWN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CgkKCWlmIChjdXIgPT0gTlVMTCkgewoJCWZwcmludGYoc3RkZXJyLCZxdW90O2VtcHR5IGRvY3VtZW50XG4mcXVvdDspOwoJCXhtbEZyZWVEb2MoZG9jKTsKCQlyZXR1cm4gKE5VTEwpOwoJfQoJCglpZiAoeG1sU3RyY21wKGN1ci0mZ3Q7bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgJnF1b3Q7c3RvcnkmcXVvdDspKSB7CgkJZnByaW50ZihzdGRlcnIsJnF1b3Q7ZG9jdW1lbnQgb2YgdGhlIHdyb25nIHR5cGUsIHJvb3Qgbm9kZSAhPSBzdG9yeSZxdW90Oyk7CgkJeG1sRnJlZURvYyhkb2MpOwoJCXJldHVybiAoTlVMTCk7Cgl9CgkKCW5ld25vZGUgPSB4bWxOZXdUZXh0Q2hpbGQgKGN1ciwgTlVMTCwgJnF1b3Q7cmVmZXJlbmNlJnF1b3Q7LCBOVUxMKTsKCW5ld2F0dHIgPSB4bWxOZXdQcm9wIChuZXdub2RlLCAmcXVvdDt1cmkmcXVvdDssIHVyaSk7CglyZXR1cm4oZG9jKTsKfQoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CgoJY2hhciAqZG9jbmFtZTsKCWNoYXIgKnVyaTsKCXhtbERvY1B0ciBkb2M7CgoJaWYgKGFyZ2MgJmx0Oz0gMikgewoJCXByaW50ZigmcXVvdDtVc2FnZTogJXMgZG9jbmFtZSwgdXJpXG4mcXVvdDssIGFyZ3ZbMF0pOwoJCXJldHVybigwKTsKCX0KCglkb2NuYW1lID0gYXJndlsxXTsKCXVyaSA9IGFyZ3ZbMl07Cglkb2MgPSBwYXJzZURvYyAoZG9jbmFtZSwgdXJpKTsKCWlmIChkb2MgIT0gTlVMTCkgewoJCXhtbFNhdmVGb3JtYXRGaWxlIChkb2NuYW1lLCBkb2MsIDEpOwoJCXhtbEZyZWVEb2MoZG9jKTsKCX0KCXJldHVybiAoMSk7Cn0KCjwvcHJlPgogICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5hdmZvb3RlciI+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXBjLmh0bWwiPlByZXY8L2E+oDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iaW5kZXguaHRtbCI+VXA8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJhcGUuaHRtbCI+TmV4dDwvYT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPkMuIENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGWgPC90ZD48dGQgd2lkdGg9IjIwJSIgYWxpZ249ImNlbnRlciI+PGEgYWNjZXNza2V5PSJoIiBocmVmPSJpbmRleC5odG1sIj5Ib21lPC9hPjwvdGQ+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiPqBFLiBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxlPC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4K