LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCkZjRm9udFNldCAqCkZjRm9udFNldENyZWF0ZSAodm9pZCkKewogICAgRmNGb250U2V0CSpzOwoKICAgIHMgPSAoRmNGb250U2V0ICopIG1hbGxvYyAoc2l6ZW9mIChGY0ZvbnRTZXQpKTsKICAgIGlmICghcykKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX0ZPTlRTRVQsIHNpemVvZiAoRmNGb250U2V0KSk7CiAgICBzLT5uZm9udCA9IDA7CiAgICBzLT5zZm9udCA9IDA7CiAgICBzLT5mb250cyA9IDA7CiAgICByZXR1cm4gczsKfQoKdm9pZApGY0ZvbnRTZXREZXN0cm95IChGY0ZvbnRTZXQgKnMpCnsKICAgIGludAkgICAgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmZvbnQ7IGkrKykKCUZjUGF0dGVybkRlc3Ryb3kgKHMtPmZvbnRzW2ldKTsKICAgIGlmIChzLT5mb250cykKICAgIHsKCUZjTWVtRnJlZSAoRkNfTUVNX0ZPTlRQVFIsIHMtPnNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOwoJZnJlZSAocy0+Zm9udHMpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fRk9OVFNFVCwgc2l6ZW9mIChGY0ZvbnRTZXQpKTsKICAgIGZyZWUgKHMpOwp9CgpGY0Jvb2wKRmNGb250U2V0QWRkIChGY0ZvbnRTZXQgKnMsIEZjUGF0dGVybiAqZm9udCkKewogICAgRmNQYXR0ZXJuCSoqZjsKICAgIGludAkJc2ZvbnQ7CiAgICAKICAgIGlmIChzLT5uZm9udCA9PSBzLT5zZm9udCkKICAgIHsKCXNmb250ID0gcy0+c2ZvbnQgKyAzMjsKCWlmIChzLT5mb250cykKCSAgICBmID0gKEZjUGF0dGVybiAqKikgcmVhbGxvYyAocy0+Zm9udHMsIHNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOwoJZWxzZQoJICAgIGYgPSAoRmNQYXR0ZXJuICoqKSBtYWxsb2MgKHNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOwoJaWYgKCFmKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJaWYgKHMtPnNmb250KQoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX0ZPTlRQVFIsIHMtPnNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOwoJRmNNZW1BbGxvYyAoRkNfTUVNX0ZPTlRQVFIsIHNmb250ICogc2l6ZW9mIChGY1BhdHRlcm4gKikpOwoJcy0+c2ZvbnQgPSBzZm9udDsKCXMtPmZvbnRzID0gZjsKICAgIH0KICAgIHMtPmZvbnRzW3MtPm5mb250KytdID0gZm9udDsKICAgIHJldHVybiBGY1RydWU7Cn0K