LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2luY2x1ZGUgImRvcy5oIgojaW5jbHVkZSAiZmRvcy5oIgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCgojZGVmaW5lIE5CX0hFQURTICAgICAgICAyCiNkZWZpbmUgTkJfVFJBQ0tTICAgICAgIDgwCiNkZWZpbmUgTkJfU0VDVE9SUyAgICAgIDE4CgoKc3RhdGljIGludCBsYXN0d2hlcmU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRldl9vcGVuIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkZXZfb3BlbiAodm9pZCkKewogICAgbGFzdHdoZXJlID0gMDsKICAgIHJldHVybiAoMCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZGV2X3JlYWQgLS0gbGVuIGFuZCB3aGVyZSBhcmUgc2VjdG9ycyBudW1iZXIKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KaW50IGRldl9yZWFkICh2b2lkICpidWZmZXIsIGludCB3aGVyZSwgaW50IGxlbikKewogICAgUFJJTlRGICgiZGV2X3JlYWQgKGxlbiA9ICVkLCB3aGVyZSA9ICVkKVxuIiwgbGVuLCB3aGVyZSk7CgogICAgLyogU2kgb24gbmUgZGVzaXJlIHBhcyBsaXJlIGEgbGEgcG9zaXRpb24gY291cmFudGUsIGlsIGZhdXQgdW4gc2VlayAgICAgICovCiAgICBpZiAod2hlcmUgIT0gbGFzdHdoZXJlKSB7CglpZiAoIWZkY19mZG9zX3NlZWsgKHdoZXJlKSkgewoJICAgIFBSSU5URiAoInNlZWsgZXJyb3IgaW4gZGV2X3JlYWQiKTsKCSAgICBsYXN0d2hlcmUgPSAtMTsKCSAgICByZXR1cm4gKC0xKTsKCX0KICAgIH0KCiAgICBpZiAoIWZkY19mZG9zX3JlYWQgKGJ1ZmZlciwgbGVuKSkgewoJUFJJTlRGICgicmVhZCBlcnJvclxuIik7CglsYXN0d2hlcmUgPSAtMTsKCXJldHVybiAoLTEpOwogICAgfQogICAgbGFzdHdoZXJlID0gd2hlcmUgKyBsZW47CiAgICByZXR1cm4gKDApOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogY2hlY2tfZGV2IC0tIHZlcmlmeSB0aGUgZGlza2V0dGUgZm9ybWF0CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBjaGVja19kZXYgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpCnsKICAgIHVuc2lnbmVkIGludCBoZWFkcywgc2VjdG9ycywgdHJhY2tzOwogICAgaW50IEJvb3RQLCBJbmZwMCwgSW5mcFgsIEluZlRtOwogICAgaW50IHNlY3RfcGVyX3RyYWNrOwoKICAgIC8qIERpc3BsYXkgQm9vdCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgUFJJTlRGICgiSnVtcCB0byBib290IGNvZGUgICAgICAgICAgICAgICAgICAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwKCSAgICBib290IC0+IGp1bXAgWzBdLCBib290IC0+IGp1bXAgWzFdLCBib290IC0+IGp1bXBbMl0pOwogICAgUFJJTlRGICgiT0VNIG5hbWUgJiB2ZXJzaW9uICAgICAgICAgICAgICAgICAnJSouKnMnXG4iLAoJICAgIEJBTk5FUl9MRywgQkFOTkVSX0xHLCBib290IC0+IGJhbm5lciApOwogICAgUFJJTlRGICgiQnl0ZXMgcGVyIHNlY3RvciBob3BlZnVsbHkgNTEyICAgICAlZFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IHNlY3NpeikpOwogICAgUFJJTlRGICgiQ2x1c3RlciBzaXplIGluIHNlY3RvcnMgICAgICAgICAgICAlZFxuIiwKCSAgICBib290IC0+IGNsc2l6KTsKICAgIFBSSU5URiAoIk51bWJlciBvZiByZXNlcnZlZCAoYm9vdCkgc2VjdG9ycyAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBucnN2c2VjdCkpOwogICAgUFJJTlRGICgiTnVtYmVyIG9mIEZBVCB0YWJsZXMgaG9wZWZ1bGx5IDIgICAlZFxuIiwKCSAgICBib290IC0+IG5mYXQpOwogICAgUFJJTlRGICgiTnVtYmVyIG9mIGRpcmVjdG9yeSBzbG90cyAgICAgICAgICAlZFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IGRpcmVudHMpKTsKICAgIFBSSU5URiAoIlRvdGFsIHNlY3RvcnMgb24gZGlzayAgICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBwc2VjdCkpOwogICAgUFJJTlRGICgiTWVkaWEgZGVzY3JpcHRvcj1maXJzdCBieXRlIG9mIEZBVCAlZFxuIiwKCSAgICBib290IC0+IGRlc2NyKTsKICAgIFBSSU5URiAoIlNlY3RvcnMgaW4gRkFUICAgICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBmYXRsZW4pKTsKICAgIFBSSU5URiAoIlNlY3RvcnMvdHJhY2sgICAgICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBuc2VjdCkpOwogICAgUFJJTlRGICgiSGVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IG5oZWFkcykpOwogICAgUFJJTlRGICgibnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzICAgICAgICAgICAlZFxuIiwKCSAgICBfX2xlMzJfdG9fY3B1IChib290IC0+IG5ocykpOwogICAgUFJJTlRGICgiYmlnIHRvdGFsIHNlY3RvcnMgICAgICAgICAgICAgICAgICAlZFxuIiwKCSAgICBfX2xlMzJfdG9fY3B1IChib290IC0+IGJpZ3NlY3QpKTsKICAgIFBSSU5URiAoInBoeXNpY2FsIGRyaXZlID8gICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgYm9vdCAtPiBwaHlzZHJpdmUpOwogICAgUFJJTlRGICgicmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwKCSAgICBib290IC0+IHJlc2VydmVkKTsKICAgIFBSSU5URiAoImRvcyA+IDQuMCBkaXNrZXR0ZSAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgYm9vdCAtPiBkb3M0KTsKICAgIFBSSU5URiAoInNlcmlhbCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBzZXJpYWwpKTsKICAgIFBSSU5URiAoImRpc2sgbGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAgJSouKnNcbiIsCgkgICAgTEFCRUxfTEcsIExBQkVMX0xHLCBib290IC0+IGxhYmVsKTsKICAgIFBSSU5URiAoIkZBVCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgJTguOHNcbiIsCgkgICAgYm9vdCAtPiBmYXRfdHlwZSk7CiAgICBQUklOVEYgKCJyZXNlcnZlZCBieSAyTSAgICAgICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gcmVzXzJtKTsKICAgIFBSSU5URiAoIjJNIGNoZWNrc3VtIChub3QgdXNlZCkgICAgICAgICAgICAgJWRcbiIsCgkgICAgYm9vdCAtPiBDaGVja1N1bSk7CiAgICBQUklOVEYgKCIyTUYgZm9ybWF0IHZlcnNpb24gICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gZm10XzJtZik7CiAgICBQUklOVEYgKCIxIGlmIHdyaXRlIHRyYWNrIGFmdGVyIGZvcm1hdCAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gd3QpOwogICAgUFJJTlRGICgiZGF0YSB0cmFuc2ZlciByYXRlIG9uIHRyYWNrIDAgICAgICAlZFxuIiwKCSAgICBib290IC0+IHJhdGVfMCk7CiAgICBQUklOVEYgKCJkYXRhIHRyYW5zZmVyIHJhdGUgb24gdHJhY2s8PjAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gcmF0ZV9hbnkpOwogICAgUFJJTlRGICgib2Zmc2V0IHRvIGJvb3QgcHJvZ3JhbSAgICAgICAgICAgICAlZFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IEJvb3RQKSk7CiAgICBQUklOVEYgKCJUMTogaW5mb3JtYXRpb24gZm9yIHRyYWNrIDAgICAgICAgICVkXG4iLAoJICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gSW5mcDApKTsKICAgIFBSSU5URiAoIlQyOiBpbmZvcm1hdGlvbiBmb3IgdHJhY2s8PjAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBJbmZwWCkpOwogICAgUFJJTlRGICgiVDM6IHRyYWNrIHNlY3RvcnMgc2l6ZSB0YWJsZSAgICAgICAlZFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IEluZlRtKSk7CiAgICBQUklOVEYgKCJGb3JtYXQgZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4JTA0eFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IERhdGVGKSk7CiAgICBQUklOVEYgKCJGb3JtYXQgdGltZSAgICAgICAgICAgICAgICAgICAgICAgIDB4JTA0eFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IFRpbWVGKSk7CgoKICAgIC8qIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBmcm9tIGJvb3Qgc2VjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGhlYWRzID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBuaGVhZHMpOwogICAgc2VjdG9ycyA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnNlY3QpOwogICAgZnMgLT4gdG90X3NlY3RvcnMgPSBfX2xlMzJfdG9fY3B1IChib290IC0+IGJpZ3NlY3QpOwogICAgaWYgKF9fbGUxNl90b19jcHUgKGJvb3QgLT4gcHNlY3QpICE9IDApIHsKCWZzIC0+IHRvdF9zZWN0b3JzID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBwc2VjdCk7CiAgICB9CgogICAgc2VjdF9wZXJfdHJhY2sgPSBoZWFkcyAqIHNlY3RvcnM7CiAgICB0cmFja3MgPSAoZnMgLT4gdG90X3NlY3RvcnMgKyBzZWN0X3Blcl90cmFjayAtIDEpIC8gc2VjdF9wZXJfdHJhY2s7CgogICAgQm9vdFAgPSBfX2xlMTZfdG9fY3B1IChib290IC0+IEJvb3RQKTsKICAgIEluZnAwID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBJbmZwMCk7CiAgICBJbmZwWCA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gSW5mcFgpOwogICAgSW5mVG0gPSBfX2xlMTZfdG9fY3B1IChib290IC0+IEluZlRtKTsKCiAgICBpZiAoYm9vdCAtPiBkb3M0ID09IEVYVEVOREVEX0JPT1QgJiYKCXN0cm5jbXAoIGJvb3QtPmJhbm5lciwiMk0iLCAyICkgPT0gMCAmJgoJQm9vdFAgPCBTWl9TVERfU0VDVE9SICYmCglJbmZwMCA8IFNaX1NURF9TRUNUT1IgJiYKCUluZnBYIDwgU1pfU1REX1NFQ1RPUiAmJgoJSW5mVG0gPCBTWl9TVERfU0VDVE9SICYmCglCb290UCA+PSBJbmZUbSArIDIgJiYKCUluZlRtID49IEluZnBYICYmCglJbmZwWCA+PSBJbmZwMCAmJgoJSW5mcDAgPj0gNzYgKSB7CgoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgaWYgKGhlYWRzICE9IE5CX0hFQURTIHx8Cgl0cmFja3MgIT0gTkJfVFJBQ0tTIHx8CglzZWN0b3JzICE9IE5CX1NFQ1RPUlMgfHwKCV9fbGUxNl90b19jcHUgKGJvb3QgLT4gc2Vjc2l6KSAhPSBTWl9TVERfU0VDVE9SIHx8CglmcyAtPiB0b3Rfc2VjdG9ycyA9PSAwIHx8CgkoZnMgLT4gdG90X3NlY3RvcnMgJSBzZWN0b3JzKSAhPSAwKSB7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICByZXR1cm4gKDApOwp9CgoKI2VuZGlmCg==