LyoKICogUlBDIHNlcnZlciBBUEkKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2lmbmRlZiBfX1dJTkVfUlBDX1NFUlZFUl9ICiNkZWZpbmUgX19XSU5FX1JQQ19TRVJWRVJfSAoKI2luY2x1ZGUgInJwY19iaW5kaW5nLmgiCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCnN0cnVjdCBwcm90c2VxX29wczsKCnR5cGVkZWYgc3RydWN0IF9ScGNTZXJ2ZXJQcm90c2VxCnsKICBjb25zdCBzdHJ1Y3QgcHJvdHNlcV9vcHMgKm9wczsgLyogUk8gKi8KICBzdHJ1Y3QgbGlzdCBlbnRyeTsgLyogQ1MgOjpzZXJ2ZXJfY3MgKi8KICBMUFNUUiBQcm90c2VxOyAvKiBSTyAqLwogIFVJTlQgTWF4Q2FsbHM7IC8qIFJPICovCiAgLyogbGlzdCBvZiBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgKi8KICBScGNDb25uZWN0aW9uKiBjb25uOyAvKiBDUyBjcyAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7CgogIC8qIGlzIHRoZSBzZXJ2ZXIgY3VycmVudGx5IGxpc3RlbmluZz8gKi8KICBCT09MIGlzX2xpc3RlbmluZzsgLyogQ1MgOjpsaXN0ZW5fY3MgKi8KICAvKiBtdXRleCBmb3IgZW5zdXJpbmcgb25seSBvbmUgdGhyZWFkIGNhbiBjaGFuZ2Ugc3RhdGUgYXQgYSB0aW1lICovCiAgSEFORExFIG1ncl9tdXRleDsKICAvKiBzZXQgd2hlbiBzZXJ2ZXIgdGhyZWFkIGhhcyBmaW5pc2hlZCBvcGVuaW5nIGNvbm5lY3Rpb25zICovCiAgSEFORExFIHNlcnZlcl9yZWFkeV9ldmVudDsKfSBScGNTZXJ2ZXJQcm90c2VxOwoKc3RydWN0IHByb3RzZXFfb3BzCnsKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBScGNTZXJ2ZXJQcm90c2VxICooKmFsbG9jKSh2b2lkKTsKICAgIHZvaWQgKCpzaWduYWxfc3RhdGVfY2hhbmdlZCkoUnBjU2VydmVyUHJvdHNlcSAqcHJvdHNlcSk7CiAgICAvKiBwcmV2aW91cyBhcnJheSBpcyBwYXNzZWQgaW4gdG8gYWxsb3cgcmV1c2Ugb2YgbWVtb3J5ICovCiAgICB2b2lkICooKmdldF93YWl0X2FycmF5KShScGNTZXJ2ZXJQcm90c2VxICpwcm90c2VxLCB2b2lkICpwcmV2X2FycmF5LCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKICAgIHZvaWQgKCpmcmVlX3dhaXRfYXJyYXkpKFJwY1NlcnZlclByb3RzZXEgKnByb3RzZXEsIHZvaWQgKmFycmF5KTsKICAgIC8qIHJldHVybnMgLTEgZm9yIGZhaWx1cmUsIDAgZm9yIHNlcnZlciBzdGF0ZSBjaGFuZ2VkIGFuZCAxIHRvIGluZGljYXRlIGEKICAgICAqIG5ldyBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCAqLwogICAgaW50ICgqd2FpdF9mb3JfbmV3X2Nvbm5lY3Rpb24pKFJwY1NlcnZlclByb3RzZXEgKnByb3RzZXEsIHVuc2lnbmVkIGludCBjb3VudCwgdm9pZCAqd2FpdF9hcnJheSk7CiAgICAvKiBvcGVucyB0aGUgZW5kcG9pbnQgYW5kIG9wdGlvbmFsbHkgYmVnaW5zIGxpc3RlbmluZyAqLwogICAgUlBDX1NUQVRVUyAoKm9wZW5fZW5kcG9pbnQpKFJwY1NlcnZlclByb3RzZXEgKnByb3RzZXEsIExQU1RSIGVuZHBvaW50KTsKfTsKCnR5cGVkZWYgc3RydWN0IF9ScGNTZXJ2ZXJJbnRlcmZhY2UKewogIHN0cnVjdCBsaXN0IGVudHJ5OwogIFJQQ19TRVJWRVJfSU5URVJGQUNFKiBJZjsKICBVVUlEIE1nclR5cGVVdWlkOwogIFJQQ19NR1JfRVBWKiBNZ3JFcHY7CiAgVUlOVCBGbGFnczsKICBVSU5UIE1heENhbGxzOwogIFVJTlQgTWF4UnBjU2l6ZTsKICBSUENfSUZfQ0FMTEJBQ0tfRk4qIElmQ2FsbGJhY2tGbjsKICBMT05HIEN1cnJlbnRDYWxsczsgLyogbnVtYmVyIG9mIGNhbGxzIGN1cnJlbnRseSBleGVjdXRpbmcgKi8KICAvKiBzZXQgd2hlbiB1bnJlZ2lzdGVyaW5nIGludGVyZmFjZSB0byBsZXQgdGhlIGNhbGxlciBvZgogICAqIFJwY1NlcnZlclVucmVnaXN0ZXJJZioga25vdyB0aGF0IGFsbCBjYWxscyBoYXZlIGZpbmlzaGVkICovCiAgSEFORExFIENhbGxzQ29tcGxldGVkRXZlbnQ7Cn0gUnBjU2VydmVySW50ZXJmYWNlOwoKdm9pZCBSUENSVDRfbmV3X2NsaWVudChScGNDb25uZWN0aW9uKiBjb25uKTsKY29uc3Qgc3RydWN0IHByb3RzZXFfb3BzICpycGNydDRfZ2V0X3Byb3RzZXFfb3BzKGNvbnN0IGNoYXIgKnByb3RzZXEpOwoKI2VuZGlmICAvKiBfX1dJTkVfUlBDX1NFUlZFUl9IICovCg==