LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qCiAqIERvcyBmbG9wcHkgc3VwcG9ydAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8ZmRjLmg+CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvX2Zkb3Nib290IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zYm9vdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgIGNoYXIgKm5hbWU7CiAgICBjaGFyICplcDsKICAgIGludCBzaXplOwogICAgaW50IHJjb2RlID0gMDsKICAgIGNoYXIgYnVmIFsxMl07CiAgICBpbnQgZHJpdmUgPSBDT05GSUdfU1lTX0ZEQ19EUklWRV9OVU1CRVI7CgogICAgLyogcHJlLXNldCBsb2FkX2FkZHIgKi8KICAgIGlmICgoZXAgPSBnZXRlbnYoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGVwLCBOVUxMLCAxNik7CiAgICB9CgogICAgLyogcHJlLXNldCBCb290IGZpbGUgbmFtZSAqLwogICAgaWYgKChuYW1lID0gZ2V0ZW52KCJib290ZmlsZSIpKSA9PSBOVUxMKSB7CgluYW1lID0gInVJbWFnZSI7CiAgICB9CgogICAgc3dpdGNoIChhcmdjKSB7CiAgICBjYXNlIDE6CglicmVhazsKICAgIGNhc2UgMjoKCS8qIG9ubHkgb25lIGFyZyAtIGFjY2VwdCB0d28gZm9ybXM6CgkgKiBqdXN0IGxvYWQgYWRkcmVzcywgb3IganVzdCBib290IGZpbGUgbmFtZS4KCSAqIFRoZSBsYXR0ZXIgZm9ybSBtdXN0IGJlIHdyaXR0ZW4gImZpbGVuYW1lIiBoZXJlLgoJICovCglpZiAoYXJndlsxXVswXSA9PSAnIicpIHsJLyoganVzdCBib290IGZpbGVuYW1lICovCgkgICAgbmFtZSA9IGFyZ3YgWzFdOwoJfSBlbHNlIHsJCQkvKiBsb2FkIGFkZHJlc3MJKi8KCSAgICBsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7Cgl9CglicmVhazsKICAgIGNhc2UgMzoKCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKCW5hbWUgPSBhcmd2IFsyXTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiBjbWRfdXNhZ2UoY21kdHApOwogICAgfQoKICAgIC8qIEluaXQgcGh5c2ljYWwgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKCFmZGNfZmRvc19pbml0IChkcml2ZSkpIHsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIC8qIE9wZW4gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKGRvc19vcGVuIChuYW1lKSA8IDApIHsKCXByaW50ZiAoIlVuYWJsZSB0byBvcGVuICVzXG4iLCBuYW1lKTsKCXJldHVybiAxOwogICAgfQogICAgaWYgKChzaXplID0gZG9zX3JlYWQgKGxvYWRfYWRkcikpIDwgMCkgewoJcHJpbnRmICgiYm9vdCBlcnJvclxuIik7CglyZXR1cm4gMTsKICAgIH0KICAgIGZsdXNoX2NhY2hlIChsb2FkX2FkZHIsIHNpemUpOwoKICAgIHNwcmludGYoYnVmLCAiJXgiLCBzaXplKTsKICAgIHNldGVudigiZmlsZXNpemUiLCBidWYpOwoKICAgIHByaW50ZigiRmxvcHB5IERPUyBsb2FkIGNvbXBsZXRlOiAlZCBieXRlcyBsb2FkZWQgdG8gMHglbHhcbiIsCgkgICBzaXplLCBsb2FkX2FkZHIpOwoKICAgIC8qIENoZWNrIGlmIHdlIHNob3VsZCBhdHRlbXB0IGFuIGF1dG8tc3RhcnQgKi8KICAgIGlmICgoKGVwID0gZ2V0ZW52KCJhdXRvc3RhcnQiKSkgIT0gTlVMTCkgJiYgKHN0cmNtcChlcCwieWVzIikgPT0gMCkpIHsKCWNoYXIgKmxvY2FsX2FyZ3NbMl07Cglsb2NhbF9hcmdzWzBdID0gYXJndlswXTsKCWxvY2FsX2FyZ3NbMV0gPSBOVUxMOwoJcHJpbnRmICgiQXV0b21hdGljIGJvb3Qgb2YgaW1hZ2UgYXQgYWRkciAweCUwOGxYIC4uLlxuIiwgbG9hZF9hZGRyKTsKCXJjb2RlID0gZG9fYm9vdG0gKGNtZHRwLCAwLCAxLCBsb2NhbF9hcmdzKTsKICAgIH0KICAgIHJldHVybiByY29kZTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBkb19mZG9zbHMgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IGRvX2Zkb3NscyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgIGNoYXIgKnBhdGggPSAiIjsKICAgIGludCBkcml2ZSA9IENPTkZJR19TWVNfRkRDX0RSSVZFX05VTUJFUjsKCiAgICBzd2l0Y2ggKGFyZ2MpIHsKICAgIGNhc2UgMToKCWJyZWFrOwogICAgY2FzZSAyOgoJcGF0aCA9IGFyZ3YgWzFdOwoJYnJlYWs7CiAgICB9CgogICAgLyogSW5pdCBwaHlzaWNhbCBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoIWZkY19mZG9zX2luaXQgKGRyaXZlKSkgewoJcmV0dXJuICgtMSk7CiAgICB9CiAgICAvKiBPcGVuIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChkb3Nfb3BlbiAocGF0aCkgPCAwKSB7CglwcmludGYgKCJVbmFibGUgdG8gb3BlbiAlc1xuIiwgcGF0aCk7CglyZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAoZG9zX2RpciAoKSk7Cn0KClVfQk9PVF9DTUQoCglmZG9zYm9vdCwJMywJMCwJZG9fZmRvc2Jvb3QsCgkiYm9vdCBmcm9tIGEgZG9zIGZsb3BweSBmaWxlIiwKCSJbbG9hZEFkZHJdIFtmaWxlbmFtZV0iCik7CgpVX0JPT1RfQ01EKAoJZmRvc2xzLAkyLAkwLAlkb19mZG9zbHMsCgkibGlzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeSIsCgkiW2RpcmVjdG9yeV0iCik7Cg==