<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>15610</bug_id>
          
          <creation_ts>2007-10-22 01:29:35 -0700</creation_ts>
          <short_desc>[GTK] Text rendering using Pango</short_desc>
          <delta_ts>2008-01-08 20:45:50 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>523.x (Safari 3)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Cairo, Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alp Toker">alp</reporter>
          <assigned_to name="Sven Herzberg">sven</assigned_to>
          <cc>mh+webkit</cc>
    
    <cc>pravi.a</cc>
    
    <cc>sven</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>59106</commentid>
    <comment_count>0</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-10-22 01:29:35 -0700</bug_when>
    <thetext>We should support text rendering through Pango/Cairo in addition to the traditional path.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61057</commentid>
    <comment_count>1</comment_count>
      <attachid>17222</attachid>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-11-12 23:23:51 -0800</bug_when>
    <thetext>Created attachment 17222
Proof of concept Pango text rendering

This patch is based partly on the text rendering code from gtk-webcore. It uses Pango/Cairo for all text rendering, forcing WebCore to use the Complex CodePath all the time (which is useful for testing).

It does not support font selection but just uses the Pango defaults. There is a bug with the position text is drawn at, so I&apos;ve disabled text underlining in GraphicsContext for now to make browsing bearable.

I haven&apos;t spent much time on this feature so I&apos;m sure there is plenty of room for improvement/correction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63753</commentid>
    <comment_count>2</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-12-09 11:01:14 -0800</bug_when>
    <thetext>Sven, is there any word on this one? I&apos;d like to get whatever patch we have into SVN, this is becoming an important missing feature.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>65421</commentid>
    <comment_count>3</comment_count>
    <who name="Praveen A">pravi.a</who>
    <bug_when>2007-12-27 18:30:48 -0800</bug_when>
    <thetext>Open Office is using icu for text layout in addition to content manipulation. Can we use icu for text layout also in WebKit? This would enable rendering of complex text like Indic (Malayalam, Hindi, Tamil...), Arabic, Thai.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>65422</commentid>
    <comment_count>4</comment_count>
    <who name="Praveen A">pravi.a</who>
    <bug_when>2007-12-27 18:37:08 -0800</bug_when>
    <thetext>Some more info about how ICU actually handles complex text
http://www.icu-project.org/userguide/layoutEngine.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>65428</commentid>
    <comment_count>5</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2007-12-27 22:12:10 -0800</bug_when>
    <thetext>Some comments on the code while I wait for WebKit to build and test it...

+// FIXME: having this code here is silly
+static gchar* convertUniCharToUTF8(const UChar* characters, int from, int to)

I assume this means: transform UChar, starting at character (and not byte) &apos;from&apos;, up to character &apos;to&apos;, to UTF8.

+    gchar *utf8 = g_utf16_to_utf8(str, to, NULL, NULL, NULL);

No error checking, but that was an easy one.

+    if (from &gt; 0) {
+        gchar *str_left = g_strdup(utf8);
+        str_left = g_utf8_strncpy(str_left, utf8, from);

Dup utf8 to str_left and immediately overwrite it? With the &apos;from&apos; first characters from utf8?

+        g_free(utf8);
+        utf8 = str_left;
+    }

Ok, so utf8 now contains its &apos;from&apos; first characters?

The code to substitute line breaks for spaces comes after that. Looks ok at first sight (wonder if there&apos;s no easier way to do it), but not sure the code up to that point is ok.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>65482</commentid>
    <comment_count>6</comment_count>
      <attachid>18152</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2007-12-28 13:05:24 -0800</bug_when>
    <thetext>Created attachment 18152
0001-Update-Alp-s-patch-to-the-new-APIs-TextStyle-folded.patch

Subject: [PATCH] Update Alp&apos;s patch to the new APIs (TextStyle folded into TextRun)

Also substract descent() from point.y() - ascent() in the cairo_translate
call. Seems to &apos;almost&apos; fix the mispositioning of the text; still a small
offset though.
---
 WebCore/platform/graphics/Font.cpp        |    2 +-
 WebCore/platform/graphics/gtk/FontGtk.cpp |  160 +++++++++++++++++++++++++++--
 2 files changed, 152 insertions(+), 10 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66392</commentid>
    <comment_count>7</comment_count>
      <attachid>18303</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2008-01-06 14:01:11 -0800</bug_when>
    <thetext>Created attachment 18303
pangowebkit.diff

Ok, some more fixes. Mainly addressing behdad&apos;s review (done by email):

- Check more thoroughly the UTF16-&gt;UTF8 conversion (code by behdad from mozilla, with two small changes: break when need_copy is TRUE during validation, no need to continue iterating; s/PRUnichar/UChar/, etc).

- Try to do something sane when from &gt; 0 in convertUniCharToUTF8.

- Do not fallback to the attr list, it&apos;s on by default.

- Use PangoLayoutLine and pango_cairo_show_layout_line in drawComplexText, so we can stop messing with ascent(), descent(), etc. The line will automatically have the coordinates we want (but see last note).

Note: there&apos;s still some glitches with latin text; capital letters seem to be cut off by a few pixels some times. Attaching shot.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66393</commentid>
    <comment_count>8</comment_count>
      <attachid>18304</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2008-01-06 14:04:18 -0800</bug_when>
    <thetext>Created attachment 18304
Rendering bug with pango.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66394</commentid>
    <comment_count>9</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2008-01-06 14:05:47 -0800</bug_when>
    <thetext>Actually the fix for from &gt; 0 will leak memory. Need to copy only the data I want, not strdup the whole string. Will fix that in the next patch when we figure out the rendering bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66562</commentid>
    <comment_count>10</comment_count>
      <attachid>18330</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2008-01-08 11:08:23 -0800</bug_when>
    <thetext>Created attachment 18330
pangorendering.diff

Ok, thanks to Behdad the last glitch is gone as far as I can tell. I think this is good enough for now until we switch to the low level pango APIs like Firefox3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66590</commentid>
    <comment_count>11</comment_count>
      <attachid>18330</attachid>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-08 15:28:37 -0800</bug_when>
    <thetext>Comment on attachment 18330
pangorendering.diff

This works really well. There are a few coding style issues to be sorted out before it can be landed though.

&gt;diff --git a/WebCore/platform/graphics/gtk/FontGtk.cpp b/WebCore/platform/graphics/gtk/FontGtk.cpp
&gt;index 3b3a228..790d762 100644
&gt;--- a/WebCore/platform/graphics/gtk/FontGtk.cpp
&gt;+++ b/WebCore/platform/graphics/gtk/FontGtk.cpp
&gt;@@ -1,6 +1,10 @@
&gt; /*
&gt;  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
&gt;  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
&gt;+ * Copyright (c) 2007 Hiroyuki Ikezoe All rights reserved.
&gt;+ * Copyright (c) 2007 Kouhei Sutou All rights reserved.
&gt;+ * Copyright (C) 2007 Alp Toker &lt;alp@atoker.com&gt;
&gt;+ * Copyright (C) 2008 Xan Lopez &lt;xan@gnome.org&gt;
&gt;  * All rights reserved.
&gt;  *
&gt;  * Redistribution and use in source and binary forms, with or without
&gt;@@ -33,12 +37,144 @@
&gt; #include &quot;SimpleFontData.h&quot;
&gt; #include &lt;cairo.h&gt;
&gt; 
&gt;+#include &lt;pango/pango.h&gt;
&gt;+#include &lt;pango/pangocairo.h&gt;
&gt;+
&gt; namespace WebCore {
&gt; 
&gt;+/* From Mozilla, with small changes */
&gt;+
&gt;+#define IS_HIGH_SURROGATE(u)  ((UChar)(u) &gt;= (UChar)0xd800 &amp;&amp; (UChar)(u) &lt;= (UChar)0xdbff)
&gt;+#define IS_LOW_SURROGATE(u)  ((UChar)(u) &gt;= (UChar)0xdc00 &amp;&amp; (UChar)(u) &lt;= (UChar)0xdfff)
&gt;+
&gt;+static void
&gt;+utf16_to_utf8 (const UChar* aText, gint aLength, char *&amp;text, gint &amp;length)

Should be no space before (

&gt;+{
&gt;+  gboolean need_copy = FALSE;
&gt;+  int i;
&gt;+
&gt;+  for (i = 0; i &lt; aLength; i++) {

You can put the int i within the for statement.

&gt;+    if (!aText[i] || IS_LOW_SURROGATE(aText[i])) {
&gt;+      need_copy = TRUE;
&gt;+      break;
&gt;+    }
&gt;+    else if (IS_HIGH_SURROGATE(aText[i])) {
&gt;+      if (i &lt; aLength - 1 &amp;&amp; IS_LOW_SURROGATE(aText[i+1]))
&gt;+        i++;
&gt;+      else {
&gt;+        need_copy = TRUE;
&gt;+        break;
&gt;+      }
&gt;+    }
&gt;+  }
&gt;+
&gt;+  if (need_copy) {
&gt;+
&gt;+    /* Pango doesn&apos;t correctly handle nuls.  We convert them to 0xff. */
&gt;+    /* Also &quot;validate&quot; UTF-16 text to make sure conversion doesn&apos;t fail. */
&gt;+
&gt;+    UChar *p = (UChar *)g_memdup(aText, aLength * sizeof(aText[0]));

Watch out for the position of *.

&gt;+
&gt;+    /* don&apos;t need to reset i */
&gt;+    for (i = 0; i &lt; aLength; i++) {
&gt;+      if (!p[i] || IS_LOW_SURROGATE(p[i]))
&gt;+        p[i] = 0xFFFD;
&gt;+      else if (IS_HIGH_SURROGATE(p[i])) {
&gt;+        if (i &lt; aLength - 1 &amp;&amp; IS_LOW_SURROGATE(aText[i+1]))
&gt;+          i++;
&gt;+        else
&gt;+          p[i] = 0xFFFD;
&gt;+      }
&gt;+    }
&gt;+
&gt;+    aText = p;
&gt;+  }
&gt;+
&gt;+  glong items_written;
&gt;+  text = g_utf16_to_utf8(aText, aLength, NULL, &amp;items_written, NULL);
&gt;+  length = items_written;
&gt;+
&gt;+  if (need_copy)
&gt;+    g_free((gpointer) aText);
&gt;+
&gt;+}
&gt;+
&gt;+// FIXME: having this code here is silly
&gt;+static gchar* convertUniCharToUTF8(const UChar* characters, gint length, int from, int to)
&gt;+{
&gt;+    gchar *utf8 = 0;
&gt;+    gint new_length = 0;
&gt;+    utf16_to_utf8(characters, length, utf8, new_length);
&gt;+    if (!utf8) return NULL;
&gt;+
&gt;+    if (from &gt; 0) {
&gt;+        // discard the first &apos;from&apos; characters 
&gt;+        // FIXME: we should do this before the conversion probably
&gt;+        gchar *str_left = g_utf8_offset_to_pointer(utf8, from);
&gt;+        gchar *tmp = g_strdup(str_left);
&gt;+        g_free(utf8);
&gt;+        utf8 = tmp;
&gt;+    }
&gt;+
&gt;+    gchar *pos = utf8;
&gt;+    gint len = strlen(pos);
&gt;+    GString *ret = g_string_new_len(NULL, len);
&gt;+
&gt;+    // replace line break by space
&gt;+    while (len &gt; 0) {
&gt;+        gint index, start;
&gt;+        pango_find_paragraph_boundary(pos, len, &amp;index, &amp;start);
&gt;+        g_string_append_len(ret, pos, index);
&gt;+        if (index == start)
&gt;+            break;
&gt;+        g_string_append_c(ret, &apos; &apos;);
&gt;+        pos += start;
&gt;+        len -= start;
&gt;+    }
&gt;+    return g_string_free(ret, FALSE);
&gt;+}
&gt;+
&gt;+static void setPangoAttributes(const Font* font, const TextRun&amp; run, PangoLayout* layout)
&gt;+{
&gt;+    PangoAttrList* list = pango_attr_list_new();
&gt;+    PangoAttribute* attr;
&gt;+
&gt;+    attr = pango_attr_size_new_absolute((int)(font-&gt;size() * PANGO_SCALE));
&gt;+    attr-&gt;end_index = G_MAXUINT;
&gt;+    pango_attr_list_insert_before(list, attr);
&gt;+
&gt;+    if (!run.spacingDisabled()) {
&gt;+        attr = pango_attr_letter_spacing_new(font-&gt;letterSpacing() * PANGO_SCALE);
&gt;+        attr-&gt;end_index = G_MAXUINT;
&gt;+        pango_attr_list_insert_before(list, attr);
&gt;+    }
&gt;+
&gt;+    // Pango does not yet support synthesising small caps
&gt;+    /*
&gt;+    printf (&quot;small caps: %d\n&quot;, font-&gt;isSmallCaps());
&gt;+
&gt;+    if (font-&gt;isSmallCaps()) {
&gt;+        attr = pango_attr_variant_new(PANGO_VARIANT_SMALL_CAPS);
&gt;+        attr-&gt;end_index = G_MAXUINT;
&gt;+        pango_attr_list_insert_before(list, attr);
&gt;+    }
&gt;+    */

Commented-out code is against coding style, though I personally wouldn&apos;t mind leaving this snippet around so it doesn&apos;t get lost. If you want to remove it, you could replace it with a link to this bug and a comment.

&gt;+
&gt;+    pango_layout_set_attributes(layout, list);
&gt;+    pango_attr_list_unref(list);
&gt;+
&gt;+    pango_layout_set_auto_dir(layout, FALSE);
&gt;+
&gt;+    PangoContext* pango_context = pango_layout_get_context(layout);
&gt;+    PangoDirection direction = run.rtl() ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR;
&gt;+    pango_context_set_base_dir(pango_context, direction);
&gt;+}
&gt;+
&gt; void Font::drawGlyphs(GraphicsContext* graphicsContext, const SimpleFontData* font, const GlyphBuffer&amp; glyphBuffer,
&gt;                       int from, int numGlyphs, const FloatPoint&amp; point) const
&gt; {
&gt;     cairo_t* context = graphicsContext-&gt;platformContext();
&gt;+    cairo_save(context);
&gt; 
&gt;     // Set the text color to use for drawing.
&gt;     float red, green, blue, alpha;
&gt;@@ -59,26 +195,86 @@ void Font::drawGlyphs(GraphicsContext* graphicsContext, const SimpleFontData* fo
&gt;         offset += glyphBuffer.advanceAt(from + i);
&gt;     }
&gt;     cairo_show_glyphs(context, glyphs, numGlyphs);
&gt;+
&gt;+    cairo_restore(context);
&gt; }
&gt; 
&gt;-void Font::drawComplexText(GraphicsContext*, const TextRun&amp;, const FloatPoint&amp;, int from, int to) const
&gt;+void Font::drawComplexText(GraphicsContext* context, const TextRun&amp; run, const FloatPoint&amp; point, int from, int to) const
&gt; {
&gt;-    notImplemented();
&gt;+    cairo_t* cr = context-&gt;platformContext();
&gt;+    cairo_save(cr);
&gt;+
&gt;+    PangoLayout* layout = pango_cairo_create_layout(cr);
&gt;+
&gt;+    gchar* utf8 = convertUniCharToUTF8(run.characters(), run.length(), from, to);
&gt;+    pango_layout_set_text(layout, utf8, -1);
&gt;+    g_free(utf8);
&gt;+
&gt;+    setPangoAttributes(this, run, layout);
&gt;+
&gt;+    // Set the text color to use for drawing.
&gt;+    float red, green, blue, alpha;
&gt;+    Color penColor = context-&gt;fillColor();
&gt;+    penColor.getRGBA(red, green, blue, alpha);
&gt;+    cairo_set_source_rgba(cr, red, green, blue, alpha);
&gt;+
&gt;+    // Our layouts are single line
&gt;+    cairo_move_to(cr, point.x(), point.y());
&gt;+    PangoLayoutLine *layout_line = pango_layout_get_line_readonly(layout, 0);
&gt;+    pango_cairo_show_layout_line(cr, layout_line);
&gt;+
&gt;+    g_object_unref(layout);
&gt;+    cairo_restore(cr);
&gt; }
&gt; 
&gt;-float Font::floatWidthForComplexText(const TextRun&amp;) const
&gt;+float Font::floatWidthForComplexText(const TextRun&amp; run) const
&gt; {
&gt;-    notImplemented();
&gt;-    return 0.0f;
&gt;+    if (run.length() == 0)
&gt;+        return 0.0f;
&gt;+
&gt;+    // FIXME: we should create the layout with our actual context
&gt;+    PangoFontMap* map = pango_cairo_font_map_get_default();
&gt;+    PangoContext* pango_context = pango_cairo_font_map_create_context(PANGO_CAIRO_FONT_MAP(map));
&gt;+    PangoLayout* layout = pango_layout_new(pango_context);
&gt;+    g_object_unref(pango_context);

This chunk could move into a static helper function and be re-used.

Also, I&apos;d recommend removing FIXME/TODOs or clarifying them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66611</commentid>
    <comment_count>12</comment_count>
      <attachid>18341</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2008-01-08 19:49:46 -0800</bug_when>
    <thetext>Created attachment 18341
0001-Use-pango-to-render-complex-path.patch

Addressed comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66617</commentid>
    <comment_count>13</comment_count>
      <attachid>18341</attachid>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-08 20:42:42 -0800</bug_when>
    <thetext>Comment on attachment 18341
0001-Use-pango-to-render-complex-path.patch

r=me

Will fix up some remaining style issues (* position, camel case, a badly indented if statement) before landing as discussed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>66619</commentid>
    <comment_count>14</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-08 20:45:50 -0800</bug_when>
    <thetext>Landed in r29334.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17222</attachid>
            <date>2007-11-12 23:23:51 -0800</date>
            <delta_ts>2007-12-28 13:05:24 -0800</delta_ts>
            <desc>Proof of concept Pango text rendering</desc>
            <filename>pango-text.patch</filename>
            <type>text/plain</type>
            <size>8206</size>
            <attacher name="Alp Toker">alp</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vRm9udC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9Gb250LmNwcAkocmV2aXNpb24gMjc3NDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0Zv
bnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OSw3ICs1OSw3IEBAIGNvbnN0IHVpbnQ4X3QgRm9u
dDo6Z1JvdW5kaW5nSGFja0NoYXJhY3QKICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwCiB9OwogCi1Gb250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0aCA9IEF1dG87CitG
b250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0aCA9IENvbXBsZXg7CiAKIHN0cnVjdCBXaWR0aEl0
ZXJhdG9yIHsKICAgICBXaWR0aEl0ZXJhdG9yKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRS
dW4mIHJ1biwgY29uc3QgVGV4dFN0eWxlJiBzdHlsZSk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAko
cmV2aXNpb24gMjc3NDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBo
aWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDU1LDYgKzQ1NSw5IEBAIHZv
aWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhckZvY3VzUmluZ0NsaXAKIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBpbnQgd2lkdGgs
IGJvb2wgcHJpbnRpbmcpCiB7CisgICAgLy8gRklYTUU6IFRoaXMganVzdCBkaXNhYmxlcyBhbGwg
dW5kZXJsaW5lcyB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBvdXIgUGFuZ28gcmVuZGVyaW5nIGNv
ZGUKKyAgICByZXR1cm47CisKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICBy
ZXR1cm47CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3RrL0ZvbnRHdGsuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3RrL0ZvbnRHdGsuY3BwCShyZXZpc2lvbiAyNzc0MykK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3RrL0ZvbnRHdGsuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDYgKzEsOSBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEVt
bWVsIG1pa2UuZW1tZWxAZ21haWwuY29tIAorICogQ29weXJpZ2h0IChjKSAyMDA3IEhpcm95dWtp
IElrZXpvZSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3IEtvdWhl
aSBTdXRvdSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBU
b2tlciA8YWxwQGF0b2tlci5jb20+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dApAQCAtMjcsMTggKzMwLDk0IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNs
dWRlICJGb250LmgiCisjaW5jbHVkZSAiVGV4dFN0eWxlLmgiCiAKICNpbmNsdWRlICJGb250RGF0
YS5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCiAjaW5jbHVkZSA8Y2Fpcm8uaD4KIAorI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+Cisj
aW5jbHVkZSA8cGFuZ28vcGFuZ29jYWlyby5oPgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8v
IEZJWE1FOiBoYXZpbmcgdGhpcyBjb2RlIGhlcmUgaXMgc2lsbHkKK3N0YXRpYyBnY2hhciogY29u
dmVydFVuaUNoYXJUb1VURjgoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBmcm9tLCBpbnQg
dG8pCit7CisgICAgY29uc3QgZ3VuaWNoYXIyKiBzdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0
IGd1bmljaGFyMio+KGNoYXJhY3RlcnMpOworICAgIGdjaGFyICp1dGY4ID0gZ191dGYxNl90b191
dGY4KHN0ciwgdG8sIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgaWYgKGZyb20gPiAwKSB7Cisg
ICAgICAgIGdjaGFyICpzdHJfbGVmdCA9IGdfc3RyZHVwKHV0ZjgpOworICAgICAgICBzdHJfbGVm
dCA9IGdfdXRmOF9zdHJuY3B5KHN0cl9sZWZ0LCB1dGY4LCBmcm9tKTsKKyAgICAgICAgZ19mcmVl
KHV0ZjgpOworICAgICAgICB1dGY4ID0gc3RyX2xlZnQ7CisgICAgfQorCisgICAgZ2NoYXIgKnBv
cyA9IHV0Zjg7CisgICAgZ2ludCBsZW4gPSBzdHJsZW4ocG9zKTsKKyAgICBHU3RyaW5nICpyZXQg
PSBnX3N0cmluZ19uZXdfbGVuKE5VTEwsIGxlbik7CisKKyAgICAvLyByZXBsYWNlIGxpbmUgYnJl
YWsgYnkgc3BhY2UKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBnaW50IGluZGV4LCBz
dGFydDsKKyAgICAgICAgcGFuZ29fZmluZF9wYXJhZ3JhcGhfYm91bmRhcnkocG9zLCBsZW4sICZp
bmRleCwgJnN0YXJ0KTsKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX2xlbihyZXQsIHBvcywgaW5k
ZXgpOworICAgICAgICBpZiAoaW5kZXggPT0gc3RhcnQpCisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgZ19zdHJpbmdfYXBwZW5kX2MocmV0LCAnICcpOworICAgICAgICBwb3MgKz0gc3RhcnQ7
CisgICAgICAgIGxlbiAtPSBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUo
cmV0LCBGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFBhbmdvQXR0cmlidXRlcyhjb25zdCBG
b250KiBmb250LCBjb25zdCBUZXh0U3R5bGUmIHN0eWxlLCBQYW5nb0xheW91dCogbGF5b3V0KQor
eworICAgIFBhbmdvQXR0ckxpc3QqIGxpc3QgPSBwYW5nb19hdHRyX2xpc3RfbmV3KCk7CisgICAg
UGFuZ29BdHRyaWJ1dGUqIGF0dHI7CisKKyAgICBhdHRyID0gcGFuZ29fYXR0cl9mYWxsYmFja19u
ZXcoVFJVRSk7CisgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgIHBhbmdvX2F0
dHJfbGlzdF9pbnNlcnRfYmVmb3JlKGxpc3QsIGF0dHIpOworCisgICAgYXR0ciA9IHBhbmdvX2F0
dHJfc2l6ZV9uZXcoZm9udC0+c2l6ZSgpICogUEFOR09fU0NBTEUpOworICAgIGF0dHItPmVuZF9p
bmRleCA9IEdfTUFYVUlOVDsKKyAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9yZShsaXN0
LCBhdHRyKTsKKworICAgIGlmICghc3R5bGUuc3BhY2luZ0Rpc2FibGVkKCkpIHsKKyAgICAgICAg
YXR0ciA9IHBhbmdvX2F0dHJfbGV0dGVyX3NwYWNpbmdfbmV3KGZvbnQtPmxldHRlclNwYWNpbmco
KSAqIFBBTkdPX1NDQUxFKTsKKyAgICAgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOwor
ICAgICAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9yZShsaXN0LCBhdHRyKTsKKyAgICB9
CisKKyAgICAvLyBQYW5nbyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBzeW50aGVzaXNpbmcgc21hbGwg
Y2FwcworICAgIC8qCisgICAgcHJpbnRmICgic21hbGwgY2FwczogJWRcbiIsIGZvbnQtPmlzU21h
bGxDYXBzKCkpOworCisgICAgaWYgKGZvbnQtPmlzU21hbGxDYXBzKCkpIHsKKyAgICAgICAgYXR0
ciA9IHBhbmdvX2F0dHJfdmFyaWFudF9uZXcoUEFOR09fVkFSSUFOVF9TTUFMTF9DQVBTKTsKKyAg
ICAgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgICAgICBwYW5nb19hdHRyX2xp
c3RfaW5zZXJ0X2JlZm9yZShsaXN0LCBhdHRyKTsKKyAgICB9CisgICAgKi8KKworICAgIHBhbmdv
X2xheW91dF9zZXRfYXR0cmlidXRlcyhsYXlvdXQsIGxpc3QpOworICAgIHBhbmdvX2F0dHJfbGlz
dF91bnJlZihsaXN0KTsKKworICAgIHBhbmdvX2xheW91dF9zZXRfYXV0b19kaXIobGF5b3V0LCBG
QUxTRSk7CisKKyAgICBQYW5nb0NvbnRleHQqIHBhbmdvX2NvbnRleHQgPSBwYW5nb19sYXlvdXRf
Z2V0X2NvbnRleHQobGF5b3V0KTsKKyAgICBQYW5nb0RpcmVjdGlvbiBkaXJlY3Rpb24gPSBzdHls
ZS5ydGwoKSA/IFBBTkdPX0RJUkVDVElPTl9SVEwgOiBQQU5HT19ESVJFQ1RJT05fTFRSOworICAg
IHBhbmdvX2NvbnRleHRfc2V0X2Jhc2VfZGlyKHBhbmdvX2NvbnRleHQsIGRpcmVjdGlvbik7Cit9
CisKIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4
dCwgY29uc3QgRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwK
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpIGNvbnN0CiB7CiAgICAgY2Fpcm9fdCogY29udGV4dCA9IGdyYXBoaWNz
Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgY2Fpcm9fc2F2ZShjb250ZXh0KTsKIAog
ICAgIC8vIFNldCB0aGUgdGV4dCBjb2xvciB0byB1c2UgZm9yIGRyYXdpbmcuCiAgICAgZmxvYXQg
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CkBAIC01OSwyNiArMTM4LDg5IEBAIHZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAgICAgICAgb2Zmc2V0ICs9IGdseXBoQnVm
ZmVyLmFkdmFuY2VBdChmcm9tICsgaSk7CiAgICAgfQogICAgIGNhaXJvX3Nob3dfZ2x5cGhzKGNv
bnRleHQsIGdseXBocywgbnVtR2x5cGhzKTsKKworICAgIGNhaXJvX3Jlc3RvcmUoY29udGV4dCk7
CiB9CiAKLXZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0
IFRleHRSdW4mLCBjb25zdCBUZXh0U3R5bGUmLCBjb25zdCBGbG9hdFBvaW50JiwgaW50IGZyb20s
IGludCB0bykgY29uc3QKK3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBUZXh0U3R5bGUmIHN0eWxlLCBj
b25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKLSAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCk7CisgICAgY2Fpcm9fc2F2ZShjcik7CisKKyAgICBQYW5nb0xheW91dCogbGF5b3V0ID0g
cGFuZ29fY2Fpcm9fY3JlYXRlX2xheW91dChjcik7CisKKyAgICBnY2hhciogdXRmOCA9IGNvbnZl
cnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIGZyb20sIHRvKTsKKyAgICBwYW5nb19s
YXlvdXRfc2V0X3RleHQobGF5b3V0LCB1dGY4LCAtMSk7CisKKyAgICBzZXRQYW5nb0F0dHJpYnV0
ZXModGhpcywgc3R5bGUsIGxheW91dCk7CisKKyAgICAvLyBTZXQgdGhlIHRleHQgY29sb3IgdG8g
dXNlIGZvciBkcmF3aW5nLgorICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOworICAg
IENvbG9yIHBlbkNvbG9yID0gY29udGV4dC0+ZmlsbENvbG9yKCk7CisgICAgcGVuQ29sb3IuZ2V0
UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2Jh
KGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisKKyAgICAvL2NhaXJvX21vdmVfdG8oY3Is
IHBvaW50LngoKSwgcG9pbnQueSgpIC0gYXNjZW50KCkpOworICAgIGNhaXJvX3RyYW5zbGF0ZShj
ciwgcG9pbnQueCgpLCBwb2ludC55KCkgLSBhc2NlbnQoKSk7CisgICAgcGFuZ29fY2Fpcm9fc2hv
d19sYXlvdXQoY3IsIGxheW91dCk7CisgICAgZ19mcmVlKHV0ZjgpOworICAgIGdfb2JqZWN0X3Vu
cmVmKGxheW91dCk7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CiB9CiAKLWZsb2F0IEZvbnQ6OmZs
b2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiwgY29uc3QgVGV4dFN0eWxlJikg
Y29uc3QKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVu
JiBydW4sIGNvbnN0IFRleHRTdHlsZSYgc3R5bGUpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50
ZWQoKTsKLSAgICByZXR1cm4gMC4wZjsKKyAgICBpZiAocnVuLmxlbmd0aCgpID09IDApCisgICAg
ICAgIHJldHVybiAwLjBmOworCisgICAgUGFuZ29Gb250TWFwKiBtYXAgPSBwYW5nb19jYWlyb19m
b250X21hcF9nZXRfZGVmYXVsdCgpOworCisgICAgUGFuZ29Db250ZXh0KiBwYW5nb19jb250ZXh0
ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQoUEFOR09fQ0FJUk9fRk9OVF9N
QVAobWFwKSk7CisgICAgUGFuZ29MYXlvdXQqIGxheW91dCA9IHBhbmdvX2xheW91dF9uZXcocGFu
Z29fY29udGV4dCk7CisgICAgZ19vYmplY3RfdW5yZWYocGFuZ29fY29udGV4dCk7CisKKyAgICBz
ZXRQYW5nb0F0dHJpYnV0ZXModGhpcywgc3R5bGUsIGxheW91dCk7CisKKyAgICBnY2hhciogdXRm
OCA9IGNvbnZlcnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIDAsIHJ1bi5sZW5ndGgo
KSk7CisgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOworCisgICAg
aW50IHBpeGVsX3dpZHRoOworICAgIHBhbmdvX2xheW91dF9nZXRfcGl4ZWxfc2l6ZShsYXlvdXQs
ICZwaXhlbF93aWR0aCwgMCk7CisgICAgZmxvYXQgd2lkdGggPSAoZmxvYXQpcGl4ZWxfd2lkdGg7
CisKKyAgICBnX2ZyZWUodXRmOCk7CisgICAgZ19vYmplY3RfdW5yZWYobGF5b3V0KTsKKworICAg
IC8vcHJpbnRmICgiZjogJWZcbiIsIHdpZHRoKTsKKworICAgIHJldHVybiB3aWR0aCArIHN0eWxl
LnBhZGRpbmcoKTsKIH0KIAotaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRl
eHQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IFRleHRTdHlsZSYsIGludCwgYm9vbCkgY29uc3QKK2lu
dCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1
biwgY29uc3QgVGV4dFN0eWxlJiBzdHlsZSwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlw
aHMpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBQ
YW5nb0ZvbnRNYXAqIG1hcCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2dldF9kZWZhdWx0KCk7CisK
KyAgICBQYW5nb0NvbnRleHQqIHBhbmdvX2NvbnRleHQgPSBwYW5nb19jYWlyb19mb250X21hcF9j
cmVhdGVfY29udGV4dChQQU5HT19DQUlST19GT05UX01BUChtYXApKTsKKyAgICBQYW5nb0xheW91
dCogbGF5b3V0ID0gcGFuZ29fbGF5b3V0X25ldyhwYW5nb19jb250ZXh0KTsKKyAgICBnX29iamVj
dF91bnJlZihwYW5nb19jb250ZXh0KTsKKworICAgIHNldFBhbmdvQXR0cmlidXRlcyh0aGlzLCBz
dHlsZSwgbGF5b3V0KTsKKworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJUb1VURjgo
cnVuLmNoYXJhY3RlcnMoKSwgMCwgcnVuLmxlbmd0aCgpKTsKKyAgICBwYW5nb19sYXlvdXRfc2V0
X3RleHQobGF5b3V0LCB1dGY4LCAtMSk7CisKKyAgICBpbnQgaW5kZXgsIHRyYWlsaW5nOworICAg
IHBhbmdvX2xheW91dF94eV90b19pbmRleChsYXlvdXQsIHggKiBQQU5HT19TQ0FMRSwgMSwgJmlu
ZGV4LCAmdHJhaWxpbmcpOworICAgIGdsb25nIG9mZnNldCA9IGdfdXRmOF9wb2ludGVyX3RvX29m
ZnNldCh1dGY4LCB1dGY4ICsgaW5kZXgpOworICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7Cisg
ICAgZ19mcmVlKHV0ZjgpOworCisgICAgLy9wcmludGYgKCJvZmZzZXQ6ICVmXG4iLCBvZmZzZXQp
OworCisgICAgcmV0dXJuIG9mZnNldDsKIH0KIAotRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJl
Y3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiwgY29uc3QgVGV4dFN0eWxlJiwgY29uc3Qg
SW50UG9pbnQmLCBpbnQsIGludCwgaW50KSBjb25zdAorRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlv
blJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IFRleHRTdHlsZSYg
c3R5bGUsIGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNv
bnN0CiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gRmxvYXRSZWN0KCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18152</attachid>
            <date>2007-12-28 13:05:24 -0800</date>
            <delta_ts>2008-01-08 11:08:23 -0800</delta_ts>
            <desc>0001-Update-Alp-s-patch-to-the-new-APIs-TextStyle-folded.patch</desc>
            <filename>0001-Update-Alp-s-patch-to-the-new-APIs-TextStyle-folded.patch</filename>
            <type>text/plain</type>
            <size>7980</size>
            <attacher name="Xan Lopez">xan.lopez</attacher>
            
              <data encoding="base64">RnJvbSAxNzk1OThmMjUwMmNjNzkwNWUzZWY1YzRkYjZmNGI2ZWEyYmU5ZGUwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBYYW4gTG9wZXogPHhhbkBnbm9tZS5vcmc+CkRhdGU6IEZyaSwg
MjggRGVjIDIwMDcgMjM6MDE6MzcgKzAyMDAKU3ViamVjdDogW1BBVENIXSBVcGRhdGUgQWxwJ3Mg
cGF0Y2ggdG8gdGhlIG5ldyBBUElzIChUZXh0U3R5bGUgZm9sZGVkIGludG8gVGV4dFJ1bikKCkFs
c28gc3Vic3RyYWN0IGRlc2NlbnQoKSBmcm9tIHBvaW50LnkoKSAtIGFzY2VudCgpIGluIHRoZSBj
YWlyb190cmFuc2xhdGUKY2FsbC4gU2VlbXMgdG8gJ2FsbW9zdCcgZml4IHRoZSBtaXNwb3NpdGlv
bmluZyBvZiB0aGUgdGV4dDsgc3RpbGwgYSBzbWFsbApvZmZzZXQgdGhvdWdoLgotLS0KIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAgICAgICAgIHwgICAgMiArLQogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ndGsvRm9udEd0ay5jcHAgfCAgMTYwICsrKysrKysrKysrKysrKysr
KysrKysrKysrKy0tCiAyIGZpbGVzIGNoYW5nZWQsIDE1MiBpbnNlcnRpb25zKCspLCAxMCBkZWxl
dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAppbmRleCA5M2VlNGI5Li41YzE1
OTg4IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKQEAgLTU4LDcgKzU4LDcgQEAgY29u
c3QgdWludDhfdCBGb250OjpnUm91bmRpbmdIYWNrQ2hhcmFjdGVyVGFibGVbMjU2XSA9IHsKICAg
ICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiB9OwogCi1Gb250OjpDb2Rl
UGF0aCBGb250Ojpjb2RlUGF0aCA9IEF1dG87CitGb250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0
aCA9IENvbXBsZXg7CiAKIHN0cnVjdCBXaWR0aEl0ZXJhdG9yIHsKICAgICBXaWR0aEl0ZXJhdG9y
KGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1bik7CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250R3RrLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZ3RrL0ZvbnRHdGsuY3BwCmluZGV4IDU5MTgxZjguLjdjYjY1OTQgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrL0ZvbnRHdGsuY3BwCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrL0ZvbnRHdGsuY3BwCkBAIC0xLDYgKzEsOSBAQAogLyoK
ICAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEVtbWVsIG1pa2UuZW1tZWxA
Z21haWwuY29tIAorICogQ29weXJpZ2h0IChjKSAyMDA3IEhpcm95dWtpIElrZXpvZSBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3IEtvdWhlaSBTdXRvdSBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tl
ci5jb20+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzMs
MTIgKzM2LDg4IEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlIDxjYWly
by5oPgogCisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDxwYW5nby9wYW5nb2Nh
aXJvLmg+CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorLy8gRklYTUU6IGhhdmluZyB0aGlzIGNv
ZGUgaGVyZSBpcyBzaWxseQorc3RhdGljIGdjaGFyKiBjb252ZXJ0VW5pQ2hhclRvVVRGOChjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgaW50IGZyb20sIGludCB0bykKK3sKKyAgICBjb25zdCBndW5p
Y2hhcjIqIHN0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZ3VuaWNoYXIyKj4oY2hhcmFjdGVy
cyk7CisgICAgZ2NoYXIgKnV0ZjggPSBnX3V0ZjE2X3RvX3V0Zjgoc3RyLCB0bywgTlVMTCwgTlVM
TCwgTlVMTCk7CisgICAgaWYgKCF1dGY4KSByZXR1cm4gTlVMTDsKKworICAgIGlmIChmcm9tID4g
MCkgeworICAgICAgICBnY2hhciAqc3RyX2xlZnQgPSBnX3N0cmR1cCh1dGY4KTsKKyAgICAgICAg
c3RyX2xlZnQgPSBnX3V0Zjhfc3RybmNweShzdHJfbGVmdCwgdXRmOCwgZnJvbSk7CisgICAgICAg
IGdfZnJlZSh1dGY4KTsKKyAgICAgICAgdXRmOCA9IHN0cl9sZWZ0OworICAgIH0KKworICAgIGdj
aGFyICpwb3MgPSB1dGY4OworICAgIGdpbnQgbGVuID0gc3RybGVuKHBvcyk7CisgICAgR1N0cmlu
ZyAqcmV0ID0gZ19zdHJpbmdfbmV3X2xlbihOVUxMLCBsZW4pOworCisgICAgLy8gcmVwbGFjZSBs
aW5lIGJyZWFrIGJ5IHNwYWNlCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgZ2ludCBp
bmRleCwgc3RhcnQ7CisgICAgICAgIHBhbmdvX2ZpbmRfcGFyYWdyYXBoX2JvdW5kYXJ5KHBvcywg
bGVuLCAmaW5kZXgsICZzdGFydCk7CisgICAgICAgIGdfc3RyaW5nX2FwcGVuZF9sZW4ocmV0LCBw
b3MsIGluZGV4KTsKKyAgICAgICAgaWYgKGluZGV4ID09IHN0YXJ0KQorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGdfc3RyaW5nX2FwcGVuZF9jKHJldCwgJyAnKTsKKyAgICAgICAgcG9zICs9
IHN0YXJ0OworICAgICAgICBsZW4gLT0gc3RhcnQ7CisgICAgfQorICAgIHJldHVybiBnX3N0cmlu
Z19mcmVlKHJldCwgRkFMU0UpOworfQorCitzdGF0aWMgdm9pZCBzZXRQYW5nb0F0dHJpYnV0ZXMo
Y29uc3QgRm9udCogZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuLCBQYW5nb0xheW91dCogbGF5b3V0
KQoreworICAgIFBhbmdvQXR0ckxpc3QqIGxpc3QgPSBwYW5nb19hdHRyX2xpc3RfbmV3KCk7Cisg
ICAgUGFuZ29BdHRyaWJ1dGUqIGF0dHI7CisKKyAgICBhdHRyID0gcGFuZ29fYXR0cl9mYWxsYmFj
a19uZXcoVFJVRSk7CisgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgIHBhbmdv
X2F0dHJfbGlzdF9pbnNlcnRfYmVmb3JlKGxpc3QsIGF0dHIpOworCisgICAgYXR0ciA9IHBhbmdv
X2F0dHJfc2l6ZV9uZXcoZm9udC0+c2l6ZSgpICogUEFOR09fU0NBTEUpOworICAgIGF0dHItPmVu
ZF9pbmRleCA9IEdfTUFYVUlOVDsKKyAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9yZShs
aXN0LCBhdHRyKTsKKworICAgIGlmICghcnVuLnNwYWNpbmdEaXNhYmxlZCgpKSB7CisgICAgICAg
IGF0dHIgPSBwYW5nb19hdHRyX2xldHRlcl9zcGFjaW5nX25ldyhmb250LT5sZXR0ZXJTcGFjaW5n
KCkgKiBQQU5HT19TQ0FMRSk7CisgICAgICAgIGF0dHItPmVuZF9pbmRleCA9IEdfTUFYVUlOVDsK
KyAgICAgICAgcGFuZ29fYXR0cl9saXN0X2luc2VydF9iZWZvcmUobGlzdCwgYXR0cik7CisgICAg
fQorCisgICAgLy8gUGFuZ28gZG9lcyBub3QgeWV0IHN1cHBvcnQgc3ludGhlc2lzaW5nIHNtYWxs
IGNhcHMKKyAgICAvKgorICAgIHByaW50ZiAoInNtYWxsIGNhcHM6ICVkXG4iLCBmb250LT5pc1Nt
YWxsQ2FwcygpKTsKKworICAgIGlmIChmb250LT5pc1NtYWxsQ2FwcygpKSB7CisgICAgICAgIGF0
dHIgPSBwYW5nb19hdHRyX3ZhcmlhbnRfbmV3KFBBTkdPX1ZBUklBTlRfU01BTExfQ0FQUyk7Cisg
ICAgICAgIGF0dHItPmVuZF9pbmRleCA9IEdfTUFYVUlOVDsKKyAgICAgICAgcGFuZ29fYXR0cl9s
aXN0X2luc2VydF9iZWZvcmUobGlzdCwgYXR0cik7CisgICAgfQorICAgICovCisKKyAgICBwYW5n
b19sYXlvdXRfc2V0X2F0dHJpYnV0ZXMobGF5b3V0LCBsaXN0KTsKKyAgICBwYW5nb19hdHRyX2xp
c3RfdW5yZWYobGlzdCk7CisKKyAgICBwYW5nb19sYXlvdXRfc2V0X2F1dG9fZGlyKGxheW91dCwg
RkFMU0UpOworCisgICAgUGFuZ29Db250ZXh0KiBwYW5nb19jb250ZXh0ID0gcGFuZ29fbGF5b3V0
X2dldF9jb250ZXh0KGxheW91dCk7CisgICAgUGFuZ29EaXJlY3Rpb24gZGlyZWN0aW9uID0gcnVu
LnJ0bCgpID8gUEFOR09fRElSRUNUSU9OX1JUTCA6IFBBTkdPX0RJUkVDVElPTl9MVFI7CisgICAg
cGFuZ29fY29udGV4dF9zZXRfYmFzZV9kaXIocGFuZ29fY29udGV4dCwgZGlyZWN0aW9uKTsKK30K
Kwogdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0
LCBjb25zdCBGb250RGF0YSogZm9udCwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLAog
ICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9h
dFBvaW50JiBwb2ludCkgY29uc3QKIHsKICAgICBjYWlyb190KiBjb250ZXh0ID0gZ3JhcGhpY3ND
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjYWlyb19zYXZlKGNvbnRleHQpOwogCiAg
ICAgLy8gU2V0IHRoZSB0ZXh0IGNvbG9yIHRvIHVzZSBmb3IgZHJhd2luZy4KICAgICBmbG9hdCBy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKQEAgLTU5LDI2ICsxMzgsODkgQEAgdm9pZCBGb250Ojpk
cmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBGb250RGF0
YSogZm9udCwgY28KICAgICAgICAgb2Zmc2V0ICs9IGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9t
ICsgaSk7CiAgICAgfQogICAgIGNhaXJvX3Nob3dfZ2x5cGhzKGNvbnRleHQsIGdseXBocywgbnVt
R2x5cGhzKTsKKworICAgIGNhaXJvX3Jlc3RvcmUoY29udGV4dCk7CiB9CiAKLXZvaWQgRm9udDo6
ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IFRleHRSdW4mLCBjb25zdCBG
bG9hdFBvaW50JiwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3ZvaWQgRm9udDo6ZHJhd0NvbXBs
ZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCk7CisgICAgY2Fpcm9fc2F2ZShjcik7CisKKyAgICBQYW5nb0xheW91dCogbGF5b3V0ID0gcGFu
Z29fY2Fpcm9fY3JlYXRlX2xheW91dChjcik7CisKKyAgICBnY2hhciogdXRmOCA9IGNvbnZlcnRV
bmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIGZyb20sIHRvKTsKKyAgICBwYW5nb19sYXlv
dXRfc2V0X3RleHQobGF5b3V0LCB1dGY4LCAtMSk7CisKKyAgICBzZXRQYW5nb0F0dHJpYnV0ZXMo
dGhpcywgcnVuLCBsYXlvdXQpOworCisgICAgLy8gU2V0IHRoZSB0ZXh0IGNvbG9yIHRvIHVzZSBm
b3IgZHJhd2luZy4KKyAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBDb2xv
ciBwZW5Db2xvciA9IGNvbnRleHQtPmZpbGxDb2xvcigpOworICAgIHBlbkNvbG9yLmdldFJHQkEo
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIGNhaXJvX3NldF9zb3VyY2VfcmdiYShjciwg
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworCisgICAgLy9jYWlyb19tb3ZlX3RvKGNyLCBwb2lu
dC54KCksIHBvaW50LnkoKSAtIGFzY2VudCgpKTsKKyAgICBjYWlyb190cmFuc2xhdGUoY3IsIHBv
aW50LngoKSwgcG9pbnQueSgpIC0gYXNjZW50KCkgLSBkZXNjZW50KCkpOworICAgIHBhbmdvX2Nh
aXJvX3Nob3dfbGF5b3V0KGNyLCBsYXlvdXQpOworICAgIGdfZnJlZSh1dGY4KTsKKyAgICBnX29i
amVjdF91bnJlZihsYXlvdXQpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwogfQogCi1mbG9hdCBG
b250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYpIGNvbnN0CitmbG9h
dCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25z
dAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDAuMGY7CisgICAgaWYgKHJ1
bi5sZW5ndGgoKSA9PSAwKQorICAgICAgICByZXR1cm4gMC4wZjsKKworICAgIFBhbmdvRm9udE1h
cCogbWFwID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfZ2V0X2RlZmF1bHQoKTsKKworICAgIFBhbmdv
Q29udGV4dCogcGFuZ29fY29udGV4dCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2NyZWF0ZV9jb250
ZXh0KFBBTkdPX0NBSVJPX0ZPTlRfTUFQKG1hcCkpOworICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQg
PSBwYW5nb19sYXlvdXRfbmV3KHBhbmdvX2NvbnRleHQpOworICAgIGdfb2JqZWN0X3VucmVmKHBh
bmdvX2NvbnRleHQpOworCisgICAgc2V0UGFuZ29BdHRyaWJ1dGVzKHRoaXMsIHJ1biwgbGF5b3V0
KTsKKworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJUb1VURjgocnVuLmNoYXJhY3Rl
cnMoKSwgMCwgcnVuLmxlbmd0aCgpKTsKKyAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQobGF5b3V0
LCB1dGY4LCAtMSk7CisKKyAgICBpbnQgcGl4ZWxfd2lkdGg7CisgICAgcGFuZ29fbGF5b3V0X2dl
dF9waXhlbF9zaXplKGxheW91dCwgJnBpeGVsX3dpZHRoLCAwKTsKKyAgICBmbG9hdCB3aWR0aCA9
IChmbG9hdClwaXhlbF93aWR0aDsKKworICAgIGdfZnJlZSh1dGY4KTsKKyAgICBnX29iamVjdF91
bnJlZihsYXlvdXQpOworCisgICAgLy9wcmludGYgKCJmOiAlZlxuIiwgd2lkdGgpOworCisgICAg
cmV0dXJuIHdpZHRoICsgcnVuLnBhZGRpbmcoKTsKIH0KIAotaW50IEZvbnQ6Om9mZnNldEZvclBv
c2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYsIGludCwgYm9vbCkgY29uc3QKK2lu
dCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1
biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0CiB7Ci0gICAgbm90SW1w
bGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBQYW5nb0ZvbnRNYXAqIG1hcCA9IHBhbmdv
X2NhaXJvX2ZvbnRfbWFwX2dldF9kZWZhdWx0KCk7CisKKyAgICBQYW5nb0NvbnRleHQqIHBhbmdv
X2NvbnRleHQgPSBwYW5nb19jYWlyb19mb250X21hcF9jcmVhdGVfY29udGV4dChQQU5HT19DQUlS
T19GT05UX01BUChtYXApKTsKKyAgICBQYW5nb0xheW91dCogbGF5b3V0ID0gcGFuZ29fbGF5b3V0
X25ldyhwYW5nb19jb250ZXh0KTsKKyAgICBnX29iamVjdF91bnJlZihwYW5nb19jb250ZXh0KTsK
KworICAgIHNldFBhbmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICBnY2hh
ciogdXRmOCA9IGNvbnZlcnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIDAsIHJ1bi5s
ZW5ndGgoKSk7CisgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOwor
CisgICAgaW50IGluZGV4LCB0cmFpbGluZzsKKyAgICBwYW5nb19sYXlvdXRfeHlfdG9faW5kZXgo
bGF5b3V0LCB4ICogUEFOR09fU0NBTEUsIDEsICZpbmRleCwgJnRyYWlsaW5nKTsKKyAgICBnbG9u
ZyBvZmZzZXQgPSBnX3V0ZjhfcG9pbnRlcl90b19vZmZzZXQodXRmOCwgdXRmOCArIGluZGV4KTsK
KyAgICBnX29iamVjdF91bnJlZihsYXlvdXQpOworICAgIGdfZnJlZSh1dGY4KTsKKworICAgIC8v
cHJpbnRmICgib2Zmc2V0OiAlZlxuIiwgb2Zmc2V0KTsKKworICAgIHJldHVybiBvZmZzZXQ7CiB9
CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4
dFJ1biYsIGNvbnN0IEludFBvaW50JiwgaW50LCBpbnQsIGludCkgY29uc3QKK0Zsb2F0UmVjdCBG
b250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBJbnRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogICAg
IG5vdEltcGxlbWVudGVkKCk7CiAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOwotLSAKMS41LjMuNAoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18303</attachid>
            <date>2008-01-06 14:01:11 -0800</date>
            <delta_ts>2008-01-08 11:08:23 -0800</delta_ts>
            <desc>pangowebkit.diff</desc>
            <filename>pangowebkit.diff</filename>
            <type>text/plain</type>
            <size>9002</size>
            <attacher name="Xan Lopez">xan.lopez</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCmluZGV4IDNhZDhjMmIuLjEyNzgzMWEgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcApAQCAtNTgsNyArNTgsNyBAQCBjb25zdCB1aW50OF90
IEZvbnQ6OmdSb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsyNTZdID0gewogICAgIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKIH07CiAKLUZvbnQ6OkNvZGVQYXRoIEZvbnQ6
OmNvZGVQYXRoID0gQXV0bzsKK0ZvbnQ6OkNvZGVQYXRoIEZvbnQ6OmNvZGVQYXRoID0gQ29tcGxl
eDsKIAogc3RydWN0IFdpZHRoSXRlcmF0b3IgewogICAgIFdpZHRoSXRlcmF0b3IoY29uc3QgRm9u
dCogZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZ3RrL0ZvbnRHdGsuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
dGsvRm9udEd0ay5jcHAKaW5kZXggNTkxODFmOC4uY2JlMjdmMSAxMDA2NDQKLS0tIGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9ndGsvRm9udEd0ay5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ndGsvRm9udEd0ay5jcHAKQEAgLTEsNiArMSw5IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgRW1tZWwgbWlrZS5lbW1lbEBnbWFpbC5jb20g
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSGlyb3l1a2kgSWtlem9lIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgS291aGVpIFN1dG91IEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KICAq
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMywxMiArMzYsMTQ1
IEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlIDxjYWlyby5oPgogCisj
aW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDxwYW5nby9wYW5nb2NhaXJvLmg+CisK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorLyogRnJvbSBNb3ppbGxhLCB3aXRoIHNtYWxsIGNoYW5n
ZXMgKi8KKworI2RlZmluZSBJU19ISUdIX1NVUlJPR0FURSh1KSAgKChVQ2hhcikodSkgPj0gKFVD
aGFyKTB4ZDgwMCAmJiAoVUNoYXIpKHUpIDw9IChVQ2hhcikweGRiZmYpCisjZGVmaW5lIElTX0xP
V19TVVJST0dBVEUodSkgICgoVUNoYXIpKHUpID49IChVQ2hhcikweGRjMDAgJiYgKFVDaGFyKSh1
KSA8PSAoVUNoYXIpMHhkZmZmKQorCitzdGF0aWMgdm9pZAordXRmMTZfdG9fdXRmOCAoY29uc3Qg
VUNoYXIqIGFUZXh0LCBnaW50IGFMZW5ndGgsIGNoYXIgKiZ0ZXh0LCBnaW50ICZsZW5ndGgpCit7
CisgIGdib29sZWFuIG5lZWRfY29weSA9IEZBTFNFOworICBpbnQgaTsKKworICBmb3IgKGkgPSAw
OyBpIDwgYUxlbmd0aDsgaSsrKSB7CisgICAgaWYgKCFhVGV4dFtpXSB8fCBJU19MT1dfU1VSUk9H
QVRFIChhVGV4dFtpXSkpIHsKKyAgICAgIG5lZWRfY29weSA9IFRSVUU7CisgICAgICBicmVhazsK
KyAgICB9CisgICAgZWxzZSBpZiAoSVNfSElHSF9TVVJST0dBVEUgKGFUZXh0W2ldKSkgeworICAg
ICAgaWYgKGkgPCBhTGVuZ3RoIC0gMSAmJiBJU19MT1dfU1VSUk9HQVRFIChhVGV4dFtpKzFdKSkK
KyAgICAgICAgaSsrOworICAgICAgZWxzZSB7CisgICAgICAgIG5lZWRfY29weSA9IFRSVUU7Cisg
ICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgaWYgKG5lZWRfY29weSkgewor
CisgICAgLyogUGFuZ28gZG9lc24ndCBjb3JyZWN0bHkgaGFuZGxlIG51bHMuICBXZSBjb252ZXJ0
IHRoZW0gdG8gMHhmZi4gKi8KKyAgICAvKiBBbHNvICJ2YWxpZGF0ZSIgVVRGLTE2IHRleHQgdG8g
bWFrZSBzdXJlIGNvbnZlcnNpb24gZG9lc24ndCBmYWlsLiAqLworCisgICAgVUNoYXIgKnAgPSAo
VUNoYXIgKikgZ19tZW1kdXAgKGFUZXh0LCBhTGVuZ3RoICogc2l6ZW9mIChhVGV4dFswXSkpOwor
CisgICAgLyogZG9uJ3QgbmVlZCB0byByZXNldCBpICovCisgICAgZm9yIChpID0gMDsgaSA8IGFM
ZW5ndGg7IGkrKykgeworICAgICAgaWYgKCFwW2ldIHx8IElTX0xPV19TVVJST0dBVEUgKHBbaV0p
KQorICAgICAgICBwW2ldID0gMHhGRkZEOworICAgICAgZWxzZSBpZiAoSVNfSElHSF9TVVJST0dB
VEUgKHBbaV0pKSB7CisgICAgICAgIGlmIChpIDwgYUxlbmd0aCAtIDEgJiYgSVNfTE9XX1NVUlJP
R0FURSAoYVRleHRbaSsxXSkpCisgICAgICAgICAgaSsrOworICAgICAgICBlbHNlCisgICAgICAg
ICAgcFtpXSA9IDB4RkZGRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhVGV4dCA9IHA7CisgIH0K
KworICBnbG9uZyBpdGVtc193cml0dGVuOworICB0ZXh0ID0gZ191dGYxNl90b191dGY4IChhVGV4
dCwgYUxlbmd0aCwgTlVMTCwgJml0ZW1zX3dyaXR0ZW4sIE5VTEwpOworICBpZiAobGVuZ3RoKQor
ICAgIGxlbmd0aCA9IGl0ZW1zX3dyaXR0ZW47CisKKyAgaWYgKG5lZWRfY29weSkKKyAgICBnX2Zy
ZWUgKChncG9pbnRlcikgYVRleHQpOworCit9CisKKy8vIEZJWE1FOiBoYXZpbmcgdGhpcyBjb2Rl
IGhlcmUgaXMgc2lsbHkKK3N0YXRpYyBnY2hhciogY29udmVydFVuaUNoYXJUb1VURjgoY29uc3Qg
VUNoYXIqIGNoYXJhY3RlcnMsIGdpbnQgbGVuZ3RoLCBpbnQgZnJvbSwgaW50IHRvKQoreworICAg
IGdjaGFyICp1dGY4ID0gMDsKKyAgICBnaW50IG5ld19sZW5ndGggPSAwOworICAgIHV0ZjE2X3Rv
X3V0ZjgoY2hhcmFjdGVycywgbGVuZ3RoLCB1dGY4LCBuZXdfbGVuZ3RoKTsKKyAgICBpZiAoIXV0
ZjgpIHJldHVybiBOVUxMOworCisgICAgaWYgKGZyb20gPiAwKSB7CisgICAgICAgIC8vIGRpc2Nh
cmQgdGhlIGZpcnN0ICdmcm9tJyBjaGFyYWN0ZXJzIAorICAgICAgICAvLyBGSVhNRTogd2Ugc2hv
dWxkIGRvIHRoaXMgYmVmb3JlIHRoZSBjb252ZXJzaW9uIHByb2JhYmx5CisgICAgICAgIGdjaGFy
ICpzdHJfbGVmdCA9IGdfc3RyZHVwKHV0ZjgpOworICAgICAgICBzdHJfbGVmdCA9IGdfdXRmOF9v
ZmZzZXRfdG9fcG9pbnRlcih1dGY4LCBmcm9tKTsKKyAgICAgICAgZ19mcmVlKHV0ZjgpOworICAg
ICAgICB1dGY4ID0gc3RyX2xlZnQ7CisgICAgfQorCisgICAgZ2NoYXIgKnBvcyA9IHV0Zjg7Cisg
ICAgZ2ludCBsZW4gPSBzdHJsZW4ocG9zKTsKKyAgICBHU3RyaW5nICpyZXQgPSBnX3N0cmluZ19u
ZXdfbGVuKE5VTEwsIGxlbik7CisKKyAgICAvLyByZXBsYWNlIGxpbmUgYnJlYWsgYnkgc3BhY2UK
KyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBnaW50IGluZGV4LCBzdGFydDsKKyAgICAg
ICAgcGFuZ29fZmluZF9wYXJhZ3JhcGhfYm91bmRhcnkocG9zLCBsZW4sICZpbmRleCwgJnN0YXJ0
KTsKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX2xlbihyZXQsIHBvcywgaW5kZXgpOworICAgICAg
ICBpZiAoaW5kZXggPT0gc3RhcnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZ19zdHJp
bmdfYXBwZW5kX2MocmV0LCAnICcpOworICAgICAgICBwb3MgKz0gc3RhcnQ7CisgICAgICAgIGxl
biAtPSBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUocmV0LCBGQUxTRSk7
Cit9CisKK3N0YXRpYyB2b2lkIHNldFBhbmdvQXR0cmlidXRlcyhjb25zdCBGb250KiBmb250LCBj
b25zdCBUZXh0UnVuJiBydW4sIFBhbmdvTGF5b3V0KiBsYXlvdXQpCit7CisgICAgUGFuZ29BdHRy
TGlzdCogbGlzdCA9IHBhbmdvX2F0dHJfbGlzdF9uZXcoKTsKKyAgICBQYW5nb0F0dHJpYnV0ZSog
YXR0cjsKKworICAgIGF0dHIgPSBwYW5nb19hdHRyX3NpemVfbmV3KChpbnQpKGZvbnQtPnNpemUo
KSAqIFBBTkdPX1NDQUxFKSk7CisgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAg
IHBhbmdvX2F0dHJfbGlzdF9pbnNlcnRfYmVmb3JlKGxpc3QsIGF0dHIpOworCisgICAgaWYgKCFy
dW4uc3BhY2luZ0Rpc2FibGVkKCkpIHsKKyAgICAgICAgYXR0ciA9IHBhbmdvX2F0dHJfbGV0dGVy
X3NwYWNpbmdfbmV3KGZvbnQtPmxldHRlclNwYWNpbmcoKSAqIFBBTkdPX1NDQUxFKTsKKyAgICAg
ICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgICAgICBwYW5nb19hdHRyX2xpc3Rf
aW5zZXJ0X2JlZm9yZShsaXN0LCBhdHRyKTsKKyAgICB9CisKKyAgICAvLyBQYW5nbyBkb2VzIG5v
dCB5ZXQgc3VwcG9ydCBzeW50aGVzaXNpbmcgc21hbGwgY2FwcworICAgIC8qCisgICAgcHJpbnRm
ICgic21hbGwgY2FwczogJWRcbiIsIGZvbnQtPmlzU21hbGxDYXBzKCkpOworCisgICAgaWYgKGZv
bnQtPmlzU21hbGxDYXBzKCkpIHsKKyAgICAgICAgYXR0ciA9IHBhbmdvX2F0dHJfdmFyaWFudF9u
ZXcoUEFOR09fVkFSSUFOVF9TTUFMTF9DQVBTKTsKKyAgICAgICAgYXR0ci0+ZW5kX2luZGV4ID0g
R19NQVhVSU5UOworICAgICAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9yZShsaXN0LCBh
dHRyKTsKKyAgICB9CisgICAgKi8KKworICAgIHBhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlcyhs
YXlvdXQsIGxpc3QpOworICAgIHBhbmdvX2F0dHJfbGlzdF91bnJlZihsaXN0KTsKKworICAgIHBh
bmdvX2xheW91dF9zZXRfYXV0b19kaXIobGF5b3V0LCBGQUxTRSk7CisKKyAgICBQYW5nb0NvbnRl
eHQqIHBhbmdvX2NvbnRleHQgPSBwYW5nb19sYXlvdXRfZ2V0X2NvbnRleHQobGF5b3V0KTsKKyAg
ICBQYW5nb0RpcmVjdGlvbiBkaXJlY3Rpb24gPSBydW4ucnRsKCkgPyBQQU5HT19ESVJFQ1RJT05f
UlRMIDogUEFOR09fRElSRUNUSU9OX0xUUjsKKyAgICBwYW5nb19jb250ZXh0X3NldF9iYXNlX2Rp
cihwYW5nb19jb250ZXh0LCBkaXJlY3Rpb24pOworfQorCiB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMo
R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEZvbnREYXRhKiBmb250LCBj
b25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgaW50
IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAogewog
ICAgIGNhaXJvX3QqIGNvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
OworICAgIGNhaXJvX3NhdmUoY29udGV4dCk7CiAKICAgICAvLyBTZXQgdGhlIHRleHQgY29sb3Ig
dG8gdXNlIGZvciBkcmF3aW5nLgogICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwpA
QCAtNTksMjYgKzE5NSw5MCBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0
KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEZvbnREYXRhKiBmb250LCBjbwogICAgICAgICBvZmZz
ZXQgKz0gZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKTsKICAgICB9CiAgICAgY2Fpcm9f
c2hvd19nbHlwaHMoY29udGV4dCwgZ2x5cGhzLCBudW1HbHlwaHMpOworCisgICAgY2Fpcm9fcmVz
dG9yZShjb250ZXh0KTsKIH0KIAotdm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3ND
b250ZXh0KiwgY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50
IHRvKSBjb25zdAordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQg
ZnJvbSwgaW50IHRvKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgY2Fpcm9f
dCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBjYWlyb19zYXZlKGNyKTsK
KworICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQgPSBwYW5nb19jYWlyb19jcmVhdGVfbGF5b3V0KGNy
KTsKKworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJUb1VURjgocnVuLmNoYXJhY3Rl
cnMoKSwgcnVuLmxlbmd0aCgpLCBmcm9tLCB0byk7CisgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0
KGxheW91dCwgdXRmOCwgLTEpOworICAgIGdfZnJlZSh1dGY4KTsKKworICAgIHNldFBhbmdvQXR0
cmlidXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICAvLyBTZXQgdGhlIHRleHQgY29sb3Ig
dG8gdXNlIGZvciBkcmF3aW5nLgorICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwor
ICAgIENvbG9yIHBlbkNvbG9yID0gY29udGV4dC0+ZmlsbENvbG9yKCk7CisgICAgcGVuQ29sb3Iu
Z2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgY2Fpcm9fc2V0X3NvdXJjZV9y
Z2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisKKyAgICAvLyBPdXIgbGF5b3V0cyBh
cmUgc2luZ2xlIGxpbmUKKyAgICBjYWlyb19tb3ZlX3RvKGNyLCBwb2ludC54KCksIHBvaW50Lnko
KSk7CisgICAgUGFuZ29MYXlvdXRMaW5lICpsYXlvdXRfbGluZSA9IHBhbmdvX2xheW91dF9nZXRf
bGluZV9yZWFkb25seShsYXlvdXQsIDApOworICAgIHBhbmdvX2NhaXJvX3Nob3dfbGF5b3V0X2xp
bmUoY3IsIGxheW91dF9saW5lKTsKKworICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisgICAg
Y2Fpcm9fcmVzdG9yZShjcik7CiB9CiAKLWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4
VGV4dChjb25zdCBUZXh0UnVuJikgY29uc3QKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21w
bGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQo
KTsKLSAgICByZXR1cm4gMC4wZjsKKyAgICBpZiAocnVuLmxlbmd0aCgpID09IDApCisgICAgICAg
IHJldHVybiAwLjBmOworCisgICAgLy8gRklYTUU6IHdlIHNob3VsZCBjcmVhdGUgdGhlIGxheW91
dCB3aXRoIG91ciBhY3R1YWwgY29udGV4dAorICAgIFBhbmdvRm9udE1hcCogbWFwID0gcGFuZ29f
Y2Fpcm9fZm9udF9tYXBfZ2V0X2RlZmF1bHQoKTsKKyAgICBQYW5nb0NvbnRleHQqIHBhbmdvX2Nv
bnRleHQgPSBwYW5nb19jYWlyb19mb250X21hcF9jcmVhdGVfY29udGV4dChQQU5HT19DQUlST19G
T05UX01BUChtYXApKTsKKyAgICBQYW5nb0xheW91dCogbGF5b3V0ID0gcGFuZ29fbGF5b3V0X25l
dyhwYW5nb19jb250ZXh0KTsKKyAgICBnX29iamVjdF91bnJlZihwYW5nb19jb250ZXh0KTsKKwor
ICAgIHNldFBhbmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICBnY2hhciog
dXRmOCA9IGNvbnZlcnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgo
KSwgMCwgcnVuLmxlbmd0aCgpKTsKKyAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQobGF5b3V0LCB1
dGY4LCAtMSk7CisgICAgZ19mcmVlKHV0ZjgpOworCisgICAgaW50IHBpeGVsX3dpZHRoOworICAg
IHBhbmdvX2xheW91dF9nZXRfc2l6ZShsYXlvdXQsICZwaXhlbF93aWR0aCwgMCk7CisgICAgZmxv
YXQgd2lkdGggPSAoZmxvYXQpcGl4ZWxfd2lkdGggLyAoZG91YmxlKVBBTkdPX1NDQUxFOworICAg
IGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisKKyAgICAvL3ByaW50ZiAoImY6ICVmXG4iLCB3aWR0
aCk7CisKKyAgICByZXR1cm4gd2lkdGg7CiB9CiAKLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlv
bkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mLCBpbnQsIGJvb2wpIGNvbnN0CitpbnQgRm9u
dDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGlu
dCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAogewotICAgIG5vdEltcGxlbWVu
dGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgUGFuZ29Gb250TWFwKiBtYXAgPSBwYW5nb19jYWly
b19mb250X21hcF9nZXRfZGVmYXVsdCgpOworCisgICAgUGFuZ29Db250ZXh0KiBwYW5nb19jb250
ZXh0ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQoUEFOR09fQ0FJUk9fRk9O
VF9NQVAobWFwKSk7CisgICAgUGFuZ29MYXlvdXQqIGxheW91dCA9IHBhbmdvX2xheW91dF9uZXco
cGFuZ29fY29udGV4dCk7CisgICAgZ19vYmplY3RfdW5yZWYocGFuZ29fY29udGV4dCk7CisKKyAg
ICBzZXRQYW5nb0F0dHJpYnV0ZXModGhpcywgcnVuLCBsYXlvdXQpOworCisgICAgZ2NoYXIqIHV0
ZjggPSBjb252ZXJ0VW5pQ2hhclRvVVRGOChydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCks
IDAsIHJ1bi5sZW5ndGgoKSk7CisgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRm
OCwgLTEpOworICAgIGdfZnJlZSh1dGY4KTsKKworICAgIGludCBpbmRleCwgdHJhaWxpbmc7Cisg
ICAgcGFuZ29fbGF5b3V0X3h5X3RvX2luZGV4KGxheW91dCwgeCAqIFBBTkdPX1NDQUxFLCAxLCAm
aW5kZXgsICZ0cmFpbGluZyk7CisgICAgZ2xvbmcgb2Zmc2V0ID0gZ191dGY4X3BvaW50ZXJfdG9f
b2Zmc2V0KHV0ZjgsIHV0ZjggKyBpbmRleCk7CisgICAgZ19vYmplY3RfdW5yZWYobGF5b3V0KTsK
KworICAgIC8vcHJpbnRmICgib2Zmc2V0OiAlZlxuIiwgb2Zmc2V0KTsKKworICAgIHJldHVybiBv
ZmZzZXQ7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYsIGNvbnN0IEludFBvaW50JiwgaW50LCBpbnQsIGludCkgY29uc3QKK0Zs
b2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>18304</attachid>
            <date>2008-01-06 14:04:18 -0800</date>
            <delta_ts>2008-01-08 11:08:23 -0800</delta_ts>
            <desc>Rendering bug with pango.</desc>
            <filename>bugpango.png</filename>
            <type>image/png</type>
            <size>19668</size>
            <attacher name="Xan Lopez">xan.lopez</attacher>
            
              <data encoding="base64">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
QmCC
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18330</attachid>
            <date>2008-01-08 11:08:23 -0800</date>
            <delta_ts>2008-01-08 19:49:46 -0800</delta_ts>
            <desc>pangorendering.diff</desc>
            <filename>pangorendering.diff</filename>
            <type>text/plain</type>
            <size>9287</size>
            <attacher name="Xan Lopez">xan.lopez</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MzljYmI5Yy4uZDY4MjYzMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMyBAQAorMjAwOC0wMS0wOCAgWGFuIExvcGV6ICA8
eGFuQGdub21lLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBXQVJOSU5HOiBOTyBURVNUIENBU0VTIEFEREVEIE9SIENIQU5HRUQKKworICAgICAg
ICBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYxMAorICAgICAgICBb
R1RLXSBUZXh0IHJlbmRlcmluZyB1c2luZyBQYW5nbworCisgICAgICAgIFVzZSBQYW5nbyB0byBy
ZW5kZXIgQ29tcGxleCBwYXRoLgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9ndGsvRm9udEd0ay5jcHA6CisgICAgICAgIChXZWJDb3JlOjp1dGYxNl90b191dGY4KToKKyAg
ICAgICAgKFdlYkNvcmU6OmNvbnZlcnRVbmlDaGFyVG9VVEY4KToKKyAgICAgICAgKFdlYkNvcmU6
OnNldFBhbmdvQXR0cmlidXRlcyk6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhz
KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdDb21wbGV4VGV4dCk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQpOgorICAgICAgICAoV2ViQ29y
ZTo6Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dCk6CisKIDIwMDgtMDEtMDgg
IERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBGaXggYSBXeCBidWls
ZCBlcnJvci4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrL0ZvbnRH
dGsuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ndGsvRm9udEd0ay5jcHAKaW5kZXgg
M2IzYTIyOC4uNzkwZDc2MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
dGsvRm9udEd0ay5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ndGsvRm9udEd0
ay5jcHAKQEAgLTEsNiArMSwxMCBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBD
b21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAw
NiBNaWNoYWVsIEVtbWVsIG1pa2UuZW1tZWxAZ21haWwuY29tIAorICogQ29weXJpZ2h0IChjKSAy
MDA3IEhpcm95dWtpIElrZXpvZSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChj
KSAyMDA3IEtvdWhlaSBTdXRvdSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgg
WGFuIExvcGV6IDx4YW5AZ25vbWUub3JnPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKQEAgLTMzLDEyICszNywxNDQgQEAKICNpbmNsdWRlICJTaW1wbGVGb250RGF0
YS5oIgogI2luY2x1ZGUgPGNhaXJvLmg+CiAKKyNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2lu
Y2x1ZGUgPHBhbmdvL3BhbmdvY2Fpcm8uaD4KKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCisvKiBG
cm9tIE1vemlsbGEsIHdpdGggc21hbGwgY2hhbmdlcyAqLworCisjZGVmaW5lIElTX0hJR0hfU1VS
Uk9HQVRFKHUpICAoKFVDaGFyKSh1KSA+PSAoVUNoYXIpMHhkODAwICYmIChVQ2hhcikodSkgPD0g
KFVDaGFyKTB4ZGJmZikKKyNkZWZpbmUgSVNfTE9XX1NVUlJPR0FURSh1KSAgKChVQ2hhcikodSkg
Pj0gKFVDaGFyKTB4ZGMwMCAmJiAoVUNoYXIpKHUpIDw9IChVQ2hhcikweGRmZmYpCisKK3N0YXRp
YyB2b2lkCit1dGYxNl90b191dGY4IChjb25zdCBVQ2hhciogYVRleHQsIGdpbnQgYUxlbmd0aCwg
Y2hhciAqJnRleHQsIGdpbnQgJmxlbmd0aCkKK3sKKyAgZ2Jvb2xlYW4gbmVlZF9jb3B5ID0gRkFM
U0U7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsKKyAgICBp
ZiAoIWFUZXh0W2ldIHx8IElTX0xPV19TVVJST0dBVEUoYVRleHRbaV0pKSB7CisgICAgICBuZWVk
X2NvcHkgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKElTX0hJR0hf
U1VSUk9HQVRFKGFUZXh0W2ldKSkgeworICAgICAgaWYgKGkgPCBhTGVuZ3RoIC0gMSAmJiBJU19M
T1dfU1VSUk9HQVRFKGFUZXh0W2krMV0pKQorICAgICAgICBpKys7CisgICAgICBlbHNlIHsKKyAg
ICAgICAgbmVlZF9jb3B5ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQor
ICB9CisKKyAgaWYgKG5lZWRfY29weSkgeworCisgICAgLyogUGFuZ28gZG9lc24ndCBjb3JyZWN0
bHkgaGFuZGxlIG51bHMuICBXZSBjb252ZXJ0IHRoZW0gdG8gMHhmZi4gKi8KKyAgICAvKiBBbHNv
ICJ2YWxpZGF0ZSIgVVRGLTE2IHRleHQgdG8gbWFrZSBzdXJlIGNvbnZlcnNpb24gZG9lc24ndCBm
YWlsLiAqLworCisgICAgVUNoYXIgKnAgPSAoVUNoYXIgKilnX21lbWR1cChhVGV4dCwgYUxlbmd0
aCAqIHNpemVvZihhVGV4dFswXSkpOworCisgICAgLyogZG9uJ3QgbmVlZCB0byByZXNldCBpICov
CisgICAgZm9yIChpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgeworICAgICAgaWYgKCFwW2ldIHx8
IElTX0xPV19TVVJST0dBVEUocFtpXSkpCisgICAgICAgIHBbaV0gPSAweEZGRkQ7CisgICAgICBl
bHNlIGlmIChJU19ISUdIX1NVUlJPR0FURShwW2ldKSkgeworICAgICAgICBpZiAoaSA8IGFMZW5n
dGggLSAxICYmIElTX0xPV19TVVJST0dBVEUoYVRleHRbaSsxXSkpCisgICAgICAgICAgaSsrOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgcFtpXSA9IDB4RkZGRDsKKyAgICAgIH0KKyAgICB9CisK
KyAgICBhVGV4dCA9IHA7CisgIH0KKworICBnbG9uZyBpdGVtc193cml0dGVuOworICB0ZXh0ID0g
Z191dGYxNl90b191dGY4KGFUZXh0LCBhTGVuZ3RoLCBOVUxMLCAmaXRlbXNfd3JpdHRlbiwgTlVM
TCk7CisgIGxlbmd0aCA9IGl0ZW1zX3dyaXR0ZW47CisKKyAgaWYgKG5lZWRfY29weSkKKyAgICBn
X2ZyZWUoKGdwb2ludGVyKSBhVGV4dCk7CisKK30KKworLy8gRklYTUU6IGhhdmluZyB0aGlzIGNv
ZGUgaGVyZSBpcyBzaWxseQorc3RhdGljIGdjaGFyKiBjb252ZXJ0VW5pQ2hhclRvVVRGOChjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgZ2ludCBsZW5ndGgsIGludCBmcm9tLCBpbnQgdG8pCit7Cisg
ICAgZ2NoYXIgKnV0ZjggPSAwOworICAgIGdpbnQgbmV3X2xlbmd0aCA9IDA7CisgICAgdXRmMTZf
dG9fdXRmOChjaGFyYWN0ZXJzLCBsZW5ndGgsIHV0ZjgsIG5ld19sZW5ndGgpOworICAgIGlmICgh
dXRmOCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoZnJvbSA+IDApIHsKKyAgICAgICAgLy8gZGlz
Y2FyZCB0aGUgZmlyc3QgJ2Zyb20nIGNoYXJhY3RlcnMgCisgICAgICAgIC8vIEZJWE1FOiB3ZSBz
aG91bGQgZG8gdGhpcyBiZWZvcmUgdGhlIGNvbnZlcnNpb24gcHJvYmFibHkKKyAgICAgICAgZ2No
YXIgKnN0cl9sZWZ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHV0ZjgsIGZyb20pOworICAg
ICAgICBnY2hhciAqdG1wID0gZ19zdHJkdXAoc3RyX2xlZnQpOworICAgICAgICBnX2ZyZWUodXRm
OCk7CisgICAgICAgIHV0ZjggPSB0bXA7CisgICAgfQorCisgICAgZ2NoYXIgKnBvcyA9IHV0Zjg7
CisgICAgZ2ludCBsZW4gPSBzdHJsZW4ocG9zKTsKKyAgICBHU3RyaW5nICpyZXQgPSBnX3N0cmlu
Z19uZXdfbGVuKE5VTEwsIGxlbik7CisKKyAgICAvLyByZXBsYWNlIGxpbmUgYnJlYWsgYnkgc3Bh
Y2UKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBnaW50IGluZGV4LCBzdGFydDsKKyAg
ICAgICAgcGFuZ29fZmluZF9wYXJhZ3JhcGhfYm91bmRhcnkocG9zLCBsZW4sICZpbmRleCwgJnN0
YXJ0KTsKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX2xlbihyZXQsIHBvcywgaW5kZXgpOworICAg
ICAgICBpZiAoaW5kZXggPT0gc3RhcnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZ19z
dHJpbmdfYXBwZW5kX2MocmV0LCAnICcpOworICAgICAgICBwb3MgKz0gc3RhcnQ7CisgICAgICAg
IGxlbiAtPSBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUocmV0LCBGQUxT
RSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFBhbmdvQXR0cmlidXRlcyhjb25zdCBGb250KiBmb250
LCBjb25zdCBUZXh0UnVuJiBydW4sIFBhbmdvTGF5b3V0KiBsYXlvdXQpCit7CisgICAgUGFuZ29B
dHRyTGlzdCogbGlzdCA9IHBhbmdvX2F0dHJfbGlzdF9uZXcoKTsKKyAgICBQYW5nb0F0dHJpYnV0
ZSogYXR0cjsKKworICAgIGF0dHIgPSBwYW5nb19hdHRyX3NpemVfbmV3X2Fic29sdXRlKChpbnQp
KGZvbnQtPnNpemUoKSAqIFBBTkdPX1NDQUxFKSk7CisgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19N
QVhVSU5UOworICAgIHBhbmdvX2F0dHJfbGlzdF9pbnNlcnRfYmVmb3JlKGxpc3QsIGF0dHIpOwor
CisgICAgaWYgKCFydW4uc3BhY2luZ0Rpc2FibGVkKCkpIHsKKyAgICAgICAgYXR0ciA9IHBhbmdv
X2F0dHJfbGV0dGVyX3NwYWNpbmdfbmV3KGZvbnQtPmxldHRlclNwYWNpbmcoKSAqIFBBTkdPX1ND
QUxFKTsKKyAgICAgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgICAgICBwYW5n
b19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9yZShsaXN0LCBhdHRyKTsKKyAgICB9CisKKyAgICAvLyBQ
YW5nbyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBzeW50aGVzaXNpbmcgc21hbGwgY2FwcworICAgIC8q
CisgICAgcHJpbnRmICgic21hbGwgY2FwczogJWRcbiIsIGZvbnQtPmlzU21hbGxDYXBzKCkpOwor
CisgICAgaWYgKGZvbnQtPmlzU21hbGxDYXBzKCkpIHsKKyAgICAgICAgYXR0ciA9IHBhbmdvX2F0
dHJfdmFyaWFudF9uZXcoUEFOR09fVkFSSUFOVF9TTUFMTF9DQVBTKTsKKyAgICAgICAgYXR0ci0+
ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgICAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2Jl
Zm9yZShsaXN0LCBhdHRyKTsKKyAgICB9CisgICAgKi8KKworICAgIHBhbmdvX2xheW91dF9zZXRf
YXR0cmlidXRlcyhsYXlvdXQsIGxpc3QpOworICAgIHBhbmdvX2F0dHJfbGlzdF91bnJlZihsaXN0
KTsKKworICAgIHBhbmdvX2xheW91dF9zZXRfYXV0b19kaXIobGF5b3V0LCBGQUxTRSk7CisKKyAg
ICBQYW5nb0NvbnRleHQqIHBhbmdvX2NvbnRleHQgPSBwYW5nb19sYXlvdXRfZ2V0X2NvbnRleHQo
bGF5b3V0KTsKKyAgICBQYW5nb0RpcmVjdGlvbiBkaXJlY3Rpb24gPSBydW4ucnRsKCkgPyBQQU5H
T19ESVJFQ1RJT05fUlRMIDogUEFOR09fRElSRUNUSU9OX0xUUjsKKyAgICBwYW5nb19jb250ZXh0
X3NldF9iYXNlX2RpcihwYW5nb19jb250ZXh0LCBkaXJlY3Rpb24pOworfQorCiB2b2lkIEZvbnQ6
OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBs
ZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCiAgICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAogewogICAgIGNhaXJvX3QqIGNvbnRleHQgPSBncmFwaGljc0NvbnRleHQt
PnBsYXRmb3JtQ29udGV4dCgpOworICAgIGNhaXJvX3NhdmUoY29udGV4dCk7CiAKICAgICAvLyBT
ZXQgdGhlIHRleHQgY29sb3IgdG8gdXNlIGZvciBkcmF3aW5nLgogICAgIGZsb2F0IHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhOwpAQCAtNTksMjYgKzE5NSw4NiBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlw
aHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmbwogICAgICAgICBvZmZzZXQgKz0gZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKTsK
ICAgICB9CiAgICAgY2Fpcm9fc2hvd19nbHlwaHMoY29udGV4dCwgZ2x5cGhzLCBudW1HbHlwaHMp
OworCisgICAgY2Fpcm9fcmVzdG9yZShjb250ZXh0KTsKIH0KIAotdm9pZCBGb250OjpkcmF3Q29t
cGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9p
bnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQo
R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewotICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAg
ICBjYWlyb19zYXZlKGNyKTsKKworICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQgPSBwYW5nb19jYWly
b19jcmVhdGVfbGF5b3V0KGNyKTsKKworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJU
b1VURjgocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpLCBmcm9tLCB0byk7CisgICAgcGFu
Z29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOworICAgIGdfZnJlZSh1dGY4KTsK
KworICAgIHNldFBhbmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICAvLyBT
ZXQgdGhlIHRleHQgY29sb3IgdG8gdXNlIGZvciBkcmF3aW5nLgorICAgIGZsb2F0IHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhOworICAgIENvbG9yIHBlbkNvbG9yID0gY29udGV4dC0+ZmlsbENvbG9y
KCk7CisgICAgcGVuQ29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAg
Y2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisKKyAg
ICAvLyBPdXIgbGF5b3V0cyBhcmUgc2luZ2xlIGxpbmUKKyAgICBjYWlyb19tb3ZlX3RvKGNyLCBw
b2ludC54KCksIHBvaW50LnkoKSk7CisgICAgUGFuZ29MYXlvdXRMaW5lICpsYXlvdXRfbGluZSA9
IHBhbmdvX2xheW91dF9nZXRfbGluZV9yZWFkb25seShsYXlvdXQsIDApOworICAgIHBhbmdvX2Nh
aXJvX3Nob3dfbGF5b3V0X2xpbmUoY3IsIGxheW91dF9saW5lKTsKKworICAgIGdfb2JqZWN0X3Vu
cmVmKGxheW91dCk7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CiB9CiAKLWZsb2F0IEZvbnQ6OmZs
b2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJikgY29uc3QKK2Zsb2F0IEZvbnQ6
OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0CiB7Ci0g
ICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMC4wZjsKKyAgICBpZiAocnVuLmxlbmd0
aCgpID09IDApCisgICAgICAgIHJldHVybiAwLjBmOworCisgICAgLy8gRklYTUU6IHdlIHNob3Vs
ZCBjcmVhdGUgdGhlIGxheW91dCB3aXRoIG91ciBhY3R1YWwgY29udGV4dAorICAgIFBhbmdvRm9u
dE1hcCogbWFwID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfZ2V0X2RlZmF1bHQoKTsKKyAgICBQYW5n
b0NvbnRleHQqIHBhbmdvX2NvbnRleHQgPSBwYW5nb19jYWlyb19mb250X21hcF9jcmVhdGVfY29u
dGV4dChQQU5HT19DQUlST19GT05UX01BUChtYXApKTsKKyAgICBQYW5nb0xheW91dCogbGF5b3V0
ID0gcGFuZ29fbGF5b3V0X25ldyhwYW5nb19jb250ZXh0KTsKKyAgICBnX29iamVjdF91bnJlZihw
YW5nb19jb250ZXh0KTsKKworICAgIHNldFBhbmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91
dCk7CisKKyAgICBnY2hhciogdXRmOCA9IGNvbnZlcnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0
ZXJzKCksIHJ1bi5sZW5ndGgoKSwgMCwgcnVuLmxlbmd0aCgpKTsKKyAgICBwYW5nb19sYXlvdXRf
c2V0X3RleHQobGF5b3V0LCB1dGY4LCAtMSk7CisgICAgZ19mcmVlKHV0ZjgpOworCisgICAgaW50
IGxheW91dF93aWR0aDsKKyAgICBwYW5nb19sYXlvdXRfZ2V0X3NpemUobGF5b3V0LCAmbGF5b3V0
X3dpZHRoLCAwKTsKKyAgICBmbG9hdCB3aWR0aCA9IChmbG9hdClsYXlvdXRfd2lkdGggLyAoZG91
YmxlKVBBTkdPX1NDQUxFOworICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisKKyAgICByZXR1
cm4gd2lkdGg7CiB9CiAKLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0
KGNvbnN0IFRleHRSdW4mLCBpbnQsIGJvb2wpIGNvbnN0CitpbnQgRm9udDo6b2Zmc2V0Rm9yUG9z
aXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCB4LCBib29sIGluY2x1
ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIDA7CisgICAgUGFuZ29Gb250TWFwKiBtYXAgPSBwYW5nb19jYWlyb19mb250X21hcF9nZXRf
ZGVmYXVsdCgpOworCisgICAgUGFuZ29Db250ZXh0KiBwYW5nb19jb250ZXh0ID0gcGFuZ29fY2Fp
cm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQoUEFOR09fQ0FJUk9fRk9OVF9NQVAobWFwKSk7Cisg
ICAgUGFuZ29MYXlvdXQqIGxheW91dCA9IHBhbmdvX2xheW91dF9uZXcocGFuZ29fY29udGV4dCk7
CisgICAgZ19vYmplY3RfdW5yZWYocGFuZ29fY29udGV4dCk7CisKKyAgICBzZXRQYW5nb0F0dHJp
YnV0ZXModGhpcywgcnVuLCBsYXlvdXQpOworCisgICAgZ2NoYXIqIHV0ZjggPSBjb252ZXJ0VW5p
Q2hhclRvVVRGOChydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCksIDAsIHJ1bi5sZW5ndGgo
KSk7CisgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOworICAgIGdf
ZnJlZSh1dGY4KTsKKworICAgIGludCBpbmRleCwgdHJhaWxpbmc7CisgICAgcGFuZ29fbGF5b3V0
X3h5X3RvX2luZGV4KGxheW91dCwgeCAqIFBBTkdPX1NDQUxFLCAxLCAmaW5kZXgsICZ0cmFpbGlu
Zyk7CisgICAgZ2xvbmcgb2Zmc2V0ID0gZ191dGY4X3BvaW50ZXJfdG9fb2Zmc2V0KHV0ZjgsIHV0
ZjggKyBpbmRleCk7CisgICAgZ19vYmplY3RfdW5yZWYobGF5b3V0KTsKKworICAgIHJldHVybiBv
ZmZzZXQ7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYsIGNvbnN0IEludFBvaW50JiwgaW50LCBpbnQsIGludCkgY29uc3QKK0Zs
b2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOwo=
</data>
<flag name="review"
          id="7999"
          type_id="1"
          status="-"
          setter="alp"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18341</attachid>
            <date>2008-01-08 19:49:46 -0800</date>
            <delta_ts>2008-01-08 20:42:42 -0800</delta_ts>
            <desc>0001-Use-pango-to-render-complex-path.patch</desc>
            <filename>0001-Use-pango-to-render-complex-path.patch</filename>
            <type>text/plain</type>
            <size>10040</size>
            <attacher name="Xan Lopez">xan.lopez</attacher>
            
              <data encoding="base64">RnJvbSBmN2ZkNjJmNTE2OTUzOTA0NjNhMGIzYjA3MjEyOTg2ZTE1OTQ4MzZjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBYYW4gTG9wZXogPHhhbkBuaXJhaWthbmFpLihub25lKT4KRGF0
ZTogVHVlLCA4IEphbiAyMDA4IDIxOjA3OjI0ICswMjAwClN1YmplY3Q6IFtQQVRDSF0gVXNlIHBh
bmdvIHRvIHJlbmRlciBjb21wbGV4IHBhdGguCgotLS0KIFdlYkNvcmUvQ2hhbmdlTG9nICAgICAg
ICAgICAgICAgICAgICAgICAgIHwgICAyMCArKysKIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3RrL0ZvbnRHdGsuY3BwIHwgIDIxNSArKysrKysrKysrKysrKysrKysrKysrKysrKystLQogMiBm
aWxlcyBjaGFuZ2VkLCAyMjUgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAzOWNiYjlj
Li5kNjgyNjMzIDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0No
YW5nZUxvZwpAQCAtMSwzICsxLDIzIEBACisyMDA4LTAxLTA4ICBYYW4gTG9wZXogIDx4YW5AZ25v
bWUub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgIGh0dHA6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjEwCisgICAgICAgIFtHVEtdIFRl
eHQgcmVuZGVyaW5nIHVzaW5nIFBhbmdvCisKKyAgICAgICAgVXNlIFBhbmdvIHRvIHJlbmRlciBD
b21wbGV4IHBhdGguCisgICAgICAgIAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2d0ay9G
b250R3RrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnV0ZjE2X3RvX3V0ZjgpOgorICAgICAgICAo
V2ViQ29yZTo6Y29udmVydFVuaUNoYXJUb1VURjgpOgorICAgICAgICAoV2ViQ29yZTo6c2V0UGFu
Z29BdHRyaWJ1dGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdHbHlwaHMpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KToKKwogMjAwOC0wMS0wOCAgRGFuIEJl
cm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBhIFd4IGJ1aWxkIGVycm9y
LgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ndGsvRm9udEd0ay5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250R3RrLmNwcAppbmRleCAzYjNhMjI4
Li44ZTU1MmE3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250
R3RrLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250R3RrLmNwcApA
QCAtMSw2ICsxLDEwIEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hh
ZWwgRW1tZWwgbWlrZS5lbW1lbEBnbWFpbC5jb20gCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSGly
b3l1a2kgSWtlem9lIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcg
S291aGVpIFN1dG91IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
QWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBYYW4gTG9w
ZXogPHhhbkBnbm9tZS5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dApAQCAtMzMsMTIgKzM3LDE0MiBAQAogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCiAj
aW5jbHVkZSA8Y2Fpcm8uaD4KIAorI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8
cGFuZ28vcGFuZ29jYWlyby5oPgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKy8qIEZyb20gTW96
aWxsYSwgd2l0aCBzbWFsbCBjaGFuZ2VzICovCisKKyNkZWZpbmUgSVNfSElHSF9TVVJST0dBVEUo
dSkgICgoVUNoYXIpKHUpID49IChVQ2hhcikweGQ4MDAgJiYgKFVDaGFyKSh1KSA8PSAoVUNoYXIp
MHhkYmZmKQorI2RlZmluZSBJU19MT1dfU1VSUk9HQVRFKHUpICAoKFVDaGFyKSh1KSA+PSAoVUNo
YXIpMHhkYzAwICYmIChVQ2hhcikodSkgPD0gKFVDaGFyKTB4ZGZmZikKKworc3RhdGljIHZvaWQg
dXRmMTZfdG9fdXRmOChjb25zdCBVQ2hhciogYVRleHQsIGdpbnQgYUxlbmd0aCwgY2hhciAqJnRl
eHQsIGdpbnQgJmxlbmd0aCkKK3sKKyAgZ2Jvb2xlYW4gbmVlZF9jb3B5ID0gRkFMU0U7CisgIGlu
dCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsKKyAgICBpZiAoIWFUZXh0
W2ldIHx8IElTX0xPV19TVVJST0dBVEUoYVRleHRbaV0pKSB7CisgICAgICBuZWVkX2NvcHkgPSBU
UlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKElTX0hJR0hfU1VSUk9HQVRF
KGFUZXh0W2ldKSkgeworICAgICAgaWYgKGkgPCBhTGVuZ3RoIC0gMSAmJiBJU19MT1dfU1VSUk9H
QVRFKGFUZXh0W2krMV0pKQorICAgICAgICBpKys7CisgICAgICBlbHNlIHsKKyAgICAgICAgbmVl
ZF9jb3B5ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAg
aWYgKG5lZWRfY29weSkgeworCisgICAgLyogUGFuZ28gZG9lc24ndCBjb3JyZWN0bHkgaGFuZGxl
IG51bHMuICBXZSBjb252ZXJ0IHRoZW0gdG8gMHhmZi4gKi8KKyAgICAvKiBBbHNvICJ2YWxpZGF0
ZSIgVVRGLTE2IHRleHQgdG8gbWFrZSBzdXJlIGNvbnZlcnNpb24gZG9lc24ndCBmYWlsLiAqLwor
CisgICAgVUNoYXIqIHAgPSAoVUNoYXIgKilnX21lbWR1cChhVGV4dCwgYUxlbmd0aCAqIHNpemVv
ZihhVGV4dFswXSkpOworCisgICAgLyogZG9uJ3QgbmVlZCB0byByZXNldCBpICovCisgICAgZm9y
IChpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgeworICAgICAgaWYgKCFwW2ldIHx8IElTX0xPV19T
VVJST0dBVEUocFtpXSkpCisgICAgICAgIHBbaV0gPSAweEZGRkQ7CisgICAgICBlbHNlIGlmIChJ
U19ISUdIX1NVUlJPR0FURShwW2ldKSkgeworICAgICAgICBpZiAoaSA8IGFMZW5ndGggLSAxICYm
IElTX0xPV19TVVJST0dBVEUoYVRleHRbaSsxXSkpCisgICAgICAgICAgaSsrOworICAgICAgICBl
bHNlCisgICAgICAgICAgcFtpXSA9IDB4RkZGRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhVGV4
dCA9IHA7CisgIH0KKworICBnbG9uZyBpdGVtc193cml0dGVuOworICB0ZXh0ID0gZ191dGYxNl90
b191dGY4KGFUZXh0LCBhTGVuZ3RoLCBOVUxMLCAmaXRlbXNfd3JpdHRlbiwgTlVMTCk7CisgIGxl
bmd0aCA9IGl0ZW1zX3dyaXR0ZW47CisKKyAgaWYgKG5lZWRfY29weSkKKyAgICBnX2ZyZWUoKGdw
b2ludGVyKSBhVGV4dCk7CisKK30KKworc3RhdGljIGdjaGFyKiBjb252ZXJ0VW5pQ2hhclRvVVRG
OChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgZ2ludCBsZW5ndGgsIGludCBmcm9tLCBpbnQgdG8p
Cit7CisgICAgZ2NoYXIgKnV0ZjggPSAwOworICAgIGdpbnQgbmV3X2xlbmd0aCA9IDA7CisgICAg
dXRmMTZfdG9fdXRmOChjaGFyYWN0ZXJzLCBsZW5ndGgsIHV0ZjgsIG5ld19sZW5ndGgpOworICAg
IGlmICghdXRmOCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoZnJvbSA+IDApIHsKKyAgICAgICAg
Ly8gZGlzY2FyZCB0aGUgZmlyc3QgJ2Zyb20nIGNoYXJhY3RlcnMgCisgICAgICAgIC8vIEZJWE1F
OiB3ZSBzaG91bGQgZG8gdGhpcyBiZWZvcmUgdGhlIGNvbnZlcnNpb24gcHJvYmFibHkKKyAgICAg
ICAgZ2NoYXIgKnN0cl9sZWZ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHV0ZjgsIGZyb20p
OworICAgICAgICBnY2hhciAqdG1wID0gZ19zdHJkdXAoc3RyX2xlZnQpOworICAgICAgICBnX2Zy
ZWUodXRmOCk7CisgICAgICAgIHV0ZjggPSB0bXA7CisgICAgfQorCisgICAgZ2NoYXIgKnBvcyA9
IHV0Zjg7CisgICAgZ2ludCBsZW4gPSBzdHJsZW4ocG9zKTsKKyAgICBHU3RyaW5nICpyZXQgPSBn
X3N0cmluZ19uZXdfbGVuKE5VTEwsIGxlbik7CisKKyAgICAvLyByZXBsYWNlIGxpbmUgYnJlYWsg
Ynkgc3BhY2UKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBnaW50IGluZGV4LCBzdGFy
dDsKKyAgICAgICAgcGFuZ29fZmluZF9wYXJhZ3JhcGhfYm91bmRhcnkocG9zLCBsZW4sICZpbmRl
eCwgJnN0YXJ0KTsKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX2xlbihyZXQsIHBvcywgaW5kZXgp
OworICAgICAgICBpZiAoaW5kZXggPT0gc3RhcnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgZ19zdHJpbmdfYXBwZW5kX2MocmV0LCAnICcpOworICAgICAgICBwb3MgKz0gc3RhcnQ7Cisg
ICAgICAgIGxlbiAtPSBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUocmV0
LCBGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFBhbmdvQXR0cmlidXRlcyhjb25zdCBGb250
KiBmb250LCBjb25zdCBUZXh0UnVuJiBydW4sIFBhbmdvTGF5b3V0KiBsYXlvdXQpCit7CisgICAg
UGFuZ29BdHRyTGlzdCogbGlzdCA9IHBhbmdvX2F0dHJfbGlzdF9uZXcoKTsKKyAgICBQYW5nb0F0
dHJpYnV0ZSogYXR0cjsKKworICAgIGF0dHIgPSBwYW5nb19hdHRyX3NpemVfbmV3X2Fic29sdXRl
KChpbnQpKGZvbnQtPnNpemUoKSAqIFBBTkdPX1NDQUxFKSk7CisgICAgYXR0ci0+ZW5kX2luZGV4
ID0gR19NQVhVSU5UOworICAgIHBhbmdvX2F0dHJfbGlzdF9pbnNlcnRfYmVmb3JlKGxpc3QsIGF0
dHIpOworCisgICAgaWYgKCFydW4uc3BhY2luZ0Rpc2FibGVkKCkpIHsKKyAgICAgICAgYXR0ciA9
IHBhbmdvX2F0dHJfbGV0dGVyX3NwYWNpbmdfbmV3KGZvbnQtPmxldHRlclNwYWNpbmcoKSAqIFBB
TkdPX1NDQUxFKTsKKyAgICAgICAgYXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgICAg
ICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9yZShsaXN0LCBhdHRyKTsKKyAgICB9CisKKyAg
ICAvLyBQYW5nbyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBzeW50aGVzaXNpbmcgc21hbGwgY2Fwcwor
ICAgIC8qCisgICAgcHJpbnRmICgic21hbGwgY2FwczogJWRcbiIsIGZvbnQtPmlzU21hbGxDYXBz
KCkpOworCisgICAgaWYgKGZvbnQtPmlzU21hbGxDYXBzKCkpIHsKKyAgICAgICAgYXR0ciA9IHBh
bmdvX2F0dHJfdmFyaWFudF9uZXcoUEFOR09fVkFSSUFOVF9TTUFMTF9DQVBTKTsKKyAgICAgICAg
YXR0ci0+ZW5kX2luZGV4ID0gR19NQVhVSU5UOworICAgICAgICBwYW5nb19hdHRyX2xpc3RfaW5z
ZXJ0X2JlZm9yZShsaXN0LCBhdHRyKTsKKyAgICB9CisgICAgKi8KKworICAgIHBhbmdvX2xheW91
dF9zZXRfYXR0cmlidXRlcyhsYXlvdXQsIGxpc3QpOworICAgIHBhbmdvX2F0dHJfbGlzdF91bnJl
ZihsaXN0KTsKKworICAgIHBhbmdvX2xheW91dF9zZXRfYXV0b19kaXIobGF5b3V0LCBGQUxTRSk7
CisKKyAgICBQYW5nb0NvbnRleHQqIHBhbmdvX2NvbnRleHQgPSBwYW5nb19sYXlvdXRfZ2V0X2Nv
bnRleHQobGF5b3V0KTsKKyAgICBQYW5nb0RpcmVjdGlvbiBkaXJlY3Rpb24gPSBydW4ucnRsKCkg
PyBQQU5HT19ESVJFQ1RJT05fUlRMIDogUEFOR09fRElSRUNUSU9OX0xUUjsKKyAgICBwYW5nb19j
b250ZXh0X3NldF9iYXNlX2RpcihwYW5nb19jb250ZXh0LCBkaXJlY3Rpb24pOworfQorCiB2b2lk
IEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0
IFNpbXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCiAg
ICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50KSBjb25zdAogewogICAgIGNhaXJvX3QqIGNvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgIGNhaXJvX3NhdmUoY29udGV4dCk7CiAKICAg
ICAvLyBTZXQgdGhlIHRleHQgY29sb3IgdG8gdXNlIGZvciBkcmF3aW5nLgogICAgIGZsb2F0IHJl
ZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwpAQCAtNDYsNyArMTgwLDYgQEAgdm9pZCBGb250OjpkcmF3
R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBTaW1wbGVGb250
RGF0YSogZm8KICAgICBwZW5Db2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
ICAgICBjYWlyb19zZXRfc291cmNlX3JnYmEoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxw
aGEpOwogCi0gICAgLy8gVGhpcyB3YXMgY29tbWVudGVkIG91dCBhcyBpdCBtYWRlICJzb21lIHRl
eHQgaW52aXNpYmxlIiBidXQgc2VlbXMgdG8gd29yayBub3cuCiAgICAgZm9udC0+c2V0Rm9udChj
b250ZXh0KTsKIAogICAgIEdseXBoQnVmZmVyR2x5cGgqIGdseXBocyA9IChHbHlwaEJ1ZmZlckds
eXBoKikgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pOwpAQCAtNTksMjYgKzE5Miw4OCBAQCB2b2lk
IEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0
IFNpbXBsZUZvbnREYXRhKiBmbwogICAgICAgICBvZmZzZXQgKz0gZ2x5cGhCdWZmZXIuYWR2YW5j
ZUF0KGZyb20gKyBpKTsKICAgICB9CiAgICAgY2Fpcm9fc2hvd19nbHlwaHMoY29udGV4dCwgZ2x5
cGhzLCBudW1HbHlwaHMpOworCisgICAgY2Fpcm9fcmVzdG9yZShjb250ZXh0KTsKIH0KIAotdm9p
ZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1biYs
IGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAordm9pZCBGb250Ojpk
cmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewot
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKTsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIFBhbmdvTGF5b3V0KiBsYXlv
dXQgPSBwYW5nb19jYWlyb19jcmVhdGVfbGF5b3V0KGNyKTsKKworICAgIGdjaGFyKiB1dGY4ID0g
Y29udmVydFVuaUNoYXJUb1VURjgocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpLCBmcm9t
LCB0byk7CisgICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOworICAg
IGdfZnJlZSh1dGY4KTsKKworICAgIHNldFBhbmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91
dCk7CisKKyAgICAvLyBTZXQgdGhlIHRleHQgY29sb3IgdG8gdXNlIGZvciBkcmF3aW5nLgorICAg
IGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOworICAgIENvbG9yIHBlbkNvbG9yID0gY29u
dGV4dC0+ZmlsbENvbG9yKCk7CisgICAgcGVuQ29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7CisgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7CisKKyAgICAvLyBPdXIgbGF5b3V0cyBhcmUgc2luZ2xlIGxpbmUKKyAgICBjYWly
b19tb3ZlX3RvKGNyLCBwb2ludC54KCksIHBvaW50LnkoKSk7CisgICAgUGFuZ29MYXlvdXRMaW5l
ICpsYXlvdXRfbGluZSA9IHBhbmdvX2xheW91dF9nZXRfbGluZV9yZWFkb25seShsYXlvdXQsIDAp
OworICAgIHBhbmdvX2NhaXJvX3Nob3dfbGF5b3V0X2xpbmUoY3IsIGxheW91dF9saW5lKTsKKwor
ICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CiB9CiAK
LWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJikgY29u
c3QKKy8vIEZJWE1FOiB3ZSBzaG91bGQgY3JlYXRlIHRoZSBsYXlvdXQgd2l0aCBvdXIgYWN0dWFs
IGNvbnRleHQsIGJ1dCBpdCBzZWVtcworLy8gd2UgY2FuJ3QgYWNjZXNzIGl0IGZyb20gaGVyZQor
c3RhdGljIFBhbmdvTGF5b3V0KiBnZXREZWZhdWx0UGFuZ29MYXlvdXQoY29uc3QgVGV4dFJ1biYg
cnVuKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDAuMGY7CisgICAgUGFu
Z29Gb250TWFwKiBtYXAgPSBwYW5nb19jYWlyb19mb250X21hcF9nZXRfZGVmYXVsdCgpOworICAg
IFBhbmdvQ29udGV4dCogcGFuZ29fY29udGV4dCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2NyZWF0
ZV9jb250ZXh0KFBBTkdPX0NBSVJPX0ZPTlRfTUFQKG1hcCkpOworICAgIFBhbmdvTGF5b3V0KiBs
YXlvdXQgPSBwYW5nb19sYXlvdXRfbmV3KHBhbmdvX2NvbnRleHQpOworICAgIGdfb2JqZWN0X3Vu
cmVmKHBhbmdvX2NvbnRleHQpOworCisgICAgcmV0dXJuIGxheW91dDsKIH0KIAotaW50IEZvbnQ6
Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYsIGludCwgYm9v
bCkgY29uc3QKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0
UnVuJiBydW4pIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsK
KyAgICBpZiAocnVuLmxlbmd0aCgpID09IDApCisgICAgICAgIHJldHVybiAwLjBmOworCisgICAg
UGFuZ29MYXlvdXQqIGxheW91dCA9IGdldERlZmF1bHRQYW5nb0xheW91dChydW4pOworICAgIHNl
dFBhbmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICBnY2hhciogdXRmOCA9
IGNvbnZlcnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSwgMCwg
cnVuLmxlbmd0aCgpKTsKKyAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQobGF5b3V0LCB1dGY4LCAt
MSk7CisgICAgZ19mcmVlKHV0ZjgpOworCisgICAgaW50IGxheW91dF93aWR0aDsKKyAgICBwYW5n
b19sYXlvdXRfZ2V0X3NpemUobGF5b3V0LCAmbGF5b3V0X3dpZHRoLCAwKTsKKyAgICBmbG9hdCB3
aWR0aCA9IChmbG9hdClsYXlvdXRfd2lkdGggLyAoZG91YmxlKVBBTkdPX1NDQUxFOworICAgIGdf
b2JqZWN0X3VucmVmKGxheW91dCk7CisKKyAgICByZXR1cm4gd2lkdGg7Cit9CisKK2ludCBGb250
OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50
IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgUGFuZ29MYXlvdXQq
IGxheW91dCA9IGdldERlZmF1bHRQYW5nb0xheW91dChydW4pOworICAgIHNldFBhbmdvQXR0cmli
dXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICBnY2hhciogdXRmOCA9IGNvbnZlcnRVbmlD
aGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSwgMCwgcnVuLmxlbmd0aCgp
KTsKKyAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQobGF5b3V0LCB1dGY4LCAtMSk7CisKKyAgICBp
bnQgaW5kZXgsIHRyYWlsaW5nOworICAgIHBhbmdvX2xheW91dF94eV90b19pbmRleChsYXlvdXQs
IHggKiBQQU5HT19TQ0FMRSwgMSwgJmluZGV4LCAmdHJhaWxpbmcpOworICAgIGdsb25nIG9mZnNl
dCA9IGdfdXRmOF9wb2ludGVyX3RvX29mZnNldCh1dGY4LCB1dGY4ICsgaW5kZXgpOworICAgIGdf
ZnJlZSh1dGY4KTsKKyAgICBnX29iamVjdF91bnJlZihsYXlvdXQpOworCisgICAgcmV0dXJuIG9m
ZnNldDsKIH0KIAotRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChj
b25zdCBUZXh0UnVuJiwgY29uc3QgSW50UG9pbnQmLCBpbnQsIGludCwgaW50KSBjb25zdAorRmxv
YXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0
CiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gRmxvYXRSZWN0KCk7Ci0tIAox
LjUuMy43Cgo=
</data>
<flag name="review"
          id="8005"
          type_id="1"
          status="+"
          setter="alp"
    />
          </attachment>
      

    </bug>

</bugzilla>