
<!DOCTYPE html>

<html lang="en">
<meta charset="utf-8">
<meta name="google" value="notranslate">
<title>
  
      Pending
    
    -
     2fb1b35e1da25710
</title>
<link rel="stylesheet" href="/static/buildbot/css/default.css" type="text/css">
<link rel="stylesheet" href="/static/common/third_party/css/jquery-ui.min.css" type="text/css">
<link rel="stylesheet" href="/static/common/third_party/css/vis.min.css" type="text/css">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="LUCI" />
<script src="/static/common/third_party/js/moment-with-locales.min.js"></script>
<script src="/static/common/third_party/js/moment-timezone-with-data-2012-2022.min.js"></script>
<script src="/static/common/js/time.js"></script>
<script src="/static/common/third_party/js/jquery.min.js"></script>
<script src="/static/common/third_party/js/jquery-ui.min.js"></script>
<script src="/static/common/third_party/js/vis-custom.min.js"></script>

<link id="favicon" rel="shortcut icon" type="image/png" href="/static/common/favicon/gray-32.png">


<script>
  const useTabs = false;
</script>
<script src="/static/common/js/build.js"></script>
<link rel="stylesheet" href="/static/common/css/tabs.css" type="text/css">


<body class="interface">
  <header>
    <div>
      <a href="/" aria-label="Home page">Home</a> |
      <a href="/search" aria-label="Search page">Search</a>
    </div>
    <div>
      
        <a href="http://fake.example.com/login?dest=%2Ffoobar" alt="Login">Login</a>
      
    </div>
  </header>
  <hr>
  
  <div class="content">
    <h1>
    
    Build <a>2fb1b35e1da25710</a>
    
    
    </h1>

    <div id="tabs" style="display: none;">
      <ul>
        <li><a href="#overview-tab">Overview</a></li>
      </ul>
      <div id="overview-tab">
        
  <div id="results" class="column">
    <h2>Results:</h2>
    
      <p class="result status-NotRun">
      
        Pending
      
      </p>
     

      

    
    <h2>Execution:</h2>
    <ul>
      
      <li>
        Source:
        <a href="https://example.com/task?id=2fb1b35e1da25710&amp;show_raw=1&amp;wide_logs=true"
           aria-label="Source for Task 2fb1b35e1da25710">
          Task 2fb1b35e1da25710
        </a>
      </li>
      

      

      
    </ul>
     

    

     

  </div>

        
  <div id="properties" class="column">
    <h2>Build Properties:</h2>

    <table class="info BuildProperties" width="100%">
    <tr><th>Name</th><th>Value</th><th>Source</th></tr>

      
      
        
      
    </table>

    

    <h2>Timing:</h2>
    <table class="info" width="100%">
      <tr class="alt"><td class="left">Create</td>
      <td>
        <span class="local-time " data-timestamp="1457950785146">Monday, 14-Mar-16 10:19:45 UTC</span>
      </td></tr>
      <tr><td class="left">Start</td>
      <td>
        N/A
      </td></tr>
      <tr class="alt"><td class="left">End</td>
      <td>
        N/A
      </td></tr>
      <tr><td class="left">Pending</td>
      <td id="duration">
        
          40 mins 14 secs
        
      </td></tr>
      <tr class="alt"><td class="left">Execution</td>
      <td id="duration">
        
          N/A
        
      </td></tr>
    </table>

  </div>

        
  <div id="changes" class="column">
    
  </div>

      </div>
    </div>
  </div>

  <footer>
    <hr>
      <div><img class="lucy-logo" src="https://storage.googleapis.com/chrome-infra/lucy-small.png"></div>
      <div>
        <a href="https://chromium.googlesource.com/infra/luci">LUCI</a><br>
        built: <b><span class="local-time " data-timestamp="-6792498672871">Saturday, 03-Feb-01 04:05:06 UTC</span></b><br>
        version: <b>testVersionID</b><br>
      </div>
  </footer>
</body>
<script>
$(function () {
  'use strict';
  
  setTimeout(function() {
    milo.makeTimesLocal();
    milo.annotateDurations();
  }, 0);
  $(document).tooltip({
    show: false,
    hide: false
  });
});
</script>
<script>
  (function(i,s,o,g,r,a,m){i['CrDXObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://storage.googleapis.com/crdx-feedback.appspot.com/feedback.js','crdx');

  crdx('setFeedbackButtonLink', 'https://bugs.chromium.org/p/chromium/issues/entry?components=Infra%3EPlatform%3EMilo');

(function(window) {
  let lastWindowScrollTop = window.scrollY;

  function debounce(f, wait) {
    let timeout;
    return function(...args) {
      if (timeout) {
        clearTimeout(timeout);
      }
      timeout = setTimeout(() => {
        f(...args);
        timeout = null;
      }, wait);
    };
  }

  window.addEventListener('scroll', debounce(function(evt) {
    const delta = window.scrollY - lastWindowScrollTop;
    lastWindowScrollTop = window.scrollY;
    const absDelta = Math.abs(delta);
    const category = window.location.pathname.split('/').slice(0, 2).join('/');
    ga('send', 'event', category, 'scroll-abs', '', absDelta);
    if (delta > 0) {
      ga('send', 'event', category, 'scroll-down', '', absDelta);
    } else {
      ga('send', 'event', category, 'scroll-up', '', absDelta);
    }
  }, 250));
})(window);
</script>

<script>
setTimeout(function() {
	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

	ga('create', 'UA-12345-01', 'auto');
	ga('send', 'pageview');
}, 0);
</script>

</html>
