LyogdGVybWluZm8uYyAtIHJlYWQgYSB0ZXJtaW5mbyBlbnRyeSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLyoKICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKICogIENvcHlyaWdodCAoQykgMjAwMiwyMDA0ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICoKICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIGRpZmZlcmVudCAKICogdGVybWluYWwgY2FwYWJpbGl0aWVzLiBJdCBrbm93cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgdnQ1MiBhbmQgdnQxMDAgCiAqIHRlcm1pbmFsIChhbmQgbXVjaCBtb3JlKSBhbmQgaXMgbWFpbmx5IHVzZWQgdGhlIHRlcm1pbmFsIGVtdWxhdGlvbgogKiBpbiB0aGUgc2VyaWFsIGRyaXZlci4KICovCgojaW5jbHVkZSA8c2hhcmVkLmg+CiNpbmNsdWRlICJ0ZXJtaW5mby5oIgojaW5jbHVkZSAidHBhcm0uaCIKI2luY2x1ZGUgInNlcmlhbC5oIgoKLyogQ3VycmVudCB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMuIERlZmF1bHQgaXMgInZ0MTAwIi4gICovCnN0cnVjdCB0ZXJtaW5mbyB0ZXJtID0KICB7CiAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJ2dDEwMCIsCiAgICAuY3Vyc29yX2FkZHJlc3MgICAgICA9ICJcZVslaSVwMSVkOyVwMiVkSCIsCiAgICAuY2xlYXJfc2NyZWVuICAgICAgICA9ICJcZVtIXGVbSiIsCiAgICAuZW50ZXJfc3RhbmRvdXRfbW9kZSA9ICJcZVs3bSIsCiAgICAuZXhpdF9zdGFuZG91dF9tb2RlICA9ICJcZVttIgogIH07CgovKiBBIG51bWJlciBvZiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBwcm92aWRlZCBpbiB0aGUgc3RyaW5nIHZhbHVlZAogICBjYXBhYmlsaXRpZXMgZm9yIGVhc3kgZW5jb2Rpbmcgb2YgY2hhcmFjdGVycyB0aGVyZS4gIEJvdGggXEUgYW5kIFxlCiAgIG1hcCB0byBhbiBFU0NBUEUgY2hhcmFjdGVyLCBeeCBtYXBzIHRvIGEgY29udHJvbC14IGZvciBhbnkKICAgYXBwcm9wcmlhdGUgeCwgYW5kIHRoZSBzZXF1ZW5jZXMgXG4gXGwgXHIgXHQgXGIgXGYgXHMgZ2l2ZSBhCiAgIG5ld2xpbmUsIGxpbmUtZmVlZCwgcmV0dXJuLCB0YWIsIGJhY2tzcGFjZSwgZm9ybS1mZWVkLCBhbmQgc3BhY2UuCiAgIE90aGVyIGVzY2FwZXMgaW5jbHVkZSBcXiBmb3IgXiwgXFwgZm9yIFwsIFwsIGZvciBjb21tYSwgXDogZm9yIDosCiAgIGFuZCBcMCBmb3IgbnVsbC4gIChcMCB3aWxsIHByb2R1Y2UgXDIwMCwgd2hpY2ggZG9lcyBub3QgdGVybWluYXRlIGEKICAgc3RyaW5nIGJ1dCBiZWhhdmVzIGFzIGEgbnVsbCBjaGFyYWN0ZXIgb24gbW9zdCB0ZXJtaW5hbHMsIHByb3ZpZK0KICAgaW5nIENTNyBpcyBzcGVjaWZpZWQuICBTZWUgc3R0eSgxKS4pICBGaW5hbGx5LCBjaGFyYWN0ZXJzIG1heSBiZQogICBnaXZlbiBhcyB0aHJlZSBvY3RhbCBkaWdpdHMgYWZ0ZXIgYSBcLiAgKi8KCmNoYXIgKgp0aV91bmVzY2FwZV9tZW1vcnkgKGNvbnN0IGNoYXIgKmluLCBjb25zdCBjaGFyICplbmQpIAp7CiAgc3RhdGljIGNoYXIgb3V0X2J1ZmZlclsyNTZdOwogIGNoYXIgYzsKICBjaGFyICpvdXQ7CgogIG91dCA9IG91dF9idWZmZXI7CiAgZG8KICAgIHsKICAgICAgYyA9ICooaW4rKyk7CiAgICAgIHN3aXRjaCAoYykgCgl7CgljYXNlICdeJzoKCSAgaWYgKCppbiA+PSAnQScgJiYgKmluIDw9ICdaJykKCSAgICB7CgkgICAgICAqb3V0ID0gKCppbikgLSAnQSc7CgkgICAgICBpbisrOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICpvdXQgPSAnXic7CgkgICAgfQoJICBicmVhazsKCWNhc2UgJ1xcJzoKCSAgYyA9ICooaW4rKyk7CgkgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKCSAgICB7CgkgICAgICAvLyBvY3RhbCBudW1iZXIKCSAgICAgIGludCBuID0gMDsKCSAgICAgIGRvCgkJewoJCSAgbiA9IChuIDw8IDQpIHwgKGMgLSAnMCcpOwoJCSAgYyA9ICooaW4rKyk7CgkJfQoJICAgICAgd2hpbGUgKGMgPj0gJzAnICYmIGMgPD0gJzknKTsKCSAgICAgIAoJICAgICAgKm91dCsrID0gKGNoYXIpKG4gJiAweGZmKTsKCSAgICAgIAoJICAgICAgLy8gcmVkbyBsYXN0IGNoYXJhY3RlcgoJICAgICAgaW4tLTsKCSAgICAgIAoJICAgICAgYnJlYWs7CgkgICAgfSAKCgkgIHN3aXRjaCAoYykgCgkgICAgewoJICAgIGNhc2UgJ2UnOgoJICAgIGNhc2UgJ0UnOgoJICAgICAgKm91dCsrID0gJ1xlJzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ24nOgoJICAgICAgKm91dCsrID0gJ1xuJzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ3InOgoJICAgICAgKm91dCsrID0gJ1xyJzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ3QnOgoJICAgICAgKm91dCsrID0gJ1x0JzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ2InOgoJICAgICAgKm91dCsrID0gJ1xiJzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ2YnOgoJICAgICAgKm91dCsrID0gJ1xmJzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ3MnOgoJICAgICAgKm91dCsrID0gJyAnOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnXFwnOgoJICAgICAgKm91dCsrID0gJ1xcJzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ14nOgoJICAgICAgKm91dCsrID0gJ14nOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnLCc6CgkgICAgICAqb3V0KysgPSAnLCc7CgkgICAgICBicmVhazsKCSAgICBjYXNlICc6JzoKCSAgICAgICpvdXQrKyA9ICc6JzsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJzAnOgoJICAgICAgKm91dCsrID0gJ1wyMDAnOwoJICAgICAgYnJlYWs7CgkgICAgfQoJICBicmVhazsKCWRlZmF1bHQ6CgkgICpvdXQrKyA9IGM7CgkgIGJyZWFrOwoJfQogICAgfQogIHdoaWxlIChpbiA8PSBlbmQpOwogIAogIHJldHVybiBvdXRfYnVmZmVyOwp9CgpjaGFyICoKdGlfdW5lc2NhcGVfc3RyaW5nIChjb25zdCBjaGFyICppbikgCnsKICByZXR1cm4gdGlfdW5lc2NhcGVfbWVtb3J5IChpbiwgaW4gKyBncnViX3N0cmxlbiAoaW4pKTsKfQoKLyogY29udmVydCBhIG1lbW9yeSByZWdpb24gY29udGFpbmluZyBiaW5hcnkgY2hhcmFjdGVyIGludG8gYW4gZXh0ZXJuYWwKICogYXNjaWkgcmVwcmVzZW50YXRpb24uIFRoZSBiaW5hcnkgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGFuCiAqICJlY3NhcGUgbm90YXRpb24iLiBFLmcuICIwMzMiIHdpbGwgYmVjb21lICJcZSIuICovCmNoYXIgKgp0aV9lc2NhcGVfbWVtb3J5IChjb25zdCBjaGFyICppbiwgY29uc3QgY2hhciAqZW5kKSAKewogIHN0YXRpYyBjaGFyIG91dF9idWZmZXJbMjU2XTsKICBjaGFyIGM7CiAgY2hhciAqb3V0OwoKICBvdXQgPSBvdXRfYnVmZmVyOwogIGRvCiAgICB7CiAgICAgIGMgPSAqKGluKyspOwogICAgICBzd2l0Y2ggKGMpCgl7CgljYXNlICdcZSc6CgkgICpvdXQrKyA9ICdcXCc7ICpvdXQrKyA9ICdlJzsgYnJlYWs7CgljYXNlICcgJzoKCSAgKm91dCsrID0gJ1xcJzsgKm91dCsrID0gJ3MnOyBicmVhazsKCWNhc2UgJ1xcJzoKCSAgKm91dCsrID0gJ1xcJzsgKm91dCsrID0gJ1xcJzsgYnJlYWs7CgljYXNlICcwJyAuLi4gJzknOgoJY2FzZSAnYScgLi4uICd6JzoKCWNhc2UgJ0EnIC4uLiAnWic6CgljYXNlICclJzoKCWNhc2UgJysnOgoJY2FzZSAnLSc6CgljYXNlICcqJzoKCWNhc2UgJy8nOgoJY2FzZSAnOyc6CgljYXNlICc6JzoKCWNhc2UgJ3snOgoJY2FzZSAnfSc6CgljYXNlICdbJzoKCWNhc2UgJ10nOgoJICAqb3V0KysgPSBjOyBicmVhazsKCWNhc2UgMCAuLi4gMjU6CgkgICpvdXQrKyA9ICdeJzsgKm91dCsrID0gJ0EnICsgYzsgYnJlYWs7CglkZWZhdWx0OgoJICAqb3V0KysgPSAnXFwnOyAKCSAgKm91dCsrID0gKChjID4+IDgpICYgNykgKyAnMCc7CgkgICpvdXQrKyA9ICgoYyA+PiA0KSAmIDcpICsgJzAnOwoJICAqb3V0KysgPSAoKGMgPj4gMCkgJiA3KSArICcwJzsKCSAgYnJlYWs7Cgl9CiAgICB9CiAgd2hpbGUgKGluIDwgZW5kKTsKICAKICAqb3V0KysgPSAwOwogIAogIHJldHVybiBvdXRfYnVmZmVyOwp9CgovKiBjb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgYmluYXJ5IGNoYXJhY3RlciBpbnRvIGFuIGV4dGVybmFsIGFzY2lpCiAqIHJlcHJlc2VudGF0aW9uLiAqLwpjaGFyICoKdGlfZXNjYXBlX3N0cmluZyAoY29uc3QgY2hhciAqaW4pIAp7CiAgcmV0dXJuIHRpX2VzY2FwZV9tZW1vcnkgKGluLCBpbiArIGdydWJfc3RybGVuIChpbikpOwp9CgovKiBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGdpdmVuIHBvc2l0aW9uIHN0YXJ0aW5nIHdpdGggIjAiLiAqLwp2b2lkCnRpX2N1cnNvcl9hZGRyZXNzIChpbnQgeCwgaW50IHkpCnsKICBncnViX3B1dHN0ciAoZ3J1Yl90cGFybSAodGVybS5jdXJzb3JfYWRkcmVzcywgeSwgeCkpOwp9CgovKiBjbGVhciB0aGUgc2NyZWVuLiAqLwp2b2lkIAp0aV9jbGVhcl9zY3JlZW4gKHZvaWQpCnsKICBncnViX3B1dHN0ciAoZ3J1Yl90cGFybSAodGVybS5jbGVhcl9zY3JlZW4pKTsKfQoKLyogZW50ZXIgcmV2ZXJzZSB2aWRlbyAqLwp2b2lkIAp0aV9lbnRlcl9zdGFuZG91dF9tb2RlICh2b2lkKQp7CiAgZ3J1Yl9wdXRzdHIgKGdydWJfdHBhcm0gKHRlcm0uZW50ZXJfc3RhbmRvdXRfbW9kZSkpOwp9CgovKiBleGl0IHJldmVyc2UgdmlkZW8gKi8Kdm9pZCAKdGlfZXhpdF9zdGFuZG91dF9tb2RlICh2b2lkKQp7CiAgZ3J1Yl9wdXRzdHIgKGdydWJfdHBhcm0gKHRlcm0uZXhpdF9zdGFuZG91dF9tb2RlKSk7Cn0KCi8qIHNldCB0aGUgY3VycmVudCB0ZXJtaW5hbCBlbXVsYXRpb24gdG8gdXNlICovCnZvaWQgCnRpX3NldF90ZXJtIChjb25zdCBzdHJ1Y3QgdGVybWluZm8gKm5ldykKewogIGdydWJfbWVtbW92ZSAoJnRlcm0sIG5ldywgc2l6ZW9mIChzdHJ1Y3QgdGVybWluZm8pKTsKfQoKLyogZ2V0IHRoZSBjdXJyZW50IHRlcm1pbmFsIGVtdWxhdGlvbiAqLwp2b2lkCnRpX2dldF90ZXJtKHN0cnVjdCB0ZXJtaW5mbyAqY29weSkKewogIGdydWJfbWVtbW92ZSAoY29weSwgJnRlcm0sIHNpemVvZiAoc3RydWN0IHRlcm1pbmZvKSk7Cn0K