<?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>61875</bug_id>
          
          <creation_ts>2011-06-01 11:46:57 -0700</creation_ts>
          <short_desc>Fonts returned by FontCache::getFontDataForCharacters() are never released</short_desc>
          <delta_ts>2011-06-09 00:08:36 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>ap</cc>
    
    <cc>ddkilzer</cc>
    
    <cc>fishd</cc>
    
    <cc>ggaren</cc>
    
    <cc>hyatt</cc>
    
    <cc>jamesr</cc>
    
    <cc>mitz</cc>
    
    <cc>psolanki</cc>
    
    <cc>rniwa</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>413555</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-01 11:46:57 -0700</bug_when>
    <thetext>From FontCache.h:

    // This method is implemented by the platform.
    // FIXME: Font data returned by this method never go inactive because callers don&apos;t track and release them.
    const SimpleFontData* getFontDataForCharacters(const Font&amp;, const UChar* characters, int length);

The fonts returned by this method are used as system fall back fonts in the glyph page tree and are not properly cleaned up. In fact, fonts returned via this method never have their reference counts go down.  Therefore these fonts cannot be released and purged.

The issue isn&apos;t the method, but the caller of the method, currently there is only one, Font::glyphDataForCharacter in FontFastPath.cpp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413568</commentid>
    <comment_count>1</comment_count>
      <attachid>95641</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-01 12:22:12 -0700</bug_when>
    <thetext>Created attachment 95641
Proposed patch

This patch adds cleanup code for system fall back fonts.  It also provides an auto release object to wrap around accesses to fonts via the FontCache::getFontDataForCharacters() method.  When that object is destructed, it calls FontCache::releaseFontData with the appropriate reference count.

The assureOneHold code is needed for the case where a view uses a system fallback font that was brought into the glyph page trees via another prior and currently open view.  The second view would still have one reference, even if the first view closed dereferenced the font.  This makes it so that every using view has at least one reference on a system fallback font that it uses.

NOTE: This patch does not add the appropriate code to platforms other than Mac to keep track of the number of references via those platform&apos;s FontCache::getFontDataForCharacters method.  That code will be added in a subsequent patch.

An alternative approach to this problem has been considered and that is using RefPtr&lt;FontData&gt; for most accesses to font data. The exception is the glyph page node tree, since that tree is purged of references when via the SimpleFontData destructor.  FontData returned from the glyph page tree code would need to increment the returned font&apos;s reference count.

This patch allows for almost all fonts to be released when all views are closed.  The only active fonts are those used by the rest of the application.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413573</commentid>
    <comment_count>2</comment_count>
      <attachid>95641</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2011-06-01 12:30:27 -0700</bug_when>
    <thetext>Comment on attachment 95641
Proposed patch

View in context: https://bugs.webkit.org/attachment.cgi?id=95641&amp;action=review

&gt; Source/WebCore/page/FrameView.cpp:118
&gt; +    , m_fontCacheAutoRelease(new FontCacheAutoRelease)

OwnPtr!

&gt; Source/WebCore/page/FrameView.cpp:204
&gt; +    delete m_fontCacheAutoRelease;

OwnPtr!

&gt; Source/WebCore/page/FrameView.h:367
&gt; +    FontCacheAutoRelease* m_fontCacheAutoRelease;

Can&apos;t this be an OwnPtr?

&gt; Source/WebCore/platform/mac/MemoryPressureHandlerMac.mm:73
&gt; +//#ifndef NDEBUG

I assume you didn&apos;t mean to leave this commented out.

&gt; Source/WebCore/platform/mac/MemoryPressureHandlerMac.mm:85
&gt; +//#endif

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413580</commentid>
    <comment_count>3</comment_count>
      <attachid>95641</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-06-01 12:32:33 -0700</bug_when>
    <thetext>Comment on attachment 95641
Proposed patch

View in context: https://bugs.webkit.org/attachment.cgi?id=95641&amp;action=review

&gt; Source/WebCore/platform/graphics/FontCache.cpp:303
&gt; +    if (m_autoReleaseStack.size() &gt; 0) {
&gt; +        FontCacheAutoRelease* fontCacheAutoRelease = m_autoReleaseStack.last();
&gt; +        if (!fontCacheAutoRelease-&gt;isReferenced(fontData)) {
&gt; +            FontDataCache::iterator cacheEntry = gFontDataCache-&gt;find(fontData-&gt;platformData());
&gt; +            ASSERT(cacheEntry != gFontDataCache-&gt;end());
&gt; +            cacheEntry.get()-&gt;second.second++;
&gt; +            fontCacheAutoRelease-&gt;addFontDataToRelease(fontData);
&gt; +        }
&gt; +    }
&gt; +}
&gt; +

Early returns would be nicer than all this nesting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413585</commentid>
    <comment_count>4</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2011-06-01 12:33:10 -0700</bug_when>
    <thetext>As for approach, I would certainly favor moving to a reference counted model *if* it doesn&apos;t wreck performance to do so.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413601</commentid>
    <comment_count>5</comment_count>
      <attachid>95641</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-06-01 13:01:38 -0700</bug_when>
    <thetext>Comment on attachment 95641
Proposed patch

View in context: https://bugs.webkit.org/attachment.cgi?id=95641&amp;action=review

You mentioned that RefPtr&lt;FontData&gt; was considered. Why was it rejected? I think it was rejected because of performance concerns about refcount thrash. But isn&apos;t four hash lookups per font reference more expensive?

&gt; Source/WebCore/page/FrameView.cpp:204
&gt; +    delete m_fontCacheAutoRelease;

Please use OwnPtr instead, so we can verify by code inspection that ownership is correct.

&gt; Source/WebCore/page/FrameView.cpp:2481
&gt; +    m_fontCacheAutoRelease-&gt;pop();

I don&apos;t know how to verify by code inspection that you have pushes and pops in the right places.

Should assureOneHold or some similar function ASSERT that there is an autorelease pool on the stack?

&gt; Source/WebCore/platform/graphics/FontCache.cpp:410
&gt; +    (void)fontCache()-&gt;popAutoRelease();

No need for (void) here.

&gt; Source/WebCore/platform/graphics/FontCache.cpp:432
&gt; +    m_referencedFontDataMap.set(fontData, refCount);

You can reuse the iterator to avoid an extra hash lookup here.

&gt; Source/WebCore/platform/graphics/FontCache.h:62
&gt; +    FontCacheAutoRelease(bool autoPushPop = false);

Does anybody ever use the autoPushPop flag?

&gt; Source/WebCore/platform/graphics/FontFastPath.cpp:82
&gt; +                if (node-&gt;isSystemFallback() &amp;&amp; data.fontData)
&gt; +                    fontCache()-&gt;assureOneHold(data.fontData);

It&apos;s not really clear why assureOneHold should only be called on system fallback fonts. Maybe you can move the check for system fallback fonts inside assureOneHold, and add a comment there explaining why only system fallback fonts are considered.

&gt; Source/WebCore/platform/mac/MemoryPressureHandlerMac.mm:76
&gt; +//#ifndef NDEBUG
&gt;      if (!_cache_event_source2) {
&gt;          dispatch_async(dispatch_get_main_queue(), ^{
&gt;              _cache_event_source2 = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGUSR2, 0, dispatch_get_main_queue());

Did you mean to include this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413719</commentid>
    <comment_count>6</comment_count>
      <attachid>95679</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-01 15:50:56 -0700</bug_when>
    <thetext>Created attachment 95679
Patch with changes to address comments

Made changes to address most of the comments.

Added speculative changes to FontCache::getFontDataForCharacters for other platforms.

I did reduce the number of hash lookups in the FontCache::assureOneHold case by keeping the top of m_autoReleaseStack value.  

Concerning the comments and questions about moving to a reference counting algorithm. That is my desire as well, but I have some lingering concerns due to performance.  I instrumented the current code to compare the calls to FontCache::assureOneHold, which only happen for system fallback fonts, with the likely number of ref() calls in a reference counting implementation.  On one memory tests, the ratio was ~13 likely ref() calls to 1 assureOneHold call.  For english only web pages, there were 0 or very few FontCache::assureOneHold calls and thousands to tens of thousands of likely ref() calls.

I will be modifying this patch to replace the reference counting currently implemented in the FontCache class with RefPtr&lt;FontData&gt; for the holders of font data down stream of the glyph page node tree.  I will then compare this patch&apos;s performance to the reference counting version.  If the reference counting version performs the same or better than this patch, I will post it for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>413863</commentid>
    <comment_count>7</comment_count>
      <attachid>95679</attachid>
    <who name="">mitz</who>
    <bug_when>2011-06-01 20:17:39 -0700</bug_when>
    <thetext>Comment on attachment 95679
Patch with changes to address comments

View in context: https://bugs.webkit.org/attachment.cgi?id=95679&amp;action=review

This looks very good! Here are some low-level comments. It would have been easier to review the patch if it included function-level comments in the change log. I would like to see those still. I am going to add some comments on naming and maybe some higher-level notes.

&gt; Source/WebCore/ChangeLog:64
&gt; +        * platform/graphics/chromium/FontCacheChromiumWin.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/freetype/FontCacheFreeType.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/haiku/FontCacheHaiku.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/mac/FontCacheMac.mm:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/qt/FontCacheQt.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/win/FontCacheWin.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/wince/FontCacheWinCE.cpp:
&gt; +        * platform/graphics/wx/FontCacheWx.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):

All of these platform-specific implementations of getFontDataForCharacters() were changes in the exact same platform-agnostic way. A better way to make this change would have been:
1. Declare a new private member function in FontCache called platformGetFontDataForCharacters()
2. Rename all of the platform-specific implementations of getFontDataForCharacters to platformGetFontDataForCharacters
3. Implement getFontDataForCharacters in FontCache.cpp which calls the platform-specific function, then does the platform-agnostic part.

&gt; Source/WebCore/page/FrameView.cpp:118
&gt; +    , m_fontCacheAutoRelease(adoptPtr(new FontCacheAutoRelease))

Is there a reason to allocate this object separately? Its lifetime seems to coincide with that of the FrameView.

&gt; Source/WebCore/page/FrameView.h:41
&gt; +class FontCacheAutoRelease;

Maybe that’s the reason: not wanting to include another header here :)

&gt; Source/WebCore/platform/graphics/FontCache.cpp:385
&gt; +FontCacheAutoRelease::FontCacheAutoRelease()
&gt; +{
&gt; +}
&gt; +

I think there’s not need to write a default constructor. The compiler generates one on its own.

&gt; Source/WebCore/platform/graphics/FontCache.cpp:398
&gt; +#ifndef NDEBUG

This should be #if !ASSERT_DISABLED

&gt; Source/WebCore/platform/graphics/FontCache.cpp:411
&gt; +    ReferencedFontDataMap::iterator mapIt = m_referencedFontDataMap.begin();
&gt; +
&gt; +    for (; mapIt != mapEnd; ++mapIt)

The convention is to declare the loop variable in side the for statement, and call it “it”.

&gt; Source/WebCore/platform/graphics/FontCache.cpp:425
&gt; +    ReferencedFontDataMap::iterator result = m_referencedFontDataMap.find(fontData);
&gt; +    if (result != m_referencedFontDataMap.end()) {
&gt; +        ++result-&gt;second;
&gt; +        return;
&gt; +    }
&gt; +
&gt; +    m_referencedFontDataMap.set(fontData, 1);

find() and set() entail two hash table lookups. A more efficient idiom is to use a single add() and check the boolean member of the result, which tells you if you got a new entry or an existing one.

&gt; Source/WebCore/platform/graphics/GlyphPageTreeNode.cpp:380
&gt; +    // Prune fall back child (if any) of this font.
&gt; +    if (m_systemFallbackChild &amp;&amp; m_systemFallbackChild-&gt;m_page)
&gt; +        m_systemFallbackChild-&gt;m_page-&gt;clearForFontData(fontData);
&gt; +

I am worried that the stopping condition further down in this function (level &gt; fontData-&gt;maxGlyphPageTreeLevel()) isn’t accounting for system fallback pages, i.e. maxGlyphPageTreeLevel() is not set when a fontData is used in a fallback page. Am I wrong?

&gt; Source/WebCore/platform/graphics/SimpleFontData.cpp:225
&gt; +void SimpleFontData::DerivedFontData::pruneFromGlyphPageTree()
&gt; +{
&gt; +    if (!forCustomFont) {
&gt; +        if (smallCaps)
&gt; +            GlyphPageTreeNode::pruneTreeFontData(smallCaps.get());
&gt; +        if (emphasisMark)
&gt; +            GlyphPageTreeNode::pruneTreeFontData(emphasisMark.get());
&gt; +        if (brokenIdeograph)
&gt; +            GlyphPageTreeNode::pruneTreeFontData(brokenIdeograph.get());
&gt; +        if (verticalRightOrientation)
&gt; +            GlyphPageTreeNode::pruneTreeFontData(verticalRightOrientation.get());
&gt; +        if (uprightOrientation)
&gt; +            GlyphPageTreeNode::pruneTreeFontData(uprightOrientation.get());
&gt; +
&gt;          return;
&gt; +    }

I don’t understand this part.

&gt; Source/WebCore/platform/mac/MemoryPressureHandlerMac.mm:101
&gt; +    fontCache()-&gt;purgeInactiveFontData();
&gt; +

I think this change is not an integral part of fixing this bug. It should go in a separate patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>414137</commentid>
    <comment_count>8</comment_count>
      <attachid>95679</attachid>
    <who name="">mitz</who>
    <bug_when>2011-06-02 08:27:44 -0700</bug_when>
    <thetext>Comment on attachment 95679
Patch with changes to address comments

While the general approach of this patch is good, I have two ideas for simplifying it. The first idea is: avoid multiple nested autorelease pools. In your design, nested pools correspond to nested frame. The theoretical advantage of nested pools over a single pool at the top-level frame is that it allows you to release fonts that are used only by a subframe before you exit the layout or paint operation for the parent frame. I think this advantage is purely theoretical, since the concern here is not instantaneous size of the font cache but rather long-term growth. So the first suggestion is: have push() only create a pool if there is none, otherwise have it increment a counter; have pop() decrement the counter and only destroy the pool when you hit 0.

But once you only one pool, maybe you don’t need a pool at all. The pool serves to protect the system fallback font data from being deleted prematurely. Here’s another, simpler way to do it: have a flag (or actually a counter, to allow nesting) on the font cache, forbidding pruning. When starting layout or painting, set the flag (or increment the counter), and when finishing, reset it (or decrement). When you get system fallback font data, release it *immediately*, and count on the font cache to not actually prune it until the end of the operation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>414208</commentid>
    <comment_count>9</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-02 09:54:44 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 95679 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=95679&amp;action=review
&gt; 
&gt; This looks very good! Here are some low-level comments. It would have been easier to review the patch if it included function-level comments in the change log. I would like to see those still. I am going to add some comments on naming and maybe some higher-level notes.
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:64
&gt; &gt; +        * platform/graphics/chromium/FontCacheChromiumWin.cpp:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; &gt; +        * platform/graphics/freetype/FontCacheFreeType.cpp:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; &gt; +        * platform/graphics/haiku/FontCacheHaiku.cpp:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; &gt; +        * platform/graphics/mac/FontCacheMac.mm:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; &gt; +        * platform/graphics/qt/FontCacheQt.cpp:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; &gt; +        * platform/graphics/win/FontCacheWin.cpp:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; &gt; +        * platform/graphics/wince/FontCacheWinCE.cpp:
&gt; &gt; +        * platform/graphics/wx/FontCacheWx.cpp:
&gt; &gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; 
&gt; All of these platform-specific implementations of getFontDataForCharacters() were changes in the exact same platform-agnostic way. A better way to make this change would have been:
&gt; 1. Declare a new private member function in FontCache called platformGetFontDataForCharacters()
&gt; 2. Rename all of the platform-specific implementations of getFontDataForCharacters to platformGetFontDataForCharacters
&gt; 3. Implement getFontDataForCharacters in FontCache.cpp which calls the platform-specific function, then does the platform-agnostic part.

Your suggested approach would need some modifications.  Some of the platform specific implementations return fonts that don&apos;t come from the font cache.  We would need to handle and ignore the release of a font that wasn&apos;t in the cache for your suggestion to work.  At least one platform specific getFontDataForCharacters() returns 0, which requires some handling as well.

&gt; &gt; Source/WebCore/page/FrameView.cpp:118
&gt; &gt; +    , m_fontCacheAutoRelease(adoptPtr(new FontCacheAutoRelease))
&gt; 
&gt; Is there a reason to allocate this object separately? Its lifetime seems to coincide with that of the FrameView.
&gt; 
&gt; &gt; Source/WebCore/page/FrameView.h:41
&gt; &gt; +class FontCacheAutoRelease;
&gt; 
&gt; Maybe that’s the reason: not wanting to include another header here :)

Not wanting to create a new header dependency and not wanting to bloat the FrameView object where my reasons for a pointer.
 
... &lt;comments deleted as I agree with them&gt; ...

&gt; &gt; Source/WebCore/platform/graphics/GlyphPageTreeNode.cpp:380
&gt; &gt; +    // Prune fall back child (if any) of this font.
&gt; &gt; +    if (m_systemFallbackChild &amp;&amp; m_systemFallbackChild-&gt;m_page)
&gt; &gt; +        m_systemFallbackChild-&gt;m_page-&gt;clearForFontData(fontData);
&gt; &gt; +
&gt; 
&gt; I am worried that the stopping condition further down in this function (level &gt; fontData-&gt;maxGlyphPageTreeLevel()) isn’t accounting for system fallback pages, i.e. maxGlyphPageTreeLevel() is not set when a fontData is used in a fallback page. Am I wrong?

I&apos;ll look into this.  You may be right.

&gt; &gt; Source/WebCore/platform/graphics/SimpleFontData.cpp:225
&gt; &gt; +void SimpleFontData::DerivedFontData::pruneFromGlyphPageTree()
&gt; &gt; +{
&gt; &gt; +    if (!forCustomFont) {
&gt; &gt; +        if (smallCaps)
&gt; &gt; +            GlyphPageTreeNode::pruneTreeFontData(smallCaps.get());
&gt; &gt; +        if (emphasisMark)
&gt; &gt; +            GlyphPageTreeNode::pruneTreeFontData(emphasisMark.get());
&gt; &gt; +        if (brokenIdeograph)
&gt; &gt; +            GlyphPageTreeNode::pruneTreeFontData(brokenIdeograph.get());
&gt; &gt; +        if (verticalRightOrientation)
&gt; &gt; +            GlyphPageTreeNode::pruneTreeFontData(verticalRightOrientation.get());
&gt; &gt; +        if (uprightOrientation)
&gt; &gt; +            GlyphPageTreeNode::pruneTreeFontData(uprightOrientation.get());
&gt; &gt; +
&gt; &gt;          return;
&gt; &gt; +    }
&gt; 
&gt; I don’t understand this part.

We can use system fallback fonts for variants.  Therefore we need to prune the tree of those variants.  The prior code only handled the custom font case.  I added the non-custom case.

&gt; &gt; Source/WebCore/platform/mac/MemoryPressureHandlerMac.mm:101
&gt; &gt; +    fontCache()-&gt;purgeInactiveFontData();
&gt; &gt; +
&gt; 
&gt; I think this change is not an integral part of fixing this bug. It should go in a separate patch.

This is the main reason for the change, but I can move it to another bug &amp; patch.

(In reply to comment #8)
&gt; (From update of attachment 95679 [details])
&gt; While the general approach of this patch is good, I have two ideas for simplifying it. The first idea is: avoid multiple nested autorelease pools. In your design, nested pools correspond to nested frame. The theoretical advantage of nested pools over a single pool at the top-level frame is that it allows you to release fonts that are used only by a subframe before you exit the layout or paint operation for the parent frame. I think this advantage is purely theoretical, since the concern here is not instantaneous size of the font cache but rather long-term growth. So the first suggestion is: have push() only create a pool if there is none, otherwise have it increment a counter; have pop() decrement the counter and only destroy the pool when you hit 0.
&gt; 
&gt; But once you only one pool, maybe you don’t need a pool at all. The pool serves to protect the system fallback font data from being deleted prematurely. Here’s another, simpler way to do it: have a flag (or actually a counter, to allow nesting) on the font cache, forbidding pruning. When starting layout or painting, set the flag (or increment the counter), and when finishing, reset it (or decrement). When you get system fallback font data, release it *immediately*, and count on the font cache to not actually prune it until the end of the operation.

Although the current use doesn&apos;t use the nesting, it may be useful.  As I was looking for the appropriate level in the layout / paint call graph to insert FontCacheAutoRelease objects, I did nest. 

I don&apos;t think immediately releasing a ref on a system fallback font will work as you describe.  The current code allows for pruning fonts as soon as the last autorelease pool (i.e. FrameView) using the font is destructed.  I think that your approach would require that all FrameViews are closed since you don&apos;t have a ref count for each using FrameView.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415219</commentid>
    <comment_count>10</comment_count>
      <attachid>95968</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-03 14:51:15 -0700</bug_when>
    <thetext>Created attachment 95968
Patch with rework suggested by reviewers

Changed to use the single pool suggested in comment #8.  Added the appropriate changes for the other platform specific FontCache::getFontDataForCharacters.  Moved the purgeFontCache check to when the global auto release count goes to 0.  Lowered the threshold for purging.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415221</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-03 14:52:31 -0700</bug_when>
    <thetext>Attachment 95968 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/platform/graphics/FontFastPath.cpp:40:  Use &apos;using namespace std;&apos; instead of &apos;using std::max;&apos;.  [build/using_std] [4]
Total errors found: 1 in 25 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>415284</commentid>
    <comment_count>12</comment_count>
      <attachid>95968</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-06-03 16:44:30 -0700</bug_when>
    <thetext>Comment on attachment 95968
Patch with rework suggested by reviewers

View in context: https://bugs.webkit.org/attachment.cgi?id=95968&amp;action=review

&gt; Source/WebCore/ChangeLog:8
&gt; +        This change allows fonts allocated as system fallback fonts to be release.

released

&gt; Source/WebCore/ChangeLog:10
&gt; +        Previously, the reference counts for these fonts grew without bound.  This
&gt; +        is implemented primarily an auto release class that wraps accesses to the

Sentence doesn&apos;t parse.

&gt; Source/WebCore/ChangeLog:11
&gt; +        cache for system fallback fonts. All such access are via the method

accesses

&gt; Source/WebCore/ChangeLog:13
&gt; +        FontCacheAutoRelease. When such an object exists, it protects these font from 

these fonts

&gt; Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp:1878
&gt; +    // Protects and automatically releases system fallback fonts from font cache

I don&apos;t think the comment is necessary.

&gt; Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp:1908
&gt; +    // Protects and automatically releases system fallback fonts from font cache

Ditto

&gt; Source/WebCore/platform/graphics/FontCache.h:103
&gt; +    inline void incDontPurgeCount() { m_dontPurgeCount++; }
&gt; +    inline void decDontPurgeCount()

These methods are too easily misread as &quot;increment/decrement but don&apos;t purge the count&quot;

&gt; Source/WebCore/platform/graphics/SimpleFontData.cpp:213
&gt; +#if 0

Why the #if 0?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415298</commentid>
    <comment_count>13</comment_count>
      <attachid>95968</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-06-03 16:57:01 -0700</bug_when>
    <thetext>Comment on attachment 95968
Patch with rework suggested by reviewers

View in context: https://bugs.webkit.org/attachment.cgi?id=95968&amp;action=review

&gt; Source/WebKit/mac/Misc/WebStringTruncator.mm:98
&gt; +    // Protects and automatically releases system fallback fonts from font cache
&gt; +    FontCacheAutoRelease fontCacheAutoRelease;

I don&apos;t have any useful comments, but this class name positively needs be good enough to avoid commenting each time it&apos;s used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415336</commentid>
    <comment_count>14</comment_count>
      <attachid>96000</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-03 17:51:26 -0700</bug_when>
    <thetext>Created attachment 96000
Updated patch to address comments #12 &amp; #13</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415358</commentid>
    <comment_count>15</comment_count>
      <attachid>96000</attachid>
    <who name="">mitz</who>
    <bug_when>2011-06-03 19:24:50 -0700</bug_when>
    <thetext>Comment on attachment 96000
Updated patch to address comments #12 &amp; #13

View in context: https://bugs.webkit.org/attachment.cgi?id=96000&amp;action=review

&gt; Source/WebCore/ChangeLog:73
&gt; +        * WebCore.exp.in:
&gt; +        * html/canvas/CanvasRenderingContext2D.cpp:
&gt; +        (WebCore::CanvasRenderingContext2D::measureText):
&gt; +        (WebCore::CanvasRenderingContext2D::drawTextInternal):
&gt; +        * page/FrameView.cpp:
&gt; +        (WebCore::FrameView::layout):
&gt; +        (WebCore::FrameView::paintContents):
&gt; +        * platform/graphics/FontCache.cpp:
&gt; +        (WebCore::FontCache::FontCache):
&gt; +        (WebCore::FontCache::getCachedFontData):
&gt; +        (WebCore::FontCache::releaseFontData):
&gt; +        (WebCore::FontCache::checkForFontsToPurge):
&gt; +        (WebCore::FontCache::purgeInactiveFontData):
&gt; +        (WebCore::FontCache::derefForPurgeProtectedFont):
&gt; +        * platform/graphics/FontCache.h:
&gt; +        (WebCore::FontCache::incPurgePreventCount):
&gt; +        (WebCore::FontCache::decPurgePreventCount):
&gt; +        (WebCore::FontCachePurgePreventer::FontCachePurgePreventer):
&gt; +        (WebCore::FontCachePurgePreventer::~FontCachePurgePreventer):
&gt; +        * platform/graphics/FontFastPath.cpp:
&gt; +        (WebCore::Font::glyphDataForCharacter):
&gt; +        * platform/graphics/GlyphPage.h:
&gt; +        (WebCore::GlyphPage::clearForFontData):
&gt; +        * platform/graphics/GlyphPageTreeNode.cpp:
&gt; +        (WebCore::GlyphPageTreeNode::pruneFontData):
&gt; +        * platform/graphics/SimpleFontData.cpp:
&gt; +        (WebCore::SimpleFontData::~SimpleFontData):
&gt; +        (WebCore::SimpleFontData::DerivedFontData::~DerivedFontData):
&gt; +        (WebCore::SimpleFontData::DerivedFontData::pruneFromGlyphPageTree):
&gt; +        * platform/graphics/SimpleFontData.h:
&gt; +        * platform/graphics/chromium/FontCacheChromiumWin.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/freetype/FontCacheFreeType.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/haiku/FontCacheHaiku.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/mac/FontCacheMac.mm:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/qt/FontCacheQt.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/win/FontCacheWin.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * platform/graphics/wince/FontCacheWinCE.cpp:
&gt; +        * platform/graphics/wx/FontCacheWx.cpp:
&gt; +        (WebCore::FontCache::getFontDataForCharacters):
&gt; +        * rendering/RenderImage.cpp:
&gt; +        (WebCore::RenderImage::setImageSizeForAltText):
&gt; +        * rendering/RenderListBox.cpp:
&gt; +        (WebCore::RenderListBox::updateFromElement):
&gt; +        (WebCore::RenderListBox::paintItemForeground):

Function-level change log comments are encouraged.

&gt; Source/WebCore/platform/graphics/FontCache.cpp:-300
&gt; -        if (gInactiveFontData-&gt;size() &gt; cMaxInactiveFontData)
&gt; -            purgeInactiveFontData(gInactiveFontData-&gt;size() - cTargetInactiveFontData);

Without a change log comment, I have no idea why you didn’t replace this with a call to checkForFontsToPurge()

&gt; Source/WebCore/platform/graphics/FontCache.cpp:304
&gt; +void FontCache::checkForFontsToPurge()

I would call this purgeInactiveFontDataIfNeeded(), because it doesn’t only check, it also purges if needed.

&gt; Source/WebCore/platform/graphics/FontCache.cpp:373
&gt; +void FontCache::derefForPurgeProtectedFont(const SimpleFontData* fontData)

A better name for this function would use the word “release” instead of the non-word “deref”. There’s no reason to introduce a new word to mean the same thing here.

&gt; Source/WebCore/platform/graphics/FontCache.h:52
&gt; +class FontCache;

Please keep this list sorted.

&gt; Source/WebCore/platform/graphics/FontCache.h:63
&gt; -    
&gt; + 

As long as you’re removing whitespace, remove all of it.

&gt; Source/WebCore/platform/graphics/FontCache.h:103
&gt; +    inline void incPurgePreventCount() { m_purgePreventCount++; }
&gt; +    inline void decPurgePreventCount()

We prefer complete words over abbreviations like “inc” and “dec”. It is also common to just call such methods “disable” and “enable” respectively (e.g. disablePurging() and enablePurging() or something similar).

We typically don’t use “inline” for member functions defined in the header. Is there a reason to do so here?

&gt; Source/WebCore/platform/graphics/FontCache.h:104
&gt; +    { 

You can (and should) assert here that the count is greater than zero so that no one is over-enabling.

&gt; Source/WebCore/platform/graphics/FontCache.h:138
&gt; +    inline FontCachePurgePreventer() { fontCache()-&gt;incPurgePreventCount(); }
&gt; +    inline ~FontCachePurgePreventer() { fontCache()-&gt;decPurgePreventCount(); }

Don’t think “inline” does anything here.

&gt; Source/WebCore/platform/graphics/FontFastPath.cpp:40
&gt; +using std::max;

WebKit style is to add “using namespace std” instead of an individual member.

&gt; Source/WebCore/platform/graphics/GlyphPage.h:127
&gt; +        for (size_t i = 0; i &lt; size; i++) {

The convention is to pre-decrement the loop variable (even though it doesn’t matter for POD types).

&gt; Source/WebCore/platform/graphics/GlyphPageTreeNode.cpp:383
&gt; -    if (child == m_children.end()) {
&gt; -        // If there is no level-1 node for fontData, then there is no deeper node for it in this tree.
&gt; -        if (!level)
&gt; -            return;
&gt; -    } else {
&gt; +    if (child != m_children.end()) {

It is sad to lose this optimization, which still applies to non-fallback fonts. If this function took a parameter telling it whether the pruning is for a system fallback font or not, it could still apply the optimization in the common case.

&gt; Source/WebCore/platform/graphics/SimpleFontData.cpp:211
&gt;  SimpleFontData::DerivedFontData::~DerivedFontData()
&gt;  {
&gt; +}
&gt; +
&gt; +void SimpleFontData::DerivedFontData::pruneFromGlyphPageTree()
&gt; +{

Without a change log comment explaining this, I’m still failing to see the case where you want to destroy a DerivedFontData for a non-custom font and don’t want to prune it.

&gt; Source/WebCore/platform/graphics/wx/FontCacheWx.cpp:50
&gt; -    
&gt; + 

Whitespace removal 75% complete.

&gt; Source/WebCore/rendering/RenderListBox.cpp:365
&gt; +    FontCachePurgePreventer fontCachePurgePreventer;
&gt; +    

It’s not clear to me when this can get called outside of FrameView::paintContents()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415361</commentid>
    <comment_count>16</comment_count>
      <attachid>96000</attachid>
    <who name="">mitz</who>
    <bug_when>2011-06-03 19:27:34 -0700</bug_when>
    <thetext>Comment on attachment 96000
Updated patch to address comments #12 &amp; #13

What about WebKit/win/WebKitGraphics.cpp ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415670</commentid>
    <comment_count>17</comment_count>
      <attachid>96057</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-05 17:54:53 -0700</bug_when>
    <thetext>Created attachment 96057
Updated patch to address comments 15 &amp; 16

(In reply to comment #15)

Made changes in response to ell comments except:

&gt; &gt; Source/WebCore/platform/graphics/FontCache.cpp:-300
&gt; &gt; -        if (gInactiveFontData-&gt;size() &gt; cMaxInactiveFontData)
&gt; &gt; -            purgeInactiveFontData(gInactiveFontData-&gt;size() - cTargetInactiveFontData);
&gt; 
&gt; Without a change log comment, I have no idea why you didn’t replace this with a call to checkForFontsToPurge()

Check needed to be moved outside of getFontData since since almost all calls to getCachedFontData() now happen when purging is not allowed.  Comment to this effect added to ChangeLog.

&gt; &gt; Source/WebCore/platform/graphics/GlyphPageTreeNode.cpp:383
&gt; &gt; -    if (child == m_children.end()) {
&gt; &gt; -        // If there is no level-1 node for fontData, then there is no deeper node for it in this tree.
&gt; &gt; -        if (!level)
&gt; &gt; -            return;
&gt; &gt; -    } else {
&gt; &gt; +    if (child != m_children.end()) {
&gt; 
&gt; It is sad to lose this optimization, which still applies to non-fallback fonts. If this function took a parameter telling it whether the pruning is for a system fallback font or not, it could still apply the optimization in the common case.

Unfortunately we don&apos;t have data keeping track of this. From what I saw during testing, a font often serve as a non-fallback and fallback font at the same time.  Given that font purging is relatively rare, I don&apos;t think there is much benefit to this.

&gt; &gt; Source/WebCore/rendering/RenderListBox.cpp:365
&gt; &gt; +    FontCachePurgePreventer fontCachePurgePreventer;
&gt; &gt; +    
&gt; 
&gt; It’s not clear to me when this can get called outside of FrameView::paintContents()

This and other paths that are protected became apparent when running the webkit tests with a debug build via the ASSERT in FontCache::releasePurgeProtectedFont.  Most of these non-frameView cases are needed for editing code paths.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>415671</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-05 17:57:01 -0700</bug_when>
    <thetext>Attachment 96057 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/platform/graphics/FontCache.cpp:307:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 1 in 26 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>415679</commentid>
    <comment_count>19</comment_count>
      <attachid>96060</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-05 19:31:25 -0700</bug_when>
    <thetext>Created attachment 96060
Prior patch with fixed debug code caught by stylebot</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416081</commentid>
    <comment_count>20</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-06-06 15:51:13 -0700</bug_when>
    <thetext>Dan is still your best reviewer here, but I noticed these inline declarations he mentioned, which you can remove:

&gt; +    inline FontCachePurgePreventer() { fontCache()-&gt;disablePurging(); }
&gt; +    inline ~FontCachePurgePreventer() { fontCache()-&gt;enablePurging(); }



&gt; +    const SimpleFontData* fontData = getCachedFontData(&amp;data);
&gt; +    releasePurgeProtectedFont(fontData);

I&apos;m very unclear on when a call to releasePurgeProtectedFont() is required or, if not required, desirable. The &quot;retain and immediately release&quot; idiom seen here is very odd to me. If I don&apos;t need to retain the object, why am I calling a retaining API? If I do need to retain the object, why is releasing it OK?

Perhaps the default cache behavior should be to ASSERT that purging is prohibited, and return a font without retaining, while the few clients that do explicitly retain their fonts can call a special function that does not ASSERT that purging is prohibited, and does a retain instead:

getCachedFontData(FontPlatformData*); // ASSERTs that purging is prohibited, does not retain &amp;data. Returned SimpleFontData* is implicitly owned by the current FontCachePurgePreventer scope. 

retainCachedFontData(FontPlatformData*); // Retains returned SimpleFontData*, does not ASSERT that purging is prohibited. Returned SimpleFontData* is explicitly owned by the caller.
releaseCachedFontData(SimpleFontData*); // Releases SimpleFontData* obtained by retainCachedFontData.

I think this default would be congruent with the code&apos;s intention, given your comment:

&gt; almost all calls to getCachedFontData() now happen when purging is not allowed.

In such a design a &quot;FontCachePurgePreventer&quot; is really a &quot;CachedFontDataOwner&quot; or &quot;CachedFontDataScope&quot;, since it implicitly owns all cached font data accessed within its scope.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416601</commentid>
    <comment_count>21</comment_count>
      <attachid>96254</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-07 10:15:03 -0700</bug_when>
    <thetext>Created attachment 96254
Patch with updates in response to comment #20

(In reply to comment #20)
&gt; Dan is still your best reviewer here, but I noticed these inline declarations he mentioned, which you can remove:
&gt; 
&gt; &gt; +    inline FontCachePurgePreventer() { fontCache()-&gt;disablePurging(); }
&gt; &gt; +    inline ~FontCachePurgePreventer() { fontCache()-&gt;enablePurging(); }

This was an oversight and has been fixed.

&gt; &gt; +    const SimpleFontData* fontData = getCachedFontData(&amp;data);
&gt; &gt; +    releasePurgeProtectedFont(fontData);
&gt; 
&gt; I&apos;m very unclear on when a call to releasePurgeProtectedFont() is required or, if not required, desirable. The &quot;retain and immediately release&quot; idiom seen here is very odd to me. If I don&apos;t need to retain the object, why am I calling a retaining API? If I do need to retain the object, why is releasing it OK?

It was being called only by platform specific FontCache::getFontDataForCharacters(), the method used to access system fallback fonts.

To make it less confusing, I removed releasePurgeProtectedFont() and added a &quot;shouldRetain&quot; parameter to getCachedFontData() with a default value of true.  This change also eliminated one hash lookup (find()) for the system fallback font case.

&gt; Perhaps the default cache behavior should be to ASSERT that purging is prohibited, and return a font without retaining, while the few clients that do explicitly retain their fonts can call a special function that does not ASSERT that purging is prohibited, and does a retain instead:
&gt; 
&gt; getCachedFontData(FontPlatformData*); // ASSERTs that purging is prohibited, does not retain &amp;data. Returned SimpleFontData* is implicitly owned by the current FontCachePurgePreventer scope. 
&gt; 
&gt; retainCachedFontData(FontPlatformData*); // Retains returned SimpleFontData*, does not ASSERT that purging is prohibited. Returned SimpleFontData* is explicitly owned by the caller.
&gt; releaseCachedFontData(SimpleFontData*); // Releases SimpleFontData* obtained by retainCachedFontData.
&gt; 
&gt; I think this default would be congruent with the code&apos;s intention, given your comment:
&gt; 
&gt; &gt; almost all calls to getCachedFontData() now happen when purging is not allowed.
&gt; 
&gt; In such a design a &quot;FontCachePurgePreventer&quot; is really a &quot;CachedFontDataOwner&quot; or &quot;CachedFontDataScope&quot;, since it implicitly owns all cached font data accessed within its scope.

Most font requests to the cache rely on the reference counting.  It is only the system fallback font accesses from the cache that needs the purge prevention handling and no change to reference count. It is the case though that these two cache requests are intermingled and therefore purging is disallowed even if we are requesting the font for the normal reference counted paths.

Although FontCachePurgePreventer can be seen as an &quot;owner&quot;, a better description is that a font can only be released if its reference count is zero AND there isn&apos;t an active FontCachePurgePreventer.  It is likely the case that a font needs both types of protection, as a font can be accessed and actively used via a reference counted path as well as via the system fallback access path for the same time period.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416647</commentid>
    <comment_count>22</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-06-07 11:14:03 -0700</bug_when>
    <thetext>&gt; bool shouldRetain

WebKit style prefers enum over bool for function arguments that are not typically named, so you can tell just by reading at the call site what the meaning of the argument is. For example, here you could use &quot;enum { Retain, DoNotRetain }&quot;.

Otherwise, this patch is looking good to me. Alexey, Simon, Dan, do you have further comments?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416651</commentid>
    <comment_count>23</comment_count>
    <who name="">mitz</who>
    <bug_when>2011-06-07 11:18:41 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; &gt; bool shouldRetain
&gt; 
&gt; WebKit style prefers enum over bool for function arguments that are not typically named, so you can tell just by reading at the call site what the meaning of the argument is. For example, here you could use &quot;enum { Retain, DoNotRetain }&quot;.

I like this suggestion.

&gt; 
&gt; Otherwise, this patch is looking good to me. Alexey, Simon, Dan, do you have further comments?

I have nothing further.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416715</commentid>
    <comment_count>24</comment_count>
      <attachid>96254</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-06-07 12:14:09 -0700</bug_when>
    <thetext>Comment on attachment 96254
Patch with updates in response to comment #20

OK, r=me with the change for &quot;enum { Retain, DoNotRetain }&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416764</commentid>
    <comment_count>25</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-07 13:46:46 -0700</bug_when>
    <thetext>Committed r88260: &lt;http://trac.webkit.org/changeset/88260&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>416787</commentid>
    <comment_count>26</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-07 14:28:03 -0700</bug_when>
    <thetext>It seems like this patch broke Windows builds:
http://build.webkit.org/builders/Windows%20Release%20%28Build%29/builds/17281/steps/compile-webkit/logs/stdio

3&gt;..\platform\graphics\win\FontCacheWin.cpp(288) : error C2664: &apos;WebCore::SimpleFontData *WebCore::FontCache::getCachedFontData(const WebCore::FontDescription &amp;,const WTF::AtomicString &amp;,bool,WebCore::FontCache::ShouldRetain)&apos; : cannot convert parameter 1 from &apos;WebCore::FontPlatformData *&apos; to &apos;const WebCore::FontDescription &amp;&apos;
3&gt;        Reason: cannot convert from &apos;WebCore::FontPlatformData *&apos; to &apos;const WebCore::FontDescription&apos;
3&gt;        No constructor could take the source type, or constructor overload resolution was ambiguous
3&gt;SVGCSSStyleSelector.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417079</commentid>
    <comment_count>27</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-06-07 21:57:53 -0700</bug_when>
    <thetext>This is in the regression range for a significant hit on many of chromium&apos;s page cyclers on windows, linux, and mac.  The full regression range is http://trac.webkit.org/log/?rev=88266&amp;stop_rev=88259&amp;verbose=on, but the other changes look fairly harmless.

You can see the jump on one of our graphs here: http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/moz/report.html?history=50&amp;rev=88279 - the X axis here is sadly chromium checkins, but the jump from &quot;r88196 - r88210&quot; is actually the WebKit range mentioned above.  The magnitude of the perf hit varies depending on the bot configuration, etc, but is at least 10% in some of our tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417340</commentid>
    <comment_count>28</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-08 10:44:47 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; This is in the regression range for a significant hit on many of chromium&apos;s page cyclers on windows, linux, and mac.  The full regression range is http://trac.webkit.org/log/?rev=88266&amp;stop_rev=88259&amp;verbose=on, but the other changes look fairly harmless.
&gt; 
&gt; You can see the jump on one of our graphs here: http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/moz/report.html?history=50&amp;rev=88279 - the X axis here is sadly chromium checkins, but the jump from &quot;r88196 - r88210&quot; is actually the WebKit range mentioned above.  The magnitude of the perf hit varies depending on the bot configuration, etc, but is at least 10% in some of our tests.

You can try adjusting the two constants cMaxInactiveFontData and cTargetInactiveFontData in FontCache.cpp and rerun your tests.  The change in the patch included lowering those from 120 and 100 respectively to 50 and 30.  This was done to reduce the memory footprint.  If your tests have a large number of pages, especially those using non-latin fonts, I could see how this would impact performance especially if it takes a long time for the platform code and OS to bring a font in to webcore.

These constants govern inactive fonts, not total fonts. With this change, system fallback fonts are now likely to be inactive where they previously stayed active and could be abandoned. I would be reluctant in general to increase these constants as 50 and 30 appear reasonable in our tests and seem to work well in real world browsing.  Keeping up to 119 inactive fonts can waste quite a bit of memory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417349</commentid>
    <comment_count>29</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-06-08 11:04:04 -0700</bug_when>
    <thetext>(In reply to comment #28)
&gt; (In reply to comment #27)
&gt; &gt; This is in the regression range for a significant hit on many of chromium&apos;s page cyclers on windows, linux, and mac.  The full regression range is http://trac.webkit.org/log/?rev=88266&amp;stop_rev=88259&amp;verbose=on, but the other changes look fairly harmless.
&gt; &gt; 
&gt; &gt; You can see the jump on one of our graphs here: http://build.chromium.org/f/chromium/perf/linux-release-webkit-latest/moz/report.html?history=50&amp;rev=88279 - the X axis here is sadly chromium checkins, but the jump from &quot;r88196 - r88210&quot; is actually the WebKit range mentioned above.  The magnitude of the perf hit varies depending on the bot configuration, etc, but is at least 10% in some of our tests.
&gt; 
&gt; You can try adjusting the two constants cMaxInactiveFontData and cTargetInactiveFontData in FontCache.cpp and rerun your tests.  The change in the patch included lowering those from 120 and 100 respectively to 50 and 30.  This was done to reduce the memory footprint.  If your tests have a large number of pages, especially those using non-latin fonts, I could see how this would impact performance especially if it takes a long time for the platform code and OS to bring a font in to webcore.
&gt; 
&gt; These constants govern inactive fonts, not total fonts. With this change, system fallback fonts are now likely to be inactive where they previously stayed active and could be abandoned. I would be reluctant in general to increase these constants as 50 and 30 appear reasonable in our tests and seem to work well in real world browsing.  Keeping up to 119 inactive fonts can waste quite a bit of memory.

There&apos;s a significant regression even on tests that don&apos;t use a significant number of fonts.  Did you measure the performance impact of the change from 120/100 to 50/30 independently of the other changes in this patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417441</commentid>
    <comment_count>30</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-08 13:01:42 -0700</bug_when>
    <thetext>&gt; There&apos;s a significant regression even on tests that don&apos;t use a significant number of fonts.  Did you measure the performance impact of the change from 120/100 to 50/30 independently of the other changes in this patch?

Do you know if the simpler tests end up using fallback fonts or how many fonts are actually end up in the FontCache during the tests?

I changed the constants from 120/100 to 50/30 late in the development of the patch.  I measured page load times as well as memory usage with the changes before and after making the constant changes.  I didn&apos;t see any performance changes in our tests with the constant changes.  For the whole patch, I did see a slight slowdown in some tests, on the order of a 1-3% IIRC.  I saw no impact on other tests.

Remember that this fixes a memory abandonment issue, fonts get added to the cache and their reference counts grow without bound.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417673</commentid>
    <comment_count>31</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-06-08 16:31:13 -0700</bug_when>
    <thetext>Just reran the page loading tests that I earlier saw the 1-3% regression.  I compared webkit r88258 (two changes before) with webkit r88273 (13 changes after).  There is a regression of 0.2% comparing the average of 25 runs of the test. I consider this to be in the noise.   I cannot replicate the performance degradation you are seeing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>417773</commentid>
    <comment_count>32</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-06-08 20:23:21 -0700</bug_when>
    <thetext>The results from page cyclers will depend entirely on the test data, of course.  Over the page cycler data sets we use in chromium the inactive font data cache grows to between 60 and 105.  None of the page cyclers we use will complete without eviction with a threshhold of 50.  Are the values 50/30 based off of user data?

I&apos;ve confirmed that restoring the previous values of 120/100 restores performance to previous levels.  Since this regression is well over the magnitude that we&apos;d consider acceptable in chromium, I&apos;m inclined to restore the old values, behind #if PLATFORM(CHROMIUM) if you would like to keep the 50/30 values for other platforms.  I can also try to gather some data from users in the wild about how many fonts people have in the cache in general.  It would be useful if you have any other data to share about how those values were arrived at, or about how significant the resource use delta is on average between 120/100 and 50/30 on various platforms.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95641</attachid>
            <date>2011-06-01 12:22:12 -0700</date>
            <delta_ts>2011-06-01 15:50:56 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>font2b.patch</filename>
            <type>text/plain</type>
            <size>21886</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg3ODMzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTkgQEAKKzIwMTEtMDYtMDEgIE1pY2hhZWwg
U2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgRm9udHMgcmV0dXJuZWQgYnkgRm9udENhY2hlOjpnZXRGb250
RGF0YUZvckNoYXJhY3RlcnMoKSBhcmUgbmV2ZXIgcmVsZWFzZWQKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYxODc1CisKKyAgICAgICAgQWRkZWQgY29k
ZSB0byBjbGVhbiB1cCBzeXN0ZW0gZmFsbCBiYWNrIGZvbnQgcmVmZXJlbmNlcyBpbiBnbHlwaCBw
YWdlIHRyZWUuCisgICAgICAgIENvcnJlY3RlZCBhIGZldyBvdGhlciBlcnJvcnMgaW4gdGhlIGZv
bnQgY2xlYW51cCBoYW5kbGluZyBpbiB0aGUgZ2x5cGggcGFnZQorICAgICAgICB0cmVlLiAgQWRk
ZWQgYW4gYXV0byByZWxlYXNlIG1lY2hhbmlzbSB0byB0aGUgZm9udCBjYWNoZSBmb3IgYWNjZXNz
IHZpYQorICAgICAgICB0aGUgRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMgbWV0
aG9kLgorICAgICAgICBXcmFwcGVkIHRoZSBjb3JlIG9mIHRoZSBsYXlvdXQgYW5kIHBhaW50Q29u
dGVudHMgbWV0aG9kcyBvZiBGcmFtZVZpZXcgdXNpbmcKKyAgICAgICAgYSBmb250IGNhY2hlIGF1
dG8gcmVsZWFzZSBvYmplY3QuICBBZGRlZCBjYWxsIGluIG1lbW9yeSBwcmVzc3VyZSBoYW5kbGVy
IHRvCisgICAgICAgIHB1cmdlIGluYWN0aXZlIGZvbnRzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0
IGFzIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBub3QgY2hhbmdlZC4gSW1wcm92ZWQgZm9udCBsaWZl
IGN5Y2xlCisgICAgICAgIG1hbmFnZW1lbnQuCisKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OkZyYW1lVmlldyk6CisgICAgICAgIChX
ZWJDb3JlOjpGcmFtZVZpZXc6On5GcmFtZVZpZXcpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVW
aWV3OjpsYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVWaWV3OjpwYWludENvbnRlbnRz
KToKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRDYWNoZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldENhY2hl
ZEZvbnREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6YXNzdXJlT25lSG9sZCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpGb250Q2FjaGVBdXRvUmVsZWFzZTo6Rm9udENhY2hlQXV0b1JlbGVhc2UpOgor
ICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlQXV0b1JlbGVhc2U6On5Gb250Q2FjaGVBdXRvUmVs
ZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVBdXRvUmVsZWFzZTo6cHVzaCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVBdXRvUmVsZWFzZTo6cG9wKToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnRDYWNoZUF1dG9SZWxlYXNlOjpyZWxlYXNlQWxsRm9udERhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlQXV0b1JlbGVhc2U6OmFkZEZvbnREYXRhVG9SZWxlYXNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cHVzaEF1dG9SZWxlYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnRDYWNoZTo6cG9wQXV0b1JlbGVhc2UpOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udENhY2hlOjphZGRGb250RGF0YVRvUmVsZWFzZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udENhY2hlLmg6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVBdXRvUmVsZWFz
ZTo6aXNSZWZlcmVuY2VkKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBh
dGguY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2UuaDoKKyAgICAgICAgKFdlYkNv
cmU6OkdseXBoUGFnZTo6Y2xlYXJGb3JGb250RGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhQYWdl
VHJlZU5vZGU6OnBydW5lRm9udERhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjp+U2lt
cGxlRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OkRlcml2ZWRG
b250RGF0YTo6fkRlcml2ZWRGb250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250
RGF0YTo6RGVyaXZlZEZvbnREYXRhOjpwcnVuZUZyb21HbHlwaFBhZ2VUcmVlKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW06CisgICAgICAgIChXZWJDb3JlOjpGb250Q2Fj
aGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vbWFjL01l
bW9yeVByZXNzdXJlSGFuZGxlck1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6Ok1lbW9yeVByZXNz
dXJlSGFuZGxlcjo6aW5zdGFsbCk6CisgICAgICAgIChXZWJDb3JlOjpNZW1vcnlQcmVzc3VyZUhh
bmRsZXI6OnJlc3BvbmRUb01lbW9yeVByZXNzdXJlKToKKwogMjAxMS0wNi0wMSAgQW5kcmFzIEJl
Y3NpICA8YWJlY3NpQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQ3NhYmEgT3N6
dHJvZ29uw6FjLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmNwcAkocmV2aXNpb24gODc2
NTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKICNpbmNsdWRlICJG
bG9hdFJlY3QuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJGb250
Q2FjaGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lQWN0aW9uU2NoZWR1
bGVyLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKQEAgLTExNCw2ICsxMTUsNyBAQCBzdGF0
aWMgY29uc3QgdW5zaWduZWQgbWF4VXBkYXRlV2lkZ2V0c0l0CiAKIEZyYW1lVmlldzo6RnJhbWVW
aWV3KEZyYW1lKiBmcmFtZSkKICAgICA6IG1fZnJhbWUoZnJhbWUpCisgICAgLCBtX2ZvbnRDYWNo
ZUF1dG9SZWxlYXNlKG5ldyBGb250Q2FjaGVBdXRvUmVsZWFzZSkKICAgICAsIG1fY2FuSGF2ZVNj
cm9sbGJhcnModHJ1ZSkKICAgICAsIG1fc2xvd1JlcGFpbnRPYmplY3RDb3VudCgwKQogICAgICwg
bV9maXhlZE9iamVjdENvdW50KDApCkBAIC0xOTgsNiArMjAwLDggQEAgRnJhbWVWaWV3Ojp+RnJh
bWVWaWV3KCkKICAgICAgICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT53aWRnZXQoKSA9PSB0
aGlzKQogICAgICAgICAgICAgcmVuZGVyZXItPnNldFdpZGdldCgwKTsKICAgICB9CisKKyAgICBk
ZWxldGUgbV9mb250Q2FjaGVBdXRvUmVsZWFzZTsKIH0KIAogdm9pZCBGcmFtZVZpZXc6OnJlc2V0
KCkKQEAgLTg5Niw2ICs5MDAsOCBAQCB2b2lkIEZyYW1lVmlldzo6bGF5b3V0KGJvb2wgYWxsb3dT
dWJ0cmVlCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBtX2ZvbnRDYWNoZUF1dG9SZWxl
YXNlLT5wdXNoKCk7CisKICAgICBtX25lc3RlZExheW91dENvdW50Kys7CiAKICAgICBpZiAoIW1f
bGF5b3V0Um9vdCkgewpAQCAtMTAzMCw2ICsxMDM2LDggQEAgdm9pZCBGcmFtZVZpZXc6OmxheW91
dChib29sIGFsbG93U3VidHJlZQogICAgIHVwZGF0ZURhc2hib2FyZFJlZ2lvbnMoKTsKICNlbmRp
ZgogCisgICAgbV9mb250Q2FjaGVBdXRvUmVsZWFzZS0+cG9wKCk7CisKICAgICBBU1NFUlQoIXJv
b3QtPm5lZWRzTGF5b3V0KCkpOwogCiAgICAgdXBkYXRlQ2FuQmxpdE9uU2Nyb2xsUmVjdXJzaXZl
bHkoKTsKQEAgLTI0MTksNiArMjQyNyw4IEBAIHZvaWQgRnJhbWVWaWV3OjpwYWludENvbnRlbnRz
KEdyYXBoaWNzQ28KICAgICBpZiAobmVlZHNMYXlvdXQoKSkKICAgICAgICAgcmV0dXJuOwogCisg
ICAgbV9mb250Q2FjaGVBdXRvUmVsZWFzZS0+cHVzaCgpOworCiAjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQogICAgIGlmICghcC0+cGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICBz
eW5jQ29tcG9zaXRpbmdTdGF0ZUZvclRoaXNGcmFtZSgpOwpAQCAtMjQ2OCw2ICsyNDc4LDggQEAg
dm9pZCBGcmFtZVZpZXc6OnBhaW50Q29udGVudHMoR3JhcGhpY3NDbwogICAgICAgICB1cGRhdGVE
YXNoYm9hcmRSZWdpb25zKCk7CiAjZW5kaWYKIAorICAgIG1fZm9udENhY2hlQXV0b1JlbGVhc2Ut
PnBvcCgpOworCiAgICAgaWYgKGlzVG9wTGV2ZWxQYWludGVyKQogICAgICAgICBzQ3VycmVudFBh
aW50VGltZVN0YW1wID0gMDsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5oCShyZXZpc2lv
biA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM4LDYgKzM4LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgQ29sb3I7CiBj
bGFzcyBFdmVudDsKIGNsYXNzIEZsb2F0U2l6ZTsKK2NsYXNzIEZvbnRDYWNoZUF1dG9SZWxlYXNl
OwogY2xhc3MgRnJhbWU7CiBjbGFzcyBGcmFtZUFjdGlvblNjaGVkdWxlcjsKIGNsYXNzIEludFJl
Y3Q7CkBAIC0zNjMsNiArMzY0LDggQEAgcHJpdmF0ZToKICAgICBPd25QdHI8UmVuZGVyRW1iZWRk
ZWRPYmplY3RTZXQ+IG1fd2lkZ2V0VXBkYXRlU2V0OwogICAgIFJlZlB0cjxGcmFtZT4gbV9mcmFt
ZTsKIAorICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlKiBtX2ZvbnRDYWNoZUF1dG9SZWxlYXNlOwor
CiAgICAgYm9vbCBtX2RvRnVsbFJlcGFpbnQ7CiAgICAgCiAgICAgYm9vbCBtX2NhbkhhdmVTY3Jv
bGxiYXJzOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250
Q2FjaGUuY3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0ZvbnRDYWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNp
bmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiRm9udFBsYXRmb3JtRGF0YS5o
IgogI2luY2x1ZGUgIkZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkdseXBoUGFnZVRyZWVOb2Rl
LmgiCiAjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQu
aD4KICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CkBAIC0yNzEsMTEgKzI3MiwxMiBAQCBT
aW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRDYWNoZWRGb250CiAgICAgICAgIGdGb250RGF0
YUNhY2hlID0gbmV3IEZvbnREYXRhQ2FjaGU7CiAgICAgICAgIGdJbmFjdGl2ZUZvbnREYXRhID0g
bmV3IExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj47CiAgICAgfQotICAgIAorCiAg
ICAgRm9udERhdGFDYWNoZTo6aXRlcmF0b3IgcmVzdWx0ID0gZ0ZvbnREYXRhQ2FjaGUtPmZpbmQo
KnBsYXRmb3JtRGF0YSk7CiAgICAgaWYgKHJlc3VsdCA9PSBnRm9udERhdGFDYWNoZS0+ZW5kKCkp
IHsKICAgICAgICAgcGFpcjxTaW1wbGVGb250RGF0YSosIHVuc2lnbmVkPiBuZXdWYWx1ZShuZXcg
U2ltcGxlRm9udERhdGEoKnBsYXRmb3JtRGF0YSksIDEpOwogICAgICAgICBnRm9udERhdGFDYWNo
ZS0+c2V0KCpwbGF0Zm9ybURhdGEsIG5ld1ZhbHVlKTsKKwogICAgICAgICByZXR1cm4gbmV3VmFs
dWUuZmlyc3Q7CiAgICAgfQogICAgIGlmICghcmVzdWx0LmdldCgpLT5zZWNvbmQuc2Vjb25kKysp
IHsKQEAgLTI4Niw3ICsyODgsMjAgQEAgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Q2Fj
aGVkRm9udAogICAgIHJldHVybiByZXN1bHQuZ2V0KCktPnNlY29uZC5maXJzdDsKIH0KIAotdm9p
ZCBGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YShjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERh
dGEpCit2b2lkIEZvbnRDYWNoZTo6YXNzdXJlT25lSG9sZChjb25zdCBTaW1wbGVGb250RGF0YSog
Zm9udERhdGEpCit7CisgICAgaWYgKG1fYXV0b1JlbGVhc2VTdGFjay5zaXplKCkgPiAwKSB7Cisg
ICAgICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlKiBmb250Q2FjaGVBdXRvUmVsZWFzZSA9IG1fYXV0
b1JlbGVhc2VTdGFjay5sYXN0KCk7CisgICAgICAgIGlmICghZm9udENhY2hlQXV0b1JlbGVhc2Ut
PmlzUmVmZXJlbmNlZChmb250RGF0YSkpIHsKKyAgICAgICAgICAgIEZvbnREYXRhQ2FjaGU6Oml0
ZXJhdG9yIGNhY2hlRW50cnkgPSBnRm9udERhdGFDYWNoZS0+ZmluZChmb250RGF0YS0+cGxhdGZv
cm1EYXRhKCkpOworICAgICAgICAgICAgQVNTRVJUKGNhY2hlRW50cnkgIT0gZ0ZvbnREYXRhQ2Fj
aGUtPmVuZCgpKTsKKyAgICAgICAgICAgIGNhY2hlRW50cnkuZ2V0KCktPnNlY29uZC5zZWNvbmQr
KzsKKyAgICAgICAgICAgIGZvbnRDYWNoZUF1dG9SZWxlYXNlLT5hZGRGb250RGF0YVRvUmVsZWFz
ZShmb250RGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udENhY2hlOjpyZWxl
YXNlRm9udERhdGEoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhLCB1bnNpZ25lZCBkZXJl
ZkNvdW50KQogewogICAgIEFTU0VSVChnRm9udERhdGFDYWNoZSk7CiAgICAgQVNTRVJUKCFmb250
RGF0YS0+aXNDdXN0b21Gb250KCkpOwpAQCAtMjk0LDcgKzMwOSw5IEBAIHZvaWQgRm9udENhY2hl
OjpyZWxlYXNlRm9udERhdGEoY29uc3QgU2kKICAgICBGb250RGF0YUNhY2hlOjppdGVyYXRvciBp
dCA9IGdGb250RGF0YUNhY2hlLT5maW5kKGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKSk7CiAgICAg
QVNTRVJUKGl0ICE9IGdGb250RGF0YUNhY2hlLT5lbmQoKSk7CiAKLSAgICBpZiAoIS0taXQtPnNl
Y29uZC5zZWNvbmQpIHsKKyAgICBBU1NFUlQoaXQtPnNlY29uZC5zZWNvbmQgPj0gZGVyZWZDb3Vu
dCk7CisgICAgaXQtPnNlY29uZC5zZWNvbmQgLT0gZGVyZWZDb3VudDsKKyAgICBpZiAoIWl0LT5z
ZWNvbmQuc2Vjb25kKSB7CiAgICAgICAgIGdJbmFjdGl2ZUZvbnREYXRhLT5hZGQoZm9udERhdGEp
OwogICAgICAgICBpZiAoZ0luYWN0aXZlRm9udERhdGEtPnNpemUoKSA+IGNNYXhJbmFjdGl2ZUZv
bnREYXRhKQogICAgICAgICAgICAgcHVyZ2VJbmFjdGl2ZUZvbnREYXRhKGdJbmFjdGl2ZUZvbnRE
YXRhLT5zaXplKCkgLSBjVGFyZ2V0SW5hY3RpdmVGb250RGF0YSk7CkBAIC0zNjQsNiArMzgxLDgy
IEBAIHNpemVfdCBGb250Q2FjaGU6OmluYWN0aXZlRm9udERhdGFDb3VudCgKICAgICByZXR1cm4g
MDsKIH0KIAorRm9udENhY2hlQXV0b1JlbGVhc2U6OkZvbnRDYWNoZUF1dG9SZWxlYXNlKGJvb2wg
YXV0b1B1c2hQb3ApCisgICAgOiBtX2F1dG9QdXNoUG9wKGF1dG9QdXNoUG9wKQoreworICAgIGlm
IChtX2F1dG9QdXNoUG9wKQorICAgICAgICBwdXNoKCk7Cit9CisKK0ZvbnRDYWNoZUF1dG9SZWxl
YXNlOjp+Rm9udENhY2hlQXV0b1JlbGVhc2UoKQoreworICAgIGlmIChtX2F1dG9QdXNoUG9wKQor
ICAgICAgICBwb3AoKTsKKworICAgIHJlbGVhc2VBbGxGb250RGF0YSgpOworfQorCit2b2lkIEZv
bnRDYWNoZUF1dG9SZWxlYXNlOjpwdXNoKCkKK3sKKyAgICBmb250Q2FjaGUoKS0+cHVzaEF1dG9S
ZWxlYXNlKHRoaXMpOworfQorCit2b2lkIEZvbnRDYWNoZUF1dG9SZWxlYXNlOjpwb3AoKQoreyAK
KyNpZm5kZWYgTkRFQlVHCisgICAgRm9udENhY2hlQXV0b1JlbGVhc2UqIHBvcHBlZEF1dG9SZWxl
YXNlID0gZm9udENhY2hlKCktPnBvcEF1dG9SZWxlYXNlKCk7CisgICAgQVNTRVJUKHBvcHBlZEF1
dG9SZWxlYXNlID09IHRoaXMpOworI2Vsc2UKKyAgICAodm9pZClmb250Q2FjaGUoKS0+cG9wQXV0
b1JlbGVhc2UoKTsKKyNlbmRpZgorfQorCit2b2lkIEZvbnRDYWNoZUF1dG9SZWxlYXNlOjpyZWxl
YXNlQWxsRm9udERhdGEoKQoreworICAgIFJlZmVyZW5jZWRGb250RGF0YU1hcDo6aXRlcmF0b3Ig
bWFwRW5kID0gbV9yZWZlcmVuY2VkRm9udERhdGFNYXAuZW5kKCk7CisgICAgUmVmZXJlbmNlZEZv
bnREYXRhTWFwOjppdGVyYXRvciBtYXBJdCA9IG1fcmVmZXJlbmNlZEZvbnREYXRhTWFwLmJlZ2lu
KCk7CisKKyAgICBmb3IgKDsgbWFwSXQgIT0gbWFwRW5kOyArK21hcEl0KQorICAgICAgICBmb250
Q2FjaGUoKS0+cmVsZWFzZUZvbnREYXRhKHN0YXRpY19jYXN0PGNvbnN0IFNpbXBsZUZvbnREYXRh
Kj4obWFwSXQtPmZpcnN0KSwgbWFwSXQtPnNlY29uZCk7CisKKyAgICBtX3JlZmVyZW5jZWRGb250
RGF0YU1hcC5jbGVhcigpOworfQorCit2b2lkIEZvbnRDYWNoZUF1dG9SZWxlYXNlOjphZGRGb250
RGF0YVRvUmVsZWFzZShjb25zdCBGb250RGF0YSogZm9udERhdGEpCit7CisgICAgc2l6ZV90IHJl
ZkNvdW50ID0gMTsKKyAgICBSZWZlcmVuY2VkRm9udERhdGFNYXA6Oml0ZXJhdG9yIHJlc3VsdCA9
IG1fcmVmZXJlbmNlZEZvbnREYXRhTWFwLmZpbmQoZm9udERhdGEpOworICAgIGlmIChyZXN1bHQg
IT0gbV9yZWZlcmVuY2VkRm9udERhdGFNYXAuZW5kKCkpCisgICAgICAgIHJlZkNvdW50ID0gcmVz
dWx0LT5zZWNvbmQgKyAxOworCisgICAgbV9yZWZlcmVuY2VkRm9udERhdGFNYXAuc2V0KGZvbnRE
YXRhLCByZWZDb3VudCk7Cit9CisKK3ZvaWQgRm9udENhY2hlOjpwdXNoQXV0b1JlbGVhc2UoRm9u
dENhY2hlQXV0b1JlbGVhc2UqIGF1dG9SZWxlYXNlKQoreworICAgIG1fYXV0b1JlbGVhc2VTdGFj
ay5hcHBlbmQoYXV0b1JlbGVhc2UpOworfQorCitGb250Q2FjaGVBdXRvUmVsZWFzZSogRm9udENh
Y2hlOjpwb3BBdXRvUmVsZWFzZSgpCit7CisgICAgRm9udENhY2hlQXV0b1JlbGVhc2UqIHJlc3Vs
dCA9IDA7CisKKyAgICBBU1NFUlQobV9hdXRvUmVsZWFzZVN0YWNrLnNpemUoKSk7CisKKyAgICBp
ZiAobV9hdXRvUmVsZWFzZVN0YWNrLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzdWx0ID0gbV9h
dXRvUmVsZWFzZVN0YWNrLmxhc3QoKTsKKyAgICAgICAgbV9hdXRvUmVsZWFzZVN0YWNrLnJlbW92
ZUxhc3QoKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyAgICAKK3ZvaWQg
Rm9udENhY2hlOjphZGRGb250RGF0YVRvUmVsZWFzZShjb25zdCBGb250RGF0YSogZm9udERhdGEp
Cit7CisgICAgaWYgKG1fYXV0b1JlbGVhc2VTdGFjay5zaXplKCkgPiAwKQorICAgICAgICBtX2F1
dG9SZWxlYXNlU3RhY2subGFzdCgpLT5hZGRGb250RGF0YVRvUmVsZWFzZShmb250RGF0YSk7Cit9
CisKIGNvbnN0IEZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnREYXRhKGNvbnN0IEZvbnQmIGZv
bnQsIGludCYgZmFtaWx5SW5kZXgsIEZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKQogewogICAg
IFNpbXBsZUZvbnREYXRhKiByZXN1bHQgPSAwOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvRm9udENhY2hlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmgJKHJldmlzaW9uIDg3NjU5KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMy
LDYgKzMyLDcgQEAKIAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJk
Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAj
aW5jbHVkZSA8d3RmL3VuaWNvZGUvVW5pY29kZS5oPgogCkBAIC00OSwxOSArNTAsNDUgQEAgY2xh
c3MgRm9udERhdGE7CiBjbGFzcyBGb250RGVzY3JpcHRpb247CiBjbGFzcyBGb250U2VsZWN0b3I7
CiBjbGFzcyBTaW1wbGVGb250RGF0YTsKK2NsYXNzIEZvbnRDYWNoZTsKKworY2xhc3MgRm9udENh
Y2hlQXV0b1JlbGVhc2UgeworICAgIGZyaWVuZCBGb250Q2FjaGUqIGZvbnRDYWNoZSgpOworICAg
IGZyaWVuZCBjbGFzcyBGb250Q2FjaGU7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEhhc2hNYXA8
Y29uc3QgRm9udERhdGEqLCB1bnNpZ25lZD4gUmVmZXJlbmNlZEZvbnREYXRhTWFwOworCisgICAg
Rm9udENhY2hlQXV0b1JlbGVhc2UoYm9vbCBhdXRvUHVzaFBvcCA9IGZhbHNlKTsKKyAgICB+Rm9u
dENhY2hlQXV0b1JlbGVhc2UoKTsKKworICAgIHZvaWQgcHVzaCgpOworICAgIHZvaWQgcG9wKCk7
CisKKyAgICBib29sIGlzUmVmZXJlbmNlZChjb25zdCBGb250RGF0YSogZm9udERhdGEpIHsgcmV0
dXJuIG1fcmVmZXJlbmNlZEZvbnREYXRhTWFwLmNvbnRhaW5zKGZvbnREYXRhKTsgfTsKKyAgICB2
b2lkIHJlbGVhc2VBbGxGb250RGF0YSgpOworCitwcml2YXRlOgorICAgIHZvaWQgYWRkRm9udERh
dGFUb1JlbGVhc2UoY29uc3QgRm9udERhdGEqKTsKKyAgICAKKyAgICBib29sIG1fYXV0b1B1c2hQ
b3A7CisgICAgUmVmZXJlbmNlZEZvbnREYXRhTWFwIG1fcmVmZXJlbmNlZEZvbnREYXRhTWFwOwor
fTsKIAogY2xhc3MgRm9udENhY2hlIHsKKyAgICBmcmllbmQgY2xhc3MgRm9udENhY2hlQXV0b1Jl
bGVhc2U7CisKICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShGb250Q2FjaGUpOyBXVEZfTUFLRV9G
QVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKICAgICBmcmllbmQgRm9udENhY2hlKiBmb250Q2FjaGUo
KTsKIAogICAgIGNvbnN0IEZvbnREYXRhKiBnZXRGb250RGF0YShjb25zdCBGb250JiwgaW50JiBm
YW1pbHlJbmRleCwgRm9udFNlbGVjdG9yKik7Ci0gICAgdm9pZCByZWxlYXNlRm9udERhdGEoY29u
c3QgU2ltcGxlRm9udERhdGEqKTsKLSAgICAKKyAgICB2b2lkIGFzc3VyZU9uZUhvbGQoY29uc3Qg
U2ltcGxlRm9udERhdGEqKTsKKyAgICB2b2lkIHJlbGVhc2VGb250RGF0YShjb25zdCBTaW1wbGVG
b250RGF0YSosIHVuc2lnbmVkIGRlcmVmQ291bnQgPSAxKTsKKyAKICAgICAvLyBUaGlzIG1ldGhv
ZCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCi0gICAgLy8gRklYTUU6IEZvbnQgZGF0
YSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBuZXZlciBnbyBpbmFjdGl2ZSBiZWNhdXNlIGNhbGxl
cnMgZG9uJ3QgdHJhY2sgYW5kIHJlbGVhc2UgdGhlbS4KICAgICBjb25zdCBTaW1wbGVGb250RGF0
YSogZ2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmLCBjb25zdCBVQ2hhciogY2hh
cmFjdGVycywgaW50IGxlbmd0aCk7Ci0gICAgCisKICAgICAvLyBBbHNvIGltcGxlbWVudGVkIGJ5
IHRoZSBwbGF0Zm9ybS4KICAgICB2b2lkIHBsYXRmb3JtSW5pdCgpOwogCkBAIC05Nyw2ICsxMjQs
MTAgQEAgcHJpdmF0ZToKICAgICBGb250Q2FjaGUoKTsKICAgICB+Rm9udENhY2hlKCk7CiAKKyAg
ICB2b2lkIHB1c2hBdXRvUmVsZWFzZShGb250Q2FjaGVBdXRvUmVsZWFzZSopOworICAgIEZvbnRD
YWNoZUF1dG9SZWxlYXNlKiBwb3BBdXRvUmVsZWFzZSgpOworICAgIHZvaWQgYWRkRm9udERhdGFU
b1JlbGVhc2UoY29uc3QgRm9udERhdGEqKTsKKwogICAgIC8vIEZJWE1FOiBUaGlzIG1ldGhvZCBz
aG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIEZvbnRQbGF0Zm9ybURhdGEqIGdldENh
Y2hlZEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiwgY29uc3QgQXRvbWlj
U3RyaW5nJiBmYW1pbHksIGJvb2wgY2hlY2tpbmdBbHRlcm5hdGVOYW1lID0gZmFsc2UpOwogCkBA
IC0xMDYsNiArMTM3LDggQEAgcHJpdmF0ZToKIAogICAgIFNpbXBsZUZvbnREYXRhKiBnZXRDYWNo
ZWRGb250RGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhKik7CiAKKyAgICBWZWN0b3I8Rm9udENh
Y2hlQXV0b1JlbGVhc2UqPiBtX2F1dG9SZWxlYXNlU3RhY2s7CisKICAgICBmcmllbmQgY2xhc3Mg
U2ltcGxlRm9udERhdGE7IC8vIEZvciBnZXRDYWNoZWRGb250RGF0YShjb25zdCBGb250UGxhdGZv
cm1EYXRhKikKICAgICBmcmllbmQgY2xhc3MgRm9udEZhbGxiYWNrTGlzdDsKIH07CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAJ
KHJldmlzaW9uIDg3NjU5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9u
dEZhc3RQYXRoLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzcsNiArNzcsMTAgQEAgR2x5cGhEYXRh
IEZvbnQ6OmdseXBoRGF0YUZvckNoYXJhY3RlcihVQwogICAgICAgICAgICAgcGFnZSA9IG5vZGUt
PnBhZ2UoKTsKICAgICAgICAgICAgIGlmIChwYWdlKSB7CiAgICAgICAgICAgICAgICAgR2x5cGhE
YXRhIGRhdGEgPSBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7CisKKyAgICAgICAgICAg
ICAgICBpZiAobm9kZS0+aXNTeXN0ZW1GYWxsYmFjaygpICYmIGRhdGEuZm9udERhdGEpCisgICAg
ICAgICAgICAgICAgICAgIGZvbnRDYWNoZSgpLT5hc3N1cmVPbmVIb2xkKGRhdGEuZm9udERhdGEp
OworCiAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZm9udERhdGEgJiYgKGRhdGEuZm9udERhdGEt
PnBsYXRmb3JtRGF0YSgpLm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbCB8fCBkYXRhLmZvbnRE
YXRhLT5pc1RleHRPcmllbnRhdGlvbkZhbGxiYWNrKCkpKQogICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZGF0YTsKIApAQCAtOTcsNiArMTAxLDEwIEBAIEdseXBoRGF0YSBGb250OjpnbHlwaERh
dGFGb3JDaGFyYWN0ZXIoVUMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhE
YXRhIHZlcnRpY2FsUmlnaHREYXRhID0gdmVydGljYWxSaWdodFBhZ2UtPmdseXBoRGF0YUZvckNo
YXJhY3RlcihjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGds
eXBocyBhcmUgZGlzdGluY3QsIHdlIHdpbGwgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBm
b250IGhhcyBhIHZlcnRpY2FsLXJpZ2h0IGdseXBoIGJha2VkCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIGludG8gaXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKHZlcnRpY2FsUmlnaHROb2RlLT5pc1N5c3RlbUZhbGxiYWNrKCkgJiYgdmVydGljYWxS
aWdodERhdGEuZm9udERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
b250Q2FjaGUoKS0+YXNzdXJlT25lSG9sZCh2ZXJ0aWNhbFJpZ2h0RGF0YS5mb250RGF0YSk7CisK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZ2x5cGggIT0gdmVydGlj
YWxSaWdodERhdGEuZ2x5cGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGdseXBo
cyBhcmUgaWRlbnRpY2FsLCBtZWFuaW5nIHRoYXQgd2Ugc2hvdWxkIGp1c3QgdXNlIHRoZSBob3Jp
em9udGFsIGdseXBoLgpAQCAtMTEwLDYgKzExOCwxMCBAQCBHbHlwaERhdGEgRm9udDo6Z2x5cGhE
YXRhRm9yQ2hhcmFjdGVyKFVDCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcmln
aHRQYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdseXBoRGF0YSB1cHJp
Z2h0RGF0YSA9IHVwcmlnaHRQYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7CiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBnbHlwaHMgYXJlIHRoZSBzYW1lLCB0
aGVuIHdlIGtub3cgd2UgY2FuIGp1c3QgdXNlIHRoZSBob3Jpem9udGFsIGdseXBoIHJvdGF0ZWQg
dmVydGljYWxseSB0byBiZSB1cHJpZ2h0LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICh1cHJpZ2h0Tm9kZS0+aXNTeXN0ZW1GYWxsYmFjaygpICYmIHVwcmlnaHREYXRhLmZv
bnREYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udENhY2hlKCkt
PmFzc3VyZU9uZUhvbGQodXByaWdodERhdGEuZm9udERhdGEpOworCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChkYXRhLmdseXBoID09IHVwcmlnaHREYXRhLmdseXBoKQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBnbHlwaHMgYXJlIGRpc3RpbmN0LCBtZWFuaW5n
IHRoYXQgdGhlIGZvbnQgaGFzIGEgdmVydGljYWwtcmlnaHQgZ2x5cGggYmFrZWQgaW50byBpdC4g
V2UgY2FuJ3QgdXNlIHRoYXQKQEAgLTE0Myw2ICsxNTUsOSBAQCBHbHlwaERhdGEgRm9udDo6Z2x5
cGhEYXRhRm9yQ2hhcmFjdGVyKFVDCiAgICAgICAgICAgICBpZiAocGFnZSkgewogICAgICAgICAg
ICAgICAgIEdseXBoRGF0YSBkYXRhID0gcGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMpOwog
ICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvbnREYXRhKSB7CisgICAgICAgICAgICAgICAgICAg
IGlmIChub2RlLT5pc1N5c3RlbUZhbGxiYWNrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBm
b250Q2FjaGUoKS0+YXNzdXJlT25lSG9sZChkYXRhLmZvbnREYXRhKTsKKwogICAgICAgICAgICAg
ICAgICAgICAvLyBUaGUgdmFyaWFudEZvbnREYXRhIGZ1bmN0aW9uIHNob3VsZCBub3Qgbm9ybWFs
bHkgcmV0dXJuIDAuCiAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBpZiBpdCBkb2VzLCB3ZSB3
aWxsIGp1c3QgcmVuZGVyIHRoZSBjYXBpdGFsIGxldHRlciBiaWcuCiAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiB2YXJpYW50Rm9udERhdGEgPSBkYXRhLmZvbnREYXRh
LT52YXJpYW50Rm9udERhdGEobV9mb250RGVzY3JpcHRpb24sIHZhcmlhbnQpOwpAQCAtMTUzLDgg
KzE2OCwxMSBAQCBHbHlwaERhdGEgRm9udDo6Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKFVDCiAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoUGFnZSogdmFyaWFudFBhZ2UgPSB2YXJpYW50Tm9k
ZS0+cGFnZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudFBhZ2UpIHsKICAgICAg
ICAgICAgICAgICAgICAgICAgIEdseXBoRGF0YSBkYXRhID0gdmFyaWFudFBhZ2UtPmdseXBoRGF0
YUZvckNoYXJhY3RlcihjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvbnRE
YXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZm9udERhdGEpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudE5vZGUtPmlzU3lzdGVtRmFsbGJhY2so
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udENhY2hlKCktPmFzc3VyZU9u
ZUhvbGQoZGF0YS5mb250RGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0K
IAogICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYXR0ZW1wdCBzeXN0ZW0gZmFsbGJhY2sg
b2ZmIHRoZSB2YXJpYW50Rm9udERhdGEuIFRoaXMgaXMgdGhlIHZlcnkgdW5saWtlbHkgY2FzZSB0
aGF0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2UuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2Uu
aAkocmV2aXNpb24gODc2NTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9H
bHlwaFBhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTIyLDYgKzEyMiwxNiBAQCBwdWJsaWM6CiAg
ICAgICAgIG1lbXNldChtX2dseXBoRm9udERhdGEsIDAsIHNpemVvZihtX2dseXBoRm9udERhdGEp
KTsKICAgICB9CiAgICAgCisgICAgdm9pZCBjbGVhckZvckZvbnREYXRhKGNvbnN0IFNpbXBsZUZv
bnREYXRhKiBmb250RGF0YSkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobV9nbHlwaEZvbnREYXRhW2ldID09IGZvbnRE
YXRhKSB7CisgICAgICAgICAgICAgICAgbV9nbHlwaHNbaV0gPSAwOworICAgICAgICAgICAgICAg
IG1fZ2x5cGhGb250RGF0YVtpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKICAgICBHbHlwaFBhZ2VUcmVlTm9kZSogb3duZXIoKSBjb25zdCB7IHJldHVybiBtX293bmVy
OyB9CiAKICAgICAvLyBJbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9kZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUu
Y3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dseXBoUGFnZVRyZWVOb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzc0LDYgKzM3NCwxMCBA
QCB2b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZUZvbnREYXRhKGNvCiAgICAgaWYgKCFmb250
RGF0YSkKICAgICAgICAgcmV0dXJuOwogCisgICAgLy8gUHJ1bmUgZmFsbCBiYWNrIGNoaWxkIChp
ZiBhbnkpIG9mIHRoaXMgZm9udC4KKyAgICBpZiAobV9zeXN0ZW1GYWxsYmFja0NoaWxkICYmIG1f
c3lzdGVtRmFsbGJhY2tDaGlsZC0+bV9wYWdlKQorICAgICAgICBtX3N5c3RlbUZhbGxiYWNrQ2hp
bGQtPm1fcGFnZS0+Y2xlYXJGb3JGb250RGF0YShmb250RGF0YSk7CisKICAgICAvLyBQcnVuZSBh
bnkgYnJhbmNoIHRoYXQgY29udGFpbnMgdGhpcyBGb250RGF0YS4KICAgICBIYXNoTWFwPGNvbnN0
IEZvbnREYXRhKiwgR2x5cGhQYWdlVHJlZU5vZGUqPjo6aXRlcmF0b3IgY2hpbGQgPSBtX2NoaWxk
cmVuLmZpbmQoZm9udERhdGEpOwogICAgIGlmIChjaGlsZCA9PSBtX2NoaWxkcmVuLmVuZCgpKSB7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxl
Rm9udERhdGEuY3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTMyLDYgKzEz
Miw5IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKIAogU2ltcGxl
Rm9udERhdGE6On5TaW1wbGVGb250RGF0YSgpCiB7CisgICAgaWYgKG1fZGVyaXZlZEZvbnREYXRh
KQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YS0+cHJ1bmVGcm9tR2x5cGhQYWdlVHJlZSgpOwor
CiAjaWYgRU5BQkxFKFNWR19GT05UUykKICAgICBpZiAoIW1fZm9udERhdGEpCiAjZW5kaWYKQEAg
LTIwMiw5ICsyMDUsMjUgQEAgUGFzc093blB0cjxTaW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnRE
YQogCiBTaW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnREYXRhOjp+RGVyaXZlZEZvbnREYXRhKCkK
IHsKLSAgICBpZiAoIWZvckN1c3RvbUZvbnQpCi0gICAgICAgIHJldHVybjsKK30KIAordm9pZCBT
aW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnREYXRhOjpwcnVuZUZyb21HbHlwaFBhZ2VUcmVlKCkK
K3sKKyAgICBpZiAoIWZvckN1c3RvbUZvbnQpIHsKKyAgICAgICAgaWYgKHNtYWxsQ2FwcykKKyAg
ICAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVGb250RGF0YShzbWFsbENhcHMu
Z2V0KCkpOworICAgICAgICBpZiAoZW1waGFzaXNNYXJrKQorICAgICAgICAgICAgR2x5cGhQYWdl
VHJlZU5vZGU6OnBydW5lVHJlZUZvbnREYXRhKGVtcGhhc2lzTWFyay5nZXQoKSk7CisgICAgICAg
IGlmIChicm9rZW5JZGVvZ3JhcGgpCisgICAgICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1
bmVUcmVlRm9udERhdGEoYnJva2VuSWRlb2dyYXBoLmdldCgpKTsKKyAgICAgICAgaWYgKHZlcnRp
Y2FsUmlnaHRPcmllbnRhdGlvbikKKyAgICAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVu
ZVRyZWVGb250RGF0YSh2ZXJ0aWNhbFJpZ2h0T3JpZW50YXRpb24uZ2V0KCkpOworICAgICAgICBp
ZiAodXByaWdodE9yaWVudGF0aW9uKQorICAgICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGU6OnBy
dW5lVHJlZUZvbnREYXRhKHVwcmlnaHRPcmllbnRhdGlvbi5nZXQoKSk7CisKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICAKICAgICBpZiAoc21hbGxDYXBzKQogICAgICAgICBHbHlwaFBhZ2VU
cmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEoc21hbGxDYXBzLmdldCgpKTsKICAgICBp
ZiAoZW1waGFzaXNNYXJrKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
U2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9TaW1wbGVGb250RGF0YS5oCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgJKHdvcmtpbmcgY29weSkKQEAg
LTI1NSw2ICsyNTUsOCBAQCBwcml2YXRlOgogICAgICAgICBPd25QdHI8U2ltcGxlRm9udERhdGE+
IHZlcnRpY2FsUmlnaHRPcmllbnRhdGlvbjsKICAgICAgICAgT3duUHRyPFNpbXBsZUZvbnREYXRh
PiB1cHJpZ2h0T3JpZW50YXRpb247CiAKKyAgICAgICAgdm9pZCBwcnVuZUZyb21HbHlwaFBhZ2VU
cmVlKCk7CisKICAgICBwcml2YXRlOgogICAgICAgICBEZXJpdmVkRm9udERhdGEoYm9vbCBjdXN0
b20pCiAgICAgICAgICAgICA6IGZvckN1c3RvbUZvbnQoY3VzdG9tKQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNoZU1hYy5tbQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udENhY2hlTWFjLm1tCShy
ZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9G
b250Q2FjaGVNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTE1Miw3ICsxNTIsMTAgQEAgY29uc3Qg
U2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgICAgICAhZm9udC5pc1BsYXRm
b3JtRm9udCgpICYmIGlzQXBwS2l0Rm9udFdlaWdodEJvbGQod2VpZ2h0KSAmJiAhaXNBcHBLaXRG
b250V2VpZ2h0Qm9sZChzdWJzdGl0dXRlRm9udFdlaWdodCksCiAgICAgICAgICFmb250LmlzUGxh
dGZvcm1Gb250KCkgJiYgKHRyYWl0cyAmIE5TRm9udEl0YWxpY1RyYWl0KSAmJiAhKHN1YnN0aXR1
dGVGb250VHJhaXRzICYgTlNGb250SXRhbGljVHJhaXQpLAogICAgICAgICBwbGF0Zm9ybURhdGEu
bV9vcmllbnRhdGlvbik7Ci0gICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVG
b250KTsKKworICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiByZXN1bHQgPSBnZXRDYWNoZWRGb250
RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisgICAgYWRkRm9udERhdGFUb1JlbGVhc2UocmVzdWx0KTsK
KyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRT
aW1pbGFyRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250JiBmb250KQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbWFjL01lbW9yeVByZXNzdXJlSGFuZGxlck1hYy5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvTWVtb3J5UHJlc3N1cmVIYW5kbGVyTWFj
Lm1tCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9NZW1v
cnlQcmVzc3VyZUhhbmRsZXJNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAK
ICNpbXBvcnQgIk1lbW9yeVByZXNzdXJlSGFuZGxlci5oIgogCiAjaW1wb3J0IDxXZWJDb3JlL0dD
Q29udHJvbGxlci5oPgorI2ltcG9ydCA8V2ViQ29yZS9Gb250Q2FjaGUuaD4KICNpbXBvcnQgPFdl
YkNvcmUvTWVtb3J5Q2FjaGUuaD4KICNpbXBvcnQgPFdlYkNvcmUvUGFnZUNhY2hlLmg+CiAjaW1w
b3J0IDx3dGYvRmFzdE1hbGxvYy5oPgpAQCAtNjksNyArNzAsNyBAQCB2b2lkIE1lbW9yeVByZXNz
dXJlSGFuZGxlcjo6aW5zdGFsbCgpCiAgICAgICAgIH0pOwogICAgIH0KIAotI2lmbmRlZiBOREVC
VUcKKy8vI2lmbmRlZiBOREVCVUcKICAgICBpZiAoIV9jYWNoZV9ldmVudF9zb3VyY2UyKSB7CiAg
ICAgICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57CiAgICAg
ICAgICAgICBfY2FjaGVfZXZlbnRfc291cmNlMiA9IGRpc3BhdGNoX3NvdXJjZV9jcmVhdGUoRElT
UEFUQ0hfU09VUkNFX1RZUEVfU0lHTkFMLCBTSUdVU1IyLCAwLCBkaXNwYXRjaF9nZXRfbWFpbl9x
dWV1ZSgpKTsKQEAgLTgxLDcgKzgyLDcgQEAgdm9pZCBNZW1vcnlQcmVzc3VyZUhhbmRsZXI6Omlu
c3RhbGwoKQogICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgICB9Ci0jZW5kaWYKKy8vI2Vu
ZGlmCiB9CiAKIHZvaWQgTWVtb3J5UHJlc3N1cmVIYW5kbGVyOjpyZXNwb25kVG9NZW1vcnlQcmVz
c3VyZSgpCkBAIC05Niw2ICs5Nyw4IEBAIHZvaWQgTWVtb3J5UHJlc3N1cmVIYW5kbGVyOjpyZXNw
b25kVG9NZW0KICAgICBbbnN1cmxDYWNoZSBzZXRNZW1vcnlDYXBhY2l0eTpbbnN1cmxDYWNoZSBj
dXJyZW50TWVtb3J5VXNhZ2VdLzJdOwogICAgIFtuc3VybENhY2hlIHNldE1lbW9yeUNhcGFjaXR5
OnNhdmVkTnN1cmxDYWNoZU1lbW9yeUNhcGFjaXR5XTsKICAKKyAgICBmb250Q2FjaGUoKS0+cHVy
Z2VJbmFjdGl2ZUZvbnREYXRhKCk7CisKICAgICBtZW1vcnlDYWNoZSgpLT5wcnVuZVRvUGVyY2Vu
dGFnZSgwLjVmKTsKIAogICAgIGdjQ29udHJvbGxlcigpLmdhcmJhZ2VDb2xsZWN0Tm93KCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95679</attachid>
            <date>2011-06-01 15:50:56 -0700</date>
            <delta_ts>2011-06-03 14:51:15 -0700</delta_ts>
            <desc>Patch with changes to address comments</desc>
            <filename>61875-1.patch</filename>
            <type>text/plain</type>
            <size>27347</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg3ODU1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzAgQEAKKzIwMTEtMDYtMDEgIE1pY2hhZWwg
U2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgRm9udHMgcmV0dXJuZWQgYnkgRm9udENhY2hlOjpnZXRGb250
RGF0YUZvckNoYXJhY3RlcnMoKSBhcmUgbmV2ZXIgcmVsZWFzZWQKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYxODc1CisKKyAgICAgICAgQWRkZWQgY29k
ZSB0byBjbGVhbiB1cCBzeXN0ZW0gZmFsbCBiYWNrIGZvbnQgcmVmZXJlbmNlcyBpbiBnbHlwaCBw
YWdlIHRyZWUuCisgICAgICAgIENvcnJlY3RlZCBhIGZldyBvdGhlciBlcnJvcnMgaW4gdGhlIGZv
bnQgY2xlYW51cCBoYW5kbGluZyBpbiB0aGUgZ2x5cGggcGFnZQorICAgICAgICB0cmVlLiAgQWRk
ZWQgYW4gYXV0byByZWxlYXNlIG1lY2hhbmlzbSB0byB0aGUgZm9udCBjYWNoZSBmb3IgYWNjZXNz
IHZpYQorICAgICAgICB0aGUgRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMgbWV0
aG9kLgorICAgICAgICBXcmFwcGVkIHRoZSBjb3JlIG9mIHRoZSBsYXlvdXQgYW5kIHBhaW50Q29u
dGVudHMgbWV0aG9kcyBvZiBGcmFtZVZpZXcgdXNpbmcKKyAgICAgICAgYSBmb250IGNhY2hlIGF1
dG8gcmVsZWFzZSBvYmplY3QuICBBZGRlZCBjYWxsIGluIG1lbW9yeSBwcmVzc3VyZSBoYW5kbGVy
IHRvCisgICAgICAgIHB1cmdlIGluYWN0aXZlIGZvbnRzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0
IGFzIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBub3QgY2hhbmdlZC4gSW1wcm92ZWQgZm9udCBsaWZl
IGN5Y2xlCisgICAgICAgIG1hbmFnZW1lbnQuCisKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OkZyYW1lVmlldyk6CisgICAgICAgIChX
ZWJDb3JlOjpGcmFtZVZpZXc6OmxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6
OnBhaW50Q29udGVudHMpOgorICAgICAgICAqIHBhZ2UvRnJhbWVWaWV3Lmg6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRD
YWNoZTo6Z2V0Q2FjaGVkRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjph
c3N1cmVPbmVIb2xkKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cmVsZWFzZUZvbnRE
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZUF1dG9SZWxlYXNlOjpGb250Q2FjaGVB
dXRvUmVsZWFzZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVBdXRvUmVsZWFzZTo6fkZv
bnRDYWNoZUF1dG9SZWxlYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZUF1dG9SZWxl
YXNlOjpwdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZUF1dG9SZWxlYXNlOjpwb3Ap
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlQXV0b1JlbGVhc2U6OnJlbGVhc2VBbGxGb250
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVBdXRvUmVsZWFzZTo6YWRkRm9udERh
dGFUb1JlbGVhc2UpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpwdXNoQXV0b1JlbGVh
c2UpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpwb3BBdXRvUmVsZWFzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmFkZEZvbnREYXRhVG9SZWxlYXNlKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRD
YWNoZUF1dG9SZWxlYXNlOjppc1JlZmVyZW5jZWQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRGYXN0UGF0aC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpnbHlwaERhdGFG
b3JDaGFyYWN0ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oOgor
ICAgICAgICAoV2ViQ29yZTo6R2x5cGhQYWdlOjpjbGVhckZvckZvbnREYXRhKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9kZS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVGb250RGF0YSk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxl
Rm9udERhdGE6On5TaW1wbGVGb250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250
RGF0YTo6RGVyaXZlZEZvbnREYXRhOjp+RGVyaXZlZEZvbnREYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6OlNpbXBsZUZvbnREYXRhOjpEZXJpdmVkRm9udERhdGE6OnBydW5lRnJvbUdseXBoUGFnZVRy
ZWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmg6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlQ2hyb21pdW1XaW4uY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBl
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0
ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9oYWlrdS9Gb250Q2FjaGVIYWlrdS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVy
cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNoZU1hYy5tbToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3d4L0ZvbnRDYWNoZVd4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNo
ZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvTWVt
b3J5UHJlc3N1cmVIYW5kbGVyTWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6TWVtb3J5UHJlc3N1
cmVIYW5kbGVyOjpyZXNwb25kVG9NZW1vcnlQcmVzc3VyZSk6CisKIDIwMTEtMDYtMDEgIERhdmlk
IENhcnNvbiAgPGRhY2Fyc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbnR0
aSBLb2l2aXN0by4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHJldmlzaW9uIDg3
NjU5KQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCiAjaW5jbHVkZSAi
RmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRm9u
dENhY2hlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZUFjdGlvblNjaGVk
dWxlci5oIgogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC0xMTQsNiArMTE1LDcgQEAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIG1heFVwZGF0ZVdpZGdldHNJdAogCiBGcmFtZVZpZXc6OkZyYW1l
VmlldyhGcmFtZSogZnJhbWUpCiAgICAgOiBtX2ZyYW1lKGZyYW1lKQorICAgICwgbV9mb250Q2Fj
aGVBdXRvUmVsZWFzZShhZG9wdFB0cihuZXcgRm9udENhY2hlQXV0b1JlbGVhc2UpKQogICAgICwg
bV9jYW5IYXZlU2Nyb2xsYmFycyh0cnVlKQogICAgICwgbV9zbG93UmVwYWludE9iamVjdENvdW50
KDApCiAgICAgLCBtX2ZpeGVkT2JqZWN0Q291bnQoMCkKQEAgLTg5Niw2ICs4OTgsOCBAQCB2b2lk
IEZyYW1lVmlldzo6bGF5b3V0KGJvb2wgYWxsb3dTdWJ0cmVlCiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKKyAgICBtX2ZvbnRDYWNoZUF1dG9SZWxlYXNlLT5wdXNoKCk7CisKICAgICBtX25lc3Rl
ZExheW91dENvdW50Kys7CiAKICAgICBpZiAoIW1fbGF5b3V0Um9vdCkgewpAQCAtMTAzMCw2ICsx
MDM0LDggQEAgdm9pZCBGcmFtZVZpZXc6OmxheW91dChib29sIGFsbG93U3VidHJlZQogICAgIHVw
ZGF0ZURhc2hib2FyZFJlZ2lvbnMoKTsKICNlbmRpZgogCisgICAgbV9mb250Q2FjaGVBdXRvUmVs
ZWFzZS0+cG9wKCk7CisKICAgICBBU1NFUlQoIXJvb3QtPm5lZWRzTGF5b3V0KCkpOwogCiAgICAg
dXBkYXRlQ2FuQmxpdE9uU2Nyb2xsUmVjdXJzaXZlbHkoKTsKQEAgLTI0MTksNiArMjQyNSw4IEBA
IHZvaWQgRnJhbWVWaWV3OjpwYWludENvbnRlbnRzKEdyYXBoaWNzQ28KICAgICBpZiAobmVlZHNM
YXlvdXQoKSkKICAgICAgICAgcmV0dXJuOwogCisgICAgbV9mb250Q2FjaGVBdXRvUmVsZWFzZS0+
cHVzaCgpOworCiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogICAgIGlmICghcC0+
cGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICBzeW5jQ29tcG9zaXRpbmdTdGF0ZUZvclRoaXNG
cmFtZSgpOwpAQCAtMjQ2OCw2ICsyNDc2LDggQEAgdm9pZCBGcmFtZVZpZXc6OnBhaW50Q29udGVu
dHMoR3JhcGhpY3NDbwogICAgICAgICB1cGRhdGVEYXNoYm9hcmRSZWdpb25zKCk7CiAjZW5kaWYK
IAorICAgIG1fZm9udENhY2hlQXV0b1JlbGVhc2UtPnBvcCgpOworCiAgICAgaWYgKGlzVG9wTGV2
ZWxQYWludGVyKQogICAgICAgICBzQ3VycmVudFBhaW50VGltZVN0YW1wID0gMDsKIApJbmRleDog
U291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wYWdlL0ZyYW1lVmlldy5oCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BhZ2UvRnJhbWVWaWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDcgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogY2xhc3MgQ29sb3I7CiBjbGFzcyBFdmVudDsKIGNsYXNzIEZsb2F0U2l6
ZTsKK2NsYXNzIEZvbnRDYWNoZUF1dG9SZWxlYXNlOwogY2xhc3MgRnJhbWU7CiBjbGFzcyBGcmFt
ZUFjdGlvblNjaGVkdWxlcjsKIGNsYXNzIEludFJlY3Q7CkBAIC0zNjMsNiArMzY0LDggQEAgcHJp
dmF0ZToKICAgICBPd25QdHI8UmVuZGVyRW1iZWRkZWRPYmplY3RTZXQ+IG1fd2lkZ2V0VXBkYXRl
U2V0OwogICAgIFJlZlB0cjxGcmFtZT4gbV9mcmFtZTsKIAorICAgIE93blB0cjxGb250Q2FjaGVB
dXRvUmVsZWFzZT4gbV9mb250Q2FjaGVBdXRvUmVsZWFzZTsKKwogICAgIGJvb2wgbV9kb0Z1bGxS
ZXBhaW50OwogICAgIAogICAgIGJvb2wgbV9jYW5IYXZlU2Nyb2xsYmFyczsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcAkocmV2aXNpb24g
ODc2NTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiRm9udEZhbGxiYWNr
TGlzdC5oIgogI2luY2x1ZGUgIkZvbnRQbGF0Zm9ybURhdGEuaCIKICNpbmNsdWRlICJGb250U2Vs
ZWN0b3IuaCIKKyNpbmNsdWRlICJHbHlwaFBhZ2VUcmVlTm9kZS5oIgogI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1N0
ZExpYkV4dHJhcy5oPgpAQCAtMjcxLDExICsyNzIsMTIgQEAgU2ltcGxlRm9udERhdGEqIEZvbnRD
YWNoZTo6Z2V0Q2FjaGVkRm9udAogICAgICAgICBnRm9udERhdGFDYWNoZSA9IG5ldyBGb250RGF0
YUNhY2hlOwogICAgICAgICBnSW5hY3RpdmVGb250RGF0YSA9IG5ldyBMaXN0SGFzaFNldDxjb25z
dCBTaW1wbGVGb250RGF0YSo+OwogICAgIH0KLSAgICAKKwogICAgIEZvbnREYXRhQ2FjaGU6Oml0
ZXJhdG9yIHJlc3VsdCA9IGdGb250RGF0YUNhY2hlLT5maW5kKCpwbGF0Zm9ybURhdGEpOwogICAg
IGlmIChyZXN1bHQgPT0gZ0ZvbnREYXRhQ2FjaGUtPmVuZCgpKSB7CiAgICAgICAgIHBhaXI8U2lt
cGxlRm9udERhdGEqLCB1bnNpZ25lZD4gbmV3VmFsdWUobmV3IFNpbXBsZUZvbnREYXRhKCpwbGF0
Zm9ybURhdGEpLCAxKTsKICAgICAgICAgZ0ZvbnREYXRhQ2FjaGUtPnNldCgqcGxhdGZvcm1EYXRh
LCBuZXdWYWx1ZSk7CisKICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlLmZpcnN0OwogICAgIH0KICAg
ICBpZiAoIXJlc3VsdC5nZXQoKS0+c2Vjb25kLnNlY29uZCsrKSB7CkBAIC0yODYsNyArMjg4LDE4
IEBAIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldENhY2hlZEZvbnQKICAgICByZXR1cm4g
cmVzdWx0LmdldCgpLT5zZWNvbmQuZmlyc3Q7CiB9CiAKLXZvaWQgRm9udENhY2hlOjpyZWxlYXNl
Rm9udERhdGEoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQordm9pZCBGb250Q2FjaGU6
OmFzc3VyZU9uZUhvbGQoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQoreworICAgIGlm
ICghbV9hdXRvUmVsZWFzZVRvcE9mU3RhY2sgfHwgbV9hdXRvUmVsZWFzZVRvcE9mU3RhY2stPmlz
UmVmZXJlbmNlZChmb250RGF0YSkpCisgICAgICAgIHJldHVybjsKKworICAgIEZvbnREYXRhQ2Fj
aGU6Oml0ZXJhdG9yIGNhY2hlRW50cnkgPSBnRm9udERhdGFDYWNoZS0+ZmluZChmb250RGF0YS0+
cGxhdGZvcm1EYXRhKCkpOworICAgIEFTU0VSVChjYWNoZUVudHJ5ICE9IGdGb250RGF0YUNhY2hl
LT5lbmQoKSk7CisgICAgY2FjaGVFbnRyeS5nZXQoKS0+c2Vjb25kLnNlY29uZCsrOworICAgIG1f
YXV0b1JlbGVhc2VUb3BPZlN0YWNrLT5hZGRGb250RGF0YVRvUmVsZWFzZShmb250RGF0YSk7Cit9
CisKK3ZvaWQgRm9udENhY2hlOjpyZWxlYXNlRm9udERhdGEoY29uc3QgU2ltcGxlRm9udERhdGEq
IGZvbnREYXRhLCB1bnNpZ25lZCBkZXJlZkNvdW50KQogewogICAgIEFTU0VSVChnRm9udERhdGFD
YWNoZSk7CiAgICAgQVNTRVJUKCFmb250RGF0YS0+aXNDdXN0b21Gb250KCkpOwpAQCAtMjk0LDcg
KzMwNyw5IEBAIHZvaWQgRm9udENhY2hlOjpyZWxlYXNlRm9udERhdGEoY29uc3QgU2kKICAgICBG
b250RGF0YUNhY2hlOjppdGVyYXRvciBpdCA9IGdGb250RGF0YUNhY2hlLT5maW5kKGZvbnREYXRh
LT5wbGF0Zm9ybURhdGEoKSk7CiAgICAgQVNTRVJUKGl0ICE9IGdGb250RGF0YUNhY2hlLT5lbmQo
KSk7CiAKLSAgICBpZiAoIS0taXQtPnNlY29uZC5zZWNvbmQpIHsKKyAgICBBU1NFUlQoaXQtPnNl
Y29uZC5zZWNvbmQgPj0gZGVyZWZDb3VudCk7CisgICAgaXQtPnNlY29uZC5zZWNvbmQgLT0gZGVy
ZWZDb3VudDsKKyAgICBpZiAoIWl0LT5zZWNvbmQuc2Vjb25kKSB7CiAgICAgICAgIGdJbmFjdGl2
ZUZvbnREYXRhLT5hZGQoZm9udERhdGEpOwogICAgICAgICBpZiAoZ0luYWN0aXZlRm9udERhdGEt
PnNpemUoKSA+IGNNYXhJbmFjdGl2ZUZvbnREYXRhKQogICAgICAgICAgICAgcHVyZ2VJbmFjdGl2
ZUZvbnREYXRhKGdJbmFjdGl2ZUZvbnREYXRhLT5zaXplKCkgLSBjVGFyZ2V0SW5hY3RpdmVGb250
RGF0YSk7CkBAIC0zNjQsNiArMzc5LDgzIEBAIHNpemVfdCBGb250Q2FjaGU6OmluYWN0aXZlRm9u
dERhdGFDb3VudCgKICAgICByZXR1cm4gMDsKIH0KIAorRm9udENhY2hlQXV0b1JlbGVhc2U6OkZv
bnRDYWNoZUF1dG9SZWxlYXNlKCkKK3sKK30KKworRm9udENhY2hlQXV0b1JlbGVhc2U6On5Gb250
Q2FjaGVBdXRvUmVsZWFzZSgpCit7CisgICAgcmVsZWFzZUFsbEZvbnREYXRhKCk7Cit9CisKK3Zv
aWQgRm9udENhY2hlQXV0b1JlbGVhc2U6OnB1c2goKQoreworICAgIGZvbnRDYWNoZSgpLT5wdXNo
QXV0b1JlbGVhc2UodGhpcyk7Cit9CisKK3ZvaWQgRm9udENhY2hlQXV0b1JlbGVhc2U6OnBvcCgp
Cit7IAorI2lmbmRlZiBOREVCVUcKKyAgICBGb250Q2FjaGVBdXRvUmVsZWFzZSogcG9wcGVkQXV0
b1JlbGVhc2UgPSBmb250Q2FjaGUoKS0+cG9wQXV0b1JlbGVhc2UoKTsKKyAgICBBU1NFUlQocG9w
cGVkQXV0b1JlbGVhc2UgPT0gdGhpcyk7CisjZWxzZQorICAgIGZvbnRDYWNoZSgpLT5wb3BBdXRv
UmVsZWFzZSgpOworI2VuZGlmCit9CisKK3ZvaWQgRm9udENhY2hlQXV0b1JlbGVhc2U6OnJlbGVh
c2VBbGxGb250RGF0YSgpCit7CisgICAgUmVmZXJlbmNlZEZvbnREYXRhTWFwOjppdGVyYXRvciBt
YXBFbmQgPSBtX3JlZmVyZW5jZWRGb250RGF0YU1hcC5lbmQoKTsKKyAgICBSZWZlcmVuY2VkRm9u
dERhdGFNYXA6Oml0ZXJhdG9yIG1hcEl0ID0gbV9yZWZlcmVuY2VkRm9udERhdGFNYXAuYmVnaW4o
KTsKKworICAgIGZvciAoOyBtYXBJdCAhPSBtYXBFbmQ7ICsrbWFwSXQpCisgICAgICAgIGZvbnRD
YWNoZSgpLT5yZWxlYXNlRm9udERhdGEoc3RhdGljX2Nhc3Q8Y29uc3QgU2ltcGxlRm9udERhdGEq
PihtYXBJdC0+Zmlyc3QpLCBtYXBJdC0+c2Vjb25kKTsKKworICAgIG1fcmVmZXJlbmNlZEZvbnRE
YXRhTWFwLmNsZWFyKCk7Cit9CisKK3ZvaWQgRm9udENhY2hlQXV0b1JlbGVhc2U6OmFkZEZvbnRE
YXRhVG9SZWxlYXNlKGNvbnN0IEZvbnREYXRhKiBmb250RGF0YSkKK3sKKyAgICBSZWZlcmVuY2Vk
Rm9udERhdGFNYXA6Oml0ZXJhdG9yIHJlc3VsdCA9IG1fcmVmZXJlbmNlZEZvbnREYXRhTWFwLmZp
bmQoZm9udERhdGEpOworICAgIGlmIChyZXN1bHQgIT0gbV9yZWZlcmVuY2VkRm9udERhdGFNYXAu
ZW5kKCkpIHsKKyAgICAgICAgKytyZXN1bHQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIG1fcmVmZXJlbmNlZEZvbnREYXRhTWFwLnNldChmb250RGF0YSwgMSk7Cit9CisK
K3ZvaWQgRm9udENhY2hlOjpwdXNoQXV0b1JlbGVhc2UoRm9udENhY2hlQXV0b1JlbGVhc2UqIGF1
dG9SZWxlYXNlKQoreworICAgIG1fYXV0b1JlbGVhc2VTdGFjay5hcHBlbmQoYXV0b1JlbGVhc2Up
OworICAgIG1fYXV0b1JlbGVhc2VUb3BPZlN0YWNrID0gYXV0b1JlbGVhc2U7Cit9CisKK0ZvbnRD
YWNoZUF1dG9SZWxlYXNlKiBGb250Q2FjaGU6OnBvcEF1dG9SZWxlYXNlKCkKK3sKKyAgICBGb250
Q2FjaGVBdXRvUmVsZWFzZSogcmVzdWx0ID0gMDsKKworICAgIEFTU0VSVChtX2F1dG9SZWxlYXNl
U3RhY2suc2l6ZSgpKTsKKworICAgIGlmIChtX2F1dG9SZWxlYXNlU3RhY2suc2l6ZSgpID4gMCkg
eworICAgICAgICByZXN1bHQgPSBtX2F1dG9SZWxlYXNlU3RhY2subGFzdCgpOworICAgICAgICBt
X2F1dG9SZWxlYXNlU3RhY2sucmVtb3ZlTGFzdCgpOworCisgICAgICAgIGlmIChtX2F1dG9SZWxl
YXNlU3RhY2suc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIG1fYXV0b1JlbGVhc2VUb3BPZlN0YWNr
ID0gbV9hdXRvUmVsZWFzZVN0YWNrLmxhc3QoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
bV9hdXRvUmVsZWFzZVRvcE9mU3RhY2sgPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCit2b2lkIEZvbnRDYWNoZTo6YWRkRm9udERhdGFUb1JlbGVhc2UoY29uc3QgRm9u
dERhdGEqIGZvbnREYXRhKQoreworICAgIGlmIChtX2F1dG9SZWxlYXNlVG9wT2ZTdGFjaykKKyAg
ICAgICAgbV9hdXRvUmVsZWFzZVRvcE9mU3RhY2stPmFkZEZvbnREYXRhVG9SZWxlYXNlKGZvbnRE
YXRhKTsKK30KKwogY29uc3QgRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGEoY29uc3Qg
Rm9udCYgZm9udCwgaW50JiBmYW1pbHlJbmRleCwgRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3Ip
CiB7CiAgICAgU2ltcGxlRm9udERhdGEqIHJlc3VsdCA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaAkocmV2aXNpb24gODc2NTkpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaAkod29ya2luZyBjb3B5
KQpAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8d3Rm
L0ZvcndhcmQuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0
b3IuaD4KICNpbmNsdWRlIDx3dGYvdW5pY29kZS9Vbmljb2RlLmg+CiAKQEAgLTQ5LDE5ICs1MCw0
NCBAQCBjbGFzcyBGb250RGF0YTsKIGNsYXNzIEZvbnREZXNjcmlwdGlvbjsKIGNsYXNzIEZvbnRT
ZWxlY3RvcjsKIGNsYXNzIFNpbXBsZUZvbnREYXRhOworY2xhc3MgRm9udENhY2hlOworCitjbGFz
cyBGb250Q2FjaGVBdXRvUmVsZWFzZSB7CisgICAgZnJpZW5kIEZvbnRDYWNoZSogZm9udENhY2hl
KCk7CisgICAgZnJpZW5kIGNsYXNzIEZvbnRDYWNoZTsKKworcHVibGljOgorICAgIHR5cGVkZWYg
SGFzaE1hcDxjb25zdCBGb250RGF0YSosIHVuc2lnbmVkPiBSZWZlcmVuY2VkRm9udERhdGFNYXA7
CisKKyAgICBGb250Q2FjaGVBdXRvUmVsZWFzZSgpOworICAgIH5Gb250Q2FjaGVBdXRvUmVsZWFz
ZSgpOworCisgICAgdm9pZCBwdXNoKCk7CisgICAgdm9pZCBwb3AoKTsKKworICAgIGJvb2wgaXNS
ZWZlcmVuY2VkKGNvbnN0IEZvbnREYXRhKiBmb250RGF0YSkgeyByZXR1cm4gbV9yZWZlcmVuY2Vk
Rm9udERhdGFNYXAuY29udGFpbnMoZm9udERhdGEpOyB9OworICAgIHZvaWQgcmVsZWFzZUFsbEZv
bnREYXRhKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBhZGRGb250RGF0YVRvUmVsZWFzZShjb25z
dCBGb250RGF0YSopOworCisgICAgUmVmZXJlbmNlZEZvbnREYXRhTWFwIG1fcmVmZXJlbmNlZEZv
bnREYXRhTWFwOworfTsKIAogY2xhc3MgRm9udENhY2hlIHsKKyAgICBmcmllbmQgY2xhc3MgRm9u
dENhY2hlQXV0b1JlbGVhc2U7CisKICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShGb250Q2FjaGUp
OyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKICAgICBmcmllbmQgRm9udENhY2hl
KiBmb250Q2FjaGUoKTsKIAogICAgIGNvbnN0IEZvbnREYXRhKiBnZXRGb250RGF0YShjb25zdCBG
b250JiwgaW50JiBmYW1pbHlJbmRleCwgRm9udFNlbGVjdG9yKik7Ci0gICAgdm9pZCByZWxlYXNl
Rm9udERhdGEoY29uc3QgU2ltcGxlRm9udERhdGEqKTsKLSAgICAKKyAgICB2b2lkIGFzc3VyZU9u
ZUhvbGQoY29uc3QgU2ltcGxlRm9udERhdGEqKTsKKyAgICB2b2lkIHJlbGVhc2VGb250RGF0YShj
b25zdCBTaW1wbGVGb250RGF0YSosIHVuc2lnbmVkIGRlcmVmQ291bnQgPSAxKTsKKyAKICAgICAv
LyBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCi0gICAgLy8gRklY
TUU6IEZvbnQgZGF0YSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBuZXZlciBnbyBpbmFjdGl2ZSBi
ZWNhdXNlIGNhbGxlcnMgZG9uJ3QgdHJhY2sgYW5kIHJlbGVhc2UgdGhlbS4KICAgICBjb25zdCBT
aW1wbGVGb250RGF0YSogZ2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmLCBjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCk7Ci0gICAgCisKICAgICAvLyBBbHNvIGlt
cGxlbWVudGVkIGJ5IHRoZSBwbGF0Zm9ybS4KICAgICB2b2lkIHBsYXRmb3JtSW5pdCgpOwogCkBA
IC05Nyw2ICsxMjMsMTAgQEAgcHJpdmF0ZToKICAgICBGb250Q2FjaGUoKTsKICAgICB+Rm9udENh
Y2hlKCk7CiAKKyAgICB2b2lkIHB1c2hBdXRvUmVsZWFzZShGb250Q2FjaGVBdXRvUmVsZWFzZSop
OworICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlKiBwb3BBdXRvUmVsZWFzZSgpOworICAgIHZvaWQg
YWRkRm9udERhdGFUb1JlbGVhc2UoY29uc3QgRm9udERhdGEqKTsKKwogICAgIC8vIEZJWE1FOiBU
aGlzIG1ldGhvZCBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIEZvbnRQbGF0Zm9y
bURhdGEqIGdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiwg
Y29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHksIGJvb2wgY2hlY2tpbmdBbHRlcm5hdGVOYW1lID0g
ZmFsc2UpOwogCkBAIC0xMDYsNiArMTM2LDkgQEAgcHJpdmF0ZToKIAogICAgIFNpbXBsZUZvbnRE
YXRhKiBnZXRDYWNoZWRGb250RGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhKik7CiAKKyAgICBW
ZWN0b3I8Rm9udENhY2hlQXV0b1JlbGVhc2UqPiBtX2F1dG9SZWxlYXNlU3RhY2s7CisgICAgRm9u
dENhY2hlQXV0b1JlbGVhc2UqIG1fYXV0b1JlbGVhc2VUb3BPZlN0YWNrOworCiAgICAgZnJpZW5k
IGNsYXNzIFNpbXBsZUZvbnREYXRhOyAvLyBGb3IgZ2V0Q2FjaGVkRm9udERhdGEoY29uc3QgRm9u
dFBsYXRmb3JtRGF0YSopCiAgICAgZnJpZW5kIGNsYXNzIEZvbnRGYWxsYmFja0xpc3Q7CiB9OwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBh
dGguY3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRGYXN0UGF0aC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc3LDYgKzc3LDEwIEBAIEds
eXBoRGF0YSBGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIoVUMKICAgICAgICAgICAgIHBhZ2Ug
PSBub2RlLT5wYWdlKCk7CiAgICAgICAgICAgICBpZiAocGFnZSkgewogICAgICAgICAgICAgICAg
IEdseXBoRGF0YSBkYXRhID0gcGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMpOworCisgICAg
ICAgICAgICAgICAgaWYgKG5vZGUtPmlzU3lzdGVtRmFsbGJhY2soKSAmJiBkYXRhLmZvbnREYXRh
KQorICAgICAgICAgICAgICAgICAgICBmb250Q2FjaGUoKS0+YXNzdXJlT25lSG9sZChkYXRhLmZv
bnREYXRhKTsKKwogICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvbnREYXRhICYmIChkYXRhLmZv
bnREYXRhLT5wbGF0Zm9ybURhdGEoKS5vcmllbnRhdGlvbigpID09IEhvcml6b250YWwgfHwgZGF0
YS5mb250RGF0YS0+aXNUZXh0T3JpZW50YXRpb25GYWxsYmFjaygpKSkKICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGRhdGE7CiAKQEAgLTk3LDYgKzEwMSwxMCBAQCBHbHlwaERhdGEgRm9udDo6
Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKFVDCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEdseXBoRGF0YSB2ZXJ0aWNhbFJpZ2h0RGF0YSA9IHZlcnRpY2FsUmlnaHRQYWdlLT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElm
IHRoZSBnbHlwaHMgYXJlIGRpc3RpbmN0LCB3ZSB3aWxsIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhh
dCB0aGUgZm9udCBoYXMgYSB2ZXJ0aWNhbC1yaWdodCBnbHlwaCBiYWtlZAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIGl0LgorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICh2ZXJ0aWNhbFJpZ2h0Tm9kZS0+aXNTeXN0ZW1GYWxsYmFjaygpICYmIHZl
cnRpY2FsUmlnaHREYXRhLmZvbnREYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZm9udENhY2hlKCktPmFzc3VyZU9uZUhvbGQodmVydGljYWxSaWdodERhdGEuZm9udERh
dGEpOworCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmdseXBoICE9
IHZlcnRpY2FsUmlnaHREYXRhLmdseXBoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRo
ZSBnbHlwaHMgYXJlIGlkZW50aWNhbCwgbWVhbmluZyB0aGF0IHdlIHNob3VsZCBqdXN0IHVzZSB0
aGUgaG9yaXpvbnRhbCBnbHlwaC4KQEAgLTExMCw2ICsxMTgsMTAgQEAgR2x5cGhEYXRhIEZvbnQ6
OmdseXBoRGF0YUZvckNoYXJhY3RlcihVQwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICh1cHJpZ2h0UGFnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaERh
dGEgdXByaWdodERhdGEgPSB1cHJpZ2h0UGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMpOwog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZ2x5cGhzIGFyZSB0aGUg
c2FtZSwgdGhlbiB3ZSBrbm93IHdlIGNhbiBqdXN0IHVzZSB0aGUgaG9yaXpvbnRhbCBnbHlwaCBy
b3RhdGVkIHZlcnRpY2FsbHkgdG8gYmUgdXByaWdodC4KKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAodXByaWdodE5vZGUtPmlzU3lzdGVtRmFsbGJhY2soKSAmJiB1cHJpZ2h0
RGF0YS5mb250RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRD
YWNoZSgpLT5hc3N1cmVPbmVIb2xkKHVwcmlnaHREYXRhLmZvbnREYXRhKTsKKwogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5nbHlwaCA9PSB1cHJpZ2h0RGF0YS5nbHlw
aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZ2x5cGhzIGFyZSBkaXN0aW5jdCwg
bWVhbmluZyB0aGF0IHRoZSBmb250IGhhcyBhIHZlcnRpY2FsLXJpZ2h0IGdseXBoIGJha2VkIGlu
dG8gaXQuIFdlIGNhbid0IHVzZSB0aGF0CkBAIC0xNDMsNiArMTU1LDkgQEAgR2x5cGhEYXRhIEZv
bnQ6OmdseXBoRGF0YUZvckNoYXJhY3RlcihVQwogICAgICAgICAgICAgaWYgKHBhZ2UpIHsKICAg
ICAgICAgICAgICAgICBHbHlwaERhdGEgZGF0YSA9IHBhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3Rl
cihjKTsKICAgICAgICAgICAgICAgICBpZiAoZGF0YS5mb250RGF0YSkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAobm9kZS0+aXNTeXN0ZW1GYWxsYmFjaygpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgZm9udENhY2hlKCktPmFzc3VyZU9uZUhvbGQoZGF0YS5mb250RGF0YSk7CisKICAgICAg
ICAgICAgICAgICAgICAgLy8gVGhlIHZhcmlhbnRGb250RGF0YSBmdW5jdGlvbiBzaG91bGQgbm90
IG5vcm1hbGx5IHJldHVybiAwLgogICAgICAgICAgICAgICAgICAgICAvLyBCdXQgaWYgaXQgZG9l
cywgd2Ugd2lsbCBqdXN0IHJlbmRlciB0aGUgY2FwaXRhbCBsZXR0ZXIgYmlnLgogICAgICAgICAg
ICAgICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogdmFyaWFudEZvbnREYXRhID0gZGF0YS5m
b250RGF0YS0+dmFyaWFudEZvbnREYXRhKG1fZm9udERlc2NyaXB0aW9uLCB2YXJpYW50KTsKQEAg
LTE1Myw4ICsxNjgsMTEgQEAgR2x5cGhEYXRhIEZvbnQ6OmdseXBoRGF0YUZvckNoYXJhY3RlcihV
QwogICAgICAgICAgICAgICAgICAgICBjb25zdCBHbHlwaFBhZ2UqIHZhcmlhbnRQYWdlID0gdmFy
aWFudE5vZGUtPnBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRQYWdlKSB7
CiAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaERhdGEgZGF0YSA9IHZhcmlhbnRQYWdlLT5n
bHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0
YS5mb250RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvbnREYXRhKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnROb2RlLT5pc1N5c3RlbUZh
bGxiYWNrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDYWNoZSgpLT5h
c3N1cmVPbmVIb2xkKGRhdGEuZm9udERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
ICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGF0dGVtcHQgc3lzdGVtIGZh
bGxiYWNrIG9mZiB0aGUgdmFyaWFudEZvbnREYXRhLiBUaGlzIGlzIHRoZSB2ZXJ5IHVubGlrZWx5
IGNhc2UgdGhhdApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQ
YWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5
cGhQYWdlLmgJKHJldmlzaW9uIDg3NjU5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR2x5cGhQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyMSw3ICsxMjEsMTcgQEAgcHVi
bGljOgogICAgICAgICBtZW1zZXQobV9nbHlwaHMsIDAsIHNpemVvZihtX2dseXBocykpOwogICAg
ICAgICBtZW1zZXQobV9nbHlwaEZvbnREYXRhLCAwLCBzaXplb2YobV9nbHlwaEZvbnREYXRhKSk7
CiAgICAgfQotICAgIAorCisgICAgdm9pZCBjbGVhckZvckZvbnREYXRhKGNvbnN0IFNpbXBsZUZv
bnREYXRhKiBmb250RGF0YSkKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobV9nbHlwaEZvbnREYXRhW2ldID09IGZvbnRE
YXRhKSB7CisgICAgICAgICAgICAgICAgbV9nbHlwaHNbaV0gPSAwOworICAgICAgICAgICAgICAg
IG1fZ2x5cGhGb250RGF0YVtpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKICAgICBHbHlwaFBhZ2VUcmVlTm9kZSogb3duZXIoKSBjb25zdCB7IHJldHVybiBtX293bmVy
OyB9CiAKICAgICAvLyBJbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9kZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUu
Y3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dseXBoUGFnZVRyZWVOb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzc0LDYgKzM3NCwxMCBA
QCB2b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZUZvbnREYXRhKGNvCiAgICAgaWYgKCFmb250
RGF0YSkKICAgICAgICAgcmV0dXJuOwogCisgICAgLy8gUHJ1bmUgZmFsbCBiYWNrIGNoaWxkIChp
ZiBhbnkpIG9mIHRoaXMgZm9udC4KKyAgICBpZiAobV9zeXN0ZW1GYWxsYmFja0NoaWxkICYmIG1f
c3lzdGVtRmFsbGJhY2tDaGlsZC0+bV9wYWdlKQorICAgICAgICBtX3N5c3RlbUZhbGxiYWNrQ2hp
bGQtPm1fcGFnZS0+Y2xlYXJGb3JGb250RGF0YShmb250RGF0YSk7CisKICAgICAvLyBQcnVuZSBh
bnkgYnJhbmNoIHRoYXQgY29udGFpbnMgdGhpcyBGb250RGF0YS4KICAgICBIYXNoTWFwPGNvbnN0
IEZvbnREYXRhKiwgR2x5cGhQYWdlVHJlZU5vZGUqPjo6aXRlcmF0b3IgY2hpbGQgPSBtX2NoaWxk
cmVuLmZpbmQoZm9udERhdGEpOwogICAgIGlmIChjaGlsZCA9PSBtX2NoaWxkcmVuLmVuZCgpKSB7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxl
Rm9udERhdGEuY3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTMyLDYgKzEz
Miw5IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKIAogU2ltcGxl
Rm9udERhdGE6On5TaW1wbGVGb250RGF0YSgpCiB7CisgICAgaWYgKG1fZGVyaXZlZEZvbnREYXRh
KQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YS0+cHJ1bmVGcm9tR2x5cGhQYWdlVHJlZSgpOwor
CiAjaWYgRU5BQkxFKFNWR19GT05UUykKICAgICBpZiAoIW1fZm9udERhdGEpCiAjZW5kaWYKQEAg
LTIwMiw4ICsyMDUsMjQgQEAgUGFzc093blB0cjxTaW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnRE
YQogCiBTaW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnREYXRhOjp+RGVyaXZlZEZvbnREYXRhKCkK
IHsKLSAgICBpZiAoIWZvckN1c3RvbUZvbnQpCit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OkRl
cml2ZWRGb250RGF0YTo6cHJ1bmVGcm9tR2x5cGhQYWdlVHJlZSgpCit7CisgICAgaWYgKCFmb3JD
dXN0b21Gb250KSB7CisgICAgICAgIGlmIChzbWFsbENhcHMpCisgICAgICAgICAgICBHbHlwaFBh
Z2VUcmVlTm9kZTo6cHJ1bmVUcmVlRm9udERhdGEoc21hbGxDYXBzLmdldCgpKTsKKyAgICAgICAg
aWYgKGVtcGhhc2lzTWFyaykKKyAgICAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRy
ZWVGb250RGF0YShlbXBoYXNpc01hcmsuZ2V0KCkpOworICAgICAgICBpZiAoYnJva2VuSWRlb2dy
YXBoKQorICAgICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUZvbnREYXRhKGJy
b2tlbklkZW9ncmFwaC5nZXQoKSk7CisgICAgICAgIGlmICh2ZXJ0aWNhbFJpZ2h0T3JpZW50YXRp
b24pCisgICAgICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlRm9udERhdGEodmVy
dGljYWxSaWdodE9yaWVudGF0aW9uLmdldCgpKTsKKyAgICAgICAgaWYgKHVwcmlnaHRPcmllbnRh
dGlvbikKKyAgICAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVGb250RGF0YSh1
cHJpZ2h0T3JpZW50YXRpb24uZ2V0KCkpOworCiAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAg
ICBpZiAoc21hbGxDYXBzKQogICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3Vz
dG9tRm9udERhdGEoc21hbGxDYXBzLmdldCgpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAkocmV2aXNpb24gODc2NTkpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNTUsNiArMjU1LDggQEAgcHJpdmF0ZToKICAgICAgICAgT3duUHRyPFNp
bXBsZUZvbnREYXRhPiB2ZXJ0aWNhbFJpZ2h0T3JpZW50YXRpb247CiAgICAgICAgIE93blB0cjxT
aW1wbGVGb250RGF0YT4gdXByaWdodE9yaWVudGF0aW9uOwogCisgICAgICAgIHZvaWQgcHJ1bmVG
cm9tR2x5cGhQYWdlVHJlZSgpOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgRGVyaXZlZEZvbnRE
YXRhKGJvb2wgY3VzdG9tKQogICAgICAgICAgICAgOiBmb3JDdXN0b21Gb250KGN1c3RvbSkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNo
cm9taXVtV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJvbWl1bVdpbi5jcHAJKHJldmlzaW9uIDg3NjU5KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlQ2hy
b21pdW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MDYsOCArNTA2LDExIEBAIGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICAvLyBsYXN0IGZvbnQgaW4gdGhl
IGFycmF5IGNvdmVycyB0aGUgY2hhcmFjdGVyLCB8aXwgd2lsbCBiZSBudW1Gb250cy4KICAgICAv
LyBTbywgd2UgaGF2ZSB0byB1c2UgJzw9IiByYXRoZXIgdGhhbiAnPCcgdG8gc2VlIGlmIHdlIGZv
dW5kIGEgZm9udAogICAgIC8vIGNvdmVyaW5nIHRoZSBjaGFyYWN0ZXIuCi0gICAgaWYgKGkgPD0g
bnVtRm9udHMpIAotICAgICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShkYXRhKTsKKyAgICBp
ZiAoaSA8PSBudW1Gb250cykgeworICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0
ID0gZ2V0Q2FjaGVkRm9udERhdGEoZGF0YSk7CisgICAgICAgIGFkZEZvbnREYXRhVG9SZWxlYXNl
KHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCiAgICAgcmV0dXJuIDA7
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRD
YWNoZUZyZWVUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9mcmVldHlwZS9Gb250Q2FjaGVGcmVlVHlwZS5jcHAJKHJldmlzaW9uIDg3NjU5KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJl
ZVR5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OSw3ICs4OSw5IEBAIGNvbnN0IFNpbXBsZUZv
bnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICBSZWZQdHI8RmNQYXR0ZXJuPiBmYWxsYmFj
a1BhdHRlcm4gPSBhZG9wdFJlZihmaW5kQmVzdEZvbnRHaXZlbkZhbGxiYWNrcyhmb250RGF0YSwg
cGF0dGVybi5nZXQoKSkpOwogICAgIGlmIChmYWxsYmFja1BhdHRlcm4pIHsKICAgICAgICAgRm9u
dFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0YShmYWxsYmFja1BhdHRlcm4uZ2V0KCksIGZv
bnQuZm9udERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEo
JmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIHJlc3Vs
dCA9IGdldENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250RGF0YSk7CisgICAgICAgIGFkZEZv
bnREYXRhVG9SZWxlYXNlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQog
CiAgICAgRmNSZXN1bHQgZm9udENvbmZpZ1Jlc3VsdDsKQEAgLTk3LDcgKzk5LDkgQEAgY29uc3Qg
U2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmICghcmVzdWx0UGF0dGVy
bikKICAgICAgICAgcmV0dXJuIDA7CiAgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250
RGF0YShyZXN1bHRQYXR0ZXJuLmdldCgpLCBmb250LmZvbnREZXNjcmlwdGlvbigpKTsKLSAgICBy
ZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICBjb25zdCBT
aW1wbGVGb250RGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnRE
YXRhKTsKKyAgICBhZGRGb250RGF0YVRvUmVsZWFzZShyZXN1bHQpOworICAgIHJldHVybiByZXN1
bHQ7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZv
cm1EYXRhKGNvbnN0IEZvbnQmIGZvbnQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9oYWlrdS9Gb250Q2FjaGVIYWlrdS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvaGFpa3UvRm9udENhY2hlSGFpa3UuY3BwCShyZXZpc2lv
biA4NzY1OSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0ZvbnRD
YWNoZUhhaWt1LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDksNyArNDksOSBAQCB2b2lkIEZvbnRD
YWNoZTo6cGxhdGZvcm1Jbml0KCkKIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6Omdl
dEZvbnREYXRhRm9yQ2hhcmFjdGVycyhjb25zdCBGb250JiBmb250LCBjb25zdCBVQ2hhciogY2hh
cmFjdGVycywgaW50IGxlbmd0aCkKIHsKICAgICBGb250UGxhdGZvcm1EYXRhIGRhdGEoZm9udC5m
b250RGVzY3JpcHRpb24oKSwgZm9udC5mYW1pbHkoKS5mYW1pbHkoKSk7Ci0gICAgcmV0dXJuIGdl
dENhY2hlZEZvbnREYXRhKCZkYXRhKTsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0
ID0gZ2V0Q2FjaGVkRm9udERhdGEoJmRhdGEpOworICAgIGFkZEZvbnREYXRhVG9SZWxlYXNlKHJl
c3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNoZU1h
Yy5tbQkocmV2aXNpb24gODc2NTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvRm9udENhY2hlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIsNyArMTUyLDEwIEBA
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICAgICAgIWZvbnQu
aXNQbGF0Zm9ybUZvbnQoKSAmJiBpc0FwcEtpdEZvbnRXZWlnaHRCb2xkKHdlaWdodCkgJiYgIWlz
QXBwS2l0Rm9udFdlaWdodEJvbGQoc3Vic3RpdHV0ZUZvbnRXZWlnaHQpLAogICAgICAgICAhZm9u
dC5pc1BsYXRmb3JtRm9udCgpICYmICh0cmFpdHMgJiBOU0ZvbnRJdGFsaWNUcmFpdCkgJiYgIShz
dWJzdGl0dXRlRm9udFRyYWl0cyAmIE5TRm9udEl0YWxpY1RyYWl0KSwKICAgICAgICAgcGxhdGZv
cm1EYXRhLm1fb3JpZW50YXRpb24pOwotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgmYWx0
ZXJuYXRlRm9udCk7CisKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0ID0gZ2V0Q2Fj
aGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnQpOworICAgIGFkZEZvbnREYXRhVG9SZWxlYXNlKHJl
c3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5j
cHAJKHJldmlzaW9uIDg3NjU5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvRm9udENhY2hlUXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MCw3ICs4MCw5IEBAIGNvbnN0
IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICBpZiAoIWNvbXB1dGVkRm9u
dC5pc1ZhbGlkKCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIEZvbnRQbGF0Zm9ybURhdGEgYWx0
ZXJuYXRlRm9udChjb21wdXRlZEZvbnQpOwotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgm
YWx0ZXJuYXRlRm9udCk7CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIHJlc3VsdCA9IGdldENh
Y2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250KTsKKyAgICBhZGRGb250RGF0YVRvUmVsZWFzZShy
ZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiAjZWxzZQogICAgIFFfVU5VU0VEKGZvbnQpOwog
ICAgIFFfVU5VU0VEKGNoYXJhY3RlcnMpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5jcHAJKHJldmlzaW9uIDg3NjU5
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI4NCw4ICsyODQsMTAgQEAgY29uc3QgU2ltcGxlRm9udERh
dGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmIChoZm9udCkgewogICAgICAgICBpZiAoIWZh
bWlseU5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhKiByZXN1
bHQgPSBnZXRDYWNoZWRGb250UGxhdGZvcm1EYXRhKGZvbnQuZm9udERlc2NyaXB0aW9uKCksIGZh
bWlseU5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGlmIChyZXN1
bHQpIHsKICAgICAgICAgICAgICAgICBmb250RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3Vs
dCk7CisgICAgICAgICAgICAgICAgYWRkRm9udERhdGFUb1JlbGVhc2UoZm9udERhdGEpOworICAg
ICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9u
dCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250Q2Fj
aGVXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCShyZXZpc2lvbiA4NzY1OSkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzA4LDggKzMwOCwxMCBAQCBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENh
Y2hlOjpnZXRGb250CiAKICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2Fj
aGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzY3JpcHRpb24sIGZhbWlseU5hbWUpOwogICAgICAg
ICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aGFzaCgpICE9IG9yaWdGb250Lmhhc2goKSkgewotICAg
ICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGdldENhY2hlZEZvbnREYXRh
KHJlc3VsdCkpCisgICAgICAgICAgICBpZiAoU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2V0
Q2FjaGVkRm9udERhdGEocmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGFkZEZvbnREYXRhVG9S
ZWxlYXNlKGZvbnREYXRhKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZm9udERhdGE7CisgICAg
ICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3d4L0ZvbnRDYWNoZVd4LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHAJKHJldmlzaW9uIDg3NjU5
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvRm9udENhY2hlV3guY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00Nyw4ICs0Nyw5IEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBG
b250Q2FjaGU6OmdldEZvbnQKICAgICAgICAgZm9udERhdGEgPSBnZXRTaW1pbGFyRm9udFBsYXRm
b3JtRGF0YShmb250KTsKICAgICBpZiAoIWZvbnREYXRhLT5jb250YWluc0NoYXJhY3RlcnMoY2hh
cmFjdGVycywgbGVuZ3RoKSkKICAgICAgICAgZm9udERhdGEgPSBnZXRMYXN0UmVzb3J0RmFsbGJh
Y2tGb250KGZvbnQuZm9udERlc2NyaXB0aW9uKCkpOwotICAgIAorIAogICAgIEFTU0VSVChmb250
RGF0YSk7CisgICAgYWRkRm9udERhdGFUb1JlbGVhc2UoZm9udERhdGEpOwogICAgIHJldHVybiBm
b250RGF0YTsKIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL01lbW9yeVBy
ZXNzdXJlSGFuZGxlck1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tYWMvTWVtb3J5UHJlc3N1cmVIYW5kbGVyTWFjLm1tCShyZXZpc2lvbiA4NzY1OSkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9NZW1vcnlQcmVzc3VyZUhhbmRsZXJNYWMubW0JKHdv
cmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbXBvcnQgIk1lbW9yeVByZXNzdXJlSGFu
ZGxlci5oIgogCiAjaW1wb3J0IDxXZWJDb3JlL0dDQ29udHJvbGxlci5oPgorI2ltcG9ydCA8V2Vi
Q29yZS9Gb250Q2FjaGUuaD4KICNpbXBvcnQgPFdlYkNvcmUvTWVtb3J5Q2FjaGUuaD4KICNpbXBv
cnQgPFdlYkNvcmUvUGFnZUNhY2hlLmg+CiAjaW1wb3J0IDx3dGYvRmFzdE1hbGxvYy5oPgpAQCAt
OTYsNiArOTcsOCBAQCB2b2lkIE1lbW9yeVByZXNzdXJlSGFuZGxlcjo6cmVzcG9uZFRvTWVtCiAg
ICAgW25zdXJsQ2FjaGUgc2V0TWVtb3J5Q2FwYWNpdHk6W25zdXJsQ2FjaGUgY3VycmVudE1lbW9y
eVVzYWdlXS8yXTsKICAgICBbbnN1cmxDYWNoZSBzZXRNZW1vcnlDYXBhY2l0eTpzYXZlZE5zdXJs
Q2FjaGVNZW1vcnlDYXBhY2l0eV07CiAgCisgICAgZm9udENhY2hlKCktPnB1cmdlSW5hY3RpdmVG
b250RGF0YSgpOworCiAgICAgbWVtb3J5Q2FjaGUoKS0+cHJ1bmVUb1BlcmNlbnRhZ2UoMC41Zik7
CiAKICAgICBnY0NvbnRyb2xsZXIoKS5nYXJiYWdlQ29sbGVjdE5vdygpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95968</attachid>
            <date>2011-06-03 14:51:15 -0700</date>
            <delta_ts>2011-06-03 17:51:26 -0700</delta_ts>
            <desc>Patch with rework suggested by reviewers</desc>
            <filename>61875-2.patch</filename>
            <type>text/plain</type>
            <size>32651</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg4MDU1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzcgQEAKKzIwMTEtMDYtMDMgIE1pY2hhZWwg
U2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgRm9udHMgcmV0dXJuZWQgYnkgRm9udENhY2hlOjpnZXRGb250
RGF0YUZvckNoYXJhY3RlcnMoKSBhcmUgbmV2ZXIgcmVsZWFzZWQKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYxODc1CisKKyAgICAgICAgVGhpcyBjaGFu
Z2UgYWxsb3dzIGZvbnRzIGFsbG9jYXRlZCBhcyBzeXN0ZW0gZmFsbGJhY2sgZm9udHMgdG8gYmUg
cmVsZWFzZS4KKyAgICAgICAgUHJldmlvdXNseSwgdGhlIHJlZmVyZW5jZSBjb3VudHMgZm9yIHRo
ZXNlIGZvbnRzIGdyZXcgd2l0aG91dCBib3VuZC4gIFRoaXMKKyAgICAgICAgaXMgaW1wbGVtZW50
ZWQgcHJpbWFyaWx5IGFuIGF1dG8gcmVsZWFzZSBjbGFzcyB0aGF0IHdyYXBzIGFjY2Vzc2VzIHRv
IHRoZQorICAgICAgICBjYWNoZSBmb3Igc3lzdGVtIGZhbGxiYWNrIGZvbnRzLiBBbGwgc3VjaCBh
Y2Nlc3MgYXJlIHZpYSB0aGUgbWV0aG9kCisgICAgICAgIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFG
b3JDaGFyYWN0ZXJzLiBUaGUgbmV3IGNsYXNzIGlzIGNhbGxlZAorICAgICAgICBGb250Q2FjaGVB
dXRvUmVsZWFzZS4gV2hlbiBzdWNoIGFuIG9iamVjdCBleGlzdHMsIGl0IHByb3RlY3RzIHRoZXNl
IGZvbnQgZnJvbSAKKyAgICAgICAgZGVsZXRpb24uIEFkZGVkIGxvY2FsIHNjb3BlZCBpbnN0YW5j
ZSBvZiBGb250Q2FjaGVBdXRvUmVsZWFzZSB0byB3cmFwIGNvZGUKKyAgICAgICAgdGhhdCBhY2Nl
c3NlcyBmb250cyB2aWEgZ2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzLiAgRGlkIGEgZmV3IG90aGVy
IG1pc2NlbGxhbmVvdXMKKyAgICAgICAgYnVnIGZpeGVzIGFuZCBjaGFuZ2VzIHRvIGFsbG93IHN5
c3RlbSBmYWxsYmFjayBmb250cyB0byBiZSBjbGVhcmVkIGZyb20gdGhlIAorICAgICAgICBHbHlw
aFBhZ2VUcmVlLiAgQWRkZWQgdGhlIHN1cHBvcnRpbmcgY29kZSBpbiB0aGUgcGxhdGZvcm0gc3Bl
Y2lmaWMgdmVyc2lvbnMKKyAgICAgICAgb2YgRm9udGNhY2hlOjpnZXRGb250RGF0YUZvckNoYXJh
Y3RlcnMKKworICAgICAgICBObyBuZXcgdGVzdCBhcyB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgbm90
IGNoYW5nZWQuIEltcHJvdmVkIGZvbnQgbGlmZSBjeWNsZQorICAgICAgICBtYW5hZ2VtZW50Lgor
CisgICAgICAgICogV2ViQ29yZS5leHAuaW46CisgICAgICAgICogaHRtbC9jYW52YXMvQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJELmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyRDo6bWVhc3VyZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEOjpkcmF3VGV4dEludGVybmFsKToKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmll
dy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OmxheW91dCk6CisgICAgICAgIChX
ZWJDb3JlOjpGcmFtZVZpZXc6OnBhaW50Q29udGVudHMpOgorICAgICAgICAqIHBhZ2UvRnJhbWVW
aWV3Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Rm9udENhY2hlKToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnRDYWNoZTo6Z2V0Q2FjaGVkRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hl
OjpyZWxlYXNlRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpjaGVja0Zv
ckZvbnRzVG9QdXJnZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnB1cmdlSW5hY3Rp
dmVGb250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmRlcmVmRm9yQXV0b1Jl
bGVhc2VkRm9udCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmg6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmluY0RvbnRQdXJnZUNvdW50KToKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnRDYWNoZTo6ZGVjRG9udFB1cmdlQ291bnQpOgorICAgICAgICAoV2ViQ29y
ZTo6Rm9udENhY2hlQXV0b1JlbGVhc2U6OkZvbnRDYWNoZUF1dG9SZWxlYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnRDYWNoZUF1dG9SZWxlYXNlOjp+Rm9udENhY2hlQXV0b1JlbGVhc2UpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL0dseXBoUGFnZS5oOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhQYWdlOjpjbGVh
ckZvckZvbnREYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVl
Tm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVGb250
RGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6On5TaW1wbGVGb250RGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnREYXRhOjp+RGVyaXZlZEZv
bnREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpEZXJpdmVkRm9udERh
dGE6OnBydW5lRnJvbUdseXBoUGFnZVRyZWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L1NpbXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Rm9udENhY2hlQ2hyb21pdW1XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpn
ZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Zy
ZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNo
ZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9oYWlrdS9Gb250Q2FjaGVIYWlrdS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6
OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0ZvbnRDYWNoZU1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250
Q2FjaGVRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9y
Q2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdp
bi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFj
dGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0Uu
Y3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3d4L0ZvbnRDYWNoZVd4LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKToKKyAg
ICAgICAgKiByZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVySW1hZ2U6OnNldEltYWdlU2l6ZUZvckFsdFRleHQpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJMaXN0Qm94LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RCb3g6OnVwZGF0
ZUZyb21FbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RCb3g6OnBhaW50SXRl
bUZvcmVncm91bmQpOgorCiAyMDExLTA2LTAzICBMZXZpIFdlaW50cmF1YiAgPGxldml3QGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dl
YkNvcmUuZXhwLmluCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
ZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC05MjAsNiArOTIwLDcgQEAgX19aTjdXZWJDb3JlOUZs
b2F0UmVjdEMxRVJLN19OU1JlY3QKIF9fWk43V2ViQ29yZTlGbG9hdFJlY3RDMUVSS05TXzdJbnRS
ZWN0RQogX19aTjdXZWJDb3JlOUZsb2F0U2l6ZUMxRVJLTlNfN0ludFNpemVFCiBfX1pON1dlYkNv
cmU5Rm9udENhY2hlMTNmb250RGF0YUNvdW50RXYKK19fWk43V2ViQ29yZTlGb250Q2FjaGUyMGNo
ZWNrRm9yRm9udHNUb1B1cmdlRXYKIF9fWk43V2ViQ29yZTlGb250Q2FjaGUyMWluYWN0aXZlRm9u
dERhdGFDb3VudEV2CiBfX1pON1dlYkNvcmU5Rm9udENhY2hlMjFwdXJnZUluYWN0aXZlRm9udERh
dGFFaQogX19aTjdXZWJDb3JlOUZyYW1lVHJlZTExYXBwZW5kQ2hpbGRFTjNXVEYxMFBhc3NSZWZQ
dHJJTlNfNUZyYW1lRUVFCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwv
Y2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysg
U291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgIkNhbnZhc1N0eWxlLmgi
CiAjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgogI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5o
IgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgog
I2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTEltYWdlRWxlbWVu
dC5oIgpAQCAtMTg3NCw2ICsxODc1LDkgQEAgdm9pZCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6
OnN0cm9rZVRleAogCiBQYXNzUmVmUHRyPFRleHRNZXRyaWNzPiBDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQ6Om1lYXN1cmVUZXh0KGNvbnN0IFN0cmluZyYgdGV4dCkKIHsKKyAgICAvLyBQcm90ZWN0
cyBhbmQgYXV0b21hdGljYWxseSByZWxlYXNlcyBzeXN0ZW0gZmFsbGJhY2sgZm9udHMgZnJvbSBm
b250IGNhY2hlCisgICAgRm9udENhY2hlQXV0b1JlbGVhc2UgZm9udENhY2hlQXV0b1JlbGVhc2U7
CisgICAgCiAgICAgUmVmUHRyPFRleHRNZXRyaWNzPiBtZXRyaWNzID0gVGV4dE1ldHJpY3M6OmNy
ZWF0ZSgpOwogCiAjaWYgUExBVEZPUk0oUVQpCkBAIC0xOTAwLDYgKzE5MDQsOSBAQCB2b2lkIENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZHJhd1RleHRJCiAgICAgICAgIHJldHVybjsKICAgICBp
ZiAoIWlzZmluaXRlKHgpIHwgIWlzZmluaXRlKHkpKQogICAgICAgICByZXR1cm47CisgICAgCisg
ICAgLy8gUHJvdGVjdHMgYW5kIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgc3lzdGVtIGZhbGxiYWNr
IGZvbnRzIGZyb20gZm9udCBjYWNoZQorICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlIGZvbnRDYWNo
ZUF1dG9SZWxlYXNlOwogCiAgICAgY29uc3QgRm9udCYgZm9udCA9IGFjY2Vzc0ZvbnQoKTsKICAg
ICBjb25zdCBGb250TWV0cmljcyYgZm9udE1ldHJpY3MgPSBmb250LmZvbnRNZXRyaWNzKCk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcs
NyBAQAogI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgog
I2luY2x1ZGUgIkZvY3VzQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2lu
Y2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVBY3Rpb25TY2hlZHVsZXIuaCIKICNpbmNs
dWRlICJGcmFtZUxvYWRlci5oIgpAQCAtODk2LDYgKzg5Nyw5IEBAIHZvaWQgRnJhbWVWaWV3Ojps
YXlvdXQoYm9vbCBhbGxvd1N1YnRyZWUKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8v
IFByb3RlY3RzIGFuZCBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHN5c3RlbSBmYWxsYmFjayBmb250
cyBmcm9tIGZvbnQgY2FjaGUKKyAgICBGb250Q2FjaGVBdXRvUmVsZWFzZSBmb250Q2FjaGVBdXRv
UmVsZWFzZTsKKwogICAgIG1fbmVzdGVkTGF5b3V0Q291bnQrKzsKIAogICAgIGlmICghbV9sYXlv
dXRSb290KSB7CkBAIC0yNDIzLDYgKzI0MjcsOSBAQCB2b2lkIEZyYW1lVmlldzo6cGFpbnRDb250
ZW50cyhHcmFwaGljc0NvCiAgICAgaWYgKG5lZWRzTGF5b3V0KCkpCiAgICAgICAgIHJldHVybjsK
IAorICAgIC8vIFByb3RlY3RzIGFuZCBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHN5c3RlbSBmYWxs
YmFjayBmb250cyBmcm9tIGZvbnQgY2FjaGUKKyAgICBGb250Q2FjaGVBdXRvUmVsZWFzZSBmb250
Q2FjaGVBdXRvUmVsZWFzZTsKKwogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKICAg
ICBpZiAoIXAtPnBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgc3luY0NvbXBvc2l0aW5nU3Rh
dGVGb3JUaGlzRnJhbWUoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuaAkocmV2aXNpb24g
ODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zOCw2ICszOCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIENvbG9yOwogY2xh
c3MgRXZlbnQ7CiBjbGFzcyBGbG9hdFNpemU7CitjbGFzcyBGb250Q2FjaGVBdXRvUmVsZWFzZTsK
IGNsYXNzIEZyYW1lOwogY2xhc3MgRnJhbWVBY3Rpb25TY2hlZHVsZXI7CiBjbGFzcyBJbnRSZWN0
OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUu
Y3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnRDYWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRl
ICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiRm9udFBsYXRmb3JtRGF0YS5oIgogI2lu
Y2x1ZGUgIkZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkdseXBoUGFnZVRyZWVOb2RlLmgiCiAj
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KICNp
bmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CkBAIC01MCw2ICs1MSw3IEBAIEZvbnRDYWNoZSog
Zm9udENhY2hlKCkKIH0KIAogRm9udENhY2hlOjpGb250Q2FjaGUoKQorICAgIDogbV9kb250UHVy
Z2VDb3VudCgwKQogewogfQogCkBAIC0yNDksOCArMjUxLDggQEAgdHlwZWRlZiBIYXNoTWFwPEZv
bnRQbGF0Zm9ybURhdGEsIHBhaXI8UwogCiBzdGF0aWMgRm9udERhdGFDYWNoZSogZ0ZvbnREYXRh
Q2FjaGUgPSAwOwogCi1jb25zdCBpbnQgY01heEluYWN0aXZlRm9udERhdGEgPSAxMjA7ICAvLyBQ
cmV0dHkgTG93IFRocmVzaG9sZAotY29uc3QgaW50IGNUYXJnZXRJbmFjdGl2ZUZvbnREYXRhID0g
MTAwOworY29uc3QgaW50IGNNYXhJbmFjdGl2ZUZvbnREYXRhID0gNTA7IC8vIFByZXR0eSBMb3cg
VGhyZXNob2xkCitjb25zdCBpbnQgY1RhcmdldEluYWN0aXZlRm9udERhdGEgPSAzMDsKIHN0YXRp
YyBMaXN0SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBnSW5hY3RpdmVGb250RGF0YSA9
IDA7CiAKIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldENhY2hlZEZvbnREYXRhKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBjb25zdCBBdG9taWNTdHJpbmcmIGZh
bWlseSwgYm9vbCBjaGVja2luZ0FsdGVybmF0ZU5hbWUpCkBAIC0yNzEsNyArMjczLDcgQEAgU2lt
cGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Q2FjaGVkRm9udAogICAgICAgICBnRm9udERhdGFD
YWNoZSA9IG5ldyBGb250RGF0YUNhY2hlOwogICAgICAgICBnSW5hY3RpdmVGb250RGF0YSA9IG5l
dyBMaXN0SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+OwogICAgIH0KLSAgICAKKwogICAg
IEZvbnREYXRhQ2FjaGU6Oml0ZXJhdG9yIHJlc3VsdCA9IGdGb250RGF0YUNhY2hlLT5maW5kKCpw
bGF0Zm9ybURhdGEpOwogICAgIGlmIChyZXN1bHQgPT0gZ0ZvbnREYXRhQ2FjaGUtPmVuZCgpKSB7
CiAgICAgICAgIHBhaXI8U2ltcGxlRm9udERhdGEqLCB1bnNpZ25lZD4gbmV3VmFsdWUobmV3IFNp
bXBsZUZvbnREYXRhKCpwbGF0Zm9ybURhdGEpLCAxKTsKQEAgLTI5NCwxNiArMjk2LDIwIEBAIHZv
aWQgRm9udENhY2hlOjpyZWxlYXNlRm9udERhdGEoY29uc3QgU2kKICAgICBGb250RGF0YUNhY2hl
OjppdGVyYXRvciBpdCA9IGdGb250RGF0YUNhY2hlLT5maW5kKGZvbnREYXRhLT5wbGF0Zm9ybURh
dGEoKSk7CiAgICAgQVNTRVJUKGl0ICE9IGdGb250RGF0YUNhY2hlLT5lbmQoKSk7CiAKLSAgICBp
ZiAoIS0taXQtPnNlY29uZC5zZWNvbmQpIHsKKyAgICBBU1NFUlQoaXQtPnNlY29uZC5zZWNvbmQp
OworICAgIGlmICghLS1pdC0+c2Vjb25kLnNlY29uZCkKICAgICAgICAgZ0luYWN0aXZlRm9udERh
dGEtPmFkZChmb250RGF0YSk7Ci0gICAgICAgIGlmIChnSW5hY3RpdmVGb250RGF0YS0+c2l6ZSgp
ID4gY01heEluYWN0aXZlRm9udERhdGEpCi0gICAgICAgICAgICBwdXJnZUluYWN0aXZlRm9udERh
dGEoZ0luYWN0aXZlRm9udERhdGEtPnNpemUoKSAtIGNUYXJnZXRJbmFjdGl2ZUZvbnREYXRhKTsK
LSAgICB9Cit9CisKK3ZvaWQgRm9udENhY2hlOjpjaGVja0ZvckZvbnRzVG9QdXJnZSgpCit7Cisg
ICAgaWYgKGdJbmFjdGl2ZUZvbnREYXRhICYmICFtX2RvbnRQdXJnZUNvdW50ICYmIGdJbmFjdGl2
ZUZvbnREYXRhLT5zaXplKCkgPiBjTWF4SW5hY3RpdmVGb250RGF0YSkKKyAgICAgICAgcHVyZ2VJ
bmFjdGl2ZUZvbnREYXRhKGdJbmFjdGl2ZUZvbnREYXRhLT5zaXplKCkgLSBjVGFyZ2V0SW5hY3Rp
dmVGb250RGF0YSk7CiB9CiAKIHZvaWQgRm9udENhY2hlOjpwdXJnZUluYWN0aXZlRm9udERhdGEo
aW50IGNvdW50KQogewotICAgIGlmICghZ0luYWN0aXZlRm9udERhdGEpCisgICAgaWYgKCFnSW5h
Y3RpdmVGb250RGF0YSB8fCBtX2RvbnRQdXJnZUNvdW50KQogICAgICAgICByZXR1cm47CiAKICAg
ICBzdGF0aWMgYm9vbCBpc1B1cmdpbmc7ICAvLyBHdWFyZCBhZ2FpbnN0IHJlZW50cnkgd2hlbiBl
LmcuIGEgZGVsZXRlZCBGb250RGF0YSByZWxlYXNlcyBpdHMgc21hbGwgY2FwcyBGb250RGF0YS4K
QEAgLTM2NCw2ICszNzAsMTIgQEAgc2l6ZV90IEZvbnRDYWNoZTo6aW5hY3RpdmVGb250RGF0YUNv
dW50KAogICAgIHJldHVybiAwOwogfQogCit2b2lkIEZvbnRDYWNoZTo6ZGVyZWZGb3JBdXRvUmVs
ZWFzZWRGb250KGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSkKK3sKKyAgICBBU1NFUlQo
bV9kb250UHVyZ2VDb3VudCk7CisgICAgcmVsZWFzZUZvbnREYXRhKGZvbnREYXRhKTsKK30KKwog
Y29uc3QgRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGEoY29uc3QgRm9udCYgZm9udCwg
aW50JiBmYW1pbHlJbmRleCwgRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCiB7CiAgICAgU2lt
cGxlRm9udERhdGEqIHJlc3VsdCA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Gb250Q2FjaGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9Gb250Q2FjaGUuaAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDksMTkg
KzQ5LDIxIEBAIGNsYXNzIEZvbnREYXRhOwogY2xhc3MgRm9udERlc2NyaXB0aW9uOwogY2xhc3Mg
Rm9udFNlbGVjdG9yOwogY2xhc3MgU2ltcGxlRm9udERhdGE7CitjbGFzcyBGb250Q2FjaGU7CiAK
IGNsYXNzIEZvbnRDYWNoZSB7CisgICAgZnJpZW5kIGNsYXNzIEZvbnRDYWNoZUF1dG9SZWxlYXNl
OworCiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoRm9udENhY2hlKTsgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7CiBwdWJsaWM6CiAgICAgZnJpZW5kIEZvbnRDYWNoZSogZm9udENhY2hlKCk7CiAK
ICAgICBjb25zdCBGb250RGF0YSogZ2V0Rm9udERhdGEoY29uc3QgRm9udCYsIGludCYgZmFtaWx5
SW5kZXgsIEZvbnRTZWxlY3RvciopOwogICAgIHZvaWQgcmVsZWFzZUZvbnREYXRhKGNvbnN0IFNp
bXBsZUZvbnREYXRhKik7Ci0gICAgCisgCiAgICAgLy8gVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50
ZWQgYnkgdGhlIHBsYXRmb3JtLgotICAgIC8vIEZJWE1FOiBGb250IGRhdGEgcmV0dXJuZWQgYnkg
dGhpcyBtZXRob2QgbmV2ZXIgZ28gaW5hY3RpdmUgYmVjYXVzZSBjYWxsZXJzIGRvbid0IHRyYWNr
IGFuZCByZWxlYXNlIHRoZW0uCiAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGdldEZvbnREYXRh
Rm9yQ2hhcmFjdGVycyhjb25zdCBGb250JiwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBs
ZW5ndGgpOwotICAgIAorCiAgICAgLy8gQWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0u
CiAgICAgdm9pZCBwbGF0Zm9ybUluaXQoKTsKIApAQCAtOTcsNiArOTksMjAgQEAgcHJpdmF0ZToK
ICAgICBGb250Q2FjaGUoKTsKICAgICB+Rm9udENhY2hlKCk7CiAKKyAgICBpbmxpbmUgdm9pZCBp
bmNEb250UHVyZ2VDb3VudCgpIHsgbV9kb250UHVyZ2VDb3VudCsrOyB9CisgICAgaW5saW5lIHZv
aWQgZGVjRG9udFB1cmdlQ291bnQoKQorICAgIHsgCisgICAgICAgIGlmICghLS1tX2RvbnRQdXJn
ZUNvdW50KQorICAgICAgICAgICAgY2hlY2tGb3JGb250c1RvUHVyZ2UoKTsKKyAgICB9CisKKyAg
ICB2b2lkIGNoZWNrRm9yRm9udHNUb1B1cmdlKCk7CisgICAgCisgICAgLy8gRGVyZWYgZm9udHMg
cmV0dXJuZWQgdmlhIGdldEZvbnREYXRhRm9yQ2hhcmFjdGVycygpIHNpbmNlIHdlIHVzZSBtX2Rv
bnRQdXJnZUNvdW50IHRvIGd1YXJkIGFnYWluc3QKKyAgICAvLyB1bnNhZmUgcHVyZ2luZy4gQWxs
IGFjY2Vzc2VzIHRvIGZvbnRzIHZpYSB0aGF0IG1ldGhvZCBzaG91bGQgYmUgd3JhcHBlZCB3aXRo
IGEgbG9jYWwgRm9udENhY2hlQXV0b1JlbGVhc2UKKyAgICAvLyB2YXJpYWJsZSBpbiBzY29wZS4K
KyAgICB2b2lkIGRlcmVmRm9yQXV0b1JlbGVhc2VkRm9udChjb25zdCBTaW1wbGVGb250RGF0YSop
OworCiAgICAgLy8gRklYTUU6IFRoaXMgbWV0aG9kIHNob3VsZCBldmVudHVhbGx5IGJlIHJlbW92
ZWQuCiAgICAgRm9udFBsYXRmb3JtRGF0YSogZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShjb25z
dCBGb250RGVzY3JpcHRpb24mLCBjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseSwgYm9vbCBjaGVj
a2luZ0FsdGVybmF0ZU5hbWUgPSBmYWxzZSk7CiAKQEAgLTEwNiw2ICsxMjIsOSBAQCBwcml2YXRl
OgogCiAgICAgU2ltcGxlRm9udERhdGEqIGdldENhY2hlZEZvbnREYXRhKGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEqKTsKIAorICAgIC8vIERvbid0IHB1cmdlIGlmIHRoaXMgY291bnQgaXMgPiAwOwor
ICAgIGludCBtX2RvbnRQdXJnZUNvdW50OworCiAgICAgZnJpZW5kIGNsYXNzIFNpbXBsZUZvbnRE
YXRhOyAvLyBGb3IgZ2V0Q2FjaGVkRm9udERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSopCiAg
ICAgZnJpZW5kIGNsYXNzIEZvbnRGYWxsYmFja0xpc3Q7CiB9OwpAQCAtMTEzLDYgKzEzMiwxMiBA
QCBwcml2YXRlOgogLy8gR2V0IHRoZSBnbG9iYWwgZm9udENhY2hlLgogRm9udENhY2hlKiBmb250
Q2FjaGUoKTsKIAorY2xhc3MgRm9udENhY2hlQXV0b1JlbGVhc2UgeworcHVibGljOgorICAgIGlu
bGluZSBGb250Q2FjaGVBdXRvUmVsZWFzZSgpIHsgZm9udENhY2hlKCktPmluY0RvbnRQdXJnZUNv
dW50KCk7IH0KKyAgICBpbmxpbmUgfkZvbnRDYWNoZUF1dG9SZWxlYXNlKCkgeyBmb250Q2FjaGUo
KS0+ZGVjRG9udFB1cmdlQ291bnQoKTsgfQorfTsKKwogfQogCiAjZW5kaWYKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAkocmV2
aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFz
dFBhdGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICszNyw3IEBACiAKIHVzaW5nIG5hbWVz
cGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKK3VzaW5nIHN0ZDo6bWF4OwogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTIxMCw5ICsyMTEsMTEgQEAgR2x5cGhEYXRhIEZvbnQ6
OmdseXBoRGF0YUZvckNoYXJhY3RlcihVQwogICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgY2hh
cmFjdGVyLCBwcm9iYWJseSBiZWNhdXNlIHRoZSBmb250IHBhY2thZ2UgaXMgbm90IGluc3RhbGxl
ZCBjb3JyZWN0bHkuCiAgICAgICAgICAgICAvLyBTbyB3ZSBqdXN0IGFsd2F5cyBzZXQgdGhlIGds
eXBoIHRvIGJlIHNhbWUgYXMgdGhlIGNoYXJhY3RlciwgYW5kIGxldCBHREkgc29sdmUgaXQuCiAg
ICAgICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgY2hhcmFjdGVy
Rm9udERhdGEpOworICAgICAgICAgICAgY2hhcmFjdGVyRm9udERhdGEtPnNldE1heEdseXBoUGFn
ZVRyZWVMZXZlbChtYXgoY2hhcmFjdGVyRm9udERhdGEtPm1heEdseXBoUGFnZVRyZWVMZXZlbCgp
LCBub2RlLT5sZXZlbCgpKSk7CiAgICAgICAgICAgICByZXR1cm4gcGFnZS0+Z2x5cGhEYXRhRm9y
Q2hhcmFjdGVyKGMpOwogI2Vsc2UKICAgICAgICAgICAgIHBhZ2UtPnNldEdseXBoRGF0YUZvckNo
YXJhY3RlcihjLCBkYXRhLmdseXBoLCBkYXRhLmZvbnREYXRhKTsKKyAgICAgICAgICAgIGRhdGEu
Zm9udERhdGEtPnNldE1heEdseXBoUGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250RGF0YS0+bWF4
R2x5cGhQYWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVsKCkpKTsKICNlbmRpZgogICAgICAgICB9
CiAgICAgICAgIHJldHVybiBkYXRhOwpAQCAtMjI1LDkgKzIyOCwxMSBAQCBHbHlwaERhdGEgRm9u
dDo6Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKFVDCiAjaWYgT1MoV0lOQ0UpCiAgICAgICAgIC8vIFNl
ZSBjb21tZW50IGFib3V0IFdJTkNFIEdESSBoYW5kbGluZyBuZWFyIHNldEdseXBoRGF0YUZvckNo
YXJhY3RlciBhYm92ZS4KICAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMs
IGMsIGRhdGEuZm9udERhdGEpOworICAgICAgICBkYXRhLmZvbnREYXRhLT5zZXRNYXhHbHlwaFBh
Z2VUcmVlTGV2ZWwobWF4KGRhdGEuZm9udERhdGEtPm1heEdseXBoUGFnZVRyZWVMZXZlbCgpLCBu
b2RlLT5sZXZlbCgpKSk7CiAgICAgICAgIHJldHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0
ZXIoYyk7CiAjZWxzZQogICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywg
ZGF0YS5nbHlwaCwgZGF0YS5mb250RGF0YSk7CisgICAgICAgIGRhdGEuZm9udERhdGEtPnNldE1h
eEdseXBoUGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxl
dmVsKCksIG5vZGUtPmxldmVsKCkpKTsKICNlbmRpZgogICAgIH0KICAgICByZXR1cm4gZGF0YTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oCShy
ZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBo
UGFnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjEsNyArMTIxLDE3IEBAIHB1YmxpYzoKICAgICAg
ICAgbWVtc2V0KG1fZ2x5cGhzLCAwLCBzaXplb2YobV9nbHlwaHMpKTsKICAgICAgICAgbWVtc2V0
KG1fZ2x5cGhGb250RGF0YSwgMCwgc2l6ZW9mKG1fZ2x5cGhGb250RGF0YSkpOwogICAgIH0KLSAg
ICAKKworICAgIHZvaWQgY2xlYXJGb3JGb250RGF0YShjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dERhdGEpCisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykg
eworICAgICAgICAgICAgaWYgKG1fZ2x5cGhGb250RGF0YVtpXSA9PSBmb250RGF0YSkgeworICAg
ICAgICAgICAgICAgIG1fZ2x5cGhzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBtX2dseXBoRm9u
dERhdGFbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgR2x5
cGhQYWdlVHJlZU5vZGUqIG93bmVyKCkgY29uc3QgeyByZXR1cm4gbV9vd25lcjsgfQogCiAgICAg
Ly8gSW1wbGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcAkocmV2aXNp
b24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VU
cmVlTm9kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3NCwxMyArMzc0LDEzIEBAIHZvaWQgR2x5
cGhQYWdlVHJlZU5vZGU6OnBydW5lRm9udERhdGEoY28KICAgICBpZiAoIWZvbnREYXRhKQogICAg
ICAgICByZXR1cm47CiAKKyAgICAvLyBQcnVuZSBmYWxsIGJhY2sgY2hpbGQgKGlmIGFueSkgb2Yg
dGhpcyBmb250LgorICAgIGlmIChtX3N5c3RlbUZhbGxiYWNrQ2hpbGQgJiYgbV9zeXN0ZW1GYWxs
YmFja0NoaWxkLT5tX3BhZ2UpCisgICAgICAgIG1fc3lzdGVtRmFsbGJhY2tDaGlsZC0+bV9wYWdl
LT5jbGVhckZvckZvbnREYXRhKGZvbnREYXRhKTsKKwogICAgIC8vIFBydW5lIGFueSBicmFuY2gg
dGhhdCBjb250YWlucyB0aGlzIEZvbnREYXRhLgogICAgIEhhc2hNYXA8Y29uc3QgRm9udERhdGEq
LCBHbHlwaFBhZ2VUcmVlTm9kZSo+OjppdGVyYXRvciBjaGlsZCA9IG1fY2hpbGRyZW4uZmluZChm
b250RGF0YSk7Ci0gICAgaWYgKGNoaWxkID09IG1fY2hpbGRyZW4uZW5kKCkpIHsKLSAgICAgICAg
Ly8gSWYgdGhlcmUgaXMgbm8gbGV2ZWwtMSBub2RlIGZvciBmb250RGF0YSwgdGhlbiB0aGVyZSBp
cyBubyBkZWVwZXIgbm9kZSBmb3IgaXQgaW4gdGhpcyB0cmVlLgotICAgICAgICBpZiAoIWxldmVs
KQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7CisgICAgaWYgKGNoaWxkICE9IG1f
Y2hpbGRyZW4uZW5kKCkpIHsKICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGUqIG5vZGUgPSBjaGls
ZC0+c2Vjb25kOwogICAgICAgICBtX2NoaWxkcmVuLnJlbW92ZShmb250RGF0YSk7CiAgICAgICAg
IHVuc2lnbmVkIGN1c3RvbUZvbnRDb3VudCA9IG5vZGUtPm1fY3VzdG9tRm9udENvdW50OwpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnRE
YXRhLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9TaW1wbGVGb250RGF0YS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw2ICsxMzIsOSBA
QCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUdseXBoSW5pdCgpCiAKIFNpbXBsZUZvbnRE
YXRhOjp+U2ltcGxlRm9udERhdGEoKQogeworICAgIGlmIChtX2Rlcml2ZWRGb250RGF0YSkKKyAg
ICAgICAgbV9kZXJpdmVkRm9udERhdGEtPnBydW5lRnJvbUdseXBoUGFnZVRyZWUoKTsKKwogI2lm
IEVOQUJMRShTVkdfRk9OVFMpCiAgICAgaWYgKCFtX2ZvbnREYXRhKQogI2VuZGlmCkBAIC0yMDIs
OCArMjA1LDI1IEBAIFBhc3NPd25QdHI8U2ltcGxlRm9udERhdGE6OkRlcml2ZWRGb250RGEKIAog
U2ltcGxlRm9udERhdGE6OkRlcml2ZWRGb250RGF0YTo6fkRlcml2ZWRGb250RGF0YSgpCiB7Ci0g
ICAgaWYgKCFmb3JDdXN0b21Gb250KQorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpEZXJpdmVk
Rm9udERhdGE6OnBydW5lRnJvbUdseXBoUGFnZVRyZWUoKQoreworICAgIGlmICghZm9yQ3VzdG9t
Rm9udCkgeworI2lmIDAKKyAgICAgICAgaWYgKHNtYWxsQ2FwcykKKyAgICAgICAgICAgIEdseXBo
UGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVGb250RGF0YShzbWFsbENhcHMuZ2V0KCkpOworICAgICAg
ICBpZiAoZW1waGFzaXNNYXJrKQorICAgICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5l
VHJlZUZvbnREYXRhKGVtcGhhc2lzTWFyay5nZXQoKSk7CisgICAgICAgIGlmIChicm9rZW5JZGVv
Z3JhcGgpCisgICAgICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlRm9udERhdGEo
YnJva2VuSWRlb2dyYXBoLmdldCgpKTsKKyAgICAgICAgaWYgKHZlcnRpY2FsUmlnaHRPcmllbnRh
dGlvbikKKyAgICAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVGb250RGF0YSh2
ZXJ0aWNhbFJpZ2h0T3JpZW50YXRpb24uZ2V0KCkpOworICAgICAgICBpZiAodXByaWdodE9yaWVu
dGF0aW9uKQorICAgICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUZvbnREYXRh
KHVwcmlnaHRPcmllbnRhdGlvbi5nZXQoKSk7CisjZW5kaWYKICAgICAgICAgcmV0dXJuOworICAg
IH0KIAogICAgIGlmIChzbWFsbENhcHMpCiAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVu
ZVRyZWVDdXN0b21Gb250RGF0YShzbWFsbENhcHMuZ2V0KCkpOwpJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCShyZXZpc2lvbiA4
ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRh
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI1NSw2ICsyNTUsOCBAQCBwcml2YXRlOgogICAgICAgICBP
d25QdHI8U2ltcGxlRm9udERhdGE+IHZlcnRpY2FsUmlnaHRPcmllbnRhdGlvbjsKICAgICAgICAg
T3duUHRyPFNpbXBsZUZvbnREYXRhPiB1cHJpZ2h0T3JpZW50YXRpb247CiAKKyAgICAgICAgdm9p
ZCBwcnVuZUZyb21HbHlwaFBhZ2VUcmVlKCk7CisKICAgICBwcml2YXRlOgogICAgICAgICBEZXJp
dmVkRm9udERhdGEoYm9vbCBjdXN0b20pCiAgICAgICAgICAgICA6IGZvckN1c3RvbUZvbnQoY3Vz
dG9tKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9u
dENhY2hlQ2hyb21pdW1XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAkocmV2aXNpb24g
ODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250
Q2FjaGVDaHJvbWl1bVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUwNiw4ICs1MDYsMTIgQEAg
Y29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIC8vIGxhc3QgZm9u
dCBpbiB0aGUgYXJyYXkgY292ZXJzIHRoZSBjaGFyYWN0ZXIsIHxpfCB3aWxsIGJlIG51bUZvbnRz
LgogICAgIC8vIFNvLCB3ZSBoYXZlIHRvIHVzZSAnPD0iIHJhdGhlciB0aGFuICc8JyB0byBzZWUg
aWYgd2UgZm91bmQgYSBmb250CiAgICAgLy8gY292ZXJpbmcgdGhlIGNoYXJhY3Rlci4KLSAgICBp
ZiAoaSA8PSBudW1Gb250cykgCi0gICAgICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKGRhdGEp
OworICAgIGlmIChpIDw9IG51bUZvbnRzKSB7CisgICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmb250RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKGRhdGEpOworICAgICAgICAvLyBkZXJlZiBm
b250IHNpbmNlIGl0IGlzIGd1YXJkZWQgdmlhIHRoZSBGb250Q2FjaGVBdXRvUmVsZWFzZSBtZWNo
YW5pc20KKyAgICAgICAgZGVyZWZGb3JBdXRvUmVsZWFzZWRGb250KGZvbnREYXRhKTsKKyAgICAg
ICAgcmV0dXJuIGZvbnREYXRhOworICAgIH0KIAogICAgIHJldHVybiAwOwogCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250Q2FjaGVGcmVlVHlwZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5
cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtODksNyArODksMTAgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRD
YWNoZTo6Z2V0Rm9udAogICAgIFJlZlB0cjxGY1BhdHRlcm4+IGZhbGxiYWNrUGF0dGVybiA9IGFk
b3B0UmVmKGZpbmRCZXN0Rm9udEdpdmVuRmFsbGJhY2tzKGZvbnREYXRhLCBwYXR0ZXJuLmdldCgp
KSk7CiAgICAgaWYgKGZhbGxiYWNrUGF0dGVybikgewogICAgICAgICBGb250UGxhdGZvcm1EYXRh
IGFsdGVybmF0ZUZvbnREYXRhKGZhbGxiYWNrUGF0dGVybi5nZXQoKSwgZm9udC5mb250RGVzY3Jp
cHRpb24oKSk7Ci0gICAgICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9u
dERhdGEpOworICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVk
Rm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICAgICAgLy8gZGVyZWYgZm9udCBzaW5j
ZSBpdCBpcyBndWFyZGVkIHZpYSB0aGUgRm9udENhY2hlQXV0b1JlbGVhc2UgbWVjaGFuaXNtCisg
ICAgICAgIGRlcmVmRm9yQXV0b1JlbGVhc2VkRm9udChyZXN1bHQpOworICAgICAgICByZXR1cm4g
cmVzdWx0OwogICAgIH0KIAogICAgIEZjUmVzdWx0IGZvbnRDb25maWdSZXN1bHQ7CkBAIC05Nyw3
ICsxMDAsMTAgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAg
IGlmICghcmVzdWx0UGF0dGVybikKICAgICAgICAgcmV0dXJuIDA7CiAgICAgRm9udFBsYXRmb3Jt
RGF0YSBhbHRlcm5hdGVGb250RGF0YShyZXN1bHRQYXR0ZXJuLmdldCgpLCBmb250LmZvbnREZXNj
cmlwdGlvbigpKTsKLSAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnRE
YXRhKTsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udERh
dGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICAvLyBkZXJlZiBmb250IHNpbmNlIGl0IGlzIGd1
YXJkZWQgdmlhIHRoZSBGb250Q2FjaGVBdXRvUmVsZWFzZSBtZWNoYW5pc20KKyAgICBkZXJlZkZv
ckF1dG9SZWxlYXNlZEZvbnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBTaW1w
bGVGb250RGF0YSogRm9udENhY2hlOjpnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShjb25zdCBG
b250JiBmb250KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvaGFpa3Uv
Rm9udENhY2hlSGFpa3UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2hhaWt1L0ZvbnRDYWNoZUhhaWt1LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9oYWlrdS9Gb250Q2FjaGVIYWlrdS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDEwIEBAIHZvaWQgRm9udENhY2hlOjpwbGF0Zm9y
bUluaXQoKQogY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JD
aGFyYWN0ZXJzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQg
bGVuZ3RoKQogewogICAgIEZvbnRQbGF0Zm9ybURhdGEgZGF0YShmb250LmZvbnREZXNjcmlwdGlv
bigpLCBmb250LmZhbWlseSgpLmZhbWlseSgpKTsKLSAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERh
dGEoJmRhdGEpOworICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGdldENhY2hl
ZEZvbnREYXRhKCZkYXRhKTsKKyAgICAvLyBkZXJlZiBmb250IHNpbmNlIGl0IGlzIGd1YXJkZWQg
dmlhIHRoZSBGb250Q2FjaGVBdXRvUmVsZWFzZSBtZWNoYW5pc20KKyAgICBkZXJlZkZvckF1dG9S
ZWxlYXNlZEZvbnQoZm9udERhdGEpOworICAgIHJldHVybiBmb250RGF0YTsKIH0KIAogU2ltcGxl
Rm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9u
dCYgZm9udCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250
Q2FjaGVNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL0ZvbnRDYWNoZU1hYy5tbQkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udENhY2hlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTIsNyArMTUyLDExIEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZv
bnQKICAgICAgICAgIWZvbnQuaXNQbGF0Zm9ybUZvbnQoKSAmJiBpc0FwcEtpdEZvbnRXZWlnaHRC
b2xkKHdlaWdodCkgJiYgIWlzQXBwS2l0Rm9udFdlaWdodEJvbGQoc3Vic3RpdHV0ZUZvbnRXZWln
aHQpLAogICAgICAgICAhZm9udC5pc1BsYXRmb3JtRm9udCgpICYmICh0cmFpdHMgJiBOU0ZvbnRJ
dGFsaWNUcmFpdCkgJiYgIShzdWJzdGl0dXRlRm9udFRyYWl0cyAmIE5TRm9udEl0YWxpY1RyYWl0
KSwKICAgICAgICAgcGxhdGZvcm1EYXRhLm1fb3JpZW50YXRpb24pOwotICAgIHJldHVybiBnZXRD
YWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisKKyAgICBjb25zdCBTaW1wbGVGb250RGF0
YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnQpOworICAgIC8vIGRl
cmVmIGZvbnQgc2luY2UgaXQgaXMgZ3VhcmRlZCB2aWEgdGhlIEZvbnRDYWNoZUF1dG9SZWxlYXNl
IG1lY2hhbmlzbQorICAgIGRlcmVmRm9yQXV0b1JlbGVhc2VkRm9udChyZXN1bHQpOworICAgIHJl
dHVybiByZXN1bHQ7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJG
b250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQmIGZvbnQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwCShyZXZpc2lvbiA4
ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtODAsNyArODAsMTAgQEAgY29uc3QgU2ltcGxlRm9udERh
dGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmICghY29tcHV0ZWRGb250LmlzVmFsaWQoKSkK
ICAgICAgICAgcmV0dXJuIDA7CiAgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250KGNv
bXB1dGVkRm9udCk7Ci0gICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250
KTsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0
YSgmYWx0ZXJuYXRlRm9udCk7CisgICAgLy8gZGVyZWYgZm9udCBzaW5jZSBpdCBpcyBndWFyZGVk
IHZpYSB0aGUgRm9udENhY2hlQXV0b1JlbGVhc2UgbWVjaGFuaXNtCisgICAgZGVyZWZGb3JBdXRv
UmVsZWFzZWRGb250KGZvbnREYXRhKTsKKyAgICByZXR1cm4gZm9udERhdGE7CiAjZWxzZQogICAg
IFFfVU5VU0VEKGZvbnQpOwogICAgIFFfVU5VU0VEKGNoYXJhY3RlcnMpOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5j
cHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ZvbnRDYWNoZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4NCw4ICsyODQsMTEgQEAg
Y29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmIChoZm9udCkg
ewogICAgICAgICBpZiAoIWZhbWlseU5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBGb250
UGxhdGZvcm1EYXRhKiByZXN1bHQgPSBnZXRDYWNoZWRGb250UGxhdGZvcm1EYXRhKGZvbnQuZm9u
dERlc2NyaXB0aW9uKCksIGZhbWlseU5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCkKKyAg
ICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBmb250RGF0YSA9IGdldENh
Y2hlZEZvbnREYXRhKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgLy8gZGVyZWYgZm9udCBzaW5j
ZSBpdCBpcyBndWFyZGVkIHZpYSB0aGUgRm9udENhY2hlQXV0b1JlbGVhc2UgbWVjaGFuaXNtCisg
ICAgICAgICAgICAgICAgZGVyZWZGb3JBdXRvUmVsZWFzZWRGb250KGZvbnREYXRhKTsKKyAgICAg
ICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQp
OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hl
V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250Q2FjaGVXaW5DRS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwOCw4ICszMDgsMTEgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0Rm9udAogCiAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEqIHJlc3VsdCA9IGdldENhY2hl
ZEZvbnRQbGF0Zm9ybURhdGEoZm9udERlc2NyaXB0aW9uLCBmYW1pbHlOYW1lKTsKICAgICAgICAg
aWYgKHJlc3VsdCAmJiByZXN1bHQtPmhhc2goKSAhPSBvcmlnRm9udC5oYXNoKCkpIHsKLSAgICAg
ICAgICAgIGlmIChTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0YShy
ZXN1bHQpKQorICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGdldENh
Y2hlZEZvbnREYXRhKHJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkZXJlZiBmb250IHNp
bmNlIGl0IGlzIGd1YXJkZWQgdmlhIHRoZSBGb250Q2FjaGVBdXRvUmVsZWFzZSBtZWNoYW5pc20K
KyAgICAgICAgICAgICAgICBkZXJlZkZvckF1dG9SZWxlYXNlZEZvbnQoZm9udERhdGEpOwogICAg
ICAgICAgICAgICAgIHJldHVybiBmb250RGF0YTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQog
ICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvRm9udENh
Y2hlV3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3d4L0ZvbnRDYWNoZVd4LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3
LDggKzQ3LDEwIEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAg
ICAgICAgZm9udERhdGEgPSBnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShmb250KTsKICAgICBp
ZiAoIWZvbnREYXRhLT5jb250YWluc0NoYXJhY3RlcnMoY2hhcmFjdGVycywgbGVuZ3RoKSkKICAg
ICAgICAgZm9udERhdGEgPSBnZXRMYXN0UmVzb3J0RmFsbGJhY2tGb250KGZvbnQuZm9udERlc2Ny
aXB0aW9uKCkpOwotICAgIAorIAogICAgIEFTU0VSVChmb250RGF0YSk7CisgICAgLy8gZGVyZWYg
Zm9udCBzaW5jZSBpdCBpcyBndWFyZGVkIHZpYSB0aGUgRm9udENhY2hlQXV0b1JlbGVhc2UgbWVj
aGFuaXNtCisgICAgZGVyZWZGb3JBdXRvUmVsZWFzZWRGb250KGZvbnREYXRhKTsKICAgICByZXR1
cm4gZm9udERhdGE7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJ
bWFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklt
YWdlLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVySW1hZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKIAorI2luY2x1ZGUgIkZvbnRDYWNo
ZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVTZWxlY3Rpb24uaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKQEAgLTEwMiw2ICsxMDMsOSBAQCBib29sIFJlbmRl
ckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0CiAKICAgICAvLyB3ZSBoYXZlIGFuIGFsdCBh
bmQgdGhlIHVzZXIgbWVhbnQgaXQgKGl0cyBub3QgYSB0ZXh0IHdlIGludmVudGVkKQogICAgIGlm
ICghbV9hbHRUZXh0LmlzRW1wdHkoKSkgeworICAgICAgICAvLyBQcm90ZWN0cyBhbmQgYXV0b21h
dGljYWxseSByZWxlYXNlcyBzeXN0ZW0gZmFsbGJhY2sgZm9udHMgZnJvbSBmb250IGNhY2hlCisg
ICAgICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlIGZvbnRDYWNoZUF1dG9SZWxlYXNlOworICAgICAg
ICAKICAgICAgICAgY29uc3QgRm9udCYgZm9udCA9IHN0eWxlKCktPmZvbnQoKTsKICAgICAgICAg
SW50U2l6ZSB0ZXh0U2l6ZShtaW4oZm9udC53aWR0aChSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4
dFJ1bih0aGlzLCBmb250LCBtX2FsdFRleHQsIHN0eWxlKCkpKSwgbWF4QWx0VGV4dFdpZHRoKSwg
bWluKGZvbnQuZm9udE1ldHJpY3MoKS5oZWlnaHQoKSwgbWF4QWx0VGV4dEhlaWdodCkpOwogICAg
ICAgICBpbWFnZVNpemUgPSBpbWFnZVNpemUuZXhwYW5kZWRUbyh0ZXh0U2l6ZSk7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEJveC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3BwCShyZXZpc2lvbiA4ODAx
MCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgogI2lu
Y2x1ZGUgIkV2ZW50UXVldWUuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKKyNpbmNs
dWRlICJGb250Q2FjaGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lU2Vs
ZWN0aW9uLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCkBAIC05OCw2ICs5OSw5IEBAIFJlbmRl
ckxpc3RCb3g6On5SZW5kZXJMaXN0Qm94KCkKIAogdm9pZCBSZW5kZXJMaXN0Qm94Ojp1cGRhdGVG
cm9tRWxlbWVudCgpCiB7CisgICAgLy8gUHJvdGVjdHMgYW5kIGF1dG9tYXRpY2FsbHkgcmVsZWFz
ZXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIGZyb20gZm9udCBjYWNoZQorICAgIEZvbnRDYWNoZUF1
dG9SZWxlYXNlIGZvbnRDYWNoZUF1dG9SZWxlYXNlOworCiAgICAgaWYgKG1fb3B0aW9uc0NoYW5n
ZWQpIHsKICAgICAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gdG9TZWxl
Y3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKS0+bGlzdEl0ZW1zKCk7CiAg
ICAgICAgIGludCBzaXplID0gbnVtSXRlbXMoKTsKQEAgLTM1OCw2ICszNjIsOSBAQCBzdGF0aWMg
SW50U2l6ZSBpdGVtT2Zmc2V0Rm9yQWxpZ25tZW50KFRlCiAKIHZvaWQgUmVuZGVyTGlzdEJveDo6
cGFpbnRJdGVtRm9yZWdyb3VuZChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHks
IGludCBsaXN0SW5kZXgpCiB7CisgICAgLy8gUHJvdGVjdHMgYW5kIGF1dG9tYXRpY2FsbHkgcmVs
ZWFzZXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIGZyb20gZm9udCBjYWNoZQorICAgIEZvbnRDYWNo
ZUF1dG9SZWxlYXNlIGZvbnRDYWNoZUF1dG9SZWxlYXNlOworICAgIAogICAgIFNlbGVjdEVsZW1l
bnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgp
KSk7CiAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0
SXRlbXMoKTsKICAgICBFbGVtZW50KiBlbGVtZW50ID0gbGlzdEl0ZW1zW2xpc3RJbmRleF07Cklu
ZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdC9tYWMvQ2hhbmdlTG9nCShyZXZpc2lvbiA4ODA1NSkKKysrIFNvdXJjZS9XZWJLaXQvbWFj
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBACisyMDExLTA2LTAzICBN
aWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVkIGJ5IEZvbnRDYWNoZTo6
Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVhc2VkCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3NQorCisgICAgICAgIFRo
aXMgY2hhbmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRz
IHRvIGJlIHJlbGVhc2UuCisgICAgICAgIFByZXZpb3VzbHksIHRoZSByZWZlcmVuY2UgY291bnRz
IGZvciB0aGVzZSBmb250cyBncmV3IHdpdGhvdXQgYm91bmQuICBUaGlzCisgICAgICAgIGlzIGlt
cGxlbWVudGVkIHByaW1hcmlseSBhbiBhdXRvIHJlbGVhc2UgY2xhc3MgdGhhdCB3cmFwcyBhY2Nl
c3NlcyB0byB0aGUKKyAgICAgICAgY2FjaGUgZm9yIHN5c3RlbSBmYWxsYmFjayBmb250cy4gIEFs
bCBzdWNoIGFjY2VzcyBhcmUgdmlhIHRoZSBtZXRob2QKKyAgICAgICAgRm9udENhY2hlOjpnZXRG
b250RGF0YUZvckNoYXJhY3RlcnMuIFRoZSBuZXcgY2xhc3MgaXMgY2FsbGVkCisgICAgICAgIEZv
bnRDYWNoZUF1dG9SZWxlYXNlLiBXaGVuIHN1Y2ggYW4gb2JqZWN0IGV4aXN0cywgaXQgcHJvdGVj
dHMgdGhlc2UgZm9udCBmcm9tIAorICAgICAgICBkZWxldGlvbi4gQWRkZWQgbG9jYWwgc2NvcGVk
IGluc3RhbmNlIG9mIEZvbnRDYWNoZUF1dG9SZWxlYXNlIHRvIHdyYXAgY29kZQorICAgICAgICB0
aGF0IGFjY2Vzc2VzIGZvbnRzIHZpYSBnZXRGb250RGF0YUZvckNoYXJhY3RlcnMuCisKKyAgICAg
ICAgKiBNaXNjL1dlYktpdE5TU3RyaW5nRXh0cmFzLm1tOgorICAgICAgICAoLVtOU1N0cmluZyBf
d2ViX2RyYXdBdFBvaW50OmZvbnQ6dGV4dENvbG9yOmFsbG93aW5nRm9udFNtb290aGluZzpdKToK
KyAgICAgICAgKC1bTlNTdHJpbmcgX3dlYl93aWR0aFdpdGhGb250Ol0pOgorICAgICAgICAqIE1p
c2MvV2ViU3RyaW5nVHJ1bmNhdG9yLm1tOgorICAgICAgICAoK1tXZWJTdHJpbmdUcnVuY2F0b3Ig
Y2VudGVyVHJ1bmNhdGVTdHJpbmc6dG9XaWR0aDpdKToKKyAgICAgICAgKCtbV2ViU3RyaW5nVHJ1
bmNhdG9yIGNlbnRlclRydW5jYXRlU3RyaW5nOnRvV2lkdGg6d2l0aEZvbnQ6XSk6CisgICAgICAg
ICgrW1dlYlN0cmluZ1RydW5jYXRvciByaWdodFRydW5jYXRlU3RyaW5nOnRvV2lkdGg6d2l0aEZv
bnQ6XSk6CisgICAgICAgICgrW1dlYlN0cmluZ1RydW5jYXRvciB3aWR0aE9mU3RyaW5nOmZvbnQ6
XSk6CisKIDIwMTEtMDYtMDIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4K
IAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRleDogU291cmNlL1dlYktpdC9t
YWMvTWlzYy9XZWJLaXROU1N0cmluZ0V4dHJhcy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0L21hYy9NaXNjL1dlYktpdE5TU3RyaW5nRXh0cmFzLm1tCShyZXZpc2lvbiA4ODAxMCkKKysr
IFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViS2l0TlNTdHJpbmdFeHRyYXMubW0JKHdvcmtpbmcg
Y29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbXBvcnQgIldlYktpdE5TU3RyaW5nRXh0cmFzLmgi
CiAKICNpbXBvcnQgPFdlYkNvcmUvRm9udC5oPgorI2ltcG9ydCA8V2ViQ29yZS9Gb250Q2FjaGUu
aD4KICNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NDb250ZXh0Lmg+CiAjaW1wb3J0IDxXZWJDb3Jl
L1RleHRSdW4uaD4KICNpbXBvcnQgPFdlYkNvcmUvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLmg+CkBA
IC04OSw2ICs5MCw5IEBAIC0gKHZvaWQpX3dlYl9kcmF3QXRQb2ludDooTlNQb2ludClwb2ludCAK
ICAgICAgICAgaWYgKCFmbGlwcGVkKQogICAgICAgICAgICAgQ0dDb250ZXh0U2NhbGVDVE0oY2dD
b250ZXh0LCAxLCAtMSk7CiAKKyAgICAgICAgLy8gUHJvdGVjdHMgYW5kIGF1dG9tYXRpY2FsbHkg
cmVsZWFzZXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIGZyb20gZm9udCBjYWNoZQorICAgICAgICBG
b250Q2FjaGVBdXRvUmVsZWFzZSBmb250Q2FjaGVBdXRvUmVsZWFzZTsKKwogICAgICAgICBGb250
IHdlYkNvcmVGb250KEZvbnRQbGF0Zm9ybURhdGEoZm9udCwgW2ZvbnQgcG9pbnRTaXplXSksICFb
bnNDb250ZXh0IGlzRHJhd2luZ1RvU2NyZWVuXSwgZm9udFNtb290aGluZ0lzQWxsb3dlZCA/IEF1
dG9TbW9vdGhpbmcgOiBBbnRpYWxpYXNlZCk7CiAgICAgICAgIFRleHRSdW4gcnVuKGJ1ZmZlci5k
YXRhKCksIGxlbmd0aCk7CiAKQEAgLTEzNCw2ICsxMzgsOSBAQCAtIChmbG9hdClfd2ViX3dpZHRo
V2l0aEZvbnQ6KE5TRm9udCAqKWZvCiAgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczpidWZmZXIuZGF0
YSgpXTsKIAogICAgIGlmIChjYW5Vc2VGYXN0UmVuZGVyZXIoYnVmZmVyLmRhdGEoKSwgbGVuZ3Ro
KSkgeworICAgICAgICAvLyBQcm90ZWN0cyBhbmQgYXV0b21hdGljYWxseSByZWxlYXNlcyBzeXN0
ZW0gZmFsbGJhY2sgZm9udHMgZnJvbSBmb250IGNhY2hlCisgICAgICAgIEZvbnRDYWNoZUF1dG9S
ZWxlYXNlIGZvbnRDYWNoZUF1dG9SZWxlYXNlOworCiAgICAgICAgIEZvbnQgd2ViQ29yZUZvbnQo
Rm9udFBsYXRmb3JtRGF0YShmb250LCBbZm9udCBwb2ludFNpemVdKSwgIVtbTlNHcmFwaGljc0Nv
bnRleHQgY3VycmVudENvbnRleHRdIGlzRHJhd2luZ1RvU2NyZWVuXSk7CiAgICAgICAgIFRleHRS
dW4gcnVuKGJ1ZmZlci5kYXRhKCksIGxlbmd0aCk7CiAgICAgICAgIHJldHVybiB3ZWJDb3JlRm9u
dC53aWR0aChydW4pOwpJbmRleDogU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVu
Y2F0b3IubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJTdHJpbmdU
cnVuY2F0b3IubW0JKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYktpdC9tYWMvTWlzYy9X
ZWJTdHJpbmdUcnVuY2F0b3IubW0JKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKIAog
I2ltcG9ydCAiV2ViU3lzdGVtSW50ZXJmYWNlLmgiCiAjaW1wb3J0IDxXZWJDb3JlL0ZvbnQuaD4K
KyNpbXBvcnQgPFdlYkNvcmUvRm9udENhY2hlLmg+CiAjaW1wb3J0IDxXZWJDb3JlL0ZvbnRQbGF0
Zm9ybURhdGEuaD4KICNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1TdHJpbmcuaD4KICNpbXBvcnQg
PFdlYkNvcmUvU3RyaW5nVHJ1bmNhdG9yLmg+CkBAIC03MiwyMSArNzMsMjkgQEAgKyAodm9pZClp
bml0aWFsaXplCiAKICsgKE5TU3RyaW5nICopY2VudGVyVHJ1bmNhdGVTdHJpbmc6KE5TU3RyaW5n
ICopc3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1heFdpZHRoCiB7CisgICAgLy8gUHJvdGVjdHMgYW5k
IGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIGZyb20gZm9udCBj
YWNoZQorICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlIGZvbnRDYWNoZUF1dG9SZWxlYXNlOwogICAg
IHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OmNlbnRlclRydW5jYXRlKHN0cmluZywgbWF4V2lkdGgs
IGZvbnRGcm9tTlNGb250KGRlZmF1bHRNZW51Rm9udCgpKSk7CiB9CiAKICsgKE5TU3RyaW5nICop
Y2VudGVyVHJ1bmNhdGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1h
eFdpZHRoIHdpdGhGb250OihOU0ZvbnQgKilmb250CiB7CisgICAgLy8gUHJvdGVjdHMgYW5kIGF1
dG9tYXRpY2FsbHkgcmVsZWFzZXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIGZyb20gZm9udCBjYWNo
ZQorICAgIEZvbnRDYWNoZUF1dG9SZWxlYXNlIGZvbnRDYWNoZUF1dG9SZWxlYXNlOwogICAgIHJl
dHVybiBTdHJpbmdUcnVuY2F0b3I6OmNlbnRlclRydW5jYXRlKHN0cmluZywgbWF4V2lkdGgsIGZv
bnRGcm9tTlNGb250KGZvbnQpKTsKIH0KIAogKyAoTlNTdHJpbmcgKilyaWdodFRydW5jYXRlU3Ry
aW5nOihOU1N0cmluZyAqKXN0cmluZyB0b1dpZHRoOihmbG9hdCltYXhXaWR0aCB3aXRoRm9udDoo
TlNGb250ICopZm9udAogeworICAgIC8vIFByb3RlY3RzIGFuZCBhdXRvbWF0aWNhbGx5IHJlbGVh
c2VzIHN5c3RlbSBmYWxsYmFjayBmb250cyBmcm9tIGZvbnQgY2FjaGUKKyAgICBGb250Q2FjaGVB
dXRvUmVsZWFzZSBmb250Q2FjaGVBdXRvUmVsZWFzZTsKICAgICByZXR1cm4gU3RyaW5nVHJ1bmNh
dG9yOjpyaWdodFRydW5jYXRlKHN0cmluZywgbWF4V2lkdGgsIGZvbnRGcm9tTlNGb250KGZvbnQp
KTsKIH0KIAogKyAoZmxvYXQpd2lkdGhPZlN0cmluZzooTlNTdHJpbmcgKilzdHJpbmcgZm9udDoo
TlNGb250ICopZm9udAogeworICAgIC8vIFByb3RlY3RzIGFuZCBhdXRvbWF0aWNhbGx5IHJlbGVh
c2VzIHN5c3RlbSBmYWxsYmFjayBmb250cyBmcm9tIGZvbnQgY2FjaGUKKyAgICBGb250Q2FjaGVB
dXRvUmVsZWFzZSBmb250Q2FjaGVBdXRvUmVsZWFzZTsKICAgICByZXR1cm4gU3RyaW5nVHJ1bmNh
dG9yOjp3aWR0aChzdHJpbmcsIGZvbnRGcm9tTlNGb250KGZvbnQpKTsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>96000</attachid>
            <date>2011-06-03 17:51:26 -0700</date>
            <delta_ts>2011-06-05 17:54:53 -0700</delta_ts>
            <desc>Updated patch to address comments #12 &amp; #13</desc>
            <filename>61875-3.patch</filename>
            <type>text/plain</type>
            <size>29945</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg4MDgzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzYgQEAKKzIwMTEtMDYtMDMgIE1pY2hhZWwg
U2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgRm9udHMgcmV0dXJuZWQgYnkgRm9udENhY2hlOjpnZXRGb250
RGF0YUZvckNoYXJhY3RlcnMoKSBhcmUgbmV2ZXIgcmVsZWFzZWQKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYxODc1CisKKyAgICAgICAgVGhpcyBjaGFu
Z2UgYWxsb3dzIGZvbnRzIGFsbG9jYXRlZCBhcyBzeXN0ZW0gZmFsbGJhY2sgZm9udHMgdG8gYmUg
cmVsZWFzZWQuCisgICAgICAgIFByZXZpb3VzbHksIHRoZSByZWZlcmVuY2UgY291bnRzIGZvciB0
aGVzZSBmb250cyBncmV3IHdpdGhvdXQgYm91bmQuICBUaGlzCisgICAgICAgIGlzIGltcGxlbWVu
dGVkIGFzIGFuIGF1dG8gcmVsZWFzZSBjbGFzcyB0aGF0IHdyYXBzIGFjY2Vzc2VzIHRvIHRoZSBj
YWNoZQorICAgICAgICBmb3Igc3lzdGVtIGZhbGxiYWNrIGZvbnRzLiBBbGwgc3VjaCBhY2Nlc3Nl
cyBhcmUgdmlhIHRoZSBtZXRob2QKKyAgICAgICAgRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNo
YXJhY3RlcnMuIFRoZSBuZXcgY2xhc3MgaXMgY2FsbGVkCisgICAgICAgIEZvbnRDYWNoZVB1cmdl
UHJldmVudGVyLiBXaGVuIHN1Y2ggYW4gb2JqZWN0IGV4aXN0cywgaXQgcHJvdGVjdHMgdGhlc2Ug
Zm9udHMgZnJvbSAKKyAgICAgICAgZGVsZXRpb24uCisgICAgICAgIEFkZGVkIGxvY2FsIHNjb3Bl
ZCBpbnN0YW5jZSBvZiBGb250Q2FjaGVQdXJnZVByZXZlbnRlciB0byB3cmFwIGNvZGUgdGhhdCBh
Y2Nlc3NlcworICAgICAgICBmb250cyB2aWEgZ2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzLiAgRGlk
IGEgZmV3IG90aGVyIG1pc2NlbGxhbmVvdXMgYnVnIGZpeGVzCisgICAgICAgIGFuZCBjaGFuZ2Vz
IHRvIGFsbG93IHN5c3RlbSBmYWxsYmFjayBmb250cyB0byBiZSBjbGVhcmVkIGZyb20gdGhlIEds
eXBoUGFnZVRyZWUKKyAgICAgICAgQWRkZWQgdGhlIHN1cHBvcnRpbmcgY29kZSBpbiB0aGUgcGxh
dGZvcm0gc3BlY2lmaWMgdmVyc2lvbnMgb2YgCisgICAgICAgIEZvbnRjYWNoZTo6Z2V0Rm9udERh
dGFGb3JDaGFyYWN0ZXJzCisKKyAgICAgICAgTm8gbmV3IHRlc3QgYXMgdGhlIGZ1bmN0aW9uYWxp
dHkgaGFzIG5vdCBjaGFuZ2VkLiBJbXByb3ZlZCBmb250IGxpZmUgY3ljbGUKKyAgICAgICAgbWFu
YWdlbWVudC4KKworICAgICAgICAqIFdlYkNvcmUuZXhwLmluOgorICAgICAgICAqIGh0bWwvY2Fu
dmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQ6Om1lYXN1cmVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZHJhd1RleHRJbnRlcm5hbCk6CisgICAgICAgICogcGFn
ZS9GcmFtZVZpZXcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVWaWV3OjpsYXlvdXQpOgor
ICAgICAgICAoV2ViQ29yZTo6RnJhbWVWaWV3OjpwYWludENvbnRlbnRzKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENh
Y2hlOjpGb250Q2FjaGUpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRDYWNoZWRG
b250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmNoZWNrRm9yRm9udHNUb1B1cmdlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cHVyZ2VJbmFjdGl2ZUZvbnREYXRhKToKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6ZGVyZWZGb3JQdXJnZVByb3RlY3RlZEZvbnQpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5oOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udENhY2hlOjppbmNQdXJnZVByZXZlbnRDb3VudCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
Q2FjaGU6OmRlY1B1cmdlUHJldmVudENvdW50KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNo
ZVB1cmdlUHJldmVudGVyOjpGb250Q2FjaGVQdXJnZVByZXZlbnRlcik6CisgICAgICAgIChXZWJD
b3JlOjpGb250Q2FjaGVQdXJnZVByZXZlbnRlcjo6fkZvbnRDYWNoZVB1cmdlUHJldmVudGVyKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Rm9udDo6Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9HbHlwaFBhZ2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZTo6Y2xl
YXJGb3JGb250RGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJl
ZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lRm9u
dERhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjp+U2ltcGxlRm9udERhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OkRlcml2ZWRGb250RGF0YTo6fkRlcml2ZWRG
b250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6RGVyaXZlZEZvbnRE
YXRhOjpwcnVuZUZyb21HbHlwaFBhZ2VUcmVlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9TaW1wbGVGb250RGF0YS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6
Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9m
cmVldHlwZS9Gb250Q2FjaGVGcmVlVHlwZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2Fj
aGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvaGFpa3UvRm9udENhY2hlSGFpa3UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hl
OjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L21hYy9Gb250Q2FjaGVNYWMubW06CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZv
bnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dENhY2hlUXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZv
ckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVX
aW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJh
Y3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNF
LmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6Cisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0KToKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyTGlzdEJveC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJMaXN0Qm94Ojp1cGRh
dGVGcm9tRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJMaXN0Qm94OjpwYWludEl0
ZW1Gb3JlZ3JvdW5kKToKKwogMjAxMS0wNi0wMyAgQ2FyeSBDbGFyayAgPGNhcnljbGFya0Bnb29n
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpJbmRleDogU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5leHAuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS5leHAuaW4JKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS5l
eHAuaW4JKHdvcmtpbmcgY29weSkKQEAgLTkyMCw2ICs5MjAsNyBAQCBfX1pON1dlYkNvcmU5Rmxv
YXRSZWN0QzFFUks3X05TUmVjdAogX19aTjdXZWJDb3JlOUZsb2F0UmVjdEMxRVJLTlNfN0ludFJl
Y3RFCiBfX1pON1dlYkNvcmU5RmxvYXRTaXplQzFFUktOU183SW50U2l6ZUUKIF9fWk43V2ViQ29y
ZTlGb250Q2FjaGUxM2ZvbnREYXRhQ291bnRFdgorX19aTjdXZWJDb3JlOUZvbnRDYWNoZTIwY2hl
Y2tGb3JGb250c1RvUHVyZ2VFdgogX19aTjdXZWJDb3JlOUZvbnRDYWNoZTIxaW5hY3RpdmVGb250
RGF0YUNvdW50RXYKIF9fWk43V2ViQ29yZTlGb250Q2FjaGUyMXB1cmdlSW5hY3RpdmVGb250RGF0
YUVpCiBfX1pON1dlYkNvcmU5RnJhbWVUcmVlMTFhcHBlbmRDaGlsZEVOM1dURjEwUGFzc1JlZlB0
cklOU181RnJhbWVFRUUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9j
YW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAkocmV2aXNpb24gODgwMTApCisrKyBT
b3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSAiQ2FudmFzU3R5bGUuaCIK
ICNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCiAjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgi
CisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAj
aW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50
LmgiCkBAIC0xODc0LDYgKzE4NzUsOCBAQCB2b2lkIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6
c3Ryb2tlVGV4CiAKIFBhc3NSZWZQdHI8VGV4dE1ldHJpY3M+IENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRDo6bWVhc3VyZVRleHQoY29uc3QgU3RyaW5nJiB0ZXh0KQogeworICAgIEZvbnRDYWNoZVB1
cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworICAgIAogICAgIFJlZlB0cjxU
ZXh0TWV0cmljcz4gbWV0cmljcyA9IFRleHRNZXRyaWNzOjpjcmVhdGUoKTsKIAogI2lmIFBMQVRG
T1JNKFFUKQpAQCAtMTkwMCw2ICsxOTAzLDggQEAgdm9pZCBDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQ6OmRyYXdUZXh0SQogICAgICAgICByZXR1cm47CiAgICAgaWYgKCFpc2Zpbml0ZSh4KSB8ICFp
c2Zpbml0ZSh5KSkKICAgICAgICAgcmV0dXJuOworICAgIAorICAgIEZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOwogCiAgICAgY29uc3QgRm9udCYgZm9udCA9
IGFjY2Vzc0ZvbnQoKTsKICAgICBjb25zdCBGb250TWV0cmljcyYgZm9udE1ldHJpY3MgPSBmb250
LmZvbnRNZXRyaWNzKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCShyZXZpc2lv
biA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgogI2luY2x1
ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkZvY3VzQ29udHJvbGxlci5oIgorI2luY2x1ZGUg
IkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVBY3Rpb25T
Y2hlZHVsZXIuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgpAQCAtODk2LDYgKzg5Nyw4IEBA
IHZvaWQgRnJhbWVWaWV3OjpsYXlvdXQoYm9vbCBhbGxvd1N1YnRyZWUKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyOworCiAgICAgbV9uZXN0ZWRMYXlvdXRDb3VudCsrOwogCiAgICAgaWYgKCFtX2xheW91
dFJvb3QpIHsKQEAgLTI0MjMsNiArMjQyNiw4IEBAIHZvaWQgRnJhbWVWaWV3OjpwYWludENvbnRl
bnRzKEdyYXBoaWNzQ28KICAgICBpZiAobmVlZHNMYXlvdXQoKSkKICAgICAgICAgcmV0dXJuOwog
CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisK
ICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgaWYgKCFwLT5wYWludGluZ0Rp
c2FibGVkKCkpCiAgICAgICAgIHN5bmNDb21wb3NpdGluZ1N0YXRlRm9yVGhpc0ZyYW1lKCk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5jcHAJ
KHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9u
dENhY2hlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIkZv
bnRGYWxsYmFja0xpc3QuaCIKICNpbmNsdWRlICJGb250UGxhdGZvcm1EYXRhLmgiCiAjaW5jbHVk
ZSAiRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiR2x5cGhQYWdlVHJlZU5vZGUuaCIKICNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgogI2luY2x1
ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTUwLDYgKzUxLDcgQEAgRm9udENhY2hlKiBmb250
Q2FjaGUoKQogfQogCiBGb250Q2FjaGU6OkZvbnRDYWNoZSgpCisgICAgOiBtX3B1cmdlUHJldmVu
dENvdW50KDApCiB7CiB9CiAKQEAgLTI0OSw4ICsyNTEsOCBAQCB0eXBlZGVmIEhhc2hNYXA8Rm9u
dFBsYXRmb3JtRGF0YSwgcGFpcjxTCiAKIHN0YXRpYyBGb250RGF0YUNhY2hlKiBnRm9udERhdGFD
YWNoZSA9IDA7CiAKLWNvbnN0IGludCBjTWF4SW5hY3RpdmVGb250RGF0YSA9IDEyMDsgIC8vIFBy
ZXR0eSBMb3cgVGhyZXNob2xkCi1jb25zdCBpbnQgY1RhcmdldEluYWN0aXZlRm9udERhdGEgPSAx
MDA7Citjb25zdCBpbnQgY01heEluYWN0aXZlRm9udERhdGEgPSA1MDsgLy8gUHJldHR5IExvdyBU
aHJlc2hvbGQKK2NvbnN0IGludCBjVGFyZ2V0SW5hY3RpdmVGb250RGF0YSA9IDMwOwogc3RhdGlj
IExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGdJbmFjdGl2ZUZvbnREYXRhID0g
MDsKIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Q2FjaGVkRm9udERhdGEoY29uc3Qg
Rm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNvbnN0IEF0b21pY1N0cmluZyYgZmFt
aWx5LCBib29sIGNoZWNraW5nQWx0ZXJuYXRlTmFtZSkKQEAgLTI3MSw3ICsyNzMsNyBAQCBTaW1w
bGVGb250RGF0YSogRm9udENhY2hlOjpnZXRDYWNoZWRGb250CiAgICAgICAgIGdGb250RGF0YUNh
Y2hlID0gbmV3IEZvbnREYXRhQ2FjaGU7CiAgICAgICAgIGdJbmFjdGl2ZUZvbnREYXRhID0gbmV3
IExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj47CiAgICAgfQotICAgIAorCiAgICAg
Rm9udERhdGFDYWNoZTo6aXRlcmF0b3IgcmVzdWx0ID0gZ0ZvbnREYXRhQ2FjaGUtPmZpbmQoKnBs
YXRmb3JtRGF0YSk7CiAgICAgaWYgKHJlc3VsdCA9PSBnRm9udERhdGFDYWNoZS0+ZW5kKCkpIHsK
ICAgICAgICAgcGFpcjxTaW1wbGVGb250RGF0YSosIHVuc2lnbmVkPiBuZXdWYWx1ZShuZXcgU2lt
cGxlRm9udERhdGEoKnBsYXRmb3JtRGF0YSksIDEpOwpAQCAtMjk0LDE2ICsyOTYsMjAgQEAgdm9p
ZCBGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YShjb25zdCBTaQogICAgIEZvbnREYXRhQ2FjaGU6
Oml0ZXJhdG9yIGl0ID0gZ0ZvbnREYXRhQ2FjaGUtPmZpbmQoZm9udERhdGEtPnBsYXRmb3JtRGF0
YSgpKTsKICAgICBBU1NFUlQoaXQgIT0gZ0ZvbnREYXRhQ2FjaGUtPmVuZCgpKTsKIAotICAgIGlm
ICghLS1pdC0+c2Vjb25kLnNlY29uZCkgeworICAgIEFTU0VSVChpdC0+c2Vjb25kLnNlY29uZCk7
CisgICAgaWYgKCEtLWl0LT5zZWNvbmQuc2Vjb25kKQogICAgICAgICBnSW5hY3RpdmVGb250RGF0
YS0+YWRkKGZvbnREYXRhKTsKLSAgICAgICAgaWYgKGdJbmFjdGl2ZUZvbnREYXRhLT5zaXplKCkg
PiBjTWF4SW5hY3RpdmVGb250RGF0YSkKLSAgICAgICAgICAgIHB1cmdlSW5hY3RpdmVGb250RGF0
YShnSW5hY3RpdmVGb250RGF0YS0+c2l6ZSgpIC0gY1RhcmdldEluYWN0aXZlRm9udERhdGEpOwot
ICAgIH0KK30KKwordm9pZCBGb250Q2FjaGU6OmNoZWNrRm9yRm9udHNUb1B1cmdlKCkKK3sKKyAg
ICBpZiAoZ0luYWN0aXZlRm9udERhdGEgJiYgIW1fcHVyZ2VQcmV2ZW50Q291bnQgJiYgZ0luYWN0
aXZlRm9udERhdGEtPnNpemUoKSA+IGNNYXhJbmFjdGl2ZUZvbnREYXRhKQorICAgICAgICBwdXJn
ZUluYWN0aXZlRm9udERhdGEoZ0luYWN0aXZlRm9udERhdGEtPnNpemUoKSAtIGNUYXJnZXRJbmFj
dGl2ZUZvbnREYXRhKTsKIH0KIAogdm9pZCBGb250Q2FjaGU6OnB1cmdlSW5hY3RpdmVGb250RGF0
YShpbnQgY291bnQpCiB7Ci0gICAgaWYgKCFnSW5hY3RpdmVGb250RGF0YSkKKyAgICBpZiAoIWdJ
bmFjdGl2ZUZvbnREYXRhIHx8IG1fcHVyZ2VQcmV2ZW50Q291bnQpCiAgICAgICAgIHJldHVybjsK
IAogICAgIHN0YXRpYyBib29sIGlzUHVyZ2luZzsgIC8vIEd1YXJkIGFnYWluc3QgcmVlbnRyeSB3
aGVuIGUuZy4gYSBkZWxldGVkIEZvbnREYXRhIHJlbGVhc2VzIGl0cyBzbWFsbCBjYXBzIEZvbnRE
YXRhLgpAQCAtMzY0LDYgKzM3MCwxMiBAQCBzaXplX3QgRm9udENhY2hlOjppbmFjdGl2ZUZvbnRE
YXRhQ291bnQoCiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgRm9udENhY2hlOjpkZXJlZkZvclB1
cmdlUHJvdGVjdGVkRm9udChjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAg
QVNTRVJUKG1fcHVyZ2VQcmV2ZW50Q291bnQpOworICAgIHJlbGVhc2VGb250RGF0YShmb250RGF0
YSk7Cit9CisKIGNvbnN0IEZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnREYXRhKGNvbnN0IEZv
bnQmIGZvbnQsIGludCYgZmFtaWx5SW5kZXgsIEZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKQog
ewogICAgIFNpbXBsZUZvbnREYXRhKiByZXN1bHQgPSAwOwpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmgJKHJldmlzaW9uIDg4MDEwKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQ5LDE5ICs0OSwyMSBAQCBjbGFzcyBGb250RGF0YTsKIGNsYXNzIEZvbnREZXNjcmlwdGlv
bjsKIGNsYXNzIEZvbnRTZWxlY3RvcjsKIGNsYXNzIFNpbXBsZUZvbnREYXRhOworY2xhc3MgRm9u
dENhY2hlOwogCiBjbGFzcyBGb250Q2FjaGUgeworICAgIGZyaWVuZCBjbGFzcyBGb250Q2FjaGVQ
dXJnZVByZXZlbnRlcjsKKwogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEZvbnRDYWNoZSk7IFdU
Rl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgogICAgIGZyaWVuZCBGb250Q2FjaGUqIGZv
bnRDYWNoZSgpOwogCiAgICAgY29uc3QgRm9udERhdGEqIGdldEZvbnREYXRhKGNvbnN0IEZvbnQm
LCBpbnQmIGZhbWlseUluZGV4LCBGb250U2VsZWN0b3IqKTsKICAgICB2b2lkIHJlbGVhc2VGb250
RGF0YShjb25zdCBTaW1wbGVGb250RGF0YSopOwotICAgIAorIAogICAgIC8vIFRoaXMgbWV0aG9k
IGlzIGltcGxlbWVudGVkIGJ5IHRoZSBwbGF0Zm9ybS4KLSAgICAvLyBGSVhNRTogRm9udCBkYXRh
IHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG5ldmVyIGdvIGluYWN0aXZlIGJlY2F1c2UgY2FsbGVy
cyBkb24ndCB0cmFjayBhbmQgcmVsZWFzZSB0aGVtLgogICAgIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBnZXRGb250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYsIGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCBpbnQgbGVuZ3RoKTsKLSAgICAKKwogICAgIC8vIEFsc28gaW1wbGVtZW50ZWQgYnkg
dGhlIHBsYXRmb3JtLgogICAgIHZvaWQgcGxhdGZvcm1Jbml0KCk7CiAKQEAgLTk3LDYgKzk5LDIw
IEBAIHByaXZhdGU6CiAgICAgRm9udENhY2hlKCk7CiAgICAgfkZvbnRDYWNoZSgpOwogCisgICAg
aW5saW5lIHZvaWQgaW5jUHVyZ2VQcmV2ZW50Q291bnQoKSB7IG1fcHVyZ2VQcmV2ZW50Q291bnQr
KzsgfQorICAgIGlubGluZSB2b2lkIGRlY1B1cmdlUHJldmVudENvdW50KCkKKyAgICB7IAorICAg
ICAgICBpZiAoIS0tbV9wdXJnZVByZXZlbnRDb3VudCkKKyAgICAgICAgICAgIGNoZWNrRm9yRm9u
dHNUb1B1cmdlKCk7CisgICAgfQorCisgICAgdm9pZCBjaGVja0ZvckZvbnRzVG9QdXJnZSgpOwor
ICAgIAorICAgIC8vIERlcmVmIGZvbnRzIHJldHVybmVkIHZpYSBnZXRGb250RGF0YUZvckNoYXJh
Y3RlcnMoKSBzaW5jZSB3ZSB1c2UgbV9wdXJnZVByZXZlbnRDb3VudCB0byBndWFyZCBhZ2FpbnN0
CisgICAgLy8gdW5zYWZlIHB1cmdpbmcuIEFsbCBhY2Nlc3NlcyB0byBmb250cyB2aWEgdGhhdCBt
ZXRob2Qgc2hvdWxkIGJlIHdyYXBwZWQgd2l0aCBhIGxvY2FsIEZvbnRDYWNoZVB1cmdlUHJldmVu
dGVyCisgICAgLy8gdmFyaWFibGUgaW4gc2NvcGUuCisgICAgdm9pZCBkZXJlZkZvclB1cmdlUHJv
dGVjdGVkRm9udChjb25zdCBTaW1wbGVGb250RGF0YSopOworCiAgICAgLy8gRklYTUU6IFRoaXMg
bWV0aG9kIHNob3VsZCBldmVudHVhbGx5IGJlIHJlbW92ZWQuCiAgICAgRm9udFBsYXRmb3JtRGF0
YSogZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mLCBjb25z
dCBBdG9taWNTdHJpbmcmIGZhbWlseSwgYm9vbCBjaGVja2luZ0FsdGVybmF0ZU5hbWUgPSBmYWxz
ZSk7CiAKQEAgLTEwNiw2ICsxMjIsOSBAQCBwcml2YXRlOgogCiAgICAgU2ltcGxlRm9udERhdGEq
IGdldENhY2hlZEZvbnREYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqKTsKIAorICAgIC8vIERv
bid0IHB1cmdlIGlmIHRoaXMgY291bnQgaXMgPiAwOworICAgIGludCBtX3B1cmdlUHJldmVudENv
dW50OworCiAgICAgZnJpZW5kIGNsYXNzIFNpbXBsZUZvbnREYXRhOyAvLyBGb3IgZ2V0Q2FjaGVk
Rm9udERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSopCiAgICAgZnJpZW5kIGNsYXNzIEZvbnRG
YWxsYmFja0xpc3Q7CiB9OwpAQCAtMTEzLDYgKzEzMiwxMiBAQCBwcml2YXRlOgogLy8gR2V0IHRo
ZSBnbG9iYWwgZm9udENhY2hlLgogRm9udENhY2hlKiBmb250Q2FjaGUoKTsKIAorY2xhc3MgRm9u
dENhY2hlUHVyZ2VQcmV2ZW50ZXIgeworcHVibGljOgorICAgIGlubGluZSBGb250Q2FjaGVQdXJn
ZVByZXZlbnRlcigpIHsgZm9udENhY2hlKCktPmluY1B1cmdlUHJldmVudENvdW50KCk7IH0KKyAg
ICBpbmxpbmUgfkZvbnRDYWNoZVB1cmdlUHJldmVudGVyKCkgeyBmb250Q2FjaGUoKS0+ZGVjUHVy
Z2VQcmV2ZW50Q291bnQoKTsgfQorfTsKKwogfQogCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAkocmV2aXNpb24g
ODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGgu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICszNyw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBX
VEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKK3VzaW5nIHN0ZDo6bWF4OwogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKQEAgLTIxMCw5ICsyMTEsMTEgQEAgR2x5cGhEYXRhIEZvbnQ6OmdseXBo
RGF0YUZvckNoYXJhY3RlcihVQwogICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgY2hhcmFjdGVy
LCBwcm9iYWJseSBiZWNhdXNlIHRoZSBmb250IHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCBjb3Jy
ZWN0bHkuCiAgICAgICAgICAgICAvLyBTbyB3ZSBqdXN0IGFsd2F5cyBzZXQgdGhlIGdseXBoIHRv
IGJlIHNhbWUgYXMgdGhlIGNoYXJhY3RlciwgYW5kIGxldCBHREkgc29sdmUgaXQuCiAgICAgICAg
ICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgY2hhcmFjdGVyRm9udERh
dGEpOworICAgICAgICAgICAgY2hhcmFjdGVyRm9udERhdGEtPnNldE1heEdseXBoUGFnZVRyZWVM
ZXZlbChtYXgoY2hhcmFjdGVyRm9udERhdGEtPm1heEdseXBoUGFnZVRyZWVMZXZlbCgpLCBub2Rl
LT5sZXZlbCgpKSk7CiAgICAgICAgICAgICByZXR1cm4gcGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKGMpOwogI2Vsc2UKICAgICAgICAgICAgIHBhZ2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3Rl
cihjLCBkYXRhLmdseXBoLCBkYXRhLmZvbnREYXRhKTsKKyAgICAgICAgICAgIGRhdGEuZm9udERh
dGEtPnNldE1heEdseXBoUGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250RGF0YS0+bWF4R2x5cGhQ
YWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVsKCkpKTsKICNlbmRpZgogICAgICAgICB9CiAgICAg
ICAgIHJldHVybiBkYXRhOwpAQCAtMjI1LDkgKzIyOCwxMSBAQCBHbHlwaERhdGEgRm9udDo6Z2x5
cGhEYXRhRm9yQ2hhcmFjdGVyKFVDCiAjaWYgT1MoV0lOQ0UpCiAgICAgICAgIC8vIFNlZSBjb21t
ZW50IGFib3V0IFdJTkNFIEdESSBoYW5kbGluZyBuZWFyIHNldEdseXBoRGF0YUZvckNoYXJhY3Rl
ciBhYm92ZS4KICAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIGMsIGRh
dGEuZm9udERhdGEpOworICAgICAgICBkYXRhLmZvbnREYXRhLT5zZXRNYXhHbHlwaFBhZ2VUcmVl
TGV2ZWwobWF4KGRhdGEuZm9udERhdGEtPm1heEdseXBoUGFnZVRyZWVMZXZlbCgpLCBub2RlLT5s
ZXZlbCgpKSk7CiAgICAgICAgIHJldHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7
CiAjZWxzZQogICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgZGF0YS5n
bHlwaCwgZGF0YS5mb250RGF0YSk7CisgICAgICAgIGRhdGEuZm9udERhdGEtPnNldE1heEdseXBo
UGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxldmVsKCks
IG5vZGUtPmxldmVsKCkpKTsKICNlbmRpZgogICAgIH0KICAgICByZXR1cm4gZGF0YTsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oCShyZXZpc2lv
biA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0xMjEsNyArMTIxLDE3IEBAIHB1YmxpYzoKICAgICAgICAgbWVt
c2V0KG1fZ2x5cGhzLCAwLCBzaXplb2YobV9nbHlwaHMpKTsKICAgICAgICAgbWVtc2V0KG1fZ2x5
cGhGb250RGF0YSwgMCwgc2l6ZW9mKG1fZ2x5cGhGb250RGF0YSkpOwogICAgIH0KLSAgICAKKwor
ICAgIHZvaWQgY2xlYXJGb3JGb250RGF0YShjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEp
CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAg
ICAgICAgICAgaWYgKG1fZ2x5cGhGb250RGF0YVtpXSA9PSBmb250RGF0YSkgeworICAgICAgICAg
ICAgICAgIG1fZ2x5cGhzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBtX2dseXBoRm9udERhdGFb
aV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgR2x5cGhQYWdl
VHJlZU5vZGUqIG93bmVyKCkgY29uc3QgeyByZXR1cm4gbV9vd25lcjsgfQogCiAgICAgLy8gSW1w
bGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcAkocmV2aXNpb24gODgw
MTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9k
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3NCwxMyArMzc0LDEzIEBAIHZvaWQgR2x5cGhQYWdl
VHJlZU5vZGU6OnBydW5lRm9udERhdGEoY28KICAgICBpZiAoIWZvbnREYXRhKQogICAgICAgICBy
ZXR1cm47CiAKKyAgICAvLyBQcnVuZSBmYWxsIGJhY2sgY2hpbGQgKGlmIGFueSkgb2YgdGhpcyBm
b250LgorICAgIGlmIChtX3N5c3RlbUZhbGxiYWNrQ2hpbGQgJiYgbV9zeXN0ZW1GYWxsYmFja0No
aWxkLT5tX3BhZ2UpCisgICAgICAgIG1fc3lzdGVtRmFsbGJhY2tDaGlsZC0+bV9wYWdlLT5jbGVh
ckZvckZvbnREYXRhKGZvbnREYXRhKTsKKwogICAgIC8vIFBydW5lIGFueSBicmFuY2ggdGhhdCBj
b250YWlucyB0aGlzIEZvbnREYXRhLgogICAgIEhhc2hNYXA8Y29uc3QgRm9udERhdGEqLCBHbHlw
aFBhZ2VUcmVlTm9kZSo+OjppdGVyYXRvciBjaGlsZCA9IG1fY2hpbGRyZW4uZmluZChmb250RGF0
YSk7Ci0gICAgaWYgKGNoaWxkID09IG1fY2hpbGRyZW4uZW5kKCkpIHsKLSAgICAgICAgLy8gSWYg
dGhlcmUgaXMgbm8gbGV2ZWwtMSBub2RlIGZvciBmb250RGF0YSwgdGhlbiB0aGVyZSBpcyBubyBk
ZWVwZXIgbm9kZSBmb3IgaXQgaW4gdGhpcyB0cmVlLgotICAgICAgICBpZiAoIWxldmVsKQotICAg
ICAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7CisgICAgaWYgKGNoaWxkICE9IG1fY2hpbGRy
ZW4uZW5kKCkpIHsKICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGUqIG5vZGUgPSBjaGlsZC0+c2Vj
b25kOwogICAgICAgICBtX2NoaWxkcmVuLnJlbW92ZShmb250RGF0YSk7CiAgICAgICAgIHVuc2ln
bmVkIGN1c3RvbUZvbnRDb3VudCA9IG5vZGUtPm1fY3VzdG9tRm9udENvdW50OwpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNw
cAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9T
aW1wbGVGb250RGF0YS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw2ICsxMzIsOSBAQCB2b2lk
IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUdseXBoSW5pdCgpCiAKIFNpbXBsZUZvbnREYXRhOjp+
U2ltcGxlRm9udERhdGEoKQogeworICAgIGlmIChtX2Rlcml2ZWRGb250RGF0YSkKKyAgICAgICAg
bV9kZXJpdmVkRm9udERhdGEtPnBydW5lRnJvbUdseXBoUGFnZVRyZWUoKTsKKwogI2lmIEVOQUJM
RShTVkdfRk9OVFMpCiAgICAgaWYgKCFtX2ZvbnREYXRhKQogI2VuZGlmCkBAIC0yMDIsNiArMjA1
LDEwIEBAIFBhc3NPd25QdHI8U2ltcGxlRm9udERhdGE6OkRlcml2ZWRGb250RGEKIAogU2ltcGxl
Rm9udERhdGE6OkRlcml2ZWRGb250RGF0YTo6fkRlcml2ZWRGb250RGF0YSgpCiB7Cit9CisKK3Zv
aWQgU2ltcGxlRm9udERhdGE6OkRlcml2ZWRGb250RGF0YTo6cHJ1bmVGcm9tR2x5cGhQYWdlVHJl
ZSgpCit7CiAgICAgaWYgKCFmb3JDdXN0b21Gb250KQogICAgICAgICByZXR1cm47CiAKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEu
aAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9T
aW1wbGVGb250RGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNTUsNiArMjU1LDggQEAgcHJpdmF0
ZToKICAgICAgICAgT3duUHRyPFNpbXBsZUZvbnREYXRhPiB2ZXJ0aWNhbFJpZ2h0T3JpZW50YXRp
b247CiAgICAgICAgIE93blB0cjxTaW1wbGVGb250RGF0YT4gdXByaWdodE9yaWVudGF0aW9uOwog
CisgICAgICAgIHZvaWQgcHJ1bmVGcm9tR2x5cGhQYWdlVHJlZSgpOworCiAgICAgcHJpdmF0ZToK
ICAgICAgICAgRGVyaXZlZEZvbnREYXRhKGJvb2wgY3VzdG9tKQogICAgICAgICAgICAgOiBmb3JD
dXN0b21Gb250KGN1c3RvbSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJvbWl1bVdpbi5j
cHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vRm9udENhY2hlQ2hyb21pdW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MDYs
OCArNTA2LDExIEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAg
ICAvLyBsYXN0IGZvbnQgaW4gdGhlIGFycmF5IGNvdmVycyB0aGUgY2hhcmFjdGVyLCB8aXwgd2ls
bCBiZSBudW1Gb250cy4KICAgICAvLyBTbywgd2UgaGF2ZSB0byB1c2UgJzw9IiByYXRoZXIgdGhh
biAnPCcgdG8gc2VlIGlmIHdlIGZvdW5kIGEgZm9udAogICAgIC8vIGNvdmVyaW5nIHRoZSBjaGFy
YWN0ZXIuCi0gICAgaWYgKGkgPD0gbnVtRm9udHMpIAotICAgICAgIHJldHVybiBnZXRDYWNoZWRG
b250RGF0YShkYXRhKTsKKyAgICBpZiAoaSA8PSBudW1Gb250cykgeworICAgICAgICBjb25zdCBT
aW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0YShkYXRhKTsKKyAgICAg
ICAgZGVyZWZGb3JQdXJnZVByb3RlY3RlZEZvbnQoZm9udERhdGEpOworICAgICAgICByZXR1cm4g
Zm9udERhdGE7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250Q2Fj
aGVGcmVlVHlwZS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC04OSw3ICs4OSw5IEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZv
bnQKICAgICBSZWZQdHI8RmNQYXR0ZXJuPiBmYWxsYmFja1BhdHRlcm4gPSBhZG9wdFJlZihmaW5k
QmVzdEZvbnRHaXZlbkZhbGxiYWNrcyhmb250RGF0YSwgcGF0dGVybi5nZXQoKSkpOwogICAgIGlm
IChmYWxsYmFja1BhdHRlcm4pIHsKICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVG
b250RGF0YShmYWxsYmFja1BhdHRlcm4uZ2V0KCksIGZvbnQuZm9udERlc2NyaXB0aW9uKCkpOwot
ICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAg
ICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIHJlc3VsdCA9IGdldENhY2hlZEZvbnREYXRhKCZh
bHRlcm5hdGVGb250RGF0YSk7CisgICAgICAgIGRlcmVmRm9yUHVyZ2VQcm90ZWN0ZWRGb250KHJl
c3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgRmNSZXN1bHQgZm9u
dENvbmZpZ1Jlc3VsdDsKQEAgLTk3LDcgKzk5LDkgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZv
bnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmICghcmVzdWx0UGF0dGVybikKICAgICAgICAgcmV0dXJu
IDA7CiAgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0YShyZXN1bHRQYXR0ZXJu
LmdldCgpLCBmb250LmZvbnREZXNjcmlwdGlvbigpKTsKLSAgICByZXR1cm4gZ2V0Q2FjaGVkRm9u
dERhdGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVz
dWx0ID0gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICBkZXJlZkZv
clB1cmdlUHJvdGVjdGVkRm9udChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFNp
bXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0
IEZvbnQmIGZvbnQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9oYWlr
dS9Gb250Q2FjaGVIYWlrdS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvaGFpa3UvRm9udENhY2hlSGFpa3UuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0ZvbnRDYWNoZUhhaWt1LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDksNyArNDksOSBAQCB2b2lkIEZvbnRDYWNoZTo6cGxhdGZv
cm1Jbml0KCkKIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9y
Q2hhcmFjdGVycyhjb25zdCBGb250JiBmb250LCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50
IGxlbmd0aCkKIHsKICAgICBGb250UGxhdGZvcm1EYXRhIGRhdGEoZm9udC5mb250RGVzY3JpcHRp
b24oKSwgZm9udC5mYW1pbHkoKS5mYW1pbHkoKSk7Ci0gICAgcmV0dXJuIGdldENhY2hlZEZvbnRE
YXRhKCZkYXRhKTsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnZXRDYWNo
ZWRGb250RGF0YSgmZGF0YSk7CisgICAgZGVyZWZGb3JQdXJnZVByb3RlY3RlZEZvbnQoZm9udERh
dGEpOworICAgIHJldHVybiBmb250RGF0YTsKIH0KIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNoZU1h
Yy5tbQkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvRm9udENhY2hlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIsNyArMTUyLDEwIEBA
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICAgICAgIWZvbnQu
aXNQbGF0Zm9ybUZvbnQoKSAmJiBpc0FwcEtpdEZvbnRXZWlnaHRCb2xkKHdlaWdodCkgJiYgIWlz
QXBwS2l0Rm9udFdlaWdodEJvbGQoc3Vic3RpdHV0ZUZvbnRXZWlnaHQpLAogICAgICAgICAhZm9u
dC5pc1BsYXRmb3JtRm9udCgpICYmICh0cmFpdHMgJiBOU0ZvbnRJdGFsaWNUcmFpdCkgJiYgIShz
dWJzdGl0dXRlRm9udFRyYWl0cyAmIE5TRm9udEl0YWxpY1RyYWl0KSwKICAgICAgICAgcGxhdGZv
cm1EYXRhLm1fb3JpZW50YXRpb24pOwotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgmYWx0
ZXJuYXRlRm9udCk7CisKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0ID0gZ2V0Q2Fj
aGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnQpOworICAgIGRlcmVmRm9yUHVyZ2VQcm90ZWN0ZWRG
b250KHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogU2ltcGxlRm9udERhdGEqIEZv
bnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2Fj
aGVRdC5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvRm9udENhY2hlUXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MCw3ICs4MCw5IEBA
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICBpZiAoIWNvbXB1
dGVkRm9udC5pc1ZhbGlkKCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIEZvbnRQbGF0Zm9ybURh
dGEgYWx0ZXJuYXRlRm9udChjb21wdXRlZEZvbnQpOwotICAgIHJldHVybiBnZXRDYWNoZWRGb250
RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRh
ID0gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnQpOworICAgIGRlcmVmRm9yUHVyZ2VQ
cm90ZWN0ZWRGb250KGZvbnREYXRhKTsKKyAgICByZXR1cm4gZm9udERhdGE7CiAjZWxzZQogICAg
IFFfVU5VU0VEKGZvbnQpOwogICAgIFFfVU5VU0VEKGNoYXJhY3RlcnMpOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWNoZVdpbi5j
cHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ZvbnRDYWNoZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4NCw4ICsyODQsMTAgQEAg
Y29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmIChoZm9udCkg
ewogICAgICAgICBpZiAoIWZhbWlseU5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBGb250
UGxhdGZvcm1EYXRhKiByZXN1bHQgPSBnZXRDYWNoZWRGb250UGxhdGZvcm1EYXRhKGZvbnQuZm9u
dERlc2NyaXB0aW9uKCksIGZhbWlseU5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCkKKyAg
ICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBmb250RGF0YSA9IGdldENh
Y2hlZEZvbnREYXRhKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgZGVyZWZGb3JQdXJnZVByb3Rl
Y3RlZEZvbnQoZm9udERhdGEpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAg
U2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9Gb250Q2FjaGVXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCShyZXZp
c2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0Zv
bnRDYWNoZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzA4LDggKzMwOCwxMCBAQCBjb25z
dCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250CiAKICAgICAgICAgRm9udFBsYXRm
b3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzY3JpcHRp
b24sIGZhbWlseU5hbWUpOwogICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aGFzaCgpICE9
IG9yaWdGb250Lmhhc2goKSkgewotICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBmb250
RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCisgICAgICAgICAgICBpZiAoU2ltcGxl
Rm9udERhdGEqIGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEocmVzdWx0KSkgeworICAgICAg
ICAgICAgICAgIGRlcmVmRm9yUHVyZ2VQcm90ZWN0ZWRGb250KGZvbnREYXRhKTsKICAgICAgICAg
ICAgICAgICByZXR1cm4gZm9udERhdGE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0ZvbnRDYWNoZVd4
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9G
b250Q2FjaGVXeC5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd3gvRm9udENhY2hlV3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw4ICs0
Nyw5IEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICAgICAg
Zm9udERhdGEgPSBnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShmb250KTsKICAgICBpZiAoIWZv
bnREYXRhLT5jb250YWluc0NoYXJhY3RlcnMoY2hhcmFjdGVycywgbGVuZ3RoKSkKICAgICAgICAg
Zm9udERhdGEgPSBnZXRMYXN0UmVzb3J0RmFsbGJhY2tGb250KGZvbnQuZm9udERlc2NyaXB0aW9u
KCkpOwotICAgIAorIAogICAgIEFTU0VSVChmb250RGF0YSk7CisgICAgZGVyZWZGb3JQdXJnZVBy
b3RlY3RlZEZvbnQoZm9udERhdGEpOwogICAgIHJldHVybiBmb250RGF0YTsKIH0KIApJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwCShyZXZpc2lvbiA4ODAxMCkK
KysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJSZW5k
ZXJJbWFnZS5oIgogCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIK
ICNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgpAQCAtMTAyLDYgKzEwMyw4IEBAIGJvb2wgUmVuZGVySW1hZ2U6OnNldEltYWdlU2l6ZUZvckFs
dFRleHQKIAogICAgIC8vIHdlIGhhdmUgYW4gYWx0IGFuZCB0aGUgdXNlciBtZWFudCBpdCAoaXRz
IG5vdCBhIHRleHQgd2UgaW52ZW50ZWQpCiAgICAgaWYgKCFtX2FsdFRleHQuaXNFbXB0eSgpKSB7
CisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVy
OworICAgICAgICAKICAgICAgICAgY29uc3QgRm9udCYgZm9udCA9IHN0eWxlKCktPmZvbnQoKTsK
ICAgICAgICAgSW50U2l6ZSB0ZXh0U2l6ZShtaW4oZm9udC53aWR0aChSZW5kZXJCbG9jazo6Y29u
c3RydWN0VGV4dFJ1bih0aGlzLCBmb250LCBtX2FsdFRleHQsIHN0eWxlKCkpKSwgbWF4QWx0VGV4
dFdpZHRoKSwgbWluKGZvbnQuZm9udE1ldHJpY3MoKS5oZWlnaHQoKSwgbWF4QWx0VGV4dEhlaWdo
dCkpOwogICAgICAgICBpbWFnZVNpemUgPSBpbWFnZVNpemUuZXhwYW5kZWRUbyh0ZXh0U2l6ZSk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEJveC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3BwCShyZXZp
c2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkV2ZW50SGFuZGxl
ci5oIgogI2luY2x1ZGUgIkV2ZW50UXVldWUuaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIu
aCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUg
IkZyYW1lU2VsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCkBAIC05OCw2ICs5OSw4
IEBAIFJlbmRlckxpc3RCb3g6On5SZW5kZXJMaXN0Qm94KCkKIAogdm9pZCBSZW5kZXJMaXN0Qm94
Ojp1cGRhdGVGcm9tRWxlbWVudCgpCiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9u
dENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICBpZiAobV9vcHRpb25zQ2hhbmdlZCkgewogICAg
ICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSB0b1NlbGVjdEVsZW1lbnQo
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpLT5saXN0SXRlbXMoKTsKICAgICAgICAgaW50
IHNpemUgPSBudW1JdGVtcygpOwpAQCAtMzU4LDYgKzM2MSw4IEBAIHN0YXRpYyBJbnRTaXplIGl0
ZW1PZmZzZXRGb3JBbGlnbm1lbnQoVGUKIAogdm9pZCBSZW5kZXJMaXN0Qm94OjpwYWludEl0ZW1G
b3JlZ3JvdW5kKFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwgaW50IGxpc3RJ
bmRleCkKIHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZl
bnRlcjsKKyAgICAKICAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQo
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50
Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgRWxlbWVudCogZWxlbWVu
dCA9IGxpc3RJdGVtc1tsaXN0SW5kZXhdOwpJbmRleDogU291cmNlL1dlYktpdC9tYWMvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwkocmV2aXNpb24g
ODgwNTUpCisrKyBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSwyOCBAQAorMjAxMS0wNi0wMyAgTWljaGFlbCBTYWJvZmYgIDxtc2Fib2ZmQGFwcGxl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBG
b250cyByZXR1cm5lZCBieSBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycygpIGFy
ZSBuZXZlciByZWxlYXNlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NjE4NzUKKworICAgICAgICBUaGlzIGNoYW5nZSBhbGxvd3MgZm9udHMgYWxsb2Nh
dGVkIGFzIHN5c3RlbSBmYWxsYmFjayBmb250cyB0byBiZSByZWxlYXNlLgorICAgICAgICBQcmV2
aW91c2x5LCB0aGUgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlc2UgZm9udHMgZ3JldyB3aXRob3V0
IGJvdW5kLiAgVGhpcworICAgICAgICBpcyBpbXBsZW1lbnRlZCBwcmltYXJpbHkgYW4gYXV0byBy
ZWxlYXNlIGNsYXNzIHRoYXQgd3JhcHMgYWNjZXNzZXMgdG8gdGhlCisgICAgICAgIGNhY2hlIGZv
ciBzeXN0ZW0gZmFsbGJhY2sgZm9udHMuICBBbGwgc3VjaCBhY2Nlc3MgYXJlIHZpYSB0aGUgbWV0
aG9kCisgICAgICAgIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzLiBUaGUgbmV3
IGNsYXNzIGlzIGNhbGxlZAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlci4gV2hlbiBz
dWNoIGFuIG9iamVjdCBleGlzdHMsIGl0IHByb3RlY3RzIHRoZXNlIGZvbnQgZnJvbSAKKyAgICAg
ICAgYmVpbmcgcHVyZ2VkLiBBZGRlZCBsb2NhbCBzY29wZWQgaW5zdGFuY2Ugb2YgRm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXIgdG8gd3JhcCBjb2RlCisgICAgICAgIHRoYXQgYWNjZXNzZXMgZm9udHMg
dmlhIGdldEZvbnREYXRhRm9yQ2hhcmFjdGVycy4KKworICAgICAgICAqIE1pc2MvV2ViS2l0TlNT
dHJpbmdFeHRyYXMubW06CisgICAgICAgICgtW05TU3RyaW5nIF93ZWJfZHJhd0F0UG9pbnQ6Zm9u
dDp0ZXh0Q29sb3I6YWxsb3dpbmdGb250U21vb3RoaW5nOl0pOgorICAgICAgICAoLVtOU1N0cmlu
ZyBfd2ViX3dpZHRoV2l0aEZvbnQ6XSk6CisgICAgICAgICogTWlzYy9XZWJTdHJpbmdUcnVuY2F0
b3IubW06CisgICAgICAgICgrW1dlYlN0cmluZ1RydW5jYXRvciBjZW50ZXJUcnVuY2F0ZVN0cmlu
Zzp0b1dpZHRoOl0pOgorICAgICAgICAoK1tXZWJTdHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNh
dGVTdHJpbmc6dG9XaWR0aDp3aXRoRm9udDpdKToKKyAgICAgICAgKCtbV2ViU3RyaW5nVHJ1bmNh
dG9yIHJpZ2h0VHJ1bmNhdGVTdHJpbmc6dG9XaWR0aDp3aXRoRm9udDpdKToKKyAgICAgICAgKCtb
V2ViU3RyaW5nVHJ1bmNhdG9yIHdpZHRoT2ZTdHJpbmc6Zm9udDpdKToKKwogMjAxMS0wNi0wMiAg
QW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IFNhbSBXZWluaWcuCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9NaXNjL1dlYktpdE5TU3Ry
aW5nRXh0cmFzLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViS2l0
TlNTdHJpbmdFeHRyYXMubW0JKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYktpdC9tYWMv
TWlzYy9XZWJLaXROU1N0cmluZ0V4dHJhcy5tbQkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjks
NyBAQAogI2ltcG9ydCAiV2ViS2l0TlNTdHJpbmdFeHRyYXMuaCIKIAogI2ltcG9ydCA8V2ViQ29y
ZS9Gb250Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZvbnRDYWNoZS5oPgogI2ltcG9ydCA8V2ViQ29y
ZS9HcmFwaGljc0NvbnRleHQuaD4KICNpbXBvcnQgPFdlYkNvcmUvVGV4dFJ1bi5oPgogI2ltcG9y
dCA8V2ViQ29yZS9XZWJDb3JlTlNTdHJpbmdFeHRyYXMuaD4KQEAgLTg5LDYgKzkwLDggQEAgLSAo
dm9pZClfd2ViX2RyYXdBdFBvaW50OihOU1BvaW50KXBvaW50IAogICAgICAgICBpZiAoIWZsaXBw
ZWQpCiAgICAgICAgICAgICBDR0NvbnRleHRTY2FsZUNUTShjZ0NvbnRleHQsIDEsIC0xKTsKIAor
ICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsK
KwogICAgICAgICBGb250IHdlYkNvcmVGb250KEZvbnRQbGF0Zm9ybURhdGEoZm9udCwgW2ZvbnQg
cG9pbnRTaXplXSksICFbbnNDb250ZXh0IGlzRHJhd2luZ1RvU2NyZWVuXSwgZm9udFNtb290aGlu
Z0lzQWxsb3dlZCA/IEF1dG9TbW9vdGhpbmcgOiBBbnRpYWxpYXNlZCk7CiAgICAgICAgIFRleHRS
dW4gcnVuKGJ1ZmZlci5kYXRhKCksIGxlbmd0aCk7CiAKQEAgLTEzNCw2ICsxMzcsOCBAQCAtIChm
bG9hdClfd2ViX3dpZHRoV2l0aEZvbnQ6KE5TRm9udCAqKWZvCiAgICAgW3NlbGYgZ2V0Q2hhcmFj
dGVyczpidWZmZXIuZGF0YSgpXTsKIAogICAgIGlmIChjYW5Vc2VGYXN0UmVuZGVyZXIoYnVmZmVy
LmRhdGEoKSwgbGVuZ3RoKSkgeworICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250
Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgICAgICBGb250IHdlYkNvcmVGb250KEZvbnRQbGF0
Zm9ybURhdGEoZm9udCwgW2ZvbnQgcG9pbnRTaXplXSksICFbW05TR3JhcGhpY3NDb250ZXh0IGN1
cnJlbnRDb250ZXh0XSBpc0RyYXdpbmdUb1NjcmVlbl0pOwogICAgICAgICBUZXh0UnVuIHJ1bihi
dWZmZXIuZGF0YSgpLCBsZW5ndGgpOwogICAgICAgICByZXR1cm4gd2ViQ29yZUZvbnQud2lkdGgo
cnVuKTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViU3RyaW5nVHJ1bmNhdG9yLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViU3RyaW5nVHJ1bmNhdG9y
Lm1tCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViU3RyaW5n
VHJ1bmNhdG9yLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbXBvcnQg
IldlYlN5c3RlbUludGVyZmFjZS5oIgogI2ltcG9ydCA8V2ViQ29yZS9Gb250Lmg+CisjaW1wb3J0
IDxXZWJDb3JlL0ZvbnRDYWNoZS5oPgogI2ltcG9ydCA8V2ViQ29yZS9Gb250UGxhdGZvcm1EYXRh
Lmg+CiAjaW1wb3J0IDxXZWJDb3JlL1BsYXRmb3JtU3RyaW5nLmg+CiAjaW1wb3J0IDxXZWJDb3Jl
L1N0cmluZ1RydW5jYXRvci5oPgpAQCAtNzIsMjEgKzczLDI1IEBAICsgKHZvaWQpaW5pdGlhbGl6
ZQogCiArIChOU1N0cmluZyAqKWNlbnRlclRydW5jYXRlU3RyaW5nOihOU1N0cmluZyAqKXN0cmlu
ZyB0b1dpZHRoOihmbG9hdCltYXhXaWR0aAogeworICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOwogICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OmNl
bnRlclRydW5jYXRlKHN0cmluZywgbWF4V2lkdGgsIGZvbnRGcm9tTlNGb250KGRlZmF1bHRNZW51
Rm9udCgpKSk7CiB9CiAKICsgKE5TU3RyaW5nICopY2VudGVyVHJ1bmNhdGVTdHJpbmc6KE5TU3Ry
aW5nICopc3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1heFdpZHRoIHdpdGhGb250OihOU0ZvbnQgKilm
b250CiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50
ZXI7CiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNhdGUoc3RyaW5nLCBt
YXhXaWR0aCwgZm9udEZyb21OU0ZvbnQoZm9udCkpOwogfQogCiArIChOU1N0cmluZyAqKXJpZ2h0
VHJ1bmNhdGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1heFdpZHRo
IHdpdGhGb250OihOU0ZvbnQgKilmb250CiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIg
Zm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7CiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmln
aHRUcnVuY2F0ZShzdHJpbmcsIG1heFdpZHRoLCBmb250RnJvbU5TRm9udChmb250KSk7CiB9CiAK
ICsgKGZsb2F0KXdpZHRoT2ZTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIGZvbnQ6KE5TRm9udCAq
KWZvbnQKIHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZl
bnRlcjsKICAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjp3aWR0aChzdHJpbmcsIGZvbnRGcm9t
TlNGb250KGZvbnQpKTsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>96057</attachid>
            <date>2011-06-05 17:54:53 -0700</date>
            <delta_ts>2011-06-05 19:31:25 -0700</delta_ts>
            <desc>Updated patch to address comments 15 &amp; 16</desc>
            <filename>61875-6.patch</filename>
            <type>text/plain</type>
            <size>35465</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg4MTM2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIwIEBACisyMDExLTA2LTA1ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVkIGJ5IEZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVhc2VkCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3NQorCisgICAgICAgIFRoaXMgY2hh
bmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHRvIGJl
IAorICAgICAgICByZWxlYXNlZC4gIFByZXZpb3VzbHksIHRoZSByZWZlcmVuY2UgY291bnRzIGZv
ciB0aGVzZSBmb250cyBncmV3IAorICAgICAgICB3aXRob3V0IGJvdW5kLiAgVGhpcyBpcyBpbXBs
ZW1lbnRlZCBhcyBhbiBhdXRvIHJlbGVhc2UgY2xhc3MgdGhhdCB3cmFwcworICAgICAgICBhY2Nl
c3NlcyB0byB0aGUgY2FjaGUgZm9yIHN5c3RlbSBmYWxsYmFjayBmb250cy4gQWxsIHN1Y2ggYWNj
ZXNzZXMgYXJlCisgICAgICAgIHZpYSB0aGUgbWV0aG9kIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFG
b3JDaGFyYWN0ZXJzLiBUaGUgbmV3IGNsYXNzIGlzCisgICAgICAgIGNhbGxlZCBGb250Q2FjaGVQ
dXJnZVByZXZlbnRlci4gV2hlbiBzdWNoIGFuIG9iamVjdCBleGlzdHMsIGl0IHByb3RlY3RzCisg
ICAgICAgIHRoZXNlIGZvbnRzIGZyb20gZGVsZXRpb24uCisKKyAgICAgICAgQWRkZWQgbG9jYWwg
c2NvcGVkIGluc3RhbmNlIG9mIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIHRvIHdyYXAgY29kZQor
ICAgICAgICB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYWNjZXNzZXMgZm9udHMgdmlhIGdl
dEZvbnREYXRhRm9yQ2hhcmFjdGVycy4KKyAgICAgICAgRGlkIGEgZmV3IG90aGVyIG1pc2NlbGxh
bmVvdXMgYnVnIGZpeGVzIGFuZCBjaGFuZ2VzIHRvIGFsbG93IHN5c3RlbQorICAgICAgICBmYWxs
YmFjayBmb250cyB0byBiZSBwcnVuZWQgZnJvbSB0aGUgR2x5cGhQYWdlVHJlZS4gQWRkZWQgdGhl
CisgICAgICAgIHN1cHBvcnRpbmcgY29kZSBpbiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgdmVyc2lv
bnMgb2YKKyAgICAgICAgRm9udGNhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMuICBNb3Zl
ZCB0aGUgcHVyZ2UgZm9udCBjaGVjaworICAgICAgICBvdXRzaWRlIG9mIEZvbnRDYWNoZTo6Z2V0
Q2FjaGVkRm9udERhdGEoKSBpbnRvIGEgc2VwYXJhdGUgbWV0aG9kLCAKKyAgICAgICAgcHVyZ2VJ
bmFjdGl2ZUZvbnREYXRhSWZOZWVkZWQoKSBzaW5jZSBhbG1vc3QgYWxsIGNhbGxzIHRvIAorICAg
ICAgICBnZXRDYWNoZWRGb250RGF0YSgpIG5vdyBoYXBwZW4gd2hlbiBwdXJnaW5nIGlzIG5vdCBh
bGxvd2VkLgorICAgICAgICBwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZCBpcyBpbnZva2Vk
IGluIGVuYWJsZVB1cmdpbmcoKSB3aGVuCisgICAgICAgIG1fcHVyZ2VQcmV2ZW50Q291bnQgaXMg
MC4KKworICAgICAgICBObyBuZXcgdGVzdCBhcyB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgbm90IGNo
YW5nZWQuIEltcHJvdmVkIGZvbnQgbGlmZQorICAgICAgICBjeWNsZSBtYW5hZ2VtZW50LgorCisg
ICAgICAgICogV2ViQ29yZS5leHAuaW46IEFkZGVkIEZvbnRDYWNoZTo6cHVyZ2VJbmFjdGl2ZUZv
bnREYXRhSWZOZWVkZWQoKS4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
OjptZWFzdXJlVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQ6OmRyYXdUZXh0SW50ZXJuYWwpOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZh
bGxiYWNrIGZvbnRzIHdpdGggbG9jYWwgCisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGluIHRoZXNlIG1ldGhvZHMuCisKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OmxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpGcmFt
ZVZpZXc6OnBhaW50Q29udGVudHMpOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZh
bGxiYWNrIGZvbnRzIHdpdGggbG9jYWwgCisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGluIHRoZXNlIG1ldGhvZHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2Fj
aGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpGb250Q2FjaGUpOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRDYWNoZWRGb250RGF0YSk6CisgICAgICAgIE1vdmVk
IHB1cmdlIGNoZWNrIHRvIG5ldyBtZXRob2Qgc2luY2UgaXQgbGlrZWx5IGNhbid0IGhhcHBlbiBo
ZXJlCisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnB1cmdlSW5hY3RpdmVGb250RGF0YUlmTmVlZGVkKToK
KyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cHVyZ2VJbmFjdGl2ZUZvbnREYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cmVsZWFzZVB1cmdlUHJvdGVjdGVkRm9udCk6Cisg
ICAgICAgIE1hZGUgcHVyZ2luZyBjb25kaXRpb25hbCBvbiBtX3B1cmdlUHJldmVudENvdW50LiAg
Tm93IHNvbWUgZm9udHMKKyAgICAgICAgaW4gdGhlIGNhY2hlIGFyZSByZWZlcmVuY2UgY291bnRl
ZCB3aGlsZSBvdGhlciBjYW4gYmUgcHVyZ2VkIAorICAgICAgICBvdXRzaWRlIG9mIGNvZGUgd3Jh
cHBlZCBieSBpbiBzY29wZSBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBvYmplY3RzLgorCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmg6CisgICAgICAgIChXZWJDb3JlOjpG
b250Q2FjaGU6OmRpc2FibGVQdXJnaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6
ZW5hYmxlUHVyZ2luZyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVQdXJnZVByZXZlbnRl
cjo6Rm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI6On5Gb250Q2FjaGVQdXJnZVByZXZlbnRlcik6CisgICAgICAgIEFkZGVk
IG5ldyBzaW1wbGUgcHVyZ2UgcHJldmVudGlvbiB3cmFwcGVyIGNsYXNzIGFuZCBtZXRob2RzCisg
ICAgICAgIHRoYXQgaXQgY2FsbHMgaW4gRm9udENhY2hlIGFjdHVhbGx5IHByZXZlbnQgcHVyZ2lu
Zy4gIFRoZQorICAgICAgICBzaW1wbGUgbWV0aG9kcyBpbmxpbmVkIHRvIHJlZHVjZSBvdmVyaGVh
ZC4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIpOiBVcGRhdGUgbGV2ZWwg
aW4gCisgICAgICAgIGdseXBoIHBhZ2UgdHJlZSBmb3Igc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHNv
IHBydW5pbmcgd29ya3MuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2Uu
aDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZTo6Y2xlYXJGb3JGb250RGF0YSk6IE5ldyBt
ZXRob2QgdXNlZCBmb3IgcHJ1bmluZworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBo
UGFnZVRyZWVOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZVRyZWVOb2RlOjpw
cnVuZUZvbnREYXRhKToKKyAgICAgICAgTm93IHdlIHBydW5lIHN5c3RlbSBmYWxsYmFjayBmb250
cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9t
aXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JD
aGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250Q2Fj
aGVGcmVlVHlwZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRh
Rm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvaGFpa3UvRm9udENh
Y2hlSGFpa3UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZv
ckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVN
YWMubW06CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFj
dGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVXaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgIEFkZGVkIGEg
cmVsZWFzZVB1cmdlUHJvdGVjdGVkRm9udCBjYWxsIHRvIHRoZXNlIG1ldGhvZHMuICBUaGUKKyAg
ICAgICAgY2FsbGVyIChjdXJyZW50bHkgb25seSBGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIo
KSBpbiAKKyAgICAgICAgZm9udEZhc3RQYXRoLmNwcCkgYW5kIGl0J3MgY2FsbGVycyBkb24ndCBh
dHRlbXB0IHRvIHJlbGVhc2UgCisgICAgICAgIHRoZSByZXR1cm5lZCBmb250cyBzbyB3ZSB1c2Ug
dGhlIHB1cmdlIHByb3RlY3Rpb24gZGVzY3JpYmVkIGFib3ZlLgorCisgICAgICAgICogcmVuZGVy
aW5nL0lubGluZVRleHRCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6
c2VsZWN0aW9uUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpvZmZzZXRG
b3JQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkZv
ck9mZnNldCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJhY2sgZm9udHMg
d2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0aGVzZSBtZXRo
b2RzLgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0KToKKyAgICAgICAgV3Jh
cHBlZCBjb2RlIGFjY2Vzc2luZyBmYWxsYmFjayBmb250cyB3aXRoIGxvY2FsCisgICAgICAgIEZv
bnRDYWNoZVB1cmdlUHJldmVudGVyIGluIHRoaXMgbWV0aG9kLgorCisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckxpc3RCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6
dXBkYXRlRnJvbUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6cGFp
bnRJdGVtRm9yZWdyb3VuZCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJh
Y2sgZm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0
aGVzZSBtZXRob2RzCisKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdEZv
clRleHRGcmFnbWVudCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJhY2sg
Zm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0aGlz
IG1ldGhvZC4KKwogMjAxMS0wNi0wNSAgSWdvciBPbGl2ZWlyYSAgPGlnb3Iub2xpdmVpcmFAb3Bl
bmJvc3NhLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5uZXRoIFJvaGRlIENocmlzdGlh
bnNlbi4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC05MjIsNiArOTIyLDcg
QEAgX19aTjdXZWJDb3JlOUZsb2F0U2l6ZUMxRVJLTlNfN0ludFNpemVFCiBfX1pON1dlYkNvcmU5
Rm9udENhY2hlMTNmb250RGF0YUNvdW50RXYKIF9fWk43V2ViQ29yZTlGb250Q2FjaGUyMWluYWN0
aXZlRm9udERhdGFDb3VudEV2CiBfX1pON1dlYkNvcmU5Rm9udENhY2hlMjFwdXJnZUluYWN0aXZl
Rm9udERhdGFFaQorX19aTjdXZWJDb3JlOUZvbnRDYWNoZTI5cHVyZ2VJbmFjdGl2ZUZvbnREYXRh
SWZOZWVkZWRFdgogX19aTjdXZWJDb3JlOUZyYW1lVHJlZTExYXBwZW5kQ2hpbGRFTjNXVEYxMFBh
c3NSZWZQdHJJTlNfNUZyYW1lRUVFCiBfX1pON1dlYkNvcmU5RnJhbWVUcmVlN3NldE5hbWVFUktO
M1dURjEyQXRvbWljU3RyaW5nRQogX19aTjdXZWJDb3JlOUZyYW1lVHJlZTljbGVhck5hbWVFdgpJ
bmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0
bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJDYW52YXNTdHlsZS5oIgogI2luY2x1ZGUgIkV4Y2Vw
dGlvbkNvZGUuaCIKICNpbmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGb250
Q2FjaGUuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIVE1MQ2Fu
dmFzRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxJbWFnZUVsZW1lbnQuaCIKQEAgLTE4NzQsNiAr
MTg3NSw4IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpzdHJva2VUZXgKIAogUGFz
c1JlZlB0cjxUZXh0TWV0cmljcz4gQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjptZWFzdXJlVGV4
dChjb25zdCBTdHJpbmcmIHRleHQpCiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9u
dENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICBSZWZQdHI8VGV4dE1ldHJpY3M+IG1ldHJpY3Mg
PSBUZXh0TWV0cmljczo6Y3JlYXRlKCk7CiAKICNpZiBQTEFURk9STShRVCkKQEAgLTE5MDEsNiAr
MTkwNCw4IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpkcmF3VGV4dEkKICAgICBp
ZiAoIWlzZmluaXRlKHgpIHwgIWlzZmluaXRlKHkpKQogICAgICAgICByZXR1cm47CiAKKyAgICBG
b250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIGNv
bnN0IEZvbnQmIGZvbnQgPSBhY2Nlc3NGb250KCk7CiAgICAgY29uc3QgRm9udE1ldHJpY3MmIGZv
bnRNZXRyaWNzID0gZm9udC5mb250TWV0cmljcygpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
YWdlL0ZyYW1lVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9GcmFt
ZVZpZXcuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVW
aWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkV2ZW50
SGFuZGxlci5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkZvY3VzQ29udHJv
bGxlci5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5j
bHVkZSAiRnJhbWVBY3Rpb25TY2hlZHVsZXIuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgpA
QCAtODk2LDYgKzg5Nyw4IEBAIHZvaWQgRnJhbWVWaWV3OjpsYXlvdXQoYm9vbCBhbGxvd1N1YnRy
ZWUKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgbV9uZXN0ZWRMYXlvdXRDb3VudCsrOwog
CiAgICAgaWYgKCFtX2xheW91dFJvb3QpIHsKQEAgLTI0MjMsNiArMjQyNiw4IEBAIHZvaWQgRnJh
bWVWaWV3OjpwYWludENvbnRlbnRzKEdyYXBoaWNzQ28KICAgICBpZiAobmVlZHNMYXlvdXQoKSkK
ICAgICAgICAgcmV0dXJuOwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI7CisKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAg
aWYgKCFwLT5wYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHN5bmNDb21wb3NpdGluZ1N0YXRl
Rm9yVGhpc0ZyYW1lKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250Q2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRDYWNoZS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQs
NyBAQAogI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNsdWRlICJGb250UGxhdGZv
cm1EYXRhLmgiCiAjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiR2x5cGhQYWdl
VHJlZU5vZGUuaCIKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9MaXN0
SGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTUwLDYgKzUxLDcg
QEAgRm9udENhY2hlKiBmb250Q2FjaGUoKQogfQogCiBGb250Q2FjaGU6OkZvbnRDYWNoZSgpCisg
ICAgOiBtX3B1cmdlUHJldmVudENvdW50KDApCiB7CiB9CiAKQEAgLTI0OSw4ICsyNTEsOCBAQCB0
eXBlZGVmIEhhc2hNYXA8Rm9udFBsYXRmb3JtRGF0YSwgcGFpcjxTCiAKIHN0YXRpYyBGb250RGF0
YUNhY2hlKiBnRm9udERhdGFDYWNoZSA9IDA7CiAKLWNvbnN0IGludCBjTWF4SW5hY3RpdmVGb250
RGF0YSA9IDEyMDsgIC8vIFByZXR0eSBMb3cgVGhyZXNob2xkCi1jb25zdCBpbnQgY1RhcmdldElu
YWN0aXZlRm9udERhdGEgPSAxMDA7Citjb25zdCBpbnQgY01heEluYWN0aXZlRm9udERhdGEgPSA1
MDsgLy8gUHJldHR5IExvdyBUaHJlc2hvbGQKK2NvbnN0IGludCBjVGFyZ2V0SW5hY3RpdmVGb250
RGF0YSA9IDMwOwogc3RhdGljIExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGdJ
bmFjdGl2ZUZvbnREYXRhID0gMDsKIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Q2Fj
aGVkRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNvbnN0
IEF0b21pY1N0cmluZyYgZmFtaWx5LCBib29sIGNoZWNraW5nQWx0ZXJuYXRlTmFtZSkKQEAgLTI3
MSw3ICsyNzMsNyBAQCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRDYWNoZWRGb250CiAg
ICAgICAgIGdGb250RGF0YUNhY2hlID0gbmV3IEZvbnREYXRhQ2FjaGU7CiAgICAgICAgIGdJbmFj
dGl2ZUZvbnREYXRhID0gbmV3IExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj47CiAg
ICAgfQotICAgIAorCiAgICAgRm9udERhdGFDYWNoZTo6aXRlcmF0b3IgcmVzdWx0ID0gZ0ZvbnRE
YXRhQ2FjaGUtPmZpbmQoKnBsYXRmb3JtRGF0YSk7CiAgICAgaWYgKHJlc3VsdCA9PSBnRm9udERh
dGFDYWNoZS0+ZW5kKCkpIHsKICAgICAgICAgcGFpcjxTaW1wbGVGb250RGF0YSosIHVuc2lnbmVk
PiBuZXdWYWx1ZShuZXcgU2ltcGxlRm9udERhdGEoKnBsYXRmb3JtRGF0YSksIDEpOwpAQCAtMjk0
LDE2ICsyOTYsMjAgQEAgdm9pZCBGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YShjb25zdCBTaQog
ICAgIEZvbnREYXRhQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gZ0ZvbnREYXRhQ2FjaGUtPmZpbmQoZm9u
dERhdGEtPnBsYXRmb3JtRGF0YSgpKTsKICAgICBBU1NFUlQoaXQgIT0gZ0ZvbnREYXRhQ2FjaGUt
PmVuZCgpKTsKIAotICAgIGlmICghLS1pdC0+c2Vjb25kLnNlY29uZCkgeworICAgIEFTU0VSVChp
dC0+c2Vjb25kLnNlY29uZCk7CisgICAgaWYgKCEtLWl0LT5zZWNvbmQuc2Vjb25kKQogICAgICAg
ICBnSW5hY3RpdmVGb250RGF0YS0+YWRkKGZvbnREYXRhKTsKLSAgICAgICAgaWYgKGdJbmFjdGl2
ZUZvbnREYXRhLT5zaXplKCkgPiBjTWF4SW5hY3RpdmVGb250RGF0YSkKLSAgICAgICAgICAgIHB1
cmdlSW5hY3RpdmVGb250RGF0YShnSW5hY3RpdmVGb250RGF0YS0+c2l6ZSgpIC0gY1RhcmdldElu
YWN0aXZlRm9udERhdGEpOwotICAgIH0KK30KKwordm9pZCBGb250Q2FjaGU6OnB1cmdlSW5hY3Rp
dmVGb250RGF0YUlmTmVlZGVkKCkKK3sKKyAgICBpZiAoZ0luYWN0aXZlRm9udERhdGEgJiYgIW1f
cHVyZ2VQcmV2ZW50Q291bnQpIC8vICYmIGdJbmFjdGl2ZUZvbnREYXRhLT5zaXplKCkgPiBjTWF4
SW5hY3RpdmVGb250RGF0YSkKKyAgICAgICAgcHVyZ2VJbmFjdGl2ZUZvbnREYXRhKDIwMCk7IC8v
Z0luYWN0aXZlRm9udERhdGEtPnNpemUoKSAtIGNUYXJnZXRJbmFjdGl2ZUZvbnREYXRhKTsKIH0K
IAogdm9pZCBGb250Q2FjaGU6OnB1cmdlSW5hY3RpdmVGb250RGF0YShpbnQgY291bnQpCiB7Ci0g
ICAgaWYgKCFnSW5hY3RpdmVGb250RGF0YSkKKyAgICBpZiAoIWdJbmFjdGl2ZUZvbnREYXRhIHx8
IG1fcHVyZ2VQcmV2ZW50Q291bnQpCiAgICAgICAgIHJldHVybjsKIAogICAgIHN0YXRpYyBib29s
IGlzUHVyZ2luZzsgIC8vIEd1YXJkIGFnYWluc3QgcmVlbnRyeSB3aGVuIGUuZy4gYSBkZWxldGVk
IEZvbnREYXRhIHJlbGVhc2VzIGl0cyBzbWFsbCBjYXBzIEZvbnREYXRhLgpAQCAtMzY0LDYgKzM3
MCwxMiBAQCBzaXplX3QgRm9udENhY2hlOjppbmFjdGl2ZUZvbnREYXRhQ291bnQoCiAgICAgcmV0
dXJuIDA7CiB9CiAKK3ZvaWQgRm9udENhY2hlOjpyZWxlYXNlUHVyZ2VQcm90ZWN0ZWRGb250KGNv
bnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSkKK3sKKyAgICBBU1NFUlQobV9wdXJnZVByZXZl
bnRDb3VudCk7CisgICAgcmVsZWFzZUZvbnREYXRhKGZvbnREYXRhKTsKK30KKwogY29uc3QgRm9u
dERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGEoY29uc3QgRm9udCYgZm9udCwgaW50JiBmYW1p
bHlJbmRleCwgRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCiB7CiAgICAgU2ltcGxlRm9udERh
dGEqIHJlc3VsdCA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250Q2FjaGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Gb250Q2FjaGUuaAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9Gb250Q2FjaGUuaAkod29ya2luZyBjb3B5KQpAQCAtNTEsMTcgKzUxLDE4IEBA
IGNsYXNzIEZvbnRTZWxlY3RvcjsKIGNsYXNzIFNpbXBsZUZvbnREYXRhOwogCiBjbGFzcyBGb250
Q2FjaGUgeworICAgIGZyaWVuZCBjbGFzcyBGb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAg
IFdURl9NQUtFX05PTkNPUFlBQkxFKEZvbnRDYWNoZSk7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OwogcHVibGljOgogICAgIGZyaWVuZCBGb250Q2FjaGUqIGZvbnRDYWNoZSgpOwogCiAgICAgY29u
c3QgRm9udERhdGEqIGdldEZvbnREYXRhKGNvbnN0IEZvbnQmLCBpbnQmIGZhbWlseUluZGV4LCBG
b250U2VsZWN0b3IqKTsKICAgICB2b2lkIHJlbGVhc2VGb250RGF0YShjb25zdCBTaW1wbGVGb250
RGF0YSopOwotICAgIAorCiAgICAgLy8gVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgYnkgdGhl
IHBsYXRmb3JtLgotICAgIC8vIEZJWE1FOiBGb250IGRhdGEgcmV0dXJuZWQgYnkgdGhpcyBtZXRo
b2QgbmV2ZXIgZ28gaW5hY3RpdmUgYmVjYXVzZSBjYWxsZXJzIGRvbid0IHRyYWNrIGFuZCByZWxl
YXNlIHRoZW0uCiAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGdldEZvbnREYXRhRm9yQ2hhcmFj
dGVycyhjb25zdCBGb250JiwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpOwot
ICAgIAorCiAgICAgLy8gQWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCiAgICAgdm9p
ZCBwbGF0Zm9ybUluaXQoKTsKIApAQCAtOTcsNiArOTgsMjEgQEAgcHJpdmF0ZToKICAgICBGb250
Q2FjaGUoKTsKICAgICB+Rm9udENhY2hlKCk7CiAKKyAgICB2b2lkIGRpc2FibGVQdXJnaW5nKCkg
eyBtX3B1cmdlUHJldmVudENvdW50Kys7IH0KKyAgICB2b2lkIGVuYWJsZVB1cmdpbmcoKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKG1fcHVyZ2VQcmV2ZW50Q291bnQpOworICAgICAgICBpZiAoIS0t
bV9wdXJnZVByZXZlbnRDb3VudCkKKyAgICAgICAgICAgIHB1cmdlSW5hY3RpdmVGb250RGF0YUlm
TmVlZGVkKCk7CisgICAgfQorCisgICAgdm9pZCBwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRl
ZCgpOworCisgICAgLy8gRGVyZWYgZm9udHMgcmV0dXJuZWQgdmlhIGdldEZvbnREYXRhRm9yQ2hh
cmFjdGVycygpIHNpbmNlIHdlIHVzZSBtX3B1cmdlUHJldmVudENvdW50IHRvIGd1YXJkIGFnYWlu
c3QKKyAgICAvLyB1bnNhZmUgcHVyZ2luZy4gQWxsIGFjY2Vzc2VzIHRvIGZvbnRzIHZpYSB0aGF0
IG1ldGhvZCBzaG91bGQgYmUgd3JhcHBlZCB3aXRoIGEgbG9jYWwgRm9udENhY2hlUHVyZ2VQcmV2
ZW50ZXIKKyAgICAvLyB2YXJpYWJsZSBpbiBzY29wZS4KKyAgICB2b2lkIHJlbGVhc2VQdXJnZVBy
b3RlY3RlZEZvbnQoY29uc3QgU2ltcGxlRm9udERhdGEqKTsKKwogICAgIC8vIEZJWE1FOiBUaGlz
IG1ldGhvZCBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIEZvbnRQbGF0Zm9ybURh
dGEqIGdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiwgY29u
c3QgQXRvbWljU3RyaW5nJiBmYW1pbHksIGJvb2wgY2hlY2tpbmdBbHRlcm5hdGVOYW1lID0gZmFs
c2UpOwogCkBAIC0xMDYsNiArMTIyLDkgQEAgcHJpdmF0ZToKIAogICAgIFNpbXBsZUZvbnREYXRh
KiBnZXRDYWNoZWRGb250RGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhKik7CiAKKyAgICAvLyBE
b24ndCBwdXJnZSBpZiB0aGlzIGNvdW50IGlzID4gMDsKKyAgICBpbnQgbV9wdXJnZVByZXZlbnRD
b3VudDsKKwogICAgIGZyaWVuZCBjbGFzcyBTaW1wbGVGb250RGF0YTsgLy8gRm9yIGdldENhY2hl
ZEZvbnREYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqKQogICAgIGZyaWVuZCBjbGFzcyBGb250
RmFsbGJhY2tMaXN0OwogfTsKQEAgLTExMyw2ICsxMzIsMTIgQEAgcHJpdmF0ZToKIC8vIEdldCB0
aGUgZ2xvYmFsIGZvbnRDYWNoZS4KIEZvbnRDYWNoZSogZm9udENhY2hlKCk7CiAKK2NsYXNzIEZv
bnRDYWNoZVB1cmdlUHJldmVudGVyIHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgRm9udENhY2hlUHVy
Z2VQcmV2ZW50ZXIoKSB7IGZvbnRDYWNoZSgpLT5kaXNhYmxlUHVyZ2luZygpOyB9CisgICAgaW5s
aW5lIH5Gb250Q2FjaGVQdXJnZVByZXZlbnRlcigpIHsgZm9udENhY2hlKCktPmVuYWJsZVB1cmdp
bmcoKTsgfQorfTsKKwogfQogCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNyw2ICszNyw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBu
YW1lc3BhY2UgVW5pY29kZTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIApAQCAtMjEwLDkgKzIxMSwxMSBAQCBHbHlwaERhdGEgRm9udDo6Z2x5cGhEYXRhRm9y
Q2hhcmFjdGVyKFVDCiAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBjaGFyYWN0ZXIsIHByb2Jh
Ymx5IGJlY2F1c2UgdGhlIGZvbnQgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkIGNvcnJlY3RseS4K
ICAgICAgICAgICAgIC8vIFNvIHdlIGp1c3QgYWx3YXlzIHNldCB0aGUgZ2x5cGggdG8gYmUgc2Ft
ZSBhcyB0aGUgY2hhcmFjdGVyLCBhbmQgbGV0IEdESSBzb2x2ZSBpdC4KICAgICAgICAgICAgIHBh
Z2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3RlcihjLCBjLCBjaGFyYWN0ZXJGb250RGF0YSk7Cisg
ICAgICAgICAgICBjaGFyYWN0ZXJGb250RGF0YS0+c2V0TWF4R2x5cGhQYWdlVHJlZUxldmVsKG1h
eChjaGFyYWN0ZXJGb250RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVs
KCkpKTsKICAgICAgICAgICAgIHJldHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7
CiAjZWxzZQogICAgICAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIGRh
dGEuZ2x5cGgsIGRhdGEuZm9udERhdGEpOworICAgICAgICAgICAgZGF0YS5mb250RGF0YS0+c2V0
TWF4R2x5cGhQYWdlVHJlZUxldmVsKG1heChkYXRhLmZvbnREYXRhLT5tYXhHbHlwaFBhZ2VUcmVl
TGV2ZWwoKSwgbm9kZS0+bGV2ZWwoKSkpOwogI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgcmV0
dXJuIGRhdGE7CkBAIC0yMjUsOSArMjI4LDExIEBAIEdseXBoRGF0YSBGb250OjpnbHlwaERhdGFG
b3JDaGFyYWN0ZXIoVUMKICNpZiBPUyhXSU5DRSkKICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJv
dXQgV0lOQ0UgR0RJIGhhbmRsaW5nIG5lYXIgc2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyIGFib3Zl
LgogICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgZGF0YS5mb250
RGF0YSk7CisgICAgICAgIGRhdGEuZm9udERhdGEtPnNldE1heEdseXBoUGFnZVRyZWVMZXZlbCht
YXgoZGF0YS5mb250RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVsKCkp
KTsKICAgICAgICAgcmV0dXJuIHBhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjKTsKICNlbHNl
CiAgICAgICAgIHBhZ2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3RlcihjLCBkYXRhLmdseXBoLCBk
YXRhLmZvbnREYXRhKTsKKyAgICAgICAgZGF0YS5mb250RGF0YS0+c2V0TWF4R2x5cGhQYWdlVHJl
ZUxldmVsKG1heChkYXRhLmZvbnREYXRhLT5tYXhHbHlwaFBhZ2VUcmVlTGV2ZWwoKSwgbm9kZS0+
bGV2ZWwoKSkpOwogI2VuZGlmCiAgICAgfQogICAgIHJldHVybiBkYXRhOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlLmgJKHJldmlzaW9uIDg4MDEw
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEyMSw3ICsxMjEsMTcgQEAgcHVibGljOgogICAgICAgICBtZW1zZXQobV9n
bHlwaHMsIDAsIHNpemVvZihtX2dseXBocykpOwogICAgICAgICBtZW1zZXQobV9nbHlwaEZvbnRE
YXRhLCAwLCBzaXplb2YobV9nbHlwaEZvbnREYXRhKSk7CiAgICAgfQotICAgIAorCisgICAgdm9p
ZCBjbGVhckZvckZvbnREYXRhKGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSkKKyAgICB7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAg
ICBpZiAobV9nbHlwaEZvbnREYXRhW2ldID09IGZvbnREYXRhKSB7CisgICAgICAgICAgICAgICAg
bV9nbHlwaHNbaV0gPSAwOworICAgICAgICAgICAgICAgIG1fZ2x5cGhGb250RGF0YVtpXSA9IDA7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBHbHlwaFBhZ2VUcmVlTm9k
ZSogb3duZXIoKSBjb25zdCB7IHJldHVybiBtX293bmVyOyB9CiAKICAgICAvLyBJbXBsZW1lbnRl
ZCBieSB0aGUgcGxhdGZvcm0uCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HbHlwaFBhZ2VUcmVlTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzc0LDEzICszNzQsMTMgQEAgdm9pZCBHbHlwaFBhZ2VUcmVlTm9k
ZTo6cHJ1bmVGb250RGF0YShjbwogICAgIGlmICghZm9udERhdGEpCiAgICAgICAgIHJldHVybjsK
IAorICAgIC8vIFBydW5lIGZhbGwgYmFjayBjaGlsZCAoaWYgYW55KSBvZiB0aGlzIGZvbnQuCisg
ICAgaWYgKG1fc3lzdGVtRmFsbGJhY2tDaGlsZCAmJiBtX3N5c3RlbUZhbGxiYWNrQ2hpbGQtPm1f
cGFnZSkKKyAgICAgICAgbV9zeXN0ZW1GYWxsYmFja0NoaWxkLT5tX3BhZ2UtPmNsZWFyRm9yRm9u
dERhdGEoZm9udERhdGEpOworCiAgICAgLy8gUHJ1bmUgYW55IGJyYW5jaCB0aGF0IGNvbnRhaW5z
IHRoaXMgRm9udERhdGEuCiAgICAgSGFzaE1hcDxjb25zdCBGb250RGF0YSosIEdseXBoUGFnZVRy
ZWVOb2RlKj46Oml0ZXJhdG9yIGNoaWxkID0gbV9jaGlsZHJlbi5maW5kKGZvbnREYXRhKTsKLSAg
ICBpZiAoY2hpbGQgPT0gbV9jaGlsZHJlbi5lbmQoKSkgewotICAgICAgICAvLyBJZiB0aGVyZSBp
cyBubyBsZXZlbC0xIG5vZGUgZm9yIGZvbnREYXRhLCB0aGVuIHRoZXJlIGlzIG5vIGRlZXBlciBu
b2RlIGZvciBpdCBpbiB0aGlzIHRyZWUuCi0gICAgICAgIGlmICghbGV2ZWwpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoY2hpbGQgIT0gbV9jaGlsZHJlbi5lbmQo
KSkgewogICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZSogbm9kZSA9IGNoaWxkLT5zZWNvbmQ7CiAg
ICAgICAgIG1fY2hpbGRyZW4ucmVtb3ZlKGZvbnREYXRhKTsKICAgICAgICAgdW5zaWduZWQgY3Vz
dG9tRm9udENvdW50ID0gbm9kZS0+bV9jdXN0b21Gb250Q291bnQ7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJvbWl1bVdpbi5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Rm9udENhY2hlQ2hyb21pdW1XaW4uY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTA2LDggKzUwNiwxMSBAQCBjb25zdCBTaW1wbGVGb250RGF0YSog
Rm9udENhY2hlOjpnZXRGb250CiAgICAgLy8gbGFzdCBmb250IGluIHRoZSBhcnJheSBjb3ZlcnMg
dGhlIGNoYXJhY3RlciwgfGl8IHdpbGwgYmUgbnVtRm9udHMuCiAgICAgLy8gU28sIHdlIGhhdmUg
dG8gdXNlICc8PSIgcmF0aGVyIHRoYW4gJzwnIHRvIHNlZSBpZiB3ZSBmb3VuZCBhIGZvbnQKICAg
ICAvLyBjb3ZlcmluZyB0aGUgY2hhcmFjdGVyLgotICAgIGlmIChpIDw9IG51bUZvbnRzKSAKLSAg
ICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZGF0YSk7CisgICAgaWYgKGkgPD0gbnVtRm9u
dHMpIHsKKyAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2V0Q2FjaGVk
Rm9udERhdGEoZGF0YSk7CisgICAgICAgIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQoZm9udERh
dGEpOworICAgICAgICByZXR1cm4gZm9udERhdGE7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiAK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNo
ZUZyZWVUeXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9mcmVldHlwZS9Gb250Q2FjaGVGcmVlVHlwZS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5
cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OSw3ICs4OSw5IEBAIGNvbnN0IFNpbXBsZUZvbnRE
YXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICBSZWZQdHI8RmNQYXR0ZXJuPiBmYWxsYmFja1Bh
dHRlcm4gPSBhZG9wdFJlZihmaW5kQmVzdEZvbnRHaXZlbkZhbGxiYWNrcyhmb250RGF0YSwgcGF0
dGVybi5nZXQoKSkpOwogICAgIGlmIChmYWxsYmFja1BhdHRlcm4pIHsKICAgICAgICAgRm9udFBs
YXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0YShmYWxsYmFja1BhdHRlcm4uZ2V0KCksIGZvbnQu
Zm9udERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmFs
dGVybmF0ZUZvbnREYXRhKTsKKyAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIHJlc3VsdCA9
IGdldENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250RGF0YSk7CisgICAgICAgIHJlbGVhc2VQ
dXJnZVByb3RlY3RlZEZvbnQocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9
CiAKICAgICBGY1Jlc3VsdCBmb250Q29uZmlnUmVzdWx0OwpAQCAtOTcsNyArOTksOSBAQCBjb25z
dCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250CiAgICAgaWYgKCFyZXN1bHRQYXR0
ZXJuKQogICAgICAgICByZXR1cm4gMDsKICAgICBGb250UGxhdGZvcm1EYXRhIGFsdGVybmF0ZUZv
bnREYXRhKHJlc3VsdFBhdHRlcm4uZ2V0KCksIGZvbnQuZm9udERlc2NyaXB0aW9uKCkpOwotICAg
IHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udERhdGEpOworICAgIGNvbnN0
IFNpbXBsZUZvbnREYXRhKiByZXN1bHQgPSBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9u
dERhdGEpOworICAgIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQocmVzdWx0KTsKKyAgICByZXR1
cm4gcmVzdWx0OwogfQogCiBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRTaW1pbGFyRm9u
dFBsYXRmb3JtRGF0YShjb25zdCBGb250JiBmb250KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvaGFpa3UvRm9udENhY2hlSGFpa3UuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0ZvbnRDYWNoZUhhaWt1LmNwcAko
cmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9oYWlr
dS9Gb250Q2FjaGVIYWlrdS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDkgQEAgdm9p
ZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5pdCgpCiBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENh
Y2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNo
YXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpCiB7CiAgICAgRm9udFBsYXRmb3JtRGF0YSBkYXRh
KGZvbnQuZm9udERlc2NyaXB0aW9uKCksIGZvbnQuZmFtaWx5KCkuZmFtaWx5KCkpOwotICAgIHJl
dHVybiBnZXRDYWNoZWRGb250RGF0YSgmZGF0YSk7CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEq
IGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEoJmRhdGEpOworICAgIHJlbGVhc2VQdXJnZVBy
b3RlY3RlZEZvbnQoZm9udERhdGEpOworICAgIHJldHVybiBmb250RGF0YTsKIH0KIAogU2ltcGxl
Rm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9u
dCYgZm9udCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250
Q2FjaGVNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL0ZvbnRDYWNoZU1hYy5tbQkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udENhY2hlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTIsNyArMTUyLDEwIEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZv
bnQKICAgICAgICAgIWZvbnQuaXNQbGF0Zm9ybUZvbnQoKSAmJiBpc0FwcEtpdEZvbnRXZWlnaHRC
b2xkKHdlaWdodCkgJiYgIWlzQXBwS2l0Rm9udFdlaWdodEJvbGQoc3Vic3RpdHV0ZUZvbnRXZWln
aHQpLAogICAgICAgICAhZm9udC5pc1BsYXRmb3JtRm9udCgpICYmICh0cmFpdHMgJiBOU0ZvbnRJ
dGFsaWNUcmFpdCkgJiYgIShzdWJzdGl0dXRlRm9udFRyYWl0cyAmIE5TRm9udEl0YWxpY1RyYWl0
KSwKICAgICAgICAgcGxhdGZvcm1EYXRhLm1fb3JpZW50YXRpb24pOwotICAgIHJldHVybiBnZXRD
YWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisKKyAgICBjb25zdCBTaW1wbGVGb250RGF0
YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnQpOworICAgIHJlbGVh
c2VQdXJnZVByb3RlY3RlZEZvbnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBT
aW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShjb25z
dCBGb250JiBmb250KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
Rm9udENhY2hlUXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTgwLDcgKzgwLDkgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9u
dAogICAgIGlmICghY29tcHV0ZWRGb250LmlzVmFsaWQoKSkKICAgICAgICAgcmV0dXJuIDA7CiAg
ICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250KGNvbXB1dGVkRm9udCk7Ci0gICAgcmV0
dXJuIGdldENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250KTsKKyAgICBjb25zdCBTaW1wbGVG
b250RGF0YSogZm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udCk7Cisg
ICAgcmVsZWFzZVB1cmdlUHJvdGVjdGVkRm9udChmb250RGF0YSk7CisgICAgcmV0dXJuIGZvbnRE
YXRhOwogI2Vsc2UKICAgICBRX1VOVVNFRChmb250KTsKICAgICBRX1VOVVNFRChjaGFyYWN0ZXJz
KTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9Gb250Q2FjaGVXaW4uY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
ODQsOCArMjg0LDEwIEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQK
ICAgICBpZiAoaGZvbnQpIHsKICAgICAgICAgaWYgKCFmYW1pbHlOYW1lLmlzRW1wdHkoKSkgewog
ICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRm
b3JtRGF0YShmb250LmZvbnREZXNjcmlwdGlvbigpLCBmYW1pbHlOYW1lKTsKLSAgICAgICAgICAg
IGlmIChyZXN1bHQpCisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAg
Zm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0YShyZXN1bHQpOworICAgICAgICAgICAgICAgIHJl
bGVhc2VQdXJnZVByb3RlY3RlZEZvbnQoZm9udERhdGEpOworICAgICAgICAgICAgfQogICAgICAg
ICB9CiAKICAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250Q2FjaGVXaW5DRS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hl
V2luQ0UuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzA4LDgg
KzMwOCwxMCBAQCBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250CiAKICAg
ICAgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0
YShmb250RGVzY3JpcHRpb24sIGZhbWlseU5hbWUpOwogICAgICAgICBpZiAocmVzdWx0ICYmIHJl
c3VsdC0+aGFzaCgpICE9IG9yaWdGb250Lmhhc2goKSkgewotICAgICAgICAgICAgaWYgKFNpbXBs
ZUZvbnREYXRhKiBmb250RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCisgICAgICAg
ICAgICBpZiAoU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEocmVz
dWx0KSkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQoZm9udERh
dGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBmb250RGF0YTsKKyAgICAgICAgICAgIH0KICAg
ICAgICAgfQogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d3gvRm9udENhY2hlV3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3d4L0ZvbnRDYWNoZVd4LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQ3LDggKzQ3LDkgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0
Rm9udAogICAgICAgICBmb250RGF0YSA9IGdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGZvbnQp
OwogICAgIGlmICghZm9udERhdGEtPmNvbnRhaW5zQ2hhcmFjdGVycyhjaGFyYWN0ZXJzLCBsZW5n
dGgpKQogICAgICAgICBmb250RGF0YSA9IGdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoZm9udC5m
b250RGVzY3JpcHRpb24oKSk7Ci0gICAgCisKICAgICBBU1NFUlQoZm9udERhdGEpOworICAgIHJl
bGVhc2VQdXJnZVByb3RlY3RlZEZvbnQoZm9udERhdGEpOwogICAgIHJldHVybiBmb250RGF0YTsK
IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmNwcAko
cmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJv
eC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJEb2N1bWVu
dE1hcmtlckNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKICNpbmNsdWRlICJFbGxp
cHNpc0JveC5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgpA
QCAtMTgwLDYgKzE4MSw4IEBAIEludFJlY3QgSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdChp
bnQKICAgICBpZiAoc1BvcyA+IGVQb3MpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAKKyAg
ICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAg
IFJlbmRlclRleHQqIHRleHRPYmogPSB0ZXh0UmVuZGVyZXIoKTsKICAgICBpbnQgc2VsVG9wID0g
c2VsZWN0aW9uVG9wKCk7CiAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhlaWdodCgpOwpA
QCAtMTIzMiw2ICsxMjM1LDggQEAgaW50IElubGluZVRleHRCb3g6Om9mZnNldEZvclBvc2l0aW9u
KGZsbwogICAgIGlmIChsaW5lT2Zmc2V0IC0gbG9naWNhbExlZnQoKSA8IDApCiAgICAgICAgIHJl
dHVybiBsZWZ0T2Zmc2V0OwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI7CisKICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdG9SZW5kZXJUZXh0KHJl
bmRlcmVyKCkpOwogICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHQtPnN0eWxlKG1fZmlyc3RM
aW5lKTsKICAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUtPmZvbnQoKTsKQEAgLTEyNDksNiAr
MTI1NCw4IEBAIGZsb2F0IElubGluZVRleHRCb3g6OnBvc2l0aW9uRm9yT2Zmc2V0KGkKICAgICBp
ZiAoaXNMaW5lQnJlYWsoKSkKICAgICAgICAgcmV0dXJuIGxvZ2ljYWxMZWZ0KCk7CiAKKyAgICBG
b250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFJl
bmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQocmVuZGVyZXIoKSk7CiAgICAgUmVuZGVyU3R5
bGUqIHN0eWxlVG9Vc2UgPSB0ZXh0LT5zdHlsZShtX2ZpcnN0TGluZSk7CiAgICAgQVNTRVJUKHN0
eWxlVG9Vc2UpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3Bw
CShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFn
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb25maWcu
aCIKICNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgogCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAj
aW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgogI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dC5oIgpAQCAtMTAyLDYgKzEwMyw4IEBAIGJvb2wgUmVuZGVySW1hZ2U6
OnNldEltYWdlU2l6ZUZvckFsdFRleHQKIAogICAgIC8vIHdlIGhhdmUgYW4gYWx0IGFuZCB0aGUg
dXNlciBtZWFudCBpdCAoaXRzIG5vdCBhIHRleHQgd2UgaW52ZW50ZWQpCiAgICAgaWYgKCFtX2Fs
dFRleHQuaXNFbXB0eSgpKSB7CisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRD
YWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZSgp
LT5mb250KCk7CiAgICAgICAgIEludFNpemUgdGV4dFNpemUobWluKGZvbnQud2lkdGgoUmVuZGVy
QmxvY2s6OmNvbnN0cnVjdFRleHRSdW4odGhpcywgZm9udCwgbV9hbHRUZXh0LCBzdHlsZSgpKSks
IG1heEFsdFRleHRXaWR0aCksIG1pbihmb250LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCksIG1heEFs
dFRleHRIZWlnaHQpKTsKICAgICAgICAgaW1hZ2VTaXplID0gaW1hZ2VTaXplLmV4cGFuZGVkVG8o
dGV4dFNpemUpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94
LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
TGlzdEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJF
dmVudEhhbmRsZXIuaCIKICNpbmNsdWRlICJFdmVudFF1ZXVlLmgiCiAjaW5jbHVkZSAiRm9jdXND
b250cm9sbGVyLmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIK
ICNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgpAQCAt
OTgsNiArOTksOCBAQCBSZW5kZXJMaXN0Qm94Ojp+UmVuZGVyTGlzdEJveCgpCiAKIHZvaWQgUmVu
ZGVyTGlzdEJveDo6dXBkYXRlRnJvbUVsZW1lbnQoKQogeworICAgIEZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgaWYgKG1fb3B0aW9uc0NoYW5n
ZWQpIHsKICAgICAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gdG9TZWxl
Y3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKS0+bGlzdEl0ZW1zKCk7CiAg
ICAgICAgIGludCBzaXplID0gbnVtSXRlbXMoKTsKQEAgLTM1OCw2ICszNjEsOCBAQCBzdGF0aWMg
SW50U2l6ZSBpdGVtT2Zmc2V0Rm9yQWxpZ25tZW50KFRlCiAKIHZvaWQgUmVuZGVyTGlzdEJveDo6
cGFpbnRJdGVtRm9yZWdyb3VuZChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHks
IGludCBsaXN0SW5kZXgpCiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI7CisKICAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVs
ZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxF
bGVtZW50Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgRWxlbWVudCog
ZWxlbWVudCA9IGxpc3RJdGVtc1tsaXN0SW5kZXhdOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL3N2Zy9TVkdJbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiA4ODAxMCkK
KysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVk
ZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW5saW5lRmxvd0JveC5oIgogI2luY2x1ZGUg
IlJlbmRlckJsb2NrLmgiCkBAIC05MCw2ICs5MSw4IEBAIEZsb2F0UmVjdCBTVkdJbmxpbmVUZXh0
Qm94OjpzZWxlY3Rpb25SZWMKICAgICBBU1NFUlQoc3RhcnRQb3NpdGlvbiA8IGVuZFBvc2l0aW9u
KTsKICAgICBBU1NFUlQoc3R5bGUpOwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9u
dENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICBSZW5kZXJTVkdJbmxpbmVUZXh0KiB0ZXh0UmVu
ZGVyZXIgPSB0b1JlbmRlclNWR0lubGluZVRleHQodGhpcy0+dGV4dFJlbmRlcmVyKCkpOwogICAg
IEFTU0VSVCh0ZXh0UmVuZGVyZXIpOwogCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VM
b2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9tYWMvQ2hhbmdlTG9nCShyZXZpc2lvbiA4
ODEzNikKKysrIFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAt
MSwzICsxLDM0IEBACisyMDExLTA2LTA0ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZv
bnRzIHJldHVybmVkIGJ5IEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJl
IG5ldmVyIHJlbGVhc2VkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD02MTg3NQorCisgICAgICAgIFRoaXMgY2hhbmdlIGFsbG93cyBmb250cyBhbGxvY2F0
ZWQgYXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHRvIGJlCisgICAgICAgIHJlbGVhc2VkLiAgUHJl
dmlvdXNseSwgdGhlIHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZXNlIGZvbnRzIGdyZXcKKyAgICAg
ICAgd2l0aG91dCBib3VuZC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYW4gYXV0byByZWxlYXNl
IGNsYXNzIHRoYXQgd3JhcHMKKyAgICAgICAgYWNjZXNzZXMgdG8gdGhlIGNhY2hlIGZvciBzeXN0
ZW0gZmFsbGJhY2sgZm9udHMuIEFsbCBzdWNoIGFjY2Vzc2VzIGFyZQorICAgICAgICB2aWEgdGhl
IG1ldGhvZCBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycy4gVGhlIG5ldyBjbGFz
cyBpcworICAgICAgICBjYWxsZWQgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIuIFdoZW4gc3VjaCBh
biBvYmplY3QgZXhpc3RzLCBpdCBwcm90ZWN0cworICAgICAgICB0aGVzZSBmb250cyBmcm9tIGRl
bGV0aW9uLgorCisgICAgICAgIFNlZSBtb3JlIGNvbW1lbnRzIGZvciB0aGlzIGRlZmVjdCBpbiBT
b3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cuCisKKyAgICAgICAgKiBNaXNjL1dlYktpdE5TU3RyaW5n
RXh0cmFzLm1tOgorICAgICAgICAoLVtOU1N0cmluZyBfd2ViX2RyYXdBdFBvaW50OmZvbnQ6dGV4
dENvbG9yOmFsbG93aW5nRm9udFNtb290aGluZzpdKToKKyAgICAgICAgKC1bTlNTdHJpbmcgX3dl
Yl93aWR0aFdpdGhGb250Ol0pOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZhbGxi
YWNrIGZvbnRzIHdpdGggbG9jYWwKKyAgICAgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgaW4g
dGhlc2UgbWV0aG9kcy4KKworICAgICAgICAqIE1pc2MvV2ViU3RyaW5nVHJ1bmNhdG9yLm1tOgor
ICAgICAgICAoK1tXZWJTdHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNhdGVTdHJpbmc6dG9XaWR0
aDpdKToKKyAgICAgICAgKCtbV2ViU3RyaW5nVHJ1bmNhdG9yIGNlbnRlclRydW5jYXRlU3RyaW5n
OnRvV2lkdGg6d2l0aEZvbnQ6XSk6CisgICAgICAgICgrW1dlYlN0cmluZ1RydW5jYXRvciByaWdo
dFRydW5jYXRlU3RyaW5nOnRvV2lkdGg6d2l0aEZvbnQ6XSk6CisgICAgICAgICgrW1dlYlN0cmlu
Z1RydW5jYXRvciB3aWR0aE9mU3RyaW5nOmZvbnQ6XSk6CisgICAgICAgIFdyYXBwZWQgY29kZSBh
Y2Nlc3NpbmcgZmFsbGJhY2sgZm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJn
ZVByZXZlbnRlciBpbiB0aGVzZSBtZXRob2RzLgorCiAyMDExLTA2LTAyICBBbmRlcnMgQ2FybHNz
b24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdlaW5p
Zy4KSW5kZXg6IFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViS2l0TlNTdHJpbmdFeHRyYXMubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJLaXROU1N0cmluZ0V4dHJh
cy5tbQkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViS2l0L21hYy9NaXNjL1dlYktpdE5T
U3RyaW5nRXh0cmFzLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW1wb3J0
ICJXZWJLaXROU1N0cmluZ0V4dHJhcy5oIgogCiAjaW1wb3J0IDxXZWJDb3JlL0ZvbnQuaD4KKyNp
bXBvcnQgPFdlYkNvcmUvRm9udENhY2hlLmg+CiAjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzQ29u
dGV4dC5oPgogI2ltcG9ydCA8V2ViQ29yZS9UZXh0UnVuLmg+CiAjaW1wb3J0IDxXZWJDb3JlL1dl
YkNvcmVOU1N0cmluZ0V4dHJhcy5oPgpAQCAtODksNiArOTAsOCBAQCAtICh2b2lkKV93ZWJfZHJh
d0F0UG9pbnQ6KE5TUG9pbnQpcG9pbnQgCiAgICAgICAgIGlmICghZmxpcHBlZCkKICAgICAgICAg
ICAgIENHQ29udGV4dFNjYWxlQ1RNKGNnQ29udGV4dCwgMSwgLTEpOwogCisgICAgICAgIEZvbnRD
YWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgICAgIEZv
bnQgd2ViQ29yZUZvbnQoRm9udFBsYXRmb3JtRGF0YShmb250LCBbZm9udCBwb2ludFNpemVdKSwg
IVtuc0NvbnRleHQgaXNEcmF3aW5nVG9TY3JlZW5dLCBmb250U21vb3RoaW5nSXNBbGxvd2VkID8g
QXV0b1Ntb290aGluZyA6IEFudGlhbGlhc2VkKTsKICAgICAgICAgVGV4dFJ1biBydW4oYnVmZmVy
LmRhdGEoKSwgbGVuZ3RoKTsKIApAQCAtMTM0LDYgKzEzNyw4IEBAIC0gKGZsb2F0KV93ZWJfd2lk
dGhXaXRoRm9udDooTlNGb250ICopZm8KICAgICBbc2VsZiBnZXRDaGFyYWN0ZXJzOmJ1ZmZlci5k
YXRhKCldOwogCiAgICAgaWYgKGNhblVzZUZhc3RSZW5kZXJlcihidWZmZXIuZGF0YSgpLCBsZW5n
dGgpKSB7CisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyOworCiAgICAgICAgIEZvbnQgd2ViQ29yZUZvbnQoRm9udFBsYXRmb3JtRGF0YShmb250
LCBbZm9udCBwb2ludFNpemVdKSwgIVtbTlNHcmFwaGljc0NvbnRleHQgY3VycmVudENvbnRleHRd
IGlzRHJhd2luZ1RvU2NyZWVuXSk7CiAgICAgICAgIFRleHRSdW4gcnVuKGJ1ZmZlci5kYXRhKCks
IGxlbmd0aCk7CiAgICAgICAgIHJldHVybiB3ZWJDb3JlRm9udC53aWR0aChydW4pOwpJbmRleDog
U291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3IubW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3IubW0JKHJldmlzaW9u
IDg4MDEwKQorKysgU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3IubW0J
KHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2ltcG9ydCAiV2ViU3lzdGVtSW50
ZXJmYWNlLmgiCiAjaW1wb3J0IDxXZWJDb3JlL0ZvbnQuaD4KKyNpbXBvcnQgPFdlYkNvcmUvRm9u
dENhY2hlLmg+CiAjaW1wb3J0IDxXZWJDb3JlL0ZvbnRQbGF0Zm9ybURhdGEuaD4KICNpbXBvcnQg
PFdlYkNvcmUvUGxhdGZvcm1TdHJpbmcuaD4KICNpbXBvcnQgPFdlYkNvcmUvU3RyaW5nVHJ1bmNh
dG9yLmg+CkBAIC03MiwyMSArNzMsMjUgQEAgKyAodm9pZClpbml0aWFsaXplCiAKICsgKE5TU3Ry
aW5nICopY2VudGVyVHJ1bmNhdGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIHRvV2lkdGg6KGZs
b2F0KW1heFdpZHRoCiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVy
Z2VQcmV2ZW50ZXI7CiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNhdGUo
c3RyaW5nLCBtYXhXaWR0aCwgZm9udEZyb21OU0ZvbnQoZGVmYXVsdE1lbnVGb250KCkpKTsKIH0K
IAogKyAoTlNTdHJpbmcgKiljZW50ZXJUcnVuY2F0ZVN0cmluZzooTlNTdHJpbmcgKilzdHJpbmcg
dG9XaWR0aDooZmxvYXQpbWF4V2lkdGggd2l0aEZvbnQ6KE5TRm9udCAqKWZvbnQKIHsKKyAgICBG
b250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKICAgICByZXR1
cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShzdHJpbmcsIG1heFdpZHRoLCBmb250
RnJvbU5TRm9udChmb250KSk7CiB9CiAKICsgKE5TU3RyaW5nICopcmlnaHRUcnVuY2F0ZVN0cmlu
ZzooTlNTdHJpbmcgKilzdHJpbmcgdG9XaWR0aDooZmxvYXQpbWF4V2lkdGggd2l0aEZvbnQ6KE5T
Rm9udCAqKWZvbnQKIHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJn
ZVByZXZlbnRlcjsKICAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKHN0
cmluZywgbWF4V2lkdGgsIGZvbnRGcm9tTlNGb250KGZvbnQpKTsKIH0KIAogKyAoZmxvYXQpd2lk
dGhPZlN0cmluZzooTlNTdHJpbmcgKilzdHJpbmcgZm9udDooTlNGb250ICopZm9udAogeworICAg
IEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOwogICAgIHJl
dHVybiBTdHJpbmdUcnVuY2F0b3I6OndpZHRoKHN0cmluZywgZm9udEZyb21OU0ZvbnQoZm9udCkp
OwogfQogCkluZGV4OiBTb3VyY2UvV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdC93aW4vQ2hhbmdlTG9nCShyZXZpc2lvbiA4ODEzNikKKysrIFNvdXJjZS9X
ZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDEx
LTA2LTA1ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVkIGJ5IEZv
bnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVhc2VkCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3NQorCisg
ICAgICAgIFRoaXMgY2hhbmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVtIGZhbGxi
YWNrIGZvbnRzIHRvIGJlCisgICAgICAgIHJlbGVhc2VkLiAgUHJldmlvdXNseSwgdGhlIHJlZmVy
ZW5jZSBjb3VudHMgZm9yIHRoZXNlIGZvbnRzIGdyZXcKKyAgICAgICAgd2l0aG91dCBib3VuZC4g
IFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYW4gYXV0byByZWxlYXNlIGNsYXNzIHRoYXQgd3JhcHMK
KyAgICAgICAgYWNjZXNzZXMgdG8gdGhlIGNhY2hlIGZvciBzeXN0ZW0gZmFsbGJhY2sgZm9udHMu
IEFsbCBzdWNoIGFjY2Vzc2VzIGFyZQorICAgICAgICB2aWEgdGhlIG1ldGhvZCBGb250Q2FjaGU6
OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycy4gVGhlIG5ldyBjbGFzcyBpcworICAgICAgICBjYWxs
ZWQgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIuIFdoZW4gc3VjaCBhbiBvYmplY3QgZXhpc3RzLCBp
dCBwcm90ZWN0cworICAgICAgICB0aGVzZSBmb250cyBmcm9tIGRlbGV0aW9uLgorCisgICAgICAg
IFNlZSBtb3JlIGNvbW1lbnRzIGZvciB0aGlzIGRlZmVjdCBpbiBTb3VyY2UvV2ViQ29yZS9DaGFu
Z2VMb2cuCisKKyAgICAgICAgKiBXZWJLaXRHcmFwaGljcy5jcHA6CisgICAgICAgIChDZW50ZXJU
cnVuY2F0ZVN0cmluZ1RvV2lkdGgpOgorICAgICAgICAoUmlnaHRUcnVuY2F0ZVN0cmluZ1RvV2lk
dGgpOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZhbGxiYWNrIGZvbnRzIHdpdGgg
bG9jYWwKKyAgICAgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgaW4gdGhlc2UgbWV0aG9kcy4K
KwogMjAxMS0wNS0xOCAgQW50aG9ueSBKb2huc29uIDxhbnRob255LmpvaG5zb25AZmxleHNpbS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQnJlbnQgRnVsZ2hhbS4KSW5kZXg6IFNvdXJjZS9X
ZWJLaXQvd2luL1dlYktpdEdyYXBoaWNzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
L3dpbi9XZWJLaXRHcmFwaGljcy5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYktp
dC93aW4vV2ViS2l0R3JhcGhpY3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBA
CiAjaW5jbHVkZSAiV2ViUHJlZmVyZW5jZXMuaCIKIAogI2luY2x1ZGUgPFdlYkNvcmUvRm9udC5o
PgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udENhY2hlLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Gb250
RGVzY3JpcHRpb24uaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZvbnRTZWxlY3Rvci5oPgogI2luY2x1
ZGUgPFdlYkNvcmUvR3JhcGhpY3NDb250ZXh0Lmg+CkBAIC0xNDcsNiArMTQ4LDggQEAgdW5zaWdu
ZWQgQ2VudGVyVHJ1bmNhdGVTdHJpbmdUb1dpZHRoKExQQwogewogICAgIEFTU0VSVChidWZmZXIp
OwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7
CisKICAgICBTdHJpbmcgcmVzdWx0ID0gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShT
dHJpbmcodGV4dCwgbGVuZ3RoKSwgd2lkdGgsIG1ha2VGb250KGRlc2NyaXB0aW9uKSk7CiAgICAg
bWVtY3B5KGJ1ZmZlciwgcmVzdWx0LmNoYXJhY3RlcnMoKSwgcmVzdWx0Lmxlbmd0aCgpICogc2l6
ZW9mKFVDaGFyKSk7CiAgICAgYnVmZmVyW3Jlc3VsdC5sZW5ndGgoKV0gPSAnXDAnOwpAQCAtMTU3
LDYgKzE2MCw4IEBAIHVuc2lnbmVkIFJpZ2h0VHJ1bmNhdGVTdHJpbmdUb1dpZHRoKExQQ1QKIHsK
ICAgICBBU1NFUlQoYnVmZmVyKTsKIAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRD
YWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgU3RyaW5nIHJlc3VsdCA9IFN0cmluZ1RydW5jYXRv
cjo6cmlnaHRUcnVuY2F0ZShTdHJpbmcodGV4dCwgbGVuZ3RoKSwgd2lkdGgsIG1ha2VGb250KGRl
c2NyaXB0aW9uKSk7CiAgICAgbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LmNoYXJhY3RlcnMoKSwgcmVz
dWx0Lmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSk7CiAgICAgYnVmZmVyW3Jlc3VsdC5sZW5ndGgo
KV0gPSAnXDAnOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>96060</attachid>
            <date>2011-06-05 19:31:25 -0700</date>
            <delta_ts>2011-06-07 10:15:03 -0700</delta_ts>
            <desc>Prior patch with fixed debug code caught by stylebot</desc>
            <filename>61875-7.patch</filename>
            <type>text/plain</type>
            <size>35453</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg4MTM2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIwIEBACisyMDExLTA2LTA1ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVkIGJ5IEZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVhc2VkCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3NQorCisgICAgICAgIFRoaXMgY2hh
bmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHRvIGJl
IAorICAgICAgICByZWxlYXNlZC4gIFByZXZpb3VzbHksIHRoZSByZWZlcmVuY2UgY291bnRzIGZv
ciB0aGVzZSBmb250cyBncmV3IAorICAgICAgICB3aXRob3V0IGJvdW5kLiAgVGhpcyBpcyBpbXBs
ZW1lbnRlZCBhcyBhbiBhdXRvIHJlbGVhc2UgY2xhc3MgdGhhdCB3cmFwcworICAgICAgICBhY2Nl
c3NlcyB0byB0aGUgY2FjaGUgZm9yIHN5c3RlbSBmYWxsYmFjayBmb250cy4gQWxsIHN1Y2ggYWNj
ZXNzZXMgYXJlCisgICAgICAgIHZpYSB0aGUgbWV0aG9kIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFG
b3JDaGFyYWN0ZXJzLiBUaGUgbmV3IGNsYXNzIGlzCisgICAgICAgIGNhbGxlZCBGb250Q2FjaGVQ
dXJnZVByZXZlbnRlci4gV2hlbiBzdWNoIGFuIG9iamVjdCBleGlzdHMsIGl0IHByb3RlY3RzCisg
ICAgICAgIHRoZXNlIGZvbnRzIGZyb20gZGVsZXRpb24uCisKKyAgICAgICAgQWRkZWQgbG9jYWwg
c2NvcGVkIGluc3RhbmNlIG9mIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIHRvIHdyYXAgY29kZQor
ICAgICAgICB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYWNjZXNzZXMgZm9udHMgdmlhIGdl
dEZvbnREYXRhRm9yQ2hhcmFjdGVycy4KKyAgICAgICAgRGlkIGEgZmV3IG90aGVyIG1pc2NlbGxh
bmVvdXMgYnVnIGZpeGVzIGFuZCBjaGFuZ2VzIHRvIGFsbG93IHN5c3RlbQorICAgICAgICBmYWxs
YmFjayBmb250cyB0byBiZSBwcnVuZWQgZnJvbSB0aGUgR2x5cGhQYWdlVHJlZS4gQWRkZWQgdGhl
CisgICAgICAgIHN1cHBvcnRpbmcgY29kZSBpbiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgdmVyc2lv
bnMgb2YKKyAgICAgICAgRm9udGNhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMuICBNb3Zl
ZCB0aGUgcHVyZ2UgZm9udCBjaGVjaworICAgICAgICBvdXRzaWRlIG9mIEZvbnRDYWNoZTo6Z2V0
Q2FjaGVkRm9udERhdGEoKSBpbnRvIGEgc2VwYXJhdGUgbWV0aG9kLCAKKyAgICAgICAgcHVyZ2VJ
bmFjdGl2ZUZvbnREYXRhSWZOZWVkZWQoKSBzaW5jZSBhbG1vc3QgYWxsIGNhbGxzIHRvIAorICAg
ICAgICBnZXRDYWNoZWRGb250RGF0YSgpIG5vdyBoYXBwZW4gd2hlbiBwdXJnaW5nIGlzIG5vdCBh
bGxvd2VkLgorICAgICAgICBwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZCBpcyBpbnZva2Vk
IGluIGVuYWJsZVB1cmdpbmcoKSB3aGVuCisgICAgICAgIG1fcHVyZ2VQcmV2ZW50Q291bnQgaXMg
MC4KKworICAgICAgICBObyBuZXcgdGVzdCBhcyB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgbm90IGNo
YW5nZWQuIEltcHJvdmVkIGZvbnQgbGlmZQorICAgICAgICBjeWNsZSBtYW5hZ2VtZW50LgorCisg
ICAgICAgICogV2ViQ29yZS5leHAuaW46IEFkZGVkIEZvbnRDYWNoZTo6cHVyZ2VJbmFjdGl2ZUZv
bnREYXRhSWZOZWVkZWQoKS4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
OjptZWFzdXJlVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQ6OmRyYXdUZXh0SW50ZXJuYWwpOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZh
bGxiYWNrIGZvbnRzIHdpdGggbG9jYWwgCisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGluIHRoZXNlIG1ldGhvZHMuCisKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OmxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpGcmFt
ZVZpZXc6OnBhaW50Q29udGVudHMpOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZh
bGxiYWNrIGZvbnRzIHdpdGggbG9jYWwgCisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGluIHRoZXNlIG1ldGhvZHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2Fj
aGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpGb250Q2FjaGUpOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRDYWNoZWRGb250RGF0YSk6CisgICAgICAgIE1vdmVk
IHB1cmdlIGNoZWNrIHRvIG5ldyBtZXRob2Qgc2luY2UgaXQgbGlrZWx5IGNhbid0IGhhcHBlbiBo
ZXJlCisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YSk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnB1cmdlSW5hY3RpdmVGb250RGF0YUlmTmVlZGVkKToK
KyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cHVyZ2VJbmFjdGl2ZUZvbnREYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6cmVsZWFzZVB1cmdlUHJvdGVjdGVkRm9udCk6Cisg
ICAgICAgIE1hZGUgcHVyZ2luZyBjb25kaXRpb25hbCBvbiBtX3B1cmdlUHJldmVudENvdW50LiAg
Tm93IHNvbWUgZm9udHMKKyAgICAgICAgaW4gdGhlIGNhY2hlIGFyZSByZWZlcmVuY2UgY291bnRl
ZCB3aGlsZSBvdGhlciBjYW4gYmUgcHVyZ2VkIAorICAgICAgICBvdXRzaWRlIG9mIGNvZGUgd3Jh
cHBlZCBieSBpbiBzY29wZSBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBvYmplY3RzLgorCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmg6CisgICAgICAgIChXZWJDb3JlOjpG
b250Q2FjaGU6OmRpc2FibGVQdXJnaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6
ZW5hYmxlUHVyZ2luZyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVQdXJnZVByZXZlbnRl
cjo6Rm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI6On5Gb250Q2FjaGVQdXJnZVByZXZlbnRlcik6CisgICAgICAgIEFkZGVk
IG5ldyBzaW1wbGUgcHVyZ2UgcHJldmVudGlvbiB3cmFwcGVyIGNsYXNzIGFuZCBtZXRob2RzCisg
ICAgICAgIHRoYXQgaXQgY2FsbHMgaW4gRm9udENhY2hlIGFjdHVhbGx5IHByZXZlbnQgcHVyZ2lu
Zy4gIFRoZQorICAgICAgICBzaW1wbGUgbWV0aG9kcyBpbmxpbmVkIHRvIHJlZHVjZSBvdmVyaGVh
ZC4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIpOiBVcGRhdGUgbGV2ZWwg
aW4gCisgICAgICAgIGdseXBoIHBhZ2UgdHJlZSBmb3Igc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHNv
IHBydW5pbmcgd29ya3MuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2Uu
aDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZTo6Y2xlYXJGb3JGb250RGF0YSk6IE5ldyBt
ZXRob2QgdXNlZCBmb3IgcHJ1bmluZworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBo
UGFnZVRyZWVOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZVRyZWVOb2RlOjpw
cnVuZUZvbnREYXRhKToKKyAgICAgICAgTm93IHdlIHBydW5lIHN5c3RlbSBmYWxsYmFjayBmb250
cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9t
aXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JD
aGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250Q2Fj
aGVGcmVlVHlwZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRh
Rm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvaGFpa3UvRm9udENh
Y2hlSGFpa3UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZv
ckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVN
YWMubW06CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFj
dGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVXaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgIEFkZGVkIGEg
cmVsZWFzZVB1cmdlUHJvdGVjdGVkRm9udCBjYWxsIHRvIHRoZXNlIG1ldGhvZHMuICBUaGUKKyAg
ICAgICAgY2FsbGVyIChjdXJyZW50bHkgb25seSBGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIo
KSBpbiAKKyAgICAgICAgZm9udEZhc3RQYXRoLmNwcCkgYW5kIGl0J3MgY2FsbGVycyBkb24ndCBh
dHRlbXB0IHRvIHJlbGVhc2UgCisgICAgICAgIHRoZSByZXR1cm5lZCBmb250cyBzbyB3ZSB1c2Ug
dGhlIHB1cmdlIHByb3RlY3Rpb24gZGVzY3JpYmVkIGFib3ZlLgorCisgICAgICAgICogcmVuZGVy
aW5nL0lubGluZVRleHRCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6
c2VsZWN0aW9uUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpvZmZzZXRG
b3JQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkZv
ck9mZnNldCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJhY2sgZm9udHMg
d2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0aGVzZSBtZXRo
b2RzLgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0KToKKyAgICAgICAgV3Jh
cHBlZCBjb2RlIGFjY2Vzc2luZyBmYWxsYmFjayBmb250cyB3aXRoIGxvY2FsCisgICAgICAgIEZv
bnRDYWNoZVB1cmdlUHJldmVudGVyIGluIHRoaXMgbWV0aG9kLgorCisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckxpc3RCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6
dXBkYXRlRnJvbUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6cGFp
bnRJdGVtRm9yZWdyb3VuZCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJh
Y2sgZm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0
aGVzZSBtZXRob2RzCisKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdEZv
clRleHRGcmFnbWVudCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJhY2sg
Zm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0aGlz
IG1ldGhvZC4KKwogMjAxMS0wNi0wNSAgSWdvciBPbGl2ZWlyYSAgPGlnb3Iub2xpdmVpcmFAb3Bl
bmJvc3NhLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5uZXRoIFJvaGRlIENocmlzdGlh
bnNlbi4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC05MjIsNiArOTIyLDcg
QEAgX19aTjdXZWJDb3JlOUZsb2F0U2l6ZUMxRVJLTlNfN0ludFNpemVFCiBfX1pON1dlYkNvcmU5
Rm9udENhY2hlMTNmb250RGF0YUNvdW50RXYKIF9fWk43V2ViQ29yZTlGb250Q2FjaGUyMWluYWN0
aXZlRm9udERhdGFDb3VudEV2CiBfX1pON1dlYkNvcmU5Rm9udENhY2hlMjFwdXJnZUluYWN0aXZl
Rm9udERhdGFFaQorX19aTjdXZWJDb3JlOUZvbnRDYWNoZTI5cHVyZ2VJbmFjdGl2ZUZvbnREYXRh
SWZOZWVkZWRFdgogX19aTjdXZWJDb3JlOUZyYW1lVHJlZTExYXBwZW5kQ2hpbGRFTjNXVEYxMFBh
c3NSZWZQdHJJTlNfNUZyYW1lRUVFCiBfX1pON1dlYkNvcmU5RnJhbWVUcmVlN3NldE5hbWVFUktO
M1dURjEyQXRvbWljU3RyaW5nRQogX19aTjdXZWJDb3JlOUZyYW1lVHJlZTljbGVhck5hbWVFdgpJ
bmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0
bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJDYW52YXNTdHlsZS5oIgogI2luY2x1ZGUgIkV4Y2Vw
dGlvbkNvZGUuaCIKICNpbmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGb250
Q2FjaGUuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIVE1MQ2Fu
dmFzRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxJbWFnZUVsZW1lbnQuaCIKQEAgLTE4NzQsNiAr
MTg3NSw4IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpzdHJva2VUZXgKIAogUGFz
c1JlZlB0cjxUZXh0TWV0cmljcz4gQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjptZWFzdXJlVGV4
dChjb25zdCBTdHJpbmcmIHRleHQpCiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9u
dENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICBSZWZQdHI8VGV4dE1ldHJpY3M+IG1ldHJpY3Mg
PSBUZXh0TWV0cmljczo6Y3JlYXRlKCk7CiAKICNpZiBQTEFURk9STShRVCkKQEAgLTE5MDEsNiAr
MTkwNCw4IEBAIHZvaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpkcmF3VGV4dEkKICAgICBp
ZiAoIWlzZmluaXRlKHgpIHwgIWlzZmluaXRlKHkpKQogICAgICAgICByZXR1cm47CiAKKyAgICBG
b250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIGNv
bnN0IEZvbnQmIGZvbnQgPSBhY2Nlc3NGb250KCk7CiAgICAgY29uc3QgRm9udE1ldHJpY3MmIGZv
bnRNZXRyaWNzID0gZm9udC5mb250TWV0cmljcygpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
YWdlL0ZyYW1lVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9GcmFt
ZVZpZXcuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVW
aWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkV2ZW50
SGFuZGxlci5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkZvY3VzQ29udHJv
bGxlci5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5j
bHVkZSAiRnJhbWVBY3Rpb25TY2hlZHVsZXIuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgpA
QCAtODk2LDYgKzg5Nyw4IEBAIHZvaWQgRnJhbWVWaWV3OjpsYXlvdXQoYm9vbCBhbGxvd1N1YnRy
ZWUKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVy
IGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgbV9uZXN0ZWRMYXlvdXRDb3VudCsrOwog
CiAgICAgaWYgKCFtX2xheW91dFJvb3QpIHsKQEAgLTI0MjMsNiArMjQyNiw4IEBAIHZvaWQgRnJh
bWVWaWV3OjpwYWludENvbnRlbnRzKEdyYXBoaWNzQ28KICAgICBpZiAobmVlZHNMYXlvdXQoKSkK
ICAgICAgICAgcmV0dXJuOwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI7CisKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAg
aWYgKCFwLT5wYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHN5bmNDb21wb3NpdGluZ1N0YXRl
Rm9yVGhpc0ZyYW1lKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250Q2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRDYWNoZS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQs
NyBAQAogI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNsdWRlICJGb250UGxhdGZv
cm1EYXRhLmgiCiAjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiR2x5cGhQYWdl
VHJlZU5vZGUuaCIKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9MaXN0
SGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTUwLDYgKzUxLDcg
QEAgRm9udENhY2hlKiBmb250Q2FjaGUoKQogfQogCiBGb250Q2FjaGU6OkZvbnRDYWNoZSgpCisg
ICAgOiBtX3B1cmdlUHJldmVudENvdW50KDApCiB7CiB9CiAKQEAgLTI0OSw4ICsyNTEsOCBAQCB0
eXBlZGVmIEhhc2hNYXA8Rm9udFBsYXRmb3JtRGF0YSwgcGFpcjxTCiAKIHN0YXRpYyBGb250RGF0
YUNhY2hlKiBnRm9udERhdGFDYWNoZSA9IDA7CiAKLWNvbnN0IGludCBjTWF4SW5hY3RpdmVGb250
RGF0YSA9IDEyMDsgIC8vIFByZXR0eSBMb3cgVGhyZXNob2xkCi1jb25zdCBpbnQgY1RhcmdldElu
YWN0aXZlRm9udERhdGEgPSAxMDA7Citjb25zdCBpbnQgY01heEluYWN0aXZlRm9udERhdGEgPSA1
MDsgLy8gUHJldHR5IExvdyBUaHJlc2hvbGQKK2NvbnN0IGludCBjVGFyZ2V0SW5hY3RpdmVGb250
RGF0YSA9IDMwOwogc3RhdGljIExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGdJ
bmFjdGl2ZUZvbnREYXRhID0gMDsKIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Q2Fj
aGVkRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNvbnN0
IEF0b21pY1N0cmluZyYgZmFtaWx5LCBib29sIGNoZWNraW5nQWx0ZXJuYXRlTmFtZSkKQEAgLTI3
MSw3ICsyNzMsNyBAQCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRDYWNoZWRGb250CiAg
ICAgICAgIGdGb250RGF0YUNhY2hlID0gbmV3IEZvbnREYXRhQ2FjaGU7CiAgICAgICAgIGdJbmFj
dGl2ZUZvbnREYXRhID0gbmV3IExpc3RIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj47CiAg
ICAgfQotICAgIAorCiAgICAgRm9udERhdGFDYWNoZTo6aXRlcmF0b3IgcmVzdWx0ID0gZ0ZvbnRE
YXRhQ2FjaGUtPmZpbmQoKnBsYXRmb3JtRGF0YSk7CiAgICAgaWYgKHJlc3VsdCA9PSBnRm9udERh
dGFDYWNoZS0+ZW5kKCkpIHsKICAgICAgICAgcGFpcjxTaW1wbGVGb250RGF0YSosIHVuc2lnbmVk
PiBuZXdWYWx1ZShuZXcgU2ltcGxlRm9udERhdGEoKnBsYXRmb3JtRGF0YSksIDEpOwpAQCAtMjk0
LDE2ICsyOTYsMjAgQEAgdm9pZCBGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YShjb25zdCBTaQog
ICAgIEZvbnREYXRhQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gZ0ZvbnREYXRhQ2FjaGUtPmZpbmQoZm9u
dERhdGEtPnBsYXRmb3JtRGF0YSgpKTsKICAgICBBU1NFUlQoaXQgIT0gZ0ZvbnREYXRhQ2FjaGUt
PmVuZCgpKTsKIAotICAgIGlmICghLS1pdC0+c2Vjb25kLnNlY29uZCkgeworICAgIEFTU0VSVChp
dC0+c2Vjb25kLnNlY29uZCk7CisgICAgaWYgKCEtLWl0LT5zZWNvbmQuc2Vjb25kKQogICAgICAg
ICBnSW5hY3RpdmVGb250RGF0YS0+YWRkKGZvbnREYXRhKTsKLSAgICAgICAgaWYgKGdJbmFjdGl2
ZUZvbnREYXRhLT5zaXplKCkgPiBjTWF4SW5hY3RpdmVGb250RGF0YSkKLSAgICAgICAgICAgIHB1
cmdlSW5hY3RpdmVGb250RGF0YShnSW5hY3RpdmVGb250RGF0YS0+c2l6ZSgpIC0gY1RhcmdldElu
YWN0aXZlRm9udERhdGEpOwotICAgIH0KK30KKwordm9pZCBGb250Q2FjaGU6OnB1cmdlSW5hY3Rp
dmVGb250RGF0YUlmTmVlZGVkKCkKK3sKKyAgICBpZiAoZ0luYWN0aXZlRm9udERhdGEgJiYgIW1f
cHVyZ2VQcmV2ZW50Q291bnQgJiYgZ0luYWN0aXZlRm9udERhdGEtPnNpemUoKSA+IGNNYXhJbmFj
dGl2ZUZvbnREYXRhKQorICAgICAgICBwdXJnZUluYWN0aXZlRm9udERhdGEoZ0luYWN0aXZlRm9u
dERhdGEtPnNpemUoKSAtIGNUYXJnZXRJbmFjdGl2ZUZvbnREYXRhKTsKIH0KIAogdm9pZCBGb250
Q2FjaGU6OnB1cmdlSW5hY3RpdmVGb250RGF0YShpbnQgY291bnQpCiB7Ci0gICAgaWYgKCFnSW5h
Y3RpdmVGb250RGF0YSkKKyAgICBpZiAoIWdJbmFjdGl2ZUZvbnREYXRhIHx8IG1fcHVyZ2VQcmV2
ZW50Q291bnQpCiAgICAgICAgIHJldHVybjsKIAogICAgIHN0YXRpYyBib29sIGlzUHVyZ2luZzsg
IC8vIEd1YXJkIGFnYWluc3QgcmVlbnRyeSB3aGVuIGUuZy4gYSBkZWxldGVkIEZvbnREYXRhIHJl
bGVhc2VzIGl0cyBzbWFsbCBjYXBzIEZvbnREYXRhLgpAQCAtMzY0LDYgKzM3MCwxMiBAQCBzaXpl
X3QgRm9udENhY2hlOjppbmFjdGl2ZUZvbnREYXRhQ291bnQoCiAgICAgcmV0dXJuIDA7CiB9CiAK
K3ZvaWQgRm9udENhY2hlOjpyZWxlYXNlUHVyZ2VQcm90ZWN0ZWRGb250KGNvbnN0IFNpbXBsZUZv
bnREYXRhKiBmb250RGF0YSkKK3sKKyAgICBBU1NFUlQobV9wdXJnZVByZXZlbnRDb3VudCk7Cisg
ICAgcmVsZWFzZUZvbnREYXRhKGZvbnREYXRhKTsKK30KKwogY29uc3QgRm9udERhdGEqIEZvbnRD
YWNoZTo6Z2V0Rm9udERhdGEoY29uc3QgRm9udCYgZm9udCwgaW50JiBmYW1pbHlJbmRleCwgRm9u
dFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCiB7CiAgICAgU2ltcGxlRm9udERhdGEqIHJlc3VsdCA9
IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUu
aAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250Q2FjaGUuaAkod29ya2luZyBjb3B5KQpAQCAtNTEsMTcgKzUxLDE4IEBAIGNsYXNzIEZvbnRT
ZWxlY3RvcjsKIGNsYXNzIFNpbXBsZUZvbnREYXRhOwogCiBjbGFzcyBGb250Q2FjaGUgeworICAg
IGZyaWVuZCBjbGFzcyBGb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFdURl9NQUtFX05P
TkNPUFlBQkxFKEZvbnRDYWNoZSk7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgog
ICAgIGZyaWVuZCBGb250Q2FjaGUqIGZvbnRDYWNoZSgpOwogCiAgICAgY29uc3QgRm9udERhdGEq
IGdldEZvbnREYXRhKGNvbnN0IEZvbnQmLCBpbnQmIGZhbWlseUluZGV4LCBGb250U2VsZWN0b3Iq
KTsKICAgICB2b2lkIHJlbGVhc2VGb250RGF0YShjb25zdCBTaW1wbGVGb250RGF0YSopOwotICAg
IAorCiAgICAgLy8gVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLgot
ICAgIC8vIEZJWE1FOiBGb250IGRhdGEgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgbmV2ZXIgZ28g
aW5hY3RpdmUgYmVjYXVzZSBjYWxsZXJzIGRvbid0IHRyYWNrIGFuZCByZWxlYXNlIHRoZW0uCiAg
ICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyhjb25zdCBG
b250JiwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpOwotICAgIAorCiAgICAg
Ly8gQWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCiAgICAgdm9pZCBwbGF0Zm9ybUlu
aXQoKTsKIApAQCAtOTcsNiArOTgsMjEgQEAgcHJpdmF0ZToKICAgICBGb250Q2FjaGUoKTsKICAg
ICB+Rm9udENhY2hlKCk7CiAKKyAgICB2b2lkIGRpc2FibGVQdXJnaW5nKCkgeyBtX3B1cmdlUHJl
dmVudENvdW50Kys7IH0KKyAgICB2b2lkIGVuYWJsZVB1cmdpbmcoKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKG1fcHVyZ2VQcmV2ZW50Q291bnQpOworICAgICAgICBpZiAoIS0tbV9wdXJnZVByZXZl
bnRDb3VudCkKKyAgICAgICAgICAgIHB1cmdlSW5hY3RpdmVGb250RGF0YUlmTmVlZGVkKCk7Cisg
ICAgfQorCisgICAgdm9pZCBwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZCgpOworCisgICAg
Ly8gRGVyZWYgZm9udHMgcmV0dXJuZWQgdmlhIGdldEZvbnREYXRhRm9yQ2hhcmFjdGVycygpIHNp
bmNlIHdlIHVzZSBtX3B1cmdlUHJldmVudENvdW50IHRvIGd1YXJkIGFnYWluc3QKKyAgICAvLyB1
bnNhZmUgcHVyZ2luZy4gQWxsIGFjY2Vzc2VzIHRvIGZvbnRzIHZpYSB0aGF0IG1ldGhvZCBzaG91
bGQgYmUgd3JhcHBlZCB3aXRoIGEgbG9jYWwgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIKKyAgICAv
LyB2YXJpYWJsZSBpbiBzY29wZS4KKyAgICB2b2lkIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQo
Y29uc3QgU2ltcGxlRm9udERhdGEqKTsKKwogICAgIC8vIEZJWE1FOiBUaGlzIG1ldGhvZCBzaG91
bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIEZvbnRQbGF0Zm9ybURhdGEqIGdldENhY2hl
ZEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiwgY29uc3QgQXRvbWljU3Ry
aW5nJiBmYW1pbHksIGJvb2wgY2hlY2tpbmdBbHRlcm5hdGVOYW1lID0gZmFsc2UpOwogCkBAIC0x
MDYsNiArMTIyLDkgQEAgcHJpdmF0ZToKIAogICAgIFNpbXBsZUZvbnREYXRhKiBnZXRDYWNoZWRG
b250RGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhKik7CiAKKyAgICAvLyBEb24ndCBwdXJnZSBp
ZiB0aGlzIGNvdW50IGlzID4gMDsKKyAgICBpbnQgbV9wdXJnZVByZXZlbnRDb3VudDsKKwogICAg
IGZyaWVuZCBjbGFzcyBTaW1wbGVGb250RGF0YTsgLy8gRm9yIGdldENhY2hlZEZvbnREYXRhKGNv
bnN0IEZvbnRQbGF0Zm9ybURhdGEqKQogICAgIGZyaWVuZCBjbGFzcyBGb250RmFsbGJhY2tMaXN0
OwogfTsKQEAgLTExMyw2ICsxMzIsMTIgQEAgcHJpdmF0ZToKIC8vIEdldCB0aGUgZ2xvYmFsIGZv
bnRDYWNoZS4KIEZvbnRDYWNoZSogZm9udENhY2hlKCk7CiAKK2NsYXNzIEZvbnRDYWNoZVB1cmdl
UHJldmVudGVyIHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIo
KSB7IGZvbnRDYWNoZSgpLT5kaXNhYmxlUHVyZ2luZygpOyB9CisgICAgaW5saW5lIH5Gb250Q2Fj
aGVQdXJnZVByZXZlbnRlcigpIHsgZm9udENhY2hlKCktPmVuYWJsZVB1cmdpbmcoKTsgfQorfTsK
KwogfQogCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zv
bnRGYXN0UGF0aC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udEZhc3RQYXRoLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
Nyw2ICszNyw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5p
Y29kZTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAt
MjEwLDkgKzIxMSwxMSBAQCBHbHlwaERhdGEgRm9udDo6Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKFVD
CiAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBjaGFyYWN0ZXIsIHByb2JhYmx5IGJlY2F1c2Ug
dGhlIGZvbnQgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkIGNvcnJlY3RseS4KICAgICAgICAgICAg
IC8vIFNvIHdlIGp1c3QgYWx3YXlzIHNldCB0aGUgZ2x5cGggdG8gYmUgc2FtZSBhcyB0aGUgY2hh
cmFjdGVyLCBhbmQgbGV0IEdESSBzb2x2ZSBpdC4KICAgICAgICAgICAgIHBhZ2UtPnNldEdseXBo
RGF0YUZvckNoYXJhY3RlcihjLCBjLCBjaGFyYWN0ZXJGb250RGF0YSk7CisgICAgICAgICAgICBj
aGFyYWN0ZXJGb250RGF0YS0+c2V0TWF4R2x5cGhQYWdlVHJlZUxldmVsKG1heChjaGFyYWN0ZXJG
b250RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVsKCkpKTsKICAgICAg
ICAgICAgIHJldHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7CiAjZWxzZQogICAg
ICAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIGRhdGEuZ2x5cGgsIGRh
dGEuZm9udERhdGEpOworICAgICAgICAgICAgZGF0YS5mb250RGF0YS0+c2V0TWF4R2x5cGhQYWdl
VHJlZUxldmVsKG1heChkYXRhLmZvbnREYXRhLT5tYXhHbHlwaFBhZ2VUcmVlTGV2ZWwoKSwgbm9k
ZS0+bGV2ZWwoKSkpOwogI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRhdGE7CkBA
IC0yMjUsOSArMjI4LDExIEBAIEdseXBoRGF0YSBGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIo
VUMKICNpZiBPUyhXSU5DRSkKICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdXQgV0lOQ0UgR0RJ
IGhhbmRsaW5nIG5lYXIgc2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyIGFib3ZlLgogICAgICAgICBw
YWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgZGF0YS5mb250RGF0YSk7CisgICAg
ICAgIGRhdGEuZm9udERhdGEtPnNldE1heEdseXBoUGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250
RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVsKCkpKTsKICAgICAgICAg
cmV0dXJuIHBhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjKTsKICNlbHNlCiAgICAgICAgIHBh
Z2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3RlcihjLCBkYXRhLmdseXBoLCBkYXRhLmZvbnREYXRh
KTsKKyAgICAgICAgZGF0YS5mb250RGF0YS0+c2V0TWF4R2x5cGhQYWdlVHJlZUxldmVsKG1heChk
YXRhLmZvbnREYXRhLT5tYXhHbHlwaFBhZ2VUcmVlTGV2ZWwoKSwgbm9kZS0+bGV2ZWwoKSkpOwog
I2VuZGlmCiAgICAgfQogICAgIHJldHVybiBkYXRhOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlLmgJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEyMSw3ICsxMjEsMTcgQEAgcHVibGljOgogICAgICAgICBtZW1zZXQobV9nbHlwaHMsIDAsIHNp
emVvZihtX2dseXBocykpOwogICAgICAgICBtZW1zZXQobV9nbHlwaEZvbnREYXRhLCAwLCBzaXpl
b2YobV9nbHlwaEZvbnREYXRhKSk7CiAgICAgfQotICAgIAorCisgICAgdm9pZCBjbGVhckZvckZv
bnREYXRhKGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSkKKyAgICB7CisgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBpZiAobV9nbHlw
aEZvbnREYXRhW2ldID09IGZvbnREYXRhKSB7CisgICAgICAgICAgICAgICAgbV9nbHlwaHNbaV0g
PSAwOworICAgICAgICAgICAgICAgIG1fZ2x5cGhGb250RGF0YVtpXSA9IDA7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBHbHlwaFBhZ2VUcmVlTm9kZSogb3duZXIoKSBj
b25zdCB7IHJldHVybiBtX293bmVyOyB9CiAKICAgICAvLyBJbXBsZW1lbnRlZCBieSB0aGUgcGxh
dGZvcm0uCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VU
cmVlTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzc0LDEzICszNzQsMTMgQEAgdm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVGb250
RGF0YShjbwogICAgIGlmICghZm9udERhdGEpCiAgICAgICAgIHJldHVybjsKIAorICAgIC8vIFBy
dW5lIGZhbGwgYmFjayBjaGlsZCAoaWYgYW55KSBvZiB0aGlzIGZvbnQuCisgICAgaWYgKG1fc3lz
dGVtRmFsbGJhY2tDaGlsZCAmJiBtX3N5c3RlbUZhbGxiYWNrQ2hpbGQtPm1fcGFnZSkKKyAgICAg
ICAgbV9zeXN0ZW1GYWxsYmFja0NoaWxkLT5tX3BhZ2UtPmNsZWFyRm9yRm9udERhdGEoZm9udERh
dGEpOworCiAgICAgLy8gUHJ1bmUgYW55IGJyYW5jaCB0aGF0IGNvbnRhaW5zIHRoaXMgRm9udERh
dGEuCiAgICAgSGFzaE1hcDxjb25zdCBGb250RGF0YSosIEdseXBoUGFnZVRyZWVOb2RlKj46Oml0
ZXJhdG9yIGNoaWxkID0gbV9jaGlsZHJlbi5maW5kKGZvbnREYXRhKTsKLSAgICBpZiAoY2hpbGQg
PT0gbV9jaGlsZHJlbi5lbmQoKSkgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBsZXZlbC0x
IG5vZGUgZm9yIGZvbnREYXRhLCB0aGVuIHRoZXJlIGlzIG5vIGRlZXBlciBub2RlIGZvciBpdCBp
biB0aGlzIHRyZWUuCi0gICAgICAgIGlmICghbGV2ZWwpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgfSBlbHNlIHsKKyAgICBpZiAoY2hpbGQgIT0gbV9jaGlsZHJlbi5lbmQoKSkgewogICAgICAg
ICBHbHlwaFBhZ2VUcmVlTm9kZSogbm9kZSA9IGNoaWxkLT5zZWNvbmQ7CiAgICAgICAgIG1fY2hp
bGRyZW4ucmVtb3ZlKGZvbnREYXRhKTsKICAgICAgICAgdW5zaWduZWQgY3VzdG9tRm9udENvdW50
ID0gbm9kZS0+bV9jdXN0b21Gb250Q291bnQ7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJvbWl1bVdpbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlQ2hy
b21pdW1XaW4uY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTA2LDggKzUwNiwxMSBAQCBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpn
ZXRGb250CiAgICAgLy8gbGFzdCBmb250IGluIHRoZSBhcnJheSBjb3ZlcnMgdGhlIGNoYXJhY3Rl
ciwgfGl8IHdpbGwgYmUgbnVtRm9udHMuCiAgICAgLy8gU28sIHdlIGhhdmUgdG8gdXNlICc8PSIg
cmF0aGVyIHRoYW4gJzwnIHRvIHNlZSBpZiB3ZSBmb3VuZCBhIGZvbnQKICAgICAvLyBjb3Zlcmlu
ZyB0aGUgY2hhcmFjdGVyLgotICAgIGlmIChpIDw9IG51bUZvbnRzKSAKLSAgICAgICByZXR1cm4g
Z2V0Q2FjaGVkRm9udERhdGEoZGF0YSk7CisgICAgaWYgKGkgPD0gbnVtRm9udHMpIHsKKyAgICAg
ICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEoZGF0
YSk7CisgICAgICAgIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQoZm9udERhdGEpOworICAgICAg
ICByZXR1cm4gZm9udERhdGE7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiAKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlw
ZS9Gb250Q2FjaGVGcmVlVHlwZS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC04OSw3ICs4OSw5IEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2Fj
aGU6OmdldEZvbnQKICAgICBSZWZQdHI8RmNQYXR0ZXJuPiBmYWxsYmFja1BhdHRlcm4gPSBhZG9w
dFJlZihmaW5kQmVzdEZvbnRHaXZlbkZhbGxiYWNrcyhmb250RGF0YSwgcGF0dGVybi5nZXQoKSkp
OwogICAgIGlmIChmYWxsYmFja1BhdHRlcm4pIHsKICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBh
bHRlcm5hdGVGb250RGF0YShmYWxsYmFja1BhdHRlcm4uZ2V0KCksIGZvbnQuZm9udERlc2NyaXB0
aW9uKCkpOwotICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnRE
YXRhKTsKKyAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIHJlc3VsdCA9IGdldENhY2hlZEZv
bnREYXRhKCZhbHRlcm5hdGVGb250RGF0YSk7CisgICAgICAgIHJlbGVhc2VQdXJnZVByb3RlY3Rl
ZEZvbnQocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBGY1Jl
c3VsdCBmb250Q29uZmlnUmVzdWx0OwpAQCAtOTcsNyArOTksOSBAQCBjb25zdCBTaW1wbGVGb250
RGF0YSogRm9udENhY2hlOjpnZXRGb250CiAgICAgaWYgKCFyZXN1bHRQYXR0ZXJuKQogICAgICAg
ICByZXR1cm4gMDsKICAgICBGb250UGxhdGZvcm1EYXRhIGFsdGVybmF0ZUZvbnREYXRhKHJlc3Vs
dFBhdHRlcm4uZ2V0KCksIGZvbnQuZm9udERlc2NyaXB0aW9uKCkpOwotICAgIHJldHVybiBnZXRD
YWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udERhdGEpOworICAgIGNvbnN0IFNpbXBsZUZvbnRE
YXRhKiByZXN1bHQgPSBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udERhdGEpOworICAg
IHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0Owog
fQogCiBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0
YShjb25zdCBGb250JiBmb250KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvaGFpa3UvRm9udENhY2hlSGFpa3UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0ZvbnRDYWNoZUhhaWt1LmNwcAkocmV2aXNpb24gODgw
MTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9oYWlrdS9Gb250Q2FjaGVI
YWlrdS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDkgQEAgdm9pZCBGb250Q2FjaGU6
OnBsYXRmb3JtSW5pdCgpCiBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250
RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIqIGNoYXJhY3Rl
cnMsIGludCBsZW5ndGgpCiB7CiAgICAgRm9udFBsYXRmb3JtRGF0YSBkYXRhKGZvbnQuZm9udERl
c2NyaXB0aW9uKCksIGZvbnQuZmFtaWx5KCkuZmFtaWx5KCkpOwotICAgIHJldHVybiBnZXRDYWNo
ZWRGb250RGF0YSgmZGF0YSk7CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0g
Z2V0Q2FjaGVkRm9udERhdGEoJmRhdGEpOworICAgIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQo
Zm9udERhdGEpOworICAgIHJldHVybiBmb250RGF0YTsKIH0KIAogU2ltcGxlRm9udERhdGEqIEZv
bnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRD
YWNoZU1hYy5tbQkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9tYWMvRm9udENhY2hlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIsNyArMTUy
LDEwIEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICAgICAg
IWZvbnQuaXNQbGF0Zm9ybUZvbnQoKSAmJiBpc0FwcEtpdEZvbnRXZWlnaHRCb2xkKHdlaWdodCkg
JiYgIWlzQXBwS2l0Rm9udFdlaWdodEJvbGQoc3Vic3RpdHV0ZUZvbnRXZWlnaHQpLAogICAgICAg
ICAhZm9udC5pc1BsYXRmb3JtRm9udCgpICYmICh0cmFpdHMgJiBOU0ZvbnRJdGFsaWNUcmFpdCkg
JiYgIShzdWJzdGl0dXRlRm9udFRyYWl0cyAmIE5TRm9udEl0YWxpY1RyYWl0KSwKICAgICAgICAg
cGxhdGZvcm1EYXRhLm1fb3JpZW50YXRpb24pOwotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0
YSgmYWx0ZXJuYXRlRm9udCk7CisKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogcmVzdWx0ID0g
Z2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnQpOworICAgIHJlbGVhc2VQdXJnZVByb3Rl
Y3RlZEZvbnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBTaW1wbGVGb250RGF0
YSogRm9udENhY2hlOjpnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250JiBmb250
KQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0Zv
bnRDYWNoZVF0LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDcgKzgw
LDkgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmICgh
Y29tcHV0ZWRGb250LmlzVmFsaWQoKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgRm9udFBsYXRm
b3JtRGF0YSBhbHRlcm5hdGVGb250KGNvbXB1dGVkRm9udCk7Ci0gICAgcmV0dXJuIGdldENhY2hl
ZEZvbnREYXRhKCZhbHRlcm5hdGVGb250KTsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dERhdGEgPSBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisgICAgcmVsZWFzZVB1
cmdlUHJvdGVjdGVkRm9udChmb250RGF0YSk7CisgICAgcmV0dXJuIGZvbnREYXRhOwogI2Vsc2UK
ICAgICBRX1VOVVNFRChmb250KTsKICAgICBRX1VOVVNFRChjaGFyYWN0ZXJzKTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVXaW4uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVX
aW4uY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9Gb250Q2FjaGVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yODQsOCArMjg0LDEw
IEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnQKICAgICBpZiAoaGZv
bnQpIHsKICAgICAgICAgaWYgKCFmYW1pbHlOYW1lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAg
Rm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250
LmZvbnREZXNjcmlwdGlvbigpLCBmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQp
CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgZm9udERhdGEgPSBn
ZXRDYWNoZWRGb250RGF0YShyZXN1bHQpOworICAgICAgICAgICAgICAgIHJlbGVhc2VQdXJnZVBy
b3RlY3RlZEZvbnQoZm9udERhdGEpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAg
ICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250Q2FjaGVXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCShy
ZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0ZvbnRDYWNoZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzA4LDggKzMwOCwxMCBAQCBj
b25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250CiAKICAgICAgICAgRm9udFBs
YXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzY3Jp
cHRpb24sIGZhbWlseU5hbWUpOwogICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aGFzaCgp
ICE9IG9yaWdGb250Lmhhc2goKSkgewotICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBm
b250RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCisgICAgICAgICAgICBpZiAoU2lt
cGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEocmVzdWx0KSkgeworICAg
ICAgICAgICAgICAgIHJlbGVhc2VQdXJnZVByb3RlY3RlZEZvbnQoZm9udERhdGEpOwogICAgICAg
ICAgICAgICAgIHJldHVybiBmb250RGF0YTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAg
IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvRm9udENhY2hl
V3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4
L0ZvbnRDYWNoZVd4LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDgg
KzQ3LDkgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgICAg
ICBmb250RGF0YSA9IGdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGZvbnQpOwogICAgIGlmICgh
Zm9udERhdGEtPmNvbnRhaW5zQ2hhcmFjdGVycyhjaGFyYWN0ZXJzLCBsZW5ndGgpKQogICAgICAg
ICBmb250RGF0YSA9IGdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoZm9udC5mb250RGVzY3JpcHRp
b24oKSk7Ci0gICAgCisKICAgICBBU1NFUlQoZm9udERhdGEpOworICAgIHJlbGVhc2VQdXJnZVBy
b3RlY3RlZEZvbnQoZm9udERhdGEpOwogICAgIHJldHVybiBmb250RGF0YTsKIH0KIApJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmNwcAkocmV2aXNpb24gODgw
MTApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJEb2N1bWVudE1hcmtlckNvbnRy
b2xsZXIuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKICNpbmNsdWRlICJFbGxpcHNpc0JveC5oIgor
I2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgpAQCAtMTgwLDYgKzE4
MSw4IEBAIEludFJlY3QgSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdChpbnQKICAgICBpZiAo
c1BvcyA+IGVQb3MpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAKKyAgICBGb250Q2FjaGVQ
dXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFJlbmRlclRleHQq
IHRleHRPYmogPSB0ZXh0UmVuZGVyZXIoKTsKICAgICBpbnQgc2VsVG9wID0gc2VsZWN0aW9uVG9w
KCk7CiAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhlaWdodCgpOwpAQCAtMTIzMiw2ICsx
MjM1LDggQEAgaW50IElubGluZVRleHRCb3g6Om9mZnNldEZvclBvc2l0aW9uKGZsbwogICAgIGlm
IChsaW5lT2Zmc2V0IC0gbG9naWNhbExlZnQoKSA8IDApCiAgICAgICAgIHJldHVybiBsZWZ0T2Zm
c2V0OwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50
ZXI7CisKICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdG9SZW5kZXJUZXh0KHJlbmRlcmVyKCkpOwog
ICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHQtPnN0eWxlKG1fZmlyc3RMaW5lKTsKICAgICBj
b25zdCBGb250JiBmb250ID0gc3R5bGUtPmZvbnQoKTsKQEAgLTEyNDksNiArMTI1NCw4IEBAIGZs
b2F0IElubGluZVRleHRCb3g6OnBvc2l0aW9uRm9yT2Zmc2V0KGkKICAgICBpZiAoaXNMaW5lQnJl
YWsoKSkKICAgICAgICAgcmV0dXJuIGxvZ2ljYWxMZWZ0KCk7CiAKKyAgICBGb250Q2FjaGVQdXJn
ZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFJlbmRlclRleHQqIHRl
eHQgPSB0b1JlbmRlclRleHQocmVuZGVyZXIoKSk7CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxlVG9V
c2UgPSB0ZXh0LT5zdHlsZShtX2ZpcnN0TGluZSk7CiAgICAgQVNTRVJUKHN0eWxlVG9Vc2UpOwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwCShyZXZpc2lvbiA4
ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJSZW5kZXJJbWFnZS5oIgogCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRnJh
bWUuaCIKICNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgpAQCAtMTAyLDYgKzEwMyw4IEBAIGJvb2wgUmVuZGVySW1hZ2U6OnNldEltYWdlU2l6
ZUZvckFsdFRleHQKIAogICAgIC8vIHdlIGhhdmUgYW4gYWx0IGFuZCB0aGUgdXNlciBtZWFudCBp
dCAoaXRzIG5vdCBhIHRleHQgd2UgaW52ZW50ZWQpCiAgICAgaWYgKCFtX2FsdFRleHQuaXNFbXB0
eSgpKSB7CisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyOworCiAgICAgICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZSgpLT5mb250KCk7CiAg
ICAgICAgIEludFNpemUgdGV4dFNpemUobWluKGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0
cnVjdFRleHRSdW4odGhpcywgZm9udCwgbV9hbHRUZXh0LCBzdHlsZSgpKSksIG1heEFsdFRleHRX
aWR0aCksIG1pbihmb250LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCksIG1heEFsdFRleHRIZWlnaHQp
KTsKICAgICAgICAgaW1hZ2VTaXplID0gaW1hZ2VTaXplLmV4cGFuZGVkVG8odGV4dFNpemUpOwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94LmNwcAkocmV2aXNp
b24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEJveC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJFdmVudEhhbmRsZXIu
aCIKICNpbmNsdWRlICJFdmVudFF1ZXVlLmgiCiAjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgi
CisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJG
cmFtZVNlbGVjdGlvbi5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgpAQCAtOTgsNiArOTksOCBA
QCBSZW5kZXJMaXN0Qm94Ojp+UmVuZGVyTGlzdEJveCgpCiAKIHZvaWQgUmVuZGVyTGlzdEJveDo6
dXBkYXRlRnJvbUVsZW1lbnQoKQogeworICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRD
YWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgaWYgKG1fb3B0aW9uc0NoYW5nZWQpIHsKICAgICAg
ICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gdG9TZWxlY3RFbGVtZW50KHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKS0+bGlzdEl0ZW1zKCk7CiAgICAgICAgIGludCBz
aXplID0gbnVtSXRlbXMoKTsKQEAgLTM1OCw2ICszNjEsOCBAQCBzdGF0aWMgSW50U2l6ZSBpdGVt
T2Zmc2V0Rm9yQWxpZ25tZW50KFRlCiAKIHZvaWQgUmVuZGVyTGlzdEJveDo6cGFpbnRJdGVtRm9y
ZWdyb3VuZChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIGludCBsaXN0SW5k
ZXgpCiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50
ZXI7CisKICAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxp
c3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgRWxlbWVudCogZWxlbWVudCA9IGxp
c3RJdGVtc1tsaXN0SW5kZXhdOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9T
VkdJbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvc3ZnL1NWR0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI0LDYgKzI0LDcgQEAKIAogI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiRmxvYXRDb252
ZXJzaW9uLmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCiAjaW5jbHVkZSAiSW5saW5lRmxvd0JveC5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2Nr
LmgiCkBAIC05MCw2ICs5MSw4IEBAIEZsb2F0UmVjdCBTVkdJbmxpbmVUZXh0Qm94OjpzZWxlY3Rp
b25SZWMKICAgICBBU1NFUlQoc3RhcnRQb3NpdGlvbiA8IGVuZFBvc2l0aW9uKTsKICAgICBBU1NF
UlQoc3R5bGUpOwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQ
cmV2ZW50ZXI7CisKICAgICBSZW5kZXJTVkdJbmxpbmVUZXh0KiB0ZXh0UmVuZGVyZXIgPSB0b1Jl
bmRlclNWR0lubGluZVRleHQodGhpcy0+dGV4dFJlbmRlcmVyKCkpOwogICAgIEFTU0VSVCh0ZXh0
UmVuZGVyZXIpOwogCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYktpdC9tYWMvQ2hhbmdlTG9nCShyZXZpc2lvbiA4ODEzNikKKysrIFNv
dXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBA
CisyMDExLTA2LTA0ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVk
IGJ5IEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVh
c2VkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3
NQorCisgICAgICAgIFRoaXMgY2hhbmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVt
IGZhbGxiYWNrIGZvbnRzIHRvIGJlCisgICAgICAgIHJlbGVhc2VkLiAgUHJldmlvdXNseSwgdGhl
IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZXNlIGZvbnRzIGdyZXcKKyAgICAgICAgd2l0aG91dCBi
b3VuZC4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYW4gYXV0byByZWxlYXNlIGNsYXNzIHRoYXQg
d3JhcHMKKyAgICAgICAgYWNjZXNzZXMgdG8gdGhlIGNhY2hlIGZvciBzeXN0ZW0gZmFsbGJhY2sg
Zm9udHMuIEFsbCBzdWNoIGFjY2Vzc2VzIGFyZQorICAgICAgICB2aWEgdGhlIG1ldGhvZCBGb250
Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycy4gVGhlIG5ldyBjbGFzcyBpcworICAgICAg
ICBjYWxsZWQgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIuIFdoZW4gc3VjaCBhbiBvYmplY3QgZXhp
c3RzLCBpdCBwcm90ZWN0cworICAgICAgICB0aGVzZSBmb250cyBmcm9tIGRlbGV0aW9uLgorCisg
ICAgICAgIFNlZSBtb3JlIGNvbW1lbnRzIGZvciB0aGlzIGRlZmVjdCBpbiBTb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cuCisKKyAgICAgICAgKiBNaXNjL1dlYktpdE5TU3RyaW5nRXh0cmFzLm1tOgor
ICAgICAgICAoLVtOU1N0cmluZyBfd2ViX2RyYXdBdFBvaW50OmZvbnQ6dGV4dENvbG9yOmFsbG93
aW5nRm9udFNtb290aGluZzpdKToKKyAgICAgICAgKC1bTlNTdHJpbmcgX3dlYl93aWR0aFdpdGhG
b250Ol0pOgorICAgICAgICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZhbGxiYWNrIGZvbnRzIHdp
dGggbG9jYWwKKyAgICAgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgaW4gdGhlc2UgbWV0aG9k
cy4KKworICAgICAgICAqIE1pc2MvV2ViU3RyaW5nVHJ1bmNhdG9yLm1tOgorICAgICAgICAoK1tX
ZWJTdHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNhdGVTdHJpbmc6dG9XaWR0aDpdKToKKyAgICAg
ICAgKCtbV2ViU3RyaW5nVHJ1bmNhdG9yIGNlbnRlclRydW5jYXRlU3RyaW5nOnRvV2lkdGg6d2l0
aEZvbnQ6XSk6CisgICAgICAgICgrW1dlYlN0cmluZ1RydW5jYXRvciByaWdodFRydW5jYXRlU3Ry
aW5nOnRvV2lkdGg6d2l0aEZvbnQ6XSk6CisgICAgICAgICgrW1dlYlN0cmluZ1RydW5jYXRvciB3
aWR0aE9mU3RyaW5nOmZvbnQ6XSk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFs
bGJhY2sgZm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBp
biB0aGVzZSBtZXRob2RzLgorCiAyMDExLTA2LTAyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNj
YUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdlaW5pZy4KSW5kZXg6IFNv
dXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViS2l0TlNTdHJpbmdFeHRyYXMubW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJLaXROU1N0cmluZ0V4dHJhcy5tbQkocmV2aXNp
b24gODgwMTApCisrKyBTb3VyY2UvV2ViS2l0L21hYy9NaXNjL1dlYktpdE5TU3RyaW5nRXh0cmFz
Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW1wb3J0ICJXZWJLaXROU1N0
cmluZ0V4dHJhcy5oIgogCiAjaW1wb3J0IDxXZWJDb3JlL0ZvbnQuaD4KKyNpbXBvcnQgPFdlYkNv
cmUvRm9udENhY2hlLmg+CiAjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgogI2lt
cG9ydCA8V2ViQ29yZS9UZXh0UnVuLmg+CiAjaW1wb3J0IDxXZWJDb3JlL1dlYkNvcmVOU1N0cmlu
Z0V4dHJhcy5oPgpAQCAtODksNiArOTAsOCBAQCAtICh2b2lkKV93ZWJfZHJhd0F0UG9pbnQ6KE5T
UG9pbnQpcG9pbnQgCiAgICAgICAgIGlmICghZmxpcHBlZCkKICAgICAgICAgICAgIENHQ29udGV4
dFNjYWxlQ1RNKGNnQ29udGV4dCwgMSwgLTEpOwogCisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgICAgIEZvbnQgd2ViQ29yZUZv
bnQoRm9udFBsYXRmb3JtRGF0YShmb250LCBbZm9udCBwb2ludFNpemVdKSwgIVtuc0NvbnRleHQg
aXNEcmF3aW5nVG9TY3JlZW5dLCBmb250U21vb3RoaW5nSXNBbGxvd2VkID8gQXV0b1Ntb290aGlu
ZyA6IEFudGlhbGlhc2VkKTsKICAgICAgICAgVGV4dFJ1biBydW4oYnVmZmVyLmRhdGEoKSwgbGVu
Z3RoKTsKIApAQCAtMTM0LDYgKzEzNyw4IEBAIC0gKGZsb2F0KV93ZWJfd2lkdGhXaXRoRm9udDoo
TlNGb250ICopZm8KICAgICBbc2VsZiBnZXRDaGFyYWN0ZXJzOmJ1ZmZlci5kYXRhKCldOwogCiAg
ICAgaWYgKGNhblVzZUZhc3RSZW5kZXJlcihidWZmZXIuZGF0YSgpLCBsZW5ndGgpKSB7CisgICAg
ICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAg
ICAgICAgIEZvbnQgd2ViQ29yZUZvbnQoRm9udFBsYXRmb3JtRGF0YShmb250LCBbZm9udCBwb2lu
dFNpemVdKSwgIVtbTlNHcmFwaGljc0NvbnRleHQgY3VycmVudENvbnRleHRdIGlzRHJhd2luZ1Rv
U2NyZWVuXSk7CiAgICAgICAgIFRleHRSdW4gcnVuKGJ1ZmZlci5kYXRhKCksIGxlbmd0aCk7CiAg
ICAgICAgIHJldHVybiB3ZWJDb3JlRm9udC53aWR0aChydW4pOwpJbmRleDogU291cmNlL1dlYktp
dC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3IubW0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3IubW0JKHJldmlzaW9uIDg4MDEwKQorKysg
U291cmNlL1dlYktpdC9tYWMvTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3IubW0JKHdvcmtpbmcgY29w
eSkKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2ltcG9ydCAiV2ViU3lzdGVtSW50ZXJmYWNlLmgiCiAj
aW1wb3J0IDxXZWJDb3JlL0ZvbnQuaD4KKyNpbXBvcnQgPFdlYkNvcmUvRm9udENhY2hlLmg+CiAj
aW1wb3J0IDxXZWJDb3JlL0ZvbnRQbGF0Zm9ybURhdGEuaD4KICNpbXBvcnQgPFdlYkNvcmUvUGxh
dGZvcm1TdHJpbmcuaD4KICNpbXBvcnQgPFdlYkNvcmUvU3RyaW5nVHJ1bmNhdG9yLmg+CkBAIC03
MiwyMSArNzMsMjUgQEAgKyAodm9pZClpbml0aWFsaXplCiAKICsgKE5TU3RyaW5nICopY2VudGVy
VHJ1bmNhdGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1heFdpZHRo
CiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7
CiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNhdGUoc3RyaW5nLCBtYXhX
aWR0aCwgZm9udEZyb21OU0ZvbnQoZGVmYXVsdE1lbnVGb250KCkpKTsKIH0KIAogKyAoTlNTdHJp
bmcgKiljZW50ZXJUcnVuY2F0ZVN0cmluZzooTlNTdHJpbmcgKilzdHJpbmcgdG9XaWR0aDooZmxv
YXQpbWF4V2lkdGggd2l0aEZvbnQ6KE5TRm9udCAqKWZvbnQKIHsKKyAgICBGb250Q2FjaGVQdXJn
ZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKICAgICByZXR1cm4gU3RyaW5nVHJ1
bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShzdHJpbmcsIG1heFdpZHRoLCBmb250RnJvbU5TRm9udChm
b250KSk7CiB9CiAKICsgKE5TU3RyaW5nICopcmlnaHRUcnVuY2F0ZVN0cmluZzooTlNTdHJpbmcg
KilzdHJpbmcgdG9XaWR0aDooZmxvYXQpbWF4V2lkdGggd2l0aEZvbnQ6KE5TRm9udCAqKWZvbnQK
IHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsK
ICAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKHN0cmluZywgbWF4V2lk
dGgsIGZvbnRGcm9tTlNGb250KGZvbnQpKTsKIH0KIAogKyAoZmxvYXQpd2lkdGhPZlN0cmluZzoo
TlNTdHJpbmcgKilzdHJpbmcgZm9udDooTlNGb250ICopZm9udAogeworICAgIEZvbnRDYWNoZVB1
cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOwogICAgIHJldHVybiBTdHJpbmdU
cnVuY2F0b3I6OndpZHRoKHN0cmluZywgZm9udEZyb21OU0ZvbnQoZm9udCkpOwogfQogCkluZGV4
OiBTb3VyY2UvV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dC93aW4vQ2hhbmdlTG9nCShyZXZpc2lvbiA4ODEzNikKKysrIFNvdXJjZS9XZWJLaXQvd2luL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDExLTA2LTA1ICBNaWNo
YWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVkIGJ5IEZvbnRDYWNoZTo6Z2V0
Rm9udERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVhc2VkCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3NQorCisgICAgICAgIFRoaXMg
Y2hhbmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHRv
IGJlCisgICAgICAgIHJlbGVhc2VkLiAgUHJldmlvdXNseSwgdGhlIHJlZmVyZW5jZSBjb3VudHMg
Zm9yIHRoZXNlIGZvbnRzIGdyZXcKKyAgICAgICAgd2l0aG91dCBib3VuZC4gIFRoaXMgaXMgaW1w
bGVtZW50ZWQgYXMgYW4gYXV0byByZWxlYXNlIGNsYXNzIHRoYXQgd3JhcHMKKyAgICAgICAgYWNj
ZXNzZXMgdG8gdGhlIGNhY2hlIGZvciBzeXN0ZW0gZmFsbGJhY2sgZm9udHMuIEFsbCBzdWNoIGFj
Y2Vzc2VzIGFyZQorICAgICAgICB2aWEgdGhlIG1ldGhvZCBGb250Q2FjaGU6OmdldEZvbnREYXRh
Rm9yQ2hhcmFjdGVycy4gVGhlIG5ldyBjbGFzcyBpcworICAgICAgICBjYWxsZWQgRm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXIuIFdoZW4gc3VjaCBhbiBvYmplY3QgZXhpc3RzLCBpdCBwcm90ZWN0cwor
ICAgICAgICB0aGVzZSBmb250cyBmcm9tIGRlbGV0aW9uLgorCisgICAgICAgIFNlZSBtb3JlIGNv
bW1lbnRzIGZvciB0aGlzIGRlZmVjdCBpbiBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cuCisKKyAg
ICAgICAgKiBXZWJLaXRHcmFwaGljcy5jcHA6CisgICAgICAgIChDZW50ZXJUcnVuY2F0ZVN0cmlu
Z1RvV2lkdGgpOgorICAgICAgICAoUmlnaHRUcnVuY2F0ZVN0cmluZ1RvV2lkdGgpOgorICAgICAg
ICBXcmFwcGVkIGNvZGUgYWNjZXNzaW5nIGZhbGxiYWNrIGZvbnRzIHdpdGggbG9jYWwKKyAgICAg
ICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgaW4gdGhlc2UgbWV0aG9kcy4KKwogMjAxMS0wNS0x
OCAgQW50aG9ueSBKb2huc29uIDxhbnRob255LmpvaG5zb25AZmxleHNpbS5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgQnJlbnQgRnVsZ2hhbS4KSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luL1dl
YktpdEdyYXBoaWNzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L3dpbi9XZWJLaXRH
cmFwaGljcy5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYktpdC93aW4vV2ViS2l0
R3JhcGhpY3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAi
V2ViUHJlZmVyZW5jZXMuaCIKIAogI2luY2x1ZGUgPFdlYkNvcmUvRm9udC5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvRm9udENhY2hlLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Gb250RGVzY3JpcHRpb24u
aD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZvbnRTZWxlY3Rvci5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
R3JhcGhpY3NDb250ZXh0Lmg+CkBAIC0xNDcsNiArMTQ4LDggQEAgdW5zaWduZWQgQ2VudGVyVHJ1
bmNhdGVTdHJpbmdUb1dpZHRoKExQQwogewogICAgIEFTU0VSVChidWZmZXIpOwogCisgICAgRm9u
dENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICBTdHJp
bmcgcmVzdWx0ID0gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShTdHJpbmcodGV4dCwg
bGVuZ3RoKSwgd2lkdGgsIG1ha2VGb250KGRlc2NyaXB0aW9uKSk7CiAgICAgbWVtY3B5KGJ1ZmZl
ciwgcmVzdWx0LmNoYXJhY3RlcnMoKSwgcmVzdWx0Lmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSk7
CiAgICAgYnVmZmVyW3Jlc3VsdC5sZW5ndGgoKV0gPSAnXDAnOwpAQCAtMTU3LDYgKzE2MCw4IEBA
IHVuc2lnbmVkIFJpZ2h0VHJ1bmNhdGVTdHJpbmdUb1dpZHRoKExQQ1QKIHsKICAgICBBU1NFUlQo
YnVmZmVyKTsKIAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJl
dmVudGVyOworCiAgICAgU3RyaW5nIHJlc3VsdCA9IFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVu
Y2F0ZShTdHJpbmcodGV4dCwgbGVuZ3RoKSwgd2lkdGgsIG1ha2VGb250KGRlc2NyaXB0aW9uKSk7
CiAgICAgbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LmNoYXJhY3RlcnMoKSwgcmVzdWx0Lmxlbmd0aCgp
ICogc2l6ZW9mKFVDaGFyKSk7CiAgICAgYnVmZmVyW3Jlc3VsdC5sZW5ndGgoKV0gPSAnXDAnOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>96254</attachid>
            <date>2011-06-07 10:15:03 -0700</date>
            <delta_ts>2011-06-07 12:14:09 -0700</delta_ts>
            <desc>Patch with updates in response to comment #20</desc>
            <filename>61875-8.patch</filename>
            <type>text/plain</type>
            <size>37121</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg4MjQ0KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTI2IEBACisyMDExLTA2LTA3ICBNaWNoYWVs
IFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEZvbnRzIHJldHVybmVkIGJ5IEZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKCkgYXJlIG5ldmVyIHJlbGVhc2VkCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02MTg3NQorCisgICAgICAgIFRoaXMgY2hh
bmdlIGFsbG93cyBmb250cyBhbGxvY2F0ZWQgYXMgc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHRvIGJl
IAorICAgICAgICByZWxlYXNlZC4gIFByZXZpb3VzbHksIHRoZSByZWZlcmVuY2UgY291bnRzIGZv
ciB0aGVzZSBmb250cyBncmV3IAorICAgICAgICB3aXRob3V0IGJvdW5kLiAgVGhpcyBpcyBpbXBs
ZW1lbnRlZCBhcyBhbiBhdXRvIHJlbGVhc2UgY2xhc3MgdGhhdCB3cmFwcworICAgICAgICBhY2Nl
c3NlcyB0byB0aGUgY2FjaGUgZm9yIHN5c3RlbSBmYWxsYmFjayBmb250cy4gQWxsIHN1Y2ggYWNj
ZXNzZXMgYXJlCisgICAgICAgIHZpYSB0aGUgbWV0aG9kIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFG
b3JDaGFyYWN0ZXJzLiBUaGUgbmV3IGNsYXNzIGlzCisgICAgICAgIGNhbGxlZCBGb250Q2FjaGVQ
dXJnZVByZXZlbnRlci4gV2hlbiBzdWNoIGFuIG9iamVjdCBleGlzdHMsIGl0IHByb3RlY3RzCisg
ICAgICAgIHRoZXNlIGZvbnRzIGZyb20gZGVsZXRpb24uCisKKyAgICAgICAgTW9zdCBhY2Nlc3Nl
cyB0byB0aGUgZm9udCBjYWNoZSBzdGlsbCB1c2UgdGhlIHJlZmVyZW5jZSBjb3VudGluZworICAg
ICAgICBpbXBsZW1lbnRlZCBieSBGb250Q2FjaGU6OmdldENhY2hlRm9udERhdGEoKSBhbmQgCisg
ICAgICAgIEZvbnRDYWNoZTo6cmVsZWFzZUZvbnREYXRhKCkgYW5kIHRoYXQgb3BlcmF0aW9uIGlz
IG5vdCBhZmZlY3RlZCBieQorICAgICAgICB0aGlzIGNoYW5nZS4KKworICAgICAgICBBZGRlZCBs
b2NhbCBzY29wZWQgaW5zdGFuY2Ugb2YgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgdG8gd3JhcCBj
b2RlCisgICAgICAgIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBhY2Nlc3NlcyBmb250cyB2
aWEgZ2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzLgorICAgICAgICBEaWQgYSBmZXcgb3RoZXIgbWlz
Y2VsbGFuZW91cyBidWcgZml4ZXMgYW5kIGNoYW5nZXMgdG8gYWxsb3cgc3lzdGVtCisgICAgICAg
IGZhbGxiYWNrIGZvbnRzIHRvIGJlIHBydW5lZCBmcm9tIHRoZSBHbHlwaFBhZ2VUcmVlLiBDaGFu
Z2VkIHRoZQorICAgICAgICBjYWxscyB0byBnZXRGb250RGF0YSBpbiB0aGUgcGxhdGZvcm0gc3Bl
Y2lmaWMgdmVyc2lvbnMgb2YKKyAgICAgICAgRm9udGNhY2hlOjpnZXRGb250RGF0YUZvckNoYXJh
Y3RlcnMgdG8gbm90IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlCisgICAgICAgIGNvdW50LiAgTW92
ZWQgdGhlIHB1cmdlIGZvbnQgY2hlY2sKKyAgICAgICAgb3V0c2lkZSBvZiBGb250Q2FjaGU6Omdl
dENhY2hlZEZvbnREYXRhKCkgaW50byBhIHNlcGFyYXRlIG1ldGhvZCwgCisgICAgICAgIHB1cmdl
SW5hY3RpdmVGb250RGF0YUlmTmVlZGVkKCkgc2luY2UgYWxtb3N0IGFsbCBjYWxscyB0byAKKyAg
ICAgICAgZ2V0Q2FjaGVkRm9udERhdGEoKSBub3cgaGFwcGVuIHdoZW4gcHVyZ2luZyBpcyBub3Qg
YWxsb3dlZC4KKyAgICAgICAgcHVyZ2VJbmFjdGl2ZUZvbnREYXRhSWZOZWVkZWQgaXMgaW52b2tl
ZCBpbiBlbmFibGVQdXJnaW5nKCkgd2hlbgorICAgICAgICBtX3B1cmdlUHJldmVudENvdW50IGlz
IDAuCisKKyAgICAgICAgTm8gbmV3IHRlc3QgYXMgdGhlIGZ1bmN0aW9uYWxpdHkgaGFzIG5vdCBj
aGFuZ2VkLiBJbXByb3ZlZCBmb250IGxpZmUKKyAgICAgICAgY3ljbGUgbWFuYWdlbWVudC4KKwor
ICAgICAgICAqIFdlYkNvcmUuZXhwLmluOiBBZGRlZCBGb250Q2FjaGU6OnB1cmdlSW5hY3RpdmVG
b250RGF0YUlmTmVlZGVkKCkuCisgICAgICAgICogaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJELmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RDo6bWVhc3VyZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzUmVuZGVyaW5nQ29udGV4
dDJEOjpkcmF3VGV4dEludGVybmFsKToKKyAgICAgICAgV3JhcHBlZCBjb2RlIGFjY2Vzc2luZyBm
YWxsYmFjayBmb250cyB3aXRoIGxvY2FsIAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRl
ciBpbiB0aGVzZSBtZXRob2RzLgorCisgICAgICAgICogcGFnZS9GcmFtZVZpZXcuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6RnJhbWVWaWV3OjpsYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6RnJh
bWVWaWV3OjpwYWludENvbnRlbnRzKToKKyAgICAgICAgV3JhcHBlZCBjb2RlIGFjY2Vzc2luZyBm
YWxsYmFjayBmb250cyB3aXRoIGxvY2FsIAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRl
ciBpbiB0aGVzZSBtZXRob2RzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENh
Y2hlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Rm9udENhY2hlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Q2FjaGVkRm9udERhdGEpOgorICAgICAgICBNb3Zl
ZCBwdXJnZSBjaGVjayB0byBuZXcgbWV0aG9kIHNpbmNlIGl0IGxpa2VseSBjYW4ndCBoYXBwZW4g
aGVyZQorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpyZWxlYXNlRm9udERhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnB1cmdlSW5hY3RpdmVGb250RGF0YSk6Cisg
ICAgICAgIE1hZGUgcHVyZ2luZyBjb25kaXRpb25hbCBvbiBtX3B1cmdlUHJldmVudENvdW50LiAg
Tm93IHNvbWUgZm9udHMKKyAgICAgICAgaW4gdGhlIGNhY2hlIGFyZSByZWZlcmVuY2UgY291bnRl
ZCB3aGlsZSBvdGhlciBjYW4gYmUgcHVyZ2VkIAorICAgICAgICBvdXRzaWRlIG9mIGNvZGUgd3Jh
cHBlZCBieSBpbiBzY29wZSBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBvYmplY3RzLgorCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmg6CisgICAgICAgIChXZWJDb3JlOjpG
b250Q2FjaGU6OmRpc2FibGVQdXJnaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6
ZW5hYmxlUHVyZ2luZyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGVQdXJnZVByZXZlbnRl
cjo6Rm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hl
UHVyZ2VQcmV2ZW50ZXI6On5Gb250Q2FjaGVQdXJnZVByZXZlbnRlcik6CisgICAgICAgIEFkZGVk
IG5ldyBzaW1wbGUgcHVyZ2UgcHJldmVudGlvbiB3cmFwcGVyIGNsYXNzIGFuZCBtZXRob2RzCisg
ICAgICAgIHRoYXQgaXQgY2FsbHMgaW4gRm9udENhY2hlIGFjdHVhbGx5IHByZXZlbnQgcHVyZ2lu
Zy4gIFRoZQorICAgICAgICBzaW1wbGUgbWV0aG9kcyBpbmxpbmVkIHRvIHJlZHVjZSBvdmVyaGVh
ZC4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIpOiBVcGRhdGUgbGV2ZWwg
aW4gCisgICAgICAgIGdseXBoIHBhZ2UgdHJlZSBmb3Igc3lzdGVtIGZhbGxiYWNrIGZvbnRzIHNv
IHBydW5pbmcgd29ya3MuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2Uu
aDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZTo6Y2xlYXJGb3JGb250RGF0YSk6IE5ldyBt
ZXRob2QgdXNlZCBmb3IgcHJ1bmluZworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBo
UGFnZVRyZWVOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoUGFnZVRyZWVOb2RlOjpw
cnVuZUZvbnREYXRhKToKKyAgICAgICAgTm93IHdlIHBydW5lIHN5c3RlbSBmYWxsYmFjayBmb250
cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9t
aXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JD
aGFyYWN0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9mcmVldHlwZS9Gb250Q2Fj
aGVGcmVlVHlwZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRh
Rm9yQ2hhcmFjdGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvaGFpa3UvRm9udENh
Y2hlSGFpa3UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZv
ckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVN
YWMubW06CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFj
dGVycyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2FjaGVXaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6CisgICAgICAgIENoYW5nZWQg
dGhlIGNhbGxzIHRvIGdldEZvbnREYXRhKCkgdG8gbm90IGluY3JlbWVudCB0aGUgcmVmZXJlbmNl
CisgICAgICAgIGNvdW50LiBUaGUgY2FsbGVyIG9mIHRoaXMgZ2V0Rm9udERhdGFGb3JDaGFyYWN0
ZXJzKCkgKGN1cnJlbnRseSBvbmx5CisgICAgICAgIEZvbnQ6OmdseXBoRGF0YUZvckNoYXJhY3Rl
cigpIGluIGZvbnRGYXN0UGF0aC5jcHApIGFuZCBpdCdzIGNhbGxlcnMKKyAgICAgICAgZG9uJ3Qg
YXR0ZW1wdCB0byByZWxlYXNlIHRoZSByZXR1cm5lZCBmb250cyBzbyB3ZSB1c2UgdGhlIHB1cmdl
CisgICAgICAgIHByb3RlY3Rpb24gZGVzY3JpYmVkIGFib3ZlLgorCisgICAgICAgICogcmVuZGVy
aW5nL0lubGluZVRleHRCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6
c2VsZWN0aW9uUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpvZmZzZXRG
b3JQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkZv
ck9mZnNldCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJhY2sgZm9udHMg
d2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0aGVzZSBtZXRo
b2RzLgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0KToKKyAgICAgICAgV3Jh
cHBlZCBjb2RlIGFjY2Vzc2luZyBmYWxsYmFjayBmb250cyB3aXRoIGxvY2FsCisgICAgICAgIEZv
bnRDYWNoZVB1cmdlUHJldmVudGVyIGluIHRoaXMgbWV0aG9kLgorCisgICAgICAgICogcmVuZGVy
aW5nL1JlbmRlckxpc3RCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6
dXBkYXRlRnJvbUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6cGFp
bnRJdGVtRm9yZWdyb3VuZCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJh
Y2sgZm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0
aGVzZSBtZXRob2RzCisKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdEZv
clRleHRGcmFnbWVudCk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3NpbmcgZmFsbGJhY2sg
Zm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBpbiB0aGlz
IG1ldGhvZC4KKwogMjAxMS0wNi0wNyAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGln
YWxpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJvYmluc29uLgpJbmRleDog
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5leHAuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5leHAuaW4JKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS5leHAuaW4JKHdvcmtpbmcgY29weSkKQEAgLTkyMiw2ICs5MjIsNyBAQCBfX1pON1dlYkNv
cmU5RmxvYXRTaXplQzFFUktOU183SW50U2l6ZUUKIF9fWk43V2ViQ29yZTlGb250Q2FjaGUxM2Zv
bnREYXRhQ291bnRFdgogX19aTjdXZWJDb3JlOUZvbnRDYWNoZTIxaW5hY3RpdmVGb250RGF0YUNv
dW50RXYKIF9fWk43V2ViQ29yZTlGb250Q2FjaGUyMXB1cmdlSW5hY3RpdmVGb250RGF0YUVpCitf
X1pON1dlYkNvcmU5Rm9udENhY2hlMjlwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZEV2CiBf
X1pON1dlYkNvcmU5RnJhbWVUcmVlMTFhcHBlbmRDaGlsZEVOM1dURjEwUGFzc1JlZlB0cklOU181
RnJhbWVFRUUKIF9fWk43V2ViQ29yZTlGcmFtZVRyZWU3c2V0TmFtZUVSS04zV1RGMTJBdG9taWNT
dHJpbmdFCiBfX1pON1dlYkNvcmU5RnJhbWVUcmVlOWNsZWFyTmFtZUV2CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RC5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvQ2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDMsNiArNDMsNyBA
QAogI2luY2x1ZGUgIkNhbnZhc1N0eWxlLmgiCiAjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgog
I2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiSFRNTEltYWdlRWxlbWVudC5oIgpAQCAtMTg3NCw2ICsxODc1LDggQEAgdm9p
ZCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OnN0cm9rZVRleAogCiBQYXNzUmVmUHRyPFRleHRN
ZXRyaWNzPiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6Om1lYXN1cmVUZXh0KGNvbnN0IFN0cmlu
ZyYgdGV4dCkKIHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVBy
ZXZlbnRlcjsKKwogICAgIFJlZlB0cjxUZXh0TWV0cmljcz4gbWV0cmljcyA9IFRleHRNZXRyaWNz
OjpjcmVhdGUoKTsKIAogI2lmIFBMQVRGT1JNKFFUKQpAQCAtMTkwMSw2ICsxOTA0LDggQEAgdm9p
ZCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OmRyYXdUZXh0SQogICAgIGlmICghaXNmaW5pdGUo
eCkgfCAhaXNmaW5pdGUoeSkpCiAgICAgICAgIHJldHVybjsKIAorICAgIEZvbnRDYWNoZVB1cmdl
UHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgY29uc3QgRm9udCYgZm9u
dCA9IGFjY2Vzc0ZvbnQoKTsKICAgICBjb25zdCBGb250TWV0cmljcyYgZm9udE1ldHJpY3MgPSBm
b250LmZvbnRNZXRyaWNzKCk7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWVWaWV3
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHJl
dmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCiAj
aW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZUFj
dGlvblNjaGVkdWxlci5oIgogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC04OTYsNiArODk3
LDggQEAgdm9pZCBGcmFtZVZpZXc6OmxheW91dChib29sIGFsbG93U3VidHJlZQogICAgICAgICBy
ZXR1cm47CiAgICAgfQogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVy
Z2VQcmV2ZW50ZXI7CisKICAgICBtX25lc3RlZExheW91dENvdW50Kys7CiAKICAgICBpZiAoIW1f
bGF5b3V0Um9vdCkgewpAQCAtMjQyMyw2ICsyNDI2LDggQEAgdm9pZCBGcmFtZVZpZXc6OnBhaW50
Q29udGVudHMoR3JhcGhpY3NDbwogICAgIGlmIChuZWVkc0xheW91dCgpKQogICAgICAgICByZXR1
cm47CiAKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRl
cjsKKwogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKICAgICBpZiAoIXAtPnBhaW50
aW5nRGlzYWJsZWQoKSkKICAgICAgICAgc3luY0NvbXBvc2l0aW5nU3RhdGVGb3JUaGlzRnJhbWUo
KTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hl
LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Gb250Q2FjaGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVk
ZSAiRm9udEZhbGxiYWNrTGlzdC5oIgogI2luY2x1ZGUgIkZvbnRQbGF0Zm9ybURhdGEuaCIKICNp
bmNsdWRlICJGb250U2VsZWN0b3IuaCIKKyNpbmNsdWRlICJHbHlwaFBhZ2VUcmVlTm9kZS5oIgog
I2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+CiAj
aW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgpAQCAtNTAsNiArNTEsNyBAQCBGb250Q2FjaGUq
IGZvbnRDYWNoZSgpCiB9CiAKIEZvbnRDYWNoZTo6Rm9udENhY2hlKCkKKyAgICA6IG1fcHVyZ2VQ
cmV2ZW50Q291bnQoMCkKIHsKIH0KIApAQCAtMjQ5LDQwICsyNTEsNTYgQEAgdHlwZWRlZiBIYXNo
TWFwPEZvbnRQbGF0Zm9ybURhdGEsIHBhaXI8UwogCiBzdGF0aWMgRm9udERhdGFDYWNoZSogZ0Zv
bnREYXRhQ2FjaGUgPSAwOwogCi1jb25zdCBpbnQgY01heEluYWN0aXZlRm9udERhdGEgPSAxMjA7
ICAvLyBQcmV0dHkgTG93IFRocmVzaG9sZAotY29uc3QgaW50IGNUYXJnZXRJbmFjdGl2ZUZvbnRE
YXRhID0gMTAwOworY29uc3QgaW50IGNNYXhJbmFjdGl2ZUZvbnREYXRhID0gNTA7IC8vIFByZXR0
eSBMb3cgVGhyZXNob2xkCitjb25zdCBpbnQgY1RhcmdldEluYWN0aXZlRm9udERhdGEgPSAzMDsK
IHN0YXRpYyBMaXN0SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBnSW5hY3RpdmVGb250
RGF0YSA9IDA7CiAKLVNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldENhY2hlZEZvbnREYXRh
KGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBjb25zdCBBdG9taWNTdHJp
bmcmIGZhbWlseSwgYm9vbCBjaGVja2luZ0FsdGVybmF0ZU5hbWUpCitTaW1wbGVGb250RGF0YSog
Rm9udENhY2hlOjpnZXRDYWNoZWRGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnRE
ZXNjcmlwdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHksIGJvb2wgY2hlY2tpbmdBbHRl
cm5hdGVOYW1lLCBib29sIHNob3VsZFJldGFpbikKIHsKICAgICBGb250UGxhdGZvcm1EYXRhKiBw
bGF0Zm9ybURhdGEgPSBnZXRDYWNoZWRGb250UGxhdGZvcm1EYXRhKGZvbnREZXNjcmlwdGlvbiwg
ZmFtaWx5LCBjaGVja2luZ0FsdGVybmF0ZU5hbWUpOwogICAgIGlmICghcGxhdGZvcm1EYXRhKQog
ICAgICAgICByZXR1cm4gMDsKIAotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShwbGF0Zm9y
bURhdGEpOworICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShwbGF0Zm9ybURhdGEsIHNob3Vs
ZFJldGFpbik7CiB9CiAKLVNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldENhY2hlZEZvbnRE
YXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqIHBsYXRmb3JtRGF0YSkKK1NpbXBsZUZvbnREYXRh
KiBGb250Q2FjaGU6OmdldENhY2hlZEZvbnREYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqIHBs
YXRmb3JtRGF0YSwgYm9vbCBzaG91bGRSZXRhaW4pCiB7CiAgICAgaWYgKCFwbGF0Zm9ybURhdGEp
CiAgICAgICAgIHJldHVybiAwOwogCisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgIGlmICghc2hv
dWxkUmV0YWluKQorICAgICAgICBBU1NFUlQobV9wdXJnZVByZXZlbnRDb3VudCk7CisjZW5kaWYK
KwogICAgIGlmICghZ0ZvbnREYXRhQ2FjaGUpIHsKICAgICAgICAgZ0ZvbnREYXRhQ2FjaGUgPSBu
ZXcgRm9udERhdGFDYWNoZTsKICAgICAgICAgZ0luYWN0aXZlRm9udERhdGEgPSBuZXcgTGlzdEhh
c2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPjsKICAgICB9Ci0gICAgCisKICAgICBGb250RGF0
YUNhY2hlOjppdGVyYXRvciByZXN1bHQgPSBnRm9udERhdGFDYWNoZS0+ZmluZCgqcGxhdGZvcm1E
YXRhKTsKICAgICBpZiAocmVzdWx0ID09IGdGb250RGF0YUNhY2hlLT5lbmQoKSkgewotICAgICAg
ICBwYWlyPFNpbXBsZUZvbnREYXRhKiwgdW5zaWduZWQ+IG5ld1ZhbHVlKG5ldyBTaW1wbGVGb250
RGF0YSgqcGxhdGZvcm1EYXRhKSwgMSk7CisgICAgICAgIHBhaXI8U2ltcGxlRm9udERhdGEqLCB1
bnNpZ25lZD4gbmV3VmFsdWUobmV3IFNpbXBsZUZvbnREYXRhKCpwbGF0Zm9ybURhdGEpLCBzaG91
bGRSZXRhaW4gPyAxIDogMCk7CiAgICAgICAgIGdGb250RGF0YUNhY2hlLT5zZXQoKnBsYXRmb3Jt
RGF0YSwgbmV3VmFsdWUpOworICAgICAgICBpZiAoIXNob3VsZFJldGFpbikKKyAgICAgICAgICAg
IGdJbmFjdGl2ZUZvbnREYXRhLT5hZGQobmV3VmFsdWUuZmlyc3QpOwogICAgICAgICByZXR1cm4g
bmV3VmFsdWUuZmlyc3Q7CiAgICAgfQotICAgIGlmICghcmVzdWx0LmdldCgpLT5zZWNvbmQuc2Vj
b25kKyspIHsKKworICAgIGlmICghcmVzdWx0LmdldCgpLT5zZWNvbmQuc2Vjb25kKSB7CiAgICAg
ICAgIEFTU0VSVChnSW5hY3RpdmVGb250RGF0YS0+Y29udGFpbnMocmVzdWx0LmdldCgpLT5zZWNv
bmQuZmlyc3QpKTsKICAgICAgICAgZ0luYWN0aXZlRm9udERhdGEtPnJlbW92ZShyZXN1bHQuZ2V0
KCktPnNlY29uZC5maXJzdCk7CiAgICAgfQogCisgICAgaWYgKHNob3VsZFJldGFpbikKKyAgICAg
ICAgcmVzdWx0LmdldCgpLT5zZWNvbmQuc2Vjb25kKys7CisgICAgZWxzZSBpZiAoIXJlc3VsdC5n
ZXQoKS0+c2Vjb25kLnNlY29uZCkgeworICAgICAgICAvLyBJZiBzaG91bGRSZXRhaW4gaXMgZmFs
c2UgYW5kIGNvdW50IGlzIDAsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBmb250RGF0YSBmcm9tIAor
ICAgICAgICAvLyBnSW5hY3RpdmVGb250RGF0YSAoYWJvdmUpIGFuZCByZS1hZGQgaGVyZSB0byB1
cGRhdGUgTFJVIHBvc2l0aW9uLgorICAgICAgICBnSW5hY3RpdmVGb250RGF0YS0+YWRkKHJlc3Vs
dC5nZXQoKS0+c2Vjb25kLmZpcnN0KTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzdWx0LmdldCgp
LT5zZWNvbmQuZmlyc3Q7CiB9CiAKQEAgLTI5NCwxNiArMzEyLDIwIEBAIHZvaWQgRm9udENhY2hl
OjpyZWxlYXNlRm9udERhdGEoY29uc3QgU2kKICAgICBGb250RGF0YUNhY2hlOjppdGVyYXRvciBp
dCA9IGdGb250RGF0YUNhY2hlLT5maW5kKGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKSk7CiAgICAg
QVNTRVJUKGl0ICE9IGdGb250RGF0YUNhY2hlLT5lbmQoKSk7CiAKLSAgICBpZiAoIS0taXQtPnNl
Y29uZC5zZWNvbmQpIHsKKyAgICBBU1NFUlQoaXQtPnNlY29uZC5zZWNvbmQpOworICAgIGlmICgh
LS1pdC0+c2Vjb25kLnNlY29uZCkKICAgICAgICAgZ0luYWN0aXZlRm9udERhdGEtPmFkZChmb250
RGF0YSk7Ci0gICAgICAgIGlmIChnSW5hY3RpdmVGb250RGF0YS0+c2l6ZSgpID4gY01heEluYWN0
aXZlRm9udERhdGEpCi0gICAgICAgICAgICBwdXJnZUluYWN0aXZlRm9udERhdGEoZ0luYWN0aXZl
Rm9udERhdGEtPnNpemUoKSAtIGNUYXJnZXRJbmFjdGl2ZUZvbnREYXRhKTsKLSAgICB9Cit9CisK
K3ZvaWQgRm9udENhY2hlOjpwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZCgpCit7CisgICAg
aWYgKGdJbmFjdGl2ZUZvbnREYXRhICYmICFtX3B1cmdlUHJldmVudENvdW50ICYmIGdJbmFjdGl2
ZUZvbnREYXRhLT5zaXplKCkgPiBjTWF4SW5hY3RpdmVGb250RGF0YSkKKyAgICAgICAgcHVyZ2VJ
bmFjdGl2ZUZvbnREYXRhKGdJbmFjdGl2ZUZvbnREYXRhLT5zaXplKCkgLSBjVGFyZ2V0SW5hY3Rp
dmVGb250RGF0YSk7CiB9CiAKIHZvaWQgRm9udENhY2hlOjpwdXJnZUluYWN0aXZlRm9udERhdGEo
aW50IGNvdW50KQogewotICAgIGlmICghZ0luYWN0aXZlRm9udERhdGEpCisgICAgaWYgKCFnSW5h
Y3RpdmVGb250RGF0YSB8fCBtX3B1cmdlUHJldmVudENvdW50KQogICAgICAgICByZXR1cm47CiAK
ICAgICBzdGF0aWMgYm9vbCBpc1B1cmdpbmc7ICAvLyBHdWFyZCBhZ2FpbnN0IHJlZW50cnkgd2hl
biBlLmcuIGEgZGVsZXRlZCBGb250RGF0YSByZWxlYXNlcyBpdHMgc21hbGwgY2FwcyBGb250RGF0
YS4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5o
CShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zv
bnRDYWNoZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01MSwxNyArNTEsMTggQEAgY2xhc3MgRm9udFNl
bGVjdG9yOwogY2xhc3MgU2ltcGxlRm9udERhdGE7CiAKIGNsYXNzIEZvbnRDYWNoZSB7CisgICAg
ZnJpZW5kIGNsYXNzIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoRm9udENhY2hlKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CiBwdWJsaWM6CiAg
ICAgZnJpZW5kIEZvbnRDYWNoZSogZm9udENhY2hlKCk7CiAKICAgICBjb25zdCBGb250RGF0YSog
Z2V0Rm9udERhdGEoY29uc3QgRm9udCYsIGludCYgZmFtaWx5SW5kZXgsIEZvbnRTZWxlY3Rvciop
OwogICAgIHZvaWQgcmVsZWFzZUZvbnREYXRhKGNvbnN0IFNpbXBsZUZvbnREYXRhKik7Ci0gICAg
CisKICAgICAvLyBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uCi0g
ICAgLy8gRklYTUU6IEZvbnQgZGF0YSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBuZXZlciBnbyBp
bmFjdGl2ZSBiZWNhdXNlIGNhbGxlcnMgZG9uJ3QgdHJhY2sgYW5kIHJlbGVhc2UgdGhlbS4KICAg
ICBjb25zdCBTaW1wbGVGb250RGF0YSogZ2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZv
bnQmLCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCk7Ci0gICAgCisKICAgICAv
LyBBbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBwbGF0Zm9ybS4KICAgICB2b2lkIHBsYXRmb3JtSW5p
dCgpOwogCkBAIC04MCw3ICs4MSw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgZ2V0VHJhaXRzSW5G
YW1pbHkoY29uc3QgQXRvbWljU3RyaW5nJiwgVmVjdG9yPHVuc2lnbmVkPiYpOwogCi0gICAgU2lt
cGxlRm9udERhdGEqIGdldENhY2hlZEZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uLCBjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseSwgYm9vbCBjaGVja2luZ0Fs
dGVybmF0ZU5hbWUgPSBmYWxzZSk7CisgICAgU2ltcGxlRm9udERhdGEqIGdldENhY2hlZEZvbnRE
YXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYsIGNvbnN0IEF0b21pY1N0cmluZyYsIGJvb2wgY2hl
Y2tpbmdBbHRlcm5hdGVOYW1lID0gZmFsc2UsIGJvb2wgc2hvdWxkUmV0YWluID0gdHJ1ZSk7CiAg
ICAgU2ltcGxlRm9udERhdGEqIGdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERl
c2NyaXB0aW9uJik7CiAKICAgICB2b2lkIGFkZENsaWVudChGb250U2VsZWN0b3IqKTsKQEAgLTk3
LDYgKzk4LDE2IEBAIHByaXZhdGU6CiAgICAgRm9udENhY2hlKCk7CiAgICAgfkZvbnRDYWNoZSgp
OwogCisgICAgdm9pZCBkaXNhYmxlUHVyZ2luZygpIHsgbV9wdXJnZVByZXZlbnRDb3VudCsrOyB9
CisgICAgdm9pZCBlbmFibGVQdXJnaW5nKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3B1cmdl
UHJldmVudENvdW50KTsKKyAgICAgICAgaWYgKCEtLW1fcHVyZ2VQcmV2ZW50Q291bnQpCisgICAg
ICAgICAgICBwdXJnZUluYWN0aXZlRm9udERhdGFJZk5lZWRlZCgpOworICAgIH0KKworICAgIHZv
aWQgcHVyZ2VJbmFjdGl2ZUZvbnREYXRhSWZOZWVkZWQoKTsKKwogICAgIC8vIEZJWE1FOiBUaGlz
IG1ldGhvZCBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIEZvbnRQbGF0Zm9ybURh
dGEqIGdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiwgY29u
c3QgQXRvbWljU3RyaW5nJiBmYW1pbHksIGJvb2wgY2hlY2tpbmdBbHRlcm5hdGVOYW1lID0gZmFs
c2UpOwogCkBAIC0xMDQsNyArMTE1LDEwIEBAIHByaXZhdGU6CiAgICAgU2ltcGxlRm9udERhdGEq
IGdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQmKTsKICAgICBGb250UGxhdGZv
cm1EYXRhKiBjcmVhdGVGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYsIGNv
bnN0IEF0b21pY1N0cmluZyYgZmFtaWx5KTsKIAotICAgIFNpbXBsZUZvbnREYXRhKiBnZXRDYWNo
ZWRGb250RGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhKik7CisgICAgU2ltcGxlRm9udERhdGEq
IGdldENhY2hlZEZvbnREYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqLCBib29sIHNob3VsZFJl
dGFpbiA9IHRydWUpOworCisgICAgLy8gRG9uJ3QgcHVyZ2UgaWYgdGhpcyBjb3VudCBpcyA+IDA7
CisgICAgaW50IG1fcHVyZ2VQcmV2ZW50Q291bnQ7CiAKICAgICBmcmllbmQgY2xhc3MgU2ltcGxl
Rm9udERhdGE7IC8vIEZvciBnZXRDYWNoZWRGb250RGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRh
KikKICAgICBmcmllbmQgY2xhc3MgRm9udEZhbGxiYWNrTGlzdDsKQEAgLTExMyw2ICsxMjcsMTIg
QEAgcHJpdmF0ZToKIC8vIEdldCB0aGUgZ2xvYmFsIGZvbnRDYWNoZS4KIEZvbnRDYWNoZSogZm9u
dENhY2hlKCk7CiAKK2NsYXNzIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIHsKK3B1YmxpYzoKKyAg
ICBGb250Q2FjaGVQdXJnZVByZXZlbnRlcigpIHsgZm9udENhY2hlKCktPmRpc2FibGVQdXJnaW5n
KCk7IH0KKyAgICB+Rm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIoKSB7IGZvbnRDYWNoZSgpLT5lbmFi
bGVQdXJnaW5nKCk7IH0KK307CisKIH0KIAogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAJKHJldmlzaW9uIDg4MDEw
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQAogCiB1c2luZyBuYW1lc3BhY2UgV1RGOwog
dXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKQEAgLTIxMCw5ICsyMTEsMTEgQEAgR2x5cGhEYXRhIEZvbnQ6OmdseXBo
RGF0YUZvckNoYXJhY3RlcihVQwogICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgY2hhcmFjdGVy
LCBwcm9iYWJseSBiZWNhdXNlIHRoZSBmb250IHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCBjb3Jy
ZWN0bHkuCiAgICAgICAgICAgICAvLyBTbyB3ZSBqdXN0IGFsd2F5cyBzZXQgdGhlIGdseXBoIHRv
IGJlIHNhbWUgYXMgdGhlIGNoYXJhY3RlciwgYW5kIGxldCBHREkgc29sdmUgaXQuCiAgICAgICAg
ICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgYywgY2hhcmFjdGVyRm9udERh
dGEpOworICAgICAgICAgICAgY2hhcmFjdGVyRm9udERhdGEtPnNldE1heEdseXBoUGFnZVRyZWVM
ZXZlbChtYXgoY2hhcmFjdGVyRm9udERhdGEtPm1heEdseXBoUGFnZVRyZWVMZXZlbCgpLCBub2Rl
LT5sZXZlbCgpKSk7CiAgICAgICAgICAgICByZXR1cm4gcGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKGMpOwogI2Vsc2UKICAgICAgICAgICAgIHBhZ2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3Rl
cihjLCBkYXRhLmdseXBoLCBkYXRhLmZvbnREYXRhKTsKKyAgICAgICAgICAgIGRhdGEuZm9udERh
dGEtPnNldE1heEdseXBoUGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250RGF0YS0+bWF4R2x5cGhQ
YWdlVHJlZUxldmVsKCksIG5vZGUtPmxldmVsKCkpKTsKICNlbmRpZgogICAgICAgICB9CiAgICAg
ICAgIHJldHVybiBkYXRhOwpAQCAtMjI1LDkgKzIyOCwxMSBAQCBHbHlwaERhdGEgRm9udDo6Z2x5
cGhEYXRhRm9yQ2hhcmFjdGVyKFVDCiAjaWYgT1MoV0lOQ0UpCiAgICAgICAgIC8vIFNlZSBjb21t
ZW50IGFib3V0IFdJTkNFIEdESSBoYW5kbGluZyBuZWFyIHNldEdseXBoRGF0YUZvckNoYXJhY3Rl
ciBhYm92ZS4KICAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIGMsIGRh
dGEuZm9udERhdGEpOworICAgICAgICBkYXRhLmZvbnREYXRhLT5zZXRNYXhHbHlwaFBhZ2VUcmVl
TGV2ZWwobWF4KGRhdGEuZm9udERhdGEtPm1heEdseXBoUGFnZVRyZWVMZXZlbCgpLCBub2RlLT5s
ZXZlbCgpKSk7CiAgICAgICAgIHJldHVybiBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7
CiAjZWxzZQogICAgICAgICBwYWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgZGF0YS5n
bHlwaCwgZGF0YS5mb250RGF0YSk7CisgICAgICAgIGRhdGEuZm9udERhdGEtPnNldE1heEdseXBo
UGFnZVRyZWVMZXZlbChtYXgoZGF0YS5mb250RGF0YS0+bWF4R2x5cGhQYWdlVHJlZUxldmVsKCks
IG5vZGUtPmxldmVsKCkpKTsKICNlbmRpZgogICAgIH0KICAgICByZXR1cm4gZGF0YTsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5oCShyZXZpc2lv
biA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0xMjEsNyArMTIxLDE3IEBAIHB1YmxpYzoKICAgICAgICAgbWVt
c2V0KG1fZ2x5cGhzLCAwLCBzaXplb2YobV9nbHlwaHMpKTsKICAgICAgICAgbWVtc2V0KG1fZ2x5
cGhGb250RGF0YSwgMCwgc2l6ZW9mKG1fZ2x5cGhGb250RGF0YSkpOwogICAgIH0KLSAgICAKKwor
ICAgIHZvaWQgY2xlYXJGb3JGb250RGF0YShjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEp
CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAg
ICAgICAgICAgaWYgKG1fZ2x5cGhGb250RGF0YVtpXSA9PSBmb250RGF0YSkgeworICAgICAgICAg
ICAgICAgIG1fZ2x5cGhzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBtX2dseXBoRm9udERhdGFb
aV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgR2x5cGhQYWdl
VHJlZU5vZGUqIG93bmVyKCkgY29uc3QgeyByZXR1cm4gbV9vd25lcjsgfQogCiAgICAgLy8gSW1w
bGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcAkocmV2aXNpb24gODgw
MTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9k
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3NCwxMyArMzc0LDEzIEBAIHZvaWQgR2x5cGhQYWdl
VHJlZU5vZGU6OnBydW5lRm9udERhdGEoY28KICAgICBpZiAoIWZvbnREYXRhKQogICAgICAgICBy
ZXR1cm47CiAKKyAgICAvLyBQcnVuZSBmYWxsIGJhY2sgY2hpbGQgKGlmIGFueSkgb2YgdGhpcyBm
b250LgorICAgIGlmIChtX3N5c3RlbUZhbGxiYWNrQ2hpbGQgJiYgbV9zeXN0ZW1GYWxsYmFja0No
aWxkLT5tX3BhZ2UpCisgICAgICAgIG1fc3lzdGVtRmFsbGJhY2tDaGlsZC0+bV9wYWdlLT5jbGVh
ckZvckZvbnREYXRhKGZvbnREYXRhKTsKKwogICAgIC8vIFBydW5lIGFueSBicmFuY2ggdGhhdCBj
b250YWlucyB0aGlzIEZvbnREYXRhLgogICAgIEhhc2hNYXA8Y29uc3QgRm9udERhdGEqLCBHbHlw
aFBhZ2VUcmVlTm9kZSo+OjppdGVyYXRvciBjaGlsZCA9IG1fY2hpbGRyZW4uZmluZChmb250RGF0
YSk7Ci0gICAgaWYgKGNoaWxkID09IG1fY2hpbGRyZW4uZW5kKCkpIHsKLSAgICAgICAgLy8gSWYg
dGhlcmUgaXMgbm8gbGV2ZWwtMSBub2RlIGZvciBmb250RGF0YSwgdGhlbiB0aGVyZSBpcyBubyBk
ZWVwZXIgbm9kZSBmb3IgaXQgaW4gdGhpcyB0cmVlLgotICAgICAgICBpZiAoIWxldmVsKQotICAg
ICAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7CisgICAgaWYgKGNoaWxkICE9IG1fY2hpbGRy
ZW4uZW5kKCkpIHsKICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGUqIG5vZGUgPSBjaGlsZC0+c2Vj
b25kOwogICAgICAgICBtX2NoaWxkcmVuLnJlbW92ZShmb250RGF0YSk7CiAgICAgICAgIHVuc2ln
bmVkIGN1c3RvbUZvbnRDb3VudCA9IG5vZGUtPm1fY3VzdG9tRm9udENvdW50OwpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlQ2hyb21pdW1X
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJvbWl1bVdp
bi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUwNiw4ICs1MDYsOCBAQCBjb25zdCBTaW1wbGVGb250
RGF0YSogRm9udENhY2hlOjpnZXRGb250CiAgICAgLy8gbGFzdCBmb250IGluIHRoZSBhcnJheSBj
b3ZlcnMgdGhlIGNoYXJhY3RlciwgfGl8IHdpbGwgYmUgbnVtRm9udHMuCiAgICAgLy8gU28sIHdl
IGhhdmUgdG8gdXNlICc8PSIgcmF0aGVyIHRoYW4gJzwnIHRvIHNlZSBpZiB3ZSBmb3VuZCBhIGZv
bnQKICAgICAvLyBjb3ZlcmluZyB0aGUgY2hhcmFjdGVyLgotICAgIGlmIChpIDw9IG51bUZvbnRz
KSAKLSAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZGF0YSk7CisgICAgaWYgKGkgPD0g
bnVtRm9udHMpCisgICAgICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShkYXRhLCBmYWxzZSk7
CiAKICAgICByZXR1cm4gMDsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZnJlZXR5cGUvRm9udENhY2hlRnJlZVR5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZyZWV0eXBlL0ZvbnRDYWNoZUZyZWVUeXBlLmNwcAko
cmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9mcmVl
dHlwZS9Gb250Q2FjaGVGcmVlVHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg5LDcgKzg5LDcg
QEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIFJlZlB0cjxG
Y1BhdHRlcm4+IGZhbGxiYWNrUGF0dGVybiA9IGFkb3B0UmVmKGZpbmRCZXN0Rm9udEdpdmVuRmFs
bGJhY2tzKGZvbnREYXRhLCBwYXR0ZXJuLmdldCgpKSk7CiAgICAgaWYgKGZhbGxiYWNrUGF0dGVy
bikgewogICAgICAgICBGb250UGxhdGZvcm1EYXRhIGFsdGVybmF0ZUZvbnREYXRhKGZhbGxiYWNr
UGF0dGVybi5nZXQoKSwgZm9udC5mb250RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJldHVybiBn
ZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udERhdGEpOworICAgICAgICByZXR1cm4gZ2V0
Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhLCBmYWxzZSk7CiAgICAgfQogCiAgICAg
RmNSZXN1bHQgZm9udENvbmZpZ1Jlc3VsdDsKQEAgLTk3LDcgKzk3LDcgQEAgY29uc3QgU2ltcGxl
Rm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmICghcmVzdWx0UGF0dGVybikKICAg
ICAgICAgcmV0dXJuIDA7CiAgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250RGF0YShy
ZXN1bHRQYXR0ZXJuLmdldCgpLCBmb250LmZvbnREZXNjcmlwdGlvbigpKTsKLSAgICByZXR1cm4g
Z2V0Q2FjaGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhKTsKKyAgICByZXR1cm4gZ2V0Q2Fj
aGVkRm9udERhdGEoJmFsdGVybmF0ZUZvbnREYXRhLCBmYWxzZSk7CiB9CiAKIFNpbXBsZUZvbnRE
YXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQmIGZv
bnQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9oYWlrdS9Gb250Q2Fj
aGVIYWlrdS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvaGFpa3UvRm9udENhY2hlSGFpa3UuY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0ZvbnRDYWNoZUhhaWt1LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDksNyArNDksNyBAQCB2b2lkIEZvbnRDYWNoZTo6cGxhdGZvcm1Jbml0KCkK
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVy
cyhjb25zdCBGb250JiBmb250LCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCkK
IHsKICAgICBGb250UGxhdGZvcm1EYXRhIGRhdGEoZm9udC5mb250RGVzY3JpcHRpb24oKSwgZm9u
dC5mYW1pbHkoKS5mYW1pbHkoKSk7Ci0gICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKCZkYXRh
KTsKKyAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmRhdGEsIGZhbHNlKTsKIH0KIAogU2lt
cGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3Qg
Rm9udCYgZm9udCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9G
b250Q2FjaGVNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0ZvbnRDYWNoZU1hYy5tbQkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udENhY2hlTWFjLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC0xNTIsNyArMTUyLDggQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0
Rm9udAogICAgICAgICAhZm9udC5pc1BsYXRmb3JtRm9udCgpICYmIGlzQXBwS2l0Rm9udFdlaWdo
dEJvbGQod2VpZ2h0KSAmJiAhaXNBcHBLaXRGb250V2VpZ2h0Qm9sZChzdWJzdGl0dXRlRm9udFdl
aWdodCksCiAgICAgICAgICFmb250LmlzUGxhdGZvcm1Gb250KCkgJiYgKHRyYWl0cyAmIE5TRm9u
dEl0YWxpY1RyYWl0KSAmJiAhKHN1YnN0aXR1dGVGb250VHJhaXRzICYgTlNGb250SXRhbGljVHJh
aXQpLAogICAgICAgICBwbGF0Zm9ybURhdGEubV9vcmllbnRhdGlvbik7Ci0gICAgcmV0dXJuIGdl
dENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250KTsKKworICAgIHJldHVybiBnZXRDYWNoZWRG
b250RGF0YSgmYWx0ZXJuYXRlRm9udCwgZmFsc2UpOwogfQogCiBTaW1wbGVGb250RGF0YSogRm9u
dENhY2hlOjpnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250JiBmb250KQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNo
ZVF0LmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9Gb250Q2FjaGVRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDcgKzgwLDcgQEAg
Y29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udAogICAgIGlmICghY29tcHV0
ZWRGb250LmlzVmFsaWQoKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgRm9udFBsYXRmb3JtRGF0
YSBhbHRlcm5hdGVGb250KGNvbXB1dGVkRm9udCk7Ci0gICAgcmV0dXJuIGdldENhY2hlZEZvbnRE
YXRhKCZhbHRlcm5hdGVGb250KTsKKyAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoJmFsdGVy
bmF0ZUZvbnQsIGZhbHNlKTsKICNlbHNlCiAgICAgUV9VTlVTRUQoZm9udCk7CiAgICAgUV9VTlVT
RUQoY2hhcmFjdGVycyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vRm9udENhY2hlV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRm9udENhY2hlV2luLmNwcAkocmV2aXNpb24gODgwMTApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhY2hlV2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjg1LDcgKzI4NSw3IEBAIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2Fj
aGU6OmdldEZvbnQKICAgICAgICAgaWYgKCFmYW1pbHlOYW1lLmlzRW1wdHkoKSkgewogICAgICAg
ICAgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0
YShmb250LmZvbnREZXNjcmlwdGlvbigpLCBmYW1pbHlOYW1lKTsKICAgICAgICAgICAgIGlmIChy
ZXN1bHQpCi0gICAgICAgICAgICAgICAgZm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0YShyZXN1
bHQpOworICAgICAgICAgICAgICAgIGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEocmVzdWx0
LCBmYWxzZSk7CiAgICAgICAgIH0KIAogICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250
KTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNo
ZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9Gb250Q2FjaGVXaW5DRS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zMDgsNyArMzA4LDcgQEAgY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0Rm9udAogCiAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEqIHJlc3VsdCA9IGdldENhY2hl
ZEZvbnRQbGF0Zm9ybURhdGEoZm9udERlc2NyaXB0aW9uLCBmYW1pbHlOYW1lKTsKICAgICAgICAg
aWYgKHJlc3VsdCAmJiByZXN1bHQtPmhhc2goKSAhPSBvcmlnRm9udC5oYXNoKCkpIHsKLSAgICAg
ICAgICAgIGlmIChTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnZXRDYWNoZWRGb250RGF0YShy
ZXN1bHQpKQorICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGdldENh
Y2hlZEZvbnREYXRhKHJlc3VsdCwgZmFsc2UpKQogICAgICAgICAgICAgICAgIHJldHVybiBmb250
RGF0YTsKICAgICAgICAgfQogICAgIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3d4L0ZvbnRDYWNoZVd4LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93eC9Gb250Q2FjaGVXeC5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvRm9udENhY2hlV3guY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MiwxMiArNDIsMTIgQEAgdm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5p
dCgpCiBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJh
Y3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5n
dGgpCiB7CiAgICAgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gMDsKLSAgICBmb250RGF0YSA9
IGdldENhY2hlZEZvbnREYXRhKGZvbnQuZm9udERlc2NyaXB0aW9uKCksIGZvbnQuZmFtaWx5KCku
ZmFtaWx5KCkpOworICAgIGZvbnREYXRhID0gZ2V0Q2FjaGVkRm9udERhdGEoZm9udC5mb250RGVz
Y3JpcHRpb24oKSwgZm9udC5mYW1pbHkoKS5mYW1pbHkoKSwgZmFsc2UsIGZhbHNlKTsKICAgICBp
ZiAoIWZvbnREYXRhLT5jb250YWluc0NoYXJhY3RlcnMoY2hhcmFjdGVycywgbGVuZ3RoKSkKICAg
ICAgICAgZm9udERhdGEgPSBnZXRTaW1pbGFyRm9udFBsYXRmb3JtRGF0YShmb250KTsKICAgICBp
ZiAoIWZvbnREYXRhLT5jb250YWluc0NoYXJhY3RlcnMoY2hhcmFjdGVycywgbGVuZ3RoKSkKICAg
ICAgICAgZm9udERhdGEgPSBnZXRMYXN0UmVzb3J0RmFsbGJhY2tGb250KGZvbnQuZm9udERlc2Ny
aXB0aW9uKCkpOwotICAgIAorCiAgICAgQVNTRVJUKGZvbnREYXRhKTsKICAgICByZXR1cm4gZm9u
dERhdGE7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
Y3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVU
ZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgIkRv
Y3VtZW50TWFya2VyQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIkVkaXRvci5oIgogI2luY2x1ZGUg
IkVsbGlwc2lzQm94LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRnJhbWUu
aCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0
LmgiCkBAIC0xODAsNiArMTgxLDggQEAgSW50UmVjdCBJbmxpbmVUZXh0Qm94OjpzZWxlY3Rpb25S
ZWN0KGludAogICAgIGlmIChzUG9zID4gZVBvcykKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsK
IAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOwor
CiAgICAgUmVuZGVyVGV4dCogdGV4dE9iaiA9IHRleHRSZW5kZXJlcigpOwogICAgIGludCBzZWxU
b3AgPSBzZWxlY3Rpb25Ub3AoKTsKICAgICBpbnQgc2VsSGVpZ2h0ID0gc2VsZWN0aW9uSGVpZ2h0
KCk7CkBAIC0xMjMyLDYgKzEyMzUsOCBAQCBpbnQgSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9z
aXRpb24oZmxvCiAgICAgaWYgKGxpbmVPZmZzZXQgLSBsb2dpY2FsTGVmdCgpIDwgMCkKICAgICAg
ICAgcmV0dXJuIGxlZnRPZmZzZXQ7CiAKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250
Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRl
eHQocmVuZGVyZXIoKSk7CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dC0+c3R5bGUobV9m
aXJzdExpbmUpOwogICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS0+Zm9udCgpOwpAQCAtMTI0
OSw2ICsxMjU0LDggQEAgZmxvYXQgSW5saW5lVGV4dEJveDo6cG9zaXRpb25Gb3JPZmZzZXQoaQog
ICAgIGlmIChpc0xpbmVCcmVhaygpKQogICAgICAgICByZXR1cm4gbG9naWNhbExlZnQoKTsKIAor
ICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAg
ICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChyZW5kZXJlcigpKTsKICAgICBSZW5k
ZXJTdHlsZSogc3R5bGVUb1VzZSA9IHRleHQtPnN0eWxlKG1fZmlyc3RMaW5lKTsKICAgICBBU1NF
UlQoc3R5bGVUb1VzZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1h
Z2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFn
ZS5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckltYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgImNv
bmZpZy5oIgogI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCiAKKyNpbmNsdWRlICJGb250Q2FjaGUu
aCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCiAjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCkBAIC0xMDIsNiArMTAzLDggQEAgYm9vbCBSZW5kZXJJ
bWFnZTo6c2V0SW1hZ2VTaXplRm9yQWx0VGV4dAogCiAgICAgLy8gd2UgaGF2ZSBhbiBhbHQgYW5k
IHRoZSB1c2VyIG1lYW50IGl0IChpdHMgbm90IGEgdGV4dCB3ZSBpbnZlbnRlZCkKICAgICBpZiAo
IW1fYWx0VGV4dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIg
Zm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICAgICAgY29uc3QgRm9udCYgZm9udCA9IHN0
eWxlKCktPmZvbnQoKTsKICAgICAgICAgSW50U2l6ZSB0ZXh0U2l6ZShtaW4oZm9udC53aWR0aChS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0aGlzLCBmb250LCBtX2FsdFRleHQsIHN0eWxl
KCkpKSwgbWF4QWx0VGV4dFdpZHRoKSwgbWluKGZvbnQuZm9udE1ldHJpY3MoKS5oZWlnaHQoKSwg
bWF4QWx0VGV4dEhlaWdodCkpOwogICAgICAgICBpbWFnZVNpemUgPSBpbWFnZVNpemUuZXhwYW5k
ZWRUbyh0ZXh0U2l6ZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlz
dEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxp
c3RCb3guY3BwCShyZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJMaXN0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1
ZGUgIkV2ZW50SGFuZGxlci5oIgogI2luY2x1ZGUgIkV2ZW50UXVldWUuaCIKICNpbmNsdWRlICJG
b2N1c0NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKICNpbmNsdWRlICJGcmFt
ZS5oIgogI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
CkBAIC05OCw2ICs5OSw4IEBAIFJlbmRlckxpc3RCb3g6On5SZW5kZXJMaXN0Qm94KCkKIAogdm9p
ZCBSZW5kZXJMaXN0Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgpCiB7CisgICAgRm9udENhY2hlUHVy
Z2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7CisKICAgICBpZiAobV9vcHRpb25z
Q2hhbmdlZCkgewogICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSB0
b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpLT5saXN0SXRlbXMo
KTsKICAgICAgICAgaW50IHNpemUgPSBudW1JdGVtcygpOwpAQCAtMzU4LDYgKzM2MSw4IEBAIHN0
YXRpYyBJbnRTaXplIGl0ZW1PZmZzZXRGb3JBbGlnbm1lbnQoVGUKIAogdm9pZCBSZW5kZXJMaXN0
Qm94OjpwYWludEl0ZW1Gb3JlZ3JvdW5kKFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGlu
dCB0eSwgaW50IGxpc3RJbmRleCkKIHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250
Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2Vs
ZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgY29uc3QgVmVj
dG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKICAgICBFbGVt
ZW50KiBlbGVtZW50ID0gbGlzdEl0ZW1zW2xpc3RJbmRleF07CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5jcHAJKHJldmlzaW9uIDg4
MDEwKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9TVkdJbmxpbmVUZXh0Qm94LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBAQAogCiAjaWYgRU5BQkxFKFNWRykKICNp
bmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKICNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5j
bHVkZSAiUmVuZGVyQmxvY2suaCIKQEAgLTkwLDYgKzkxLDggQEAgRmxvYXRSZWN0IFNWR0lubGlu
ZVRleHRCb3g6OnNlbGVjdGlvblJlYwogICAgIEFTU0VSVChzdGFydFBvc2l0aW9uIDwgZW5kUG9z
aXRpb24pOwogICAgIEFTU0VSVChzdHlsZSk7CiAKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRl
ciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAgIFJlbmRlclNWR0lubGluZVRleHQqIHRl
eHRSZW5kZXJlciA9IHRvUmVuZGVyU1ZHSW5saW5lVGV4dCh0aGlzLT50ZXh0UmVuZGVyZXIoKSk7
CiAgICAgQVNTRVJUKHRleHRSZW5kZXJlcik7CiAKSW5kZXg6IFNvdXJjZS9XZWJLaXQvbWFjL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHJldmlz
aW9uIDg4MjQ0KQorKysgU291cmNlL1dlYktpdC9tYWMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsMzQgQEAKKzIwMTEtMDYtMDYgIE1pY2hhZWwgU2Fib2ZmICA8bXNhYm9mZkBh
cHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgRm9udHMgcmV0dXJuZWQgYnkgRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMo
KSBhcmUgbmV2ZXIgcmVsZWFzZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTYxODc1CisKKyAgICAgICAgVGhpcyBjaGFuZ2UgYWxsb3dzIGZvbnRzIGFs
bG9jYXRlZCBhcyBzeXN0ZW0gZmFsbGJhY2sgZm9udHMgdG8gYmUKKyAgICAgICAgcmVsZWFzZWQu
ICBQcmV2aW91c2x5LCB0aGUgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlc2UgZm9udHMgZ3Jldwor
ICAgICAgICB3aXRob3V0IGJvdW5kLiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhbiBhdXRvIHJl
bGVhc2UgY2xhc3MgdGhhdCB3cmFwcworICAgICAgICBhY2Nlc3NlcyB0byB0aGUgY2FjaGUgZm9y
IHN5c3RlbSBmYWxsYmFjayBmb250cy4gQWxsIHN1Y2ggYWNjZXNzZXMgYXJlCisgICAgICAgIHZp
YSB0aGUgbWV0aG9kIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzLiBUaGUgbmV3
IGNsYXNzIGlzCisgICAgICAgIGNhbGxlZCBGb250Q2FjaGVQdXJnZVByZXZlbnRlci4gV2hlbiBz
dWNoIGFuIG9iamVjdCBleGlzdHMsIGl0IHByb3RlY3RzCisgICAgICAgIHRoZXNlIGZvbnRzIGZy
b20gZGVsZXRpb24uCisKKyAgICAgICAgU2VlIG1vcmUgY29tbWVudHMgZm9yIHRoaXMgZGVmZWN0
IGluIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZy4KKworICAgICAgICAqIE1pc2MvV2ViS2l0TlNT
dHJpbmdFeHRyYXMubW06CisgICAgICAgICgtW05TU3RyaW5nIF93ZWJfZHJhd0F0UG9pbnQ6Zm9u
dDp0ZXh0Q29sb3I6YWxsb3dpbmdGb250U21vb3RoaW5nOl0pOgorICAgICAgICAoLVtOU1N0cmlu
ZyBfd2ViX3dpZHRoV2l0aEZvbnQ6XSk6CisgICAgICAgIFdyYXBwZWQgY29kZSBhY2Nlc3Npbmcg
ZmFsbGJhY2sgZm9udHMgd2l0aCBsb2NhbAorICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRl
ciBpbiB0aGVzZSBtZXRob2RzLgorCisgICAgICAgICogTWlzYy9XZWJTdHJpbmdUcnVuY2F0b3Iu
bW06CisgICAgICAgICgrW1dlYlN0cmluZ1RydW5jYXRvciBjZW50ZXJUcnVuY2F0ZVN0cmluZzp0
b1dpZHRoOl0pOgorICAgICAgICAoK1tXZWJTdHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNhdGVT
dHJpbmc6dG9XaWR0aDp3aXRoRm9udDpdKToKKyAgICAgICAgKCtbV2ViU3RyaW5nVHJ1bmNhdG9y
IHJpZ2h0VHJ1bmNhdGVTdHJpbmc6dG9XaWR0aDp3aXRoRm9udDpdKToKKyAgICAgICAgKCtbV2Vi
U3RyaW5nVHJ1bmNhdG9yIHdpZHRoT2ZTdHJpbmc6Zm9udDpdKToKKyAgICAgICAgV3JhcHBlZCBj
b2RlIGFjY2Vzc2luZyBmYWxsYmFjayBmb250cyB3aXRoIGxvY2FsCisgICAgICAgIEZvbnRDYWNo
ZVB1cmdlUHJldmVudGVyIGluIHRoZXNlIG1ldGhvZHMuCisKIDIwMTEtMDYtMDYgIFBldGVyIEth
c3RpbmcgIDxwa2FzdGluZ0Bnb29nbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFudG9u
aW8gR29tZXMuCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9NaXNjL1dlYktpdE5TU3RyaW5nRXh0
cmFzLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViS2l0TlNTdHJp
bmdFeHRyYXMubW0JKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dlYktpdC9tYWMvTWlzYy9X
ZWJLaXROU1N0cmluZ0V4dHJhcy5tbQkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAog
I2ltcG9ydCAiV2ViS2l0TlNTdHJpbmdFeHRyYXMuaCIKIAogI2ltcG9ydCA8V2ViQ29yZS9Gb250
Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZvbnRDYWNoZS5oPgogI2ltcG9ydCA8V2ViQ29yZS9HcmFw
aGljc0NvbnRleHQuaD4KICNpbXBvcnQgPFdlYkNvcmUvVGV4dFJ1bi5oPgogI2ltcG9ydCA8V2Vi
Q29yZS9XZWJDb3JlTlNTdHJpbmdFeHRyYXMuaD4KQEAgLTg5LDYgKzkwLDggQEAgLSAodm9pZClf
d2ViX2RyYXdBdFBvaW50OihOU1BvaW50KXBvaW50IAogICAgICAgICBpZiAoIWZsaXBwZWQpCiAg
ICAgICAgICAgICBDR0NvbnRleHRTY2FsZUNUTShjZ0NvbnRleHQsIDEsIC0xKTsKIAorICAgICAg
ICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsKKwogICAg
ICAgICBGb250IHdlYkNvcmVGb250KEZvbnRQbGF0Zm9ybURhdGEoZm9udCwgW2ZvbnQgcG9pbnRT
aXplXSksICFbbnNDb250ZXh0IGlzRHJhd2luZ1RvU2NyZWVuXSwgZm9udFNtb290aGluZ0lzQWxs
b3dlZCA/IEF1dG9TbW9vdGhpbmcgOiBBbnRpYWxpYXNlZCk7CiAgICAgICAgIFRleHRSdW4gcnVu
KGJ1ZmZlci5kYXRhKCksIGxlbmd0aCk7CiAKQEAgLTEzNCw2ICsxMzcsOCBAQCAtIChmbG9hdClf
d2ViX3dpZHRoV2l0aEZvbnQ6KE5TRm9udCAqKWZvCiAgICAgW3NlbGYgZ2V0Q2hhcmFjdGVyczpi
dWZmZXIuZGF0YSgpXTsKIAogICAgIGlmIChjYW5Vc2VGYXN0UmVuZGVyZXIoYnVmZmVyLmRhdGEo
KSwgbGVuZ3RoKSkgeworICAgICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQ
dXJnZVByZXZlbnRlcjsKKwogICAgICAgICBGb250IHdlYkNvcmVGb250KEZvbnRQbGF0Zm9ybURh
dGEoZm9udCwgW2ZvbnQgcG9pbnRTaXplXSksICFbW05TR3JhcGhpY3NDb250ZXh0IGN1cnJlbnRD
b250ZXh0XSBpc0RyYXdpbmdUb1NjcmVlbl0pOwogICAgICAgICBUZXh0UnVuIHJ1bihidWZmZXIu
ZGF0YSgpLCBsZW5ndGgpOwogICAgICAgICByZXR1cm4gd2ViQ29yZUZvbnQud2lkdGgocnVuKTsK
SW5kZXg6IFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViU3RyaW5nVHJ1bmNhdG9yLm1tCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViU3RyaW5nVHJ1bmNhdG9yLm1tCShy
ZXZpc2lvbiA4ODAxMCkKKysrIFNvdXJjZS9XZWJLaXQvbWFjL01pc2MvV2ViU3RyaW5nVHJ1bmNh
dG9yLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbXBvcnQgIldlYlN5
c3RlbUludGVyZmFjZS5oIgogI2ltcG9ydCA8V2ViQ29yZS9Gb250Lmg+CisjaW1wb3J0IDxXZWJD
b3JlL0ZvbnRDYWNoZS5oPgogI2ltcG9ydCA8V2ViQ29yZS9Gb250UGxhdGZvcm1EYXRhLmg+CiAj
aW1wb3J0IDxXZWJDb3JlL1BsYXRmb3JtU3RyaW5nLmg+CiAjaW1wb3J0IDxXZWJDb3JlL1N0cmlu
Z1RydW5jYXRvci5oPgpAQCAtNzIsMjEgKzczLDI1IEBAICsgKHZvaWQpaW5pdGlhbGl6ZQogCiAr
IChOU1N0cmluZyAqKWNlbnRlclRydW5jYXRlU3RyaW5nOihOU1N0cmluZyAqKXN0cmluZyB0b1dp
ZHRoOihmbG9hdCltYXhXaWR0aAogeworICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZvbnRD
YWNoZVB1cmdlUHJldmVudGVyOwogICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OmNlbnRlclRy
dW5jYXRlKHN0cmluZywgbWF4V2lkdGgsIGZvbnRGcm9tTlNGb250KGRlZmF1bHRNZW51Rm9udCgp
KSk7CiB9CiAKICsgKE5TU3RyaW5nICopY2VudGVyVHJ1bmNhdGVTdHJpbmc6KE5TU3RyaW5nICop
c3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1heFdpZHRoIHdpdGhGb250OihOU0ZvbnQgKilmb250CiB7
CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50ZXI7CiAg
ICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNhdGUoc3RyaW5nLCBtYXhXaWR0
aCwgZm9udEZyb21OU0ZvbnQoZm9udCkpOwogfQogCiArIChOU1N0cmluZyAqKXJpZ2h0VHJ1bmNh
dGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIHRvV2lkdGg6KGZsb2F0KW1heFdpZHRoIHdpdGhG
b250OihOU0ZvbnQgKilmb250CiB7CisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENh
Y2hlUHVyZ2VQcmV2ZW50ZXI7CiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVu
Y2F0ZShzdHJpbmcsIG1heFdpZHRoLCBmb250RnJvbU5TRm9udChmb250KSk7CiB9CiAKICsgKGZs
b2F0KXdpZHRoT2ZTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nIGZvbnQ6KE5TRm9udCAqKWZvbnQK
IHsKKyAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsK
ICAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjp3aWR0aChzdHJpbmcsIGZvbnRGcm9tTlNGb250
KGZvbnQpKTsKIH0KIApJbmRleDogU291cmNlL1dlYktpdC93aW4vQ2hhbmdlTG9nCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gODgyNDQpCisrKyBT
b3VyY2UvV2ViS2l0L3dpbi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyNiBA
QAorMjAxMS0wNi0wNiAgTWljaGFlbCBTYWJvZmYgIDxtc2Fib2ZmQGFwcGxlLmNvbT4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGb250cyByZXR1cm5l
ZCBieSBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycygpIGFyZSBuZXZlciByZWxl
YXNlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE4
NzUKKworICAgICAgICBUaGlzIGNoYW5nZSBhbGxvd3MgZm9udHMgYWxsb2NhdGVkIGFzIHN5c3Rl
bSBmYWxsYmFjayBmb250cyB0byBiZQorICAgICAgICByZWxlYXNlZC4gIFByZXZpb3VzbHksIHRo
ZSByZWZlcmVuY2UgY291bnRzIGZvciB0aGVzZSBmb250cyBncmV3CisgICAgICAgIHdpdGhvdXQg
Ym91bmQuICBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGFuIGF1dG8gcmVsZWFzZSBjbGFzcyB0aGF0
IHdyYXBzCisgICAgICAgIGFjY2Vzc2VzIHRvIHRoZSBjYWNoZSBmb3Igc3lzdGVtIGZhbGxiYWNr
IGZvbnRzLiBBbGwgc3VjaCBhY2Nlc3NlcyBhcmUKKyAgICAgICAgdmlhIHRoZSBtZXRob2QgRm9u
dENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMuIFRoZSBuZXcgY2xhc3MgaXMKKyAgICAg
ICAgY2FsbGVkIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyLiBXaGVuIHN1Y2ggYW4gb2JqZWN0IGV4
aXN0cywgaXQgcHJvdGVjdHMKKyAgICAgICAgdGhlc2UgZm9udHMgZnJvbSBkZWxldGlvbi4KKwor
ICAgICAgICBTZWUgbW9yZSBjb21tZW50cyBmb3IgdGhpcyBkZWZlY3QgaW4gU291cmNlL1dlYkNv
cmUvQ2hhbmdlTG9nLgorCisgICAgICAgICogV2ViS2l0R3JhcGhpY3MuY3BwOgorICAgICAgICAo
Q2VudGVyVHJ1bmNhdGVTdHJpbmdUb1dpZHRoKToKKyAgICAgICAgKFJpZ2h0VHJ1bmNhdGVTdHJp
bmdUb1dpZHRoKToKKyAgICAgICAgV3JhcHBlZCBjb2RlIGFjY2Vzc2luZyBmYWxsYmFjayBmb250
cyB3aXRoIGxvY2FsCisgICAgICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGluIHRoZXNlIG1l
dGhvZHMuCisKIDIwMTEtMDYtMDQgIERvbWluaWMgQ29vbmV5ICA8ZG9taW5pY2NAY2hyb21pdW0u
b3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFNvdXJj
ZS9XZWJLaXQvd2luL1dlYktpdEdyYXBoaWNzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0L3dpbi9XZWJLaXRHcmFwaGljcy5jcHAJKHJldmlzaW9uIDg4MDEwKQorKysgU291cmNlL1dl
YktpdC93aW4vV2ViS2l0R3JhcGhpY3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3
IEBACiAjaW5jbHVkZSAiV2ViUHJlZmVyZW5jZXMuaCIKIAogI2luY2x1ZGUgPFdlYkNvcmUvRm9u
dC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udENhY2hlLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9G
b250RGVzY3JpcHRpb24uaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZvbnRTZWxlY3Rvci5oPgogI2lu
Y2x1ZGUgPFdlYkNvcmUvR3JhcGhpY3NDb250ZXh0Lmg+CkBAIC0xNDcsNiArMTQ4LDggQEAgdW5z
aWduZWQgQ2VudGVyVHJ1bmNhdGVTdHJpbmdUb1dpZHRoKExQQwogewogICAgIEFTU0VSVChidWZm
ZXIpOwogCisgICAgRm9udENhY2hlUHVyZ2VQcmV2ZW50ZXIgZm9udENhY2hlUHVyZ2VQcmV2ZW50
ZXI7CisKICAgICBTdHJpbmcgcmVzdWx0ID0gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0
ZShTdHJpbmcodGV4dCwgbGVuZ3RoKSwgd2lkdGgsIG1ha2VGb250KGRlc2NyaXB0aW9uKSk7CiAg
ICAgbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LmNoYXJhY3RlcnMoKSwgcmVzdWx0Lmxlbmd0aCgpICog
c2l6ZW9mKFVDaGFyKSk7CiAgICAgYnVmZmVyW3Jlc3VsdC5sZW5ndGgoKV0gPSAnXDAnOwpAQCAt
MTU3LDYgKzE2MCw4IEBAIHVuc2lnbmVkIFJpZ2h0VHJ1bmNhdGVTdHJpbmdUb1dpZHRoKExQQ1QK
IHsKICAgICBBU1NFUlQoYnVmZmVyKTsKIAorICAgIEZvbnRDYWNoZVB1cmdlUHJldmVudGVyIGZv
bnRDYWNoZVB1cmdlUHJldmVudGVyOworCiAgICAgU3RyaW5nIHJlc3VsdCA9IFN0cmluZ1RydW5j
YXRvcjo6cmlnaHRUcnVuY2F0ZShTdHJpbmcodGV4dCwgbGVuZ3RoKSwgd2lkdGgsIG1ha2VGb250
KGRlc2NyaXB0aW9uKSk7CiAgICAgbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LmNoYXJhY3RlcnMoKSwg
cmVzdWx0Lmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSk7CiAgICAgYnVmZmVyW3Jlc3VsdC5sZW5n
dGgoKV0gPSAnXDAnOwo=
</data>
<flag name="review"
          id="89896"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>