LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2xhbmcuYyx2IDEuNiAyMDAyLzA4LzIyIDE4OjUzOjIyIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSAiZmNpbnQuaCIKCnR5cGVkZWYgc3RydWN0IHsKICAgIEZjQ2hhcjgJKmxhbmc7CiAgICBGY0NoYXJTZXQJY2hhcnNldDsKfSBGY0xhbmdDaGFyU2V0OwoKI2luY2x1ZGUgIi4uL2ZjLWxhbmcvZmNsYW5nLmgiCgojZGVmaW5lIE5VTV9MQU5HX0NIQVJfU0VUICAgKHNpemVvZiAoZmNMYW5nQ2hhclNldHMpIC8gc2l6ZW9mIChmY0xhbmdDaGFyU2V0c1swXSkpCiNkZWZpbmUgTlVNX0xBTkdfU0VUX01BUCAgICAoKE5VTV9MQU5HX0NIQVJfU0VUICsgMzEpIC8gMzIpCgpzdHJ1Y3QgX0ZjTGFuZ1NldCB7CiAgICBGY0NoYXIzMgltYXBbTlVNX0xBTkdfU0VUX01BUF07CiAgICBGY1N0clNldAkqZXh0cmE7Cn07CgojZGVmaW5lIEZjTGFuZ1NldEJpdFNldChscywgaWQpCSgobHMpLT5tYXBbKGlkKT4+NV0gfD0gKChGY0NoYXIzMikgMSA8PCAoKGlkKSAmIDB4MWYpKSkKI2RlZmluZSBGY0xhbmdTZXRCaXRHZXQobHMsIGlkKSAoKChscyktPm1hcFsoaWQpPj41XSA+PiAoKGlkKSAmIDB4MWYpKSAmIDEpCgpGY0xhbmdTZXQgKgpGY0ZyZWVUeXBlTGFuZ1NldCAoY29uc3QgRmNDaGFyU2V0ICAqY2hhcnNldCwgCgkJICAgY29uc3QgRmNDaGFyOCAgICAqZXhjbHVzaXZlTGFuZykKewogICAgaW50CQkgICAgaTsKICAgIEZjQ2hhcjMyCSAgICBtaXNzaW5nOwogICAgY29uc3QgRmNDaGFyU2V0ICpleGNsdXNpdmVDaGFyc2V0ID0gMDsKICAgIEZjTGFuZ1NldAkgICAgKmxzOwogICAgCgogICAgaWYgKGV4Y2x1c2l2ZUxhbmcpCglleGNsdXNpdmVDaGFyc2V0ID0gRmNDaGFyU2V0Rm9yTGFuZyAoZXhjbHVzaXZlTGFuZyk7CiAgICBscyA9IEZjTGFuZ1NldENyZWF0ZSAoKTsKICAgIGlmICghbHMpCglyZXR1cm4gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTEFOR19DSEFSX1NFVDsgaSsrKQogICAgewoJLyoKCSAqIENoZWNrIGZvciBIYW4gY2hhcnNldHMgdG8gbWFrZSBmb250cwoJICogd2hpY2ggYWR2ZXJ0aXNlIHN1cHBvcnQgZm9yIGEgc2luZ2xlIGxhbmd1YWdlCgkgKiBub3Qgc3VwcG9ydCBvdGhlciBIYW4gbGFuZ3VhZ2VzCgkgKi8KCWlmIChleGNsdXNpdmVDaGFyc2V0ICYmCgkgICAgRmNGcmVlVHlwZUlzRXhjbHVzaXZlTGFuZyAoZmNMYW5nQ2hhclNldHNbaV0ubGFuZykgJiYKCSAgICBmY0xhbmdDaGFyU2V0c1tpXS5jaGFyc2V0LmxlYXZlcyAhPSBleGNsdXNpdmVDaGFyc2V0LT5sZWF2ZXMpCgl7CgkgICAgY29udGludWU7Cgl9CgltaXNzaW5nID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoJmZjTGFuZ0NoYXJTZXRzW2ldLmNoYXJzZXQsIGNoYXJzZXQpOwogICAgICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfU0NBTlYpCgl7CgkgICAgaWYgKG1pc3NpbmcgJiYgbWlzc2luZyA8IDEwKQoJICAgIHsKCQlGY0NoYXJTZXQgICAqbWlzc2VkID0gRmNDaGFyU2V0U3VidHJhY3QgKCZmY0xhbmdDaGFyU2V0c1tpXS5jaGFyc2V0LCAKCQkJCQkJCSBjaGFyc2V0KTsKCQlGY0NoYXIzMiAgICB1Y3M0OwoJCUZjQ2hhcjMyICAgIG1hcFtGQ19DSEFSU0VUX01BUF9TSVpFXTsKCQlGY0NoYXIzMiAgICBuZXh0OwoKCQlwcmludGYgKCJcbiVzKCVkKSAiLCBmY0xhbmdDaGFyU2V0c1tpXS5sYW5nLCBtaXNzaW5nKTsKCQlwcmludGYgKCJ7Iik7CgkJZm9yICh1Y3M0ID0gRmNDaGFyU2V0Rmlyc3RQYWdlIChtaXNzZWQsIG1hcCwgJm5leHQpOwoJCSAgICAgdWNzNCAhPSBGQ19DSEFSU0VUX0RPTkU7CgkJICAgICB1Y3M0ID0gRmNDaGFyU2V0TmV4dFBhZ2UgKG1pc3NlZCwgbWFwLCAmbmV4dCkpCgkJewoJCSAgICBpbnQJICAgIGksIGo7CgkJICAgIGZvciAoaSA9IDA7IGkgPCBGQ19DSEFSU0VUX01BUF9TSVpFOyBpKyspCgkJCWlmIChtYXBbaV0pCgkJCXsKCQkJICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKQoJCQkJaWYgKG1hcFtpXSAmICgxIDw8IGopKQoJCQkJICAgIHByaW50ZiAoIiAlMDR4IiwgdWNzNCArIGkgKiAzMiArIGopOwoJCQl9CgkJfQoJCXByaW50ZiAoIiB9XG5cdCIpOwoJCUZjQ2hhclNldERlc3Ryb3kgKG1pc3NlZCk7CgkgICAgfQoJICAgIGVsc2UKCQlwcmludGYgKCIlcyglZCkgIiwgZmNMYW5nQ2hhclNldHNbaV0ubGFuZywgbWlzc2luZyk7Cgl9CglpZiAoIW1pc3NpbmcpCgkgICAgRmNMYW5nU2V0Qml0U2V0IChscywgaSk7CiAgICB9CgogICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19TQ0FOVikKCXByaW50ZiAoIlxuIik7CiAgICAKICAgIAogICAgcmV0dXJuIGxzOwp9CgojZGVmaW5lIEZjTGFuZ0VuZChjKQkoKGMpID09ICctJyB8fCAoYykgPT0gJ1wwJykKCkZjTGFuZ1Jlc3VsdApGY0xhbmdDb21wYXJlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpCnsKICAgIEZjQ2hhcjgJICAgIGMxLCBjMjsKICAgIEZjTGFuZ1Jlc3VsdCAgICByZXN1bHQgPSBGY0xhbmdEaWZmZXJlbnRMYW5nOwoKICAgIGZvciAoOzspCiAgICB7CgljMSA9ICpzMSsrOwoJYzIgPSAqczIrKzsKCQoJYzEgPSBGY1RvTG93ZXIgKGMxKTsKCWMyID0gRmNUb0xvd2VyIChjMik7CglpZiAoYzEgIT0gYzIpCgl7CgkgICAgaWYgKEZjTGFuZ0VuZCAoYzEpICYmIEZjTGFuZ0VuZCAoYzIpKQoJCXJlc3VsdCA9IEZjTGFuZ0RpZmZlcmVudENvdW50cnk7CgkgICAgcmV0dXJuIHJlc3VsdDsKCX0KCWVsc2UgaWYgKCFjMSkKCSAgICByZXR1cm4gRmNMYW5nRXF1YWw7CgllbHNlIGlmIChjMSA9PSAnLScpCgkgICAgcmVzdWx0ID0gRmNMYW5nRGlmZmVyZW50Q291bnRyeTsKICAgIH0KfQoKY29uc3QgRmNDaGFyU2V0ICoKRmNDaGFyU2V0Rm9yTGFuZyAoY29uc3QgRmNDaGFyOCAqbGFuZykKewogICAgaW50CQlpOwogICAgaW50CQljb3VudHJ5ID0gLTE7CiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xBTkdfQ0hBUl9TRVQ7IGkrKykKICAgIHsKCXN3aXRjaCAoRmNMYW5nQ29tcGFyZSAobGFuZywgZmNMYW5nQ2hhclNldHNbaV0ubGFuZykpIHsKCWNhc2UgRmNMYW5nRXF1YWw6CgkgICAgcmV0dXJuICZmY0xhbmdDaGFyU2V0c1tpXS5jaGFyc2V0OwoJY2FzZSBGY0xhbmdEaWZmZXJlbnRDb3VudHJ5OgoJICAgIGlmIChjb3VudHJ5ID09IC0xKQoJCWNvdW50cnkgPSBpOwoJZGVmYXVsdDoKCSAgICBicmVhazsKCX0KICAgIH0KICAgIGlmIChjb3VudHJ5ID09IC0xKQoJcmV0dXJuIDA7CiAgICByZXR1cm4gJmZjTGFuZ0NoYXJTZXRzW2ldLmNoYXJzZXQ7Cn0KCkZjTGFuZ1NldCAqCkZjTGFuZ1NldENyZWF0ZSAodm9pZCkKewogICAgRmNMYW5nU2V0CSpsczsKCiAgICBscyA9IG1hbGxvYyAoc2l6ZW9mIChGY0xhbmdTZXQpKTsKICAgIGlmICghbHMpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9MQU5HU0VULCBzaXplb2YgKEZjTGFuZ1NldCkpOwogICAgbWVtc2V0IChscy0+bWFwLCAnXDAnLCBzaXplb2YgKGxzLT5tYXApKTsKICAgIGxzLT5leHRyYSA9IDA7CiAgICByZXR1cm4gbHM7Cn0KCnZvaWQKRmNMYW5nU2V0RGVzdHJveSAoRmNMYW5nU2V0ICpscykKewogICAgaWYgKGxzLT5leHRyYSkKCUZjU3RyU2V0RGVzdHJveSAobHMtPmV4dHJhKTsKICAgIEZjTWVtRnJlZSAoRkNfTUVNX0xBTkdTRVQsIHNpemVvZiAoRmNMYW5nU2V0KSk7CiAgICBmcmVlIChscyk7Cn0KCkZjTGFuZ1NldCAqCkZjTGFuZ1NldENvcHkgKGNvbnN0IEZjTGFuZ1NldCAqbHMpCnsKICAgIEZjTGFuZ1NldAkqbmV3OwoKICAgIG5ldyA9IEZjTGFuZ1NldENyZWF0ZSAoKTsKICAgIGlmICghbmV3KQoJZ290byBiYWlsMDsKICAgIG1lbWNweSAobmV3LT5tYXAsIGxzLT5tYXAsIHNpemVvZiAobmV3LT5tYXApKTsKICAgIGlmIChscy0+ZXh0cmEpCiAgICB7CglGY1N0ckxpc3QJKmxpc3Q7CglGY0NoYXI4CQkqZXh0cmE7CgkKCW5ldy0+ZXh0cmEgPSBGY1N0clNldENyZWF0ZSAoKTsKCWlmICghbmV3LT5leHRyYSkKCSAgICBnb3RvIGJhaWwxOwoKCWxpc3QgPSBGY1N0ckxpc3RDcmVhdGUgKGxzLT5leHRyYSk7CQoJaWYgKCFsaXN0KQoJICAgIGdvdG8gYmFpbDE7CgkKCXdoaWxlICgoZXh0cmEgPSBGY1N0ckxpc3ROZXh0IChsaXN0KSkpCgkgICAgaWYgKCFGY1N0clNldEFkZCAobmV3LT5leHRyYSwgZXh0cmEpKQoJICAgIHsKCQlGY1N0ckxpc3REb25lIChsaXN0KTsKCQlnb3RvIGJhaWwxOwoJICAgIH0KCUZjU3RyTGlzdERvbmUgKGxpc3QpOwogICAgfQogICAgcmV0dXJuIG5ldzsKYmFpbDE6CiAgICBGY0xhbmdTZXREZXN0cm95IChuZXcpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CkZjTGFuZ1NldEluZGV4IChjb25zdCBGY0NoYXI4ICpsYW5nKQp7CiAgICBpbnQJICAgIGxvdywgaGlnaCwgbWlkOwogICAgaW50CSAgICBjbXA7CgogICAgbG93ID0gMDsKICAgIGhpZ2ggPSBOVU1fTEFOR19DSEFSX1NFVCAtIDE7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpCiAgICB7CgltaWQgPSAoaGlnaCArIGxvdykgPj4gMTsKCWNtcCA9IEZjU3RyQ21wSWdub3JlQ2FzZSAoZmNMYW5nQ2hhclNldHNbbWlkXS5sYW5nLCBsYW5nKTsKCWlmIChjbXAgPT0gMCkgCgkgICAgcmV0dXJuIG1pZDsKCWlmIChjbXAgPCAwKQoJICAgIGxvdyA9IG1pZCArIDE7CgllbHNlCgkgICAgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgICBpZiAoY21wIDwgMCkKCW1pZCsrOwogICAgcmV0dXJuIC0obWlkICsgMSk7Cn0KCkZjQm9vbApGY0xhbmdTZXRBZGQgKEZjTGFuZ1NldCAqbHMsIGNvbnN0IEZjQ2hhcjggKmxhbmcpCnsKICAgIGludAkgICAgaWQ7CgogICAgaWQgPSBGY0xhbmdTZXRJbmRleCAobGFuZyk7CiAgICBpZiAoaWQgPj0gMCkKICAgIHsKCUZjTGFuZ1NldEJpdFNldCAobHMsIGlkKTsKCXJldHVybiBGY1RydWU7CiAgICB9CiAgICBpZiAoIWxzLT5leHRyYSkKICAgIHsKCWxzLT5leHRyYSA9IEZjU3RyU2V0Q3JlYXRlICgpOwoJaWYgKCFscy0+ZXh0cmEpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNTdHJTZXRBZGQgKGxzLT5leHRyYSwgbGFuZyk7Cn0KCkZjTGFuZ1Jlc3VsdApGY0xhbmdTZXRIYXNMYW5nIChjb25zdCBGY0xhbmdTZXQgKmxzLCBjb25zdCBGY0NoYXI4ICpsYW5nKQp7CiAgICBpbnQJCSAgICBpZDsKICAgIEZjTGFuZ1Jlc3VsdCAgICBiZXN0LCByOwogICAgaW50CQkgICAgaTsKCiAgICBpZCA9IEZjTGFuZ1NldEluZGV4IChsYW5nKTsKICAgIGlmIChpZCA8IDApCglpZCA9IC1pZCAtIDE7CiAgICBlbHNlIGlmIChGY0xhbmdTZXRCaXRHZXQgKGxzLCBpZCkpCglyZXR1cm4gRmNMYW5nRXF1YWw7CiAgICBiZXN0ID0gRmNMYW5nRGlmZmVyZW50TGFuZzsKICAgIGZvciAoaSA9IGlkIC0gMTsgaSA+PSAwOyBpLS0pCiAgICB7CglyID0gRmNMYW5nQ29tcGFyZSAobGFuZywgZmNMYW5nQ2hhclNldHNbaV0ubGFuZyk7CglpZiAociA9PSBGY0xhbmdEaWZmZXJlbnRMYW5nKQoJICAgIGJyZWFrOwoJaWYgKEZjTGFuZ1NldEJpdEdldCAobHMsIGkpICYmIHIgPCBiZXN0KQoJICAgIGJlc3QgPSByOwogICAgfQogICAgZm9yIChpID0gaWQ7IGkgPCBOVU1fTEFOR19DSEFSX1NFVDsgaSsrKQogICAgewoJciA9IEZjTGFuZ0NvbXBhcmUgKGxhbmcsIGZjTGFuZ0NoYXJTZXRzW2ldLmxhbmcpOwoJaWYgKHIgPT0gRmNMYW5nRGlmZmVyZW50TGFuZykKCSAgICBicmVhazsKCWlmIChGY0xhbmdTZXRCaXRHZXQgKGxzLCBpKSAmJiByIDwgYmVzdCkKCSAgICBiZXN0ID0gcjsKICAgIH0KICAgIGlmIChscy0+ZXh0cmEpCiAgICB7CglGY1N0ckxpc3QJKmxpc3QgPSBGY1N0ckxpc3RDcmVhdGUgKGxzLT5leHRyYSk7CglGY0NoYXI4CQkqZXh0cmE7CglGY0xhbmdSZXN1bHQJcjsKCQoJaWYgKGxpc3QpCgl7CgkgICAgd2hpbGUgKGJlc3QgPiBGY0xhbmdFcXVhbCAmJiAoZXh0cmEgPSBGY1N0ckxpc3ROZXh0IChsaXN0KSkpCgkgICAgewoJCXIgPSBGY0xhbmdDb21wYXJlIChsYW5nLCBleHRyYSk7CgkJaWYgKHIgPCBiZXN0KQoJCSAgICBiZXN0ID0gcjsKCSAgICB9CgkgICAgRmNTdHJMaXN0RG9uZSAobGlzdCk7Cgl9CiAgICB9CiAgICByZXR1cm4gYmVzdDsKfQoKc3RhdGljIEZjTGFuZ1Jlc3VsdApGY0xhbmdTZXRDb21wYXJlU3RyU2V0IChjb25zdCBGY0xhbmdTZXQgKmxzLCBGY1N0clNldCAqc2V0KQp7CiAgICBGY1N0ckxpc3QJICAgICpsaXN0ID0gRmNTdHJMaXN0Q3JlYXRlIChzZXQpOwogICAgRmNMYW5nUmVzdWx0ICAgIHIsIGJlc3QgPSBGY0xhbmdEaWZmZXJlbnRMYW5nOwogICAgRmNDaGFyOAkgICAgKmV4dHJhOwoKICAgIGlmIChsaXN0KQogICAgewoJd2hpbGUgKGJlc3QgPiBGY0xhbmdFcXVhbCAmJiAoZXh0cmEgPSBGY1N0ckxpc3ROZXh0IChsaXN0KSkpCgl7CgkgICAgciA9IEZjTGFuZ1NldEhhc0xhbmcgKGxzLCBleHRyYSk7CgkgICAgaWYgKHIgPCBiZXN0KQoJCWJlc3QgPSByOwoJfQoJRmNTdHJMaXN0RG9uZSAobGlzdCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKfQoKRmNMYW5nUmVzdWx0CkZjTGFuZ1NldENvbXBhcmUgKGNvbnN0IEZjTGFuZ1NldCAqbHNhLCBjb25zdCBGY0xhbmdTZXQgKmxzYikKewogICAgaW50CQkgICAgaTsKICAgIEZjTGFuZ1Jlc3VsdCAgICBiZXN0LCByOwoKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTEFOR19TRVRfTUFQOyBpKyspCglpZiAobHNhLT5tYXBbaV0gJiBsc2ItPm1hcFtpXSkKCSAgICByZXR1cm4gRmNMYW5nRXF1YWw7CiAgICBiZXN0ID0gRmNMYW5nRGlmZmVyZW50TGFuZzsKICAgIGlmIChsc2EtPmV4dHJhKQogICAgewoJciA9IEZjTGFuZ1NldENvbXBhcmVTdHJTZXQgKGxzYiwgbHNhLT5leHRyYSk7CglpZiAociA8IGJlc3QpCgkgICAgYmVzdCA9IHI7CiAgICB9CiAgICBpZiAoYmVzdCA+IEZjTGFuZ0VxdWFsICYmIGxzYi0+ZXh0cmEpCiAgICB7CglyID0gRmNMYW5nU2V0Q29tcGFyZVN0clNldCAobHNhLCBsc2ItPmV4dHJhKTsKCWlmIChyIDwgYmVzdCkKCSAgICBiZXN0ID0gcjsKICAgIH0KICAgIHJldHVybiBiZXN0Owp9CgovKgogKiBVc2VkIGluIGNvbXB1dGluZyB2YWx1ZXMgLS0gbXVzdG4ndCBhbGxvY2F0ZSBhbnkgc3RvcmFnZQogKi8KRmNMYW5nU2V0ICoKRmNMYW5nU2V0UHJvbW90ZSAoY29uc3QgRmNDaGFyOCAqbGFuZykKewogICAgc3RhdGljIEZjTGFuZ1NldAlsczsKICAgIHN0YXRpYyBGY1N0clNldAlzdHJzOwogICAgc3RhdGljIEZjQ2hhcjgJKnN0cjsKICAgIGludAkJCWlkOwoKICAgIG1lbXNldCAobHMubWFwLCAnXDAnLCBzaXplb2YgKGxzLm1hcCkpOwogICAgbHMuZXh0cmEgPSAwOwogICAgaWQgPSBGY0xhbmdTZXRJbmRleCAobGFuZyk7CiAgICBpZiAoaWQgPiAwKQogICAgewoJRmNMYW5nU2V0Qml0U2V0ICgmbHMsIGlkKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWxzLmV4dHJhID0gJnN0cnM7CglzdHJzLm51bSA9IDE7CglzdHJzLnNpemUgPSAxOwoJc3Rycy5zdHJzID0gJnN0cjsKCXN0cnMucmVmID0gMTsKCXN0ciA9IChGY0NoYXI4ICopIGxhbmc7CiAgICB9CiAgICByZXR1cm4gJmxzOwp9CgpGY0NoYXIzMgpGY0xhbmdTZXRIYXNoIChjb25zdCBGY0xhbmdTZXQgKmxzKQp7CiAgICBGY0NoYXIzMgloID0gMDsKICAgIGludAkJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xBTkdfU0VUX01BUDsgaSsrKQoJaCBePSBscy0+bWFwW2ldOwogICAgaWYgKGxzLT5leHRyYSkKCWggXj0gbHMtPmV4dHJhLT5udW07CiAgICByZXR1cm4gaDsKfQoKRmNMYW5nU2V0ICoKRmNOYW1lUGFyc2VMYW5nU2V0IChjb25zdCBGY0NoYXI4ICpzdHJpbmcpCnsKICAgIEZjQ2hhcjgJICAgIGxhbmdbMzJdOwogICAgY29uc3QgRmNDaGFyOCAgICplbmQsICpuZXh0OwogICAgRmNMYW5nU2V0CSAgICAqbHM7CgogICAgbHMgPSBGY0xhbmdTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWxzKQoJZ290byBiYWlsMDsKCiAgICB3aGlsZSAoc3RyaW5nICYmICpzdHJpbmcpIAogICAgewoJZW5kID0gKEZjQ2hhcjggKikgc3RyY2hyICgoY2hhciAqKSBzdHJpbmcsICd8Jyk7CglpZiAoIWVuZCkKCXsKCSAgICBlbmQgPSBzdHJpbmcgKyBzdHJsZW4gKChjaGFyICopIHN0cmluZyk7CgkgICAgbmV4dCA9IGVuZDsKCX0KCWVsc2UKCSAgICBuZXh0ID0gZW5kICsgMTsKCWlmIChlbmQgLSBzdHJpbmcgPCBzaXplb2YgKGxhbmcpIC0gMSkKCXsKCSAgICBzdHJuY3B5ICgoY2hhciAqKSBsYW5nLCAoY2hhciAqKSBzdHJpbmcsIGVuZCAtIHN0cmluZyk7CgkgICAgbGFuZ1tlbmQtc3RyaW5nXSA9ICdcMCc7CgkgICAgaWYgKCFGY0xhbmdTZXRBZGQgKGxzLCBsYW5nKSkKCQlnb3RvIGJhaWwxOwoJfQoJc3RyaW5nID0gbmV4dDsKICAgIH0KICAgIHJldHVybiBsczsKYmFpbDE6CiAgICBGY0xhbmdTZXREZXN0cm95IChscyk7CmJhaWwwOgogICAgcmV0dXJuIDA7Cn0KCkZjQm9vbApGY05hbWVVbnBhcnNlTGFuZ1NldCAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNMYW5nU2V0ICpscykKewogICAgaW50CQlpLCBiaXQ7CiAgICBGY0NoYXIzMgliaXRzOwogICAgRmNCb29sCWZpcnN0ID0gRmNUcnVlOwoKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTEFOR19TRVRfTUFQOyBpKyspCiAgICB7CglpZiAoKGJpdHMgPSBscy0+bWFwW2ldKSkKCXsKCSAgICBmb3IgKGJpdCA9IDA7IGJpdCA8PSAzMTsgYml0KyspCgkJaWYgKGJpdHMgJiAoMSA8PCBiaXQpKQoJCXsKCQkgICAgaW50IGlkID0gKGkgPDwgNSkgfCBiaXQ7CgkJICAgIGlmICghZmlyc3QpCgkJCWlmICghRmNTdHJCdWZDaGFyIChidWYsICd8JykpCgkJCSAgICByZXR1cm4gRmNGYWxzZTsKCQkgICAgaWYgKCFGY1N0ckJ1ZlN0cmluZyAoYnVmLCBmY0xhbmdDaGFyU2V0c1tpZF0ubGFuZykpCgkJCXJldHVybiBGY0ZhbHNlOwoJCSAgICBmaXJzdCA9IEZjRmFsc2U7CgkJfQoJfQogICAgfQogICAgaWYgKGxzLT5leHRyYSkKICAgIHsKCUZjU3RyTGlzdCAgICpsaXN0ID0gRmNTdHJMaXN0Q3JlYXRlIChscy0+ZXh0cmEpOwoJRmNDaGFyOAkgICAgKmV4dHJhOwoKCWlmICghbGlzdCkKCSAgICByZXR1cm4gRmNGYWxzZTsKCXdoaWxlICgoZXh0cmEgPSBGY1N0ckxpc3ROZXh0IChsaXN0KSkpCgl7CgkgICAgaWYgKCFmaXJzdCkKCQlpZiAoIUZjU3RyQnVmQ2hhciAoYnVmLCAnfCcpKQoJCSAgICByZXR1cm4gRmNGYWxzZTsKCSAgICBpZiAoIUZjU3RyQnVmU3RyaW5nIChidWYsIGV4dHJhKSk7CgkJcmV0dXJuIEZjRmFsc2U7CgkgICAgZmlyc3QgPSBGY0ZhbHNlOwoJfQogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjTGFuZ1NldEVxdWFsIChjb25zdCBGY0xhbmdTZXQgKmxzYSwgY29uc3QgRmNMYW5nU2V0ICpsc2IpCnsKICAgIGludAkgICAgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xBTkdfU0VUX01BUDsgaSsrKQogICAgewoJaWYgKGxzYS0+bWFwW2ldICE9IGxzYi0+bWFwW2ldKQoJICAgIHJldHVybiBGY0ZhbHNlOwogICAgfQogICAgaWYgKCFsc2EtPmV4dHJhICYmICFsc2ItPmV4dHJhKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmIChsc2EtPmV4dHJhICYmIGxzYi0+ZXh0cmEpCglyZXR1cm4gRmNTdHJTZXRFcXVhbCAobHNhLT5leHRyYSwgbHNiLT5leHRyYSk7CiAgICByZXR1cm4gRmNGYWxzZTsKfQo=