Lyogc2h1dGRvd24uYyAtIHNodXRkb3duIGEgTGludXggc3lzdGVtCiAqIEluaXRpYWxseSB3cml0dGVuIGJ5IHBvZUBkYWltaS5hYXUuZGsgCiAqIEN1cnJlbnRseSBtYWludGFpbmVkIGF0IGZ0cDovL2Z0cC5kYWltaS5hYXUuZGsvcHViL1NvZnR3YXJlL0xpbnV4LwogKi8KCi8qCiAqIE1vZGlmaWVkIGJ5IGpyc0B3b3JsZC5zdGQuY29tIHRvIHRyeSB0byBleGVjICJ1bW91bnQgLWEiIGFuZCBpZgogKiB0aGF0IGRvZXNuJ3Qgd29yaywgdGhlbiB1bW91bnQgZmlsZXN5c3RlbXMgb3Vyc2VsdmVzIGluIHJldmVyc2UKICogb3JkZXIuICBUaGUgb2xkLXdheSB3YXMgaW4gZm9yd2FyZCBvcmRlci4gIEFsc28gaWYgdGhlIGRldmljZQogKiBmaWVsZCBvZiB0aGUgbXRhYiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgIi8iIHRoZW4gZ2l2ZSB1bW91bnQKICogdGhlIG1vdW50IHBvaW50IGluc3RlYWQuICBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIG5mcyBhbmQgcHJvYwogKiBmaWxlc3lzdGVtcyBhbmQgeWV0IGlzIGNvbXBhdGlibGUgd2l0aCBvbGRlciBzeXN0ZW1zLgogKgogKiBXZSBhbHNvIHVzZSB0aGUgbW50ZW50IGxpYnJhcnkgaW50ZXJmYWNlIHRvIHJlYWQgdGhlIG10YWIgZmlsZQogKiBpbnN0ZWFkIG9mIHRyeWluZyB0byBwYXJzZSBpdCBkaXJlY3RseSBhbmQgbm8gbG9uZ2VyIGdpdmUgYQogKiB3YXJuaW5nIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvIHVtb3VudCB0aGUgcm9vdC4KICoKICogVGhlIHJlYXNvbiAidW1vdW50IC1hIiBzaG91bGQgYmUgdHJpZWQgZmlyc3QgaXMgYmVjYXVzZSBpdCBtYXkgZG8KICogc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBzb21lIGZpbGVzeXN0ZW1zIChzdWNoIGFzIGluZm9ybWluZyBhbgogKiBuZnMgc2VydmVyIGFib3V0IG5mcyB1bW91bnRzKSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gY29wZSB3aXRoIGhlcmUuCiAqLwoKLyoKICogVmFyaW91cyBjaGFuZ2VzIGFuZCBhZGRpdGlvbnMgdG8gcmVzZW1ibGUgU3VuT1MgNCBzaHV0ZG93bi9yZWJvb3QvaGFsdCg4KQogKiBtb3JlIGNsb3NlbHkgYnkgU2NvdHQgVGVsZm9yZCAocy50ZWxmb3JkQGVkLmFjLnVrKSA5My8wNS8xOC4KICogKEkgYnV0Y2hlcmVkIFNjb3R0cyBwYXRjaGVzIHNvbWV3aGF0LiAtIHBvZSkKICoKICogQ2hhbmdlcyBieSBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4gKGJ1dGNoZXJlZCBieSBhZWIpCiAqIGludHJvZHVjaW5nIHNodXRkb3duLmNvbmYuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIDIwMDAtMDMtMDIgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAqIC0gcGF1c2UgZm9yZXZlciBpZiAocGlkID09IDEpIGFuZCBzZW5kIFNJR1FVSVQgdG8gcGlkID0gMQogKgogKiAyMDAwLTExLTA0IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgogKiAtIGNvbnRpbnVlIHJlYXBpbmcgaWYgKHBpZCA9PSAxKQogKgogKiAyMDAwLTExLTA2IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgogKiAtIHNodXQgZG93biAiZmluYWxwcm9nIiBmcm9tIC9ldGMvaW5pdHRhYgogKiAtIGtpbGwgbm9ybWFsIHVzZXIgKG5vbi1yb290IGFuZCBub24tZGFlbW9uKSBwcm9jZXNzZXMgZmlyc3Qgd2l0aCBTSUdURVJNCiAqCiAqIDIwMDAtMTEtMDggUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAqIC0gcm9sbGJhY2sgc2VydmljZXMKICogLSBkbyBub3QgdW5tb3VudCBkZXZmcyAob3RoZXJ3aXNlIGdldCBoYXJtbGVzcyBidXQgYW5ub3lpbmcgbWVzc2FnZXMpCiAqIC0gY3JlYXRlZCBzeW5jd2FpdCgpIGZvciBmYXN0ZXIgc2h1dHRpbmcgZG93bgogKiAtIGtpbGwgZ2V0dHkgcHJvY2Vzc2VzCiAqIDIwMDEtMDUtMTIgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAqIC0gdW5ibG9jayBhbGwgc2lnbmFscyAoc2lnbWFzayBmcm9tIHNpbXBsZWluaXQoOCkgc3RvcHBlZCBzbGVlcCgzKSkKICogLSBjbG9zZSBhbGwgZmlsZXMKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dXRtcC5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNpbmNsdWRlIDxtbnRlbnQuaD4KI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgPHN5c2xvZy5oPgojaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPGRpcmVudC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNpbmNsdWRlICJsaW51eF9yZWJvb3QuaCIKI2luY2x1ZGUgInBhdGhuYW1lcy5oIgojaW5jbHVkZSAieHN0cm5jcHkuaCIKI2luY2x1ZGUgIm5scy5oIgojaW5jbHVkZSAidXNsZWVwLmgiCgpzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSwgaW50X2hhbmRsZXIoaW50KSwgd3JpdGVfdXNlcihzdHJ1Y3QgdXRtcCAqKTsKc3RhdGljIHZvaWQgd2FsbCh2b2lkKSwgd3JpdGVfd3RtcCh2b2lkKSwgdW5tb3VudF9kaXNrcyh2b2lkKTsKc3RhdGljIHZvaWQgdW5tb3VudF9kaXNrc19vdXJzZWx2ZXModm9pZCk7CnN0YXRpYyB2b2lkIHN3YXBfb2ZmKHZvaWQpLCBkb19oYWx0KGNoYXIgKik7CnN0YXRpYyB2b2lkIGtpbGxfbW9ydGFscyAoaW50IHNpZyk7CnN0YXRpYyB2b2lkIHN0b3BfZmluYWxwcm9nICh2b2lkKTsKc3RhdGljIHZvaWQgc3luY3dhaXQgKGludCB0aW1ldmFsKTsKCgpjaGFyCSpwcm9nOwkJLyogbmFtZSBvZiB0aGUgcHJvZ3JhbSAqLwppbnQJb3B0X3JlYm9vdDsJLyogdHJ1ZSBpZiAtciBvcHRpb24gb3IgcmVib290IGNvbW1hbmQgKi8KaW50CXRpbWVvdXQ7CS8qIG51bWJlciBvZiBzZWNvbmRzIHRvIHNodXRkb3duICovCmludAlvcHRfcXVpZXQ7CS8qIHRydWUgaWYgbm8gbWVzc2FnZSBpcyB3YW50ZWQgKi8KaW50CW9wdF9mYXN0OwkvKiB0cnVlIGlmIGZhc3QgYm9vdCAqLwpjaGFyCW1lc3NhZ2VbOTBdOwkvKiByZWFzb24gZm9yIHNodXRkb3duIGlmIGFueS4uLiAqLwppbnQJb3B0X3NpbmdsZSA9IDA7IC8qIHRydWUgaXMgd2Ugd2FudCB0byBib290IHNpbmdsZXVzZXIgKi8KY2hhcgkqd2hvbTsJCS8qIHdobyBpcyBzaHV0dGluZyB0aGUgc3lzdGVtIGRvd24gKi8KaW50CW9wdF9tc2dzZXQgPSAwOyAvKiBtZXNzYWdlIHNldCBvbiBjb21tYW5kIGxpbmUgKi8KCQkJLyogY2hhbmdlIDEgdG8gMCBpZiBubyBmaWxlIGlzIHRvIGJlIHVzZWQgYnkgZGVmYXVsdCAqLwppbnQJb3B0X3VzZV9jb25maWdfZmlsZSA9IDE7CS8qIHJlYWQgX1BBVEhfU0hVVERPV05fQ09ORiAqLwpjaGFyCWhhbHRfYWN0aW9uWzI1Nl07CQkvKiB0byBmaW5kIG91dCB3aGF0IHRvIGRvIHVwb24gaGFsdCAqLwoKLyogI2RlZmluZSBERUJVR0dJTkcgKi8KCiNkZWZpbmUgV1Iocykgd3JpdGUoZmQsIHMsIHN0cmxlbihzKSkKI2RlZmluZSBXUkNSTEYJd3JpdGUoZmQsICJcclxuIiwgMikKI2RlZmluZSBFUlJTVFJJTkcgc3RyZXJyb3IoZXJybm8pCgojZGVmaW5lIFVNT1VOVF9BUkdTCQkidW1vdW50IiwgIi1hIiwgIi10IiwgIm5vZGV2ZnMiCiNkZWZpbmUgU1dBUE9GRl9BUkdTICAgICAgICAgICAgInN3YXBvZmYiLCAiLWEiCgp2b2lkCnVzYWdlKHZvaWQpCnsKCWZwcmludGYoc3RkZXJyLAoJCV8oIlVzYWdlOiBzaHV0ZG93biBbLWh8LXJdIFstZnFzXSBbbm93fGhoOnNzfCttaW5zXVxuIikpOwoJZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQKbXlfcHV0cyhjaGFyICpzKQp7CgkvKiBVc2UgYSBmcmVzaCBzdGRvdXQgYWZ0ZXIgZm9ya2luZyAqLwoJZnJlb3BlbihfUEFUSF9DT05TT0xFLCAidyIsIHN0ZG91dCk7CglwdXRzKHMpOwoJZmZsdXNoKHN0ZG91dCk7Cn0KCnZvaWQgCmludF9oYW5kbGVyKGludCBzaWcpCnsKCXVubGluayhfUEFUSF9OT0xPR0lOKTsKCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwoJbXlfcHV0cyhfKCJTaHV0ZG93biBwcm9jZXNzIGFib3J0ZWQiKSk7CglleGl0KDEpOwp9CgpzdGF0aWMgaW50Cmlzd2hpdGVzcGFjZShpbnQgYSkgewoJcmV0dXJuIChhID09ICcgJyB8fCBhID09ICdcdCcpOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQgYywgaSwgZmQ7CgljaGFyICpwdHI7CgoJaSA9IGdldGR0YWJsZXNpemUgKCk7Cglmb3IgKGZkID0gMzsgZmQgPCBpOyBmZCsrKSBjbG9zZSAoZmQpOwoJaWYgKGdldHBpZCAoKSA9PSAxKQoJewoJICAgIGZvciAoZmQgPSAwOyBmZCA8IDM7IGZkKyspIGNsb3NlIChmZCk7CgkgICAgd2hpbGUgKDEpIHdhaXQgKE5VTEwpOyAgLyogIEdyaW0gcmVhcGVyIG5ldmVyIHN0b3BzICAqLwoJfQoJc2lnc2V0bWFzayAoMCk7IC8qICBzaW1wbGVpbml0KDgpIGJsb2NrcyBhbGwgc2lnbmFsczogdW5kbyBmb3IgQUxSTSAgKi8KCWZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHNpZ25hbCAoaSwgU0lHX0RGTCk7CgogICAgICAgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKICAgICAgICBiaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogICAgICAgIHRleHRkb21haW4oUEFDS0FHRSk7CgojaWZuZGVmIERFQlVHR0lORwoJaWYoc2V0cmV1aWQgKDAsIDApKSB7CgkJZnByaW50ZihzdGRlcnIsIF8oIiVzOiBPbmx5IHJvb3QgY2FuIHNodXQgYSBzeXN0ZW0gZG93bi5cbiIpLAoJCQlhcmd2WzBdKTsKCQlleGl0KDEpOwoJfQojZW5kaWYKCglpZigqYXJndlswXSA9PSAnLScpIGFyZ3ZbMF0rKzsJLyogYWxsb3cgc2h1dGRvd24gYXMgbG9naW4gc2hlbGwgKi8KCXByb2cgPSBhcmd2WzBdOwoJaWYoKHB0ciA9IHN0cnJjaHIoYXJndlswXSwgJy8nKSkpIHByb2cgPSArK3B0cjsKCgkvKiBBbGwgbmFtZXMgKGhhbHQsIHJlYm9vdCwgZmFzdGhhbHQsIGZhc3Rib290LCBzaHV0ZG93bikKCSAgIHJlZmVyIHRvIHRoZSBzYW1lIHByb2dyYW0gd2l0aCB0aGUgc2FtZSBvcHRpb25zLAoJICAgb25seSB0aGUgZGVmYXVsdHMgZGlmZmVyLiAqLwoJaWYoIXN0cmNtcCgiaGFsdCIsIHByb2cpKSB7CgkJb3B0X3JlYm9vdCA9IDA7CgkJb3B0X3F1aWV0ID0gMTsKCQlvcHRfZmFzdCA9IDA7CgkJdGltZW91dCA9IDA7Cgl9IGVsc2UgaWYoIXN0cmNtcCgiZmFzdGhhbHQiLCBwcm9nKSkgewoJCW9wdF9yZWJvb3QgPSAwOwoJCW9wdF9xdWlldCA9IDE7CgkJb3B0X2Zhc3QgPSAxOwoJCXRpbWVvdXQgPSAwOwoJfSBlbHNlIGlmKCFzdHJjbXAoInJlYm9vdCIsIHByb2cpKSB7CgkJb3B0X3JlYm9vdCA9IDE7CgkJb3B0X3F1aWV0ID0gMTsKCQlvcHRfZmFzdCA9IDA7CgkJdGltZW91dCA9IDA7Cgl9IGVsc2UgaWYoIXN0cmNtcCgiZmFzdGJvb3QiLCBwcm9nKSkgewoJCW9wdF9yZWJvb3QgPSAxOwoJCW9wdF9xdWlldCA9IDE7CgkJb3B0X2Zhc3QgPSAxOwoJCXRpbWVvdXQgPSAwOwoJfSBlbHNlIHsKCQkvKiBkZWZhdWx0cyAqLwoJCW9wdF9yZWJvb3QgPSAwOwoJCW9wdF9xdWlldCA9IDA7CgkJb3B0X2Zhc3QgPSAwOwoJCXRpbWVvdXQgPSAyKjYwOwoJfQoJCQoJYyA9IDA7Cgl3aGlsZSgrK2MgPCBhcmdjKSB7CgkJaWYoYXJndltjXVswXSA9PSAnLScpIHsKCQkJZm9yKGkgPSAxOyBhcmd2W2NdW2ldOyBpKyspIHsKCQkJCXN3aXRjaChhcmd2W2NdW2ldKSB7CgkJCQljYXNlICdDJzoKCQkJCQlvcHRfdXNlX2NvbmZpZ19maWxlID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2gnOiAKCQkJCQlvcHRfcmVib290ID0gMDsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3InOgoJCQkJCW9wdF9yZWJvb3QgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJb3B0X2Zhc3QgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncSc6CgkJCQkJb3B0X3F1aWV0ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3MnOgoJCQkJCW9wdF9zaW5nbGUgPSAxOwoJCQkJCWJyZWFrOwoJCQkJICAgIAoJCQkJZGVmYXVsdDoKCQkJCQl1c2FnZSgpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmKCFzdHJjbXAoIm5vdyIsIGFyZ3ZbY10pKSB7CgkJCXRpbWVvdXQgPSAwOwoJCX0gZWxzZSBpZihhcmd2W2NdWzBdID09ICcrJykgewoJCQl0aW1lb3V0ID0gNjAgKiBhdG9pKCZhcmd2W2NdWzFdKTsKCQl9IGVsc2UgaWYgKGlzZGlnaXQoYXJndltjXVswXSkpIHsKCQkJY2hhciAqY29sb247CgkJCWludCBob3VyID0gMDsKCQkJaW50IG1pbnV0ZSA9IDA7CgkJCXRpbWVfdCB0aWNzOwoJCQlzdHJ1Y3QgdG0gKnR0OwoJCQlpbnQgbm93LCB0aGVuOwoJCQkJCgkJCWlmKChjb2xvbiA9IHN0cmNocihhcmd2W2NdLCAnOicpKSkgewoJCQkJKmNvbG9uID0gJ1wwJzsKCQkJCWhvdXIgPSBhdG9pKGFyZ3ZbY10pOwoJCQkJbWludXRlID0gYXRvaSgrK2NvbG9uKTsKCQkJfSBlbHNlIHVzYWdlKCk7CgkJCQkKCQkJKHZvaWQpIHRpbWUoJnRpY3MpOwoJCQl0dCA9IGxvY2FsdGltZSgmdGljcyk7CgkJCQkKCQkJbm93ID0gMzYwMCAqIHR0LT50bV9ob3VyICsgNjAgKiB0dC0+dG1fbWluOwoJCQl0aGVuID0gMzYwMCAqIGhvdXIgKyA2MCAqIG1pbnV0ZTsKCQkJdGltZW91dCA9IHRoZW4gLSBub3c7CgkJCWlmKHRpbWVvdXQgPCAwKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgXygiVGhhdCBtdXN0IGJlIHRvbW9ycm93LCAiCgkJCQkJICAgICAgICAgICJjYW4ndCB5b3Ugd2FpdCB0aWxsIHRoZW4/XG4iKSk7CgkJCQlleGl0KDEpOwoJCQl9CgkJfSBlbHNlIHsKCQkJeHN0cm5jcHkobWVzc2FnZSwgYXJndltjXSwgc2l6ZW9mKG1lc3NhZ2UpKTsKCQkJb3B0X21zZ3NldCA9IDE7CgkJfQoJfQoKCWhhbHRfYWN0aW9uWzBdID0gMDsKCgkvKiBObyBkb3VidCB3ZSBzaGFsbCB3YW50IHRvIGV4dGVuZCB0aGlzIHNvbWUgZGF5CgkgICBhbmQgcmVnaXN0ZXIgYSBzZXJpZXMgb2YgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQKCSAgIGF0IHZhcmlvdXMgcG9pbnRzIGR1cmluZyB0aGUgc2h1dGRvd24gc2VxdWVuY2UsCgkgICBhbmQgdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwLCBldGMuICovCglpZiAob3B0X3VzZV9jb25maWdfZmlsZSkgewoJCWNoYXIgbGluZVsyNTZdLCAqcDsKCQlGSUxFICpmcDsKCgkJLyogIFJlYWQgYW5kIHBhcnNlIHRoZSBjb25maWcgZmlsZSAqLwoJCWhhbHRfYWN0aW9uWzBdID0gJ1wwJzsKCQlpZiAoKGZwID0gZm9wZW4gKF9QQVRIX1NIVVRET1dOX0NPTkYsICJyIikpICE9IE5VTEwpIHsKCQkJaWYgKGZnZXRzIChsaW5lLCBzaXplb2YobGluZSksIGZwKSAhPSBOVUxMICYmCgkJCSAgICBzdHJuY2FzZWNtcCAobGluZSwgIkhBTFRfQUNUSU9OIiwgMTEpID09IDAgJiYKCQkJICAgIGlzd2hpdGVzcGFjZShsaW5lWzExXSkpIHsKCQkJCXAgPSBzdHJjaHIobGluZSwgJ1xuJyk7CgkJCQlpZiAocCkKCQkJCQkqcCA9IDA7CQkvKiBzdHJpcCBmaW5hbCAnXG4nICovCgkJCQlwID0gbGluZSsxMTsKCQkJCXdoaWxlKGlzd2hpdGVzcGFjZSgqcCkpCgkJCQkJcCsrOwoJCQkJc3RyY3B5KGhhbHRfYWN0aW9uLCBwKTsKCQkJfQoJCQlmY2xvc2UgKGZwKTsKCQl9Cgl9CgoJaWYoIW9wdF9xdWlldCAmJiAhb3B0X21zZ3NldCkgewoJCS8qIG5vdyBhc2sgZm9yIG1lc3NhZ2UsIGdldHMoKSBpcyBpbnNlY3VyZSAqLwoJCWludCBjbnQgPSBzaXplb2YobWVzc2FnZSktMTsKCQljaGFyICpwdHI7CgkJCgkJcHJpbnRmKCJXaHk/ICIpOyBmZmx1c2goc3Rkb3V0KTsKCQkKCQlwdHIgPSBtZXNzYWdlOwoJCXdoaWxlKC0tY250ID49IDAgJiYgKCpwdHIgPSBnZXRjaGFyKCkpICYmICpwdHIgIT0gJ1xuJykgeyAKCQkJcHRyKys7CgkJfQoJCSpwdHIgPSAnXDAnOwoJfSBlbHNlIGlmICghb3B0X21zZ3NldCkgewoJCXN0cmNweShtZXNzYWdlLCBfKCJmb3IgbWFpbnRlbmFuY2U7IGJvdW5jZSwgYm91bmNlIikpOwoJfQoKI2lmZGVmIERFQlVHR0lORwoJcHJpbnRmKCJ0aW1lb3V0ID0gJWQsIHF1aWV0ID0gJWQsIHJlYm9vdCA9ICVkXG4iLAoJCXRpbWVvdXQsIG9wdF9xdWlldCwgb3B0X3JlYm9vdCk7CiNlbmRpZgoJCgkvKiBzbyBtdWNoIGZvciBvcHRpb24tcHJvY2Vzc2luZywgbm93IGJlZ2luIHRlcm1pbmF0aW9uLi4uICovCglpZighKHdob20gPSBnZXRsb2dpbigpKSB8fCAhKndob20pIHdob20gPSAiZ2hvc3QiOwoJaWYoc3RybGVuKHdob20pID4gNDApIHdob21bNDBdID0gMDsgLyogc2VlIHdyaXRlX3VzZXIoKSAqLwoKCXNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgUFJJT19NSU4pOwoJc2lnbmFsKFNJR0lOVCwgIGludF9oYW5kbGVyKTsKCXNpZ25hbChTSUdIVVAsICBpbnRfaGFuZGxlcik7CglzaWduYWwoU0lHUVVJVCwgaW50X2hhbmRsZXIpOwoJc2lnbmFsKFNJR1RFUk0sIGludF9oYW5kbGVyKTsKCgljaGRpcigiLyIpOwoKCWlmKHRpbWVvdXQgPiA1KjYwKSB7CgkJc2xlZXAodGltZW91dCAtIDUqNjApOwoJCXRpbWVvdXQgPSA1KjYwOwoJfQoKCQoJaWYoKGZkID0gb3BlbihfUEFUSF9OT0xPR0lOLCBPX1dST05MWXxPX0NSRUFULCAwNjQ0KSkgPj0gMCkgewoJCS8qIGtlZXAgeGdldHRleHQgaGFwcHkgYW5kIGxlYXZlIFxyXG4gb3V0c2lkZSBzdHJpbmdzICovCgkJV1JDUkxGOwoJCVdSKF8oIlRoZSBzeXN0ZW0gaXMgYmVpbmcgc2h1dCBkb3duIHdpdGhpbiA1IG1pbnV0ZXMiKSk7CgkJV1JDUkxGOwoJCXdyaXRlKGZkLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkpOwoJCVdSQ1JMRjsKCQlXUihfKCJMb2dpbiBpcyB0aGVyZWZvcmUgcHJvaGliaXRlZC4iKSk7CgkJV1JDUkxGOwoJCWNsb3NlKGZkKTsKCX0KCQoJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwoKCWlmKHRpbWVvdXQgPiAwKSB7CgkJd2FsbCgpOwoJCXNsZWVwKHRpbWVvdXQpOwoJfQoKCXRpbWVvdXQgPSAwOwoJd2FsbCgpOwoJc2xlZXAoMyk7CgoJLyogbm93IHRoZXJlJ3Mgbm8gdHVybmluZyBiYWNrLi4uICovCglzaWduYWwoU0lHSU5ULCAgU0lHX0lHTik7CgoJLyogZG8gc3lzbG9nIG1lc3NhZ2UuLi4gKi8KCW9wZW5sb2cocHJvZywgTE9HX0NPTlMsIExPR19BVVRIKTsKCWlmIChvcHRfcmVib290KQoJCXN5c2xvZyhMT0dfTk9USUNFLCBfKCJyZWJvb3RlZCBieSAlczogJXMiKSwgCgkJICAgICAgIHdob20sIG1lc3NhZ2UpOwoJZWxzZQoJCXN5c2xvZyhMT0dfTk9USUNFLCBfKCJoYWx0ZWQgYnkgJXM6ICVzIiksIAoJCSAgICAgICB3aG9tLCBtZXNzYWdlKTsKCWNsb3NlbG9nKCk7CgoJaWYob3B0X2Zhc3QpCgkJaWYoKGZkID0gb3BlbigiL2Zhc3Rib290IiwgT19XUk9OTFl8T19DUkVBVCwgMDY0NCkpID49IDApCgkJCWNsb3NlKGZkKTsKCglraWxsKDEsIFNJR1RTVFApOwkvKiB0ZWxsIGluaXQgbm90IHRvIHNwYXduIG1vcmUgZ2V0dHkncyAqLwoJd3JpdGVfd3RtcCgpOwoJaWYob3B0X3NpbmdsZSkKCQlpZigoZmQgPSBvcGVuKF9QQVRIX1NJTkdMRSwgT19DUkVBVHxPX1dST05MWSwgMDY0NCkpID49IDApCgkJCWNsb3NlKGZkKTsKCQkKCXN5bmMoKTsKCglzaWduYWwoU0lHVEVSTSwgU0lHX0lHTik7CglpZihmb3JrKCkgPiAwKSBzbGVlcCgxMDAwKTsgLyogdGhlIHBhcmVudCB3aWxsIGRpZSBzb29uLi4uICovCglzZXRwZ3JwKCk7CQkvKiBzbyB0aGUgc2hlbGwgd29udCBraWxsIHVzIGluIHRoZSBmYWxsICovCgojaWZuZGVmIERFQlVHR0lORwoJLyogYSBnZW50bGUga2lsbCBvZiBhbGwgb3RoZXIgcHJvY2Vzc2VzIGV4Y2VwdCBpbml0ICovCglraWxsX21vcnRhbHMgKFNJR1RFUk0pOwoJZm9yIChmZCA9IDA7IGZkIDwgMzsgZmQrKykgY2xvc2UgKGZkKTsKCXN0b3BfZmluYWxwcm9nICgpOwoJc2xlZXAgKDEpOyAgICAgICAgICAgICAgICAgICAgLyogIFRpbWUgZm9yIHNhdmVzIHRvIHN0YXJ0ICAgICAgICAgICAqLwoJa2lsbCAoMSwgU0lHVEVSTSk7ICAgICAgICAgICAgLyogIFRlbGwgaW5pdCB0byBraWxsIHNwYXduZWQgZ2V0dHlzICAqLwoJdXNsZWVwICgxMDAwMDApOyAgICAgICAgICAgICAgLyogIFdhaXQgZm9yIGdldHR5cyB0byBkaWUgICAgICAgICAgICAqLwoJbXlfcHV0cyAoIiIpOyAgICAgICAgICAgICAgICAgLyogIEdldCBwYXN0IHRoZSBsb2dpbiBwcm9tcHQgICAgICAgICAqLwoJc3lzdGVtICgiL3NiaW4vaW5pdGN0bCAtciIpOyAgLyogIFJvbGwgYmFjayBzZXJ2aWNlcyAgICAgICAgICAgICAgICAqLwoJc3luY3dhaXQgKDEpOwoJbXlfcHV0cyAoIlNlbmRpbmcgU0lHVEVSTSB0byBhbGwgcmVtYWluaW5nIHByb2Nlc3Nlcy4uLiIpOwoJa2lsbCAoLTEsIFNJR1RFUk0pOwoJc2xlZXAgKDIpOyAgICAgICAgICAgICAgICAgICAgLyogIERlZmF1bHQgMiwgc29tZSBwZW9wbGUgbmVlZCA1ICAgICAqLwoKCWtpbGwgKC0xLCBTSUdLSUxMKTsgICAgICAgICAgIC8qICBOb3cgdXNlIGJydXRlIGZvcmNlLi4uICAgICAgICAgICAgKi8KCgkvKiB0dXJuIG9mZiBhY2NvdW50aW5nICovCglhY2N0KE5VTEwpOwojZW5kaWYKCS8qIFJlZEhhdCBhbmQgU3VTRSBsaWtlIHRvIHJlbW92ZSAvZXRjL25vbG9naW4uCgkgICBQZXJoYXBzIHRoZSB1c3VhbCBzZXF1ZW5jZSBpcwoJICAgICAgdG91Y2ggbm9sb2dpbjsgc2h1dGRvd24gLWg7IGZpZGRsZSB3aXRoIGhhcmR3YXJlOwoJICAgICAgYm9vdDsgZmlkZGxlIHdpdGggc29mdHdhcmU7IHJtIG5vbG9naW4KCSAgIGFuZCByZW1vdmluZyBpdCBoZXJlIHdpbGwgYmUgY291bnRlcnByb2R1Y3RpdmUuCgkgICBMZXQgdXMgc2VlIHdoZXRoZXIgcGVvcGxlIGNvbXBsYWluLiAqLwoJdW5saW5rKF9QQVRIX05PTE9HSU4pOwoKCS8qICBUZWxsIGluaXQoOCkgdG8gZXhlYyBzbyB0aGF0IHRoZSBvbGQgaW5vZGUgbWF5IGJlIGZyZWVkIGNsZWFubHkgaWYKCSAgICByZXF1aXJlZC4gTmVlZCB0byBzbGVlcCBiZWZvcmUgcmVtb3VudGluZyByb290IHJlYWQtb25seSAgKi8KCWtpbGwgKDEsIFNJR1FVSVQpOwoKCXNsZWVwICgxKTsJLyogVGltZSBmb3IgcHJvY2Vzc2VzIHRvIGRpZSBhbmQgY2xvc2UgZmlsZXMgKi8KCXN5bmN3YWl0ICgyKTsKCgkvKiByZW1vdmUgc3dhcCBmaWxlcyBhbmQgcGFydGl0aW9ucyB1c2luZyBzd2Fwb2ZmICovCglzd2FwX29mZigpOwoKCS8qIHVubW91bnQgZGlza3MuLi4gKi8KCXVubW91bnRfZGlza3MoKTsKCXN5bmN3YWl0ICgxKTsKCglpZihvcHRfcmVib290KSB7CgkJbXlfcmVib290KExJTlVYX1JFQk9PVF9DTURfUkVTVEFSVCk7IC8qIFJCX0FVVE9CT09UICovCgkJbXlfcHV0cyhfKCJcbldoeSBhbSBJIHN0aWxsIGFsaXZlIGFmdGVyIHJlYm9vdD8iKSk7Cgl9IGVsc2UgewoJCW15X3B1dHMoXygiXG5Ob3cgeW91IGNhbiB0dXJuIG9mZiB0aGUgcG93ZXIuLi4iKSk7CgoJCS8qIGFsbG93IEMtQS1EIG5vdywgZmFpdGhAY3MudW5jLmVkdSwgcmUtZml4ZWQgOC1KdWwtOTYgKi8KCQlteV9yZWJvb3QoTElOVVhfUkVCT09UX0NNRF9DQURfT04pOyAvKiBSQl9FTkFCTEVfQ0FEICovCgkJc2xlZXAgKDEpOyAgLyogIFdhaXQgZm9yIGRldmljZXMgdG8gZmluaXNoIHdyaXRpbmcgdG8gbWVkaWEgICovCgkJZG9faGFsdChoYWx0X2FjdGlvbik7Cgl9CgkvKiBOT1RSRUFDSEVEICovCglleGl0KDApOyAvKiB0byBxdWlldCBnY2MgKi8KfQoKLyoqKiBlbmQgb2YgbWFpbigpICoqKi8KCnZvaWQKZG9faGFsdChjaGFyICphY3Rpb24pIHsKCWlmIChzdHJjYXNlY21wIChhY3Rpb24sICJwb3dlcl9vZmYiKSA9PSAwKSB7CgkJcHJpbnRmKF8oIkNhbGxpbmcga2VybmVsIHBvd2VyLW9mZiBmYWNpbGl0eS4uLlxuIikpOwoJCWZmbHVzaChzdGRvdXQpOwoJCW15X3JlYm9vdChMSU5VWF9SRUJPT1RfQ01EX1BPV0VSX09GRik7CgkJcHJpbnRmKF8oIkVycm9yIHBvd2VyaW5nIG9mZlx0JXNcbiIpLCBFUlJTVFJJTkcpOwoJCWZmbHVzaChzdGRvdXQpOwoJCXNsZWVwICgyKTsKCX0gZWxzZQoKCS8qIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkOyBlLmcuIE1pa2UgSmFnZGlzIHdhbnRzICIvc2Jpbi9tZHN0b3AgLWEiICovCgkvKiBNYXliZSB3ZSBzaG91bGQgYWxzbyBmb3JrIGFuZCB3YWl0ICovCglpZiAoYWN0aW9uWzBdID09ICcvJykgewoJCXByaW50ZihfKCJFeGVjdXRpbmcgdGhlIHByb2dyYW0gXCIlc1wiIC4uLlxuIiksIGFjdGlvbik7CgkJZmZsdXNoKHN0ZG91dCk7CgkJZXhlY2woYWN0aW9uLCBhY3Rpb24sIE5VTEwpOwoJCXByaW50ZihfKCJFcnJvciBleGVjdXRpbmdcdCVzXG4iKSwgRVJSU1RSSU5HKTsKCQlmZmx1c2goc3Rkb3V0KTsKCQlzbGVlcCAoMik7Cgl9CgoJbXlfcmVib290KExJTlVYX1JFQk9PVF9DTURfSEFMVCk7IC8qIFJCX0hBTFRfU1lTVEVNICovCn0KCnZvaWQKd3JpdGVfdXNlcihzdHJ1Y3QgdXRtcCAqdXQpCnsKCWludCBmZDsKCWludCBtaW51dGVzLCBob3VyczsKCWNoYXIgdGVybVs0MF0gPSB7Jy8nLCdkJywnZScsJ3YnLCcvJywwfTsKCWNoYXIgbXNnWzEwMF07CgoJbWludXRlcyA9IHRpbWVvdXQgLyA2MDsKCWhvdXJzID0gbWludXRlcyAvIDYwOwoJbWludXRlcyAlPSA2MDsKCgkodm9pZCkgc3RybmNhdCh0ZXJtLCB1dC0+dXRfbGluZSwgc2l6ZW9mKHV0LT51dF9saW5lKSk7CgoJLyogdHJ5IG5vdCB0byBnZXQgc3R1Y2sgb24gYSBtYW5nbGVkIHV0X2xpbmUgZW50cnkuLi4gKi8KCWlmKChmZCA9IG9wZW4odGVybSwgT19XUk9OTFl8T19OT05CTE9DSykpIDwgMCkKCSAgICAgICAgcmV0dXJuOwoKCW1zZ1swXSA9ICdcMDA3JzsJLyogZ2V0dGV4dCBjcmFzaGVzIG9uIFxhICovCglzcHJpbnRmKG1zZysxLCBfKCJVUkdFTlQ6IGJyb2FkY2FzdCBtZXNzYWdlIGZyb20gJXM6IiksIHdob20pOwoJV1JDUkxGOwoJV1IobXNnKTsKCVdSQ1JMRjsKCglpZiAoaG91cnMgPiAxKQoJCXNwcmludGYobXNnLCBfKCJTeXN0ZW0gZ29pbmcgZG93biBpbiAlZCBob3VycyAlZCBtaW51dGVzIiksCgkJCWhvdXJzLCBtaW51dGVzKTsKCWVsc2UgaWYgKGhvdXJzID09IDEpCgkJc3ByaW50Zihtc2csIF8oIlN5c3RlbSBnb2luZyBkb3duIGluIDEgaG91ciAlZCBtaW51dGVzIiksCgkJCW1pbnV0ZXMpOwoJZWxzZSBpZiAobWludXRlcyA+IDEpCgkJc3ByaW50Zihtc2csIF8oIlN5c3RlbSBnb2luZyBkb3duIGluICVkIG1pbnV0ZXNcbiIpLAoJCQltaW51dGVzKTsKCWVsc2UgaWYgKG1pbnV0ZXMgPT0gMSkKCQlzcHJpbnRmKG1zZywgXygiU3lzdGVtIGdvaW5nIGRvd24gaW4gMSBtaW51dGVcbiIpKTsKCWVsc2UKCQlzcHJpbnRmKG1zZywgXygiU3lzdGVtIGdvaW5nIGRvd24gSU1NRURJQVRFTFkhXG4iKSk7CgoJV1IobXNnKTsKCVdSQ1JMRjsKCglzcHJpbnRmKG1zZywgXygiXHQuLi4gJXMgLi4uXG4iKSwgbWVzc2FnZSk7CglXUihtc2cpOwoJV1JDUkxGOwoKCWNsb3NlKGZkKTsKfQoKdm9pZAp3YWxsKHZvaWQpCnsKCS8qIHdyaXRlIHRvIGFsbCB1c2VycywgdGhhdCB0aGUgc3lzdGVtIGlzIGdvaW5nIGRvd24uICovCglzdHJ1Y3QgdXRtcCAqdXQ7CgkJCgl1dG1wbmFtZShfUEFUSF9VVE1QKTsKCXNldHV0ZW50KCk7CgkKCXdoaWxlKCh1dCA9IGdldHV0ZW50KCkpKSB7CgkJaWYodXQtPnV0X3R5cGUgPT0gVVNFUl9QUk9DRVNTKQoJCQl3cml0ZV91c2VyKHV0KTsKCX0KCWVuZHV0ZW50KCk7Cn0KCnZvaWQKd3JpdGVfd3RtcCh2b2lkKQp7CgkvKiB3cml0ZSBpbiB3dG1wIHRoYXQgd2UgYXJlIGR5aW5nICovCglpbnQgZmQ7CglzdHJ1Y3QgdXRtcCB1dDsKCQoJbWVtc2V0KChjaGFyICopJnV0LCAwLCBzaXplb2YodXQpKTsKCXN0cmNweSh1dC51dF9saW5lLCAifiIpOwoJbWVtY3B5KHV0LnV0X25hbWUsICJzaHV0ZG93biIsIHNpemVvZih1dC51dF9uYW1lKSk7CgoJdGltZSgmdXQudXRfdGltZSk7Cgl1dC51dF90eXBlID0gQk9PVF9USU1FOwoJCglpZigoZmQgPSBvcGVuKF9QQVRIX1dUTVAsIE9fV1JPTkxZfE9fQVBQRU5ELCAwNjQ0KSkgPj0gMCkgewoJCXdyaXRlKGZkLCAoY2hhciAqKSZ1dCwgc2l6ZW9mKHV0KSk7CgkJY2xvc2UoZmQpOwoJfQp9Cgp2b2lkCnN3YXBfb2ZmKHZvaWQpCnsKCS8qIHN3YXBvZmYgZXNwLiBzd2FwIEZJTEVTIHNvIHRoZSB1bmRlcmx5aW5nIHBhcnRpdGlvbiBjYW4gYmUKCSAgIHVubW91bnRlZC4gSXQgeW91IGRvbid0IGhhdmUgc3dhcG9mZigxKSBvciB1c2UgbW91bnQgdG8KCSAgIGFkZCBzd2Fwc3BhY2UsIHRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnksIGJ1dCBJIGd1ZXNzIGl0CgkgICB3b24ndCBodXJ0ICovCgoJaW50IHBpZDsKCWludCByZXN1bHQ7CglpbnQgc3RhdHVzOwoKCXN5bmMoKTsKCWlmICgocGlkID0gZm9yaygpKSA8IDApIHsKCQlteV9wdXRzKF8oIkNhbm5vdCBmb3JrIGZvciBzd2Fwb2ZmLiBTaHJ1ZyEiKSk7CgkJcmV0dXJuOwoJfQoJaWYgKCFwaWQpIHsKCQlleGVjbCgiL3NiaW4vc3dhcG9mZiIsIFNXQVBPRkZfQVJHUywgTlVMTCk7CgkJZXhlY2woIi9ldGMvc3dhcG9mZiIsIFNXQVBPRkZfQVJHUywgTlVMTCk7CgkJZXhlY2woIi9iaW4vc3dhcG9mZiIsIFNXQVBPRkZfQVJHUywgTlVMTCk7CgkJZXhlY2xwKCJzd2Fwb2ZmIiwgU1dBUE9GRl9BUkdTLCBOVUxMKTsKCQlteV9wdXRzKF8oIkNhbm5vdCBleGVjIHN3YXBvZmYsICIKCQkJICAiaG9waW5nIHVtb3VudCB3aWxsIGRvIHRoZSB0cmljay4iKSk7CgkJZXhpdCgwKTsKCX0KCXdoaWxlICgocmVzdWx0ID0gd2FpdCgmc3RhdHVzKSkgIT0gLTEgJiYgcmVzdWx0ICE9IHBpZCkKCQk7Cn0KCnZvaWQKdW5tb3VudF9kaXNrcyh2b2lkKQp7CgkvKiBiZXR0ZXIgdG8gdXNlIHVtb3VudCBkaXJlY3RseSBiZWNhdXNlIGl0IG1heSBiZSBzbWFydGVyIHRoYW4gdXMgKi8KCglpbnQgcGlkOwoJaW50IHJlc3VsdDsKCWludCBzdGF0dXM7CgoJc3luYygpOwoJaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkgewoJCW15X3B1dHMoXygiQ2Fubm90IGZvcmsgZm9yIHVtb3VudCwgdHJ5aW5nIG1hbnVhbGx5LiIpKTsKCQl1bm1vdW50X2Rpc2tzX291cnNlbHZlcygpOwoJCXJldHVybjsKCX0KCWlmICghcGlkKSB7CgkJZXhlY2woX1BBVEhfVU1PVU5ULCBVTU9VTlRfQVJHUywgTlVMTCk7CgoJCS8qIG5lZWQgbXlfcHJpbnRmIGluc3RlYWQgb2YgbXlfcHV0cyBoZXJlICovCgkJZnJlb3BlbihfUEFUSF9DT05TT0xFLCAidyIsIHN0ZG91dCk7CgkJcHJpbnRmKF8oIkNhbm5vdCBleGVjICVzLCB0cnlpbmcgdW1vdW50LlxuIiksIF9QQVRIX1VNT1VOVCk7CgkJZmZsdXNoKHN0ZG91dCk7CgoJCWV4ZWNscCgidW1vdW50IiwgVU1PVU5UX0FSR1MsIE5VTEwpOwoJCW15X3B1dHMoXygiQ2Fubm90IGV4ZWMgdW1vdW50LCBnaXZpbmcgdXAgb24gdW1vdW50LiIpKTsKCQlleGl0KDApOwoJfQoJd2hpbGUgKChyZXN1bHQgPSB3YWl0KCZzdGF0dXMpKSAhPSAtMSAmJiByZXN1bHQgIT0gcGlkKQoJCTsKCW15X3B1dHMoXygiVW5tb3VudGluZyBhbnkgcmVtYWluaW5nIGZpbGVzeXN0ZW1zLi4uIikpOwoJdW5tb3VudF9kaXNrc19vdXJzZWx2ZXMoKTsKfQoKdm9pZAp1bm1vdW50X2Rpc2tzX291cnNlbHZlcyh2b2lkKQp7CgkvKiB1bm1vdW50IGFsbCBkaXNrcyAqLwoKCUZJTEUgKm10YWI7CglzdHJ1Y3QgbW50ZW50ICptbnQ7CgljaGFyICptbnRsaXN0WzEyOF07CglpbnQgaTsKCWludCBuOwoJY2hhciAqZmlsZXN5czsKCQoJc3luYygpOwoJaWYgKCEobXRhYiA9IHNldG1udGVudChfUEFUSF9NT1VOVEVELCAiciIpKSkgewoJCW15X3B1dHMoInNodXRkb3duOiBDYW5ub3Qgb3BlbiAiIF9QQVRIX01PVU5URUQgIi4iKTsKCQlyZXR1cm47Cgl9CgluID0gMDsKCXdoaWxlIChuIDwgMTAwICYmIChtbnQgPSBnZXRtbnRlbnQobXRhYikpKSB7CgkJLyoKCQkgKiBOZWlsIFBoaWxsaXBzOiB0cnlpbmcgdG8gdW5tb3VudCB0ZW1wb3JhcnkgLyBrZXJuZWwKCQkgKiBmaWxlc3lzdGVtcyBpcyBwb2ludGxlc3MgYW5kIG1heSBjYXVzZSBlcnJvciBtZXNzYWdlczsKCQkgKiAvZGV2IGNhbiBiZSBhIHJhbWZzIG1hbmFnZWQgYnkgdWRldi4KCQkgKi8KCQlpZiAoc3RyY21wKG1udC0+bW50X3R5cGUsICJkZXZmcyIpID09IDAgfHwKCQkgICAgc3RyY21wKG1udC0+bW50X3R5cGUsICJwcm9jIikgPT0gMCB8fAoJCSAgICBzdHJjbXAobW50LT5tbnRfdHlwZSwgInN5c2ZzIikgPT0gMCB8fAoJCSAgICBzdHJjbXAobW50LT5tbnRfdHlwZSwgInJhbWZzIikgPT0gMCB8fAoJCSAgICBzdHJjbXAobW50LT5tbnRfdHlwZSwgInRtcGZzIikgPT0gMCB8fAoJCSAgICBzdHJjbXAobW50LT5tbnRfdHlwZSwgImRldnB0cyIpID09IDApCgkJCWNvbnRpbnVlOwoJCW1udGxpc3RbbisrXSA9IHN0cmR1cChtbnQtPm1udF9kaXIpOwoJfQoJZW5kbW50ZW50KG10YWIpOwoKCS8qIHdlIGFyZSBjYXJlZnVsIHRvIGRvIHRoaXMgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGUgbXRhYiBmaWxlICovCgoJZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJZmlsZXN5cyA9IG1udGxpc3RbaV07CiNpZmRlZiBERUJVR0dJTkcKCQlwcmludGYoInVtb3VudCAlc1xuIiwgZmlsZXN5cyk7CiNlbHNlCgkJaWYgKHVtb3VudChtbnRsaXN0W2ldKSA8IDApCgkJCXByaW50ZihfKCJzaHV0ZG93bjogQ291bGRuJ3QgdW1vdW50ICVzOiAlc1xuIiksCgkJCSAgICAgICBmaWxlc3lzLCBFUlJTVFJJTkcpOwojZW5kaWYKCX0KfQoKc3RhdGljIHZvaWQga2lsbF9tb3J0YWxzIChpbnQgc2lnKQp7CiAgICBpbnQgbnBpZHMgPSAwOwogICAgaW50IGluZGV4ID0gMDsKICAgIGludCBwaWQ7CiAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogICAgRElSICpkcDsKICAgIHN0cnVjdCBkaXJlbnQgKmRlOwogICAgcGlkX3QgKnBpZHMgPSBOVUxMOwogICAgY2hhciBwYXRoWzI1Nl07CgogICAgaWYgKCAoIGRwID0gb3BlbmRpciAoIi9wcm9jIikgKSA9PSBOVUxMICkgcmV0dXJuOwogICAgd2hpbGUgKCAoIGRlID0gcmVhZGRpciAoZHApICkgIT0gTlVMTCApCiAgICB7CglpZiAoICFpc2RpZ2l0IChkZS0+ZF9uYW1lWzBdKSApIGNvbnRpbnVlOwoJcGlkID0gYXRvaSAoZGUtPmRfbmFtZSk7CglzcHJpbnRmIChwYXRoLCAiL3Byb2MvJWQiLCBwaWQpOwoJaWYgKHN0YXQgKHBhdGgsICZzdGF0YnVmKSAhPSAwKSBjb250aW51ZTsKCWlmIChzdGF0YnVmLnN0X3VpZCA8IDEwMCkgY29udGludWU7CglpZiAoaW5kZXggPD0gbnBpZHMpCgl7CgkgICAgcGlkcyA9IHJlYWxsb2MgKHBpZHMsIG5waWRzICsgMTYzODQpOwoJICAgIGlmIChwaWRzID09IE5VTEwpIHJldHVybjsKCSAgICBucGlkcyArPSAxNjM4NDsKCX0KCXBpZHNbaW5kZXgrK10gPSBwaWQ7CiAgICB9CiAgICBmcHV0cyAoIlNlbmRpbmcgU0lHVEVSTSB0byBtb3J0YWxzLi4uIiwgc3RkZXJyKTsKICAgIGZvciAoLS1pbmRleDsgaW5kZXggPj0gMDsgLS1pbmRleCkga2lsbCAocGlkc1tpbmRleF0sIHNpZyk7CiAgICBmcmVlIChwaWRzKTsKICAgIGNsb3NlZGlyIChkcCk7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIGtpbGxfbW9ydGFscyAgKi8KCnN0YXRpYyB2b2lkIHN0b3BfZmluYWxwcm9nICh2b2lkKQp7CiAgICBjaGFyICpwMSwgKnAyOwogICAgRklMRSAqZnA7CiAgICBjaGFyIGxpbmVbMjU2XTsKCiAgICBpZiAoICggZnAgPSBmb3BlbiAoX1BBVEhfSU5JVFRBQiwgInIiKSApID09IE5VTEwgKSByZXR1cm47CiAgICB3aGlsZSAoZmdldHMgKGxpbmUsIDI1NiwgZnApICE9IE5VTEwpCiAgICB7CglwaWRfdCBwaWQ7CgoJbGluZVtzdHJsZW4gKGxpbmUpIC0gMV0gPSAnXDAnOwoJcDEgPSBsaW5lOwoJd2hpbGUgKCBpc3NwYWNlICgqcDEpICkgKytwMTsKCWlmIChzdHJuY21wIChwMSwgImZpbmFscHJvZyIsIDkpICE9IDApIGNvbnRpbnVlOwoJaWYgKCAoIHAxID0gc3RyY2hyIChwMSArIDksICc9JykgKSA9PSBOVUxMICkgY29udGludWU7Cglmb3IgKCsrcDE7IGlzc3BhY2UgKCpwMSk7ICsrcDEpOwoJaWYgKCpwMSA9PSAnXDAnKSBjb250aW51ZTsKCWZvciAocDIgPSBwMTsgIWlzc3BhY2UgKCpwMik7ICsrcDIpOwoJKnAyID0gJ1wwJzsKCXN3aXRjaCAoIHBpZCA9IGZvcmsgKCkgKQoJewoJICBjYXNlIDA6ICAgLyogIENoaWxkICAgKi8KCSAgICBleGVjbCAocDEsIHAxLCAic3RvcCIsIE5VTEwpOwoJICAgIGJyZWFrOwoJICBjYXNlIC0xOiAgLyogIEVycm9yICAgKi8KCSAgICBicmVhazsKCSAgZGVmYXVsdDogIC8qICBQYXJlbnQgICovCgkgICAgd2FpdHBpZCAocGlkLCBOVUxMLCAwKTsKCSAgICBicmVhazsKCX0KCWZjbG9zZSAoZnApOwoJcmV0dXJuOwogICAgfQogICAgZmNsb3NlIChmcCk7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHN0b3BfZmluYWxwcm9nICAqLwoKc3RhdGljIHZvaWQgc3luY3dhaXQgKGludCB0aW1ldmFsKQp7CiAgICBzdGF0aWMgaW50IGRvX3dhaXQgPSAwOwogICAgc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKCiAgICBzeW5jICgpOwogICAgLyogIEtlcm5lbCB2ZXJzaW9uIDEuMy4yMCBhbmQgYWZ0ZXIgYXJlIHN1cHBvc2VkIHRvIHdhaXQgYXV0b21hdGljYWxseSAgKi8KICAgIGlmIChmaXJzdF90aW1lKQogICAgewoJc3RydWN0IHV0c25hbWUgdXRzOwoKCWZpcnN0X3RpbWUgPSAwOwoJdW5hbWUgKCZ1dHMpOwoJaWYgKHV0cy5yZWxlYXNlWzBdIDwgJzInKSBkb193YWl0ID0gMTsKICAgIH0KICAgIGlmIChkb193YWl0KSBzbGVlcCAodGltZXZhbCk7Cn0gICAvKiAgRW5kIEZ1bmN0aW9uIHN5bmN3YWl0ICAqLwo=