LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CgojaW5jbHVkZSAiZG9zLmgiCiNpbmNsdWRlICJmZG9zLmgiCgpzdGF0aWMgaW50IGNhY2hlX3NlY3Q7CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhY2hlIFtTWl9TVERfU0VDVE9SXTsKCgojZGVmaW5lIG1pbih4LHkpICgoeCk8KHkpPyh4KTooeSkpCgpzdGF0aWMgaW50IGRlc2NlbmQgKFNsb3RfdCAqcGFyZW50LAoJICAgICBGc190ICpmcywKCQkgICAgY2hhciAqcGF0aCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGluaXRfc3ViZGlyIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnZvaWQgaW5pdF9zdWJkaXIgKHZvaWQpCnsKICAgIGNhY2hlX3NlY3QgPSAtMTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGJhc2VuYW1lIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmNoYXIgKmJhc2VuYW1lIChjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBjaGFyICpjcHRyOwoKICAgIGlmICghbmFtZSB8fCAhKm5hbWUpIHsKCXJldHVybiAoIiIpOwogICAgfQoKICAgIGZvciAoY3B0cj0gbmFtZTsgKmNwdHIrKzsgKTsKICAgIHdoaWxlICgtLWNwdHIgPj0gbmFtZSkgewoJaWYgKCpjcHRyID09ICcvJykgICAgewoJICAgIHJldHVybiAoY3B0ciArIDEpOwoJfQogICAgfQogICAgcmV0dXJuKG5hbWUpOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcm9vdF9tYXAgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCByb290X21hcCAoRnNfdCAqZnMsIFNsb3RfdCAqZmlsZSwgaW50IHdoZXJlLCBpbnQgKmxlbikKewogICAgKmxlbiA9IG1pbiAoKmxlbiwgZnMgLT4gZGlyX2xlbiAqIFNaX1NURF9TRUNUT1IgLSB3aGVyZSk7CiAgICBpZiAoKmxlbiA8IDAgKSB7CgkqbGVuID0gMDsKCXJldHVybiAoLTEpOwogICAgfQogICAgcmV0dXJuIGZzIC0+IGRpcl9zdGFydCAqIFNaX1NURF9TRUNUT1IgKyB3aGVyZTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG5vcm1hbF9tYXAgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBub3JtYWxfbWFwIChGc190ICpmcywgU2xvdF90ICpmaWxlLCBpbnQgd2hlcmUsIGludCAqbGVuKQp7CiAgICBpbnQgb2Zmc2V0OwogICAgaW50IE5yQ2x1OwogICAgdW5zaWduZWQgc2hvcnQgUmVsQ2x1TnI7CiAgICB1bnNpZ25lZCBzaG9ydCBDdXJDbHVOcjsKICAgIHVuc2lnbmVkIHNob3J0IE5ld0NsdU5yOwogICAgdW5zaWduZWQgc2hvcnQgQWJzQ2x1TnI7CiAgICBpbnQgY2x1c19zaXplOwoKICAgIGNsdXNfc2l6ZSA9IGZzIC0+IGNsdXN0ZXJfc2l6ZSAqIFNaX1NURF9TRUNUT1I7CiAgICBvZmZzZXQgPSB3aGVyZSAlIGNsdXNfc2l6ZTsKCiAgICAqbGVuID0gbWluICgqbGVuLCBmaWxlIC0+IEZpbGVTaXplIC0gd2hlcmUpOwoKICAgIGlmICgqbGVuIDwgMCApIHsKCSpsZW4gPSAwOwoJcmV0dXJuICgwKTsKICAgIH0KCiAgICBpZiAoZmlsZSAtPiBGaXJzdEFic0NsdU5yIDwgMil7CgkqbGVuID0gMDsKCXJldHVybiAoMCk7CiAgICB9CgogICAgUmVsQ2x1TnIgPSB3aGVyZSAvIGNsdXNfc2l6ZTsKCiAgICBpZiAoUmVsQ2x1TnIgPj0gZmlsZSAtPiBQcmV2aW91c1JlbENsdU5yKXsKCUN1ckNsdU5yID0gZmlsZSAtPiBQcmV2aW91c1JlbENsdU5yOwoJQWJzQ2x1TnIgPSBmaWxlIC0+IFByZXZpb3VzQWJzQ2x1TnI7CiAgICB9IGVsc2UgewoJQ3VyQ2x1TnIgPSAwOwoJQWJzQ2x1TnIgPSBmaWxlIC0+IEZpcnN0QWJzQ2x1TnI7CiAgICB9CgoKICAgIE5yQ2x1ID0gKG9mZnNldCArICpsZW4gLSAxKSAvIGNsdXNfc2l6ZTsKICAgIHdoaWxlIChDdXJDbHVOciA8PSBSZWxDbHVOciArIE5yQ2x1KSB7CglpZiAoQ3VyQ2x1TnIgPT0gUmVsQ2x1TnIpewoJICAgIC8qIHdlIGhhdmUgcmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIG91ciB6b25lLiBTYXZlCgkgICAgICogY29vcmRpbmF0ZXMgKi8KCSAgICBmaWxlIC0+IFByZXZpb3VzUmVsQ2x1TnIgPSBSZWxDbHVOcjsKCSAgICBmaWxlIC0+IFByZXZpb3VzQWJzQ2x1TnIgPSBBYnNDbHVOcjsKCX0KCU5ld0NsdU5yID0gZmF0X2RlY29kZSAoZnMsIEFic0NsdU5yKTsKCWlmIChOZXdDbHVOciA9PSAxIHx8IE5ld0NsdU5yID09IDApIHsKCSAgICBQUklOVEYoIkZhdCBwcm9ibGVtIHdoaWxlIGRlY29kaW5nICVkICV4XG4iLAoJCSAgICBBYnNDbHVOciwgTmV3Q2x1TnIpOwoJICAgIHJldHVybiAoLTEpOwoJfQoJaWYgKEN1ckNsdU5yID09IFJlbENsdU5yICsgTnJDbHUpIHsKCSAgICBicmVhazsKCX0KCglpZiAoQ3VyQ2x1TnIgPCBSZWxDbHVOciAmJiBOZXdDbHVOciA9PSBGQVQxMl9FTkQpIHsKCSAgICAqbGVuID0gMDsKCSAgICByZXR1cm4gMDsKCX0KCglpZiAoQ3VyQ2x1TnIgPj0gUmVsQ2x1TnIgJiYgTmV3Q2x1TnIgIT0gQWJzQ2x1TnIgKyAxKQoJICAgIGJyZWFrOwoJQ3VyQ2x1TnIrKzsKCUFic0NsdU5yID0gTmV3Q2x1TnI7CiAgICB9CgogICAgKmxlbiA9IG1pbiAoKmxlbiwgKDEgKyBDdXJDbHVOciAtIFJlbENsdU5yKSAqIGNsdXNfc2l6ZSAtIG9mZnNldCk7CgogICAgcmV0dXJuICgoKGZpbGUgLT4gUHJldmlvdXNBYnNDbHVOciAtIDIpICogZnMgLT4gY2x1c3Rlcl9zaXplICsKCSAgICAgZnMgLT4gZGlyX3N0YXJ0ICsgZnMgLT4gZGlyX2xlbikgKgoJICAgIFNaX1NURF9TRUNUT1IgKyBvZmZzZXQpOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogb3Blbl9zdWJkaXIgLS0gb3BlbiB0aGUgc3ViZGlyIGNvbnRhaW5pbmcgdGhlIGZpbGUKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IG9wZW5fc3ViZGlyIChGaWxlX3QgKmRlc2MpCnsKICAgIGNoYXIgKnBhdGhuYW1lOwogICAgY2hhciAqdG1wLCAqcywgKnBhdGg7CiAgICBjaGFyIHRlcm1pbmF0b3I7CgogICAgaWYgKChwYXRobmFtZSA9IChjaGFyICopbWFsbG9jIChNQVhfUEFUSCkpID09IE5VTEwpIHsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIHN0cmNweSAocGF0aG5hbWUsIGRlc2MgLT4gbmFtZSk7CgogICAgLyogU3VwcHJlc3MgZmlsZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB0bXAgPSBiYXNlbmFtZSAocGF0aG5hbWUpOwogICAgKnRtcCA9ICdcMCc7CgogICAgLyogcm9vdCBkaXJlY3RvcnkgIGluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBkZXNjIC0+IHN1YmRpci5GaXJzdEFic0NsdU5yID0gMDsKICAgIGRlc2MgLT4gc3ViZGlyLkZpbGVTaXplID0gLTE7CiAgICBkZXNjIC0+IHN1YmRpci5tYXAgPSByb290X21hcDsKICAgIGRlc2MgLT4gc3ViZGlyLmRpci5hdHRyID0gQVRUUl9ESVJFQ1RPUlk7CgogICAgdG1wID0gcGF0aG5hbWU7CiAgICBmb3IgKHMgPSB0bXA7IDsgKytzKSB7CglpZiAoKnMgPT0gJy8nIHx8ICpzID09ICdcMCcpIHsKCSAgICBwYXRoID0gdG1wOwoJICAgIHRlcm1pbmF0b3IgPSAqczsKCSAgICAqcyA9ICdcMCc7CgkgICAgaWYgKHMgIT0gdG1wICYmIHN0cmNtcCAocGF0aCwiLiIpKSB7CgkJaWYgKGRlc2NlbmQgKCZkZXNjIC0+IHN1YmRpciwgZGVzYyAtPiBmcywgcGF0aCkgPCAwKSB7CgkJICAgIGZyZWUgKHBhdGhuYW1lKTsKCQkgICAgcmV0dXJuICgtMSk7CgkJfQoJICAgIH0KCSAgICBpZiAodGVybWluYXRvciA9PSAwKSB7CgkJYnJlYWs7CgkgICAgfQoJICAgIHRtcCA9IHMgKyAxOwoJfQogICAgfQogICAgZnJlZSAocGF0aG5hbWUpOwogICAgcmV0dXJuICgwKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRlc2NlbmQgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBkZXNjZW5kIChTbG90X3QgKnBhcmVudCwKCSAgICAgRnNfdCAqZnMsCgkgICAgIGNoYXIgKnBhdGgpCnsKICAgIGludCBlbnRyeTsKICAgIFNsb3RfdCBTdWJEaXI7CgogICAgaWYocGF0aFswXSA9PSAnXDAnIHx8IHN0cmNtcCAocGF0aCwgIi4iKSA9PSAwKSB7CglyZXR1cm4gKDApOwogICAgfQoKCiAgICBlbnRyeSA9IDA7CiAgICBpZiAodmZhdF9sb29rdXAgKHBhcmVudCwKCQkgICAgIGZzLAoJCSAgICAgJihTdWJEaXIuZGlyKSwKCQkgICAgICZlbnRyeSwKCQkgICAgIDAsCgkJICAgICBwYXRoLAoJCSAgICAgQUNDRVBUX0RJUiB8IFNJTkdMRSB8IERPX09QRU4sCgkJICAgICAwLAoJCSAgICAgJlN1YkRpcikgPT0gMCkgewoJKnBhcmVudCA9IFN1YkRpcjsKCXJldHVybiAoMCk7CiAgICB9CgogICAgaWYgKHN0cmNtcChwYXRoLCAiLi4iKSA9PSAwKSB7CglwYXJlbnQgLT4gRmlsZVNpemUgPSAtMTsKCXBhcmVudCAtPiBGaXJzdEFic0NsdU5yID0gMDsKCXBhcmVudCAtPiBtYXAgPSByb290X21hcDsKCXJldHVybiAoMCk7CiAgICB9CiAgICByZXR1cm4gKC0xKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIG9wZW5fZmlsZSAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgb3Blbl9maWxlIChTbG90X3QgKmZpbGUsIERpcmVjdG9yeV90ICpkaXIpCnsKICAgIGludCBmaXJzdDsKICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKCiAgICBmaXJzdCA9IF9fbGUxNl90b19jcHUgKGRpciAtPiBzdGFydCk7CgogICAgaWYoZmlyc3QgPT0gMCAmJgogICAgICAgKGRpciAtPiBhdHRyICYgQVRUUl9ESVJFQ1RPUlkpICE9IDApIHsKCWZpbGUgLT4gRmlyc3RBYnNDbHVOciA9IDA7CglmaWxlIC0+IEZpbGVTaXplID0gLTE7CglmaWxlIC0+IG1hcCA9IHJvb3RfbWFwOwoJcmV0dXJuICgwKTsKICAgIH0KCiAgICBpZiAoKGRpciAtPiBhdHRyICYgQVRUUl9ESVJFQ1RPUlkpICE9IDApIHsKCXNpemUgPSAoMVVMIDw8IDMxKSAtIDE7CiAgICB9CiAgICBlbHNlIHsKCXNpemUgPSBfX2xlMzJfdG9fY3B1IChkaXIgLT4gc2l6ZSk7CiAgICB9CgogICAgZmlsZSAtPiBtYXAgPSBub3JtYWxfbWFwOwogICAgZmlsZSAtPiBGaXJzdEFic0NsdU5yID0gZmlyc3Q7CiAgICBmaWxlIC0+IFByZXZpb3VzUmVsQ2x1TnIgPSAweGZmZmY7CiAgICBmaWxlIC0+IEZpbGVTaXplID0gc2l6ZTsKICAgIHJldHVybiAoMCk7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiByZWFkX2ZpbGUgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IHJlYWRfZmlsZSAoRnNfdCAqZnMsCgkgICAgICAgU2xvdF90ICpmaWxlLAoJICAgICAgIGNoYXIgKmJ1ZiwKCSAgICAgICBpbnQgd2hlcmUsCgkgICAgICAgaW50IGxlbikKewogICAgaW50IHBvczsKICAgIGludCByZWFkLCBuYiwgc2VjdCwgb2Zmc2V0OwoKICAgIHBvcyA9IGZpbGUgLT4gbWFwIChmcywgZmlsZSwgd2hlcmUsICZsZW4pOwogICAgaWYgIChwb3MgPCAwKSB7CglyZXR1cm4gLTE7CiAgICB9CiAgICBpZiAobGVuID09IDApIHsKCXJldHVybiAoMCk7CiAgICB9CgogICAgLyogQ29tcHV0ZSBzZWN0b3IgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBzZWN0ID0gcG9zIC8gU1pfU1REX1NFQ1RPUjsKICAgIG9mZnNldCA9IHBvcyAlIFNaX1NURF9TRUNUT1I7CiAgICByZWFkID0gMDsKCiAgICBpZiAob2Zmc2V0KSB7CgkvKiBSZWFkIGRvZXNuJ3Qgc3RhcnQgYXQgdGhlIHNlY3RvciBiZWdpbm5pbmcuIFdlIG5lZWQgdG8gdXNlIG91ciAgICAqLwoJLyogY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWlmIChzZWN0ICE9IGNhY2hlX3NlY3QpIHsKCSAgICBpZiAoZGV2X3JlYWQgKGNhY2hlLCBzZWN0LCAxKSA8IDApIHsKCQlyZXR1cm4gKC0xKTsKCSAgICB9CgkgICAgY2FjaGVfc2VjdCA9IHNlY3Q7Cgl9CgluYiA9IG1pbiAobGVuLCBTWl9TVERfU0VDVE9SIC0gb2Zmc2V0KTsKCgltZW1jcHkgKGJ1ZiwgY2FjaGUgKyBvZmZzZXQsIG5iKTsKCXJlYWQgKz0gbmI7CglsZW4gLT0gbmI7CglzZWN0ICs9IDE7CiAgICB9CgogICAgaWYgKGxlbiA+IFNaX1NURF9TRUNUT1IpIHsKCW5iID0gKGxlbiAtIDEpIC8gU1pfU1REX1NFQ1RPUjsKCWlmIChkZXZfcmVhZCAoYnVmICsgcmVhZCwgc2VjdCwgbmIpIDwgMCkgewoJICAgIHJldHVybiAoKHJlYWQpID8gcmVhZCA6IC0xKTsKCX0KCS8qIHVwZGF0ZSBzZWN0b3IgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglzZWN0ICs9IG5iOwoKCS8qIFVwZGF0ZSBieXRlIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgluYiAqPSBTWl9TVERfU0VDVE9SOwoJcmVhZCArPSBuYjsKCWxlbiAtPSBuYjsKICAgIH0KCiAgICBpZiAobGVuKSB7CglpZiAoc2VjdCAhPSBjYWNoZV9zZWN0KSB7CgkgICAgaWYgKGRldl9yZWFkIChjYWNoZSwgc2VjdCwgMSkgPCAwKSB7CgkJcmV0dXJuICgocmVhZCkgPyByZWFkIDogLTEpOwoJCWNhY2hlX3NlY3QgPSAtMTsKCSAgICB9CgkgICAgY2FjaGVfc2VjdCA9IHNlY3Q7Cgl9CgoJbWVtY3B5IChidWYgKyByZWFkLCBjYWNoZSwgbGVuKTsKCXJlYWQgKz0gbGVuOwogICAgfQogICAgcmV0dXJuIChyZWFkKTsKfQo=