LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKCiNpbmNsdWRlICJkb3MuaCIKI2luY2x1ZGUgImZkb3MuaCIKCnN0YXRpYyBpbnQgY2FjaGVfc2VjdDsKc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FjaGUgW1NaX1NURF9TRUNUT1JdOwoKCiNkZWZpbmUgbWluKHgseSkgKCh4KTwoeSk/KHgpOih5KSkKCnN0YXRpYyBpbnQgZGVzY2VuZCAoU2xvdF90ICpwYXJlbnQsCgkgICAgIEZzX3QgKmZzLAoJCSAgICBjaGFyICpwYXRoKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogaW5pdF9zdWJkaXIgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZCBpbml0X3N1YmRpciAodm9pZCkKewogICAgY2FjaGVfc2VjdCA9IC0xOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogYmFzZW5hbWUgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KY2hhciAqYmFzZW5hbWUgKGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGNoYXIgKmNwdHI7CgogICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkgewoJcmV0dXJuICgiIik7CiAgICB9CgogICAgZm9yIChjcHRyPSBuYW1lOyAqY3B0cisrOyApOwogICAgd2hpbGUgKC0tY3B0ciA+PSBuYW1lKSB7CglpZiAoKmNwdHIgPT0gJy8nKSAgICB7CgkgICAgcmV0dXJuIChjcHRyICsgMSk7Cgl9CiAgICB9CiAgICByZXR1cm4obmFtZSk7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiByb290X21hcCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IHJvb3RfbWFwIChGc190ICpmcywgU2xvdF90ICpmaWxlLCBpbnQgd2hlcmUsIGludCAqbGVuKQp7CiAgICAqbGVuID0gbWluICgqbGVuLCBmcyAtPiBkaXJfbGVuICogU1pfU1REX1NFQ1RPUiAtIHdoZXJlKTsKICAgIGlmICgqbGVuIDwgMCApIHsKCSpsZW4gPSAwOwoJcmV0dXJuICgtMSk7CiAgICB9CiAgICByZXR1cm4gZnMgLT4gZGlyX3N0YXJ0ICogU1pfU1REX1NFQ1RPUiArIHdoZXJlOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogbm9ybWFsX21hcCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IG5vcm1hbF9tYXAgKEZzX3QgKmZzLCBTbG90X3QgKmZpbGUsIGludCB3aGVyZSwgaW50ICpsZW4pCnsKICAgIGludCBvZmZzZXQ7CiAgICBpbnQgTnJDbHU7CiAgICB1bnNpZ25lZCBzaG9ydCBSZWxDbHVOcjsKICAgIHVuc2lnbmVkIHNob3J0IEN1ckNsdU5yOwogICAgdW5zaWduZWQgc2hvcnQgTmV3Q2x1TnI7CiAgICB1bnNpZ25lZCBzaG9ydCBBYnNDbHVOcjsKICAgIGludCBjbHVzX3NpemU7CgogICAgY2x1c19zaXplID0gZnMgLT4gY2x1c3Rlcl9zaXplICogU1pfU1REX1NFQ1RPUjsKICAgIG9mZnNldCA9IHdoZXJlICUgY2x1c19zaXplOwoKICAgICpsZW4gPSBtaW4gKCpsZW4sIGZpbGUgLT4gRmlsZVNpemUgLSB3aGVyZSk7CgogICAgaWYgKCpsZW4gPCAwICkgewoJKmxlbiA9IDA7CglyZXR1cm4gKDApOwogICAgfQoKICAgIGlmIChmaWxlIC0+IEZpcnN0QWJzQ2x1TnIgPCAyKXsKCSpsZW4gPSAwOwoJcmV0dXJuICgwKTsKICAgIH0KCiAgICBSZWxDbHVOciA9IHdoZXJlIC8gY2x1c19zaXplOwoKICAgIGlmIChSZWxDbHVOciA+PSBmaWxlIC0+IFByZXZpb3VzUmVsQ2x1TnIpewoJQ3VyQ2x1TnIgPSBmaWxlIC0+IFByZXZpb3VzUmVsQ2x1TnI7CglBYnNDbHVOciA9IGZpbGUgLT4gUHJldmlvdXNBYnNDbHVOcjsKICAgIH0gZWxzZSB7CglDdXJDbHVOciA9IDA7CglBYnNDbHVOciA9IGZpbGUgLT4gRmlyc3RBYnNDbHVOcjsKICAgIH0KCgogICAgTnJDbHUgPSAob2Zmc2V0ICsgKmxlbiAtIDEpIC8gY2x1c19zaXplOwogICAgd2hpbGUgKEN1ckNsdU5yIDw9IFJlbENsdU5yICsgTnJDbHUpIHsKCWlmIChDdXJDbHVOciA9PSBSZWxDbHVOcil7CgkgICAgLyogd2UgaGF2ZSByZWFjaGVkIHRoZSBiZWdpbm5pbmcgb2Ygb3VyIHpvbmUuIFNhdmUKCSAgICAgKiBjb29yZGluYXRlcyAqLwoJICAgIGZpbGUgLT4gUHJldmlvdXNSZWxDbHVOciA9IFJlbENsdU5yOwoJICAgIGZpbGUgLT4gUHJldmlvdXNBYnNDbHVOciA9IEFic0NsdU5yOwoJfQoJTmV3Q2x1TnIgPSBmYXRfZGVjb2RlIChmcywgQWJzQ2x1TnIpOwoJaWYgKE5ld0NsdU5yID09IDEgfHwgTmV3Q2x1TnIgPT0gMCkgewoJICAgIFBSSU5URigiRmF0IHByb2JsZW0gd2hpbGUgZGVjb2RpbmcgJWQgJXhcbiIsCgkJICAgIEFic0NsdU5yLCBOZXdDbHVOcik7CgkgICAgcmV0dXJuICgtMSk7Cgl9CglpZiAoQ3VyQ2x1TnIgPT0gUmVsQ2x1TnIgKyBOckNsdSkgewoJICAgIGJyZWFrOwoJfQoKCWlmIChDdXJDbHVOciA8IFJlbENsdU5yICYmIE5ld0NsdU5yID09IEZBVDEyX0VORCkgewoJICAgICpsZW4gPSAwOwoJICAgIHJldHVybiAwOwoJfQoKCWlmIChDdXJDbHVOciA+PSBSZWxDbHVOciAmJiBOZXdDbHVOciAhPSBBYnNDbHVOciArIDEpCgkgICAgYnJlYWs7CglDdXJDbHVOcisrOwoJQWJzQ2x1TnIgPSBOZXdDbHVOcjsKICAgIH0KCiAgICAqbGVuID0gbWluICgqbGVuLCAoMSArIEN1ckNsdU5yIC0gUmVsQ2x1TnIpICogY2x1c19zaXplIC0gb2Zmc2V0KTsKCiAgICByZXR1cm4gKCgoZmlsZSAtPiBQcmV2aW91c0Fic0NsdU5yIC0gMikgKiBmcyAtPiBjbHVzdGVyX3NpemUgKwoJICAgICBmcyAtPiBkaXJfc3RhcnQgKyBmcyAtPiBkaXJfbGVuKSAqCgkgICAgU1pfU1REX1NFQ1RPUiArIG9mZnNldCk7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBvcGVuX3N1YmRpciAtLSBvcGVuIHRoZSBzdWJkaXIgY29udGFpbmluZyB0aGUgZmlsZQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgb3Blbl9zdWJkaXIgKEZpbGVfdCAqZGVzYykKewogICAgY2hhciAqcGF0aG5hbWU7CiAgICBjaGFyICp0bXAsICpzLCAqcGF0aDsKICAgIGNoYXIgdGVybWluYXRvcjsKCiAgICBpZiAoKHBhdGhuYW1lID0gKGNoYXIgKiltYWxsb2MgKE1BWF9QQVRIKSkgPT0gTlVMTCkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgc3RyY3B5IChwYXRobmFtZSwgZGVzYyAtPiBuYW1lKTsKCiAgICAvKiBTdXBwcmVzcyBmaWxlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHRtcCA9IGJhc2VuYW1lIChwYXRobmFtZSk7CiAgICAqdG1wID0gJ1wwJzsKCiAgICAvKiByb290IGRpcmVjdG9yeSAgaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGRlc2MgLT4gc3ViZGlyLkZpcnN0QWJzQ2x1TnIgPSAwOwogICAgZGVzYyAtPiBzdWJkaXIuRmlsZVNpemUgPSAtMTsKICAgIGRlc2MgLT4gc3ViZGlyLm1hcCA9IHJvb3RfbWFwOwogICAgZGVzYyAtPiBzdWJkaXIuZGlyLmF0dHIgPSBBVFRSX0RJUkVDVE9SWTsKCiAgICB0bXAgPSBwYXRobmFtZTsKICAgIGZvciAocyA9IHRtcDsgOyArK3MpIHsKCWlmICgqcyA9PSAnLycgfHwgKnMgPT0gJ1wwJykgewoJICAgIHBhdGggPSB0bXA7CgkgICAgdGVybWluYXRvciA9ICpzOwoJICAgICpzID0gJ1wwJzsKCSAgICBpZiAocyAhPSB0bXAgJiYgc3RyY21wIChwYXRoLCIuIikpIHsKCQlpZiAoZGVzY2VuZCAoJmRlc2MgLT4gc3ViZGlyLCBkZXNjIC0+IGZzLCBwYXRoKSA8IDApIHsKCQkgICAgZnJlZSAocGF0aG5hbWUpOwoJCSAgICByZXR1cm4gKC0xKTsKCQl9CgkgICAgfQoJICAgIGlmICh0ZXJtaW5hdG9yID09IDApIHsKCQlicmVhazsKCSAgICB9CgkgICAgdG1wID0gcyArIDE7Cgl9CiAgICB9CiAgICBmcmVlIChwYXRobmFtZSk7CiAgICByZXR1cm4gKDApOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZGVzY2VuZCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IGRlc2NlbmQgKFNsb3RfdCAqcGFyZW50LAoJICAgICBGc190ICpmcywKCSAgICAgY2hhciAqcGF0aCkKewogICAgaW50IGVudHJ5OwogICAgU2xvdF90IFN1YkRpcjsKCiAgICBpZihwYXRoWzBdID09ICdcMCcgfHwgc3RyY21wIChwYXRoLCAiLiIpID09IDApIHsKCXJldHVybiAoMCk7CiAgICB9CgoKICAgIGVudHJ5ID0gMDsKICAgIGlmICh2ZmF0X2xvb2t1cCAocGFyZW50LAoJCSAgICAgZnMsCgkJICAgICAmKFN1YkRpci5kaXIpLAoJCSAgICAgJmVudHJ5LAoJCSAgICAgMCwKCQkgICAgIHBhdGgsCgkJICAgICBBQ0NFUFRfRElSIHwgU0lOR0xFIHwgRE9fT1BFTiwKCQkgICAgIDAsCgkJICAgICAmU3ViRGlyKSA9PSAwKSB7CgkqcGFyZW50ID0gU3ViRGlyOwoJcmV0dXJuICgwKTsKICAgIH0KCiAgICBpZiAoc3RyY21wKHBhdGgsICIuLiIpID09IDApIHsKCXBhcmVudCAtPiBGaWxlU2l6ZSA9IC0xOwoJcGFyZW50IC0+IEZpcnN0QWJzQ2x1TnIgPSAwOwoJcGFyZW50IC0+IG1hcCA9IHJvb3RfbWFwOwoJcmV0dXJuICgwKTsKICAgIH0KICAgIHJldHVybiAoLTEpOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb3Blbl9maWxlIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBvcGVuX2ZpbGUgKFNsb3RfdCAqZmlsZSwgRGlyZWN0b3J5X3QgKmRpcikKewogICAgaW50IGZpcnN0OwogICAgdW5zaWduZWQgbG9uZyBzaXplOwoKICAgIGZpcnN0ID0gX19sZTE2X3RvX2NwdSAoZGlyIC0+IHN0YXJ0KTsKCiAgICBpZihmaXJzdCA9PSAwICYmCiAgICAgICAoZGlyIC0+IGF0dHIgJiBBVFRSX0RJUkVDVE9SWSkgIT0gMCkgewoJZmlsZSAtPiBGaXJzdEFic0NsdU5yID0gMDsKCWZpbGUgLT4gRmlsZVNpemUgPSAtMTsKCWZpbGUgLT4gbWFwID0gcm9vdF9tYXA7CglyZXR1cm4gKDApOwogICAgfQoKICAgIGlmICgoZGlyIC0+IGF0dHIgJiBBVFRSX0RJUkVDVE9SWSkgIT0gMCkgewoJc2l6ZSA9ICgxVUwgPDwgMzEpIC0gMTsKICAgIH0KICAgIGVsc2UgewoJc2l6ZSA9IF9fbGUzMl90b19jcHUgKGRpciAtPiBzaXplKTsKICAgIH0KCiAgICBmaWxlIC0+IG1hcCA9IG5vcm1hbF9tYXA7CiAgICBmaWxlIC0+IEZpcnN0QWJzQ2x1TnIgPSBmaXJzdDsKICAgIGZpbGUgLT4gUHJldmlvdXNSZWxDbHVOciA9IDB4ZmZmZjsKICAgIGZpbGUgLT4gRmlsZVNpemUgPSBzaXplOwogICAgcmV0dXJuICgwKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHJlYWRfZmlsZSAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgcmVhZF9maWxlIChGc190ICpmcywKCSAgICAgICBTbG90X3QgKmZpbGUsCgkgICAgICAgY2hhciAqYnVmLAoJICAgICAgIGludCB3aGVyZSwKCSAgICAgICBpbnQgbGVuKQp7CiAgICBpbnQgcG9zOwogICAgaW50IHJlYWQsIG5iLCBzZWN0LCBvZmZzZXQ7CgogICAgcG9zID0gZmlsZSAtPiBtYXAgKGZzLCBmaWxlLCB3aGVyZSwgJmxlbik7CiAgICBpZiAgKHBvcyA8IDApIHsKCXJldHVybiAtMTsKICAgIH0KICAgIGlmIChsZW4gPT0gMCkgewoJcmV0dXJuICgwKTsKICAgIH0KCiAgICAvKiBDb21wdXRlIHNlY3RvciBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHNlY3QgPSBwb3MgLyBTWl9TVERfU0VDVE9SOwogICAgb2Zmc2V0ID0gcG9zICUgU1pfU1REX1NFQ1RPUjsKICAgIHJlYWQgPSAwOwoKICAgIGlmIChvZmZzZXQpIHsKCS8qIFJlYWQgZG9lc24ndCBzdGFydCBhdCB0aGUgc2VjdG9yIGJlZ2lubmluZy4gV2UgbmVlZCB0byB1c2Ugb3VyICAgICovCgkvKiBjYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJaWYgKHNlY3QgIT0gY2FjaGVfc2VjdCkgewoJICAgIGlmIChkZXZfcmVhZCAoY2FjaGUsIHNlY3QsIDEpIDwgMCkgewoJCXJldHVybiAoLTEpOwoJICAgIH0KCSAgICBjYWNoZV9zZWN0ID0gc2VjdDsKCX0KCW5iID0gbWluIChsZW4sIFNaX1NURF9TRUNUT1IgLSBvZmZzZXQpOwoKCW1lbWNweSAoYnVmLCBjYWNoZSArIG9mZnNldCwgbmIpOwoJcmVhZCArPSBuYjsKCWxlbiAtPSBuYjsKCXNlY3QgKz0gMTsKICAgIH0KCiAgICBpZiAobGVuID4gU1pfU1REX1NFQ1RPUikgewoJbmIgPSAobGVuIC0gMSkgLyBTWl9TVERfU0VDVE9SOwoJaWYgKGRldl9yZWFkIChidWYgKyByZWFkLCBzZWN0LCBuYikgPCAwKSB7CgkgICAgcmV0dXJuICgocmVhZCkgPyByZWFkIDogLTEpOwoJfQoJLyogdXBkYXRlIHNlY3RvciBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCXNlY3QgKz0gbmI7CgoJLyogVXBkYXRlIGJ5dGUgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCW5iICo9IFNaX1NURF9TRUNUT1I7CglyZWFkICs9IG5iOwoJbGVuIC09IG5iOwogICAgfQoKICAgIGlmIChsZW4pIHsKCWlmIChzZWN0ICE9IGNhY2hlX3NlY3QpIHsKCSAgICBpZiAoZGV2X3JlYWQgKGNhY2hlLCBzZWN0LCAxKSA8IDApIHsKCQlyZXR1cm4gKChyZWFkKSA/IHJlYWQgOiAtMSk7CgkJY2FjaGVfc2VjdCA9IC0xOwoJICAgIH0KCSAgICBjYWNoZV9zZWN0ID0gc2VjdDsKCX0KCgltZW1jcHkgKGJ1ZiArIHJlYWQsIGNhY2hlLCBsZW4pOwoJcmVhZCArPSBsZW47CiAgICB9CiAgICByZXR1cm4gKHJlYWQpOwp9CiNlbmRpZgo=