<?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>49009</bug_id>
          
          <creation_ts>2010-11-04 10:45:29 -0700</creation_ts>
          <short_desc>Lots of time spent in MediaPlayerPrivate::currentTime() when playing multiple videos.</short_desc>
          <delta_ts>2010-11-11 11:01:53 -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>Media</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Carlson">eric.carlson</reporter>
          <assigned_to name="Eric Carlson">eric.carlson</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>jer.noble</cc>
    
    <cc>koivisto</cc>
    
    <cc>pnormand</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>304745</commentid>
    <comment_count>0</comment_count>
      <attachid>72961</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-04 10:45:29 -0700</bug_when>
    <thetext>Created attachment 72961
Test case

When the attached test case is loaded and the CPU is sampled, we see that a lot of time is being spent in MediaPlayerPrivate::currentTime(). The following three second sample is of Safari 5 on 10.6.4:

858 SafariMain
 858 NSApplicationMain
  858 -[NSApplication run]
   858 -[BrowserApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
    858 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
     858 _DPSNextEvent
      858 BlockUntilNextEventMatchingListInMode
       858 ReceiveNextEventCommon
        858 RunCurrentEventLoopInMode
         858 CFRunLoopRunSpecific
          858 __CFRunLoopRun
           650 WebCore::timerFired(__CFRunLoopTimer*, void*)
            607 WebCore::ThreadTimers::sharedTimerFiredInternal()
             421 WebCore::HTMLMediaElement::scheduleTimeupdateEvent(bool)
              421 WebCore::MediaPlayerPrivate::currentTime() const
               421 -[QTMovie currentTime]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304838</commentid>
    <comment_count>1</comment_count>
      <attachid>72977</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-04 13:40:54 -0700</bug_when>
    <thetext>Created attachment 72977
Proposed patch

Changes for HTMLMediaElement and OS X media engine. I will file bugs for the other media engines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304847</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-04 13:51:03 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; Created an attachment (id=72977) [details]
&gt; Proposed patch
&gt; 
&gt; Changes for HTMLMediaElement and OS X media engine. I will file bugs for the other media engines.

With these changes, a three second sample of Safari with TOT WebKit show either one or no calls to MediaPlayerPrivate::currentTime because it is only called once every five seconds.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304883</commentid>
    <comment_count>3</comment_count>
      <attachid>72977</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-11-04 14:37:31 -0700</bug_when>
    <thetext>Comment on attachment 72977
Proposed patch

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

&gt; WebCore/html/HTMLMediaElement.cpp:108
&gt; +#ifndef LOG_CACHED_TIME_WARNINGS
&gt; +// Default to not logging warnings about excessive drift in the cached media time because it adds a
&gt; +// fair amount of overhead and logging.
&gt; +#define LOG_CACHED_TIME_WARNINGS 0
&gt; +#endif

Do you think this logging will be actually useful in the future? Code that is not enabled by default tends to stop compiling eventually...

&gt; WebCore/html/HTMLMediaElement.cpp:144
&gt; +    , m_cachedTime(-1)

You could have a constant for the invalid cached time. Testing for cache validity might read better then.

&gt; WebCore/html/HTMLMediaElement.cpp:146
&gt; +    , m_minimumWallClockTimeToCacheMovieTime(0)

&quot;Movie&quot; here is a QT term. I think the generic WebKit code has tried to avoid it.

This comment applies to a bunch of other names in this patch too.

&gt; WebCore/html/HTMLMediaElement.cpp:1219
&gt; +void HTMLMediaElement::refreshCachedTime()
&gt; +{
&gt; +    LOG(Media, &quot;HTMLMediaElement::refreshCachedTime&quot;);
&gt; +
&gt; +    m_cachedTimeWallClockUpdateTime = WTF::currentTime();
&gt; +    m_cachedTime = m_player-&gt;currentTime();
&gt; +}

Why is refreshCachedTime() needed at all? Couldn&apos;t you just invalidate where you now do refresh and then let currentTime() refresh as needed?

&gt; WebCore/html/HTMLMediaElement.cpp:1229
&gt; +    // Don&apos;t try to cache movie time when playback first starts as the time reported by the engine
&gt; +    // sometimes fluctuates for a short amount of time, so the cached time will be off if we take it
&gt; +    // too early.
&gt; +    static float minimumTimePlayingBeforeCacheSnapshot = 0.5;
&gt; +

static const float

&gt; WebCore/html/HTMLMediaElement.cpp:1235
&gt; -float HTMLMediaElement::currentTime() const
&gt; +float HTMLMediaElement::currentTime()

You could make the cache variables mutable and keep the const.

&gt; WebCore/html/HTMLMediaElement.cpp:1245
&gt; +#if !LOG_CACHED_TIME_WARNINGS
&gt; +    static const double minCachedDeltaForWarning = 0.01;
&gt; +#endif
&gt; +
&gt;      if (!m_player)
&gt;          return 0;
&gt; -    if (m_seeking)
&gt; +
&gt; +    if (m_seeking) {
&gt; +        LOG(Media, &quot;HTMLMediaElement::currentTime - seeking, returning %f&quot;, m_lastSeekTime);

Could this too generate tons of logging? Should this be behind #if too?

&gt; WebCore/html/HTMLMediaElement.cpp:1363
&gt; -bool HTMLMediaElement::ended() const
&gt; +bool HTMLMediaElement::ended()

You could make the cache variables mutable and keep the const.

&gt; WebCore/html/HTMLMediaElement.cpp:1644
&gt; -bool HTMLMediaElement::canPlay() const
&gt; +bool HTMLMediaElement::canPlay()

You could make the cache variables mutable and keep the const.

&gt; WebCore/html/HTMLMediaElement.h:360
&gt; +    float m_cachedTime;
&gt; +    double m_cachedTimeWallClockUpdateTime;
&gt; +    double m_minimumWallClockTimeToCacheMovieTime;

I think you should make the cache fields mutable and keep the const in currentTime(), ended() etc.

&gt; WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h:178
&gt; +    virtual double maximumDurationToCacheMovieTime() const { return 5; }

Isn&apos;t 5 seconds pretty aggressive? Would a smaller value increase the cpu usage substantially?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304899</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-04 15:03:13 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 72977 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=72977&amp;action=review
&gt; 
&gt; &gt; WebCore/html/HTMLMediaElement.cpp:108
&gt; &gt; +#ifndef LOG_CACHED_TIME_WARNINGS
&gt; &gt; +// Default to not logging warnings about excessive drift in the cached media time because it adds a
&gt; &gt; +// fair amount of overhead and logging.
&gt; &gt; +#define LOG_CACHED_TIME_WARNINGS 0
&gt; &gt; +#endif
&gt; 
&gt; Do you think this logging will be actually useful in the future? Code that is not enabled by default tends to stop compiling eventually...
&gt; 
Yes, it is required for the other media engines to figure out a safe maximum cache time.
 

&gt; &gt; WebCore/html/HTMLMediaElement.cpp:144
&gt; &gt; +    , m_cachedTime(-1)
&gt; 
&gt; You could have a constant for the invalid cached time. Testing for cache validity might read better then.
&gt; 
OK.

&gt; &gt; WebCore/html/HTMLMediaElement.cpp:146
&gt; &gt; +    , m_minimumWallClockTimeToCacheMovieTime(0)
&gt; 
&gt; &quot;Movie&quot; here is a QT term. I think the generic WebKit code has tried to avoid it.
&gt; 
&gt; This comment applies to a bunch of other names in this patch too.
&gt; 
I disagree that &quot;movie&quot; is QuickTime specific term, but what would you suggest instead? &quot;video&quot; is incorrect because not all files have video media. &quot;media file&quot; is incorrect because an jpeg is a media file too. &quot;linear media file&quot; is technically correct, but who would understand what that means?


&gt; &gt; WebCore/html/HTMLMediaElement.cpp:1219
&gt; &gt; +void HTMLMediaElement::refreshCachedTime()
&gt; &gt; +{
&gt; &gt; +    LOG(Media, &quot;HTMLMediaElement::refreshCachedTime&quot;);
&gt; &gt; +
&gt; &gt; +    m_cachedTimeWallClockUpdateTime = WTF::currentTime();
&gt; &gt; +    m_cachedTime = m_player-&gt;currentTime();
&gt; &gt; +}
&gt; 
&gt; Why is refreshCachedTime() needed at all? Couldn&apos;t you just invalidate where you now do refresh and then let currentTime() refresh as needed?
&gt; 
It is useful because invalidateCachedTime() also sets m_minimumWallClockTimeToCacheMovieTime, which prevents the cached time from being used for a half second, but there are times when we know that necessary to update the cached time but it is NOT necessary to keep it cached.

&gt; &gt; WebCore/html/HTMLMediaElement.cpp:1229
&gt; &gt; +    // Don&apos;t try to cache movie time when playback first starts as the time reported by the engine
&gt; &gt; +    // sometimes fluctuates for a short amount of time, so the cached time will be off if we take it
&gt; &gt; +    // too early.
&gt; &gt; +    static float minimumTimePlayingBeforeCacheSnapshot = 0.5;
&gt; &gt; +
&gt; 
&gt; static const float
&gt; 
Oops!

&gt; 
&gt; &gt; WebCore/html/HTMLMediaElement.cpp:1245
&gt; &gt; +#if !LOG_CACHED_TIME_WARNINGS
&gt; &gt; +    static const double minCachedDeltaForWarning = 0.01;
&gt; &gt; +#endif
&gt; &gt; +
&gt; &gt;      if (!m_player)
&gt; &gt;          return 0;
&gt; &gt; -    if (m_seeking)
&gt; &gt; +
&gt; &gt; +    if (m_seeking) {
&gt; &gt; +        LOG(Media, &quot;HTMLMediaElement::currentTime - seeking, returning %f&quot;, m_lastSeekTime);
&gt; 
&gt; Could this too generate tons of logging? Should this be behind #if too?
&gt; 
No, this will rarely be true.


&gt; &gt; WebCore/html/HTMLMediaElement.h:360
&gt; &gt; +    float m_cachedTime;
&gt; &gt; +    double m_cachedTimeWallClockUpdateTime;
&gt; &gt; +    double m_minimumWallClockTimeToCacheMovieTime;
&gt; 
&gt; I think you should make the cache fields mutable and keep the const in currentTime(), ended() etc.
&gt; 
Great idea!

&gt; &gt; WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h:178
&gt; &gt; +    virtual double maximumDurationToCacheMovieTime() const { return 5; }
&gt; 
&gt; Isn&apos;t 5 seconds pretty aggressive? Would a smaller value increase the cpu usage substantially?
&gt;
The wall clock is a very close approximation of the media clock 5 seconds, it actually works well when set to 10 seconds but I decided that was too aggressive :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304928</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-11-04 15:35:22 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; WebCore/html/HTMLMediaElement.cpp:146
&gt; &gt; &gt; +    , m_minimumWallClockTimeToCacheMovieTime(0)
&gt; &gt; 
&gt; &gt; &quot;Movie&quot; here is a QT term. I think the generic WebKit code has tried to avoid it.
&gt; &gt; 
&gt; &gt; This comment applies to a bunch of other names in this patch too.
&gt; &gt; 
&gt; I disagree that &quot;movie&quot; is QuickTime specific term, but what would you suggest instead? &quot;video&quot; is incorrect because not all files have video media. &quot;media file&quot; is incorrect because an jpeg is a media file too. &quot;linear media file&quot; is technically correct, but who would understand what that means?

I have never heard the term &quot;movie&quot; used for audio content outside QuickTime, but maybe it is just me. As a historical note the class MediaPlayer used to be called Movie before the term was exorcised from the generic code.

In this instance, you could just drop the word Movie as it doesn&apos;t add much (the cache is called m_cachedTime not m_cachedMovieTime).

&gt; It is useful because invalidateCachedTime() also sets m_minimumWallClockTimeToCacheMovieTime, which prevents the cached time from being used for a half second, but there are times when we know that necessary to update the cached time but it is NOT necessary to keep it cached.

Ok.  

&gt; &gt; Could this too generate tons of logging? Should this be behind #if too?
&gt; &gt; 
&gt; No, this will rarely be true.

I suppose someone could query the current time a lot during seeking but I guess there are tons of similar cases already.

&gt; The wall clock is a very close approximation of the media clock 5 seconds, it actually works well when set to 10 seconds but I decided that was too aggressive :-)

:) 

I was thinking that the media clock might get skewed quickly in streaming cases or something. But perhaps those just produce stalls?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304929</commentid>
    <comment_count>6</comment_count>
      <attachid>72977</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-11-04 15:36:19 -0700</bug_when>
    <thetext>Comment on attachment 72977
Proposed patch

Anyway, r=me with or without changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307932</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-11 08:12:52 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/71824</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307951</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-11 08:44:04 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/71826 required to fix Leopard build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307986</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-11-11 10:42:29 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/71824 might have broken Leopard Intel Release (Tests)
The following tests are not passing:
media/video-played-collapse.html
media/video-played-ranges-1.html
media/video-played-reset.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308000</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2010-11-11 11:01:53 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; http://trac.webkit.org/changeset/71824 might have broken Leopard Intel Release (Tests)
&gt; The following tests are not passing:
&gt; media/video-played-collapse.html
&gt; media/video-played-ranges-1.html
&gt; media/video-played-reset.html

https://bugs.webkit.org/show_bug.cgi?id=49390</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>72961</attachid>
            <date>2010-11-04 10:45:29 -0700</date>
            <delta_ts>2010-11-04 10:45:29 -0700</delta_ts>
            <desc>Test case</desc>
            <filename>video-circle.html</filename>
            <type>text/html</type>
            <size>5263</size>
            <attacher name="Eric Carlson">eric.carlson</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KICA8dGl0bGU+UG9zdGVyIENpcmNsZTwvdGl0
bGU+CiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
IGNoYXJzZXQ9dXRmLTgiPgogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+
CgogIGJvZHkgCiAgewogICAgbWFyZ2luOiAwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIy
OwogIH0KCiAgQC13ZWJraXQta2V5ZnJhbWVzIHgtc3BpbiAKICB7CiAgICAwJSAgICB7IC13ZWJr
aXQtdHJhbnNmb3JtOiByb3RhdGVYKDBkZWcpOyB9CiAgICA1MCUgICB7IC13ZWJraXQtdHJhbnNm
b3JtOiByb3RhdGVYKDE4MGRlZyk7IH0KICAgIDEwMCUgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJv
dGF0ZVgoMzYwZGVnKTsgfQogIH0KCiAgQC13ZWJraXQta2V5ZnJhbWVzIHktc3BpbgogIHsKICAg
IDAlICAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoMGRlZyk7IH0KICAgIDUwJSAgIHsg
LXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoMTgwZGVnKTsgfQogICAgMTAwJSAgeyAtd2Via2l0
LXRyYW5zZm9ybTogcm90YXRlWSgzNjBkZWcpOyB9CiAgfQoKICBALXdlYmtpdC1rZXlmcmFtZXMg
YmFjay15LXNwaW4gCiAgewogICAgMCUgICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWSgz
NjBkZWcpOyB9CiAgICA1MCUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVZKDE4MGRlZyk7
IH0KICAgIDEwMCUgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVkoMGRlZyk7IH0KICB9Cgog
ICNzdGFnZQogIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiA4MDBweDsKICAg
IG1hcmdpbjogNDAwcHggYXV0bzsKICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2
ZS0zZDsKICAgIC13ZWJraXQtcGVyc3BlY3RpdmU6IDIwMDA7CiAgfQoKICAjcm90YXRlIAogIHsK
ICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHdpZHRoOiA4MDBweDsKICAgIGhlaWdodDogMjAw
cHg7CgogICAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkOwogICAgLXdlYmtp
dC1hbmltYXRpb24tbmFtZTogeC1zcGluOwogICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246
IDE3czsKICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAg
ICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjsKICB9CgogIC5yaW5n
CiAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgaGVpZ2h0OiAyMDBweDsKICAgIHdpZHRo
OiA4MDBweDsKICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDsKICB9Cgog
IC5wb3N0ZXIgCiAgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMzAwcHg7CiAg
ICB3aWR0aDogMjAwcHg7CiAgICBoZWlnaHQ6IDIwMHB4OwogICAgb3BhY2l0eTogMC43OwogICAg
LXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4OwogIH0KCiAgLnBvc3RlciB2aWRlbyB7CiAgICB3
aWR0aDogMjAwcHg7CiAgICBoZWlnaHQ6IDIwMHB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogYmxh
Y2s7CiAgfQoKICAjcmluZy0xIAogIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHktc3Bp
bjsKICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiA1czsKICAgIC13ZWJraXQtYW5pbWF0
aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1p
bmctZnVuY3Rpb246IGxpbmVhcjsKICB9CgogICNyaW5nLTIgCiAgewogICAgLXdlYmtpdC1hbmlt
YXRpb24tbmFtZTogYmFjay15LXNwaW47CiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjog
NHM7CiAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAg
LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7CiAgfQoKICAjcmluZy0z
IAogIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHktc3BpbjsKICAgIC13ZWJraXQtYW5p
bWF0aW9uLWR1cmF0aW9uOiA1czsKICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3Vu
dDogaW5maW5pdGU7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVh
cjsKICB9ICAgIAogIDwvc3R5bGU+CiAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNo
YXJzZXQ9InV0Zi04Ij4KICAgIC8qIEVhY2ggcmluZyBvZiB0aGUgY3lsaW5kZXIgY29udGFpbnMg
MTIgcG9zdGVycyAqLwogICAgY29uc3QgUE9TVEVSU19QRVJfUklORyA9IDEyOwoKICAgIHZhciBt
b3ZpZXMgPSBbCgogICAgICB7CiAgICAgICAgdGl0bGU6ICJQYXJhbm9ybWFsIEFjdGl2aXR5IDIi
LAogICAgICAgIHRodW1iOiAiaHR0cDovL3RyYWlsZXJzLmFwcGxlLmNvbS90cmFpbGVycy9nbG9i
YWwvZWxlbWVudHMvcXVpY2t0aW1lL3F0X2VuZHN0YXRlNjQweDQwMC5qcGciLAogICAgICAgIGxp
bms6ICJodHRwOi8vdHJhaWxlcnMuYXBwbGUuY29tL21vdmllcy9wYXJhbW91bnQvcGFyYW5vcm1h
bGFjdGl2aXR5Mi9wYXJhbm9ybWFsMi1jbGlwMl80ODBwLm1vdiIKICAgICAgfSwKICAgICAgewog
ICAgICAgIHRpdGxlOiAiVGhlIE5leHQgVGhyZWUgRGF5cyIsCiAgICAgICAgdGh1bWI6ICJodHRw
Oi8vdHJhaWxlcnMuYXBwbGUuY29tL3RyYWlsZXJzL2dsb2JhbC9lbGVtZW50cy9xdWlja3RpbWUv
cXRfZW5kc3RhdGU2NDB4NDAwLmpwZyIsCiAgICAgICAgbGluazogImh0dHA6Ly90cmFpbGVycy5h
cHBsZS5jb20vbW92aWVzL2xpb25zZ2F0ZS90aGVuZXh0dGhyZWVkYXlzL25leHR0aHJlZWRheXMt
dGxyMV80ODBwLm1vdiIKICAgICAgfSwKICAgICAgewogICAgICAgIHRpdGxlOiAiU2FuY3R1bSIs
CiAgICAgICAgdGh1bWI6ICJodHRwOi8vdHJhaWxlcnMuYXBwbGUuY29tL3RyYWlsZXJzL2dsb2Jh
bC9lbGVtZW50cy9xdWlja3RpbWUvcXRfZW5kc3RhdGU2NDB4NDAwLmpwZyIsCiAgICAgICAgbGlu
azogImh0dHA6Ly90cmFpbGVycy5hcHBsZS5jb20vbW92aWVzL3VuaXZlcnNhbC9zYW5jdHVtL3Nh
bmN0dW0tdGxyMV80ODBwLm1vdiIKICAgICAgfSwKICAgICAgewogICAgICAgIHRpdGxlOiAiTm93
aGVyZSBCb3kiLAogICAgICAgIHRodW1iOiAiaHR0cDovL3RyYWlsZXJzLmFwcGxlLmNvbS90cmFp
bGVycy9nbG9iYWwvZWxlbWVudHMvcXVpY2t0aW1lL3F0X2VuZHN0YXRlNjQweDQwMC5qcGciLAog
ICAgICAgIGxpbms6ICJodHRwOi8vdHJhaWxlcnMuYXBwbGUuY29tL21vdmllcy93ZWluc3RlaW4v
bm93aGVyZWJveS9ub3doZXJlYm95LXRscjJfNDgwcC5tb3YiCiAgICAgIH0sCiAgICAgIHsKICAg
ICAgICB0aXRsZTogIkluaGFsZSIsCiAgICAgICAgdGh1bWI6ICJodHRwOi8vdHJhaWxlcnMuYXBw
bGUuY29tL3RyYWlsZXJzL2dsb2JhbC9lbGVtZW50cy9xdWlja3RpbWUvcXRfZW5kc3RhdGU2NDB4
NDAwLmpwZyIsCiAgICAgICAgbGluazogImh0dHA6Ly90cmFpbGVycy5hcHBsZS5jb20vbW92aWVz
L2luZGVwZW5kZW50L2luaGFsZS9pbmhhbGUtdGxyMV80ODBwLm1vdiIKICAgICAgfSwKICAgICAg
ewogICAgICAgIHRpdGxlOiAiUmFiYml0IEhvbGUiLAogICAgICAgIHRodW1iOiAiaHR0cDovL3Ry
YWlsZXJzLmFwcGxlLmNvbS90cmFpbGVycy9nbG9iYWwvZWxlbWVudHMvcXVpY2t0aW1lL3F0X2Vu
ZHN0YXRlNjQweDQwMC5qcGciLAogICAgICAgIGxpbms6ICJodHRwOi8vdHJhaWxlcnMuYXBwbGUu
Y29tL21vdmllcy9saW9uc2dhdGUvcmFiYml0aG9sZS9yYWJiaXRob2xlLXRscjFfNDgwcC5tb3Yi
CiAgICAgIH0KICAgIF07CgogICAgZnVuY3Rpb24gc2V0dXBfcG9zdGVycyhyaW5nKQogICAgewog
ICAgICAvKiBXZSBjcmVhdGUgYSByaW5nIGJ5IGNyZWF0aW5nIGFuZCBkaXZpZGluZyBhIDM2MCBk
ZWdyZWVzIGNpcmNsZSBpbnRvIDEyIGVxdWFsIHBhcnRzCiAgICAgICAgIHRoYXQgZWFjaCBjb250
YWlucyBhIHBvc3RlciAqLwogICAgICAvKiBwb3N0ZXJBbmdsZSBoYXMgYSB2YWx1ZSBvZiAzMCBk
ZWdyZWVzICovICAgCiAgICAgIHZhciBwb3N0ZXJBbmdsZSA9IDM2MCAvIFBPU1RFUlNfUEVSX1JJ
Tkc7CiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBQT1NURVJTX1BFUl9SSU5HOyBp
bmRleCArKykgCiAgICAgIHsKICAgICAgICAvKiBFYWNoIHBvc3RlciBpcyBhIGRpdiBlbGVtZW50
ICovCiAgICAgICAgdmFyIHBvc3RlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoK
ICAgICAgICAgIC8qIEFwcGxpZXMgdGhlIENTUyAicG9zdGVyIiBjbGFzcyB0byB0aGUgcG9zdGVy
ICovCiAgICAgICAgcG9zdGVyLmNsYXNzTmFtZSA9ICdwb3N0ZXInOwoKICAgICAgICAvKiBDb21w
dXRlIGFuZCBhc3NpZ24gYSB0cmFuc2Zvcm0gdG8gdGhlIHBvc3RlciAqLwogICAgICAgIHZhciB0
cmFuc2Zvcm0gPSBbJ3JvdGF0ZVkoJywgKHBvc3RlckFuZ2xlICogaW5kZXgpLCAnZGVnKSB0cmFu
c2xhdGVaKDQwMHB4KSddLmpvaW4oJycpOwogICAgICAgIHBvc3Rlci5zdHlsZS53ZWJraXRUcmFu
c2Zvcm0gPSB0cmFuc2Zvcm07CgogICAgICAgIHZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoJ3ZpZGVvJyk7CiAgICAgICAgdmlkZW8uc3JjID0gbW92aWVzW2luZGV4ICUgbW92aWVz
Lmxlbmd0aF0ubGluazsKICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICB2aWRl
by5hdXRvcGxheSA9ICJhdXRvcGxheSI7CiAgICAgICAgICAgIHZpZGVvLmxvb3AgPSAibG9vcCI7
CiAgICAgICAgfQogICAgICAgIHBvc3Rlci5hcHBlbmRDaGlsZCh2aWRlbyk7CgogICAgICAgIC8q
IEFkZCB0aGUgcG9zdGVyIHRvIHRoaXMgcmluZyAqLwogICAgICAgIHJpbmcuYXBwZW5kQ2hpbGQo
cG9zdGVyKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluaXQoKQogICAgewogICAgICBz
ZXR1cF9wb3N0ZXJzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyaW5nLTMnKSk7CiAgICB9Cgog
ICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBpbml0LCBmYWxzZSk7CiAgICAKICA8
L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KICA8ZGl2IGlkPSJzdGFnZSI+CiAgICA8ZGl2IGlkPSJy
b3RhdGUiPgogICAgICA8ZGl2IGlkPSJyaW5nLTIiIGNsYXNzPSJyaW5nIj48L2Rpdj4gLS0+CiAg
ICAgIDxkaXYgaWQ9InJpbmctMyIgY2xhc3M9InJpbmciPjwvZGl2PgogICAgPC9kaXY+CiAgPC9k
aXY+CjwvYm9keT4KPC9odG1sPg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72977</attachid>
            <date>2010-11-04 13:40:54 -0700</date>
            <delta_ts>2010-11-04 15:36:19 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>patch_7.txt</filename>
            <type>text/plain</type>
            <size>20601</size>
            <attacher name="Eric Carlson">eric.carlson</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MTM0NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjUgQEAKKzIwMTAtMTEtMDQgIEVyaWMgQ2FybHNvbiAgPGVyaWMuY2FybHNvbkBh
cHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgTG90cyBvZiB0aW1lIHNwZW50IGluIE1lZGlhUGxheWVyUHJpdmF0ZTo6Y3VycmVudFRpbWUo
KSB3aGVuIHBsYXlpbmcgbXVsdGlwbGUgdmlkZW9zLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkwMDkKKworICAgICAgICBNYWtlIGl0IHBvc3NpYmxl
IGZvciBIVE1MTWVkaWFFbGVtZW50IHRvIGNhY2hlIHRoZSBtb3ZpZSB0aW1lIGFuZCByZXBvcnQg
J2N1cnJlbnRUaW1lJworICAgICAgICBhcyBbY2FjaGVkIHRpbWUgKyBlbGFwc2VkIHdhbGwgdGlt
ZV0uIFRoZSBtZWRpYSBlbmdpbmUgcmV0dXJucyB0aGUgbWF4aW11bSBkdXJhdGlvbiBpdCAKKyAg
ICAgICAgaXMgc2FmZSB0byBjYWxjdWxhdGUgdGltZSBiZWZvcmUgcmVzYW1wbGluZyB0aGUgYWN0
dWFsIG1vdmllIHRpbWUgd2l0aCB0aGUgbmV3CisgICAgICAgIG1heGltdW1EdXJhdGlvblRvQ2Fj
aGVNb3ZpZVRpbWUgbWV0aG9kLiBCZWNhdXNlIHRoaXMgbWF5IGJlIGRpZmZlcmVudCBmb3IgZGlm
ZmVyZW50IG1lZGlhCisgICAgICAgIGVuZ2luZXMgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGlz
IDAsIG1ha2luZyBpdCBhbiBvcHQtaW4gZmVhdHVyZS4KKworICAgICAgICBObyBuZXcgdGVzdHMg
d2VyZSBhZGRlZCBiZWNhdXNlIHRoZSBleGlzdGluZyB0ZXN0cyBhbHJlYWR5IGNoZWNrIGN1cnJl
bnRUaW1lLCBhbmQgYmVjYXVzZQorICAgICAgICBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGxvb2sg
Zm9yIGRyaWZ0IGJldHdlZW4gdGhlIGNhbGN1bGF0ZWQgYW5kIGFjdHVhbCBtZWRpYSB0aW1lIGJ5
IAorICAgICAgICBjYWxjdWxhdGluZyB0aGUgdGltZSBBTkQgZ2V0dGluZyB0aGUgYWN0dWFsIG1l
ZGlhIHRpbWUgLSB3aGljaCB0aGUgZGVmZWF0cyB0aGUgcHVycG9zZSBvZgorICAgICAgICB0aGUg
Y2hhbmdlLiBCdWlsZGluZyB3aXRoIExPR19DQUNIRURfVElNRV9XQVJOSU5HUyBkZWZpbmVkIGVu
YWJsZXMgY29kZSB0aGF0IGRvZXMgYm90aAorICAgICAgICBhbmQgbG9ncyB3YXJuaW5ncyB3aGVu
IHRoZSBkZWx0YSBiZXR3ZWVuIGNhbGN1bGF0ZWQgYW5kIG9ic2VydmVkIGlzIGdyZWF0ZXIgdGhh
biAwLjAxLgorCisgICAgICAgICogV2ViQ29yZS5leHAuaW46IFVwZGF0ZSBmb3IgbWVkaWEgZWxl
bWVudCBzeW1ib2wgY2hhbmdlcy4KKworICAgICAgICAqIGh0bWwvSFRNTE1lZGlhRWxlbWVudC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50OjpIVE1MTWVkaWFFbGVtZW50
KTogSW5pdGlhbGl6ZSBuZXcgbWVtYmVyIHZhcmlhYmxlcy4KKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxNZWRpYUVsZW1lbnQ6OnByZXBhcmVGb3JMb2FkKTogRm9yY2UgYSB0aW1lIHJlc3luYyBiZWZv
cmUgc2V0dGluZyBtX3BhdXNlZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6
OnNlZWspOiBGb3JjZSBhIHRpbWUgcmVzeW5jIGJlZm9yZSBnZXR0aW5nIHRoZSBjdXJyZW50IHRp
bWUgYmVmb3JlCisgICAgICAgIHNlZWtpbmcgc28gdGhlcmUgaXMgbm8gZHJpZnQuCisgICAgICAg
IChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50OjpyZWZyZXNoQ2FjaGVkVGltZSk6IE5ldywgdXBk
YXRlIHRoZSBjYWNoZWQgbW92aWUgdGltZSBhbmQgdGhlCisgICAgICAgIHdhbGwgY2xvY2sgdGlt
ZSBpdCB3YXMgcmVjb3JkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50Ojpp
bnZhbGlkYXRlQ2FjaGVkVGltZSk6IE5ldywgZmxhZyB0aGUgY2FjaGVkIHRpbWUgYXMgaW52YWxp
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6OmN1cnJlbnRUaW1lKTogVXNl
IGEgY2FjaGVkIG1vdmllIHRpbWUgZm9yIGFzIGxvbmcgYXMgdGhlIG1lZGlhCisgICAgICAgIGVu
Z2luZSBzYXlzIGl0IGlzIHNhZmUuIExvdHMgb2Ygb3B0aW9uYWwgbG9nZ2luZyBjYW4gYmUgZW5h
YmxlZCB0byBoZWxwIHBvcnRzIGZpbmUgdHVuZQorICAgICAgICB0aGUgbWF4aW11bSBjYWNoZSBp
bnRlcnZhbC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6OmVuZGVkKTogRm9y
Y2UgYSB0aW1lIHJlc3luYyBiZWZvcmUgc2V0dGluZyBtX3BhdXNlZC4gTm8gbG9uZ2VyCisgICAg
ICAgIGEgY29uc3QgbWV0aG9kIGJlY2F1c2UgaW52YWxpZGF0ZUNhY2hlZFRpbWUgaXMgbm9uLWNv
bnN0LgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudDo6cGxheUludGVybmFsKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50OjpwYXVzZUludGVybmFs
KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50OjplbmRTY3J1YmJp
bmcpOiBGaXggYSB0eXBvIGluIHRoZSBsb2dnaW5nLgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1l
ZGlhRWxlbWVudDo6c2NoZWR1bGVUaW1ldXBkYXRlRXZlbnQpOiBDYWxsIGN1cnJlbnRUaW1lKCkg
aW5zdGVhZCBvZiBjYWxsaW5nCisgICAgICAgIE1lZGlhUGxheWVyIHNvIHdlIHVzZSB0aGUgY2Fj
aGVkIHRpbWUgYXMgbXVjaCBhcyBpdCBwb3NzaWJsZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxN
ZWRpYUVsZW1lbnQ6OmNhblBsYXkpOiBSZW1vdmUgJ2NvbnN0JyBiZWNhdXNlIGVuZGVkKCkgaXNu
J3QgY29uc3QuCisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50OjptZWRpYVBsYXll
clRpbWVDaGFuZ2VkKTogSW52YWxpZGF0ZSBjYWNoZWQgdGltZSBiZWNhdXNlIHRoZSBlbmdpbmUK
KyAgICAgICAgc2Vla2VkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudDo6bWVk
aWFQbGF5ZXJSYXRlQ2hhbmdlZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlh
RWxlbWVudDo6cG90ZW50aWFsbHlQbGF5aW5nKTogUmVtb3ZlICdjb25zdCcgYmVjYXVzZSBjb3Vs
ZFBsYXlJZkVub3VnaERhdGEoKQorICAgICAgICBpc24ndCBjb25zdC4KKyAgICAgICAgKFdlYkNv
cmU6OkhUTUxNZWRpYUVsZW1lbnQ6OmNvdWxkUGxheUlmRW5vdWdoRGF0YSk6IFJlbW92ZSAnY29u
c3QnIGJlY2F1c2UgZW5kZWRQbGF5YmFjaygpIAorICAgICAgICBpc24ndCBjb25zdC4KKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6OmVuZGVkUGxheWJhY2spOiBSZW1vdmUgJ2Nv
bnN0JyBiZWNhdXNlIGN1cnJlbnRUaW1lKCkgaXNuJ3QgY29uc3QuCisgICAgICAgIChXZWJDb3Jl
OjpIVE1MTWVkaWFFbGVtZW50OjpzdG9wcGVkRHVlVG9FcnJvcnMpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZVBsYXlTdGF0ZSk6IEludmFsaWRhdGUg
Y2FjaGVkIHRpbWUgYmVmb3JlIGNoYW5naW5nIG1fcGF1c2VkLgorICAgICAgICAqIGh0bWwvSFRN
TE1lZGlhRWxlbWVudC5oOgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5
ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXI6Om1heGltdW1EdXJhdGlvblRv
Q2FjaGVNb3ZpZVRpbWUpOiBOZXcuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQ
bGF5ZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllclByaXZhdGUu
aDoKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFjZTo6bWF4aW11
bUR1cmF0aW9uVG9DYWNoZU1vdmllVGltZSk6IE5ldy4KKworICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL21hYy9NZWRpYVBsYXllclByaXZhdGVRVEtpdC5oOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFQbGF5ZXJQcml2YXRlOjptYXhpbXVtRHVyYXRpb25Ub0NhY2hlTW92aWVUaW1lKTogTmV3
LCBzYXkgaXQgaXMgc2FmZSB0byBjYWNoZQorICAgICAgICB0aW1lIGZvciBmaXZlIHNlY29uZHMg
KGJhc2VkIG9uIGxvdHMgb2YgZXhwZXJpbWVudGluZyB3aXRoIExPR19DQUNIRURfVElNRV9XQVJO
SU5HUyBlbmFibGVkKS4KKwogMjAxMC0xMS0wNCAgSm9zZXBoIFBlY29yYXJvICA8am9lcGVja0B3
ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFuZHJlYXMgS2xpbmcuCkluZGV4OiBX
ZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5leHAu
aW4JKHJldmlzaW9uIDcxMDI0KQorKysgV2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkod29ya2luZyBj
b3B5KQpAQCAtMTUyNyw2ICsxNTI3LDcgQEAgX3drU3VwcG9ydHNNdWx0aXBhcnRYTWl4ZWRSZXBs
YWNlCiAKICNpZiBFTkFCTEUoVklERU8pCiBfX1pON1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQx
MHNjcmVlblJlY3RFdgorX19aTjdXZWJDb3JlMTZIVE1MTWVkaWFFbGVtZW50MTFjdXJyZW50VGlt
ZUV2CiBfX1pON1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQxMmVuZFNjcnViYmluZ0V2CiBfX1pO
N1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQxNGJlZ2luU2NydWJiaW5nRXYKIF9fWk43V2ViQ29y
ZTE2SFRNTE1lZGlhRWxlbWVudDE0ZXhpdEZ1bGxzY3JlZW5FdgpAQCAtMTUzNCwxNSArMTUzNSwx
NCBAQCBfX1pON1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQxNHNldEN1cnJlCiBfX1pON1dlYkNv
cmUxNkhUTUxNZWRpYUVsZW1lbnQ0cGxheUViCiBfX1pON1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1l
bnQ1cGF1c2VFYgogX19aTjdXZWJDb3JlMTZIVE1MTWVkaWFFbGVtZW50NnJld2luZEVmCitfX1pO
N1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQ3Y2FuUGxheUV2CiBfX1pON1dlYkNvcmUxNkhUTUxN
ZWRpYUVsZW1lbnQ4c2V0TXV0ZWRFYgogX19aTjdXZWJDb3JlMTZIVE1MTWVkaWFFbGVtZW50OXNl
dFZvbHVtZUVmUmkKLV9fWk5LN1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQxMWN1cnJlbnRUaW1l
RXYKK19fWk5LN1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQxMnBsYXliYWNrUmF0ZUV2CiBfX1pO
SzdXZWJDb3JlMTZIVE1MTWVkaWFFbGVtZW50MTNwbGF0Zm9ybU1lZGlhRXYKIF9fWk5LN1dlYkNv
cmUxNkhUTUxNZWRpYUVsZW1lbnQyMXByb2Nlc3NpbmdVc2VyR2VzdHVyZUV2CiBfX1pOSzdXZWJD
b3JlMTZIVE1MTWVkaWFFbGVtZW50NW11dGVkRXYKIF9fWk5LN1dlYkNvcmUxNkhUTUxNZWRpYUVs
ZW1lbnQ2dm9sdW1lRXYKLV9fWk5LN1dlYkNvcmUxNkhUTUxNZWRpYUVsZW1lbnQ3Y2FuUGxheUV2
Ci1fX1pOSzdXZWJDb3JlMTZIVE1MTWVkaWFFbGVtZW50MTJwbGF5YmFja1JhdGVFdgogX19aTks3
V2ViQ29yZTE2SFRNTE1lZGlhRWxlbWVudDhkdXJhdGlvbkV2CiAjZW5kaWYKIApJbmRleDogV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDcxMDI0KQor
KysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTIxMzA1LDYgKzIxMzA1LDcgQEAKIAkJCWlzYSA9IFBCWFByb2plY3Q7CiAJCQlidWls
ZENvbmZpZ3VyYXRpb25MaXN0ID0gMTQ5QzI4NDMwODkwMkIxMTAwOEE5RUZDIC8qIEJ1aWxkIGNv
bmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiV2ViQ29yZSIgKi87CiAJCQljb21wYXRp
YmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOworCQkJZGV2ZWxvcG1lbnRSZWdpb24gPSBFbmds
aXNoOwogCQkJaGFzU2Nhbm5lZEZvckVuY29kaW5ncyA9IDE7CiAJCQlrbm93blJlZ2lvbnMgPSAo
CiAJCQkJRW5nbGlzaCwKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5jcHAJKHJldmlzaW9u
IDcxMDM5KQorKysgV2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMDEsNiArMTAxLDEzIEBAIHN0YXRpYyBjb25zdCBjaGFyICpib29sU3RyaW5nKGJv
b2wgdmFsKQogI2RlZmluZSBMT0dfTUVESUFfRVZFTlRTIDAKICNlbmRpZgogCisjaWZuZGVmIExP
R19DQUNIRURfVElNRV9XQVJOSU5HUworLy8gRGVmYXVsdCB0byBub3QgbG9nZ2luZyB3YXJuaW5n
cyBhYm91dCBleGNlc3NpdmUgZHJpZnQgaW4gdGhlIGNhY2hlZCBtZWRpYSB0aW1lIGJlY2F1c2Ug
aXQgYWRkcyBhCisvLyBmYWlyIGFtb3VudCBvZiBvdmVyaGVhZCBhbmQgbG9nZ2luZy4KKyNkZWZp
bmUgTE9HX0NBQ0hFRF9USU1FX1dBUk5JTkdTIDAKKyNlbmRpZgorCisKIHVzaW5nIG5hbWVzcGFj
ZSBIVE1MTmFtZXM7CiAKIEhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqIGRvY3VtZW50KQpAQCAtMTM0LDYgKzE0
MSw5IEBAIEhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQoY29uc3QKICAgICAsIG1f
cHJlbG9hZChNZWRpYVBsYXllcjo6QXV0bykKICAgICAsIG1fZGlzcGxheU1vZGUoVW5rbm93bikK
ICAgICAsIG1fcHJvY2Vzc2luZ01lZGlhUGxheWVyQ2FsbGJhY2soMCkKKyAgICAsIG1fY2FjaGVk
VGltZSgtMSkKKyAgICAsIG1fY2FjaGVkVGltZVdhbGxDbG9ja1VwZGF0ZVRpbWUoMCkKKyAgICAs
IG1fbWluaW11bVdhbGxDbG9ja1RpbWVUb0NhY2hlTW92aWVUaW1lKDApCiAgICAgLCBtX3BsYXlp
bmcoZmFsc2UpCiAgICAgLCBtX2lzV2FpdGluZ1VudGlsTWVkaWFDYW5TdGFydChmYWxzZSkKICAg
ICAsIG1fc2hvdWxkRGVsYXlMb2FkRXZlbnQoZmFsc2UpCkBAIC01NjIsNiArNTcyLDcgQEAgdm9p
ZCBIVE1MTWVkaWFFbGVtZW50OjpwcmVwYXJlRm9yTG9hZCgpCiAgICAgICAgIG1fbmV0d29ya1N0
YXRlID0gTkVUV09SS19FTVBUWTsKICAgICAgICAgbV9yZWFkeVN0YXRlID0gSEFWRV9OT1RISU5H
OwogICAgICAgICBtX3JlYWR5U3RhdGVNYXhpbXVtID0gSEFWRV9OT1RISU5HOworICAgICAgICBy
ZWZyZXNoQ2FjaGVkVGltZSgpOwogICAgICAgICBtX3BhdXNlZCA9IHRydWU7CiAgICAgICAgIG1f
c2Vla2luZyA9IGZhbHNlOwogICAgICAgICBzY2hlZHVsZUV2ZW50KGV2ZW50TmFtZXMoKS5lbXB0
aWVkRXZlbnQpOwpAQCAtMTA5NCw2ICsxMTA1LDcgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50Ojpz
ZWVrKGZsb2F0IHRpbWUsIAogICAgIH0KIAogICAgIC8vIEdldCB0aGUgY3VycmVudCB0aW1lIGJl
Zm9yZSBzZXR0aW5nIG1fc2Vla2luZywgbV9sYXN0U2Vla1RpbWUgaXMgcmV0dXJuZWQgb25jZSBp
dCBpcyBzZXQuCisgICAgcmVmcmVzaENhY2hlZFRpbWUoKTsKICAgICBmbG9hdCBub3cgPSBjdXJy
ZW50VGltZSgpOwogCiAgICAgLy8gMiAtIElmIHRoZSBlbGVtZW50J3Mgc2Vla2luZyBJREwgYXR0
cmlidXRlIGlzIHRydWUsIHRoZW4gYW5vdGhlciBpbnN0YW5jZSBvZiB0aGlzIGFsZ29yaXRobSBp
cwpAQCAtMTE5OCwxNCArMTIxMCw4MiBAQCBib29sIEhUTUxNZWRpYUVsZW1lbnQ6OnNlZWtpbmco
KSBjb25zdAogICAgIHJldHVybiBtX3NlZWtpbmc7CiB9CiAKK3ZvaWQgSFRNTE1lZGlhRWxlbWVu
dDo6cmVmcmVzaENhY2hlZFRpbWUoKQoreworICAgIExPRyhNZWRpYSwgIkhUTUxNZWRpYUVsZW1l
bnQ6OnJlZnJlc2hDYWNoZWRUaW1lIik7CisKKyAgICBtX2NhY2hlZFRpbWVXYWxsQ2xvY2tVcGRh
dGVUaW1lID0gV1RGOjpjdXJyZW50VGltZSgpOworICAgIG1fY2FjaGVkVGltZSA9IG1fcGxheWVy
LT5jdXJyZW50VGltZSgpOworfQorCit2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OmludmFsaWRhdGVD
YWNoZWRUaW1lKCkKK3sKKyAgICBMT0coTWVkaWEsICJIVE1MTWVkaWFFbGVtZW50OjppbnZhbGlk
YXRlQ2FjaGVkVGltZSIpOworCisgICAgLy8gRG9uJ3QgdHJ5IHRvIGNhY2hlIG1vdmllIHRpbWUg
d2hlbiBwbGF5YmFjayBmaXJzdCBzdGFydHMgYXMgdGhlIHRpbWUgcmVwb3J0ZWQgYnkgdGhlIGVu
Z2luZQorICAgIC8vIHNvbWV0aW1lcyBmbHVjdHVhdGVzIGZvciBhIHNob3J0IGFtb3VudCBvZiB0
aW1lLCBzbyB0aGUgY2FjaGVkIHRpbWUgd2lsbCBiZSBvZmYgaWYgd2UgdGFrZSBpdAorICAgIC8v
IHRvbyBlYXJseS4KKyAgICBzdGF0aWMgZmxvYXQgbWluaW11bVRpbWVQbGF5aW5nQmVmb3JlQ2Fj
aGVTbmFwc2hvdCA9IDAuNTsKKworICAgIG1fbWluaW11bVdhbGxDbG9ja1RpbWVUb0NhY2hlTW92
aWVUaW1lID0gV1RGOjpjdXJyZW50VGltZSgpICsgbWluaW11bVRpbWVQbGF5aW5nQmVmb3JlQ2Fj
aGVTbmFwc2hvdDsKKyAgICBtX2NhY2hlZFRpbWUgPSAtMTsKK30KKwogLy8gcGxheWJhY2sgc3Rh
dGUKLWZsb2F0IEhUTUxNZWRpYUVsZW1lbnQ6OmN1cnJlbnRUaW1lKCkgY29uc3QKK2Zsb2F0IEhU
TUxNZWRpYUVsZW1lbnQ6OmN1cnJlbnRUaW1lKCkKIHsKKyNpZiAhTE9HX0NBQ0hFRF9USU1FX1dB
Uk5JTkdTCisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtaW5DYWNoZWREZWx0YUZvcldhcm5pbmcg
PSAwLjAxOworI2VuZGlmCisKICAgICBpZiAoIW1fcGxheWVyKQogICAgICAgICByZXR1cm4gMDsK
LSAgICBpZiAobV9zZWVraW5nKQorCisgICAgaWYgKG1fc2Vla2luZykgeworICAgICAgICBMT0co
TWVkaWEsICJIVE1MTWVkaWFFbGVtZW50OjpjdXJyZW50VGltZSAtIHNlZWtpbmcsIHJldHVybmlu
ZyAlZiIsIG1fbGFzdFNlZWtUaW1lKTsKICAgICAgICAgcmV0dXJuIG1fbGFzdFNlZWtUaW1lOwot
ICAgIHJldHVybiBtX3BsYXllci0+Y3VycmVudFRpbWUoKTsKKyAgICB9CisKKyAgICBpZiAobV9j
YWNoZWRUaW1lID49IDAgJiYgbV9wYXVzZWQpIHsKKyNpZiAhTE9HX0NBQ0hFRF9USU1FX1dBUk5J
TkdTCisgICAgICAgIGZsb2F0IGRlbHRhID0gbV9jYWNoZWRUaW1lIC0gbV9wbGF5ZXItPmN1cnJl
bnRUaW1lKCk7CisgICAgICAgIGlmIChkZWx0YSA+IG1pbkNhY2hlZERlbHRhRm9yV2FybmluZykK
KyAgICAgICAgICAgIExPRyhNZWRpYSwgIkhUTUxNZWRpYUVsZW1lbnQ6OmN1cnJlbnRUaW1lIC0g
V0FSTklORywgY2FjaGVkIHRpbWUgaXMgJWYgc2Vjb25kcyBvZmYgb2YgbWVkaWEgdGltZSB3aGVu
IHBhdXNlZCIsIGRlbHRhKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gbV9jYWNoZWRUaW1lOwor
ICAgIH0KKworICAgIC8vIElzIGl0IHRvbyBzb29uIHVzZSBhIGNhY2hlZCB0aW1lPworICAgIGRv
dWJsZSBub3cgPSBXVEY6OmN1cnJlbnRUaW1lKCk7CisgICAgZG91YmxlIG1heGltdW1EdXJhdGlv
blRvQ2FjaGVNb3ZpZVRpbWUgPSBtX3BsYXllci0+bWF4aW11bUR1cmF0aW9uVG9DYWNoZU1vdmll
VGltZSgpOworCisgICAgaWYgKG1heGltdW1EdXJhdGlvblRvQ2FjaGVNb3ZpZVRpbWUgJiYgbV9j
YWNoZWRUaW1lID49IDAgJiYgIW1fcGF1c2VkICYmIG5vdyA+IG1fbWluaW11bVdhbGxDbG9ja1Rp
bWVUb0NhY2hlTW92aWVUaW1lKSB7CisgICAgICAgIGRvdWJsZSB3YWxsQ2xvY2tEZWx0YSA9IG5v
dyAtIG1fY2FjaGVkVGltZVdhbGxDbG9ja1VwZGF0ZVRpbWU7CisKKyAgICAgICAgLy8gTm90IHRv
byBzb29uLCB1c2UgdGhlIGNhY2hlZCB0aW1lIG9ubHkgaWYgaXQgaGFzbid0IGV4cGlyZWQuCisg
ICAgICAgIGlmICh3YWxsQ2xvY2tEZWx0YSA8IG1heGltdW1EdXJhdGlvblRvQ2FjaGVNb3ZpZVRp
bWUpIHsKKyAgICAgICAgICAgIGZsb2F0IGFkanVzdGVkQ2FjaGVUaW1lID0gbV9jYWNoZWRUaW1l
ICsgKG1fcGxheWJhY2tSYXRlICogd2FsbENsb2NrRGVsdGEpOworCisjaWYgIUxPR19DQUNIRURf
VElNRV9XQVJOSU5HUworICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSBhZGp1c3RlZENhY2hlVGlt
ZSAtIG1fcGxheWVyLT5jdXJyZW50VGltZSgpOworICAgICAgICAgICAgaWYgKGRlbHRhID4gbWlu
Q2FjaGVkRGVsdGFGb3JXYXJuaW5nKQorICAgICAgICAgICAgICAgIExPRyhNZWRpYSwgIkhUTUxN
ZWRpYUVsZW1lbnQ6OmN1cnJlbnRUaW1lIC0gV0FSTklORywgY2FjaGVkIHRpbWUgaXMgJWYgc2Vj
b25kcyBvZmYgb2YgbWVkaWEgdGltZSB3aGVuIHBsYXlpbmciLCBkZWx0YSk7CisjZW5kaWYKKyAg
ICAgICAgICAgIHJldHVybiBhZGp1c3RlZENhY2hlVGltZTsKKyAgICAgICAgfQorICAgIH0KKwor
I2lmICFMT0dfQ0FDSEVEX1RJTUVfV0FSTklOR1MKKyAgICBpZiAobWF4aW11bUR1cmF0aW9uVG9D
YWNoZU1vdmllVGltZSAmJiBub3cgPiBtX21pbmltdW1XYWxsQ2xvY2tUaW1lVG9DYWNoZU1vdmll
VGltZSAmJiBtX2NhY2hlZFRpbWUgPj0gMCkgeworICAgICAgICBkb3VibGUgd2FsbENsb2NrRGVs
dGEgPSBub3cgLSBtX2NhY2hlZFRpbWVXYWxsQ2xvY2tVcGRhdGVUaW1lOworICAgICAgICBmbG9h
dCBkZWx0YSA9IG1fY2FjaGVkVGltZSArIChtX3BsYXliYWNrUmF0ZSAqIHdhbGxDbG9ja0RlbHRh
KSAtIG1fcGxheWVyLT5jdXJyZW50VGltZSgpOworICAgICAgICBMT0coTWVkaWEsICJIVE1MTWVk
aWFFbGVtZW50OjpjdXJyZW50VGltZSAtIGNhY2hlZCB0aW1lIHdhcyAlZiBzZWNvbmRzIG9mZiBv
ZiBtZWRpYSB0aW1lIHdoZW4gaXQgZXhwaXJlZCIsIGRlbHRhKTsKKyAgICB9CisjZW5kaWYKKwor
ICAgIHJlZnJlc2hDYWNoZWRUaW1lKCk7CisKKyAgICByZXR1cm4gbV9jYWNoZWRUaW1lOwogfQog
CiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnNldEN1cnJlbnRUaW1lKGZsb2F0IHRpbWUsIEV4Y2Vw
dGlvbkNvZGUmIGVjKQpAQCAtMTI4MCw3ICsxMzYwLDcgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50
OjpzZXRXZWJraXRQcmVzZXJ2ZQogICAgIG1fcGxheWVyLT5zZXRQcmVzZXJ2ZXNQaXRjaChwcmVz
ZXJ2ZXNQaXRjaCk7CiB9CiAKLWJvb2wgSFRNTE1lZGlhRWxlbWVudDo6ZW5kZWQoKSBjb25zdAor
Ym9vbCBIVE1MTWVkaWFFbGVtZW50OjplbmRlZCgpCiB7CiAgICAgLy8gNC44LjEwLjggUGxheWlu
ZyB0aGUgbWVkaWEgcmVzb3VyY2UKICAgICAvLyBUaGUgZW5kZWQgYXR0cmlidXRlIG11c3QgcmV0
dXJuIHRydWUgaWYgdGhlIG1lZGlhIGVsZW1lbnQgaGFzIGVuZGVkIApAQCAtMTM2MCw2ICsxNDQw
LDcgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50OjpwbGF5SW50ZXJuYWwoKQogICAgIHNldFBsYXli
YWNrUmF0ZShkZWZhdWx0UGxheWJhY2tSYXRlKCkpOwogICAgIAogICAgIGlmIChtX3BhdXNlZCkg
eworICAgICAgICBpbnZhbGlkYXRlQ2FjaGVkVGltZSgpOwogICAgICAgICBtX3BhdXNlZCA9IGZh
bHNlOwogICAgICAgICBzY2hlZHVsZUV2ZW50KGV2ZW50TmFtZXMoKS5wbGF5RXZlbnQpOwogCkBA
IC0xMzk1LDYgKzE0NzYsNyBAQCB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnBhdXNlSW50ZXJuYWwo
KQogICAgIG1fYXV0b3BsYXlpbmcgPSBmYWxzZTsKICAgICAKICAgICBpZiAoIW1fcGF1c2VkKSB7
CisgICAgICAgIHJlZnJlc2hDYWNoZWRUaW1lKCk7CiAgICAgICAgIG1fcGF1c2VkID0gdHJ1ZTsK
ICAgICAgICAgc2NoZWR1bGVUaW1ldXBkYXRlRXZlbnQoZmFsc2UpOwogICAgICAgICBzY2hlZHVs
ZUV2ZW50KGV2ZW50TmFtZXMoKS5wYXVzZUV2ZW50KTsKQEAgLTE1MDksNyArMTU5MSw3IEBAIHZv
aWQgSFRNTE1lZGlhRWxlbWVudDo6YmVnaW5TY3J1YmJpbmcoKQogCiB2b2lkIEhUTUxNZWRpYUVs
ZW1lbnQ6OmVuZFNjcnViYmluZygpCiB7Ci0gICAgTE9HKE1lZGlhLCAiSFRNTE1lZGlhRWxlbWVu
dDo6YmVnaW5TY3J1YmJpbmcgLSBtX3BhdXNlZEludGVybmFsIGlzICVzIiwgYm9vbFN0cmluZyht
X3BhdXNlZEludGVybmFsKSk7CisgICAgTE9HKE1lZGlhLCAiSFRNTE1lZGlhRWxlbWVudDo6ZW5k
U2NydWJiaW5nIC0gbV9wYXVzZWRJbnRlcm5hbCBpcyAlcyIsIGJvb2xTdHJpbmcobV9wYXVzZWRJ
bnRlcm5hbCkpOwogCiAgICAgaWYgKG1fcGF1c2VkSW50ZXJuYWwpCiAgICAgICAgIHNldFBhdXNl
ZEludGVybmFsKGZhbHNlKTsKQEAgLTE1NTEsNyArMTYzMyw3IEBAIHZvaWQgSFRNTE1lZGlhRWxl
bWVudDo6c2NoZWR1bGVUaW1ldXBkYXQKIAogICAgIC8vIFNvbWUgbWVkaWEgZW5naW5lcyBtYWtl
IG11bHRpcGxlICJ0aW1lIGNoYW5nZWQiIGNhbGxiYWNrcyBhdCB0aGUgc2FtZSB0aW1lLCBidXQg
d2Ugb25seSB3YW50IG9uZQogICAgIC8vIGV2ZW50IGF0IGEgZ2l2ZW4gdGltZSBzbyBmaWx0ZXIg
aGVyZQotICAgIGZsb2F0IG1vdmllVGltZSA9IG1fcGxheWVyID8gbV9wbGF5ZXItPmN1cnJlbnRU
aW1lKCkgOiAwOworICAgIGZsb2F0IG1vdmllVGltZSA9IGN1cnJlbnRUaW1lKCk7CiAgICAgaWYg
KG1vdmllVGltZSAhPSBtX2xhc3RUaW1lVXBkYXRlRXZlbnRNb3ZpZVRpbWUpIHsKICAgICAgICAg
c2NoZWR1bGVFdmVudChldmVudE5hbWVzKCkudGltZXVwZGF0ZUV2ZW50KTsKICAgICAgICAgbV9s
YXN0VGltZVVwZGF0ZUV2ZW50V2FsbFRpbWUgPSBub3c7CkBAIC0xNTU5LDcgKzE2NDEsNyBAQCB2
b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnNjaGVkdWxlVGltZXVwZGF0CiAgICAgfQogfQogCi1ib29s
IEhUTUxNZWRpYUVsZW1lbnQ6OmNhblBsYXkoKSBjb25zdAorYm9vbCBIVE1MTWVkaWFFbGVtZW50
OjpjYW5QbGF5KCkKIHsKICAgICByZXR1cm4gcGF1c2VkKCkgfHwgZW5kZWQoKSB8fCBtX3JlYWR5
U3RhdGUgPCBIQVZFX01FVEFEQVRBOwogfQpAQCAtMTc3MywxNSArMTg1NSwxNyBAQCB2b2lkIEhU
TUxNZWRpYUVsZW1lbnQ6Om1lZGlhUGxheWVyVGltZUNoCiAKICAgICBiZWdpblByb2Nlc3NpbmdN
ZWRpYVBsYXllckNhbGxiYWNrKCk7CiAKLSAgICAvLyBBbHdheXMgY2FsbCBzY2hlZHVsZVRpbWV1
cGRhdGVFdmVudCB3aGVuIHRoZSBtZWRpYSBlbmdpbmUgcmVwb3J0cyBhIHRpbWUgZGlzY29udGlu
dWl0eSwgCi0gICAgLy8gaXQgd2lsbCBvbmx5IHF1ZXVlIGEgJ3RpbWV1cGRhdGUnIGV2ZW50IGlm
IHdlIGhhdmVuJ3QgYWxyZWFkeSBwb3N0ZWQgb25lIGF0IHRoZSBjdXJyZW50Ci0gICAgLy8gbW92
aWUgdGltZS4KLSAgICBzY2hlZHVsZVRpbWV1cGRhdGVFdmVudChmYWxzZSk7CisgICAgaW52YWxp
ZGF0ZUNhY2hlZFRpbWUoKTsKIAogICAgIC8vIDQuOC4xMC45IHN0ZXAgMTQgJiAxNS4gIE5lZWRl
ZCBpZiBubyBSZWFkeVN0YXRlIGNoYW5nZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlZWsuCiAg
ICAgaWYgKG1fc2Vla2luZyAmJiBtX3JlYWR5U3RhdGUgPj0gSEFWRV9DVVJSRU5UX0RBVEEpCiAg
ICAgICAgIGZpbmlzaFNlZWsoKTsKICAgICAKKyAgICAvLyBBbHdheXMgY2FsbCBzY2hlZHVsZVRp
bWV1cGRhdGVFdmVudCB3aGVuIHRoZSBtZWRpYSBlbmdpbmUgcmVwb3J0cyBhIHRpbWUgZGlzY29u
dGludWl0eSwgCisgICAgLy8gaXQgd2lsbCBvbmx5IHF1ZXVlIGEgJ3RpbWV1cGRhdGUnIGV2ZW50
IGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBwb3N0ZWQgb25lIGF0IHRoZSBjdXJyZW50CisgICAgLy8g
bW92aWUgdGltZS4KKyAgICBzY2hlZHVsZVRpbWV1cGRhdGVFdmVudChmYWxzZSk7CisKICAgICBm
bG9hdCBub3cgPSBjdXJyZW50VGltZSgpOwogICAgIGZsb2F0IGR1ciA9IGR1cmF0aW9uKCk7CiAg
ICAgaWYgKCFpc25hbihkdXIpICYmIGR1ciAmJiBub3cgPj0gZHVyKSB7CkBAIC0xODQwLDYgKzE5
MjQsOSBAQCB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6Om1lZGlhUGxheWVyUmF0ZUNoCiAgICAgTE9H
KE1lZGlhLCAiSFRNTE1lZGlhRWxlbWVudDo6bWVkaWFQbGF5ZXJSYXRlQ2hhbmdlZCIpOwogCiAg
ICAgYmVnaW5Qcm9jZXNzaW5nTWVkaWFQbGF5ZXJDYWxsYmFjaygpOworCisgICAgaW52YWxpZGF0
ZUNhY2hlZFRpbWUoKTsKKwogICAgIC8vIFN0YXNoIHRoZSByYXRlIGluIGNhc2UgdGhlIG9uZSB3
ZSB0cmllZCB0byBzZXQgaXNuJ3Qgd2hhdCB0aGUgZW5naW5lIGlzCiAgICAgLy8gdXNpbmcgKGVn
LiBpdCBjYW4ndCBoYW5kbGUgdGhlIHJhdGUgd2Ugc2V0KQogICAgIG1fcGxheWJhY2tSYXRlID0g
bV9wbGF5ZXItPnJhdGUoKTsKQEAgLTE5NDIsNyArMjAyOSw3IEBAIFBhc3NSZWZQdHI8VGltZVJh
bmdlcz4gSFRNTE1lZGlhRWxlbWVudDoKICAgICByZXR1cm4gVGltZVJhbmdlczo6Y3JlYXRlKG1p
blRpbWVTZWVrYWJsZSgpLCBtYXhUaW1lU2Vla2FibGUoKSk7CiB9CiAKLWJvb2wgSFRNTE1lZGlh
RWxlbWVudDo6cG90ZW50aWFsbHlQbGF5aW5nKCkgY29uc3QKK2Jvb2wgSFRNTE1lZGlhRWxlbWVu
dDo6cG90ZW50aWFsbHlQbGF5aW5nKCkKIHsKICAgICAvLyAicGF1c2VkVG9CdWZmZXIiIG1lYW5z
IHRoZSBtZWRpYSBlbmdpbmUncyByYXRlIGlzIDAsIGJ1dCBvbmx5IGJlY2F1c2UgaXQgaGFkIHRv
IHN0b3AgcGxheWluZwogICAgIC8vIHdoZW4gaXQgcmFuIG91dCBvZiBidWZmZXJlZCBkYXRhLiBB
IG1vdmllIGlzIHRoaXMgc3RhdGUgaXMgInBvdGVudGlhbGx5IHBsYXlpbmciLCBtb2R1bG8gdGhl
CkBAIC0xOTUxLDEyICsyMDM4LDEyIEBAIGJvb2wgSFRNTE1lZGlhRWxlbWVudDo6cG90ZW50aWFs
bHlQbGF5aW4KICAgICByZXR1cm4gKHBhdXNlZFRvQnVmZmVyIHx8IG1fcmVhZHlTdGF0ZSA+PSBI
QVZFX0ZVVFVSRV9EQVRBKSAmJiBjb3VsZFBsYXlJZkVub3VnaERhdGEoKTsKIH0KIAotYm9vbCBI
VE1MTWVkaWFFbGVtZW50Ojpjb3VsZFBsYXlJZkVub3VnaERhdGEoKSBjb25zdAorYm9vbCBIVE1M
TWVkaWFFbGVtZW50Ojpjb3VsZFBsYXlJZkVub3VnaERhdGEoKQogewogICAgIHJldHVybiAhcGF1
c2VkKCkgJiYgIWVuZGVkUGxheWJhY2soKSAmJiAhc3RvcHBlZER1ZVRvRXJyb3JzKCkgJiYgIXBh
dXNlZEZvclVzZXJJbnRlcmFjdGlvbigpOwogfQogCi1ib29sIEhUTUxNZWRpYUVsZW1lbnQ6OmVu
ZGVkUGxheWJhY2soKSBjb25zdAorYm9vbCBIVE1MTWVkaWFFbGVtZW50OjplbmRlZFBsYXliYWNr
KCkKIHsKICAgICBmbG9hdCBkdXIgPSBkdXJhdGlvbigpOwogICAgIGlmICghbV9wbGF5ZXIgfHwg
aXNuYW4oZHVyKSkKQEAgLTE5ODMsNyArMjA3MCw3IEBAIGJvb2wgSFRNTE1lZGlhRWxlbWVudDo6
ZW5kZWRQbGF5YmFjaygpIGMKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgSFRNTE1lZGlh
RWxlbWVudDo6c3RvcHBlZER1ZVRvRXJyb3JzKCkgY29uc3QKK2Jvb2wgSFRNTE1lZGlhRWxlbWVu
dDo6c3RvcHBlZER1ZVRvRXJyb3JzKCkKIHsKICAgICBpZiAobV9yZWFkeVN0YXRlID49IEhBVkVf
TUVUQURBVEEgJiYgbV9lcnJvcikgewogICAgICAgICBSZWZQdHI8VGltZVJhbmdlcz4gc2Vla2Fi
bGVSYW5nZXMgPSBzZWVrYWJsZSgpOwpAQCAtMjAzNCw2ICsyMTIxLDcgQEAgdm9pZCBIVE1MTWVk
aWFFbGVtZW50Ojp1cGRhdGVQbGF5U3RhdGUoKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAo
bV9wYXVzZWRJbnRlcm5hbCkgeworICAgICAgICByZWZyZXNoQ2FjaGVkVGltZSgpOwogICAgICAg
ICBpZiAoIW1fcGxheWVyLT5wYXVzZWQoKSkKICAgICAgICAgICAgIG1fcGxheWVyLT5wYXVzZSgp
OwogICAgICAgICBtX3BsYXliYWNrUHJvZ3Jlc3NUaW1lci5zdG9wKCk7CkBAIC0yMDQ4LDYgKzIx
MzYsNyBAQCB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZVBsYXlTdGF0ZSgpCiAKICAgICBp
ZiAoc2hvdWxkQmVQbGF5aW5nKSB7CiAgICAgICAgIHNldERpc3BsYXlNb2RlKFZpZGVvKTsKKyAg
ICAgICAgaW52YWxpZGF0ZUNhY2hlZFRpbWUoKTsKIAogICAgICAgICBpZiAocGxheWVyUGF1c2Vk
KSB7CiAgICAgICAgICAgICAvLyBTZXQgcmF0ZSBiZWZvcmUgY2FsbGluZyBwbGF5IGluIGNhc2Ug
dGhlIHJhdGUgd2FzIHNldCBiZWZvcmUgdGhlIG1lZGlhIGVuZ2luZSB3YXMgc2V0dXAuCkBAIC0y
MDYwLDYgKzIxNDksNyBAQCB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZVBsYXlTdGF0ZSgp
CiAgICAgICAgIG1fcGxheWluZyA9IHRydWU7CiAKICAgICB9IGVsc2UgeyAvLyBTaG91bGQgbm90
IGJlIHBsYXlpbmcgcmlnaHQgbm93CisgICAgICAgIHJlZnJlc2hDYWNoZWRUaW1lKCk7CiAgICAg
ICAgIGlmICghcGxheWVyUGF1c2VkKQogICAgICAgICAgICAgbV9wbGF5ZXItPnBhdXNlKCk7CiAK
SW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuaAkocmV2aXNpb24gNzEwMjQpCisrKyBXZWJDb3Jl
L2h0bWwvSFRNTE1lZGlhRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDMsNyArMTAzLDcg
QEAgcHVibGljOgogICAgIGJvb2wgc2Vla2luZygpIGNvbnN0OwogCiAvLyBwbGF5YmFjayBzdGF0
ZQotICAgIGZsb2F0IGN1cnJlbnRUaW1lKCkgY29uc3Q7CisgICAgZmxvYXQgY3VycmVudFRpbWUo
KTsKICAgICB2b2lkIHNldEN1cnJlbnRUaW1lKGZsb2F0LCBFeGNlcHRpb25Db2RlJik7CiAgICAg
ZmxvYXQgc3RhcnRUaW1lKCkgY29uc3Q7CiAgICAgZmxvYXQgZHVyYXRpb24oKSBjb25zdDsKQEAg
LTExNiw3ICsxMTYsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRXZWJraXRQcmVzZXJ2ZXNQaXRj
aChib29sKTsKICAgICBQYXNzUmVmUHRyPFRpbWVSYW5nZXM+IHBsYXllZCgpOwogICAgIFBhc3NS
ZWZQdHI8VGltZVJhbmdlcz4gc2Vla2FibGUoKSBjb25zdDsKLSAgICBib29sIGVuZGVkKCkgY29u
c3Q7CisgICAgYm9vbCBlbmRlZCgpOwogICAgIGJvb2wgYXV0b3BsYXkoKSBjb25zdDsgICAgCiAg
ICAgdm9pZCBzZXRBdXRvcGxheShib29sIGIpOwogICAgIGJvb2wgbG9vcCgpIGNvbnN0OyAgICAK
QEAgLTE0Miw3ICsxNDIsNyBAQCBwdWJsaWM6CiAKICAgICBJbnRSZWN0IHNjcmVlblJlY3QoKTsK
IAotICAgIGJvb2wgY2FuUGxheSgpIGNvbnN0OworICAgIGJvb2wgY2FuUGxheSgpOwogCiAgICAg
ZmxvYXQgcGVyY2VudExvYWRlZCgpIGNvbnN0OwogCkBAIC0yNzcsMTEgKzI3NywxMSBAQCBwcml2
YXRlOgogCiAgICAgdm9pZCB1cGRhdGVWb2x1bWUoKTsKICAgICB2b2lkIHVwZGF0ZVBsYXlTdGF0
ZSgpOwotICAgIGJvb2wgcG90ZW50aWFsbHlQbGF5aW5nKCkgY29uc3Q7Ci0gICAgYm9vbCBlbmRl
ZFBsYXliYWNrKCkgY29uc3Q7Ci0gICAgYm9vbCBzdG9wcGVkRHVlVG9FcnJvcnMoKSBjb25zdDsK
KyAgICBib29sIHBvdGVudGlhbGx5UGxheWluZygpOworICAgIGJvb2wgZW5kZWRQbGF5YmFjaygp
OworICAgIGJvb2wgc3RvcHBlZER1ZVRvRXJyb3JzKCk7CiAgICAgYm9vbCBwYXVzZWRGb3JVc2Vy
SW50ZXJhY3Rpb24oKSBjb25zdDsKLSAgICBib29sIGNvdWxkUGxheUlmRW5vdWdoRGF0YSgpIGNv
bnN0OworICAgIGJvb2wgY291bGRQbGF5SWZFbm91Z2hEYXRhKCk7CiAKICAgICBmbG9hdCBtaW5U
aW1lU2Vla2FibGUoKSBjb25zdDsKICAgICBmbG9hdCBtYXhUaW1lU2Vla2FibGUoKSBjb25zdDsK
QEAgLTI5Myw2ICsyOTMsOSBAQCBwcml2YXRlOgogCiAgICAgdm9pZCBzZXRTaG91bGREZWxheUxv
YWRFdmVudChib29sKTsKIAorICAgIHZvaWQgaW52YWxpZGF0ZUNhY2hlZFRpbWUoKTsKKyAgICB2
b2lkIHJlZnJlc2hDYWNoZWRUaW1lKCk7CisKICAgICAvLyBSZXN0cmljdGlvbnMgdG8gY2hhbmdl
IGRlZmF1bHQgYmVoYXZpb3JzLiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY29tcGlsZSB0aW1lIGNo
b2ljZSBhdCB0aGUgbW9tZW50CiAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gYWNjZXNzb3Ig
ZnVuY3Rpb25zLgogICAgIGVudW0gQmVoYXZpb3JSZXN0cmljdGlvbnMgewpAQCAtMzUyLDYgKzM1
NSwxMCBAQCBwcml2YXRlOgogICAgIC8vIGNhbGxpbmcgdGhlIG1lZGlhIGVuZ2luZSByZWN1cnNp
dmVseS4KICAgICBpbnQgbV9wcm9jZXNzaW5nTWVkaWFQbGF5ZXJDYWxsYmFjazsKIAorICAgIGZs
b2F0IG1fY2FjaGVkVGltZTsKKyAgICBkb3VibGUgbV9jYWNoZWRUaW1lV2FsbENsb2NrVXBkYXRl
VGltZTsKKyAgICBkb3VibGUgbV9taW5pbXVtV2FsbENsb2NrVGltZVRvQ2FjaGVNb3ZpZVRpbWU7
CisKICAgICBib29sIG1fcGxheWluZyA6IDE7CiAgICAgYm9vbCBtX2lzV2FpdGluZ1VudGlsTWVk
aWFDYW5TdGFydCA6IDE7CiAgICAgYm9vbCBtX3Nob3VsZERlbGF5TG9hZEV2ZW50IDogMTsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5ZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5ZXIuY3BwCShyZXZpc2lvbiA3
MTAzOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5ZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC02NDgsNiArNjQ4LDExIEBAIGZsb2F0IE1lZGlhUGxheWVyOjptZWRpYVRp
bWVGb3JUaW1lVmFsdWUKICAgICByZXR1cm4gbV9wcml2YXRlLT5tZWRpYVRpbWVGb3JUaW1lVmFs
dWUodGltZVZhbHVlKTsKIH0KIAorZG91YmxlIE1lZGlhUGxheWVyOjptYXhpbXVtRHVyYXRpb25U
b0NhY2hlTW92aWVUaW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcml2YXRlLT5tYXhpbXVt
RHVyYXRpb25Ub0NhY2hlTW92aWVUaW1lKCk7Cit9CisKIC8vIENsaWVudCBjYWxsYmFja3MuCiB2
b2lkIE1lZGlhUGxheWVyOjpuZXR3b3JrU3RhdGVDaGFuZ2VkKCkKIHsKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL01lZGlhUGxheWVyLmgJKHJldmlzaW9uIDcxMDM5KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNzYs
NiArMjc2LDggQEAgcHVibGljOgogCiAgICAgZmxvYXQgbWVkaWFUaW1lRm9yVGltZVZhbHVlKGZs
b2F0KSBjb25zdDsKIAorICAgIGRvdWJsZSBtYXhpbXVtRHVyYXRpb25Ub0NhY2hlTW92aWVUaW1l
KCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXJDbGllbnQq
KTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllclByaXZhdGUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL01lZGlhUGxheWVyUHJp
dmF0ZS5oCShyZXZpc2lvbiA3MTAzOSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvTWVk
aWFQbGF5ZXJQcml2YXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyOSw2ICsxMjksMTEgQEAgcHVi
bGljOgogICAgIC8vIGVuZ2luZSB1c2VzIHJhdGlvbmFsIG51bWJlcnMgdG8gcmVwcmVzZW50IG1l
ZGlhIHRpbWUuCiAgICAgdmlydHVhbCBmbG9hdCBtZWRpYVRpbWVGb3JUaW1lVmFsdWUoZmxvYXQg
dGltZVZhbHVlKSBjb25zdCB7IHJldHVybiB0aW1lVmFsdWU7IH0KIAorICAgIC8vIE92ZXJpZGUg
dGhpcyBpZiBpdCBpcyBzYWZlIGZvciBIVE1MTWVkaWFFbGVtZW50IHRvIGNhY2hlIG1vdmllIHRp
bWUgYW5kIHJlcG9ydAorICAgIC8vICdjdXJyZW50VGltZScgYXMgW2NhY2hlZCB0aW1lICsgZWxh
cHNlZCB3YWxsIHRpbWVdLiBSZXR1cm5zIHRoZSBtYXhpbXVtIHdhbGwgdGltZQorICAgIC8vIGl0
IGlzIE9LIHRvIGNhbGN1bGF0ZSBtb3ZpZSB0aW1lIGJlZm9yZSByZWZyZXNoaW5nIHRoZSBjYWNo
ZWQgdGltZS4KKyAgICB2aXJ0dWFsIGRvdWJsZSBtYXhpbXVtRHVyYXRpb25Ub0NhY2hlTW92aWVU
aW1lKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCiB9OwogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9NZWRpYVBsYXllclByaXZhdGVRVEtpdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL01lZGlhUGxheWVyUHJpdmF0ZVFUS2l0LmgJ
KHJldmlzaW9uIDcxMDM5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvTWVkaWFQ
bGF5ZXJQcml2YXRlUVRLaXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTc1LDYgKzE3NSw4IEBAIHBy
aXZhdGU6CiAgICAgCiAgICAgdmlydHVhbCBmbG9hdCBtZWRpYVRpbWVGb3JUaW1lVmFsdWUoZmxv
YXQpIGNvbnN0OwogCisgICAgdmlydHVhbCBkb3VibGUgbWF4aW11bUR1cmF0aW9uVG9DYWNoZU1v
dmllVGltZSgpIGNvbnN0IHsgcmV0dXJuIDU7IH0KKwogICAgIE1lZGlhUGxheWVyKiBtX3BsYXll
cjsKICAgICBSZXRhaW5QdHI8UVRNb3ZpZT4gbV9xdE1vdmllOwogICAgIFJldGFpblB0cjxRVE1v
dmllVmlldz4gbV9xdE1vdmllVmlldzsK
</data>
<flag name="review"
          id="63325"
          type_id="1"
          status="+"
          setter="koivisto"
    />
          </attachment>
      

    </bug>

</bugzilla>