Flings
Apps and tools built by our engineers that are intended to be played with and explored.

WebCommander

WebCommander

Summary

Have you ever wanted to give your users access to certain virtual infrastructure tasks instead of the entire vCenter Client?

WebCommander is a way to do this! WebCommander was designed as a framework to wrap your PowerShell and PowerCLI scripts into an easy-to-access web service. Now you can hand off the tasks your users need by simply adding a new script and giving them access to WebCommander.

webCommandefrontpage

System Requirements

  • Windows 2008 or 2012
  • Powershell v3 or v4
  • vSphere PowerCLI
  • IIS 8
  • PHP 5

Video

Change Log

What's new in 2.0:
1.  Add workflow feature
2.  Add Windows Update command
3.  Fix a typo in setup.ps1
4.  Add Powershell version check in setup.ps1

Engineers


Marian Shen

Desktop QE

Jerry Liu

Desktop QE

Sabrina Hou

Desktop QE

Zhi Lin

Desktop QE

Brian Yu

Desktop QE

Yolkfull Zhou

Desktop QE

Ting Liu

Desktop QE

Alan Renouf

Infrastructure Product Marketing
Add Comment

85 thoughts on “WebCommander

  1. Jerry Liu

    You need to add the following command into Powershell (x86) profile.
    [Reflection.Assembly]::LoadWithPartialName(‘system.web’) | out-null

    Setup.ps1 is supposed to do this automatically when you run it. Did you meet any issue when you ran the script?

    Reply
  2. Adam

    When I try and run any command via the webpage I get 4488 displayed and the page does a wobble but no output.

    When I running a powershell script ie listVMHost with -serverAddress -Username -Password

    I get an error saying unable to find type system.web.httputility

    I have tried on both a 2008 & 2012
    Anyone know how to fix this?

    Reply
  3. Jerry Liu

    Recently I got quite a few customers’ requests about customizing webcommander outputs.
    I feel it’s a better alternative to output such data in JSON format but not XML.

    For instance in listVmHost.ps1, the original output method is:
    foreach ($group in ($portgroup | sort)) {
    write-host “”
    write-host “$($group.name)”
    write-host “$($group.vlanid)”
    write-host “$($group.virtualswitchname)”
    write-host “”
    }

    And the new way is:
    $json = ($portgroup | sort) | convertto-json -depth 1
    writeStdout $json

    Although the new JSON output may not be as pretty as before showing in web browsers, there is no need to modify webcmd.xsl to transform new XML elements. So I believe this is a worthy trade-off.

    Reply
  4. Adam Durbin

    Hi All,

    I have setup Commander on a Windows Server 2008 R2 server – everything appears to be working correctly for all the inbuilt powershell scripts however when I try to create a new script to do something simply like list all VMs and there HW version and Tools status I get no results table information – I have tried using the inbuilt powershell scripts as a foundry however the script runs but no results table is presented (I am converting the output to xml the same as the inbuilt scripts).

    Can anyone point me in the right direction what files need to be modified for a new script (I have found the xsl file which contains what I am assuming is the required table formatting however after entering in what I believe is the required information I still get no table of results).

    Reply
    1. Jerry Liu

      Hi Adam,
      Your direction is correct. You need to make ps1 file to output XML and then add a template in webcmd.xsl to transform it into html.
      Based on your description, I believe your new code needs to be refined.
      Please send them to me if you couldn’t figure out the problem

      Reply
      1. Adam Durbin

        Powershell Code:

        ## Author: Adam Durbin

        Param (
        $serverAddress,
        $serverUser=”root”,
        $serverPassword=$env:defaultPassword
        )

        foreach ($paramKey in $psboundparameters.keys) {
        $oldValue = $psboundparameters.item($paramKey)
        $newValue = [system.web.httputility]::urldecode(“$oldValue”)
        set-variable -name $paramKey -value $newValue
        }

        . .\objects-det.ps1

        #Connect to VC Server
        try {
        $viserver = connect-VIServer $serverAddress -user $serverUser -password $serverPassword -AllLinked -EA stop
        } catch {
        writeCustomizedMsg “Fail – connect to server $serverAddress”
        writeStderr
        [Environment]::exit(“0″)
        }

        #writeCustomizedMsg “Connected to server $($viserver.name)”

        Function Get-VIScheduledTasks {
        PARAM ( [switch]$Full )
        if ($Full) {
        # Note: When returning the full View of each Scheduled Task, all date times are in UTC
        (Get-View ScheduledTaskManager).ScheduledTask | %{ (Get-View $_).Info }
        } else {
        # By default, lets only return common headers and convert all date/times to local values
        (Get-View ScheduledTaskManager).ScheduledTask | %{ (Get-View $_ -Property Info).Info } |
        Select-Object Name, Description, Enabled, Notification, LastModifiedUser, State, Entity,
        @{N=”EntityName”;E={ (Get-View $_.Entity -Property Name).Name }},
        @{N=”LastModifiedTime”;E={$_.LastModifiedTime.ToLocalTime()}},
        @{N=”NextRunTime”;E={$_.NextRunTime.ToLocalTime()}},
        @{N=”PrevRunTime”;E={$_.LastModifiedTime.ToLocalTime()}},
        @{N=”ActionName”;E={$_.Action.Name}}
        }
        }

        Function Get-VMScheduledSnapshots {
        Get-VIScheduledTasks | ?{$_.ActionName -eq ‘CreateSnapshot_Task’} |
        Select-Object @{N=”VMName”;E={$_.EntityName}}, Name, NextRunTime, Notification
        }

        try {
        $Snapshots = Get-VMScheduledSnapshots | where {$_.NextRunTime -ne $null}

        #writeCustomizedMsg “Found $($Snapshots.count) Snapshots on $($viserver.name)”

        foreach ($Snapshot in $Snapshots) {
        write-host “”
        write-host “$($Snapshot.vmname)”
        write-host “$($Snapshot.name)”
        write-host “$($Snapshot.nextruntime)”
        write-host “$($Snapshot.Notification)”
        write-host “”
        }

        }

        Catch {
        writeCustomizedMsg “FAILED to get list of snapshots”
        writeStderr
        [Environment]::exit(“0″)
        }

        Finally {
        disconnect-viserver * -confirm:$false
        }

        XSL File:

        VMNameNameNextRunTimeNotification

        Reply
  5. Daniel Peluso

    Hi Guys,
    Love your work, I have been testing out the fling to cater for some typical scripting use cases.
    As a bit of a feature enhancement I have created an ability to review the output logs post execution. The codes a little crude an needs some cleaning up but touch base with me and I can send on the enhancement.
    Cheers, Daniel.

    Reply
  6. Marc Petrivelli

    Went through the installation on windows server 2012. The guide assumes you have access to installation media to get the .NET framework installed. If you are running in a VM environment this where you created the VM with template this might be an issue.

    Reply
  7. Susan

    I have a problem when installing, the message is as follows:

    import-module : The specified module ‘webadministration’ was not loaded because no valid module file wa
    module directory.
    At C:UsersAdministratorDesktopWebCommander_v2.0setup.ps1:38 char:1
    + import-module webadministration
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : ResourceUnavailable: (webadministration:String) [Import-Module], FileNotF
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

    Reply
    1. Jerry Liu

      It sounds your server doesn’t meet system requirements.
      please confirm if you get iis 8 on 2008 or 2012. If not, please follow the guide to prepare the server.

      Reply
  8. Jerry Liu

    To upgrade from 1.1 to 2.0, just copy the following files and folders to your webcommander folder.
    www\workflow.html
    www\workflow.css
    www\workflow.js
    www\index.xsl
    www\webcmd.xml
    www\images
    powershell\updateWindowsSync1.ps1
    powershell\updateWindowsSync2.ps1

    On the index page, you are supposed to see a workflow link to the left webCommander logo. Click it, and you will get to workflow.html to compose the workflow.

    Reply
  9. jeff s

    I’m pretty excited to get this up and running. Can you please help me get past the “WARNING: This script must run in AMD64 Powershell” loop I’m seeing?

    Windows PowerShell
    Copyright (C) 2012 Microsoft Corporation. All rights reserved.

    PS C:\Users\Administrator> Set-ExecutionPolicy Unrestricted -force
    PS C:\Users\Administrator> cd C:\WebCommander
    PS C:\WebCommander> .\setup.ps1

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”): r
    WARNING: This script must run in AMD64 Powershell
    Lauching AMD64 Powershell

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”): R
    WARNING: This script must run in AMD64 Powershell
    Lauching AMD64 Powershell

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”): R
    WARNING: This script must run in AMD64 Powershell
    Lauching AMD64 Powershell

    Security warning
    Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your
    computer. Do you want to run C:\WebCommander\setup.ps1?
    [D] Do not run [R] Run once [S] Suspend [?] Help (default is “D”):

    Reply
      1. jeff s

        It’s set to Unrestricted in both Powershell and Powershell (x86);

        PS C:\Users\Administrator> Get-ExecutionPolicy
        Unrestricted

        Reply
          1. jeff s

            Ok. I’m past that and it seems to be working, but when I select a task and enter the correct IP address, username, and password, and then hit submit, I see “webCommander is handling your request. Please wait.” but nothing else ever happens—it will sit there and no data will ever come back, nor is an error thrown.

            thanks for your help!

            Reply
            1. Jerry Liu

              May I know which command you ran and also the parameters you used?
              You may try simple one, like listvmhost, first to check if the connection to VI server is successful.

              Reply
                1. jeff s

                  Ya, this is a Powershell / PowerCLI issue.

                  Should I be able to open Powershell and enter the “Connect-VIServer” command?

                  Reply
                  1. Jerry Liu

                    You don’t need to run the command first. Here is my suggestion:
                    1. launch x86 ps console
                    2. cd c:\webcommander\powershell
                    3. run “.\listVmHost.ps1 -serverAddress -serverUser -serverPassword ”

                    Let me know if it returns the result correctly or gets blocked somewhere.

                    Reply
  10. Jerry Liu

    WebCommander 2.0 is released. The newly added feature – workflow allows users to run multiple commands together in either serial or parallel.
    The command to install Windows updates in remote machine is also added.

    Reply
  11. Jerry Liu

    If you use Powershell v2 but not v3, please change the following line in objects.ps1
    from if ($psVer[0] –in (“2″, “3″, “4″))
    to if ((“2″, “3″, “4″) -contains $psVer[0])

    Reply
  12. Jerry Liu

    When webcommander returns the page containing the error, please right click on it and select view source code. I need to see the entire content for investigation. Please don’t just copy part of it.

    If you don’t want to post the content here, you may send it via email. My email is liuj@vmware.com.

    Reply
  13. Dany Grenier

    Hi,
    I have this error when I try to execute «listVmHost»

    The term ‘newServer’ is not recognized as the name of a cmdlet, function, scrip
    t file, or operable program. Check the spelling of the name, or if a path was i
    ncluded, verify that the path is correct and try again.
    At C:\WebCommander\powershell\listVmHost.ps1:43 char:20
    + $server = newServer <<<< $serverAddress $serverUser $serverPassword
    + CategoryInfo : ObjectNotFound: (newServer:String) [], CommandNo
    tFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

    Any idea why ?

    Thanks

    Reply
      1. Dany Grenier

        Hi,
        I also have this error and the site is running as administrator.

        You must provide a value expression on the right-hand side of the ‘-’ operator.
        At C:\WebCommander\powershell\objects.ps1:198 char:18
        + if ($psVer[0] – <<<< in ("2", "3", "4")) {
        + CategoryInfo : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : ExpectedValueExpression

        Reply
        1. Jerry Liu

          Sorry, I meant to reply to your question, but my post shows in a wrong position. Please see my response at the top, November 8, 2013 at 8:07 am.

          Reply
  14. Heath

    When I attempt to run setup.ps1 I get stuck in a loop :

    “This script must run in AMD64 Powershell”
    “Lauching AMD64 Powershell”

    This repeats down the screen in a loop.

    I am doing a right click “run as administrator” on PowerShell (x86), set-executionpolicy unrestricted -force, then running setup.ps1. At that point I get stuck in a loop.

    I have tried the install on Server 2008 and Win7, I don’t have a 2012 template in this lab.

    Reply
      1. Heath

        Thanks, I am a little further along now. I set-executionpolicy unrestricted -force for powershell 64bit and ran the install script. I then set connect as “administrator” in basic settings. I can now select a script and enter the parameters, but it returns a blank screen.

        My server isn’t connected to the internet so I edited the xsl file with a path to local query. I simply downloaded the jquery library and extracted it to the www directory.

        webCommander

        Here is a link to my www log, the last thing I see is the post of the form data. It does take a few seconds before it returns the white screen, like it is doing something.

        http://pastebin.com/raw.php?i=6n75eTtZ

        Is there logging of the powershell / powercli commands so I can see if they are returning data?

        Reply
        1. Jerry Liu

          Could you please right click on the “white screen” and then click “show page source”?
          Let me know what displays there.

          Reply
            1. Jerry Liu

              Looks really weird. Did you edit objects.ps1 before getting this error?
              If convenient for you, please send your objects.ps1 back to me for further investigation.

              Reply
  15. Enrique

    I cam make installation with no issues. I followed all steps and when I access the web page and select an icon I enter into the form. Then I fill all the fields in the form, then click on submit and nothing happens. I always have the message Missing parameters and nothing more. Any Reason? Thanks

    Reply
    1. Jerry Liu

      Please check if your server has access to internet. If not, you need to download Jquery library scripts and edit webcmd.xsl accordingly.

      Reply
      1. Enrique

        Now when I run any script, fill all the fields in form and click submit I can see “Running” in the screen but command is not running in VC. Then I receive a XML error and nothing more happens. I’ve commented line $xmloutput .= “” . $output . “”; in webcmd.php and command returns 4488 code but nothing happens in VC. What can I do?

        Reply
        1. Jerry Liu

          If no error is found in $output, web commander reports success (4488).
          You should never comment out the output.
          Please restore the original files. On the xml error page, right click and select view source code. Let me know what shows there.

          Reply
          1. Enrique

            This is the source code:

            root
            administrator

            Debe proporcionar una expresi�n de valor a la derecha del operador ‘-’.
            En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\objects.ps1: 198 C
            ar�cter: 18
            + if ($psVer[0] – <<<< in ("2", "3", "4")) {
            + CategoryInfo : ParserError: (:) [], ParseException
            + FullyQualifiedErrorId : ExpectedValueExpression

            El t�rmino 'newServer' no se reconoce como nombre de un cmdlet, funci�n, archiv
            o de script o programa ejecutable. Compruebe si escribi� correctamente el nombr
            e o, si incluy� una ruta de acceso, compruebe que dicha ruta es correcta e int�
            ntelo de nuevo.
            En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\listDatastore.ps1:
            39 Car�cter: 20
            + $server = newServer <<<< $serverAddress $serverUser $serverPassword
            + CategoryInfo : ObjectNotFound: (newServer:String) [], CommandNo
            tFoundException
            + FullyQualifiedErrorId : CommandNotFoundException

            Get-Datastore : 06/11/2013 16:50:27 Get-Datastore You are not current
            ly connected to any servers. Please connect first using a Connect cmdlet.
            En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\listDatastore.ps1:
            40 Car�cter: 27
            + $datastore = get-datastore <<<< -Server $server.viserver
            + CategoryInfo : ResourceUnavailable: (:) [Get-Datastore], ViServ
            erConnectionException
            + FullyQualifiedErrorId : Core_BaseCmdlet_NotConnectedError,VMware.VimAuto
            mation.ViCore.Cmdlets.Commands.GetDatastore

            448873.7 seconds<![CDATA[http://w2k8permeabilid.desa.redes.aeat:80/webcmd.php?command=lis

            Thanks in advance

            Reply
              1. Jerry Liu

                I don’t understand “Debe proporcionar una expresi�n de valor a la derecha del operador ‘-’.”
                I guess it means that the dot source to objects.ps1 doesn’t work on your server whose OS language is not English.
                webCommander has never been deployed or tested on localised OSes.

                Besides, I have no rights to delete comments here.

                Reply
                1. Enrique

                  + $server = newServer <<<< $serverAddress $serverUser $serverPassword
                  + CategoryInfo : ObjectNotFound: (newServer:String) [], CommandNo
                  tFoundException
                  + FullyQualifiedErrorId : CommandNotFoundException

                  En C:\Users\admf009972j\Desktop\WebCommander_v1.1\powershell\objects.ps1: 198 C
                  ar�cter: 18
                  + if ($psVer[0] – <<<< in ("2", "3", "4")) {
                  + CategoryInfo : ParserError: (:) [], ParseException
                  + FullyQualifiedErrorId : ExpectedValueExpression

                  I think this is the problem

                  Reply
                  1. Jerry Liu

                    Another user’s comment just remind me.
                    Did you follow the guide to set the web site to run as administrator?

                    Reply
  16. Jerry Liu

    If the encrypted password also works (I mean to execute the script successfully), why shall we encrypt it?
    If the encrypted password won’t work, why shall we put it in the URL?

    Reply
    1. bvi1998

      Hi,
      Thanks for this fling :) … I see that you have planned to create scripts to run the Windows updates on a server. Do you have that script, and would you please share it?
      Also, how can we remove that URL showing the password?
      Thanks,
      Jen

      Reply
      1. Jerry Liu

        Sorry, I didn’t see this question in time. Windows update scripts will be included in version 2.0. A cool feature called workflow will also be added. Please get ready to be amazed. :)

        Reply
  17. Yolkfull

    This is really useful tool and being infrastructural instrumentation for automation test development. Especially those all kinds of web services that Web Commander provided, they enable us the capabilities to interact with View Connection Server, View Agent, MS AD machine etc from view Mobile Clients machine.

    Reply
  18. Sean Duffy

    Looks great guys. I would suggest adding encryption on the password parameter that is visible in the URL generated for any given script that uses credentials. :)

    Reply
    1. Jerry Liu

      I wanted to reply to suggestion, but don’t know why it showed up at the top.
      Please refer to my comment written at October 20, 2013 at 8:11 pm

      Reply
  19. Zhi

    This is instrumental in automation; There are various automation frameworks in different languages, e.g. python, java, jython, powershell …, and some core functions are duplicated across these frameworks; With webCommander, we can share these public utils and it will save us a lot of effort; we can call webCommander service with lots of languages even with shell.

    Reply
  20. bvi1998

    Hi,
    When I launch the website and click on, let’s say, install powershell, I receive the Result: Missing parameters before I even get to do anything. Then, I try to launch the script and it does nothing…. I have followed the instructions, I am not sure what I am missing. Help please? Thanks!

    Reply
    1. bvi1998

      Actually, when I try to run the setup again in x86 Powershell, I get the message that the script must run in AMD64 powershell. Therefore, as the instructions state to run the setup in x86 Powershell, obviously I can’t ….
      So, the fact that I did not run the setup in x86 Powershell, is that why this is not working for me (in above post).
      Thanks!

      Reply
      1. Jerry Liu

        Because PHP for IIS is 32bit, it can only launch x86 powershell which in turn to execute all PS1 scripts of webCommander.
        So the execution policy of x86 powershell must be set to unrestricted.

        The setup.ps1 contains some cmdlets running better in x64 than x86, so I forced it to be executed in x64. And this is automated.

        Reply
    2. Jerry Liu

      This is expected.
      You need to input parameters in the form and click submit.
      Otherwise, the result is “missing parameters”.

      Reply
  21. Jason

    Ok, I was able to get a new script added to webcommander and able to execute it , however the results are not displaying back to the site after execution. I have added the appropriate parameters to help with the special characters as per the documentation. Any help on why the results are not displaying?

    Reply
    1. Jerry Liu

      You could find any output (result) of your ps1 script in the source code of the web page.

      However, web commander only displays (in browser) the output generated by function writeCustomizedMsg, writeStdout and writeStderr. All these 3 functions are defined in objects.ps1.

      If you want other output showing in browser, you need to modify webcmd.xsl to add a new format template. Please refer to line 258 to 402.

      Reply
      1. Jason

        I’ll be the first to admit I have never used xslt before and have very little experience with php. I have tried to modify webCmd.xsl to get my results to show, still no luck. I am going to provide my very basic script and the change I added to the webCmd.xsl. Can you please help me with what I am doing wrong?

        VM Count Script

        Param (
        $serverAddress=”",
        $serverUser=”root”,
        $serverPassword=$env:defaultPassword
        )

        foreach ($paramKey in $psboundparameters.keys) {
        $oldValue = $psboundparameters.item($paramKey)
        $newValue = [system.web.httputility]::urldecode(“$oldValue”)
        set-variable -name $paramKey -value $newValue
        }

        . .\objects.ps1

        $server = newServer $serverAddress $serverUser $serverPassword
        $vms = Get-VM -Server $server.viserver
        $count = $vms.count
        write-output “”
        write-output “$count”
        write-output “”

        webCmd.xsl addition

        VM Count

        Any suggestions?

        Reply
            1. Jason

              I figured out my issues. Apparently xsl is case sensitive. Once I corrected that I was able to run my script and have the results display back.

              Reply
  22. Steven T

    I am able to get everything installed fine and I can execute the setup.ps1 file. I am not getting any data returned from the scripts when I run them. After a couple of quick mods, I am able to execute the scripts directly. Any ideas? I am on Windows 2012 Server.

    Reply
      1. Jerry Liu

        Thanks Steven for your sharing!

        Because PHP for IIS is 32bit, it calls x86 Powershell to run the ps1 scripts. That’s why the execution policy of x86 Powershell must be set.

        Reply
        1. Steven T

          Yeah, i read the directions 10 times and for some reason, my brain can’t process “(x86)”. Apparently, if you bang your head on your desk enough, your vision gets blurry and it becomes visible.

          Reply
  23. Jerry Liu

    Hi web commander users,

    In case you meet an error as described at the bottom when you run web commander, here are the fix steps:
    1. open IIS console
    2. select webcommander web site
    3. click basic settings in the right panel
    4. click connect as button
    5. select “specific user” and input administrator

    =================================================================
    Add-PSSnapin : Unable to generate a temporary class (result=1).
    error CS2001: Source file ‘C:\Windows\TEMP\bh4relje.0.cs’ could not be found
    error CS2008: No inputs specified
    At C:\Windows\SysWOW64\WindowsPowerShell\v1.0\profile.ps1:1 char:13
    + add-pssnapin <<<< VMware* -ea SilentlyContinue
    =================================================================

    Reply
  24. Jason

    Having issues running setup.ps1. Continues to error out on “Failed to create and start web site. Please make sure IIS Mgmt Service is started.” I have verified the service is up and running and when I check IIS I see that it creates the webcommander site, however it is listed as unknown with a red X. Any suggestions?

    Reply
      1. Jason

        I was able to get the site created manually, however now I am receiving this error when I try and run a script from WebCommander.

        HTTP Error 500.0 – Internal Server Error
        C:\Program Files (x86)\PHP\v5.3\php-cgi.exe – The FastCGI process exceeded configured request timeout

        Any suggestions?

        Reply
        1. Jerry Liu

          Considering you manully created the site, please make sure the account with which the site is running has the previllege to execute powershell scripts.
          The easiest way is to make it run as local administrator.
          BTW, did you run setup.ps1 as administrator or another user?

          Reply
          1. Jason

            The account I used to create the website has local admin rights. I also ran the setup.ps1 from the ‘Run As Admin” PS Console.

            Reply
            1. Jerry Liu

              In this case, I cannot see any other reason why setup.ps1 failed than IIS version mismatch.
              As for error 500, please try to run the script from x86 powershell console. I suspect there is some configuration on your server blocking the execution.

              Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>