/*
 * 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.
 */

* {
    margin: 0px;
    padding: 0px;
}

body {
    font-family: Arial, Tahoma, Helvetica;
    font-size: 10pt;
    font-weight: normal;
    color: #303942;
    background-color: #fff;
}

h1 {
    font-size: 13pt;
    font-weight: bold;
    color: #37414a;
    margin-bottom: 30px;
}

div.topLevel {
    display: none;
    margin: 40px 76px 0 76px;
}

.perex {
    font-weight: bold;
    color: #000;
    margin-bottom: 20px;
}

.body {
    color: #37414a;
    margin-bottom: 20px;
}

#mainIco {
    position: absolute;
    left: 13px;
    top: 13px;
}

#buttons {
    position: relative;
    height: 61px;
    margin: 0;
}

#doNotShowAgain {
    position: absolute;
    height: 13px;
    left: 13px;
    bottom: 13px;
    font-size: 9pt;
}
#doNotShowAgain input {
    position: absolute;
    top: 1px;
}
#doNotShowAgain label {
    margin-left: 22px;
}

#okButton {
    position: absolute;
    bottom: 13px;
    right: 13px;
    min-width: 45px;
    height: 27px;
}
