/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
<h1>Health Check @escape($name) at @escape($lastCheckTimestamp)</h1>

@if($message,inline:<div class="error">@escape($message)</div>)

<div>
  <h2>State</h2>
  <div class="health-check-state health-check-@lowercase($lastCheck.state)">
    <span>$lastCheck.state</span>
  </div>

  <h2>Data</h2>
  <table>
    <thead>
      <tr><th>Name</th><th>Value</th></tr>
    </thead>
    <tbody>
      @each($lastCheck.data,inline:<tr><td>$$value.key</td><td>$$value.value</td></tr>)
    </tbody>
  </table>
</div>
