<?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>40077</bug_id>
          
          <creation_ts>2010-06-02 12:15:09 -0700</creation_ts>
          <short_desc>[Qt] Implement the simple font code path.</short_desc>
          <delta_ts>2011-04-19 05:15:29 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Text</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jocelyn Turcotte">jturcotte</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>hausmann</cc>
    
    <cc>kenneth</cc>
    
    <cc>kling</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>noam</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zecke</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>233382</commentid>
    <comment_count>0</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-02 12:15:09 -0700</bug_when>
    <thetext>Currently QtWebKit always use the complex text code path for text layouting and drawing.

The reason it currently does not use the implementation of the simple text code path already used by other ports is that Qt do not expose individual glyphs information through its API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233393</commentid>
    <comment_count>1</comment_count>
      <attachid>57682</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-02 12:47:26 -0700</bug_when>
    <thetext>Created attachment 57682
Preliminary file refactoring patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233394</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-02 12:49:45 -0700</bug_when>
    <thetext>Attachment 57682 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/platform/graphics/Font.cpp:295:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:300:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:305:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:310:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:315:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:320:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:325:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:330:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:335:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/Font.cpp:572:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
Total errors found: 10 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233396</commentid>
    <comment_count>3</comment_count>
      <attachid>57683</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-02 12:51:31 -0700</bug_when>
    <thetext>Created attachment 57683
Patch

Note: This patch requires the 032fb3d54eaaa1fa36ec45b37f5f7356b1137830 (Add the Qt::TextBypassShaping flag.) commit to compile against Qt 4.7.
This commit is also not yet in the 4.7 branch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233397</commentid>
    <comment_count>4</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-02 12:55:50 -0700</bug_when>
    <thetext>Some additional context for the others:

The &quot;fast path&quot; in WebKit is implemented by caching the character-&gt;glyph mappings and the glyph advances in WebKit.

Qt has similar caches, inside the platform specific font engines.

Our goal is to use the mechanism inside WebKit to distinguish between simple and complex text and then use some new APIs that Jocelyn added to Qt 4.7 to layout and draw simple text. For the layout an overload of QFontMetrics::width will do the straight conversion from characters to glyphs and return the sum of the advances - no shaping involved and a very flat call stack with stack allocations in the common case. For drawing the shaping is also skipped and using the existing caches the text is quickly converted to glyphs and then passed down to the paint engine.

With this compromise we hope to achieve the same performance with less overall memory usage by re-using existing Qt caches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233593</commentid>
    <comment_count>5</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2010-06-02 21:00:44 -0700</bug_when>
    <thetext>Here are some comments.

1.) It feels odd to remove the FontFastPath.cpp and then have the new &quot;Qt&quot; simple code directly call the complex text path. This is feeling odd and is not how the code was working. E.g. for Qt &lt; 4.7 the code to decide which fontpath to use, you could simply return Complex....

2.) It is a bit of a step back to introduce PLATFORM(QT) into the Font.cpp code, I have moved out the glyphcache to a new file as we do not want to use it.

3.) Once upon a time I hooked Simon up with the data (google news) for the font code benchmark, would you be interested to update the code and post new numbers?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233689</commentid>
    <comment_count>6</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-03 03:31:18 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Here are some comments.
&gt; 
&gt; 1.) It feels odd to remove the FontFastPath.cpp and then have the new &quot;Qt&quot; simple code directly call the complex text path. This is feeling odd and is not how the code was working. E.g. for Qt &lt; 4.7 the code to decide which fontpath to use, you could simply return Complex....

Isn&apos;t that what Jocelyn&apos;s patch does?

I agree it may seem odd, but on the other hand the fast path doesn&apos;t have any meaning anymore, right?

&gt; 2.) It is a bit of a step back to introduce PLATFORM(QT) into the Font.cpp code, I have moved out the glyphcache to a new file as we do not want to use it.

That&apos;s true, and this time the PLATFORM(QT) is not a temporary hack. Hmm

&gt; 3.) Once upon a time I hooked Simon up with the data (google news) for the font code benchmark, would you be interested to update the code and post new numbers?

Yes, we&apos;re interested in re-running benchmarks. Can you send me yours?

The only thing I can find in my inbox regarding google news is the finding that 23% of the incoming characters to floatWidthForComplexText was whitespace :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233691</commentid>
    <comment_count>7</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2010-06-03 03:41:54 -0700</bug_when>
    <thetext>(In reply to comment #6)

&gt; &gt; 1.) It feels odd to remove the FontFastPath.cpp and then have the new &quot;Qt&quot; simple code directly call the complex text path. This is feeling odd and is not how the code was working. E.g. for Qt &lt; 4.7 the code to decide which fontpath to use, you could simply return Complex....
&gt; 
&gt; Isn&apos;t that what Jocelyn&apos;s patch does?

To some degree... the ugly bit is that the simple path will call the complex one for Qt &lt; 4.7. So for Qt &lt; 4.7 we will end up with

 1.) iterate over the string to determine the path to use
 2.) Call the fast path..
  2.1) Call the complex path.

Counter proposal..
always go through the complex path for Qt &lt; 4.7...


&gt; &gt; 3.) Once upon a time I hooked Simon up with the data (google news) for the font code benchmark, would you be interested to update the code and post new numbers?
&gt; 
&gt; Yes, we&apos;re interested in re-running benchmarks. Can you send me yours?

I will have to check... I am pretty sure you had the datastream once, I have to look at my backup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234103</commentid>
    <comment_count>8</comment_count>
      <attachid>57852</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-04 01:38:57 -0700</bug_when>
    <thetext>Created attachment 57852
Preliminary file refactoring patch v2

Changes:
- No longer move all FontFastPath.cpp but just the code path determination code.
- Fixed style issues</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234110</commentid>
    <comment_count>9</comment_count>
      <attachid>57853</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-04 01:47:06 -0700</bug_when>
    <thetext>Created attachment 57853
Patch v2

Changes:
- Fixed style and compilation issues
- Changed the complex-calls-inside-the-simple-functions to Q_ASSERT(false) to avoid confusion. These function should not be called anyway since we called setCodePath in QWebPagePrivate::QWebPagePrivate()
- Merge the two drawText functions in one function to fix compilation issues. The readability takes a drop but I think it is better than duplicating the text shadow/pen/brush logic.
- gRoundingHackCharacterTable and stuff is still wrapped in &quot;#if !PLATFORM(QT)&quot; to save 256 bytes, I&apos;m not sure it&apos;s worth it though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234768</commentid>
    <comment_count>10</comment_count>
      <attachid>57852</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-07 04:00:48 -0700</bug_when>
    <thetext>Comment on attachment 57852
Preliminary file refactoring patch v2

This looks good to me. I suggest to wait with landing this until the other patch is also ready for landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234784</commentid>
    <comment_count>11</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-07 04:29:32 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; 
&gt; &gt; &gt; 1.) It feels odd to remove the FontFastPath.cpp and then have the new &quot;Qt&quot; simple code directly call the complex text path. This is feeling odd and is not how the code was working. E.g. for Qt &lt; 4.7 the code to decide which fontpath to use, you could simply return Complex....
&gt; &gt; 
&gt; &gt; Isn&apos;t that what Jocelyn&apos;s patch does?
&gt; 
&gt; To some degree... the ugly bit is that the simple path will call the complex one for Qt &lt; 4.7. So for Qt &lt; 4.7 we will end up with
&gt; 
&gt;  1.) iterate over the string to determine the path to use
&gt;  2.) Call the fast path..
&gt;   2.1) Call the complex path.
&gt; 
&gt; Counter proposal..
&gt; always go through the complex path for Qt &lt; 4.7...

Right, that&apos;s the way to go. Jocelyn&apos;s patch does that now by setting the global code path variable on startup for Qt &lt; 4.7.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236735</commentid>
    <comment_count>12</comment_count>
      <attachid>57853</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-11 02:08:16 -0700</bug_when>
    <thetext>Comment on attachment 57853
Patch v2

r=me

I suggest to replace &quot;bool complex&quot; to &quot;bool isComplexText&quot; and add a comment on the caller side what the &quot;true&quot; and &quot;false&quot; means.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236758</commentid>
    <comment_count>13</comment_count>
      <attachid>57852</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-11 03:03:13 -0700</bug_when>
    <thetext>Comment on attachment 57852
Preliminary file refactoring patch v2

Committed r61001: &lt;http://trac.webkit.org/changeset/61001&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236759</commentid>
    <comment_count>14</comment_count>
      <attachid>57852</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-11 03:04:04 -0700</bug_when>
    <thetext>Comment on attachment 57852
Preliminary file refactoring patch v2

Committed r61002: &lt;http://trac.webkit.org/changeset/61002&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236765</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-11 03:29:50 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/61002 might have broken Qt Linux ARMv5 Release and Qt Linux ARMv7 Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236785</commentid>
    <comment_count>16</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2010-06-11 05:04:23 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; http://trac.webkit.org/changeset/61002 might have broken Qt Linux ARMv5 Release and Qt Linux ARMv7 Release

Build fixes:
Committed r61004: &lt;http://trac.webkit.org/changeset/61004&gt;
Committed r61005: &lt;http://trac.webkit.org/changeset/61005&gt;

Resolving the bug report.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240676</commentid>
    <comment_count>17</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-21 06:06:20 -0700</bug_when>
    <thetext>&lt;cherry-pick-for-backport: r61005&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240686</commentid>
    <comment_count>18</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-21 06:57:26 -0700</bug_when>
    <thetext>Revision r61001 cherry-picked into qtwebkit-2.0 with commit ad6104996d73c62d831a04a21fdd8fe5cf30e152
Revision r61002 cherry-picked into qtwebkit-2.0 with commit cbd736c8ff6b45885090910523f23d180b540630
Revision r61004 cherry-picked into qtwebkit-2.0 with commit 95ef651521035cb233e6c8e0ba240dc03db500e0
Revision r61005 cherry-picked into qtwebkit-2.0 with commit 47bd471c833646ff4eac5921df8446b3e60d7927</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57682</attachid>
            <date>2010-06-02 12:47:26 -0700</date>
            <delta_ts>2010-06-04 01:38:57 -0700</delta_ts>
            <desc>Preliminary file refactoring patch</desc>
            <filename>remove_fontfastpath_cpp.patch</filename>
            <type>text/plain</type>
            <size>34974</size>
            <attacher name="Jocelyn Turcotte">jturcotte</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YjUzMjNlMS4uMzFiNmQwOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyOCBAQAorMjAxMC0wNi0wMiAgSm9jZWx5biBUdXJj
b3R0ZSAgPGpvY2VseW4udHVyY290dGVAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1vdmUgdGhlIGNvbnRlbnQgb2YgRm9udEZhc3RQ
YXRoLmNwcCB0byBGb250LmNwcC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTQwMDc3CisKKyAgICAgICAgVGhpcyBpcyBhIHBhdGNoIHByZWxpbWluYXJ5
IHRvIHRoZSByZW1vdmFsIG9mIHRoZQorICAgICAgICBGT05UX0ZBU1RfUEFUSCBtYWNyby4KKwor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAg
ICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBXZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9u
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpzZXRDb2RlUGF0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250Ojpjb2RlUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpnbHlwaERh
dGFGb3JDaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd1NpbXBsZVRleHQp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBoQnVmZmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JTaW1wbGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yU2ltcGxlVGV4dCk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcDogUmVtb3ZlZC4KKwogMjAxMC0wNi0wMiAgRGF2aWQg
SHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW5kZXJzIENh
cmxzc29uLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBiL1dlYkNvcmUvR05V
bWFrZWZpbGUuYW0KaW5kZXggNGRjZTYyZi4uODcxYjVmMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9H
TlVtYWtlZmlsZS5hbQorKysgYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0xNjc5LDcgKzE2
NzksNiBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Rm9udEZhbGxiYWNrTGlzdC5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYW1p
bHkuY3BwIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYW1pbHkuaCBcCi0JV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwIFwKIAlXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnRSZW5kZXJpbmdNb2RlLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udFNlbGVjdG9yLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udFNt
b290aGluZ01vZGUuaCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1dlYkNv
cmUvV2ViQ29yZS5neXBpCmluZGV4IDI5M2Y3ODUuLjYwZjQ4YjggMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0yMzcxLDcgKzIz
NzEsNiBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYWxsYmFja0xpc3Qu
aCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhbWlseS5jcHAnLAogICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYW1pbHkuaCcsCi0gICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vZ3JhcGhpY3MvRm9udFJlbmRlcmluZ01vZGUuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvRm9udFNlbGVjdG9yLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnRTbW9vdGhpbmdNb2RlLmgnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvaiBiL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oK
aW5kZXggZWNkYWQ0Ni4uN2ViZGUwMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNw
cm9qCkBAIC0yMzI4NCwxMCArMjMyODQsNiBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJ
PEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcRm9udEZhc3RQ
YXRoLmNwcCINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xGb250UmVuZGVyaW5nTW9kZS5oIg0KIAkJCQkJ
Pg0KIAkJCQk8L0ZpbGU+DQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2ogYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agppbmRleCA0ZGQ2ZDg1Li5hOWFkYzZlIDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagpAQCAtMTMxNyw3ICsxMzE3LDYgQEAKIAkJNkU5NkJCMUQxMTk4NkVFMjAw
N0Q5NENEIC8qIFR5cGVkQXJyYXlCYXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA2RTk2QkIxQjExOTg2RUUxMDA3RDk0Q0QgLyogVHlwZWRBcnJheUJh
c2UuaCAqLzsgfTsKIAkJNkVFOEE3NzIxMEY4MDNGMzAwNUE0QTI0IC8qIEpTV2ViR0xDb250ZXh0
QXR0cmlidXRlcy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA2RUU4QTc3MDEwRjgwM0YzMDA1QTRBMjQgLyogSlNXZWJHTENvbnRleHRBdHRyaWJ1dGVz
LmNwcCAqLzsgfTsKIAkJNkVFOEE3NzMxMEY4MDNGMzAwNUE0QTI0IC8qIEpTV2ViR0xDb250ZXh0
QXR0cmlidXRlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNkVFOEE3NzExMEY4MDNGMzAwNUE0QTI0IC8qIEpTV2ViR0xDb250ZXh0QXR0cmlidXRlcy5o
ICovOyB9OwotCQk3MjYyNkUwMjBFRjAyMkZFMDBBMDdFMjAgLyogRm9udEZhc3RQYXRoLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDcyNjI2RTAxMEVG
MDIyRkUwMEEwN0UyMCAvKiBGb250RmFzdFBhdGguY3BwICovOyB9OwogCQk3NTQxMzNBODEwMkUw
MEU4MDAwNzVEMDAgLyogSW5zcGVjdG9yVGltZWxpbmVBZ2VudC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzU0MTMzQTcxMDJFMDBFODAwMDc1RDAwIC8q
IEluc3BlY3RvclRpbWVsaW5lQWdlbnQuaCAqLzsgfTsKIAkJNzU0MTMzQUExMDJFMDBGNDAwMDc1
RDAwIC8qIEluc3BlY3RvclRpbWVsaW5lQWdlbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzU0MTMzQTkxMDJFMDBGNDAwMDc1RDAwIC8qIEluc3Bl
Y3RvclRpbWVsaW5lQWdlbnQuY3BwICovOyB9OwogCQk3NTUzQ0ZFODEwOEY0NzNGMDBFQTI4MUUg
LyogVGltZWxpbmVSZWNvcmRGYWN0b3J5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA3NTUzQ0ZFNjEwOEY0NzNGMDBFQTI4MUUgLyogVGltZWxpbmVSZWNv
cmRGYWN0b3J5LmggKi87IH07CkBAIC02OTY3LDcgKzY5NjYsNiBAQAogCQk2RTk2QkIxQjExOTg2
RUUxMDA3RDk0Q0QgLyogVHlwZWRBcnJheUJhc2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBuYW1lID0gVHlwZWRBcnJheUJhc2UuaDsgcGF0aCA9IGNhbnZhcy9UeXBlZEFycmF5QmFzZS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk2RUU4QTc3MDEwRjgwM0YzMDA1QTRBMjQg
LyogSlNXZWJHTENvbnRleHRBdHRyaWJ1dGVzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IEpTV2ViR0xDb250ZXh0QXR0cmlidXRlcy5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTZFRThBNzcxMTBGODAzRjMwMDVBNEEyNCAvKiBKU1dlYkdMQ29udGV4
dEF0dHJpYnV0ZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNXZWJHTENv
bnRleHRBdHRyaWJ1dGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTcyNjI2RTAx
MEVGMDIyRkUwMEEwN0UyMCAvKiBGb250RmFzdFBhdGguY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gRm9udEZhc3RQYXRoLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJNzU0MTMzQTcxMDJFMDBFODAwMDc1RDAwIC8qIEluc3BlY3RvclRpbWVsaW5lQWdl
bnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSW5zcGVjdG9yVGltZWxpbmVB
Z2VudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3NTQxMzNBOTEwMkUwMEY0MDAw
NzVEMDAgLyogSW5zcGVjdG9yVGltZWxpbmVBZ2VudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JUaW1lbGluZUFnZW50LmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJNzU1M0NGRTYxMDhGNDczRjAwRUEyODFFIC8qIFRpbWVsaW5lUmVj
b3JkRmFjdG9yeS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUaW1lbGluZVJl
Y29yZEZhY3RvcnkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE1MTA3LDcgKzE1
MTA1LDYgQEAKIAkJCQlCMkMzREE1NzBEMDA2Q0Q2MDBFRjZGMjYgLyogRm9udEZhbGxiYWNrTGlz
dC5oICovLAogCQkJCUIyQzNEQTU4MEQwMDZDRDYwMEVGNkYyNiAvKiBGb250RmFtaWx5LmNwcCAq
LywKIAkJCQlCMkMzREE1OTBEMDA2Q0Q2MDBFRjZGMjYgLyogRm9udEZhbWlseS5oICovLAotCQkJ
CTcyNjI2RTAxMEVGMDIyRkUwMEEwN0UyMCAvKiBGb250RmFzdFBhdGguY3BwICovLAogCQkJCTM3
QUNDRTQxMERBMjk4MEYwMDg5RTYwMiAvKiBGb250UmVuZGVyaW5nTW9kZS5oICovLAogCQkJCUIy
QzNEQTVBMEQwMDZDRDYwMEVGNkYyNiAvKiBGb250U2VsZWN0b3IuaCAqLywKIAkJCQkzNzIwMjE5
ODEwNjIxM0M2MDBGMjVDNEIgLyogRm9udFNtb290aGluZ01vZGUuaCAqLywKQEAgLTIwMjI5LDcg
KzIwMjI2LDYgQEAKIAkJCQlCMkMzREE2NzBEMDA2Q0Q2MDBFRjZGMjYgLyogRm9udEZhbGxiYWNr
TGlzdC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCMkMzREE2OTBEMDA2Q0Q2MDBFRjZGMjYgLyog
Rm9udEZhbWlseS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODBFNkNFQzBBMTk4OUNBMDA3RkI4
QzUgLyogRm9udEZhbWlseVZhbHVlLmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTcyNjI2RTAyMEVG
MDIyRkUwMEEwN0UyMCAvKiBGb250RmFzdFBhdGguY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjJB
RkZDODAwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRNYWMubW0gaW4gU291cmNlcyAqLywKIAkJCQlC
MkFGRkM4MjBEMDBBNUMxMDAzMDA3NEQgLyogRm9udFBsYXRmb3JtRGF0YU1hYy5tbSBpbiBTb3Vy
Y2VzICovLAogCQkJCUI3MzRCMTgxMTE5Qjk5MTEwMDY1ODdCRCAvKiBGb250VHJhbnNjb2Rlci5j
cHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Rm9udC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCmluZGV4IDc2ODIw
MTEuLjBhZDI0OGQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5j
cHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcApAQCAtMjQsMTMgKzI0
LDE4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9udC5oIgogCisjaW5jbHVk
ZSAiQ2hhcmFjdGVyTmFtZXMuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJG
b250Q2FjaGUuaCIKKyNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiRm9u
dFRyYW5zY29kZXIuaCIKICNpbmNsdWRlICJJbnRQb2ludC5oIgogI2luY2x1ZGUgIkdseXBoQnVm
ZmVyLmgiCisjaW5jbHVkZSAiR2x5cGhQYWdlVHJlZU5vZGUuaCIKKyNpbmNsdWRlICJTaW1wbGVG
b250RGF0YS5oIgogI2luY2x1ZGUgIldpZHRoSXRlcmF0b3IuaCIKICNpbmNsdWRlIDx3dGYvTWF0
aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KICNpbmNsdWRlIDx3
dGYvVW51c2VkUGFyYW0uaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdURjsKQEAgLTI2OCw0ICsyNzMs
MzUzIEBAIGJvb2wgRm9udDo6c2hvdWxkVXNlU21vb3RoaW5nKCkKICAgICByZXR1cm4gc2hvdWxk
VXNlRm9udFNtb290aGluZzsKIH0KIAorI2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKK3ZvaWQgRm9u
dDo6c2V0Q29kZVBhdGgoQ29kZVBhdGggcCkKK3sKKyAgICBzX2NvZGVQYXRoID0gcDsKK30KKwor
Rm9udDo6Q29kZVBhdGggRm9udDo6Y29kZVBhdGgoKQoreworICAgIHJldHVybiBzX2NvZGVQYXRo
OworfQorCitGb250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0aChjb25zdCBUZXh0UnVuJiBydW4p
IGNvbnN0Cit7CisgICAgaWYgKHNfY29kZVBhdGggIT0gQXV0bykKKyAgICAgICAgcmV0dXJuIHNf
Y29kZVBhdGg7CisKKyAgICAvLyBTdGFydCBmcm9tIDAgc2luY2UgZHJhd2luZyBhbmQgaGlnaGxp
Z2h0aW5nIGFsc28gbWVhc3VyZSB0aGUgY2hhcmFjdGVycyBiZWZvcmUgcnVuLT5mcm9tCisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBydW4ubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBjb25zdCBV
Q2hhciBjID0gcnVuW2ldOworICAgICAgICBpZiAoYyA8IDB4MzAwKSAgICAgIC8vIFUrMDMwMCB0
aHJvdWdoIFUrMDM2RiBDb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweDM2RikKKyAgICAgICAgICAgIHJldHVybiBDb21w
bGV4OworCisgICAgICAgIGlmIChjIDwgMHgwNTkxIHx8IGMgPT0gMHgwNUJFKSAgICAgLy8gVSsw
NTkxIHRocm91Z2ggVSswNUNGIGV4Y2x1ZGluZyBVKzA1QkUgSGVicmV3IGNvbWJpbmluZyBtYXJr
cywgSGVicmV3IHB1bmN0dWF0aW9uIFBhc2VxLCBTb2YgUGFzdXEgYW5kIE51biBIYWZ1a2hhCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGMgPD0gMHgwNUNGKQorICAgICAgICAg
ICAgcmV0dXJuIENvbXBsZXg7CisKKyAgICAgICAgaWYgKGMgPCAweDA2MDApICAgICAvLyBVKzA2
MDAgdGhyb3VnaCBVKzEwNTkgQXJhYmljLCBTeXJpYWMsIFRoYWFuYSwgRGV2YW5hZ2FyaSwgQmVu
Z2FsaSwgR3VybXVraGksIEd1amFyYXRpLCBPcml5YSwgVGFtaWwsIFRlbHVndSwgS2FubmFkYSwg
TWFsYXlhbGFtLCBTaW5oYWxhLCBUaGFpLCBMYW8sIFRpYmV0YW4sIE15YW5tYXIKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweDEwNTkpCisgICAgICAgICAgICByZXR1
cm4gQ29tcGxleDsKKworICAgICAgICBpZiAoYyA8IDB4MTEwMCkgICAgIC8vIFUrMTEwMCB0aHJv
dWdoIFUrMTFGRiBIYW5ndWwgSmFtbyAob25seSBBbmNpZW50IEtvcmVhbiBzaG91bGQgYmUgbGVm
dCBoZXJlIGlmIHlvdSBwcmVjb21wb3NlOyBNb2Rlcm4gS29yZWFuIHdpbGwgYmUgcHJlY29tcG9z
ZWQgYXMgYSByZXN1bHQgb2Ygc3RlcCBBKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IGlmIChjIDw9IDB4MTFGRikKKyAgICAgICAgICAgIHJldHVybiBDb21wbGV4OworCisgICAgICAg
IGlmIChjIDwgMHgxNzgwKSAgICAgLy8gVSsxNzgwIHRocm91Z2ggVSsxOEFGIEtobWVyLCBNb25n
b2xpYW4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweDE4QUYpCisg
ICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKKworICAgICAgICBpZiAoYyA8IDB4MTkwMCkgICAg
IC8vIFUrMTkwMCB0aHJvdWdoIFUrMTk0RiBMaW1idSAoVW5pY29kZSA0LjApCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgaWYgKGMgPD0gMHgxOTRGKQorICAgICAgICAgICAgcmV0dXJu
IENvbXBsZXg7CisKKyAgICAgICAgaWYgKGMgPCAweDFFMDApICAgICAvLyBVKzFFMDAgdGhyb3Vn
aCBVKzIwMDAgY2hhcmFjdGVycyB3aXRoIGRpYWNyaXRpY3MgYW5kIHN0YWNrZWQgZGlhY3JpdGlj
cworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4MjAwMCkKKyAgICAg
ICAgICAgIHJldHVybiBTaW1wbGVXaXRoR2x5cGhPdmVyZmxvdzsKKworICAgICAgICBpZiAoYyA8
IDB4MjBEMCkgICAgIC8vIFUrMjBEMCB0aHJvdWdoIFUrMjBGRiBDb21iaW5pbmcgbWFya3MgZm9y
IHN5bWJvbHMKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweDIwRkYp
CisgICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKKworICAgICAgICBpZiAoYyA8IDB4RkUyMCkg
ICAgIC8vIFUrRkUyMCB0aHJvdWdoIFUrRkUyRiBDb21iaW5pbmcgaGFsZiBtYXJrcworICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4RkUyRikKKyAgICAgICAgICAgIHJl
dHVybiBDb21wbGV4OworICAgIH0KKworICAgIGlmICh0eXBlc2V0dGluZ0ZlYXR1cmVzKCkpCisg
ICAgICAgIHJldHVybiBDb21wbGV4OworCisgICAgcmV0dXJuIFNpbXBsZTsKK30KKworR2x5cGhE
YXRhIEZvbnQ6OmdseXBoRGF0YUZvckNoYXJhY3RlcihVQ2hhcjMyIGMsIGJvb2wgbWlycm9yLCBi
b29sIGZvcmNlU21hbGxDYXBzKSBjb25zdAoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisKKyAgICBib29sIHVzZVNtYWxsQ2Fwc0ZvbnQgPSBmb3JjZVNtYWxsQ2FwczsKKyAgICBpZiAo
bV9mb250RGVzY3JpcHRpb24uc21hbGxDYXBzKCkpIHsKKyAgICAgICAgVUNoYXIzMiB1cHBlckMg
PSB0b1VwcGVyKGMpOworICAgICAgICBpZiAodXBwZXJDICE9IGMpIHsKKyAgICAgICAgICAgIGMg
PSB1cHBlckM7CisgICAgICAgICAgICB1c2VTbWFsbENhcHNGb250ID0gdHJ1ZTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGlmIChtaXJyb3IpCisgICAgICAgIGMgPSBtaXJyb3JlZENoYXIoYyk7
CisKKyAgICB1bnNpZ25lZCBwYWdlTnVtYmVyID0gKGMgLyBHbHlwaFBhZ2U6OnNpemUpOworCisg
ICAgR2x5cGhQYWdlVHJlZU5vZGUqIG5vZGUgPSBwYWdlTnVtYmVyID8gbV9mb250TGlzdC0+bV9w
YWdlcy5nZXQocGFnZU51bWJlcikgOiBtX2ZvbnRMaXN0LT5tX3BhZ2VaZXJvOworICAgIGlmICgh
bm9kZSkgeworICAgICAgICBub2RlID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZChm
b250RGF0YUF0KDApLCBwYWdlTnVtYmVyKTsKKyAgICAgICAgaWYgKHBhZ2VOdW1iZXIpCisgICAg
ICAgICAgICBtX2ZvbnRMaXN0LT5tX3BhZ2VzLnNldChwYWdlTnVtYmVyLCBub2RlKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgbV9mb250TGlzdC0+bV9wYWdlWmVybyA9IG5vZGU7CisgICAg
fQorCisgICAgR2x5cGhQYWdlKiBwYWdlOworICAgIGlmICghdXNlU21hbGxDYXBzRm9udCkgewor
ICAgICAgICAvLyBGYXN0ZXN0IGxvb3AsIGZvciB0aGUgY29tbW9uIGNhc2UgKG5vdCBzbWFsbCBj
YXBzKS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHBhZ2UgPSBub2RlLT5w
YWdlKCk7CisgICAgICAgICAgICBpZiAocGFnZSkgeworICAgICAgICAgICAgICAgIEdseXBoRGF0
YSBkYXRhID0gcGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMpOworICAgICAgICAgICAgICAg
IGlmIChkYXRhLmZvbnREYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAg
ICAgICAgICAgICAgICBpZiAobm9kZS0+aXNTeXN0ZW1GYWxsYmFjaygpKQorICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJvY2VlZCB3
aXRoIHRoZSBmYWxsYmFjayBsaXN0LgorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPmdldENoaWxk
KGZvbnREYXRhQXQobm9kZS0+bGV2ZWwoKSksIHBhZ2VOdW1iZXIpOworICAgICAgICAgICAgaWYg
KHBhZ2VOdW1iZXIpCisgICAgICAgICAgICAgICAgbV9mb250TGlzdC0+bV9wYWdlcy5zZXQocGFn
ZU51bWJlciwgbm9kZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9mb250
TGlzdC0+bV9wYWdlWmVybyA9IG5vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAg
ICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgcGFnZSA9IG5vZGUtPnBhZ2UoKTsKKyAgICAg
ICAgICAgIGlmIChwYWdlKSB7CisgICAgICAgICAgICAgICAgR2x5cGhEYXRhIGRhdGEgPSBwYWdl
LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEuZm9u
dERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNtYWxsQ2Fwc0ZvbnREYXRhIGZ1
bmN0aW9uIHNob3VsZCBub3Qgbm9ybWFsbHkgcmV0dXJuIDAuCisgICAgICAgICAgICAgICAgICAg
IC8vIEJ1dCBpZiBpdCBkb2VzLCB3ZSB3aWxsIGp1c3QgcmVuZGVyIHRoZSBjYXBpdGFsIGxldHRl
ciBiaWcuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBzbWFsbENh
cHNGb250RGF0YSA9IGRhdGEuZm9udERhdGEtPnNtYWxsQ2Fwc0ZvbnREYXRhKG1fZm9udERlc2Ny
aXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzbWFsbENhcHNGb250RGF0YSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworCisgICAgICAgICAgICAgICAgICAg
IEdseXBoUGFnZVRyZWVOb2RlKiBzbWFsbENhcHNOb2RlID0gR2x5cGhQYWdlVHJlZU5vZGU6Omdl
dFJvb3RDaGlsZChzbWFsbENhcHNGb250RGF0YSwgcGFnZU51bWJlcik7CisgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IEdseXBoUGFnZSogc21hbGxDYXBzUGFnZSA9IHNtYWxsQ2Fwc05vZGUtPnBh
Z2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNtYWxsQ2Fwc1BhZ2UpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIEdseXBoRGF0YSBkYXRhID0gc21hbGxDYXBzUGFnZS0+Z2x5cGhEYXRh
Rm9yQ2hhcmFjdGVyKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZm9udERh
dGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYXR0ZW1wdCBzeXN0
ZW0gZmFsbGJhY2sgb2ZmIHRoZSBzbWFsbENhcHNGb250RGF0YS4gVGhpcyBpcyB0aGUgdmVyeSB1
bmxpa2VseSBjYXNlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gYSBmb250IGhhcyB0aGUg
bG93ZXJjYXNlIGNoYXJhY3RlciBidXQgdGhlIHNtYWxsIGNhcHMgZm9udCBkb2VzIG5vdCBoYXZl
IGl0cyB1cHBlcmNhc2UgdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNtYWxs
Q2Fwc0ZvbnREYXRhLT5taXNzaW5nR2x5cGhEYXRhKCk7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgaWYgKG5vZGUtPmlzU3lzdGVtRmFsbGJhY2soKSkKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFByb2NlZWQg
d2l0aCB0aGUgZmFsbGJhY2sgbGlzdC4KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5nZXRDaGls
ZChmb250RGF0YUF0KG5vZGUtPmxldmVsKCkpLCBwYWdlTnVtYmVyKTsKKyAgICAgICAgICAgIGlm
IChwYWdlTnVtYmVyKQorICAgICAgICAgICAgICAgIG1fZm9udExpc3QtPm1fcGFnZXMuc2V0KHBh
Z2VOdW1iZXIsIG5vZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fZm9u
dExpc3QtPm1fcGFnZVplcm8gPSBub2RlOworICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJU
KHBhZ2UpOworICAgIEFTU0VSVChub2RlLT5pc1N5c3RlbUZhbGxiYWNrKCkpOworCisgICAgLy8g
U3lzdGVtIGZhbGxiYWNrIGlzIGNoYXJhY3Rlci1kZXBlbmRlbnQuIFdoZW4gd2UgZ2V0IGhlcmUs
IHdlCisgICAgLy8ga25vdyB0aGF0IHRoZSBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gaXNuJ3QgaW4g
dGhlIHN5c3RlbSBmYWxsYmFjaworICAgIC8vIGZvbnQncyBnbHlwaCBwYWdlLiBUcnkgdG8gbGF6
aWx5IGNyZWF0ZSBpdCBoZXJlLgorICAgIFVDaGFyIGNvZGVVbml0c1syXTsKKyAgICBpbnQgY29k
ZVVuaXRzTGVuZ3RoOworICAgIGlmIChjIDw9IDB4RkZGRikgeworICAgICAgICBjb2RlVW5pdHNb
MF0gPSBGb250Ojpub3JtYWxpemVTcGFjZXMoYyk7CisgICAgICAgIGNvZGVVbml0c0xlbmd0aCA9
IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZVVuaXRzWzBdID0gVTE2X0xFQUQoYyk7Cisg
ICAgICAgIGNvZGVVbml0c1sxXSA9IFUxNl9UUkFJTChjKTsKKyAgICAgICAgY29kZVVuaXRzTGVu
Z3RoID0gMjsKKyAgICB9CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGNoYXJhY3RlckZvbnRE
YXRhID0gZm9udENhY2hlKCktPmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycygqdGhpcywgY29kZVVu
aXRzLCBjb2RlVW5pdHNMZW5ndGgpOworICAgIGlmICh1c2VTbWFsbENhcHNGb250ICYmIGNoYXJh
Y3RlckZvbnREYXRhKQorICAgICAgICBjaGFyYWN0ZXJGb250RGF0YSA9IGNoYXJhY3RlckZvbnRE
YXRhLT5zbWFsbENhcHNGb250RGF0YShtX2ZvbnREZXNjcmlwdGlvbik7CisgICAgaWYgKGNoYXJh
Y3RlckZvbnREYXRhKSB7CisgICAgICAgIC8vIEdvdCB0aGUgZmFsbGJhY2sgZ2x5cGggYW5kIGZv
bnQuCisgICAgICAgIEdseXBoUGFnZSogZmFsbGJhY2tQYWdlID0gR2x5cGhQYWdlVHJlZU5vZGU6
OmdldFJvb3RDaGlsZChjaGFyYWN0ZXJGb250RGF0YSwgcGFnZU51bWJlciktPnBhZ2UoKTsKKyAg
ICAgICAgR2x5cGhEYXRhIGRhdGEgPSBmYWxsYmFja1BhZ2UgJiYgZmFsbGJhY2tQYWdlLT5mb250
RGF0YUZvckNoYXJhY3RlcihjKSA/IGZhbGxiYWNrUGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KGMpIDogY2hhcmFjdGVyRm9udERhdGEtPm1pc3NpbmdHbHlwaERhdGEoKTsKKyAgICAgICAgLy8g
Q2FjaGUgaXQgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBzeXN0ZW0gZmFsbGJhY2sgYWdhaW4gbmV4
dCB0aW1lLgorICAgICAgICBpZiAoIXVzZVNtYWxsQ2Fwc0ZvbnQpIHsKKyNpZiBPUyhXSU5DRSkK
KyAgICAgICAgICAgIC8vIG1pc3NpbmdHbHlwaERhdGEgcmV0dXJucyBhIG51bGwgY2hhcmFjdGVy
LCB3aGljaCBpcyBub3Qgc3VpdGFibGUgZm9yIEdESSB0byBkaXNwbGF5LgorICAgICAgICAgICAg
Ly8gQWxzbywgc29tZXRpbWVzIHdlIGNhbm5vdCBtYXAgYSBmb250IGZvciB0aGUgY2hhcmFjdGVy
IG9uIFdJTkNFLCBidXQgR0RJIGNhbiBzdGlsbAorICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUg
Y2hhcmFjdGVyLCBwcm9iYWJseSBiZWNhdXNlIHRoZSBmb250IHBhY2thZ2UgaXMgbm90IGluc3Rh
bGxlZCBjb3JyZWN0bHkuCisgICAgICAgICAgICAvLyBTbyB3ZSBqdXN0IGFsd2F5cyBzZXQgdGhl
IGdseXBoIHRvIGJlIHNhbWUgYXMgdGhlIGNoYXJhY3RlciwgYW5kIGxldCBHREkgc29sdmUgaXQu
CisgICAgICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgY2hhcmFj
dGVyRm9udERhdGEpOworICAgICAgICAgICAgcmV0dXJuIHBhZ2UtPmdseXBoRGF0YUZvckNoYXJh
Y3RlcihjKTsKKyNlbHNlCisgICAgICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0
ZXIoYywgZGF0YS5nbHlwaCwgZGF0YS5mb250RGF0YSk7CisjZW5kaWYKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvLyBFdmVuIHN5c3RlbSBmYWxsYmFjayBj
YW4gZmFpbDsgdXNlIHRoZSBtaXNzaW5nIGdseXBoIGluIHRoYXQgY2FzZS4KKyAgICAvLyBGSVhN
RTogSXQgd291bGQgYmUgbmljZXIgdG8gdXNlIHRoZSBtaXNzaW5nIGdseXBoIGZyb20gdGhlIGxh
c3QgcmVzb3J0IGZvbnQgaW5zdGVhZC4KKyAgICBHbHlwaERhdGEgZGF0YSA9IHByaW1hcnlGb250
KCktPm1pc3NpbmdHbHlwaERhdGEoKTsKKyAgICBpZiAoIXVzZVNtYWxsQ2Fwc0ZvbnQpIHsKKyNp
ZiBPUyhXSU5DRSkKKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdXQgV0lOQ0UgR0RJIGhhbmRs
aW5nIG5lYXIgc2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyIGFib3ZlLgorICAgICAgICBwYWdlLT5z
ZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgZGF0YS5mb250RGF0YSk7CisgICAgICAgIHJl
dHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7CisjZWxzZQorICAgICAgICBwYWdl
LT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgZGF0YS5nbHlwaCwgZGF0YS5mb250RGF0YSk7
CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgRm9udDo6ZHJhd1Np
bXBsZVRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworICAgIC8v
IFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMrYWR2YW5jZXMrZm9udCBkYXRhIGZv
ciBlYWNoIGdseXBoLgorICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOworCisgICAgZmxvYXQg
c3RhcnRYID0gcG9pbnQueCgpOworICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuKTsKKyAg
ICBpdC5hZHZhbmNlKGZyb20pOworICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQubV9ydW5XaWR0
aFNvRmFyOworICAgIGl0LmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisKKyAgICAvLyBXZSBj
b3VsZG4ndCBnZW5lcmF0ZSBhbnkgZ2x5cGhzIGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KKyAgICBp
ZiAoZ2x5cGhCdWZmZXIuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmbG9hdCBh
ZnRlcldpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOworCisgICAgaWYgKHJ1bi5ydGwoKSkgewor
ICAgICAgICBmbG9hdCBmaW5hbFJvdW5kaW5nV2lkdGggPSBpdC5tX2ZpbmFsUm91bmRpbmdXaWR0
aDsKKyAgICAgICAgaXQuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAgICAgICBzdGFydFggKz0g
ZmluYWxSb3VuZGluZ1dpZHRoICsgaXQubV9ydW5XaWR0aFNvRmFyIC0gYWZ0ZXJXaWR0aDsKKyAg
ICB9IGVsc2UKKyAgICAgICAgc3RhcnRYICs9IGJlZm9yZVdpZHRoOworCisgICAgLy8gU3dhcCB0
aGUgb3JkZXIgb2YgdGhlIGdseXBocyBpZiByaWdodC10by1sZWZ0LgorICAgIGlmIChydW4ucnRs
KCkpCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBlbmQgPSBnbHlwaEJ1ZmZlci5zaXplKCkgLSAx
OyBpIDwgZ2x5cGhCdWZmZXIuc2l6ZSgpIC8gMjsgKytpLCAtLWVuZCkKKyAgICAgICAgICAgIGds
eXBoQnVmZmVyLnN3YXAoaSwgZW5kKTsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnRpbmcg
cG9pbnQgb2YgdGhlIGdseXBocyB0byBiZSBkaXNwbGF5ZWQgYnkgYWRkaW5nCisgICAgLy8gYWxs
IHRoZSBhZHZhbmNlcyB1cCB0byB0aGUgZmlyc3QgZ2x5cGguCisgICAgRmxvYXRQb2ludCBzdGFy
dFBvaW50KHN0YXJ0WCwgcG9pbnQueSgpKTsKKyAgICBkcmF3R2x5cGhCdWZmZXIoY29udGV4dCwg
Z2x5cGhCdWZmZXIsIHJ1biwgc3RhcnRQb2ludCk7Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0dseXBo
QnVmZmVyKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBo
QnVmZmVyLCBjb25zdCBUZXh0UnVuJiwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Cit7
CisgICAgLy8gRHJhdyBlYWNoIGNvbnRpZ3VvdXMgcnVuIG9mIGdseXBocyB0aGF0IHVzZSB0aGUg
c2FtZSBmb250IGRhdGEuCisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2x5
cGhCdWZmZXIuZm9udERhdGFBdCgwKTsKKyAgICBGbG9hdFNpemUgb2Zmc2V0ID0gZ2x5cGhCdWZm
ZXIub2Zmc2V0QXQoMCk7CisgICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHBvaW50KTsKKyAgICBm
bG9hdCBuZXh0WCA9IHN0YXJ0UG9pbnQueCgpOworICAgIGludCBsYXN0RnJvbSA9IDA7CisgICAg
aW50IG5leHRHbHlwaCA9IDA7CisgICAgd2hpbGUgKG5leHRHbHlwaCA8IGdseXBoQnVmZmVyLnNp
emUoKSkgeworICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbmV4dEZvbnREYXRhID0gZ2x5
cGhCdWZmZXIuZm9udERhdGFBdChuZXh0R2x5cGgpOworICAgICAgICBGbG9hdFNpemUgbmV4dE9m
ZnNldCA9IGdseXBoQnVmZmVyLm9mZnNldEF0KG5leHRHbHlwaCk7CisgICAgICAgIGlmIChuZXh0
Rm9udERhdGEgIT0gZm9udERhdGEgfHwgbmV4dE9mZnNldCAhPSBvZmZzZXQpIHsKKyAgICAgICAg
ICAgIGRyYXdHbHlwaHMoY29udGV4dCwgZm9udERhdGEsIGdseXBoQnVmZmVyLCBsYXN0RnJvbSwg
bmV4dEdseXBoIC0gbGFzdEZyb20sIHN0YXJ0UG9pbnQpOworCisgICAgICAgICAgICBsYXN0RnJv
bSA9IG5leHRHbHlwaDsKKyAgICAgICAgICAgIGZvbnREYXRhID0gbmV4dEZvbnREYXRhOworICAg
ICAgICAgICAgb2Zmc2V0ID0gbmV4dE9mZnNldDsKKyAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0
WChuZXh0WCk7CisgICAgICAgIH0KKyAgICAgICAgbmV4dFggKz0gZ2x5cGhCdWZmZXIuYWR2YW5j
ZUF0KG5leHRHbHlwaCk7CisgICAgICAgIG5leHRHbHlwaCsrOworICAgIH0KKworICAgIGRyYXdH
bHlwaHMoY29udGV4dCwgZm9udERhdGEsIGdseXBoQnVmZmVyLCBsYXN0RnJvbSwgbmV4dEdseXBo
IC0gbGFzdEZyb20sIHN0YXJ0UG9pbnQpOworfQorCitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9y
U2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwg
SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJm
bG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAoreworICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywg
cnVuLCBmYWxsYmFja0ZvbnRzLCBnbHlwaE92ZXJmbG93KTsKKyAgICBpdC5hZHZhbmNlKHJ1bi5s
ZW5ndGgoKSwgZ2x5cGhCdWZmZXIpOworCisgICAgaWYgKGdseXBoT3ZlcmZsb3cpIHsKKyAgICAg
ICAgZ2x5cGhPdmVyZmxvdy0+dG9wID0gbWF4PGludD4oZ2x5cGhPdmVyZmxvdy0+dG9wLCBjZWls
ZigtaXQubWluR2x5cGhCb3VuZGluZ0JveFkoKSkgLSBhc2NlbnQoKSk7CisgICAgICAgIGdseXBo
T3ZlcmZsb3ctPmJvdHRvbSA9IG1heDxpbnQ+KGdseXBoT3ZlcmZsb3ctPmJvdHRvbSwgY2VpbGYo
aXQubWF4R2x5cGhCb3VuZGluZ0JveFkoKSkgLSBkZXNjZW50KCkpOworICAgICAgICBnbHlwaE92
ZXJmbG93LT5sZWZ0ID0gY2VpbGYoaXQuZmlyc3RHbHlwaE92ZXJmbG93KCkpOworICAgICAgICBn
bHlwaE92ZXJmbG93LT5yaWdodCA9IGNlaWxmKGl0Lmxhc3RHbHlwaE92ZXJmbG93KCkpOworICAg
IH0KKworICAgIHJldHVybiBpdC5tX3J1bldpZHRoU29GYXI7Cit9CisKK0Zsb2F0UmVjdCBGb250
OjpzZWxlY3Rpb25SZWN0Rm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IElu
dFBvaW50JiBwb2ludCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgV2lk
dGhJdGVyYXRvciBpdCh0aGlzLCBydW4pOworICAgIGl0LmFkdmFuY2UoZnJvbSk7CisgICAgZmxv
YXQgYmVmb3JlV2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7CisgICAgaXQuYWR2YW5jZSh0byk7
CisgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGl0Lm1fcnVuV2lkdGhTb0ZhcjsKKworICAgIC8vIFVz
aW5nIHJvdW5kZigpIHJhdGhlciB0aGFuIGNlaWxmKCkgZm9yIHRoZSByaWdodCBlZGdlIGFzIGEg
Y29tcHJvbWlzZSB0byBlbnN1cmUgY29ycmVjdCBjYXJldCBwb3NpdGlvbmluZworICAgIGlmIChy
dW4ucnRsKCkpIHsKKyAgICAgICAgaXQuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAgICAgICBm
bG9hdCB0b3RhbFdpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOworICAgICAgICByZXR1cm4gRmxv
YXRSZWN0KHBvaW50LngoKSArIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIHBvaW50
LnkoKSwgcm91bmRmKHRvdGFsV2lkdGggLSBiZWZvcmVXaWR0aCkgLSBmbG9vcmYodG90YWxXaWR0
aCAtIGFmdGVyV2lkdGgpLCBoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRmxvYXRS
ZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVXaWR0aCksIHBvaW50LnkoKSwgcm91bmRmKGFm
dGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRoKSwgaCk7CisgICAgfQorfQorCitpbnQgRm9u
dDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50
IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgZmxvYXQgZGVsdGEg
PSAoZmxvYXQpeDsKKworICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuKTsKKyAgICBHbHlw
aEJ1ZmZlciBsb2NhbEdseXBoQnVmZmVyOworICAgIHVuc2lnbmVkIG9mZnNldDsKKyAgICBpZiAo
cnVuLnJ0bCgpKSB7CisgICAgICAgIGRlbHRhIC09IGZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KHJ1
biwgMCk7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBpdC5tX2N1
cnJlbnRDaGFyYWN0ZXI7CisgICAgICAgICAgICBmbG9hdCB3OworICAgICAgICAgICAgaWYgKCFp
dC5hZHZhbmNlT25lQ2hhcmFjdGVyKHcsICZsb2NhbEdseXBoQnVmZmVyKSkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGRlbHRhICs9IHc7CisgICAgICAgICAgICBpZiAoaW5j
bHVkZVBhcnRpYWxHbHlwaHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEgLSB3IC8gMiA+
PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgaWYgKGRlbHRhID49IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUg
KDEpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IGl0Lm1fY3VycmVudENoYXJhY3RlcjsKKyAgICAg
ICAgICAgIGZsb2F0IHc7CisgICAgICAgICAgICBpZiAoIWl0LmFkdmFuY2VPbmVDaGFyYWN0ZXIo
dywgJmxvY2FsR2x5cGhCdWZmZXIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgZGVsdGEgLT0gdzsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlUGFydGlhbEdseXBocykgewor
ICAgICAgICAgICAgICAgIGlmIChkZWx0YSArIHcgLyAyIDw9IDApCisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVs
dGEgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmIC8vIFVTRShGT05U
X0ZBU1RfUEFUSCkKKwogfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250RmFzdFBhdGguY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGgu
Y3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdhZTViLi4wMDAwMDAwCi0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDM5MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiBBcHBs
ZSBDb21wdXRlciwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVy
IEZyZXl0aGVyCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgot
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRm9udC5oIgotCi0jaW5jbHVkZSAiQ2hhcmFj
dGVyTmFtZXMuaCIKLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJGb250Q2FjaGUu
aCIKLSNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCi0jaW5jbHVkZSAiR2x5cGhCdWZmZXIu
aCIKLSNpbmNsdWRlICJHbHlwaFBhZ2VUcmVlTm9kZS5oIgotI2luY2x1ZGUgIkludFBvaW50Lmgi
Ci0jaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLSNpbmNsdWRlICJXaWR0aEl0ZXJhdG9yLmgi
Ci0KLSNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL1Vu
aWNvZGUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmljb2Rl
OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLUdseXBoRGF0YSBGb250OjpnbHlwaERhdGFGb3JD
aGFyYWN0ZXIoVUNoYXIzMiBjLCBib29sIG1pcnJvciwgYm9vbCBmb3JjZVNtYWxsQ2FwcykgY29u
c3QKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCi0gICAgYm9vbCB1c2VTbWFsbENh
cHNGb250ID0gZm9yY2VTbWFsbENhcHM7Ci0gICAgaWYgKG1fZm9udERlc2NyaXB0aW9uLnNtYWxs
Q2FwcygpKSB7Ci0gICAgICAgIFVDaGFyMzIgdXBwZXJDID0gdG9VcHBlcihjKTsKLSAgICAgICAg
aWYgKHVwcGVyQyAhPSBjKSB7Ci0gICAgICAgICAgICBjID0gdXBwZXJDOwotICAgICAgICAgICAg
dXNlU21hbGxDYXBzRm9udCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWly
cm9yKQotICAgICAgICBjID0gbWlycm9yZWRDaGFyKGMpOwotCi0gICAgdW5zaWduZWQgcGFnZU51
bWJlciA9IChjIC8gR2x5cGhQYWdlOjpzaXplKTsKLQotICAgIEdseXBoUGFnZVRyZWVOb2RlKiBu
b2RlID0gcGFnZU51bWJlciA/IG1fZm9udExpc3QtPm1fcGFnZXMuZ2V0KHBhZ2VOdW1iZXIpIDog
bV9mb250TGlzdC0+bV9wYWdlWmVybzsKLSAgICBpZiAoIW5vZGUpIHsKLSAgICAgICAgbm9kZSA9
IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQoZm9udERhdGFBdCgwKSwgcGFnZU51bWJl
cik7Ci0gICAgICAgIGlmIChwYWdlTnVtYmVyKQotICAgICAgICAgICAgbV9mb250TGlzdC0+bV9w
YWdlcy5zZXQocGFnZU51bWJlciwgbm9kZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1f
Zm9udExpc3QtPm1fcGFnZVplcm8gPSBub2RlOwotICAgIH0KLQotICAgIEdseXBoUGFnZSogcGFn
ZTsKLSAgICBpZiAoIXVzZVNtYWxsQ2Fwc0ZvbnQpIHsKLSAgICAgICAgLy8gRmFzdGVzdCBsb29w
LCBmb3IgdGhlIGNvbW1vbiBjYXNlIChub3Qgc21hbGwgY2FwcykuCi0gICAgICAgIHdoaWxlICh0
cnVlKSB7Ci0gICAgICAgICAgICBwYWdlID0gbm9kZS0+cGFnZSgpOwotICAgICAgICAgICAgaWYg
KHBhZ2UpIHsKLSAgICAgICAgICAgICAgICBHbHlwaERhdGEgZGF0YSA9IHBhZ2UtPmdseXBoRGF0
YUZvckNoYXJhY3RlcihjKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YS5mb250RGF0YSkKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUt
PmlzU3lzdGVtRmFsbGJhY2soKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCB0aGUgZmFsbGJhY2sgbGlzdC4K
LSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5nZXRDaGlsZChmb250RGF0YUF0KG5vZGUtPmxldmVs
KCkpLCBwYWdlTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChwYWdlTnVtYmVyKQotICAgICAgICAg
ICAgICAgIG1fZm9udExpc3QtPm1fcGFnZXMuc2V0KHBhZ2VOdW1iZXIsIG5vZGUpOwotICAgICAg
ICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fZm9udExpc3QtPm1fcGFnZVplcm8gPSBub2Rl
OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgICAgIHBhZ2UgPSBub2RlLT5wYWdlKCk7Ci0gICAgICAgICAgICBpZiAocGFnZSkgewotICAg
ICAgICAgICAgICAgIEdseXBoRGF0YSBkYXRhID0gcGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KGMpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvbnREYXRhKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIFRoZSBzbWFsbENhcHNGb250RGF0YSBmdW5jdGlvbiBzaG91bGQgbm90IG5vcm1h
bGx5IHJldHVybiAwLgotICAgICAgICAgICAgICAgICAgICAvLyBCdXQgaWYgaXQgZG9lcywgd2Ug
d2lsbCBqdXN0IHJlbmRlciB0aGUgY2FwaXRhbCBsZXR0ZXIgYmlnLgotICAgICAgICAgICAgICAg
ICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogc21hbGxDYXBzRm9udERhdGEgPSBkYXRhLmZvbnRE
YXRhLT5zbWFsbENhcHNGb250RGF0YShtX2ZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICghc21hbGxDYXBzRm9udERhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZSogc21h
bGxDYXBzTm9kZSA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQoc21hbGxDYXBzRm9u
dERhdGEsIHBhZ2VOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBHbHlwaFBhZ2Uq
IHNtYWxsQ2Fwc1BhZ2UgPSBzbWFsbENhcHNOb2RlLT5wYWdlKCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChzbWFsbENhcHNQYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHbHlwaERh
dGEgZGF0YSA9IHNtYWxsQ2Fwc1BhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvbnREYXRhKQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgLy8gRG8gbm90IGF0dGVtcHQgc3lzdGVtIGZhbGxiYWNrIG9mZiB0aGUgc21h
bGxDYXBzRm9udERhdGEuIFRoaXMgaXMgdGhlIHZlcnkgdW5saWtlbHkgY2FzZSB0aGF0Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIGEgZm9udCBoYXMgdGhlIGxvd2VyY2FzZSBjaGFyYWN0ZXIgYnV0
IHRoZSBzbWFsbCBjYXBzIGZvbnQgZG9lcyBub3QgaGF2ZSBpdHMgdXBwZXJjYXNlIHZlcnNpb24u
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzbWFsbENhcHNGb250RGF0YS0+bWlzc2luZ0ds
eXBoRGF0YSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChub2Rl
LT5pc1N5c3RlbUZhbGxiYWNrKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAvLyBQcm9jZWVkIHdpdGggdGhlIGZhbGxiYWNrIGxpc3Qu
Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+Z2V0Q2hpbGQoZm9udERhdGFBdChub2RlLT5sZXZl
bCgpKSwgcGFnZU51bWJlcik7Ci0gICAgICAgICAgICBpZiAocGFnZU51bWJlcikKLSAgICAgICAg
ICAgICAgICBtX2ZvbnRMaXN0LT5tX3BhZ2VzLnNldChwYWdlTnVtYmVyLCBub2RlKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX2ZvbnRMaXN0LT5tX3BhZ2VaZXJvID0gbm9k
ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFTU0VSVChwYWdlKTsKLSAgICBBU1NFUlQobm9k
ZS0+aXNTeXN0ZW1GYWxsYmFjaygpKTsKLQotICAgIC8vIFN5c3RlbSBmYWxsYmFjayBpcyBjaGFy
YWN0ZXItZGVwZW5kZW50LiBXaGVuIHdlIGdldCBoZXJlLCB3ZQotICAgIC8vIGtub3cgdGhhdCB0
aGUgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIGlzbid0IGluIHRoZSBzeXN0ZW0gZmFsbGJhY2sKLSAg
ICAvLyBmb250J3MgZ2x5cGggcGFnZS4gVHJ5IHRvIGxhemlseSBjcmVhdGUgaXQgaGVyZS4KLSAg
ICBVQ2hhciBjb2RlVW5pdHNbMl07Ci0gICAgaW50IGNvZGVVbml0c0xlbmd0aDsKLSAgICBpZiAo
YyA8PSAweEZGRkYpIHsKLSAgICAgICAgY29kZVVuaXRzWzBdID0gRm9udDo6bm9ybWFsaXplU3Bh
Y2VzKGMpOwotICAgICAgICBjb2RlVW5pdHNMZW5ndGggPSAxOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIGNvZGVVbml0c1swXSA9IFUxNl9MRUFEKGMpOwotICAgICAgICBjb2RlVW5pdHNbMV0gPSBV
MTZfVFJBSUwoYyk7Ci0gICAgICAgIGNvZGVVbml0c0xlbmd0aCA9IDI7Ci0gICAgfQotICAgIGNv
bnN0IFNpbXBsZUZvbnREYXRhKiBjaGFyYWN0ZXJGb250RGF0YSA9IGZvbnRDYWNoZSgpLT5nZXRG
b250RGF0YUZvckNoYXJhY3RlcnMoKnRoaXMsIGNvZGVVbml0cywgY29kZVVuaXRzTGVuZ3RoKTsK
LSAgICBpZiAodXNlU21hbGxDYXBzRm9udCAmJiBjaGFyYWN0ZXJGb250RGF0YSkKLSAgICAgICAg
Y2hhcmFjdGVyRm9udERhdGEgPSBjaGFyYWN0ZXJGb250RGF0YS0+c21hbGxDYXBzRm9udERhdGEo
bV9mb250RGVzY3JpcHRpb24pOwotICAgIGlmIChjaGFyYWN0ZXJGb250RGF0YSkgewotICAgICAg
ICAvLyBHb3QgdGhlIGZhbGxiYWNrIGdseXBoIGFuZCBmb250LgotICAgICAgICBHbHlwaFBhZ2Uq
IGZhbGxiYWNrUGFnZSA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQoY2hhcmFjdGVy
Rm9udERhdGEsIHBhZ2VOdW1iZXIpLT5wYWdlKCk7Ci0gICAgICAgIEdseXBoRGF0YSBkYXRhID0g
ZmFsbGJhY2tQYWdlICYmIGZhbGxiYWNrUGFnZS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoYykgPyBm
YWxsYmFja1BhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjKSA6IGNoYXJhY3RlckZvbnREYXRh
LT5taXNzaW5nR2x5cGhEYXRhKCk7Ci0gICAgICAgIC8vIENhY2hlIGl0IHNvIHdlIGRvbid0IGhh
dmUgdG8gZG8gc3lzdGVtIGZhbGxiYWNrIGFnYWluIG5leHQgdGltZS4KLSAgICAgICAgaWYgKCF1
c2VTbWFsbENhcHNGb250KSB7Ci0jaWYgT1MoV0lOQ0UpCi0gICAgICAgICAgICAvLyBtaXNzaW5n
R2x5cGhEYXRhIHJldHVybnMgYSBudWxsIGNoYXJhY3Rlciwgd2hpY2ggaXMgbm90IHN1aXRhYmxl
IGZvciBHREkgdG8gZGlzcGxheS4KLSAgICAgICAgICAgIC8vIEFsc28sIHNvbWV0aW1lcyB3ZSBj
YW5ub3QgbWFwIGEgZm9udCBmb3IgdGhlIGNoYXJhY3RlciBvbiBXSU5DRSwgYnV0IEdESSBjYW4g
c3RpbGwKLSAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIGNoYXJhY3RlciwgcHJvYmFibHkgYmVj
YXVzZSB0aGUgZm9udCBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQgY29ycmVjdGx5LgotICAgICAg
ICAgICAgLy8gU28gd2UganVzdCBhbHdheXMgc2V0IHRoZSBnbHlwaCB0byBiZSBzYW1lIGFzIHRo
ZSBjaGFyYWN0ZXIsIGFuZCBsZXQgR0RJIHNvbHZlIGl0LgotICAgICAgICAgICAgcGFnZS0+c2V0
R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIGMsIGNoYXJhY3RlckZvbnREYXRhKTsKLSAgICAgICAg
ICAgIHJldHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7Ci0jZWxzZQotICAgICAg
ICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIGRhdGEuZ2x5cGgsIGRhdGEu
Zm9udERhdGEpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAg
fQotCi0gICAgLy8gRXZlbiBzeXN0ZW0gZmFsbGJhY2sgY2FuIGZhaWw7IHVzZSB0aGUgbWlzc2lu
ZyBnbHlwaCBpbiB0aGF0IGNhc2UuCi0gICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2VyIHRv
IHVzZSB0aGUgbWlzc2luZyBnbHlwaCBmcm9tIHRoZSBsYXN0IHJlc29ydCBmb250IGluc3RlYWQu
Ci0gICAgR2x5cGhEYXRhIGRhdGEgPSBwcmltYXJ5Rm9udCgpLT5taXNzaW5nR2x5cGhEYXRhKCk7
Ci0gICAgaWYgKCF1c2VTbWFsbENhcHNGb250KSB7Ci0jaWYgT1MoV0lOQ0UpCi0gICAgICAgIC8v
IFNlZSBjb21tZW50IGFib3V0IFdJTkNFIEdESSBoYW5kbGluZyBuZWFyIHNldEdseXBoRGF0YUZv
ckNoYXJhY3RlciBhYm92ZS4KLSAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KGMsIGMsIGRhdGEuZm9udERhdGEpOwotICAgICAgICByZXR1cm4gcGFnZS0+Z2x5cGhEYXRhRm9y
Q2hhcmFjdGVyKGMpOwotI2Vsc2UKLSAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKGMsIGRhdGEuZ2x5cGgsIGRhdGEuZm9udERhdGEpOwotI2VuZGlmCi0gICAgfQotICAgIHJl
dHVybiBkYXRhOwotfQotCi12b2lkIEZvbnQ6OnNldENvZGVQYXRoKENvZGVQYXRoIHApCi17Ci0g
ICAgc19jb2RlUGF0aCA9IHA7Ci19Ci0KLUZvbnQ6OkNvZGVQYXRoIEZvbnQ6OmNvZGVQYXRoKCkK
LXsKLSAgICByZXR1cm4gc19jb2RlUGF0aDsKLX0KLQotRm9udDo6Q29kZVBhdGggRm9udDo6Y29k
ZVBhdGgoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAotewotICAgIGlmIChzX2NvZGVQYXRoICE9
IEF1dG8pCi0gICAgICAgIHJldHVybiBzX2NvZGVQYXRoOwotCi0gICAgLy8gU3RhcnQgZnJvbSAw
IHNpbmNlIGRyYXdpbmcgYW5kIGhpZ2hsaWdodGluZyBhbHNvIG1lYXN1cmUgdGhlIGNoYXJhY3Rl
cnMgYmVmb3JlIHJ1bi0+ZnJvbQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgp
OyBpKyspIHsKLSAgICAgICAgY29uc3QgVUNoYXIgYyA9IHJ1bltpXTsKLSAgICAgICAgaWYgKGMg
PCAweDMwMCkgICAgICAvLyBVKzAzMDAgdGhyb3VnaCBVKzAzNkYgQ29tYmluaW5nIGRpYWNyaXRp
Y2FsIG1hcmtzCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGMgPD0gMHgzNkYp
Ci0gICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKLQotICAgICAgICBpZiAoYyA8IDB4MDU5MSB8
fCBjID09IDB4MDVCRSkgICAgIC8vIFUrMDU5MSB0aHJvdWdoIFUrMDVDRiBleGNsdWRpbmcgVSsw
NUJFIEhlYnJldyBjb21iaW5pbmcgbWFya3MsIEhlYnJldyBwdW5jdHVhdGlvbiBQYXNlcSwgU29m
IFBhc3VxIGFuZCBOdW4gSGFmdWtoYQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlm
IChjIDw9IDB4MDVDRikKLSAgICAgICAgICAgIHJldHVybiBDb21wbGV4OwotCi0gICAgICAgIGlm
IChjIDwgMHgwNjAwKSAgICAgLy8gVSswNjAwIHRocm91Z2ggVSsxMDU5IEFyYWJpYywgU3lyaWFj
LCBUaGFhbmEsIERldmFuYWdhcmksIEJlbmdhbGksIEd1cm11a2hpLCBHdWphcmF0aSwgT3JpeWEs
IFRhbWlsLCBUZWx1Z3UsIEthbm5hZGEsIE1hbGF5YWxhbSwgU2luaGFsYSwgVGhhaSwgTGFvLCBU
aWJldGFuLCBNeWFubWFyCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGMgPD0g
MHgxMDU5KQotICAgICAgICAgICAgcmV0dXJuIENvbXBsZXg7Ci0KLSAgICAgICAgaWYgKGMgPCAw
eDExMDApICAgICAvLyBVKzExMDAgdGhyb3VnaCBVKzExRkYgSGFuZ3VsIEphbW8gKG9ubHkgQW5j
aWVudCBLb3JlYW4gc2hvdWxkIGJlIGxlZnQgaGVyZSBpZiB5b3UgcHJlY29tcG9zZTsgTW9kZXJu
IEtvcmVhbiB3aWxsIGJlIHByZWNvbXBvc2VkIGFzIGEgcmVzdWx0IG9mIHN0ZXAgQSkKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAweDExRkYpCi0gICAgICAgICAgICBy
ZXR1cm4gQ29tcGxleDsKLQotICAgICAgICBpZiAoYyA8IDB4MTc4MCkgICAgIC8vIFUrMTc4MCB0
aHJvdWdoIFUrMThBRiBLaG1lciwgTW9uZ29saWFuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgaWYgKGMgPD0gMHgxOEFGKQotICAgICAgICAgICAgcmV0dXJuIENvbXBsZXg7Ci0KLSAg
ICAgICAgaWYgKGMgPCAweDE5MDApICAgICAvLyBVKzE5MDAgdGhyb3VnaCBVKzE5NEYgTGltYnUg
KFVuaWNvZGUgNC4wKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChjIDw9IDB4
MTk0RikKLSAgICAgICAgICAgIHJldHVybiBDb21wbGV4OwotCi0gICAgICAgIGlmIChjIDwgMHgx
RTAwKSAgICAgLy8gVSsxRTAwIHRocm91Z2ggVSsyMDAwIGNoYXJhY3RlcnMgd2l0aCBkaWFjcml0
aWNzIGFuZCBzdGFja2VkIGRpYWNyaXRpY3MKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICBpZiAoYyA8PSAweDIwMDApCi0gICAgICAgICAgICByZXR1cm4gU2ltcGxlV2l0aEdseXBoT3Zl
cmZsb3c7Ci0KLSAgICAgICAgaWYgKGMgPCAweDIwRDApICAgICAvLyBVKzIwRDAgdGhyb3VnaCBV
KzIwRkYgQ29tYmluaW5nIG1hcmtzIGZvciBzeW1ib2xzCi0gICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgaWYgKGMgPD0gMHgyMEZGKQotICAgICAgICAgICAgcmV0dXJuIENvbXBsZXg7Ci0K
LSAgICAgICAgaWYgKGMgPCAweEZFMjApICAgICAvLyBVK0ZFMjAgdGhyb3VnaCBVK0ZFMkYgQ29t
YmluaW5nIGhhbGYgbWFya3MKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8
PSAweEZFMkYpCi0gICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKLSAgICB9Ci0KLSAgICBpZiAo
dHlwZXNldHRpbmdGZWF0dXJlcygpKQotICAgICAgICByZXR1cm4gQ29tcGxleDsKLQotICAgIHJl
dHVybiBTaW1wbGU7Ci19Ci0KLXZvaWQgRm9udDo6ZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhv
bGRzIG91ciBnbHlwaHMrYWR2YW5jZXMrZm9udCBkYXRhIGZvciBlYWNoIGdseXBoLgotICAgIEds
eXBoQnVmZmVyIGdseXBoQnVmZmVyOwotCi0gICAgZmxvYXQgc3RhcnRYID0gcG9pbnQueCgpOwot
ICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuKTsKLSAgICBpdC5hZHZhbmNlKGZyb20pOwot
ICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOwotICAgIGl0LmFkdmFu
Y2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0gICAgCi0gICAgLy8gV2UgY291bGRuJ3QgZ2VuZXJhdGUg
YW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCi0gICAgaWYgKGdseXBoQnVmZmVyLmlz
RW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGZsb2F0IGFmdGVyV2lkdGggPSBp
dC5tX3J1bldpZHRoU29GYXI7Ci0KLSAgICBpZiAocnVuLnJ0bCgpKSB7Ci0gICAgICAgIGZsb2F0
IGZpbmFsUm91bmRpbmdXaWR0aCA9IGl0Lm1fZmluYWxSb3VuZGluZ1dpZHRoOwotICAgICAgICBp
dC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIHN0YXJ0WCArPSBmaW5hbFJvdW5kaW5n
V2lkdGggKyBpdC5tX3J1bldpZHRoU29GYXIgLSBhZnRlcldpZHRoOwotICAgIH0gZWxzZQotICAg
ICAgICBzdGFydFggKz0gYmVmb3JlV2lkdGg7Ci0KLSAgICAvLyBTd2FwIHRoZSBvcmRlciBvZiB0
aGUgZ2x5cGhzIGlmIHJpZ2h0LXRvLWxlZnQuCi0gICAgaWYgKHJ1bi5ydGwoKSkKLSAgICAgICAg
Zm9yIChpbnQgaSA9IDAsIGVuZCA9IGdseXBoQnVmZmVyLnNpemUoKSAtIDE7IGkgPCBnbHlwaEJ1
ZmZlci5zaXplKCkgLyAyOyArK2ksIC0tZW5kKQotICAgICAgICAgICAgZ2x5cGhCdWZmZXIuc3dh
cChpLCBlbmQpOwotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUg
Z2x5cGhzIHRvIGJlIGRpc3BsYXllZCBieSBhZGRpbmcKLSAgICAvLyBhbGwgdGhlIGFkdmFuY2Vz
IHVwIHRvIHRoZSBmaXJzdCBnbHlwaC4KLSAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRY
LCBwb2ludC55KCkpOwotICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwg
cnVuLCBzdGFydFBvaW50KTsKLX0KLQotdm9pZCBGb250OjpkcmF3R2x5cGhCdWZmZXIoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIGNvbnN0
IFRleHRSdW4mLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKLXsgICAKLSAgICAvLyBE
cmF3IGVhY2ggY29udGlndW91cyBydW4gb2YgZ2x5cGhzIHRoYXQgdXNlIHRoZSBzYW1lIGZvbnQg
ZGF0YS4KLSAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnbHlwaEJ1ZmZlci5m
b250RGF0YUF0KDApOwotICAgIEZsb2F0U2l6ZSBvZmZzZXQgPSBnbHlwaEJ1ZmZlci5vZmZzZXRB
dCgwKTsKLSAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQocG9pbnQpOwotICAgIGZsb2F0IG5leHRY
ID0gc3RhcnRQb2ludC54KCk7Ci0gICAgaW50IGxhc3RGcm9tID0gMDsKLSAgICBpbnQgbmV4dEds
eXBoID0gMDsKLSAgICB3aGlsZSAobmV4dEdseXBoIDwgZ2x5cGhCdWZmZXIuc2l6ZSgpKSB7Ci0g
ICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBuZXh0Rm9udERhdGEgPSBnbHlwaEJ1ZmZlci5m
b250RGF0YUF0KG5leHRHbHlwaCk7Ci0gICAgICAgIEZsb2F0U2l6ZSBuZXh0T2Zmc2V0ID0gZ2x5
cGhCdWZmZXIub2Zmc2V0QXQobmV4dEdseXBoKTsKLSAgICAgICAgaWYgKG5leHRGb250RGF0YSAh
PSBmb250RGF0YSB8fCBuZXh0T2Zmc2V0ICE9IG9mZnNldCkgewotICAgICAgICAgICAgZHJhd0ds
eXBocyhjb250ZXh0LCBmb250RGF0YSwgZ2x5cGhCdWZmZXIsIGxhc3RGcm9tLCBuZXh0R2x5cGgg
LSBsYXN0RnJvbSwgc3RhcnRQb2ludCk7Ci0KLSAgICAgICAgICAgIGxhc3RGcm9tID0gbmV4dEds
eXBoOwotICAgICAgICAgICAgZm9udERhdGEgPSBuZXh0Rm9udERhdGE7Ci0gICAgICAgICAgICBv
ZmZzZXQgPSBuZXh0T2Zmc2V0OwotICAgICAgICAgICAgc3RhcnRQb2ludC5zZXRYKG5leHRYKTsK
LSAgICAgICAgfQotICAgICAgICBuZXh0WCArPSBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQobmV4dEds
eXBoKTsKLSAgICAgICAgbmV4dEdseXBoKys7Ci0gICAgfQotCi0gICAgZHJhd0dseXBocyhjb250
ZXh0LCBmb250RGF0YSwgZ2x5cGhCdWZmZXIsIGxhc3RGcm9tLCBuZXh0R2x5cGggLSBsYXN0RnJv
bSwgc3RhcnRQb2ludCk7Ci19Ci0KLWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0
KGNvbnN0IFRleHRSdW4mIHJ1biwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyLCBIYXNoU2V0PGNv
bnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMsIEdseXBoT3ZlcmZsb3cqIGdseXBo
T3ZlcmZsb3cpIGNvbnN0Ci17Ci0gICAgV2lkdGhJdGVyYXRvciBpdCh0aGlzLCBydW4sIGZhbGxi
YWNrRm9udHMsIGdseXBoT3ZlcmZsb3cpOwotICAgIGl0LmFkdmFuY2UocnVuLmxlbmd0aCgpLCBn
bHlwaEJ1ZmZlcik7Ci0KLSAgICBpZiAoZ2x5cGhPdmVyZmxvdykgewotICAgICAgICBnbHlwaE92
ZXJmbG93LT50b3AgPSBtYXg8aW50PihnbHlwaE92ZXJmbG93LT50b3AsIGNlaWxmKC1pdC5taW5H
bHlwaEJvdW5kaW5nQm94WSgpKSAtIGFzY2VudCgpKTsKLSAgICAgICAgZ2x5cGhPdmVyZmxvdy0+
Ym90dG9tID0gbWF4PGludD4oZ2x5cGhPdmVyZmxvdy0+Ym90dG9tLCBjZWlsZihpdC5tYXhHbHlw
aEJvdW5kaW5nQm94WSgpKSAtIGRlc2NlbnQoKSk7Ci0gICAgICAgIGdseXBoT3ZlcmZsb3ctPmxl
ZnQgPSBjZWlsZihpdC5maXJzdEdseXBoT3ZlcmZsb3coKSk7Ci0gICAgICAgIGdseXBoT3ZlcmZs
b3ctPnJpZ2h0ID0gY2VpbGYoaXQubGFzdEdseXBoT3ZlcmZsb3coKSk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGl0Lm1fcnVuV2lkdGhTb0ZhcjsKLX0KLQotRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlv
blJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBv
aW50LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKLXsKLSAgICBXaWR0aEl0ZXJhdG9y
IGl0KHRoaXMsIHJ1bik7Ci0gICAgaXQuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVX
aWR0aCA9IGl0Lm1fcnVuV2lkdGhTb0ZhcjsKLSAgICBpdC5hZHZhbmNlKHRvKTsKLSAgICBmbG9h
dCBhZnRlcldpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOwotCi0gICAgLy8gVXNpbmcgcm91bmRm
KCkgcmF0aGVyIHRoYW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNl
IHRvIGVuc3VyZSBjb3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCi0gICAgaWYgKHJ1bi5ydGwoKSkg
ewotICAgICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIGZsb2F0IHRvdGFs
V2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7Ci0gICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9p
bnQueCgpICsgZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3Vu
ZGYodG90YWxXaWR0aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJX
aWR0aCksIGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQu
eCgpICsgZmxvb3JmKGJlZm9yZVdpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYoYWZ0ZXJXaWR0aCkg
LSBmbG9vcmYoYmVmb3JlV2lkdGgpLCBoKTsKLSAgICB9Ci19Ci0KLWludCBGb250OjpvZmZzZXRG
b3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBp
bmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKLXsKLSAgICBmbG9hdCBkZWx0YSA9IChmbG9hdCl4
OwotCi0gICAgV2lkdGhJdGVyYXRvciBpdCh0aGlzLCBydW4pOwotICAgIEdseXBoQnVmZmVyIGxv
Y2FsR2x5cGhCdWZmZXI7Ci0gICAgdW5zaWduZWQgb2Zmc2V0OwotICAgIGlmIChydW4ucnRsKCkp
IHsKLSAgICAgICAgZGVsdGEgLT0gZmxvYXRXaWR0aEZvclNpbXBsZVRleHQocnVuLCAwKTsKLSAg
ICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IGl0Lm1fY3VycmVudENoYXJh
Y3RlcjsKLSAgICAgICAgICAgIGZsb2F0IHc7Ci0gICAgICAgICAgICBpZiAoIWl0LmFkdmFuY2VP
bmVDaGFyYWN0ZXIodywgJmxvY2FsR2x5cGhCdWZmZXIpKQotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgZGVsdGEgKz0gdzsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlUGFydGlh
bEdseXBocykgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YSAtIHcgLyAyID49IDApCi0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBpZiAoZGVsdGEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAoMSkgewotICAg
ICAgICAgICAgb2Zmc2V0ID0gaXQubV9jdXJyZW50Q2hhcmFjdGVyOwotICAgICAgICAgICAgZmxv
YXQgdzsKLSAgICAgICAgICAgIGlmICghaXQuYWR2YW5jZU9uZUNoYXJhY3Rlcih3LCAmbG9jYWxH
bHlwaEJ1ZmZlcikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWx0YSAt
PSB3OwotICAgICAgICAgICAgaWYgKGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKGRlbHRhICsgdyAvIDIgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8PSAwKQot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0KLQotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLX0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57683</attachid>
            <date>2010-06-02 12:51:31 -0700</date>
            <delta_ts>2010-06-04 01:47:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>qtwebkit_fontfastpath.patch</filename>
            <type>text/plain</type>
            <size>18438</size>
            <attacher name="Jocelyn Turcotte">jturcotte</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCBlZDEyNTRlLi5lZDRiYTc3IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjUg
QEAKKzIwMTAtMDUtMzEgIEpvY2VseW4gVHVyY290dGUgIDxqb2NlbHluLnR1cmNvdHRlQG5va2lh
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
UXRdIEltcGxlbWVudCB0aGUgc2ltcGxlIGZvbnQgY29kZSBwYXRoLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDAwNzcKKworICAgICAgICBSZW1vdmUg
dGhlIEZPTlRfRkFTVF9QQVRIIG1hY3JvIGFuZCB1c2UgdGhlIFF0J3MKKyAgICAgICAgZmFzdCB0
ZXh0IGltcGxlbWVudGF0aW9uIGluc3RlYWQgb2YgdGhlIG9uZSBvZiBXZWJLaXQuCisKKyAgICAg
ICAgVGhlIFF0OjpUZXh0QnlwYXNzU2hhcGluZyBmbGFnIGlzIHVzZWQgdG8gdGVsbCBRdCB0bwor
ICAgICAgICBvbmx5IHVzZSB0aGUgZ2x5cGggYWR2YW5jZXMuCisKKyAgICAgICAgUXQgNC43IGlz
IG5lZWRlZCB0byBnZXQgdGhpcyBmbGFnIHRodXMgdGhlIGNvbXBsZXggcGF0aCBpcyBhbHdheXMK
KyAgICAgICAgdXNlZCBpZiBRdFdlYktpdCBpcyBjb21waWxlZCBhZ2FpbnN0IGFuIGVhcmxpZXIg
dmVyc2lvbi4KKworICAgICAgICBDb250cmFyeSB0byB0aGUgV2ViS2l0J3MgaW1wbGVtZW50YXRp
b24sIHRoZSBjb21wbGV4IGNvZGUgcGF0aAorICAgICAgICBpcyB0YWtlbiBpZiB0aGUgdGV4dCBp
cyBSaWdodFRvTGVmdCwganVzdGlmaWVkIG9yIGlzIGZvcm1hdHRlZAorICAgICAgICB3aXRoIG5v
bi16ZXJvIGxldHRlciBvciB3b3JkIHNwYWNpbmcuCisKKyAgICAgICAgKiB3dGYvUGxhdGZvcm0u
aDoKKwogMjAxMC0wNi0wMiAgU3RlcmxpbmcgU3dpZ2FydCAgPHNzd2lnYXJ0QGdvb2dsZS5jb20+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2aW4uCmRpZmYgLS1naXQgYS9KYXZhU2Ny
aXB0Q29yZS93dGYvUGxhdGZvcm0uaCBiL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCmlu
ZGV4IDQ0NDdmNmEuLjJmOThiNTUgMTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0
Zm9ybS5oCisrKyBiL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCkBAIC0xMDQxLDEwICsx
MDQxLDYgQEAgb24gTWluR1cuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjkyNjggKi8KICNkZWZpbmUgV1RGX1VTRV9RWE1MUVVFUlkgMQogI2VuZGlmCiAKLSNp
ZiAhUExBVEZPUk0oUVQpCi0jZGVmaW5lIFdURl9VU0VfRk9OVF9GQVNUX1BBVEggMQotI2VuZGlm
Ci0KIC8qIEFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nICovCiAjaWYgUExBVEZPUk0oTUFDKQogI2lm
ICFkZWZpbmVkKEJVSUxESU5HX09OX1RJR0VSKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VM
b2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAzMWI2ZDA4Li40OTA4ZWFiIDEwMDY0NAotLS0g
YS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQx
IEBACisyMDEwLTA1LTMxICBKb2NlbHluIFR1cmNvdHRlICA8am9jZWx5bi50dXJjb3R0ZUBub2tp
YS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W1F0XSBJbXBsZW1lbnQgdGhlIHNpbXBsZSBmb250IGNvZGUgcGF0aC4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwMDc3CisKKyAgICAgICAgUmVtb3Zl
IHRoZSBGT05UX0ZBU1RfUEFUSCBtYWNybyBhbmQgdXNlIHRoZSBRdCdzCisgICAgICAgIGZhc3Qg
dGV4dCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkIG9mIHRoZSBvbmUgb2YgV2ViS2l0LgorCisgICAg
ICAgIFRoZSBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcgZmxhZyBpcyB1c2VkIHRvIHRlbGwgUXQgdG8K
KyAgICAgICAgb25seSB1c2UgdGhlIGdseXBoIGFkdmFuY2VzLgorCisgICAgICAgIFF0IDQuNyBp
cyBuZWVkZWQgdG8gZ2V0IHRoaXMgZmxhZyB0aHVzIHRoZSBjb21wbGV4IHBhdGggaXMgYWx3YXlz
CisgICAgICAgIHVzZWQgaWYgUXRXZWJLaXQgaXMgY29tcGlsZWQgYWdhaW5zdCBhbiBlYXJsaWVy
IHZlcnNpb24uCisKKyAgICAgICAgQ29udHJhcnkgdG8gdGhlIFdlYktpdCdzIGltcGxlbWVudGF0
aW9uLCB0aGUgY29tcGxleCBjb2RlIHBhdGgKKyAgICAgICAgaXMgdGFrZW4gaWYgdGhlIHRleHQg
aXMgUmlnaHRUb0xlZnQsIGp1c3RpZmllZCBvciBpcyBmb3JtYXR0ZWQKKyAgICAgICAgd2l0aCBu
b24temVybyBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nLgorCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpmbG9hdFdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6
OnNlbGVjdGlvblJlY3RGb3JUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6Om9mZnNldEZv
clBvc2l0aW9uKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Lmg6CisgICAgICAg
IChXZWJDb3JlOjpGb250Ojppc1JvdW5kaW5nSGFja0NoYXJhY3Rlcik6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmZyb21SYXdE
YXRhV2l0aG91dFJlZik6CisgICAgICAgIChXZWJDb3JlOjpuZWVkQ29tcGxleENvZGVQYXRoKToK
KyAgICAgICAgKFdlYkNvcmU6OnNldHVwUGxhdGZvcm1Db250ZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OkZvbnQ6OmNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpGb250OjpkcmF3U2ltcGxlVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
OjpkcmF3Q29tcGxleFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZmxvYXRXaWR0aEZv
clNpbXBsZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25G
b3JTaW1wbGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JT
aW1wbGVUZXh0KToKKwogMjAxMC0wNi0wMiAgSm9jZWx5biBUdXJjb3R0ZSAgPGpvY2VseW4udHVy
Y290dGVAbm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKaW5kZXggMGFkMjQ4ZC4uODIyZTViYiAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCkBAIC00Myw3ICs0Myw2IEBAIHVzaW5nIG5hbWVzcGFj
ZSBVbmljb2RlOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLSNpZiBVU0UoRk9OVF9GQVNUX1BB
VEgpCiBjb25zdCB1aW50OF90IEZvbnQ6OmdSb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsyNTZd
ID0gewogICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgLypcdCovLCAxIC8qXG4qLywg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwKICAgICAxIC8qc3BhY2UqLywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMSAvKi0qLywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMSAvKj8qLywKQEAgLTU2LDcgKzU1LDYgQEAgY29uc3QgdWludDhfdCBGb250OjpnUm91
bmRpbmdIYWNrQ2hhcmFjdGVyVGFibGVbMjU2XSA9IHsKIH07CiAKIEZvbnQ6OkNvZGVQYXRoIEZv
bnQ6OnNfY29kZVBhdGggPSBBdXRvOwotI2VuZGlmCiAKIC8vID09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09CiAvLyBGb250IEltcGxlbWVudGF0aW9uIChDcm9zcy1QbGF0Zm9ybSBQ
b3J0aW9uKQpAQCAtMTU2LDEwICsxNTQsOCBAQCB2b2lkIEZvbnQ6OmRyYXdUZXh0KEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaQogICAg
IH0KICNlbmRpZgogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQogICAgIGlmIChjb2RlUGF0aChy
dW4pICE9IENvbXBsZXgpCiAgICAgICAgIHJldHVybiBkcmF3U2ltcGxlVGV4dChjb250ZXh0LCBy
dW4sIHBvaW50LCBmcm9tLCB0byk7Ci0jZW5kaWYKIAogICAgIHJldHVybiBkcmF3Q29tcGxleFRl
eHQoY29udGV4dCwgcnVuLCBwb2ludCwgZnJvbSwgdG8pOwogfQpAQCAtMTcxLDcgKzE2Nyw2IEBA
IGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0
IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiCiAgICAgICAgIHJldHVybiBmbG9hdFdpZHRoVXNpbmdT
VkdGb250KHJ1bik7CiAjZW5kaWYKIAotI2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKICAgICBDb2Rl
UGF0aCBjb2RlUGF0aFRvVXNlID0gY29kZVBhdGgocnVuKTsKICAgICBpZiAoY29kZVBhdGhUb1Vz
ZSAhPSBDb21wbGV4KSB7CiAgICAgICAgIC8vIElmIHRoZSBjb21wbGV4IHRleHQgaW1wbGVtZW50
YXRpb24gY2Fubm90IHJldHVybiBmYWxsYmFjayBmb250cywgYXZvaWQKQEAgLTE3OSw3ICsxNzQs
NiBAQCBmbG9hdCBGb250OjpmbG9hdFdpZHRoKGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxj
b25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYgogICAgICAgICBzdGF0aWMgYm9vbCByZXR1cm5G
YWxsYmFja0ZvbnRzID0gY2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCk7CiAg
ICAgICAgIHJldHVybiBmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChydW4sIDAsIHJldHVybkZhbGxi
YWNrRm9udHMgPyBmYWxsYmFja0ZvbnRzIDogMCwgY29kZVBhdGhUb1VzZSA9PSBTaW1wbGVXaXRo
R2x5cGhPdmVyZmxvdyA/IGdseXBoT3ZlcmZsb3cgOiAwKTsKICAgICB9Ci0jZW5kaWYKIAogICAg
IHJldHVybiBmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQocnVuLCBmYWxsYmFja0ZvbnRzLCBnbHlw
aE92ZXJmbG93KTsKIH0KQEAgLTE5NiwxMCArMTkwLDggQEAgZmxvYXQgRm9udDo6ZmxvYXRXaWR0
aChjb25zdCBUZXh0UnVuJiBydW4sIGludCBleHRyYUNoYXJzQXZhaWxhYmxlLCBpbnQmIGNoYXJz
Q28KICAgICBjaGFyc0NvbnN1bWVkID0gcnVuLmxlbmd0aCgpOwogICAgIGdseXBoTmFtZSA9ICIi
OwogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQogICAgIGlmIChjb2RlUGF0aChydW4pICE9IENv
bXBsZXgpCiAgICAgICAgIHJldHVybiBmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChydW4sIDApOwot
I2VuZGlmCiAKICAgICByZXR1cm4gZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KHJ1bik7CiB9CkBA
IC0yMTMsMTAgKzIwNSw4IEBAIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yVGV4dChj
b25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwb2ludCwKIAogICAgIHRvID0gKHRv
ID09IC0xID8gcnVuLmxlbmd0aCgpIDogdG8pOwogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQog
ICAgIGlmIChjb2RlUGF0aChydW4pICE9IENvbXBsZXgpCiAgICAgICAgIHJldHVybiBzZWxlY3Rp
b25SZWN0Rm9yU2ltcGxlVGV4dChydW4sIHBvaW50LCBoLCBmcm9tLCB0byk7Ci0jZW5kaWYKIAog
ICAgIHJldHVybiBzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQocnVuLCBwb2ludCwgaCwgZnJv
bSwgdG8pOwogfQpAQCAtMjI4LDEwICsyMTgsOCBAQCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRp
b24oY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocwog
ICAgICAgICByZXR1cm4gb2Zmc2V0Rm9yUG9zaXRpb25Gb3JUZXh0VXNpbmdTVkdGb250KHJ1biwg
eCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOwogI2VuZGlmCiAKLSNpZiBVU0UoRk9OVF9GQVNUX1BB
VEgpCiAgICAgaWYgKGNvZGVQYXRoKHJ1bikgIT0gQ29tcGxleCkKICAgICAgICAgcmV0dXJuIG9m
ZnNldEZvclBvc2l0aW9uRm9yU2ltcGxlVGV4dChydW4sIHgsIGluY2x1ZGVQYXJ0aWFsR2x5cGhz
KTsKLSNlbmRpZgogCiAgICAgcmV0dXJuIG9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQo
cnVuLCB4LCBpbmNsdWRlUGFydGlhbEdseXBocyk7CiB9CkBAIC0yNzMsNyArMjYxLDYgQEAgYm9v
bCBGb250OjpzaG91bGRVc2VTbW9vdGhpbmcoKQogICAgIHJldHVybiBzaG91bGRVc2VGb250U21v
b3RoaW5nOwogfQogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQogdm9pZCBGb250OjpzZXRDb2Rl
UGF0aChDb2RlUGF0aCBwKQogewogICAgIHNfY29kZVBhdGggPSBwOwpAQCAtMjg5LDYgKzI3Niwx
MSBAQCBGb250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0aChjb25zdCBUZXh0UnVuJiBydW4pIGNv
bnN0CiAgICAgaWYgKHNfY29kZVBhdGggIT0gQXV0bykKICAgICAgICAgcmV0dXJuIHNfY29kZVBh
dGg7CiAKKyNpZiBQTEFURk9STShRVCkKKyAgICBpZiAocnVuLnBhZGRpbmcoKSB8fCBydW4ucnRs
KCkgfHwgaXNTbWFsbENhcHMoKSB8fCB3b3JkU3BhY2luZygpICE9IDAgfHwgbGV0dGVyU3BhY2lu
ZygpICE9IDApCisgICAgICAgIHJldHVybiBDb21wbGV4OworI2VuZGlmCisKICAgICAvLyBTdGFy
dCBmcm9tIDAgc2luY2UgZHJhd2luZyBhbmQgaGlnaGxpZ2h0aW5nIGFsc28gbWVhc3VyZSB0aGUg
Y2hhcmFjdGVycyBiZWZvcmUgcnVuLT5mcm9tCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW4u
bGVuZ3RoKCk7IGkrKykgewogICAgICAgICBjb25zdCBVQ2hhciBjID0gcnVuW2ldOwpAQCAtMzQ0
LDYgKzMzNiw3IEBAIEZvbnQ6OkNvZGVQYXRoIEZvbnQ6OmNvZGVQYXRoKGNvbnN0IFRleHRSdW4m
IHJ1bikgY29uc3QKICAgICByZXR1cm4gU2ltcGxlOwogfQogCisjaWYgIVBMQVRGT1JNKFFUKQog
R2x5cGhEYXRhIEZvbnQ6OmdseXBoRGF0YUZvckNoYXJhY3RlcihVQ2hhcjMyIGMsIGJvb2wgbWly
cm9yLCBib29sIGZvcmNlU21hbGxDYXBzKSBjb25zdAogewogICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7CkBAIC02MjAsNiArNjEzLDYgQEAgaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9y
U2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCB4LCBib29sIGluY2x1ZGUKIAogICAg
IHJldHVybiBvZmZzZXQ7CiB9Ci0jZW5kaWYgLy8gVVNFKEZPTlRfRkFTVF9QQVRIKQorI2VuZGlm
IC8vICFQTEFURk9STShRVCkKIAogfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAppbmRleCA2NjMz
YTUwLi41M2Y3YmIyIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQu
aAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaApAQCAtMTUxLDkgKzE1MSw3
IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgdm9pZCBzZXRTaG91bGRVc2VTbW9vdGhpbmcoYm9vbCk7
CiAgICAgc3RhdGljIGJvb2wgc2hvdWxkVXNlU21vb3RoaW5nKCk7CiAKLSNpZiBVU0UoRk9OVF9G
QVNUX1BBVEgpCiAgICAgZW51bSBDb2RlUGF0aCB7IEF1dG8sIFNpbXBsZSwgQ29tcGxleCwgU2lt
cGxlV2l0aEdseXBoT3ZlcmZsb3cgfTsKLSNlbmRpZgogCiBwcml2YXRlOgogI2lmIEVOQUJMRShT
VkdfRk9OVFMpCkBAIC0xNjQsNyArMTYyLDYgQEAgcHJpdmF0ZToKICAgICBpbnQgb2Zmc2V0Rm9y
UG9zaXRpb25Gb3JUZXh0VXNpbmdTVkdGb250KGNvbnN0IFRleHRSdW4mLCBpbnQgcG9zaXRpb24s
IGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0OwogI2VuZGlmCiAKLSNpZiBVU0UoRk9O
VF9GQVNUX1BBVEgpCiAgICAgQ29kZVBhdGggY29kZVBhdGgoY29uc3QgVGV4dFJ1biYpIGNvbnN0
OwogICAgIHZvaWQgZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1
biYsIGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKICAgICB2b2lk
IGRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgU2ltcGxlRm9udERhdGEqLCBjb25z
dCBHbHlwaEJ1ZmZlciYsIGludCBmcm9tLCBpbnQgdG8sIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25z
dDsKQEAgLTE3NCw3ICsxNzEsNiBAQCBwcml2YXRlOgogICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25S
ZWN0Rm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiwgY29uc3QgSW50UG9pbnQmLCBpbnQgaCwg
aW50IGZyb20sIGludCB0bykgY29uc3Q7CiAKICAgICBzdGF0aWMgYm9vbCBjYW5SZXR1cm5GYWxs
YmFja0ZvbnRzRm9yQ29tcGxleFRleHQoKTsKLSNlbmRpZgogCiAgICAgdm9pZCBkcmF3Q29tcGxl
eFRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQm
LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKICAgICBmbG9hdCBmbG9hdFdpZHRoRm9yQ29tcGxl
eFRleHQoY29uc3QgVGV4dFJ1biYsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFs
bGJhY2tGb250cyA9IDAsIEdseXBoT3ZlcmZsb3cqID0gMCkgY29uc3Q7CkBAIC0xODUsNyArMTgx
LDYgQEAgcHJpdmF0ZToKIAogcHVibGljOgogICAgIC8vIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHRo
ZSBkaWZmZXJlbnQgZm9udCByZW5kZXJpbmcgY29kZSBwYXRocy4KLSNpZiBVU0UoRk9OVF9GQVNU
X1BBVEgpCiAgICAgc3RhdGljIHZvaWQgc2V0Q29kZVBhdGgoQ29kZVBhdGgpOwogICAgIHN0YXRp
YyBDb2RlUGF0aCBjb2RlUGF0aCgpOwogICAgIHN0YXRpYyBDb2RlUGF0aCBzX2NvZGVQYXRoOwpA
QCAtMTk1LDcgKzE5MCw2IEBAIHB1YmxpYzoKICAgICB7CiAgICAgICAgIHJldHVybiAoKChjICYg
fjB4RkYpID09IDAgJiYgZ1JvdW5kaW5nSGFja0NoYXJhY3RlclRhYmxlW2NdKSk7CiAgICAgfQot
I2VuZGlmCiAKICAgICBGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0OwogICAgIHN0
YXRpYyBib29sIHRyZWF0QXNTcGFjZShVQ2hhciBjKSB7IHJldHVybiBjID09ICcgJyB8fCBjID09
ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gMHgwMEEwOyB9CmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L0ZvbnRRdC5jcHAKaW5kZXggMjAwOTQyNC4uNTMzNjM4NyAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcApAQCAtNDQsMTEgKzQ0LDE1IEBACiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAotc3RhdGljIGNvbnN0IFFTdHJpbmcgZnJvbVJhd0RhdGFXaXRob3V0UmVm
KGNvbnN0IFN0cmluZyYgc3RyaW5nKQorc3RhdGljIGNvbnN0IFFTdHJpbmcgZnJvbVJhd0RhdGFX
aXRob3V0UmVmKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBpbnQgc3RhcnQgPSAwLCBpbnQgbGVuID0g
LTEpCiB7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIGxlbiA9IHN0cmluZy5sZW5ndGgoKSAt
IHN0YXJ0OworICAgIFFfQVNTRVJUKHN0YXJ0ICsgbGVuIDw9IHN0cmluZy5sZW5ndGgoKSk7CisK
ICAgICAvLyBXZSBkb24ndCBkZXRhY2guIFRoaXMgYXNzdW1lcyB0aGUgV2ViQ29yZSBzdHJpbmcg
ZGF0YSB3aWxsIHN0YXkgdmFsaWQgZm9yIHRoZQogICAgIC8vIGxpZmV0aW1lIG9mIHRoZSBRU3Ry
aW5nIHdlIHBhc3MgYmFjaywgc2luY2Ugd2UgZG9uJ3QgcmVmIHRoZSBXZWJDb3JlIHN0cmluZy4K
LSAgICByZXR1cm4gUVN0cmluZzo6ZnJvbVJhd0RhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCBR
Q2hhcio+KHN0cmluZy5jaGFyYWN0ZXJzKCkpLCBzdHJpbmcubGVuZ3RoKCkpOworICAgIHJldHVy
biBRU3RyaW5nOjpmcm9tUmF3RGF0YShyZWludGVycHJldF9jYXN0PGNvbnN0IFFDaGFyKj4oc3Ry
aW5nLmNoYXJhY3RlcnMoKSArIHN0YXJ0KSwgbGVuKTsKIH0KIAogc3RhdGljIFFUZXh0TGluZSBz
ZXR1cExheW91dChRVGV4dExheW91dCogbGF5b3V0LCBjb25zdCBUZXh0UnVuJiBzdHlsZSkKQEAg
LTY2LDExICs3MCw4IEBAIHN0YXRpYyBRVGV4dExpbmUgc2V0dXBMYXlvdXQoUVRleHRMYXlvdXQq
IGxheW91dCwgY29uc3QgVGV4dFJ1biYgc3R5bGUpCiAgICAgcmV0dXJuIGxpbmU7CiB9CiAKLXZv
aWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0
UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAorc3RhdGljIFFQYWludGVyKiBzZXR1cFBsYXRmb3JtQ29udGV4dChHcmFwaGljc0NvbnRleHQq
IGN0eCkKIHsKLSAgICBpZiAodG8gPCAwKQotICAgICAgICB0byA9IHJ1bi5sZW5ndGgoKTsKLQog
ICAgIFFQYWludGVyICpwID0gY3R4LT5wbGF0Zm9ybUNvbnRleHQoKTsKIAogICAgIFFQZW4gdGV4
dEZpbGxQZW47CkBAIC05OSw2ICsxMDAsNjUgQEAgdm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQo
R3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXQKICAg
ICAgICAgfSBlbHNlCiAgICAgICAgICAgICB0ZXh0U3Ryb2tlUGVuID0gUVBlbihRQ29sb3IoY3R4
LT5zdHJva2VDb2xvcigpKSwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7CiAgICAgfQorICAgIHJl
dHVybiBwOworfQorCit2b2lkIEZvbnQ6OmRyYXdTaW1wbGVUZXh0KEdyYXBoaWNzQ29udGV4dCog
Y3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJv
bSwgaW50IHRvKSBjb25zdAoreworI2lmIFFUX1ZFUlNJT04gPCBRVF9WRVJTSU9OX0NIRUNLKDQs
IDcsIDApCisgICAgLy8gU2VlIGFsc28gUVdlYlBhZ2VQcml2YXRlOjpRV2ViUGFnZVByaXZhdGUo
KSB3aGVyZSB0aGUgZGVmYXVsdCBwYXRoIGlzIHNldCB0byBDb21wbGV4IGZvciBRdCA0LjYgYW5k
IGVhcmxpZXIuCisgICAgcmV0dXJuIGRyYXdDb21wbGV4VGV4dChjdHgsIHJ1biwgcG9pbnQsIGZy
b20sIHRvKTsKKyNlbHNlCisgICAgaWYgKHRvIDwgMCkKKyAgICAgICAgdG8gPSBydW4ubGVuZ3Ro
KCk7CisKKyAgICBRUGFpbnRlciAqcCA9IHNldHVwUGxhdGZvcm1Db250ZXh0KGN0eCk7CisKKyAg
ICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdE
YXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworICAgIFFQb2ludEYgcHQocG9pbnQueCgpLCBwb2lu
dC55KCkpOworCisgICAgaWYgKGZyb20gPiAwIHx8IHRvIDwgcnVuLmxlbmd0aCgpKSB7CisgICAg
ICAgIGludCBza2lwV2lkdGggPSBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzdHJpbmcsIGZy
b20sIFF0OjpUZXh0QnlwYXNzU2hhcGluZyk7CisgICAgICAgIHB0LnNldFgocHQueCgpICsgc2tp
cFdpZHRoKTsKKyAgICAgICAgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXpl
ZCwgZnJvbSwgdG8gLSBmcm9tKTsKKyAgICB9CisKKyAgICAvLyB0ZXh0IHNoYWRvdworICAgIElu
dFNpemUgc2hhZG93U2l6ZTsKKyAgICBpbnQgc2hhZG93Qmx1cjsKKyAgICBDb2xvciBzaGFkb3dD
b2xvcjsKKyAgICBib29sIGhhc1NoYWRvdyA9IGN0eC0+dGV4dERyYXdpbmdNb2RlKCkgPT0gY1Rl
eHRGaWxsICYmIGN0eC0+Z2V0U2hhZG93KHNoYWRvd1NpemUsIHNoYWRvd0JsdXIsIHNoYWRvd0Nv
bG9yKTsKKworICAgIHAtPnNldEZvbnQoZm9udCgpKTsKKworICAgIGludCBmbGFncyA9IHJ1bi5y
dGwoKSA/IFF0OjpUZXh0Rm9yY2VSaWdodFRvTGVmdCA6IFF0OjpUZXh0Rm9yY2VMZWZ0VG9SaWdo
dDsKKyAgICBmbGFncyB8PSBRdDo6VGV4dEJ5cGFzc1NoYXBpbmc7CisKKyAgICBpZiAoaGFzU2hh
ZG93KSB7CisgICAgICAgIC8vIFRPRE86IHRleHQgc2hhZG93IGJsdXIgc3VwcG9ydAorICAgICAg
ICBwLT5zYXZlKCk7CisgICAgICAgIHAtPnNldFBlbihRQ29sb3Ioc2hhZG93Q29sb3IpKTsKKyAg
ICAgICAgcC0+dHJhbnNsYXRlKHNoYWRvd1NpemUud2lkdGgoKSwgc2hhZG93U2l6ZS5oZWlnaHQo
KSk7CisgICAgICAgIHAtPmRyYXdUZXh0KHB0LCBzdHJpbmcsIGZsYWdzLCBydW4ucGFkZGluZygp
KTsKKyAgICAgICAgcC0+cmVzdG9yZSgpOworICAgIH0KKyAgICBpZiAoY3R4LT50ZXh0RHJhd2lu
Z01vZGUoKSAmIGNUZXh0U3Ryb2tlKSB7CisgICAgICAgIFFQYWludGVyUGF0aCBwYXRoOworICAg
ICAgICBwYXRoLmFkZFRleHQocHQsIGZvbnQoKSwgc3RyaW5nKTsKKyAgICAgICAgcC0+c3Ryb2tl
UGF0aChwYXRoLCBwLT5wZW4oKSk7CisgICAgfQorICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9k
ZSgpICYgY1RleHRGaWxsKQorICAgICAgICBwLT5kcmF3VGV4dChwdCwgc3RyaW5nLCBmbGFncywg
cnVuLnBhZGRpbmcoKSk7CisjZW5kaWYKK30KKwordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQo
R3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgaWYgKHRvIDwgMCkKKyAg
ICAgICAgdG8gPSBydW4ubGVuZ3RoKCk7CisKKyAgICBRUGFpbnRlciAqcCA9IHNldHVwUGxhdGZv
cm1Db250ZXh0KGN0eCk7CiAKICAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXpl
U3BhY2VzKFN0cmluZyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKICAgICBRU3Ry
aW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOwpAQCAtMTc1LDYg
KzIzNSwzMCBAQCB2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGN0
eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdAogICAgIH0KIH0KIAorZmxvYXQgRm9u
dDo6ZmxvYXRXaWR0aEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBHbHlwaEJ1ZmZl
ciogZ2x5cGhCdWZmZXIsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tG
b250cywgR2x5cGhPdmVyZmxvdyogZ2x5cGhPdmVyZmxvdykgY29uc3QKK3sKKyNpZiBRVF9WRVJT
SU9OIDwgUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQorICAgIHJldHVybiBmbG9hdFdpZHRoRm9y
Q29tcGxleFRleHQocnVuLCBmYWxsYmFja0ZvbnRzLCBnbHlwaE92ZXJmbG93KTsKKyNlbHNlCisg
ICAgaWYgKCFydW4ubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHJ1bi5s
ZW5ndGgoKSA9PSAxICYmIHRyZWF0QXNTcGFjZShydW5bMF0pKQorICAgICAgICByZXR1cm4gUUZv
bnRNZXRyaWNzKGZvbnQoKSkud2lkdGgocnVuWzBdKSAtIG1fd29yZFNwYWNpbmcgKyBydW4ucGFk
ZGluZygpOworCisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhT
dHJpbmcocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKSk7CisgICAgUVN0cmluZyBzdHJp
bmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsKKworICAgIGludCB3ID0gUUZv
bnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3RyaW5nLCAtMSwgUXQ6OlRleHRCeXBhc3NTaGFwaW5n
KTsKKworICAgIC8vIFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3b3JkIHNwYWNpbmcgb24g
dGhlIGZpcnN0IGNoYXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRvZXMpCisgICAgaWYg
KHRyZWF0QXNTcGFjZShydW5bMF0pKQorICAgICAgICB3IC09IG1fd29yZFNwYWNpbmc7CisKKyAg
ICByZXR1cm4gdyArIHJ1bi5wYWRkaW5nKCk7CisjZW5kaWYKK30KKwogZmxvYXQgRm9udDo6Zmxv
YXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBT
aW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVyZmxvdyopIGNvbnN0CiB7CiAgICAgaWYgKCFydW4u
bGVuZ3RoKCkpCkBAIC0xOTQsNiArMjc4LDMzIEBAIGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JD
b21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9uCiAg
ICAgcmV0dXJuIHcgKyBydW4ucGFkZGluZygpOwogfQogCitpbnQgRm9udDo6b2Zmc2V0Rm9yUG9z
aXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHBvc2l0aW9uLCBib29s
IGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAoreworI2lmIFFUX1ZFUlNJT04gPCBRVF9WRVJT
SU9OX0NIRUNLKDQsIDcsIDApCisgICAgcmV0dXJuIG9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxl
eFRleHQocnVuLCBwb3NpdGlvbiwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOworI2Vsc2UKKyAgICBT
dHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hhcmFj
dGVycygpLCBydW4ubGVuZ3RoKCkpKTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRh
V2l0aG91dFJlZihzYW5pdGl6ZWQpOworCisgICAgUUZvbnRNZXRyaWNzIGZtKGZvbnQoKSk7Cisg
ICAgZmxvYXQgZGVsdGEgPSAoZmxvYXQpcG9zaXRpb247CisgICAgaW50IGN1clBvcyA9IDA7Cisg
ICAgZG8geworICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSBmbS53aWR0aChzdHJpbmdbY3VyUG9z
XSk7CisgICAgICAgIGRlbHRhIC09IGNoYXJXaWR0aDsKKyAgICAgICAgaWYgKGluY2x1ZGVQYXJ0
aWFsR2x5cGhzKSB7CisgICAgICAgICAgICBpZiAoZGVsdGEgKyBjaGFyV2lkdGggLyAyIDw9IDAp
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
ZiAoZGVsdGEgKyBjaGFyV2lkdGggPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgIH0gd2hpbGUgKCsrY3VyUG9zIDwgc3RyaW5nLnNpemUoKSk7CisKKyAgICByZXR1
cm4gY3VyUG9zOworI2VuZGlmCit9CisKIGludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNv
bXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHBvc2l0aW9uLCBib29sKSBjb25zdAog
ewogICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1
bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSkpOwpAQCAtMjA0LDYgKzMxNSwyMiBAQCBpbnQg
Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IGludCBwb3NpdGlvbiwgYm9vbAogICAgIHJldHVybiBsaW5lLnhUb0N1cnNvcihwb3NpdGlvbik7
CiB9CiAKK0Zsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yU2ltcGxlVGV4dChjb25zdCBU
ZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwdCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8p
IGNvbnN0Cit7CisjaWYgUVRfVkVSU0lPTiA8IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNywgMCkKKyAg
ICByZXR1cm4gc2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KHJ1biwgcHQsIGgsIGZyb20sIHRv
KTsKKyNlbHNlCisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhT
dHJpbmcocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKSk7CisgICAgUVN0cmluZyB3aG9s
ZVRleHQgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsKKyAgICBRU3RyaW5nIHNl
bGVjdGVkVGV4dCA9IGZyb21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQsIGZyb20sIHRvIC0g
ZnJvbSk7CisKKyAgICBpbnQgc3RhcnRYID0gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgod2hv
bGVUZXh0LCBmcm9tLCBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcpOworICAgIGludCB3aWR0aCA9IFFG
b250TWV0cmljcyhmb250KCkpLndpZHRoKHNlbGVjdGVkVGV4dCwgLTEsIFF0OjpUZXh0QnlwYXNz
U2hhcGluZyk7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0KHB0LngoKSArIHN0YXJ0WCwgcHQueSgp
LCB3aWR0aCwgaCk7CisjZW5kaWYKK30KKwogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RG
b3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwdCwgaW50
IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAgICAgU3RyaW5nIHNhbml0aXplZCA9IEZv
bnQ6Om5vcm1hbGl6ZVNwYWNlcyhTdHJpbmcocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgp
KSk7CkBAIC0yMjAsNiArMzQ3LDExIEBAIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9y
Q29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYKICAgICByZXR1
cm4gRmxvYXRSZWN0KHB0LngoKSArIHgxLCBwdC55KCksIHgyIC0geDEsIGgpOwogfQogCitib29s
IEZvbnQ6OmNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpCit7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCiBRRm9udCBGb250Ojpmb250KCkgY29uc3QKIHsKICAgICBRRm9udCBm
ID0gcHJpbWFyeUZvbnQoKS0+Z2V0UXRGb250KCk7CmRpZmYgLS1naXQgYS9XZWJLaXQvcXQvQXBp
L3F3ZWJwYWdlLmNwcCBiL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwCmluZGV4IDZmNmU3ZDcu
Ljg4ZGExMzkgMTAwNjQ0Ci0tLSBhL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwCisrKyBiL1dl
YktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwCkBAIC0yNjcsNiArMjY3LDkgQEAgUVdlYlBhZ2VQcml2
YXRlOjpRV2ViUGFnZVByaXZhdGUoUVdlYlBhZ2UgKnFxKQogICAgIEpTQzo6aW5pdGlhbGl6ZVRo
cmVhZGluZygpOwogICAgIFdURjo6aW5pdGlhbGl6ZU1haW5UaHJlYWQoKTsKICAgICBXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbjo6c2V0TG9jYWxMb2FkUG9saWN5KFdlYkNvcmU6OlNlY3VyaXR5T3Jp
Z2luOjpBbGxvd0xvY2FsTG9hZHNGb3JMb2NhbEFuZFN1YnN0aXR1dGVEYXRhKTsKKyNpZiBRVF9W
RVJTSU9OIDwgUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQorICAgIEZvbnQ6OnNldENvZGVQYXRo
KEZvbnQ6OkNvbXBsZXgpOworI2VuZGlmCiAKICAgICBjaHJvbWVDbGllbnQgPSBuZXcgQ2hyb21l
Q2xpZW50UXQocSk7CiAgICAgY29udGV4dE1lbnVDbGllbnQgPSBuZXcgQ29udGV4dE1lbnVDbGll
bnRRdCgpOwpkaWZmIC0tZ2l0IGEvV2ViS2l0L3F0L0NoYW5nZUxvZyBiL1dlYktpdC9xdC9DaGFu
Z2VMb2cKaW5kZXggMTFhYTcxNi4uZmYyZDc4OSAxMDA2NDQKLS0tIGEvV2ViS2l0L3F0L0NoYW5n
ZUxvZworKysgYi9XZWJLaXQvcXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjYgQEAKKzIwMTAtMDUt
MzEgIEpvY2VseW4gVHVyY290dGUgIDxqb2NlbHluLnR1cmNvdHRlQG5va2lhLmNvbT4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRdIEltcGxlbWVu
dCB0aGUgc2ltcGxlIGZvbnQgY29kZSBwYXRoLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDAwNzcKKworICAgICAgICBSZW1vdmUgdGhlIEZPTlRfRkFT
VF9QQVRIIG1hY3JvIGFuZCB1c2UgdGhlIFF0J3MKKyAgICAgICAgZmFzdCB0ZXh0IGltcGxlbWVu
dGF0aW9uIGluc3RlYWQgb2YgdGhlIG9uZSBvZiBXZWJLaXQuCisKKyAgICAgICAgVGhlIFF0OjpU
ZXh0QnlwYXNzU2hhcGluZyBmbGFnIGlzIHVzZWQgdG8gdGVsbCBRdCB0bworICAgICAgICBvbmx5
IHVzZSB0aGUgZ2x5cGggYWR2YW5jZXMuCisKKyAgICAgICAgUXQgNC43IGlzIG5lZWRlZCB0byBn
ZXQgdGhpcyBmbGFnIHRodXMgdGhlIGNvbXBsZXggcGF0aCBpcyBhbHdheXMKKyAgICAgICAgdXNl
ZCBpZiBRdFdlYktpdCBpcyBjb21waWxlZCBhZ2FpbnN0IGFuIGVhcmxpZXIgdmVyc2lvbi4KKwor
ICAgICAgICBDb250cmFyeSB0byB0aGUgV2ViS2l0J3MgaW1wbGVtZW50YXRpb24sIHRoZSBjb21w
bGV4IGNvZGUgcGF0aAorICAgICAgICBpcyB0YWtlbiBpZiB0aGUgdGV4dCBpcyBSaWdodFRvTGVm
dCwganVzdGlmaWVkIG9yIGlzIGZvcm1hdHRlZAorICAgICAgICB3aXRoIG5vbi16ZXJvIGxldHRl
ciBvciB3b3JkIHNwYWNpbmcuCisKKyAgICAgICAgKiBBcGkvcXdlYnBhZ2UuY3BwOgorICAgICAg
ICAoUVdlYlBhZ2VQcml2YXRlOjpRV2ViUGFnZVByaXZhdGUpOgorCiAyMDEwLTA2LTAxICBZYWVs
IEFoYXJvbiAgPHlhZWwuYWhhcm9uQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBL
ZW5uZXRoIFJvaGRlIENocmlzdGlhbnNlbi4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57852</attachid>
            <date>2010-06-04 01:38:57 -0700</date>
            <delta_ts>2010-06-11 03:04:04 -0700</delta_ts>
            <desc>Preliminary file refactoring patch v2</desc>
            <filename>codepath_to_fontcpp.patch</filename>
            <type>text/plain</type>
            <size>8410</size>
            <attacher name="Jocelyn Turcotte">jturcotte</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NzliMjA4Yi4uMzIzOWJlNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAorMjAxMC0wNi0wMyAgSm9jZWx5biBUdXJj
b3R0ZSAgPGpvY2VseW4udHVyY290dGVAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1vdmUgdGhlIHRleHQgY29kZSBwYXRoIGRldGVj
dGlvbiBjb2RlIGZyb20gRm9udEZhc3RQYXRoLmNwcCB0byBGb250LmNwcC4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwMDc3CisKKyAgICAgICAgVGhp
cyBpcyBhIHBhdGNoIHByZWxpbWluYXJ5IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAg
ICAgICAgc2ltcGxlIGZvbnQgY29kZSBwYXRoIGZvciB0aGUgUXQgcG9ydC4KKworICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6c2V0
Q29kZVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Y29kZVBhdGgpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9G
b250RmFzdFBhdGguY3BwOgorCiAyMDEwLTA2LTA0ICBRaSBaaGFuZyAgPHFpLjIuemhhbmdAbm9r
aWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IExhc3psbyBHb21ib3MuCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Gb250LmNwcAppbmRleCA3NjgyMDExLi41ZGRjY2QxIDEwMDY0NAotLS0gYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udC5jcHAKQEAgLTQ5LDkgKzQ5LDkgQEAgY29uc3QgdWludDhfdCBGb250OjpnUm91
bmRpbmdIYWNrQ2hhcmFjdGVyVGFibGVbMjU2XSA9IHsKICAgICAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLAogICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAKIH07CisjZW5kaWYKIAogRm9udDo6Q29kZVBhdGggRm9udDo6c19jb2RlUGF0aCA9IEF1
dG87Ci0jZW5kaWYKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8v
IEZvbnQgSW1wbGVtZW50YXRpb24gKENyb3NzLVBsYXRmb3JtIFBvcnRpb24pCkBAIC0yNjgsNCAr
MjY4LDc0IEBAIGJvb2wgRm9udDo6c2hvdWxkVXNlU21vb3RoaW5nKCkKICAgICByZXR1cm4gc2hv
dWxkVXNlRm9udFNtb290aGluZzsKIH0KIAordm9pZCBGb250OjpzZXRDb2RlUGF0aChDb2RlUGF0
aCBwKQoreworICAgIHNfY29kZVBhdGggPSBwOworfQorCitGb250OjpDb2RlUGF0aCBGb250Ojpj
b2RlUGF0aCgpCit7CisgICAgcmV0dXJuIHNfY29kZVBhdGg7Cit9CisKK0ZvbnQ6OkNvZGVQYXRo
IEZvbnQ6OmNvZGVQYXRoKGNvbnN0IFRleHRSdW4mIHJ1bikgY29uc3QKK3sKKyAgICBpZiAoc19j
b2RlUGF0aCAhPSBBdXRvKQorICAgICAgICByZXR1cm4gc19jb2RlUGF0aDsKKworICAgIC8vIFN0
YXJ0IGZyb20gMCBzaW5jZSBkcmF3aW5nIGFuZCBoaWdobGlnaHRpbmcgYWxzbyBtZWFzdXJlIHRo
ZSBjaGFyYWN0ZXJzIGJlZm9yZSBydW4tPmZyb20KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1
bi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFVDaGFyIGMgPSBydW5baV07CisgICAg
ICAgIGlmIChjIDwgMHgzMDApIC8vIFUrMDMwMCB0aHJvdWdoIFUrMDM2RiBDb21iaW5pbmcgZGlh
Y3JpdGljYWwgbWFya3MKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAw
eDM2RikKKyAgICAgICAgICAgIHJldHVybiBDb21wbGV4OworCisgICAgICAgIGlmIChjIDwgMHgw
NTkxIHx8IGMgPT0gMHgwNUJFKSAvLyBVKzA1OTEgdGhyb3VnaCBVKzA1Q0YgZXhjbHVkaW5nIFUr
MDVCRSBIZWJyZXcgY29tYmluaW5nIG1hcmtzLCBIZWJyZXcgcHVuY3R1YXRpb24gUGFzZXEsIFNv
ZiBQYXN1cSBhbmQgTnVuIEhhZnVraGEKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBp
ZiAoYyA8PSAweDA1Q0YpCisgICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKKworICAgICAgICBp
ZiAoYyA8IDB4MDYwMCkgLy8gVSswNjAwIHRocm91Z2ggVSsxMDU5IEFyYWJpYywgU3lyaWFjLCBU
aGFhbmEsIERldmFuYWdhcmksIEJlbmdhbGksIEd1cm11a2hpLCBHdWphcmF0aSwgT3JpeWEsIFRh
bWlsLCBUZWx1Z3UsIEthbm5hZGEsIE1hbGF5YWxhbSwgU2luaGFsYSwgVGhhaSwgTGFvLCBUaWJl
dGFuLCBNeWFubWFyCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGMgPD0gMHgx
MDU5KQorICAgICAgICAgICAgcmV0dXJuIENvbXBsZXg7CisKKyAgICAgICAgaWYgKGMgPCAweDEx
MDApIC8vIFUrMTEwMCB0aHJvdWdoIFUrMTFGRiBIYW5ndWwgSmFtbyAob25seSBBbmNpZW50IEtv
cmVhbiBzaG91bGQgYmUgbGVmdCBoZXJlIGlmIHlvdSBwcmVjb21wb3NlOyBNb2Rlcm4gS29yZWFu
IHdpbGwgYmUgcHJlY29tcG9zZWQgYXMgYSByZXN1bHQgb2Ygc3RlcCBBKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4MTFGRikKKyAgICAgICAgICAgIHJldHVybiBD
b21wbGV4OworCisgICAgICAgIGlmIChjIDwgMHgxNzgwKSAvLyBVKzE3ODAgdGhyb3VnaCBVKzE4
QUYgS2htZXIsIE1vbmdvbGlhbgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChj
IDw9IDB4MThBRikKKyAgICAgICAgICAgIHJldHVybiBDb21wbGV4OworCisgICAgICAgIGlmIChj
IDwgMHgxOTAwKSAvLyBVKzE5MDAgdGhyb3VnaCBVKzE5NEYgTGltYnUgKFVuaWNvZGUgNC4wKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4MTk0RikKKyAgICAgICAg
ICAgIHJldHVybiBDb21wbGV4OworCisgICAgICAgIGlmIChjIDwgMHgxRTAwKSAvLyBVKzFFMDAg
dGhyb3VnaCBVKzIwMDAgY2hhcmFjdGVycyB3aXRoIGRpYWNyaXRpY3MgYW5kIHN0YWNrZWQgZGlh
Y3JpdGljcworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4MjAwMCkK
KyAgICAgICAgICAgIHJldHVybiBTaW1wbGVXaXRoR2x5cGhPdmVyZmxvdzsKKworICAgICAgICBp
ZiAoYyA8IDB4MjBEMCkgLy8gVSsyMEQwIHRocm91Z2ggVSsyMEZGIENvbWJpbmluZyBtYXJrcyBm
b3Igc3ltYm9scworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4MjBG
RikKKyAgICAgICAgICAgIHJldHVybiBDb21wbGV4OworCisgICAgICAgIGlmIChjIDwgMHhGRTIw
KSAvLyBVK0ZFMjAgdGhyb3VnaCBVK0ZFMkYgQ29tYmluaW5nIGhhbGYgbWFya3MKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweEZFMkYpCisgICAgICAgICAgICByZXR1
cm4gQ29tcGxleDsKKyAgICB9CisKKyAgICBpZiAodHlwZXNldHRpbmdGZWF0dXJlcygpKQorICAg
ICAgICByZXR1cm4gQ29tcGxleDsKKworICAgIHJldHVybiBTaW1wbGU7Cit9CisKIH0KZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9Gb250LmgKaW5kZXggNjYzM2E1MC4uOTcyNmMxYiAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmgKQEAgLTE1MSw5ICsxNTEsNyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQg
c2V0U2hvdWxkVXNlU21vb3RoaW5nKGJvb2wpOwogICAgIHN0YXRpYyBib29sIHNob3VsZFVzZVNt
b290aGluZygpOwogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQogICAgIGVudW0gQ29kZVBhdGgg
eyBBdXRvLCBTaW1wbGUsIENvbXBsZXgsIFNpbXBsZVdpdGhHbHlwaE92ZXJmbG93IH07Ci0jZW5k
aWYKIAogcHJpdmF0ZToKICNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQpAQCAtMTY1LDcgKzE2Myw2IEBA
IHByaXZhdGU6CiAjZW5kaWYKIAogI2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKLSAgICBDb2RlUGF0
aCBjb2RlUGF0aChjb25zdCBUZXh0UnVuJikgY29uc3Q7CiAgICAgdm9pZCBkcmF3U2ltcGxlVGV4
dChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBUZXh0UnVuJiwgY29uc3QgRmxvYXRQb2ludCYsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0OwogICAgIHZvaWQgZHJhd0dseXBocyhHcmFwaGljc0NvbnRl
eHQqLCBjb25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0IEdseXBoQnVmZmVyJiwgaW50IGZyb20s
IGludCB0bywgY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0OwogICAgIHZvaWQgZHJhd0dseXBoQnVm
ZmVyKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEdseXBoQnVmZmVyJiwgY29uc3QgVGV4dFJ1biYs
IGNvbnN0IEZsb2F0UG9pbnQmKSBjb25zdDsKQEAgLTE3Niw2ICsxNzMsNyBAQCBwcml2YXRlOgog
ICAgIHN0YXRpYyBib29sIGNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpOwog
I2VuZGlmCiAKKyAgICBDb2RlUGF0aCBjb2RlUGF0aChjb25zdCBUZXh0UnVuJikgY29uc3Q7CiAg
ICAgdm9pZCBkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1biYs
IGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKICAgICBmbG9hdCBm
bG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYsIEhhc2hTZXQ8Y29uc3QgU2lt
cGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIEdseXBoT3ZlcmZsb3cqID0gMCkgY29u
c3Q7CiAgICAgaW50IG9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1
biYsIGludCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3Q7CkBAIC0x
ODUsMTEgKzE4MywxMSBAQCBwcml2YXRlOgogCiBwdWJsaWM6CiAgICAgLy8gVXNlZnVsIGZvciBk
ZWJ1Z2dpbmcgdGhlIGRpZmZlcmVudCBmb250IHJlbmRlcmluZyBjb2RlIHBhdGhzLgotI2lmIFVT
RShGT05UX0ZBU1RfUEFUSCkKICAgICBzdGF0aWMgdm9pZCBzZXRDb2RlUGF0aChDb2RlUGF0aCk7
CiAgICAgc3RhdGljIENvZGVQYXRoIGNvZGVQYXRoKCk7CiAgICAgc3RhdGljIENvZGVQYXRoIHNf
Y29kZVBhdGg7CiAKKyNpZiBVU0UoRk9OVF9GQVNUX1BBVEgpCiAgICAgc3RhdGljIGNvbnN0IHVp
bnQ4X3QgZ1JvdW5kaW5nSGFja0NoYXJhY3RlclRhYmxlWzI1Nl07CiAgICAgc3RhdGljIGJvb2wg
aXNSb3VuZGluZ0hhY2tDaGFyYWN0ZXIoVUNoYXIzMiBjKQogICAgIHsKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAppbmRleCBmNTdhZTViLi5iODYzZTgzIDEwMDY0
NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCkBAIC0xODAsNzYgKzE4
MCw2IEBAIEdseXBoRGF0YSBGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIoVUNoYXIzMiBjLCBi
b29sIG1pcnJvciwgYm9vbCBmb3JjZVNtYWxsQ2FwCiAgICAgcmV0dXJuIGRhdGE7CiB9CiAKLXZv
aWQgRm9udDo6c2V0Q29kZVBhdGgoQ29kZVBhdGggcCkKLXsKLSAgICBzX2NvZGVQYXRoID0gcDsK
LX0KLQotRm9udDo6Q29kZVBhdGggRm9udDo6Y29kZVBhdGgoKQotewotICAgIHJldHVybiBzX2Nv
ZGVQYXRoOwotfQotCi1Gb250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0aChjb25zdCBUZXh0UnVu
JiBydW4pIGNvbnN0Ci17Ci0gICAgaWYgKHNfY29kZVBhdGggIT0gQXV0bykKLSAgICAgICAgcmV0
dXJuIHNfY29kZVBhdGg7Ci0KLSAgICAvLyBTdGFydCBmcm9tIDAgc2luY2UgZHJhd2luZyBhbmQg
aGlnaGxpZ2h0aW5nIGFsc28gbWVhc3VyZSB0aGUgY2hhcmFjdGVycyBiZWZvcmUgcnVuLT5mcm9t
Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW4ubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBj
b25zdCBVQ2hhciBjID0gcnVuW2ldOwotICAgICAgICBpZiAoYyA8IDB4MzAwKSAgICAgIC8vIFUr
MDMwMCB0aHJvdWdoIFUrMDM2RiBDb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAweDM2RikKLSAgICAgICAgICAgIHJldHVy
biBDb21wbGV4OwotCi0gICAgICAgIGlmIChjIDwgMHgwNTkxIHx8IGMgPT0gMHgwNUJFKSAgICAg
Ly8gVSswNTkxIHRocm91Z2ggVSswNUNGIGV4Y2x1ZGluZyBVKzA1QkUgSGVicmV3IGNvbWJpbmlu
ZyBtYXJrcywgSGVicmV3IHB1bmN0dWF0aW9uIFBhc2VxLCBTb2YgUGFzdXEgYW5kIE51biBIYWZ1
a2hhCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGMgPD0gMHgwNUNGKQotICAg
ICAgICAgICAgcmV0dXJuIENvbXBsZXg7Ci0KLSAgICAgICAgaWYgKGMgPCAweDA2MDApICAgICAv
LyBVKzA2MDAgdGhyb3VnaCBVKzEwNTkgQXJhYmljLCBTeXJpYWMsIFRoYWFuYSwgRGV2YW5hZ2Fy
aSwgQmVuZ2FsaSwgR3VybXVraGksIEd1amFyYXRpLCBPcml5YSwgVGFtaWwsIFRlbHVndSwgS2Fu
bmFkYSwgTWFsYXlhbGFtLCBTaW5oYWxhLCBUaGFpLCBMYW8sIFRpYmV0YW4sIE15YW5tYXIKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAweDEwNTkpCi0gICAgICAgICAg
ICByZXR1cm4gQ29tcGxleDsKLQotICAgICAgICBpZiAoYyA8IDB4MTEwMCkgICAgIC8vIFUrMTEw
MCB0aHJvdWdoIFUrMTFGRiBIYW5ndWwgSmFtbyAob25seSBBbmNpZW50IEtvcmVhbiBzaG91bGQg
YmUgbGVmdCBoZXJlIGlmIHlvdSBwcmVjb21wb3NlOyBNb2Rlcm4gS29yZWFuIHdpbGwgYmUgcHJl
Y29tcG9zZWQgYXMgYSByZXN1bHQgb2Ygc3RlcCBBKQotICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIGlmIChjIDw9IDB4MTFGRikKLSAgICAgICAgICAgIHJldHVybiBDb21wbGV4OwotCi0g
ICAgICAgIGlmIChjIDwgMHgxNzgwKSAgICAgLy8gVSsxNzgwIHRocm91Z2ggVSsxOEFGIEtobWVy
LCBNb25nb2xpYW4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAweDE4
QUYpCi0gICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKLQotICAgICAgICBpZiAoYyA8IDB4MTkw
MCkgICAgIC8vIFUrMTkwMCB0aHJvdWdoIFUrMTk0RiBMaW1idSAoVW5pY29kZSA0LjApCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGMgPD0gMHgxOTRGKQotICAgICAgICAgICAg
cmV0dXJuIENvbXBsZXg7Ci0KLSAgICAgICAgaWYgKGMgPCAweDFFMDApICAgICAvLyBVKzFFMDAg
dGhyb3VnaCBVKzIwMDAgY2hhcmFjdGVycyB3aXRoIGRpYWNyaXRpY3MgYW5kIHN0YWNrZWQgZGlh
Y3JpdGljcwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChjIDw9IDB4MjAwMCkK
LSAgICAgICAgICAgIHJldHVybiBTaW1wbGVXaXRoR2x5cGhPdmVyZmxvdzsKLQotICAgICAgICBp
ZiAoYyA8IDB4MjBEMCkgICAgIC8vIFUrMjBEMCB0aHJvdWdoIFUrMjBGRiBDb21iaW5pbmcgbWFy
a3MgZm9yIHN5bWJvbHMKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAw
eDIwRkYpCi0gICAgICAgICAgICByZXR1cm4gQ29tcGxleDsKLQotICAgICAgICBpZiAoYyA8IDB4
RkUyMCkgICAgIC8vIFUrRkUyMCB0aHJvdWdoIFUrRkUyRiBDb21iaW5pbmcgaGFsZiBtYXJrcwot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChjIDw9IDB4RkUyRikKLSAgICAgICAg
ICAgIHJldHVybiBDb21wbGV4OwotICAgIH0KLQotICAgIGlmICh0eXBlc2V0dGluZ0ZlYXR1cmVz
KCkpCi0gICAgICAgIHJldHVybiBDb21wbGV4OwotCi0gICAgcmV0dXJuIFNpbXBsZTsKLX0KLQog
dm9pZCBGb250OjpkcmF3U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0
IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8p
IGNvbnN0CiB7CiAgICAgLy8gVGhpcyBnbHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBocythZHZh
bmNlcytmb250IGRhdGEgZm9yIGVhY2ggZ2x5cGguCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57853</attachid>
            <date>2010-06-04 01:47:06 -0700</date>
            <delta_ts>2010-06-11 03:04:30 -0700</delta_ts>
            <desc>Patch v2</desc>
            <filename>qtwebkit_fontfastpath.patch</filename>
            <type>text/plain</type>
            <size>19533</size>
            <attacher name="Jocelyn Turcotte">jturcotte</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCA3MjI0NTQ2Li4yMTA1OTc4IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjUg
QEAKKzIwMTAtMDUtMzEgIEpvY2VseW4gVHVyY290dGUgIDxqb2NlbHluLnR1cmNvdHRlQG5va2lh
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
UXRdIEltcGxlbWVudCB0aGUgc2ltcGxlIHRleHQgY29kZSBwYXRoLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDAwNzcKKworICAgICAgICBSZW1vdmUg
dGhlIEZPTlRfRkFTVF9QQVRIIG1hY3JvIGFuZCB1c2UgdGhlIFF0J3MKKyAgICAgICAgZmFzdCB0
ZXh0IGltcGxlbWVudGF0aW9uIGluc3RlYWQgb2YgdGhlIG9uZSBvZiBXZWJLaXQuCisKKyAgICAg
ICAgVGhlIFF0OjpUZXh0QnlwYXNzU2hhcGluZyBmbGFnIGlzIHVzZWQgdG8gdGVsbCBRdCB0bwor
ICAgICAgICBvbmx5IHVzZSB0aGUgZ2x5cGggYWR2YW5jZXMuCisKKyAgICAgICAgUXQgNC43IGlz
IG5lZWRlZCB0byBnZXQgdGhpcyBmbGFnIHRodXMgdGhlIGNvbXBsZXggcGF0aCBpcyBhbHdheXMK
KyAgICAgICAgdXNlZCBpZiBRdFdlYktpdCBpcyBjb21waWxlZCBhZ2FpbnN0IGFuIGVhcmxpZXIg
dmVyc2lvbi4KKworICAgICAgICBDb250cmFyeSB0byB0aGUgV2ViS2l0J3MgaW1wbGVtZW50YXRp
b24sIHRoZSBjb21wbGV4IGNvZGUgcGF0aAorICAgICAgICBpcyB0YWtlbiBpZiB0aGUgdGV4dCBp
cyBSaWdodFRvTGVmdCwganVzdGlmaWVkIG9yIGlzIGZvcm1hdHRlZAorICAgICAgICB3aXRoIG5v
bi16ZXJvIGxldHRlciBvciB3b3JkIHNwYWNpbmcuCisKKyAgICAgICAgKiB3dGYvUGxhdGZvcm0u
aDoKKwogMjAxMC0wNi0wNCAgSmVkcnplaiBOb3dhY2tpICA8amVkcnplai5ub3dhY2tpQG5va2lh
LmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5uZXRoIFJvaGRlIENocmlzdGlhbnNlbi4K
ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oIGIvSmF2YVNjcmlwdENv
cmUvd3RmL1BsYXRmb3JtLmgKaW5kZXggN2M1M2RjMi4uZTNlNDg3ZiAxMDA2NDQKLS0tIGEvSmF2
YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmgKKysrIGIvSmF2YVNjcmlwdENvcmUvd3RmL1BsYXRm
b3JtLmgKQEAgLTEwNDIsMTAgKzEwNDIsNiBAQCBvbiBNaW5HVy4gU2VlIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTI2OCAqLwogI2RlZmluZSBXVEZfVVNFX1FYTUxR
VUVSWSAxCiAjZW5kaWYKIAotI2lmICFQTEFURk9STShRVCkKLSNkZWZpbmUgV1RGX1VTRV9GT05U
X0ZBU1RfUEFUSCAxCi0jZW5kaWYKLQogLyogQWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgKi8KICNp
ZiBQTEFURk9STShNQUMpCiAjaWYgIWRlZmluZWQoQlVJTERJTkdfT05fVElHRVIpCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL0NoYW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDMyMzliZTcu
LmQxY2Q2YTkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsNDEgQEAKKzIwMTAtMDUtMzEgIEpvY2VseW4gVHVyY290dGUgIDxq
b2NlbHluLnR1cmNvdHRlQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbUXRdIEltcGxlbWVudCB0aGUgc2ltcGxlIHRleHQgY29kZSBw
YXRoLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDAw
NzcKKworICAgICAgICBSZW1vdmUgdGhlIEZPTlRfRkFTVF9QQVRIIG1hY3JvIGFuZCB1c2UgdGhl
IFF0J3MKKyAgICAgICAgZmFzdCB0ZXh0IGltcGxlbWVudGF0aW9uIGluc3RlYWQgb2YgdGhlIG9u
ZSBvZiBXZWJLaXQuCisKKyAgICAgICAgVGhlIFF0OjpUZXh0QnlwYXNzU2hhcGluZyBmbGFnIGlz
IHVzZWQgdG8gdGVsbCBRdCB0bworICAgICAgICBvbmx5IHVzZSB0aGUgZ2x5cGggYWR2YW5jZXMu
CisKKyAgICAgICAgUXQgNC43IGlzIG5lZWRlZCB0byBnZXQgdGhpcyBmbGFnIHRodXMgdGhlIGNv
bXBsZXggcGF0aCBpcyBhbHdheXMKKyAgICAgICAgdXNlZCBpZiBRdFdlYktpdCBpcyBjb21waWxl
ZCBhZ2FpbnN0IGFuIGVhcmxpZXIgdmVyc2lvbi4KKworICAgICAgICBDb250cmFyeSB0byB0aGUg
V2ViS2l0J3MgaW1wbGVtZW50YXRpb24sIHRoZSBjb21wbGV4IGNvZGUgcGF0aAorICAgICAgICBp
cyB0YWtlbiBpZiB0aGUgdGV4dCBpcyBSaWdodFRvTGVmdCwganVzdGlmaWVkIG9yIGlzIGZvcm1h
dHRlZAorICAgICAgICB3aXRoIG5vbi16ZXJvIGxldHRlciBvciB3b3JkIHNwYWNpbmcuCisKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnQ6OmRyYXdUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGgpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6c2VsZWN0aW9uUmVjdEZvclRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL0ZvbnQuaDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmlzUm91bmRpbmdIYWNrQ2hhcmFj
dGVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6ZnJvbVJhd0RhdGFXaXRob3V0UmVmKToKKyAgICAgICAgKFdlYkNvcmU6Om5l
ZWRDb21wbGV4Q29kZVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6c2V0dXBQbGF0Zm9ybUNvbnRl
eHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdTaW1wbGVUZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdDb21wbGV4VGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
OjpvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9u
dDo6c2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQpOgorCiAyMDEwLTA2LTAzICBKb2NlbHluIFR1
cmNvdHRlICA8am9jZWx5bi50dXJjb3R0ZUBub2tpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnQuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAppbmRleCA1ZGRj
Y2QxLi44NGQxMTE0IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQu
Y3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKQEAgLTM4LDcgKzM4
LDcgQEAgdXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
I2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKKyNpZiAhUExBVEZPUk0oUVQpCiBjb25zdCB1aW50OF90
IEZvbnQ6OmdSb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsyNTZdID0gewogICAgIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDEgLypcdCovLCAxIC8qXG4qLywgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAxIC8qc3Bh
Y2UqLywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSAvKi0qLywgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSAvKj8qLywKQEAg
LTE1MSwxMCArMTUxLDggQEAgdm9pZCBGb250OjpkcmF3VGV4dChHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2kKICAgICB9CiAjZW5kaWYK
IAotI2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKICAgICBpZiAoY29kZVBhdGgocnVuKSAhPSBDb21w
bGV4KQogICAgICAgICByZXR1cm4gZHJhd1NpbXBsZVRleHQoY29udGV4dCwgcnVuLCBwb2ludCwg
ZnJvbSwgdG8pOwotI2VuZGlmCiAKICAgICByZXR1cm4gZHJhd0NvbXBsZXhUZXh0KGNvbnRleHQs
IHJ1biwgcG9pbnQsIGZyb20sIHRvKTsKIH0KQEAgLTE2Niw3ICsxNjQsNiBAQCBmbG9hdCBGb250
OjpmbG9hdFdpZHRoKGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250
RGF0YSo+KiBmYWxsYgogICAgICAgICByZXR1cm4gZmxvYXRXaWR0aFVzaW5nU1ZHRm9udChydW4p
OwogI2VuZGlmCiAKLSNpZiBVU0UoRk9OVF9GQVNUX1BBVEgpCiAgICAgQ29kZVBhdGggY29kZVBh
dGhUb1VzZSA9IGNvZGVQYXRoKHJ1bik7CiAgICAgaWYgKGNvZGVQYXRoVG9Vc2UgIT0gQ29tcGxl
eCkgewogICAgICAgICAvLyBJZiB0aGUgY29tcGxleCB0ZXh0IGltcGxlbWVudGF0aW9uIGNhbm5v
dCByZXR1cm4gZmFsbGJhY2sgZm9udHMsIGF2b2lkCkBAIC0xNzQsNyArMTcxLDYgQEAgZmxvYXQg
Rm9udDo6ZmxvYXRXaWR0aChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxl
Rm9udERhdGEqPiogZmFsbGIKICAgICAgICAgc3RhdGljIGJvb2wgcmV0dXJuRmFsbGJhY2tGb250
cyA9IGNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpOwogICAgICAgICByZXR1
cm4gZmxvYXRXaWR0aEZvclNpbXBsZVRleHQocnVuLCAwLCByZXR1cm5GYWxsYmFja0ZvbnRzID8g
ZmFsbGJhY2tGb250cyA6IDAsIGNvZGVQYXRoVG9Vc2UgPT0gU2ltcGxlV2l0aEdseXBoT3ZlcmZs
b3cgPyBnbHlwaE92ZXJmbG93IDogMCk7CiAgICAgfQotI2VuZGlmCiAKICAgICByZXR1cm4gZmxv
YXRXaWR0aEZvckNvbXBsZXhUZXh0KHJ1biwgZmFsbGJhY2tGb250cywgZ2x5cGhPdmVyZmxvdyk7
CiB9CkBAIC0xOTEsMTAgKzE4Nyw4IEBAIGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGgoY29uc3QgVGV4
dFJ1biYgcnVuLCBpbnQgZXh0cmFDaGFyc0F2YWlsYWJsZSwgaW50JiBjaGFyc0NvCiAgICAgY2hh
cnNDb25zdW1lZCA9IHJ1bi5sZW5ndGgoKTsKICAgICBnbHlwaE5hbWUgPSAiIjsKIAotI2lmIFVT
RShGT05UX0ZBU1RfUEFUSCkKICAgICBpZiAoY29kZVBhdGgocnVuKSAhPSBDb21wbGV4KQogICAg
ICAgICByZXR1cm4gZmxvYXRXaWR0aEZvclNpbXBsZVRleHQocnVuLCAwKTsKLSNlbmRpZgogCiAg
ICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChydW4pOwogfQpAQCAtMjA4LDEwICsy
MDIsOCBAQCBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclRleHQoY29uc3QgVGV4dFJ1
biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsCiAKICAgICB0byA9ICh0byA9PSAtMSA/IHJ1
bi5sZW5ndGgoKSA6IHRvKTsKIAotI2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKICAgICBpZiAoY29k
ZVBhdGgocnVuKSAhPSBDb21wbGV4KQogICAgICAgICByZXR1cm4gc2VsZWN0aW9uUmVjdEZvclNp
bXBsZVRleHQocnVuLCBwb2ludCwgaCwgZnJvbSwgdG8pOwotI2VuZGlmCiAKICAgICByZXR1cm4g
c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KHJ1biwgcG9pbnQsIGgsIGZyb20sIHRvKTsKIH0K
QEAgLTIyMywxMCArMjE1LDggQEAgaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uKGNvbnN0IFRl
eHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMKICAgICAgICAgcmV0
dXJuIG9mZnNldEZvclBvc2l0aW9uRm9yVGV4dFVzaW5nU1ZHRm9udChydW4sIHgsIGluY2x1ZGVQ
YXJ0aWFsR2x5cGhzKTsKICNlbmRpZgogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQogICAgIGlm
IChjb2RlUGF0aChydW4pICE9IENvbXBsZXgpCiAgICAgICAgIHJldHVybiBvZmZzZXRGb3JQb3Np
dGlvbkZvclNpbXBsZVRleHQocnVuLCB4LCBpbmNsdWRlUGFydGlhbEdseXBocyk7Ci0jZW5kaWYK
IAogICAgIHJldHVybiBvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KHJ1biwgeCwgaW5j
bHVkZVBhcnRpYWxHbHlwaHMpOwogfQpAQCAtMjgzLDYgKzI3MywxMSBAQCBGb250OjpDb2RlUGF0
aCBGb250Ojpjb2RlUGF0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0CiAgICAgaWYgKHNfY29k
ZVBhdGggIT0gQXV0bykKICAgICAgICAgcmV0dXJuIHNfY29kZVBhdGg7CiAKKyNpZiBQTEFURk9S
TShRVCkKKyAgICBpZiAocnVuLnBhZGRpbmcoKSB8fCBydW4ucnRsKCkgfHwgaXNTbWFsbENhcHMo
KSB8fCB3b3JkU3BhY2luZygpIHx8IGxldHRlclNwYWNpbmcoKSkKKyAgICAgICAgcmV0dXJuIENv
bXBsZXg7CisjZW5kaWYKKwogICAgIC8vIFN0YXJ0IGZyb20gMCBzaW5jZSBkcmF3aW5nIGFuZCBo
aWdobGlnaHRpbmcgYWxzbyBtZWFzdXJlIHRoZSBjaGFyYWN0ZXJzIGJlZm9yZSBydW4tPmZyb20K
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgIGNv
bnN0IFVDaGFyIGMgPSBydW5baV07CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0ZvbnQuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCmluZGV4IDk3MjZj
MWIuLmZhOGRlOTAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5o
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCkBAIC0xNjIsNyArMTYyLDYg
QEAgcHJpdmF0ZToKICAgICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb25Gb3JUZXh0VXNpbmdTVkdGb250
KGNvbnN0IFRleHRSdW4mLCBpbnQgcG9zaXRpb24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMp
IGNvbnN0OwogI2VuZGlmCiAKLSNpZiBVU0UoRk9OVF9GQVNUX1BBVEgpCiAgICAgdm9pZCBkcmF3
U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBUZXh0UnVuJiwgY29uc3QgRmxvYXRQ
b2ludCYsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0OwogICAgIHZvaWQgZHJhd0dseXBocyhHcmFw
aGljc0NvbnRleHQqLCBjb25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0IEdseXBoQnVmZmVyJiwg
aW50IGZyb20sIGludCB0bywgY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0OwogICAgIHZvaWQgZHJh
d0dseXBoQnVmZmVyKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEdseXBoQnVmZmVyJiwgY29uc3Qg
VGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25zdDsKQEAgLTE3MSw3ICsxNzAsNiBAQCBw
cml2YXRlOgogICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0Rm9yU2ltcGxlVGV4dChjb25zdCBU
ZXh0UnVuJiwgY29uc3QgSW50UG9pbnQmLCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3Q7
CiAKICAgICBzdGF0aWMgYm9vbCBjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcGxleFRleHQo
KTsKLSNlbmRpZgogCiAgICAgQ29kZVBhdGggY29kZVBhdGgoY29uc3QgVGV4dFJ1biYpIGNvbnN0
OwogICAgIHZvaWQgZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IFRleHRS
dW4mLCBjb25zdCBGbG9hdFBvaW50JiwgaW50IGZyb20sIGludCB0bykgY29uc3Q7CkBAIC0xODcs
NyArMTg1LDcgQEAgcHVibGljOgogICAgIHN0YXRpYyBDb2RlUGF0aCBjb2RlUGF0aCgpOwogICAg
IHN0YXRpYyBDb2RlUGF0aCBzX2NvZGVQYXRoOwogCi0jaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQor
I2lmICFQTEFURk9STShRVCkKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBnUm91bmRpbmdIYWNr
Q2hhcmFjdGVyVGFibGVbMjU2XTsKICAgICBzdGF0aWMgYm9vbCBpc1JvdW5kaW5nSGFja0NoYXJh
Y3RlcihVQ2hhcjMyIGMpCiAgICAgewpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9Gb250UXQuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQu
Y3BwCmluZGV4IDIwMDk0MjQuLmRjOWU2MDYgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvRm9udFF0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0
L0ZvbnRRdC5jcHAKQEAgLTQ0LDExICs0NCwxNSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LXN0YXRpYyBjb25zdCBRU3RyaW5nIGZyb21SYXdEYXRhV2l0aG91dFJlZihjb25zdCBTdHJpbmcm
IHN0cmluZykKK3N0YXRpYyBjb25zdCBRU3RyaW5nIGZyb21SYXdEYXRhV2l0aG91dFJlZihjb25z
dCBTdHJpbmcmIHN0cmluZywgaW50IHN0YXJ0ID0gMCwgaW50IGxlbiA9IC0xKQogeworICAgIGlm
IChsZW4gPCAwKQorICAgICAgICBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSBzdGFydDsKKyAgICBR
X0FTU0VSVChzdGFydCArIGxlbiA8PSBzdHJpbmcubGVuZ3RoKCkpOworCiAgICAgLy8gV2UgZG9u
J3QgZGV0YWNoLiBUaGlzIGFzc3VtZXMgdGhlIFdlYkNvcmUgc3RyaW5nIGRhdGEgd2lsbCBzdGF5
IHZhbGlkIGZvciB0aGUKICAgICAvLyBsaWZldGltZSBvZiB0aGUgUVN0cmluZyB3ZSBwYXNzIGJh
Y2ssIHNpbmNlIHdlIGRvbid0IHJlZiB0aGUgV2ViQ29yZSBzdHJpbmcuCi0gICAgcmV0dXJuIFFT
dHJpbmc6OmZyb21SYXdEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihzdHJpbmcu
Y2hhcmFjdGVycygpKSwgc3RyaW5nLmxlbmd0aCgpKTsKKyAgICByZXR1cm4gUVN0cmluZzo6ZnJv
bVJhd0RhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCBRQ2hhcio+KHN0cmluZy5jaGFyYWN0ZXJz
KCkgKyBzdGFydCksIGxlbik7CiB9CiAKIHN0YXRpYyBRVGV4dExpbmUgc2V0dXBMYXlvdXQoUVRl
eHRMYXlvdXQqIGxheW91dCwgY29uc3QgVGV4dFJ1biYgc3R5bGUpCkBAIC02Niw3ICs3MCw3IEBA
IHN0YXRpYyBRVGV4dExpbmUgc2V0dXBMYXlvdXQoUVRleHRMYXlvdXQqIGxheW91dCwgY29uc3Qg
VGV4dFJ1biYgc3R5bGUpCiAgICAgcmV0dXJuIGxpbmU7CiB9CiAKLXZvaWQgRm9udDo6ZHJhd0Nv
bXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAorc3RhdGljIHZvaWQg
ZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8sIGNvbnN0IFFGb250JiBm
b250LCBib29sIGNvbXBsZXgpCiB7CiAgICAgaWYgKHRvIDwgMCkKICAgICAgICAgdG8gPSBydW4u
bGVuZ3RoKCk7CkBAIC0xMDIsNiArMTA2LDcgQEAgdm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQo
R3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXQKIAog
ICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5j
aGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJh
d0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisgICAgUVBvaW50RiBwdChwb2ludC54KCksIHBv
aW50LnkoKSk7CiAKICAgICAvLyB0ZXh0IHNoYWRvdwogICAgIEludFNpemUgc2hhZG93U2l6ZTsK
QEAgLTExMCw1MSArMTE1LDYyIEBAIHZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNz
Q29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0CiAgICAgYm9vbCBo
YXNTaGFkb3cgPSBjdHgtPnRleHREcmF3aW5nTW9kZSgpID09IGNUZXh0RmlsbCAmJiBjdHgtPmdl
dFNoYWRvdyhzaGFkb3dTaXplLCBzaGFkb3dCbHVyLCBzaGFkb3dDb2xvcik7CiAKICAgICBpZiAo
ZnJvbSA+IDAgfHwgdG8gPCBydW4ubGVuZ3RoKCkpIHsKLSAgICAgICAgUVRleHRMYXlvdXQgbGF5
b3V0KHN0cmluZywgZm9udCgpKTsKLSAgICAgICAgUVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91
dCgmbGF5b3V0LCBydW4pOwotICAgICAgICBmbG9hdCB4MSA9IGxpbmUuY3Vyc29yVG9YKGZyb20p
OwotICAgICAgICBmbG9hdCB4MiA9IGxpbmUuY3Vyc29yVG9YKHRvKTsKLSAgICAgICAgaWYgKHgy
IDwgeDEpCi0gICAgICAgICAgICBxU3dhcCh4MSwgeDIpOwotCi0gICAgICAgIFFGb250TWV0cmlj
cyBmbShmb250KCkpOwotICAgICAgICBpbnQgYXNjZW50ID0gZm0uYXNjZW50KCk7Ci0gICAgICAg
IFFSZWN0RiBjbGlwKHBvaW50LngoKSArIHgxLCBwb2ludC55KCkgLSBhc2NlbnQsIHgyIC0geDEs
IGZtLmhlaWdodCgpKTsKLQotICAgICAgICBpZiAoaGFzU2hhZG93KSB7Ci0gICAgICAgICAgICAv
LyBUT0RPOiB3aGVuIGJsdXIgc3VwcG9ydCBpcyBhZGRlZCwgdGhlIGNsaXAgd2lsbCBuZWVkIHRv
IGFjY291bnQKLSAgICAgICAgICAgIC8vIGZvciB0aGUgYmx1ciByYWRpdXMKLSAgICAgICAgICAg
IHFyZWFsIGR4MSA9IDAsIGR4MiA9IDAsIGR5MSA9IDAsIGR5MiA9IDA7Ci0gICAgICAgICAgICBp
ZiAoc2hhZG93U2l6ZS53aWR0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBkeDIgPSBzaGFkb3dT
aXplLndpZHRoKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZHgxID0gLXNo
YWRvd1NpemUud2lkdGgoKTsKLSAgICAgICAgICAgIGlmIChzaGFkb3dTaXplLmhlaWdodCgpID4g
MCkKLSAgICAgICAgICAgICAgICBkeTIgPSBzaGFkb3dTaXplLmhlaWdodCgpOwotICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIGR5MSA9IC1zaGFkb3dTaXplLmhlaWdodCgpOwotICAg
ICAgICAgICAgLy8gZXhwYW5kIHRoZSBjbGlwIHJlY3QgdG8gaW5jbHVkZSB0aGUgdGV4dCBzaGFk
b3cgYXMgd2VsbAotICAgICAgICAgICAgY2xpcC5hZGp1c3QoZHgxLCBkeDIsIGR5MSwgZHkyKTsK
LSAgICAgICAgfQotICAgICAgICBwLT5zYXZlKCk7Ci0gICAgICAgIHAtPnNldENsaXBSZWN0KGNs
aXAudG9SZWN0KCksIFF0OjpJbnRlcnNlY3RDbGlwKTsKLSAgICAgICAgUVBvaW50RiBwdChwb2lu
dC54KCksIHBvaW50LnkoKSAtIGFzY2VudCk7Ci0gICAgICAgIGlmIChoYXNTaGFkb3cpIHsKKyAg
ICAgICAgaWYgKGNvbXBsZXgpIHsKKyAgICAgICAgICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJp
bmcsIGZvbnQpOworICAgICAgICAgICAgUVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5
b3V0LCBydW4pOworICAgICAgICAgICAgZmxvYXQgeDEgPSBsaW5lLmN1cnNvclRvWChmcm9tKTsK
KyAgICAgICAgICAgIGZsb2F0IHgyID0gbGluZS5jdXJzb3JUb1godG8pOworICAgICAgICAgICAg
aWYgKHgyIDwgeDEpCisgICAgICAgICAgICAgICAgcVN3YXAoeDEsIHgyKTsKKworICAgICAgICAg
ICAgUUZvbnRNZXRyaWNzIGZtKGZvbnQpOworICAgICAgICAgICAgaW50IGFzY2VudCA9IGZtLmFz
Y2VudCgpOworICAgICAgICAgICAgUVJlY3RGIGNsaXAocG9pbnQueCgpICsgeDEsIHBvaW50Lnko
KSAtIGFzY2VudCwgeDIgLSB4MSwgZm0uaGVpZ2h0KCkpOworCisgICAgICAgICAgICBpZiAoaGFz
U2hhZG93KSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogd2hlbiBibHVyIHN1cHBvcnQgaXMg
YWRkZWQsIHRoZSBjbGlwIHdpbGwgbmVlZCB0byBhY2NvdW50CisgICAgICAgICAgICAgICAgLy8g
Zm9yIHRoZSBibHVyIHJhZGl1cworICAgICAgICAgICAgICAgIHFyZWFsIGR4MSA9IDAsIGR4MiA9
IDAsIGR5MSA9IDAsIGR5MiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNoYWRvd1NpemUud2lk
dGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGR4MiA9IHNoYWRvd1NpemUud2lkdGgoKTsK
KyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGR4MSA9IC1zaGFkb3dT
aXplLndpZHRoKCk7CisgICAgICAgICAgICAgICAgaWYgKHNoYWRvd1NpemUuaGVpZ2h0KCkgPiAw
KQorICAgICAgICAgICAgICAgICAgICBkeTIgPSBzaGFkb3dTaXplLmhlaWdodCgpOworICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZHkxID0gLXNoYWRvd1NpemUuaGVp
Z2h0KCk7CisgICAgICAgICAgICAgICAgLy8gZXhwYW5kIHRoZSBjbGlwIHJlY3QgdG8gaW5jbHVk
ZSB0aGUgdGV4dCBzaGFkb3cgYXMgd2VsbAorICAgICAgICAgICAgICAgIGNsaXAuYWRqdXN0KGR4
MSwgZHgyLCBkeTEsIGR5Mik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwLT5zYXZlKCk7
Ci0gICAgICAgICAgICBwLT5zZXRQZW4oUUNvbG9yKHNoYWRvd0NvbG9yKSk7Ci0gICAgICAgICAg
ICBwLT50cmFuc2xhdGUoc2hhZG93U2l6ZS53aWR0aCgpLCBzaGFkb3dTaXplLmhlaWdodCgpKTsK
KyAgICAgICAgICAgIHAtPnNldENsaXBSZWN0KGNsaXAudG9SZWN0KCksIFF0OjpJbnRlcnNlY3RD
bGlwKTsKKyAgICAgICAgICAgIHB0LnNldFkocHQueSgpIC0gYXNjZW50KTsKKyAgICAgICAgICAg
IGlmIChoYXNTaGFkb3cpIHsKKyAgICAgICAgICAgICAgICBwLT5zYXZlKCk7CisgICAgICAgICAg
ICAgICAgcC0+c2V0UGVuKFFDb2xvcihzaGFkb3dDb2xvcikpOworICAgICAgICAgICAgICAgIHAt
PnRyYW5zbGF0ZShzaGFkb3dTaXplLndpZHRoKCksIHNoYWRvd1NpemUuaGVpZ2h0KCkpOworICAg
ICAgICAgICAgICAgIGxpbmUuZHJhdyhwLCBwdCk7CisgICAgICAgICAgICAgICAgcC0+cmVzdG9y
ZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbGluZS5kcmF3KHAsIHB0KTsKICAgICAg
ICAgICAgIHAtPnJlc3RvcmUoKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAg
ICAgICBsaW5lLmRyYXcocCwgcHQpOwotICAgICAgICBwLT5yZXN0b3JlKCk7Ci0gICAgICAgIHJl
dHVybjsKKyNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNywgMCkKKyAgICAg
ICAgaW50IHNraXBXaWR0aCA9IFFGb250TWV0cmljcyhmb250KS53aWR0aChzdHJpbmcsIGZyb20s
IFF0OjpUZXh0QnlwYXNzU2hhcGluZyk7CisgICAgICAgIHB0LnNldFgocHQueCgpICsgc2tpcFdp
ZHRoKTsKKyAgICAgICAgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCwg
ZnJvbSwgdG8gLSBmcm9tKTsKKyNlbmRpZgogICAgIH0KIAotICAgIHAtPnNldEZvbnQoZm9udCgp
KTsKKyAgICBwLT5zZXRGb250KGZvbnQpOwogCi0gICAgUVBvaW50RiBwdChwb2ludC54KCksIHBv
aW50LnkoKSk7CiAgICAgaW50IGZsYWdzID0gcnVuLnJ0bCgpID8gUXQ6OlRleHRGb3JjZVJpZ2h0
VG9MZWZ0IDogUXQ6OlRleHRGb3JjZUxlZnRUb1JpZ2h0OworI2lmIFFUX1ZFUlNJT04gPj0gUVRf
VkVSU0lPTl9DSEVDSyg0LCA3LCAwKQorICAgIC8vIFNlZSBRV2ViUGFnZVByaXZhdGU6OlFXZWJQ
YWdlUHJpdmF0ZSgpIHdoZXJlIHRoZSBkZWZhdWx0IHBhdGggaXMgc2V0IHRvIENvbXBsZXggZm9y
IFF0IDQuNiBhbmQgZWFybGllci4KKyAgICBpZiAoIWNvbXBsZXgpCisgICAgICAgIGZsYWdzIHw9
IFF0OjpUZXh0QnlwYXNzU2hhcGluZzsKKyNlbmRpZgogICAgIGlmIChoYXNTaGFkb3cpIHsKICAg
ICAgICAgLy8gVE9ETzogdGV4dCBzaGFkb3cgYmx1ciBzdXBwb3J0CiAgICAgICAgIHAtPnNhdmUo
KTsKQEAgLTE2NSw3ICsxODEsNyBAQCB2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGlj
c0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdAogICAgIH0KICAg
ICBpZiAoY3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIGNUZXh0U3Ryb2tlKSB7CiAgICAgICAgIFFQ
YWludGVyUGF0aCBwYXRoOwotICAgICAgICBwYXRoLmFkZFRleHQocHQsIGZvbnQoKSwgc3RyaW5n
KTsKKyAgICAgICAgcGF0aC5hZGRUZXh0KHB0LCBmb250LCBzdHJpbmcpOwogICAgICAgICBwLT5z
ZXRQZW4odGV4dFN0cm9rZVBlbik7CiAgICAgICAgIHAtPnN0cm9rZVBhdGgocGF0aCwgcC0+cGVu
KCkpOwogICAgIH0KQEAgLTE3NSw2ICsxOTEsNDIgQEAgdm9pZCBGb250OjpkcmF3Q29tcGxleFRl
eHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXQK
ICAgICB9CiB9CiAKK3ZvaWQgRm9udDo6ZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250ZXh0KiBj
dHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9t
LCBpbnQgdG8pIGNvbnN0Cit7CisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQs
IDcsIDApCisgICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0bywgZm9u
dCgpLCBmYWxzZSk7CisjZWxzZQorICAgIFFfQVNTRVJUKGZhbHNlKTsKKyNlbmRpZgorfQorCit2
b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29u
c3QKK3sKKyAgICBkcmF3VGV4dENvbW1vbihjdHgsIHJ1biwgcG9pbnQsIGZyb20sIHRvLCBmb250
KCksIHRydWUpOworfQorCitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25z
dCBUZXh0UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBT
aW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJm
bG93KSBjb25zdAoreworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAw
KQorICAgIGlmICghcnVuLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFN0cmlu
ZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5jaGFyYWN0ZXJz
KCksIHJ1bi5sZW5ndGgoKSkpOworICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRo
b3V0UmVmKHNhbml0aXplZCk7CisKKyAgICBpbnQgdyA9IFFGb250TWV0cmljcyhmb250KCkpLndp
ZHRoKHN0cmluZywgLTEsIFF0OjpUZXh0QnlwYXNzU2hhcGluZyk7CisKKyAgICAvLyBXZWJLaXQg
ZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIg
KGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQorICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBd
KSkKKyAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5nOworCisgICAgcmV0dXJuIHcgKyBydW4ucGFk
ZGluZygpOworI2Vsc2UKKyAgICBRX0FTU0VSVChmYWxzZSk7CisgICAgcmV0dXJuIDAuMGY7Cisj
ZW5kaWYKK30KKwogZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRl
eHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVyZmxv
dyopIGNvbnN0CiB7CiAgICAgaWYgKCFydW4ubGVuZ3RoKCkpCkBAIC0xOTQsNiArMjQ2LDM0IEBA
IGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9uCiAgICAgcmV0dXJuIHcgKyBydW4ucGFkZGluZygpOwog
fQogCitpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1biwgaW50IHBvc2l0aW9uLCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAor
eworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQorICAgIFN0cmlu
ZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5jaGFyYWN0ZXJz
KCksIHJ1bi5sZW5ndGgoKSkpOworICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRo
b3V0UmVmKHNhbml0aXplZCk7CisKKyAgICBRRm9udE1ldHJpY3MgZm0oZm9udCgpKTsKKyAgICBm
bG9hdCBkZWx0YSA9IChmbG9hdClwb3NpdGlvbjsKKyAgICBpbnQgY3VyUG9zID0gMDsKKyAgICBk
byB7CisgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IGZtLndpZHRoKHN0cmluZ1tjdXJQb3NdKTsK
KyAgICAgICAgZGVsdGEgLT0gY2hhcldpZHRoOworICAgICAgICBpZiAoaW5jbHVkZVBhcnRpYWxH
bHlwaHMpIHsKKyAgICAgICAgICAgIGlmIChkZWx0YSArIGNoYXJXaWR0aCAvIDIgPD0gMCkKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChk
ZWx0YSArIGNoYXJXaWR0aCA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgfSB3aGlsZSAoKytjdXJQb3MgPCBzdHJpbmcuc2l6ZSgpKTsKKworICAgIHJldHVybiBj
dXJQb3M7CisjZWxzZQorICAgIFFfQVNTRVJUKGZhbHNlKTsKKyAgICByZXR1cm4gMDsKKyNlbmRp
ZgorfQorCiBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBU
ZXh0UnVuJiBydW4sIGludCBwb3NpdGlvbiwgYm9vbCkgY29uc3QKIHsKICAgICBTdHJpbmcgc2Fu
aXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hhcmFjdGVycygpLCBy
dW4ubGVuZ3RoKCkpKTsKQEAgLTIwNCw2ICsyODQsMjMgQEAgaW50IEZvbnQ6Om9mZnNldEZvclBv
c2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgcG9zaXRpb24sIGJv
b2wKICAgICByZXR1cm4gbGluZS54VG9DdXJzb3IocG9zaXRpb24pOwogfQogCitGbG9hdFJlY3Qg
Rm9udDo6c2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBJbnRQb2ludCYgcHQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworI2lmIFFU
X1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQorICAgIFN0cmluZyBzYW5pdGl6
ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5s
ZW5ndGgoKSkpOworICAgIFFTdHJpbmcgd2hvbGVUZXh0ID0gZnJvbVJhd0RhdGFXaXRob3V0UmVm
KHNhbml0aXplZCk7CisgICAgUVN0cmluZyBzZWxlY3RlZFRleHQgPSBmcm9tUmF3RGF0YVdpdGhv
dXRSZWYoc2FuaXRpemVkLCBmcm9tLCB0byAtIGZyb20pOworCisgICAgaW50IHN0YXJ0WCA9IFFG
b250TWV0cmljcyhmb250KCkpLndpZHRoKHdob2xlVGV4dCwgZnJvbSwgUXQ6OlRleHRCeXBhc3NT
aGFwaW5nKTsKKyAgICBpbnQgd2lkdGggPSBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzZWxl
Y3RlZFRleHQsIC0xLCBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcpOworCisgICAgcmV0dXJuIEZsb2F0
UmVjdChwdC54KCkgKyBzdGFydFgsIHB0LnkoKSwgd2lkdGgsIGgpOworI2Vsc2UKKyAgICBRX0FT
U0VSVChmYWxzZSk7CisgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworI2VuZGlmCit9CisKIEZsb2F0
UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVu
LCBjb25zdCBJbnRQb2ludCYgcHQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewog
ICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5j
aGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSkpOwpAQCAtMjIwLDYgKzMxNywxMSBAQCBGbG9hdFJl
Y3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgSW50UG9pbnQmCiAgICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4MSwgcHQueSgp
LCB4MiAtIHgxLCBoKTsKIH0KIAorYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9y
Q29tcGxleFRleHQoKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKwogUUZvbnQgRm9udDo6Zm9u
dCgpIGNvbnN0CiB7CiAgICAgUUZvbnQgZiA9IHByaW1hcnlGb250KCktPmdldFF0Rm9udCgpOwpk
aWZmIC0tZ2l0IGEvV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAgYi9XZWJLaXQvcXQvQXBpL3F3
ZWJwYWdlLmNwcAppbmRleCA4MGRkNjY0Li4xZjhmYmM5IDEwMDY0NAotLS0gYS9XZWJLaXQvcXQv
QXBpL3F3ZWJwYWdlLmNwcAorKysgYi9XZWJLaXQvcXQvQXBpL3F3ZWJwYWdlLmNwcApAQCAtMjY3
LDYgKzI2Nyw5IEBAIFFXZWJQYWdlUHJpdmF0ZTo6UVdlYlBhZ2VQcml2YXRlKFFXZWJQYWdlICpx
cSkKICAgICBKU0M6OmluaXRpYWxpemVUaHJlYWRpbmcoKTsKICAgICBXVEY6OmluaXRpYWxpemVN
YWluVGhyZWFkKCk7CiAgICAgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW46OnNldExvY2FsTG9hZFBv
bGljeShXZWJDb3JlOjpTZWN1cml0eU9yaWdpbjo6QWxsb3dMb2NhbExvYWRzRm9yTG9jYWxBbmRT
dWJzdGl0dXRlRGF0YSk7CisjaWYgUVRfVkVSU0lPTiA8IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNywg
MCkKKyAgICBGb250OjpzZXRDb2RlUGF0aChGb250OjpDb21wbGV4KTsKKyNlbmRpZgogCiAgICAg
Y2hyb21lQ2xpZW50ID0gbmV3IENocm9tZUNsaWVudFF0KHEpOwogICAgIGNvbnRleHRNZW51Q2xp
ZW50ID0gbmV3IENvbnRleHRNZW51Q2xpZW50UXQoKTsKZGlmZiAtLWdpdCBhL1dlYktpdC9xdC9D
aGFuZ2VMb2cgYi9XZWJLaXQvcXQvQ2hhbmdlTG9nCmluZGV4IDJlMWVmN2UuLmMyYjdmODAgMTAw
NjQ0Ci0tLSBhL1dlYktpdC9xdC9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0L3F0L0NoYW5nZUxvZwpA
QCAtMSwzICsxLDI2IEBACisyMDEwLTA1LTMxICBKb2NlbHluIFR1cmNvdHRlICA8am9jZWx5bi50
dXJjb3R0ZUBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgW1F0XSBJbXBsZW1lbnQgdGhlIHNpbXBsZSB0ZXh0IGNvZGUgcGF0aC4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwMDc3CisKKyAg
ICAgICAgUmVtb3ZlIHRoZSBGT05UX0ZBU1RfUEFUSCBtYWNybyBhbmQgdXNlIHRoZSBRdCdzCisg
ICAgICAgIGZhc3QgdGV4dCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkIG9mIHRoZSBvbmUgb2YgV2Vi
S2l0LgorCisgICAgICAgIFRoZSBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcgZmxhZyBpcyB1c2VkIHRv
IHRlbGwgUXQgdG8KKyAgICAgICAgb25seSB1c2UgdGhlIGdseXBoIGFkdmFuY2VzLgorCisgICAg
ICAgIFF0IDQuNyBpcyBuZWVkZWQgdG8gZ2V0IHRoaXMgZmxhZyB0aHVzIHRoZSBjb21wbGV4IHBh
dGggaXMgYWx3YXlzCisgICAgICAgIHVzZWQgaWYgUXRXZWJLaXQgaXMgY29tcGlsZWQgYWdhaW5z
dCBhbiBlYXJsaWVyIHZlcnNpb24uCisKKyAgICAgICAgQ29udHJhcnkgdG8gdGhlIFdlYktpdCdz
IGltcGxlbWVudGF0aW9uLCB0aGUgY29tcGxleCBjb2RlIHBhdGgKKyAgICAgICAgaXMgdGFrZW4g
aWYgdGhlIHRleHQgaXMgUmlnaHRUb0xlZnQsIGp1c3RpZmllZCBvciBpcyBmb3JtYXR0ZWQKKyAg
ICAgICAgd2l0aCBub24temVybyBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nLgorCisgICAgICAgICog
QXBpL3F3ZWJwYWdlLmNwcDoKKyAgICAgICAgKFFXZWJQYWdlUHJpdmF0ZTo6UVdlYlBhZ2VQcml2
YXRlKToKKwogMjAxMC0wNi0wMyAgWWFlbCBBaGFyb24gIDx5YWVsLmFoYXJvbkBub2tpYS5jb20+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTGFzemxvIEdvbWJvcy4K
</data>

          </attachment>
      

    </bug>

</bugzilla>