LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKCiNpbmNsdWRlICJkb3MuaCIKI2luY2x1ZGUgImZkb3MuaCIKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGZpbGxfZnMgLS0gUmVhZCBpbmZvIG9uIGZpbGUgc3lzdGVtCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyBpbnQgZmlsbF9mcyAoQm9vdFNlY3Rvcl90ICpib290LCBGc190ICpmcykKewoKICAgIGZzIC0+IGZhdF9zdGFydCA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnJzdnNlY3QpOwogICAgZnMgLT4gZmF0X2xlbiA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gZmF0bGVuKTsKICAgIGZzIC0+IG5iX2ZhdCA9IGJvb3QgLT4gbmZhdDsKCiAgICBmcyAtPiBkaXJfc3RhcnQgPSBmcyAtPiBmYXRfc3RhcnQgKyBmcyAtPiBuYl9mYXQgKiBmcyAtPiBmYXRfbGVuOwogICAgZnMgLT4gZGlyX2xlbiA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gZGlyZW50cykgKiBNRElSX1NJWkUgLyBTWl9TVERfU0VDVE9SOwogICAgZnMgLT4gY2x1c3Rlcl9zaXplID0gYm9vdCAtPiBjbHNpejsKICAgIGZzIC0+IG51bV9jbHVzID0gKGZzIC0+IHRvdF9zZWN0b3JzIC0gZnMgLT4gZGlyX3N0YXJ0IC0gZnMgLT4gZGlyX2xlbikgLyBmcyAtPiBjbHVzdGVyX3NpemU7CgogICAgcmV0dXJuICgwKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBmc19pbml0IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBmc19pbml0IChGc190ICpmcykKewogICAgQm9vdFNlY3Rvcl90ICpib290OwoKICAgIC8qIEluaXRpYWxpemUgcGh5c2ljYWwgZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKGRldl9vcGVuICgpIDwgMCkgewoJUFJJTlRGICgiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIGZkY1xuIik7CglyZXR1cm4gKC0xKTsKICAgIH0KICAgIGluaXRfc3ViZGlyICgpOwoKICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciByZWFkIHRoZSBib290IHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKChib290ID0gKEJvb3RTZWN0b3JfdCAqKW1hbGxvYyAoc2l6ZW9mIChCb290U2VjdG9yX3QpKSkgPT0gTlVMTCkgewoJUFJJTlRGICgiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBib290IHNlY3RvclxuIik7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICAvKiByZWFkIGJvb3Qgc2VjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChkZXZfcmVhZCAoYm9vdCwgMCwgMSkpewoJUFJJTlRGICgiRXJyb3IgZHVyaW5nIGJvb3Qgc2VjdG9yIHJlYWRcbiIpOwoJZnJlZSAoYm9vdCk7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICAvKiB3ZSB2ZXJpZnkgaXQnYSBhIERPUyBkaXNrZXR0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChib290IC0+IGp1bXAgWzBdICE9ICBKVU1QXzBfMSAmJiBib290IC0+IGp1bXAgWzBdICE9ICBKVU1QXzBfMikgewoJUFJJTlRGICgiTm90IGEgRE9TIGRpc2tldHRlXG4iKTsKCWZyZWUgKGJvb3QpOwoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgaWYgKGJvb3QgLT4gZGVzY3IgPCBNRURJQV9TVEQpIHsKCS8qIFdlIGhhbmRsZSBvbmx5IHJlY2VudCBtZWRpYXMgKHR5cGUgRjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglQUklOVEYgKCJ1bnJlY29nbml6ZWQgZGlza2V0dGUgdHlwZVxuIik7CglmcmVlIChib290KTsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIGlmIChjaGVja19kZXYgKGJvb3QsIGZzKSA8IDApIHsKCVBSSU5URiAoIkJhZCBkaXNrZXR0ZVxuIik7CglmcmVlIChib290KTsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIGlmIChmaWxsX2ZzIChib290LCBmcykgPCAwKSB7CglmcmVlIChib290KTsKCglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICAvKiBSZWFkIEZBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChyZWFkX2ZhdCAoYm9vdCwgZnMpIDwgMCkgewoJZnJlZSAoYm9vdCk7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICBmcmVlIChib290KTsKICAgIHJldHVybiAoMCk7Cn0KCiNlbmRpZgo=