LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZjLWxhbmcvZmMtbGFuZy5jLHYgMS4zIDIwMDIvMDgvMjIgMDc6MzY6NDMga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSAiZmNjaGFyc2V0LmMiCiNpbmNsdWRlICJmY3N0ci5jIgoKLyoKICogZmMtbGFuZwogKgogKiBSZWFkIGEgc2V0IG9mIGxhbmd1YWdlIG9ydGhvZ3JhcGhpZXMgYW5kIGJ1aWxkIEMgZGVjbGFyYXRpb25zIGZvcgogKiBjaGFyc2V0cyB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIGxhbmd1YWdlcyBhcmUKICogc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGlzIHVzZXMgc29tZSB1dGlsaXRpZXMKICogZnJvbSB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5LCBzbyB0aGUgbmVjZXNzYXJ5IGZpbGUgaXMgc2ltcGx5CiAqIGluY2x1ZGVkIGluIHRoaXMgY29tcGlsYXRpb24uICBBIGNvdXBsZSBvZiBleHRyYSB1dGlsaXR5CiAqIGZ1bmN0aW9ucyBhcmUgYWxzbyBuZWVkZWQgaW4gc2xpZ2h0bHkgbW9kaWZpZWQgZm9ybQogKi8KCnZvaWQKRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKQp7Cn0KCnZvaWQKRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpCnsKfQoKRmNDaGFyOCAqCkZjQ29uZmlnSG9tZSAodm9pZCkKewogICAgcmV0dXJuIGdldGVudiAoIkhPTUUiKTsKfQoKc3RhdGljIHZvaWQgCmZhdGFsIChjaGFyICpmaWxlLCBpbnQgbGluZW5vLCBjaGFyICptc2cpCnsKICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgZmlsZSwgbGluZW5vLCBtc2cpOwogICAgZXhpdCAoMSk7Cn0KCnN0YXRpYyBjaGFyICoKZ2V0X2xpbmUgKEZJTEUgKmYsIGNoYXIgKmxpbmUsIGludCAqbGluZW5vKQp7CiAgICBjaGFyICAgICpoYXNoOwogICAgaWYgKCFmZ2V0cyAobGluZSwgMTAyNCwgZikpCglyZXR1cm4gMDsKICAgICsrKCpsaW5lbm8pOwogICAgaGFzaCA9IHN0cmNociAobGluZSwgJyMnKTsKICAgIGlmIChoYXNoKQoJKmhhc2ggPSAnXDAnOwogICAgaWYgKGxpbmVbMF0gPT0gJ1wwJyB8fCBsaW5lWzBdID09ICdcbicgfHwgbGluZVswXSA9PSAnXDAzMicgfHwgbGluZVswXSA9PSAnXHInKQoJcmV0dXJuIGdldF9saW5lIChmLCBsaW5lLCBsaW5lbm8pOwogICAgcmV0dXJuIGxpbmU7Cn0KCi8qCiAqIGJ1aWxkIGEgc2luZ2xlIGNoYXJzZXQgZnJvbSBhIHNvdXJjZSBmaWxlCiAqCiAqIFRoZSBmaWxlIGZvcm1hdCBpcyBxdWl0ZSBzaW1wbGUsIGVpdGhlcgogKiBhIHNpbmdsZSBoZXggdmFsdWUgb3IgYSBwYWlyIHNlcGFyYXRlZCB3aXRoIGEgZGFzaAogKgogKiBDb21tZW50cyBiZWdpbiB3aXRoICcjJwogKi8KCnN0YXRpYyBGY0NoYXJTZXQgKgpzY2FuIChGSUxFICpmLCBjaGFyICpmaWxlKQp7CiAgICBGY0NoYXJTZXQJKmMgPSAwOwogICAgRmNDaGFyU2V0CSpuOwogICAgaW50CQlzdGFydCwgZW5kLCB1Y3M0OwogICAgY2hhcglsaW5lWzEwMjRdOwogICAgaW50CQlsaW5lbm8gPSAwOwoKICAgIHdoaWxlIChnZXRfbGluZSAoZiwgbGluZSwgJmxpbmVubykpCiAgICB7CglpZiAoIXN0cm5jbXAgKGxpbmUsICJpbmNsdWRlIiwgNykpCgl7CgkgICAgZmlsZSA9IHN0cmNociAobGluZSwgJyAnKTsKCSAgICB3aGlsZSAoKmZpbGUgPT0gJyAnKQoJCWZpbGUrKzsKCSAgICBlbmQgPSBzdHJsZW4gKGZpbGUpOwoJICAgIGlmIChmaWxlW2VuZC0xXSA9PSAnXG4nKQoJCWZpbGVbZW5kLTFdID0gJ1wwJzsKCSAgICBmID0gZm9wZW4gKGZpbGUsICJyIik7CgkgICAgaWYgKCFmKQoJCWZhdGFsIChmaWxlLCAwLCAiY2FuJ3Qgb3BlbiIpOwoJICAgIGMgPSBzY2FuIChmLCBmaWxlKTsKCSAgICBmY2xvc2UgKGYpOwoJICAgIHJldHVybiBjOwoJfQoJaWYgKHN0cmNociAobGluZSwgJy0nKSkKCXsKCSAgICBpZiAoc3NjYW5mIChsaW5lLCAiJXgtJXgiLCAmc3RhcnQsICZlbmQpICE9IDIpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgInBhcnNlIGVycm9yIik7Cgl9CgllbHNlCgl7CgkgICAgaWYgKHNzY2FuZiAobGluZSwgIiV4IiwgJnN0YXJ0KSAhPSAxKQoJCWZhdGFsIChmaWxlLCBsaW5lbm8sICJwYXJzZSBlcnJvciIpOwoJICAgIGVuZCA9IHN0YXJ0OwoJfQoJaWYgKCFjKQoJICAgIGMgPSBGY0NoYXJTZXRDcmVhdGUgKCk7Cglmb3IgKHVjczQgPSBzdGFydDsgdWNzNCA8PSBlbmQ7IHVjczQrKykKCXsKCSAgICBpZiAoIUZjQ2hhclNldEFkZENoYXIgKGMsIHVjczQpKQoJCWZhdGFsIChmaWxlLCBsaW5lbm8sICJvdXQgb2YgbWVtb3J5Iik7Cgl9CiAgICB9CiAgICBuID0gRmNDaGFyU2V0RnJlZXplIChjKTsKICAgIEZjQ2hhclNldERlc3Ryb3kgKGMpOwogICAgcmV0dXJuIG47Cn0KCi8qCiAqIENvbnZlcnQgYSBmaWxlIG5hbWUgaW50byBhIG5hbWUgc3VpdGFibGUgZm9yIEMgZGVjbGFyYXRpb25zCiAqLwpzdGF0aWMgY2hhciAqCmdldF9uYW1lIChjaGFyICpmaWxlKQp7CiAgICBjaGFyICAgICpuYW1lOwogICAgY2hhciAgICAqZG90OwoKICAgIGRvdCA9IHN0cmNociAoZmlsZSwgJy4nKTsKICAgIGlmICghZG90KQoJZG90ID0gZmlsZSArIHN0cmxlbihmaWxlKTsKICAgIG5hbWUgPSBtYWxsb2MgKGRvdCAtIGZpbGUgKyAxKTsKICAgIHN0cm5jcHkgKG5hbWUsIGZpbGUsIGRvdCAtIGZpbGUpOwogICAgbmFtZVtkb3QtZmlsZV0gPSAnXDAnOwogICAgcmV0dXJuIG5hbWU7Cn0KCi8qCiAqIENvbnZlcnQgYSBDIG5hbWUgaW50byBhIGxhbmd1YWdlIG5hbWUKICovCnN0YXRpYyBjaGFyICoKZ2V0X2xhbmcgKGNoYXIgKm5hbWUpCnsKICAgIGNoYXIgICAgKmxhbmcgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKICAgIGNoYXIgICAgKmwgPSBsYW5nOwogICAgY2hhciAgICBjOwoKICAgIHdoaWxlICgoYyA9ICpuYW1lKyspKQogICAgewoJaWYgKGlzdXBwZXIgKGMpKQoJICAgIGMgPSB0b2xvd2VyIChjKTsKCWlmIChjID09ICdfJykKCSAgICBjID0gJy0nOwoJaWYgKGMgPT0gJyAnKQoJICAgIGNvbnRpbnVlOwoJKmwrKyA9IGM7CiAgICB9CiAgICAqbCsrID0gJ1wwJzsKICAgIHJldHVybiBsYW5nOwp9CgpzdGF0aWMgaW50IGNvbXBhcmUgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAgKmNvbnN0ICphcyA9IGEsICpjb25zdCAqYnMgPSBiOwogICAgcmV0dXJuIEZjU3RyQ21wSWdub3JlQ2FzZSAoKmFzLCAqYnMpOwp9CgojZGVmaW5lIE1BWF9MQU5HCSAgICAxMDI0CiNkZWZpbmUgTUFYX0xBTkdfU0VUX01BUCAgICAoKE1BWF9MQU5HICsgMzEpIC8gMzIpCgojZGVmaW5lIEJpdFNldChtYXAsIGlkKSAgICgobWFwKVsoaWQpPj41XSB8PSAoKEZjQ2hhcjMyKSAxIDw8ICgoaWQpICYgMHgxZikpKQojZGVmaW5lIEJpdEdldChtYXAsIGlkKSAgICgobWFwKVsoaWQpPj41XSA+PiAoKGlkKSAmIDB4MWYpKSAmIDEpCgppbnQKbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBjaGFyCSpmaWxlc1tNQVhfTEFOR107CiAgICBGY0NoYXJTZXQJKnNldHNbTUFYX0xBTkddOwogICAgaW50CQlkdXBsaWNhdGVbTUFYX0xBTkddOwogICAgaW50CQljb3VudHJ5W01BWF9MQU5HXTsKICAgIGNoYXIJKm5hbWVzW01BWF9MQU5HXTsKICAgIGNoYXIJKmxhbmdzW01BWF9MQU5HXTsKICAgIEZJTEUJKmY7CiAgICBpbnQJCW5jb3VudHJ5ID0gMDsKICAgIGludAkJaSA9IDA7CiAgICBGY0NoYXJMZWFmCSoqbGVhdmVzLCAqKnNsZWF2ZXM7CiAgICBpbnQJCXRvdGFsX2xlYXZlcyA9IDA7CiAgICBpbnQJCWwsIHNsLCB0bDsKICAgIGludAkJYzsKICAgIGNoYXIJbGluZVsxMDI0XTsKICAgIEZjQ2hhcjMyCW1hcFtNQVhfTEFOR19TRVRfTUFQXTsKICAgIGludAkJbnVtX2xhbmdfc2V0X21hcDsKICAgIAogICAgd2hpbGUgKCorK2FyZ3YpCiAgICB7CglpZiAoaSA9PSBNQVhfTEFORykKCSAgICBmYXRhbCAoKmFyZ3YsIDAsICJUb28gbWFueSBsYW5ndWFnZXMiKTsKCWZpbGVzW2krK10gPSAqYXJndjsKICAgIH0KICAgIGZpbGVzW2ldID0gMDsKICAgIHFzb3J0IChmaWxlcywgaSwgc2l6ZW9mIChjaGFyICopLCBjb21wYXJlKTsKICAgIGkgPSAwOwogICAgd2hpbGUgKGZpbGVzW2ldKQogICAgewoJZiA9IGZvcGVuIChmaWxlc1tpXSwgInIiKTsKCWlmICghZikKCSAgICBmYXRhbCAoZmlsZXNbaV0sIDAsIHN0cmVycm9yIChlcnJubykpOwoJc2V0c1tpXSA9IHNjYW4gKGYsIGZpbGVzW2ldKTsKCW5hbWVzW2ldID0gZ2V0X25hbWUgKGZpbGVzW2ldKTsKCWxhbmdzW2ldID0gZ2V0X2xhbmcobmFtZXNbaV0pOwoJaWYgKHN0cmNociAobGFuZ3NbaV0sICctJykpCgkgICAgY291bnRyeVtuY291bnRyeSsrXSA9IGk7CgoJdG90YWxfbGVhdmVzICs9IHNldHNbaV0tPm51bTsKCWkrKzsKCWZjbG9zZSAoZik7CiAgICB9CiAgICBzZXRzW2ldID0gMDsKICAgIGxlYXZlcyA9IG1hbGxvYyAodG90YWxfbGVhdmVzICogc2l6ZW9mIChGY0NoYXJMZWFmICopKTsKICAgIHRsID0gMDsKICAgIC8qCiAgICAgKiBGaW5kIHVuaXF1ZSBsZWF2ZXMKICAgICAqLwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJc2xlYXZlcyA9IHNldHNbaV0tPmxlYXZlczsKCWZvciAoc2wgPSAwOyBzbCA8IHNldHNbaV0tPm51bTsgc2wrKykKCXsKCSAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKCQlpZiAobGVhdmVzW2xdID09IHNsZWF2ZXNbc2xdKQoJCSAgICBicmVhazsKCSAgICBpZiAobCA9PSB0bCkKCQlsZWF2ZXNbdGwrK10gPSBzbGVhdmVzW3NsXTsKCX0KICAgIH0KCiAgICAvKgogICAgICogU2NhbiB0aGUgaW5wdXQgdW50aWwgdGhlIG1hcmtlciBpcyBmb3VuZAogICAgICovCiAgICAKICAgIHdoaWxlIChmZ2V0cyAobGluZSwgc2l6ZW9mIChsaW5lKSwgc3RkaW4pKQogICAgewoJaWYgKCFzdHJuY21wIChsaW5lLCAiQEBAIiwgMykpCgkgICAgYnJlYWs7CglmcHV0cyAobGluZSwgc3Rkb3V0KTsKICAgIH0KICAgIAogICAgcHJpbnRmICgiLyogdG90YWwgc2l6ZTogJWQgdW5pcXVlIGxlYXZlczogJWQgKi9cblxuIiwKCSAgICB0b3RhbF9sZWF2ZXMsIHRsKTsKICAgIC8qCiAgICAgKiBEdW1wIGxlYXZlcwogICAgICovCiAgICBwcmludGYgKCJzdGF0aWMgY29uc3QgRmNDaGFyTGVhZglsZWF2ZXNbJWRdID0ge1xuIiwgdGwpOwogICAgZm9yIChsID0gMDsgbCA8IHRsOyBsKyspCiAgICB7CglwcmludGYgKCIgICAgeyB7IC8qICVkICovIiwgbCk7Cglmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCgl7CgkgICAgaWYgKGkgJSA0ID09IDApCgkJcHJpbnRmICgiXG4gICAiKTsKCSAgICBwcmludGYgKCIgMHglMDh4LCIsIGxlYXZlc1tsXS0+bWFwW2ldKTsKCX0KCXByaW50ZiAoIlxuICAgIH0gfSxcbiIpOwogICAgfQogICAgcHJpbnRmICgifTtcblxuIik7CiAgICBwcmludGYgKCIjZGVmaW5lIEwobikgKChGY0NoYXJMZWFmICopICZsZWF2ZXNbbl0pXG5cbiIpOwoKICAgIC8qCiAgICAgKiBGaW5kIGR1cGxpY2F0ZSBjaGFyc2V0cwogICAgICovCiAgICBkdXBsaWNhdGVbMF0gPSAtMTsKICAgIGZvciAoaSA9IDE7IHNldHNbaV07IGkrKykKICAgIHsKCWludCBqOwoKCWR1cGxpY2F0ZVtpXSA9IC0xOwoJZm9yIChqID0gMDsgaiA8IGk7IGorKykKCSAgICBpZiAoc2V0c1tqXSA9PSBzZXRzW2ldKQoJICAgIHsKCQlkdXBsaWNhdGVbaV0gPSBqOwoJCWJyZWFrOwoJICAgIH0KICAgIH0KCiAgICAvKgogICAgICogRHVtcCBhcnJheXMKICAgICAqLwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50IG47CgkKCWlmIChkdXBsaWNhdGVbaV0gPj0gMCkKCSAgICBjb250aW51ZTsKCXByaW50ZiAoInN0YXRpYyBjb25zdCBGY0NoYXJMZWFmICpsZWF2ZXNfJXNbJWRdID0ge1xuIiwKCQluYW1lc1tpXSwgc2V0c1tpXS0+bnVtKTsKCWZvciAobiA9IDA7IG4gPCBzZXRzW2ldLT5udW07IG4rKykKCXsKCSAgICBpZiAobiAlIDggPT0gMCkKCQlwcmludGYgKCIgICAiKTsKCSAgICBmb3IgKGwgPSAwOyBsIDwgdGw7IGwrKykKCQlpZiAobGVhdmVzW2xdID09IHNldHNbaV0tPmxlYXZlc1tuXSkKCQkgICAgYnJlYWs7CgkgICAgaWYgKGwgPT0gdGwpCgkJZmF0YWwgKG5hbWVzW2ldLCAwLCAiY2FuJ3QgZmluZCBsZWFmIik7CgkgICAgcHJpbnRmICgiIEwoJTNkKSwiLCBsKTsKCSAgICBpZiAobiAlIDggPT0gNykKCQlwcmludGYgKCJcbiIpOwoJfQoJaWYgKG4gJSA4ICE9IDApCgkgICAgcHJpbnRmICgiXG4iKTsKCXByaW50ZiAoIn07XG5cbiIpOwoJCgoJcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhcjE2IG51bWJlcnNfJXNbJWRdID0ge1xuIiwKCQluYW1lc1tpXSwgc2V0c1tpXS0+bnVtKTsKCWZvciAobiA9IDA7IG4gPCBzZXRzW2ldLT5udW07IG4rKykKCXsKCSAgICBpZiAobiAlIDggPT0gMCkKCQlwcmludGYgKCIgICAiKTsKCSAgICBwcmludGYgKCIgMHglMDR4LCIsIHNldHNbaV0tPm51bWJlcnNbbl0pOwoJICAgIGlmIChuICUgOCA9PSA3KQoJCXByaW50ZiAoIlxuIik7Cgl9CglpZiAobiAlIDggIT0gMCkKCSAgICBwcmludGYgKCJcbiIpOwoJcHJpbnRmICgifTtcblxuIik7CiAgICB9CiAgICBwcmludGYgKCIjdW5kZWYgTFxuXG4iKTsKICAgIC8qCiAgICAgKiBEdW1wIHNldHMKICAgICAqLwogICAgcHJpbnRmICgic3RhdGljIGNvbnN0IEZjTGFuZ0NoYXJTZXQgIGZjTGFuZ0NoYXJTZXRzW10gPSB7XG4iKTsKICAgIGZvciAoaSA9IDA7IHNldHNbaV07IGkrKykKICAgIHsKCWludAlqID0gZHVwbGljYXRlW2ldOwoJaWYgKGogPCAwKQoJICAgIGogPSBpOwoJcHJpbnRmICgiICAgIHsgKEZjQ2hhcjggKikgXCIlc1wiLFxuIgoJCSIgICAgICB7IEZDX1JFRl9DT05TVEFOVCwgJWQsICIKCQkiKEZjQ2hhckxlYWYgKiopIGxlYXZlc18lcywgIgoJCSIoRmNDaGFyMTYgKikgbnVtYmVyc18lcyB9IH0sXG4iLAoJCWxhbmdzW2ldLAoJCXNldHNbal0tPm51bSwgbmFtZXNbal0sIG5hbWVzW2pdKTsKICAgIH0KICAgIHByaW50ZiAoIn07XG5cbiIpOwogICAgcHJpbnRmICgiI2RlZmluZSBOVU1fTEFOR19DSEFSX1NFVAklZFxuIiwgaSk7CiAgICBudW1fbGFuZ19zZXRfbWFwID0gKGkgKyAzMSkgLyAzMjsKICAgIHByaW50ZiAoIiNkZWZpbmUgTlVNX0xBTkdfU0VUX01BUAklZFxuIiwgbnVtX2xhbmdfc2V0X21hcCk7CiAgICAvKgogICAgICogRHVtcCBpbmRpY2VzIHdpdGggY291bnRyeSBjb2RlcwogICAgICovCiAgICBpZiAobmNvdW50cnkpCiAgICB7CglpbnQJbmNvdW50cnlfZW50ID0gMDsKCXByaW50ZiAoIlxuIik7CglwcmludGYgKCJzdGF0aWMgY29uc3QgRmNDaGFyMzIgZmNMYW5nQ291bnRyeVNldHNbXVtOVU1fTEFOR19TRVRfTUFQXSA9IHtcbiIpOwoJZm9yIChjID0gMDsgYyA8IG5jb3VudHJ5OyBjKyspCgl7CgkgICAgaSA9IGNvdW50cnlbY107CgkgICAgaWYgKGkgPj0gMCkKCSAgICB7CgkJaW50IGwgPSBzdHJjaHIgKGxhbmdzW2ldLCAnLScpIC0gbGFuZ3NbaV07CgkJaW50IGQsIGs7CgoJCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZ19zZXRfbWFwOyBrKyspCgkJICAgIG1hcFtrXSA9IDA7CgoJCUJpdFNldCAobWFwLCBpKTsKCQlmb3IgKGQgPSBjICsgMTsgZCA8IG5jb3VudHJ5OyBkKyspCgkJewoJCSAgICBpbnQgaiA9IGNvdW50cnlbZF07CgkJICAgIGlmIChqID49IDAgJiYgIXN0cm5jbXAgKGxhbmdzW2pdLCBsYW5nc1tpXSwgbCkpCgkJICAgIHsKCQkJQml0U2V0KG1hcCwgaik7CgkJCWNvdW50cnlbZF0gPSAtMTsKCQkgICAgfQoJCX0KCQlwcmludGYgKCIgICAgeyIpOwoJCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZ19zZXRfbWFwOyBrKyspCgkJICAgIHByaW50ZiAoIiAweCUwOHgsIiwgbWFwW2tdKTsKCQlwcmludGYgKCIgfSwgLyogJSouKnMgKi9cbiIsCgkJCWwsIGwsIGxhbmdzW2ldKTsKCQkrK25jb3VudHJ5X2VudDsKCSAgICB9Cgl9CglwcmludGYgKCJ9O1xuXG4iKTsKCXByaW50ZiAoIiNkZWZpbmUgTlVNX0NPVU5UUllfU0VUICVkXG4iLCBuY291bnRyeV9lbnQpOwogICAgfQogICAgCiAgICB3aGlsZSAoZmdldHMgKGxpbmUsIHNpemVvZiAobGluZSksIHN0ZGluKSkKCWZwdXRzIChsaW5lLCBzdGRvdXQpOwogICAgCiAgICBmZmx1c2ggKHN0ZG91dCk7CiAgICBleGl0IChmZXJyb3IgKHN0ZG91dCkpOwp9Cg==