
/**
 * AmazonEC2SkeletonInterface.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.5.6  Built on : Aug 30, 2011 (10:00:16 CEST)
 */
    package com.amazon.ec2;
    /**
     *  AmazonEC2SkeletonInterface java skeleton interface for the axisService
     */
    public interface AmazonEC2SkeletonInterface {
     
         
        /**
         * Auto generated method signature
         * 
                                    * @param describePlacementGroups
         */

        
                public com.amazon.ec2.DescribePlacementGroupsResponse describePlacementGroups
                (
                  com.amazon.ec2.DescribePlacementGroups describePlacementGroups
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSecurityGroup
         */

        
                public com.amazon.ec2.CreateSecurityGroupResponse createSecurityGroup
                (
                  com.amazon.ec2.CreateSecurityGroup createSecurityGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetNetworkInterfaceAttribute
         */

        
                public com.amazon.ec2.ResetNetworkInterfaceAttributeResponse resetNetworkInterfaceAttribute
                (
                  com.amazon.ec2.ResetNetworkInterfaceAttribute resetNetworkInterfaceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createDhcpOptions
         */

        
                public com.amazon.ec2.CreateDhcpOptionsResponse createDhcpOptions
                (
                  com.amazon.ec2.CreateDhcpOptions createDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createRouteTable
         */

        
                public com.amazon.ec2.CreateRouteTableResponse createRouteTable
                (
                  com.amazon.ec2.CreateRouteTable createRouteTable
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSubnets
         */

        
                public com.amazon.ec2.DescribeSubnetsResponse describeSubnets
                (
                  com.amazon.ec2.DescribeSubnets describeSubnets
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deactivateLicense
         */

        
                public com.amazon.ec2.DeactivateLicenseResponse deactivateLicense
                (
                  com.amazon.ec2.DeactivateLicense deactivateLicense
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpc
         */

        
                public com.amazon.ec2.DeleteVpcResponse deleteVpc
                (
                  com.amazon.ec2.DeleteVpc deleteVpc
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelSpotInstanceRequests
         */

        
                public com.amazon.ec2.CancelSpotInstanceRequestsResponse cancelSpotInstanceRequests
                (
                  com.amazon.ec2.CancelSpotInstanceRequests cancelSpotInstanceRequests
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSubnet
         */

        
                public com.amazon.ec2.CreateSubnetResponse createSubnet
                (
                  com.amazon.ec2.CreateSubnet createSubnet
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpnGateway
         */

        
                public com.amazon.ec2.DeleteVpnGatewayResponse deleteVpnGateway
                (
                  com.amazon.ec2.DeleteVpnGateway deleteVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createNetworkAclEntry
         */

        
                public com.amazon.ec2.CreateNetworkAclEntryResponse createNetworkAclEntry
                (
                  com.amazon.ec2.CreateNetworkAclEntry createNetworkAclEntry
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param requestSpotInstances
         */

        
                public com.amazon.ec2.RequestSpotInstancesResponse requestSpotInstances
                (
                  com.amazon.ec2.RequestSpotInstances requestSpotInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVolumeAttribute
         */

        
                public com.amazon.ec2.DescribeVolumeAttributeResponse describeVolumeAttribute
                (
                  com.amazon.ec2.DescribeVolumeAttribute describeVolumeAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param associateDhcpOptions
         */

        
                public com.amazon.ec2.AssociateDhcpOptionsResponse associateDhcpOptions
                (
                  com.amazon.ec2.AssociateDhcpOptions associateDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeTags
         */

        
                public com.amazon.ec2.DescribeTagsResponse describeTags
                (
                  com.amazon.ec2.DescribeTags describeTags
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param importKeyPair
         */

        
                public com.amazon.ec2.ImportKeyPairResponse importKeyPair
                (
                  com.amazon.ec2.ImportKeyPair importKeyPair
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteNetworkInterface
         */

        
                public com.amazon.ec2.DeleteNetworkInterfaceResponse deleteNetworkInterface
                (
                  com.amazon.ec2.DeleteNetworkInterface deleteNetworkInterface
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVpcs
         */

        
                public com.amazon.ec2.DescribeVpcsResponse describeVpcs
                (
                  com.amazon.ec2.DescribeVpcs describeVpcs
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeLicenses
         */

        
                public com.amazon.ec2.DescribeLicensesResponse describeLicenses
                (
                  com.amazon.ec2.DescribeLicenses describeLicenses
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param bundleInstance
         */

        
                public com.amazon.ec2.BundleInstanceResponse bundleInstance
                (
                  com.amazon.ec2.BundleInstance bundleInstance
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVpnConnections
         */

        
                public com.amazon.ec2.DescribeVpnConnectionsResponse describeVpnConnections
                (
                  com.amazon.ec2.DescribeVpnConnections describeVpnConnections
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeImages
         */

        
                public com.amazon.ec2.DescribeImagesResponse describeImages
                (
                  com.amazon.ec2.DescribeImages describeImages
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createInternetGateway
         */

        
                public com.amazon.ec2.CreateInternetGatewayResponse createInternetGateway
                (
                  com.amazon.ec2.CreateInternetGateway createInternetGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param disassociateRouteTable
         */

        
                public com.amazon.ec2.DisassociateRouteTableResponse disassociateRouteTable
                (
                  com.amazon.ec2.DisassociateRouteTable disassociateRouteTable
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param replaceNetworkAclEntry
         */

        
                public com.amazon.ec2.ReplaceNetworkAclEntryResponse replaceNetworkAclEntry
                (
                  com.amazon.ec2.ReplaceNetworkAclEntry replaceNetworkAclEntry
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param authorizeSecurityGroupIngress
         */

        
                public com.amazon.ec2.AuthorizeSecurityGroupIngressResponse authorizeSecurityGroupIngress
                (
                  com.amazon.ec2.AuthorizeSecurityGroupIngress authorizeSecurityGroupIngress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSnapshotAttribute
         */

        
                public com.amazon.ec2.DescribeSnapshotAttributeResponse describeSnapshotAttribute
                (
                  com.amazon.ec2.DescribeSnapshotAttribute describeSnapshotAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpnGateway
         */

        
                public com.amazon.ec2.CreateVpnGatewayResponse createVpnGateway
                (
                  com.amazon.ec2.CreateVpnGateway createVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetInstanceAttribute
         */

        
                public com.amazon.ec2.ResetInstanceAttributeResponse resetInstanceAttribute
                (
                  com.amazon.ec2.ResetInstanceAttribute resetInstanceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createTags
         */

        
                public com.amazon.ec2.CreateTagsResponse createTags
                (
                  com.amazon.ec2.CreateTags createTags
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param authorizeSecurityGroupEgress
         */

        
                public com.amazon.ec2.AuthorizeSecurityGroupEgressResponse authorizeSecurityGroupEgress
                (
                  com.amazon.ec2.AuthorizeSecurityGroupEgress authorizeSecurityGroupEgress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param associateAddress
         */

        
                public com.amazon.ec2.AssociateAddressResponse associateAddress
                (
                  com.amazon.ec2.AssociateAddress associateAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeImageAttribute
         */

        
                public com.amazon.ec2.DescribeImageAttributeResponse describeImageAttribute
                (
                  com.amazon.ec2.DescribeImageAttribute describeImageAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSpotPriceHistory
         */

        
                public com.amazon.ec2.DescribeSpotPriceHistoryResponse describeSpotPriceHistory
                (
                  com.amazon.ec2.DescribeSpotPriceHistory describeSpotPriceHistory
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifySnapshotAttribute
         */

        
                public com.amazon.ec2.ModifySnapshotAttributeResponse modifySnapshotAttribute
                (
                  com.amazon.ec2.ModifySnapshotAttribute modifySnapshotAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSpotInstanceRequests
         */

        
                public com.amazon.ec2.DescribeSpotInstanceRequestsResponse describeSpotInstanceRequests
                (
                  com.amazon.ec2.DescribeSpotInstanceRequests describeSpotInstanceRequests
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param importInstance
         */

        
                public com.amazon.ec2.ImportInstanceResponse importInstance
                (
                  com.amazon.ec2.ImportInstance importInstance
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeKeyPairs
         */

        
                public com.amazon.ec2.DescribeKeyPairsResponse describeKeyPairs
                (
                  com.amazon.ec2.DescribeKeyPairs describeKeyPairs
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param revokeSecurityGroupIngress
         */

        
                public com.amazon.ec2.RevokeSecurityGroupIngressResponse revokeSecurityGroupIngress
                (
                  com.amazon.ec2.RevokeSecurityGroupIngress revokeSecurityGroupIngress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createPlacementGroup
         */

        
                public com.amazon.ec2.CreatePlacementGroupResponse createPlacementGroup
                (
                  com.amazon.ec2.CreatePlacementGroup createPlacementGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteNetworkAclEntry
         */

        
                public com.amazon.ec2.DeleteNetworkAclEntryResponse deleteNetworkAclEntry
                (
                  com.amazon.ec2.DeleteNetworkAclEntry deleteNetworkAclEntry
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param activateLicense
         */

        
                public com.amazon.ec2.ActivateLicenseResponse activateLicense
                (
                  com.amazon.ec2.ActivateLicense activateLicense
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteRouteTable
         */

        
                public com.amazon.ec2.DeleteRouteTableResponse deleteRouteTable
                (
                  com.amazon.ec2.DeleteRouteTable deleteRouteTable
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param unmonitorInstances
         */

        
                public com.amazon.ec2.UnmonitorInstancesResponse unmonitorInstances
                (
                  com.amazon.ec2.UnmonitorInstances unmonitorInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param startInstances
         */

        
                public com.amazon.ec2.StartInstancesResponse startInstances
                (
                  com.amazon.ec2.StartInstances startInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param confirmProductInstance
         */

        
                public com.amazon.ec2.ConfirmProductInstanceResponse confirmProductInstance
                (
                  com.amazon.ec2.ConfirmProductInstance confirmProductInstance
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeNetworkInterfaceAttribute
         */

        
                public com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse describeNetworkInterfaceAttribute
                (
                  com.amazon.ec2.DescribeNetworkInterfaceAttribute describeNetworkInterfaceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param runInstances
         */

        
                public com.amazon.ec2.RunInstancesResponse runInstances
                (
                  com.amazon.ec2.RunInstances runInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createReservedInstancesListing
         */

        
                public com.amazon.ec2.CreateReservedInstancesListingResponse createReservedInstancesListing
                (
                  com.amazon.ec2.CreateReservedInstancesListing createReservedInstancesListing
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createCustomerGateway
         */

        
                public com.amazon.ec2.CreateCustomerGatewayResponse createCustomerGateway
                (
                  com.amazon.ec2.CreateCustomerGateway createCustomerGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createNetworkAcl
         */

        
                public com.amazon.ec2.CreateNetworkAclResponse createNetworkAcl
                (
                  com.amazon.ec2.CreateNetworkAcl createNetworkAcl
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetImageAttribute
         */

        
                public com.amazon.ec2.ResetImageAttributeResponse resetImageAttribute
                (
                  com.amazon.ec2.ResetImageAttribute resetImageAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifyVolumeAttribute
         */

        
                public com.amazon.ec2.ModifyVolumeAttributeResponse modifyVolumeAttribute
                (
                  com.amazon.ec2.ModifyVolumeAttribute modifyVolumeAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeReservedInstances
         */

        
                public com.amazon.ec2.DescribeReservedInstancesResponse describeReservedInstances
                (
                  com.amazon.ec2.DescribeReservedInstances describeReservedInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetSnapshotAttribute
         */

        
                public com.amazon.ec2.ResetSnapshotAttributeResponse resetSnapshotAttribute
                (
                  com.amazon.ec2.ResetSnapshotAttribute resetSnapshotAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVolume
         */

        
                public com.amazon.ec2.DeleteVolumeResponse deleteVolume
                (
                  com.amazon.ec2.DeleteVolume deleteVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeAvailabilityZones
         */

        
                public com.amazon.ec2.DescribeAvailabilityZonesResponse describeAvailabilityZones
                (
                  com.amazon.ec2.DescribeAvailabilityZones describeAvailabilityZones
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpnConnection
         */

        
                public com.amazon.ec2.CreateVpnConnectionResponse createVpnConnection
                (
                  com.amazon.ec2.CreateVpnConnection createVpnConnection
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelBundleTask
         */

        
                public com.amazon.ec2.CancelBundleTaskResponse cancelBundleTask
                (
                  com.amazon.ec2.CancelBundleTask cancelBundleTask
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param replaceNetworkAclAssociation
         */

        
                public com.amazon.ec2.ReplaceNetworkAclAssociationResponse replaceNetworkAclAssociation
                (
                  com.amazon.ec2.ReplaceNetworkAclAssociation replaceNetworkAclAssociation
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param detachVpnGateway
         */

        
                public com.amazon.ec2.DetachVpnGatewayResponse detachVpnGateway
                (
                  com.amazon.ec2.DetachVpnGateway detachVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSnapshots
         */

        
                public com.amazon.ec2.DescribeSnapshotsResponse describeSnapshots
                (
                  com.amazon.ec2.DescribeSnapshots describeSnapshots
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSubnet
         */

        
                public com.amazon.ec2.DeleteSubnetResponse deleteSubnet
                (
                  com.amazon.ec2.DeleteSubnet deleteSubnet
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeBundleTasks
         */

        
                public com.amazon.ec2.DescribeBundleTasksResponse describeBundleTasks
                (
                  com.amazon.ec2.DescribeBundleTasks describeBundleTasks
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createKeyPair
         */

        
                public com.amazon.ec2.CreateKeyPairResponse createKeyPair
                (
                  com.amazon.ec2.CreateKeyPair createKeyPair
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createImage
         */

        
                public com.amazon.ec2.CreateImageResponse createImage
                (
                  com.amazon.ec2.CreateImage createImage
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param enableVgwRoutePropagation
         */

        
                public com.amazon.ec2.EnableVgwRoutePropagationResponse enableVgwRoutePropagation
                (
                  com.amazon.ec2.EnableVgwRoutePropagation enableVgwRoutePropagation
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param unassignPrivateIpAddresses
         */

        
                public com.amazon.ec2.UnassignPrivateIpAddressesResponse unassignPrivateIpAddresses
                (
                  com.amazon.ec2.UnassignPrivateIpAddresses unassignPrivateIpAddresses
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deregisterImage
         */

        
                public com.amazon.ec2.DeregisterImageResponse deregisterImage
                (
                  com.amazon.ec2.DeregisterImage deregisterImage
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpnConnectionRoute
         */

        
                public com.amazon.ec2.DeleteVpnConnectionRouteResponse deleteVpnConnectionRoute
                (
                  com.amazon.ec2.DeleteVpnConnectionRoute deleteVpnConnectionRoute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifyImageAttribute
         */

        
                public com.amazon.ec2.ModifyImageAttributeResponse modifyImageAttribute
                (
                  com.amazon.ec2.ModifyImageAttribute modifyImageAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelConversionTask
         */

        
                public com.amazon.ec2.CancelConversionTaskResponse cancelConversionTask
                (
                  com.amazon.ec2.CancelConversionTask cancelConversionTask
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVolumes
         */

        
                public com.amazon.ec2.DescribeVolumesResponse describeVolumes
                (
                  com.amazon.ec2.DescribeVolumes describeVolumes
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelReservedInstancesListing
         */

        
                public com.amazon.ec2.CancelReservedInstancesListingResponse cancelReservedInstancesListing
                (
                  com.amazon.ec2.CancelReservedInstancesListing cancelReservedInstancesListing
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param getPasswordData
         */

        
                public com.amazon.ec2.GetPasswordDataResponse getPasswordData
                (
                  com.amazon.ec2.GetPasswordData getPasswordData
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param allocateAddress
         */

        
                public com.amazon.ec2.AllocateAddressResponse allocateAddress
                (
                  com.amazon.ec2.AllocateAddress allocateAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSecurityGroup
         */

        
                public com.amazon.ec2.DeleteSecurityGroupResponse deleteSecurityGroup
                (
                  com.amazon.ec2.DeleteSecurityGroup deleteSecurityGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deletePlacementGroup
         */

        
                public com.amazon.ec2.DeletePlacementGroupResponse deletePlacementGroup
                (
                  com.amazon.ec2.DeletePlacementGroup deletePlacementGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param disassociateAddress
         */

        
                public com.amazon.ec2.DisassociateAddressResponse disassociateAddress
                (
                  com.amazon.ec2.DisassociateAddress disassociateAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteDhcpOptions
         */

        
                public com.amazon.ec2.DeleteDhcpOptionsResponse deleteDhcpOptions
                (
                  com.amazon.ec2.DeleteDhcpOptions deleteDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSpotDatafeedSubscription
         */

        
                public com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse describeSpotDatafeedSubscription
                (
                  com.amazon.ec2.DescribeSpotDatafeedSubscription describeSpotDatafeedSubscription
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeNetworkAcls
         */

        
                public com.amazon.ec2.DescribeNetworkAclsResponse describeNetworkAcls
                (
                  com.amazon.ec2.DescribeNetworkAcls describeNetworkAcls
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param enableVolumeIO
         */

        
                public com.amazon.ec2.EnableVolumeIOResponse enableVolumeIO
                (
                  com.amazon.ec2.EnableVolumeIO enableVolumeIO
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param attachVpnGateway
         */

        
                public com.amazon.ec2.AttachVpnGatewayResponse attachVpnGateway
                (
                  com.amazon.ec2.AttachVpnGateway attachVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeInternetGateways
         */

        
                public com.amazon.ec2.DescribeInternetGatewaysResponse describeInternetGateways
                (
                  com.amazon.ec2.DescribeInternetGateways describeInternetGateways
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeDhcpOptions
         */

        
                public com.amazon.ec2.DescribeDhcpOptionsResponse describeDhcpOptions
                (
                  com.amazon.ec2.DescribeDhcpOptions describeDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSpotDatafeedSubscription
         */

        
                public com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse createSpotDatafeedSubscription
                (
                  com.amazon.ec2.CreateSpotDatafeedSubscription createSpotDatafeedSubscription
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeReservedInstancesListings
         */

        
                public com.amazon.ec2.DescribeReservedInstancesListingsResponse describeReservedInstancesListings
                (
                  com.amazon.ec2.DescribeReservedInstancesListings describeReservedInstancesListings
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeInstanceStatus
         */

        
                public com.amazon.ec2.DescribeInstanceStatusResponse describeInstanceStatus
                (
                  com.amazon.ec2.DescribeInstanceStatus describeInstanceStatus
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifyNetworkInterfaceAttribute
         */

        
                public com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse modifyNetworkInterfaceAttribute
                (
                  com.amazon.ec2.ModifyNetworkInterfaceAttribute modifyNetworkInterfaceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param disableVgwRoutePropagation
         */

        
                public com.amazon.ec2.DisableVgwRoutePropagationResponse disableVgwRoutePropagation
                (
                  com.amazon.ec2.DisableVgwRoutePropagation disableVgwRoutePropagation
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVolumeStatus
         */

        
                public com.amazon.ec2.DescribeVolumeStatusResponse describeVolumeStatus
                (
                  com.amazon.ec2.DescribeVolumeStatus describeVolumeStatus
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param detachNetworkInterface
         */

        
                public com.amazon.ec2.DetachNetworkInterfaceResponse detachNetworkInterface
                (
                  com.amazon.ec2.DetachNetworkInterface detachNetworkInterface
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSecurityGroups
         */

        
                public com.amazon.ec2.DescribeSecurityGroupsResponse describeSecurityGroups
                (
                  com.amazon.ec2.DescribeSecurityGroups describeSecurityGroups
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeInstances
         */

        
                public com.amazon.ec2.DescribeInstancesResponse describeInstances
                (
                  com.amazon.ec2.DescribeInstances describeInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeNetworkInterfaces
         */

        
                public com.amazon.ec2.DescribeNetworkInterfacesResponse describeNetworkInterfaces
                (
                  com.amazon.ec2.DescribeNetworkInterfaces describeNetworkInterfaces
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteKeyPair
         */

        
                public com.amazon.ec2.DeleteKeyPairResponse deleteKeyPair
                (
                  com.amazon.ec2.DeleteKeyPair deleteKeyPair
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSnapshot
         */

        
                public com.amazon.ec2.CreateSnapshotResponse createSnapshot
                (
                  com.amazon.ec2.CreateSnapshot createSnapshot
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVpnGateways
         */

        
                public com.amazon.ec2.DescribeVpnGatewaysResponse describeVpnGateways
                (
                  com.amazon.ec2.DescribeVpnGateways describeVpnGateways
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteTags
         */

        
                public com.amazon.ec2.DeleteTagsResponse deleteTags
                (
                  com.amazon.ec2.DeleteTags deleteTags
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSnapshot
         */

        
                public com.amazon.ec2.DeleteSnapshotResponse deleteSnapshot
                (
                  com.amazon.ec2.DeleteSnapshot deleteSnapshot
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteCustomerGateway
         */

        
                public com.amazon.ec2.DeleteCustomerGatewayResponse deleteCustomerGateway
                (
                  com.amazon.ec2.DeleteCustomerGateway deleteCustomerGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVolume
         */

        
                public com.amazon.ec2.CreateVolumeResponse createVolume
                (
                  com.amazon.ec2.CreateVolume createVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelExportTask
         */

        
                public com.amazon.ec2.CancelExportTaskResponse cancelExportTask
                (
                  com.amazon.ec2.CancelExportTask cancelExportTask
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param registerImage
         */

        
                public com.amazon.ec2.RegisterImageResponse registerImage
                (
                  com.amazon.ec2.RegisterImage registerImage
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param detachVolume
         */

        
                public com.amazon.ec2.DetachVolumeResponse detachVolume
                (
                  com.amazon.ec2.DetachVolume detachVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param stopInstances
         */

        
                public com.amazon.ec2.StopInstancesResponse stopInstances
                (
                  com.amazon.ec2.StopInstances stopInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createRoute
         */

        
                public com.amazon.ec2.CreateRouteResponse createRoute
                (
                  com.amazon.ec2.CreateRoute createRoute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param releaseAddress
         */

        
                public com.amazon.ec2.ReleaseAddressResponse releaseAddress
                (
                  com.amazon.ec2.ReleaseAddress releaseAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeRouteTables
         */

        
                public com.amazon.ec2.DescribeRouteTablesResponse describeRouteTables
                (
                  com.amazon.ec2.DescribeRouteTables describeRouteTables
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeCustomerGateways
         */

        
                public com.amazon.ec2.DescribeCustomerGatewaysResponse describeCustomerGateways
                (
                  com.amazon.ec2.DescribeCustomerGateways describeCustomerGateways
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteNetworkAcl
         */

        
                public com.amazon.ec2.DeleteNetworkAclResponse deleteNetworkAcl
                (
                  com.amazon.ec2.DeleteNetworkAcl deleteNetworkAcl
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteRoute
         */

        
                public com.amazon.ec2.DeleteRouteResponse deleteRoute
                (
                  com.amazon.ec2.DeleteRoute deleteRoute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param rebootInstances
         */

        
                public com.amazon.ec2.RebootInstancesResponse rebootInstances
                (
                  com.amazon.ec2.RebootInstances rebootInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifyInstanceAttribute
         */

        
                public com.amazon.ec2.ModifyInstanceAttributeResponse modifyInstanceAttribute
                (
                  com.amazon.ec2.ModifyInstanceAttribute modifyInstanceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param terminateInstances
         */

        
                public com.amazon.ec2.TerminateInstancesResponse terminateInstances
                (
                  com.amazon.ec2.TerminateInstances terminateInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpnConnectionRoute
         */

        
                public com.amazon.ec2.CreateVpnConnectionRouteResponse createVpnConnectionRoute
                (
                  com.amazon.ec2.CreateVpnConnectionRoute createVpnConnectionRoute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeConversionTasks
         */

        
                public com.amazon.ec2.DescribeConversionTasksResponse describeConversionTasks
                (
                  com.amazon.ec2.DescribeConversionTasks describeConversionTasks
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeAddresses
         */

        
                public com.amazon.ec2.DescribeAddressesResponse describeAddresses
                (
                  com.amazon.ec2.DescribeAddresses describeAddresses
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeInstanceAttribute
         */

        
                public com.amazon.ec2.DescribeInstanceAttributeResponse describeInstanceAttribute
                (
                  com.amazon.ec2.DescribeInstanceAttribute describeInstanceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param attachInternetGateway
         */

        
                public com.amazon.ec2.AttachInternetGatewayResponse attachInternetGateway
                (
                  com.amazon.ec2.AttachInternetGateway attachInternetGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpc
         */

        
                public com.amazon.ec2.CreateVpcResponse createVpc
                (
                  com.amazon.ec2.CreateVpc createVpc
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param replaceRouteTableAssociation
         */

        
                public com.amazon.ec2.ReplaceRouteTableAssociationResponse replaceRouteTableAssociation
                (
                  com.amazon.ec2.ReplaceRouteTableAssociation replaceRouteTableAssociation
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param associateRouteTable
         */

        
                public com.amazon.ec2.AssociateRouteTableResponse associateRouteTable
                (
                  com.amazon.ec2.AssociateRouteTable associateRouteTable
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param detachInternetGateway
         */

        
                public com.amazon.ec2.DetachInternetGatewayResponse detachInternetGateway
                (
                  com.amazon.ec2.DetachInternetGateway detachInternetGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param purchaseReservedInstancesOffering
         */

        
                public com.amazon.ec2.PurchaseReservedInstancesOfferingResponse purchaseReservedInstancesOffering
                (
                  com.amazon.ec2.PurchaseReservedInstancesOffering purchaseReservedInstancesOffering
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param importVolume
         */

        
                public com.amazon.ec2.ImportVolumeResponse importVolume
                (
                  com.amazon.ec2.ImportVolume importVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeExportTasks
         */

        
                public com.amazon.ec2.DescribeExportTasksResponse describeExportTasks
                (
                  com.amazon.ec2.DescribeExportTasks describeExportTasks
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createInstanceExportTask
         */

        
                public com.amazon.ec2.CreateInstanceExportTaskResponse createInstanceExportTask
                (
                  com.amazon.ec2.CreateInstanceExportTask createInstanceExportTask
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param assignPrivateIpAddresses
         */

        
                public com.amazon.ec2.AssignPrivateIpAddressesResponse assignPrivateIpAddresses
                (
                  com.amazon.ec2.AssignPrivateIpAddresses assignPrivateIpAddresses
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param reportInstanceStatus
         */

        
                public com.amazon.ec2.ReportInstanceStatusResponse reportInstanceStatus
                (
                  com.amazon.ec2.ReportInstanceStatus reportInstanceStatus
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeReservedInstancesOfferings
         */

        
                public com.amazon.ec2.DescribeReservedInstancesOfferingsResponse describeReservedInstancesOfferings
                (
                  com.amazon.ec2.DescribeReservedInstancesOfferings describeReservedInstancesOfferings
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpnConnection
         */

        
                public com.amazon.ec2.DeleteVpnConnectionResponse deleteVpnConnection
                (
                  com.amazon.ec2.DeleteVpnConnection deleteVpnConnection
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteInternetGateway
         */

        
                public com.amazon.ec2.DeleteInternetGatewayResponse deleteInternetGateway
                (
                  com.amazon.ec2.DeleteInternetGateway deleteInternetGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSpotDatafeedSubscription
         */

        
                public com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse deleteSpotDatafeedSubscription
                (
                  com.amazon.ec2.DeleteSpotDatafeedSubscription deleteSpotDatafeedSubscription
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param attachNetworkInterface
         */

        
                public com.amazon.ec2.AttachNetworkInterfaceResponse attachNetworkInterface
                (
                  com.amazon.ec2.AttachNetworkInterface attachNetworkInterface
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createNetworkInterface
         */

        
                public com.amazon.ec2.CreateNetworkInterfaceResponse createNetworkInterface
                (
                  com.amazon.ec2.CreateNetworkInterface createNetworkInterface
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param revokeSecurityGroupEgress
         */

        
                public com.amazon.ec2.RevokeSecurityGroupEgressResponse revokeSecurityGroupEgress
                (
                  com.amazon.ec2.RevokeSecurityGroupEgress revokeSecurityGroupEgress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param monitorInstances
         */

        
                public com.amazon.ec2.MonitorInstancesResponse monitorInstances
                (
                  com.amazon.ec2.MonitorInstances monitorInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param replaceRoute
         */

        
                public com.amazon.ec2.ReplaceRouteResponse replaceRoute
                (
                  com.amazon.ec2.ReplaceRoute replaceRoute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param attachVolume
         */

        
                public com.amazon.ec2.AttachVolumeResponse attachVolume
                (
                  com.amazon.ec2.AttachVolume attachVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param getConsoleOutput
         */

        
                public com.amazon.ec2.GetConsoleOutputResponse getConsoleOutput
                (
                  com.amazon.ec2.GetConsoleOutput getConsoleOutput
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeRegions
         */

        
                public com.amazon.ec2.DescribeRegionsResponse describeRegions
                (
                  com.amazon.ec2.DescribeRegions describeRegions
                 )
            ;
        
         }
    