LyoKICoJZG9jcHJvYyBpcyBhIHNpbXBsZSBwcmVwcm9jZXNzb3IgZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlcwogKiAgICAgIHVzZWQgYXMgcGxhY2Vob2xkZXJzIGZvciB0aGUga2VybmVsIGludGVybmFsIGRvY3VtZW50YXRpb24uCiAqCWRvY3Byb2MgaXMgdXNlZCBmb3IgZG9jdW1lbnRhdGlvbi1mcm9udGVuZCBhbmQKICogICAgICBkZXBlbmRlbmN5LWdlbmVyYXRvci4KICoJVGhlIHR3byB1c2FnZXMgaGF2ZSBpbiBjb21tb24gdGhhdCB0aGV5IHJlcXVpcmUKICoJc29tZSBrbm93bGVkZ2Ugb2YgdGhlIC50bXBsIHN5bnRheCwgdGhlcmVmb3JlIHRoZXkKICoJYXJlIGtlcHQgdG9nZXRoZXIuCiAqCiAqCWRvY3VtZW50YXRpb24tZnJvbnRlbmQKICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBjYWxsIGtlcm5lbC1kb2MgZm9yCiAqCQlhbGwgb2NjdXJyZW5jZXMgb2YgIVtFSUZdZmlsZQogKgkJQmVmb3JlaGFuZCBlYWNoIHJlZmVyZW5jZWQgZmlsZSBhcmUgc2Nhbm5lZCBmb3IKICoJCWFueSBleHBvcnRlZCBzeW1wb2xzICJFWFBPUlRfU1lNQk9MKCkiIHN0YXRlbWVudHMuCiAqCQlUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIHByb3BlciAtZnVuY3Rpb24gYW5kCiAqCQktbm9mdW5jdGlvbiBhcmd1bWVudHMgaW4gY2FsbHMgdG8ga2VybmVsLWRvYy4KICoJCVVzYWdlOiBkb2Nwcm9jIGRvYyBmaWxlLnRtcGwKICoKICoJZGVwZW5kZW5jeS1nZW5lcmF0b3I6CiAqCQlTY2FucyB0aGUgdGVtcGxhdGUgZmlsZSBhbmQgbGlzdCBhbGwgZmlsZXMKICoJCXJlZmVyZW5jZWQgaW4gYSBmb3JtYXQgcmVjb2duaXplZCBieSBtYWtlLgogKgkJVXNhZ2U6CWRvY3Byb2MgZGVwZW5kIGZpbGUudG1wbAogKgkJV3JpdGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CiAqCQlpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKICoJCWZpbGUudG1wbCBzcmMuYwlzcmMyLmMKICoJCVRoZSBmaWxlbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzOgogKgkJIUVmaWxlbmFtZQogKgkJIUlmaWxlbmFtZQogKgkJIURmaWxlbmFtZQogKgkJIUZmaWxlbmFtZQogKgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgoKLyogZXhpdHN0YXR1cyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYW55IGZhaWxpbmcgY2FsbHMgdG8ga2VybmVsLWRvYywKICogYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMuICovCmludCBleGl0c3RhdHVzID0gMDsKCnR5cGVkZWYgdm9pZCBERkwoY2hhciAqKTsKREZMICpkZWZhdWx0bGluZTsKCnR5cGVkZWYgdm9pZCBGSUxFT05MWShjaGFyICogZmlsZSk7CkZJTEVPTkxZICppbnRlcm5hbGZ1bmN0aW9uczsKRklMRU9OTFkgKmV4dGVybmFsZnVuY3Rpb25zOwpGSUxFT05MWSAqc3ltYm9sc29ubHk7Cgp0eXBlZGVmIHZvaWQgRklMRUxJTkUoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKTsKRklMRUxJTkUgKiBzaW5nbGVmdW5jdGlvbnM7CkZJTEVMSU5FICogZW50aXR5X3N5c3RlbTsKCiNkZWZpbmUgTUFYTElORVNaICAgICAyMDQ4CiNkZWZpbmUgTUFYRklMRVMgICAgICAyNTAKI2RlZmluZSBLRVJORUxET0NQQVRIICJzY3JpcHRzLyIKI2RlZmluZSBLRVJORUxET0MgICAgICJrZXJuZWwtZG9jIgojZGVmaW5lIERPQ0JPT0sgICAgICAgIi1kb2Nib29rIgojZGVmaW5lIEZVTkNUSU9OICAgICAgIi1mdW5jdGlvbiIKI2RlZmluZSBOT0ZVTkNUSU9OICAgICItbm9mdW5jdGlvbiIKCnZvaWQgdXNhZ2UgKHZvaWQpCnsKCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGRvY3Byb2Mge2RvY3xkZXBlbmR9IGZpbGVcbiIpOwoJZnByaW50ZihzdGRlcnIsICJJbnB1dCBpcyByZWFkIGZyb20gZmlsZS50bXBsLiBPdXRwdXQgaXMgc2VudCB0byBzdGRvdXRcbiIpOwoJZnByaW50ZihzdGRlcnIsICJkb2M6IGZyb250ZW5kIHdoZW4gZ2VuZXJhdGluZyBrZXJuZWwgZG9jdW1lbnRhdGlvblxuIik7CglmcHJpbnRmKHN0ZGVyciwgImRlcGVuZDogZ2VuZXJhdGUgbGlzdCBvZiBmaWxlcyByZWZlcmVuY2VkIHdpdGhpbiBmaWxlXG4iKTsKfQoKLyoKICogRXhlY3V0ZSBrZXJuZWwtZG9jIHdpdGggcGFyYW1ldGVycyBnaXZpbiBpbiBzdmVjCiAqLwp2b2lkIGV4ZWNfa2VybmVsX2RvYyhjaGFyICoqc3ZlYykKewoJcGlkX3QgcGlkOwoJaW50IHJldDsKCWNoYXIgcmVhbF9maWxlbmFtZVtQQVRIX01BWCArIDFdOwoJLyogTWFrZSBzdXJlIG91dHB1dCBnZW5lcmF0ZWQgc28gZmFyIGFyZSBmbHVzaGVkICovCglmZmx1c2goc3Rkb3V0KTsKCXN3aXRjaChwaWQ9Zm9yaygpKSB7CgkJY2FzZSAtMToKCQkJcGVycm9yKCJmb3JrIik7CgkJCWV4aXQoMSk7CgkJY2FzZSAgMDoKCQkJbWVtc2V0KHJlYWxfZmlsZW5hbWUsIDAsIHNpemVvZihyZWFsX2ZpbGVuYW1lKSk7CgkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKCQkJc3RybmNhdChyZWFsX2ZpbGVuYW1lLCBLRVJORUxET0NQQVRIIEtFUk5FTERPQywKCQkJCQlQQVRIX01BWCAtIHN0cmxlbihyZWFsX2ZpbGVuYW1lKSk7CgkJCWV4ZWN2cChyZWFsX2ZpbGVuYW1lLCBzdmVjKTsKCQkJZnByaW50ZihzdGRlcnIsICJleGVjICIpOwoJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CgkJCWV4aXQoMSk7CgkJZGVmYXVsdDoKCQkJd2FpdHBpZChwaWQsICZyZXQgLDApOwoJfQoJaWYgKFdJRkVYSVRFRChyZXQpKQoJCWV4aXRzdGF0dXMgfD0gV0VYSVRTVEFUVVMocmV0KTsKCWVsc2UKCQlleGl0c3RhdHVzID0gMHhmZjsKfQoKLyogVHlwZXMgdXNlZCB0byBjcmVhdGUgbGlzdCBvZiBhbGwgZXhwb3J0ZWQgc3ltYm9scyBpbiBhIG51bWJlciBvZiBmaWxlcyAqLwpzdHJ1Y3Qgc3ltYm9scwp7CgljaGFyICpuYW1lOwp9OwoKc3RydWN0IHN5bWZpbGUKewoJY2hhciAqZmlsZW5hbWU7CglzdHJ1Y3Qgc3ltYm9scyAqc3ltYm9sbGlzdDsKCWludCBzeW1ib2xjbnQ7Cn07CgpzdHJ1Y3Qgc3ltZmlsZSBzeW1maWxlbGlzdFtNQVhGSUxFU107CmludCBzeW1maWxlY250ID0gMDsKCnZvaWQgYWRkX25ld19zeW1ib2woc3RydWN0IHN5bWZpbGUgKnN5bSwgY2hhciAqIHN5bW5hbWUpCnsKCXN5bS0+c3ltYm9sbGlzdCA9CiAgICAgICAgICByZWFsbG9jKHN5bS0+c3ltYm9sbGlzdCwgKHN5bS0+c3ltYm9sY250ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CglzeW0tPnN5bWJvbGxpc3Rbc3ltLT5zeW1ib2xjbnQrK10ubmFtZSA9IHN0cmR1cChzeW1uYW1lKTsKfQoKLyogQWRkIGEgZmlsZW5hbWUgdG8gdGhlIGxpc3QgKi8Kc3RydWN0IHN5bWZpbGUgKiBhZGRfbmV3X2ZpbGUoY2hhciAqIGZpbGVuYW1lKQp7CglzeW1maWxlbGlzdFtzeW1maWxlY250KytdLmZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKCXJldHVybiAmc3ltZmlsZWxpc3Rbc3ltZmlsZWNudCAtIDFdOwp9Ci8qIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBhcmUgcHJlc2VudCBpbiB0aGUgbGlzdCAqLwpzdHJ1Y3Qgc3ltZmlsZSAqIGZpbGVuYW1lX2V4aXN0KGNoYXIgKiBmaWxlbmFtZSkKewoJaW50IGk7Cglmb3IgKGk9MDsgaSA8IHN5bWZpbGVjbnQ7IGkrKykKCQlpZiAoc3RyY21wKHN5bWZpbGVsaXN0W2ldLmZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkKCQkJcmV0dXJuICZzeW1maWxlbGlzdFtpXTsKCXJldHVybiBOVUxMOwp9CgovKgogKiBMaXN0IGFsbCBmaWxlcyByZWZlcmVuY2VkIHdpdGhpbiB0aGUgdGVtcGxhdGUgZmlsZS4KICogRmlsZXMgYXJlIHNlcGFyYXRlZCBieSB0YWJzLgogKi8Kdm9pZCBhZGRkZXAoY2hhciAqIGZpbGUpCQkgICB7IHByaW50ZigiXHQlcyIsIGZpbGUpOyB9CnZvaWQgYWRkZGVwMihjaGFyICogZmlsZSwgY2hhciAqIGxpbmUpICAgICB7IGxpbmUgPSBsaW5lOyBhZGRkZXAoZmlsZSk7IH0Kdm9pZCBub2FjdGlvbihjaGFyICogbGluZSkJCSAgIHsgbGluZSA9IGxpbmU7IH0Kdm9pZCBub2FjdGlvbjIoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKSAgIHsgZmlsZSA9IGZpbGU7IGxpbmUgPSBsaW5lOyB9CgovKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8Kdm9pZCBwcmludGxpbmUoY2hhciAqIGxpbmUpICAgICAgICAgICAgICAgeyBwcmludGYoIiVzIiwgbGluZSk7IH0KCi8qCiAqIEZpbmQgYWxsIHN5bWJvbHMgZXhwb3J0ZWQgd2l0aCBFWFBPUlRfU1lNQk9MIGFuZCBFWFBPUlRfU1lNQk9MX0dQTAogKiBpbiBmaWxlbmFtZS4KICogQWxsIHN5bWJvbHMgbG9jYXRlZCBhcmUgc3RvcmVkIGluIHN5bWZpbGVsaXN0LgogKi8Kdm9pZCBmaW5kX2V4cG9ydF9zeW1ib2xzKGNoYXIgKiBmaWxlbmFtZSkKewoJRklMRSAqIGZwOwoJc3RydWN0IHN5bWZpbGUgKnN5bTsKCWNoYXIgbGluZVtNQVhMSU5FU1pdOwoJaWYgKGZpbGVuYW1lX2V4aXN0KGZpbGVuYW1lKSA9PSBOVUxMKSB7CgkJY2hhciByZWFsX2ZpbGVuYW1lW1BBVEhfTUFYICsgMV07CgkJbWVtc2V0KHJlYWxfZmlsZW5hbWUsIDAsIHNpemVvZihyZWFsX2ZpbGVuYW1lKSk7CgkJc3RybmNhdChyZWFsX2ZpbGVuYW1lLCBnZXRlbnYoIlNSQ1RSRUUiKSwgUEFUSF9NQVgpOwoJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZmlsZW5hbWUsCgkJCQlQQVRIX01BWCAtIHN0cmxlbihyZWFsX2ZpbGVuYW1lKSk7CgkJc3ltID0gYWRkX25ld19maWxlKGZpbGVuYW1lKTsKCQlmcCA9IGZvcGVuKHJlYWxfZmlsZW5hbWUsICJyIik7CgkJaWYgKGZwID09IE5VTEwpCgkJewoJCQlmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOwoJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CgkJfQoJCXdoaWxlKGZnZXRzKGxpbmUsIE1BWExJTkVTWiwgZnApKSB7CgkJCWNoYXIgKnA7CgkJCWNoYXIgKmU7CgkJCWlmICgoKHAgPSBzdHJzdHIobGluZSwgIkVYUE9SVF9TWU1CT0xfR1BMIikpICE9IDApIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHAgPSBzdHJzdHIobGluZSwgIkVYUE9SVF9TWU1CT0wiKSkgIT0gMCkpIHsKCQkJCS8qIFNraXAgRVhQT1JUX1NZTUJPTHtfR1BMfSAqLwoJCQkJd2hpbGUgKGlzYWxudW0oKnApIHx8ICpwID09ICdfJykKCQkJCQlwKys7CgkJCQkvKiBSZW1vdmUgcGFyYW50ZXNlcyBhbmQgYWRkaXRpb25hbCB3cyAqLwoJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQoJCQkJCXArKzsKCQkJCWlmICgqcCAhPSAnKCcpCgkJCQkJY29udGludWU7IC8qIFN5bnRheCBlcnJvcj8gKi8KCQkJCWVsc2UKCQkJCQlwKys7CgkJCQl3aGlsZSAoaXNzcGFjZSgqcCkpCgkJCQkJcCsrOwoJCQkJZSA9IHA7CgkJCQl3aGlsZSAoaXNhbG51bSgqZSkgfHwgKmUgPT0gJ18nKQoJCQkJCWUrKzsKCQkJCSplID0gJ1wwJzsKCQkJCWFkZF9uZXdfc3ltYm9sKHN5bSwgcCk7CgkJCX0KCQl9CgkJZmNsb3NlKGZwKTsKCX0KfQoKLyoKICogRG9jdW1lbnQgYWxsIGV4dGVybmFsIG9yIGludGVybmFsIGZ1bmN0aW9ucyBpbiBhIGZpbGUuCiAqIENhbGwga2VybmVsLWRvYyB3aXRoIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogKiBrZXJuZWwtZG9jIC1kb2Nib29rIC1ub2Z1bmN0aW9uIGZ1bmN0aW9uX25hbWUxIGZpbGVuYW1lCiAqIGZ1bmN0aW9uIG5hbWVzIGFyZSBvYnRhaW5lZCBmcm9tIGFsbCB0aGUgdGhlIHNyYyBmaWxlcwogKiBieSBmaW5kX2V4cG9ydF9zeW1ib2xzLgogKiBpbnRmdW5jIHVzZXMgLW5vZnVuY3Rpb24KICogZXh0ZnVuYyB1c2VzIC1mdW5jdGlvbgogKi8Kdm9pZCBkb2NmdW5jdGlvbnMoY2hhciAqIGZpbGVuYW1lLCBjaGFyICogdHlwZSkKewoJaW50IGksajsKCWludCBzeW1jbnQgPSAwOwoJaW50IGlkeCA9IDA7CgljaGFyICoqdmVjOwoKCWZvciAoaT0wOyBpIDw9IHN5bWZpbGVjbnQ7IGkrKykKCQlzeW1jbnQgKz0gc3ltZmlsZWxpc3RbaV0uc3ltYm9sY250OwoJdmVjID0gbWFsbG9jKCgyICsgMiAqIHN5bWNudCArIDIpICogc2l6ZW9mKGNoYXIqKSk7CglpZiAodmVjID09IE5VTEwpIHsKCQlwZXJyb3IoImRvY3Byb2M6ICIpOwoJCWV4aXQoMSk7Cgl9Cgl2ZWNbaWR4KytdID0gS0VSTkVMRE9DOwoJdmVjW2lkeCsrXSA9IERPQ0JPT0s7Cglmb3IgKGk9MDsgaSA8IHN5bWZpbGVjbnQ7IGkrKykgewoJCXN0cnVjdCBzeW1maWxlICogc3ltID0gJnN5bWZpbGVsaXN0W2ldOwoJCWZvciAoaj0wOyBqIDwgc3ltLT5zeW1ib2xjbnQ7IGorKykgewoJCQl2ZWNbaWR4KytdICAgICA9IHR5cGU7CgkJCXZlY1tpZHgrK10gPSBzeW0tPnN5bWJvbGxpc3Rbal0ubmFtZTsKCQl9Cgl9Cgl2ZWNbaWR4KytdICAgICA9IGZpbGVuYW1lOwoJdmVjW2lkeF0gPSBOVUxMOwoJcHJpbnRmKCI8IS0tICVzIC0tPlxuIiwgZmlsZW5hbWUpOwoJZXhlY19rZXJuZWxfZG9jKHZlYyk7CglmZmx1c2goc3Rkb3V0KTsKCWZyZWUodmVjKTsKfQp2b2lkIGludGZ1bmMoY2hhciAqIGZpbGVuYW1lKSB7CWRvY2Z1bmN0aW9ucyhmaWxlbmFtZSwgTk9GVU5DVElPTik7IH0Kdm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CgovKgogKiBEb2N1bWVudCBzcOVlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgogKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAqIGtlcm5lbC1kb2MgLWRvY2Jvb2sgLWZ1bmN0aW9uIGZ1bmN0aW9uMSBbLWZ1bmN0aW9uIGZ1bmN0aW9uMl0KICovCnZvaWQgc2luZ2Z1bmMoY2hhciAqIGZpbGVuYW1lLCBjaGFyICogbGluZSkKewoJY2hhciAqdmVjWzIwMF07IC8qIEVub3VnaCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25zICovCiAgICAgICAgaW50IGksIGlkeCA9IDA7CiAgICAgICAgaW50IHN0YXJ0b2ZzeW0gPSAxOwoJdmVjW2lkeCsrXSA9IEtFUk5FTERPQzsKCXZlY1tpZHgrK10gPSBET0NCT09LOwoKICAgICAgICAvKiBTcGxpdCBsaW5lIHVwIGluIGluZGl2aWR1YWwgcGFyYW1ldGVycyBwcmVjZWVkZWQgYnkgRlVOQ1RJT04gKi8KICAgICAgICBmb3IgKGk9MDsgbGluZVtpXTsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzcGFjZShsaW5lW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsaW5lW2ldID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRvZnN5bSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXJ0b2ZzeW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRvZnN5bSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlY1tpZHgrK10gPSBGVU5DVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgdmVjW2lkeCsrXSA9ICZsaW5lW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCXZlY1tpZHgrK10gPSBmaWxlbmFtZTsKCXZlY1tpZHhdID0gTlVMTDsKCWV4ZWNfa2VybmVsX2RvYyh2ZWMpOwp9CgovKgogKiBQYXJzZSBmaWxlLCBjYWxsaW5nIGFjdGlvbiBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yOgogKiAxKSBMaW5lcyBjb250YWluaW5nICFFCiAqIDIpIExpbmVzIGNvbnRhaW5pbmcgIUkKICogMykgTGluZXMgY29udGFpbmluZyAhRAogKiA0KSBMaW5lcyBjb250YWluaW5nICFGCiAqIDUpIERlZmF1bHQgbGluZXMgLSBsaW5lcyBub3QgbWF0Y2hpbmcgdGhlIGFib3ZlCiAqLwp2b2lkIHBhcnNlX2ZpbGUoRklMRSAqaW5maWxlKQp7CgljaGFyIGxpbmVbTUFYTElORVNaXTsKCWNoYXIgKiBzOwoJd2hpbGUoZmdldHMobGluZSwgTUFYTElORVNaLCBpbmZpbGUpKSB7CgkJaWYgKGxpbmVbMF0gPT0gJyEnKSB7CgkJCXMgPSBsaW5lICsgMjsKCQkJc3dpdGNoIChsaW5lWzFdKSB7CgkJCQljYXNlICdFJzoKCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CgkJCQkJKnMgPSAnXDAnOwoJCQkJCWV4dGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdJJzoKCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CgkJCQkJKnMgPSAnXDAnOwoJCQkJCWludGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdEJzoKCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcyA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzb25seShsaW5lKzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCQljYXNlICdGJzoKCQkJCQkvKiBmaWxlbmFtZSAqLwoJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKCQkJCQkqcysrID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bmN0aW9uIG5hbWVzICovCgkJCQkJd2hpbGUgKGlzc3BhY2UoKnMpKQoJCQkJCQlzKys7CgkJCQkJc2luZ2xlZnVuY3Rpb25zKGxpbmUgKzIsIHMpOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlkZWZhdWx0bGluZShsaW5lKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJZGVmYXVsdGxpbmUobGluZSk7CgkJfQoJfQoJZmZsdXNoKHN0ZG91dCk7Cn0KCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglGSUxFICogaW5maWxlOwoJaWYgKGFyZ2MgIT0gMykgewoJCXVzYWdlKCk7CgkJZXhpdCgxKTsKCX0KCS8qIE9wZW4gZmlsZSwgZXhpdCBvbiBlcnJvciAqLwoJaW5maWxlID0gZm9wZW4oYXJndlsyXSwgInIiKTsKICAgICAgICBpZiAoaW5maWxlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CiAgICAgICAgICAgICAgICBwZXJyb3IoYXJndlsyXSk7CiAgICAgICAgICAgICAgICBleGl0KDIpOwogICAgICAgIH0KCglpZiAoc3RyY21wKCJkb2MiLCBhcmd2WzFdKSA9PSAwKQoJewoJCS8qIE5lZWQgdG8gZG8gdGhpcyBpbiB0d28gcGFzc2VzLgoJCSAqIEZpcnN0IHBhc3MgaXMgdXNlZCB0byBjb2xsZWN0IGFsbCBzeW1ib2xzIGV4cG9ydGVkCgkJICogaW4gdGhlIHZhcmlvdXMgZmlsZXMuCgkJICogU2Vjb25kIHBhc3MgZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCgkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZ1bmN0aW9uIGFyZSBkZWNsYXJlZAoJCSAqIGFuZCBleHBvcnRlZCBpbiBkaWZmZXJlbnQgZmlsZXMgOi0oKAoJCSAqLwoJCS8qIENvbGxlY3Qgc3ltYm9scyAqLwoJCWRlZmF1bHRsaW5lICAgICAgID0gbm9hY3Rpb247CgkJaW50ZXJuYWxmdW5jdGlvbnMgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOwoJCWV4dGVybmFsZnVuY3Rpb25zID0gZmluZF9leHBvcnRfc3ltYm9sczsKCQlzeW1ib2xzb25seSAgICAgICA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CgkJc2luZ2xlZnVuY3Rpb25zICAgPSBub2FjdGlvbjI7CgkJcGFyc2VfZmlsZShpbmZpbGUpOwoKCQkvKiBSZXdpbmQgdG8gc3RhcnQgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSBhZ2FpbiAqLwoJCWZzZWVrKGluZmlsZSwgMCwgU0VFS19TRVQpOwoJCWRlZmF1bHRsaW5lICAgICAgID0gcHJpbnRsaW5lOwoJCWludGVybmFsZnVuY3Rpb25zID0gaW50ZnVuYzsKCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGV4dGZ1bmM7CgkJc3ltYm9sc29ubHkgICAgICAgPSBwcmludGxpbmU7CgkJc2luZ2xlZnVuY3Rpb25zICAgPSBzaW5nZnVuYzsKCgkJcGFyc2VfZmlsZShpbmZpbGUpOwoJfQoJZWxzZSBpZiAoc3RyY21wKCJkZXBlbmQiLCBhcmd2WzFdKSA9PSAwKQoJewoJCS8qIENyZWF0ZSBmaXJzdCBwYXJ0IG9mIGRlcGVuZGVuY3kgY2hhaW4KCQkgKiBmaWxlLnRtcGwgKi8KCQlwcmludGYoIiVzXHQiLCBhcmd2WzJdKTsKCQlkZWZhdWx0bGluZSAgICAgICA9IG5vYWN0aW9uOwoJCWludGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOwoJCWV4dGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOwoJCXN5bWJvbHNvbmx5ICAgICAgID0gYWRkZGVwOwoJCXNpbmdsZWZ1bmN0aW9ucyAgID0gYWRkZGVwMjsKCQlwYXJzZV9maWxlKGluZmlsZSk7CgkJcHJpbnRmKCJcbiIpOwoJfQoJZWxzZQoJewoJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBhcmd2WzFdKTsKCQlleGl0KDEpOwoJfQoJZmNsb3NlKGluZmlsZSk7CglmZmx1c2goc3Rkb3V0KTsKCXJldHVybiBleGl0c3RhdHVzOwp9Cgo=