Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAovLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQoKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIKCiNkZWZpbmUgREVGQVVMVF9GT05UX05BTUUJCQkiSGVsdmV0aWNhIgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfRm9udE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCkNQV0xfRm9udE1hcDo6Q1BXTF9Gb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikgOiAJCgltX3BQREZEb2MoTlVMTCksCgltX3BTeXN0ZW1IYW5kbGVyKHBTeXN0ZW1IYW5kbGVyKQp7CglBU1NFUlQobV9wU3lzdGVtSGFuZGxlciAhPSBOVUxMKTsKfQoKQ1BXTF9Gb250TWFwOjp+Q1BXTF9Gb250TWFwKCkKewoJaWYgKG1fcFBERkRvYykKCXsKCQlkZWxldGUgbV9wUERGRG9jOwoJCW1fcFBERkRvYyA9IE5VTEw7Cgl9CgoJRW1wdHkoKTsKfQoKdm9pZCBDUFdMX0ZvbnRNYXA6OlNldFN5c3RlbUhhbmRsZXIoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKQp7CgltX3BTeXN0ZW1IYW5kbGVyID0gcFN5c3RlbUhhbmRsZXI7Cn0KCkNQREZfRG9jdW1lbnQqIENQV0xfRm9udE1hcDo6R2V0RG9jdW1lbnQoKQp7CglpZiAoIW1fcFBERkRvYykKCXsKCQlpZiAoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpKQoJCXsKCQkJbV9wUERGRG9jID0gbmV3IENQREZfRG9jdW1lbnQ7CgkJCW1fcFBERkRvYy0+Q3JlYXRlTmV3RG9jKCk7CgkJfQoJfQoKCXJldHVybiBtX3BQREZEb2M7Cn0KCkNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkKewoJaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKCXsKCQlpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkKCQl7CgkJCXJldHVybiBwRGF0YS0+cEZvbnQ7CgkJfQoJfQoKCXJldHVybiBOVUxMOwp9CgpDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpCnsKCWlmIChuRm9udEluZGV4ID49MCAmJiBuRm9udEluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCgl7CgkJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCgkJewoJCQlyZXR1cm4gcERhdGEtPnNGb250TmFtZTsKCQl9Cgl9CgoJcmV0dXJuICIiOwp9CgpGWF9CT09MIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCnsKCWlmIChuRm9udEluZGV4ID49MCAmJiBuRm9udEluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCgl7CgkJaWYgKG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCgkJewkKCQkJcmV0dXJuIENoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgd29yZCkgPj0gMDsKCQl9Cgl9CgoJcmV0dXJuIEZBTFNFOwp9CgppbnQzMl90IENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQsIGludDMyX3QgbkZvbnRJbmRleCkKewoJaWYgKG5Gb250SW5kZXggPiAwKQoJewoJCWlmIChLbm93V29yZChuRm9udEluZGV4LCB3b3JkKSkKCQkJcmV0dXJuIG5Gb250SW5kZXg7Cgl9CgllbHNlCgl7CgkJaWYgKGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IEdldEZvbnRNYXBEYXRhKDApKQoJCXsKCQkJaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCB8fCAKCQkJCXBEYXRhLT5uQ2hhcnNldCA9PSBTWU1CT0xfQ0hBUlNFVCB8fCAKCQkJCW5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkKCQkJewoJCQkJaWYgKEtub3dXb3JkKDAsIHdvcmQpKQoJCQkJewoJCQkJCXJldHVybiAwOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWludDMyX3Qgbk5ld0ZvbnRJbmRleCA9IC0xOwoKCW5OZXdGb250SW5kZXggPSB0aGlzLT5HZXRGb250SW5kZXgoR2V0TmF0aXZlRm9udE5hbWUobkNoYXJzZXQpLCBuQ2hhcnNldCwgVFJVRSk7CglpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQoJewoJCWlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKCQkJcmV0dXJuIG5OZXdGb250SW5kZXg7Cgl9CgoJbk5ld0ZvbnRJbmRleCA9IHRoaXMtPkdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgRkFMU0UpOwoJaWYgKG5OZXdGb250SW5kZXggPj0gMCkKCXsKCQlpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCgkJcmV0dXJuIG5OZXdGb250SW5kZXg7Cgl9CgoJcmV0dXJuIC0xOwp9CgppbnQzMl90IENQV0xfRm9udE1hcDo6Q2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkKewoJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCgl7CgkJaWYgKHBEYXRhLT5wRm9udCkKCQl7CgkJCWlmIChwRGF0YS0+cEZvbnQtPklzVW5pY29kZUNvbXBhdGlibGUoKSkKCQkJewoJCQkJaW50IG5DaGFyQ29kZSA9IHBEYXRhLT5wRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKCQkJCXBEYXRhLT5wRm9udC0+R2x5cGhGcm9tQ2hhckNvZGUobkNoYXJDb2RlKTsKCQkJCXJldHVybiBuQ2hhckNvZGU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZiAod29yZCA8IDB4RkYpCgkJCQkJcmV0dXJuIHdvcmQ7CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIC0xOwp9CgpDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUZvbnROYW1lKGludDMyX3QgbkNoYXJzZXQpCnsKCS8vc2VhcmNoaW5nIG5hdGl2ZSBmb250IGlzIHNsb3csIHNvIHdlIG11c3Qgc2F2ZSB0aW1lCglmb3IgKGludDMyX3QgaT0wLHN6PW1fYU5hdGl2ZUZvbnQuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCgl7CgkJaWYgKENQV0xfRm9udE1hcF9OYXRpdmUqIHBEYXRhID0gbV9hTmF0aXZlRm9udC5HZXRBdChpKSkKCQl7CgkJCWlmIChwRGF0YS0+bkNoYXJzZXQgPT0gbkNoYXJzZXQpCgkJCQlyZXR1cm4gcERhdGEtPnNGb250TmFtZTsKCQl9Cgl9CgoJQ0ZYX0J5dGVTdHJpbmcgc05ldyA9IEdldE5hdGl2ZUZvbnQobkNoYXJzZXQpOwoKCWlmICghc05ldy5Jc0VtcHR5KCkpCgl7CgkJQ1BXTF9Gb250TWFwX05hdGl2ZSogcE5ld0RhdGEgPSBuZXcgQ1BXTF9Gb250TWFwX05hdGl2ZTsKCQlwTmV3RGF0YS0+bkNoYXJzZXQgPSBuQ2hhcnNldDsKCQlwTmV3RGF0YS0+c0ZvbnROYW1lID0gc05ldzsKCgkJbV9hTmF0aXZlRm9udC5BZGQocE5ld0RhdGEpOwoJfQoKCXJldHVybiBzTmV3Owp9Cgp2b2lkIENQV0xfRm9udE1hcDo6RW1wdHkoKQp7Cgl7CgkJZm9yIChpbnQzMl90IGk9MCwgc3o9bV9hRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKCQkJZGVsZXRlIG1fYURhdGEuR2V0QXQoaSk7CgoJCW1fYURhdGEuUmVtb3ZlQWxsKCk7Cgl9Cgl7CgkJZm9yIChpbnQzMl90IGk9MCwgc3o9bV9hTmF0aXZlRm9udC5HZXRTaXplKCk7IGk8c3o7IGkrKykKCQkJZGVsZXRlIG1fYU5hdGl2ZUZvbnQuR2V0QXQoaSk7CgoJCW1fYU5hdGl2ZUZvbnQuUmVtb3ZlQWxsKCk7Cgl9Cn0KCnZvaWQgQ1BXTF9Gb250TWFwOjpJbml0aWFsKGNvbnN0IEZYX0NIQVIqIGZvbnRuYW1lKQp7CglDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBmb250bmFtZTsKCglpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkKCQlzRm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsKCglHZXRGb250SW5kZXgoc0ZvbnROYW1lLCBBTlNJX0NIQVJTRVQsIEZBTFNFKTsKCgkvL0dldEZvbnRJbmRleCh0aGlzLT5HZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0KTsKfQoJCgovKgpMaXN0IG9mIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3RhbmRhcmQgZm9udHM6CkNvdXJpZXIsIENvdXJpZXItQm9sZCwgQ291cmllci1Cb2xkT2JsaXF1ZSwgQ291cmllci1PYmxpcXVlCkhlbHZldGljYSwgSGVsdmV0aWNhLUJvbGQsIEhlbHZldGljYS1Cb2xkT2JsaXF1ZSwgSGVsdmV0aWNhLU9ibGlxdWUKVGltZXMtUm9tYW4sIFRpbWVzLUJvbGQsIFRpbWVzLUl0YWxpYywgVGltZXMtQm9sZEl0YWxpYwpTeW1ib2wsIFphcGZEaW5nYmF0cwoqLwoKY29uc3QgY2hhciogZ19zREVTdGFuZGFyZEZvbnROYW1lW10gPSB7IkNvdXJpZXIiLCAiQ291cmllci1Cb2xkIiwgIkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllci1PYmxpcXVlIiwKCSJIZWx2ZXRpY2EiLCAiSGVsdmV0aWNhLUJvbGQiLCAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwgIkhlbHZldGljYS1PYmxpcXVlIiwKCSJUaW1lcy1Sb21hbiIsICJUaW1lcy1Cb2xkIiwgIlRpbWVzLUl0YWxpYyIsICJUaW1lcy1Cb2xkSXRhbGljIiwKCSJTeW1ib2wiLCAiWmFwZkRpbmdiYXRzIn07CgpGWF9CT09MCUNQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKewoJZm9yIChpbnQzMl90IGk9MDsgaTwxNDsgaSsrKQoJewoJCWlmIChzRm9udE5hbWUgPT0gZ19zREVTdGFuZGFyZEZvbnROYW1lW2ldKQoJCQlyZXR1cm4gVFJVRTsKCX0KCglyZXR1cm4gRkFMU0U7Cn0KCmludDMyX3QgQ1BXTF9Gb250TWFwOjpGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBpbnQzMl90IG5DaGFyc2V0KQp7Cglmb3IgKGludDMyX3QgaT0wLHN6PW1fYURhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCgl7CgkJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQoaSkpCgkJewoJCQlpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8IG5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkKCQkJewoJCQkJaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkgfHwgcERhdGEtPnNGb250TmFtZSA9PSBzRm9udE5hbWUpCgkJCQkJcmV0dXJuIGk7CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIC0xOwp9CgppbnQzMl90IENQV0xfRm9udE1hcDo6R2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQsIEZYX0JPT0wgYkZpbmQpCnsKCWludDMyX3QgbkZvbnRJbmRleCA9IEZpbmRGb250KEVuY29kZUZvbnRBbGlhcyhzRm9udE5hbWUsIG5DaGFyc2V0KSwgbkNoYXJzZXQpOwoJaWYgKG5Gb250SW5kZXggPj0gMCkgcmV0dXJuIG5Gb250SW5kZXg7CgovLwluRm9udEluZGV4ID0gRmluZEZvbnQoIiIsIG5DaGFyc2V0KTsKLy8JaWYgKG5Gb250SW5kZXggPj0gMCkgcmV0dXJuIG5Gb250SW5kZXg7CgoJQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzOwoJQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7CgoJaWYgKGJGaW5kKQoJCXBGb250ID0gRmluZEZvbnRTYW1lQ2hhcnNldChzQWxpYXMsIG5DaGFyc2V0KTsKCglpZiAoIXBGb250KQoJewoJCUNGWF9CeXRlU3RyaW5nIHNUZW1wID0gc0ZvbnROYW1lOwoJCXBGb250ID0gQWRkRm9udFRvRG9jdW1lbnQoR2V0RG9jdW1lbnQoKSwgc1RlbXAsIG5DaGFyc2V0KTsKCgkJLyoKCQlpZiAoRmluZEZvbnQoc0FsaWFzKSkKCQl7CgkJCXNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOwoJCX0KCQllbHNlCgkJKi8KCQl7CgkJCXNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOwoJCX0JCQoJfQoKCUFkZGVkRm9udChwRm9udCwgc0FsaWFzKTsKCglyZXR1cm4gQWRkRm9udERhdGEocEZvbnQsIHNBbGlhcywgbkNoYXJzZXQpOwp9CgppbnQzMl90IENQV0xfRm9udE1hcDo6R2V0UFdMRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBuQ2hhcnNldCkKewoJaW50MzJfdCBuRmluZCA9IC0xOwoKCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKCXsKCQlpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChpKSkKCQl7CgkJCWlmIChwRGF0YS0+bkNoYXJzZXQgPT0gbkNoYXJzZXQpCgkJCXsKCQkJCW5GaW5kID0gaTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCUNQREZfRm9udCogcE5ld0ZvbnQgPSBHZXRQREZGb250KG5GaW5kKTsKCglpZiAoIXBOZXdGb250KSByZXR1cm4gLTE7CgoJLyoKCWlmIChDUERGX0ZvbnQqIHBGb250ID0gR2V0UERGRm9udChuRmluZCkpCgl7CgkJUFdMRm9udC5BZGRXb3JkVG9Gb250RGljdChwRm9udERpY3QsIHdvcmQpOwoJfQoJKi8KCglDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSBFbmNvZGVGb250QWxpYXMoIkFyaWFsX0Nocm9tZSIsIG5DaGFyc2V0KTsKCUFkZGVkRm9udChwTmV3Rm9udCwgc0FsaWFzKTsKCglyZXR1cm4gQWRkRm9udERhdGEocE5ld0ZvbnQsIHNBbGlhcywgbkNoYXJzZXQpOwp9CgpDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgaW50MzJfdCBuQ2hhcnNldCkKewoJcmV0dXJuIE5VTEw7Cn0KCmludDMyX3QgQ1BXTF9Gb250TWFwOjpBZGRGb250RGF0YShDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgaW50MzJfdCBuQ2hhcnNldCkKewoJQ1BXTF9Gb250TWFwX0RhdGEqIHBOZXdEYXRhID0gbmV3IENQV0xfRm9udE1hcF9EYXRhOwoJcE5ld0RhdGEtPnBGb250ID0gcEZvbnQ7CglwTmV3RGF0YS0+c0ZvbnROYW1lID0gc0ZvbnRBbGlhczsKCXBOZXdEYXRhLT5uQ2hhcnNldCA9IG5DaGFyc2V0OwoKCW1fYURhdGEuQWRkKHBOZXdEYXRhKTsKCglyZXR1cm4gbV9hRGF0YS5HZXRTaXplKCkgLTE7Cn0KCnZvaWQgQ1BXTF9Gb250TWFwOjpBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpCnsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXRGb250TmFtZShpbnQzMl90IG5Gb250SW5kZXgpCnsKCWlmIChuRm9udEluZGV4ID49MCAmJiBuRm9udEluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCgl7CgkJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCgkJewoJCQlyZXR1cm4gcERhdGEtPnNGb250TmFtZTsKCQl9Cgl9CgoJcmV0dXJuICIiOwp9CgpDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUZvbnQoaW50MzJfdCBuQ2hhcnNldCkKewoJQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lOwoKCWlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQpCgkJbkNoYXJzZXQgPSBHZXROYXRpdmVDaGFyc2V0KCk7CgoJc0ZvbnROYW1lID0gR2V0RGVmYXVsdEZvbnRCeUNoYXJzZXQobkNoYXJzZXQpOwoKCWlmIChtX3BTeXN0ZW1IYW5kbGVyKQoJewoJCWlmIChtX3BTeXN0ZW1IYW5kbGVyLT5GaW5kTmF0aXZlVHJ1ZVR5cGVGb250KG5DaGFyc2V0LCBzRm9udE5hbWUpKQoJCQlyZXR1cm4gc0ZvbnROYW1lOwoKCQlzRm9udE5hbWUgPSBtX3BTeXN0ZW1IYW5kbGVyLT5HZXROYXRpdmVUcnVlVHlwZUZvbnQobkNoYXJzZXQpOwoJfQoKCXJldHVybiBzRm9udE5hbWU7Cn0KCkNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCB1aW50OF90IG5DaGFyc2V0KQp7CglpZiAoSXNTdGFuZGFyZEZvbnQoc0ZvbnROYW1lKSkKCQlyZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2MsIHNGb250TmFtZSk7CgllbHNlCgkJcmV0dXJuIEFkZFN5c3RlbUZvbnQocERvYywgc0ZvbnROYW1lLCBuQ2hhcnNldCk7Cn0KCkNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKewoJaWYgKCFwRG9jKSByZXR1cm4gTlVMTDsKCglDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKCglpZiAoc0ZvbnROYW1lID09ICJaYXBmRGluZ2JhdHMiKQoJCXBGb250ID0gcERvYy0+QWRkU3RhbmRhcmRGb250KHNGb250TmFtZSwgTlVMTCk7CgllbHNlCgl7CgkJQ1BERl9Gb250RW5jb2RpbmcgZmUoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKCQlwRm9udCA9IHBEb2MtPkFkZFN0YW5kYXJkRm9udChzRm9udE5hbWUsICZmZSk7Cgl9CgoJcmV0dXJuIHBGb250Owp9CgpDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCB1aW50OF90IG5DaGFyc2V0KQp7CglpZiAoIXBEb2MpIHJldHVybiBOVUxMOwoKCWlmIChzRm9udE5hbWUuSXNFbXB0eSgpKSBzRm9udE5hbWUgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsKCWlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQpIG5DaGFyc2V0ID0gR2V0TmF0aXZlQ2hhcnNldCgpOwoKCWlmIChtX3BTeXN0ZW1IYW5kbGVyKQoJCXJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5BZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihwRG9jLCBzRm9udE5hbWUsIG5DaGFyc2V0KTsKCQoJcmV0dXJuIE5VTEw7Cn0KCkNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6RW5jb2RlRm9udEFsaWFzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQpCnsKCUNGWF9CeXRlU3RyaW5nIHNQb3N0Zml4OwoJc1Bvc3RmaXguRm9ybWF0KCJfJTAyWCIsIG5DaGFyc2V0KTsKCXJldHVybiBFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lKSArIHNQb3N0Zml4Owp9CgpDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKQp7CglDRlhfQnl0ZVN0cmluZyBzUmV0ID0gc0ZvbnROYW1lOwoJc1JldC5SZW1vdmUoJyAnKTsKCXJldHVybiBzUmV0Owp9CgppbnQzMl90IENQV0xfRm9udE1hcDo6R2V0Rm9udE1hcENvdW50KCkgY29uc3QKewoJcmV0dXJuIG1fYURhdGEuR2V0U2l6ZSgpOwp9Cgpjb25zdCBDUFdMX0ZvbnRNYXBfRGF0YSogQ1BXTF9Gb250TWFwOjpHZXRGb250TWFwRGF0YShpbnQzMl90IG5JbmRleCkgY29uc3QKewoJaWYgKG5JbmRleCA+PTAgJiYgbkluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCgl7CgkJcmV0dXJuIG1fYURhdGEuR2V0QXQobkluZGV4KTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUNoYXJzZXQoKQp7Cgl1aW50OF90IG5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOwoJaW50MzJfdCBpQ29kZVBhZ2UgPSBGWFNZU19HZXRBQ1AoKTsKCXN3aXRjaCAoaUNvZGVQYWdlKQoJewoJY2FzZSA5MzI6Ly9KYXBhbgoJCW5DaGFyc2V0ID0gU0hJRlRKSVNfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgOTM2Oi8vQ2hpbmVzZSAoUFJDLCBTaW5nYXBvcmUpCgkJbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgOTUwOi8vQ2hpbmVzZSAoVGFpd2FuOyBIb25nIEtvbmcgU0FSLCBQUkMpCgkJbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTI1MjovL1dpbmRvd3MgMy4xIExhdGluIDEgKFVTLCBXZXN0ZXJuIEV1cm9wZSkKCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgODc0Oi8vVGhhaQoJCW5DaGFyc2V0ID0gVEhBSV9DSEFSU0VUOwoJCWJyZWFrOwoJY2FzZSA5NDk6Ly9Lb3JlYW4KCQluQ2hhcnNldCA9IEhBTkdVTF9DSEFSU0VUOwoJCWJyZWFrOwoJY2FzZSAxMjAwOi8vVW5pY29kZSAoQk1QIG9mIElTTyAxMDY0NikKCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTI1MDovL1dpbmRvd3MgMy4xIEVhc3Rlcm4gRXVyb3BlYW4KCQluQ2hhcnNldCA9IEVBU1RFVVJPUEVfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTI1MTovL1dpbmRvd3MgMy4xIEN5cmlsbGljCgkJbkNoYXJzZXQgPSBSVVNTSUFOX0NIQVJTRVQ7CgkJYnJlYWs7CgljYXNlIDEyNTM6Ly9XaW5kb3dzIDMuMSBHcmVlawoJCW5DaGFyc2V0ID0gR1JFRUtfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTI1NDovL1dpbmRvd3MgMy4xIFR1cmtpc2gKCQluQ2hhcnNldCA9IFRVUktJU0hfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTI1NTovL0hlYnJldwoJCW5DaGFyc2V0ID0gSEVCUkVXX0NIQVJTRVQ7CgkJYnJlYWs7CgljYXNlIDEyNTY6Ly9BcmFiaWMKCQluQ2hhcnNldCA9IEFSQUJJQ19DSEFSU0VUOwoJCWJyZWFrOwoJY2FzZSAxMjU3Oi8vQmFsdGljCgkJbkNoYXJzZXQgPSBCQUxUSUNfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTI1ODovL1ZpZXRuYW1lc2UKCQluQ2hhcnNldCA9IFZJRVROQU1FU0VfQ0hBUlNFVDsKCQlicmVhazsKCWNhc2UgMTM2MTovL0tvcmVhbihKb2hhYikKCQluQ2hhcnNldCA9IEpPSEFCX0NIQVJTRVQ7CgkJYnJlYWs7Cgl9CglyZXR1cm4gbkNoYXJzZXQ7Cn0KCmNvbnN0IENQV0xfRm9udE1hcDo6Q2hhcnNldEZvbnRNYXAgQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwW10gPSB7Cgl7IEFOU0lfQ0hBUlNFVCwgIkhlbHZldGljYSIgfSwKCXsgR0IyMzEyX0NIQVJTRVQsICJTaW1TdW4iIH0sCgl7IENISU5FU0VCSUc1X0NIQVJTRVQsICJNaW5nTGlVIiB9LAoJeyBTSElGVEpJU19DSEFSU0VULCAiTVMgR290aGljIiB9LAoJeyBIQU5HVUxfQ0hBUlNFVCwgIkJhdGFuZyIgfSwKCXsgUlVTU0lBTl9DSEFSU0VULCAiQXJpYWwiIH0sCiNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwoJeyBFQVNURVVST1BFX0NIQVJTRVQsICJBcmlhbCIgfSwKI2Vsc2UKCXsgRUFTVEVVUk9QRV9DSEFSU0VULCAiVGFob21hIiB9LAojZW5kaWYKCXsgQVJBQklDX0NIQVJTRVQsICJBcmlhbCIgfSwKCXsgLTEsIE5VTEwgfQp9OwoKQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KQp7CglpbnQgaSA9IDA7Cgl3aGlsZSAoZGVmYXVsdFRURk1hcFtpXS5jaGFyc2V0ICE9IC0xKSB7CgkJaWYgKG5DaGFyc2V0ID09IGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCkKCQkJcmV0dXJuIGRlZmF1bHRUVEZNYXBbaV0uZm9udG5hbWU7CiAgICAgICAgKytpOwoJfQoJcmV0dXJuICIiOwp9CgppbnQzMl90IENQV0xfRm9udE1hcDo6Q2hhclNldEZyb21Vbmljb2RlKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCkKewoJaWYobV9wU3lzdGVtSGFuZGxlciAmJiAoLTEgIT0gbV9wU3lzdGVtSGFuZGxlci0+R2V0Q2hhclNldCgpKSkKCQlyZXR1cm4gbV9wU3lzdGVtSGFuZGxlci0+R2V0Q2hhclNldCgpOwoJLy90byBhdm9pZCBDSksgRm9udCB0byBzaG93IEFTQ0lJCglpZiAod29yZCA8IDB4N0YpIHJldHVybiBBTlNJX0NIQVJTRVQ7CgkvL2ZvbGxvdyB0aGUgb2xkIGNoYXJzZXQKCWlmIChuT2xkQ2hhcnNldCAhPSBERUZBVUxUX0NIQVJTRVQpIHJldHVybiBuT2xkQ2hhcnNldDsKCgkvL2ZpbmQgbmV3IGNoYXJzZXQKCWlmICgod29yZCA+PSAweDRFMDAgJiYgd29yZCA8PSAweDlGQTUpIHx8IAoJCSh3b3JkID49IDB4RTdDNyAmJiB3b3JkIDw9IDB4RTdGMykgfHwKCQkod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHx8IC8vo6kiobYiICKhtyIgIqGjIiAioaIiIAoJCSh3b3JkID49IDB4MjAwMCAmJiB3b3JkIDw9IDB4MjA2RikpCgl7CgkJcmV0dXJuIEdCMjMxMl9DSEFSU0VUOwoJfQoKCWlmICgoKHdvcmQgPj0gMHgzMDQwKSAmJiAod29yZCA8PSAweDMwOUYpKSB8fAoJCSgod29yZCA+PSAweDMwQTApICYmICh3b3JkIDw9IDB4MzBGRikpIHx8CgkJKCh3b3JkID49IDB4MzFGMCkgJiYgKHdvcmQgPD0gMHgzMUZGKSkgfHwKCQkoKHdvcmQgPj0gMHhGRjAwKSAmJiAod29yZCA8PSAweEZGRUYpKSApCgl7CgkJcmV0dXJuIFNISUZUSklTX0NIQVJTRVQ7Cgl9CgoJaWYgKCgod29yZCA+PSAweEFDMDApICYmICh3b3JkIDw9IDB4RDdBRikpIHx8CgkJKCh3b3JkID49IDB4MTEwMCkgJiYgKHdvcmQgPD0gMHgxMUZGKSkgfHwKCQkoKHdvcmQgPj0gMHgzMTMwKSAmJiAod29yZCA8PSAweDMxOEYpKSkKCXsKCQlyZXR1cm4gSEFOR1VMX0NIQVJTRVQ7Cgl9CgoJaWYgKHdvcmQgPj0gMHgwRTAwICYmIHdvcmQgPD0gMHgwRTdGKQoJCXJldHVybiBUSEFJX0NIQVJTRVQ7CgoJaWYgKCh3b3JkID49IDB4MDM3MCAmJiB3b3JkIDw9IDB4MDNGRikgfHwKCQkod29yZCA+PSAweDFGMDAgJiYgd29yZCA8PSAweDFGRkYpKQoJCXJldHVybiBHUkVFS19DSEFSU0VUOwoKCWlmICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8CgkJKHdvcmQgPj0gMHhGQjUwICYmIHdvcmQgPD0gMHhGRUZDKSkKCQlyZXR1cm4gQVJBQklDX0NIQVJTRVQ7CgoJaWYgKHdvcmQgPj0gMHgwNTkwICYmIHdvcmQgPD0gMHgwNUZGKQoJCXJldHVybiBIRUJSRVdfQ0hBUlNFVDsKCglpZiAod29yZCA+PSAweDA0MDAgJiYgd29yZCA8PSAweDA0RkYpCgkJcmV0dXJuIFJVU1NJQU5fQ0hBUlNFVDsKCglpZiAod29yZCA+PSAweDAxMDAgJiYgd29yZCA8PSAweDAyNEYpCgkJcmV0dXJuIEVBU1RFVVJPUEVfQ0hBUlNFVDsKCglpZiAod29yZCA+PSAweDFFMDAgJiYgd29yZCA8PSAweDFFRkYpCgkJcmV0dXJuIFZJRVROQU1FU0VfQ0hBUlNFVDsKCglyZXR1cm4gQU5TSV9DSEFSU0VUOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Eb2NGb250TWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKQ1BXTF9Eb2NGb250TWFwOjpDUFdMX0RvY0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLCBDUERGX0RvY3VtZW50KiBwQXR0YWNoZWREb2MpIAoJOiBDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAoJbV9wQXR0YWNoZWREb2MocEF0dGFjaGVkRG9jKQp7Cn0KCkNQV0xfRG9jRm9udE1hcDo6fkNQV0xfRG9jRm9udE1hcCgpCnsKfQoKQ1BERl9Eb2N1bWVudCogQ1BXTF9Eb2NGb250TWFwOjpHZXREb2N1bWVudCgpCnsKCXJldHVybiBtX3BBdHRhY2hlZERvYzsKfQo=