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

.modal.modal--ignite.theme--ignite.center(role='dialog')
    .modal-dialog
        .modal-content
            #errors-container.modal-header.header
                button.close(ng-click='close()' aria-hidden='true')
                    svg(ignite-icon="cross")
                h4.modal-title
                    svg(ignite-icon="attention")
                    | {{title}}
            .modal-body
                div(ng-bind-html='message')

                div(ng-hide='hasAgents')
                    h4
                        i.fa.fa-download.fa-cursor-default
                        | &nbsp;How To Start Demo
                    ul
                        li
                            a(ng-href='{{downloadAgentHref}}' target='_self') #[b Download]
                            | &nbsp; and unzip ignite-web-agent archive
                        li #[b Run] shell file ignite-web-agent.{sh|bat}

                div(ng-hide='!hasAgents')
                    h4
                        i.fa.fa-star-o.fa-cursor-default
                        | &nbsp;Start Demo
                    ul
                        li Web Agent is already started
                        li Close dialog and try Web Console

            .modal-footer
                .ng-animate-disabled(ng-if='!hasAgents')
                    button.btn-ignite.btn-ignite--link-success(ng-click='close()') Close
                    a.btn-ignite.btn-ignite--success(ng-href='{{downloadAgentHref}}' target='_self') Download agent

                .ng-animate-disabled(ng-if='hasAgents')
                    button.btn-ignite.btn-ignite--success(ng-click='close()') Close
