LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCnN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcjsKCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzZXRqbXAuaD4KI2lmZGVmIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ0aHJlYWQuaCIKI2luY2x1ZGUgIndpbnRlcm5sLmgiCgovKiBDdXJyZW50bHkgdGhpcyBwcm9iYWJseSB3b3JrcyBvbmx5IGZvciBnbGliYzIsCiAqIHdoaWNoIGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGRvdWJsZS11bmRlcnNjb3JlLXByZXBlbmRlZAogKiBwdGhyZWFkIHByaW1pdGl2ZXMsIGFuZCB1c2UgdGhlbSBpZiBhdmFpbGFibGUuCiAqIElmIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBsaWJjIGRlZmF1bHRzIHRvCiAqIG5vbi10aHJlYWRzYWZlIG9wZXJhdGlvbiAobm90IGdvb2QpLiAqLwoKI2lmIChkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykpICYmICFkZWZpbmVkKEhBVkVfTlBUTCkKCiNpZm5kZWYgX19VU0VfVU5JWDk4CiNkZWZpbmUgX19VU0VfVU5JWDk4CiNlbmRpZgoKI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgoKI2RlZmluZSBQX09VVFBVVChzdHVmZikgd3JpdGUoMixzdHVmZixzdHJsZW4oc3R1ZmYpKQoKI2RlZmluZSBQU1RSKHN0cikgX19BU01fTkFNRSgjc3RyKQoKLyogYWRhcHQgYXMgbmVjZXNzYXJ5IChhIGNvbnN0cnVjdCBsaWtlIHRoaXMgaXMgdXNlZCBpbiBnbGliYyBzb3VyY2VzKSAqLwojZGVmaW5lIHN0cm9uZ19hbGlhcyhvcmlnLCBhbGlhcykgXAogYXNtKCIuZ2xvYmwgIiBQU1RSKGFsaWFzKSAiXG4iIFwKICAgICAiXHQuc2V0ICIgUFNUUihhbGlhcykgIiwiIFBTVFIob3JpZykpCgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KI2RlZmluZSBNQVhfVFNEICAxNgoKc3RydWN0IGZvcmtfYmxvY2s7CgpzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QKewogICAgY2hhciAgICAgICAgZHVtbXlbMjU2XTsKICAgIGNvbnN0IHZvaWQgKmtleV9kYXRhW01BWF9LRVlTXTsgIC8qIGZvciBub3JtYWwgcHRocmVhZCBrZXlzICovCiAgICBjb25zdCB2b2lkICp0c2RfZGF0YVtNQVhfVFNEXTsgICAvKiBmb3IgbGliYyBpbnRlcm5hbCB0c2QgdmFyaWFibGVzICovCn07Cgp0eXBlZGVmIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCAqcHRocmVhZF9kZXNjcjsKCnN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucwp7CiAgcGlkX3QgKCpwdHJfcHRocmVhZF9mb3JrKSAoc3RydWN0IGZvcmtfYmxvY2sgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9kZXN0cm95KSAocHRocmVhZF9hdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8wKSAocHRocmVhZF9hdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8xKSAocHRocmVhZF9hdHRyX3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRkZXRhY2hzdGF0ZSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSkgKHB0aHJlYWRfYXR0cl90ICosIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcG9saWN5KSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NvcGUpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRzY29wZSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfY29uZGF0dHJfZGVzdHJveSkgKHB0aHJlYWRfY29uZGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9jb25kYXR0cl9pbml0KSAocHRocmVhZF9jb25kYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9icm9hZGNhc3QpIChwdGhyZWFkX2NvbmRfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfZGVzdHJveSkgKHB0aHJlYWRfY29uZF90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9pbml0KSAocHRocmVhZF9jb25kX3QgKiwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9zaWduYWwpIChwdGhyZWFkX2NvbmRfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfd2FpdCkgKHB0aHJlYWRfY29uZF90ICosIHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9lcXVhbCkgKHB0aHJlYWRfdCwgcHRocmVhZF90KTsKICB2b2lkICgqcHRyX19fcHRocmVhZF9leGl0KSAodm9pZCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9nZXRzY2hlZHBhcmFtKSAocHRocmVhZF90LCBpbnQgKiwgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX3NldHNjaGVkcGFyYW0pIChwdGhyZWFkX3QsIGludCwgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kpIChwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCkgKHB0aHJlYWRfbXV0ZXhfdCAqLCBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X2xvY2spIChwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF91bmxvY2spIChwdGhyZWFkX211dGV4X3QgKik7CiAgcHRocmVhZF90ICgqcHRyX3B0aHJlYWRfc2VsZikgKHZvaWQpOwogIGludCAoKnB0cl9wdGhyZWFkX3NldGNhbmNlbHN0YXRlKSAoaW50LCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2V0Y2FuY2VsdHlwZSkgKGludCwgaW50ICopOwogIHZvaWQgKCpwdHJfcHRocmVhZF9kb19leGl0KSAodm9pZCAqcmV0dmFsLCBjaGFyICpjdXJyZW50ZnJhbWUpOwogIHZvaWQgKCpwdHJfcHRocmVhZF9jbGVhbnVwX3VwdG8pIChqbXBfYnVmIHRhcmdldCwgY2hhciAqdGFyZ2V0ZnJhbWUpOwogIHB0aHJlYWRfZGVzY3IgKCpwdHJfcHRocmVhZF90aHJlYWRfc2VsZikgKHZvaWQpOwogIGludCAoKnB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9zZXQpIChpbnQga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKTsKICB2b2lkICogKCpwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0KSAoaW50IGtleSk7CiAgdm9pZCAqKiBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgKCpwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcykgKGludCBrZXkpOwogIGludCAoKnB0cl9wdGhyZWFkX3NpZ2FjdGlvbikgKGludCBzaWcsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiBhY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9hY3QpOwogIGludCAoKnB0cl9wdGhyZWFkX3NpZ3dhaXQpIChjb25zdCBzaWdzZXRfdCAqc2V0LCBpbnQgKnNpZyk7CiAgaW50ICgqcHRyX3B0aHJlYWRfcmFpc2UpIChpbnQgc2lnKTsKfTsKCnN0YXRpYyBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgd2luZV9wdGhyZWFkX2Z1bmN0aW9uczsKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCBpbml0aWFsX2Rlc2NyOwpzdGF0aWMgaW50IGluaXRfZG9uZTsKCnN0YXRpYyBwaWRfdCAoKmxpYmNfZm9yaykodm9pZCk7CnN0YXRpYyBpbnQgKCpsaWJjX3NpZ2FjdGlvbikoaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvbGRhY3QpOwpzdGF0aWMgaW50ICgqbGliY191c2Vsb2NhbGUpKGludCBzZXQpOwpzdGF0aWMgaW50ICooKmxpYmNfcHRocmVhZF9pbml0KSggY29uc3Qgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zICpmdW5jcyApOwpzdGF0aWMgaW50ICpsaWJjX211bHRpcGxlX3RocmVhZHM7Cgp2b2lkIFBUSFJFQURfaW5pdF9kb25lKHZvaWQpCnsKICAgIGluaXRfZG9uZSA9IDE7CiAgICBpZiAoIWxpYmNfZm9yaykgbGliY19mb3JrID0gZGxzeW0oIFJUTERfTkVYVCwgImZvcmsiICk7CiAgICBpZiAoIWxpYmNfc2lnYWN0aW9uKSBsaWJjX3NpZ2FjdGlvbiA9IGRsc3ltKCBSVExEX05FWFQsICJzaWdhY3Rpb24iICk7Cn0KCnZvaWQgUFRIUkVBRF9pbml0X3RocmVhZCh2b2lkKQp7CiAgICBzdGF0aWMgaW50IGZpcnN0ID0gMTsKCiAgICBpZiAoZmlyc3QpCiAgICB7CiAgICAgICAgZmlyc3QgPSAwOwogICAgICAgIE50Q3VycmVudFRlYigpLT5wdGhyZWFkX2RhdGEgPSAmaW5pdGlhbF9kZXNjcjsKICAgICAgICBsaWJjX3VzZWxvY2FsZSA9IGRsc3ltKCBSVExEX05FWFQsICJ1c2Vsb2NhbGUiICk7CiAgICAgICAgbGliY19wdGhyZWFkX2luaXQgPSBkbHN5bSggUlRMRF9ORVhULCAiX19saWJjX3B0aHJlYWRfaW5pdCIgKTsKICAgICAgICBpZiAobGliY19wdGhyZWFkX2luaXQpIGxpYmNfbXVsdGlwbGVfdGhyZWFkcyA9IGxpYmNfcHRocmVhZF9pbml0KCAmd2luZV9wdGhyZWFkX2Z1bmN0aW9ucyApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCAqZGVzY3IgPSBjYWxsb2MoIDEsIHNpemVvZigqZGVzY3IpICk7CiAgICAgICAgTnRDdXJyZW50VGViKCktPnB0aHJlYWRfZGF0YSA9IGRlc2NyOwogICAgICAgIGlmIChsaWJjX211bHRpcGxlX3RocmVhZHMpICpsaWJjX211bHRpcGxlX3RocmVhZHMgPSAxOwogICAgfQogICAgaWYgKGxpYmNfdXNlbG9jYWxlKSBsaWJjX3VzZWxvY2FsZSggLTEgLypMQ19HTE9CQUxfTE9DQUxFKi8gKTsKfQoKLyogcmVkZWZpbmUgdGhpcyB0byBwcmV2ZW50IGxpYnB0aHJlYWQgZnJvbSBvdmVycmlkaW5nIG91ciBmdW5jdGlvbiBwb2ludGVycyAqLwppbnQgKl9fbGliY19wdGhyZWFkX2luaXQoIGNvbnN0IHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyAqZnVuY3MgKQp7CiAgICByZXR1cm4gbGliY19tdWx0aXBsZV90aHJlYWRzOwp9CgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KQogKiBhbHNvOiBhc3N1bWUgdGhhdCBzdGF0aWMgaW5pdGlhbGl6ZXIgc2V0cyBwb2ludGVyIHRvIE5VTEwKICovCnR5cGVkZWYgc3RydWN0CnsKI2lmZGVmIF9fR0xJQkNfXwogIGludCByZXNlcnZlZDsKI2VuZGlmCiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3Q7Cn0gKndpbmVfbXV0ZXg7CgovKiBzZWUgd2luZV9tdXRleCBhYm92ZSBmb3IgY29tbWVudHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIFJUTF9SV0xPQ0sgKmxvY2s7Cn0gKndpbmVfcndsb2NrOwoKdHlwZWRlZiBzdHJ1Y3QgX3dpbmVfY2xlYW51cCB7CiAgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKik7CiAgdm9pZCAqYXJnOwp9ICp3aW5lX2NsZWFudXA7Cgp2b2lkIF9fcHRocmVhZF9pbml0aWFsaXplKHZvaWQpCnsKfQoKcHRocmVhZF9kZXNjciBfX3B0aHJlYWRfdGhyZWFkX3NlbGYodm9pZCkKewogICAgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpkZXNjciA9IE50Q3VycmVudFRlYigpLT5wdGhyZWFkX2RhdGE7CiAgICBpZiAoIWRlc2NyKSByZXR1cm4gJmluaXRpYWxfZGVzY3I7CiAgICByZXR1cm4gZGVzY3I7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF90aHJlYWRfc2VsZiwgcHRocmVhZF90aHJlYWRfc2VsZik7CgpzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCB7Cgkgdm9pZCogKCpzdGFydF9yb3V0aW5lKSh2b2lkKik7Cgkgdm9pZCogYXJnOwp9OwoKc3RhdGljIERXT1JEIENBTExCQUNLIHB0aHJlYWRfdGhyZWFkX3N0YXJ0KExQVk9JRCBkYXRhKQp7CiAgc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQgaW5pdCA9ICooc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQqKWRhdGE7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRhdGEpOwogIHJldHVybiAoRFdPUkQpaW5pdC5zdGFydF9yb3V0aW5lKGluaXQuYXJnKTsKfQoKaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCogdGhyZWFkLCBjb25zdCBwdGhyZWFkX2F0dHJfdCogYXR0ciwgdm9pZCoKICAgICAgICAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIGFyZykKewogIEhBTkRMRSBoVGhyZWFkOwogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KiBpZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAoJCXNpemVvZihzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCkpOwoKICBpZGF0YS0+c3RhcnRfcm91dGluZSA9IHN0YXJ0X3JvdXRpbmU7CiAgaWRhdGEtPmFyZyA9IGFyZzsKICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkKCBOVUxMLCAwLCBwdGhyZWFkX3RocmVhZF9zdGFydCwgaWRhdGEsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKExQRFdPUkQpdGhyZWFkKTsKCiAgaWYoaFRocmVhZCkKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIGVsc2UKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaWRhdGEpOyAvKiBmcmVlIGlkYXRhIHN0cnVjdCBvbiBmYWlsdXJlICovCiAgICByZXR1cm4gRUFHQUlOOwogIH0KCiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NhbmNlbChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgSEFORExFIGhUaHJlYWQgPSBPcGVuVGhyZWFkKFRIUkVBRF9BTExfQUNDRVNTLCBGQUxTRSwgKERXT1JEKXRocmVhZCk7CgogIGlmKCFUZXJtaW5hdGVUaHJlYWQoaFRocmVhZCwgMCkpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAgICAgIC8qIHJldHVybiBlcnJvciAqLwogIH0KCiAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CgogIHJldHVybiAwOyAgICAgICAgICAgICAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgppbnQgcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAoRFdPUkQpdGhyZWFkKTsKCiAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CiAgaWYoIUdldEV4aXRDb2RlVGhyZWFkKGhUaHJlYWQsIChMUERXT1JEKXZhbHVlX3B0cikpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAvKiBGSVhNRTogbWFrZSB0aGlzIG1vcmUgY29ycmVjdGx5IG1hdGNoICovCiAgfSAgICAgICAgICAgICAgICAvKiB3aW5kb3dzIGVycm9ycyAqLwoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICByZXR1cm4gMDsKfQoKLypGSVhNRTogbm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMgb25lLi4uICovCmludCBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfZGV0YWNoXG4iKTsKICByZXR1cm4gMDsKfQoKLyogRklYTUU6IHdlIGhhdmUgbm8gZXF1aXZhbGVudHMgaW4gd2luMzIgZm9yIHRoZSBwb2xpY3lzICovCi8qIHNvIGp1c3Qga2VlcCB0aGlzIGFzIGEgc3R1YiAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KHB0aHJlYWRfYXR0cl90ICphdHRyLCBpbnQgcG9saWN5KQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeVxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY29wZSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjb3BlKHB0aHJlYWRfYXR0cl90ICphdHRyLCBpbnQgc2NvcGUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9hdHRyX3NldHNjb3BlXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyogRklYTUU6IG5vIHdpbjMyIGVxdWl2YWxlbnQgZm9yIHNjaGVkdWxlIHBhcmFtICovCmludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbShwdGhyZWFkX2F0dHJfdCAqYXR0ciwKICAgIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0pCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW1cbiIpOwogIHJldHVybiAwOyAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgppbnQgX19wdGhyZWFkX29uY2UocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpCnsKICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgdGhlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKICBMT05HIG9uY2Vfbm93OwoKICBtZW1jcHkoJm9uY2Vfbm93LCZ0aGVfb25jZSxzaXplb2Yob25jZV9ub3cpKTsKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKExPTkcqKW9uY2VfY29udHJvbCwgb25jZV9ub3crMSwgb25jZV9ub3cpID09IG9uY2Vfbm93KQogICAgKCppbml0X3JvdXRpbmUpKCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9vbmNlLCBwdGhyZWFkX29uY2UpOwoKdm9pZCBfX3B0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKHZvaWQpCnsKICAgIC8qIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZSAqLwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wLCBwdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCk7CgovKioqKiogYXRmb3JrICoqKioqLwoKI2RlZmluZSBNQVhfQVRGT1JLIDggIC8qIGxpYmMgZG9lc24ndCBuZWVkIHRoYXQgbWFueSBhbnl3YXkgKi8KCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGF0Zm9ya19zZWN0aW9uOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBjcml0c2VjdF9kZWJ1ZyA9CnsKICAgIDAsIDAsICZhdGZvcmtfc2VjdGlvbiwKICAgIHsgJmNyaXRzZWN0X2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QsICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0IH0sCiAgICAgIDAsIDAsIHsgMCwgKERXT1JEKShfX0ZJTEVfXyAiOiBhdGZvcmtfc2VjdGlvbiIpIH0KfTsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gYXRmb3JrX3NlY3Rpb24gPSB7ICZjcml0c2VjdF9kZWJ1ZywgLTEsIDAsIDAsIDAsIDAgfTsKCnR5cGVkZWYgdm9pZCAoKmF0Zm9ya19oYW5kbGVyKSgpOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX3ByZXBhcmVbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcGFyZW50W01BWF9BVEZPUktdOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX2NoaWxkW01BWF9BVEZPUktdOwpzdGF0aWMgaW50IGF0Zm9ya19jb3VudDsKCmludCBfX3B0aHJlYWRfYXRmb3JrKHZvaWQgKCpwcmVwYXJlKSh2b2lkKSwKCQkgICAgIHZvaWQgKCpwYXJlbnQpKHZvaWQpLAoJCSAgICAgdm9pZCAoKmNoaWxkKSh2b2lkKSkKewogICAgaWYgKGluaXRfZG9uZSkgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgYXNzZXJ0KCBhdGZvcmtfY291bnQgPCBNQVhfQVRGT1JLICk7CiAgICBhdGZvcmtfcHJlcGFyZVthdGZvcmtfY291bnRdID0gcHJlcGFyZTsKICAgIGF0Zm9ya19wYXJlbnRbYXRmb3JrX2NvdW50XSA9IHBhcmVudDsKICAgIGF0Zm9ya19jaGlsZFthdGZvcmtfY291bnRdID0gY2hpbGQ7CiAgICBhdGZvcmtfY291bnQrKzsKICAgIGlmIChpbml0X2RvbmUpIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfYXRmb3JrLCBwdGhyZWFkX2F0Zm9yayk7CgpwaWRfdCBfX2Zvcmsodm9pZCkKewogICAgcGlkX3QgcGlkOwogICAgaW50IGk7CgogICAgaWYgKCFsaWJjX2ZvcmspCiAgICB7CiAgICAgICAgbGliY19mb3JrID0gZGxzeW0oIFJUTERfTkVYVCwgImZvcmsiICk7CiAgICAgICAgYXNzZXJ0KCBsaWJjX2ZvcmsgKTsKICAgIH0KICAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIC8qIHByZXBhcmUgaGFuZGxlcnMgYXJlIGNhbGxlZCBpbiByZXZlcnNlIGluc2VydGlvbiBvcmRlciAqLwogICAgZm9yIChpID0gYXRmb3JrX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIGlmIChhdGZvcmtfcHJlcGFyZVtpXSkgYXRmb3JrX3ByZXBhcmVbaV0oKTsKICAgIGlmICghKHBpZCA9IGxpYmNfZm9yaygpKSkKICAgIHsKICAgICAgICBSdGxJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfY2hpbGRbaV0pIGF0Zm9ya19jaGlsZFtpXSgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgaWYgKGF0Zm9ya19wYXJlbnRbaV0pIGF0Zm9ya19wYXJlbnRbaV0oKTsKICAgICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICB9CiAgICByZXR1cm4gcGlkOwp9CnN0cm9uZ19hbGlhcyhfX2ZvcmssIGZvcmspOwoKLyoqKioqIE1VVEVYRVMgKioqKiovCgppbnQgX19wdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90ICptdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqbXV0ZXhhdHRyKQp7CiAgLyogZ2xpYmMgaGFzIGEgdGVuZGVuY3kgdG8gaW5pdGlhbGl6ZSBtdXRleGVzIHZlcnkgb2Z0ZW4sIGV2ZW4KICAgICBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXkgYXJlIG5vdCByZWFsbHkgdXNlZCBsYXRlciBvbi4KCiAgICAgQXMgZm9yIHVzLCBpbml0aWFsaXppbmcgYSBtdXRleCBpcyB2ZXJ5IGV4cGVuc2l2ZSwgd2UgcG9zdHBvbmUKICAgICB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdGltZSB0aGUgbXV0ZXggaXMgZmlyc3QgdXNlZC4gKi8KCiAgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QgPSBOVUxMOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgcHRocmVhZF9tdXRleF9pbml0KTsKCnN0YXRpYyB2b2lkIG11dGV4X3JlYWxfaW5pdCggcHRocmVhZF9tdXRleF90ICptdXRleCApCnsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoQ1JJVElDQUxfU0VDVElPTikpOwogIFJ0bEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCksY3JpdHNlY3QsTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3JpdHNlY3QpOwogIH0KfQoKaW50IF9fcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfbG9jaywgcHRocmVhZF9tdXRleF9sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIGlmICghUnRsVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpKSB7CiAgICBlcnJubyA9IEVCVVNZOwogICAgcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssIHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCBwdGhyZWFkX211dGV4X3VubG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIHJldHVybiAwOwogIGlmICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdC0+UmVjdXJzaW9uQ291bnQpIHsKI2lmIDAgLyogdGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gbGliYzYgdGhhdCBtYWtlcyB0aGlzIGEgYmFkIGlkZWEgKi8KICAgIHJldHVybiBFQlVTWTsKI2Vsc2UKICAgIHdoaWxlICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdC0+UmVjdXJzaW9uQ291bnQpCiAgICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKI2VuZGlmCiAgfQogIFJ0bERlbGV0ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0ID0gTlVMTDsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSk7CgoKLyoqKioqIE1VVEVYIEFUVFJJQlVURVMgKioqKiovCi8qIGp1c3QgZHVtbWllcywgc2luY2UgY3JpdGljYWwgc2VjdGlvbnMgYXJlIGFsd2F5cyByZWN1cnNpdmUgKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQsIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSwgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCBraW5kKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCwgcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCAqa2luZCkKewogICpraW5kID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkU7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucCwgcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCBraW5kKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSwgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCAqa2luZCkKewogICpraW5kID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkU7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSwgcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSk7CgoKLyoqKioqIFRIUkVBRC1TUEVDSUZJQyBWQVJJQUJMRVMgKEtFWVMpICoqKioqLwoKaW50IF9fcHRocmVhZF9rZXlfY3JlYXRlKHB0aHJlYWRfa2V5X3QgKmtleSwgdm9pZCAoKmRlc3RyX2Z1bmN0aW9uKSh2b2lkICopKQp7CiAgc3RhdGljIExPTkcga2V5Y250ID0gRklSU1RfS0VZOwogICprZXkgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZrZXljbnQsIDEpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSwgcHRocmVhZF9rZXlfY3JlYXRlKTsKCmludCBfX3B0aHJlYWRfa2V5X2RlbGV0ZShwdGhyZWFkX2tleV90IGtleSkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2V5X2RlbGV0ZSwgcHRocmVhZF9rZXlfZGVsZXRlKTsKCmludCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIGRlc2NyLT5rZXlfZGF0YVtrZXldID0gcG9pbnRlcjsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfc2V0c3BlY2lmaWMsIHB0aHJlYWRfc2V0c3BlY2lmaWMpOwoKdm9pZCAqX19wdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gKHZvaWQgKilkZXNjci0+a2V5X2RhdGFba2V5XTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2dldHNwZWNpZmljLCBwdGhyZWFkX2dldHNwZWNpZmljKTsKCi8qIHRoZXNlIGFyZSBub3QgZXhwb3J0ZWQsIHRoZXkgYXJlIG9ubHkgdXNlZCBpbiB0aGUgcHRocmVhZF9mdW5jdGlvbnMgc3RydWN0dXJlICovCgpzdGF0aWMgaW50IHB0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCggaW50IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlciApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIGRlc2NyLT50c2RfZGF0YVtrZXldID0gcG9pbnRlcjsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCAqcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0KCBpbnQga2V5ICkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICh2b2lkICopZGVzY3ItPnRzZF9kYXRhW2tleV07Cn0KCnN0YXRpYyB2b2lkICoqIF9fYXR0cmlidXRlX18oKGNvbnN0KSkgcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcyggaW50IGtleSApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKikmZGVzY3ItPnRzZF9kYXRhW2tleV07Cn0KCgovKioqKiogIkVYQ0VQVElPTiIgRlJBTUVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUgPSByb3V0aW5lOwogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyA9IGFyZzsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBpZiAoZXhlY3V0ZSkgKCooKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSkpKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wdXNoKGJ1ZmZlciwgcm91dGluZSwgYXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIF9wdGhyZWFkX2NsZWFudXBfcG9wKGJ1ZmZlciwgZXhlY3V0ZSk7Cn0KCnZvaWQgX19wdGhyZWFkX2NsZWFudXBfdXB0byhqbXBfYnVmIHRhcmdldCwgY2hhciAqZnJhbWUpCnsKICAgIC8qIEZJWE1FICovCn0KCi8qKioqKiBDT05ESVRJT05TICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgX19wdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXRcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9pbml0LCBwdGhyZWFkX2NvbmRfaW5pdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfZGVzdHJveVxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX2Rlc3Ryb3ksIHB0aHJlYWRfY29uZF9kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3NpZ25hbFxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3NpZ25hbCwgcHRocmVhZF9jb25kX3NpZ25hbCk7CgppbnQgX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9icm9hZGNhc3RcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QsIHB0aHJlYWRfY29uZF9icm9hZGNhc3QpOwoKaW50IF9fcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3dhaXRcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF93YWl0LCBwdGhyZWFkX2NvbmRfd2FpdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3RpbWVkd2FpdCwgcHRocmVhZF9jb25kX3RpbWVkd2FpdCk7CgovKioqKiBDT05ESVRJT04gQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdChwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveShwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAyKQovKioqKiogUkVBRC1XUklURSBMT0NLUyAqKioqKi8KCnN0YXRpYyB2b2lkIHJ3bG9ja19yZWFsX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUlRMX1JXTE9DSyAqbG9jayA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoUlRMX1JXTE9DSykpOwogIFJ0bEluaXRpYWxpemVSZXNvdXJjZShsb2NrKTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSxsb2NrLE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlUmVzb3VyY2UobG9jayk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBsb2NrKTsKICB9Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgPSBOVUxMOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2luaXQsIHB0aHJlYWRfcndsb2NrX2luaXQpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsRGVsZXRlUmVzb3VyY2UoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICB3aGlsZShUUlVFKQogICAgaWYgKFJ0bEFjcXVpcmVSZXNvdXJjZVNoYXJlZCgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIFRSVUUpKQogICAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19yZGxvY2ssIHB0aHJlYWRfcndsb2NrX3JkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSB7CiAgICBlcnJubyA9IEVCVVNZOwogICAgcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssIHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja193cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlRXhjbHVzaXZlKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsUmVsZWFzZVJlc291cmNlKCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja191bmxvY2ssIHB0aHJlYWRfcndsb2NrX3VubG9jayk7CgovKioqKiBSRUFELVdSSVRFIExPQ0sgQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9pbml0KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KTsKCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfZ2V0a2luZF9ucChjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50ICpwcmVmKQp7CiAgKnByZWYgPSAwOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX3NldGtpbmRfbnAocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCBwcmVmKQp7CiAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIGdsaWJjIDIuMiAqLwoKLyoqKioqIE1JU0MgKioqKiovCgpwdGhyZWFkX3QgcHRocmVhZF9zZWxmKHZvaWQpCnsKICByZXR1cm4gKHB0aHJlYWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKfQoKaW50IHB0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgcmV0dXJuIChEV09SRCl0aHJlYWQxID09IChEV09SRCl0aHJlYWQyOwp9Cgp2b2lkIF9fcHRocmVhZF9kb19leGl0KHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKQp7CiAgLyogRklYTUU6IHB0aHJlYWQgY2xlYW51cCAqLwogIEV4aXRUaHJlYWQoKERXT1JEKXJldHZhbCk7Cn0KCnZvaWQgX19wdGhyZWFkX2V4aXQodm9pZCAqcmV0dmFsKQp7CiAgICBfX3B0aHJlYWRfZG9fZXhpdCggcmV0dmFsLCBOVUxMICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9leGl0LCBwdGhyZWFkX2V4aXQpOwoKaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZShpbnQgdHlwZSwgaW50ICpvbGR0eXBlKQp7CiAgaWYgKG9sZHR5cGUpICpvbGR0eXBlID0gUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTOwogIHJldHVybiAwOwp9CgovKioqKiogQU5USS1PVkVSUklERVMgKioqKiovCi8qIHB0aHJlYWRzIHRyaWVzIHRvIG92ZXJyaWRlIHRoZXNlLCBwb2ludCB0aGVtIGJhY2sgdG8gbGliYyAqLwoKaW50IHNpZ2FjdGlvbihpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCkKewogICAgaWYgKCFsaWJjX3NpZ2FjdGlvbikKICAgIHsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IGRsc3ltKCBSVExEX05FWFQsICJzaWdhY3Rpb24iICk7CiAgICAgICAgYXNzZXJ0KCBsaWJjX3NpZ2FjdGlvbiApOwogICAgfQogICAgcmV0dXJuIGxpYmNfc2lnYWN0aW9uKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9CgpzdGF0aWMgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zIHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgPQp7CiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZm9yayAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZGVzdHJveSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSAqLwogICAgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0sICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRzY29wZSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjb3BlKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsgKi8KICAgIHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSwgICAgICAvKiBwdHJfcHRocmVhZF9jb25kYXR0cl9kZXN0cm95ICovCiAgICBwdGhyZWFkX2NvbmRhdHRyX2luaXQsICAgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZGF0dHJfaW5pdCAqLwogICAgX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9icm9hZGNhc3QgKi8KICAgIF9fcHRocmVhZF9jb25kX2Rlc3Ryb3ksICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfZGVzdHJveSAqLwogICAgX19wdGhyZWFkX2NvbmRfaW5pdCwgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9pbml0ICovCiAgICBfX3B0aHJlYWRfY29uZF9zaWduYWwsICAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX3NpZ25hbCAqLwogICAgX19wdGhyZWFkX2NvbmRfd2FpdCwgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF93YWl0ICovCiAgICBwdGhyZWFkX2VxdWFsLCAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZXF1YWwgKi8KICAgIF9fcHRocmVhZF9leGl0LCAgICAgICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2V4aXQgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9nZXRzY2hlZHBhcmFtICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2V0c2NoZWRwYXJhbSAqLwogICAgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kgKi8KICAgIF9fcHRocmVhZF9tdXRleF9pbml0LCAgICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9pbml0ICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfbG9jaywgICAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfbG9jayAqLwogICAgX19wdGhyZWFkX211dGV4X3RyeWxvY2ssICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2sgKi8KICAgIF9fcHRocmVhZF9tdXRleF91bmxvY2ssICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF91bmxvY2sgKi8KICAgIHB0aHJlYWRfc2VsZiwgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZWxmICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUgKi8KICAgIHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSwgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZXRjYW5jZWx0eXBlICovCiAgICBfX3B0aHJlYWRfZG9fZXhpdCwgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZG9fZXhpdCAqLwogICAgX19wdGhyZWFkX2NsZWFudXBfdXB0bywgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NsZWFudXBfdXB0byAqLwogICAgX19wdGhyZWFkX3RocmVhZF9zZWxmLCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3RocmVhZF9zZWxmICovCiAgICBwdGhyZWFkX2ludGVybmFsX3RzZF9zZXQsICAgICAgLyogcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCAqLwogICAgcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0LCAgICAgIC8qIHB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9nZXQgKi8KICAgIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MsICAvKiBwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcyAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NpZ2FjdGlvbiAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NpZ3dhaXQgKi8KICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9yYWlzZSAqLwp9OwoKI2Vsc2UgLyogX19HTElCQ19fIHx8IF9fRlJFRUJTRF9fICovCgp2b2lkIFBUSFJFQURfaW5pdF9kb25lKHZvaWQpCnsKfQoKI2VuZGlmIC8qIF9fR0xJQkNfXyB8fCBfX0ZSRUVCU0RfXyAqLwo=