LyoKICogQ29weXJpZ2h0IKkgMjAwNy0yMDA4IFBldGVyIEh1dHRlcmVyCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CiAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKICogU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgogKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIEF1dGhvcnM6IFBldGVyIEh1dHRlcmVyLCBVbml2ZXJzaXR5IG9mIFNvdXRoIEF1c3RyYWxpYSwgTklDVEEKICoKICovCgoKLyogWEdFIENsaWVudCBpbnRlcmZhY2VzICovCgojaWZuZGVmIF9YR0VfSF8KI2RlZmluZSBfWEdFX0hfCgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CgpfWEZVTkNQUk9UT0JFR0lOCgovKioKICogR2VuZXJpYyBFdmVudCBtYXNrLiAKICogVG8gYmUgdXNlZCB3aGVuZXZlciBhIGxpc3Qgb2YgbWFza3MgcGVyIGV4dGVuc2lvbiBoYXMgdG8gYmUgcHJvdmlkZWQuCiAqCiAqIEJ1dCwgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSBDQVJEezgsMTYsMzJ9IHR5cGVzLiAgV2UgY2FuJ3QgZ2V0IHRoZW0gdGhlbQogKiBkZWZpbmVkIGhlcmUgd2l0aG91dCBwb2xsdXRpbmcgdGhlIG5hbWVzcGFjZS4KICovCnR5cGVkZWYgc3RydWN0IHsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgZXh0ZW5zaW9uOwogICAgdW5zaWduZWQgY2hhciAgICAgICBwYWQwOwogICAgdW5zaWduZWQgc2hvcnQgICAgICBwYWQxOwogICAgdW5zaWduZWQgaW50ICAgICAgZXZtYXNrOwp9IFhHZW5lcmljRXZlbnRNYXNrOwoKQm9vbCBYR0VRdWVyeUV4dGVuc2lvbihEaXNwbGF5KiBkcHksIGludCAqZXZlbnRfYmFzZXAsIGludCAqZXJyX2Jhc2VwKTsKQm9vbCBYR0VRdWVyeVZlcnNpb24oRGlzcGxheSogZHB5LCBpbnQgKm1ham9yLCBpbnQqIG1pbm9yKTsKCl9YRlVOQ1BST1RPRU5ECgojZW5kaWYgLyogX1hHRV9IXyAqLwo=