LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIDk1IHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKTGliZ2ZvcnRyYW4gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCnBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAphIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOwpzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KCiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgoKI2lmIGRlZmluZWQgKEhBVkVfR0ZDX1JFQUxfMTYpCgpleHRlcm4gdm9pZCB0cmFuc3Bvc2VfcjE2IChnZmNfYXJyYXlfcjE2ICogY29uc3QgcmVzdHJpY3QgcmV0LCAKCWdmY19hcnJheV9yMTYgKiBjb25zdCByZXN0cmljdCBzb3VyY2UpOwpleHBvcnRfcHJvdG8odHJhbnNwb3NlX3IxNik7Cgp2b2lkCnRyYW5zcG9zZV9yMTYgKGdmY19hcnJheV9yMTYgKiBjb25zdCByZXN0cmljdCByZXQsIAoJZ2ZjX2FycmF5X3IxNiAqIGNvbnN0IHJlc3RyaWN0IHNvdXJjZSkKewogIC8qIHIuKiBpbmRpY2F0ZXMgdGhlIHJldHVybiBhcnJheS4gICovCiAgaW5kZXhfdHlwZSByeHN0cmlkZSwgcnlzdHJpZGU7CiAgR0ZDX1JFQUxfMTYgKiByZXN0cmljdCBycHRyOwogIC8qIHMuKiBpbmRpY2F0ZXMgdGhlIHNvdXJjZSBhcnJheS4gICovCiAgaW5kZXhfdHlwZSBzeHN0cmlkZSwgc3lzdHJpZGU7CiAgY29uc3QgR0ZDX1JFQUxfMTYgKnNwdHI7CgogIGluZGV4X3R5cGUgeGNvdW50LCB5Y291bnQ7CiAgaW5kZXhfdHlwZSB4LCB5OwoKICBhc3NlcnQgKEdGQ19ERVNDUklQVE9SX1JBTksgKHNvdXJjZSkgPT0gMik7CgogIGlmIChyZXQtPmRhdGEgPT0gTlVMTCkKICAgIHsKICAgICAgYXNzZXJ0IChHRkNfREVTQ1JJUFRPUl9SQU5LIChyZXQpID09IDIpOwogICAgICBhc3NlcnQgKHJldC0+ZHR5cGUgPT0gc291cmNlLT5kdHlwZSk7CgogICAgICBHRkNfRElNRU5TSU9OX1NFVChyZXQtPmRpbVswXSwgMCwgR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwxKSAtIDEsCgkJCTEpOwoKICAgICAgR0ZDX0RJTUVOU0lPTl9TRVQocmV0LT5kaW1bMV0sIDAsIEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMCkgLSAxLAoJCQlHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLCAxKSk7CgogICAgICByZXQtPmRhdGEgPSBpbnRlcm5hbF9tYWxsb2Nfc2l6ZSAoc2l6ZW9mIChHRkNfUkVBTF8xNikgKiBzaXplMCAoKGFycmF5X3QgKikgcmV0KSk7CiAgICAgIHJldC0+b2Zmc2V0ID0gMDsKICAgIH0gZWxzZSBpZiAodW5saWtlbHkgKGNvbXBpbGVfb3B0aW9ucy5ib3VuZHNfY2hlY2spKQogICAgewogICAgICBpbmRleF90eXBlIHJldF9leHRlbnQsIHNyY19leHRlbnQ7CgogICAgICByZXRfZXh0ZW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHJldCwwKTsKICAgICAgc3JjX2V4dGVudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMSk7CgogICAgICBpZiAoc3JjX2V4dGVudCAhPSByZXRfZXh0ZW50KQoJcnVudGltZV9lcnJvciAoIkluY29ycmVjdCBleHRlbnQgaW4gcmV0dXJuIHZhbHVlIG9mIFRSQU5TUE9TRSIKCQkgICAgICAgIiBpbnRyaW5zaWMgaW4gZGltZW5zaW9uIDE6IGlzICVsZCwiCgkJICAgICAgICIgc2hvdWxkIGJlICVsZCIsIChsb25nIGludCkgc3JjX2V4dGVudCwKCQkgICAgICAgKGxvbmcgaW50KSByZXRfZXh0ZW50KTsKCiAgICAgIHJldF9leHRlbnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQocmV0LDEpOwogICAgICBzcmNfZXh0ZW50ID0gR0ZDX0RFU0NSSVBUT1JfRVhURU5UKHNvdXJjZSwwKTsKCiAgICAgIGlmIChzcmNfZXh0ZW50ICE9IHJldF9leHRlbnQpCglydW50aW1lX2Vycm9yICgiSW5jb3JyZWN0IGV4dGVudCBpbiByZXR1cm4gdmFsdWUgb2YgVFJBTlNQT1NFIgoJCSAgICAgICAiIGludHJpbnNpYyBpbiBkaW1lbnNpb24gMjogaXMgJWxkLCIKCQkgICAgICAgIiBzaG91bGQgYmUgJWxkIiwgKGxvbmcgaW50KSBzcmNfZXh0ZW50LAoJCSAgICAgICAobG9uZyBpbnQpIHJldF9leHRlbnQpOwoKICAgIH0KCiAgc3hzdHJpZGUgPSBHRkNfREVTQ1JJUFRPUl9TVFJJREUoc291cmNlLDApOwogIHN5c3RyaWRlID0gR0ZDX0RFU0NSSVBUT1JfU1RSSURFKHNvdXJjZSwxKTsKICB4Y291bnQgPSBHRkNfREVTQ1JJUFRPUl9FWFRFTlQoc291cmNlLDApOwogIHljb3VudCA9IEdGQ19ERVNDUklQVE9SX0VYVEVOVChzb3VyY2UsMSk7CgogIHJ4c3RyaWRlID0gR0ZDX0RFU0NSSVBUT1JfU1RSSURFKHJldCwwKTsKICByeXN0cmlkZSA9IEdGQ19ERVNDUklQVE9SX1NUUklERShyZXQsMSk7CgogIHJwdHIgPSByZXQtPmRhdGE7CiAgc3B0ciA9IHNvdXJjZS0+ZGF0YTsKCiAgZm9yICh5PTA7IHkgPCB5Y291bnQ7IHkrKykKICAgIHsKICAgICAgZm9yICh4PTA7IHggPCB4Y291bnQ7IHgrKykKICAgICAgICB7CiAgICAgICAgICAqcnB0ciA9ICpzcHRyOwoKICAgICAgICAgIHNwdHIgKz0gc3hzdHJpZGU7CiAgICAgICAgICBycHRyICs9IHJ5c3RyaWRlOwogICAgICAgIH0KICAgICAgICBzcHRyICs9IHN5c3RyaWRlIC0gKHN4c3RyaWRlICogeGNvdW50KTsKICAgICAgICBycHRyICs9IHJ4c3RyaWRlIC0gKHJ5c3RyaWRlICogeGNvdW50KTsKICAgIH0KfQoKI2VuZGlmCg==