<?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>25116</bug_id>
          
          <creation_ts>2009-04-09 10:54:44 -0700</creation_ts>
          <short_desc>Move VDMX parsing into the Chromium Linux port.</short_desc>
          <delta_ts>2009-04-15 11:18:57 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</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="Adam Langley">agl</reporter>
          <assigned_to name="Adam Langley">agl</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>117048</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-09 10:54:44 -0700</bug_when>
    <thetext>Move VDMX parsing into the Chromium Linux port.

VDMX tables are optional tables in TrueType fonts which contain the exact pixel height of a given font at a given pel size. In order to match Windows font metrics we have to use these numbers.

Previously, the parsing was performed in Skia. As part of the merge with upstream Skia, an interface for getting table data from a font has been added to Skia and we&apos;re moving the parsing into WebKit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117049</commentid>
    <comment_count>1</comment_count>
      <attachid>29367</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-09 10:55:26 -0700</bug_when>
    <thetext>Created attachment 29367
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117073</commentid>
    <comment_count>2</comment_count>
      <attachid>29367</attachid>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-04-09 14:34:16 -0700</bug_when>
    <thetext>Comment on attachment 29367
patch

This code doesn&apos;t seem to follow the Webkit naming and style conventions.  Functions should not have an initial uppercase letter and arguments should not be named with lower_case_and_underscores.  The &quot;Chromium&quot; prefix on ChromiumVDMXParse is a bit strange.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117074</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-09 14:39:38 -0700</bug_when>
    <thetext>Heck, sorry. I&apos;m switching between so many coding styles that I forgot about WebKit&apos;s lowercase method names. I&apos;ll fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117090</commentid>
    <comment_count>4</comment_count>
      <attachid>29376</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-09 15:31:48 -0700</bug_when>
    <thetext>Created attachment 29376
patch

Changed method names to camelCase (my bad). Changed the argument names in the prototype to camalCase too (missed them before). Renamed ChromiumVDMXParse to trueTypeVDMXParse. (Just aiming for the donkey&apos;s behind here, I&apos;ll take any suggestions as to the correct name for this function.)

cheers</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117097</commentid>
    <comment_count>5</comment_count>
      <attachid>29376</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-04-09 16:02:01 -0700</bug_when>
    <thetext>Comment on attachment 29376
patch

I don&apos;t know much about TrueType fonts or VDMX tables.  Is there someone on the
Chrome team who can review this solution?  Dean perhaps?

Just nits:


&gt; +++ b/WebCore/platform/graphics/chromium/FontPlatformDataLinux.h

&gt; +    // -------------------------------------------------------------------------
&gt; +    // Return Skia&apos;s unique id for this font. This encodes both the style and
&gt; +    // the font&apos;s file name so refers to a single face.
&gt; +    // -------------------------------------------------------------------------

nit: this block comment style is not used very uniformly in our code...  it seems a bit
jarring to me, but i guess that&apos;s just personal preference.  consistency across our
code would be nice.


&gt; +++ b/WebCore/platform/graphics/chromium/FontTrueTypeLinux.cpp

nit: We should be using the suffix ChromiumLinux.cpp for linux specific files
in the chromium/ directory.  We have not been very consistent with this in the
Linux specific files, which is unfortunate.  Maybe you can at least fix this
one that you are adding.


&gt; +class Buffer
&gt; +{
&gt; +  public:

nit: please use webkit style, which is:

  class Buffer {
  public:
      Buffer(...


&gt; +    Buffer(const uint8_t* buffer, size_t length)
&gt; +        : m_buffer(buffer)
&gt; +        , m_length(length)
&gt; +        , m_offset(0)
&gt; +        { }

nit: webkit style would probably either be:

    Buffer(const uint8_t* buffer, size_t length)
        : m_buffer(buffer)
        , m_length(length)
        , m_offset(0) { }

or:

    Buffer(const uint8_t* buffer, size_t length)
        : m_buffer(buffer)
        , m_length(length)
        , m_offset(0)
    {
    }


&gt; +    bool readU8(uint8_t* value)
&gt; +    {
&gt; +        if (m_offset + 1 &gt; m_length)
&gt; +            return false;
&gt; +        *value = m_buffer[m_offset];
&gt; +        m_offset++;
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    bool readU16(uint16_t* value)
&gt; +    {
&gt; +        if (m_offset + 2 &gt; m_length)
&gt; +            return false;
&gt; +        memcpy(value, m_buffer + m_offset, sizeof(uint16_t));
&gt; +        *value = ntohs(*value);
&gt; +        m_offset += 2;
&gt; +        return true;
&gt; +    }

how about using sizeof(*value) or sizeof(uint16_t) and sizeof(uint8_t),
respectively, instead of the magic 1 and 2 constants?


&gt; +  private:
&gt; +    const uint8_t *const m_buffer;

nit: &quot;private:&quot; should not be indented.

nit: &quot;const uint8_t* const m_buffer;&quot;


&gt; +// Freetype does not parse these tables so we do so here. In the future we
&gt; +// might support loading of arbitary fonts. This is not something that one
&gt; +// would wish to do, dangerous as it is, so we are careful where we tread.

we have code to load arbitrary truetype fonts from the web.  maybe we need to
worry sooner than later?


&gt; +bool trueTypeVDMXParse(int* ymax, int* ymin,
&gt; +                       const uint8_t* vdmx, const size_t vdmxLength,
&gt; +                       const unsigned targetPelSize)

nit: yMax and yMin to conform to webkit variable naming conventions

nit: please use Pixel instead of Pel since Pel is not that common.


&gt; +    if (!buf.skip(4) ||
&gt; +        !buf.readU16(&amp;numRatios))

nit: webkit style is to put the &quot;||&quot; on the next line or to just avoid the line
break, which is what i would do here.

&gt; +        if (!buf.skip(1) ||
&gt; +            !buf.readU8(&amp;xRatio) ||
&gt; +            !buf.readU8(&amp;yRatio1) ||
&gt; +            !buf.readU8(&amp;yRatio2))
&gt; +            return false;

same nit here and below

&gt; +
&gt; +        // This either covers 1:1, or this is the default entry (0, 0, 0)
&gt; +        if ((xRatio == 1 &amp;&amp; yRatio1 &lt;= 1 &amp;&amp; yRatio2 &gt;= 1) ||
&gt; +            (xRatio == 0 &amp;&amp; yRatio1 == 0 &amp;&amp; yRatio2 == 0)) {
&gt; +            desiredRatio = i;
&gt; +            break;
&gt; +        }

as ugly as it may be, you are supposed to do:

  if (foo
      || bar) {
  }

and perhaps that is why most people just do:

  if (foo || bar) {

despite how long it can make some lines :(



&gt; +    if (desiredRatio == 0xffffffff)  // no ratio found
&gt; +        return false;

uber nits: one space instead of two before &quot;//&quot;


&gt; +    if (!buf.readU16(&amp;numRecords) ||
&gt; +        !buf.skip(sizeof(uint16_t)))
&gt; +        return false;

ding


&gt; +            if (!buf.readS16(&amp;tempYMax) ||
&gt; +                !buf.readS16(&amp;tempYMin))

nit: || is wrongly placed


&gt; +            return true;
&gt; +        } else {

nit: no need for else after return


&gt; +          if (!buf.skip(2 * sizeof(int16_t)))

nit: should be 4 white spaces


&gt; +++ b/WebCore/platform/graphics/chromium/FontTrueTypeLinux.h

same nit about file naming

maybe these files should be named VDMXParser.{h,cpp}?  it doesn&apos;t seem very
linux specific (though you are only using it in the chromium-linux port).


&gt; +namespace WebCore {
&gt; +    bool trueTypeVDMXParse(int* ymax, int* ymin,
&gt; +                           const uint8_t* vdmx, const size_t vdmxLength,
&gt; +                           const unsigned targetPelSize);

parseVDMX might be a nicer name?  seems like it would be more conventional
to list the out parameters last.

nit: &quot;const size_t vdmxLength&quot; should just be &quot;size_t vdmxLength&quot;.  putting
const in front of a parameter type that is copy-by-value is extraneous.
same goes for targetPelSize.


&gt; +}  // namespace WebCore

nit: one space before &quot;//&quot;



&gt; +++ b/WebCore/platform/graphics/chromium/SimpleFontDataLinux.cpp

&gt; +        uint8_t *vdmxTable = (uint8_t *) malloc(vdmxSize);
&gt; +        if (vdmxTable
&gt; +            &amp;&amp; SkFontHost::GetTableData(fontID, vdmxTag, 0, vdmxSize, vdmxTable) == vdmxSize
&gt; +            &amp;&amp; trueTypeVDMXParse(&amp;vdmxAscent, &amp;vdmxDescent, vdmxTable, vdmxSize, pelSize))
&gt; +            isVDMXValid = true;
&gt; +        free(vdmxTable);

nit: please use fastMalloc and fastFree, which are what webkit uses instead
of malloc and free.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117159</commentid>
    <comment_count>6</comment_count>
      <attachid>29393</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-10 11:29:04 -0700</bug_when>
    <thetext>Created attachment 29393
patch

Have fixed all the comments. Clearly I need to write a cpplint.py for WebKit style!

The code is previously from Skia and deanm reviewed it when it went in there. It has only changed in terms of style, not function, so should still be good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117568</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-04-14 22:07:29 -0700</bug_when>
    <thetext>&gt; Have fixed all the comments. Clearly I need to write a cpplint.py for WebKit
&gt; style!

Yeah, it is painful to switch between coding styles :(


&gt; The code is previously from Skia and deanm reviewed it when it went in there.
&gt; It has only changed in terms of style, not function, so should still be good.

In the future, please note this and include a link to where the code review occurred.  Thanks!
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>117623</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-04-15 11:18:57 -0700</bug_when>
    <thetext>Landed as:  http://trac.webkit.org/changeset/42548</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29367</attachid>
            <date>2009-04-09 10:55:26 -0700</date>
            <delta_ts>2009-04-09 15:31:48 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>15195</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGRhNTk1YS4uYTlhNmJmYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMCBAQAorMjAwOS0wNC0wOSAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgTW92ZSBWRE1YIHBhcnNpbmcgaW50byB0aGUgQ2hyb21pdW0gTGludXggcG9y
dC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjUx
MTYKKworICAgICAgICBWRE1YIHRhYmxlcyBhcmUgb3B0aW9uYWwgdGFibGVzIGluIFRydWVUeXBl
IGZvbnRzIHdoaWNoIGNvbnRhaW4gdGhlCisgICAgICAgIGV4YWN0IHBpeGVsIGhlaWdodCBvZiBh
IGdpdmVuIGZvbnQgYXQgYSBnaXZlbiBwZWwgc2l6ZS4gSW4gb3JkZXIgdG8KKyAgICAgICAgbWF0
Y2ggV2luZG93cyBmb250IG1ldHJpY3Mgd2UgaGF2ZSB0byB1c2UgdGhlc2UgbnVtYmVycy4KKwor
ICAgICAgICBQcmV2aW91c2x5LCB0aGUgcGFyc2luZyB3YXMgcGVyZm9ybWVkIGluIFNraWEuIEFz
IHBhcnQgb2YgdGhlIG1lcmdlCisgICAgICAgIHdpdGggdXBzdHJlYW0gU2tpYSwgYW4gaW50ZXJm
YWNlIGZvciBnZXR0aW5nIHRhYmxlIGRhdGEgZnJvbSBhIGZvbnQKKyAgICAgICAgaGFzIGJlZW4g
YWRkZWQgdG8gU2tpYSBhbmQgd2UncmUgbW92aW5nIHRoZSBwYXJzaW5nIGludG8gV2ViS2l0Lgor
CisgICAgICAgIFRoaXMgZG9lcyBub3QgY2hhbmdlIGFueSBsYXlvdXQgdGVzdHMuCisKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGludXguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6dW5pcXVlSUQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFRydWVU
eXBlTGludXguaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
U2ltcGxlRm9udERhdGFMaW51eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0
YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybVdpZHRoRm9yR2x5cGgpOgorCiAyMDA5LTA0LTA5ICBEYXZpZCBLaWx6ZXIgIDxkZGtpbHpl
ckBhcHBsZS5jb20+CiAKICAgICAgICAgUmVpbnN0YXRpbmcgPHJkYXI6Ly9wcm9ibGVtLzY3MTg1
ODk+IE9wdGlvbiB0byB0dXJuIG9mZiBTVkcgRE9NIE9iamVjdGl2ZS1DIGJpbmRpbmdzCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURh
dGFMaW51eC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0
Zm9ybURhdGFMaW51eC5jcHAKaW5kZXggN2I3ZDE5Ny4uZTZhNjFmNiAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGludXguY3Bw
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0
YUxpbnV4LmNwcApAQCAtOTUsNiArOTUsMTEgQEAgdm9pZCBGb250UGxhdGZvcm1EYXRhOjpzZXR1
cFBhaW50KFNrUGFpbnQqIHBhaW50KSBjb25zdAogICAgIHBhaW50LT5zZXRUZXh0RW5jb2Rpbmco
U2tQYWludDo6a1VURjE2X1RleHRFbmNvZGluZyk7CiB9CiAKK1NrRm9udElEIEZvbnRQbGF0Zm9y
bURhdGE6OnVuaXF1ZUlEKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90eXBlZmFjZS0+dW5pcXVl
SUQoKTsKK30KKwogYm9vbCBGb250UGxhdGZvcm1EYXRhOjpvcGVyYXRvcj09KGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIGEpIGNvbnN0CiB7CiAgICAgLy8gSWYgZWl0aGVyIG9mIHRoZSB0eXBlZmFj
ZSBwb2ludGVycyBhcmUgaW52YWxpZCAoZWl0aGVyIE5VTEwgb3IgdGhlCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGlu
dXguaAppbmRleCBlYzdkODM3Li5jNjNhODYwIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0YUxpbnV4LmgKQEAgLTM2
LDYgKzM2LDcgQEAKIAogY2xhc3MgU2tQYWludDsKIGNsYXNzIFNrVHlwZWZhY2U7Cit0eXBlZGVm
IHVpbnQzMl90IFNrRm9udElEOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTkwLDYgKzkx
LDEyIEBAIHB1YmxpYzoKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgdm9pZCBzZXR1cFBh
aW50KFNrUGFpbnQqKSBjb25zdDsKIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBS
ZXR1cm4gU2tpYSdzIHVuaXF1ZSBpZCBmb3IgdGhpcyBmb250LiBUaGlzIGVuY29kZXMgYm90aCB0
aGUgc3R5bGUgYW5kCisgICAgLy8gdGhlIGZvbnQncyBmaWxlIG5hbWUgc28gcmVmZXJzIHRvIGEg
c2luZ2xlIGZhY2UuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNrRm9udElEIHVuaXF1
ZUlEKCkgY29uc3Q7CisKICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3Q7CiAgICAgZmxvYXQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dFNpemU7IH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VHJ1ZVR5cGVMaW51eC5jcHAgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRhZjhiCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VHJ1ZVR5cGVMaW51eC5jcHAK
QEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0
ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisv
LyBGb3IgaHRvbnMvbnRvaHMKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworLy8gQnVmZmVyIGhl
bHBlciBjbGFzcworLy8KKy8vIFRoaXMgY2xhc3MgcGVyZm9ybSBzb21lIHRyaXZhbCBidWZmZXIg
b3BlcmF0aW9ucyB3aGlsZSBjaGVja2luZyBmb3IKKy8vIG91dC1vZi1ib3VuZHMgZXJyb3JzLiBB
cyBhIGZhbWlseSB0aGV5IHJldHVybiBmYWxzZSBpZiBhbnl0aGluZyBpcyBhbWlzcywKKy8vIHVw
ZGF0aW5nIHRoZSBjdXJyZW50IG9mZnNldCBvdGhlcndpc2UuCitjbGFzcyBCdWZmZXIKK3sKKyAg
cHVibGljOgorICAgIEJ1ZmZlcihjb25zdCB1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgp
CisgICAgICAgIDogbV9idWZmZXIoYnVmZmVyKQorICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkK
KyAgICAgICAgLCBtX29mZnNldCgwKQorICAgICAgICB7IH0KKworICAgIGJvb2wgU2tpcChzaXpl
X3QgbnVtQnl0ZXMpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyBudW1CeXRlcyA+IG1f
bGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBtX29mZnNldCArPSBu
dW1CeXRlczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBSZWFkVTgo
dWludDhfdCogdmFsdWUpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyAxID4gbV9sZW5n
dGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICp2YWx1ZSA9IG1fYnVmZmVy
W21fb2Zmc2V0XTsKKyAgICAgICAgbV9vZmZzZXQrKzsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgYm9vbCBSZWFkVTE2KHVpbnQxNl90KiB2YWx1ZSkKKyAgICB7CisgICAgICAg
IGlmIChtX29mZnNldCArIDIgPiBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgbWVtY3B5KHZhbHVlLCBtX2J1ZmZlciArIG1fb2Zmc2V0LCBzaXplb2YodWludDE2
X3QpKTsKKyAgICAgICAgKnZhbHVlID0gbnRvaHMoKnZhbHVlKTsKKyAgICAgICAgbV9vZmZzZXQg
Kz0gMjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBSZWFkUzE2KGlu
dDE2X3QqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlYWRVMTYocmVpbnRlcnByZXRf
Y2FzdDx1aW50MTZfdCo+KHZhbHVlKSk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCgpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9vZmZzZXQ7CisgICAgfQorCisgICAgdm9pZCBz
ZXRPZmZzZXQoc2l6ZV90IG5ld29mZnNldCkKKyAgICB7CisgICAgICAgIG1fb2Zmc2V0ID0gbmV3
b2Zmc2V0OworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IG1f
YnVmZmVyOworICAgIGNvbnN0IHNpemVfdCBtX2xlbmd0aDsKKyAgICBzaXplX3QgbV9vZmZzZXQ7
Cit9OworCisvLyBWRE1YIHBhcnNpbmcgY29kZS4KKy8vCisvLyBWRE1YIHRhYmxlcyBhcmUgZm91
bmQgaW4gc29tZSBUcnVlVHlwZS9PcGVuVHlwZSBmb250cyBhbmQgY29udGFpbgorLy8gYXNjZW5k
ZXIvZGVzY2VuZGVyIG92ZXJyaWRlcyBmb3IgY2VydGFpbiAodXN1YWxseSBzbWFsbCkgc2l6ZXMu
IFRoaXMgaXMKKy8vIG5lZWRlZCBpbiBvcmRlciB0byBtYXRjaCBmb250IG1ldHJpY3Mgb24gV2lu
ZG93cy4KKy8vCisvLyBGcmVldHlwZSBkb2VzIG5vdCBwYXJzZSB0aGVzZSB0YWJsZXMgc28gd2Ug
ZG8gc28gaGVyZS4gSW4gdGhlIGZ1dHVyZSB3ZQorLy8gbWlnaHQgc3VwcG9ydCBsb2FkaW5nIG9m
IGFyYml0YXJ5IGZvbnRzLiBUaGlzIGlzIG5vdCBzb21ldGhpbmcgdGhhdCBvbmUKKy8vIHdvdWxk
IHdpc2ggdG8gZG8sIGRhbmdlcm91cyBhcyBpdCBpcywgc28gd2UgYXJlIGNhcmVmdWwgd2hlcmUg
d2UgdHJlYWQuCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKy8vIFBhcnNlIGEgVHJ1ZVR5cGUgVkRNWCB0YWJsZS4KKy8vICAgeW1heDogKG91dHB1dCkg
dGhlIGFzY2VuZGVyIHZhbHVlIGZyb20gdGhlIHRhYmxlCisvLyAgIHltaW46IChvdXRwdXQpIHRo
ZSBkZXNjZW5kZXIgdmFsdWUgZnJvbSB0aGUgdGFibGUgKG5lZ2F0aXZlISkKKy8vICAgdmRteDog
dGhlIHRhYmxlIGJ5dGVzCisvLyAgIHZkbXhfbGVuZ3RoOiBsZW5ndGggb2YgQHZkbXgsIGluIGJ5
dGVzCisvLyAgIHRhcmdldF9wZWxzaXplOiB0aGUgcGl4ZWwgc2l6ZSBvZiB0aGUgZm9udCAoZS5n
LiAxNikKKy8vCisvLyBSZXR1cm5zIHRydWUgaWZmIGEgc3VpdGFibGUgbWF0Y2ggYXJlIGZvdW5k
LiBPdGhlcndpc2UsICp5bWF4IGFuZCAqeW1pbiBhcmUKKy8vIHVudG91Y2hlZC4gc2l6ZV90IG11
c3QgYmUgMzItYml0cyB0byBhdm9pZCBvdmVyZmxvdy4KKy8vCisvLyBTZWUgaHR0cDovL3d3dy5t
aWNyb3NvZnQuY29tL29wZW50eXBlL290c3BlYy92ZG14Lmh0bQorLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KK2Jvb2wgQ2hyb21pdW1WRE1YUGFyc2UoaW50KiB5bWF4LCBpbnQqIHltaW4sCisgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZkbXgsIGNvbnN0IHNpemVfdCB2ZG14
TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCB0YXJnZXRQZWxT
aXplKQoreworICAgIEJ1ZmZlciBidWYodmRteCwgdmRteExlbmd0aCk7CisKKyAgICAvLyBXZSBp
Z25vcmUgdGhlIHZlcnNpb24uIEZ1dHVyZSB0YWJsZXMgc2hvdWxkIGJlIGJhY2t3YXJkcyBjb21w
YXRpYmxlIHdpdGgKKyAgICAvLyB0aGlzIGxheW91dC4KKyAgICB1aW50MTZfdCBudW1SYXRpb3M7
CisgICAgaWYgKCFidWYuU2tpcCg0KSB8fAorICAgICAgICAhYnVmLlJlYWRVMTYoJm51bVJhdGlv
cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworCisgICAgLy8gTm93IHdlIGhhdmUgdHdvIHRh
Ymxlcy4gRmlyc3RseSB3ZSBoYXZlIEBudW1SYXRpb3MgUmF0aW8gcmVjb3JkcywgdGhlbiBhCisg
ICAgLy8gbWF0Y2hpbmcgYXJyYXkgb2YgQG51bVJhdGlvcyBvZmZzZXRzLiBXZSBzYXZlIHRoZSBv
ZmZzZXQgb2YgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoaXMgc2Vjb25kIHRhYmxlLgorICAg
IC8vCisgICAgLy8gUmFuZ2UgNiA8PSB4IDw9IDI2MjE0NgorICAgIHVuc2lnbmVkIGxvbmcgb2Zm
c2V0VGFibGVPZmZzZXQgPQorICAgICAgICBidWYub2Zmc2V0KCkgKyA0IC8qIHNpemVvZiBzdHJ1
Y3QgcmF0aW8gKi8gKiBudW1SYXRpb3M7CisKKyAgICB1bnNpZ25lZCBkZXNpcmVkUmF0aW8gPSAw
eGZmZmZmZmZmOworICAgIC8vIFdlIHJlYWQgNCBieXRlcyBwZXIgcmVjb3JkLCBzbyB0aGUgb2Zm
c2V0IHJhbmdlIGlzCisgICAgLy8gICA2IDw9IHggPD0gNTI0Mjg2CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG51bVJhdGlvczsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgeFJhdGlvLCB5
UmF0aW8xLCB5UmF0aW8yOworCisgICAgICAgIGlmICghYnVmLlNraXAoMSkgfHwKKyAgICAgICAg
ICAgICFidWYuUmVhZFU4KCZ4UmF0aW8pIHx8CisgICAgICAgICAgICAhYnVmLlJlYWRVOCgmeVJh
dGlvMSkgfHwKKyAgICAgICAgICAgICFidWYuUmVhZFU4KCZ5UmF0aW8yKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUaGlzIGVpdGhlciBjb3ZlcnMgMToxLCBvciB0
aGlzIGlzIHRoZSBkZWZhdWx0IGVudHJ5ICgwLCAwLCAwKQorICAgICAgICBpZiAoKHhSYXRpbyA9
PSAxICYmIHlSYXRpbzEgPD0gMSAmJiB5UmF0aW8yID49IDEpIHx8CisgICAgICAgICAgICAoeFJh
dGlvID09IDAgJiYgeVJhdGlvMSA9PSAwICYmIHlSYXRpbzIgPT0gMCkpIHsKKyAgICAgICAgICAg
IGRlc2lyZWRSYXRpbyA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGlmIChkZXNpcmVkUmF0aW8gPT0gMHhmZmZmZmZmZikgIC8vIG5vIHJhdGlvIGZvdW5k
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJhbmdlIDEwIDw9IHggPD0gMzkzMjE2
CisgICAgYnVmLnNldE9mZnNldChvZmZzZXRUYWJsZU9mZnNldCArIHNpemVvZih1aW50MTZfdCkg
KiBkZXNpcmVkUmF0aW8pOworCisgICAgLy8gTm93IHdlIHJlYWQgZnJvbSB0aGUgb2Zmc2V0IHRh
YmxlIHRvIGdldCB0aGUgb2Zmc2V0IG9mIGFub3RoZXIgYXJyYXkKKyAgICB1aW50MTZfdCBncm91
cE9mZnNldDsKKyAgICBpZiAoIWJ1Zi5SZWFkVTE2KCZncm91cE9mZnNldCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAvLyBSYW5nZSAwIDw9IHggPD0gNjU1MzUKKyAgICBidWYuc2V0T2Zm
c2V0KGdyb3VwT2Zmc2V0KTsKKworICAgIHVpbnQxNl90IG51bVJlY29yZHM7CisgICAgaWYgKCFi
dWYuUmVhZFUxNigmbnVtUmVjb3JkcykgfHwKKyAgICAgICAgIWJ1Zi5Ta2lwKHNpemVvZih1aW50
MTZfdCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBXZSByZWFkIDYgYnl0ZXMg
cGVyIHJlY29yZCwgc28gdGhlIG9mZnNldCByYW5nZSBpcworICAgIC8vICAgNCA8PSB4IDw9IDQ1
ODc0OQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1SZWNvcmRzOyArK2kpIHsKKyAg
ICAgICAgdWludDE2X3QgcGVsU2l6ZTsKKyAgICAgICAgaWYgKCFidWYuUmVhZFUxNigmcGVsU2l6
ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIHRoZSBlbnRyaWVzIGFy
ZSBzb3J0ZWQsIHNvIHdlIGNhbiBhYm9ydCBlYXJseSBpZiBuZWVkIGJlCisgICAgICAgIGlmIChw
ZWxTaXplID4gdGFyZ2V0UGVsU2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
ICAgICBpZiAocGVsU2l6ZSA9PSB0YXJnZXRQZWxTaXplKSB7CisgICAgICAgICAgICBpbnQxNl90
IHRlbXBZTWF4LCB0ZW1wWU1pbjsKKyAgICAgICAgICAgIGlmICghYnVmLlJlYWRTMTYoJnRlbXBZ
TWF4KSB8fAorICAgICAgICAgICAgICAgICFidWYuUmVhZFMxNigmdGVtcFlNaW4pKQorICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICp5bWluID0gdGVtcFlNaW47Cisg
ICAgICAgICAgICAqeW1heCA9IHRlbXBZTWF4OworICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFidWYuU2tpcCgyICogc2l6ZW9mKGludDE2
X3QpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VHJ1ZVR5cGVMaW51eC5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VHJ1ZVR5cGVMaW51eC5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjk2YWMKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxp
bnV4LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEZvbnRUcnVlVHlwZUxpbnV4X2gKKyNkZWZp
bmUgRm9udFRydWVUeXBlTGludXhfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgYm9vbCBD
aHJvbWl1bVZETVhQYXJzZShpbnQqIHltYXgsIGludCogeW1pbiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZkbXgsIGNvbnN0IHNpemVfdCB2ZG14X2xlbmd0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHRhcmdldF9wZWxzaXpl
KTsKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vU2ltcGxlRm9udERhdGFMaW51eC5jcHAK
aW5kZXggZjUwNjNiNi4uNzcyOTFiMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRhTGludXguY3BwCkBAIC0zMywxOSAr
MzMsMjQgQEAKIAogI2luY2x1ZGUgIkZvbnQuaCIKICNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNp
bmNsdWRlICJGb250VHJ1ZVR5cGVMaW51eC5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2lu
Y2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgogCisjaW5jbHVkZSAiU2tGb250SG9zdC5oIgogI2luY2x1ZGUg
IlNrUGFpbnQuaCIKLSNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tUaW1lLmgi
CisjaW5jbHVkZSAiU2tUeXBlZmFjZS5oIgorI2luY2x1ZGUgIlNrVHlwZXMuaCIKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCiAvLyBTbWFsbGNhcHMgdmVyc2lvbnMgb2YgZm9udHMgYXJlIDcwJSB0
aGUgc2l6ZSBvZiB0aGUgbm9ybWFsIGZvbnQuCiBzdGF0aWMgY29uc3QgZmxvYXQgc21hbGxDYXBz
RnJhY3Rpb24gPSAwLjdmOworLy8gVGhpcyBpcyB0aGUgbGFyZ2VzdCBWRE1YIHRhYmxlIHdoaWNo
IHdlJ2xsIHRyeSB0byBsb2FkIGFuZCBwYXJzZS4KK3N0YXRpYyBjb25zdCBzaXplX3QgbWF4VkRN
WFRhYmxlU2l6ZSA9IDEwMjQgKiAxMDI0OyAgLy8gMSBNQgogCiB2b2lkIFNpbXBsZUZvbnREYXRh
OjpwbGF0Zm9ybUluaXQoKQogewpAQCAtNTQsMTQgKzU5LDMwIEBAIHZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtSW5pdCgpCiAKICAgICBtX2ZvbnQuc2V0dXBQYWludCgmcGFpbnQpOwogICAg
IHBhaW50LmdldEZvbnRNZXRyaWNzKCZtZXRyaWNzKTsKKyAgICBjb25zdCBTa0ZvbnRJRCBmb250
SUQgPSBtX2ZvbnQudW5pcXVlSUQoKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCB2ZG14
VGFnID0gU2tTZXRGb3VyQnl0ZVRhZygnVicsICdEJywgJ00nLCAnWCcpOworICAgIGludCBwZWxT
aXplID0gbV9mb250LnNpemUoKSArIDAuNTsKKyAgICBpbnQgdmRteEFzY2VudCwgdmRteERlc2Nl
bnQ7CisgICAgYm9vbCB2ZG14VmFsaWQgPSBmYWxzZTsKKworICAgIHNpemVfdCB2ZG14U2l6ZSA9
IFNrRm9udEhvc3Q6OkdldFRhYmxlU2l6ZShmb250SUQsIHZkbXhUYWcpOworICAgIGlmICh2ZG14
U2l6ZSAmJiB2ZG14U2l6ZSA8IG1heFZETVhUYWJsZVNpemUpIHsKKyAgICAgICAgdWludDhfdCAq
dmRteFRhYmxlID0gKHVpbnQ4X3QgKikgbWFsbG9jKHZkbXhTaXplKTsKKyAgICAgICAgaWYgKHZk
bXhUYWJsZQorICAgICAgICAgICAgJiYgU2tGb250SG9zdDo6R2V0VGFibGVEYXRhKGZvbnRJRCwg
dmRteFRhZywgMCwgdmRteFNpemUsIHZkbXhUYWJsZSkgPT0gdmRteFNpemUKKyAgICAgICAgICAg
ICYmIENocm9taXVtVkRNWFBhcnNlKCZ2ZG14QXNjZW50LCAmdmRteERlc2NlbnQsIHZkbXhUYWJs
ZSwgdmRteFNpemUsIHBlbFNpemUpKQorICAgICAgICAgICAgdmRteFZhbGlkID0gdHJ1ZTsKKyAg
ICAgICAgZnJlZSh2ZG14VGFibGUpOworICAgIH0KIAogICAgIC8vIEJld2FyZSB0aG9zZSB3aG8g
c3RlcCBoZXJlOiBUaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gbWF0Y2ggV2luMzIgZm9udAogICAg
IC8vIG1ldHJpY3MgKmV4YWN0bHkqLgotICAgIGlmIChtZXRyaWNzLmZWRE1YTWV0cmljc1ZhbGlk
KSB7Ci0gICAgICAgIG1fYXNjZW50ID0gbWV0cmljcy5mVkRNWEFzY2VudDsKLSAgICAgICAgbV9k
ZXNjZW50ID0gbWV0cmljcy5mVkRNWERlc2NlbnQ7CisgICAgaWYgKHZkbXhWYWxpZCkgeworICAg
ICAgICBtX2FzY2VudCA9IHZkbXhBc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IC12ZG14RGVz
Y2VudDsKICAgICB9IGVsc2UgewotICAgICAgICBTa1NjYWxhciBoZWlnaHQgPSBtZXRyaWNzLmZB
c2NlbnQgKyBtZXRyaWNzLmZEZXNjZW50ICsgbWV0cmljcy5mTGVhZGluZzsKKyAgICAgICAgU2tT
Y2FsYXIgaGVpZ2h0ID0gLW1ldHJpY3MuZkFzY2VudCArIG1ldHJpY3MuZkRlc2NlbnQgKyBtZXRy
aWNzLmZMZWFkaW5nOwogICAgICAgICBtX2FzY2VudCA9IFNrU2NhbGFyUm91bmQoLW1ldHJpY3Mu
ZkFzY2VudCk7CiAgICAgICAgIG1fZGVzY2VudCA9IFNrU2NhbGFyUm91bmQoaGVpZ2h0KSAtIG1f
YXNjZW50OwogICAgIH0KQEAgLTE1Nyw3ICsxNzgsNyBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAogCiAgICAgcGFpbnQuc2V0
VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CiAgICAgU2tTY2Fs
YXIgd2lkdGggPSBwYWludC5tZWFzdXJlVGV4dCgmZ2x5cGgsIDIpOwotICAgIAorCiAgICAgcmV0
dXJuIFNrU2NhbGFyVG9GbG9hdCh3aWR0aCk7CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29376</attachid>
            <date>2009-04-09 15:31:48 -0700</date>
            <delta_ts>2009-04-10 11:29:04 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>15195</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGRhNTk1YS4uYTlhNmJmYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMCBAQAorMjAwOS0wNC0wOSAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgTW92ZSBWRE1YIHBhcnNpbmcgaW50byB0aGUgQ2hyb21pdW0gTGludXggcG9y
dC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjUx
MTYKKworICAgICAgICBWRE1YIHRhYmxlcyBhcmUgb3B0aW9uYWwgdGFibGVzIGluIFRydWVUeXBl
IGZvbnRzIHdoaWNoIGNvbnRhaW4gdGhlCisgICAgICAgIGV4YWN0IHBpeGVsIGhlaWdodCBvZiBh
IGdpdmVuIGZvbnQgYXQgYSBnaXZlbiBwZWwgc2l6ZS4gSW4gb3JkZXIgdG8KKyAgICAgICAgbWF0
Y2ggV2luZG93cyBmb250IG1ldHJpY3Mgd2UgaGF2ZSB0byB1c2UgdGhlc2UgbnVtYmVycy4KKwor
ICAgICAgICBQcmV2aW91c2x5LCB0aGUgcGFyc2luZyB3YXMgcGVyZm9ybWVkIGluIFNraWEuIEFz
IHBhcnQgb2YgdGhlIG1lcmdlCisgICAgICAgIHdpdGggdXBzdHJlYW0gU2tpYSwgYW4gaW50ZXJm
YWNlIGZvciBnZXR0aW5nIHRhYmxlIGRhdGEgZnJvbSBhIGZvbnQKKyAgICAgICAgaGFzIGJlZW4g
YWRkZWQgdG8gU2tpYSBhbmQgd2UncmUgbW92aW5nIHRoZSBwYXJzaW5nIGludG8gV2ViS2l0Lgor
CisgICAgICAgIFRoaXMgZG9lcyBub3QgY2hhbmdlIGFueSBsYXlvdXQgdGVzdHMuCisKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGludXguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6dW5pcXVlSUQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFRydWVU
eXBlTGludXguaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
U2ltcGxlRm9udERhdGFMaW51eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0
YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybVdpZHRoRm9yR2x5cGgpOgorCiAyMDA5LTA0LTA5ICBEYXZpZCBLaWx6ZXIgIDxkZGtpbHpl
ckBhcHBsZS5jb20+CiAKICAgICAgICAgUmVpbnN0YXRpbmcgPHJkYXI6Ly9wcm9ibGVtLzY3MTg1
ODk+IE9wdGlvbiB0byB0dXJuIG9mZiBTVkcgRE9NIE9iamVjdGl2ZS1DIGJpbmRpbmdzCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURh
dGFMaW51eC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0
Zm9ybURhdGFMaW51eC5jcHAKaW5kZXggN2I3ZDE5Ny4uZTZhNjFmNiAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGludXguY3Bw
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0
YUxpbnV4LmNwcApAQCAtOTUsNiArOTUsMTEgQEAgdm9pZCBGb250UGxhdGZvcm1EYXRhOjpzZXR1
cFBhaW50KFNrUGFpbnQqIHBhaW50KSBjb25zdAogICAgIHBhaW50LT5zZXRUZXh0RW5jb2Rpbmco
U2tQYWludDo6a1VURjE2X1RleHRFbmNvZGluZyk7CiB9CiAKK1NrRm9udElEIEZvbnRQbGF0Zm9y
bURhdGE6OnVuaXF1ZUlEKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90eXBlZmFjZS0+dW5pcXVl
SUQoKTsKK30KKwogYm9vbCBGb250UGxhdGZvcm1EYXRhOjpvcGVyYXRvcj09KGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIGEpIGNvbnN0CiB7CiAgICAgLy8gSWYgZWl0aGVyIG9mIHRoZSB0eXBlZmFj
ZSBwb2ludGVycyBhcmUgaW52YWxpZCAoZWl0aGVyIE5VTEwgb3IgdGhlCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGlu
dXguaAppbmRleCBlYzdkODM3Li5jNjNhODYwIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0YUxpbnV4LmgKQEAgLTM2
LDYgKzM2LDcgQEAKIAogY2xhc3MgU2tQYWludDsKIGNsYXNzIFNrVHlwZWZhY2U7Cit0eXBlZGVm
IHVpbnQzMl90IFNrRm9udElEOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTkwLDYgKzkx
LDEyIEBAIHB1YmxpYzoKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgdm9pZCBzZXR1cFBh
aW50KFNrUGFpbnQqKSBjb25zdDsKIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBS
ZXR1cm4gU2tpYSdzIHVuaXF1ZSBpZCBmb3IgdGhpcyBmb250LiBUaGlzIGVuY29kZXMgYm90aCB0
aGUgc3R5bGUgYW5kCisgICAgLy8gdGhlIGZvbnQncyBmaWxlIG5hbWUgc28gcmVmZXJzIHRvIGEg
c2luZ2xlIGZhY2UuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNrRm9udElEIHVuaXF1
ZUlEKCkgY29uc3Q7CisKICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3Q7CiAgICAgZmxvYXQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dFNpemU7IH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VHJ1ZVR5cGVMaW51eC5jcHAgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBiMGJjCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VHJ1ZVR5cGVMaW51eC5jcHAK
QEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0
ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisv
LyBGb3IgaHRvbnMvbnRvaHMKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworLy8gQnVmZmVyIGhl
bHBlciBjbGFzcworLy8KKy8vIFRoaXMgY2xhc3MgcGVyZm9ybSBzb21lIHRyaXZhbCBidWZmZXIg
b3BlcmF0aW9ucyB3aGlsZSBjaGVja2luZyBmb3IKKy8vIG91dC1vZi1ib3VuZHMgZXJyb3JzLiBB
cyBhIGZhbWlseSB0aGV5IHJldHVybiBmYWxzZSBpZiBhbnl0aGluZyBpcyBhbWlzcywKKy8vIHVw
ZGF0aW5nIHRoZSBjdXJyZW50IG9mZnNldCBvdGhlcndpc2UuCitjbGFzcyBCdWZmZXIKK3sKKyAg
cHVibGljOgorICAgIEJ1ZmZlcihjb25zdCB1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW5ndGgp
CisgICAgICAgIDogbV9idWZmZXIoYnVmZmVyKQorICAgICAgICAsIG1fbGVuZ3RoKGxlbmd0aCkK
KyAgICAgICAgLCBtX29mZnNldCgwKQorICAgICAgICB7IH0KKworICAgIGJvb2wgc2tpcChzaXpl
X3QgbnVtQnl0ZXMpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyBudW1CeXRlcyA+IG1f
bGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBtX29mZnNldCArPSBu
dW1CeXRlczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWFkVTgo
dWludDhfdCogdmFsdWUpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyAxID4gbV9sZW5n
dGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICp2YWx1ZSA9IG1fYnVmZmVy
W21fb2Zmc2V0XTsKKyAgICAgICAgbV9vZmZzZXQrKzsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgYm9vbCByZWFkVTE2KHVpbnQxNl90KiB2YWx1ZSkKKyAgICB7CisgICAgICAg
IGlmIChtX29mZnNldCArIDIgPiBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgbWVtY3B5KHZhbHVlLCBtX2J1ZmZlciArIG1fb2Zmc2V0LCBzaXplb2YodWludDE2
X3QpKTsKKyAgICAgICAgKnZhbHVlID0gbnRvaHMoKnZhbHVlKTsKKyAgICAgICAgbV9vZmZzZXQg
Kz0gMjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWFkUzE2KGlu
dDE2X3QqIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRVMTYocmVpbnRlcnByZXRf
Y2FzdDx1aW50MTZfdCo+KHZhbHVlKSk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCgpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9vZmZzZXQ7CisgICAgfQorCisgICAgdm9pZCBz
ZXRPZmZzZXQoc2l6ZV90IG5ld29mZnNldCkKKyAgICB7CisgICAgICAgIG1fb2Zmc2V0ID0gbmV3
b2Zmc2V0OworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IG1f
YnVmZmVyOworICAgIGNvbnN0IHNpemVfdCBtX2xlbmd0aDsKKyAgICBzaXplX3QgbV9vZmZzZXQ7
Cit9OworCisvLyBWRE1YIHBhcnNpbmcgY29kZS4KKy8vCisvLyBWRE1YIHRhYmxlcyBhcmUgZm91
bmQgaW4gc29tZSBUcnVlVHlwZS9PcGVuVHlwZSBmb250cyBhbmQgY29udGFpbgorLy8gYXNjZW5k
ZXIvZGVzY2VuZGVyIG92ZXJyaWRlcyBmb3IgY2VydGFpbiAodXN1YWxseSBzbWFsbCkgc2l6ZXMu
IFRoaXMgaXMKKy8vIG5lZWRlZCBpbiBvcmRlciB0byBtYXRjaCBmb250IG1ldHJpY3Mgb24gV2lu
ZG93cy4KKy8vCisvLyBGcmVldHlwZSBkb2VzIG5vdCBwYXJzZSB0aGVzZSB0YWJsZXMgc28gd2Ug
ZG8gc28gaGVyZS4gSW4gdGhlIGZ1dHVyZSB3ZQorLy8gbWlnaHQgc3VwcG9ydCBsb2FkaW5nIG9m
IGFyYml0YXJ5IGZvbnRzLiBUaGlzIGlzIG5vdCBzb21ldGhpbmcgdGhhdCBvbmUKKy8vIHdvdWxk
IHdpc2ggdG8gZG8sIGRhbmdlcm91cyBhcyBpdCBpcywgc28gd2UgYXJlIGNhcmVmdWwgd2hlcmUg
d2UgdHJlYWQuCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKy8vIFBhcnNlIGEgVHJ1ZVR5cGUgVkRNWCB0YWJsZS4KKy8vICAgeW1heDogKG91dHB1dCkg
dGhlIGFzY2VuZGVyIHZhbHVlIGZyb20gdGhlIHRhYmxlCisvLyAgIHltaW46IChvdXRwdXQpIHRo
ZSBkZXNjZW5kZXIgdmFsdWUgZnJvbSB0aGUgdGFibGUgKG5lZ2F0aXZlISkKKy8vICAgdmRteDog
dGhlIHRhYmxlIGJ5dGVzCisvLyAgIHZkbXhMZW5ndGg6IGxlbmd0aCBvZiBAdmRteCwgaW4gYnl0
ZXMKKy8vICAgdGFyZ2V0UGVsU2l6ZTogdGhlIHBpeGVsIHNpemUgb2YgdGhlIGZvbnQgKGUuZy4g
MTYpCisvLworLy8gUmV0dXJucyB0cnVlIGlmZiBhIHN1aXRhYmxlIG1hdGNoIGFyZSBmb3VuZC4g
T3RoZXJ3aXNlLCAqeW1heCBhbmQgKnltaW4gYXJlCisvLyB1bnRvdWNoZWQuIHNpemVfdCBtdXN0
IGJlIDMyLWJpdHMgdG8gYXZvaWQgb3ZlcmZsb3cuCisvLworLy8gU2VlIGh0dHA6Ly93d3cubWlj
cm9zb2Z0LmNvbS9vcGVudHlwZS9vdHNwZWMvdmRteC5odG0KKy8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCitib29sIHRydWVUeXBlVkRNWFBhcnNlKGludCogeW1heCwgaW50KiB5bWluLAorICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2ZG14LCBjb25zdCBzaXplX3QgdmRteExl
bmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgdGFyZ2V0UGVsU2l6
ZSkKK3sKKyAgICBCdWZmZXIgYnVmKHZkbXgsIHZkbXhMZW5ndGgpOworCisgICAgLy8gV2UgaWdu
b3JlIHRoZSB2ZXJzaW9uLiBGdXR1cmUgdGFibGVzIHNob3VsZCBiZSBiYWNrd2FyZHMgY29tcGF0
aWJsZSB3aXRoCisgICAgLy8gdGhpcyBsYXlvdXQuCisgICAgdWludDE2X3QgbnVtUmF0aW9zOwor
ICAgIGlmICghYnVmLnNraXAoNCkgfHwKKyAgICAgICAgIWJ1Zi5yZWFkVTE2KCZudW1SYXRpb3Mp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBOb3cgd2UgaGF2ZSB0d28gdGFibGVz
LiBGaXJzdGx5IHdlIGhhdmUgQG51bVJhdGlvcyBSYXRpbyByZWNvcmRzLCB0aGVuIGEKKyAgICAv
LyBtYXRjaGluZyBhcnJheSBvZiBAbnVtUmF0aW9zIG9mZnNldHMuIFdlIHNhdmUgdGhlIG9mZnNl
dCBvZiB0aGUgYmVnaW5uaW5nCisgICAgLy8gb2YgdGhpcyBzZWNvbmQgdGFibGUuCisgICAgLy8K
KyAgICAvLyBSYW5nZSA2IDw9IHggPD0gMjYyMTQ2CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXRU
YWJsZU9mZnNldCA9CisgICAgICAgIGJ1Zi5vZmZzZXQoKSArIDQgLyogc2l6ZW9mIHN0cnVjdCBy
YXRpbyAqLyAqIG51bVJhdGlvczsKKworICAgIHVuc2lnbmVkIGRlc2lyZWRSYXRpbyA9IDB4ZmZm
ZmZmZmY7CisgICAgLy8gV2UgcmVhZCA0IGJ5dGVzIHBlciByZWNvcmQsIHNvIHRoZSBvZmZzZXQg
cmFuZ2UgaXMKKyAgICAvLyAgIDYgPD0geCA8PSA1MjQyODYKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbnVtUmF0aW9zOyArK2kpIHsKKyAgICAgICAgdWludDhfdCB4UmF0aW8sIHlSYXRp
bzEsIHlSYXRpbzI7CisKKyAgICAgICAgaWYgKCFidWYuc2tpcCgxKSB8fAorICAgICAgICAgICAg
IWJ1Zi5yZWFkVTgoJnhSYXRpbykgfHwKKyAgICAgICAgICAgICFidWYucmVhZFU4KCZ5UmF0aW8x
KSB8fAorICAgICAgICAgICAgIWJ1Zi5yZWFkVTgoJnlSYXRpbzIpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIC8vIFRoaXMgZWl0aGVyIGNvdmVycyAxOjEsIG9yIHRoaXMg
aXMgdGhlIGRlZmF1bHQgZW50cnkgKDAsIDAsIDApCisgICAgICAgIGlmICgoeFJhdGlvID09IDEg
JiYgeVJhdGlvMSA8PSAxICYmIHlSYXRpbzIgPj0gMSkgfHwKKyAgICAgICAgICAgICh4UmF0aW8g
PT0gMCAmJiB5UmF0aW8xID09IDAgJiYgeVJhdGlvMiA9PSAwKSkgeworICAgICAgICAgICAgZGVz
aXJlZFJhdGlvID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGRlc2lyZWRSYXRpbyA9PSAweGZmZmZmZmZmKSAgLy8gbm8gcmF0aW8gZm91bmQKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUmFuZ2UgMTAgPD0geCA8PSAzOTMyMTYKKyAg
ICBidWYuc2V0T2Zmc2V0KG9mZnNldFRhYmxlT2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KSAqIGRl
c2lyZWRSYXRpbyk7CisKKyAgICAvLyBOb3cgd2UgcmVhZCBmcm9tIHRoZSBvZmZzZXQgdGFibGUg
dG8gZ2V0IHRoZSBvZmZzZXQgb2YgYW5vdGhlciBhcnJheQorICAgIHVpbnQxNl90IGdyb3VwT2Zm
c2V0OworICAgIGlmICghYnVmLnJlYWRVMTYoJmdyb3VwT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIC8vIFJhbmdlIDAgPD0geCA8PSA2NTUzNQorICAgIGJ1Zi5zZXRPZmZzZXQo
Z3JvdXBPZmZzZXQpOworCisgICAgdWludDE2X3QgbnVtUmVjb3JkczsKKyAgICBpZiAoIWJ1Zi5y
ZWFkVTE2KCZudW1SZWNvcmRzKSB8fAorICAgICAgICAhYnVmLnNraXAoc2l6ZW9mKHVpbnQxNl90
KSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFdlIHJlYWQgNiBieXRlcyBwZXIg
cmVjb3JkLCBzbyB0aGUgb2Zmc2V0IHJhbmdlIGlzCisgICAgLy8gICA0IDw9IHggPD0gNDU4NzQ5
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bVJlY29yZHM7ICsraSkgeworICAgICAg
ICB1aW50MTZfdCBwZWxTaXplOworICAgICAgICBpZiAoIWJ1Zi5yZWFkVTE2KCZwZWxTaXplKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gdGhlIGVudHJpZXMgYXJlIHNv
cnRlZCwgc28gd2UgY2FuIGFib3J0IGVhcmx5IGlmIG5lZWQgYmUKKyAgICAgICAgaWYgKHBlbFNp
emUgPiB0YXJnZXRQZWxTaXplKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAg
IGlmIChwZWxTaXplID09IHRhcmdldFBlbFNpemUpIHsKKyAgICAgICAgICAgIGludDE2X3QgdGVt
cFlNYXgsIHRlbXBZTWluOworICAgICAgICAgICAgaWYgKCFidWYucmVhZFMxNigmdGVtcFlNYXgp
IHx8CisgICAgICAgICAgICAgICAgIWJ1Zi5yZWFkUzE2KCZ0ZW1wWU1pbikpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgKnltaW4gPSB0ZW1wWU1pbjsKKyAgICAg
ICAgICAgICp5bWF4ID0gdGVtcFlNYXg7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIWJ1Zi5za2lwKDIgKiBzaXplb2YoaW50MTZfdCkp
KQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2ZDYyYQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFRydWVUeXBlTGludXgu
aApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRm9udFRydWVUeXBlTGludXhfaAorI2RlZmluZSBG
b250VHJ1ZVR5cGVMaW51eF9oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBib29sIHRydWVU
eXBlVkRNWFBhcnNlKGludCogeW1heCwgaW50KiB5bWluLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgdWludDhfdCogdmRteCwgY29uc3Qgc2l6ZV90IHZkbXhMZW5ndGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCB0YXJnZXRQZWxTaXplKTsKK30g
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vU2ltcGxlRm9udERhdGFMaW51eC5jcHAKaW5kZXgg
ZjUwNjNiNi4uZDI2YjBmZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRhTGludXguY3BwCkBAIC0zMywxOSArMzMsMjQg
QEAKIAogI2luY2x1ZGUgIkZvbnQuaCIKICNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRl
ICJGb250VHJ1ZVR5cGVMaW51eC5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUg
IkZvbnREZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJOb3RJ
bXBsZW1lbnRlZC5oIgogCisjaW5jbHVkZSAiU2tGb250SG9zdC5oIgogI2luY2x1ZGUgIlNrUGFp
bnQuaCIKLSNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tUaW1lLmgiCisjaW5j
bHVkZSAiU2tUeXBlZmFjZS5oIgorI2luY2x1ZGUgIlNrVHlwZXMuaCIKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiAvLyBTbWFsbGNhcHMgdmVyc2lvbnMgb2YgZm9udHMgYXJlIDcwJSB0aGUgc2l6
ZSBvZiB0aGUgbm9ybWFsIGZvbnQuCiBzdGF0aWMgY29uc3QgZmxvYXQgc21hbGxDYXBzRnJhY3Rp
b24gPSAwLjdmOworLy8gVGhpcyBpcyB0aGUgbGFyZ2VzdCBWRE1YIHRhYmxlIHdoaWNoIHdlJ2xs
IHRyeSB0byBsb2FkIGFuZCBwYXJzZS4KK3N0YXRpYyBjb25zdCBzaXplX3QgbWF4VkRNWFRhYmxl
U2l6ZSA9IDEwMjQgKiAxMDI0OyAgLy8gMSBNQgogCiB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybUluaXQoKQogewpAQCAtNTQsMTQgKzU5LDMwIEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtSW5pdCgpCiAKICAgICBtX2ZvbnQuc2V0dXBQYWludCgmcGFpbnQpOwogICAgIHBhaW50
LmdldEZvbnRNZXRyaWNzKCZtZXRyaWNzKTsKKyAgICBjb25zdCBTa0ZvbnRJRCBmb250SUQgPSBt
X2ZvbnQudW5pcXVlSUQoKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCB2ZG14VGFnID0g
U2tTZXRGb3VyQnl0ZVRhZygnVicsICdEJywgJ00nLCAnWCcpOworICAgIGludCBwZWxTaXplID0g
bV9mb250LnNpemUoKSArIDAuNTsKKyAgICBpbnQgdmRteEFzY2VudCwgdmRteERlc2NlbnQ7Cisg
ICAgYm9vbCBpc1ZETVhWYWxpZCA9IGZhbHNlOworCisgICAgc2l6ZV90IHZkbXhTaXplID0gU2tG
b250SG9zdDo6R2V0VGFibGVTaXplKGZvbnRJRCwgdmRteFRhZyk7CisgICAgaWYgKHZkbXhTaXpl
ICYmIHZkbXhTaXplIDwgbWF4VkRNWFRhYmxlU2l6ZSkgeworICAgICAgICB1aW50OF90ICp2ZG14
VGFibGUgPSAodWludDhfdCAqKSBtYWxsb2ModmRteFNpemUpOworICAgICAgICBpZiAodmRteFRh
YmxlCisgICAgICAgICAgICAmJiBTa0ZvbnRIb3N0OjpHZXRUYWJsZURhdGEoZm9udElELCB2ZG14
VGFnLCAwLCB2ZG14U2l6ZSwgdmRteFRhYmxlKSA9PSB2ZG14U2l6ZQorICAgICAgICAgICAgJiYg
dHJ1ZVR5cGVWRE1YUGFyc2UoJnZkbXhBc2NlbnQsICZ2ZG14RGVzY2VudCwgdmRteFRhYmxlLCB2
ZG14U2l6ZSwgcGVsU2l6ZSkpCisgICAgICAgICAgICBpc1ZETVhWYWxpZCA9IHRydWU7CisgICAg
ICAgIGZyZWUodmRteFRhYmxlKTsKKyAgICB9CiAKICAgICAvLyBCZXdhcmUgdGhvc2Ugd2hvIHN0
ZXAgaGVyZTogVGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvIG1hdGNoIFdpbjMyIGZvbnQKICAgICAv
LyBtZXRyaWNzICpleGFjdGx5Ki4KLSAgICBpZiAobWV0cmljcy5mVkRNWE1ldHJpY3NWYWxpZCkg
ewotICAgICAgICBtX2FzY2VudCA9IG1ldHJpY3MuZlZETVhBc2NlbnQ7Ci0gICAgICAgIG1fZGVz
Y2VudCA9IG1ldHJpY3MuZlZETVhEZXNjZW50OworICAgIGlmIChpc1ZETVhWYWxpZCkgeworICAg
ICAgICBtX2FzY2VudCA9IHZkbXhBc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IC12ZG14RGVz
Y2VudDsKICAgICB9IGVsc2UgewotICAgICAgICBTa1NjYWxhciBoZWlnaHQgPSBtZXRyaWNzLmZB
c2NlbnQgKyBtZXRyaWNzLmZEZXNjZW50ICsgbWV0cmljcy5mTGVhZGluZzsKKyAgICAgICAgU2tT
Y2FsYXIgaGVpZ2h0ID0gLW1ldHJpY3MuZkFzY2VudCArIG1ldHJpY3MuZkRlc2NlbnQgKyBtZXRy
aWNzLmZMZWFkaW5nOwogICAgICAgICBtX2FzY2VudCA9IFNrU2NhbGFyUm91bmQoLW1ldHJpY3Mu
ZkFzY2VudCk7CiAgICAgICAgIG1fZGVzY2VudCA9IFNrU2NhbGFyUm91bmQoaGVpZ2h0KSAtIG1f
YXNjZW50OwogICAgIH0KQEAgLTE1Nyw3ICsxNzgsNyBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAogCiAgICAgcGFpbnQuc2V0
VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CiAgICAgU2tTY2Fs
YXIgd2lkdGggPSBwYWludC5tZWFzdXJlVGV4dCgmZ2x5cGgsIDIpOwotICAgIAorCiAgICAgcmV0
dXJuIFNrU2NhbGFyVG9GbG9hdCh3aWR0aCk7CiB9CiAK
</data>
<flag name="review"
          id="14606"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29393</attachid>
            <date>2009-04-10 11:29:04 -0700</date>
            <delta_ts>2009-04-14 22:08:39 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>14684</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGRhNTk1YS4uYTlhNmJmYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMCBAQAorMjAwOS0wNC0wOSAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgTW92ZSBWRE1YIHBhcnNpbmcgaW50byB0aGUgQ2hyb21pdW0gTGludXggcG9y
dC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjUx
MTYKKworICAgICAgICBWRE1YIHRhYmxlcyBhcmUgb3B0aW9uYWwgdGFibGVzIGluIFRydWVUeXBl
IGZvbnRzIHdoaWNoIGNvbnRhaW4gdGhlCisgICAgICAgIGV4YWN0IHBpeGVsIGhlaWdodCBvZiBh
IGdpdmVuIGZvbnQgYXQgYSBnaXZlbiBwZWwgc2l6ZS4gSW4gb3JkZXIgdG8KKyAgICAgICAgbWF0
Y2ggV2luZG93cyBmb250IG1ldHJpY3Mgd2UgaGF2ZSB0byB1c2UgdGhlc2UgbnVtYmVycy4KKwor
ICAgICAgICBQcmV2aW91c2x5LCB0aGUgcGFyc2luZyB3YXMgcGVyZm9ybWVkIGluIFNraWEuIEFz
IHBhcnQgb2YgdGhlIG1lcmdlCisgICAgICAgIHdpdGggdXBzdHJlYW0gU2tpYSwgYW4gaW50ZXJm
YWNlIGZvciBnZXR0aW5nIHRhYmxlIGRhdGEgZnJvbSBhIGZvbnQKKyAgICAgICAgaGFzIGJlZW4g
YWRkZWQgdG8gU2tpYSBhbmQgd2UncmUgbW92aW5nIHRoZSBwYXJzaW5nIGludG8gV2ViS2l0Lgor
CisgICAgICAgIFRoaXMgZG9lcyBub3QgY2hhbmdlIGFueSBsYXlvdXQgdGVzdHMuCisKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGludXguY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6dW5pcXVlSUQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRUcnVlVHlwZUxpbnV4LmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFRydWVU
eXBlTGludXguaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
U2ltcGxlRm9udERhdGFMaW51eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0
YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybVdpZHRoRm9yR2x5cGgpOgorCiAyMDA5LTA0LTA5ICBEYXZpZCBLaWx6ZXIgIDxkZGtpbHpl
ckBhcHBsZS5jb20+CiAKICAgICAgICAgUmVpbnN0YXRpbmcgPHJkYXI6Ly9wcm9ibGVtLzY3MTg1
ODk+IE9wdGlvbiB0byB0dXJuIG9mZiBTVkcgRE9NIE9iamVjdGl2ZS1DIGJpbmRpbmdzCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURh
dGFMaW51eC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0
Zm9ybURhdGFMaW51eC5jcHAKaW5kZXggN2I3ZDE5Ny4uZTZhNjFmNiAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGludXguY3Bw
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0
YUxpbnV4LmNwcApAQCAtOTUsNiArOTUsMTEgQEAgdm9pZCBGb250UGxhdGZvcm1EYXRhOjpzZXR1
cFBhaW50KFNrUGFpbnQqIHBhaW50KSBjb25zdAogICAgIHBhaW50LT5zZXRUZXh0RW5jb2Rpbmco
U2tQYWludDo6a1VURjE2X1RleHRFbmNvZGluZyk7CiB9CiAKK1NrRm9udElEIEZvbnRQbGF0Zm9y
bURhdGE6OnVuaXF1ZUlEKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90eXBlZmFjZS0+dW5pcXVl
SUQoKTsKK30KKwogYm9vbCBGb250UGxhdGZvcm1EYXRhOjpvcGVyYXRvcj09KGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIGEpIGNvbnN0CiB7CiAgICAgLy8gSWYgZWl0aGVyIG9mIHRoZSB0eXBlZmFj
ZSBwb2ludGVycyBhcmUgaW52YWxpZCAoZWl0aGVyIE5VTEwgb3IgdGhlCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZvcm1EYXRhTGlu
dXguaAppbmRleCBlYzdkODM3Li5jNjNhODYwIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0YUxpbnV4LmgKQEAgLTM2
LDYgKzM2LDcgQEAKIAogY2xhc3MgU2tQYWludDsKIGNsYXNzIFNrVHlwZWZhY2U7Cit0eXBlZGVm
IHVpbnQzMl90IFNrRm9udElEOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTkwLDYgKzkx
LDEyIEBAIHB1YmxpYzoKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgdm9pZCBzZXR1cFBh
aW50KFNrUGFpbnQqKSBjb25zdDsKIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBS
ZXR1cm4gU2tpYSdzIHVuaXF1ZSBpZCBmb3IgdGhpcyBmb250LiBUaGlzIGVuY29kZXMgYm90aCB0
aGUgc3R5bGUgYW5kCisgICAgLy8gdGhlIGZvbnQncyBmaWxlIG5hbWUgc28gcmVmZXJzIHRvIGEg
c2luZ2xlIGZhY2UuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNrRm9udElEIHVuaXF1
ZUlEKCkgY29uc3Q7CisKICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3Q7CiAgICAgZmxvYXQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dFNpemU7IH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vU2ltcGxlRm9udERhdGFMaW51eC5jcHAKaW5k
ZXggZjUwNjNiNi4uYjhhYjk4ZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1NpbXBsZUZvbnREYXRhTGludXguY3BwCkBAIC0zNywxNSArMzcs
MjAgQEAKICNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKICNpbmNsdWRlICJMb2dnaW5nLmgi
CiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJWRE1YUGFyc2VyLmgiCiAK
KyNpbmNsdWRlICJTa0ZvbnRIb3N0LmgiCiAjaW5jbHVkZSAiU2tQYWludC5oIgotI2luY2x1ZGUg
IlNrVHlwZWZhY2UuaCIKICNpbmNsdWRlICJTa1RpbWUuaCIKKyNpbmNsdWRlICJTa1R5cGVmYWNl
LmgiCisjaW5jbHVkZSAiU2tUeXBlcy5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIC8vIFNt
YWxsY2FwcyB2ZXJzaW9ucyBvZiBmb250cyBhcmUgNzAlIHRoZSBzaXplIG9mIHRoZSBub3JtYWwg
Zm9udC4KIHN0YXRpYyBjb25zdCBmbG9hdCBzbWFsbENhcHNGcmFjdGlvbiA9IDAuN2Y7CisvLyBU
aGlzIGlzIHRoZSBsYXJnZXN0IFZETVggdGFibGUgd2hpY2ggd2UnbGwgdHJ5IHRvIGxvYWQgYW5k
IHBhcnNlLgorc3RhdGljIGNvbnN0IHNpemVfdCBtYXhWRE1YVGFibGVTaXplID0gMTAyNCAqIDEw
MjQ7ICAvLyAxIE1CCiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCiB7CkBA
IC01NCwxNCArNTksMzAgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKIAog
ICAgIG1fZm9udC5zZXR1cFBhaW50KCZwYWludCk7CiAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3Mo
Jm1ldHJpY3MpOworICAgIGNvbnN0IFNrRm9udElEIGZvbnRJRCA9IG1fZm9udC51bmlxdWVJRCgp
OworCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHZkbXhUYWcgPSBTa1NldEZvdXJCeXRlVGFn
KCdWJywgJ0QnLCAnTScsICdYJyk7CisgICAgaW50IHBpeGVsU2l6ZSA9IG1fZm9udC5zaXplKCkg
KyAwLjU7CisgICAgaW50IHZkbXhBc2NlbnQsIHZkbXhEZXNjZW50OworICAgIGJvb2wgaXNWRE1Y
VmFsaWQgPSBmYWxzZTsKKworICAgIHNpemVfdCB2ZG14U2l6ZSA9IFNrRm9udEhvc3Q6OkdldFRh
YmxlU2l6ZShmb250SUQsIHZkbXhUYWcpOworICAgIGlmICh2ZG14U2l6ZSAmJiB2ZG14U2l6ZSA8
IG1heFZETVhUYWJsZVNpemUpIHsKKyAgICAgICAgdWludDhfdCogdmRteFRhYmxlID0gKHVpbnQ4
X3QqKSBmYXN0TWFsbG9jKHZkbXhTaXplKTsKKyAgICAgICAgaWYgKHZkbXhUYWJsZQorICAgICAg
ICAgICAgJiYgU2tGb250SG9zdDo6R2V0VGFibGVEYXRhKGZvbnRJRCwgdmRteFRhZywgMCwgdmRt
eFNpemUsIHZkbXhUYWJsZSkgPT0gdmRteFNpemUKKyAgICAgICAgICAgICYmIHBhcnNlVkRNWCgm
dmRteEFzY2VudCwgJnZkbXhEZXNjZW50LCB2ZG14VGFibGUsIHZkbXhTaXplLCBwaXhlbFNpemUp
KQorICAgICAgICAgICAgaXNWRE1YVmFsaWQgPSB0cnVlOworICAgICAgICBmYXN0RnJlZSh2ZG14
VGFibGUpOworICAgIH0KIAogICAgIC8vIEJld2FyZSB0aG9zZSB3aG8gc3RlcCBoZXJlOiBUaGlz
IGNvZGUgaXMgZGVzaWduZWQgdG8gbWF0Y2ggV2luMzIgZm9udAogICAgIC8vIG1ldHJpY3MgKmV4
YWN0bHkqLgotICAgIGlmIChtZXRyaWNzLmZWRE1YTWV0cmljc1ZhbGlkKSB7Ci0gICAgICAgIG1f
YXNjZW50ID0gbWV0cmljcy5mVkRNWEFzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gbWV0cmlj
cy5mVkRNWERlc2NlbnQ7CisgICAgaWYgKGlzVkRNWFZhbGlkKSB7CisgICAgICAgIG1fYXNjZW50
ID0gdmRteEFzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gLXZkbXhEZXNjZW50OwogICAgIH0g
ZWxzZSB7Ci0gICAgICAgIFNrU2NhbGFyIGhlaWdodCA9IG1ldHJpY3MuZkFzY2VudCArIG1ldHJp
Y3MuZkRlc2NlbnQgKyBtZXRyaWNzLmZMZWFkaW5nOworICAgICAgICBTa1NjYWxhciBoZWlnaHQg
PSAtbWV0cmljcy5mQXNjZW50ICsgbWV0cmljcy5mRGVzY2VudCArIG1ldHJpY3MuZkxlYWRpbmc7
CiAgICAgICAgIG1fYXNjZW50ID0gU2tTY2FsYXJSb3VuZCgtbWV0cmljcy5mQXNjZW50KTsKICAg
ICAgICAgbV9kZXNjZW50ID0gU2tTY2FsYXJSb3VuZChoZWlnaHQpIC0gbV9hc2NlbnQ7CiAgICAg
fQpAQCAtMTU3LDcgKzE3OCw3IEBAIGZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRo
Rm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0CiAKICAgICBwYWludC5zZXRUZXh0RW5jb2Rpbmco
U2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKICAgICBTa1NjYWxhciB3aWR0aCA9IHBh
aW50Lm1lYXN1cmVUZXh0KCZnbHlwaCwgMik7Ci0gICAgCisKICAgICByZXR1cm4gU2tTY2FsYXJU
b0Zsb2F0KHdpZHRoKTsKIH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9WRE1YUGFyc2VyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vVkRNWFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MzM0NzIyNgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vVkRNWFBhcnNlci5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KGMpIDIwMDgsIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0
ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1
ZGUgPHN5cy90eXBlcy5oPgorCisvLyBGb3IgaHRvbnMvbnRvaHMKKyNpbmNsdWRlIDxhcnBhL2lu
ZXQuaD4KKworLy8gQnVmZmVyIGhlbHBlciBjbGFzcworLy8KKy8vIFRoaXMgY2xhc3MgcGVyZm9y
bSBzb21lIHRyaXZhbCBidWZmZXIgb3BlcmF0aW9ucyB3aGlsZSBjaGVja2luZyBmb3IKKy8vIG91
dC1vZi1ib3VuZHMgZXJyb3JzLiBBcyBhIGZhbWlseSB0aGV5IHJldHVybiBmYWxzZSBpZiBhbnl0
aGluZyBpcyBhbWlzcywKKy8vIHVwZGF0aW5nIHRoZSBjdXJyZW50IG9mZnNldCBvdGhlcndpc2Uu
CitjbGFzcyBCdWZmZXIgeworcHVibGljOgorICAgIEJ1ZmZlcihjb25zdCB1aW50OF90KiBidWZm
ZXIsIHNpemVfdCBsZW5ndGgpCisgICAgICAgIDogbV9idWZmZXIoYnVmZmVyKQorICAgICAgICAs
IG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAgICAgLCBtX29mZnNldCgwKSB7IH0KKworICAgIGJvb2wg
c2tpcChzaXplX3QgbnVtQnl0ZXMpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyBudW1C
eXRlcyA+IG1fbGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBtX29m
ZnNldCArPSBudW1CeXRlczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9v
bCByZWFkVTgodWludDhfdCogdmFsdWUpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyBz
aXplb2YodWludDhfdCkgPiBtX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgKnZhbHVlID0gbV9idWZmZXJbbV9vZmZzZXRdOworICAgICAgICBtX29mZnNldCArPSBz
aXplb2YodWludDhfdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wg
cmVhZFUxNih1aW50MTZfdCogdmFsdWUpCisgICAgeworICAgICAgICBpZiAobV9vZmZzZXQgKyBz
aXplb2YodWludDE2X3QpID4gbV9sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIG1lbWNweSh2YWx1ZSwgbV9idWZmZXIgKyBtX29mZnNldCwgc2l6ZW9mKHVpbnQxNl90
KSk7CisgICAgICAgICp2YWx1ZSA9IG50b2hzKCp2YWx1ZSk7CisgICAgICAgIG1fb2Zmc2V0ICs9
IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJv
b2wgcmVhZFMxNihpbnQxNl90KiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiByZWFkVTE2
KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPih2YWx1ZSkpOworICAgIH0KKworICAgIHNpemVf
dCBvZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0OworICAgIH0K
KworICAgIHZvaWQgc2V0T2Zmc2V0KHNpemVfdCBuZXdvZmZzZXQpCisgICAgeworICAgICAgICBt
X29mZnNldCA9IG5ld29mZnNldDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgdWludDhf
dCAqY29uc3QgbV9idWZmZXI7CisgICAgY29uc3Qgc2l6ZV90IG1fbGVuZ3RoOworICAgIHNpemVf
dCBtX29mZnNldDsKK307CisKKy8vIFZETVggcGFyc2luZyBjb2RlLgorLy8KKy8vIFZETVggdGFi
bGVzIGFyZSBmb3VuZCBpbiBzb21lIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzIGFuZCBjb250YWlu
CisvLyBhc2NlbmRlci9kZXNjZW5kZXIgb3ZlcnJpZGVzIGZvciBjZXJ0YWluICh1c3VhbGx5IHNt
YWxsKSBzaXplcy4gVGhpcyBpcworLy8gbmVlZGVkIGluIG9yZGVyIHRvIG1hdGNoIGZvbnQgbWV0
cmljcyBvbiBXaW5kb3dzLgorLy8KKy8vIEZyZWV0eXBlIGRvZXMgbm90IHBhcnNlIHRoZXNlIHRh
YmxlcyBzbyB3ZSBkbyBzbyBoZXJlLgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFBhcnNl
IGEgVHJ1ZVR5cGUgVkRNWCB0YWJsZS4KKy8vICAgeU1heDogKG91dHB1dCkgdGhlIGFzY2VuZGVy
IHZhbHVlIGZyb20gdGhlIHRhYmxlCisvLyAgIHlNaW46IChvdXRwdXQpIHRoZSBkZXNjZW5kZXIg
dmFsdWUgZnJvbSB0aGUgdGFibGUgKG5lZ2F0aXZlISkKKy8vICAgdmRteDogdGhlIHRhYmxlIGJ5
dGVzCisvLyAgIHZkbXhMZW5ndGg6IGxlbmd0aCBvZiBAdmRteCwgaW4gYnl0ZXMKKy8vICAgdGFy
Z2V0UGl4ZWxTaXplOiB0aGUgcGl4ZWwgc2l6ZSBvZiB0aGUgZm9udCAoZS5nLiAxNikKKy8vCisv
LyBSZXR1cm5zIHRydWUgaWZmIGEgc3VpdGFibGUgbWF0Y2ggYXJlIGZvdW5kLiBPdGhlcndpc2Us
ICp5TWF4IGFuZCAqeU1pbiBhcmUKKy8vIHVudG91Y2hlZC4gc2l6ZV90IG11c3QgYmUgMzItYml0
cyB0byBhdm9pZCBvdmVyZmxvdy4KKy8vCisvLyBTZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
L29wZW50eXBlL290c3BlYy92ZG14Lmh0bQorYm9vbCBwYXJzZVZETVgoaW50KiB5TWF4LCBpbnQq
IHlNaW4sCisgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2ZG14LCBzaXplX3QgdmRteExl
bmd0aCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIHRhcmdldFBpeGVsU2l6ZSkKK3sKKyAgICBC
dWZmZXIgYnVmKHZkbXgsIHZkbXhMZW5ndGgpOworCisgICAgLy8gV2UgaWdub3JlIHRoZSB2ZXJz
aW9uLiBGdXR1cmUgdGFibGVzIHNob3VsZCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoCisg
ICAgLy8gdGhpcyBsYXlvdXQuCisgICAgdWludDE2X3QgbnVtUmF0aW9zOworICAgIGlmICghYnVm
LnNraXAoNCkgfHwgIWJ1Zi5yZWFkVTE2KCZudW1SYXRpb3MpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyBOb3cgd2UgaGF2ZSB0d28gdGFibGVzLiBGaXJzdGx5IHdlIGhhdmUgQG51
bVJhdGlvcyBSYXRpbyByZWNvcmRzLCB0aGVuIGEKKyAgICAvLyBtYXRjaGluZyBhcnJheSBvZiBA
bnVtUmF0aW9zIG9mZnNldHMuIFdlIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nCisg
ICAgLy8gb2YgdGhpcyBzZWNvbmQgdGFibGUuCisgICAgLy8KKyAgICAvLyBSYW5nZSA2IDw9IHgg
PD0gMjYyMTQ2CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXRUYWJsZU9mZnNldCA9CisgICAgICAg
IGJ1Zi5vZmZzZXQoKSArIDQgLyogc2l6ZW9mIHN0cnVjdCByYXRpbyAqLyAqIG51bVJhdGlvczsK
KworICAgIHVuc2lnbmVkIGRlc2lyZWRSYXRpbyA9IDB4ZmZmZmZmZmY7CisgICAgLy8gV2UgcmVh
ZCA0IGJ5dGVzIHBlciByZWNvcmQsIHNvIHRoZSBvZmZzZXQgcmFuZ2UgaXMKKyAgICAvLyAgIDYg
PD0geCA8PSA1MjQyODYKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtUmF0aW9zOyAr
K2kpIHsKKyAgICAgICAgdWludDhfdCB4UmF0aW8sIHlSYXRpbzEsIHlSYXRpbzI7CisKKyAgICAg
ICAgaWYgKCFidWYuc2tpcCgxKQorICAgICAgICAgICAgfHwgIWJ1Zi5yZWFkVTgoJnhSYXRpbykK
KyAgICAgICAgICAgIHx8ICFidWYucmVhZFU4KCZ5UmF0aW8xKQorICAgICAgICAgICAgfHwgIWJ1
Zi5yZWFkVTgoJnlSYXRpbzIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAg
IC8vIFRoaXMgZWl0aGVyIGNvdmVycyAxOjEsIG9yIHRoaXMgaXMgdGhlIGRlZmF1bHQgZW50cnkg
KDAsIDAsIDApCisgICAgICAgIGlmICgoeFJhdGlvID09IDEgJiYgeVJhdGlvMSA8PSAxICYmIHlS
YXRpbzIgPj0gMSkKKyAgICAgICAgICAgIHx8ICh4UmF0aW8gPT0gMCAmJiB5UmF0aW8xID09IDAg
JiYgeVJhdGlvMiA9PSAwKSkgeworICAgICAgICAgICAgZGVzaXJlZFJhdGlvID0gaTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlc2lyZWRSYXRpbyA9
PSAweGZmZmZmZmZmKSAvLyBubyByYXRpbyBmb3VuZAorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAvLyBSYW5nZSAxMCA8PSB4IDw9IDM5MzIxNgorICAgIGJ1Zi5zZXRPZmZzZXQob2Zmc2V0
VGFibGVPZmZzZXQgKyBzaXplb2YodWludDE2X3QpICogZGVzaXJlZFJhdGlvKTsKKworICAgIC8v
IE5vdyB3ZSByZWFkIGZyb20gdGhlIG9mZnNldCB0YWJsZSB0byBnZXQgdGhlIG9mZnNldCBvZiBh
bm90aGVyIGFycmF5CisgICAgdWludDE2X3QgZ3JvdXBPZmZzZXQ7CisgICAgaWYgKCFidWYucmVh
ZFUxNigmZ3JvdXBPZmZzZXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gUmFuZ2Ug
MCA8PSB4IDw9IDY1NTM1CisgICAgYnVmLnNldE9mZnNldChncm91cE9mZnNldCk7CisKKyAgICB1
aW50MTZfdCBudW1SZWNvcmRzOworICAgIGlmICghYnVmLnJlYWRVMTYoJm51bVJlY29yZHMpIHx8
ICFidWYuc2tpcChzaXplb2YodWludDE2X3QpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gV2UgcmVhZCA2IGJ5dGVzIHBlciByZWNvcmQsIHNvIHRoZSBvZmZzZXQgcmFuZ2UgaXMK
KyAgICAvLyAgIDQgPD0geCA8PSA0NTg3NDkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bnVtUmVjb3JkczsgKytpKSB7CisgICAgICAgIHVpbnQxNl90IHBpeGVsU2l6ZTsKKyAgICAgICAg
aWYgKCFidWYucmVhZFUxNigmcGl4ZWxTaXplKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgLy8gdGhlIGVudHJpZXMgYXJlIHNvcnRlZCwgc28gd2UgY2FuIGFib3J0IGVhcmx5
IGlmIG5lZWQgYmUKKyAgICAgICAgaWYgKHBpeGVsU2l6ZSA+IHRhcmdldFBpeGVsU2l6ZSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAocGl4ZWxTaXplID09IHRhcmdl
dFBpeGVsU2l6ZSkgeworICAgICAgICAgICAgaW50MTZfdCB0ZW1wWU1heCwgdGVtcFlNaW47Cisg
ICAgICAgICAgICBpZiAoIWJ1Zi5yZWFkUzE2KCZ0ZW1wWU1heCkKKyAgICAgICAgICAgICAgICB8
fCAhYnVmLnJlYWRTMTYoJnRlbXBZTWluKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICAqeU1pbiA9IHRlbXBZTWluOworICAgICAgICAgICAgKnlNYXggPSB0ZW1w
WU1heDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgh
YnVmLnNraXAoMiAqIHNpemVvZihpbnQxNl90KSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1ZETVhQYXJz
ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVkRNWFBhcnNlci5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjI1YjcKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1ZETVhQYXJzZXIuaApAQCAt
MCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgVkRNWFBhcnNlcl9oCisjZGVmaW5lIFZETVhQYXJzZXJfaAor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgYm9vbCBwYXJzZVZETVgoaW50KiB5bWF4LCBpbnQq
IHltaW4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmRteCwgc2l6ZV90IHZk
bXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdGFyZ2V0UGl4ZWxTaXplKTsK
K30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="14614"
          type_id="1"
          status="+"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>