LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qCiAqIERvcyBmbG9wcHkgc3VwcG9ydAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8ZmRjLmg+CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvX2Zkb3Nib290IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zYm9vdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgY2hhciAqbmFtZTsKICAgIGNoYXIgKmVwOwogICAgaW50IHNpemU7CiAgICBpbnQgcmNvZGUgPSAwOwogICAgY2hhciBidWYgWzEyXTsKICAgIGludCBkcml2ZSA9IENGR19GRENfRFJJVkVfTlVNQkVSOwoKICAgIC8qIHByZS1zZXQgbG9hZF9hZGRyICovCiAgICBpZiAoKGVwID0gZ2V0ZW52KCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7Cglsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChlcCwgTlVMTCwgMTYpOwogICAgfQoKICAgIC8qIHByZS1zZXQgQm9vdCBmaWxlIG5hbWUgKi8KICAgIGlmICgobmFtZSA9IGdldGVudigiYm9vdGZpbGUiKSkgPT0gTlVMTCkgewoJbmFtZSA9ICJ1SW1hZ2UiOwogICAgfQoKICAgIHN3aXRjaCAoYXJnYykgewogICAgY2FzZSAxOgoJYnJlYWs7CiAgICBjYXNlIDI6CgkvKiBvbmx5IG9uZSBhcmcgLSBhY2NlcHQgdHdvIGZvcm1zOgoJICoganVzdCBsb2FkIGFkZHJlc3MsIG9yIGp1c3QgYm9vdCBmaWxlIG5hbWUuCgkgKiBUaGUgbGF0dGVyIGZvcm0gbXVzdCBiZSB3cml0dGVuICJmaWxlbmFtZSIgaGVyZS4KCSAqLwoJaWYgKGFyZ3ZbMV1bMF0gPT0gJyInKSB7CS8qIGp1c3QgYm9vdCBmaWxlbmFtZSAqLwoJICAgIG5hbWUgPSBhcmd2IFsxXTsKCX0gZWxzZSB7CQkJLyogbG9hZCBhZGRyZXNzCSovCgkgICAgbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOwoJfQoJYnJlYWs7CiAgICBjYXNlIDM6Cglsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CgluYW1lID0gYXJndiBbMl07CglicmVhazsKICAgIGRlZmF1bHQ6CglwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwoJYnJlYWs7CiAgICB9CgogICAgLyogSW5pdCBwaHlzaWNhbCBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoIWZkY19mZG9zX2luaXQgKGRyaXZlKSkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgLyogT3BlbiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoZG9zX29wZW4gKG5hbWUpIDwgMCkgewoJcHJpbnRmICgiVW5hYmxlIHRvIG9wZW4gJXNcbiIsIG5hbWUpOwoJcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoKHNpemUgPSBkb3NfcmVhZCAobG9hZF9hZGRyKSkgPCAwKSB7CglwcmludGYgKCJib290IGVycm9yXG4iKTsKCXJldHVybiAxOwogICAgfQogICAgZmx1c2hfY2FjaGUgKGxvYWRfYWRkciwgc2l6ZSk7CgogICAgc3ByaW50ZihidWYsICIleCIsIHNpemUpOwogICAgc2V0ZW52KCJmaWxlc2l6ZSIsIGJ1Zik7CgogICAgcHJpbnRmKCJGbG9wcHkgRE9TIGxvYWQgY29tcGxldGU6ICVkIGJ5dGVzIGxvYWRlZCB0byAweCVseFxuIiwKCSAgIHNpemUsIGxvYWRfYWRkcik7CgogICAgLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgYW4gYXV0by1zdGFydCAqLwogICAgaWYgKCgoZXAgPSBnZXRlbnYoImF1dG9zdGFydCIpKSAhPSBOVUxMKSAmJiAoc3RyY21wKGVwLCJ5ZXMiKSA9PSAwKSkgewoJY2hhciAqbG9jYWxfYXJnc1syXTsKCWV4dGVybiBpbnQgZG9fYm9vdG0gKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwoJbG9jYWxfYXJnc1swXSA9IGFyZ3ZbMF07Cglsb2NhbF9hcmdzWzFdID0gTlVMTDsKCXByaW50ZiAoIkF1dG9tYXRpYyBib290IG9mIGltYWdlIGF0IGFkZHIgMHglMDhsWCAuLi5cbiIsIGxvYWRfYWRkcik7CglyY29kZSA9IGRvX2Jvb3RtIChjbWR0cCwgMCwgMSwgbG9jYWxfYXJncyk7CiAgICB9CiAgICByZXR1cm4gcmNvZGU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZG9fZmRvc2xzIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zbHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGNoYXIgKnBhdGggPSAiIjsKICAgIGludCBkcml2ZSA9IENGR19GRENfRFJJVkVfTlVNQkVSOwoKICAgIHN3aXRjaCAoYXJnYykgewogICAgY2FzZSAxOgoJYnJlYWs7CiAgICBjYXNlIDI6CglwYXRoID0gYXJndiBbMV07CglicmVhazsKICAgIH0KCiAgICAvKiBJbml0IHBoeXNpY2FsIGxheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmICghZmRjX2Zkb3NfaW5pdCAoZHJpdmUpKSB7CglyZXR1cm4gKC0xKTsKICAgIH0KICAgIC8qIE9wZW4gZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKGRvc19vcGVuIChwYXRoKSA8IDApIHsKCXByaW50ZiAoIlVuYWJsZSB0byBvcGVuICVzXG4iLCBwYXRoKTsKCXJldHVybiAxOwogICAgfQogICAgcmV0dXJuIChkb3NfZGlyICgpKTsKfQoKVV9CT09UX0NNRCgKCWZkb3Nib290LAkzLAkwLAlkb19mZG9zYm9vdCwKCSJmZG9zYm9vdC0gYm9vdCBmcm9tIGEgZG9zIGZsb3BweSBmaWxlXG4iLAoJIltsb2FkQWRkcl0gW2ZpbGVuYW1lXVxuIgopOwoKVV9CT09UX0NNRCgKCWZkb3NscywJMiwJMCwJZG9fZmRvc2xzLAoJImZkb3NscyAgLSBsaXN0IGZpbGVzIGluIGEgZGlyZWN0b3J5XG4iLAoJIltkaXJlY3RvcnldXG4iCik7Cg==