Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 13

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.

or
g/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<!-Network Calculator
Copyright (c) 2007 by Ildar Shaimordanov
-->
<head>
<HTA:APPLICATION ID="oHTA"
APPLICATIONNAME="Network Calculator"
BORDER="dialog"
BORDERSTYLE="normal"
CAPTION="yes"
CONTEXTMENU="yes"
ICON=""
INNERBORDER="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="yes"
NAVIGABLE="no"
SCROLL="no"
SCROLLFLAT="no"
SELECTION="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="normal" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Network Calculator</title>
<style type="text/css">
/**
*
* Common styles
*
*/
*
{
font-family: Verdana, Tahoma, Helvetica, sans-serif;
font-size: 12px;
}
body
{
margin: 0;
padding: 0;
}
#body {
background-color: #ccc;
height: 500px;
padding-left: 1px;
padding-right: 1px;
width: 500px;
}
#body #hostNetworkContainer
{
background-color: #ccc;

border: 2px outset #ccc;


position: absolute;
left: 142px;
top: 135px;
width: 200px;
}
#body #hostNetworkContainer select
font-family: sans-serif;
font-size: 11px;
width: 100%;
}
#body #netmaskMapContainer
{
background-color: #ccc;
border: 2px outset #ccc;
position: absolute;
left: 162px;
top: 135px;
width: 180px;
}
#body #netmaskMapContainer select
font-family: sans-serif;
font-size: 11px;
margin: 0;
width: 100%;
}
form#netCalc
{
margin: 0;
}
form#netCalc h1 {
font-size: 1.2em;
margin: 0;
}
form#netCalc fieldset {
padding: 5px;
}
form#netCalc .leftPanel {
float: left;
width: 50%;
}
form#netCalc .rightPanel
{
margin-left: 50%;
}
form#netCalc label,
form#netCalc .label
{
float: left;
margin-right: 3px;
text-align: right;
width: 85px;
}
form#netCalc input
{
font-family: sans-serif;
font-size: 11px;
margin: 0;
width: 145px;
}
form#netCalc input.longinput
{
width: 234px;
}

form#netCalc input.netClass
{
border: 1px solid #999;
font-family: 'Courier New';
font-size: 10px;
font-weight: bold;
height: 20px;
width: 20px;
}
form#netCalc select
{
margin-left: 33px;
width: 110px;
}
</style>
<script type="text/javascript"><!-//js/NetIP.js
function NetIP(){var privates={address:0,bitmask:24,network:0};this.getPrivates=
function(){return privates;};var ip=arguments[0];var pos;var addr;var mask;if(ip
&&ip.constructor==NetIP){addr=ip.getAddress();mask=ip.getBitmask();}else if(ip&&
ip.constructor==Array){addr=ip[0];mask=ip[1];}else if(ip&&ip.constructor==String
&&(pos=ip.indexOf('/'))!=-1){addr=ip.substr(0,pos);mask=ip.substr(pos+1);}else{a
ddr=arguments[0]||privates.address;mask=arguments[1]||privates.bitmask;}this.set
Address(addr);if(NetIP.isBitmask(mask)){this.setBitmask(mask);}else{this.setNetm
ask(mask);}};NetIP.netmaskMap=[0x00000000,0x80000000,0xC0000000,0xE0000000,0xF00
00000,0xF8000000,0xFC000000,0xFE000000,0xFF000000,0xFF800000,0xFFC00000,0xFFE000
00,0xFFF00000,0xFFF80000,0xFFFC0000,0xFFFE0000,0xFFFF0000,0xFFFF8000,0xFFFFC000,
0xFFFFE000,0xFFFFF000,0xFFFFF800,0xFFFFFC00,0xFFFFFE00,0xFFFFFF00,0xFFFFFF80,0xF
FFFFFC0,0xFFFFFFE0,0xFFFFFFF0,0xFFFFFFF8,0xFFFFFFFC,0xFFFFFFFE,0xFFFFFFFF];NetIP
.atoi=function(value){var bytes=String(value).split('.');var result=0;for(var i=
0;i<bytes.length;i++){result=result*0x100+Number(bytes[i]);}return result;};NetI
P.isBitmask=function(value){var bitmask=parseInt(value);return bitmask==value&&b
itmask>=1&&bitmask<=32;};NetIP.isIP=function(value){return!!String(value).match(
/^\s*(?:([01]?\d\d?|2[0-4]\d|25[0-5])\.)(?:([01]?\d\d?|2[0-4]\d|25[0-5])\.)(?:([
01]?\d\d?|2[0-4]\d|25[0-5])\.)([01]?\d\d?|2[0-4]\d|25[0-5])\s*$/);};NetIP.isNetm
ask=function(value){if(!NetIP.isIP(value)){return false;}if(typeof value=='strin
g'){value=NetIP.atoi(value);}var ip=new NetIP();ip.setNetmask(value);return valu
e==ip.getNetmask()||value==ip.getNetmask(true);};NetIP.itoa=function(value,radix
){var padding;switch(radix){case 2:padding="00000000";break;case 8:padding="000"
;break;case 16:padding="00";break;default:padding="";radix=10;}value=Number(valu
e);var bytes=[((value>>>0x18)&0xff),((value>>>0x10)&0xff),((value>>>0x08)&0xff),
(value&0xff)];for(var i=0;i<bytes.length;i++){bytes[i]=(padding+bytes[i].toStrin
g(radix).toUpperCase()).slice(-padding.length);}return bytes.join('.');};NetIP.p
rototype.contains=function(value){var ip=new NetIP(value);return ip.getAddress()
>=this.getNetwork()&&ip.getAddress()<=this.getBroadcast();};NetIP.prototype.equa
ls=function(value){var ip=new NetIP(value);return ip.getAddress()==this.getAddre
ss();};NetIP.prototype.getAddress=function(){return this.getPrivates().address;}
;NetIP.prototype.getBitmask=function(){return this.getPrivates().bitmask;};NetIP
.prototype.getBroadcast=function(){return this.getNetwork()+this.getNetmask(true
);};NetIP.prototype.getFirstAddress=function(){return this.getNetwork()+1;};NetI
P.prototype.getLastAddress=function(){return this.getBroadcast()-1;};NetIP.proto
type.getNetmask=function(inverse){var mask=NetIP.netmaskMap[this.getBitmask()];r
eturn inverse?mask^0xffffffff:mask;};NetIP.prototype.getNetwork=function(){retur
n this.getPrivates().network;};NetIP.prototype.length=function(){var count=this.
getBroadcast()-this.getFirstAddress();return count<0?0:count;};(function(){var a
djustNetwork=function(ip){var p=ip.getPrivates();p.network=ip.getAddress()&ip.ge
tNetmask();if(p.network<0){p.network+=0x100000000;}};NetIP.prototype.setAddress=
function(value){if(NetIP.isIP(value)){value=NetIP.atoi(value);}this.getPrivates(
).address=Number(value);adjustNetwork(this);};NetIP.prototype.setBitmask=functio

n(value){if(String(value).match(/^\/\d+$/)){value=value.substr(1);}if(!NetIP.isB
itmask(value)){return;}this.getPrivates().bitmask=Number(value);adjustNetwork(th
is);};})();NetIP.prototype.setNetmask=function(value){if(NetIP.isIP(value)){valu
e=NetIP.atoi(value);}if(value<NetIP.netmaskMap[1]){value^=0xffffffff;}if(value<0
){value+=0x100000000;}var i=NetIP.netmaskMap.length-1;while(i&&NetIP.netmaskMap[
i]!=value){i--;}this.setBitmask(i);};NetIP.prototype.toString=function(netmask){
return NetIP.itoa(this.getAddress())+'/'+(netmask?NetIP.itoa(this.getNetmask()):
this.getBitmask());};
--></script>
<script type="text/javascript">
(function()
{
function netCalc()
{
var element = document.getElementById('addr');
var addr = element.value;
if ( ! NetIP.isIP(addr) ) {
alert('Illegal IP address');
element.focus();
element.select();
return;
}
var element = document.getElementById('mask');
var mask = element.value;
if ( ! NetIP.isBitmask(mask) && ! NetIP.isNetmask(mask) ) {
alert('Illegal netmask or bitmask');
element.focus();
element.select();
return;
}
var radix = [2, 8, 10, 16][document.getElementById('radix').selectedInde
x];
var ip = new NetIP(addr, mask);
// Address frame
document.getElementById('address').value = NetIP.itoa(ip.getAddress());
document.getElementById('netmaskd').value = NetIP.itoa(ip.getNetmask());
document.getElementById('netmaski').value = NetIP.itoa(ip.getNetmask(tru
e));
document.getElementById('bitmask').value = ip.getBitmask();
if ( radix == 10 ) {
document.getElementById('address_').value = ip.getAddress();
document.getElementById('netmaskd_').value = ip.getNetmask();
document.getElementById('netmaski_').value = ip.getNetmask(true)
;
} else {
document.getElementById('address_').value = NetIP.itoa(ip.getAdd
ress(), radix);
document.getElementById('netmaskd_').value = NetIP.itoa(ip.getNe
tmask(), radix);
document.getElementById('netmaski_').value = NetIP.itoa(ip.getNe
tmask(true), radix);
}

// Network frame
document.getElementById('network').value = NetIP.itoa(ip.getNetwork());
document.getElementById('address1').value = NetIP.itoa(ip.getFirstAddres
s());
document.getElementById('addressN').value = NetIP.itoa(ip.getLastAddress
());
document.getElementById('broadcast').value = NetIP.itoa(ip.getBroadcast(
));
document.getElementById('length').value = ip.length();
document.getElementById('length_').value = [NetIP.itoa(ip.getFirstAddres
s()), NetIP.itoa(ip.getLastAddress())].join(' - ');
if ( radix == 10 ) {
document.getElementById('network_').value = ip.getNetwork();
document.getElementById('address1_').value = ip.getFirstAddress(
);
document.getElementById('addressN_').value = ip.getLastAddress()
;
document.getElementById('broadcast_').value = ip.getBroadcast();
} else {
document.getElementById('network_').value = NetIP.itoa(ip.getNet
work(), radix);
document.getElementById('address1_').value = NetIP.itoa(ip.getFi
rstAddress(), radix);
document.getElementById('addressN_').value = NetIP.itoa(ip.getLa
stAddress(), radix);
document.getElementById('broadcast_').value = NetIP.itoa(ip.getB
roadcast(), radix);
}
};
function setNetmask(value)
{
document.getElementById('mask').value = value;
netCalc();
};
function setNetwork(addr, mask)
{
document.getElementById('addr').value = addr;
setNetmask(mask);
};
function showHostNetwork()
{
document.getElementById('hostNetworkContainer').style.display = '';
var hostNetwork = document.getElementById('hostNetwork');
hostNetwork.focus();
var notation = [document.getElementById('addr').value, document.getEleme
ntById('mask').value].join('/');
hostNetwork.options.selectedIndex = -1;
for (var i = 0; i < hostNetwork.options.length; i++) {
if ( hostNetwork.options[i].text.indexOf(notation) == 0 ) {
hostNetwork.options.selectedIndex = i;
break;
}

}
};
function hideHostNetwork()
{
document.getElementById('hostNetworkContainer').style.display = 'none';
var hostNetwork = document.getElementById('hostNetwork');
hostNetwork.blur();
// Hide only - called from the toggleXXX() routine
if ( arguments.length == 0 ) {
return;
}
if ( hostNetwork.options.selectedIndex == -1 ) {
return;
}
var notation = hostNetwork.options[hostNetwork.options.selectedIndex].te
xt.split('/');
setNetwork(notation[0], notation[1]);
};
function toggleHostNetwork()
{
if ( document.getElementById('hostNetworkContainer').style.display == ''
) {
hideHostNetwork();
} else {
showHostNetwork();
}
};
function selectNetmaskMap()
{
var netmaskMap = document.getElementById('netmaskMap');
var mask = document.getElementById('mask').value;
var isBitmask = NetIP.isBitmask(mask);
for (var i = 0; i < netmaskMap.options.length; i++) {
var text = netmaskMap.options[i].text;
if ( ! isBitmask && text.indexOf(mask) == 0 || isBitmask && text
.lastIndexOf(mask) == text.length - mask.length ) {
netmaskMap.options.selectedIndex = i;
break;
}
}
};
function showNetmaskMap()
{
document.getElementById('netmaskMapContainer').style.display = '';
var netmaskMap = document.getElementById('netmaskMap');
netmaskMap.focus();
selectNetmaskMap();
};
function hideNetmaskMap()

{
document.getElementById('netmaskMapContainer').style.display = 'none';
var netmaskMap = document.getElementById('netmaskMap');
netmaskMap.blur();
// Hide only - called from the toggleXXX() routine
if ( arguments.length == 0 ) {
return;
}
setNetmask(netmaskMap.options[netmaskMap.options.selectedIndex].text.spl
it(/\s+/)[0]);
};
function toggleNetmaskMap()
{
if ( document.getElementById('netmaskMapContainer').style.display == ''
) {
hideNetmaskMap();
} else {
showNetmaskMap();
}
};
function initWin(network)
{
// private-use network (RFC1918)
setNetwork('192.168.0.0', '255.255.255.0');
if ( document.attachEvent ) {
document.getElementById('radix').attachEvent('onchange', netCalc
);
document.getElementById('netmaskMap').attachEvent('onchange', hi
deNetmaskMap);
document.getElementById('hostNetwork').attachEvent('onchange', h
ideHostNetwork);
} else {
document.getElementById('radix').addEventListener('change', netC
alc, true);
document.getElementById('netmaskMap').addEventListener('change',
hideNetmaskMap, true);
document.getElementById('hostNetwork').addEventListener('change'
, hideHostNetwork, true);
}
};
/**
* Returns all network information as array of a [addr, mask] pair for Windows o
nly.
* This feature is experimental.
*
* @param
void
* @return
Array
* @access
Static
*/
NetIP.win32IPConfig = function()
{
var WMI = GetObject('WinMgmts:');
var sql = 'SELECT * FROM Win32_NetworkAdapterConfiguration';

var query = WMI.ExecQuery(sql);


var enumer = new Enumerator(query);
var result = [];
while ( ! enumer.atEnd() ) {
var adapter = enumer.item();
enumer.moveNext();
if ( adapter.IPAddress === null || adapter.IPSubnet === null ) {
continue;
}
var
var
var
for

addr = (new VBArray(adapter.IPAddress)).toArray();


mask = (new VBArray(adapter.IPSubnet)).toArray();
len = Math.min(addr.length, mask.length);
(var i = 0; i < len; i++) {
if ( ! addr[i] || ! mask[i] ) {
continue;
}
result[result.length] = [addr[i], mask[i]];

}
}
return result;
};
function initHta()
{
// 1.1. set the window size
var w = 508, h = 450;
//
window.moveTo((window.screen.width - w) / 2, (window.screen.heig
ht - h) / 2);
window.resizeTo(w, h);
// 2. create list of all available networks for this host
var hostNetwork = document.getElementById('hostNetwork');
var nets = NetIP.win32IPConfig();
for (var i = 0; i < nets.length; i++) {
var option = new Option(nets[i].join('/'));
hostNetwork.options[i] = option;
}
var network;
if ( nets.length ) {
network = nets[0];
}
// 3. initialize the frame of application or use private-use network (RF
C1918) internally
initWin();
// 4. first available network for this host
if ( nets.length ) {
setNetwork(nets[0][0], nets[0][1]);
}
// 5. Enables select of all networks
document.getElementById('hostNetworkButton').disabled = false;
};

function handleClick(e)
{
var e = e || event;
var target = e.target || e.srcElement;
if ( ! target || target.tagName.toUpperCase() != 'INPUT' || target.type.
toUpperCase() != 'BUTTON' || target.className != 'netClass' || target.disabled )
{
return;
}
switch (target.value) {
case '#':
hideNetmaskMap();
toggleHostNetwork();
target.blur();
break;
case 'Calculate':
netCalc();
target.blur();
break;
case 'A':
setNetmask('255.0.0.0');
selectNetmaskMap();
target.blur();
break;
case 'B':
setNetmask('255.255.0.0');
selectNetmaskMap();
target.blur();
break;
case 'C':
setNetmask('255.255.255.0');
selectNetmaskMap();
target.blur();
break;
case 'i':
hideHostNetwork();
toggleNetmaskMap();
target.blur();
break;
}
};
/**
* Handles keystrokes (for HTA only)
*
* @access
private
*/
function handleKeydown(e)
{
var e = e || event;
var target = e.target || e.srcElement;
// F5
if ( e.keyCode == 116 ) {
return false;
}
// Esc

if ( e.keyCode == 27 ) {
return false;
}
// Enter
if ( target && target.tagName.toUpperCase() == 'INPUT' && target.type.to
UpperCase() == 'TEXT' ) {
if ( e.keyCode == 13 ) {
netCalc();
return false;
}
}
};
if ( window.attachEvent ) {
if ( window.oHTA && oHTA.applicationName ) {
window.attachEvent('onload', initHta);
} else {
window.attachEvent('onload', initWin);
}
document.attachEvent('onclick', handleClick);
document.attachEvent('onkeydown', handleKeydown);
} else {
window.addEventListener('load', initWin, true);
window.addEventListener('click', handleClick, true);
window.addEventListener('keydown', handleKeydown, true);
}
})();
</script>
</head>
<body>
<div id="body">
<form action="" id="netCalc" onsubmit="return false">
<h1>Network Calculator</h1>
<div style="font-size: 9px;">Copyright &copy; 2007 by Ildar Shaimordanov</div>
<fieldset>
<legend>Request</legend>
<div style="font-size: 9px; padding: 10px 0;">Enter address and netmask in a dot
notation. It is available both direct and inverse netmask (like 255.255.255.0 a
nd 0.0.0.255). Enter bitmask as an integer value in range from 1 to 32.</div>
<div class="leftPanel">
<label for="addr">Address</label><input type="text" id="addr" value="" tabindex=
"1" title="Enter IP address" onfocus="this.select()" />
<label for="mask">Netmask</label><input type="text" id="mask" value="" tabindex=
"1" title="Enter netmask or bitmask" onfocus="this.select()" />
</div>
<div class="rightPanel">
<input type="button" class="netClass" id="hostNetworkButton" value="#" tabindex=
"32767" accesskey="N" title="Networks of this host" disabled="disabled" />
<input type="button" class="netClass" value="Calculate" tabindex="32767" title="
Calculate" style="width: 68px;" />
<div style="font-size: 2px;">&nbsp;</div>
<input type="button" class="netClass" value="A" tabindex="32767" accesskey="A" t

itle="Mask of subnet A" />


<input type="button" class="netClass" value="B" tabindex="32767" accesskey="B" t
itle="Mask of subnet B" />
<input type="button" class="netClass" value="C" tabindex="32767" accesskey="C" t
itle="Mask of subnet C" />
<input type="button" class="netClass" value="i" tabindex="32767" accesskey="I" t
itle="Netmasks" />
<select id="radix" tabindex="1" title="Change IP presentation">
<option>Binary</option>
<option>Octal</option>
<option>Decimal</option>
<option>Hexadecimal</option>
</select>
</div>
</fieldset>
<fieldset>
<legend>Address</legend>
<div class="leftPanel">
<span class="label">Address</span><input type="text" readonly="readonly" maxleng
th="35" id="address" value="" tabindex="2" onfocus="this.select()" />
<span class="label">Netmask</span><input type="text" readonly="readonly" maxleng
th="35" id="netmaskd" value="" tabindex="2" onfocus="this.select()" />
<span class="label">Inv.Netmask</span><input type="text" readonly="readonly" max
length="35" id="netmaski" value="" tabindex="2" onfocus="this.select()" />
<span class="label">Bitmask</span><input type="text" readonly="readonly" maxleng
th="35" id="bitmask" value="" tabindex="2" onfocus="this.select()" />
</div>
<div class="rightPanel">
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="addr
ess_" value="" tabindex="2" onfocus="this.select()" />
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="netm
askd_" value="" tabindex="2" onfocus="this.select()" />
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="netm
aski_" value="" tabindex="2" onfocus="this.select()" />
</div>
</fieldset>
<fieldset>
<legend>Network</legend>
<div class="leftPanel">
<span class="label">Network</span><input type="text" readonly="readonly" maxleng
th="35" id="network" value="" tabindex="3" onfocus="this.select()" />
<span class="label">First Address</span><input type="text" readonly="readonly" m
axlength="35" id="address1" value="" tabindex="3" onfocus="this.select()" />
<span class="label">Last Address</span><input type="text" readonly="readonly" ma
xlength="35" id="addressN" value="" tabindex="3" onfocus="this.select()" />
<span class="label">Broadcast</span><input type="text" readonly="readonly" maxle
ngth="35" id="broadcast" value="" tabindex="3" onfocus="this.select()" />
<span class="label">Length</span><input type="text" readonly="readonly" maxlengt
h="35" id="length" value="" tabindex="3" onfocus="this.select()" />
</div>
<div class="rightPanel">
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="netw
ork_" value="" tabindex="3" onfocus="this.select()" />
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="addr
ess1_" value="" tabindex="3" onfocus="this.select()" />
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="addr
essN_" value="" tabindex="3" onfocus="this.select()" />
<input type="text" class="longinput" readonly="readonly" maxlength="35" id="broa

dcast_" value="" tabindex="3" onfocus="this.select()" />


<input type="text" class="longinput" readonly="readonly" maxlength="35" id="leng
th_" value="" tabindex="3" onfocus="this.select()" />
</div>
</fieldset>
</form>
<form action="" id="hostNetworkContainer" style="display: none;" onsubmit="retur
n false">
<fieldset>
<legend>Networks of this host</legend>
<select id="hostNetwork" size="8">
</select>
</fieldset>
</form>
<form action="" id="netmaskMapContainer" style="display: none;" onsubmit="return
false">
<fieldset>
<legend>Netmasks</legend>
<select id="netmaskMap" size="16">
<option value="128.0.0.0">128.0.0.0 /1</option>
<option value="192.0.0.0">192.0.0.0 /2</option>
<option value="224.0.0.0">224.0.0.0 /3</option>
<option value="240.0.0.0">240.0.0.0 /4</option>
<option value="248.0.0.0">248.0.0.0 /5</option>
<option value="252.0.0.0">252.0.0.0 /6</option>
<option value="254.0.0.0">254.0.0.0 /7</option>
<option value="255.0.0.0">255.0.0.0 /8</option>
<option value="255.128.0.0">255.128.0.0 /9</option>
<option value="255.192.0.0">255.192.0.0 /10</option>
<option value="255.224.0.0">255.224.0.0 /11</option>
<option value="255.240.0.0">255.240.0.0 /12</option>
<option value="255.248.0.0">255.248.0.0 /13</option>
<option value="255.252.0.0">255.252.0.0 /14</option>
<option value="255.254.0.0">255.254.0.0 /15</option>
<option value="255.255.0.0">255.255.0.0 /16</option>
<option value="255.255.128.0">255.255.128.0 /17</option>
<option value="255.255.192.0">255.255.192.0 /18</option>
<option value="255.255.224.0">255.255.224.0 /19</option>
<option value="255.255.240.0">255.255.240.0 /20</option>
<option value="255.255.248.0">255.255.248.0 /21</option>
<option value="255.255.252.0">255.255.252.0 /22</option>
<option value="255.255.254.0">255.255.254.0 /23</option>
<option value="255.255.255.0">255.255.255.0 /24</option>
<option value="255.255.255.128">255.255.255.128 /25</option>
<option value="255.255.255.192">255.255.255.192 /26</option>
<option value="255.255.255.224">255.255.255.224 /27</option>
<option value="255.255.255.240">255.255.255.240 /28</option>
<option value="255.255.255.248">255.255.255.248 /29</option>
<option value="255.255.255.252">255.255.255.252 /30</option>
<option value="255.255.255.254">255.255.255.254 /31</option>
<option value="255.255.255.255">255.255.255.255 /32</option>
</select>
</fieldset>
</form>
</div>

</body>
</html>

You might also like