LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcwogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEdBUkVUSCBIVUdIRVMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKLyoKICogQXV0aG9yczoKICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogKglMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KICoJSm9z6SBGb25zZWNhIDxqX3JfZm9uc2VjYUB5YWhvby5jby51az4KICovCgojaWZuZGVmIF9fTUFDSDY0X1ZCX0hfXwojZGVmaW5lIF9fTUFDSDY0X1ZCX0hfXwoKI2luY2x1ZGUgIm10eXBlcy5oIgojaW5jbHVkZSAic3dyYXN0L3N3cmFzdC5oIgojaW5jbHVkZSAibWFjaDY0X2NvbnRleHQuaCIKCi8qIHByZW11bHRpcGx5IHRleHR1cmUgY29vcmRpbmF0ZXMgYnkgaG9tb2dlbm91cyBjb29yZGluYXRlICovCiNkZWZpbmUgTUFDSDY0X1BSRU1VTFRfVEVYQ09PUkRTCgojZGVmaW5lIF9NQUNINjRfTkVXX1ZFUlRFWF9TVEFURSAoX0REX05FV19TRVBBUkFURV9TUEVDVUxBUiB8ICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ERF9ORVdfVFJJX0xJR0hUX1RXT1NJREUgfCAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRERfTkVXX1RSSV9VTkZJTExFRCB8ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX05FV19URVhUVVJFIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ORVdfRk9HKQoKCmV4dGVybiB2b2lkIG1hY2g2NENoZWNrVGV4U2l6ZXMoIEdMY29udGV4dCAqY3R4ICk7CmV4dGVybiB2b2lkIG1hY2g2NENob29zZVZlcnRleFN0YXRlKCBHTGNvbnRleHQgKmN0eCApOwoKZXh0ZXJuIHZvaWQgbWFjaDY0QnVpbGRWZXJ0aWNlcyggR0xjb250ZXh0ICpjdHgsIEdMdWludCBzdGFydCwgR0x1aW50IGNvdW50LAoJCQkJICAgR0x1aW50IG5ld2lucHV0cyApOwoKZXh0ZXJuIHZvaWQgbWFjaDY0UHJpbnRTZXR1cEZsYWdzKGNoYXIgKm1zZywgR0x1aW50IGZsYWdzICk7CgpleHRlcm4gdm9pZCBtYWNoNjRJbml0VkIoIEdMY29udGV4dCAqY3R4ICk7CmV4dGVybiB2b2lkIG1hY2g2NEZyZWVWQiggR0xjb250ZXh0ICpjdHggKTsKCiNpZiAwCmV4dGVybiB2b2lkIG1hY2g2NF9lbWl0X2NvbnRpZ3VvdXNfdmVydHMoIEdMY29udGV4dCAqY3R4LAoJCQkJCSAgICBHTHVpbnQgc3RhcnQsCgkJCQkJICAgIEdMdWludCBjb3VudCApOwoKZXh0ZXJuIHZvaWQgbWFjaDY0X2VtaXRfaW5kZXhlZF92ZXJ0cyggR0xjb250ZXh0ICpjdHgsCgkJCQkJIEdMdWludCBzdGFydCwKCQkJCQkgR0x1aW50IGNvdW50ICk7CiNlbmRpZgoKZXh0ZXJuIHZvaWQgbWFjaDY0X3RyYW5zbGF0ZV92ZXJ0ZXgoIEdMY29udGV4dCAqY3R4LAoJCQkJICAgICAgIGNvbnN0IG1hY2g2NFZlcnRleCAqc3JjLAoJCQkJICAgICAgIFNXdmVydGV4ICpkc3QgKTsKCmV4dGVybiB2b2lkIG1hY2g2NF9wcmludF92ZXJ0ZXgoIEdMY29udGV4dCAqY3R4LCBjb25zdCBtYWNoNjRWZXJ0ZXggKnYgKTsKCgojZW5kaWYgLyogX19NQUNINjRfVkJfSF9fICovCg==