Files
shiny/reference/modalDialog.html
2025-12-09 21:32:58 +00:00

249 lines
24 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<!-- Generated by pkgdown: do not edit by hand --><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Create a modal dialog UI — modalDialog • shiny</title><!-- jquery --><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script><!-- Bootstrap --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha256-bZLfwXAP04zRMK2BjiO8iu9pf4FbLqX6zitd+tIvLhE=" crossorigin="anonymous"><script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha256-nuL8/2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL+1ev4=" crossorigin="anonymous"></script><!-- bootstrap-toc --><link rel="stylesheet" href="../bootstrap-toc.css"><script src="../bootstrap-toc.js"></script><!-- Font Awesome icons --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css" integrity="sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=" crossorigin="anonymous"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css" integrity="sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=" crossorigin="anonymous"><!-- clipboard.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=" crossorigin="anonymous"></script><!-- headroom.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js" integrity="sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script><!-- pkgdown --><link href="../pkgdown.css" rel="stylesheet"><script src="../pkgdown.js"></script><meta property="og:title" content="Create a modal dialog UI — modalDialog"><meta property="og:description" content="modalDialog() creates the UI for a modal dialog, using Bootstrap's modal
class. Modals are typically used for showing important messages, or for
presenting UI that requires input from the user, such as a user name and
password input.
modalButton() creates a button that will dismiss the dialog when clicked,
typically used when customising the footer."><meta property="og:image" content="/logo.png"><!-- mathjax --><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script><!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]--></head><body data-spy="scroll" data-target="#toc">
<div class="container template-reference-topic">
<header><div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<span class="navbar-brand">
<a class="navbar-link" href="../index.html">shiny</a>
<span class="version label label-default" data-toggle="tooltip" data-placement="bottom" title="">1.12.1</span>
</span>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav"><li>
<a href="../reference/index.html">Reference</a>
</li>
<li>
<a href="../news/index.html">Changelog</a>
</li>
</ul><ul class="nav navbar-nav navbar-right"><li>
<a href="https://github.com/rstudio/shiny/" class="external-link">
<span class="fab fa-github fa-lg"></span>
</a>
</li>
</ul></div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
</header><div class="row">
<div class="col-md-9 contents">
<div class="page-header">
<h1>Create a modal dialog UI</h1>
<small class="dont-index">Source: <a href="https://github.com/rstudio/shiny/blob/rc-v1.12.1/R/modal.R" class="external-link"><code>R/modal.R</code></a></small>
<div class="hidden name"><code>modalDialog.Rd</code></div>
</div>
<div class="ref-description">
<p><code>modalDialog()</code> creates the UI for a modal dialog, using Bootstrap's modal
class. Modals are typically used for showing important messages, or for
presenting UI that requires input from the user, such as a user name and
password input.</p>
<p><code>modalButton()</code> creates a button that will dismiss the dialog when clicked,
typically used when customising the <code>footer</code>.</p>
</div>
<div id="ref-usage">
<div class="sourceCode"><pre class="sourceCode r"><code><span><span class="fu">modalDialog</span><span class="op">(</span></span>
<span> <span class="va">...</span>,</span>
<span> title <span class="op">=</span> <span class="cn">NULL</span>,</span>
<span> footer <span class="op">=</span> <span class="fu">modalButton</span><span class="op">(</span><span class="st">"Dismiss"</span><span class="op">)</span>,</span>
<span> size <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/c.html" class="external-link">c</a></span><span class="op">(</span><span class="st">"m"</span>, <span class="st">"s"</span>, <span class="st">"l"</span>, <span class="st">"xl"</span><span class="op">)</span>,</span>
<span> easyClose <span class="op">=</span> <span class="cn">FALSE</span>,</span>
<span> fade <span class="op">=</span> <span class="cn">TRUE</span></span>
<span><span class="op">)</span></span>
<span></span>
<span><span class="fu">modalButton</span><span class="op">(</span><span class="va">label</span>, icon <span class="op">=</span> <span class="cn">NULL</span><span class="op">)</span></span></code></pre></div>
</div>
<div id="arguments">
<h2>Arguments</h2>
<dl><dt id="arg--">...<a class="anchor" aria-label="anchor" href="#arg--"></a></dt>
<dd><p>UI elements for the body of the modal dialog box.</p></dd>
<dt id="arg-title">title<a class="anchor" aria-label="anchor" href="#arg-title"></a></dt>
<dd><p>An optional title for the dialog.</p></dd>
<dt id="arg-footer">footer<a class="anchor" aria-label="anchor" href="#arg-footer"></a></dt>
<dd><p>UI for footer. Use <code>NULL</code> for no footer.</p></dd>
<dt id="arg-size">size<a class="anchor" aria-label="anchor" href="#arg-size"></a></dt>
<dd><p>One of <code>"s"</code> for small, <code>"m"</code> (the default) for medium,
<code>"l"</code> for large, or <code>"xl"</code> for extra large. Note that <code>"xl"</code> only
works with Bootstrap 4 and above (to opt-in to Bootstrap 4+,
pass <code><a href="https://rstudio.github.io/bslib/reference/bs_theme.html" class="external-link">bslib::bs_theme()</a></code> to the <code>theme</code> argument of a page container
like <code><a href="fluidPage.html">fluidPage()</a></code>).</p></dd>
<dt id="arg-easyclose">easyClose<a class="anchor" aria-label="anchor" href="#arg-easyclose"></a></dt>
<dd><p>If <code>TRUE</code>, the modal dialog can be dismissed by
clicking outside the dialog box, or be pressing the Escape key. If
<code>FALSE</code> (the default), the modal dialog can't be dismissed in those
ways; instead it must be dismissed by clicking on a <code>modalButton()</code>, or
from a call to <code><a href="showModal.html">removeModal()</a></code> on the server.</p></dd>
<dt id="arg-fade">fade<a class="anchor" aria-label="anchor" href="#arg-fade"></a></dt>
<dd><p>If <code>FALSE</code>, the modal dialog will have no fade-in animation
(it will simply appear rather than fade in to view).</p></dd>
<dt id="arg-label">label<a class="anchor" aria-label="anchor" href="#arg-label"></a></dt>
<dd><p>The contents of the button or linkusually a text label, but
you could also use any other HTML, like an image.</p></dd>
<dt id="arg-icon">icon<a class="anchor" aria-label="anchor" href="#arg-icon"></a></dt>
<dd><p>An optional <code><a href="icon.html">icon()</a></code> to appear on the button.</p></dd>
</dl></div>
<div id="ref-examples">
<h2>Examples</h2>
<div class="sourceCode"><pre class="sourceCode r"><code><span class="r-in"><span><span class="kw">if</span> <span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/interactive.html" class="external-link">interactive</a></span><span class="op">(</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span><span class="co"># Display an important message that can be dismissed only by clicking the</span></span></span>
<span class="r-in"><span><span class="co"># dismiss button.</span></span></span>
<span class="r-in"><span><span class="fu"><a href="shinyApp.html">shinyApp</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> ui <span class="op">=</span> <span class="fu"><a href="bootstrapPage.html">basicPage</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="actionButton.html">actionButton</a></span><span class="op">(</span><span class="st">"show"</span>, <span class="st">"Show modal dialog"</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">)</span>,</span></span>
<span class="r-in"><span> server <span class="op">=</span> <span class="kw">function</span><span class="op">(</span><span class="va">input</span>, <span class="va">output</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="observeEvent.html">observeEvent</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">show</span>, <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="showModal.html">showModal</a></span><span class="op">(</span><span class="fu">modalDialog</span><span class="op">(</span></span></span>
<span class="r-in"><span> title <span class="op">=</span> <span class="st">"Important message"</span>,</span></span>
<span class="r-in"><span> <span class="st">"This is an important message!"</span></span></span>
<span class="r-in"><span> <span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># Display a message that can be dismissed by clicking outside the modal dialog,</span></span></span>
<span class="r-in"><span><span class="co"># or by pressing Esc.</span></span></span>
<span class="r-in"><span><span class="fu"><a href="shinyApp.html">shinyApp</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> ui <span class="op">=</span> <span class="fu"><a href="bootstrapPage.html">basicPage</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="actionButton.html">actionButton</a></span><span class="op">(</span><span class="st">"show"</span>, <span class="st">"Show modal dialog"</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">)</span>,</span></span>
<span class="r-in"><span> server <span class="op">=</span> <span class="kw">function</span><span class="op">(</span><span class="va">input</span>, <span class="va">output</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="observeEvent.html">observeEvent</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">show</span>, <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="showModal.html">showModal</a></span><span class="op">(</span><span class="fu">modalDialog</span><span class="op">(</span></span></span>
<span class="r-in"><span> title <span class="op">=</span> <span class="st">"Somewhat important message"</span>,</span></span>
<span class="r-in"><span> <span class="st">"This is a somewhat important message."</span>,</span></span>
<span class="r-in"><span> easyClose <span class="op">=</span> <span class="cn">TRUE</span>,</span></span>
<span class="r-in"><span> footer <span class="op">=</span> <span class="cn">NULL</span></span></span>
<span class="r-in"><span> <span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># Display a modal that requires valid input before continuing.</span></span></span>
<span class="r-in"><span><span class="fu"><a href="shinyApp.html">shinyApp</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> ui <span class="op">=</span> <span class="fu"><a href="bootstrapPage.html">basicPage</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="actionButton.html">actionButton</a></span><span class="op">(</span><span class="st">"show"</span>, <span class="st">"Show modal dialog"</span><span class="op">)</span>,</span></span>
<span class="r-in"><span> <span class="fu"><a href="textOutput.html">verbatimTextOutput</a></span><span class="op">(</span><span class="st">"dataInfo"</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">)</span>,</span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span> server <span class="op">=</span> <span class="kw">function</span><span class="op">(</span><span class="va">input</span>, <span class="va">output</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="co"># reactiveValues object for storing current data set.</span></span></span>
<span class="r-in"><span> <span class="va">vals</span> <span class="op">&lt;-</span> <span class="fu"><a href="reactiveValues.html">reactiveValues</a></span><span class="op">(</span>data <span class="op">=</span> <span class="cn">NULL</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span> <span class="co"># Return the UI for a modal dialog with data selection input. If 'failed' is</span></span></span>
<span class="r-in"><span> <span class="co"># TRUE, then display a message that the previous value was invalid.</span></span></span>
<span class="r-in"><span> <span class="va">dataModal</span> <span class="op">&lt;-</span> <span class="kw">function</span><span class="op">(</span><span class="va">failed</span> <span class="op">=</span> <span class="cn">FALSE</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu">modalDialog</span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="textInput.html">textInput</a></span><span class="op">(</span><span class="st">"dataset"</span>, <span class="st">"Choose data set"</span>,</span></span>
<span class="r-in"><span> placeholder <span class="op">=</span> <span class="st">'Try "mtcars" or "abc"'</span></span></span>
<span class="r-in"><span> <span class="op">)</span>,</span></span>
<span class="r-in"><span> <span class="fu"><a href="https://rstudio.github.io/htmltools/reference/builder.html" class="external-link">span</a></span><span class="op">(</span><span class="st">'(Try the name of a valid data object like "mtcars", '</span>,</span></span>
<span class="r-in"><span> <span class="st">'then a name of a non-existent object like "abc")'</span><span class="op">)</span>,</span></span>
<span class="r-in"><span> <span class="kw">if</span> <span class="op">(</span><span class="va">failed</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="https://rstudio.github.io/htmltools/reference/builder.html" class="external-link">div</a></span><span class="op">(</span><span class="va">tags</span><span class="op">$</span><span class="fu">b</span><span class="op">(</span><span class="st">"Invalid name of data object"</span>, style <span class="op">=</span> <span class="st">"color: red;"</span><span class="op">)</span><span class="op">)</span>,</span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span> footer <span class="op">=</span> <span class="fu"><a href="https://rstudio.github.io/htmltools/reference/tagList.html" class="external-link">tagList</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="fu">modalButton</span><span class="op">(</span><span class="st">"Cancel"</span><span class="op">)</span>,</span></span>
<span class="r-in"><span> <span class="fu"><a href="actionButton.html">actionButton</a></span><span class="op">(</span><span class="st">"ok"</span>, <span class="st">"OK"</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span> <span class="co"># Show modal when button is clicked.</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="observeEvent.html">observeEvent</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">show</span>, <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="showModal.html">showModal</a></span><span class="op">(</span><span class="fu">dataModal</span><span class="op">(</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span> <span class="co"># When OK button is pressed, attempt to load the data set. If successful,</span></span></span>
<span class="r-in"><span> <span class="co"># remove the modal. If not show another modal, but this time with a failure</span></span></span>
<span class="r-in"><span> <span class="co"># message.</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="observeEvent.html">observeEvent</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">ok</span>, <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="co"># Check that data object exists and is data frame.</span></span></span>
<span class="r-in"><span> <span class="kw">if</span> <span class="op">(</span><span class="op">!</span><span class="fu"><a href="https://rdrr.io/r/base/NULL.html" class="external-link">is.null</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">dataset</span><span class="op">)</span> <span class="op">&amp;&amp;</span> <span class="fu"><a href="https://rdrr.io/r/base/nchar.html" class="external-link">nzchar</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">dataset</span><span class="op">)</span> <span class="op">&amp;&amp;</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="https://rdrr.io/r/base/exists.html" class="external-link">exists</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">dataset</span><span class="op">)</span> <span class="op">&amp;&amp;</span> <span class="fu"><a href="https://rdrr.io/r/base/as.data.frame.html" class="external-link">is.data.frame</a></span><span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/get.html" class="external-link">get</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">dataset</span><span class="op">)</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="va">vals</span><span class="op">$</span><span class="va">data</span> <span class="op">&lt;-</span> <span class="fu"><a href="https://rdrr.io/r/base/get.html" class="external-link">get</a></span><span class="op">(</span><span class="va">input</span><span class="op">$</span><span class="va">dataset</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="showModal.html">removeModal</a></span><span class="op">(</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span> <span class="kw">else</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="showModal.html">showModal</a></span><span class="op">(</span><span class="fu">dataModal</span><span class="op">(</span>failed <span class="op">=</span> <span class="cn">TRUE</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span> <span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span> <span class="co"># Display information about selected data</span></span></span>
<span class="r-in"><span> <span class="va">output</span><span class="op">$</span><span class="va">dataInfo</span> <span class="op">&lt;-</span> <span class="fu"><a href="renderPrint.html">renderPrint</a></span><span class="op">(</span><span class="op">{</span></span></span>
<span class="r-in"><span> <span class="kw">if</span> <span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/NULL.html" class="external-link">is.null</a></span><span class="op">(</span><span class="va">vals</span><span class="op">$</span><span class="va">data</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="st">"No data selected"</span></span></span>
<span class="r-in"><span> <span class="kw">else</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="https://rdrr.io/r/base/summary.html" class="external-link">summary</a></span><span class="op">(</span><span class="va">vals</span><span class="op">$</span><span class="va">data</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="op">}</span></span></span>
</code></pre></div>
</div>
</div>
<div class="col-md-3 hidden-xs hidden-sm" id="pkgdown-sidebar">
<nav id="toc" data-toggle="toc" class="sticky-top"><h2 data-toc-skip>Contents</h2>
</nav></div>
</div>
<footer><div class="copyright">
<p></p><p>Developed by Winston Chang, Joe Cheng, JJ Allaire, Carson Sievert, Barret Schloerke, Garrick Aden-Buie, Yihui Xie, Jeff Allen, Jonathan McPherson, Alan Dipert, Barbara Borges, Posit Software, PBC.</p>
</div>
<div class="pkgdown">
<p></p><p>Site built with <a href="https://pkgdown.r-lib.org/" class="external-link">pkgdown</a> 2.2.0.</p>
</div>
</footer></div>
</body></html>