<?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>31340</bug_id>
          
          <creation_ts>2009-11-11 02:14:55 -0800</creation_ts>
          <short_desc>Introduce a class representing HTML5 date&amp;time values</short_desc>
          <delta_ts>2009-11-16 21:15:33 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Forms</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>31342</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>eric</cc>
    
    <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>162412</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2009-11-11 02:14:55 -0800</bug_when>
    <thetext>Moves a patch from Bug#29004.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162413</commentid>
    <comment_count>1</comment_count>
      <attachid>42943</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2009-11-11 02:32:46 -0800</bug_when>
    <thetext>Created attachment 42943
ISO 8601 class (rev.5)

* Avoid 1-letter variable names except &quot;i&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162770</commentid>
    <comment_count>2</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-11-11 19:35:44 -0800</bug_when>
    <thetext>I&apos;m working on reviewing this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162823</commentid>
    <comment_count>3</comment_count>
      <attachid>42943</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-11-12 00:41:30 -0800</bug_when>
    <thetext>Comment on attachment 42943
ISO 8601 class (rev.5)

&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; +2009-09-08  Kent Tamura  &lt;tkent@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Introduce WebCore::ISODateTime class.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=29004

This is the wrong bug number.

...
&gt; +        (WebCore::ISODateTime::month):
&gt; +        (WebCore::ISODateTime::fullYear):
&gt; +        (WebCore::ISODateTime::week):
&gt; +        (WebCore::ISODateTime::):

It is good to add per function comments in the change log in general or at least per file.


&gt; diff --git a/WebCore/html/ISODateTime.cpp b/WebCore/html/ISODateTime.cpp
&gt; @@ -0,0 +1,423 @@
&gt; +/*
&gt; + * Copyright (c) 2009, Google Inc. All rights reserved.

Use a capital C and no comma after the year.

&quot;Copyright (C) 2009 Google Inc. All rights reserved.&quot;

&gt; +static const int maxDayOfMonths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

It would be better to name this array daysInMonth which will help distinquish it from the function with a similar name.


&gt;
&gt; +static int dayOfWeek(int year, int month, int day)
&gt; +{
&gt; +    ++month;
&gt; +
&gt; +    // Zeller&apos;s congruence
&gt; +    if (month &lt;= 2) {

It looks like you&apos;re treating month as if it is 1 based (making Jan be 13 and Feb 14 which is what the algorithm calls for) but in other places you treat it as one based including this call for example &quot;int day = dayOfWeek(m_year, 0, 1);&quot;

I don&apos;t understand how this is working. If this is a bug, please increase your test coverage to expose it.


&gt; +        month += 12;
&gt; +        year--;
&gt; +    }
&gt; +    int highYear = year / 100;
&gt; +    int lowYear = year % 100;
&gt; +    int result = (day + 13 * (month + 1) / 5 + lowYear + lowYear / 4 + highYear / 4 - 2 * highYear - 1) % 7;
&gt; +    if (result &lt; 0)
&gt; +        result += 7;

Why not do 
    int result = (day + 13 * (month + 1) / 5 + lowYear + lowYear / 4 + highYear / 4 + 5 * highYear + 6) % 7;
and get rid of the if (result &lt; 0)?

&gt; +    return result;   // Sunday origin

One space before end of line comments but I feel like the Sunday origin comment should come before the equation above since the it the reason for the + 6.

&gt; +int ISODateTime::maxWeek() const

I like maxWeekNumber as the name. (I don&apos;t know what the max week is?)


&gt; +static unsigned countDigits(const UChar* src, unsigned length, unsigned start)
&gt; +{
&gt; +    unsigned count = start;

count isn&apos;t a count. It is an index. (It get especially confusing when you see the return value for the count of digits is &quot;count - start&quot;.
I&apos;d suggest changing the variable name to index.

&gt; +    for (; count &lt; length; ++count) {
&gt; +        if (!isASCIIDigit(src[count]))
&gt; +            break;
&gt; +    }
&gt; +    return count - start;
&gt; +}
&gt; +
&gt; +// Very strict integer parser.  Not allow leading whitespaces unlike charactersToIntStrict().

Please only use one space after periods in comments.

&quot;Not allow leading whitespaces unlike charactersToIntStrict().&quot; -&gt; &quot;Do not allow leading or trailing whitespaces unlike charactersToIntStrict().&quot;


&gt; +static bool toInt(const UChar* src, unsigned length, unsigned parseStart, unsigned parseLength, int* out)

Because &quot;out&quot; may never be 0, use &quot;int&amp; out&quot;.

&gt; +{
&gt;
&gt; +        int digit = *current - &apos;0&apos;;
&gt; +        if (value &gt; (INT_MAX - digit) / 10)  // overflow

One space before end of line comments.

Also, this line doesn&apos;t cause an overflow, so I&apos;d change the comment: &quot;// Check for overflow.&quot;


&gt; +bool ISODateTime::parseYear(const UChar* src, unsigned length, unsigned start, unsigned* end)

&quot;end&quot; may never be 0 so use &quot;unsigned&amp; end&quot;

&gt; +bool ISODateTime::addDay(int dayDiff)
&gt; +{
&gt; +    ASSERT(m_monthDay);
&gt; +
&gt; +    int day = m_monthDay + dayDiff;
&gt; +    if (day &gt; maxDayOfMonth(m_year, m_month)) {
&gt; +        day = m_monthDay;
&gt; +        int month = m_month;
&gt; +        int year = m_year;
&gt; +        for (; dayDiff &gt; 0; --dayDiff) {
&gt; +            ++day;
&gt; +            if (day &gt; maxDayOfMonth(year, month)) {

Doing this look up repeatedly in a loop pains me (especially in Febuary in a leap year). Why not store the result and only change it when the month/year changes below?

After looking over the code more, I take it back because I think this is never used to move very many days. Please correct me if I&apos;m wrong.

&gt; +                day = 1;
&gt; +                ++month;
&gt; +                if (month &gt;= 12) {  // month is 0-origin.

Single space before end of line comments.

&gt; +                    month = 0;
&gt; +                    ++year;
&gt; +                    if (year &lt; 0)  // Overflow.

Single space before end of line comments.

&quot;// Check for overflow.&quot;


&gt; +bool ISODateTime::addMinute(int minute)
&gt; +{
&gt; +    int carry;
&gt; +    // min can be negative or greater than 59

Add &quot;.&quot; to end of comment.

&gt; +
&gt; +// Parses a timezone part, and adjust year, month, monthDay, hour, minute, second, millesecond.

&quot;millesecond&quot; should be &quot;millisecond&quot;

&gt; +bool ISODateTime::parseTimeZone(const UChar* src, unsigned length, unsigned start, unsigned* end)

Use unsigned&amp; end.

&gt; +{
&gt; +    if (start &gt;= length)
&gt; +        return false;
&gt; +    unsigned i = start;
&gt; +    int hour;
&gt; +    int minute;
&gt; +    if (src[i] == &apos;Z&apos;) {
&gt; +        ++i;
&gt; +        hour = 0;
&gt; +        minute = 0;

Why do you set the hour and minute in this case at all? Why not just move the addMinute into the else?

&gt; +    } else {

&gt; +        if (i &gt;= length || src[i++] != &apos;:&apos;)
&gt; +            return false;

It would be clear to move the i++ out of the src[i++] and put it here.

&gt; +    // Subtract the timezone offset.
&gt; +    if (!addMinute( -(hour * 60 + minute)))

No space after open paren.

&gt; +        return false;
&gt; +    *end = i;
&gt; +    return true;
&gt; +}
&gt; +
&gt; +bool ISODateTime::parseMonth(const UChar* src, unsigned length, unsigned start, unsigned* end)

Use unsigned&amp; end

&gt; +{
&gt; +    ASSERT(src);
&gt; +    ASSERT(end);
&gt; +    unsigned i;

Consider using index instead of i.

&gt; +    if (!parseYear(src, length, start, &amp;i))
&gt; +        return false;
&gt; +    if (i &gt;= length || src[i++] != &apos;-&apos;)
&gt; +        return false;

It would be clear to move the i++ out of the src[i++] and put it here.


&gt; +bool ISODateTime::parseDate(const UChar* src, unsigned length, unsigned start, unsigned* end)

unsigned&amp; end

&gt; +{
&gt; +    ASSERT(src);
&gt; +    ASSERT(end);
&gt; +    unsigned i;

Consider using index instead of i.

&gt; +    if (!parseMonth(src, length, start, &amp;i))
&gt; +        return false;
&gt; +    // &apos;-&apos; and 2-digits are needed.
&gt; +    if (i + 2 &gt;= length)
&gt; +        return false;
&gt; +    if (src[i++] != &apos;-&apos;)
&gt; +        return false;

It would be clear to move the i++ out of the src[i++] and put it here.


&gt; +bool ISODateTime::parseWeek(const UChar* src, unsigned length, unsigned start, unsigned* end)

unsigned&amp; end


&gt; +    unsigned i;

Consider using index instead of i.

&gt; +    if (!parseYear(src, length, start, &amp;i))
&gt; +        return false;
&gt; +    // 4 characters (&apos;-&apos; &apos;W&apos; digit digit) are needed.
&gt; +    if (i + 3 &gt;= length)
&gt; +        return false;
&gt; +    if (src[i++] != &apos;-&apos;)
&gt; +        return false;
&gt; +    if (src[i++] != &apos;W&apos;)
&gt; +        return false;

I think it would be clearer to have the comparison and the after the comparison succeeds to adavance the index. (Move the i++ out of the if statements.)

&gt; +bool ISODateTime::parseTime(const UChar* src, unsigned length, unsigned start, unsigned* end)

unsigned&amp; end

&gt; +{
&gt; +    unsigned i = start + 2;

Consider using index instead of i.

&gt; +    if (i &gt;= length)
&gt; +        return false;
&gt; +    if (src[i++] != &apos;:&apos;)
&gt; +        return false;

Consider moving i++ here.

&gt; +    // Optional second part
&gt; +    if (i + 2 &lt; length &amp;&amp; src[i] == &apos;:&apos;) {
&gt; +        int second;

&gt; +        if (toInt(src, length, i + 1, 2, &amp;second) &amp;&amp; second &gt;= 0 &amp;&amp; second &lt;= 59) {

Isn&apos;t it an error if the seconds are present but not in the proper range?

&gt; +            m_second = second;
&gt; +            i += 3;

&gt; +
&gt; +            // Optional fractional second part
&gt; +            if (i &lt; length &amp;&amp; src[i] == &apos;.&apos;) {

Consider moving the ++i and making it just i++.

&gt; +                unsigned digitsLength = countDigits(src, length, ++i);
&gt; +                if (digitsLength &gt; 0) {

From my reading of http://www.w3.org/TR/NOTE-datetime, once there is a period, there should be one or more digits. It sounds like anything else is an error.

&gt; +                    bool ok;
&gt; +                    int millisecond;
&gt; +                    if (digitsLength == 1) {
&gt; +                        ok = toInt(src, length, i, 1, &amp;millisecond);
&gt; +                        millisecond *= 100;
&gt; +                    } else if (digitsLength == 2) {
&gt; +                        ok = toInt(src, length, i, 2, &amp;millisecond);
&gt; +                        millisecond *= 10;
&gt; +                    } else // digitsLength &gt;= 3
&gt; +                        ok = toInt(src, length, i, 3, &amp;millisecond);
&gt; +                    if (ok) {
&gt; +                        m_millisecond = millisecond;
&gt; +                        i += digitsLength;
&gt; +                    } else
&gt; +                        --i;

I don&apos;t understand this --i. It is &quot;unreading&quot; the &apos;.&apos; but why isn&apos;t that done when digitsLength is 0 as well?

&gt; +bool ISODateTime::parseDateTimeLocal(const UChar* src, unsigned length, unsigned start, unsigned* end)

unsigned&amp; end

&gt; +{
&gt; +    ASSERT(src);
&gt; +    ASSERT(end);
&gt; +    unsigned i;

Consider using index instead of i.

&gt; +    if (src[i++] != &apos;T&apos;)
&gt; +        return false;

Consider moving i++ here.

&gt; +    return parseTime(src, length, i, end);
&gt; +}
&gt; +
&gt; +bool ISODateTime::parseDateTime(const UChar* src, unsigned length, unsigned start, unsigned* end)
&gt; +{
&gt; +    ASSERT(src);
&gt; +    ASSERT(end);
&gt; +    unsigned i;

Consider using index instead of i.

&gt; +    if (src[i++] != &apos;T&apos;)
&gt; +        return false;

Consider moving i++ here.

&gt; diff --git a/WebCore/html/ISODateTime.h b/WebCore/html/ISODateTime.h
&gt; + * Copyright (c) 2009, Google Inc. All rights reserved.

 capital (C), no comma after 2009

&gt; +namespace WebCore {
&gt; +
&gt; +    // The following six functions parse the input `src&apos; of which length is

&quot;of which&quot; -&gt; &quot;whose&quot;

&gt; +    // `length&apos;, and updates some fields of this instance. The parsing starts at
&gt; +    // src[start] and examines characters before src[length].
&gt; +    // `src&apos;, `end&apos; and `date&apos; must be non-null. The `src&apos; string doesn&apos;t needs to

&quot;needs&quot; -&gt; &quot;need&quot;



&gt; +    // The functions return true if the parsing succeeds, and sets the next index
&gt; +    // of the last consumed character to `*end&apos;. The leading extra characters cause
Consider using this:
    // The functions return true if the parsing succeeds and set &apos;end&apos; to the index after
    // the last character consumed. Extra leading characters cause
    // parse failures, and trailing extra characters don&apos;t cause parse failures.


&gt; +    // m_weekDay values
&gt; +    enum {
&gt; +        SUNDAY = 0,
&gt; +        MONDAY,
&gt; +        TUESDAY,
&gt; +        WEDNESDAY,
&gt; +        THURSDAY,
&gt; +        FRIDAY,
&gt; +        SATURDAY,
&gt; +    };

Enum members should user InterCaps with an initial capital letter.
 - http://webkit.org/coding/coding-style.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162861</commentid>
    <comment_count>4</comment_count>
      <attachid>43055</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2009-11-12 03:24:50 -0800</bug_when>
    <thetext>Created attachment 43055
ISO 8601 class (rev.6)

(In reply to comment #3)
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=29004
&gt; 
&gt; This is the wrong bug number.

Fixed.

&gt; It is good to add per function comments in the change log in general or at
&gt; least per file.

Added some comments.

&gt; &quot;Copyright (C) 2009 Google Inc. All rights reserved.&quot;

Fixed.

&gt; &gt; +static const int maxDayOfMonths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
&gt; 
&gt; It would be better to name this array daysInMonth which will help distinquish
&gt; it from the function with a similar name.

Done.

&gt; &gt; +static int dayOfWeek(int year, int month, int day)
&gt; &gt; +{
&gt; &gt; +    ++month;
&gt; &gt; +
&gt; &gt; +    // Zeller&apos;s congruence
&gt; &gt; +    if (month &lt;= 2) {
&gt; 
&gt; It looks like you&apos;re treating month as if it is 1 based (making Jan be 13 and
&gt; Feb 14 which is what the algorithm calls for) but in other places you treat it
&gt; as one based including this call for example &quot;int day = dayOfWeek(m_year, 0,
&gt; 1);&quot;
&gt; 
&gt; I don&apos;t understand how this is working. If this is a bug, please increase your
&gt; test coverage to expose it.

It&apos;s not a bug.
 - ISODateTime::m_month is 0-based to follow &quot;struct tm&quot;.
 - month values at other places are 0-based.
 - The month parameter of this function is also 0-based.

I introduced a new local variable named `shiftedMonth&apos; for readability, and added some comments.

&gt; Why not do 
&gt;     int result = (day + 13 * (month + 1) / 5 + lowYear + lowYear / 4 + highYear
&gt; / 4 + 5 * highYear + 6) % 7;
&gt; and get rid of the if (result &lt; 0)?

Done.

&gt; &gt; +    return result;   // Sunday origin
&gt; One space before end of line comments but I feel like the Sunday origin comment
&gt; should come before the equation above since the it the reason for the + 6.

Done.

&gt; &gt; +int ISODateTime::maxWeek() const
&gt; 
&gt; I like maxWeekNumber as the name. (I don&apos;t know what the max week is?)

Done.

&gt; &gt; +static unsigned countDigits(const UChar* src, unsigned length, unsigned start)
&gt; &gt; +{
&gt; &gt; +    unsigned count = start;
&gt; 
&gt; count isn&apos;t a count. It is an index. (It get especially confusing when you see
&gt; the return value for the count of digits is &quot;count - start&quot;.
&gt; I&apos;d suggest changing the variable name to index.

Done.

&gt; &gt; +// Very strict integer parser.  Not allow leading whitespaces unlike charactersToIntStrict().
&gt; 
&gt; Please only use one space after periods in comments.

Done.

&gt; &quot;Not allow leading whitespaces unlike charactersToIntStrict().&quot; -&gt; &quot;Do not
&gt; allow leading or trailing whitespaces unlike charactersToIntStrict().&quot;

Done.

&gt; &gt; +static bool toInt(const UChar* src, unsigned length, unsigned parseStart, unsigned parseLength, int* out)
&gt; 
&gt; Because &quot;out&quot; may never be 0, use &quot;int&amp; out&quot;.

Done for this and all of &quot;unsigned* end&quot;.

&gt; &gt; +        if (value &gt; (INT_MAX - digit) / 10)  // overflow
&gt; 
&gt; One space before end of line comments.

Done.

&gt; Also, this line doesn&apos;t cause an overflow, so I&apos;d change the comment: &quot;// Check
&gt; for overflow.&quot;

Done.

&gt; &gt; +        for (; dayDiff &gt; 0; --dayDiff) {
&gt; &gt; +            ++day;
&gt; &gt; +            if (day &gt; maxDayOfMonth(year, month)) {
&gt; 
&gt; Doing this look up repeatedly in a loop pains me (especially in Febuary in a
&gt; leap year). Why not store the result and only change it when the month/year
&gt; changes below?

Done.

&gt; After looking over the code more, I take it back because I think this is never
&gt; used to move very many days. Please correct me if I&apos;m wrong.

Right.  This function is used to adjust timezone offset for now.
However we&apos;ll use this function to implement HTMLInputElement::stepUp() and steDown().
So it will be possible to move many days.

&gt; &gt; +                if (month &gt;= 12) {  // month is 0-origin.
&gt; 
&gt; Single space before end of line comments.

Done.

&gt; &gt; +                    if (year &lt; 0)  // Overflow.
&gt; 
&gt; Single space before end of line comments.

Done.

&gt; &quot;// Check for overflow.&quot;

Done.

&gt; &gt; +    // min can be negative or greater than 59
&gt; 
&gt; Add &quot;.&quot; to end of comment.

Done.

&gt; &gt; +// Parses a timezone part, and adjust year, month, monthDay, hour, minute, second, millesecond.
&gt; 
&gt; &quot;millesecond&quot; should be &quot;millisecond&quot;

Done.

&gt; &gt; +    if (src[i] == &apos;Z&apos;) {
&gt; &gt; +        ++i;
&gt; &gt; +        hour = 0;
&gt; &gt; +        minute = 0;
&gt; 
&gt; Why do you set the hour and minute in this case at all? Why not just move the
&gt; addMinute into the else?

Removed them and addMinute() for &apos;Z&apos; case.

&gt; &gt; +        if (i &gt;= length || src[i++] != &apos;:&apos;)
&gt; &gt; +            return false;
&gt; 
&gt; It would be clear to move the i++ out of the src[i++] and put it here.

Done for all of src[i++] -&gt; src[i] then i++.

&gt; &gt; +    if (!addMinute( -(hour * 60 + minute)))
&gt; 
&gt; No space after open paren.

Done.

&gt; &gt; +    ASSERT(src);
&gt; &gt; +    ASSERT(end);
&gt; &gt; +    unsigned i;
&gt; 
&gt; Consider using index instead of i.

Done for all of i -&gt; index.

&gt; &gt; +    // Optional second part
&gt; &gt; +    if (i + 2 &lt; length &amp;&amp; src[i] == &apos;:&apos;) {
&gt; &gt; +        int second;
&gt; 
&gt; &gt; +        if (toInt(src, length, i + 1, 2, &amp;second) &amp;&amp; second &gt;= 0 &amp;&amp; second &lt;= 59) {
&gt; 
&gt; Isn&apos;t it an error if the seconds are present but not in the proper range?

The policy of these parse*() functions is &quot;consume only valid part of the input&quot;.
Even If the second or fractional second part is invalid, hh:mm part should be parsed successfully.

&gt; &gt; +                unsigned digitsLength = countDigits(src, length, ++i);
&gt; &gt; +                if (digitsLength &gt; 0) {
&gt; 
&gt; From my reading of http://www.w3.org/TR/NOTE-datetime, once there is a period,
&gt; there should be one or more digits. It sounds like anything else is an error.

Ditto.

&gt; &gt; +                    bool ok;
&gt; &gt; +                    int millisecond;
&gt; &gt; +                    if (digitsLength == 1) {
&gt; &gt; +                        ok = toInt(src, length, i, 1, &amp;millisecond);
&gt; &gt; +                        millisecond *= 100;
&gt; &gt; +                    } else if (digitsLength == 2) {
&gt; &gt; +                        ok = toInt(src, length, i, 2, &amp;millisecond);
&gt; &gt; +                        millisecond *= 10;
&gt; &gt; +                    } else // digitsLength &gt;= 3
&gt; &gt; +                        ok = toInt(src, length, i, 3, &amp;millisecond);
&gt; &gt; +                    if (ok) {
&gt; &gt; +                        m_millisecond = millisecond;
&gt; &gt; +                        i += digitsLength;
&gt; &gt; +                    } else
&gt; &gt; +                        --i;
&gt; 
&gt; I don&apos;t understand this --i. It is &quot;unreading&quot; the &apos;.&apos; but why isn&apos;t that done
&gt; when digitsLength is 0 as well?

This &quot;else&quot; clause was attached to a wrong &quot;if&quot;.  It should be attached to &quot;if (digitsLength &gt; 0)&quot; to recover from an input like &quot;23:59:59.&quot;
I found &quot;if (ok)&quot; made no sense because these toInt() calls parse number-only strings.
I changed the code here.

&gt; &gt; diff --git a/WebCore/html/ISODateTime.h b/WebCore/html/ISODateTime.h
&gt; &gt; + * Copyright (c) 2009, Google Inc. All rights reserved.
&gt; 
&gt;  capital (C), no comma after 2009

Done.

&gt; &gt; +    // The following six functions parse the input `src&apos; of which length is
&gt; 
&gt; &quot;of which&quot; -&gt; &quot;whose&quot;

Done.

&gt; &gt; +    // `src&apos;, `end&apos; and `date&apos; must be non-null. The `src&apos; string doesn&apos;t needs to
&gt; 
&gt; &quot;needs&quot; -&gt; &quot;need&quot;

Done.

&gt; &gt; +    // The functions return true if the parsing succeeds, and sets the next index
&gt; &gt; +    // of the last consumed character to `*end&apos;. The leading extra characters cause
&gt; Consider using this:
&gt;     // The functions return true if the parsing succeeds and set &apos;end&apos; to the
&gt; index after
&gt;     // the last character consumed. Extra leading characters cause
&gt;     // parse failures, and trailing extra characters don&apos;t cause parse
&gt; failures.

Done.

&gt; &gt; +    enum {
&gt; &gt; +        SUNDAY = 0,
&gt; &gt; +        MONDAY,
&gt; &gt; +        TUESDAY,
&gt; &gt; +        WEDNESDAY,
&gt; &gt; +        THURSDAY,
&gt; &gt; +        FRIDAY,
&gt; &gt; +        SATURDAY,
&gt; &gt; +    };
&gt; 
&gt; Enum members should user InterCaps with an initial capital letter.
&gt;  - http://webkit.org/coding/coding-style.html

Done.


Thank you very very much for loooong review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164031</commentid>
    <comment_count>5</comment_count>
      <attachid>43055</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-11-16 10:53:34 -0800</bug_when>
    <thetext>Comment on attachment 43055
ISO 8601 class (rev.6)

Thanks! Please consider addressing these final nits on landing.

&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog

This is a much better changelog!


&gt; diff --git a/WebCore/html/ISODateTime.cpp b/WebCore/html/ISODateTime.cpp
&gt; +// The oldest day of Gregorian Calendar is 1582-10-15.  We don&apos;t support dates older than it.

One space after periods.

&gt; +static const int gregorianStartYear = 1582;
&gt; +static const int gregorianStartMonth = 9; // 0-based October.

Use whole sentences in general. 0-based October doesn&apos;t make sense. It sound like October is the 0th month. What you mean is that January is 0, so this month 9 is really October.
Here&apos;s an idea for your comment  &quot;// This is October, since months are 0 based.&quot;

&gt;
&gt; +static int dayOfWeek(int year, int month, int day)
&gt; +{
&gt; +    int shiftedMonth = month + 2;
&gt; +    // 2:January, 3:Feburuary, 4:March, ...

Thanks! You had this before with the month++ and I missed it, but I find this new form much easier to read.


&gt; +// Very strict integer parser. Do not allow leading or trailing whitespaces unlike charactersToIntStrict().

s/whitespaces/whitespace/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164145</commentid>
    <comment_count>6</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2009-11-16 21:00:05 -0800</bug_when>
    <thetext>(In reply to comment #5)

Thank you!  I&apos;ll fix them and land the patch manually.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164150</commentid>
    <comment_count>7</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2009-11-16 21:15:33 -0800</bug_when>
    <thetext>Landed as r51063
http://trac.webkit.org/changeset/51063</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42943</attachid>
            <date>2009-11-11 02:32:46 -0800</date>
            <delta_ts>2009-11-12 03:24:50 -0800</delta_ts>
            <desc>ISO 8601 class (rev.5)</desc>
            <filename>0001-iso8601-parser-5.patch</filename>
            <type>text/plain</type>
            <size>28113</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">RnJvbSAzZTIyNGFkYjMxOWI3ZWZmZDY1MmM0YzY0NWM1M2I2ZDUyZGM1N2UzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBLZW50IFRhbXVyYSA8dGtlbnRAY2hyb21pdW0ub3JnPgpEYXRl
OiBNb24sIDkgTm92IDIwMDkgMTg6MDA6MjcgKzA5MDAKU3ViamVjdDogW1BBVENIXSBpc284NjAx
LXBhcnNlci01CgotLS0KIFdlYkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAg
IHwgICA0NyArKysrCiBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtICAgICAgICAgICAgICAgICAgICB8
ICAgIDIgKwogV2ViQ29yZS9XZWJDb3JlLmd5cGkgICAgICAgICAgICAgICAgICAgICAgfCAgICAy
ICsKIFdlYkNvcmUvV2ViQ29yZS5wcm8gICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArCiBX
ZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qICAgICB8ICAgIDggKwogV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogfCAgICA4ICsKIFdlYkNvcmUvV2Vi
Q29yZVNvdXJjZXMuYmtsICAgICAgICAgICAgICAgIHwgICAgMSArCiBXZWJDb3JlL2h0bWwvSVNP
RGF0ZVRpbWUuY3BwICAgICAgICAgICAgICB8ICA0MjMgKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysKIFdlYkNvcmUvaHRtbC9JU09EYXRlVGltZS5oICAgICAgICAgICAgICAgIHwgIDEyMCAr
KysrKysrKwogOSBmaWxlcyBjaGFuZ2VkLCA2MTMgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMo
LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBXZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuY3BwCiBjcmVh
dGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmgKCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL0NoYW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDNlOWU2NTUuLmU4OTU1
NWUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9n
CkBAIC0xLDMgKzEsNTAgQEAKKzIwMDktMDktMDggIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEludHJvZHVjZSBXZWJDb3JlOjpJU09EYXRlVGltZSBjbGFzcy4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDA0CisKKyAgICAgICAgVGhpcyBjbGFz
cyByZXByZXNlbnRzIGRhdGUvdGltZSB0eXBlcyBvZiB0aGUgSFRNTDUgSU5QVVQgZWxlbWVudCwK
KyAgICAgICAgYW5kIGhhcyBzb21lIHBhcnNpbmcgbWV0aG9kcyBmb3IgSVNPIDg2MDEuCisgICAg
ICAgIFRoaXMgY2hhbmdlIGhhcyBubyB0ZXN0cyBiZWNhdXNlIHRoZSBjbGFzcyBpcyBub3QgdXNl
ZCB5ZXQuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBXZWJDb3JlLmd5
cGk6CisgICAgICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2Vi
Q29yZS52Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
OgorICAgICAgICAqIFdlYkNvcmVTb3VyY2VzLmJrbDoKKyAgICAgICAgKiBodG1sL0lTT0RhdGVU
aW1lLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6
aXNMZWFwWWVhcik6CisgICAgICAgIChXZWJDb3JlOjptYXhEYXlPZk1vbnRoKToKKyAgICAgICAg
KFdlYkNvcmU6OmRheU9mV2Vlayk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6bWF4
V2Vlayk6CisgICAgICAgIChXZWJDb3JlOjpjb3VudERpZ2l0cyk6CisgICAgICAgIChXZWJDb3Jl
Ojp0b0ludCk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6cGFyc2VZZWFyKToKKyAg
ICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjphZGREYXkpOgorICAgICAgICAoV2ViQ29yZTo6
SVNPRGF0ZVRpbWU6OmFkZE1pbnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6
cGFyc2VUaW1lWm9uZSk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6cGFyc2VNb250
aCk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6cGFyc2VEYXRlKToKKyAgICAgICAg
KFdlYkNvcmU6OklTT0RhdGVUaW1lOjpwYXJzZVdlZWspOgorICAgICAgICAoV2ViQ29yZTo6SVNP
RGF0ZVRpbWU6OnBhcnNlVGltZSk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6cGFy
c2VEYXRlVGltZUxvY2FsKToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjpwYXJzZURh
dGVUaW1lKToKKyAgICAgICAgKiBodG1sL0lTT0RhdGVUaW1lLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6SVNPRGF0ZVRpbWU6OklTT0RhdGVUaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OklT
T0RhdGVUaW1lOjptaWxsaXNlY29uZCk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6
c2Vjb25kKToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjptaW51dGUpOgorICAgICAg
ICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OmhvdXIpOgorICAgICAgICAoV2ViQ29yZTo6SVNPRGF0
ZVRpbWU6Om1vbnRoRGF5KToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjptb250aCk6
CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6ZnVsbFllYXIpOgorICAgICAgICAoV2Vi
Q29yZTo6SVNPRGF0ZVRpbWU6OndlZWspOgorICAgICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6
Oik6CisKIDIwMDktMDktMDEgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9H
TlVtYWtlZmlsZS5hbSBiL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KaW5kZXggY2IxYzM3ZS4uYzY5
NjNmMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQorKysgYi9XZWJDb3JlL0dO
VW1ha2VmaWxlLmFtCkBAIC0xMTI2LDYgKzExMjYsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAog
CVdlYkNvcmUvaHRtbC9IVE1MVUxpc3RFbGVtZW50LmggXAogCVdlYkNvcmUvaHRtbC9IVE1MVmll
d1NvdXJjZURvY3VtZW50LmNwcCBcCiAJV2ViQ29yZS9odG1sL0hUTUxWaWV3U291cmNlRG9jdW1l
bnQuaCBcCisJV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmNwcCBcCisJV2ViQ29yZS9odG1sL0lT
T0RhdGVUaW1lLmggXAogCVdlYkNvcmUvaHRtbC9JbWFnZURhdGEuY3BwIFwKIAlXZWJDb3JlL2h0
bWwvSW1hZ2VEYXRhLmggXAogCVdlYkNvcmUvaHRtbC9NZWRpYUVycm9yLmggXApkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA2Mzky
ZjA5Li4zY2VkNjRhIDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJD
b3JlL1dlYkNvcmUuZ3lwaQpAQCAtMTQ5OSw2ICsxNDk5LDggQEAKICAgICAgICAgICAgICdodG1s
L0hUTUxWaWRlb0VsZW1lbnQuaCcsCiAgICAgICAgICAgICAnaHRtbC9IVE1MVmlld1NvdXJjZURv
Y3VtZW50LmNwcCcsCiAgICAgICAgICAgICAnaHRtbC9IVE1MVmlld1NvdXJjZURvY3VtZW50Lmgn
LAorICAgICAgICAgICAgJ2h0bWwvSVNPRGF0ZVRpbWUuY3BwJywKKyAgICAgICAgICAgICdodG1s
L0lTT0RhdGVUaW1lLmgnLAogICAgICAgICAgICAgJ2h0bWwvSW1hZ2VEYXRhLmNwcCcsCiAgICAg
ICAgICAgICAnaHRtbC9JbWFnZURhdGEuaCcsCiAgICAgICAgICAgICAnaHRtbC9NZWRpYUVycm9y
LmgnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnBybyBiL1dlYkNvcmUvV2ViQ29yZS5w
cm8KaW5kZXggY2I0MTg0MS4uZTNmYWQ3NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnBy
bworKysgYi9XZWJDb3JlL1dlYkNvcmUucHJvCkBAIC0xMDcwLDYgKzEwNzAsNyBAQCBTT1VSQ0VT
ICs9IFwKICAgICBodG1sL0hUTUxUb2tlbml6ZXIuY3BwIFwKICAgICBodG1sL0hUTUxVTGlzdEVs
ZW1lbnQuY3BwIFwKICAgICBodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3BwIFwKKyAgICBo
dG1sL0lTT0RhdGVUaW1lLmNwcCBcCiAgICAgaHRtbC9JbWFnZURhdGEuY3BwIFwKICAgICBodG1s
L1ByZWxvYWRTY2FubmVyLmNwcCBcCiAgICAgaHRtbC9WYWxpZGl0eVN0YXRlLmNwcCBcCkBAIC0x
NzUwLDYgKzE3NTEsNyBAQCBIRUFERVJTICs9IFwKICAgICBodG1sL0hUTUxVTGlzdEVsZW1lbnQu
aCBcCiAgICAgaHRtbC9IVE1MVmlkZW9FbGVtZW50LmggXAogICAgIGh0bWwvSFRNTFZpZXdTb3Vy
Y2VEb2N1bWVudC5oIFwKKyAgICBodG1sL0lTT0RhdGVUaW1lLmggXAogICAgIGh0bWwvSW1hZ2VE
YXRhLmggXAogICAgIGh0bWwvUHJlbG9hZFNjYW5uZXIuaCBcCiAgICAgaHRtbC9UaW1lUmFuZ2Vz
LmggXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvaiBi
L1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKaW5kZXggYmZmNzczYi4uYjQx
YTgwOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagor
KysgYi9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCkBAIC0zMzcxNSw2ICsz
MzcxNSwxNCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxodG1sXElTT0RhdGVQYXJzZXIuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJ
CTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxJU09EYXRlUGFyc2VyLmgiDQorCQkJ
CT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxodG1sXElt
YWdlRGF0YS5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9X
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagppbmRleCA2N2JkOGQ5Li5iMjQ5NmM2IDEwMDY0NAotLS0gYS9X
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtNDczMiw2ICs0NzMyLDggQEAKIAkJ
RjVDMDQxRTUwRkZDQTk2RDAwODM5RDRBIC8qIERPTUhUTUxEYXRhTGlzdEVsZW1lbnRJbnRlcm5h
bC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjVDMDQx
RTAwRkZDQTk2RDAwODM5RDRBIC8qIERPTUhUTUxEYXRhTGlzdEVsZW1lbnRJbnRlcm5hbC5oICov
OyB9OwogCQlGNUMwNDFFNjBGRkNBOTZEMDA4MzlENEEgLyogSlNIVE1MRGF0YUxpc3RFbGVtZW50
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1QzA0
MUUxMEZGQ0E5NkQwMDgzOUQ0QSAvKiBKU0hUTUxEYXRhTGlzdEVsZW1lbnQuY3BwICovOyB9Owog
CQlGNUMwNDFFNzBGRkNBOTZEMDA4MzlENEEgLyogSlNIVE1MRGF0YUxpc3RFbGVtZW50LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNUMwNDFFMjBGRkNB
OTZEMDA4MzlENEEgLyogSlNIVE1MRGF0YUxpc3RFbGVtZW50LmggKi87IH07CisJCUY1RDNBNTdD
MTA2QjgzQjMwMDU0NTI5NyAvKiBJU09EYXRlVGltZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNUQzQTU3QTEwNkI4M0IzMDA1NDUyOTcgLyogSVNP
RGF0ZVRpbWUuY3BwICovOyB9OworCQlGNUQzQTU3RDEwNkI4M0IzMDA1NDUyOTcgLyogSVNPRGF0
ZVRpbWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1
RDNBNTdCMTA2QjgzQjMwMDU0NTI5NyAvKiBJU09EYXRlVGltZS5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUY5MTZDNDhEMERCNTEwRjgwMDc2Q0Q4
MyAvKiBKU1hNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGOTE2QzQ4QjBEQjUxMEY4MDA3NkNEODMgLyog
SlNYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQuY3BwICovOyB9OwogCQlGOTE2QzQ4RTBEQjUx
MEY4MDA3NkNEODMgLyogSlNYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY5MTZDNDhDMERCNTEwRjgwMDc2
Q0Q4MyAvKiBKU1hNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudC5oICovOyB9OwogCQlGOUYwRUQ3
QTBEQjUwQ0EyMDBEMTZEQjkgLyogWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGOUYwRUQ3NzBEQjUwQ0Ey
MDBEMTZEQjkgLyogWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50LmggKi87IH07CkBAIC05OTM0
LDYgKzk5MzYsOCBAQAogCQlGNUMyODY5MzAyODQ2RENEMDE4NjM1Q0EgLyogQXBwbGljYXRpb25T
ZXJ2aWNlcy5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEFwcGxpY2F0aW9uU2VydmljZXMu
ZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwbGljYXRpb25T
ZXJ2aWNlcy5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CiAJCUY1QzI4
Njk0MDI4NDZEQ0QwMTg2MzVDQSAvKiBDYXJib24uZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUg
PSBDYXJib24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ2Fy
Ym9uLmZyYW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKIAkJRjVDMjg2OTUw
Mjg0NkRDRDAxODYzNUNBIC8qIENvY29hLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29j
b2EuZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJh
bWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OworCQlGNUQzQTU3QTEwNkI4M0Iz
MDA1NDUyOTcgLyogSVNPRGF0ZVRpbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gSVNPRGF0ZVRpbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlG
NUQzQTU3QjEwNkI4M0IzMDA1NDUyOTcgLyogSVNPRGF0ZVRpbWUuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSVNPRGF0ZVRpbWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJRjgyMTYyOTkwMjlGNEZCNTAxMDAwMTMxIC8qIEphdmFTY3JpcHRDb3JlLmZyYW1ld29y
ayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBw
ZXIuZnJhbWV3b3JrOyBwYXRoID0gSmF2YVNjcmlwdENvcmUuZnJhbWV3b3JrOyBzb3VyY2VUcmVl
ID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OwogCQlGOTE2QzQ4QjBEQjUxMEY4MDA3NkNEODMgLyog
SlNYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IEpTWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50LmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRjkxNkM0OEMwREI1MTBGODAwNzZDRDgzIC8qIEpTWE1M
SHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBKU1hNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwpAQCAtMTI3MjAsNiArMTI3MjQsOCBAQAogCQkJCUU0NDYxMzlBMENENjMzMTAwMEZB
REE3NSAvKiBIVE1MVmlkZW9FbGVtZW50LmlkbCAqLywKIAkJCQlCQ0NENzRFNDBBNEM4RERGMDA1
RkRBNkQgLyogSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5jcHAgKi8sCiAJCQkJQkNDRDc0REIwQTRD
OEQzNTAwNUZEQTZEIC8qIEhUTUxWaWV3U291cmNlRG9jdW1lbnQuaCAqLywKKwkJCQlGNUQzQTU3
QTEwNkI4M0IzMDA1NDUyOTcgLyogSVNPRGF0ZVRpbWUuY3BwICovLAorCQkJCUY1RDNBNTdCMTA2
QjgzQjMwMDU0NTI5NyAvKiBJU09EYXRlVGltZS5oICovLAogCQkJCUE3Nzk3OTEzMEQ2QjlEMEMw
MDM4NTFCOSAvKiBJbWFnZURhdGEuY3BwICovLAogCQkJCUE3Nzk3OTE0MEQ2QjlEMEMwMDM4NTFC
OSAvKiBJbWFnZURhdGEuaCAqLywKIAkJCQlBNzc5NzkxNTBENkI5RDBDMDAzODUxQjkgLyogSW1h
Z2VEYXRhLmlkbCAqLywKQEAgLTE2ODc2LDYgKzE2ODgyLDcgQEAKIAkJCQlCQ0NENzREQzBBNEM4
RDM1MDA1RkRBNkQgLyogSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJNTE0Qzc2NzEwQ0U5MjNBMTAwN0VGM0NEIC8qIEhUVFBIZWFkZXJNYXAuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTUxNEM3NjczMENFOTIzQTEwMDdFRjNDRCAvKiBIVFRQUGFyc2Vycy5oIGluIEhl
YWRlcnMgKi8sCisJCQkJRjVEM0E1N0QxMDZCODNCMzAwNTQ1Mjk3IC8qIElTT0RhdGVUaW1lLmgg
aW4gSGVhZGVycyAqLywKIAkJCQlCMjc1MzU2RTBCMDUzODE0MDAyQ0U2NEYgLyogSWNvbi5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJNTEyNkU2QkMwQTJFM0IxMjAwNUMyOUZBIC8qIEljb25EYXRhYmFz
ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNTFFMUVDQkUwQzkxQzkwNDAwREMyNTVCIC8qIEljb25E
YXRhYmFzZUNsaWVudC5oIGluIEhlYWRlcnMgKi8sCkBAIC0xOTAxNiw2ICsxOTAyMyw3IEBACiAJ
CQkJQkNDRDc0RTUwQTRDOERERjAwNUZEQTZEIC8qIEhUTUxWaWV3U291cmNlRG9jdW1lbnQuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJMEI4QzU2RDQwRjI4NjI3RjAwMDUwMkUxIC8qIEhUVFBIZWFk
ZXJNYXAuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNTE0Qzc2NzIwQ0U5MjNBMTAwN0VGM0NEIC8q
IEhUVFBQYXJzZXJzLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUY1RDNBNTdDMTA2QjgzQjMwMDU0
NTI5NyAvKiBJU09EYXRlVGltZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1MTI2RTZCQjBBMkUz
QjEyMDA1QzI5RkEgLyogSWNvbkRhdGFiYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTQ0NUM4
REI3MTAwMTVGQzkwMDMxNTMxQSAvKiBJY29uRGF0YWJhc2VOb25lLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTFBMkQ3NTNFMERFNDdGQUIwMEYwQTY0OCAvKiBJY29uRmV0Y2hlci5jcHAgaW4gU291
cmNlcyAqLywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsIGIvV2ViQ29y
ZS9XZWJDb3JlU291cmNlcy5ia2wKaW5kZXggYzU3OTA4NC4uMWI3M2U1NiAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9XZWJDb3JlU291cmNlcy5ia2wKKysrIGIvV2ViQ29yZS9XZWJDb3JlU291cmNlcy5i
a2wKQEAgLTY3Miw2ICs2NzIsNyBAQCBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxpc3Qgb2YgZmls
ZXMgbmVlZGVkIHRvIGJ1aWxkIFdlYkNvcmUuCiAgICAgICAgIGh0bWwvSFRNTFRva2VuaXplci5j
cHAKICAgICAgICAgaHRtbC9IVE1MVUxpc3RFbGVtZW50LmNwcAogICAgICAgICBodG1sL0hUTUxW
aWV3U291cmNlRG9jdW1lbnQuY3BwCisgICAgICAgIGh0bWwvSVNPRGF0ZVRpbWUuY3BwCiAgICAg
ICAgIGh0bWwvSW1hZ2VEYXRhLmNwcAogICAgICAgICBodG1sL1ByZWxvYWRTY2FubmVyLmNwcAog
ICAgICAgICBodG1sL1ZhbGlkaXR5U3RhdGUuY3BwCmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwv
SVNPRGF0ZVRpbWUuY3BwIGIvV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYxZjNmCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9odG1sL0lTT0RhdGVUaW1lLmNwcApAQCAtMCwwICsxLDQyMyBAQAorLyoKKyAqIENvcHly
aWdodCAoYykgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSVNPRGF0ZVRpbWUuaCIKKworI2luY2x1ZGUgPHd0Zi9BU0NJSUNU
eXBlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhlIG9sZGVzdCBkYXkgb2YgR3Jl
Z29yaWFuIENhbGVuZGFyIGlzIDE1ODItMTAtMTUuICBXZSBkb24ndCBzdXBwb3J0IGRhdGVzIG9s
ZGVyIHRoYW4gaXQuCitzdGF0aWMgY29uc3QgaW50IGdyZWdvcmlhblN0YXJ0WWVhciA9IDE1ODI7
CitzdGF0aWMgY29uc3QgaW50IGdyZWdvcmlhblN0YXJ0TW9udGggPSAxMDsKK3N0YXRpYyBjb25z
dCBpbnQgZ3JlZ29yaWFuU3RhcnREYXkgPSAxNTsKKworc3RhdGljIGNvbnN0IGludCBtYXhEYXlP
Zk1vbnRoc1sxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMw
LCAzMX07CisKK3N0YXRpYyBib29sIGlzTGVhcFllYXIoaW50IHllYXIpCit7CisgICAgaWYgKHll
YXIgJSA0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCEoeWVhciAlIDQwMCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghKHllYXIgJSAxMDApKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbWF4RGF5T2ZNb250
aChpbnQgeWVhciwgaW50IG1vbnRoKQoreworICAgIGlmIChtb250aCAhPSAxKSAvLyBGZWJydWFy
eT8KKyAgICAgICAgcmV0dXJuIG1heERheU9mTW9udGhzW21vbnRoXTsKKyAgICByZXR1cm4gaXNM
ZWFwWWVhcih5ZWFyKSA/IDI5IDogMjg7Cit9CisKK3N0YXRpYyBpbnQgZGF5T2ZXZWVrKGludCB5
ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpCit7CisgICAgKyttb250aDsKKworICAgIC8vIFplbGxl
cidzIGNvbmdydWVuY2UKKyAgICBpZiAobW9udGggPD0gMikgeworICAgICAgICBtb250aCArPSAx
MjsKKyAgICAgICAgeWVhci0tOworICAgIH0KKyAgICBpbnQgaGlnaFllYXIgPSB5ZWFyIC8gMTAw
OworICAgIGludCBsb3dZZWFyID0geWVhciAlIDEwMDsKKyAgICBpbnQgcmVzdWx0ID0gKGRheSAr
IDEzICogKG1vbnRoICsgMSkgLyA1ICsgbG93WWVhciArIGxvd1llYXIgLyA0ICsgaGlnaFllYXIg
LyA0IC0gMiAqIGhpZ2hZZWFyIC0gMSkgJSA3OworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAg
ICByZXN1bHQgKz0gNzsKKyAgICByZXR1cm4gcmVzdWx0OyAgIC8vIFN1bmRheSBvcmlnaW4KK30K
KworaW50IElTT0RhdGVUaW1lOjptYXhXZWVrKCkgY29uc3QKK3sKKyAgICBpbnQgZGF5ID0gZGF5
T2ZXZWVrKG1feWVhciwgMCwgMSk7CisgICAgcmV0dXJuIGRheSA9PSBUSFVSU0RBWSB8fCBkYXkg
PT0gV0VETkVTREFZICYmIGlzTGVhcFllYXIobV95ZWFyKSA/IDUzIDogNTI7Cit9CisKK3N0YXRp
YyB1bnNpZ25lZCBjb3VudERpZ2l0cyhjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgs
IHVuc2lnbmVkIHN0YXJ0KQoreworICAgIHVuc2lnbmVkIGNvdW50ID0gc3RhcnQ7CisgICAgZm9y
ICg7IGNvdW50IDwgbGVuZ3RoOyArK2NvdW50KSB7CisgICAgICAgIGlmICghaXNBU0NJSURpZ2l0
KHNyY1tjb3VudF0pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjb3Vu
dCAtIHN0YXJ0OworfQorCisvLyBWZXJ5IHN0cmljdCBpbnRlZ2VyIHBhcnNlci4gIE5vdCBhbGxv
dyBsZWFkaW5nIHdoaXRlc3BhY2VzIHVubGlrZSBjaGFyYWN0ZXJzVG9JbnRTdHJpY3QoKS4KK3N0
YXRpYyBib29sIHRvSW50KGNvbnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWdu
ZWQgcGFyc2VTdGFydCwgdW5zaWduZWQgcGFyc2VMZW5ndGgsIGludCogb3V0KQoreworICAgIGlm
IChwYXJzZVN0YXJ0ICsgcGFyc2VMZW5ndGggPiBsZW5ndGggfHwgcGFyc2VMZW5ndGggPD0gMCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGludCB2YWx1ZSA9IDA7CisgICAgY29uc3QgVUNo
YXIqIGN1cnJlbnQgPSBzcmMgKyBwYXJzZVN0YXJ0OworICAgIGNvbnN0IFVDaGFyKiBlbmQgPSBj
dXJyZW50ICsgcGFyc2VMZW5ndGg7CisKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBu
ZWdhdGl2ZSBudW1iZXJzIGZvciBJU08gODYwMS4KKyAgICBmb3IgKDsgY3VycmVudCA8IGVuZDsg
KytjdXJyZW50KSB7CisgICAgICAgIGlmICghaXNBU0NJSURpZ2l0KCpjdXJyZW50KSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGRpZ2l0ID0gKmN1cnJlbnQgLSAnMCc7
CisgICAgICAgIGlmICh2YWx1ZSA+IChJTlRfTUFYIC0gZGlnaXQpIC8gMTApICAvLyBvdmVyZmxv
dworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAg
KyBkaWdpdDsKKyAgICB9CisgICAgKm91dCA9IHZhbHVlOworICAgIHJldHVybiB0cnVlOworfQor
Citib29sIElTT0RhdGVUaW1lOjpwYXJzZVllYXIoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQg
bGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQqIGVuZCkKK3sKKyAgICB1bnNpZ25lZCBk
aWdpdHNMZW5ndGggPSBjb3VudERpZ2l0cyhzcmMsIGxlbmd0aCwgc3RhcnQpOworICAgIC8vIE5l
ZWRzIGF0IGxlYXN0IDQgZGlnaXRzIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuCisgICAgaWYg
KGRpZ2l0c0xlbmd0aCA8IDQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQgeWVhcjsK
KyAgICBpZiAoIXRvSW50KHNyYywgbGVuZ3RoLCBzdGFydCwgZGlnaXRzTGVuZ3RoLCAmeWVhcikp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBObyBzdXBwb3J0IGZvciB5ZWFycyBiZWZv
cmUgR3JlZ29yaWFuIGNhbGVuZGFyLgorICAgIGlmICh5ZWFyIDwgZ3JlZ29yaWFuU3RhcnRZZWFy
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV95ZWFyID0geWVhcjsKKyAgICAqZW5kID0g
c3RhcnQgKyBkaWdpdHNMZW5ndGg7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSVNPRGF0
ZVRpbWU6OmFkZERheShpbnQgZGF5RGlmZikKK3sKKyAgICBBU1NFUlQobV9tb250aERheSk7CisK
KyAgICBpbnQgZGF5ID0gbV9tb250aERheSArIGRheURpZmY7CisgICAgaWYgKGRheSA+IG1heERh
eU9mTW9udGgobV95ZWFyLCBtX21vbnRoKSkgeworICAgICAgICBkYXkgPSBtX21vbnRoRGF5Owor
ICAgICAgICBpbnQgbW9udGggPSBtX21vbnRoOworICAgICAgICBpbnQgeWVhciA9IG1feWVhcjsK
KyAgICAgICAgZm9yICg7IGRheURpZmYgPiAwOyAtLWRheURpZmYpIHsKKyAgICAgICAgICAgICsr
ZGF5OworICAgICAgICAgICAgaWYgKGRheSA+IG1heERheU9mTW9udGgoeWVhciwgbW9udGgpKSB7
CisgICAgICAgICAgICAgICAgZGF5ID0gMTsKKyAgICAgICAgICAgICAgICArK21vbnRoOworICAg
ICAgICAgICAgICAgIGlmIChtb250aCA+PSAxMikgeyAgLy8gbW9udGggaXMgMC1vcmlnaW4uCisg
ICAgICAgICAgICAgICAgICAgIG1vbnRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKyt5ZWFy
OworICAgICAgICAgICAgICAgICAgICBpZiAoeWVhciA8IDApICAvLyBPdmVyZmxvdy4KKyAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV95ZWFyID0geWVhcjsKKyAgICAgICAgbV9t
b250aCA9IG1vbnRoOworICAgIH0gZWxzZSBpZiAoZGF5IDwgMSkgeworICAgICAgICBpbnQgbW9u
dGggPSBtX21vbnRoOworICAgICAgICBpbnQgeWVhciA9IG1feWVhcjsKKyAgICAgICAgZGF5ID0g
bV9tb250aERheTsKKyAgICAgICAgZm9yICg7IGRheURpZmYgPCAwOyArK2RheURpZmYpIHsKKyAg
ICAgICAgICAgIC0tZGF5OworICAgICAgICAgICAgaWYgKGRheSA8IDEpIHsKKyAgICAgICAgICAg
ICAgICAtLW1vbnRoOworICAgICAgICAgICAgICAgIGlmIChtb250aCA8IDApIHsKKyAgICAgICAg
ICAgICAgICAgICAgbW9udGggPSAxMTsKKyAgICAgICAgICAgICAgICAgICAgLS15ZWFyOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXkgPSBtYXhEYXlPZk1vbnRoKHllYXIs
IG1vbnRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh5ZWFyIDwgZ3JlZ29yaWFu
U3RhcnRZZWFyCisgICAgICAgICAgICAgICAgICAgIHx8IHllYXIgPT0gZ3JlZ29yaWFuU3RhcnRZ
ZWFyICYmIG1vbnRoICsgMSA8IGdyZWdvcmlhblN0YXJ0TW9udGgKKyAgICAgICAgICAgICAgICAg
ICAgfHwgeWVhciA9PSBncmVnb3JpYW5TdGFydFllYXIgJiYgbW9udGggKyAxID09IGdyZWdvcmlh
blN0YXJ0TW9udGggJiYgZGF5IDwgZ3JlZ29yaWFuU3RhcnREYXkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1feWVhciA9IHllYXI7CisgICAgICAg
IG1fbW9udGggPSBtb250aDsKKyAgICB9CisgICAgbV9tb250aERheSA9IGRheTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworYm9vbCBJU09EYXRlVGltZTo6YWRkTWludXRlKGludCBtaW51dGUpCit7
CisgICAgaW50IGNhcnJ5OworICAgIC8vIG1pbiBjYW4gYmUgbmVnYXRpdmUgb3IgZ3JlYXRlciB0
aGFuIDU5CisgICAgbWludXRlICs9IG1fbWludXRlOworICAgIGlmIChtaW51dGUgPiA1OSkgewor
ICAgICAgICBjYXJyeSA9IG1pbnV0ZSAvIDYwOworICAgICAgICBtaW51dGUgPSBtaW51dGUgJSA2
MDsKKyAgICB9IGVsc2UgaWYgKG1fbWludXRlIDwgMCkgeworICAgICAgICBjYXJyeSA9ICg1OSAt
IG1fbWludXRlKSAvIDYwOworICAgICAgICBtaW51dGUgKz0gY2FycnkgKiA2MDsKKyAgICAgICAg
Y2FycnkgPSAtY2Fycnk7CisgICAgICAgIEFTU0VSVChtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0g
NTkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fbWludXRlID0gbWludXRlOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQgaG91ciA9IG1faG91ciArIGNhcnJ5OworICAg
IGlmIChob3VyID4gMjMpIHsKKyAgICAgICAgY2FycnkgPSBob3VyIC8gMjQ7CisgICAgICAgIGhv
dXIgPSBob3VyICUgMjQ7CisgICAgfSBlbHNlIGlmIChob3VyIDwgMCkgeworICAgICAgICBjYXJy
eSA9ICgyMyAtIGhvdXIpIC8gMjQ7CisgICAgICAgIGhvdXIgKz0gY2FycnkgKiAyNDsKKyAgICAg
ICAgY2FycnkgPSAtY2Fycnk7CisgICAgICAgIEFTU0VSVChob3VyID49IDAgJiYgaG91ciA8PSAy
Myk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9taW51dGUgPSBtaW51dGU7CisgICAgICAgIG1f
aG91ciA9IGhvdXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIWFkZERh
eShjYXJyeSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBtX21pbnV0ZSA9IG1pbnV0ZTsK
KyAgICBtX2hvdXIgPSBob3VyOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBQYXJzZXMgYSB0
aW1lem9uZSBwYXJ0LCBhbmQgYWRqdXN0IHllYXIsIG1vbnRoLCBtb250aERheSwgaG91ciwgbWlu
dXRlLCBzZWNvbmQsIG1pbGxlc2Vjb25kLgorYm9vbCBJU09EYXRlVGltZTo6cGFyc2VUaW1lWm9u
ZShjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNp
Z25lZCogZW5kKQoreworICAgIGlmIChzdGFydCA+PSBsZW5ndGgpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB1bnNpZ25lZCBpID0gc3RhcnQ7CisgICAgaW50IGhvdXI7CisgICAgaW50IG1p
bnV0ZTsKKyAgICBpZiAoc3JjW2ldID09ICdaJykgeworICAgICAgICArK2k7CisgICAgICAgIGhv
dXIgPSAwOworICAgICAgICBtaW51dGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wg
bWludXM7CisgICAgICAgIGlmIChzcmNbaV0gPT0gJysnKQorICAgICAgICAgICAgbWludXMgPSBm
YWxzZTsKKyAgICAgICAgZWxzZSBpZiAoc3JjW2ldID09ICctJykKKyAgICAgICAgICAgIG1pbnVz
ID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICArK2k7CisKKyAgICAgICAgaWYgKCF0b0ludChzcmMsIGxlbmd0aCwgaSwgMiwgJmhvdXIpIHx8
IGhvdXIgPCAwIHx8IGhvdXIgPiAyMykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgaSArPSAyOworCisgICAgICAgIGlmIChpID49IGxlbmd0aCB8fCBzcmNbaSsrXSAhPSAnOicp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCF0b0ludChzcmMsIGxl
bmd0aCwgaSwgMiwgJm1pbnV0ZSkgfHwgbWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaSArPSAyOworCisgICAgICAgIGlmIChtaW51
cykgeworICAgICAgICAgICAgaG91ciA9IC1ob3VyOworICAgICAgICAgICAgbWludXRlID0gLW1p
bnV0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFN1YnRyYWN0IHRoZSB0aW1lem9uZSBv
ZmZzZXQuCisgICAgaWYgKCFhZGRNaW51dGUoIC0oaG91ciAqIDYwICsgbWludXRlKSkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAqZW5kID0gaTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBJU09EYXRlVGltZTo6cGFyc2VNb250aChjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBs
ZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCogZW5kKQoreworICAgIEFTU0VSVChzcmMp
OworICAgIEFTU0VSVChlbmQpOworICAgIHVuc2lnbmVkIGk7CisgICAgaWYgKCFwYXJzZVllYXIo
c3JjLCBsZW5ndGgsIHN0YXJ0LCAmaSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAo
aSA+PSBsZW5ndGggfHwgc3JjW2krK10gIT0gJy0nKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaW50IG1vbnRoOworICAgIGlmICghdG9JbnQoc3JjLCBsZW5ndGgsIGksIDIsICZtb250aCkg
fHwgbW9udGggPCAxIHx8IG1vbnRoID4gMTIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAv
LyBObyBzdXBwb3J0IGZvciBtb250aHMgYmVmb3JlIEdyZWdvcmlhbiBjYWxlbmRhci4KKyAgICBp
ZiAobV95ZWFyID09IGdyZWdvcmlhblN0YXJ0WWVhciAmJiBtb250aCA8IGdyZWdvcmlhblN0YXJ0
TW9udGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBtX21vbnRoID0gbW9udGggLSAxOwor
ICAgICplbmQgPSBpICsgMjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJU09EYXRlVGlt
ZTo6cGFyc2VEYXRlKGNvbnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQg
c3RhcnQsIHVuc2lnbmVkKiBlbmQpCit7CisgICAgQVNTRVJUKHNyYyk7CisgICAgQVNTRVJUKGVu
ZCk7CisgICAgdW5zaWduZWQgaTsKKyAgICBpZiAoIXBhcnNlTW9udGgoc3JjLCBsZW5ndGgsIHN0
YXJ0LCAmaSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyAnLScgYW5kIDItZGlnaXRz
IGFyZSBuZWVkZWQuCisgICAgaWYgKGkgKyAyID49IGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGlmIChzcmNbaSsrXSAhPSAnLScpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpbnQgZGF5OworICAgIGlmICghdG9JbnQoc3JjLCBsZW5ndGgsIGksIDIsICZkYXkpIHx8IGRh
eSA8IDEgfHwgZGF5ID4gbWF4RGF5T2ZNb250aChtX3llYXIsIG1fbW9udGgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgLy8gTm8gc3VwcG9ydCBmb3IgZGF0ZXMgYmVmb3JlIEdyZWdvcmlh
biBjYWxlbmRhci4KKyAgICBpZiAobV95ZWFyID09IGdyZWdvcmlhblN0YXJ0WWVhciAmJiBtX21v
bnRoICsgMSA9PSBncmVnb3JpYW5TdGFydE1vbnRoICYmIGRheSA8IGdyZWdvcmlhblN0YXJ0RGF5
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9tb250aERheSA9IGRheTsKKyAgICAqZW5k
ID0gaSArIDI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSVNPRGF0ZVRpbWU6OnBhcnNl
V2Vlayhjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCogZW5kKQoreworICAgIEFTU0VSVChzcmMpOworICAgIEFTU0VSVChlbmQpOworICAg
IHVuc2lnbmVkIGk7CisgICAgaWYgKCFwYXJzZVllYXIoc3JjLCBsZW5ndGgsIHN0YXJ0LCAmaSkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyA0IGNoYXJhY3RlcnMgKCctJyAnVycgZGln
aXQgZGlnaXQpIGFyZSBuZWVkZWQuCisgICAgaWYgKGkgKyAzID49IGxlbmd0aCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmIChzcmNbaSsrXSAhPSAnLScpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3JjW2krK10gIT0gJ1cnKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaW50IHdlZWs7CisgICAgaWYgKCF0b0ludChzcmMsIGxlbmd0aCwgaSwgMiwgJndlZWspIHx8
IHdlZWsgPCAxIHx8IHdlZWsgPiBtYXhXZWVrKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAvLyBObyBzdXBwb3J0IGZvciB5ZWFycyBvbGRlciB0aGFuIG9yIGVxdWFscyB0byBHcmVnb3Jp
YW4gY2FsZW5kYXIgc3RhcnQgeWVhci4KKyAgICBpZiAobV95ZWFyIDw9IGdyZWdvcmlhblN0YXJ0
WWVhcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fd2VlayA9IHdlZWs7CisgICAgKmVu
ZCA9IGkgKyAyOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElTT0RhdGVUaW1lOjpwYXJz
ZVRpbWUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwg
dW5zaWduZWQqIGVuZCkKK3sKKyAgICBBU1NFUlQoc3JjKTsKKyAgICBBU1NFUlQoZW5kKTsKKyAg
ICBpbnQgaG91cjsKKyAgICBpZiAoIXRvSW50KHNyYywgbGVuZ3RoLCBzdGFydCwgMiwgJmhvdXIp
IHx8IGhvdXIgPCAwIHx8IGhvdXIgPiAyMykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHVu
c2lnbmVkIGkgPSBzdGFydCArIDI7CisgICAgaWYgKGkgPj0gbGVuZ3RoKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKHNyY1tpKytdICE9ICc6JykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIGludCBtaW51dGU7CisgICAgaWYgKCF0b0ludChzcmMsIGxlbmd0aCwgaSwgMiwgJm1p
bnV0ZSkgfHwgbWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIGkgKz0gMjsKKyAgICBtX2hvdXIgPSBob3VyOworICAgIG1fbWludXRlID0gbWludXRl
OworICAgIG1fc2Vjb25kID0gMDsKKyAgICBtX21pbGxpc2Vjb25kID0gMDsKKworICAgIC8vIE9w
dGlvbmFsIHNlY29uZCBwYXJ0CisgICAgaWYgKGkgKyAyIDwgbGVuZ3RoICYmIHNyY1tpXSA9PSAn
OicpIHsKKyAgICAgICAgaW50IHNlY29uZDsKKyAgICAgICAgaWYgKHRvSW50KHNyYywgbGVuZ3Ro
LCBpICsgMSwgMiwgJnNlY29uZCkgJiYgc2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5KSB7Cisg
ICAgICAgICAgICBtX3NlY29uZCA9IHNlY29uZDsKKyAgICAgICAgICAgIGkgKz0gMzsKKworICAg
ICAgICAgICAgLy8gT3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmQgcGFydAorICAgICAgICAgICAg
aWYgKGkgPCBsZW5ndGggJiYgc3JjW2ldID09ICcuJykgeworICAgICAgICAgICAgICAgIHVuc2ln
bmVkIGRpZ2l0c0xlbmd0aCA9IGNvdW50RGlnaXRzKHNyYywgbGVuZ3RoLCArK2kpOworICAgICAg
ICAgICAgICAgIGlmIChkaWdpdHNMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJv
b2wgb2s7CisgICAgICAgICAgICAgICAgICAgIGludCBtaWxsaXNlY29uZDsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGRpZ2l0c0xlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBvayA9IHRvSW50KHNyYywgbGVuZ3RoLCBpLCAxLCAmbWlsbGlzZWNvbmQpOworICAgICAgICAg
ICAgICAgICAgICAgICAgbWlsbGlzZWNvbmQgKj0gMTAwOworICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKGRpZ2l0c0xlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBv
ayA9IHRvSW50KHNyYywgbGVuZ3RoLCBpLCAyLCAmbWlsbGlzZWNvbmQpOworICAgICAgICAgICAg
ICAgICAgICAgICAgbWlsbGlzZWNvbmQgKj0gMTA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSAvLyBkaWdpdHNMZW5ndGggPj0gMworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0b0lu
dChzcmMsIGxlbmd0aCwgaSwgMywgJm1pbGxpc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG9rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX21pbGxpc2Vjb25kID0gbWlsbGlz
ZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IGRpZ2l0c0xlbmd0aDsKKyAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAtLWk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICplbmQg
PSBpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElTT0RhdGVUaW1lOjpwYXJzZURhdGVU
aW1lTG9jYWwoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFy
dCwgdW5zaWduZWQqIGVuZCkKK3sKKyAgICBBU1NFUlQoc3JjKTsKKyAgICBBU1NFUlQoZW5kKTsK
KyAgICB1bnNpZ25lZCBpOworICAgIGlmICghcGFyc2VEYXRlKHNyYywgbGVuZ3RoLCBzdGFydCwg
JmkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGkgPj0gbGVuZ3RoKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNyY1tpKytdICE9ICdUJykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiBwYXJzZVRpbWUoc3JjLCBsZW5ndGgsIGksIGVuZCk7Cit9CisK
K2Jvb2wgSVNPRGF0ZVRpbWU6OnBhcnNlRGF0ZVRpbWUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWdu
ZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQqIGVuZCkKK3sKKyAgICBBU1NFUlQo
c3JjKTsKKyAgICBBU1NFUlQoZW5kKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGlmICghcGFyc2VE
YXRlKHNyYywgbGVuZ3RoLCBzdGFydCwgJmkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKGkgPj0gbGVuZ3RoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNyY1tpKytd
ICE9ICdUJykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghcGFyc2VUaW1lKHNyYywg
bGVuZ3RoLCBpLCAmaSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcGFyc2VU
aW1lWm9uZShzcmMsIGxlbmd0aCwgaSwgZW5kKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmggYi9XZWJDb3JlL2h0bWwv
SVNPRGF0ZVRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzA0YTE5
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmgKQEAgLTAsMCAr
MSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBJU09EYXRlVGltZV9oCisjZGVmaW5lIElTT0RhdGVUaW1lX2gKKwor
I2luY2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CisvLyBBbiBJU09EYXRlVGltZSBpbnN0YW5jZSByZXByZXNlbnRzIG9uZSBvZiB0aGUgZm9sbG93
aW5nIGRhdGUgYW5kIHRpbWUgY29tYmluYXRpb25zOgorLy8gKiB5ZWFyLW1vbnRoCisvLyAqIHll
YXItbW9udGgtZGF5CisvLyAqIHllYXItd2VlaworLy8gKiBob3VyLW1pbnV0ZS1zZWNvbmQtbWls
bGlzZWNvbmQKKy8vICogeWVhci1tb250aC1kYXkgaG91ci1taW51dGUtc2Vjb25kLW1pbGxpc2Vj
b25kCitjbGFzcyBJU09EYXRlVGltZSB7CitwdWJsaWM6CisgICAgSVNPRGF0ZVRpbWUoKQorICAg
ICAgICA6IG1fbWlsbGlzZWNvbmQoMCkKKyAgICAgICAgLCBtX3NlY29uZCgwKQorICAgICAgICAs
IG1fbWludXRlKDApCisgICAgICAgICwgbV9ob3VyKDApCisgICAgICAgICwgbV9tb250aERheSgw
KQorICAgICAgICAsIG1fbW9udGgoMCkKKyAgICAgICAgLCBtX3llYXIoMCkKKyAgICAgICAgLCBt
X3dlZWsoMCkKKyAgICB7CisgICAgfQorCisgICAgaW50IG1pbGxpc2Vjb25kKCkgY29uc3QgeyBy
ZXR1cm4gbV9taWxsaXNlY29uZDsgfQorICAgIGludCBzZWNvbmQoKSBjb25zdCB7IHJldHVybiBt
X3NlY29uZDsgfQorICAgIGludCBtaW51dGUoKSBjb25zdCB7IHJldHVybiBtX21pbnV0ZTsgfQor
ICAgIGludCBob3VyKCkgY29uc3QgeyByZXR1cm4gbV9ob3VyOyB9CisgICAgaW50IG1vbnRoRGF5
KCkgY29uc3QgeyByZXR1cm4gbV9tb250aERheTsgfQorICAgIGludCBtb250aCgpIGNvbnN0IHsg
cmV0dXJuIG1fbW9udGg7IH0KKyAgICBpbnQgZnVsbFllYXIoKSBjb25zdCB7IHJldHVybiBtX3ll
YXI7IH0KKyAgICBpbnQgd2VlaygpIGNvbnN0IHsgcmV0dXJuIG1fd2VlazsgfQorCisgICAgLy8g
VGhlIGZvbGxvd2luZyBzaXggZnVuY3Rpb25zIHBhcnNlIHRoZSBpbnB1dCBgc3JjJyBvZiB3aGlj
aCBsZW5ndGggaXMKKyAgICAvLyBgbGVuZ3RoJywgYW5kIHVwZGF0ZXMgc29tZSBmaWVsZHMgb2Yg
dGhpcyBpbnN0YW5jZS4gVGhlIHBhcnNpbmcgc3RhcnRzIGF0CisgICAgLy8gc3JjW3N0YXJ0XSBh
bmQgZXhhbWluZXMgY2hhcmFjdGVycyBiZWZvcmUgc3JjW2xlbmd0aF0uCisgICAgLy8gYHNyYycs
IGBlbmQnIGFuZCBgZGF0ZScgbXVzdCBiZSBub24tbnVsbC4gVGhlIGBzcmMnIHN0cmluZyBkb2Vz
bid0IG5lZWRzIHRvCisgICAgLy8gYmUgbnVsbC10ZXJtaW5hdGVkLgorICAgIC8vIFRoZSBmdW5j
dGlvbnMgcmV0dXJuIHRydWUgaWYgdGhlIHBhcnNpbmcgc3VjY2VlZHMsIGFuZCBzZXRzIHRoZSBu
ZXh0IGluZGV4CisgICAgLy8gb2YgdGhlIGxhc3QgY29uc3VtZWQgY2hhcmFjdGVyIHRvIGAqZW5k
Jy4gVGhlIGxlYWRpbmcgZXh0cmEgY2hhcmFjdGVycyBjYXVzZQorICAgIC8vIHBhcnNlIGZhaWx1
cmVzLCBhbmQgdGhlIHRyYWlsaW5nIGV4dHJhIGNoYXJhY3RlcnMgZG9uJ3QgY2F1c2UgcGFyc2Ug
ZmFpbHVyZXMuCisKKyAgICAvLyBTZXRzIHllYXIgYW5kIG1vbnRoLgorICAgIGJvb2wgcGFyc2VN
b250aChjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCogZW5kKTsKKyAgICAvLyBTZXRzIHllYXIsIG1vbnRoIGFuZCBtb250aERheS4KKyAg
ICBib29sIHBhcnNlRGF0ZShjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2ln
bmVkIHN0YXJ0LCB1bnNpZ25lZCogZW5kKTsKKyAgICAvLyBTZXRzIHllYXIgYW5kIHdlZWsuCisg
ICAgYm9vbCBwYXJzZVdlZWsoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNp
Z25lZCBzdGFydCwgdW5zaWduZWQqIGVuZCk7CisgICAgLy8gU2V0cyBob3VyLCBtaW51dGUsIHNl
Y29uZCBhbmQgbWlsbGlzZWNvbmQuCisgICAgYm9vbCBwYXJzZVRpbWUoY29uc3QgVUNoYXIqIHNy
YywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQqIGVuZCk7CisgICAg
Ly8gU2V0cyB5ZWFyLCBtb250aCwgbW9udGhEYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kIGFuZCBt
aWxsaXNlY29uZC4KKyAgICBib29sIHBhcnNlRGF0ZVRpbWVMb2NhbChjb25zdCBVQ2hhciogc3Jj
LCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCogZW5kKTsKKyAgICAv
LyBTZXRzIHllYXIsIG1vbnRoLCBtb250aERheSwgaG91ciwgbWludXRlLCBzZWNvbmQgYW5kIG1p
bGxpc2Vjb25kLCBhbmQgYWRqdXN0cyB0aW1lem9uZS4KKyAgICBib29sIHBhcnNlRGF0ZVRpbWUo
Y29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwgdW5zaWdu
ZWQqIGVuZCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1heFdlZWsoKSBjb25zdDsKKyAgICBib29s
IHBhcnNlWWVhcihjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0
YXJ0LCB1bnNpZ25lZCogZW5kKTsKKyAgICBib29sIGFkZERheShpbnQpOworICAgIGJvb2wgYWRk
TWludXRlKGludCk7CisgICAgYm9vbCBwYXJzZVRpbWVab25lKGNvbnN0IFVDaGFyKiBzcmMsIHVu
c2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkKiBlbmQpOworCisgICAgLy8g
bV93ZWVrRGF5IHZhbHVlcworICAgIGVudW0geworICAgICAgICBTVU5EQVkgPSAwLAorICAgICAg
ICBNT05EQVksCisgICAgICAgIFRVRVNEQVksCisgICAgICAgIFdFRE5FU0RBWSwKKyAgICAgICAg
VEhVUlNEQVksCisgICAgICAgIEZSSURBWSwKKyAgICAgICAgU0FUVVJEQVksCisgICAgfTsKKwor
ICAgIGludCBtX21pbGxpc2Vjb25kOyAgLy8gMCAtIDk5OQorICAgIGludCBtX3NlY29uZDsKKyAg
ICBpbnQgbV9taW51dGU7CisgICAgaW50IG1faG91cjsKKyAgICBpbnQgbV9tb250aERheTsgIC8v
IDEgLSAzMQorICAgIGludCBtX21vbnRoOyAgLy8gMDpKYW51YXJ5IC0gMTE6RGVjZW1iZXIKKyAg
ICBpbnQgbV95ZWFyOyAgLy8gIDE1ODIgLQorICAgIGludCBtX3dlZWs7ICAvLyAxIC0gNTMKK307
CisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gSVNPRGF0ZVRpbWVfaAot
LSAKMS42LjMuMwoK
</data>
<flag name="review"
          id="24574"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43055</attachid>
            <date>2009-11-12 03:24:50 -0800</date>
            <delta_ts>2009-11-16 21:15:09 -0800</delta_ts>
            <desc>ISO 8601 class (rev.6)</desc>
            <filename>0001-iso8601-parser-6.patch</filename>
            <type>text/plain</type>
            <size>29055</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">RnJvbSAwNDU3MGFlMzZiYjRiZTk1ZDAyNTMwZWQyOTJkZGI1MmJhOTVmMWI2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBLZW50IFRhbXVyYSA8dGtlbnRAY2hyb21pdW0ub3JnPgpEYXRl
OiBNb24sIDkgTm92IDIwMDkgMTg6MDA6MjcgKzA5MDAKU3ViamVjdDogW1BBVENIXSBpc284NjAx
LXBhcnNlci02CgotLS0KIFdlYkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAg
IHwgICA0NiArKysKIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0gICAgICAgICAgICAgICAgICAgIHwg
ICAgMiArCiBXZWJDb3JlL1dlYkNvcmUuZ3lwaSAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIg
KwogV2ViQ29yZS9XZWJDb3JlLnBybyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyICsKIFdl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2ogICAgIHwgICAgOCArCiBXZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiB8ICAgIDggKwogV2ViQ29yZS9XZWJD
b3JlU291cmNlcy5ia2wgICAgICAgICAgICAgICAgfCAgICAxICsKIFdlYkNvcmUvaHRtbC9JU09E
YXRlVGltZS5jcHAgICAgICAgICAgICAgIHwgIDQzNCArKysrKysrKysrKysrKysrKysrKysrKysr
KysrKwogV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmggICAgICAgICAgICAgICAgfCAgMTIyICsr
KysrKysrCiA5IGZpbGVzIGNoYW5nZWQsIDYyNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygt
KQogY3JlYXRlIG1vZGUgMTAwNjQ0IFdlYkNvcmUvaHRtbC9JU09EYXRlVGltZS5jcHAKIGNyZWF0
ZSBtb2RlIDEwMDY0NCBXZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuaAoKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODJjZWJhMS4uNzAxNDEy
NiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cK
QEAgLTEsMyArMSw0OSBAQAorMjAwOS0wOS0wOCAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
SW50cm9kdWNlIFdlYkNvcmU6OklTT0RhdGVUaW1lIGNsYXNzLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEzNDAKKworICAgICAgICBUaGlzIGNsYXNz
IHJlcHJlc2VudHMgYSB2YWx1ZSBvZiBkYXRlL3RpbWUgdHlwZXMgb2YgdGhlIEhUTUw1IElOUFVU
CisgICAgICAgIGVsZW1lbnQsIGFuZCBoYXMgc29tZSBwYXJzaW5nIG1ldGhvZHMgZm9yIElTTyA4
NjAxLgorCisgICAgICAgIFRoaXMgY2hhbmdlIGhhcyBubyB0ZXN0cyBiZWNhdXNlIHRoZSBjbGFz
cyBpcyBub3QgdXNlZCB5ZXQuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogQWRkIElTT0Rh
dGVUaW1lLmNwcCBhbmQgSVNPRGF0ZVRpbWUuaC4KKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6IGRp
dHRvLgorICAgICAgICAqIFdlYkNvcmUucHJvOiBkaXR0by4KKyAgICAgICAgKiBXZWJDb3JlLnZj
cHJvai9XZWJDb3JlLnZjcHJvajogZGl0dG8uCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qOiBkaXR0by4KKyAgICAgICAgKiBXZWJDb3JlU291cmNlcy5ia2w6IGRp
dHRvLgorICAgICAgICAqIGh0bWwvSVNPRGF0ZVRpbWUuY3BwOiBBZGRlZC4gSW1wbGVtZW50YXRp
b24gb2YgV2ViQ29yZTo6SVNPRGF0ZVRpbWUgY2xhc3MuCisgICAgICAgIChXZWJDb3JlOjppc0xl
YXBZZWFyKToKKyAgICAgICAgKFdlYkNvcmU6Om1heERheU9mTW9udGgpOgorICAgICAgICAoV2Vi
Q29yZTo6ZGF5T2ZXZWVrKToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjptYXhXZWVr
TnVtYmVySW5ZZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OmNvdW50RGlnaXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OnRvSW50KToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjpwYXJzZVll
YXIpOiBQcml2YXRlIGhlbHBlciBmb3IgcGFyc2VEYXRlKCkgYW5kIHBhcnNlV2VlaygpLgorICAg
ICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OmFkZERheSk6IFByaXZhdGUgaGVscGVyIGZvciBw
YXJzZVRpbWVab25lKCkuCisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6YWRkTWludXRl
KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6cGFyc2VUaW1lWm9uZSk6
IFByaXZhdGUgaGVscGVyIGZvciBwYXJzZURhdGVUaW1lKCkuCisgICAgICAgIChXZWJDb3JlOjpJ
U09EYXRlVGltZTo6cGFyc2VNb250aCk6IFBhcnNlciBmb3IgPGlucHV0IHR5cGU9bW9udGg+Lgor
ICAgICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OnBhcnNlRGF0ZSk6IFBhcnNlciBmb3IgPGlu
cHV0IHR5cGU9ZGF0ZT4uCisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6cGFyc2VXZWVr
KTogUGFyc2VyIGZvciA8aW5wdXQgdHlwZT13ZWVrPi4KKyAgICAgICAgKFdlYkNvcmU6OklTT0Rh
dGVUaW1lOjpwYXJzZVRpbWUpOiBQYXJzZXIgZm9yIDxpbnB1dCB0eXBlPXRpbWU+LgorICAgICAg
ICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OnBhcnNlRGF0ZVRpbWVMb2NhbCk6IFBhcnNlciBmb3Ig
PGlucHV0IHR5cGU9ZGF0ZXRpbWUtbG9jYWw+LgorICAgICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRp
bWU6OnBhcnNlRGF0ZVRpbWUpOiBQYXJzZXIgZm9yIDxpbnB1dCB0eXBlPWRhdGV0aW1lPi4KKyAg
ICAgICAgKiBodG1sL0lTT0RhdGVUaW1lLmg6IEFkZGVkLiAgRGVjbGFyZSBXZWJDb3JlOjpJU09E
YXRlVGltZSBjbGFzcy4KKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjpJU09EYXRlVGlt
ZSk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6bWlsbGlzZWNvbmQpOgorICAgICAg
ICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OnNlY29uZCk6CisgICAgICAgIChXZWJDb3JlOjpJU09E
YXRlVGltZTo6bWludXRlKToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjpob3VyKToK
KyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjptb250aERheSk6CisgICAgICAgIChXZWJD
b3JlOjpJU09EYXRlVGltZTo6bW9udGgpOgorICAgICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6
OmZ1bGxZZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjp3ZWVrKToKKwogMjAw
OS0wOS0wMSAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL0dOVW1ha2VmaWxl
LmFtIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQppbmRleCAzYjk5NDE5Li5lZjY0MDBhIDEwMDY0
NAotLS0gYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1dlYkNvcmUvR05VbWFrZWZpbGUu
YW0KQEAgLTExMjYsNiArMTEyNiw4IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29yZS9o
dG1sL0hUTUxVTGlzdEVsZW1lbnQuaCBcCiAJV2ViQ29yZS9odG1sL0hUTUxWaWV3U291cmNlRG9j
dW1lbnQuY3BwIFwKIAlXZWJDb3JlL2h0bWwvSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5oIFwKKwlX
ZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuY3BwIFwKKwlXZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUu
aCBcCiAJV2ViQ29yZS9odG1sL0ltYWdlRGF0YS5jcHAgXAogCVdlYkNvcmUvaHRtbC9JbWFnZURh
dGEuaCBcCiAJV2ViQ29yZS9odG1sL01lZGlhRXJyb3IuaCBcCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L1dlYkNvcmUuZ3lwaSBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IGJkZGNhYzIuLmI0ZDli
YTQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCkBAIC0xNDk5LDYgKzE0OTksOCBAQAogICAgICAgICAgICAgJ2h0bWwvSFRNTFZpZGVv
RWxlbWVudC5oJywKICAgICAgICAgICAgICdodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3Bw
JywKICAgICAgICAgICAgICdodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuaCcsCisgICAgICAg
ICAgICAnaHRtbC9JU09EYXRlVGltZS5jcHAnLAorICAgICAgICAgICAgJ2h0bWwvSVNPRGF0ZVRp
bWUuaCcsCiAgICAgICAgICAgICAnaHRtbC9JbWFnZURhdGEuY3BwJywKICAgICAgICAgICAgICdo
dG1sL0ltYWdlRGF0YS5oJywKICAgICAgICAgICAgICdodG1sL01lZGlhRXJyb3IuaCcsCmRpZmYg
LS1naXQgYS9XZWJDb3JlL1dlYkNvcmUucHJvIGIvV2ViQ29yZS9XZWJDb3JlLnBybwppbmRleCAy
YTY5MzczLi4wY2I0YWZhIDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUucHJvCisrKyBiL1dl
YkNvcmUvV2ViQ29yZS5wcm8KQEAgLTEwNzAsNiArMTA3MCw3IEBAIFNPVVJDRVMgKz0gXAogICAg
IGh0bWwvSFRNTFRva2VuaXplci5jcHAgXAogICAgIGh0bWwvSFRNTFVMaXN0RWxlbWVudC5jcHAg
XAogICAgIGh0bWwvSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5jcHAgXAorICAgIGh0bWwvSVNPRGF0
ZVRpbWUuY3BwIFwKICAgICBodG1sL0ltYWdlRGF0YS5jcHAgXAogICAgIGh0bWwvUHJlbG9hZFNj
YW5uZXIuY3BwIFwKICAgICBodG1sL1ZhbGlkaXR5U3RhdGUuY3BwIFwKQEAgLTE3NTAsNiArMTc1
MSw3IEBAIEhFQURFUlMgKz0gXAogICAgIGh0bWwvSFRNTFVMaXN0RWxlbWVudC5oIFwKICAgICBo
dG1sL0hUTUxWaWRlb0VsZW1lbnQuaCBcCiAgICAgaHRtbC9IVE1MVmlld1NvdXJjZURvY3VtZW50
LmggXAorICAgIGh0bWwvSVNPRGF0ZVRpbWUuaCBcCiAgICAgaHRtbC9JbWFnZURhdGEuaCBcCiAg
ICAgaHRtbC9QcmVsb2FkU2Nhbm5lci5oIFwKICAgICBodG1sL1RpbWVSYW5nZXMuaCBcCmRpZmYg
LS1naXQgYS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qIGIvV2ViQ29yZS9X
ZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagppbmRleCA5MzE1ZTM1Li44Mzc3MTNhIDEwMDY0
NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCisrKyBiL1dlYkNv
cmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKQEAgLTMzNzIzLDYgKzMzNzIzLDE0IEBA
CiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGh0
bWxcSVNPRGF0ZVBhcnNlci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJ
CQkJUmVsYXRpdmVQYXRoPSIuLlxodG1sXElTT0RhdGVQYXJzZXIuaCINCisJCQkJPg0KKwkJCTwv
RmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGh0bWxcSW1hZ2VEYXRhLmNw
cCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCmluZGV4IGEzZWVhYjcuLmM0NGY1ODkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1dlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC00NzM0LDYgKzQ3MzQsOCBAQAogCQlGNUMwNDFFNTBG
RkNBOTZEMDA4MzlENEEgLyogRE9NSFRNTERhdGFMaXN0RWxlbWVudEludGVybmFsLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNUMwNDFFMDBGRkNBOTZE
MDA4MzlENEEgLyogRE9NSFRNTERhdGFMaXN0RWxlbWVudEludGVybmFsLmggKi87IH07CiAJCUY1
QzA0MUU2MEZGQ0E5NkQwMDgzOUQ0QSAvKiBKU0hUTUxEYXRhTGlzdEVsZW1lbnQuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjVDMDQxRTEwRkZDQTk2
RDAwODM5RDRBIC8qIEpTSFRNTERhdGFMaXN0RWxlbWVudC5jcHAgKi87IH07CiAJCUY1QzA0MUU3
MEZGQ0E5NkQwMDgzOUQ0QSAvKiBKU0hUTUxEYXRhTGlzdEVsZW1lbnQuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1QzA0MUUyMEZGQ0E5NkQwMDgzOUQ0
QSAvKiBKU0hUTUxEYXRhTGlzdEVsZW1lbnQuaCAqLzsgfTsKKwkJRjVEM0E1N0MxMDZCODNCMzAw
NTQ1Mjk3IC8qIElTT0RhdGVUaW1lLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEY1RDNBNTdBMTA2QjgzQjMwMDU0NTI5NyAvKiBJU09EYXRlVGltZS5j
cHAgKi87IH07CisJCUY1RDNBNTdEMTA2QjgzQjMwMDU0NTI5NyAvKiBJU09EYXRlVGltZS5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjVEM0E1N0IxMDZC
ODNCMzAwNTQ1Mjk3IC8qIElTT0RhdGVUaW1lLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMg
PSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRjkxNkM0OEQwREI1MTBGODAwNzZDRDgzIC8qIEpTWE1M
SHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEY5MTZDNDhCMERCNTEwRjgwMDc2Q0Q4MyAvKiBKU1hNTEh0dHBS
ZXF1ZXN0UHJvZ3Jlc3NFdmVudC5jcHAgKi87IH07CiAJCUY5MTZDNDhFMERCNTEwRjgwMDc2Q0Q4
MyAvKiBKU1hNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjkxNkM0OEMwREI1MTBGODAwNzZDRDgzIC8qIEpT
WE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50LmggKi87IH07CiAJCUY5RjBFRDdBMERCNTBDQTIw
MEQxNkRCOSAvKiBYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY5RjBFRDc3MERCNTBDQTIwMEQxNkRCOSAv
KiBYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQuaCAqLzsgfTsKQEAgLTk5MzgsNiArOTk0MCw4
IEBACiAJCUY1QzI4NjkzMDI4NDZEQ0QwMTg2MzVDQSAvKiBBcHBsaWNhdGlvblNlcnZpY2VzLmZy
YW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9
IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQXBwbGljYXRpb25TZXJ2aWNlcy5mcmFtZXdvcms7
IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZy
YW1ld29yazsgc291cmNlVHJlZSA9ICI8YWJzb2x1dGU+IjsgfTsKIAkJRjVDMjg2OTQwMjg0NkRD
RDAxODYzNUNBIC8qIENhcmJvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENhcmJvbi5m
cmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9DYXJib24uZnJhbWV3
b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OwogCQlGNUMyODY5NTAyODQ2RENEMDE4
NjM1Q0EgLyogQ29jb2EuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxh
c3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb2NvYS5mcmFtZXdv
cms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcms7IHNv
dXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCUY1RDNBNTdBMTA2QjgzQjMwMDU0NTI5NyAv
KiBJU09EYXRlVGltZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJ
U09EYXRlVGltZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY1RDNBNTdCMTA2
QjgzQjMwMDU0NTI5NyAvKiBJU09EYXRlVGltZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBJU09EYXRlVGltZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGODIx
NjI5OTAyOUY0RkI1MDEwMDAxMzEgLyogSmF2YVNjcmlwdENvcmUuZnJhbWV3b3JrICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdv
cms7IHBhdGggPSBKYXZhU2NyaXB0Q29yZS5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBCVUlMVF9Q
Uk9EVUNUU19ESVI7IH07CiAJCUY5MTZDNDhCMERCNTEwRjgwMDc2Q0Q4MyAvKiBKU1hNTEh0dHBS
ZXF1ZXN0UHJvZ3Jlc3NFdmVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gSlNYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlGOTE2QzQ4QzBEQjUxMEY4MDA3NkNEODMgLyogSlNYTUxIdHRwUmVxdWVz
dFByb2dyZXNzRXZlbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTWE1M
SHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBA
IC0xMjcyNSw2ICsxMjcyOSw4IEBACiAJCQkJRTQ0NjEzOUEwQ0Q2MzMxMDAwRkFEQTc1IC8qIEhU
TUxWaWRlb0VsZW1lbnQuaWRsICovLAogCQkJCUJDQ0Q3NEU0MEE0QzhEREYwMDVGREE2RCAvKiBI
VE1MVmlld1NvdXJjZURvY3VtZW50LmNwcCAqLywKIAkJCQlCQ0NENzREQjBBNEM4RDM1MDA1RkRB
NkQgLyogSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5oICovLAorCQkJCUY1RDNBNTdBMTA2QjgzQjMw
MDU0NTI5NyAvKiBJU09EYXRlVGltZS5jcHAgKi8sCisJCQkJRjVEM0E1N0IxMDZCODNCMzAwNTQ1
Mjk3IC8qIElTT0RhdGVUaW1lLmggKi8sCiAJCQkJQTc3OTc5MTMwRDZCOUQwQzAwMzg1MUI5IC8q
IEltYWdlRGF0YS5jcHAgKi8sCiAJCQkJQTc3OTc5MTQwRDZCOUQwQzAwMzg1MUI5IC8qIEltYWdl
RGF0YS5oICovLAogCQkJCUE3Nzk3OTE1MEQ2QjlEMEMwMDM4NTFCOSAvKiBJbWFnZURhdGEuaWRs
ICovLApAQCAtMTY4ODIsNiArMTY4ODgsNyBAQAogCQkJCUJDQ0Q3NERDMEE0QzhEMzUwMDVGREE2
RCAvKiBIVE1MVmlld1NvdXJjZURvY3VtZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTRDNzY3
MTBDRTkyM0ExMDA3RUYzQ0QgLyogSFRUUEhlYWRlck1hcC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
NTE0Qzc2NzMwQ0U5MjNBMTAwN0VGM0NEIC8qIEhUVFBQYXJzZXJzLmggaW4gSGVhZGVycyAqLywK
KwkJCQlGNUQzQTU3RDEwNkI4M0IzMDA1NDUyOTcgLyogSVNPRGF0ZVRpbWUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUIyNzUzNTZFMEIwNTM4MTQwMDJDRTY0RiAvKiBJY29uLmggaW4gSGVhZGVycyAq
LywKIAkJCQk1MTI2RTZCQzBBMkUzQjEyMDA1QzI5RkEgLyogSWNvbkRhdGFiYXNlLmggaW4gSGVh
ZGVycyAqLywKIAkJCQk1MUUxRUNCRTBDOTFDOTA0MDBEQzI1NUIgLyogSWNvbkRhdGFiYXNlQ2xp
ZW50LmggaW4gSGVhZGVycyAqLywKQEAgLTE5MDI0LDYgKzE5MDMxLDcgQEAKIAkJCQlCQ0NENzRF
NTBBNEM4RERGMDA1RkRBNkQgLyogSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQkwQjhDNTZENDBGMjg2MjdGMDAwNTAyRTEgLyogSFRUUEhlYWRlck1hcC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk1MTRDNzY3MjBDRTkyM0ExMDA3RUYzQ0QgLyogSFRUUFBhcnNl
cnMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRjVEM0E1N0MxMDZCODNCMzAwNTQ1Mjk3IC8qIElT
T0RhdGVUaW1lLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUxMjZFNkJCMEEyRTNCMTIwMDVDMjlG
QSAvKiBJY29uRGF0YWJhc2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDQ1QzhEQjcxMDAxNUZD
OTAwMzE1MzFBIC8qIEljb25EYXRhYmFzZU5vbmUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMUEy
RDc1M0UwREU0N0ZBQjAwRjBBNjQ4IC8qIEljb25GZXRjaGVyLmNwcCBpbiBTb3VyY2VzICovLApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlU291cmNlcy5ia2wgYi9XZWJDb3JlL1dlYkNvcmVT
b3VyY2VzLmJrbAppbmRleCBjNTc5MDg0Li4xYjczZTU2IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dl
YkNvcmVTb3VyY2VzLmJrbAorKysgYi9XZWJDb3JlL1dlYkNvcmVTb3VyY2VzLmJrbApAQCAtNjcy
LDYgKzY3Miw3IEBAIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBmaWxlcyBuZWVkZWQg
dG8gYnVpbGQgV2ViQ29yZS4KICAgICAgICAgaHRtbC9IVE1MVG9rZW5pemVyLmNwcAogICAgICAg
ICBodG1sL0hUTUxVTGlzdEVsZW1lbnQuY3BwCiAgICAgICAgIGh0bWwvSFRNTFZpZXdTb3VyY2VE
b2N1bWVudC5jcHAKKyAgICAgICAgaHRtbC9JU09EYXRlVGltZS5jcHAKICAgICAgICAgaHRtbC9J
bWFnZURhdGEuY3BwCiAgICAgICAgIGh0bWwvUHJlbG9hZFNjYW5uZXIuY3BwCiAgICAgICAgIGh0
bWwvVmFsaWRpdHlTdGF0ZS5jcHAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9JU09EYXRlVGlt
ZS5jcHAgYi9XZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmM0YjQzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2h0bWwv
SVNPRGF0ZVRpbWUuY3BwCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIklTT0RhdGVUaW1lLmgiCisKKyNpbmNsdWRlIDx3dGYvQVNDSUlDVHlwZS5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRoZSBvbGRlc3QgZGF5IG9mIEdyZWdvcmlhbiBDYWxl
bmRhciBpcyAxNTgyLTEwLTE1LiAgV2UgZG9uJ3Qgc3VwcG9ydCBkYXRlcyBvbGRlciB0aGFuIGl0
Lgorc3RhdGljIGNvbnN0IGludCBncmVnb3JpYW5TdGFydFllYXIgPSAxNTgyOworc3RhdGljIGNv
bnN0IGludCBncmVnb3JpYW5TdGFydE1vbnRoID0gOTsgLy8gMC1iYXNlZCBPY3RvYmVyLgorc3Rh
dGljIGNvbnN0IGludCBncmVnb3JpYW5TdGFydERheSA9IDE1OworCitzdGF0aWMgY29uc3QgaW50
IGRheXNJbk1vbnRoWzEyXSA9IHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAz
MSwgMzAsIDMxfTsKKworc3RhdGljIGJvb2wgaXNMZWFwWWVhcihpbnQgeWVhcikKK3sKKyAgICBp
ZiAoeWVhciAlIDQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoISh5ZWFyICUgNDAw
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCEoeWVhciAlIDEwMCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gYG1vbnRoJyBpcyAwLWJh
c2VkLgorc3RhdGljIGludCBtYXhEYXlPZk1vbnRoKGludCB5ZWFyLCBpbnQgbW9udGgpCit7Cisg
ICAgaWYgKG1vbnRoICE9IDEpIC8vIEZlYnJ1YXJ5PworICAgICAgICByZXR1cm4gZGF5c0luTW9u
dGhbbW9udGhdOworICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyODsKK30KKwor
Ly8gYG1vbnRoJyBpcyAwLWJhc2VkLgorc3RhdGljIGludCBkYXlPZldlZWsoaW50IHllYXIsIGlu
dCBtb250aCwgaW50IGRheSkKK3sKKyAgICBpbnQgc2hpZnRlZE1vbnRoID0gbW9udGggKyAyOwor
ICAgIC8vIDI6SmFudWFyeSwgMzpGZWJ1cnVhcnksIDQ6TWFyY2gsIC4uLgorCisgICAgLy8gWmVs
bGVyJ3MgY29uZ3J1ZW5jZQorICAgIGlmIChzaGlmdGVkTW9udGggPD0gMykgeworICAgICAgICBz
aGlmdGVkTW9udGggKz0gMTI7CisgICAgICAgIHllYXItLTsKKyAgICB9CisgICAgLy8gNDpNYXJj
aCwgLi4uLCAxNDpKYW51YXJ5LCAxNTpGZWJydWFyeQorCisgICAgaW50IGhpZ2hZZWFyID0geWVh
ciAvIDEwMDsKKyAgICBpbnQgbG93WWVhciA9IHllYXIgJSAxMDA7CisgICAgLy8gV2UgYWRkIDYg
dG8gbWFrZSB0aGUgcmVzdWx0IFN1bmRheS1vcmlnaW4uCisgICAgaW50IHJlc3VsdCA9IChkYXkg
KyAxMyAqIHNoaWZ0ZWRNb250aCAvIDUgKyBsb3dZZWFyICsgbG93WWVhciAvIDQgKyBoaWdoWWVh
ciAvIDQgKyA1ICogaGlnaFllYXIgKyA2KSAlIDc7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwor
aW50IElTT0RhdGVUaW1lOjptYXhXZWVrTnVtYmVySW5ZZWFyKCkgY29uc3QKK3sKKyAgICBpbnQg
ZGF5ID0gZGF5T2ZXZWVrKG1feWVhciwgMCwgMSk7IC8vIEphbnVhcnkgMS4KKyAgICByZXR1cm4g
ZGF5ID09IFRodXJzZGF5IHx8IChkYXkgPT0gV2VkbmVzZGF5ICYmIGlzTGVhcFllYXIobV95ZWFy
KSkgPyA1MyA6IDUyOworfQorCitzdGF0aWMgdW5zaWduZWQgY291bnREaWdpdHMoY29uc3QgVUNo
YXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCkKK3sKKyAgICB1bnNpZ25l
ZCBpbmRleCA9IHN0YXJ0OworICAgIGZvciAoOyBpbmRleCA8IGxlbmd0aDsgKytpbmRleCkgewor
ICAgICAgICBpZiAoIWlzQVNDSUlEaWdpdChzcmNbaW5kZXhdKSkKKyAgICAgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICByZXR1cm4gaW5kZXggLSBzdGFydDsKK30KKworLy8gVmVyeSBzdHJpY3Qg
aW50ZWdlciBwYXJzZXIuIERvIG5vdCBhbGxvdyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3Bh
Y2VzIHVubGlrZSBjaGFyYWN0ZXJzVG9JbnRTdHJpY3QoKS4KK3N0YXRpYyBib29sIHRvSW50KGNv
bnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgcGFyc2VTdGFydCwgdW5z
aWduZWQgcGFyc2VMZW5ndGgsIGludCYgb3V0KQoreworICAgIGlmIChwYXJzZVN0YXJ0ICsgcGFy
c2VMZW5ndGggPiBsZW5ndGggfHwgcGFyc2VMZW5ndGggPD0gMCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGludCB2YWx1ZSA9IDA7CisgICAgY29uc3QgVUNoYXIqIGN1cnJlbnQgPSBzcmMg
KyBwYXJzZVN0YXJ0OworICAgIGNvbnN0IFVDaGFyKiBlbmQgPSBjdXJyZW50ICsgcGFyc2VMZW5n
dGg7CisKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBuZWdhdGl2ZSBudW1iZXJzIGZv
ciBJU08gODYwMS4KKyAgICBmb3IgKDsgY3VycmVudCA8IGVuZDsgKytjdXJyZW50KSB7CisgICAg
ICAgIGlmICghaXNBU0NJSURpZ2l0KCpjdXJyZW50KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgaW50IGRpZ2l0ID0gKmN1cnJlbnQgLSAnMCc7CisgICAgICAgIGlmICh2YWx1
ZSA+IChJTlRfTUFYIC0gZGlnaXQpIC8gMTApIC8vIENoZWNrIGZvciBvdmVyZmxvdy4KKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgZGlnaXQ7
CisgICAgfQorICAgIG91dCA9IHZhbHVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElT
T0RhdGVUaW1lOjpwYXJzZVllYXIoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1
bnNpZ25lZCBzdGFydCwgdW5zaWduZWQmIGVuZCkKK3sKKyAgICB1bnNpZ25lZCBkaWdpdHNMZW5n
dGggPSBjb3VudERpZ2l0cyhzcmMsIGxlbmd0aCwgc3RhcnQpOworICAgIC8vIE5lZWRzIGF0IGxl
YXN0IDQgZGlnaXRzIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuCisgICAgaWYgKGRpZ2l0c0xl
bmd0aCA8IDQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQgeWVhcjsKKyAgICBpZiAo
IXRvSW50KHNyYywgbGVuZ3RoLCBzdGFydCwgZGlnaXRzTGVuZ3RoLCB5ZWFyKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIC8vIE5vIHN1cHBvcnQgZm9yIHllYXJzIGJlZm9yZSBHcmVnb3Jp
YW4gY2FsZW5kYXIuCisgICAgaWYgKHllYXIgPCBncmVnb3JpYW5TdGFydFllYXIpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBtX3llYXIgPSB5ZWFyOworICAgIGVuZCA9IHN0YXJ0ICsgZGln
aXRzTGVuZ3RoOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElTT0RhdGVUaW1lOjphZGRE
YXkoaW50IGRheURpZmYpCit7CisgICAgQVNTRVJUKG1fbW9udGhEYXkpOworCisgICAgaW50IGRh
eSA9IG1fbW9udGhEYXkgKyBkYXlEaWZmOworICAgIGlmIChkYXkgPiBtYXhEYXlPZk1vbnRoKG1f
eWVhciwgbV9tb250aCkpIHsKKyAgICAgICAgZGF5ID0gbV9tb250aERheTsKKyAgICAgICAgaW50
IHllYXIgPSBtX3llYXI7CisgICAgICAgIGludCBtb250aCA9IG1fbW9udGg7CisgICAgICAgIGlu
dCBtYXhEYXkgPSBtYXhEYXlPZk1vbnRoKHllYXIsIG1vbnRoKTsKKyAgICAgICAgZm9yICg7IGRh
eURpZmYgPiAwOyAtLWRheURpZmYpIHsKKyAgICAgICAgICAgICsrZGF5OworICAgICAgICAgICAg
aWYgKGRheSA+IG1heERheSkgeworICAgICAgICAgICAgICAgIGRheSA9IDE7CisgICAgICAgICAg
ICAgICAgKyttb250aDsKKyAgICAgICAgICAgICAgICBpZiAobW9udGggPj0gMTIpIHsgLy8gbW9u
dGggaXMgMC1vcmlnaW4uCisgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gMDsKKyAgICAgICAg
ICAgICAgICAgICAgKyt5ZWFyOworICAgICAgICAgICAgICAgICAgICBpZiAoeWVhciA8IDApIC8v
IENoZWNrIGZvciBvdmVyZmxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF4RGF5ID0gbWF4RGF5T2ZN
b250aCh5ZWFyLCBtb250aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV95
ZWFyID0geWVhcjsKKyAgICAgICAgbV9tb250aCA9IG1vbnRoOworICAgIH0gZWxzZSBpZiAoZGF5
IDwgMSkgeworICAgICAgICBpbnQgbW9udGggPSBtX21vbnRoOworICAgICAgICBpbnQgeWVhciA9
IG1feWVhcjsKKyAgICAgICAgZGF5ID0gbV9tb250aERheTsKKyAgICAgICAgZm9yICg7IGRheURp
ZmYgPCAwOyArK2RheURpZmYpIHsKKyAgICAgICAgICAgIC0tZGF5OworICAgICAgICAgICAgaWYg
KGRheSA8IDEpIHsKKyAgICAgICAgICAgICAgICAtLW1vbnRoOworICAgICAgICAgICAgICAgIGlm
IChtb250aCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbW9udGggPSAxMTsKKyAgICAgICAg
ICAgICAgICAgICAgLS15ZWFyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBk
YXkgPSBtYXhEYXlPZk1vbnRoKHllYXIsIG1vbnRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmICh5ZWFyIDwgZ3JlZ29yaWFuU3RhcnRZZWFyCisgICAgICAgICAgICAgICAgICAgIHx8
IHllYXIgPT0gZ3JlZ29yaWFuU3RhcnRZZWFyICYmIG1vbnRoIDwgZ3JlZ29yaWFuU3RhcnRNb250
aAorICAgICAgICAgICAgICAgICAgICB8fCB5ZWFyID09IGdyZWdvcmlhblN0YXJ0WWVhciAmJiBt
b250aCA9PSBncmVnb3JpYW5TdGFydE1vbnRoICYmIGRheSA8IGdyZWdvcmlhblN0YXJ0RGF5KQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtX3llYXIg
PSB5ZWFyOworICAgICAgICBtX21vbnRoID0gbW9udGg7CisgICAgfQorICAgIG1fbW9udGhEYXkg
PSBkYXk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSVNPRGF0ZVRpbWU6OmFkZE1pbnV0
ZShpbnQgbWludXRlKQoreworICAgIGludCBjYXJyeTsKKyAgICAvLyBtaW4gY2FuIGJlIG5lZ2F0
aXZlIG9yIGdyZWF0ZXIgdGhhbiA1OS4KKyAgICBtaW51dGUgKz0gbV9taW51dGU7CisgICAgaWYg
KG1pbnV0ZSA+IDU5KSB7CisgICAgICAgIGNhcnJ5ID0gbWludXRlIC8gNjA7CisgICAgICAgIG1p
bnV0ZSA9IG1pbnV0ZSAlIDYwOworICAgIH0gZWxzZSBpZiAobV9taW51dGUgPCAwKSB7CisgICAg
ICAgIGNhcnJ5ID0gKDU5IC0gbV9taW51dGUpIC8gNjA7CisgICAgICAgIG1pbnV0ZSArPSBjYXJy
eSAqIDYwOworICAgICAgICBjYXJyeSA9IC1jYXJyeTsKKyAgICAgICAgQVNTRVJUKG1pbnV0ZSA+
PSAwICYmIG1pbnV0ZSA8PSA1OSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9taW51dGUgPSBt
aW51dGU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGludCBob3VyID0gbV9o
b3VyICsgY2Fycnk7CisgICAgaWYgKGhvdXIgPiAyMykgeworICAgICAgICBjYXJyeSA9IGhvdXIg
LyAyNDsKKyAgICAgICAgaG91ciA9IGhvdXIgJSAyNDsKKyAgICB9IGVsc2UgaWYgKGhvdXIgPCAw
KSB7CisgICAgICAgIGNhcnJ5ID0gKDIzIC0gaG91cikgLyAyNDsKKyAgICAgICAgaG91ciArPSBj
YXJyeSAqIDI0OworICAgICAgICBjYXJyeSA9IC1jYXJyeTsKKyAgICAgICAgQVNTRVJUKGhvdXIg
Pj0gMCAmJiBob3VyIDw9IDIzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX21pbnV0ZSA9IG1p
bnV0ZTsKKyAgICAgICAgbV9ob3VyID0gaG91cjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorICAgIGlmICghYWRkRGF5KGNhcnJ5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1f
bWludXRlID0gbWludXRlOworICAgIG1faG91ciA9IGhvdXI7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKKy8vIFBhcnNlcyBhIHRpbWV6b25lIHBhcnQsIGFuZCBhZGp1c3QgeWVhciwgbW9udGgsIG1v
bnRoRGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQuCitib29sIElTT0RhdGVU
aW1lOjpwYXJzZVRpbWVab25lKGNvbnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5z
aWduZWQgc3RhcnQsIHVuc2lnbmVkJiBlbmQpCit7CisgICAgaWYgKHN0YXJ0ID49IGxlbmd0aCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHVuc2lnbmVkIGluZGV4ID0gc3RhcnQ7CisgICAg
aWYgKHNyY1tpbmRleF0gPT0gJ1onKSB7CisgICAgICAgIGVuZCA9IGluZGV4ICsgMTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBtaW51czsKKyAgICBpZiAoc3JjW2lu
ZGV4XSA9PSAnKycpCisgICAgICAgIG1pbnVzID0gZmFsc2U7CisgICAgZWxzZSBpZiAoc3JjW2lu
ZGV4XSA9PSAnLScpCisgICAgICAgIG1pbnVzID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICArK2luZGV4OworCisgICAgaW50IGhvdXI7CisgICAgaW50IG1pbnV0
ZTsKKyAgICBpZiAoIXRvSW50KHNyYywgbGVuZ3RoLCBpbmRleCwgMiwgaG91cikgfHwgaG91ciA8
IDAgfHwgaG91ciA+IDIzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaW5kZXggKz0gMjsK
KworICAgIGlmIChpbmRleCA+PSBsZW5ndGggfHwgc3JjW2luZGV4XSAhPSAnOicpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICArK2luZGV4OworCisgICAgaWYgKCF0b0ludChzcmMsIGxlbmd0
aCwgaW5kZXgsIDIsIG1pbnV0ZSkgfHwgbWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGluZGV4ICs9IDI7CisKKyAgICBpZiAobWludXMpIHsKKyAg
ICAgICAgaG91ciA9IC1ob3VyOworICAgICAgICBtaW51dGUgPSAtbWludXRlOworICAgIH0KKwor
ICAgIC8vIFN1YnRyYWN0IHRoZSB0aW1lem9uZSBvZmZzZXQuCisgICAgaWYgKCFhZGRNaW51dGUo
LShob3VyICogNjAgKyBtaW51dGUpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVuZCA9
IGluZGV4OworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElTT0RhdGVUaW1lOjpwYXJzZU1v
bnRoKGNvbnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgc3RhcnQsIHVu
c2lnbmVkJiBlbmQpCit7CisgICAgQVNTRVJUKHNyYyk7CisgICAgdW5zaWduZWQgaW5kZXg7Cisg
ICAgaWYgKCFwYXJzZVllYXIoc3JjLCBsZW5ndGgsIHN0YXJ0LCBpbmRleCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoaW5kZXggPj0gbGVuZ3RoIHx8IHNyY1tpbmRleF0gIT0gJy0n
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgKytpbmRleDsKKworICAgIGludCBtb250aDsK
KyAgICBpZiAoIXRvSW50KHNyYywgbGVuZ3RoLCBpbmRleCwgMiwgbW9udGgpIHx8IG1vbnRoIDwg
MSB8fCBtb250aCA+IDEyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLS1tb250aDsKKyAg
ICAvLyBObyBzdXBwb3J0IGZvciBtb250aHMgYmVmb3JlIEdyZWdvcmlhbiBjYWxlbmRhci4KKyAg
ICBpZiAobV95ZWFyID09IGdyZWdvcmlhblN0YXJ0WWVhciAmJiBtb250aCA8IGdyZWdvcmlhblN0
YXJ0TW9udGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBtX21vbnRoID0gbW9udGg7Cisg
ICAgZW5kID0gaW5kZXggKyAyOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElTT0RhdGVU
aW1lOjpwYXJzZURhdGUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25l
ZCBzdGFydCwgdW5zaWduZWQmIGVuZCkKK3sKKyAgICBBU1NFUlQoc3JjKTsKKyAgICB1bnNpZ25l
ZCBpbmRleDsKKyAgICBpZiAoIXBhcnNlTW9udGgoc3JjLCBsZW5ndGgsIHN0YXJ0LCBpbmRleCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyAnLScgYW5kIDItZGlnaXRzIGFyZSBuZWVk
ZWQuCisgICAgaWYgKGluZGV4ICsgMiA+PSBsZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAoc3JjW2luZGV4XSAhPSAnLScpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAr
K2luZGV4OworCisgICAgaW50IGRheTsKKyAgICBpZiAoIXRvSW50KHNyYywgbGVuZ3RoLCBpbmRl
eCwgMiwgZGF5KSB8fCBkYXkgPCAxIHx8IGRheSA+IG1heERheU9mTW9udGgobV95ZWFyLCBtX21v
bnRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIE5vIHN1cHBvcnQgZm9yIGRhdGVz
IGJlZm9yZSBHcmVnb3JpYW4gY2FsZW5kYXIuCisgICAgaWYgKG1feWVhciA9PSBncmVnb3JpYW5T
dGFydFllYXIgJiYgbV9tb250aCA9PSBncmVnb3JpYW5TdGFydE1vbnRoICYmIGRheSA8IGdyZWdv
cmlhblN0YXJ0RGF5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9tb250aERheSA9IGRh
eTsKKyAgICBlbmQgPSBpbmRleCArIDI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSVNP
RGF0ZVRpbWU6OnBhcnNlV2Vlayhjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVu
c2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCYgZW5kKQoreworICAgIEFTU0VSVChzcmMpOworICAgIHVu
c2lnbmVkIGluZGV4OworICAgIGlmICghcGFyc2VZZWFyKHNyYywgbGVuZ3RoLCBzdGFydCwgaW5k
ZXgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyA0IGNoYXJhY3RlcnMgKCctJyAn
VycgZGlnaXQgZGlnaXQpIGFyZSBuZWVkZWQuCisgICAgaWYgKGluZGV4ICsgMyA+PSBsZW5ndGgp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3JjW2luZGV4XSAhPSAnLScpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICArK2luZGV4OworICAgIGlmIChzcmNbaW5kZXhdICE9ICdX
JykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICsraW5kZXg7CisKKyAgICBpbnQgd2VlazsK
KyAgICBpZiAoIXRvSW50KHNyYywgbGVuZ3RoLCBpbmRleCwgMiwgd2VlaykgfHwgd2VlayA8IDEg
fHwgd2VlayA+IG1heFdlZWtOdW1iZXJJblllYXIoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIC8vIE5vIHN1cHBvcnQgZm9yIHllYXJzIG9sZGVyIHRoYW4gb3IgZXF1YWxzIHRvIEdyZWdv
cmlhbiBjYWxlbmRhciBzdGFydCB5ZWFyLgorICAgIGlmIChtX3llYXIgPD0gZ3JlZ29yaWFuU3Rh
cnRZZWFyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV93ZWVrID0gd2VlazsKKyAgICBl
bmQgPSBpbmRleCArIDI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSVNPRGF0ZVRpbWU6
OnBhcnNlVGltZShjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0
YXJ0LCB1bnNpZ25lZCYgZW5kKQoreworICAgIEFTU0VSVChzcmMpOworICAgIGludCBob3VyOwor
ICAgIGlmICghdG9JbnQoc3JjLCBsZW5ndGgsIHN0YXJ0LCAyLCBob3VyKSB8fCBob3VyIDwgMCB8
fCBob3VyID4gMjMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB1bnNpZ25lZCBpbmRleCA9
IHN0YXJ0ICsgMjsKKyAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKHNyY1tpbmRleF0gIT0gJzonKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgKytpbmRleDsKKworICAgIGludCBtaW51dGU7CisgICAgaWYgKCF0b0ludChzcmMsIGxlbmd0
aCwgaW5kZXgsIDIsIG1pbnV0ZSkgfHwgbWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGluZGV4ICs9IDI7CisKKyAgICBpbnQgc2Vjb25kID0gMDsK
KyAgICBpbnQgbWlsbGlzZWNvbmQgPSAwOworICAgIC8vIE9wdGlvbmFsIHNlY29uZCBwYXJ0Lgor
ICAgIC8vIERvIG5vdCByZXR1cm4gd2l0aCBmYWxzZSBiZWNhdXNlIHRoZSBwYXJ0IGlzIG9wdGlv
bmFsLgorICAgIGlmIChpbmRleCArIDIgPCBsZW5ndGggJiYgc3JjW2luZGV4XSA9PSAnOicpIHsK
KyAgICAgICAgaWYgKHRvSW50KHNyYywgbGVuZ3RoLCBpbmRleCArIDEsIDIsIHNlY29uZCkgJiYg
c2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5KSB7CisgICAgICAgICAgICBpbmRleCArPSAzOwor
CisgICAgICAgICAgICAvLyBPcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZCBwYXJ0LgorICAgICAg
ICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIHNyY1tpbmRleF0gPT0gJy4nKSB7CisgICAgICAg
ICAgICAgICAgdW5zaWduZWQgZGlnaXRzTGVuZ3RoID0gY291bnREaWdpdHMoc3JjLCBsZW5ndGgs
IGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0xlbmd0aCA+ICAwKSB7Cisg
ICAgICAgICAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgb2s7
CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNMZW5ndGggPT0gMSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgb2sgPSB0b0ludChzcmMsIGxlbmd0aCwgaW5kZXgsIDEsIG1pbGxpc2Vj
b25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kICo9IDEwMDsKKyAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNMZW5ndGggPT0gMikgeworICAgICAgICAg
ICAgICAgICAgICAgICAgb2sgPSB0b0ludChzcmMsIGxlbmd0aCwgaW5kZXgsIDIsIG1pbGxpc2Vj
b25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kICo9IDEwOworICAgICAg
ICAgICAgICAgICAgICB9IGVsc2UgLy8gZGlnaXRzTGVuZ3RoID49IDMKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG9rID0gdG9JbnQoc3JjLCBsZW5ndGgsIGluZGV4LCAzLCBtaWxsaXNlY29uZCk7
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChvayk7CisgICAgICAgICAgICAgICAgICAgIGlu
ZGV4ICs9IGRpZ2l0c0xlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisgICAgbV9ob3VyID0gaG91cjsKKyAgICBtX21pbnV0ZSA9IG1pbnV0
ZTsKKyAgICBtX3NlY29uZCA9IHNlY29uZDsKKyAgICBtX21pbGxpc2Vjb25kID0gbWlsbGlzZWNv
bmQ7CisgICAgZW5kID0gaW5kZXg7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSVNPRGF0
ZVRpbWU6OnBhcnNlRGF0ZVRpbWVMb2NhbChjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5n
dGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCYgZW5kKQoreworICAgIEFTU0VSVChzcmMpOwor
ICAgIHVuc2lnbmVkIGluZGV4OworICAgIGlmICghcGFyc2VEYXRlKHNyYywgbGVuZ3RoLCBzdGFy
dCwgaW5kZXgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGluZGV4ID49IGxlbmd0
aCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzcmNbaW5kZXhdICE9ICdUJykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICsraW5kZXg7CisgICAgcmV0dXJuIHBhcnNlVGltZShz
cmMsIGxlbmd0aCwgaW5kZXgsIGVuZCk7Cit9CisKK2Jvb2wgSVNPRGF0ZVRpbWU6OnBhcnNlRGF0
ZVRpbWUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwg
dW5zaWduZWQmIGVuZCkKK3sKKyAgICBBU1NFUlQoc3JjKTsKKyAgICB1bnNpZ25lZCBpbmRleDsK
KyAgICBpZiAoIXBhcnNlRGF0ZShzcmMsIGxlbmd0aCwgc3RhcnQsIGluZGV4KSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmIChpbmRleCA+PSBsZW5ndGgpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3JjW2luZGV4XSAhPSAnVCcpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICArK2luZGV4OworICAgIGlmICghcGFyc2VUaW1lKHNyYywgbGVuZ3RoLCBpbmRleCwgaW5k
ZXgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHBhcnNlVGltZVpvbmUoc3Jj
LCBsZW5ndGgsIGluZGV4LCBlbmQpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9XZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuaCBiL1dlYkNvcmUvaHRtbC9JU09EYXRl
VGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNGNmYjkKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuaApAQCAtMCwwICsxLDEyMiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgSVNPRGF0ZVRpbWVfaAorI2RlZmluZSBJU09EYXRlVGltZV9oCisKKyNpbmNsdWRl
IDx3dGYvdW5pY29kZS9Vbmljb2RlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQW4g
SVNPRGF0ZVRpbWUgaW5zdGFuY2UgcmVwcmVzZW50cyBvbmUgb2YgdGhlIGZvbGxvd2luZyBkYXRl
IGFuZCB0aW1lIGNvbWJpbmF0aW9uczoKKy8vICogeWVhci1tb250aAorLy8gKiB5ZWFyLW1vbnRo
LWRheQorLy8gKiB5ZWFyLXdlZWsKKy8vICogaG91ci1taW51dGUtc2Vjb25kLW1pbGxpc2Vjb25k
CisvLyAqIHllYXItbW9udGgtZGF5IGhvdXItbWludXRlLXNlY29uZC1taWxsaXNlY29uZAorY2xh
c3MgSVNPRGF0ZVRpbWUgeworcHVibGljOgorICAgIElTT0RhdGVUaW1lKCkKKyAgICAgICAgOiBt
X21pbGxpc2Vjb25kKDApCisgICAgICAgICwgbV9zZWNvbmQoMCkKKyAgICAgICAgLCBtX21pbnV0
ZSgwKQorICAgICAgICAsIG1faG91cigwKQorICAgICAgICAsIG1fbW9udGhEYXkoMCkKKyAgICAg
ICAgLCBtX21vbnRoKDApCisgICAgICAgICwgbV95ZWFyKDApCisgICAgICAgICwgbV93ZWVrKDAp
CisgICAgeworICAgIH0KKworICAgIGludCBtaWxsaXNlY29uZCgpIGNvbnN0IHsgcmV0dXJuIG1f
bWlsbGlzZWNvbmQ7IH0KKyAgICBpbnQgc2Vjb25kKCkgY29uc3QgeyByZXR1cm4gbV9zZWNvbmQ7
IH0KKyAgICBpbnQgbWludXRlKCkgY29uc3QgeyByZXR1cm4gbV9taW51dGU7IH0KKyAgICBpbnQg
aG91cigpIGNvbnN0IHsgcmV0dXJuIG1faG91cjsgfQorICAgIGludCBtb250aERheSgpIGNvbnN0
IHsgcmV0dXJuIG1fbW9udGhEYXk7IH0KKyAgICBpbnQgbW9udGgoKSBjb25zdCB7IHJldHVybiBt
X21vbnRoOyB9CisgICAgaW50IGZ1bGxZZWFyKCkgY29uc3QgeyByZXR1cm4gbV95ZWFyOyB9Cisg
ICAgaW50IHdlZWsoKSBjb25zdCB7IHJldHVybiBtX3dlZWs7IH0KKworICAgIC8vIFRoZSBmb2xs
b3dpbmcgc2l4IGZ1bmN0aW9ucyBwYXJzZSB0aGUgaW5wdXQgYHNyYycgd2hvc2UgbGVuZ3RoIGlz
CisgICAgLy8gYGxlbmd0aCcsIGFuZCB1cGRhdGVzIHNvbWUgZmllbGRzIG9mIHRoaXMgaW5zdGFu
Y2UuIFRoZSBwYXJzaW5nIHN0YXJ0cyBhdAorICAgIC8vIHNyY1tzdGFydF0gYW5kIGV4YW1pbmVz
IGNoYXJhY3RlcnMgYmVmb3JlIHNyY1tsZW5ndGhdLgorICAgIC8vIGBzcmMnIGBkYXRlJyBtdXN0
IGJlIG5vbi1udWxsLiBUaGUgYHNyYycgc3RyaW5nIGRvZXNuJ3QgbmVlZCB0byBiZQorICAgIC8v
IG51bGwtdGVybWluYXRlZC4KKyAgICAvLyBUaGUgZnVuY3Rpb25zIHJldHVybiB0cnVlIGlmIHRo
ZSBwYXJzaW5nIHN1Y2NlZWRzLCBhbmQgc2V0IGBlbmQnIHRvIHRoZQorICAgIC8vIG5leHQgaW5k
ZXggYWZ0ZXIgdGhlIGxhc3QgY29uc3VtZWQuIEV4dHJhIGxlYWRpbmcgY2hhcmFjdGVycyBjYXVz
ZSBwYXJzZQorICAgIC8vIGZhaWx1cmVzLCBhbmQgdGhlIHRyYWlsaW5nIGV4dHJhIGNoYXJhY3Rl
cnMgZG9uJ3QgY2F1c2UgcGFyc2UgZmFpbHVyZXMuCisKKyAgICAvLyBTZXRzIHllYXIgYW5kIG1v
bnRoLgorICAgIGJvb2wgcGFyc2VNb250aChjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5n
dGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCYgZW5kKTsKKyAgICAvLyBTZXRzIHllYXIsIG1v
bnRoIGFuZCBtb250aERheS4KKyAgICBib29sIHBhcnNlRGF0ZShjb25zdCBVQ2hhciogc3JjLCB1
bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCYgZW5kKTsKKyAgICAvLyBT
ZXRzIHllYXIgYW5kIHdlZWsuCisgICAgYm9vbCBwYXJzZVdlZWsoY29uc3QgVUNoYXIqIHNyYywg
dW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQmIGVuZCk7CisgICAgLy8g
U2V0cyBob3VyLCBtaW51dGUsIHNlY29uZCBhbmQgbWlsbGlzZWNvbmQuCisgICAgYm9vbCBwYXJz
ZVRpbWUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdGFydCwg
dW5zaWduZWQmIGVuZCk7CisgICAgLy8gU2V0cyB5ZWFyLCBtb250aCwgbW9udGhEYXksIGhvdXIs
IG1pbnV0ZSwgc2Vjb25kIGFuZCBtaWxsaXNlY29uZC4KKyAgICBib29sIHBhcnNlRGF0ZVRpbWVM
b2NhbChjb25zdCBVQ2hhciogc3JjLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCYgZW5kKTsKKyAgICAvLyBTZXRzIHllYXIsIG1vbnRoLCBtb250aERheSwgaG91ciwg
bWludXRlLCBzZWNvbmQgYW5kIG1pbGxpc2Vjb25kLCBhbmQgYWRqdXN0cyB0aW1lem9uZS4KKyAg
ICBib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1
bnNpZ25lZCBzdGFydCwgdW5zaWduZWQmIGVuZCk7CisKK3ByaXZhdGU6CisgICAgLy8gUmV0dXJu
cyB0aGUgbWF4aW11bSB3ZWVrIG51bWJlciBpbiB0aGlzIElTT0RhdGVUaW1lJ3MgeWVhci4KKyAg
ICAvLyBUaGUgcmVzdWx0IGlzIGVpdGhlciBvZiA1MiBhbmQgNTMuCisgICAgaW50IG1heFdlZWtO
dW1iZXJJblllYXIoKSBjb25zdDsKKyAgICBib29sIHBhcnNlWWVhcihjb25zdCBVQ2hhciogc3Jj
LCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCYgZW5kKTsKKyAgICBi
b29sIGFkZERheShpbnQpOworICAgIGJvb2wgYWRkTWludXRlKGludCk7CisgICAgYm9vbCBwYXJz
ZVRpbWVab25lKGNvbnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgc3Rh
cnQsIHVuc2lnbmVkJiBlbmQpOworCisgICAgLy8gbV93ZWVrRGF5IHZhbHVlcworICAgIGVudW0g
eworICAgICAgICBTdW5kYXkgPSAwLAorICAgICAgICBNb25kYXksCisgICAgICAgIFR1ZXNkYXks
CisgICAgICAgIFdlZG5lc2RheSwKKyAgICAgICAgVGh1cnNkYXksCisgICAgICAgIEZyaWRheSwK
KyAgICAgICAgU2F0dXJkYXksCisgICAgfTsKKworICAgIGludCBtX21pbGxpc2Vjb25kOyAgLy8g
MCAtIDk5OQorICAgIGludCBtX3NlY29uZDsKKyAgICBpbnQgbV9taW51dGU7CisgICAgaW50IG1f
aG91cjsKKyAgICBpbnQgbV9tb250aERheTsgIC8vIDEgLSAzMQorICAgIGludCBtX21vbnRoOyAg
Ly8gMDpKYW51YXJ5IC0gMTE6RGVjZW1iZXIKKyAgICBpbnQgbV95ZWFyOyAgLy8gIDE1ODIgLQor
ICAgIGludCBtX3dlZWs7ICAvLyAxIC0gNTMKK307CisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gSVNPRGF0ZVRpbWVfaAotLSAKMS42LjMuMwoK
</data>

          </attachment>
      

    </bug>

</bugzilla>