cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
19,026 lines • 1.77 MB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Ec2 = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [ec2](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Ec2 extends shared_1.PolicyStatement {
/**
* Grants permission to accept an Elastic IP address transfer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptAddressTransfer.html
*/
toAcceptAddressTransfer() {
return this.to('AcceptAddressTransfer');
}
/**
* Grants permission to accept assign billing of the available capacity of a shared Capacity Reservation to the calling account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptCapacityReservationBillingOwnership.html
*/
toAcceptCapacityReservationBillingOwnership() {
return this.to('AcceptCapacityReservationBillingOwnership');
}
/**
* Grants permission to accept a Convertible Reserved Instance exchange quote
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptReservedInstancesExchangeQuote.html
*/
toAcceptReservedInstancesExchangeQuote() {
return this.to('AcceptReservedInstancesExchangeQuote');
}
/**
* Grants permission to accept a request to associate subnets with a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptTransitGatewayMulticastDomainAssociations.html
*/
toAcceptTransitGatewayMulticastDomainAssociations() {
return this.to('AcceptTransitGatewayMulticastDomainAssociations');
}
/**
* Grants permission to accept a transit gateway peering attachment request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptTransitGatewayPeeringAttachment.html
*/
toAcceptTransitGatewayPeeringAttachment() {
return this.to('AcceptTransitGatewayPeeringAttachment');
}
/**
* Grants permission to accept a request to attach a VPC to a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptTransitGatewayVpcAttachment.html
*/
toAcceptTransitGatewayVpcAttachment() {
return this.to('AcceptTransitGatewayVpcAttachment');
}
/**
* Grants permission to accept one or more interface VPC endpoint connections to your VPC endpoint service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptVpcEndpointConnections.html
*/
toAcceptVpcEndpointConnections() {
return this.to('AcceptVpcEndpointConnections');
}
/**
* Grants permission to accept a VPC peering connection request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AcceptVpcPeeringConnection.html
*/
toAcceptVpcPeeringConnection() {
return this.to('AcceptVpcPeeringConnection');
}
/**
* Grants permission to advertise an IP address range that is provisioned for use in AWS through bring your own IP addresses (BYOIP)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AdvertiseByoipCidr.html
*/
toAdvertiseByoipCidr() {
return this.to('AdvertiseByoipCidr');
}
/**
* Grants permission to allocate an Elastic IP address (EIP) to your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateAddress.html
*/
toAllocateAddress() {
return this.to('AllocateAddress');
}
/**
* Grants permission to allocate a Dedicated Host to your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateHosts.html
*/
toAllocateHosts() {
return this.to('AllocateHosts');
}
/**
* Grants permission to allocate a CIDR from an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateIpamPoolCidr.html
*/
toAllocateIpamPoolCidr() {
return this.to('AllocateIpamPoolCidr');
}
/**
* Grants permission to apply a security group to the association between a Client VPN endpoint and a target network
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ApplySecurityGroupsToClientVpnTargetNetwork.html
*/
toApplySecurityGroupsToClientVpnTargetNetwork() {
return this.to('ApplySecurityGroupsToClientVpnTargetNetwork');
}
/**
* Grants permission to assign one or more IPv6 addresses to a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssignIpv6Addresses.html
*/
toAssignIpv6Addresses() {
return this.to('AssignIpv6Addresses');
}
/**
* Grants permission to assign one or more secondary private IP addresses to a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssignPrivateIpAddresses.html
*/
toAssignPrivateIpAddresses() {
return this.to('AssignPrivateIpAddresses');
}
/**
* Grants permission to assign one or more secondary private IP addresses to a private NAT gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssignPrivateNatGatewayAddress.html
*/
toAssignPrivateNatGatewayAddress() {
return this.to('AssignPrivateNatGatewayAddress');
}
/**
* Grants permission to associate an Elastic IP address (EIP) with an instance or a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateAddress.html
*/
toAssociateAddress() {
return this.to('AssociateAddress');
}
/**
* Grants permission to assign billing of the unused capacity of a shared Capacity Reservation to a consumer account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateCapacityReservationBillingOwner.html
*/
toAssociateCapacityReservationBillingOwner() {
return this.to('AssociateCapacityReservationBillingOwner');
}
/**
* Grants permission to associate a target network with a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateClientVpnTargetNetwork.html
*/
toAssociateClientVpnTargetNetwork() {
return this.to('AssociateClientVpnTargetNetwork');
}
/**
* Grants permission to associate or disassociate a set of DHCP options with a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateDhcpOptions.html
*/
toAssociateDhcpOptions() {
return this.to('AssociateDhcpOptions');
}
/**
* Grants permission to associate an ACM certificate with an IAM role to be used in an EC2 Enclave
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateEnclaveCertificateIamRole.html
*/
toAssociateEnclaveCertificateIamRole() {
return this.to('AssociateEnclaveCertificateIamRole');
}
/**
* Grants permission to associate an IAM instance profile with a running or stopped instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - iam:PassRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html
*/
toAssociateIamInstanceProfile() {
return this.to('AssociateIamInstanceProfile');
}
/**
* Grants permission to associate one or more targets with an event window
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateInstanceEventWindow.html
*/
toAssociateInstanceEventWindow() {
return this.to('AssociateInstanceEventWindow');
}
/**
* Grants permission to associate an Autonomous System Number (ASN) with a BYOIP CIDR
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIpamByoasn.html
*/
toAssociateIpamByoasn() {
return this.to('AssociateIpamByoasn');
}
/**
* Grants permission to associate an IPAM resource discovery with an Amazon VPC IPAM
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIpamResourceDiscovery.html
*/
toAssociateIpamResourceDiscovery() {
return this.to('AssociateIpamResourceDiscovery');
}
/**
* Grants permission to associate an Elastic IP address and private IP address with a public Nat gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateNatGatewayAddress.html
*/
toAssociateNatGatewayAddress() {
return this.to('AssociateNatGatewayAddress');
}
/**
* Grants permission to associate a route server with a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateRouteServer.html
*/
toAssociateRouteServer() {
return this.to('AssociateRouteServer');
}
/**
* Grants permission to associate a subnet or gateway with a route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateRouteTable.html
*/
toAssociateRouteTable() {
return this.to('AssociateRouteTable');
}
/**
* Grants permission to associate a security group with another VPC in the same Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateSecurityGroupVpc.html
*/
toAssociateSecurityGroupVpc() {
return this.to('AssociateSecurityGroupVpc');
}
/**
* Grants permission to associate a CIDR block with a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateSubnetCidrBlock.html
*/
toAssociateSubnetCidrBlock() {
return this.to('AssociateSubnetCidrBlock');
}
/**
* Grants permission to associate an attachment and list of subnets with a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateTransitGatewayMulticastDomain.html
*/
toAssociateTransitGatewayMulticastDomain() {
return this.to('AssociateTransitGatewayMulticastDomain');
}
/**
* Grants permission to associate a policy table with a transit gateway attachment
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateTransitGatewayPolicyTable.html
*/
toAssociateTransitGatewayPolicyTable() {
return this.to('AssociateTransitGatewayPolicyTable');
}
/**
* Grants permission to associate an attachment with a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateTransitGatewayRouteTable.html
*/
toAssociateTransitGatewayRouteTable() {
return this.to('AssociateTransitGatewayRouteTable');
}
/**
* Grants permission to associate a branch network interface with a trunk network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateTrunkInterface.html
*/
toAssociateTrunkInterface() {
return this.to('AssociateTrunkInterface');
}
/**
* Grants permission to associate an AWS Web Application Firewall (WAF) web access control list (ACL) with a Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/verified-access/latest/ug/waf-integration.html
*/
toAssociateVerifiedAccessInstanceWebAcl() {
return this.to('AssociateVerifiedAccessInstanceWebAcl');
}
/**
* Grants permission to associate a CIDR block with a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateVpcCidrBlock.html
*/
toAssociateVpcCidrBlock() {
return this.to('AssociateVpcCidrBlock');
}
/**
* Grants permission to link an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC's security groups
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachClassicLinkVpc.html
*/
toAttachClassicLinkVpc() {
return this.to('AttachClassicLinkVpc');
}
/**
* Grants permission to attach an internet gateway to a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachInternetGateway.html
*/
toAttachInternetGateway() {
return this.to('AttachInternetGateway');
}
/**
* Grants permission to attach a network interface to an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachNetworkInterface.html
*/
toAttachNetworkInterface() {
return this.to('AttachNetworkInterface');
}
/**
* Grants permission to attach a trust provider to a Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachVerifiedAccessTrustProvider.html
*/
toAttachVerifiedAccessTrustProvider() {
return this.to('AttachVerifiedAccessTrustProvider');
}
/**
* Grants permission to attach an EBS volume to a running or stopped instance and expose it to the instance with the specified device name
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachVolume.html
*/
toAttachVolume() {
return this.to('AttachVolume');
}
/**
* Grants permission to attach a virtual private gateway to a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttachVpnGateway.html
*/
toAttachVpnGateway() {
return this.to('AttachVpnGateway');
}
/**
* Grants permission to add an inbound authorization rule to a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AuthorizeClientVpnIngress.html
*/
toAuthorizeClientVpnIngress() {
return this.to('AuthorizeClientVpnIngress');
}
/**
* Grants permission to add one or more outbound rules to a VPC security group. Policies using the security-group-rule resource-level permission are only enforced when the API request includes TagSpecifications
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AuthorizeSecurityGroupEgress.html
*/
toAuthorizeSecurityGroupEgress() {
return this.to('AuthorizeSecurityGroupEgress');
}
/**
* Grants permission to add one or more inbound rules to a VPC security group. Policies using the security-group-rule resource-level permission are only enforced when the API request includes TagSpecifications
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AuthorizeSecurityGroupIngress.html
*/
toAuthorizeSecurityGroupIngress() {
return this.to('AuthorizeSecurityGroupIngress');
}
/**
* Grants permission to bundle an instance store-backed Windows instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_BundleInstance.html
*/
toBundleInstance() {
return this.to('BundleInstance');
}
/**
* Grants permission to cancel a bundling operation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelBundleTask.html
*/
toCancelBundleTask() {
return this.to('CancelBundleTask');
}
/**
* Grants permission to cancel a Capacity Reservation and release the reserved capacity
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelCapacityReservation.html
*/
toCancelCapacityReservation() {
return this.to('CancelCapacityReservation');
}
/**
* Grants permission to cancel one or more Capacity Reservation Fleets
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CancelCapacityReservation
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelCapacityReservationFleets.html
*/
toCancelCapacityReservationFleets() {
return this.to('CancelCapacityReservationFleets');
}
/**
* Grants permission to cancel an active conversion task
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelConversionTask.html
*/
toCancelConversionTask() {
return this.to('CancelConversionTask');
}
/**
* Grants permission to cancel a declarative policies report
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelDeclarativePoliciesReport.html
*/
toCancelDeclarativePoliciesReport() {
return this.to('CancelDeclarativePoliciesReport');
}
/**
* Grants permission to cancel an active export task
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelExportTask.html
*/
toCancelExportTask() {
return this.to('CancelExportTask');
}
/**
* Grants permission to remove your AWS account from the launch permissions for the specified AMI
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelImageLaunchPermission.html
*/
toCancelImageLaunchPermission() {
return this.to('CancelImageLaunchPermission');
}
/**
* Grants permission to cancel an in-process import virtual machine or import snapshot task
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelImportTask.html
*/
toCancelImportTask() {
return this.to('CancelImportTask');
}
/**
* Grants permission to cancel a Reserved Instance listing on the Reserved Instance Marketplace
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelReservedInstancesListing.html
*/
toCancelReservedInstancesListing() {
return this.to('CancelReservedInstancesListing');
}
/**
* Grants permission to cancel one or more Spot Fleet requests
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelSpotFleetRequests.html
*/
toCancelSpotFleetRequests() {
return this.to('CancelSpotFleetRequests');
}
/**
* Grants permission to cancel one or more Spot Instance requests
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelSpotInstanceRequests.html
*/
toCancelSpotInstanceRequests() {
return this.to('CancelSpotInstanceRequests');
}
/**
* Grants permission to determine whether an owned product code is associated with an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ConfirmProductInstance.html
*/
toConfirmProductInstance() {
return this.to('ConfirmProductInstance');
}
/**
* Grants permission to copy a source Amazon FPGA image (AFI) to the current Region. Resource-level permissions specified for this action apply to the new AFI only. They do not apply to the source AFI
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CopyFpgaImage.html
*/
toCopyFpgaImage() {
return this.to('CopyFpgaImage');
}
/**
* Grants permission to copy an Amazon Machine Image (AMI) from a source Region to the current Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CopyImage.html
*/
toCopyImage() {
return this.to('CopyImage');
}
/**
* Grants permission to copy a point-in-time snapshot of an EBS volume and store it in Amazon S3. Resource-level permissions specified for this action apply to both the snapshot copy and the source snapshot
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CopySnapshot.html
*/
toCopySnapshot() {
return this.to('CopySnapshot');
}
/**
* Grants permission to create a Capacity Reservation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCapacityReservation.html
*/
toCreateCapacityReservation() {
return this.to('CreateCapacityReservation');
}
/**
* Grants permission to create a new Capacity Reservation by splitting the available capacity of the source Capacity Reservation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCapacityReservationBySplitting.html
*/
toCreateCapacityReservationBySplitting() {
return this.to('CreateCapacityReservationBySplitting');
}
/**
* Grants permission to create a Capacity Reservation Fleet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateCapacityReservation
* - ec2:CreateTags
* - ec2:DescribeCapacityReservations
* - ec2:DescribeInstances
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCapacityReservationFleet.html
*/
toCreateCapacityReservationFleet() {
return this.to('CreateCapacityReservationFleet');
}
/**
* Grants permission to create a carrier gateway and provides CSP connectivity to VPC customers
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCarrierGateway.html
*/
toCreateCarrierGateway() {
return this.to('CreateCarrierGateway');
}
/**
* Grants permission to create a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateClientVpnEndpoint.html
*/
toCreateClientVpnEndpoint() {
return this.to('CreateClientVpnEndpoint');
}
/**
* Grants permission to add a network route to a Client VPN endpoint's route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateClientVpnRoute.html
*/
toCreateClientVpnRoute() {
return this.to('CreateClientVpnRoute');
}
/**
* Grants permission to create a range of customer-owned IP (CoIP) addresses
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCoipCidr.html
*/
toCreateCoipCidr() {
return this.to('CreateCoipCidr');
}
/**
* Grants permission to create a pool of customer-owned IP (CoIP) addresses
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCoipPool.html
*/
toCreateCoipPool() {
return this.to('CreateCoipPool');
}
/**
* Grants permission to allow a service to access a customer-owned IP (CoIP) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/outposts/latest/userguide/identity-access-management.html
*/
toCreateCoipPoolPermission() {
return this.to('CreateCoipPoolPermission');
}
/**
* Grants permission to create a customer gateway, which provides information to AWS about your customer gateway device
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateCustomerGateway.html
*/
toCreateCustomerGateway() {
return this.to('CreateCustomerGateway');
}
/**
* Grants permission to create a default subnet in a specified Availability Zone in a default VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateDefaultSubnet.html
*/
toCreateDefaultSubnet() {
return this.to('CreateDefaultSubnet');
}
/**
* Grants permission to create a default VPC with a default subnet in each Availability Zone
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateDefaultVpc.html
*/
toCreateDefaultVpc() {
return this.to('CreateDefaultVpc');
}
/**
* Grants permission to create a set of DHCP options for a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateDhcpOptions.html
*/
toCreateDhcpOptions() {
return this.to('CreateDhcpOptions');
}
/**
* Grants permission to create an egress-only internet gateway for a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateEgressOnlyInternetGateway.html
*/
toCreateEgressOnlyInternetGateway() {
return this.to('CreateEgressOnlyInternetGateway');
}
/**
* Grants permission to launch an EC2 Fleet. Resource-level permissions for this action do not include the resources specified in a launch template. To specify resource-level permissions for resources specified in a launch template, you must include the resources in the RunInstances action statement
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html
*/
toCreateFleet() {
return this.to('CreateFleet');
}
/**
* Grants permission to create one or more flow logs to capture IP traffic for a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - ecs:ListClusters
* - ecs:ListContainerInstances
* - ecs:ListServices
* - ecs:ListTaskDefinitions
* - ecs:ListTasks
* - iam:PassRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFlowLogs.html
*/
toCreateFlowLogs() {
return this.to('CreateFlowLogs');
}
/**
* Grants permission to create an Amazon FPGA Image (AFI) from a design checkpoint (DCP)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFpgaImage.html
*/
toCreateFpgaImage() {
return this.to('CreateFpgaImage');
}
/**
* Grants permission to create an Amazon EBS-backed AMI from a stopped or running Amazon EBS-backed instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html
*/
toCreateImage() {
return this.to('CreateImage');
}
/**
* Grants permission to create an EC2 Instance Connect Endpoint that allows you to connect to an instance without a public IPv4 address
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateInstanceConnectEndpoint.html
*/
toCreateInstanceConnectEndpoint() {
return this.to('CreateInstanceConnectEndpoint');
}
/**
* Grants permission to create an event window in which scheduled events for the associated Amazon EC2 instances can run
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateInstanceEventWindow.html
*/
toCreateInstanceEventWindow() {
return this.to('CreateInstanceEventWindow');
}
/**
* Grants permission to export a running or stopped instance to an Amazon S3 bucket
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateInstanceExportTask.html
*/
toCreateInstanceExportTask() {
return this.to('CreateInstanceExportTask');
}
/**
* Grants permission to create an internet gateway for a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateInternetGateway.html
*/
toCreateInternetGateway() {
return this.to('CreateInternetGateway');
}
/**
* Grants permission to create an Amazon VPC IP Address Manager (IPAM)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - iam:CreateServiceLinkedRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateIpam.html
*/
toCreateIpam() {
return this.to('CreateIpam');
}
/**
* Grants permission to create a verification token, which proves ownership of an external resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateIpamExternalResourceVerificationToken.html
*/
toCreateIpamExternalResourceVerificationToken() {
return this.to('CreateIpamExternalResourceVerificationToken');
}
/**
* Grants permission to create an IP address pool for Amazon VPC IP Address Manager (IPAM), which is a collection of contiguous IP address CIDRs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateIpamPool.html
*/
toCreateIpamPool() {
return this.to('CreateIpamPool');
}
/**
* Grants permission to create an IPAM resource discovery
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - iam:CreateServiceLinkedRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateIpamResourceDiscovery.html
*/
toCreateIpamResourceDiscovery() {
return this.to('CreateIpamResourceDiscovery');
}
/**
* Grants permission to create an Amazon VPC IP Address Manager (IPAM) scope, which is the highest-level container within IPAM
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateIpamScope.html
*/
toCreateIpamScope() {
return this.to('CreateIpamScope');
}
/**
* Grants permission to create a 2048-bit RSA key pair
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html
*/
toCreateKeyPair() {
return this.to('CreateKeyPair');
}
/**
* Grants permission to create a launch template
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - ssm:GetParameters
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLaunchTemplate.html
*/
toCreateLaunchTemplate() {
return this.to('CreateLaunchTemplate');
}
/**
* Grants permission to create a new version of a launch template
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ssm:GetParameters
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLaunchTemplateVersion.html
*/
toCreateLaunchTemplateVersion() {
return this.to('CreateLaunchTemplateVersion');
}
/**
* Grants permission to create a static route for a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLocalGatewayRoute.html
*/
toCreateLocalGatewayRoute() {
return this.to('CreateLocalGatewayRoute');
}
/**
* Grants permission to create a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLocalGatewayRouteTable.html
*/
toCreateLocalGatewayRouteTable() {
return this.to('CreateLocalGatewayRouteTable');
}
/**
* Grants permission to allow a service to access a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/outposts/latest/userguide/identity-access-management.html
*/
toCreateLocalGatewayRouteTablePermission() {
return this.to('CreateLocalGatewayRouteTablePermission');
}
/**
* Grants permission to create a local gateway route table virtual interface group association
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation.html
*/
toCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation() {
return this.to('CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation');
}
/**
* Grants permission to associate a VPC with a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLocalGatewayRouteTableVpcAssociation.html
*/
toCreateLocalGatewayRouteTableVpcAssociation() {
return this.to('CreateLocalGatewayRouteTableVpcAssociation');
}
/**
* Grants permission to create a local gateway virtual interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLocalGatewayVirtualInterface.html
*/
toCreateLocalGatewayVirtualInterface() {
return this.to('CreateLocalGatewayVirtualInterface');
}
/**
* Grants permission to create a local gateway virtual interface group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLocalGatewayVirtualInterfaceGroup.html
*/
toCreateLocalGatewayVirtualInterfaceGroup() {
return this.to('CreateLocalGatewayVirtualInterfaceGroup');
}
/**
* Grants permission to create a managed prefix list
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateManagedPrefixList.html
*/
toCreateManagedPrefixList() {
return this.to('CreateManagedPrefixList');
}
/**
* Grants permission to create a NAT gateway in a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNatGateway.html
*/
toCreateNatGateway() {
return this.to('CreateNatGateway');
}
/**
* Grants permission to create a network ACL in a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkAcl.html
*/
toCreateNetworkAcl() {
return this.to('CreateNetworkAcl');
}
/**
* Grants permission to create a numbered entry (a rule) in a network ACL
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkAclEntry.html
*/
toCreateNetworkAclEntry() {
return this.to('CreateNetworkAclEntry');
}
/**
* Grants permission to create a Network Access Scope
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInsightsAccessScope.html
*/
toCreateNetworkInsightsAccessScope() {
return this.to('CreateNetworkInsightsAccessScope');
}
/**
* Grants permission to create a path to analyze for reachability
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInsightsPath.html
*/
toCreateNetworkInsightsPath() {
return this.to('CreateNetworkInsightsPath');
}
/**
* Grants permission to create a network interface in a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html
*/
toCreateNetworkInterface() {
return this.to('CreateNetworkInterface');
}
/**
* Grants permission to create a permission for an AWS-authorized user to perform certain operations on a network interface
*
* Access Level: Permissions management
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterfacePermission.html
*/
toCreateNetworkInterfacePermission() {
return this.to('CreateNetworkInterfacePermission');
}
/**
* Grants permission to create a placement group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreatePlacementGroup.html
*/
toCreatePlacementGroup() {
return this.to('CreatePlacementGroup');
}
/**
* Grants permission to create a public IPv4 address pool for public IPv4 CIDRs that you own and bring to Amazon to manage with Amazon VPC IP Address Manager (IPAM)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreatePublicIpv4Pool.html
*/
toCreatePublicIpv4Pool() {
return this.to('CreatePublicIpv4Pool');
}
/**
* Grants permission to create a root volume replacement task
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateReplaceRootVolumeTask.html
*/
toCreateReplaceRootVolumeTask() {
return this.to('CreateReplaceRootVolumeTask');
}
/**
* Grants permission to create a listing for Standard Reserved Instances to be sold in the Reserved Instance Marketplace
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateReservedInstancesListing.html
*/
toCreateReservedInstancesListing() {
return this.to('CreateReservedInstancesListing');
}
/**
* Grants permission to start a task that restores an AMI from an S3 object previously created by using CreateStoreImageTask
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRestoreImageTask.html
*/
toCreateRestoreImageTask() {
return this.to('CreateRestoreImageTask');
}
/**
* Grants permission to create a route in a VPC route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRoute.html
*/
toCreateRoute() {
return this.to('CreateRoute');
}
/**
* Grants permission to create a route server
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - sns:CreateTopic
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRouteServer.html
*/
toCreateRouteServer() {
return this.to('CreateRouteServer');
}
/**
* Grants permission to create a route server endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:AuthorizeSecurityGroupIngress
* - ec2:CreateNetworkInterface
* - ec2:CreateNetworkInterfacePermission
* - ec2:CreateSecurityGroup
* - ec2:CreateTags
* - ec2:DescribeSecurityGroups
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRouteServerEndpoint.html
*/
toCreateRouteServerEndpoint() {
return this.to('CreateRouteServerEndpoint');
}
/**
* Grants permission to create a route server peer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:AuthorizeSecurityGroupIngress
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRouteServerPeer.html
*/
toCreateRouteServerPeer() {
return this.to('CreateRouteServerPeer');
}
/**
* Grants permission to create a route table for a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateRouteTable.html
*/
toCreateRouteTable() {
return this.to('CreateRouteTable');
}
/**
* Grants permission to create a security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSecurityGroup.html
*/
toCreateSecurityGroup() {
return this.to('CreateSecurityGroup');
}
/**
* Grants permission to create a snapshot of an EBS volume and store it in Amazon S3
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSnapshot.html
*/
toCreateSnapshot() {
return this.to('CreateSnapshot');
}
/**
* Grants permission to create crash-consistent snapshots of multiple EBS volumes and store them in Amazon S3
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSnapshots.html
*/
toCreateSnapshots() {
return this.to('CreateSnapshots');
}
/**
* Grants permission to create a data feed for Spot Instances to view Spot Instance usage logs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSpotDatafeedSubscription.html
*/
toCreateSpotDatafeedSubscription() {
return this.to('CreateSpotDatafeedSubscription');
}
/**
* Grants permission to store an AMI as a single object in an S3 bucket
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateStoreImageTask.html
*/
toCreateStoreImageTask() {
return this.to('CreateStoreImageTask');
}
/**
* Grants permission to create a subnet in a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSubnet.html
*/
toCreateSubnet() {
return this.to('CreateSubnet');
}
/**
* Grants permission to create a subnet CIDR reservation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSubnetCidrReservation.html
*/
toCreateSubnetCidrReservation() {
return this.to('CreateSubnetCidrReservation');
}
/**
* Grants permission to add or overwrite one or more tags for Amazon EC2 resources
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifCreateAction()
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html
*/
toCreateTags() {
return this.to('CreateTags');
}
/**
* Grants permission to create a traffic mirror filter
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorFilter.html
*/
toCreateTrafficMirrorFilter() {
return this.to('CreateTrafficMirrorFilter');
}
/**
* Grants permission to create a traffic mirror filter rule
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorFilterRule.html
*/
toCreateTrafficMirrorFilterRule() {
return this.to('CreateTrafficMirrorFilterRule');
}
/**
* Grants permission to create a traffic mirror session
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorSession.html
*/
toCreateTrafficMirrorSession() {
return this.to('CreateTrafficMirrorSession');
}
/**
* Grants permission to create a traffic mirror target
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorTarget.html
*/
toCreateTrafficMirrorTarget() {
return this.to('CreateTrafficMirrorTarget');
}
/**
* Grants permission to create a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGateway.html
*/
toCreateTransitGateway() {
return this.to('CreateTransitGateway');
}
/**
* Grants permission to create a Connect attachment from a specified transit gateway attachment
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayConnect.html
*/
toCreateTransitGatewayConnect() {
return this.to('CreateTransitGatewayConnect');
}
/**
* Grants permission to create a Connect peer between a transit gateway and an appliance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayConnectPeer.html
*/
toCreateTransitGatewayConnectPeer() {
return this.to('CreateTransitGatewayConnectPeer');
}
/**
* Grants permission to create a multicast domain for a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayMulticastDomain.html
*/
toCreateTransitGatewayMulticastDomain() {
return this.to('CreateTransitGatewayMulticastDomain');
}
/**
* Grants permission to request a transit gateway peering attachment between a requester and accepter transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayPeeringAttachment.html
*/
toCreateTransitGatewayPeeringAttachment() {
return this.to('CreateTransitGatewayPeeringAttachment');
}
/**
* Grants permission to create a transit gateway policy table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayPolicyTable.html
*/
toCreateTransitGatewayPolicyTable() {
return this.to('CreateTransitGatewayPolicyTable');
}
/**
* Grants permission to create a transit gateway prefix list reference
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayPrefixListReference.html
*/
toCreateTransitGatewayPrefixListReference() {
return this.to('CreateTransitGatewayPrefixListReference');
}
/**
* Grants permission to create a static route for a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayRoute.html
*/
toCreateTransitGatewayRoute() {
return this.to('CreateTransitGatewayRoute');
}
/**
* Grants permission to create a route table for a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayRouteTable.html
*/
toCreateTransitGatewayRouteTable() {
return this.to('CreateTransitGatewayRouteTable');
}
/**
* Grants permission to create an announcement for a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayRouteTableAnnouncement.html
*/
toCreateTransitGatewayRouteTableAnnouncement() {
return this.to('CreateTransitGatewayRouteTableAnnouncement');
}
/**
* Grants permission to attach a VPC to a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTransitGatewayVpcAttachment.html
*/
toCreateTransitGatewayVpcAttachment() {
return this.to('CreateTransitGatewayVpcAttachment');
}
/**
* Grants permission to create a Verified Access endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVerifiedAccessEndpoint.html
*/
toCreateVerifiedAccessEndpoint() {
return this.to('CreateVerifiedAccessEndpoint');
}
/**
* Grants permission to create a Verified Access group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVerifiedAccessGroup.html
*/
toCreateVerifiedAccessGroup() {
return this.to('CreateVerifiedAccessGroup');
}
/**
* Grants permission to create a Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVerifiedAccessInstance.html
*/
toCreateVerifiedAccessInstance() {
return this.to('CreateVerifiedAccessInstance');
}
/**
* Grants permission to create a verified trust provider
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVerifiedAccessTrustProvider.html
*/
toCreateVerifiedAccessTrustProvider() {
return this.to('CreateVerifiedAccessTrustProvider');
}
/**
* Grants permission to create an EBS volume
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html
*/
toCreateVolume() {
return this.to('CreateVolume');
}
/**
* Grants permission to create a VPC with a specified CIDR block
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpc.html
*/
toCreateVpc() {
return this.to('CreateVpc');
}
/**
* Grants permission to create an exclusion list for blocked public access on a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpcBlockPublicAccessExclusion.html
*/
toCreateVpcBlockPublicAccessExclusion() {
return this.to('CreateVpcBlockPublicAccessExclusion');
}
/**
* Grants permission to create a VPC endpoint for an AWS service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - route53:AssociateVPCWithHostedZone
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpcEndpoint.html
*/
toCreateVpcEndpoint() {
return this.to('CreateVpcEndpoint');
}
/**
* Grants permission to create a connection notification for a VPC endpoint or VPC endpoint service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpcEndpointConnectionNotification.html
*/
toCreateVpcEndpointConnectionNotification() {
return this.to('CreateVpcEndpointConnectionNotification');
}
/**
* Grants permission to create a VPC endpoint service configuration to which service consumers (AWS accounts, IAM users, and IAM roles) can connect
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpcEndpointServiceConfiguration.html
*/
toCreateVpcEndpointServiceConfiguration() {
return this.to('CreateVpcEndpointServiceConfiguration');
}
/**
* Grants permission to request a VPC peering connection between two VPCs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpcPeeringConnection.html
*/
toCreateVpcPeeringConnection() {
return this.to('CreateVpcPeeringConnection');
}
/**
* Grants permission to create a VPN connection between a virtual private gateway or transit gateway and a customer gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpnConnection.html
*/
toCreateVpnConnection() {
return this.to('CreateVpnConnection');
}
/**
* Grants permission to create a static route for a VPN connection between a virtual private gateway and a customer gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpnConnectionRoute.html
*/
toCreateVpnConnectionRoute() {
return this.to('CreateVpnConnectionRoute');
}
/**
* Grants permission to create a virtual private gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVpnGateway.html
*/
toCreateVpnGateway() {
return this.to('CreateVpnGateway');
}
/**
* Grants permission to delete a carrier gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteCarrierGateway.html
*/
toDeleteCarrierGateway() {
return this.to('DeleteCarrierGateway');
}
/**
* Grants permission to delete a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteClientVpnEndpoint.html
*/
toDeleteClientVpnEndpoint() {
return this.to('DeleteClientVpnEndpoint');
}
/**
* Grants permission to delete a route from a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteClientVpnRoute.html
*/
toDeleteClientVpnRoute() {
return this.to('DeleteClientVpnRoute');
}
/**
* Grants permission to delete a range of customer-owned IP (CoIP) addresses
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteCoipCidr.html
*/
toDeleteCoipCidr() {
return this.to('DeleteCoipCidr');
}
/**
* Grants permission to delete a pool of customer-owned IP (CoIP) addresses
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteCoipPool.html
*/
toDeleteCoipPool() {
return this.to('DeleteCoipPool');
}
/**
* Grants permission to deny a service from accessing a customer-owned IP (CoIP) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/outposts/latest/userguide/identity-access-management.html
*/
toDeleteCoipPoolPermission() {
return this.to('DeleteCoipPoolPermission');
}
/**
* Grants permission to delete a customer gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteCustomerGateway.html
*/
toDeleteCustomerGateway() {
return this.to('DeleteCustomerGateway');
}
/**
* Grants permission to delete a set of DHCP options
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteDhcpOptions.html
*/
toDeleteDhcpOptions() {
return this.to('DeleteDhcpOptions');
}
/**
* Grants permission to delete an egress-only internet gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteEgressOnlyInternetGateway.html
*/
toDeleteEgressOnlyInternetGateway() {
return this.to('DeleteEgressOnlyInternetGateway');
}
/**
* Grants permission to delete one or more EC2 Fleets
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteFleets.html
*/
toDeleteFleets() {
return this.to('DeleteFleets');
}
/**
* Grants permission to delete one or more flow logs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteFlowLogs.html
*/
toDeleteFlowLogs() {
return this.to('DeleteFlowLogs');
}
/**
* Grants permission to delete an Amazon FPGA Image (AFI)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteFpgaImage.html
*/
toDeleteFpgaImage() {
return this.to('DeleteFpgaImage');
}
/**
* Grants permission to delete an EC2 Instance Connect Endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteInstanceConnectEndpoint.html
*/
toDeleteInstanceConnectEndpoint() {
return this.to('DeleteInstanceConnectEndpoint');
}
/**
* Grants permission to delete the specified event window
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteInstanceEventWindow.html
*/
toDeleteInstanceEventWindow() {
return this.to('DeleteInstanceEventWindow');
}
/**
* Grants permission to delete an internet gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteInternetGateway.html
*/
toDeleteInternetGateway() {
return this.to('DeleteInternetGateway');
}
/**
* Grants permission to delete an Amazon VPC IP Address Manager (IPAM) and remove all monitored data associated with the IPAM including the historical data for CIDRs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteIpam.html
*/
toDeleteIpam() {
return this.to('DeleteIpam');
}
/**
* Grants permission to delete a verification token, which proves ownership of an external resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteIpamExternalResourceVerificationToken.html
*/
toDeleteIpamExternalResourceVerificationToken() {
return this.to('DeleteIpamExternalResourceVerificationToken');
}
/**
* Grants permission to delete an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteIpamPool.html
*/
toDeleteIpamPool() {
return this.to('DeleteIpamPool');
}
/**
* Grants permission to delete an IPAM resource discovery
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteIpamResourceDiscovery.html
*/
toDeleteIpamResourceDiscovery() {
return this.to('DeleteIpamResourceDiscovery');
}
/**
* Grants permission to delete the scope for an Amazon VPC IP Address Manager (IPAM)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteIpamScope.html
*/
toDeleteIpamScope() {
return this.to('DeleteIpamScope');
}
/**
* Grants permission to delete a key pair by removing the public key from Amazon EC2
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteKeyPair.html
*/
toDeleteKeyPair() {
return this.to('DeleteKeyPair');
}
/**
* Grants permission to delete a launch template and its associated versions
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLaunchTemplate.html
*/
toDeleteLaunchTemplate() {
return this.to('DeleteLaunchTemplate');
}
/**
* Grants permission to delete one or more versions of a launch template
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLaunchTemplateVersions.html
*/
toDeleteLaunchTemplateVersions() {
return this.to('DeleteLaunchTemplateVersions');
}
/**
* Grants permission to delete a route from a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLocalGatewayRoute.html
*/
toDeleteLocalGatewayRoute() {
return this.to('DeleteLocalGatewayRoute');
}
/**
* Grants permission to delete a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLocalGatewayRouteTable.html
*/
toDeleteLocalGatewayRouteTable() {
return this.to('DeleteLocalGatewayRouteTable');
}
/**
* Grants permission to deny a service from accessing a local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/outposts/latest/userguide/identity-access-management.html
*/
toDeleteLocalGatewayRouteTablePermission() {
return this.to('DeleteLocalGatewayRouteTablePermission');
}
/**
* Grants permission to delete a local gateway route table virtual interface group association
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation.html
*/
toDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation() {
return this.to('DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation');
}
/**
* Grants permission to delete an association between a VPC and local gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLocalGatewayRouteTableVpcAssociation.html
*/
toDeleteLocalGatewayRouteTableVpcAssociation() {
return this.to('DeleteLocalGatewayRouteTableVpcAssociation');
}
/**
* Grants permission to delete a local gateway virtual interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLocalGatewayVirtualInterface.html
*/
toDeleteLocalGatewayVirtualInterface() {
return this.to('DeleteLocalGatewayVirtualInterface');
}
/**
* Grants permission to delete a local gateway virtual interface group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteLocalGatewayVirtualInterfaceGroup.html
*/
toDeleteLocalGatewayVirtualInterfaceGroup() {
return this.to('DeleteLocalGatewayVirtualInterfaceGroup');
}
/**
* Grants permission to delete a managed prefix list
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteManagedPrefixList.html
*/
toDeleteManagedPrefixList() {
return this.to('DeleteManagedPrefixList');
}
/**
* Grants permission to delete a NAT gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNatGateway.html
*/
toDeleteNatGateway() {
return this.to('DeleteNatGateway');
}
/**
* Grants permission to delete a network ACL
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkAcl.html
*/
toDeleteNetworkAcl() {
return this.to('DeleteNetworkAcl');
}
/**
* Grants permission to delete an inbound or outbound entry (rule) from a network ACL
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkAclEntry.html
*/
toDeleteNetworkAclEntry() {
return this.to('DeleteNetworkAclEntry');
}
/**
* Grants permission to delete a Network Access Scope
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInsightsAccessScope.html
*/
toDeleteNetworkInsightsAccessScope() {
return this.to('DeleteNetworkInsightsAccessScope');
}
/**
* Grants permission to delete a Network Access Scope analysis
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInsightsAccessScopeAnalysis.html
*/
toDeleteNetworkInsightsAccessScopeAnalysis() {
return this.to('DeleteNetworkInsightsAccessScopeAnalysis');
}
/**
* Grants permission to delete a network insights analysis
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInsightsAnalysis.html
*/
toDeleteNetworkInsightsAnalysis() {
return this.to('DeleteNetworkInsightsAnalysis');
}
/**
* Grants permission to delete a network insights path
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInsightsPath.html
*/
toDeleteNetworkInsightsPath() {
return this.to('DeleteNetworkInsightsPath');
}
/**
* Grants permission to delete a detached network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html
*/
toDeleteNetworkInterface() {
return this.to('DeleteNetworkInterface');
}
/**
* Grants permission to delete a permission that is associated with a network interface
*
* Access Level: Permissions management
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterfacePermission.html
*/
toDeleteNetworkInterfacePermission() {
return this.to('DeleteNetworkInterfacePermission');
}
/**
* Grants permission to delete a placement group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeletePlacementGroup.html
*/
toDeletePlacementGroup() {
return this.to('DeletePlacementGroup');
}
/**
* Grants permission to delete a public IPv4 address pool for public IPv4 CIDRs that you own and brought to Amazon to manage with Amazon VPC IP Address Manager (IPAM)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeletePublicIpv4Pool.html
*/
toDeletePublicIpv4Pool() {
return this.to('DeletePublicIpv4Pool');
}
/**
* Grants permission to delete the queued purchases for the specified Reserved Instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteQueuedReservedInstances.html
*/
toDeleteQueuedReservedInstances() {
return this.to('DeleteQueuedReservedInstances');
}
/**
* Grants permission to remove an IAM policy that enables cross-account sharing from a resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/vpc/latest/ipam/share-pool-ipam.html
*/
toDeleteResourcePolicy() {
return this.to('DeleteResourcePolicy');
}
/**
* Grants permission to delete a route from a route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRoute.html
*/
toDeleteRoute() {
return this.to('DeleteRoute');
}
/**
* Grants permission to delete a route server
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - sns:DeleteTopic
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRouteServer.html
*/
toDeleteRouteServer() {
return this.to('DeleteRouteServer');
}
/**
* Grants permission to delete a route server endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:DeleteNetworkInterface
* - ec2:DeleteSecurityGroup
* - ec2:RevokeSecurityGroupIngress
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRouteServerEndpoint.html
*/
toDeleteRouteServerEndpoint() {
return this.to('DeleteRouteServerEndpoint');
}
/**
* Grants permission to delete a route server peer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:RevokeSecurityGroupIngress
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRouteServerPeer.html
*/
toDeleteRouteServerPeer() {
return this.to('DeleteRouteServerPeer');
}
/**
* Grants permission to delete a route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRouteTable.html
*/
toDeleteRouteTable() {
return this.to('DeleteRouteTable');
}
/**
* Grants permission to delete a security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSecurityGroup.html
*/
toDeleteSecurityGroup() {
return this.to('DeleteSecurityGroup');
}
/**
* Grants permission to delete a snapshot of an EBS volume
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSnapshot.html
*/
toDeleteSnapshot() {
return this.to('DeleteSnapshot');
}
/**
* Grants permission to delete a data feed for Spot Instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSpotDatafeedSubscription.html
*/
toDeleteSpotDatafeedSubscription() {
return this.to('DeleteSpotDatafeedSubscription');
}
/**
* Grants permission to delete a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSubnet.html
*/
toDeleteSubnet() {
return this.to('DeleteSubnet');
}
/**
* Grants permission to delete a subnet CIDR reservation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSubnetCidrReservation.html
*/
toDeleteSubnetCidrReservation() {
return this.to('DeleteSubnetCidrReservation');
}
/**
* Grants permission to delete one or more tags from Amazon EC2 resources
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTags.html
*/
toDeleteTags() {
return this.to('DeleteTags');
}
/**
* Grants permission to delete a traffic mirror filter
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTrafficMirrorFilter.html
*/
toDeleteTrafficMirrorFilter() {
return this.to('DeleteTrafficMirrorFilter');
}
/**
* Grants permission to delete a traffic mirror filter rule
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTrafficMirrorFilterRule.html
*/
toDeleteTrafficMirrorFilterRule() {
return this.to('DeleteTrafficMirrorFilterRule');
}
/**
* Grants permission to delete a traffic mirror session
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTrafficMirrorSession.html
*/
toDeleteTrafficMirrorSession() {
return this.to('DeleteTrafficMirrorSession');
}
/**
* Grants permission to delete a traffic mirror target
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTrafficMirrorTarget.html
*/
toDeleteTrafficMirrorTarget() {
return this.to('DeleteTrafficMirrorTarget');
}
/**
* Grants permission to delete a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGateway.html
*/
toDeleteTransitGateway() {
return this.to('DeleteTransitGateway');
}
/**
* Grants permission to delete a transit gateway connect attachment
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayConnect.html
*/
toDeleteTransitGatewayConnect() {
return this.to('DeleteTransitGatewayConnect');
}
/**
* Grants permission to delete a transit gateway connect peer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayConnectPeer.html
*/
toDeleteTransitGatewayConnectPeer() {
return this.to('DeleteTransitGatewayConnectPeer');
}
/**
* Grants permission to delete a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayMulticastDomain.html
*/
toDeleteTransitGatewayMulticastDomain() {
return this.to('DeleteTransitGatewayMulticastDomain');
}
/**
* Grants permission to delete a peering attachment from a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayPeeringAttachment.html
*/
toDeleteTransitGatewayPeeringAttachment() {
return this.to('DeleteTransitGatewayPeeringAttachment');
}
/**
* Grants permission to delete a transit gateway policy table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayPolicyTable.html
*/
toDeleteTransitGatewayPolicyTable() {
return this.to('DeleteTransitGatewayPolicyTable');
}
/**
* Grants permission to delete a transit gateway prefix list reference
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayPrefixListReference.html
*/
toDeleteTransitGatewayPrefixListReference() {
return this.to('DeleteTransitGatewayPrefixListReference');
}
/**
* Grants permission to delete a route from a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayRoute.html
*/
toDeleteTransitGatewayRoute() {
return this.to('DeleteTransitGatewayRoute');
}
/**
* Grants permission to delete a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayRouteTable.html
*/
toDeleteTransitGatewayRouteTable() {
return this.to('DeleteTransitGatewayRouteTable');
}
/**
* Grants permission to delete a transit gateway route table announcement
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayRouteTableAnnouncement.html
*/
toDeleteTransitGatewayRouteTableAnnouncement() {
return this.to('DeleteTransitGatewayRouteTableAnnouncement');
}
/**
* Grants permission to delete a VPC attachment from a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteTransitGatewayVpcAttachment.html
*/
toDeleteTransitGatewayVpcAttachment() {
return this.to('DeleteTransitGatewayVpcAttachment');
}
/**
* Grants permission to delete a Verified Access endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVerifiedAccessEndpoint.html
*/
toDeleteVerifiedAccessEndpoint() {
return this.to('DeleteVerifiedAccessEndpoint');
}
/**
* Grants permission to delete a Verified Access group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVerifiedAccessGroup.html
*/
toDeleteVerifiedAccessGroup() {
return this.to('DeleteVerifiedAccessGroup');
}
/**
* Grants permission to delete a Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVerifiedAccessInstance.html
*/
toDeleteVerifiedAccessInstance() {
return this.to('DeleteVerifiedAccessInstance');
}
/**
* Grants permission to delete a verified trust provider
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVerifiedAccessTrustProvider.html
*/
toDeleteVerifiedAccessTrustProvider() {
return this.to('DeleteVerifiedAccessTrustProvider');
}
/**
* Grants permission to delete an EBS volume
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVolume.html
*/
toDeleteVolume() {
return this.to('DeleteVolume');
}
/**
* Grants permission to delete a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpc.html
*/
toDeleteVpc() {
return this.to('DeleteVpc');
}
/**
* Grants permission to delete an exclusion list for blocked public access on a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpcBlockPublicAccessExclusion.html
*/
toDeleteVpcBlockPublicAccessExclusion() {
return this.to('DeleteVpcBlockPublicAccessExclusion');
}
/**
* Grants permission to delete one or more VPC endpoint connection notifications
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpcEndpointConnectionNotifications.html
*/
toDeleteVpcEndpointConnectionNotifications() {
return this.to('DeleteVpcEndpointConnectionNotifications');
}
/**
* Grants permission to delete one or more VPC endpoint service configurations
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpcEndpointServiceConfigurations.html
*/
toDeleteVpcEndpointServiceConfigurations() {
return this.to('DeleteVpcEndpointServiceConfigurations');
}
/**
* Grants permission to delete one or more VPC endpoints
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpcEndpoints.html
*/
toDeleteVpcEndpoints() {
return this.to('DeleteVpcEndpoints');
}
/**
* Grants permission to delete a VPC peering connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpcPeeringConnection.html
*/
toDeleteVpcPeeringConnection() {
return this.to('DeleteVpcPeeringConnection');
}
/**
* Grants permission to delete a VPN connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpnConnection.html
*/
toDeleteVpnConnection() {
return this.to('DeleteVpnConnection');
}
/**
* Grants permission to delete a static route for a VPN connection between a virtual private gateway and a customer gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpnConnectionRoute.html
*/
toDeleteVpnConnectionRoute() {
return this.to('DeleteVpnConnectionRoute');
}
/**
* Grants permission to delete a virtual private gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteVpnGateway.html
*/
toDeleteVpnGateway() {
return this.to('DeleteVpnGateway');
}
/**
* Grants permission to release an IP address range that was provisioned through bring your own IP addresses (BYOIP), and to delete the corresponding address pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionByoipCidr.html
*/
toDeprovisionByoipCidr() {
return this.to('DeprovisionByoipCidr');
}
/**
* Grants permission to deprovision an Autonomous System Number (ASN) from an Amazon Web Services account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamByoasn.html
*/
toDeprovisionIpamByoasn() {
return this.to('DeprovisionIpamByoasn');
}
/**
* Grants permission to deprovision a CIDR provisioned from an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html
*/
toDeprovisionIpamPoolCidr() {
return this.to('DeprovisionIpamPoolCidr');
}
/**
* Grants permission to deprovision a CIDR from a public IPv4 pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionPublicIpv4PoolCidr.html
*/
toDeprovisionPublicIpv4PoolCidr() {
return this.to('DeprovisionPublicIpv4PoolCidr');
}
/**
* Grants permission to deregister an Amazon Machine Image (AMI)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeregisterImage.html
*/
toDeregisterImage() {
return this.to('DeregisterImage');
}
/**
* Grants permission to remove tags from the set of tags to include in notifications about scheduled events for your instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeregisterInstanceEventNotificationAttributes.html
*/
toDeregisterInstanceEventNotificationAttributes() {
return this.to('DeregisterInstanceEventNotificationAttributes');
}
/**
* Grants permission to deregister one or more network interface members from a group IP address in a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeregisterTransitGatewayMulticastGroupMembers.html
*/
toDeregisterTransitGatewayMulticastGroupMembers() {
return this.to('DeregisterTransitGatewayMulticastGroupMembers');
}
/**
* Grants permission to deregister one or more network interface sources from a group IP address in a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeregisterTransitGatewayMulticastGroupSources.html
*/
toDeregisterTransitGatewayMulticastGroupSources() {
return this.to('DeregisterTransitGatewayMulticastGroupSources');
}
/**
* Grants permission to describe the attributes of the AWS account
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAccountAttributes.html
*/
toDescribeAccountAttributes() {
return this.to('DescribeAccountAttributes');
}
/**
* Grants permission to describe an Elastic IP address transfer
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAddressTransfers.html
*/
toDescribeAddressTransfers() {
return this.to('DescribeAddressTransfers');
}
/**
* Grants permission to describe one or more Elastic IP addresses
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAddresses.html
*/
toDescribeAddresses() {
return this.to('DescribeAddresses');
}
/**
* Grants permission to describe the attributes of the specified Elastic IP addresses
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAddressesAttribute.html
*/
toDescribeAddressesAttribute() {
return this.to('DescribeAddressesAttribute');
}
/**
* Grants permission to describe the longer ID format settings for all resource types
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAggregateIdFormat.html
*/
toDescribeAggregateIdFormat() {
return this.to('DescribeAggregateIdFormat');
}
/**
* Grants permission to describe one or more of the Availability Zones that are available to you
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAvailabilityZones.html
*/
toDescribeAvailabilityZones() {
return this.to('DescribeAvailabilityZones');
}
/**
* Grants permission to describe the current infrastructure performance metric subscriptions
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAwsNetworkPerformanceMetricSubscriptions.html
*/
toDescribeAwsNetworkPerformanceMetricSubscriptions() {
return this.to('DescribeAwsNetworkPerformanceMetricSubscriptions');
}
/**
* Grants permission to describe one or more bundling tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeBundleTasks.html
*/
toDescribeBundleTasks() {
return this.to('DescribeBundleTasks');
}
/**
* Grants permission to describe the IP address ranges that were provisioned through bring your own IP addresses (BYOIP)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeByoipCidrs.html
*/
toDescribeByoipCidrs() {
return this.to('DescribeByoipCidrs');
}
/**
* Grants permission to describe Capacity Block extensions history
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityBlockExtensionHistory.html
*/
toDescribeCapacityBlockExtensionHistory() {
return this.to('DescribeCapacityBlockExtensionHistory');
}
/**
* Grants permission to describe Capacity Block extensions offerings
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityBlockExtensionOfferings.html
*/
toDescribeCapacityBlockExtensionOfferings() {
return this.to('DescribeCapacityBlockExtensionOfferings');
}
/**
* Grants permission to describe Capacity Block offerings available for purchase
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityBlockOfferings.html
*/
toDescribeCapacityBlockOfferings() {
return this.to('DescribeCapacityBlockOfferings');
}
/**
* Grants permission to describe one or more requests to assign the billing of the unused capacity of a Capacity Reservation
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityReservationBillingRequests.html
*/
toDescribeCapacityReservationBillingRequests() {
return this.to('DescribeCapacityReservationBillingRequests');
}
/**
* Grants permission to describe one or more Capacity Reservation Fleets
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityReservationFleets.html
*/
toDescribeCapacityReservationFleets() {
return this.to('DescribeCapacityReservationFleets');
}
/**
* Grants permission to describe one or more Capacity Reservations
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityReservations.html
*/
toDescribeCapacityReservations() {
return this.to('DescribeCapacityReservations');
}
/**
* Grants permission to describe one or more Carrier Gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCarrierGateways.html
*/
toDescribeCarrierGateways() {
return this.to('DescribeCarrierGateways');
}
/**
* Grants permission to describe one or more linked EC2-Classic instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeClassicLinkInstances.html
*/
toDescribeClassicLinkInstances() {
return this.to('DescribeClassicLinkInstances');
}
/**
* Grants permission to describe the authorization rules for a Client VPN endpoint
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeClientVpnAuthorizationRules.html
*/
toDescribeClientVpnAuthorizationRules() {
return this.to('DescribeClientVpnAuthorizationRules');
}
/**
* Grants permission to describe active client connections and connections that have been terminated within the last 60 minutes for a Client VPN endpoint
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeClientVpnConnections.html
*/
toDescribeClientVpnConnections() {
return this.to('DescribeClientVpnConnections');
}
/**
* Grants permission to describe one or more Client VPN endpoints
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeClientVpnEndpoints.html
*/
toDescribeClientVpnEndpoints() {
return this.to('DescribeClientVpnEndpoints');
}
/**
* Grants permission to describe the routes for a Client VPN endpoint
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeClientVpnRoutes.html
*/
toDescribeClientVpnRoutes() {
return this.to('DescribeClientVpnRoutes');
}
/**
* Grants permission to describe the target networks that are associated with a Client VPN endpoint
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeClientVpnTargetNetworks.html
*/
toDescribeClientVpnTargetNetworks() {
return this.to('DescribeClientVpnTargetNetworks');
}
/**
* Grants permission to describe the specified customer-owned address pools or all of your customer-owned address pools
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCoipPools.html
*/
toDescribeCoipPools() {
return this.to('DescribeCoipPools');
}
/**
* Grants permission to describe one or more conversion tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeConversionTasks.html
*/
toDescribeConversionTasks() {
return this.to('DescribeConversionTasks');
}
/**
* Grants permission to describe one or more customer gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCustomerGateways.html
*/
toDescribeCustomerGateways() {
return this.to('DescribeCustomerGateways');
}
/**
* Grants permission to describe one or more declarative policies reports
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeDeclarativePoliciesReports.html
*/
toDescribeDeclarativePoliciesReports() {
return this.to('DescribeDeclarativePoliciesReports');
}
/**
* Grants permission to describe one or more DHCP options sets
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeDhcpOptions.html
*/
toDescribeDhcpOptions() {
return this.to('DescribeDhcpOptions');
}
/**
* Grants permission to describe one or more egress-only internet gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeEgressOnlyInternetGateways.html
*/
toDescribeEgressOnlyInternetGateways() {
return this.to('DescribeEgressOnlyInternetGateways');
}
/**
* Grants permission to describe an Elastic Graphics accelerator that is associated with an instance
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeElasticGpus.html
*/
toDescribeElasticGpus() {
return this.to('DescribeElasticGpus');
}
/**
* Grants permission to describe one or more export image tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeExportImageTasks.html
*/
toDescribeExportImageTasks() {
return this.to('DescribeExportImageTasks');
}
/**
* Grants permission to describe one or more export instance tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeExportTasks.html
*/
toDescribeExportTasks() {
return this.to('DescribeExportTasks');
}
/**
* Grants permission to describe fast-launch enabled Windows AMIs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFastLaunchImages.html
*/
toDescribeFastLaunchImages() {
return this.to('DescribeFastLaunchImages');
}
/**
* Grants permission to describe the state of fast snapshot restores for snapshots
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFastSnapshotRestores.html
*/
toDescribeFastSnapshotRestores() {
return this.to('DescribeFastSnapshotRestores');
}
/**
* Grants permission to describe the events for an EC2 Fleet during a specified time
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFleetHistory.html
*/
toDescribeFleetHistory() {
return this.to('DescribeFleetHistory');
}
/**
* Grants permission to describe the running instances for an EC2 Fleet
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFleetInstances.html
*/
toDescribeFleetInstances() {
return this.to('DescribeFleetInstances');
}
/**
* Grants permission to describe one or more EC2 Fleets
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFleets.html
*/
toDescribeFleets() {
return this.to('DescribeFleets');
}
/**
* Grants permission to describe one or more flow logs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFlowLogs.html
*/
toDescribeFlowLogs() {
return this.to('DescribeFlowLogs');
}
/**
* Grants permission to describe the attributes of an Amazon FPGA Image (AFI)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFpgaImageAttribute.html
*/
toDescribeFpgaImageAttribute() {
return this.to('DescribeFpgaImageAttribute');
}
/**
* Grants permission to describe one or more Amazon FPGA Images (AFIs)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFpgaImages.html
*/
toDescribeFpgaImages() {
return this.to('DescribeFpgaImages');
}
/**
* Grants permission to describe the Dedicated Host Reservations that are available to purchase
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeHostReservationOfferings.html
*/
toDescribeHostReservationOfferings() {
return this.to('DescribeHostReservationOfferings');
}
/**
* Grants permission to describe the Dedicated Host Reservations that are associated with Dedicated Hosts in the AWS account
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeHostReservations.html
*/
toDescribeHostReservations() {
return this.to('DescribeHostReservations');
}
/**
* Grants permission to describe one or more Dedicated Hosts
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeHosts.html
*/
toDescribeHosts() {
return this.to('DescribeHosts');
}
/**
* Grants permission to describe the IAM instance profile associations
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html
*/
toDescribeIamInstanceProfileAssociations() {
return this.to('DescribeIamInstanceProfileAssociations');
}
/**
* Grants permission to describe the ID format settings for resources
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIdFormat.html
*/
toDescribeIdFormat() {
return this.to('DescribeIdFormat');
}
/**
* Grants permission to describe the ID format settings for resources for an IAM user, IAM role, or root user
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIdentityIdFormat.html
*/
toDescribeIdentityIdFormat() {
return this.to('DescribeIdentityIdFormat');
}
/**
* Grants permission to describe an attribute of an Amazon Machine Image (AMI)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImageAttribute.html
*/
toDescribeImageAttribute() {
return this.to('DescribeImageAttribute');
}
/**
* Grants permission to describe one or more images (AMIs, AKIs, and ARIs)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html
*/
toDescribeImages() {
return this.to('DescribeImages');
}
/**
* Grants permission to describe import virtual machine or import snapshot tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImportImageTasks.html
*/
toDescribeImportImageTasks() {
return this.to('DescribeImportImageTasks');
}
/**
* Grants permission to describe import snapshot tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImportSnapshotTasks.html
*/
toDescribeImportSnapshotTasks() {
return this.to('DescribeImportSnapshotTasks');
}
/**
* Grants permission to describe the attributes of an instance
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceAttribute.html
*/
toDescribeInstanceAttribute() {
return this.to('DescribeInstanceAttribute');
}
/**
* Grants permission to describe EC2 Instance Connect Endpoints
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceConnectEndpoints.html
*/
toDescribeInstanceConnectEndpoints() {
return this.to('DescribeInstanceConnectEndpoints');
}
/**
* Grants permission to describe the credit option for CPU usage of one or more burstable performance instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceCreditSpecifications.html
*/
toDescribeInstanceCreditSpecifications() {
return this.to('DescribeInstanceCreditSpecifications');
}
/**
* Grants permission to describe the set of tags to include in notifications about scheduled events for your instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceEventNotificationAttributes.html
*/
toDescribeInstanceEventNotificationAttributes() {
return this.to('DescribeInstanceEventNotificationAttributes');
}
/**
* Grants permission to describe the specified event windows or all event windows
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceEventWindows.html
*/
toDescribeInstanceEventWindows() {
return this.to('DescribeInstanceEventWindows');
}
/**
* Grants permission to describe the AMI that was used to launch an instance
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceImageMetadata.html
*/
toDescribeInstanceImageMetadata() {
return this.to('DescribeInstanceImageMetadata');
}
/**
* Grants permission to describe the status of one or more instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceStatus.html
*/
toDescribeInstanceStatus() {
return this.to('DescribeInstanceStatus');
}
/**
* Grants permission to describe a tree-based hierarchy that represents the physical host placement of EC2 instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTopology.html
*/
toDescribeInstanceTopology() {
return this.to('DescribeInstanceTopology');
}
/**
* Grants permission to describe the set of instance types that are offered in a location
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypeOfferings.html
*/
toDescribeInstanceTypeOfferings() {
return this.to('DescribeInstanceTypeOfferings');
}
/**
* Grants permission to describe the details of instance types that are offered in a location
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypes.html
*/
toDescribeInstanceTypes() {
return this.to('DescribeInstanceTypes');
}
/**
* Grants permission to describe one or more instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html
*/
toDescribeInstances() {
return this.to('DescribeInstances');
}
/**
* Grants permission to describe one or more internet gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInternetGateways.html
*/
toDescribeInternetGateways() {
return this.to('DescribeInternetGateways');
}
/**
* Grants permission to describe a bring your own Autonomous System Number (BYOASN) that you've brought to IPAM
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpamByoasn.html
*/
toDescribeIpamByoasn() {
return this.to('DescribeIpamByoasn');
}
/**
* Grants permission to describe verification tokens, which proves ownership of an external resource
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpamExternalResourceVerificationTokens.html
*/
toDescribeIpamExternalResourceVerificationTokens() {
return this.to('DescribeIpamExternalResourceVerificationTokens');
}
/**
* Grants permission to describe Amazon VPC IP Address Manager (IPAM) pools
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpamPools.html
*/
toDescribeIpamPools() {
return this.to('DescribeIpamPools');
}
/**
* Grants permission to describe IPAM resource discoveries
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpamResourceDiscoveries.html
*/
toDescribeIpamResourceDiscoveries() {
return this.to('DescribeIpamResourceDiscoveries');
}
/**
* Grants permission to describe resource discovery associations with an Amazon VPC IPAM
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpamResourceDiscoveryAssociations.html
*/
toDescribeIpamResourceDiscoveryAssociations() {
return this.to('DescribeIpamResourceDiscoveryAssociations');
}
/**
* Grants permission to describe Amazon VPC IP Address Manager (IPAM) scopes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpamScopes.html
*/
toDescribeIpamScopes() {
return this.to('DescribeIpamScopes');
}
/**
* Grants permission to describe an Amazon VPC IP Address Manager (IPAM)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpams.html
*/
toDescribeIpams() {
return this.to('DescribeIpams');
}
/**
* Grants permission to describe one or more IPv6 address pools
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIpv6Pools.html
*/
toDescribeIpv6Pools() {
return this.to('DescribeIpv6Pools');
}
/**
* Grants permission to describe one or more key pairs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeKeyPairs.html
*/
toDescribeKeyPairs() {
return this.to('DescribeKeyPairs');
}
/**
* Grants permission to describe one or more launch template versions
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ssm:GetParameters
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLaunchTemplateVersions.html
*/
toDescribeLaunchTemplateVersions() {
return this.to('DescribeLaunchTemplateVersions');
}
/**
* Grants permission to describe one or more launch templates
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLaunchTemplates.html
*/
toDescribeLaunchTemplates() {
return this.to('DescribeLaunchTemplates');
}
/**
* Grants permission to allow a service to describe local gateway route table permissions
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/outposts/latest/userguide/identity-access-management.html
*/
toDescribeLocalGatewayRouteTablePermissions() {
return this.to('DescribeLocalGatewayRouteTablePermissions');
}
/**
* Grants permission to describe the associations between virtual interface groups and local gateway route tables
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations.html
*/
toDescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations() {
return this.to('DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations');
}
/**
* Grants permission to describe an association between VPCs and local gateway route tables
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLocalGatewayRouteTableVpcAssociations.html
*/
toDescribeLocalGatewayRouteTableVpcAssociations() {
return this.to('DescribeLocalGatewayRouteTableVpcAssociations');
}
/**
* Grants permission to describe one or more local gateway route tables
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLocalGatewayRouteTables.html
*/
toDescribeLocalGatewayRouteTables() {
return this.to('DescribeLocalGatewayRouteTables');
}
/**
* Grants permission to describe local gateway virtual interface groups
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLocalGatewayVirtualInterfaceGroups.html
*/
toDescribeLocalGatewayVirtualInterfaceGroups() {
return this.to('DescribeLocalGatewayVirtualInterfaceGroups');
}
/**
* Grants permission to describe local gateway virtual interfaces
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLocalGatewayVirtualInterfaces.html
*/
toDescribeLocalGatewayVirtualInterfaces() {
return this.to('DescribeLocalGatewayVirtualInterfaces');
}
/**
* Grants permission to describe one or more local gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLocalGateways.html
*/
toDescribeLocalGateways() {
return this.to('DescribeLocalGateways');
}
/**
* Grants permission to describe the lock status for a snapshot
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeLockedSnapshots.html
*/
toDescribeLockedSnapshots() {
return this.to('DescribeLockedSnapshots');
}
/**
* Grants permission to describe your EC2 Mac Dedicated hosts
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeMacHosts.html
*/
toDescribeMacHosts() {
return this.to('DescribeMacHosts');
}
/**
* Grants permission to describe your managed prefix lists and any AWS-managed prefix lists
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeManagedPrefixLists.html
*/
toDescribeManagedPrefixLists() {
return this.to('DescribeManagedPrefixLists');
}
/**
* Grants permission to describe Elastic IP addresses that are being moved to the EC2-VPC platform
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeMovingAddresses.html
*/
toDescribeMovingAddresses() {
return this.to('DescribeMovingAddresses');
}
/**
* Grants permission to describe one or more NAT gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNatGateways.html
*/
toDescribeNatGateways() {
return this.to('DescribeNatGateways');
}
/**
* Grants permission to describe one or more network ACLs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkAcls.html
*/
toDescribeNetworkAcls() {
return this.to('DescribeNetworkAcls');
}
/**
* Grants permission to describe one or more Network Access Scope analyses
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInsightsAccessScopeAnalyses.html
*/
toDescribeNetworkInsightsAccessScopeAnalyses() {
return this.to('DescribeNetworkInsightsAccessScopeAnalyses');
}
/**
* Grants permission to describe the Network Access Scopes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInsightsAccessScopes.html
*/
toDescribeNetworkInsightsAccessScopes() {
return this.to('DescribeNetworkInsightsAccessScopes');
}
/**
* Grants permission to describe one or more network insights analyses
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInsightsAnalyses.html
*/
toDescribeNetworkInsightsAnalyses() {
return this.to('DescribeNetworkInsightsAnalyses');
}
/**
* Grants permission to describe one or more network insights paths
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInsightsPaths.html
*/
toDescribeNetworkInsightsPaths() {
return this.to('DescribeNetworkInsightsPaths');
}
/**
* Grants permission to describe a network interface attribute
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaceAttribute.html
*/
toDescribeNetworkInterfaceAttribute() {
return this.to('DescribeNetworkInterfaceAttribute');
}
/**
* Grants permission to describe the permissions that are associated with a network interface
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfacePermissions.html
*/
toDescribeNetworkInterfacePermissions() {
return this.to('DescribeNetworkInterfacePermissions');
}
/**
* Grants permission to describe one or more network interfaces
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html
*/
toDescribeNetworkInterfaces() {
return this.to('DescribeNetworkInterfaces');
}
/**
* Grants permission to describe Outpost LAGs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeOutpostLags.html
*/
toDescribeOutpostLags() {
return this.to('DescribeOutpostLags');
}
/**
* Grants permission to describe one or more placement groups
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribePlacementGroups.html
*/
toDescribePlacementGroups() {
return this.to('DescribePlacementGroups');
}
/**
* Grants permission to describe available AWS services in a prefix list format
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribePrefixLists.html
*/
toDescribePrefixLists() {
return this.to('DescribePrefixLists');
}
/**
* Grants permission to describe the ID format settings for the root user and all IAM roles and IAM users that have explicitly specified a longer ID (17-character ID) preference
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribePrincipalIdFormat.html
*/
toDescribePrincipalIdFormat() {
return this.to('DescribePrincipalIdFormat');
}
/**
* Grants permission to describe one or more IPv4 address pools
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribePublicIpv4Pools.html
*/
toDescribePublicIpv4Pools() {
return this.to('DescribePublicIpv4Pools');
}
/**
* Grants permission to describe one or more AWS Regions that are currently available in your account
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRegions.html
*/
toDescribeRegions() {
return this.to('DescribeRegions');
}
/**
* Grants permission to describe a root volume replacement task
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeReplaceRootVolumeTasks.html
*/
toDescribeReplaceRootVolumeTasks() {
return this.to('DescribeReplaceRootVolumeTasks');
}
/**
* Grants permission to describe one or more purchased Reserved Instances in your account
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeReservedInstances.html
*/
toDescribeReservedInstances() {
return this.to('DescribeReservedInstances');
}
/**
* Grants permission to describe your account's Reserved Instance listings in the Reserved Instance Marketplace
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeReservedInstancesListings.html
*/
toDescribeReservedInstancesListings() {
return this.to('DescribeReservedInstancesListings');
}
/**
* Grants permission to describe the modifications made to one or more Reserved Instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeReservedInstancesModifications.html
*/
toDescribeReservedInstancesModifications() {
return this.to('DescribeReservedInstancesModifications');
}
/**
* Grants permission to describe the Reserved Instance offerings that are available for purchase
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeReservedInstancesOfferings.html
*/
toDescribeReservedInstancesOfferings() {
return this.to('DescribeReservedInstancesOfferings');
}
/**
* Grants permission to describe one or more route server endpoints
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRouteServerEndpoints.html
*/
toDescribeRouteServerEndpoints() {
return this.to('DescribeRouteServerEndpoints');
}
/**
* Grants permission to describe one or more route server peers
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRouteServerPeers.html
*/
toDescribeRouteServerPeers() {
return this.to('DescribeRouteServerPeers');
}
/**
* Grants permission to describe one or more route servers
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRouteServers.html
*/
toDescribeRouteServers() {
return this.to('DescribeRouteServers');
}
/**
* Grants permission to describe one or more route tables
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeRouteTables.html
*/
toDescribeRouteTables() {
return this.to('DescribeRouteTables');
}
/**
* Grants permission to find available schedules for Scheduled Instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeScheduledInstanceAvailability.html
*/
toDescribeScheduledInstanceAvailability() {
return this.to('DescribeScheduledInstanceAvailability');
}
/**
* Grants permission to describe one or more Scheduled Instances in your account
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeScheduledInstances.html
*/
toDescribeScheduledInstances() {
return this.to('DescribeScheduledInstances');
}
/**
* Grants permission to describe the VPCs on the other side of a VPC peering connection that are referencing specified VPC security groups
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroupReferences.html
*/
toDescribeSecurityGroupReferences() {
return this.to('DescribeSecurityGroupReferences');
}
/**
* Grants permission to describe one or more of your security group rules
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroupRules.html
*/
toDescribeSecurityGroupRules() {
return this.to('DescribeSecurityGroupRules');
}
/**
* Grants permission to describe security group VPC associations
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroupVpcAssociations.html
*/
toDescribeSecurityGroupVpcAssociations() {
return this.to('DescribeSecurityGroupVpcAssociations');
}
/**
* Grants permission to describe one or more security groups
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html
*/
toDescribeSecurityGroups() {
return this.to('DescribeSecurityGroups');
}
/**
* Grants permission to describe service link virtual interfaces
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeServiceLinkVirtualInterfaces.html
*/
toDescribeServiceLinkVirtualInterfaces() {
return this.to('DescribeServiceLinkVirtualInterfaces');
}
/**
* Grants permission to describe an attribute of a snapshot
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSnapshotAttribute.html
*/
toDescribeSnapshotAttribute() {
return this.to('DescribeSnapshotAttribute');
}
/**
* Grants permission to describe the storage tier status for Amazon EBS snapshots
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSnapshotTierStatus.html
*/
toDescribeSnapshotTierStatus() {
return this.to('DescribeSnapshotTierStatus');
}
/**
* Grants permission to describe one or more EBS snapshots
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSnapshots.html
*/
toDescribeSnapshots() {
return this.to('DescribeSnapshots');
}
/**
* Grants permission to describe the data feed for Spot Instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotDatafeedSubscription.html
*/
toDescribeSpotDatafeedSubscription() {
return this.to('DescribeSpotDatafeedSubscription');
}
/**
* Grants permission to describe the running instances for a Spot Fleet
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotFleetInstances.html
*/
toDescribeSpotFleetInstances() {
return this.to('DescribeSpotFleetInstances');
}
/**
* Grants permission to describe the events for a Spot Fleet request during a specified time
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotFleetRequestHistory.html
*/
toDescribeSpotFleetRequestHistory() {
return this.to('DescribeSpotFleetRequestHistory');
}
/**
* Grants permission to describe one or more Spot Fleet requests
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotFleetRequests.html
*/
toDescribeSpotFleetRequests() {
return this.to('DescribeSpotFleetRequests');
}
/**
* Grants permission to describe one or more Spot Instance requests
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotInstanceRequests.html
*/
toDescribeSpotInstanceRequests() {
return this.to('DescribeSpotInstanceRequests');
}
/**
* Grants permission to describe the Spot Instance price history
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSpotPriceHistory.html
*/
toDescribeSpotPriceHistory() {
return this.to('DescribeSpotPriceHistory');
}
/**
* Grants permission to describe the stale security group rules for security groups in a specified VPC
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeStaleSecurityGroups.html
*/
toDescribeStaleSecurityGroups() {
return this.to('DescribeStaleSecurityGroups');
}
/**
* Grants permission to describe the progress of the AMI store tasks
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeStoreImageTasks.html
*/
toDescribeStoreImageTasks() {
return this.to('DescribeStoreImageTasks');
}
/**
* Grants permission to describe one or more subnets
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html
*/
toDescribeSubnets() {
return this.to('DescribeSubnets');
}
/**
* Grants permission to describe one or more tags for an Amazon EC2 resource
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTags.html
*/
toDescribeTags() {
return this.to('DescribeTags');
}
/**
* Grants permission to describe traffic mirror filters that determine the traffic that is mirrored
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTrafficMirrorFilterRules.html
*/
toDescribeTrafficMirrorFilterRules() {
return this.to('DescribeTrafficMirrorFilterRules');
}
/**
* Grants permission to describe one or more traffic mirror filters
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTrafficMirrorFilters.html
*/
toDescribeTrafficMirrorFilters() {
return this.to('DescribeTrafficMirrorFilters');
}
/**
* Grants permission to describe one or more traffic mirror sessions
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTrafficMirrorSessions.html
*/
toDescribeTrafficMirrorSessions() {
return this.to('DescribeTrafficMirrorSessions');
}
/**
* Grants permission to describe one or more traffic mirror targets
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTrafficMirrorTargets.html
*/
toDescribeTrafficMirrorTargets() {
return this.to('DescribeTrafficMirrorTargets');
}
/**
* Grants permission to describe one or more attachments between resources and transit gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayAttachments.html
*/
toDescribeTransitGatewayAttachments() {
return this.to('DescribeTransitGatewayAttachments');
}
/**
* Grants permission to describe one or more transit gateway connect peers
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayConnectPeers.html
*/
toDescribeTransitGatewayConnectPeers() {
return this.to('DescribeTransitGatewayConnectPeers');
}
/**
* Grants permission to describe one or more transit gateway connect attachments
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayConnects.html
*/
toDescribeTransitGatewayConnects() {
return this.to('DescribeTransitGatewayConnects');
}
/**
* Grants permission to describe one or more transit gateway multicast domains
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayMulticastDomains.html
*/
toDescribeTransitGatewayMulticastDomains() {
return this.to('DescribeTransitGatewayMulticastDomains');
}
/**
* Grants permission to describe one or more transit gateway peering attachments
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayPeeringAttachments.html
*/
toDescribeTransitGatewayPeeringAttachments() {
return this.to('DescribeTransitGatewayPeeringAttachments');
}
/**
* Grants permission to describe a transit gateway policy table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayPolicyTables.html
*/
toDescribeTransitGatewayPolicyTables() {
return this.to('DescribeTransitGatewayPolicyTables');
}
/**
* Grants permission to describe a transit gateway route table announcement
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayRouteTableAnnouncements.html
*/
toDescribeTransitGatewayRouteTableAnnouncements() {
return this.to('DescribeTransitGatewayRouteTableAnnouncements');
}
/**
* Grants permission to describe one or more transit gateway route tables
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayRouteTables.html
*/
toDescribeTransitGatewayRouteTables() {
return this.to('DescribeTransitGatewayRouteTables');
}
/**
* Grants permission to describe one or more VPC attachments on a transit gateway
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayVpcAttachments.html
*/
toDescribeTransitGatewayVpcAttachments() {
return this.to('DescribeTransitGatewayVpcAttachments');
}
/**
* Grants permission to describe one or more transit gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGateways.html
*/
toDescribeTransitGateways() {
return this.to('DescribeTransitGateways');
}
/**
* Grants permission to describe one or more network interface trunk associations
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTrunkInterfaceAssociations.html
*/
toDescribeTrunkInterfaceAssociations() {
return this.to('DescribeTrunkInterfaceAssociations');
}
/**
* Grants permission to describe the specified Verified Access endpoints or all Verified Access endpoints
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVerifiedAccessEndpoints.html
*/
toDescribeVerifiedAccessEndpoints() {
return this.to('DescribeVerifiedAccessEndpoints');
}
/**
* Grants permission to describe the specified Verified Access groups or all Verified Access groups
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVerifiedAccessGroups.html
*/
toDescribeVerifiedAccessGroups() {
return this.to('DescribeVerifiedAccessGroups');
}
/**
* Grants permission to describe the current logging configuration for the Verified Access instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVerifiedAccessInstanceLoggingConfigurations.html
*/
toDescribeVerifiedAccessInstanceLoggingConfigurations() {
return this.to('DescribeVerifiedAccessInstanceLoggingConfigurations');
}
/**
* Grants permission to describe the AWS Web Application Firewall (WAF) web access control list (ACL) associations for a Verified Access instance
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/verified-access/latest/ug/waf-integration.html
*/
toDescribeVerifiedAccessInstanceWebAclAssociations() {
return this.to('DescribeVerifiedAccessInstanceWebAclAssociations');
}
/**
* Grants permission to describe the specified Verified Access instances or all Verified Access instances
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVerifiedAccessInstances.html
*/
toDescribeVerifiedAccessInstances() {
return this.to('DescribeVerifiedAccessInstances');
}
/**
* Grants permission to describe details of existing Verified Access trust providers
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVerifiedAccessTrustProviders.html
*/
toDescribeVerifiedAccessTrustProviders() {
return this.to('DescribeVerifiedAccessTrustProviders');
}
/**
* Grants permission to describe an attribute of an EBS volume
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVolumeAttribute.html
*/
toDescribeVolumeAttribute() {
return this.to('DescribeVolumeAttribute');
}
/**
* Grants permission to describe the status of one or more EBS volumes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVolumeStatus.html
*/
toDescribeVolumeStatus() {
return this.to('DescribeVolumeStatus');
}
/**
* Grants permission to describe one or more EBS volumes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVolumes.html
*/
toDescribeVolumes() {
return this.to('DescribeVolumes');
}
/**
* Grants permission to describe the current modification status of one or more EBS volumes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVolumesModifications.html
*/
toDescribeVolumesModifications() {
return this.to('DescribeVolumesModifications');
}
/**
* Grants permission to describe an attribute of a VPC
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcAttribute.html
*/
toDescribeVpcAttribute() {
return this.to('DescribeVpcAttribute');
}
/**
* Grants permission to describe an exclusion list for blocked public access on a VPC
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcBlockPublicAccessExclusions.html
*/
toDescribeVpcBlockPublicAccessExclusions() {
return this.to('DescribeVpcBlockPublicAccessExclusions');
}
/**
* Grants permission to describe options for blocked public access on a VPC
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcBlockPublicAccessOptions.html
*/
toDescribeVpcBlockPublicAccessOptions() {
return this.to('DescribeVpcBlockPublicAccessOptions');
}
/**
* Grants permission to describe the ClassicLink status of one or more VPCs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcClassicLink.html
*/
toDescribeVpcClassicLink() {
return this.to('DescribeVpcClassicLink');
}
/**
* Grants permission to describe the ClassicLink DNS support status of one or more VPCs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcClassicLinkDnsSupport.html
*/
toDescribeVpcClassicLinkDnsSupport() {
return this.to('DescribeVpcClassicLinkDnsSupport');
}
/**
* Grants permission to describe the VPC endpoint associations
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpointAssociations.html
*/
toDescribeVpcEndpointAssociations() {
return this.to('DescribeVpcEndpointAssociations');
}
/**
* Grants permission to describe the connection notifications for VPC endpoints and VPC endpoint services
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpointConnectionNotifications.html
*/
toDescribeVpcEndpointConnectionNotifications() {
return this.to('DescribeVpcEndpointConnectionNotifications');
}
/**
* Grants permission to describe the VPC endpoint connections to your VPC endpoint services
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpointConnections.html
*/
toDescribeVpcEndpointConnections() {
return this.to('DescribeVpcEndpointConnections');
}
/**
* Grants permission to describe VPC endpoint service configurations (your services)
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpointServiceConfigurations.html
*/
toDescribeVpcEndpointServiceConfigurations() {
return this.to('DescribeVpcEndpointServiceConfigurations');
}
/**
* Grants permission to describe the principals (service consumers) that are permitted to discover your VPC endpoint service
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpointServicePermissions.html
*/
toDescribeVpcEndpointServicePermissions() {
return this.to('DescribeVpcEndpointServicePermissions');
}
/**
* Grants permission to describe all supported AWS services that can be specified when creating a VPC endpoint
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpointServices.html
*/
toDescribeVpcEndpointServices() {
return this.to('DescribeVpcEndpointServices');
}
/**
* Grants permission to describe one or more VPC endpoints
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcEndpoints.html
*/
toDescribeVpcEndpoints() {
return this.to('DescribeVpcEndpoints');
}
/**
* Grants permission to describe one or more VPC peering connections
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcPeeringConnections.html
*/
toDescribeVpcPeeringConnections() {
return this.to('DescribeVpcPeeringConnections');
}
/**
* Grants permission to describe one or more VPCs
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html
*/
toDescribeVpcs() {
return this.to('DescribeVpcs');
}
/**
* Grants permission to describe one or more VPN connections
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpnConnections.html
*/
toDescribeVpnConnections() {
return this.to('DescribeVpnConnections');
}
/**
* Grants permission to describe one or more virtual private gateways
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpnGateways.html
*/
toDescribeVpnGateways() {
return this.to('DescribeVpnGateways');
}
/**
* Grants permission to unlink (detach) a linked EC2-Classic instance from a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachClassicLinkVpc.html
*/
toDetachClassicLinkVpc() {
return this.to('DetachClassicLinkVpc');
}
/**
* Grants permission to detach an internet gateway from a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachInternetGateway.html
*/
toDetachInternetGateway() {
return this.to('DetachInternetGateway');
}
/**
* Grants permission to detach a network interface from an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachNetworkInterface.html
*/
toDetachNetworkInterface() {
return this.to('DetachNetworkInterface');
}
/**
* Grants permission to detach a trust provider from a Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachVerifiedAccessTrustProvider.html
*/
toDetachVerifiedAccessTrustProvider() {
return this.to('DetachVerifiedAccessTrustProvider');
}
/**
* Grants permission to detach an EBS volume from an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachVolume.html
*/
toDetachVolume() {
return this.to('DetachVolume');
}
/**
* Grants permission to detach a virtual private gateway from a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DetachVpnGateway.html
*/
toDetachVpnGateway() {
return this.to('DetachVpnGateway');
}
/**
* Grants permission to disable Elastic IP address transfer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableAddressTransfer.html
*/
toDisableAddressTransfer() {
return this.to('DisableAddressTransfer');
}
/**
* Grants permission to disable allowed images settings
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableAllowedImagesSettings.html
*/
toDisableAllowedImagesSettings() {
return this.to('DisableAllowedImagesSettings');
}
/**
* Grants permission to disable infrastructure performance metric subscriptions
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableAwsNetworkPerformanceMetricSubscription.html
*/
toDisableAwsNetworkPerformanceMetricSubscription() {
return this.to('DisableAwsNetworkPerformanceMetricSubscription');
}
/**
* Grants permission to disable EBS encryption by default for your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableEbsEncryptionByDefault.html
*/
toDisableEbsEncryptionByDefault() {
return this.to('DisableEbsEncryptionByDefault');
}
/**
* Grants permission to disable faster launching for Windows AMIs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableFastLaunch.html
*/
toDisableFastLaunch() {
return this.to('DisableFastLaunch');
}
/**
* Grants permission to disable fast snapshot restores for one or more snapshots in specified Availability Zones
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableFastSnapshotRestores.html
*/
toDisableFastSnapshotRestores() {
return this.to('DisableFastSnapshotRestores');
}
/**
* Grants permission to disable an AMI
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableImage.html
*/
toDisableImage() {
return this.to('DisableImage');
}
/**
* Grants permission to disable block public access for AMIs at the account level in the specified AWS Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableImageBlockPublicAccess.html
*/
toDisableImageBlockPublicAccess() {
return this.to('DisableImageBlockPublicAccess');
}
/**
* Grants permission to cancel the deprecation of the specified AMI
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableImageDeprecation.html
*/
toDisableImageDeprecation() {
return this.to('DisableImageDeprecation');
}
/**
* Grants permission to disable deregistration protection for an AMI. When deregistration protection is disabled, the AMI can be deregistered
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableImageDeregistrationProtection.html
*/
toDisableImageDeregistrationProtection() {
return this.to('DisableImageDeregistrationProtection');
}
/**
* Grants permission to disable an AWS Organizations member account as an Amazon VPC IP Address Manager (IPAM) admin account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - organizations:DeregisterDelegatedAdministrator
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableIpamOrganizationAdminAccount.html
*/
toDisableIpamOrganizationAdminAccount() {
return this.to('DisableIpamOrganizationAdminAccount');
}
/**
* Grants permission to disable route server propagation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableRouteServerPropagation.html
*/
toDisableRouteServerPropagation() {
return this.to('DisableRouteServerPropagation');
}
/**
* Grants permission to disable access to the EC2 serial console of all instances for your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableSerialConsoleAccess.html
*/
toDisableSerialConsoleAccess() {
return this.to('DisableSerialConsoleAccess');
}
/**
* Grants permission to disable the block public access for snapshots setting for a Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableSnapshotBlockPublicAccess.html
*/
toDisableSnapshotBlockPublicAccess() {
return this.to('DisableSnapshotBlockPublicAccess');
}
/**
* Grants permission to disable a resource attachment from propagating routes to the specified propagation route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableTransitGatewayRouteTablePropagation.html
*/
toDisableTransitGatewayRouteTablePropagation() {
return this.to('DisableTransitGatewayRouteTablePropagation');
}
/**
* Grants permission to disable a virtual private gateway from propagating routes to a specified route table of a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableVgwRoutePropagation.html
*/
toDisableVgwRoutePropagation() {
return this.to('DisableVgwRoutePropagation');
}
/**
* Grants permission to disable ClassicLink for a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableVpcClassicLink.html
*/
toDisableVpcClassicLink() {
return this.to('DisableVpcClassicLink');
}
/**
* Grants permission to disable ClassicLink DNS support for a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisableVpcClassicLinkDnsSupport.html
*/
toDisableVpcClassicLinkDnsSupport() {
return this.to('DisableVpcClassicLinkDnsSupport');
}
/**
* Grants permission to disassociate an Elastic IP address from an instance or network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateAddress.html
*/
toDisassociateAddress() {
return this.to('DisassociateAddress');
}
/**
* Grants permission to cancel a pending request to assign billing of the unused capacity of a Capacity Reservation to a consumer account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateCapacityReservationBillingOwner.html
*/
toDisassociateCapacityReservationBillingOwner() {
return this.to('DisassociateCapacityReservationBillingOwner');
}
/**
* Grants permission to disassociate a target network from a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateClientVpnTargetNetwork.html
*/
toDisassociateClientVpnTargetNetwork() {
return this.to('DisassociateClientVpnTargetNetwork');
}
/**
* Grants permission to disassociate an ACM certificate from a IAM role
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateEnclaveCertificateIamRole.html
*/
toDisassociateEnclaveCertificateIamRole() {
return this.to('DisassociateEnclaveCertificateIamRole');
}
/**
* Grants permission to disassociate an IAM instance profile from a running or stopped instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html
*/
toDisassociateIamInstanceProfile() {
return this.to('DisassociateIamInstanceProfile');
}
/**
* Grants permission to disassociate one or more targets from an event window
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateInstanceEventWindow.html
*/
toDisassociateInstanceEventWindow() {
return this.to('DisassociateInstanceEventWindow');
}
/**
* Grants permission to disassociate an Autonomous System Number (ASN) from a BYOIP CIDR
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIpamByoasn.html
*/
toDisassociateIpamByoasn() {
return this.to('DisassociateIpamByoasn');
}
/**
* Grants permission to disassociate a resource discovery from an Amazon VPC IPAM
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIpamResourceDiscovery.html
*/
toDisassociateIpamResourceDiscovery() {
return this.to('DisassociateIpamResourceDiscovery');
}
/**
* Grants permission to disassociate a secondary Elastic IP address from a public NAT gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateNatGatewayAddress.html
*/
toDisassociateNatGatewayAddress() {
return this.to('DisassociateNatGatewayAddress');
}
/**
* Grants permission to disassociate a route server from a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateRouteServer.html
*/
toDisassociateRouteServer() {
return this.to('DisassociateRouteServer');
}
/**
* Grants permission to disassociate a subnet from a route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateRouteTable.html
*/
toDisassociateRouteTable() {
return this.to('DisassociateRouteTable');
}
/**
* Grants permission to disassociate a security group from a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateSecurityGroupVpc.html
*/
toDisassociateSecurityGroupVpc() {
return this.to('DisassociateSecurityGroupVpc');
}
/**
* Grants permission to disassociate a CIDR block from a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateSubnetCidrBlock.html
*/
toDisassociateSubnetCidrBlock() {
return this.to('DisassociateSubnetCidrBlock');
}
/**
* Grants permission to disassociate one or more subnets from a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateTransitGatewayMulticastDomain.html
*/
toDisassociateTransitGatewayMulticastDomain() {
return this.to('DisassociateTransitGatewayMulticastDomain');
}
/**
* Grants permission to disassociate a policy table from a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateTransitGatewayPolicyTable.html
*/
toDisassociateTransitGatewayPolicyTable() {
return this.to('DisassociateTransitGatewayPolicyTable');
}
/**
* Grants permission to disassociate a resource attachment from a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateTransitGatewayRouteTable.html
*/
toDisassociateTransitGatewayRouteTable() {
return this.to('DisassociateTransitGatewayRouteTable');
}
/**
* Grants permission to disassociate a branch network interface to a trunk network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateTrunkInterface.html
*/
toDisassociateTrunkInterface() {
return this.to('DisassociateTrunkInterface');
}
/**
* Grants permission to disassociate an AWS Web Application Firewall (WAF) web access control list (ACL) from a Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/verified-access/latest/ug/waf-integration.html
*/
toDisassociateVerifiedAccessInstanceWebAcl() {
return this.to('DisassociateVerifiedAccessInstanceWebAcl');
}
/**
* Grants permission to disassociate a CIDR block from a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateVpcCidrBlock.html
*/
toDisassociateVpcCidrBlock() {
return this.to('DisassociateVpcCidrBlock');
}
/**
* Grants permission to enable Elastic IP address transfer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableAddressTransfer.html
*/
toEnableAddressTransfer() {
return this.to('EnableAddressTransfer');
}
/**
* Grants permission to enable allowed images settings
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableAllowedImagesSettings.html
*/
toEnableAllowedImagesSettings() {
return this.to('EnableAllowedImagesSettings');
}
/**
* Grants permission to enable infrastructure performance subscriptions
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableAwsNetworkPerformanceMetricSubscription.html
*/
toEnableAwsNetworkPerformanceMetricSubscription() {
return this.to('EnableAwsNetworkPerformanceMetricSubscription');
}
/**
* Grants permission to enable EBS encryption by default for your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableEbsEncryptionByDefault.html
*/
toEnableEbsEncryptionByDefault() {
return this.to('EnableEbsEncryptionByDefault');
}
/**
* Grants permission to enable faster launching for Windows AMIs
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateLaunchTemplate
* - ec2:CreateSnapshot
* - ec2:CreateTags
* - ec2:DeleteSnapshot
* - ec2:DescribeImages
* - ec2:DescribeInstanceAttribute
* - ec2:DescribeInstanceStatus
* - ec2:DescribeInstanceTypeOfferings
* - ec2:DescribeInstances
* - ec2:DescribeLaunchTemplateVersions
* - ec2:DescribeLaunchTemplates
* - ec2:DescribeSnapshots
* - ec2:DescribeSubnets
* - ec2:RunInstances
* - ec2:StopInstances
* - ec2:TerminateInstances
* - iam:PassRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableFastLaunch.html
*/
toEnableFastLaunch() {
return this.to('EnableFastLaunch');
}
/**
* Grants permission to enable fast snapshot restores for one or more snapshots in specified Availability Zones
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableFastSnapshotRestores.html
*/
toEnableFastSnapshotRestores() {
return this.to('EnableFastSnapshotRestores');
}
/**
* Grants permission to re-enable a disabled AMI
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableImage.html
*/
toEnableImage() {
return this.to('EnableImage');
}
/**
* Grants permission to enable block public access for AMIs at the account level in the specified AWS Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableImageBlockPublicAccess.html
*/
toEnableImageBlockPublicAccess() {
return this.to('EnableImageBlockPublicAccess');
}
/**
* Grants permission to enable deprecation of the specified AMI at the specified date and time
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableImageDeprecation.html
*/
toEnableImageDeprecation() {
return this.to('EnableImageDeprecation');
}
/**
* Grants permission to enable deregistration protection for an AMI. When deregistration protection is enabled, the AMI can't be deregistered
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableImageDeregistrationProtection.html
*/
toEnableImageDeregistrationProtection() {
return this.to('EnableImageDeregistrationProtection');
}
/**
* Grants permission to enable an AWS Organizations member account as an Amazon VPC IP Address Manager (IPAM) admin account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - iam:CreateServiceLinkedRole
* - organizations:EnableAWSServiceAccess
* - organizations:RegisterDelegatedAdministrator
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableIpamOrganizationAdminAccount.html
*/
toEnableIpamOrganizationAdminAccount() {
return this.to('EnableIpamOrganizationAdminAccount');
}
/**
* Grants permission to enable organization sharing of reachability analyzer
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - iam:CreateServiceLinkedRole
* - organizations:EnableAWSServiceAccess
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableReachabilityAnalyzerOrganizationSharing.html
*/
toEnableReachabilityAnalyzerOrganizationSharing() {
return this.to('EnableReachabilityAnalyzerOrganizationSharing');
}
/**
* Grants permission to enable route server propagation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableRouteServerPropagation.html
*/
toEnableRouteServerPropagation() {
return this.to('EnableRouteServerPropagation');
}
/**
* Grants permission to enable access to the EC2 serial console of all instances for your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableSerialConsoleAccess.html
*/
toEnableSerialConsoleAccess() {
return this.to('EnableSerialConsoleAccess');
}
/**
* Grants permission to enable or modify the block public access for snapshots setting for a Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableSnapshotBlockPublicAccess.html
*/
toEnableSnapshotBlockPublicAccess() {
return this.to('EnableSnapshotBlockPublicAccess');
}
/**
* Grants permission to enable an attachment to propagate routes to a propagation route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableTransitGatewayRouteTablePropagation.html
*/
toEnableTransitGatewayRouteTablePropagation() {
return this.to('EnableTransitGatewayRouteTablePropagation');
}
/**
* Grants permission to enable a virtual private gateway to propagate routes to a VPC route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableVgwRoutePropagation.html
*/
toEnableVgwRoutePropagation() {
return this.to('EnableVgwRoutePropagation');
}
/**
* Grants permission to enable I/O operations for a volume that had I/O operations disabled
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableVolumeIO.html
*/
toEnableVolumeIO() {
return this.to('EnableVolumeIO');
}
/**
* Grants permission to enable a VPC for ClassicLink
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableVpcClassicLink.html
*/
toEnableVpcClassicLink() {
return this.to('EnableVpcClassicLink');
}
/**
* Grants permission to enable a VPC to support DNS hostname resolution for ClassicLink
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableVpcClassicLinkDnsSupport.html
*/
toEnableVpcClassicLinkDnsSupport() {
return this.to('EnableVpcClassicLinkDnsSupport');
}
/**
* Grants permission to download the client certificate revocation list for a Client VPN endpoint
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ExportClientVpnClientCertificateRevocationList.html
*/
toExportClientVpnClientCertificateRevocationList() {
return this.to('ExportClientVpnClientCertificateRevocationList');
}
/**
* Grants permission to download the contents of the Client VPN endpoint configuration file for a Client VPN endpoint
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ExportClientVpnClientConfiguration.html
*/
toExportClientVpnClientConfiguration() {
return this.to('ExportClientVpnClientConfiguration');
}
/**
* Grants permission to export an Amazon Machine Image (AMI) to a VM file
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ExportImage.html
*/
toExportImage() {
return this.to('ExportImage');
}
/**
* Grants permission to export routes from a transit gateway route table to an Amazon S3 bucket
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ExportTransitGatewayRoutes.html
*/
toExportTransitGatewayRoutes() {
return this.to('ExportTransitGatewayRoutes');
}
/**
* Grants permission to export a verified access instance client configuration
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ExportVerifiedAccessInstanceClientConfiguration.html
*/
toExportVerifiedAccessInstanceClientConfiguration() {
return this.to('ExportVerifiedAccessInstanceClientConfiguration');
}
/**
* Grants permission to get the allowed settings for images
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetAllowedImagesSettings.html
*/
toGetAllowedImagesSettings() {
return this.to('GetAllowedImagesSettings');
}
/**
* Grants permission to get the list of roles associated with an ACM certificate
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetAssociatedEnclaveCertificateIamRoles.html
*/
toGetAssociatedEnclaveCertificateIamRoles() {
return this.to('GetAssociatedEnclaveCertificateIamRoles');
}
/**
* Grants permission to get information about the IPv6 CIDR block associations for a specified IPv6 address pool
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetAssociatedIpv6PoolCidrs.html
*/
toGetAssociatedIpv6PoolCidrs() {
return this.to('GetAssociatedIpv6PoolCidrs');
}
/**
* Grants permission to get network performance data
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetAwsNetworkPerformanceData.html
*/
toGetAwsNetworkPerformanceData() {
return this.to('GetAwsNetworkPerformanceData');
}
/**
* Grants permission to get usage information about a Capacity Reservation
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetCapacityReservationUsage.html
*/
toGetCapacityReservationUsage() {
return this.to('GetCapacityReservationUsage');
}
/**
* Grants permission to describe the allocations from the specified customer-owned address pool
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetCoipPoolUsage.html
*/
toGetCoipPoolUsage() {
return this.to('GetCoipPoolUsage');
}
/**
* Grants permission to get the console output for an instance
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetConsoleOutput.html
*/
toGetConsoleOutput() {
return this.to('GetConsoleOutput');
}
/**
* Grants permission to retrieve a JPG-format screenshot of a running instance
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetConsoleScreenshot.html
*/
toGetConsoleScreenshot() {
return this.to('GetConsoleScreenshot');
}
/**
* Grants permission to get the report summary of declarative policies
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetDeclarativePoliciesReportSummary.html
*/
toGetDeclarativePoliciesReportSummary() {
return this.to('GetDeclarativePoliciesReportSummary');
}
/**
* Grants permission to get the default credit option for CPU usage of a burstable performance instance family
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetDefaultCreditSpecification.html
*/
toGetDefaultCreditSpecification() {
return this.to('GetDefaultCreditSpecification');
}
/**
* Grants permission to get the ID of the default customer master key (CMK) for EBS encryption by default
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetEbsDefaultKmsKeyId.html
*/
toGetEbsDefaultKmsKeyId() {
return this.to('GetEbsDefaultKmsKeyId');
}
/**
* Grants permission to describe whether EBS encryption by default is enabled for your account
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetEbsEncryptionByDefault.html
*/
toGetEbsEncryptionByDefault() {
return this.to('GetEbsEncryptionByDefault');
}
/**
* Grants permission to generate a CloudFormation template to streamline the integration of VPC flow logs with Amazon Athena
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetFlowLogsIntegrationTemplate.html
*/
toGetFlowLogsIntegrationTemplate() {
return this.to('GetFlowLogsIntegrationTemplate');
}
/**
* Grants permission to list the resource groups to which a Capacity Reservation has been added
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetGroupsForCapacityReservation.html
*/
toGetGroupsForCapacityReservation() {
return this.to('GetGroupsForCapacityReservation');
}
/**
* Grants permission to preview a reservation purchase with configurations that match those of a Dedicated Host
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetHostReservationPurchasePreview.html
*/
toGetHostReservationPurchasePreview() {
return this.to('GetHostReservationPurchasePreview');
}
/**
* Grants permission to get the current state of block public access for AMIs at the account level in the specified AWS Region
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetImageBlockPublicAccessState.html
*/
toGetImageBlockPublicAccessState() {
return this.to('GetImageBlockPublicAccessState');
}
/**
* Grants permission to view the default instance metadata service (IMDS) settings set for your account in the specified Region
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceMetadataDefaults.html
*/
toGetInstanceMetadataDefaults() {
return this.to('GetInstanceMetadataDefaults');
}
/**
* Grants permission to get the public endorsement key associated with the Nitro Trusted Platform Module (NitroTPM) for the specified instance
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTpmEkPub.html
*/
toGetInstanceTpmEkPub() {
return this.to('GetInstanceTpmEkPub');
}
/**
* Grants permission to view a list of instance types with specified instance attributes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html
*/
toGetInstanceTypesFromInstanceRequirements() {
return this.to('GetInstanceTypesFromInstanceRequirements');
}
/**
* Grants permission to retrieve the binary representation of the UEFI variable store
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceUefiData.html
*/
toGetInstanceUefiData() {
return this.to('GetInstanceUefiData');
}
/**
* Grants permission to retrieve historical information about a CIDR within an Amazon VPC IP Address Manager (IPAM) scope
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamAddressHistory.html
*/
toGetIpamAddressHistory() {
return this.to('GetIpamAddressHistory');
}
/**
* Grants permission to retrieve IPAM discovered accounts
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamDiscoveredAccounts.html
*/
toGetIpamDiscoveredAccounts() {
return this.to('GetIpamDiscoveredAccounts');
}
/**
* Grants permission to retrieve the public IP addresses that have been discovered by IPAM
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamDiscoveredPublicAddresses.html
*/
toGetIpamDiscoveredPublicAddresses() {
return this.to('GetIpamDiscoveredPublicAddresses');
}
/**
* Grants permission to retrieve the resource CIDRs that are monitored as part of a resource discovery
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamDiscoveredResourceCidrs.html
*/
toGetIpamDiscoveredResourceCidrs() {
return this.to('GetIpamDiscoveredResourceCidrs');
}
/**
* Grants permission to get a list of all the CIDR allocations in an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamPoolAllocations.html
*/
toGetIpamPoolAllocations() {
return this.to('GetIpamPoolAllocations');
}
/**
* Grants permission to get the CIDRs provisioned to an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamPoolCidrs.html
*/
toGetIpamPoolCidrs() {
return this.to('GetIpamPoolCidrs');
}
/**
* Grants permission to get information about the resources in an Amazon VPC IP Address Manager (IPAM) scope
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetIpamResourceCidrs.html
*/
toGetIpamResourceCidrs() {
return this.to('GetIpamResourceCidrs');
}
/**
* Grants permission to get the configuration data of the specified instance for use with a new launch template or launch template version
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetLaunchTemplateData.html
*/
toGetLaunchTemplateData() {
return this.to('GetLaunchTemplateData');
}
/**
* Grants permission to get information about the resources that are associated with the specified managed prefix list
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetManagedPrefixListAssociations.html
*/
toGetManagedPrefixListAssociations() {
return this.to('GetManagedPrefixListAssociations');
}
/**
* Grants permission to get information about the entries for a specified managed prefix list
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetManagedPrefixListEntries.html
*/
toGetManagedPrefixListEntries() {
return this.to('GetManagedPrefixListEntries');
}
/**
* Grants permission to get the findings for one or more Network Access Scope analyses
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetNetworkInsightsAccessScopeAnalysisFindings.html
*/
toGetNetworkInsightsAccessScopeAnalysisFindings() {
return this.to('GetNetworkInsightsAccessScopeAnalysisFindings');
}
/**
* Grants permission to get the content for a specified Network Access Scope
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetNetworkInsightsAccessScopeContent.html
*/
toGetNetworkInsightsAccessScopeContent() {
return this.to('GetNetworkInsightsAccessScopeContent');
}
/**
* Grants permission to retrieve the encrypted administrator password for a running Windows instance
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetPasswordData.html
*/
toGetPasswordData() {
return this.to('GetPasswordData');
}
/**
* Grants permission to return a quote and exchange information for exchanging one or more Convertible Reserved Instances for a new Convertible Reserved Instance
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetReservedInstancesExchangeQuote.html
*/
toGetReservedInstancesExchangeQuote() {
return this.to('GetReservedInstancesExchangeQuote');
}
/**
* Grants permission to describe an IAM policy that enables cross-account sharing
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/vpc/latest/ipam/share-pool-ipam.html
*/
toGetResourcePolicy() {
return this.to('GetResourcePolicy');
}
/**
* Grants permission to get associations for a route server
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetRouteServerAssociations.html
*/
toGetRouteServerAssociations() {
return this.to('GetRouteServerAssociations');
}
/**
* Grants permission to get propagations for a route server
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetRouteServerPropagations.html
*/
toGetRouteServerPropagations() {
return this.to('GetRouteServerPropagations');
}
/**
* Grants permission to get the routing database for a route server
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetRouteServerRoutingDatabase.html
*/
toGetRouteServerRoutingDatabase() {
return this.to('GetRouteServerRoutingDatabase');
}
/**
* Grants permission to retrieve a list of security groups for a specified VPC
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSecurityGroupsForVpc.html
*/
toGetSecurityGroupsForVpc() {
return this.to('GetSecurityGroupsForVpc');
}
/**
* Grants permission to retrieve the access status of your account to the EC2 serial console of all instances
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSerialConsoleAccessStatus.html
*/
toGetSerialConsoleAccessStatus() {
return this.to('GetSerialConsoleAccessStatus');
}
/**
* Grants permission to retrieve the current state of the block public access for snapshots setting for a Region
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSnapshotBlockPublicAccessState.html
*/
toGetSnapshotBlockPublicAccessState() {
return this.to('GetSnapshotBlockPublicAccessState');
}
/**
* Grants permission to calculate the Spot placement score for a Region or Availability Zone based on the specified target capacity and compute requirements
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html
*/
toGetSpotPlacementScores() {
return this.to('GetSpotPlacementScores');
}
/**
* Grants permission to retrieve information about the subnet CIDR reservations
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSubnetCidrReservations.html
*/
toGetSubnetCidrReservations() {
return this.to('GetSubnetCidrReservations');
}
/**
* Grants permission to list the route tables to which a resource attachment propagates routes
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayAttachmentPropagations.html
*/
toGetTransitGatewayAttachmentPropagations() {
return this.to('GetTransitGatewayAttachmentPropagations');
}
/**
* Grants permission to get information about the associations for a transit gateway multicast domain
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayMulticastDomainAssociations.html
*/
toGetTransitGatewayMulticastDomainAssociations() {
return this.to('GetTransitGatewayMulticastDomainAssociations');
}
/**
* Grants permission to get information about associations for a transit gateway policy table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayPolicyTableAssociations.html
*/
toGetTransitGatewayPolicyTableAssociations() {
return this.to('GetTransitGatewayPolicyTableAssociations');
}
/**
* Grants permission to get information about associations for a transit gateway policy table entry
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayPolicyTableEntries.html
*/
toGetTransitGatewayPolicyTableEntries() {
return this.to('GetTransitGatewayPolicyTableEntries');
}
/**
* Grants permission to get information about prefix list references for a transit gateway route table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayPrefixListReferences.html
*/
toGetTransitGatewayPrefixListReferences() {
return this.to('GetTransitGatewayPrefixListReferences');
}
/**
* Grants permission to get information about associations for a transit gateway route table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayRouteTableAssociations.html
*/
toGetTransitGatewayRouteTableAssociations() {
return this.to('GetTransitGatewayRouteTableAssociations');
}
/**
* Grants permission to get information about the route table propagations for a transit gateway route table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetTransitGatewayRouteTablePropagations.html
*/
toGetTransitGatewayRouteTablePropagations() {
return this.to('GetTransitGatewayRouteTablePropagations');
}
/**
* Grants permission to show the Verified Access policy associated with the endpoint
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetVerifiedAccessEndpointPolicy.html
*/
toGetVerifiedAccessEndpointPolicy() {
return this.to('GetVerifiedAccessEndpointPolicy');
}
/**
* Grants permission to get verified access endpoint targets
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetVerifiedAccessEndpointTargets.html
*/
toGetVerifiedAccessEndpointTargets() {
return this.to('GetVerifiedAccessEndpointTargets');
}
/**
* Grants permission to show the contents of the Verified Access policy associated with the group
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetVerifiedAccessGroupPolicy.html
*/
toGetVerifiedAccessGroupPolicy() {
return this.to('GetVerifiedAccessGroupPolicy');
}
/**
* Grants permission to show the AWS Web Application Firewall (WAF) web access control list (ACL) for a Verified Access instance
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/verified-access/latest/ug/waf-integration.html
*/
toGetVerifiedAccessInstanceWebAcl() {
return this.to('GetVerifiedAccessInstanceWebAcl');
}
/**
* Grants permission to download an AWS-provided sample configuration file to be used with the customer gateway device
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetVpnConnectionDeviceSampleConfiguration.html
*/
toGetVpnConnectionDeviceSampleConfiguration() {
return this.to('GetVpnConnectionDeviceSampleConfiguration');
}
/**
* Grants permission to obtain a list of customer gateway devices for which sample configuration files can be provided
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetVpnConnectionDeviceTypes.html
*/
toGetVpnConnectionDeviceTypes() {
return this.to('GetVpnConnectionDeviceTypes');
}
/**
* Grants permission to view available tunnel endpoint maintenance events
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetVpnTunnelReplacementStatus.html
*/
toGetVpnTunnelReplacementStatus() {
return this.to('GetVpnTunnelReplacementStatus');
}
/**
* Grants permission to transfer existing BYOIP IPv4 CIDRs to IPAM
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoip-ipam-transfer-ipv4.html
*/
toImportByoipCidrToIpam() {
return this.to('ImportByoipCidrToIpam');
}
/**
* Grants permission to upload a client certificate revocation list to a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportClientVpnClientCertificateRevocationList.html
*/
toImportClientVpnClientCertificateRevocationList() {
return this.to('ImportClientVpnClientCertificateRevocationList');
}
/**
* Grants permission to import single or multi-volume disk images or EBS snapshots into an Amazon Machine Image (AMI)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportImage.html
*/
toImportImage() {
return this.to('ImportImage');
}
/**
* Grants permission to create an import instance task using metadata from a disk image
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html
*/
toImportInstance() {
return this.to('ImportInstance');
}
/**
* Grants permission to import a public key from an RSA key pair that was created with a third-party tool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportKeyPair.html
*/
toImportKeyPair() {
return this.to('ImportKeyPair');
}
/**
* Grants permission to import a disk into an EBS snapshot
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportSnapshot.html
*/
toImportSnapshot() {
return this.to('ImportSnapshot');
}
/**
* Grants permission to create an import volume task using metadata from a disk image
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportVolume.html
*/
toImportVolume() {
return this.to('ImportVolume');
}
/**
* Grants permission to temporarily inject errors for target API requests
*
* Access Level: Write
*
* Possible conditions:
* - .ifFisActionId()
* - .ifFisTargetArns()
* - .ifRegion()
*
* https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html
*/
toInjectApiError() {
return this.to('InjectApiError');
}
/**
* Grants permission to list Amazon Machine Images (AMIs) that are currently in the Recycle Bin
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ListImagesInRecycleBin.html
*/
toListImagesInRecycleBin() {
return this.to('ListImagesInRecycleBin');
}
/**
* Grants permission to list the Amazon EBS snapshots that are currently in the Recycle Bin
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ListSnapshotsInRecycleBin.html
*/
toListSnapshotsInRecycleBin() {
return this.to('ListSnapshotsInRecycleBin');
}
/**
* Grants permission to lock an Amazon EBS snapshot in either governance or compliance mode to protect it against accidental or malicious deletions
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LockSnapshot.html
*/
toLockSnapshot() {
return this.to('LockSnapshot');
}
/**
* Grants permission to modify an attribute of the specified Elastic IP address
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyAddressAttribute.html
*/
toModifyAddressAttribute() {
return this.to('ModifyAddressAttribute');
}
/**
* Grants permission to modify the opt-in status of the Local Zone and Wavelength Zone group for your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyAvailabilityZoneGroup.html
*/
toModifyAvailabilityZoneGroup() {
return this.to('ModifyAvailabilityZoneGroup');
}
/**
* Grants permission to modify a Capacity Reservation's capacity and the conditions under which it is to be released
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyCapacityReservation.html
*/
toModifyCapacityReservation() {
return this.to('ModifyCapacityReservation');
}
/**
* Grants permission to modify a Capacity Reservation Fleet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:ModifyCapacityReservation
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyCapacityReservationFleet.html
*/
toModifyCapacityReservationFleet() {
return this.to('ModifyCapacityReservationFleet');
}
/**
* Grants permission to modify a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyClientVpnEndpoint.html
*/
toModifyClientVpnEndpoint() {
return this.to('ModifyClientVpnEndpoint');
}
/**
* Grants permission to change the account level default credit option for CPU usage of burstable performance instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyDefaultCreditSpecification.html
*/
toModifyDefaultCreditSpecification() {
return this.to('ModifyDefaultCreditSpecification');
}
/**
* Grants permission to change the default customer master key (CMK) for EBS encryption by default for your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyEbsDefaultKmsKeyId.html
*/
toModifyEbsDefaultKmsKeyId() {
return this.to('ModifyEbsDefaultKmsKeyId');
}
/**
* Grants permission to modify an EC2 Fleet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyFleet.html
*/
toModifyFleet() {
return this.to('ModifyFleet');
}
/**
* Grants permission to modify an attribute of an Amazon FPGA Image (AFI)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyFpgaImageAttribute.html
*/
toModifyFpgaImageAttribute() {
return this.to('ModifyFpgaImageAttribute');
}
/**
* Grants permission to modify a Dedicated Host
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyHosts.html
*/
toModifyHosts() {
return this.to('ModifyHosts');
}
/**
* Grants permission to modify the ID format for a resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIdFormat.html
*/
toModifyIdFormat() {
return this.to('ModifyIdFormat');
}
/**
* Grants permission to modify the ID format of a resource for a specific principal in your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIdentityIdFormat.html
*/
toModifyIdentityIdFormat() {
return this.to('ModifyIdentityIdFormat');
}
/**
* Grants permission to modify an attribute of an Amazon Machine Image (AMI)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyImageAttribute.html
*/
toModifyImageAttribute() {
return this.to('ModifyImageAttribute');
}
/**
* Grants permission to modify an attribute of an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceAttribute.html
*/
toModifyInstanceAttribute() {
return this.to('ModifyInstanceAttribute');
}
/**
* Grants permission to modify the Capacity Reservation settings for a stopped instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceCapacityReservationAttributes.html
*/
toModifyInstanceCapacityReservationAttributes() {
return this.to('ModifyInstanceCapacityReservationAttributes');
}
/**
* Grants permission to modify the CPU options on an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceCpuOptions.html
*/
toModifyInstanceCpuOptions() {
return this.to('ModifyInstanceCpuOptions');
}
/**
* Grants permission to modify the credit option for CPU usage on an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceCreditSpecification.html
*/
toModifyInstanceCreditSpecification() {
return this.to('ModifyInstanceCreditSpecification');
}
/**
* Grants permission to modify the start time for a scheduled EC2 instance event
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceEventStartTime.html
*/
toModifyInstanceEventStartTime() {
return this.to('ModifyInstanceEventStartTime');
}
/**
* Grants permission to modify the specified event window
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceEventWindow.html
*/
toModifyInstanceEventWindow() {
return this.to('ModifyInstanceEventWindow');
}
/**
* Grants permission to modify the recovery behaviour for an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMaintenanceOptions.html
*/
toModifyInstanceMaintenanceOptions() {
return this.to('ModifyInstanceMaintenanceOptions');
}
/**
* Grants permission to modify the default instance metadata service (IMDS) settings for your account in the specified Region
*
* Access Level: Write
*
* Possible conditions:
* - .ifAttribute()
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html
*/
toModifyInstanceMetadataDefaults() {
return this.to('ModifyInstanceMetadataDefaults');
}
/**
* Grants permission to modify the metadata options for an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html
*/
toModifyInstanceMetadataOptions() {
return this.to('ModifyInstanceMetadataOptions');
}
/**
* Grants permission to modify the network performance options for an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceNetworkPerformanceOptions.html
*/
toModifyInstanceNetworkPerformanceOptions() {
return this.to('ModifyInstanceNetworkPerformanceOptions');
}
/**
* Grants permission to modify the placement attributes for an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstancePlacement.html
*/
toModifyInstancePlacement() {
return this.to('ModifyInstancePlacement');
}
/**
* Grants permission to modify the configurations of an Amazon VPC IP Address Manager (IPAM)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpam.html
*/
toModifyIpam() {
return this.to('ModifyIpam');
}
/**
* Grants permission to modify the configurations of an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpamPool.html
*/
toModifyIpamPool() {
return this.to('ModifyIpamPool');
}
/**
* Grants permission to modify the configurations of an Amazon VPC IP Address Manager (IPAM) resource CIDR
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpamResourceCidr.html
*/
toModifyIpamResourceCidr() {
return this.to('ModifyIpamResourceCidr');
}
/**
* Grants permission to modify a resource discovery
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpamResourceDiscovery.html
*/
toModifyIpamResourceDiscovery() {
return this.to('ModifyIpamResourceDiscovery');
}
/**
* Grants permission to modify the configurations of an Amazon VPC IP Address Manager (IPAM) scope
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpamScope.html
*/
toModifyIpamScope() {
return this.to('ModifyIpamScope');
}
/**
* Grants permission to modify a launch template
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyLaunchTemplate.html
*/
toModifyLaunchTemplate() {
return this.to('ModifyLaunchTemplate');
}
/**
* Grants permission to modify a local gateway route
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyLocalGatewayRoute.html
*/
toModifyLocalGatewayRoute() {
return this.to('ModifyLocalGatewayRoute');
}
/**
* Grants permission to modify a managed prefix list
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyManagedPrefixList.html
*/
toModifyManagedPrefixList() {
return this.to('ModifyManagedPrefixList');
}
/**
* Grants permission to modify an attribute of a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyNetworkInterfaceAttribute.html
*/
toModifyNetworkInterfaceAttribute() {
return this.to('ModifyNetworkInterfaceAttribute');
}
/**
* Grants permission to modify the options for instance hostnames for the specified instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyPrivateDnsNameOptions.html
*/
toModifyPrivateDnsNameOptions() {
return this.to('ModifyPrivateDnsNameOptions');
}
/**
* Grants permission to modify attributes of one or more Reserved Instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyReservedInstances.html
*/
toModifyReservedInstances() {
return this.to('ModifyReservedInstances');
}
/**
* Grants permission to modify a route server
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyRouteServer.html
*/
toModifyRouteServer() {
return this.to('ModifyRouteServer');
}
/**
* Grants permission to modify the rules of a security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySecurityGroupRules.html
*/
toModifySecurityGroupRules() {
return this.to('ModifySecurityGroupRules');
}
/**
* Grants permission to add or remove permission settings for a snapshot
*
* Access Level: Permissions management
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySnapshotAttribute.html
*/
toModifySnapshotAttribute() {
return this.to('ModifySnapshotAttribute');
}
/**
* Grants permission to archive Amazon EBS snapshots
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySnapshotTier.html
*/
toModifySnapshotTier() {
return this.to('ModifySnapshotTier');
}
/**
* Grants permission to modify a Spot Fleet request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySpotFleetRequest.html
*/
toModifySpotFleetRequest() {
return this.to('ModifySpotFleetRequest');
}
/**
* Grants permission to modify an attribute of a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySubnetAttribute.html
*/
toModifySubnetAttribute() {
return this.to('ModifySubnetAttribute');
}
/**
* Grants permission to allow or restrict mirroring network services
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTrafficMirrorFilterNetworkServices.html
*/
toModifyTrafficMirrorFilterNetworkServices() {
return this.to('ModifyTrafficMirrorFilterNetworkServices');
}
/**
* Grants permission to modify a traffic mirror rule
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTrafficMirrorFilterRule.html
*/
toModifyTrafficMirrorFilterRule() {
return this.to('ModifyTrafficMirrorFilterRule');
}
/**
* Grants permission to modify a traffic mirror session
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTrafficMirrorSession.html
*/
toModifyTrafficMirrorSession() {
return this.to('ModifyTrafficMirrorSession');
}
/**
* Grants permission to modify a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTransitGateway.html
*/
toModifyTransitGateway() {
return this.to('ModifyTransitGateway');
}
/**
* Grants permission to modify a transit gateway prefix list reference
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTransitGatewayPrefixListReference.html
*/
toModifyTransitGatewayPrefixListReference() {
return this.to('ModifyTransitGatewayPrefixListReference');
}
/**
* Grants permission to modify a VPC attachment on a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTransitGatewayVpcAttachment.html
*/
toModifyTransitGatewayVpcAttachment() {
return this.to('ModifyTransitGatewayVpcAttachment');
}
/**
* Grants permission to modify the configuration of a Verified Access endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessEndpoint.html
*/
toModifyVerifiedAccessEndpoint() {
return this.to('ModifyVerifiedAccessEndpoint');
}
/**
* Grants permission to modify the specified Verified Access endpoint policy
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessEndpointPolicy.html
*/
toModifyVerifiedAccessEndpointPolicy() {
return this.to('ModifyVerifiedAccessEndpointPolicy');
}
/**
* Grants permission to modify the specified Verified Access Group configuration
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessGroup.html
*/
toModifyVerifiedAccessGroup() {
return this.to('ModifyVerifiedAccessGroup');
}
/**
* Grants permission to modify the specified Verified Access group policy
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessGroupPolicy.html
*/
toModifyVerifiedAccessGroupPolicy() {
return this.to('ModifyVerifiedAccessGroupPolicy');
}
/**
* Grants permission to modify the configuration of the specified Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessInstance.html
*/
toModifyVerifiedAccessInstance() {
return this.to('ModifyVerifiedAccessInstance');
}
/**
* Grants permission to modify the logging configuration for the specified Verified Access instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessInstanceLoggingConfiguration.html
*/
toModifyVerifiedAccessInstanceLoggingConfiguration() {
return this.to('ModifyVerifiedAccessInstanceLoggingConfiguration');
}
/**
* Grants permission to modify the configuration of the specified Verified Access trust provider
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVerifiedAccessTrustProvider.html
*/
toModifyVerifiedAccessTrustProvider() {
return this.to('ModifyVerifiedAccessTrustProvider');
}
/**
* Grants permission to modify the parameters of an EBS volume
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVolume.html
*/
toModifyVolume() {
return this.to('ModifyVolume');
}
/**
* Grants permission to modify an attribute of a volume
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVolumeAttribute.html
*/
toModifyVolumeAttribute() {
return this.to('ModifyVolumeAttribute');
}
/**
* Grants permission to modify an attribute of a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcAttribute.html
*/
toModifyVpcAttribute() {
return this.to('ModifyVpcAttribute');
}
/**
* Grants permission to modify an exclusion list for blocked public access on a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcBlockPublicAccessExclusion.html
*/
toModifyVpcBlockPublicAccessExclusion() {
return this.to('ModifyVpcBlockPublicAccessExclusion');
}
/**
* Grants permission to modify options for blocked public access on a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcBlockPublicAccessOptions.html
*/
toModifyVpcBlockPublicAccessOptions() {
return this.to('ModifyVpcBlockPublicAccessOptions');
}
/**
* Grants permission to modify an attribute of a VPC endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcEndpoint.html
*/
toModifyVpcEndpoint() {
return this.to('ModifyVpcEndpoint');
}
/**
* Grants permission to modify a connection notification for a VPC endpoint or VPC endpoint service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcEndpointConnectionNotification.html
*/
toModifyVpcEndpointConnectionNotification() {
return this.to('ModifyVpcEndpointConnectionNotification');
}
/**
* Grants permission to modify the attributes of a VPC endpoint service configuration
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcEndpointServiceConfiguration.html
*/
toModifyVpcEndpointServiceConfiguration() {
return this.to('ModifyVpcEndpointServiceConfiguration');
}
/**
* Grants permission to modify the payer responsibility for a VPC endpoint service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcEndpointServicePayerResponsibility.html
*/
toModifyVpcEndpointServicePayerResponsibility() {
return this.to('ModifyVpcEndpointServicePayerResponsibility');
}
/**
* Grants permission to modify the permissions for a VPC endpoint service
*
* Access Level: Permissions management
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcEndpointServicePermissions.html
*/
toModifyVpcEndpointServicePermissions() {
return this.to('ModifyVpcEndpointServicePermissions');
}
/**
* Grants permission to modify the VPC peering connection options on one side of a VPC peering connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcPeeringConnectionOptions.html
*/
toModifyVpcPeeringConnectionOptions() {
return this.to('ModifyVpcPeeringConnectionOptions');
}
/**
* Grants permission to modify the instance tenancy attribute of a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcTenancy.html
*/
toModifyVpcTenancy() {
return this.to('ModifyVpcTenancy');
}
/**
* Grants permission to modify the target gateway of a Site-to-Site VPN connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpnConnection.html
*/
toModifyVpnConnection() {
return this.to('ModifyVpnConnection');
}
/**
* Grants permission to modify the connection options for your Site-to-Site VPN connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpnConnectionOptions.html
*/
toModifyVpnConnectionOptions() {
return this.to('ModifyVpnConnectionOptions');
}
/**
* Grants permission to modify the certificate for a Site-to-Site VPN connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpnTunnelCertificate.html
*/
toModifyVpnTunnelCertificate() {
return this.to('ModifyVpnTunnelCertificate');
}
/**
* Grants permission to modify the options for a Site-to-Site VPN connection
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpnTunnelOptions.html
*/
toModifyVpnTunnelOptions() {
return this.to('ModifyVpnTunnelOptions');
}
/**
* Grants permission to enable detailed monitoring for a running instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_MonitorInstances.html
*/
toMonitorInstances() {
return this.to('MonitorInstances');
}
/**
* Grants permission to move an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_MoveAddressToVpc.html
*/
toMoveAddressToVpc() {
return this.to('MoveAddressToVpc');
}
/**
* Grants permission to move a BYOIP IPv4 CIDR to Amazon VPC IP Address Manager (IPAM) from a public IPv4 pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_MoveByoipCidrToIpam.html
*/
toMoveByoipCidrToIpam() {
return this.to('MoveByoipCidrToIpam');
}
/**
* Grants permission to move available capacity from a source Capacity Reservation to a destination Capacity Reservation
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_MoveCapacityReservationInstances.html
*/
toMoveCapacityReservationInstances() {
return this.to('MoveCapacityReservationInstances');
}
/**
* Grants permission to temporarily pause I/O operations for a target Amazon EBS volume
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#ebs-actions-reference
*/
toPauseVolumeIO() {
return this.to('PauseVolumeIO');
}
/**
* Grants permission to provision an address range for use in AWS through bring your own IP addresses (BYOIP), and to create a corresponding address pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ProvisionByoipCidr.html
*/
toProvisionByoipCidr() {
return this.to('ProvisionByoipCidr');
}
/**
* Grants permission to provision an Autonomous System Number (ASN) for use in an Amazon Web Services account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ProvisionIpamByoasn.html
*/
toProvisionIpamByoasn() {
return this.to('ProvisionIpamByoasn');
}
/**
* Grants permission to provision a CIDR to an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ProvisionIpamPoolCidr.html
*/
toProvisionIpamPoolCidr() {
return this.to('ProvisionIpamPoolCidr');
}
/**
* Grants permission to provision a CIDR to a public IPv4 pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ProvisionPublicIpv4PoolCidr.html
*/
toProvisionPublicIpv4PoolCidr() {
return this.to('ProvisionPublicIpv4PoolCidr');
}
/**
* Grants permission to purchase a Capacity Block offering
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_PurchaseCapacityBlock.html
*/
toPurchaseCapacityBlock() {
return this.to('PurchaseCapacityBlock');
}
/**
* Grants permission to purchase a Capacity Block extension
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_PurchaseCapacityBlockExtension.html
*/
toPurchaseCapacityBlockExtension() {
return this.to('PurchaseCapacityBlockExtension');
}
/**
* Grants permission to purchase a reservation with configurations that match those of a Dedicated Host
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_PurchaseHostReservation.html
*/
toPurchaseHostReservation() {
return this.to('PurchaseHostReservation');
}
/**
* Grants permission to purchase a Reserved Instance offering
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_PurchaseReservedInstancesOffering.html
*/
toPurchaseReservedInstancesOffering() {
return this.to('PurchaseReservedInstancesOffering');
}
/**
* Grants permission to purchase one or more Scheduled Instances with a specified schedule
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_PurchaseScheduledInstances.html
*/
toPurchaseScheduledInstances() {
return this.to('PurchaseScheduledInstances');
}
/**
* Grants permission to attach an IAM policy that enables cross-account sharing to a resource
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/vpc/latest/ipam/share-pool-ipam.html
*/
toPutResourcePolicy() {
return this.to('PutResourcePolicy');
}
/**
* Grants permission to request a reboot of one or more instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RebootInstances.html
*/
toRebootInstances() {
return this.to('RebootInstances');
}
/**
* Grants permission to register an Amazon Machine Image (AMI)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RegisterImage.html
*/
toRegisterImage() {
return this.to('RegisterImage');
}
/**
* Grants permission to add tags to the set of tags to include in notifications about scheduled events for your instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RegisterInstanceEventNotificationAttributes.html
*/
toRegisterInstanceEventNotificationAttributes() {
return this.to('RegisterInstanceEventNotificationAttributes');
}
/**
* Grants permission to register one or more network interfaces as a member of a group IP address in a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RegisterTransitGatewayMulticastGroupMembers.html
*/
toRegisterTransitGatewayMulticastGroupMembers() {
return this.to('RegisterTransitGatewayMulticastGroupMembers');
}
/**
* Grants permission to register one or more network interfaces as a source of a group IP address in a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RegisterTransitGatewayMulticastGroupSources.html
*/
toRegisterTransitGatewayMulticastGroupSources() {
return this.to('RegisterTransitGatewayMulticastGroupSources');
}
/**
* Grants permission to reject a request to assign billing of the available capacity of a shared Capacity Reservation to your account
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RejectCapacityReservationBillingOwnership.html
*/
toRejectCapacityReservationBillingOwnership() {
return this.to('RejectCapacityReservationBillingOwnership');
}
/**
* Grants permission to reject requests to associate cross-account subnets with a transit gateway multicast domain
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RejectTransitGatewayMulticastDomainAssociations.html
*/
toRejectTransitGatewayMulticastDomainAssociations() {
return this.to('RejectTransitGatewayMulticastDomainAssociations');
}
/**
* Grants permission to reject a transit gateway peering attachment request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RejectTransitGatewayPeeringAttachment.html
*/
toRejectTransitGatewayPeeringAttachment() {
return this.to('RejectTransitGatewayPeeringAttachment');
}
/**
* Grants permission to reject a request to attach a VPC to a transit gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RejectTransitGatewayVpcAttachment.html
*/
toRejectTransitGatewayVpcAttachment() {
return this.to('RejectTransitGatewayVpcAttachment');
}
/**
* Grants permission to reject one or more VPC endpoint connection requests to a VPC endpoint service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RejectVpcEndpointConnections.html
*/
toRejectVpcEndpointConnections() {
return this.to('RejectVpcEndpointConnections');
}
/**
* Grants permission to reject a VPC peering connection request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RejectVpcPeeringConnection.html
*/
toRejectVpcPeeringConnection() {
return this.to('RejectVpcPeeringConnection');
}
/**
* Grants permission to release an Elastic IP address
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseAddress.html
*/
toReleaseAddress() {
return this.to('ReleaseAddress');
}
/**
* Grants permission to release one or more On-Demand Dedicated Hosts
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseHosts.html
*/
toReleaseHosts() {
return this.to('ReleaseHosts');
}
/**
* Grants permission to release an allocation within an Amazon VPC IP Address Manager (IPAM) pool
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseIpamPoolAllocation.html
*/
toReleaseIpamPoolAllocation() {
return this.to('ReleaseIpamPoolAllocation');
}
/**
* Grants permission to replace an IAM instance profile for an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - iam:PassRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceIamInstanceProfileAssociation.html
*/
toReplaceIamInstanceProfileAssociation() {
return this.to('ReplaceIamInstanceProfileAssociation');
}
/**
* Grants permission to replace image criteria in allowed images settings
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceImageCriteriaInAllowedImagesSettings.html
*/
toReplaceImageCriteriaInAllowedImagesSettings() {
return this.to('ReplaceImageCriteriaInAllowedImagesSettings');
}
/**
* Grants permission to change which network ACL a subnet is associated with
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceNetworkAclAssociation.html
*/
toReplaceNetworkAclAssociation() {
return this.to('ReplaceNetworkAclAssociation');
}
/**
* Grants permission to replace an entry (rule) in a network ACL
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceNetworkAclEntry.html
*/
toReplaceNetworkAclEntry() {
return this.to('ReplaceNetworkAclEntry');
}
/**
* Grants permission to replace a route within a route table in a VPC
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceRoute.html
*/
toReplaceRoute() {
return this.to('ReplaceRoute');
}
/**
* Grants permission to change the route table that is associated with a subnet
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceRouteTableAssociation.html
*/
toReplaceRouteTableAssociation() {
return this.to('ReplaceRouteTableAssociation');
}
/**
* Grants permission to replace a route in a transit gateway route table
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceTransitGatewayRoute.html
*/
toReplaceTransitGatewayRoute() {
return this.to('ReplaceTransitGatewayRoute');
}
/**
* Grants permission to replace a VPN tunnel
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReplaceVpnTunnel.html
*/
toReplaceVpnTunnel() {
return this.to('ReplaceVpnTunnel');
}
/**
* Grants permission to submit feedback about the status of an instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReportInstanceStatus.html
*/
toReportInstanceStatus() {
return this.to('ReportInstanceStatus');
}
/**
* Grants permission to create a Spot Fleet request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet.html
*/
toRequestSpotFleet() {
return this.to('RequestSpotFleet');
}
/**
* Grants permission to create a Spot Instance request
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - iam:PassRole
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html
*/
toRequestSpotInstances() {
return this.to('RequestSpotInstances');
}
/**
* Grants permission to reset the attribute of the specified IP address
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetAddressAttribute.html
*/
toResetAddressAttribute() {
return this.to('ResetAddressAttribute');
}
/**
* Grants permission to reset the default customer master key (CMK) for EBS encryption for your account to use the AWS-managed CMK for EBS
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetEbsDefaultKmsKeyId.html
*/
toResetEbsDefaultKmsKeyId() {
return this.to('ResetEbsDefaultKmsKeyId');
}
/**
* Grants permission to reset an attribute of an Amazon FPGA Image (AFI) to its default value
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetFpgaImageAttribute.html
*/
toResetFpgaImageAttribute() {
return this.to('ResetFpgaImageAttribute');
}
/**
* Grants permission to reset an attribute of an Amazon Machine Image (AMI) to its default value
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetImageAttribute.html
*/
toResetImageAttribute() {
return this.to('ResetImageAttribute');
}
/**
* Grants permission to reset an attribute of an instance to its default value
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetInstanceAttribute.html
*/
toResetInstanceAttribute() {
return this.to('ResetInstanceAttribute');
}
/**
* Grants permission to reset an attribute of a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetNetworkInterfaceAttribute.html
*/
toResetNetworkInterfaceAttribute() {
return this.to('ResetNetworkInterfaceAttribute');
}
/**
* Grants permission to reset permission settings for a snapshot
*
* Access Level: Permissions management
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ResetSnapshotAttribute.html
*/
toResetSnapshotAttribute() {
return this.to('ResetSnapshotAttribute');
}
/**
* Grants permission to restore an Elastic IP address that was previously moved to the EC2-VPC platform back to the EC2-Classic platform
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RestoreAddressToClassic.html
*/
toRestoreAddressToClassic() {
return this.to('RestoreAddressToClassic');
}
/**
* Grants permission to restore an Amazon Machine Image (AMI) from the Recycle Bin
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RestoreImageFromRecycleBin.html
*/
toRestoreImageFromRecycleBin() {
return this.to('RestoreImageFromRecycleBin');
}
/**
* Grants permission to restore the entries from a previous version of a managed prefix list to a new version of the prefix list
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RestoreManagedPrefixListVersion.html
*/
toRestoreManagedPrefixListVersion() {
return this.to('RestoreManagedPrefixListVersion');
}
/**
* Grants permission to restore an Amazon EBS snapshot from the Recycle Bin
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RestoreSnapshotFromRecycleBin.html
*/
toRestoreSnapshotFromRecycleBin() {
return this.to('RestoreSnapshotFromRecycleBin');
}
/**
* Grants permission to restore an archived Amazon EBS snapshot for use temporarily or permanently, or modify the restore period or restore type for a snapshot that was previously temporarily restored
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RestoreSnapshotTier.html
*/
toRestoreSnapshotTier() {
return this.to('RestoreSnapshotTier');
}
/**
* Grants permission to remove an inbound authorization rule from a Client VPN endpoint
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RevokeClientVpnIngress.html
*/
toRevokeClientVpnIngress() {
return this.to('RevokeClientVpnIngress');
}
/**
* Grants permission to remove one or more outbound rules from a VPC security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RevokeSecurityGroupEgress.html
*/
toRevokeSecurityGroupEgress() {
return this.to('RevokeSecurityGroupEgress');
}
/**
* Grants permission to remove one or more inbound rules from a security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RevokeSecurityGroupIngress.html
*/
toRevokeSecurityGroupIngress() {
return this.to('RevokeSecurityGroupIngress');
}
/**
* Grants permission to launch one or more instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
* - iam:PassRole
* - ssm:GetParameters
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html
*/
toRunInstances() {
return this.to('RunInstances');
}
/**
* Grants permission to launch one or more Scheduled Instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunScheduledInstances.html
*/
toRunScheduledInstances() {
return this.to('RunScheduledInstances');
}
/**
* Grants permission to search for routes in a local gateway route table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SearchLocalGatewayRoutes.html
*/
toSearchLocalGatewayRoutes() {
return this.to('SearchLocalGatewayRoutes');
}
/**
* Grants permission to search for groups, sources, and members in a transit gateway multicast domain
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SearchTransitGatewayMulticastGroups.html
*/
toSearchTransitGatewayMulticastGroups() {
return this.to('SearchTransitGatewayMulticastGroups');
}
/**
* Grants permission to search for routes in a transit gateway route table
*
* Access Level: List
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SearchTransitGatewayRoutes.html
*/
toSearchTransitGatewayRoutes() {
return this.to('SearchTransitGatewayRoutes');
}
/**
* Grants permission to send a diagnostic interrupt to an Amazon EC2 instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SendDiagnosticInterrupt.html
*/
toSendDiagnosticInterrupt() {
return this.to('SendDiagnosticInterrupt');
}
/**
* Grants permission to interrupt a Spot Instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#send-spot-instance-interruptions
*/
toSendSpotInstanceInterruptions() {
return this.to('SendSpotInstanceInterruptions');
}
/**
* Grants permission to start a declarative policies report
*
* Access Level: Read
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartDeclarativePoliciesReport.html
*/
toStartDeclarativePoliciesReport() {
return this.to('StartDeclarativePoliciesReport');
}
/**
* Grants permission to start a stopped instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html
*/
toStartInstances() {
return this.to('StartInstances');
}
/**
* Grants permission to start a Network Access Scope analysis
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartNetworkInsightsAccessScopeAnalysis.html
*/
toStartNetworkInsightsAccessScopeAnalysis() {
return this.to('StartNetworkInsightsAccessScopeAnalysis');
}
/**
* Grants permission to start analyzing a specified path
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* Dependent actions:
* - ec2:CreateTags
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartNetworkInsightsAnalysis.html
*/
toStartNetworkInsightsAnalysis() {
return this.to('StartNetworkInsightsAnalysis');
}
/**
* Grants permission to start the private DNS verification process for a VPC endpoint service
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartVpcEndpointServicePrivateDnsVerification.html
*/
toStartVpcEndpointServicePrivateDnsVerification() {
return this.to('StartVpcEndpointServicePrivateDnsVerification');
}
/**
* Grants permission to stop an Amazon EBS-backed instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html
*/
toStopInstances() {
return this.to('StopInstances');
}
/**
* Grants permission to terminate active Client VPN endpoint connections
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TerminateClientVpnConnections.html
*/
toTerminateClientVpnConnections() {
return this.to('TerminateClientVpnConnections');
}
/**
* Grants permission to shut down one or more instances
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TerminateInstances.html
*/
toTerminateInstances() {
return this.to('TerminateInstances');
}
/**
* Grants permission to unassign one or more IPv6 addresses from a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnassignIpv6Addresses.html
*/
toUnassignIpv6Addresses() {
return this.to('UnassignIpv6Addresses');
}
/**
* Grants permission to unassign one or more secondary private IP addresses from a network interface
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnassignPrivateIpAddresses.html
*/
toUnassignPrivateIpAddresses() {
return this.to('UnassignPrivateIpAddresses');
}
/**
* Grants permission to unassign secondary private IPv4 addresses from a private NAT gateway
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnassignPrivateNatGatewayAddress.html
*/
toUnassignPrivateNatGatewayAddress() {
return this.to('UnassignPrivateNatGatewayAddress');
}
/**
* Grants permission to unlock a snapshot that is locked in governance mode or in compliance mode while still in the cooling-off period
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnlockSnapshot.html
*/
toUnlockSnapshot() {
return this.to('UnlockSnapshot');
}
/**
* Grants permission to disable detailed monitoring for a running instance
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnmonitorInstances.html
*/
toUnmonitorInstances() {
return this.to('UnmonitorInstances');
}
/**
* Grants permission to update descriptions for one or more outbound rules in a VPC security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UpdateSecurityGroupRuleDescriptionsEgress.html
*/
toUpdateSecurityGroupRuleDescriptionsEgress() {
return this.to('UpdateSecurityGroupRuleDescriptionsEgress');
}
/**
* Grants permission to update descriptions for one or more inbound rules in a security group
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UpdateSecurityGroupRuleDescriptionsIngress.html
*/
toUpdateSecurityGroupRuleDescriptionsIngress() {
return this.to('UpdateSecurityGroupRuleDescriptionsIngress');
}
/**
* Grants permission to stop advertising an address range that was provisioned for use in AWS through bring your own IP addresses (BYOIP)
*
* Access Level: Write
*
* Possible conditions:
* - .ifRegion()
*
* https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_WithdrawByoipCidr.html
*/
toWithdrawByoipCidr() {
return this.to('WithdrawByoipCidr');
}
/**
* Adds a resource of type elastic-ip to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html
*
* @param allocationId - Identifier for the allocationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAllocationId()
* - .ifAttribute()
* - .ifAttribute()
* - .ifDomain()
* - .ifPublicIpAddress()
* - .ifRegion()
* - .ifResourceTag()
*/
onElasticIp(allocationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:elastic-ip/${allocationId}`);
}
/**
* Adds a resource of type capacity-reservation-fleet to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param capacityReservationFleetId - Identifier for the capacityReservationFleetId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onCapacityReservationFleet(capacityReservationFleetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:capacity-reservation-fleet/${capacityReservationFleetId}`);
}
/**
* Adds a resource of type capacity-reservation to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html
*
* @param capacityReservationId - Identifier for the capacityReservationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAvailabilityZone()
* - .ifAvailabilityZoneId()
* - .ifCapacityReservationFleet()
* - .ifCreateDate()
* - .ifDestinationCapacityReservationId()
* - .ifEbsOptimized()
* - .ifEndDate()
* - .ifEndDateType()
* - .ifEphemeralStorage()
* - .ifInstanceCount()
* - .ifInstanceMatchCriteria()
* - .ifInstancePlatform()
* - .ifInstanceType()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifOutpostArn()
* - .ifPlacementGroup()
* - .ifRegion()
* - .ifResourceTag()
* - .ifSourceCapacityReservationId()
* - .ifTenancy()
*/
onCapacityReservation(capacityReservationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:capacity-reservation/${capacityReservationId}`);
}
/**
* Adds a resource of type carrier-gateway to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/Carrier_Gateway.html
*
* @param carrierGatewayId - Identifier for the carrierGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTenancy()
* - .ifVpc()
*/
onCarrierGateway(carrierGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:carrier-gateway/${carrierGatewayId}`);
}
/**
* Adds a resource of type certificate to the statement
*
* https://docs.aws.amazon.com/acm/latest/userguide/authen-overview.html#acm-resources-operations
*
* @param certificateId - Identifier for the certificateId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onCertificate(certificateId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:acm:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:certificate/${certificateId}`);
}
/**
* Adds a resource of type client-vpn-endpoint to the statement
*
* https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/what-is.html
*
* @param clientVpnEndpointId - Identifier for the clientVpnEndpointId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifClientRootCertificateChainArn()
* - .ifCloudwatchLogGroupArn()
* - .ifCloudwatchLogStreamArn()
* - .ifDirectoryArn()
* - .ifRegion()
* - .ifResourceTag()
* - .ifSamlProviderArn()
* - .ifServerCertificateArn()
*/
onClientVpnEndpoint(clientVpnEndpointId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:client-vpn-endpoint/${clientVpnEndpointId}`);
}
/**
* Adds a resource of type customer-gateway to the statement
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html
*
* @param customerGatewayId - Identifier for the customerGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onCustomerGateway(customerGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:customer-gateway/${customerGatewayId}`);
}
/**
* Adds a resource of type declarative-policies-report to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param declarativePoliciesReportId - Identifier for the declarativePoliciesReportId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onDeclarativePoliciesReport(declarativePoliciesReportId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:declarative-policies-report/${declarativePoliciesReportId}`);
}
/**
* Adds a resource of type dedicated-host to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html
*
* @param dedicatedHostId - Identifier for the dedicatedHostId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAutoPlacement()
* - .ifAvailabilityZone()
* - .ifHostRecovery()
* - .ifInstanceType()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifQuantity()
* - .ifRegion()
* - .ifResourceTag()
*/
onDedicatedHost(dedicatedHostId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:dedicated-host/${dedicatedHostId}`);
}
/**
* Adds a resource of type dhcp-options to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html
*
* @param dhcpOptionsId - Identifier for the dhcpOptionsId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifDhcpOptionsID()
* - .ifRegion()
* - .ifResourceTag()
*/
onDhcpOptions(dhcpOptionsId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:dhcp-options/${dhcpOptionsId}`);
}
/**
* Adds a resource of type egress-only-internet-gateway to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html
*
* @param egressOnlyInternetGatewayId - Identifier for the egressOnlyInternetGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onEgressOnlyInternetGateway(egressOnlyInternetGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:egress-only-internet-gateway/${egressOnlyInternetGatewayId}`);
}
/**
* Adds a resource of type elastic-gpu to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-gpus.html
*
* @param elasticGpuId - Identifier for the elasticGpuId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifElasticGpuType()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifRegion()
* - .ifResourceTag()
*/
onElasticGpu(elasticGpuId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:elastic-gpu/${elasticGpuId}`);
}
/**
* Adds a resource of type elastic-inference to the statement
*
* https://docs.aws.amazon.com/elastic-inference/latest/developerguide/what-is-ei.html
*
* @param acceleratorId - Identifier for the acceleratorId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onElasticInference(acceleratorId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:elastic-inference:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:elastic-inference-accelerator/${acceleratorId}`);
}
/**
* Adds a resource of type export-image-task to the statement
*
* https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html#export-vm-image
*
* @param exportImageTaskId - Identifier for the exportImageTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onExportImageTask(exportImageTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:export-image-task/${exportImageTaskId}`);
}
/**
* Adds a resource of type export-instance-task to the statement
*
* https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html
*
* @param exportTaskId - Identifier for the exportTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onExportInstanceTask(exportTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:export-instance-task/${exportTaskId}`);
}
/**
* Adds a resource of type fleet to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet.html
*
* @param fleetId - Identifier for the fleetId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onFleet(fleetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:fleet/${fleetId}`);
}
/**
* Adds a resource of type fpga-image to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param fpgaImageId - Identifier for the fpgaImageId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifOwner()
* - .ifPublic()
* - .ifRegion()
* - .ifResourceTag()
*/
onFpgaImage(fpgaImageId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:fpga-image/${fpgaImageId}`);
}
/**
* Adds a resource of type host-reservation to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param hostReservationId - Identifier for the hostReservationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onHostReservation(hostReservationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:host-reservation/${hostReservationId}`);
}
/**
* Adds a resource of type image to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html
*
* @param imageId - Identifier for the imageId.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifImageID()
* - .ifImageType()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifOwner()
* - .ifPublic()
* - .ifRegion()
* - .ifResourceTag()
* - .ifRootDeviceType()
*/
onImage(imageId, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}::image/${imageId}`);
}
/**
* Adds a resource of type import-image-task to the statement
*
* https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html#import-vm-image
*
* @param importImageTaskId - Identifier for the importImageTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onImportImageTask(importImageTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:import-image-task/${importImageTaskId}`);
}
/**
* Adds a resource of type import-snapshot-task to the statement
*
* https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-import-snapshot.html
*
* @param importSnapshotTaskId - Identifier for the importSnapshotTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onImportSnapshotTask(importSnapshotTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:import-snapshot-task/${importSnapshotTaskId}`);
}
/**
* Adds a resource of type instance-connect-endpoint to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param instanceConnectEndpointId - Identifier for the instanceConnectEndpointId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
* - .ifSubnetID()
*/
onInstanceConnectEndpoint(instanceConnectEndpointId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:instance-connect-endpoint/${instanceConnectEndpointId}`);
}
/**
* Adds a resource of type instance-event-window to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param instanceEventWindowId - Identifier for the instanceEventWindowId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onInstanceEventWindow(instanceEventWindowId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:instance-event-window/${instanceEventWindowId}`);
}
/**
* Adds a resource of type instance to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Instances.html
*
* @param instanceId - Identifier for the instanceId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAvailabilityZone()
* - .ifCpuOptionsAmdSevSnp()
* - .ifEbsOptimized()
* - .ifInstanceAutoRecovery()
* - .ifInstanceBandwidthWeighting()
* - .ifInstanceID()
* - .ifInstanceMarketType()
* - .ifInstanceMetadataTags()
* - .ifInstanceProfile()
* - .ifInstanceType()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifManagedResourceOperator()
* - .ifMetadataHttpEndpoint()
* - .ifMetadataHttpPutResponseHopLimit()
* - .ifMetadataHttpTokens()
* - .ifNewInstanceProfile()
* - .ifPlacementGroup()
* - .ifProductCode()
* - .ifRegion()
* - .ifResourceTag()
* - .ifRootDeviceType()
* - .ifTenancy()
*/
onInstance(instanceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:instance/${instanceId}`);
}
/**
* Adds a resource of type internet-gateway to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html
*
* @param internetGatewayId - Identifier for the internetGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifInternetGatewayID()
* - .ifRegion()
* - .ifResourceTag()
*/
onInternetGateway(internetGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:internet-gateway/${internetGatewayId}`);
}
/**
* Adds a resource of type ipam-external-resource-verification-token to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipamExternalResourceVerificationTokenId - Identifier for the ipamExternalResourceVerificationTokenId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpamExternalResourceVerificationToken(ipamExternalResourceVerificationTokenId, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2::${account ?? this.defaultAccount}:ipam-external-resource-verification-token/${ipamExternalResourceVerificationTokenId}`);
}
/**
* Adds a resource of type ipam to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipamId - Identifier for the ipamId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpam(ipamId, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2::${account ?? this.defaultAccount}:ipam/${ipamId}`);
}
/**
* Adds a resource of type ipam-pool to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipamPoolId - Identifier for the ipamPoolId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpamPool(ipamPoolId, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2::${account ?? this.defaultAccount}:ipam-pool/${ipamPoolId}`);
}
/**
* Adds a resource of type ipam-resource-discovery-association to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipamResourceDiscoveryAssociationId - Identifier for the ipamResourceDiscoveryAssociationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpamResourceDiscoveryAssociation(ipamResourceDiscoveryAssociationId, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2::${account ?? this.defaultAccount}:ipam-resource-discovery-association/${ipamResourceDiscoveryAssociationId}`);
}
/**
* Adds a resource of type ipam-resource-discovery to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipamResourceDiscoveryId - Identifier for the ipamResourceDiscoveryId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpamResourceDiscovery(ipamResourceDiscoveryId, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2::${account ?? this.defaultAccount}:ipam-resource-discovery/${ipamResourceDiscoveryId}`);
}
/**
* Adds a resource of type ipam-scope to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipamScopeId - Identifier for the ipamScopeId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpamScope(ipamScopeId, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2::${account ?? this.defaultAccount}:ipam-scope/${ipamScopeId}`);
}
/**
* Adds a resource of type coip-pool to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param ipv4PoolCoipId - Identifier for the ipv4PoolCoipId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onCoipPool(ipv4PoolCoipId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:coip-pool/${ipv4PoolCoipId}`);
}
/**
* Adds a resource of type ipv4pool-ec2 to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#ip-addressing-eips
*
* @param ipv4PoolEc2Id - Identifier for the ipv4PoolEc2Id.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpv4poolEc2(ipv4PoolEc2Id, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:ipv4pool-ec2/${ipv4PoolEc2Id}`);
}
/**
* Adds a resource of type ipv6pool-ec2 to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#ipv6-addressing
*
* @param ipv6PoolEc2Id - Identifier for the ipv6PoolEc2Id.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onIpv6poolEc2(ipv6PoolEc2Id, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:ipv6pool-ec2/${ipv6PoolEc2Id}`);
}
/**
* Adds a resource of type key-pair to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html
*
* @param keyPairName - Identifier for the keyPairName.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifIsLaunchTemplateResource()
* - .ifKeyPairName()
* - .ifKeyPairType()
* - .ifLaunchTemplate()
* - .ifRegion()
* - .ifResourceTag()
*/
onKeyPair(keyPairName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:key-pair/${keyPairName}`);
}
/**
* Adds a resource of type launch-template to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html
*
* @param launchTemplateId - Identifier for the launchTemplateId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifManagedResourceOperator()
* - .ifRegion()
* - .ifResourceTag()
*/
onLaunchTemplate(launchTemplateId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:launch-template/${launchTemplateId}`);
}
/**
* Adds a resource of type license-configuration to the statement
*
* https://docs.aws.amazon.com/license-manager/latest/userguide/create-license-configuration.html
*
* @param licenseConfigurationId - Identifier for the licenseConfigurationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onLicenseConfiguration(licenseConfigurationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:license-manager:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:license-configuration:${licenseConfigurationId}`);
}
/**
* Adds a resource of type local-gateway to the statement
*
* https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html#lgw
*
* @param localGatewayId - Identifier for the localGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onLocalGateway(localGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:local-gateway/${localGatewayId}`);
}
/**
* Adds a resource of type local-gateway-route-table-virtual-interface-group-association to the statement
*
* https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html
*
* @param localGatewayRouteTableVirtualInterfaceGroupAssociationId - Identifier for the localGatewayRouteTableVirtualInterfaceGroupAssociationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onLocalGatewayRouteTableVirtualInterfaceGroupAssociation(localGatewayRouteTableVirtualInterfaceGroupAssociationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:local-gateway-route-table-virtual-interface-group-association/${localGatewayRouteTableVirtualInterfaceGroupAssociationId}`);
}
/**
* Adds a resource of type local-gateway-route-table-vpc-association to the statement
*
* https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html#vpc-associations
*
* @param localGatewayRouteTableVpcAssociationId - Identifier for the localGatewayRouteTableVpcAssociationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onLocalGatewayRouteTableVpcAssociation(localGatewayRouteTableVpcAssociationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:local-gateway-route-table-vpc-association/${localGatewayRouteTableVpcAssociationId}`);
}
/**
* Adds a resource of type local-gateway-route-table to the statement
*
* https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html#route-tables
*
* @param localGatewayRoutetableId - Identifier for the localGatewayRoutetableId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onLocalGatewayRouteTable(localGatewayRoutetableId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:local-gateway-route-table/${localGatewayRoutetableId}`);
}
/**
* Adds a resource of type local-gateway-virtual-interface-group to the statement
*
* https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html
*
* @param localGatewayVirtualInterfaceGroupId - Identifier for the localGatewayVirtualInterfaceGroupId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onLocalGatewayVirtualInterfaceGroup(localGatewayVirtualInterfaceGroupId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:local-gateway-virtual-interface-group/${localGatewayVirtualInterfaceGroupId}`);
}
/**
* Adds a resource of type local-gateway-virtual-interface to the statement
*
* https://docs.aws.amazon.com/outposts/latest/userguide/outposts-local-gateways.html
*
* @param localGatewayVirtualInterfaceId - Identifier for the localGatewayVirtualInterfaceId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onLocalGatewayVirtualInterface(localGatewayVirtualInterfaceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:local-gateway-virtual-interface/${localGatewayVirtualInterfaceId}`);
}
/**
* Adds a resource of type natgateway to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html
*
* @param natGatewayId - Identifier for the natGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onNatgateway(natGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:natgateway/${natGatewayId}`);
}
/**
* Adds a resource of type network-acl to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html
*
* @param naclId - Identifier for the naclId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifNetworkAclID()
* - .ifRegion()
* - .ifResourceTag()
* - .ifVpc()
*/
onNetworkAcl(naclId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network-acl/${naclId}`);
}
/**
* Adds a resource of type network-insights-access-scope-analysis to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param networkInsightsAccessScopeAnalysisId - Identifier for the networkInsightsAccessScopeAnalysisId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onNetworkInsightsAccessScopeAnalysis(networkInsightsAccessScopeAnalysisId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network-insights-access-scope-analysis/${networkInsightsAccessScopeAnalysisId}`);
}
/**
* Adds a resource of type network-insights-access-scope to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param networkInsightsAccessScopeId - Identifier for the networkInsightsAccessScopeId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onNetworkInsightsAccessScope(networkInsightsAccessScopeId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network-insights-access-scope/${networkInsightsAccessScopeId}`);
}
/**
* Adds a resource of type network-insights-analysis to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param networkInsightsAnalysisId - Identifier for the networkInsightsAnalysisId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onNetworkInsightsAnalysis(networkInsightsAnalysisId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network-insights-analysis/${networkInsightsAnalysisId}`);
}
/**
* Adds a resource of type network-insights-path to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param networkInsightsPathId - Identifier for the networkInsightsPathId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onNetworkInsightsPath(networkInsightsPathId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network-insights-path/${networkInsightsPathId}`);
}
/**
* Adds a resource of type network-interface to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html
*
* @param networkInterfaceId - Identifier for the networkInterfaceId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAssociatePublicIpAddress()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAuthorizedService()
* - .ifAuthorizedUser()
* - .ifAvailabilityZone()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifManagedResourceOperator()
* - .ifNetworkInterfaceID()
* - .ifPermission()
* - .ifRegion()
* - .ifResourceTag()
* - .ifSubnet()
* - .ifVpc()
*/
onNetworkInterface(networkInterfaceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network-interface/${networkInterfaceId}`);
}
/**
* Adds a resource of type outpost-lag to the statement
*
* @param outpostLagId - Identifier for the outpostLagId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onOutpostLag(outpostLagId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:outpost-lag/${outpostLagId}`);
}
/**
* Adds a resource of type placement-group to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html
*
* @param placementGroupName - Identifier for the placementGroupName.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifPlacementGroupName()
* - .ifPlacementGroupStrategy()
* - .ifRegion()
* - .ifResourceTag()
*/
onPlacementGroup(placementGroupName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:placement-group/${placementGroupName}`);
}
/**
* Adds a resource of type prefix-list to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/managed-prefix-lists.html
*
* @param prefixListId - Identifier for the prefixListId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onPrefixList(prefixListId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:prefix-list/${prefixListId}`);
}
/**
* Adds a resource of type replace-root-volume-task to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/replace-root.html
*
* @param replaceRootVolumeTaskId - Identifier for the replaceRootVolumeTaskId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onReplaceRootVolumeTask(replaceRootVolumeTaskId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:replace-root-volume-task/${replaceRootVolumeTaskId}`);
}
/**
* Adds a resource of type reserved-instances to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-reserved-instances.html
*
* @param reservationId - Identifier for the reservationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAvailabilityZone()
* - .ifInstanceType()
* - .ifRegion()
* - .ifReservedInstancesOfferingType()
* - .ifResourceTag()
* - .ifTenancy()
*/
onReservedInstances(reservationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:reserved-instances/${reservationId}`);
}
/**
* Adds a resource of type group to the statement
*
* https://docs.aws.amazon.com/ARG/latest/userguide/resource-groups.html
*
* @param groupName - Identifier for the groupName.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onGroup(groupName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:resource-groups:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:group/${groupName}`);
}
/**
* Adds a resource of type role to the statement
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html
*
* @param roleNameWithPath - Identifier for the roleNameWithPath.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*/
onRole(roleNameWithPath, account, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:iam::${account ?? this.defaultAccount}:role/${roleNameWithPath}`);
}
/**
* Adds a resource of type route-server-endpoint to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/route-server-terms.html
*
* @param routeServerEndpointId - Identifier for the routeServerEndpointId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAvailabilityZone()
* - .ifRegion()
* - .ifResourceTag()
*/
onRouteServerEndpoint(routeServerEndpointId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:route-server-endpoint/${routeServerEndpointId}`);
}
/**
* Adds a resource of type route-server to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/route-server-terms.html
*
* @param routeServerId - Identifier for the routeServerId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onRouteServer(routeServerId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:route-server/${routeServerId}`);
}
/**
* Adds a resource of type route-server-peer to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/route-server-terms.html
*
* @param routeServerPeerId - Identifier for the routeServerPeerId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAvailabilityZone()
* - .ifRegion()
* - .ifResourceTag()
*/
onRouteServerPeer(routeServerPeerId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:route-server-peer/${routeServerPeerId}`);
}
/**
* Adds a resource of type route-table to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html
*
* @param routeTableId - Identifier for the routeTableId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
* - .ifRouteTableID()
* - .ifVpc()
*/
onRouteTable(routeTableId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:route-table/${routeTableId}`);
}
/**
* Adds a resource of type security-group to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html
*
* @param securityGroupId - Identifier for the securityGroupId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifRegion()
* - .ifResourceTag()
* - .ifSecurityGroupID()
* - .ifVpc()
*/
onSecurityGroup(securityGroupId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:security-group/${securityGroupId}`);
}
/**
* Adds a resource of type security-group-rule to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param securityGroupRuleId - Identifier for the securityGroupRuleId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onSecurityGroupRule(securityGroupRuleId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:security-group-rule/${securityGroupRuleId}`);
}
/**
* Adds a resource of type snapshot to the statement
*
* https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html
*
* @param snapshotId - Identifier for the snapshotId.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAddGroup()
* - .ifAddUserId()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAvailabilityZone()
* - .ifEncrypted()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifLocation()
* - .ifOutpostArn()
* - .ifOwner()
* - .ifParentSnapshot()
* - .ifParentVolume()
* - .ifRegion()
* - .ifRemoveGroup()
* - .ifRemoveUserId()
* - .ifResourceTag()
* - .ifSnapshotCoolOffPeriod()
* - .ifSnapshotID()
* - .ifSnapshotLockDuration()
* - .ifSnapshotTime()
* - .ifSourceAvailabilityZone()
* - .ifSourceOutpostArn()
* - .ifVolumeSize()
*/
onSnapshot(snapshotId, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}::snapshot/${snapshotId}`);
}
/**
* Adds a resource of type spot-fleet-request to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param spotFleetRequestId - Identifier for the spotFleetRequestId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onSpotFleetRequest(spotFleetRequestId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:spot-fleet-request/${spotFleetRequestId}`);
}
/**
* Adds a resource of type spot-instances-request to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html
*
* @param spotInstanceRequestId - Identifier for the spotInstanceRequestId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onSpotInstancesRequest(spotInstanceRequestId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:spot-instances-request/${spotInstanceRequestId}`);
}
/**
* Adds a resource of type subnet-cidr-reservation to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/subnet-cidr-reservation.html
*
* @param subnetCidrReservationId - Identifier for the subnetCidrReservationId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onSubnetCidrReservation(subnetCidrReservationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:subnet-cidr-reservation/${subnetCidrReservationId}`);
}
/**
* Adds a resource of type subnet to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html
*
* @param subnetId - Identifier for the subnetId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAvailabilityZone()
* - .ifIsLaunchTemplateResource()
* - .ifLaunchTemplate()
* - .ifRegion()
* - .ifResourceTag()
* - .ifSubnetID()
* - .ifVpc()
*/
onSubnet(subnetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:subnet/${subnetId}`);
}
/**
* Adds a resource of type traffic-mirror-filter to the statement
*
* https://docs.aws.amazon.com/vpc/latest/mirroring/traffic-mirroring-filter.html
*
* @param trafficMirrorFilterId - Identifier for the trafficMirrorFilterId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onTrafficMirrorFilter(trafficMirrorFilterId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:traffic-mirror-filter/${trafficMirrorFilterId}`);
}
/**
* Adds a resource of type traffic-mirror-filter-rule to the statement
*
* https://docs.aws.amazon.com/vpc/latest/mirroring/traffic-mirroring-filter.html
*
* @param trafficMirrorFilterRuleId - Identifier for the trafficMirrorFilterRuleId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onTrafficMirrorFilterRule(trafficMirrorFilterRuleId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:traffic-mirror-filter-rule/${trafficMirrorFilterRuleId}`);
}
/**
* Adds a resource of type traffic-mirror-session to the statement
*
* https://docs.aws.amazon.com/vpc/latest/mirroring/traffic-mirroring-session.html
*
* @param trafficMirrorSessionId - Identifier for the trafficMirrorSessionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
*/
onTrafficMirrorSession(trafficMirrorSessionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:traffic-mirror-session/${trafficMirrorSessionId}`);
}
/**
* Adds a resource of type traffic-mirror-target to the statement
*
* https://docs.aws.amazon.com/vpc/latest/mirroring/traffic-mirroring-target.html
*
* @param trafficMirrorTargetId - Identifier for the trafficMirrorTargetId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onTrafficMirrorTarget(trafficMirrorTargetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:traffic-mirror-target/${trafficMirrorTargetId}`);
}
/**
* Adds a resource of type transit-gateway-attachment to the statement
*
* https://docs.aws.amazon.com/vpc/latest/tgw/how-transit-gateways-work.html
*
* @param transitGatewayAttachmentId - Identifier for the transitGatewayAttachmentId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayAttachmentId()
*/
onTransitGatewayAttachment(transitGatewayAttachmentId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway-attachment/${transitGatewayAttachmentId}`);
}
/**
* Adds a resource of type transit-gateway-connect-peer to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param transitGatewayConnectPeerId - Identifier for the transitGatewayConnectPeerId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayConnectPeerId()
*/
onTransitGatewayConnectPeer(transitGatewayConnectPeerId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway-connect-peer/${transitGatewayConnectPeerId}`);
}
/**
* Adds a resource of type transit-gateway to the statement
*
* https://docs.aws.amazon.com/vpc/latest/tgw/how-transit-gateways-work.html
*
* @param transitGatewayId - Identifier for the transitGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayId()
*/
onTransitGateway(transitGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway/${transitGatewayId}`);
}
/**
* Adds a resource of type transit-gateway-multicast-domain to the statement
*
* https://docs.aws.amazon.com/vpc/latest/tgw/tgw-multicast-overview.html
*
* @param transitGatewayMulticastDomainId - Identifier for the transitGatewayMulticastDomainId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayMulticastDomainId()
*/
onTransitGatewayMulticastDomain(transitGatewayMulticastDomainId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway-multicast-domain/${transitGatewayMulticastDomainId}`);
}
/**
* Adds a resource of type transit-gateway-policy-table to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param transitGatewayPolicyTableId - Identifier for the transitGatewayPolicyTableId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayPolicyTableId()
*/
onTransitGatewayPolicyTable(transitGatewayPolicyTableId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway-policy-table/${transitGatewayPolicyTableId}`);
}
/**
* Adds a resource of type transit-gateway-route-table-announcement to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param transitGatewayRouteTableAnnouncementId - Identifier for the transitGatewayRouteTableAnnouncementId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayRouteTableAnnouncementId()
*/
onTransitGatewayRouteTableAnnouncement(transitGatewayRouteTableAnnouncementId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway-route-table-announcement/${transitGatewayRouteTableAnnouncementId}`);
}
/**
* Adds a resource of type transit-gateway-route-table to the statement
*
* https://docs.aws.amazon.com/vpc/latest/tgw/how-transit-gateways-work.html
*
* @param transitGatewayRouteTableId - Identifier for the transitGatewayRouteTableId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTransitGatewayRouteTableId()
*/
onTransitGatewayRouteTable(transitGatewayRouteTableId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:transit-gateway-route-table/${transitGatewayRouteTableId}`);
}
/**
* Adds a resource of type verified-access-endpoint to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param verifiedAccessEndpointId - Identifier for the verifiedAccessEndpointId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVerifiedAccessEndpoint(verifiedAccessEndpointId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verified-access-endpoint/${verifiedAccessEndpointId}`);
}
/**
* Adds a resource of type verified-access-endpoint-target to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param verifiedAccessEndpointTargetId - Identifier for the verifiedAccessEndpointTargetId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVerifiedAccessEndpointTarget(verifiedAccessEndpointTargetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verified-access-endpoint-target/${verifiedAccessEndpointTargetId}`);
}
/**
* Adds a resource of type verified-access-group to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param verifiedAccessGroupId - Identifier for the verifiedAccessGroupId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVerifiedAccessGroup(verifiedAccessGroupId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verified-access-group/${verifiedAccessGroupId}`);
}
/**
* Adds a resource of type verified-access-instance to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param verifiedAccessInstanceId - Identifier for the verifiedAccessInstanceId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVerifiedAccessInstance(verifiedAccessInstanceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verified-access-instance/${verifiedAccessInstanceId}`);
}
/**
* Adds a resource of type verified-access-policy to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param verifiedAccessPolicyId - Identifier for the verifiedAccessPolicyId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVerifiedAccessPolicy(verifiedAccessPolicyId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verified-access-policy/${verifiedAccessPolicyId}`);
}
/**
* Adds a resource of type verified-access-trust-provider to the statement
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#EC2_ARN_Format
*
* @param verifiedAccessTrustProviderId - Identifier for the verifiedAccessTrustProviderId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVerifiedAccessTrustProvider(verifiedAccessTrustProviderId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verified-access-trust-provider/${verifiedAccessTrustProviderId}`);
}
/**
* Adds a resource of type volume to the statement
*
* https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html
*
* @param volumeId - Identifier for the volumeId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAvailabilityZone()
* - .ifEncrypted()
* - .ifIsLaunchTemplateResource()
* - .ifKmsKeyId()
* - .ifLaunchTemplate()
* - .ifManagedResourceOperator()
* - .ifParentSnapshot()
* - .ifRegion()
* - .ifResourceTag()
* - .ifVolumeID()
* - .ifVolumeIops()
* - .ifVolumeSize()
* - .ifVolumeThroughput()
* - .ifVolumeType()
*/
onVolume(volumeId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:volume/${volumeId}`);
}
/**
* Adds a resource of type vpc-block-public-access-exclusion to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-block-public-access.html
*
* @param vpcBlockPublicAccessExclusionId - Identifier for the vpcBlockPublicAccessExclusionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVpcBlockPublicAccessExclusion(vpcBlockPublicAccessExclusionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-block-public-access-exclusion/${vpcBlockPublicAccessExclusionId}`);
}
/**
* Adds a resource of type vpc-endpoint-connection to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html
*
* @param vpcEndpointConnectionId - Identifier for the vpcEndpointConnectionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVpcEndpointConnection(vpcEndpointConnectionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-endpoint-connection/${vpcEndpointConnectionId}`);
}
/**
* Adds a resource of type vpc-endpoint to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html
*
* @param vpcEndpointId - Identifier for the vpcEndpointId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
* - .ifVpceServiceName()
* - .ifVpceServiceOwner()
*/
onVpcEndpoint(vpcEndpointId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-endpoint/${vpcEndpointId}`);
}
/**
* Adds a resource of type vpc-endpoint-service to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html
*
* @param vpcEndpointServiceId - Identifier for the vpcEndpointServiceId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifResourceTag()
* - .ifVpceServicePrivateDnsName()
* - .ifVpceMultiRegion()
* - .ifVpceServiceRegion()
* - .ifVpceSupportedRegion()
*/
onVpcEndpointService(vpcEndpointServiceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-endpoint-service/${vpcEndpointServiceId}`);
}
/**
* Adds a resource of type vpc-endpoint-service-permission to the statement
*
* https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies
*
* @param vpcEndpointServicePermissionId - Identifier for the vpcEndpointServicePermissionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVpcEndpointServicePermission(vpcEndpointServicePermissionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-endpoint-service-permission/${vpcEndpointServicePermissionId}`);
}
/**
* Adds a resource of type vpc-flow-log to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html
*
* @param vpcFlowLogId - Identifier for the vpcFlowLogId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVpcFlowLog(vpcFlowLogId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-flow-log/${vpcFlowLogId}`);
}
/**
* Adds a resource of type vpc to the statement
*
* https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html
*
* @param vpcId - Identifier for the vpcId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifIpv4IpamPoolId()
* - .ifIpv6IpamPoolId()
* - .ifRegion()
* - .ifResourceTag()
* - .ifTenancy()
* - .ifVpcID()
*/
onVpc(vpcId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc/${vpcId}`);
}
/**
* Adds a resource of type vpc-peering-connection to the statement
*
* https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html
*
* @param vpcPeeringConnectionId - Identifier for the vpcPeeringConnectionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAccepterVpc()
* - .ifAttribute()
* - .ifAttribute()
* - .ifRegion()
* - .ifRequesterVpc()
* - .ifResourceTag()
* - .ifVpcPeeringConnectionID()
*/
onVpcPeeringConnection(vpcPeeringConnectionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpc-peering-connection/${vpcPeeringConnectionId}`);
}
/**
* Adds a resource of type vpn-connection-device-type to the statement
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html
*
* @param vpnConnectionDeviceTypeId - Identifier for the vpnConnectionDeviceTypeId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifRegion()
*/
onVpnConnectionDeviceType(vpnConnectionDeviceTypeId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpn-connection-device-type/${vpnConnectionDeviceTypeId}`);
}
/**
* Adds a resource of type vpn-connection to the statement
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html
*
* @param vpnConnectionId - Identifier for the vpnConnectionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifAttribute()
* - .ifAttribute()
* - .ifAuthenticationType()
* - .ifDPDTimeoutSeconds()
* - .ifGatewayType()
* - .ifIKEVersions()
* - .ifInsideTunnelCidr()
* - .ifInsideTunnelIpv6Cidr()
* - .ifPhase1DHGroup()
* - .ifPhase1EncryptionAlgorithms()
* - .ifPhase1IntegrityAlgorithms()
* - .ifPhase1LifetimeSeconds()
* - .ifPhase2DHGroup()
* - .ifPhase2EncryptionAlgorithms()
* - .ifPhase2IntegrityAlgorithms()
* - .ifPhase2LifetimeSeconds()
* - .ifRegion()
* - .ifRekeyFuzzPercentage()
* - .ifRekeyMarginTimeSeconds()
* - .ifReplayWindowSizePackets()
* - .ifResourceTag()
* - .ifRoutingType()
*/
onVpnConnection(vpnConnectionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpn-connection/${vpnConnectionId}`);
}
/**
* Adds a resource of type vpn-gateway to the statement
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html
*
* @param vpnGatewayId - Identifier for the vpnGatewayId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
* - .ifRegion()
* - .ifResourceTag()
*/
onVpnGateway(vpnGatewayId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:ec2:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:vpn-gateway/${vpnGatewayId}`);
}
/**
* Filters access by a tag key and value pair that is allowed in the request
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/supported-iam-actions-tagging.html#control-tagging
*
* Applies to actions:
* - .toAcceptAddressTransfer()
* - .toAllocateAddress()
* - .toAllocateHosts()
* - .toAssociateIpamResourceDiscovery()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toCopyImage()
* - .toCopySnapshot()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationFleet()
* - .toCreateCarrierGateway()
* - .toCreateClientVpnEndpoint()
* - .toCreateCoipPool()
* - .toCreateCustomerGateway()
* - .toCreateDhcpOptions()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateFpgaImage()
* - .toCreateImage()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateInstanceEventWindow()
* - .toCreateInstanceExportTask()
* - .toCreateInternetGateway()
* - .toCreateIpam()
* - .toCreateIpamExternalResourceVerificationToken()
* - .toCreateIpamPool()
* - .toCreateIpamResourceDiscovery()
* - .toCreateIpamScope()
* - .toCreateKeyPair()
* - .toCreateLaunchTemplate()
* - .toCreateLocalGatewayRouteTable()
* - .toCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateLocalGatewayVirtualInterface()
* - .toCreateLocalGatewayVirtualInterfaceGroup()
* - .toCreateManagedPrefixList()
* - .toCreateNatGateway()
* - .toCreateNetworkAcl()
* - .toCreateNetworkInsightsAccessScope()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreatePlacementGroup()
* - .toCreatePublicIpv4Pool()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRestoreImageTask()
* - .toCreateRouteServer()
* - .toCreateRouteServerEndpoint()
* - .toCreateRouteServerPeer()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTrafficMirrorFilter()
* - .toCreateTrafficMirrorFilterRule()
* - .toCreateTrafficMirrorSession()
* - .toCreateTrafficMirrorTarget()
* - .toCreateTransitGateway()
* - .toCreateTransitGatewayConnect()
* - .toCreateTransitGatewayConnectPeer()
* - .toCreateTransitGatewayMulticastDomain()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPolicyTable()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVerifiedAccessGroup()
* - .toCreateVerifiedAccessInstance()
* - .toCreateVerifiedAccessTrustProvider()
* - .toCreateVolume()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toCreateVpcEndpointServiceConfiguration()
* - .toCreateVpcPeeringConnection()
* - .toCreateVpnConnection()
* - .toCreateVpnGateway()
* - .toDeleteTags()
* - .toExportImage()
* - .toImportImage()
* - .toImportKeyPair()
* - .toImportSnapshot()
* - .toPurchaseCapacityBlock()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
* - .toStartNetworkInsightsAccessScopeAnalysis()
* - .toStartNetworkInsightsAnalysis()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - carrier-gateway
* - client-vpn-endpoint
* - customer-gateway
* - declarative-policies-report
* - dedicated-host
* - dhcp-options
* - egress-only-internet-gateway
* - elastic-gpu
* - export-image-task
* - export-instance-task
* - fleet
* - fpga-image
* - host-reservation
* - image
* - import-image-task
* - import-snapshot-task
* - instance-connect-endpoint
* - instance-event-window
* - instance
* - internet-gateway
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-resource-discovery-association
* - ipam-resource-discovery
* - ipam-scope
* - coip-pool
* - ipv4pool-ec2
* - ipv6pool-ec2
* - key-pair
* - launch-template
* - local-gateway
* - local-gateway-route-table-virtual-interface-group-association
* - local-gateway-route-table-vpc-association
* - local-gateway-route-table
* - local-gateway-virtual-interface-group
* - local-gateway-virtual-interface
* - natgateway
* - network-acl
* - network-insights-access-scope-analysis
* - network-insights-access-scope
* - network-insights-analysis
* - network-insights-path
* - network-interface
* - outpost-lag
* - placement-group
* - prefix-list
* - replace-root-volume-task
* - reserved-instances
* - route-server-endpoint
* - route-server
* - route-server-peer
* - route-table
* - security-group
* - security-group-rule
* - snapshot
* - spot-fleet-request
* - spot-instances-request
* - subnet-cidr-reservation
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - traffic-mirror-target
* - transit-gateway-attachment
* - transit-gateway-connect-peer
* - transit-gateway
* - transit-gateway-multicast-domain
* - transit-gateway-policy-table
* - transit-gateway-route-table-announcement
* - transit-gateway-route-table
* - verified-access-endpoint
* - verified-access-endpoint-target
* - verified-access-group
* - verified-access-instance
* - verified-access-policy
* - verified-access-trust-provider
* - volume
* - vpc-block-public-access-exclusion
* - vpc-endpoint-connection
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc-endpoint-service-permission
* - vpc-flow-log
* - vpc
* - vpc-peering-connection
* - vpn-connection
* - vpn-gateway
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsRequestTag(tagKey, value, operator) {
return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by a tag key and value pair of a resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/control-access-with-tags.html
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAcceptTransitGatewayMulticastDomainAssociations()
* - .toAcceptTransitGatewayPeeringAttachment()
* - .toAcceptTransitGatewayVpcAttachment()
* - .toAcceptVpcEndpointConnections()
* - .toAcceptVpcPeeringConnection()
* - .toAllocateAddress()
* - .toAllocateIpamPoolCidr()
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssignPrivateNatGatewayAddress()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateClientVpnTargetNetwork()
* - .toAssociateDhcpOptions()
* - .toAssociateIamInstanceProfile()
* - .toAssociateInstanceEventWindow()
* - .toAssociateIpamResourceDiscovery()
* - .toAssociateNatGatewayAddress()
* - .toAssociateRouteServer()
* - .toAssociateRouteTable()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateSubnetCidrBlock()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toAssociateTransitGatewayPolicyTable()
* - .toAssociateTransitGatewayRouteTable()
* - .toAssociateVerifiedAccessInstanceWebAcl()
* - .toAssociateVpcCidrBlock()
* - .toAttachClassicLinkVpc()
* - .toAttachInternetGateway()
* - .toAttachNetworkInterface()
* - .toAttachVerifiedAccessTrustProvider()
* - .toAttachVolume()
* - .toAttachVpnGateway()
* - .toAuthorizeClientVpnIngress()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toCancelCapacityReservation()
* - .toCancelCapacityReservationFleets()
* - .toCancelDeclarativePoliciesReport()
* - .toCancelExportTask()
* - .toCancelImageLaunchPermission()
* - .toCancelImportTask()
* - .toCancelSpotFleetRequests()
* - .toCancelSpotInstanceRequests()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateCarrierGateway()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateCoipCidr()
* - .toCreateCoipPool()
* - .toCreateCoipPoolPermission()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateImage()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateInstanceExportTask()
* - .toCreateIpamExternalResourceVerificationToken()
* - .toCreateIpamPool()
* - .toCreateIpamScope()
* - .toCreateLaunchTemplateVersion()
* - .toCreateLocalGatewayRoute()
* - .toCreateLocalGatewayRouteTable()
* - .toCreateLocalGatewayRouteTablePermission()
* - .toCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateLocalGatewayVirtualInterface()
* - .toCreateLocalGatewayVirtualInterfaceGroup()
* - .toCreateNatGateway()
* - .toCreateNetworkAcl()
* - .toCreateNetworkAclEntry()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreateNetworkInterfacePermission()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRoute()
* - .toCreateRouteServerEndpoint()
* - .toCreateRouteServerPeer()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateStoreImageTask()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTrafficMirrorFilterRule()
* - .toCreateTrafficMirrorSession()
* - .toCreateTrafficMirrorTarget()
* - .toCreateTransitGatewayConnectPeer()
* - .toCreateTransitGatewayMulticastDomain()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPolicyTable()
* - .toCreateTransitGatewayPrefixListReference()
* - .toCreateTransitGatewayRoute()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVerifiedAccessGroup()
* - .toCreateVolume()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toCreateVpcEndpointConnectionNotification()
* - .toCreateVpcPeeringConnection()
* - .toCreateVpnConnection()
* - .toCreateVpnConnectionRoute()
* - .toDeleteCarrierGateway()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDeleteCoipCidr()
* - .toDeleteCoipPool()
* - .toDeleteCoipPoolPermission()
* - .toDeleteCustomerGateway()
* - .toDeleteDhcpOptions()
* - .toDeleteEgressOnlyInternetGateway()
* - .toDeleteFleets()
* - .toDeleteFlowLogs()
* - .toDeleteFpgaImage()
* - .toDeleteInstanceConnectEndpoint()
* - .toDeleteInstanceEventWindow()
* - .toDeleteInternetGateway()
* - .toDeleteIpam()
* - .toDeleteIpamExternalResourceVerificationToken()
* - .toDeleteIpamPool()
* - .toDeleteIpamResourceDiscovery()
* - .toDeleteIpamScope()
* - .toDeleteKeyPair()
* - .toDeleteLaunchTemplate()
* - .toDeleteLaunchTemplateVersions()
* - .toDeleteLocalGatewayRoute()
* - .toDeleteLocalGatewayRouteTable()
* - .toDeleteLocalGatewayRouteTablePermission()
* - .toDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toDeleteLocalGatewayRouteTableVpcAssociation()
* - .toDeleteLocalGatewayVirtualInterface()
* - .toDeleteLocalGatewayVirtualInterfaceGroup()
* - .toDeleteManagedPrefixList()
* - .toDeleteNatGateway()
* - .toDeleteNetworkAcl()
* - .toDeleteNetworkAclEntry()
* - .toDeleteNetworkInsightsAccessScope()
* - .toDeleteNetworkInsightsAccessScopeAnalysis()
* - .toDeleteNetworkInsightsAnalysis()
* - .toDeleteNetworkInsightsPath()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeletePlacementGroup()
* - .toDeletePublicIpv4Pool()
* - .toDeleteResourcePolicy()
* - .toDeleteRoute()
* - .toDeleteRouteServer()
* - .toDeleteRouteServerEndpoint()
* - .toDeleteRouteServerPeer()
* - .toDeleteRouteTable()
* - .toDeleteSecurityGroup()
* - .toDeleteSnapshot()
* - .toDeleteSubnet()
* - .toDeleteTags()
* - .toDeleteTrafficMirrorFilter()
* - .toDeleteTrafficMirrorFilterRule()
* - .toDeleteTrafficMirrorSession()
* - .toDeleteTrafficMirrorTarget()
* - .toDeleteTransitGateway()
* - .toDeleteTransitGatewayConnect()
* - .toDeleteTransitGatewayConnectPeer()
* - .toDeleteTransitGatewayMulticastDomain()
* - .toDeleteTransitGatewayPeeringAttachment()
* - .toDeleteTransitGatewayPolicyTable()
* - .toDeleteTransitGatewayPrefixListReference()
* - .toDeleteTransitGatewayRoute()
* - .toDeleteTransitGatewayRouteTable()
* - .toDeleteTransitGatewayRouteTableAnnouncement()
* - .toDeleteTransitGatewayVpcAttachment()
* - .toDeleteVerifiedAccessEndpoint()
* - .toDeleteVerifiedAccessGroup()
* - .toDeleteVerifiedAccessInstance()
* - .toDeleteVerifiedAccessTrustProvider()
* - .toDeleteVolume()
* - .toDeleteVpc()
* - .toDeleteVpcBlockPublicAccessExclusion()
* - .toDeleteVpcEndpointConnectionNotifications()
* - .toDeleteVpcEndpointServiceConfigurations()
* - .toDeleteVpcEndpoints()
* - .toDeleteVpcPeeringConnection()
* - .toDeleteVpnConnection()
* - .toDeleteVpnConnectionRoute()
* - .toDeleteVpnGateway()
* - .toDeprovisionIpamByoasn()
* - .toDeprovisionIpamPoolCidr()
* - .toDeprovisionPublicIpv4PoolCidr()
* - .toDeregisterImage()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeClientVpnAuthorizationRules()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDescribeFleetHistory()
* - .toDescribeFleetInstances()
* - .toDescribeFpgaImageAttribute()
* - .toDescribeImageAttribute()
* - .toDescribeInstanceAttribute()
* - .toDescribeSecurityGroupReferences()
* - .toDescribeSnapshotAttribute()
* - .toDescribeSpotFleetInstances()
* - .toDescribeSpotFleetRequestHistory()
* - .toDescribeVolumeAttribute()
* - .toDescribeVpcAttribute()
* - .toDescribeVpcEndpointServicePermissions()
* - .toDetachClassicLinkVpc()
* - .toDetachInternetGateway()
* - .toDetachNetworkInterface()
* - .toDetachVerifiedAccessTrustProvider()
* - .toDetachVolume()
* - .toDetachVpnGateway()
* - .toDisableAddressTransfer()
* - .toDisableFastLaunch()
* - .toDisableFastSnapshotRestores()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toDisableRouteServerPropagation()
* - .toDisableTransitGatewayRouteTablePropagation()
* - .toDisableVgwRoutePropagation()
* - .toDisableVpcClassicLink()
* - .toDisableVpcClassicLinkDnsSupport()
* - .toDisassociateAddress()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateClientVpnTargetNetwork()
* - .toDisassociateIamInstanceProfile()
* - .toDisassociateInstanceEventWindow()
* - .toDisassociateIpamResourceDiscovery()
* - .toDisassociateNatGatewayAddress()
* - .toDisassociateRouteServer()
* - .toDisassociateRouteTable()
* - .toDisassociateSecurityGroupVpc()
* - .toDisassociateSubnetCidrBlock()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toDisassociateTransitGatewayPolicyTable()
* - .toDisassociateTransitGatewayRouteTable()
* - .toDisassociateVerifiedAccessInstanceWebAcl()
* - .toDisassociateVpcCidrBlock()
* - .toEnableAddressTransfer()
* - .toEnableFastLaunch()
* - .toEnableFastSnapshotRestores()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toEnableRouteServerPropagation()
* - .toEnableTransitGatewayRouteTablePropagation()
* - .toEnableVgwRoutePropagation()
* - .toEnableVolumeIO()
* - .toEnableVpcClassicLink()
* - .toEnableVpcClassicLinkDnsSupport()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toExportImage()
* - .toExportVerifiedAccessInstanceClientConfiguration()
* - .toGetCapacityReservationUsage()
* - .toGetCoipPoolUsage()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetDeclarativePoliciesReportSummary()
* - .toGetFlowLogsIntegrationTemplate()
* - .toGetGroupsForCapacityReservation()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetIpamAddressHistory()
* - .toGetIpamDiscoveredAccounts()
* - .toGetIpamDiscoveredPublicAddresses()
* - .toGetIpamDiscoveredResourceCidrs()
* - .toGetIpamPoolAllocations()
* - .toGetIpamPoolCidrs()
* - .toGetIpamResourceCidrs()
* - .toGetLaunchTemplateData()
* - .toGetManagedPrefixListAssociations()
* - .toGetManagedPrefixListEntries()
* - .toGetNetworkInsightsAccessScopeAnalysisFindings()
* - .toGetNetworkInsightsAccessScopeContent()
* - .toGetPasswordData()
* - .toGetResourcePolicy()
* - .toGetRouteServerAssociations()
* - .toGetRouteServerPropagations()
* - .toGetRouteServerRoutingDatabase()
* - .toGetSecurityGroupsForVpc()
* - .toGetTransitGatewayMulticastDomainAssociations()
* - .toGetTransitGatewayPolicyTableAssociations()
* - .toGetTransitGatewayPolicyTableEntries()
* - .toGetVerifiedAccessEndpointPolicy()
* - .toGetVerifiedAccessEndpointTargets()
* - .toGetVerifiedAccessGroupPolicy()
* - .toGetVerifiedAccessInstanceWebAcl()
* - .toGetVpnConnectionDeviceSampleConfiguration()
* - .toGetVpnTunnelReplacementStatus()
* - .toImportByoipCidrToIpam()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toImportImage()
* - .toImportInstance()
* - .toImportVolume()
* - .toLockSnapshot()
* - .toModifyAddressAttribute()
* - .toModifyCapacityReservation()
* - .toModifyCapacityReservationFleet()
* - .toModifyClientVpnEndpoint()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyHosts()
* - .toModifyImageAttribute()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceEventWindow()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyIpam()
* - .toModifyIpamPool()
* - .toModifyIpamResourceCidr()
* - .toModifyIpamResourceDiscovery()
* - .toModifyIpamScope()
* - .toModifyLaunchTemplate()
* - .toModifyLocalGatewayRoute()
* - .toModifyManagedPrefixList()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifyRouteServer()
* - .toModifySecurityGroupRules()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTrafficMirrorFilterNetworkServices()
* - .toModifyTrafficMirrorFilterRule()
* - .toModifyTrafficMirrorSession()
* - .toModifyTransitGateway()
* - .toModifyTransitGatewayPrefixListReference()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVerifiedAccessEndpoint()
* - .toModifyVerifiedAccessEndpointPolicy()
* - .toModifyVerifiedAccessGroup()
* - .toModifyVerifiedAccessGroupPolicy()
* - .toModifyVerifiedAccessInstance()
* - .toModifyVerifiedAccessInstanceLoggingConfiguration()
* - .toModifyVerifiedAccessTrustProvider()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toModifyVpcAttribute()
* - .toModifyVpcBlockPublicAccessExclusion()
* - .toModifyVpcEndpoint()
* - .toModifyVpcEndpointConnectionNotification()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toModifyVpcPeeringConnectionOptions()
* - .toModifyVpcTenancy()
* - .toModifyVpnConnection()
* - .toModifyVpnConnectionOptions()
* - .toModifyVpnTunnelCertificate()
* - .toModifyVpnTunnelOptions()
* - .toMonitorInstances()
* - .toMoveByoipCidrToIpam()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toProvisionIpamByoasn()
* - .toProvisionIpamPoolCidr()
* - .toProvisionPublicIpv4PoolCidr()
* - .toPurchaseCapacityBlockExtension()
* - .toPurchaseHostReservation()
* - .toPutResourcePolicy()
* - .toRebootInstances()
* - .toRegisterImage()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRejectCapacityReservationBillingOwnership()
* - .toRejectTransitGatewayMulticastDomainAssociations()
* - .toRejectTransitGatewayPeeringAttachment()
* - .toRejectTransitGatewayVpcAttachment()
* - .toRejectVpcEndpointConnections()
* - .toRejectVpcPeeringConnection()
* - .toReleaseAddress()
* - .toReleaseHosts()
* - .toReleaseIpamPoolAllocation()
* - .toReplaceIamInstanceProfileAssociation()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceNetworkAclEntry()
* - .toReplaceRoute()
* - .toReplaceRouteTableAssociation()
* - .toReplaceTransitGatewayRoute()
* - .toReplaceVpnTunnel()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetAddressAttribute()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toResetInstanceAttribute()
* - .toResetNetworkInterfaceAttribute()
* - .toResetSnapshotAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRestoreManagedPrefixListVersion()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRevokeClientVpnIngress()
* - .toRevokeSecurityGroupEgress()
* - .toRevokeSecurityGroupIngress()
* - .toRunInstances()
* - .toSearchLocalGatewayRoutes()
* - .toSearchTransitGatewayMulticastGroups()
* - .toSearchTransitGatewayRoutes()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStartNetworkInsightsAccessScopeAnalysis()
* - .toStartNetworkInsightsAnalysis()
* - .toStartVpcEndpointServicePrivateDnsVerification()
* - .toStopInstances()
* - .toTerminateClientVpnConnections()
* - .toTerminateInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
* - .toUnassignPrivateNatGatewayAddress()
* - .toUnlockSnapshot()
* - .toUnmonitorInstances()
* - .toUpdateSecurityGroupRuleDescriptionsEgress()
* - .toUpdateSecurityGroupRuleDescriptionsIngress()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - carrier-gateway
* - client-vpn-endpoint
* - customer-gateway
* - declarative-policies-report
* - dedicated-host
* - dhcp-options
* - egress-only-internet-gateway
* - elastic-gpu
* - export-image-task
* - export-instance-task
* - fleet
* - fpga-image
* - host-reservation
* - image
* - import-image-task
* - import-snapshot-task
* - instance-connect-endpoint
* - instance-event-window
* - instance
* - internet-gateway
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-resource-discovery-association
* - ipam-resource-discovery
* - ipam-scope
* - coip-pool
* - ipv4pool-ec2
* - ipv6pool-ec2
* - key-pair
* - launch-template
* - local-gateway
* - local-gateway-route-table-virtual-interface-group-association
* - local-gateway-route-table-vpc-association
* - local-gateway-route-table
* - local-gateway-virtual-interface-group
* - local-gateway-virtual-interface
* - natgateway
* - network-acl
* - network-insights-access-scope-analysis
* - network-insights-access-scope
* - network-insights-analysis
* - network-insights-path
* - network-interface
* - outpost-lag
* - placement-group
* - prefix-list
* - replace-root-volume-task
* - reserved-instances
* - route-server-endpoint
* - route-server
* - route-server-peer
* - route-table
* - security-group
* - security-group-rule
* - snapshot
* - spot-fleet-request
* - spot-instances-request
* - subnet-cidr-reservation
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - traffic-mirror-target
* - transit-gateway-attachment
* - transit-gateway-connect-peer
* - transit-gateway
* - transit-gateway-multicast-domain
* - transit-gateway-policy-table
* - transit-gateway-route-table-announcement
* - transit-gateway-route-table
* - verified-access-endpoint
* - verified-access-endpoint-target
* - verified-access-group
* - verified-access-instance
* - verified-access-policy
* - verified-access-trust-provider
* - volume
* - vpc-block-public-access-exclusion
* - vpc-endpoint-connection
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc-endpoint-service-permission
* - vpc-flow-log
* - vpc
* - vpc-peering-connection
* - vpn-connection
* - vpn-gateway
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsResourceTag(tagKey, value, operator) {
return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by a list of tag keys that are allowed in the request
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/supported-iam-actions-tagging.html#control-tagging
*
* Applies to actions:
* - .toAcceptAddressTransfer()
* - .toAllocateAddress()
* - .toAllocateHosts()
* - .toAssociateIpamResourceDiscovery()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toCopyImage()
* - .toCopySnapshot()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationFleet()
* - .toCreateCarrierGateway()
* - .toCreateClientVpnEndpoint()
* - .toCreateCoipPool()
* - .toCreateCustomerGateway()
* - .toCreateDhcpOptions()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateFpgaImage()
* - .toCreateImage()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateInstanceEventWindow()
* - .toCreateInstanceExportTask()
* - .toCreateInternetGateway()
* - .toCreateIpam()
* - .toCreateIpamExternalResourceVerificationToken()
* - .toCreateIpamPool()
* - .toCreateIpamResourceDiscovery()
* - .toCreateIpamScope()
* - .toCreateKeyPair()
* - .toCreateLaunchTemplate()
* - .toCreateLocalGatewayRouteTable()
* - .toCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateLocalGatewayVirtualInterface()
* - .toCreateLocalGatewayVirtualInterfaceGroup()
* - .toCreateManagedPrefixList()
* - .toCreateNatGateway()
* - .toCreateNetworkAcl()
* - .toCreateNetworkInsightsAccessScope()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreatePlacementGroup()
* - .toCreatePublicIpv4Pool()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRestoreImageTask()
* - .toCreateRouteServer()
* - .toCreateRouteServerEndpoint()
* - .toCreateRouteServerPeer()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTrafficMirrorFilter()
* - .toCreateTrafficMirrorFilterRule()
* - .toCreateTrafficMirrorSession()
* - .toCreateTrafficMirrorTarget()
* - .toCreateTransitGateway()
* - .toCreateTransitGatewayConnect()
* - .toCreateTransitGatewayConnectPeer()
* - .toCreateTransitGatewayMulticastDomain()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPolicyTable()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVerifiedAccessGroup()
* - .toCreateVerifiedAccessInstance()
* - .toCreateVerifiedAccessTrustProvider()
* - .toCreateVolume()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toCreateVpcEndpointServiceConfiguration()
* - .toCreateVpcPeeringConnection()
* - .toCreateVpnConnection()
* - .toCreateVpnGateway()
* - .toDeleteTags()
* - .toExportImage()
* - .toImportImage()
* - .toImportKeyPair()
* - .toImportSnapshot()
* - .toPurchaseCapacityBlock()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
* - .toStartNetworkInsightsAccessScopeAnalysis()
* - .toStartNetworkInsightsAnalysis()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - carrier-gateway
* - client-vpn-endpoint
* - customer-gateway
* - declarative-policies-report
* - dedicated-host
* - dhcp-options
* - egress-only-internet-gateway
* - elastic-gpu
* - export-image-task
* - export-instance-task
* - fleet
* - fpga-image
* - host-reservation
* - image
* - import-image-task
* - import-snapshot-task
* - instance-connect-endpoint
* - instance-event-window
* - instance
* - internet-gateway
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-resource-discovery-association
* - ipam-resource-discovery
* - ipam-scope
* - coip-pool
* - ipv4pool-ec2
* - ipv6pool-ec2
* - key-pair
* - launch-template
* - local-gateway
* - local-gateway-route-table-virtual-interface-group-association
* - local-gateway-route-table-vpc-association
* - local-gateway-route-table
* - local-gateway-virtual-interface-group
* - local-gateway-virtual-interface
* - natgateway
* - network-acl
* - network-insights-access-scope-analysis
* - network-insights-access-scope
* - network-insights-analysis
* - network-insights-path
* - network-interface
* - outpost-lag
* - placement-group
* - prefix-list
* - replace-root-volume-task
* - reserved-instances
* - route-server-endpoint
* - route-server
* - route-server-peer
* - route-table
* - security-group
* - security-group-rule
* - snapshot
* - spot-fleet-request
* - spot-instances-request
* - subnet-cidr-reservation
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - traffic-mirror-target
* - transit-gateway-attachment
* - transit-gateway-connect-peer
* - transit-gateway
* - transit-gateway-multicast-domain
* - transit-gateway-policy-table
* - transit-gateway-route-table-announcement
* - transit-gateway-route-table
* - verified-access-endpoint
* - verified-access-endpoint-target
* - verified-access-group
* - verified-access-instance
* - verified-access-policy
* - verified-access-trust-provider
* - volume
* - vpc-block-public-access-exclusion
* - vpc-endpoint-connection
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc-endpoint-service-permission
* - vpc-flow-log
* - vpc
* - vpc-peering-connection
* - vpn-connection
* - vpn-gateway
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsTagKeys(value, operator) {
return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of an accepter VPC in a VPC peering connection
*
* https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html
*
* Applies to actions:
* - .toAcceptVpcPeeringConnection()
* - .toCreateNetworkInsightsPath()
* - .toCreateTags()
* - .toCreateVpcPeeringConnection()
* - .toDeleteVpcPeeringConnection()
* - .toModifyVpcPeeringConnectionOptions()
* - .toRejectVpcPeeringConnection()
*
* Applies to resource types:
* - vpc-peering-connection
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifAccepterVpc(value, operator) {
return this.if(`AccepterVpc`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the group being added to a snapshot
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toModifySnapshotAttribute()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAddGroup(value, operator) {
return this.if(`Add/group`, value, operator ?? 'StringLike');
}
/**
* Filters access by the account id being added to a snapshot
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toModifySnapshotAttribute()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAddUserId(value, operator) {
return this.if(`Add/userId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the allocation ID of the Elastic IP address
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptAddressTransfer()
* - .toAssociateAddress()
* - .toAssociateNatGatewayAddress()
* - .toCreateNatGateway()
* - .toCreateTags()
* - .toDisableAddressTransfer()
* - .toDisassociateAddress()
* - .toDisassociateNatGatewayAddress()
* - .toEnableAddressTransfer()
* - .toModifyAddressAttribute()
* - .toReleaseAddress()
* - .toResetAddressAttribute()
*
* Applies to resource types:
* - elastic-ip
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAllocationId(value, operator) {
return this.if(`AllocationId`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the user wants to associate a public IP address with the instance
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toRunInstances()
*
* Applies to resource types:
* - network-interface
*
* @param value `true` or `false`. **Default:** `true`
*/
ifAssociatePublicIpAddress(value) {
return this.if(`AssociatePublicIpAddress`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Filters access by an attribute of a resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#attribute-key
*
* Applies to actions:
* - .toModifyAddressAttribute()
* - .toModifyCapacityReservation()
* - .toModifyCapacityReservationFleet()
* - .toModifyClientVpnEndpoint()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyHosts()
* - .toModifyImageAttribute()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyIpam()
* - .toModifyIpamPool()
* - .toModifyIpamResourceCidr()
* - .toModifyIpamScope()
* - .toModifyLaunchTemplate()
* - .toModifyManagedPrefixList()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTrafficMirrorFilterNetworkServices()
* - .toModifyTrafficMirrorFilterRule()
* - .toModifyTrafficMirrorSession()
* - .toModifyTransitGateway()
* - .toModifyTransitGatewayPrefixListReference()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toModifyVpcAttribute()
* - .toModifyVpcEndpoint()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toModifyVpcPeeringConnectionOptions()
* - .toModifyVpcTenancy()
* - .toModifyVpnConnection()
* - .toModifyVpnConnectionOptions()
* - .toModifyVpnTunnelCertificate()
* - .toModifyVpnTunnelOptions()
* - .toResetAddressAttribute()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toResetSnapshotAttribute()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - client-vpn-endpoint
* - dedicated-host
* - fleet
* - fpga-image
* - image
* - instance-connect-endpoint
* - instance
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-scope
* - launch-template
* - network-interface
* - prefix-list
* - reserved-instances
* - security-group
* - snapshot
* - spot-fleet-request
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - transit-gateway-attachment
* - transit-gateway
* - transit-gateway-route-table
* - volume
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc
* - vpc-peering-connection
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAttributeExists(value, operator) {
return this.if(`Attribute`, value, operator ?? 'StringLike');
}
/**
* Filters access by an attribute being set on a resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#attribute-key
*
* Applies to actions:
* - .toModifyAddressAttribute()
* - .toModifyCapacityReservation()
* - .toModifyCapacityReservationFleet()
* - .toModifyClientVpnEndpoint()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyHosts()
* - .toModifyImageAttribute()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataDefaults()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyIpam()
* - .toModifyIpamPool()
* - .toModifyIpamResourceCidr()
* - .toModifyIpamScope()
* - .toModifyLaunchTemplate()
* - .toModifyManagedPrefixList()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTrafficMirrorFilterNetworkServices()
* - .toModifyTrafficMirrorFilterRule()
* - .toModifyTrafficMirrorSession()
* - .toModifyTransitGateway()
* - .toModifyTransitGatewayPrefixListReference()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toModifyVpcAttribute()
* - .toModifyVpcEndpoint()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toModifyVpcPeeringConnectionOptions()
* - .toModifyVpcTenancy()
* - .toModifyVpnConnection()
* - .toModifyVpnConnectionOptions()
* - .toModifyVpnTunnelCertificate()
* - .toModifyVpnTunnelOptions()
* - .toResetAddressAttribute()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toResetSnapshotAttribute()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - client-vpn-endpoint
* - dedicated-host
* - fleet
* - fpga-image
* - image
* - instance-connect-endpoint
* - instance
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-scope
* - launch-template
* - network-interface
* - prefix-list
* - reserved-instances
* - security-group
* - snapshot
* - spot-fleet-request
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - transit-gateway-attachment
* - transit-gateway
* - transit-gateway-route-table
* - volume
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc
* - vpc-peering-connection
* - vpn-connection
*
* @param attributeName The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAttribute(attributeName, value, operator) {
return this.if(`Attribute/${attributeName}`, value, operator ?? 'StringLike');
}
/**
* Filters access by the authentication type for the VPN tunnel endpoints
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAuthenticationType(value, operator) {
return this.if(`AuthenticationType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the AWS service that has permission to use a resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateNetworkInterfacePermission()
* - .toRunInstances()
*
* Applies to resource types:
* - network-interface
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAuthorizedService(value, operator) {
return this.if(`AuthorizedService`, value, operator ?? 'StringLike');
}
/**
* Filters access by an IAM principal that has permission to use a resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateNetworkInterfacePermission()
* - .toCreateTags()
* - .toCreateVerifiedAccessEndpoint()
* - .toDisassociateNatGatewayAddress()
* - .toModifyLocalGatewayRoute()
* - .toRequestSpotInstances()
*
* Applies to resource types:
* - network-interface
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAuthorizedUser(value, operator) {
return this.if(`AuthorizedUser`, value, operator ?? 'StringLike');
}
/**
* Filters access by the Auto Placement properties of a Dedicated Host
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAllocateHosts()
* - .toCreateTags()
*
* Applies to resource types:
* - dedicated-host
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAutoPlacement(value, operator) {
return this.if(`AutoPlacement`, value, operator ?? 'StringLike');
}
/**
* Filters access by the name of an Availability Zone in an AWS Region
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAllocateHosts()
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateIamInstanceProfile()
* - .toAssociateRouteTable()
* - .toAssociateSubnetCidrBlock()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateImage()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateInstanceExportTask()
* - .toCreateLocalGatewayRoute()
* - .toCreateNatGateway()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreateNetworkInterfacePermission()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRouteServerEndpoint()
* - .toCreateRouteServerPeer()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateTrafficMirrorSession()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVolume()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toDeleteClientVpnRoute()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeleteRouteServerEndpoint()
* - .toDeleteRouteServerPeer()
* - .toDeleteSnapshot()
* - .toDeleteSubnet()
* - .toDeleteVolume()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeInstanceAttribute()
* - .toDescribeVolumeAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisableFastSnapshotRestores()
* - .toDisassociateAddress()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateIamInstanceProfile()
* - .toDisassociateNatGatewayAddress()
* - .toDisassociateRouteTable()
* - .toDisassociateSubnetCidrBlock()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toEnableFastSnapshotRestores()
* - .toEnableVolumeIO()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyFleet()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyLocalGatewayRoute()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifySnapshotAttribute()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVerifiedAccessEndpoint()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toModifyVpcEndpoint()
* - .toMonitorInstances()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRejectCapacityReservationBillingOwnership()
* - .toReplaceIamInstanceProfileAssociation()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceRouteTableAssociation()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetInstanceAttribute()
* - .toResetNetworkInterfaceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - capacity-reservation
* - dedicated-host
* - instance
* - network-interface
* - reserved-instances
* - route-server-endpoint
* - route-server-peer
* - snapshot
* - subnet
* - volume
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAvailabilityZone(value, operator) {
return this.if(`AvailabilityZone`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an Availability Zone in an AWS Region
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateCapacityReservation()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAvailabilityZoneId(value, operator) {
return this.if(`AvailabilityZoneId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the Capacity Reservation Fleet
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCancelCapacityReservation()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toGetCapacityReservationUsage()
* - .toGetGroupsForCapacityReservation()
* - .toModifyCapacityReservation()
* - .toMoveCapacityReservationInstances()
* - .toPurchaseCapacityBlock()
* - .toPurchaseCapacityBlockExtension()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifCapacityReservationFleet(value, operator) {
return this.if(`CapacityReservationFleet`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the client root certificate chain
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateClientVpnTargetNetwork()
* - .toAuthorizeClientVpnIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateTags()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDisassociateClientVpnTargetNetwork()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toModifyClientVpnEndpoint()
* - .toRevokeClientVpnIngress()
* - .toTerminateClientVpnConnections()
*
* Applies to resource types:
* - client-vpn-endpoint
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifClientRootCertificateChainArn(value, operator) {
return this.if(`ClientRootCertificateChainArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the CloudWatch Logs log group
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateClientVpnTargetNetwork()
* - .toAuthorizeClientVpnIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateTags()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDisassociateClientVpnTargetNetwork()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toModifyClientVpnEndpoint()
* - .toRevokeClientVpnIngress()
* - .toTerminateClientVpnConnections()
*
* Applies to resource types:
* - client-vpn-endpoint
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifCloudwatchLogGroupArn(value, operator) {
return this.if(`CloudwatchLogGroupArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the CloudWatch Logs log stream
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateClientVpnTargetNetwork()
* - .toAuthorizeClientVpnIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateTags()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDisassociateClientVpnTargetNetwork()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toModifyClientVpnEndpoint()
* - .toRevokeClientVpnIngress()
* - .toTerminateClientVpnConnections()
*
* Applies to resource types:
* - client-vpn-endpoint
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifCloudwatchLogStreamArn(value, operator) {
return this.if(`CloudwatchLogStreamArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the state of AMD SEV-SNP CPU Options. Currently, only US East (Ohio) and Europe (Ireland) are supported
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toImportInstance()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifCpuOptionsAmdSevSnp(value, operator) {
return this.if(`CpuOptionsAmdSevSnp`, value, operator ?? 'StringLike');
}
/**
* Filters access by the name of a resource-creating API action
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/supported-iam-actions-tagging.html
*
* Applies to actions:
* - .toCreateTags()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifCreateAction(value, operator) {
return this.if(`CreateAction`, value, operator ?? 'StringLike');
}
/**
* Filters access by the date and time at which the Capacity Reservation was created
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [date operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Date). **Default:** `DateEquals`
*/
ifCreateDate(value, operator) {
if (typeof value.getMonth === "function") {
value = value.toISOString();
}
else if (Array.isArray(value)) {
value = value.map((item) => {
if (typeof item.getMonth === "function") {
item = item.toISOString();
}
return item;
});
}
return this.if(`CreateDate`, value, operator ?? 'DateEquals');
}
/**
* Filters access by the duration after which DPD timeout occurs on a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifDPDTimeoutSeconds(value, operator) {
return this.if(`DPDTimeoutSeconds`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the ID of the Capacity Reservation that you want to move capacity into
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifDestinationCapacityReservationId(value, operator) {
return this.if(`DestinationCapacityReservationId`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ID of a dynamic host configuration protocol (DHCP) options set
*
* Applies to actions:
* - .toAssociateDhcpOptions()
* - .toCreateDhcpOptions()
* - .toCreateTags()
* - .toDeleteDhcpOptions()
*
* Applies to resource types:
* - dhcp-options
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifDhcpOptionsID(value, operator) {
return this.if(`DhcpOptionsID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the directory
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateClientVpnTargetNetwork()
* - .toAuthorizeClientVpnIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateTags()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDisassociateClientVpnTargetNetwork()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toModifyClientVpnEndpoint()
* - .toRevokeClientVpnIngress()
* - .toTerminateClientVpnConnections()
*
* Applies to resource types:
* - client-vpn-endpoint
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifDirectoryArn(value, operator) {
return this.if(`DirectoryArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the domain of the Elastic IP address
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptAddressTransfer()
* - .toAssociateAddress()
* - .toAssociateNatGatewayAddress()
* - .toCreateNatGateway()
* - .toCreateTags()
* - .toDisableAddressTransfer()
* - .toDisassociateAddress()
* - .toDisassociateNatGatewayAddress()
* - .toEnableAddressTransfer()
* - .toModifyAddressAttribute()
* - .toReleaseAddress()
* - .toResetAddressAttribute()
*
* Applies to resource types:
* - elastic-ip
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifDomain(value, operator) {
return this.if(`Domain`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the instance is enabled for EBS optimization
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toRejectCapacityReservationBillingOwnership()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - capacity-reservation
* - instance
*
* @param value `true` or `false`. **Default:** `true`
*/
ifEbsOptimized(value) {
return this.if(`EbsOptimized`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Filters access by the type of Elastic Graphics accelerator
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateTags()
* - .toRunInstances()
*
* Applies to resource types:
* - elastic-gpu
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifElasticGpuType(value, operator) {
return this.if(`ElasticGpuType`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the EBS volume is encrypted
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAttachVolume()
* - .toCopySnapshot()
* - .toCreateFleet()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteVolume()
* - .toDescribeSnapshotAttribute()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toDisableFastSnapshotRestores()
* - .toEnableFastSnapshotRestores()
* - .toEnableVolumeIO()
* - .toImportInstance()
* - .toImportVolume()
* - .toLockSnapshot()
* - .toModifyInstanceAttribute()
* - .toModifySnapshotTier()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRunInstances()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
* - volume
*
* @param value `true` or `false`. **Default:** `true`
*/
ifEncrypted(value) {
return this.if(`Encrypted`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Filters access by the date and time at which the Capacity Reservation ends
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [date operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Date). **Default:** `DateEquals`
*/
ifEndDate(value, operator) {
if (typeof value.getMonth === "function") {
value = value.toISOString();
}
else if (Array.isArray(value)) {
value = value.map((item) => {
if (typeof item.getMonth === "function") {
item = item.toISOString();
}
return item;
});
}
return this.if(`EndDate`, value, operator ?? 'DateEquals');
}
/**
* Filters access by the way in which the Capacity Reservation ends
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifEndDateType(value, operator) {
return this.if(`EndDateType`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the instance is enabled for ephemeral storage
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateCapacityReservation()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value `true` or `false`. **Default:** `true`
*/
ifEphemeralStorage(value) {
return this.if(`EphemeralStorage`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Filters access by the ID of an AWS FIS action
*
* https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html
*
* Applies to actions:
* - .toInjectApiError()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifFisActionId(value, operator) {
return this.if(`FisActionId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of an AWS FIS target
*
* https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html
*
* Applies to actions:
* - .toInjectApiError()
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifFisTargetArns(value, operator) {
return this.if(`FisTargetArns`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the gateway type for a VPN endpoint on the AWS side of a VPN connection
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifGatewayType(value, operator) {
return this.if(`GatewayType`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether host recovery is enabled for a Dedicated Host
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAllocateHosts()
* - .toCreateTags()
*
* Applies to resource types:
* - dedicated-host
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifHostRecovery(value, operator) {
return this.if(`HostRecovery`, value, operator ?? 'StringLike');
}
/**
* Filters access by the internet key exchange (IKE) versions that are permitted for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifIKEVersions(value, operator) {
return this.if(`IKEVersions`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an image
*
* Applies to actions:
* - .toCancelImageLaunchPermission()
* - .toCopyImage()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRestoreImageTask()
* - .toCreateStoreImageTask()
* - .toCreateTags()
* - .toDeregisterImage()
* - .toDescribeImageAttribute()
* - .toDisableFastLaunch()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toEnableFastLaunch()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toExportImage()
* - .toImportImage()
* - .toModifyFleet()
* - .toModifyImageAttribute()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetImageAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRunInstances()
*
* Applies to resource types:
* - image
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifImageID(value, operator) {
return this.if(`ImageID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the type of image (machine, aki, or ari)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCancelImageLaunchPermission()
* - .toCreateFleet()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateStoreImageTask()
* - .toCreateTags()
* - .toDeregisterImage()
* - .toDescribeImageAttribute()
* - .toDisableFastLaunch()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toEnableFastLaunch()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toExportImage()
* - .toImportImage()
* - .toModifyFleet()
* - .toModifyImageAttribute()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetImageAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRunInstances()
*
* Applies to resource types:
* - image
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifImageType(value, operator) {
return this.if(`ImageType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the range of inside IP addresses for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInsideTunnelCidr(value, operator) {
return this.if(`InsideTunnelCidr`, value, operator ?? 'StringLike');
}
/**
* Filters access by a range of inside IPv6 addresses for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInsideTunnelIpv6Cidr(value, operator) {
return this.if(`InsideTunnelIpv6Cidr`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the instance type supports auto recovery
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceAutoRecovery(value, operator) {
return this.if(`InstanceAutoRecovery`, value, operator ?? 'StringLike');
}
/**
* Filters access by the bandwidth weighting of an instance
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toImportInstance()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toReportInstanceStatus()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceBandwidthWeighting(value, operator) {
return this.if(`InstanceBandwidthWeighting`, value, operator ?? 'StringLike');
}
/**
* Filters access by the number of instances
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifInstanceCount(value, operator) {
return this.if(`InstanceCount`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the ID of an instance
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toImportInstance()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toReportInstanceStatus()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceID(value, operator) {
return this.if(`InstanceID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the market or purchasing option of an instance (capacity-block, on-demand, or spot)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceMarketType(value, operator) {
return this.if(`InstanceMarketType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the type of instance launches that the Capacity Reservation accepts
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceMatchCriteria(value, operator) {
return this.if(`InstanceMatchCriteria`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the instance allows access to instance tags from the instance metadata
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceMetadataTags(value, operator) {
return this.if(`InstanceMetadataTags`, value, operator ?? 'StringLike');
}
/**
* Filters access by the type of operating system for which the Capacity Reservation reserves capacity
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifInstancePlatform(value, operator) {
return this.if(`InstancePlatform`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of an instance profile
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifInstanceProfile(value, operator) {
return this.if(`InstanceProfile`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the type of instance
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAllocateHosts()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toMonitorInstances()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toRejectCapacityReservationBillingOwnership()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - capacity-reservation
* - dedicated-host
* - instance
* - reserved-instances
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInstanceType(value, operator) {
return this.if(`InstanceType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an internet gateway
*
* Applies to actions:
* - .toAssociateRouteTable()
* - .toAttachInternetGateway()
* - .toCreateInternetGateway()
* - .toCreateNetworkInsightsPath()
* - .toCreateTags()
* - .toDeleteInternetGateway()
* - .toDetachInternetGateway()
* - .toDisassociateRouteTable()
* - .toReplaceRouteTableAssociation()
*
* Applies to resource types:
* - internet-gateway
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifInternetGatewayID(value, operator) {
return this.if(`InternetGatewayID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an IPAM pool provided for IPv4 CIDR block allocation
*
* Applies to actions:
* - .toAssociateRouteServer()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateVpcCidrBlock()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toDisassociateRouteServer()
* - .toDisassociateSecurityGroupVpc()
*
* Applies to resource types:
* - vpc
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifIpv4IpamPoolId(value, operator) {
return this.if(`Ipv4IpamPoolId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an IPAM pool provided for IPv6 CIDR block allocation
*
* Applies to actions:
* - .toAssociateRouteServer()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateVpcCidrBlock()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toDisassociateRouteServer()
* - .toDisassociateSecurityGroupVpc()
*
* Applies to resource types:
* - vpc
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifIpv6IpamPoolId(value, operator) {
return this.if(`Ipv6IpamPoolId`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether users are able to override resources that are specified in the launch template
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toRunInstances()
*
* Applies to resource types:
* - capacity-reservation
* - dedicated-host
* - elastic-gpu
* - image
* - instance
* - key-pair
* - launch-template
* - network-interface
* - placement-group
* - security-group
* - snapshot
* - subnet
* - volume
*
* @param value `true` or `false`. **Default:** `true`
*/
ifIsLaunchTemplateResource(value) {
return this.if(`IsLaunchTemplateResource`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Filters access by the name of a key pair
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateTags()
* - .toDeleteKeyPair()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
*
* Applies to resource types:
* - key-pair
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifKeyPairName(value, operator) {
return this.if(`KeyPairName`, value, operator ?? 'StringLike');
}
/**
* Filters access by the type of a key pair
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateKeyPair()
* - .toCreateTags()
* - .toDeleteKeyPair()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
*
* Applies to resource types:
* - key-pair
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifKeyPairType(value, operator) {
return this.if(`KeyPairType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an AWS KMS key provided in the request
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateFleet()
* - .toCreateVolume()
*
* Applies to resource types:
* - volume
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifKmsKeyId(value, operator) {
return this.if(`KmsKeyId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of a launch template
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toRunInstances()
*
* Applies to resource types:
* - capacity-reservation
* - dedicated-host
* - elastic-gpu
* - image
* - instance
* - key-pair
* - launch-template
* - network-interface
* - placement-group
* - security-group
* - snapshot
* - subnet
* - volume
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifLaunchTemplate(value, operator) {
return this.if(`LaunchTemplate`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the destination for the snapshot copy
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateSnapshot()
* - .toCreateSnapshots()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifLocation(value, operator) {
return this.if(`Location`, value, operator ?? 'StringLike');
}
/**
* Filters access by the presence of an EC2 operator provisioning a managed resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toDeleteLaunchTemplate()
* - .toDeleteLaunchTemplateVersions()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeleteVolume()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDescribeInstanceAttribute()
* - .toDescribeVolumeAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateAddress()
* - .toDisassociateIamInstanceProfile()
* - .toDisassociateNatGatewayAddress()
* - .toEnableFastLaunch()
* - .toEnableVolumeIO()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyFleet()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyLaunchTemplate()
* - .toModifyLocalGatewayRoute()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifySpotFleetRequest()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toReplaceIamInstanceProfileAssociation()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetInstanceAttribute()
* - .toResetNetworkInterfaceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
* - launch-template
* - network-interface
* - volume
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifManagedResourceOperator(value, operator) {
return this.if(`ManagedResourceOperator`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the HTTP endpoint is enabled for the instance metadata service
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifMetadataHttpEndpoint(value, operator) {
return this.if(`MetadataHttpEndpoint`, value, operator ?? 'StringLike');
}
/**
* Filters access by the allowed number of hops when calling the instance metadata service
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifMetadataHttpPutResponseHopLimit(value, operator) {
return this.if(`MetadataHttpPutResponseHopLimit`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by whether tokens are required when calling the instance metadata service (optional or required)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifMetadataHttpTokens(value, operator) {
return this.if(`MetadataHttpTokens`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a network access control list (ACL)
*
* Applies to actions:
* - .toCreateNetworkAcl()
* - .toCreateNetworkAclEntry()
* - .toCreateTags()
* - .toDeleteNetworkAcl()
* - .toDeleteNetworkAclEntry()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceNetworkAclEntry()
*
* Applies to resource types:
* - network-acl
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifNetworkAclID(value, operator) {
return this.if(`NetworkAclID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of an elastic network interface
*
* Applies to actions:
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssociateAddress()
* - .toAttachNetworkInterface()
* - .toCreateFlowLogs()
* - .toCreateLocalGatewayRoute()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreateNetworkInterfacePermission()
* - .toCreateTags()
* - .toCreateTrafficMirrorSession()
* - .toCreateTrafficMirrorTarget()
* - .toCreateVerifiedAccessEndpoint()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDetachNetworkInterface()
* - .toDisassociateAddress()
* - .toDisassociateNatGatewayAddress()
* - .toModifyLocalGatewayRoute()
* - .toModifyNetworkInterfaceAttribute()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRequestSpotInstances()
* - .toResetNetworkInterfaceAttribute()
* - .toRunInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
*
* Applies to resource types:
* - network-interface
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifNetworkInterfaceID(value, operator) {
return this.if(`NetworkInterfaceID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the instance profile being attached
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateIamInstanceProfile()
* - .toGetConsoleScreenshot()
* - .toGetInstanceUefiData()
* - .toModifyPrivateDnsNameOptions()
* - .toReplaceIamInstanceProfileAssociation()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifNewInstanceProfile(value, operator) {
return this.if(`NewInstanceProfile`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the Outpost
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCopySnapshot()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateImage()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toDeleteSnapshot()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeSnapshotAttribute()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRegisterImage()
* - .toRejectCapacityReservationBillingOwnership()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
*
* Applies to resource types:
* - capacity-reservation
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifOutpostArn(value, operator) {
return this.if(`OutpostArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the owner of the resource (amazon, aws-marketplace, or an AWS account ID)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCancelImageLaunchPermission()
* - .toCopyFpgaImage()
* - .toCopyImage()
* - .toCopySnapshot()
* - .toCreateFleet()
* - .toCreateFpgaImage()
* - .toCreateImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRestoreImageTask()
* - .toCreateStoreImageTask()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteFpgaImage()
* - .toDeleteSnapshot()
* - .toDeregisterImage()
* - .toDescribeFpgaImageAttribute()
* - .toDescribeImageAttribute()
* - .toDescribeSnapshotAttribute()
* - .toDisableFastLaunch()
* - .toDisableFastSnapshotRestores()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toEnableFastLaunch()
* - .toEnableFastSnapshotRestores()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toExportImage()
* - .toImportImage()
* - .toImportSnapshot()
* - .toLockSnapshot()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyImageAttribute()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toResetSnapshotAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRunInstances()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - fpga-image
* - image
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifOwner(value, operator) {
return this.if(`Owner`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the parent snapshot
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAttachVolume()
* - .toCopySnapshot()
* - .toCreateFleet()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteVolume()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toEnableVolumeIO()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyInstanceAttribute()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRunInstances()
*
* Applies to resource types:
* - snapshot
* - volume
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifParentSnapshot(value, operator) {
return this.if(`ParentSnapshot`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the parent volume from which the snapshot was created
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCopySnapshot()
* - .toCreateImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteSnapshot()
* - .toDescribeSnapshotAttribute()
* - .toDisableFastSnapshotRestores()
* - .toEnableFastSnapshotRestores()
* - .toImportImage()
* - .toImportSnapshot()
* - .toLockSnapshot()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetSnapshotAttribute()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRunInstances()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifParentVolume(value, operator) {
return this.if(`ParentVolume`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the type of permission for a resource (INSTANCE-ATTACH or EIP-ASSOCIATE)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateNetworkInterfacePermission()
* - .toCreateTags()
* - .toCreateVerifiedAccessEndpoint()
* - .toDisassociateNatGatewayAddress()
* - .toModifyLocalGatewayRoute()
* - .toRequestSpotInstances()
*
* Applies to resource types:
* - network-interface
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPermission(value, operator) {
return this.if(`Permission`, value, operator ?? 'StringLike');
}
/**
* Filters access by the Diffie-Hellman group numbers that are permitted for a VPN tunnel for the phase 1 IKE negotiations
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPhase1DHGroup(value, operator) {
return this.if(`Phase1DHGroup`, value, operator ?? 'StringLike');
}
/**
* Filters access by the encryption algorithms that are permitted for a VPN tunnel for the phase 1 IKE negotiations
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPhase1EncryptionAlgorithms(value, operator) {
return this.if(`Phase1EncryptionAlgorithms`, value, operator ?? 'StringLike');
}
/**
* Filters access by the integrity algorithms that are permitted for a VPN tunnel for the phase 1 IKE negotiations
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPhase1IntegrityAlgorithms(value, operator) {
return this.if(`Phase1IntegrityAlgorithms`, value, operator ?? 'StringLike');
}
/**
* Filters access by the lifetime in seconds for phase 1 of the IKE negotiations for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifPhase1LifetimeSeconds(value, operator) {
return this.if(`Phase1LifetimeSeconds`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the Diffie-Hellman group numbers that are permitted for a VPN tunnel for the phase 2 IKE negotiations
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPhase2DHGroup(value, operator) {
return this.if(`Phase2DHGroup`, value, operator ?? 'StringLike');
}
/**
* Filters access by the encryption algorithms that are permitted for a VPN tunnel for the phase 2 IKE negotiations
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPhase2EncryptionAlgorithms(value, operator) {
return this.if(`Phase2EncryptionAlgorithms`, value, operator ?? 'StringLike');
}
/**
* Filters access by the integrity algorithms that are permitted for a VPN tunnel for the phase 2 IKE negotiations
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPhase2IntegrityAlgorithms(value, operator) {
return this.if(`Phase2IntegrityAlgorithms`, value, operator ?? 'StringLike');
}
/**
* Filters access by the lifetime in seconds for phase 2 of the IKE negotiations for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifPhase2LifetimeSeconds(value, operator) {
return this.if(`Phase2LifetimeSeconds`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the ARN of the placement group
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toMoveCapacityReservationInstances()
* - .toRebootInstances()
* - .toRejectCapacityReservationBillingOwnership()
* - .toReplaceIamInstanceProfileAssociation()
* - .toRunInstances()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - capacity-reservation
* - instance
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifPlacementGroup(value, operator) {
return this.if(`PlacementGroup`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the name of a placement group
*
* Applies to actions:
* - .toCreateFleet()
* - .toCreatePlacementGroup()
* - .toCreateTags()
* - .toDeletePlacementGroup()
* - .toDeleteResourcePolicy()
* - .toGetResourcePolicy()
* - .toModifyInstancePlacement()
* - .toPutResourcePolicy()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
*
* Applies to resource types:
* - placement-group
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPlacementGroupName(value, operator) {
return this.if(`PlacementGroupName`, value, operator ?? 'StringLike');
}
/**
* Filters access by the instance placement strategy used by the placement group (cluster, spread, or partition)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateFleet()
* - .toCreatePlacementGroup()
* - .toCreateTags()
* - .toDeletePlacementGroup()
* - .toDeleteResourcePolicy()
* - .toGetResourcePolicy()
* - .toModifyInstancePlacement()
* - .toPutResourcePolicy()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
*
* Applies to resource types:
* - placement-group
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPlacementGroupStrategy(value, operator) {
return this.if(`PlacementGroupStrategy`, value, operator ?? 'StringLike');
}
/**
* Filters access by the product code that is associated with the AMI
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toDescribeInstanceAttribute()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisassociateIamInstanceProfile()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifProductCode(value, operator) {
return this.if(`ProductCode`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether the image has public launch permissions
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCancelImageLaunchPermission()
* - .toCreateFleet()
* - .toCreateFpgaImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateStoreImageTask()
* - .toCreateTags()
* - .toDeleteFpgaImage()
* - .toDeregisterImage()
* - .toDescribeImageAttribute()
* - .toDisableFastLaunch()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toEnableFastLaunch()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toExportImage()
* - .toImportImage()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyImageAttribute()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRunInstances()
*
* Applies to resource types:
* - fpga-image
* - image
*
* @param value `true` or `false`. **Default:** `true`
*/
ifPublic(value) {
return this.if(`Public`, (typeof value !== 'undefined' ? value : true), 'Bool');
}
/**
* Filters access by a public IP address
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptAddressTransfer()
* - .toAssociateAddress()
* - .toAssociateNatGatewayAddress()
* - .toCreateNatGateway()
* - .toCreateTags()
* - .toDisableAddressTransfer()
* - .toDisassociateAddress()
* - .toDisassociateNatGatewayAddress()
* - .toEnableAddressTransfer()
* - .toModifyAddressAttribute()
* - .toReleaseAddress()
* - .toResetAddressAttribute()
*
* Applies to resource types:
* - elastic-ip
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifPublicIpAddress(value, operator) {
return this.if(`PublicIpAddress`, value, operator ?? 'StringLike');
}
/**
* Filters access by the number of Dedicated Hosts in a request
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAllocateHosts()
* - .toCreateTags()
*
* Applies to resource types:
* - dedicated-host
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifQuantity(value, operator) {
return this.if(`Quantity`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the name of the AWS Region
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptAddressTransfer()
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAcceptReservedInstancesExchangeQuote()
* - .toAcceptTransitGatewayMulticastDomainAssociations()
* - .toAcceptTransitGatewayPeeringAttachment()
* - .toAcceptTransitGatewayVpcAttachment()
* - .toAcceptVpcEndpointConnections()
* - .toAcceptVpcPeeringConnection()
* - .toAdvertiseByoipCidr()
* - .toAllocateAddress()
* - .toAllocateHosts()
* - .toAllocateIpamPoolCidr()
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssignPrivateNatGatewayAddress()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateClientVpnTargetNetwork()
* - .toAssociateDhcpOptions()
* - .toAssociateEnclaveCertificateIamRole()
* - .toAssociateIamInstanceProfile()
* - .toAssociateInstanceEventWindow()
* - .toAssociateIpamByoasn()
* - .toAssociateIpamResourceDiscovery()
* - .toAssociateNatGatewayAddress()
* - .toAssociateRouteServer()
* - .toAssociateRouteTable()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateSubnetCidrBlock()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toAssociateTransitGatewayPolicyTable()
* - .toAssociateTransitGatewayRouteTable()
* - .toAssociateTrunkInterface()
* - .toAssociateVerifiedAccessInstanceWebAcl()
* - .toAssociateVpcCidrBlock()
* - .toAttachClassicLinkVpc()
* - .toAttachInternetGateway()
* - .toAttachNetworkInterface()
* - .toAttachVerifiedAccessTrustProvider()
* - .toAttachVolume()
* - .toAttachVpnGateway()
* - .toAuthorizeClientVpnIngress()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toBundleInstance()
* - .toCancelBundleTask()
* - .toCancelCapacityReservation()
* - .toCancelCapacityReservationFleets()
* - .toCancelConversionTask()
* - .toCancelDeclarativePoliciesReport()
* - .toCancelExportTask()
* - .toCancelImageLaunchPermission()
* - .toCancelImportTask()
* - .toCancelReservedInstancesListing()
* - .toCancelSpotFleetRequests()
* - .toCancelSpotInstanceRequests()
* - .toConfirmProductInstance()
* - .toCopyFpgaImage()
* - .toCopyImage()
* - .toCopySnapshot()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateCapacityReservationFleet()
* - .toCreateCarrierGateway()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateCoipCidr()
* - .toCreateCoipPool()
* - .toCreateCoipPoolPermission()
* - .toCreateCustomerGateway()
* - .toCreateDefaultSubnet()
* - .toCreateDefaultVpc()
* - .toCreateDhcpOptions()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateFpgaImage()
* - .toCreateImage()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateInstanceEventWindow()
* - .toCreateInstanceExportTask()
* - .toCreateInternetGateway()
* - .toCreateIpam()
* - .toCreateIpamExternalResourceVerificationToken()
* - .toCreateIpamPool()
* - .toCreateIpamResourceDiscovery()
* - .toCreateIpamScope()
* - .toCreateKeyPair()
* - .toCreateLaunchTemplate()
* - .toCreateLaunchTemplateVersion()
* - .toCreateLocalGatewayRoute()
* - .toCreateLocalGatewayRouteTable()
* - .toCreateLocalGatewayRouteTablePermission()
* - .toCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateLocalGatewayVirtualInterface()
* - .toCreateLocalGatewayVirtualInterfaceGroup()
* - .toCreateManagedPrefixList()
* - .toCreateNatGateway()
* - .toCreateNetworkAcl()
* - .toCreateNetworkAclEntry()
* - .toCreateNetworkInsightsAccessScope()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreateNetworkInterfacePermission()
* - .toCreatePlacementGroup()
* - .toCreatePublicIpv4Pool()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateReservedInstancesListing()
* - .toCreateRestoreImageTask()
* - .toCreateRoute()
* - .toCreateRouteServer()
* - .toCreateRouteServerEndpoint()
* - .toCreateRouteServerPeer()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateSpotDatafeedSubscription()
* - .toCreateStoreImageTask()
* - .toCreateSubnet()
* - .toCreateSubnetCidrReservation()
* - .toCreateTags()
* - .toCreateTrafficMirrorFilter()
* - .toCreateTrafficMirrorFilterRule()
* - .toCreateTrafficMirrorSession()
* - .toCreateTrafficMirrorTarget()
* - .toCreateTransitGateway()
* - .toCreateTransitGatewayConnect()
* - .toCreateTransitGatewayConnectPeer()
* - .toCreateTransitGatewayMulticastDomain()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPolicyTable()
* - .toCreateTransitGatewayPrefixListReference()
* - .toCreateTransitGatewayRoute()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVerifiedAccessGroup()
* - .toCreateVerifiedAccessInstance()
* - .toCreateVerifiedAccessTrustProvider()
* - .toCreateVolume()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toCreateVpcEndpointConnectionNotification()
* - .toCreateVpcEndpointServiceConfiguration()
* - .toCreateVpcPeeringConnection()
* - .toCreateVpnConnection()
* - .toCreateVpnConnectionRoute()
* - .toCreateVpnGateway()
* - .toDeleteCarrierGateway()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDeleteCoipCidr()
* - .toDeleteCoipPool()
* - .toDeleteCoipPoolPermission()
* - .toDeleteCustomerGateway()
* - .toDeleteDhcpOptions()
* - .toDeleteEgressOnlyInternetGateway()
* - .toDeleteFleets()
* - .toDeleteFlowLogs()
* - .toDeleteFpgaImage()
* - .toDeleteInstanceConnectEndpoint()
* - .toDeleteInstanceEventWindow()
* - .toDeleteInternetGateway()
* - .toDeleteIpam()
* - .toDeleteIpamExternalResourceVerificationToken()
* - .toDeleteIpamPool()
* - .toDeleteIpamResourceDiscovery()
* - .toDeleteIpamScope()
* - .toDeleteKeyPair()
* - .toDeleteLaunchTemplate()
* - .toDeleteLaunchTemplateVersions()
* - .toDeleteLocalGatewayRoute()
* - .toDeleteLocalGatewayRouteTable()
* - .toDeleteLocalGatewayRouteTablePermission()
* - .toDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toDeleteLocalGatewayRouteTableVpcAssociation()
* - .toDeleteLocalGatewayVirtualInterface()
* - .toDeleteLocalGatewayVirtualInterfaceGroup()
* - .toDeleteManagedPrefixList()
* - .toDeleteNatGateway()
* - .toDeleteNetworkAcl()
* - .toDeleteNetworkAclEntry()
* - .toDeleteNetworkInsightsAccessScope()
* - .toDeleteNetworkInsightsAccessScopeAnalysis()
* - .toDeleteNetworkInsightsAnalysis()
* - .toDeleteNetworkInsightsPath()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeletePlacementGroup()
* - .toDeletePublicIpv4Pool()
* - .toDeleteQueuedReservedInstances()
* - .toDeleteResourcePolicy()
* - .toDeleteRoute()
* - .toDeleteRouteServer()
* - .toDeleteRouteServerEndpoint()
* - .toDeleteRouteServerPeer()
* - .toDeleteRouteTable()
* - .toDeleteSecurityGroup()
* - .toDeleteSnapshot()
* - .toDeleteSpotDatafeedSubscription()
* - .toDeleteSubnet()
* - .toDeleteSubnetCidrReservation()
* - .toDeleteTags()
* - .toDeleteTrafficMirrorFilter()
* - .toDeleteTrafficMirrorFilterRule()
* - .toDeleteTrafficMirrorSession()
* - .toDeleteTrafficMirrorTarget()
* - .toDeleteTransitGateway()
* - .toDeleteTransitGatewayConnect()
* - .toDeleteTransitGatewayConnectPeer()
* - .toDeleteTransitGatewayMulticastDomain()
* - .toDeleteTransitGatewayPeeringAttachment()
* - .toDeleteTransitGatewayPolicyTable()
* - .toDeleteTransitGatewayPrefixListReference()
* - .toDeleteTransitGatewayRoute()
* - .toDeleteTransitGatewayRouteTable()
* - .toDeleteTransitGatewayRouteTableAnnouncement()
* - .toDeleteTransitGatewayVpcAttachment()
* - .toDeleteVerifiedAccessEndpoint()
* - .toDeleteVerifiedAccessGroup()
* - .toDeleteVerifiedAccessInstance()
* - .toDeleteVerifiedAccessTrustProvider()
* - .toDeleteVolume()
* - .toDeleteVpc()
* - .toDeleteVpcBlockPublicAccessExclusion()
* - .toDeleteVpcEndpointConnectionNotifications()
* - .toDeleteVpcEndpointServiceConfigurations()
* - .toDeleteVpcEndpoints()
* - .toDeleteVpcPeeringConnection()
* - .toDeleteVpnConnection()
* - .toDeleteVpnConnectionRoute()
* - .toDeleteVpnGateway()
* - .toDeprovisionByoipCidr()
* - .toDeprovisionIpamByoasn()
* - .toDeprovisionIpamPoolCidr()
* - .toDeprovisionPublicIpv4PoolCidr()
* - .toDeregisterImage()
* - .toDeregisterInstanceEventNotificationAttributes()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDescribeAccountAttributes()
* - .toDescribeAddressTransfers()
* - .toDescribeAddresses()
* - .toDescribeAddressesAttribute()
* - .toDescribeAggregateIdFormat()
* - .toDescribeAvailabilityZones()
* - .toDescribeAwsNetworkPerformanceMetricSubscriptions()
* - .toDescribeBundleTasks()
* - .toDescribeByoipCidrs()
* - .toDescribeCapacityBlockExtensionHistory()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeCapacityBlockOfferings()
* - .toDescribeCapacityReservationBillingRequests()
* - .toDescribeCapacityReservationFleets()
* - .toDescribeCapacityReservations()
* - .toDescribeCarrierGateways()
* - .toDescribeClassicLinkInstances()
* - .toDescribeClientVpnAuthorizationRules()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnEndpoints()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDescribeCoipPools()
* - .toDescribeConversionTasks()
* - .toDescribeCustomerGateways()
* - .toDescribeDeclarativePoliciesReports()
* - .toDescribeDhcpOptions()
* - .toDescribeEgressOnlyInternetGateways()
* - .toDescribeElasticGpus()
* - .toDescribeExportImageTasks()
* - .toDescribeExportTasks()
* - .toDescribeFastLaunchImages()
* - .toDescribeFastSnapshotRestores()
* - .toDescribeFleetHistory()
* - .toDescribeFleetInstances()
* - .toDescribeFleets()
* - .toDescribeFlowLogs()
* - .toDescribeFpgaImageAttribute()
* - .toDescribeFpgaImages()
* - .toDescribeHostReservationOfferings()
* - .toDescribeHostReservations()
* - .toDescribeHosts()
* - .toDescribeIamInstanceProfileAssociations()
* - .toDescribeIdFormat()
* - .toDescribeIdentityIdFormat()
* - .toDescribeImageAttribute()
* - .toDescribeImages()
* - .toDescribeImportImageTasks()
* - .toDescribeImportSnapshotTasks()
* - .toDescribeInstanceAttribute()
* - .toDescribeInstanceConnectEndpoints()
* - .toDescribeInstanceCreditSpecifications()
* - .toDescribeInstanceEventNotificationAttributes()
* - .toDescribeInstanceEventWindows()
* - .toDescribeInstanceImageMetadata()
* - .toDescribeInstanceStatus()
* - .toDescribeInstanceTopology()
* - .toDescribeInstanceTypeOfferings()
* - .toDescribeInstanceTypes()
* - .toDescribeInstances()
* - .toDescribeInternetGateways()
* - .toDescribeIpamByoasn()
* - .toDescribeIpamExternalResourceVerificationTokens()
* - .toDescribeIpamPools()
* - .toDescribeIpamResourceDiscoveries()
* - .toDescribeIpamResourceDiscoveryAssociations()
* - .toDescribeIpamScopes()
* - .toDescribeIpams()
* - .toDescribeIpv6Pools()
* - .toDescribeKeyPairs()
* - .toDescribeLaunchTemplateVersions()
* - .toDescribeLaunchTemplates()
* - .toDescribeLocalGatewayRouteTablePermissions()
* - .toDescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations()
* - .toDescribeLocalGatewayRouteTableVpcAssociations()
* - .toDescribeLocalGatewayRouteTables()
* - .toDescribeLocalGatewayVirtualInterfaceGroups()
* - .toDescribeLocalGatewayVirtualInterfaces()
* - .toDescribeLocalGateways()
* - .toDescribeLockedSnapshots()
* - .toDescribeMacHosts()
* - .toDescribeManagedPrefixLists()
* - .toDescribeMovingAddresses()
* - .toDescribeNatGateways()
* - .toDescribeNetworkAcls()
* - .toDescribeNetworkInsightsAccessScopeAnalyses()
* - .toDescribeNetworkInsightsAccessScopes()
* - .toDescribeNetworkInsightsAnalyses()
* - .toDescribeNetworkInsightsPaths()
* - .toDescribeNetworkInterfaceAttribute()
* - .toDescribeNetworkInterfacePermissions()
* - .toDescribeNetworkInterfaces()
* - .toDescribeOutpostLags()
* - .toDescribePlacementGroups()
* - .toDescribePrefixLists()
* - .toDescribePrincipalIdFormat()
* - .toDescribePublicIpv4Pools()
* - .toDescribeRegions()
* - .toDescribeReplaceRootVolumeTasks()
* - .toDescribeReservedInstances()
* - .toDescribeReservedInstancesListings()
* - .toDescribeReservedInstancesModifications()
* - .toDescribeReservedInstancesOfferings()
* - .toDescribeRouteServerEndpoints()
* - .toDescribeRouteServerPeers()
* - .toDescribeRouteServers()
* - .toDescribeRouteTables()
* - .toDescribeScheduledInstanceAvailability()
* - .toDescribeScheduledInstances()
* - .toDescribeSecurityGroupReferences()
* - .toDescribeSecurityGroupRules()
* - .toDescribeSecurityGroupVpcAssociations()
* - .toDescribeSecurityGroups()
* - .toDescribeServiceLinkVirtualInterfaces()
* - .toDescribeSnapshotAttribute()
* - .toDescribeSnapshotTierStatus()
* - .toDescribeSnapshots()
* - .toDescribeSpotDatafeedSubscription()
* - .toDescribeSpotFleetInstances()
* - .toDescribeSpotFleetRequestHistory()
* - .toDescribeSpotFleetRequests()
* - .toDescribeSpotInstanceRequests()
* - .toDescribeSpotPriceHistory()
* - .toDescribeStaleSecurityGroups()
* - .toDescribeStoreImageTasks()
* - .toDescribeSubnets()
* - .toDescribeTags()
* - .toDescribeTrafficMirrorFilterRules()
* - .toDescribeTrafficMirrorFilters()
* - .toDescribeTrafficMirrorSessions()
* - .toDescribeTrafficMirrorTargets()
* - .toDescribeTransitGatewayAttachments()
* - .toDescribeTransitGatewayConnectPeers()
* - .toDescribeTransitGatewayConnects()
* - .toDescribeTransitGatewayMulticastDomains()
* - .toDescribeTransitGatewayPeeringAttachments()
* - .toDescribeTransitGatewayPolicyTables()
* - .toDescribeTransitGatewayRouteTableAnnouncements()
* - .toDescribeTransitGatewayRouteTables()
* - .toDescribeTransitGatewayVpcAttachments()
* - .toDescribeTransitGateways()
* - .toDescribeTrunkInterfaceAssociations()
* - .toDescribeVerifiedAccessEndpoints()
* - .toDescribeVerifiedAccessGroups()
* - .toDescribeVerifiedAccessInstanceLoggingConfigurations()
* - .toDescribeVerifiedAccessInstanceWebAclAssociations()
* - .toDescribeVerifiedAccessInstances()
* - .toDescribeVerifiedAccessTrustProviders()
* - .toDescribeVolumeAttribute()
* - .toDescribeVolumeStatus()
* - .toDescribeVolumes()
* - .toDescribeVolumesModifications()
* - .toDescribeVpcAttribute()
* - .toDescribeVpcBlockPublicAccessExclusions()
* - .toDescribeVpcBlockPublicAccessOptions()
* - .toDescribeVpcClassicLink()
* - .toDescribeVpcClassicLinkDnsSupport()
* - .toDescribeVpcEndpointAssociations()
* - .toDescribeVpcEndpointConnectionNotifications()
* - .toDescribeVpcEndpointConnections()
* - .toDescribeVpcEndpointServiceConfigurations()
* - .toDescribeVpcEndpointServicePermissions()
* - .toDescribeVpcEndpointServices()
* - .toDescribeVpcEndpoints()
* - .toDescribeVpcPeeringConnections()
* - .toDescribeVpcs()
* - .toDescribeVpnConnections()
* - .toDescribeVpnGateways()
* - .toDetachClassicLinkVpc()
* - .toDetachInternetGateway()
* - .toDetachNetworkInterface()
* - .toDetachVerifiedAccessTrustProvider()
* - .toDetachVolume()
* - .toDetachVpnGateway()
* - .toDisableAddressTransfer()
* - .toDisableAllowedImagesSettings()
* - .toDisableAwsNetworkPerformanceMetricSubscription()
* - .toDisableEbsEncryptionByDefault()
* - .toDisableFastLaunch()
* - .toDisableFastSnapshotRestores()
* - .toDisableImage()
* - .toDisableImageBlockPublicAccess()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toDisableIpamOrganizationAdminAccount()
* - .toDisableRouteServerPropagation()
* - .toDisableSerialConsoleAccess()
* - .toDisableSnapshotBlockPublicAccess()
* - .toDisableTransitGatewayRouteTablePropagation()
* - .toDisableVgwRoutePropagation()
* - .toDisableVpcClassicLink()
* - .toDisableVpcClassicLinkDnsSupport()
* - .toDisassociateAddress()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateClientVpnTargetNetwork()
* - .toDisassociateEnclaveCertificateIamRole()
* - .toDisassociateIamInstanceProfile()
* - .toDisassociateInstanceEventWindow()
* - .toDisassociateIpamByoasn()
* - .toDisassociateIpamResourceDiscovery()
* - .toDisassociateNatGatewayAddress()
* - .toDisassociateRouteServer()
* - .toDisassociateRouteTable()
* - .toDisassociateSecurityGroupVpc()
* - .toDisassociateSubnetCidrBlock()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toDisassociateTransitGatewayPolicyTable()
* - .toDisassociateTransitGatewayRouteTable()
* - .toDisassociateTrunkInterface()
* - .toDisassociateVerifiedAccessInstanceWebAcl()
* - .toDisassociateVpcCidrBlock()
* - .toEnableAddressTransfer()
* - .toEnableAllowedImagesSettings()
* - .toEnableAwsNetworkPerformanceMetricSubscription()
* - .toEnableEbsEncryptionByDefault()
* - .toEnableFastLaunch()
* - .toEnableFastSnapshotRestores()
* - .toEnableImage()
* - .toEnableImageBlockPublicAccess()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toEnableIpamOrganizationAdminAccount()
* - .toEnableReachabilityAnalyzerOrganizationSharing()
* - .toEnableRouteServerPropagation()
* - .toEnableSerialConsoleAccess()
* - .toEnableSnapshotBlockPublicAccess()
* - .toEnableTransitGatewayRouteTablePropagation()
* - .toEnableVgwRoutePropagation()
* - .toEnableVolumeIO()
* - .toEnableVpcClassicLink()
* - .toEnableVpcClassicLinkDnsSupport()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toExportImage()
* - .toExportTransitGatewayRoutes()
* - .toExportVerifiedAccessInstanceClientConfiguration()
* - .toGetAllowedImagesSettings()
* - .toGetAssociatedEnclaveCertificateIamRoles()
* - .toGetAssociatedIpv6PoolCidrs()
* - .toGetAwsNetworkPerformanceData()
* - .toGetCapacityReservationUsage()
* - .toGetCoipPoolUsage()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetDeclarativePoliciesReportSummary()
* - .toGetDefaultCreditSpecification()
* - .toGetEbsDefaultKmsKeyId()
* - .toGetEbsEncryptionByDefault()
* - .toGetFlowLogsIntegrationTemplate()
* - .toGetGroupsForCapacityReservation()
* - .toGetHostReservationPurchasePreview()
* - .toGetImageBlockPublicAccessState()
* - .toGetInstanceMetadataDefaults()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceTypesFromInstanceRequirements()
* - .toGetInstanceUefiData()
* - .toGetIpamAddressHistory()
* - .toGetIpamDiscoveredAccounts()
* - .toGetIpamDiscoveredPublicAddresses()
* - .toGetIpamDiscoveredResourceCidrs()
* - .toGetIpamPoolAllocations()
* - .toGetIpamPoolCidrs()
* - .toGetIpamResourceCidrs()
* - .toGetLaunchTemplateData()
* - .toGetManagedPrefixListAssociations()
* - .toGetManagedPrefixListEntries()
* - .toGetNetworkInsightsAccessScopeAnalysisFindings()
* - .toGetNetworkInsightsAccessScopeContent()
* - .toGetPasswordData()
* - .toGetReservedInstancesExchangeQuote()
* - .toGetResourcePolicy()
* - .toGetRouteServerAssociations()
* - .toGetRouteServerPropagations()
* - .toGetRouteServerRoutingDatabase()
* - .toGetSecurityGroupsForVpc()
* - .toGetSerialConsoleAccessStatus()
* - .toGetSnapshotBlockPublicAccessState()
* - .toGetSpotPlacementScores()
* - .toGetSubnetCidrReservations()
* - .toGetTransitGatewayAttachmentPropagations()
* - .toGetTransitGatewayMulticastDomainAssociations()
* - .toGetTransitGatewayPolicyTableAssociations()
* - .toGetTransitGatewayPolicyTableEntries()
* - .toGetTransitGatewayPrefixListReferences()
* - .toGetTransitGatewayRouteTableAssociations()
* - .toGetTransitGatewayRouteTablePropagations()
* - .toGetVerifiedAccessEndpointPolicy()
* - .toGetVerifiedAccessEndpointTargets()
* - .toGetVerifiedAccessGroupPolicy()
* - .toGetVerifiedAccessInstanceWebAcl()
* - .toGetVpnConnectionDeviceSampleConfiguration()
* - .toGetVpnConnectionDeviceTypes()
* - .toGetVpnTunnelReplacementStatus()
* - .toImportByoipCidrToIpam()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toImportImage()
* - .toImportInstance()
* - .toImportKeyPair()
* - .toImportSnapshot()
* - .toImportVolume()
* - .toInjectApiError()
* - .toListImagesInRecycleBin()
* - .toListSnapshotsInRecycleBin()
* - .toLockSnapshot()
* - .toModifyAddressAttribute()
* - .toModifyAvailabilityZoneGroup()
* - .toModifyCapacityReservation()
* - .toModifyCapacityReservationFleet()
* - .toModifyClientVpnEndpoint()
* - .toModifyDefaultCreditSpecification()
* - .toModifyEbsDefaultKmsKeyId()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyHosts()
* - .toModifyIdFormat()
* - .toModifyIdentityIdFormat()
* - .toModifyImageAttribute()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceEventWindow()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataDefaults()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyIpam()
* - .toModifyIpamPool()
* - .toModifyIpamResourceCidr()
* - .toModifyIpamResourceDiscovery()
* - .toModifyIpamScope()
* - .toModifyLaunchTemplate()
* - .toModifyLocalGatewayRoute()
* - .toModifyManagedPrefixList()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifyRouteServer()
* - .toModifySecurityGroupRules()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTrafficMirrorFilterNetworkServices()
* - .toModifyTrafficMirrorFilterRule()
* - .toModifyTrafficMirrorSession()
* - .toModifyTransitGateway()
* - .toModifyTransitGatewayPrefixListReference()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVerifiedAccessEndpoint()
* - .toModifyVerifiedAccessEndpointPolicy()
* - .toModifyVerifiedAccessGroup()
* - .toModifyVerifiedAccessGroupPolicy()
* - .toModifyVerifiedAccessInstance()
* - .toModifyVerifiedAccessInstanceLoggingConfiguration()
* - .toModifyVerifiedAccessTrustProvider()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toModifyVpcAttribute()
* - .toModifyVpcBlockPublicAccessExclusion()
* - .toModifyVpcBlockPublicAccessOptions()
* - .toModifyVpcEndpoint()
* - .toModifyVpcEndpointConnectionNotification()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toModifyVpcPeeringConnectionOptions()
* - .toModifyVpcTenancy()
* - .toModifyVpnConnection()
* - .toModifyVpnConnectionOptions()
* - .toModifyVpnTunnelCertificate()
* - .toModifyVpnTunnelOptions()
* - .toMonitorInstances()
* - .toMoveAddressToVpc()
* - .toMoveByoipCidrToIpam()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toProvisionByoipCidr()
* - .toProvisionIpamByoasn()
* - .toProvisionIpamPoolCidr()
* - .toProvisionPublicIpv4PoolCidr()
* - .toPurchaseCapacityBlock()
* - .toPurchaseCapacityBlockExtension()
* - .toPurchaseHostReservation()
* - .toPurchaseReservedInstancesOffering()
* - .toPurchaseScheduledInstances()
* - .toPutResourcePolicy()
* - .toRebootInstances()
* - .toRegisterImage()
* - .toRegisterInstanceEventNotificationAttributes()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRejectCapacityReservationBillingOwnership()
* - .toRejectTransitGatewayMulticastDomainAssociations()
* - .toRejectTransitGatewayPeeringAttachment()
* - .toRejectTransitGatewayVpcAttachment()
* - .toRejectVpcEndpointConnections()
* - .toRejectVpcPeeringConnection()
* - .toReleaseAddress()
* - .toReleaseHosts()
* - .toReleaseIpamPoolAllocation()
* - .toReplaceIamInstanceProfileAssociation()
* - .toReplaceImageCriteriaInAllowedImagesSettings()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceNetworkAclEntry()
* - .toReplaceRoute()
* - .toReplaceRouteTableAssociation()
* - .toReplaceTransitGatewayRoute()
* - .toReplaceVpnTunnel()
* - .toReportInstanceStatus()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetAddressAttribute()
* - .toResetEbsDefaultKmsKeyId()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toResetInstanceAttribute()
* - .toResetNetworkInterfaceAttribute()
* - .toResetSnapshotAttribute()
* - .toRestoreAddressToClassic()
* - .toRestoreImageFromRecycleBin()
* - .toRestoreManagedPrefixListVersion()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRevokeClientVpnIngress()
* - .toRevokeSecurityGroupEgress()
* - .toRevokeSecurityGroupIngress()
* - .toRunInstances()
* - .toRunScheduledInstances()
* - .toSearchLocalGatewayRoutes()
* - .toSearchTransitGatewayMulticastGroups()
* - .toSearchTransitGatewayRoutes()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartDeclarativePoliciesReport()
* - .toStartInstances()
* - .toStartNetworkInsightsAccessScopeAnalysis()
* - .toStartNetworkInsightsAnalysis()
* - .toStartVpcEndpointServicePrivateDnsVerification()
* - .toStopInstances()
* - .toTerminateClientVpnConnections()
* - .toTerminateInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
* - .toUnassignPrivateNatGatewayAddress()
* - .toUnlockSnapshot()
* - .toUnmonitorInstances()
* - .toUpdateSecurityGroupRuleDescriptionsEgress()
* - .toUpdateSecurityGroupRuleDescriptionsIngress()
* - .toWithdrawByoipCidr()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - carrier-gateway
* - client-vpn-endpoint
* - customer-gateway
* - declarative-policies-report
* - dedicated-host
* - dhcp-options
* - egress-only-internet-gateway
* - elastic-gpu
* - export-image-task
* - export-instance-task
* - fleet
* - fpga-image
* - host-reservation
* - image
* - import-image-task
* - import-snapshot-task
* - instance-connect-endpoint
* - instance-event-window
* - instance
* - internet-gateway
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-resource-discovery-association
* - ipam-resource-discovery
* - ipam-scope
* - coip-pool
* - ipv4pool-ec2
* - ipv6pool-ec2
* - key-pair
* - launch-template
* - local-gateway
* - local-gateway-route-table-virtual-interface-group-association
* - local-gateway-route-table-vpc-association
* - local-gateway-route-table
* - local-gateway-virtual-interface-group
* - local-gateway-virtual-interface
* - natgateway
* - network-acl
* - network-insights-access-scope-analysis
* - network-insights-access-scope
* - network-insights-analysis
* - network-insights-path
* - network-interface
* - outpost-lag
* - placement-group
* - prefix-list
* - replace-root-volume-task
* - reserved-instances
* - route-server-endpoint
* - route-server
* - route-server-peer
* - route-table
* - security-group
* - security-group-rule
* - snapshot
* - spot-fleet-request
* - spot-instances-request
* - subnet-cidr-reservation
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - traffic-mirror-target
* - transit-gateway-attachment
* - transit-gateway-connect-peer
* - transit-gateway
* - transit-gateway-multicast-domain
* - transit-gateway-policy-table
* - transit-gateway-route-table-announcement
* - transit-gateway-route-table
* - verified-access-endpoint
* - verified-access-endpoint-target
* - verified-access-group
* - verified-access-instance
* - verified-access-policy
* - verified-access-trust-provider
* - volume
* - vpc-block-public-access-exclusion
* - vpc-endpoint-connection
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc-endpoint-service-permission
* - vpc-flow-log
* - vpc
* - vpc-peering-connection
* - vpn-connection-device-type
* - vpn-connection
* - vpn-gateway
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRegion(value, operator) {
return this.if(`Region`, value, operator ?? 'StringLike');
}
/**
* Filters access by the percentage of increase of the rekey window (determined by the rekey margin time) within which the rekey time is randomly selected for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifRekeyFuzzPercentage(value, operator) {
return this.if(`RekeyFuzzPercentage`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the margin time before the phase 2 lifetime expires for a VPN tunnel
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifRekeyMarginTimeSeconds(value, operator) {
return this.if(`RekeyMarginTimeSeconds`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the group being removed from a snapshot
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toModifySnapshotAttribute()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRemoveGroup(value, operator) {
return this.if(`Remove/group`, value, operator ?? 'StringLike');
}
/**
* Filters access by the account id being removed from a snapshot
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toModifySnapshotAttribute()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRemoveUserId(value, operator) {
return this.if(`Remove/userId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the number of packets in an IKE replay window
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifReplayWindowSizePackets(value, operator) {
return this.if(`ReplayWindowSizePackets`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of a requester VPC in a VPC peering connection
*
* https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html
*
* Applies to actions:
* - .toAcceptVpcPeeringConnection()
* - .toCreateNetworkInsightsPath()
* - .toCreateTags()
* - .toCreateVpcPeeringConnection()
* - .toDeleteVpcPeeringConnection()
* - .toModifyVpcPeeringConnectionOptions()
* - .toRejectVpcPeeringConnection()
*
* Applies to resource types:
* - vpc-peering-connection
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifRequesterVpc(value, operator) {
return this.if(`RequesterVpc`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the payment option of the Reserved Instance offering (No Upfront, Partial Upfront, or All Upfront)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-reserved-instances.html#ri-payment-options
*
* Applies to actions:
* - .toCreateTags()
* - .toModifyReservedInstances()
*
* Applies to resource types:
* - reserved-instances
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifReservedInstancesOfferingType(value, operator) {
return this.if(`ReservedInstancesOfferingType`, value, operator ?? 'StringLike');
}
/**
* Filters access by a tag key and value pair of a resource
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/control-access-with-tags.html
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAcceptTransitGatewayMulticastDomainAssociations()
* - .toAcceptTransitGatewayPeeringAttachment()
* - .toAcceptTransitGatewayVpcAttachment()
* - .toAcceptVpcEndpointConnections()
* - .toAcceptVpcPeeringConnection()
* - .toAllocateAddress()
* - .toAllocateIpamPoolCidr()
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssignPrivateNatGatewayAddress()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateClientVpnTargetNetwork()
* - .toAssociateDhcpOptions()
* - .toAssociateIamInstanceProfile()
* - .toAssociateInstanceEventWindow()
* - .toAssociateIpamResourceDiscovery()
* - .toAssociateNatGatewayAddress()
* - .toAssociateRouteServer()
* - .toAssociateRouteTable()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateSubnetCidrBlock()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toAssociateTransitGatewayPolicyTable()
* - .toAssociateTransitGatewayRouteTable()
* - .toAssociateVerifiedAccessInstanceWebAcl()
* - .toAssociateVpcCidrBlock()
* - .toAttachClassicLinkVpc()
* - .toAttachInternetGateway()
* - .toAttachNetworkInterface()
* - .toAttachVerifiedAccessTrustProvider()
* - .toAttachVolume()
* - .toAttachVpnGateway()
* - .toAuthorizeClientVpnIngress()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toCancelCapacityReservationFleets()
* - .toCancelDeclarativePoliciesReport()
* - .toCancelExportTask()
* - .toCancelImageLaunchPermission()
* - .toCancelImportTask()
* - .toCancelSpotFleetRequests()
* - .toCancelSpotInstanceRequests()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateCarrierGateway()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateCoipCidr()
* - .toCreateCoipPool()
* - .toCreateCoipPoolPermission()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateImage()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateInstanceExportTask()
* - .toCreateIpamExternalResourceVerificationToken()
* - .toCreateIpamPool()
* - .toCreateIpamScope()
* - .toCreateLaunchTemplateVersion()
* - .toCreateLocalGatewayRoute()
* - .toCreateLocalGatewayRouteTable()
* - .toCreateLocalGatewayRouteTablePermission()
* - .toCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateLocalGatewayVirtualInterface()
* - .toCreateLocalGatewayVirtualInterfaceGroup()
* - .toCreateNatGateway()
* - .toCreateNetworkAcl()
* - .toCreateNetworkAclEntry()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreateNetworkInterfacePermission()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRoute()
* - .toCreateRouteServerEndpoint()
* - .toCreateRouteServerPeer()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateStoreImageTask()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTrafficMirrorFilterRule()
* - .toCreateTrafficMirrorSession()
* - .toCreateTrafficMirrorTarget()
* - .toCreateTransitGatewayConnectPeer()
* - .toCreateTransitGatewayMulticastDomain()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPolicyTable()
* - .toCreateTransitGatewayPrefixListReference()
* - .toCreateTransitGatewayRoute()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVerifiedAccessGroup()
* - .toCreateVolume()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toCreateVpcEndpointConnectionNotification()
* - .toCreateVpcPeeringConnection()
* - .toCreateVpnConnection()
* - .toCreateVpnConnectionRoute()
* - .toDeleteCarrierGateway()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDeleteCoipCidr()
* - .toDeleteCoipPool()
* - .toDeleteCoipPoolPermission()
* - .toDeleteCustomerGateway()
* - .toDeleteDhcpOptions()
* - .toDeleteEgressOnlyInternetGateway()
* - .toDeleteFleets()
* - .toDeleteFlowLogs()
* - .toDeleteFpgaImage()
* - .toDeleteInstanceConnectEndpoint()
* - .toDeleteInstanceEventWindow()
* - .toDeleteInternetGateway()
* - .toDeleteIpam()
* - .toDeleteIpamExternalResourceVerificationToken()
* - .toDeleteIpamPool()
* - .toDeleteIpamResourceDiscovery()
* - .toDeleteIpamScope()
* - .toDeleteKeyPair()
* - .toDeleteLaunchTemplate()
* - .toDeleteLaunchTemplateVersions()
* - .toDeleteLocalGatewayRoute()
* - .toDeleteLocalGatewayRouteTable()
* - .toDeleteLocalGatewayRouteTablePermission()
* - .toDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation()
* - .toDeleteLocalGatewayRouteTableVpcAssociation()
* - .toDeleteLocalGatewayVirtualInterface()
* - .toDeleteLocalGatewayVirtualInterfaceGroup()
* - .toDeleteManagedPrefixList()
* - .toDeleteNatGateway()
* - .toDeleteNetworkAcl()
* - .toDeleteNetworkAclEntry()
* - .toDeleteNetworkInsightsAccessScope()
* - .toDeleteNetworkInsightsAccessScopeAnalysis()
* - .toDeleteNetworkInsightsAnalysis()
* - .toDeleteNetworkInsightsPath()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeletePlacementGroup()
* - .toDeletePublicIpv4Pool()
* - .toDeleteResourcePolicy()
* - .toDeleteRoute()
* - .toDeleteRouteServer()
* - .toDeleteRouteServerEndpoint()
* - .toDeleteRouteServerPeer()
* - .toDeleteRouteTable()
* - .toDeleteSecurityGroup()
* - .toDeleteSnapshot()
* - .toDeleteSubnet()
* - .toDeleteTags()
* - .toDeleteTrafficMirrorFilter()
* - .toDeleteTrafficMirrorFilterRule()
* - .toDeleteTrafficMirrorSession()
* - .toDeleteTrafficMirrorTarget()
* - .toDeleteTransitGateway()
* - .toDeleteTransitGatewayConnect()
* - .toDeleteTransitGatewayConnectPeer()
* - .toDeleteTransitGatewayMulticastDomain()
* - .toDeleteTransitGatewayPeeringAttachment()
* - .toDeleteTransitGatewayPolicyTable()
* - .toDeleteTransitGatewayPrefixListReference()
* - .toDeleteTransitGatewayRoute()
* - .toDeleteTransitGatewayRouteTable()
* - .toDeleteTransitGatewayRouteTableAnnouncement()
* - .toDeleteTransitGatewayVpcAttachment()
* - .toDeleteVerifiedAccessEndpoint()
* - .toDeleteVerifiedAccessGroup()
* - .toDeleteVerifiedAccessInstance()
* - .toDeleteVerifiedAccessTrustProvider()
* - .toDeleteVolume()
* - .toDeleteVpc()
* - .toDeleteVpcBlockPublicAccessExclusion()
* - .toDeleteVpcEndpointConnectionNotifications()
* - .toDeleteVpcEndpointServiceConfigurations()
* - .toDeleteVpcEndpoints()
* - .toDeleteVpcPeeringConnection()
* - .toDeleteVpnConnection()
* - .toDeleteVpnConnectionRoute()
* - .toDeleteVpnGateway()
* - .toDeprovisionIpamByoasn()
* - .toDeprovisionIpamPoolCidr()
* - .toDeprovisionPublicIpv4PoolCidr()
* - .toDeregisterImage()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeClientVpnAuthorizationRules()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDescribeFleetHistory()
* - .toDescribeFleetInstances()
* - .toDescribeFpgaImageAttribute()
* - .toDescribeImageAttribute()
* - .toDescribeInstanceAttribute()
* - .toDescribeSecurityGroupReferences()
* - .toDescribeSnapshotAttribute()
* - .toDescribeSpotFleetInstances()
* - .toDescribeSpotFleetRequestHistory()
* - .toDescribeVolumeAttribute()
* - .toDescribeVpcAttribute()
* - .toDescribeVpcEndpointServicePermissions()
* - .toDetachClassicLinkVpc()
* - .toDetachInternetGateway()
* - .toDetachNetworkInterface()
* - .toDetachVerifiedAccessTrustProvider()
* - .toDetachVolume()
* - .toDetachVpnGateway()
* - .toDisableAddressTransfer()
* - .toDisableFastLaunch()
* - .toDisableFastSnapshotRestores()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toDisableRouteServerPropagation()
* - .toDisableTransitGatewayRouteTablePropagation()
* - .toDisableVgwRoutePropagation()
* - .toDisableVpcClassicLink()
* - .toDisableVpcClassicLinkDnsSupport()
* - .toDisassociateAddress()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateClientVpnTargetNetwork()
* - .toDisassociateIamInstanceProfile()
* - .toDisassociateInstanceEventWindow()
* - .toDisassociateIpamResourceDiscovery()
* - .toDisassociateNatGatewayAddress()
* - .toDisassociateRouteServer()
* - .toDisassociateRouteTable()
* - .toDisassociateSecurityGroupVpc()
* - .toDisassociateSubnetCidrBlock()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toDisassociateTransitGatewayPolicyTable()
* - .toDisassociateTransitGatewayRouteTable()
* - .toDisassociateVerifiedAccessInstanceWebAcl()
* - .toDisassociateVpcCidrBlock()
* - .toEnableAddressTransfer()
* - .toEnableFastLaunch()
* - .toEnableFastSnapshotRestores()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toEnableRouteServerPropagation()
* - .toEnableTransitGatewayRouteTablePropagation()
* - .toEnableVgwRoutePropagation()
* - .toEnableVolumeIO()
* - .toEnableVpcClassicLink()
* - .toEnableVpcClassicLinkDnsSupport()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toExportImage()
* - .toExportVerifiedAccessInstanceClientConfiguration()
* - .toGetCoipPoolUsage()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetDeclarativePoliciesReportSummary()
* - .toGetFlowLogsIntegrationTemplate()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetIpamAddressHistory()
* - .toGetIpamDiscoveredAccounts()
* - .toGetIpamDiscoveredPublicAddresses()
* - .toGetIpamDiscoveredResourceCidrs()
* - .toGetIpamPoolAllocations()
* - .toGetIpamPoolCidrs()
* - .toGetIpamResourceCidrs()
* - .toGetLaunchTemplateData()
* - .toGetManagedPrefixListAssociations()
* - .toGetManagedPrefixListEntries()
* - .toGetNetworkInsightsAccessScopeAnalysisFindings()
* - .toGetNetworkInsightsAccessScopeContent()
* - .toGetPasswordData()
* - .toGetResourcePolicy()
* - .toGetRouteServerAssociations()
* - .toGetRouteServerPropagations()
* - .toGetRouteServerRoutingDatabase()
* - .toGetSecurityGroupsForVpc()
* - .toGetTransitGatewayMulticastDomainAssociations()
* - .toGetTransitGatewayPolicyTableAssociations()
* - .toGetTransitGatewayPolicyTableEntries()
* - .toGetVerifiedAccessEndpointPolicy()
* - .toGetVerifiedAccessEndpointTargets()
* - .toGetVerifiedAccessGroupPolicy()
* - .toGetVerifiedAccessInstanceWebAcl()
* - .toGetVpnConnectionDeviceSampleConfiguration()
* - .toGetVpnTunnelReplacementStatus()
* - .toImportByoipCidrToIpam()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toImportImage()
* - .toImportInstance()
* - .toImportVolume()
* - .toLockSnapshot()
* - .toModifyAddressAttribute()
* - .toModifyCapacityReservationFleet()
* - .toModifyClientVpnEndpoint()
* - .toModifyFleet()
* - .toModifyFpgaImageAttribute()
* - .toModifyHosts()
* - .toModifyImageAttribute()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceEventWindow()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyIpam()
* - .toModifyIpamPool()
* - .toModifyIpamResourceCidr()
* - .toModifyIpamResourceDiscovery()
* - .toModifyIpamScope()
* - .toModifyLaunchTemplate()
* - .toModifyLocalGatewayRoute()
* - .toModifyManagedPrefixList()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifyRouteServer()
* - .toModifySecurityGroupRules()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTrafficMirrorFilterNetworkServices()
* - .toModifyTrafficMirrorFilterRule()
* - .toModifyTrafficMirrorSession()
* - .toModifyTransitGateway()
* - .toModifyTransitGatewayPrefixListReference()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVerifiedAccessEndpoint()
* - .toModifyVerifiedAccessEndpointPolicy()
* - .toModifyVerifiedAccessGroup()
* - .toModifyVerifiedAccessGroupPolicy()
* - .toModifyVerifiedAccessInstance()
* - .toModifyVerifiedAccessInstanceLoggingConfiguration()
* - .toModifyVerifiedAccessTrustProvider()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toModifyVpcAttribute()
* - .toModifyVpcBlockPublicAccessExclusion()
* - .toModifyVpcEndpoint()
* - .toModifyVpcEndpointConnectionNotification()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toModifyVpcPeeringConnectionOptions()
* - .toModifyVpcTenancy()
* - .toModifyVpnConnection()
* - .toModifyVpnConnectionOptions()
* - .toModifyVpnTunnelCertificate()
* - .toModifyVpnTunnelOptions()
* - .toMonitorInstances()
* - .toMoveByoipCidrToIpam()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toProvisionIpamByoasn()
* - .toProvisionIpamPoolCidr()
* - .toProvisionPublicIpv4PoolCidr()
* - .toPurchaseHostReservation()
* - .toPutResourcePolicy()
* - .toRebootInstances()
* - .toRegisterImage()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRejectCapacityReservationBillingOwnership()
* - .toRejectTransitGatewayMulticastDomainAssociations()
* - .toRejectTransitGatewayPeeringAttachment()
* - .toRejectTransitGatewayVpcAttachment()
* - .toRejectVpcEndpointConnections()
* - .toRejectVpcPeeringConnection()
* - .toReleaseAddress()
* - .toReleaseHosts()
* - .toReleaseIpamPoolAllocation()
* - .toReplaceIamInstanceProfileAssociation()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceNetworkAclEntry()
* - .toReplaceRoute()
* - .toReplaceRouteTableAssociation()
* - .toReplaceTransitGatewayRoute()
* - .toReplaceVpnTunnel()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetAddressAttribute()
* - .toResetFpgaImageAttribute()
* - .toResetImageAttribute()
* - .toResetInstanceAttribute()
* - .toResetNetworkInterfaceAttribute()
* - .toResetSnapshotAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRestoreManagedPrefixListVersion()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRevokeClientVpnIngress()
* - .toRevokeSecurityGroupEgress()
* - .toRevokeSecurityGroupIngress()
* - .toRunInstances()
* - .toSearchLocalGatewayRoutes()
* - .toSearchTransitGatewayMulticastGroups()
* - .toSearchTransitGatewayRoutes()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStartNetworkInsightsAccessScopeAnalysis()
* - .toStartNetworkInsightsAnalysis()
* - .toStartVpcEndpointServicePrivateDnsVerification()
* - .toStopInstances()
* - .toTerminateClientVpnConnections()
* - .toTerminateInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
* - .toUnassignPrivateNatGatewayAddress()
* - .toUnlockSnapshot()
* - .toUnmonitorInstances()
* - .toUpdateSecurityGroupRuleDescriptionsEgress()
* - .toUpdateSecurityGroupRuleDescriptionsIngress()
*
* Applies to resource types:
* - elastic-ip
* - capacity-reservation-fleet
* - capacity-reservation
* - carrier-gateway
* - client-vpn-endpoint
* - customer-gateway
* - declarative-policies-report
* - dedicated-host
* - dhcp-options
* - egress-only-internet-gateway
* - elastic-gpu
* - export-image-task
* - export-instance-task
* - fleet
* - fpga-image
* - host-reservation
* - image
* - import-image-task
* - import-snapshot-task
* - instance-connect-endpoint
* - instance-event-window
* - instance
* - internet-gateway
* - ipam-external-resource-verification-token
* - ipam
* - ipam-pool
* - ipam-resource-discovery-association
* - ipam-resource-discovery
* - ipam-scope
* - coip-pool
* - ipv4pool-ec2
* - ipv6pool-ec2
* - key-pair
* - launch-template
* - local-gateway
* - local-gateway-route-table-virtual-interface-group-association
* - local-gateway-route-table-vpc-association
* - local-gateway-route-table
* - local-gateway-virtual-interface-group
* - local-gateway-virtual-interface
* - natgateway
* - network-acl
* - network-insights-access-scope-analysis
* - network-insights-access-scope
* - network-insights-analysis
* - network-insights-path
* - network-interface
* - outpost-lag
* - placement-group
* - prefix-list
* - replace-root-volume-task
* - reserved-instances
* - route-server-endpoint
* - route-server
* - route-server-peer
* - route-table
* - security-group
* - security-group-rule
* - snapshot
* - spot-fleet-request
* - spot-instances-request
* - subnet-cidr-reservation
* - subnet
* - traffic-mirror-filter
* - traffic-mirror-filter-rule
* - traffic-mirror-session
* - traffic-mirror-target
* - transit-gateway-attachment
* - transit-gateway-connect-peer
* - transit-gateway
* - transit-gateway-multicast-domain
* - transit-gateway-policy-table
* - transit-gateway-route-table-announcement
* - transit-gateway-route-table
* - verified-access-endpoint
* - verified-access-endpoint-target
* - verified-access-group
* - verified-access-instance
* - verified-access-policy
* - verified-access-trust-provider
* - volume
* - vpc-block-public-access-exclusion
* - vpc-endpoint-connection
* - vpc-endpoint
* - vpc-endpoint-service
* - vpc-endpoint-service-permission
* - vpc-flow-log
* - vpc
* - vpc-peering-connection
* - vpn-connection
* - vpn-gateway
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifResourceTag(tagKey, value, operator) {
return this.if(`ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by the version of the instance metadata service for retrieving IAM role credentials for EC2
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifRoleDelivery(value, operator) {
return this.if(`RoleDelivery`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the root device type of the instance (ebs or instance-store)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssociateAddress()
* - .toAssociateIamInstanceProfile()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toCancelImageLaunchPermission()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshots()
* - .toCreateStoreImageTask()
* - .toCreateTags()
* - .toDeregisterImage()
* - .toDescribeImageAttribute()
* - .toDescribeInstanceAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDisableFastLaunch()
* - .toDisableImage()
* - .toDisableImageDeprecation()
* - .toDisableImageDeregistrationProtection()
* - .toDisassociateIamInstanceProfile()
* - .toEnableFastLaunch()
* - .toEnableImage()
* - .toEnableImageDeprecation()
* - .toEnableImageDeregistrationProtection()
* - .toExportImage()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toImportImage()
* - .toModifyFleet()
* - .toModifyImageAttribute()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toMonitorInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toReplaceIamInstanceProfileAssociation()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetImageAttribute()
* - .toResetInstanceAttribute()
* - .toRestoreImageFromRecycleBin()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - image
* - instance
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRootDeviceType(value, operator) {
return this.if(`RootDeviceType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a route table
*
* Applies to actions:
* - .toAssociateRouteTable()
* - .toCreateRoute()
* - .toCreateRouteTable()
* - .toCreateTags()
* - .toCreateVpcEndpoint()
* - .toDeleteRoute()
* - .toDeleteRouteTable()
* - .toDisableRouteServerPropagation()
* - .toDisableVgwRoutePropagation()
* - .toDisassociateRouteTable()
* - .toEnableRouteServerPropagation()
* - .toEnableVgwRoutePropagation()
* - .toGetRouteServerPropagations()
* - .toModifyVpcEndpoint()
* - .toReplaceRoute()
* - .toReplaceRouteTableAssociation()
*
* Applies to resource types:
* - route-table
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRouteTableID(value, operator) {
return this.if(`RouteTableID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the routing type for the VPN connection
*
* https://docs.aws.amazon.com/vpn/latest/s2svpn/vpn-authentication-access-control.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpnConnection()
* - .toModifyVpnConnection()
* - .toModifyVpnTunnelOptions()
*
* Applies to resource types:
* - vpn-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifRoutingType(value, operator) {
return this.if(`RoutingType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the IAM SAML identity provider
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateClientVpnTargetNetwork()
* - .toAuthorizeClientVpnIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateTags()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDisassociateClientVpnTargetNetwork()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toModifyClientVpnEndpoint()
* - .toRevokeClientVpnIngress()
* - .toTerminateClientVpnConnections()
*
* Applies to resource types:
* - client-vpn-endpoint
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifSamlProviderArn(value, operator) {
return this.if(`SamlProviderArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ID of a security group
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateSecurityGroupVpc()
* - .toAttachClassicLinkVpc()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateNetworkInterface()
* - .toCreateSecurityGroup()
* - .toCreateTags()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVpcEndpoint()
* - .toDeleteSecurityGroup()
* - .toDescribeSecurityGroupReferences()
* - .toDisassociateSecurityGroupVpc()
* - .toImportInstance()
* - .toModifyClientVpnEndpoint()
* - .toModifyInstanceAttribute()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifySecurityGroupRules()
* - .toModifyVpcEndpoint()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRevokeSecurityGroupEgress()
* - .toRevokeSecurityGroupIngress()
* - .toRunInstances()
* - .toUpdateSecurityGroupRuleDescriptionsEgress()
* - .toUpdateSecurityGroupRuleDescriptionsIngress()
*
* Applies to resource types:
* - security-group
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifSecurityGroupID(value, operator) {
return this.if(`SecurityGroupID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the server certificate
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateClientVpnTargetNetwork()
* - .toAuthorizeClientVpnIngress()
* - .toCreateClientVpnEndpoint()
* - .toCreateClientVpnRoute()
* - .toCreateTags()
* - .toDeleteClientVpnEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDescribeClientVpnConnections()
* - .toDescribeClientVpnRoutes()
* - .toDescribeClientVpnTargetNetworks()
* - .toDisassociateClientVpnTargetNetwork()
* - .toExportClientVpnClientCertificateRevocationList()
* - .toExportClientVpnClientConfiguration()
* - .toImportClientVpnClientCertificateRevocationList()
* - .toModifyClientVpnEndpoint()
* - .toRevokeClientVpnIngress()
* - .toTerminateClientVpnConnections()
*
* Applies to resource types:
* - client-vpn-endpoint
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifServerCertificateArn(value, operator) {
return this.if(`ServerCertificateArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the compliance mode cooling-off period
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toLockSnapshot()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifSnapshotCoolOffPeriod(value, operator) {
return this.if(`SnapshotCoolOffPeriod`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the ID of a snapshot
*
* Applies to actions:
* - .toCopySnapshot()
* - .toCreateImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toDeleteSnapshot()
* - .toDescribeSnapshotAttribute()
* - .toDisableFastSnapshotRestores()
* - .toEnableFastSnapshotRestores()
* - .toImportImage()
* - .toImportSnapshot()
* - .toLockSnapshot()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetSnapshotAttribute()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRunInstances()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifSnapshotID(value, operator) {
return this.if(`SnapshotID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the snapshot lock duration
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toLockSnapshot()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifSnapshotLockDuration(value, operator) {
return this.if(`SnapshotLockDuration`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the initiation time of a snapshot
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCopySnapshot()
* - .toCreateImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteSnapshot()
* - .toDescribeSnapshotAttribute()
* - .toDisableFastSnapshotRestores()
* - .toEnableFastSnapshotRestores()
* - .toImportImage()
* - .toImportSnapshot()
* - .toLockSnapshot()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetSnapshotAttribute()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRunInstances()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [date operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Date). **Default:** `DateEquals`
*/
ifSnapshotTime(value, operator) {
if (typeof value.getMonth === "function") {
value = value.toISOString();
}
else if (Array.isArray(value)) {
value = value.map((item) => {
if (typeof item.getMonth === "function") {
item = item.toISOString();
}
return item;
});
}
return this.if(`SnapshotTime`, value, operator ?? 'DateEquals');
}
/**
* Filters access by the name of the Availability Zone from which the request originated
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateSnapshot()
* - .toCreateSnapshots()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifSourceAvailabilityZone(value, operator) {
return this.if(`SourceAvailabilityZone`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of the Capacity Reservation from which you want to move capacity
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAssociateCapacityReservationBillingOwner()
* - .toCreateCapacityReservationBySplitting()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toMoveCapacityReservationInstances()
* - .toRejectCapacityReservationBillingOwnership()
*
* Applies to resource types:
* - capacity-reservation
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifSourceCapacityReservationId(value, operator) {
return this.if(`SourceCapacityReservationId`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the instance from which the request originated
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifSourceInstanceARN(value, operator) {
return this.if(`SourceInstanceARN`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the Outpost from which the request originated
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toCreateImage()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toDescribeSnapshotAttribute()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
*
* Applies to resource types:
* - snapshot
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifSourceOutpostArn(value, operator) {
return this.if(`SourceOutpostArn`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ARN of the subnet
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssociateAddress()
* - .toAttachNetworkInterface()
* - .toCreateFlowLogs()
* - .toCreateLocalGatewayRoute()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterfacePermission()
* - .toCreateTags()
* - .toCreateTrafficMirrorSession()
* - .toCreateVerifiedAccessEndpoint()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDetachNetworkInterface()
* - .toDisassociateAddress()
* - .toDisassociateNatGatewayAddress()
* - .toModifyLocalGatewayRoute()
* - .toModifyNetworkInterfaceAttribute()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRequestSpotInstances()
* - .toResetNetworkInterfaceAttribute()
* - .toRunInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
*
* Applies to resource types:
* - network-interface
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifSubnet(value, operator) {
return this.if(`Subnet`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ID of a subnet
*
* Applies to actions:
* - .toAssociateClientVpnTargetNetwork()
* - .toAssociateRouteTable()
* - .toAssociateSubnetCidrBlock()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toCreateClientVpnRoute()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateNatGateway()
* - .toCreateNetworkInterface()
* - .toCreateRouteServerEndpoint()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toDeleteClientVpnRoute()
* - .toDeleteInstanceConnectEndpoint()
* - .toDeleteSubnet()
* - .toDisassociateRouteTable()
* - .toDisassociateSubnetCidrBlock()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toImportInstance()
* - .toModifyFleet()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVerifiedAccessEndpoint()
* - .toModifyVpcEndpoint()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceRouteTableAssociation()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toRunInstances()
*
* Applies to resource types:
* - instance-connect-endpoint
* - subnet
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifSubnetID(value, operator) {
return this.if(`SubnetID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the tenancy of the VPC or instance (default, dedicated, or host)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAcceptCapacityReservationBillingOwnership()
* - .toAcceptVpcPeeringConnection()
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateAddress()
* - .toAssociateCapacityReservationBillingOwner()
* - .toAssociateDhcpOptions()
* - .toAssociateIamInstanceProfile()
* - .toAssociateRouteServer()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateVpcCidrBlock()
* - .toAttachClassicLinkVpc()
* - .toAttachInternetGateway()
* - .toAttachNetworkInterface()
* - .toAttachVolume()
* - .toAttachVpnGateway()
* - .toCreateCapacityReservation()
* - .toCreateCapacityReservationBySplitting()
* - .toCreateCarrierGateway()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateImage()
* - .toCreateInstanceExportTask()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateNetworkAcl()
* - .toCreateNetworkInsightsPath()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSnapshots()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcPeeringConnection()
* - .toDeleteVpc()
* - .toDescribeCapacityBlockExtensionOfferings()
* - .toDescribeInstanceAttribute()
* - .toDescribeVpcAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachInternetGateway()
* - .toDetachNetworkInterface()
* - .toDetachVolume()
* - .toDetachVpnGateway()
* - .toDisableVpcClassicLink()
* - .toDisableVpcClassicLinkDnsSupport()
* - .toDisassociateCapacityReservationBillingOwner()
* - .toDisassociateIamInstanceProfile()
* - .toDisassociateRouteServer()
* - .toDisassociateSecurityGroupVpc()
* - .toDisassociateVpcCidrBlock()
* - .toEnableVpcClassicLink()
* - .toEnableVpcClassicLinkDnsSupport()
* - .toGetConsoleOutput()
* - .toGetConsoleScreenshot()
* - .toGetInstanceTpmEkPub()
* - .toGetInstanceUefiData()
* - .toGetLaunchTemplateData()
* - .toGetPasswordData()
* - .toGetSecurityGroupsForVpc()
* - .toModifyClientVpnEndpoint()
* - .toModifyInstanceAttribute()
* - .toModifyInstanceCapacityReservationAttributes()
* - .toModifyInstanceCpuOptions()
* - .toModifyInstanceCreditSpecification()
* - .toModifyInstanceEventStartTime()
* - .toModifyInstanceMaintenanceOptions()
* - .toModifyInstanceMetadataOptions()
* - .toModifyInstanceNetworkPerformanceOptions()
* - .toModifyInstancePlacement()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifyPrivateDnsNameOptions()
* - .toModifyReservedInstances()
* - .toModifyVpcAttribute()
* - .toModifyVpcTenancy()
* - .toMonitorInstances()
* - .toMoveCapacityReservationInstances()
* - .toPauseVolumeIO()
* - .toRebootInstances()
* - .toRejectCapacityReservationBillingOwnership()
* - .toReplaceIamInstanceProfileAssociation()
* - .toResetInstanceAttribute()
* - .toRunInstances()
* - .toSendDiagnosticInterrupt()
* - .toSendSpotInstanceInterruptions()
* - .toStartInstances()
* - .toStopInstances()
* - .toTerminateInstances()
* - .toUnmonitorInstances()
*
* Applies to resource types:
* - capacity-reservation
* - carrier-gateway
* - instance
* - reserved-instances
* - vpc
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTenancy(value, operator) {
return this.if(`Tenancy`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a volume
*
* Applies to actions:
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteVolume()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toEnableVolumeIO()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyInstanceAttribute()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRunInstances()
*
* Applies to resource types:
* - volume
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVolumeID(value, operator) {
return this.if(`VolumeID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the the number of input/output operations per second (IOPS) provisioned for the volume
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteVolume()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toEnableVolumeIO()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyInstanceAttribute()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRunInstances()
*
* Applies to resource types:
* - volume
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifVolumeIops(value, operator) {
return this.if(`VolumeIops`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the size of the volume, in GiB
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAttachVolume()
* - .toCopySnapshot()
* - .toCreateFleet()
* - .toCreateImage()
* - .toCreateReplaceRootVolumeTask()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteSnapshot()
* - .toDeleteVolume()
* - .toDescribeSnapshotAttribute()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toDisableFastSnapshotRestores()
* - .toEnableFastSnapshotRestores()
* - .toEnableVolumeIO()
* - .toImportImage()
* - .toImportInstance()
* - .toImportSnapshot()
* - .toImportVolume()
* - .toLockSnapshot()
* - .toModifyInstanceAttribute()
* - .toModifySnapshotAttribute()
* - .toModifySnapshotTier()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRegisterImage()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetSnapshotAttribute()
* - .toRestoreSnapshotFromRecycleBin()
* - .toRestoreSnapshotTier()
* - .toRunInstances()
* - .toUnlockSnapshot()
*
* Applies to resource types:
* - snapshot
* - volume
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifVolumeSize(value, operator) {
return this.if(`VolumeSize`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the throughput of the volume, in MiBps
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteVolume()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toEnableVolumeIO()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyInstanceAttribute()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRunInstances()
*
* Applies to resource types:
* - volume
*
* @param value The value(s) to check
* @param operator Works with [numeric operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric). **Default:** `NumericEquals`
*/
ifVolumeThroughput(value, operator) {
return this.if(`VolumeThroughput`, value, operator ?? 'NumericEquals');
}
/**
* Filters access by the type of volume (gp2, gp3, io1, io2, st1, sc1, or standard)
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toAttachVolume()
* - .toCreateFleet()
* - .toCreateSnapshot()
* - .toCreateSnapshots()
* - .toCreateTags()
* - .toCreateVolume()
* - .toDeleteVolume()
* - .toDescribeVolumeAttribute()
* - .toDetachVolume()
* - .toEnableVolumeIO()
* - .toImportInstance()
* - .toImportVolume()
* - .toModifyInstanceAttribute()
* - .toModifyVolume()
* - .toModifyVolumeAttribute()
* - .toPauseVolumeIO()
* - .toRunInstances()
*
* Applies to resource types:
* - volume
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVolumeType(value, operator) {
return this.if(`VolumeType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ARN of the VPC
*
* https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html#amazon-ec2-keys
*
* Applies to actions:
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssignIpv6Addresses()
* - .toAssignPrivateIpAddresses()
* - .toAssociateAddress()
* - .toAssociateRouteTable()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateSubnetCidrBlock()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toAttachClassicLinkVpc()
* - .toAttachNetworkInterface()
* - .toAuthorizeSecurityGroupEgress()
* - .toAuthorizeSecurityGroupIngress()
* - .toCreateFleet()
* - .toCreateFlowLogs()
* - .toCreateInstanceConnectEndpoint()
* - .toCreateLocalGatewayRoute()
* - .toCreateNatGateway()
* - .toCreateNetworkAclEntry()
* - .toCreateNetworkInsightsPath()
* - .toCreateNetworkInterface()
* - .toCreateNetworkInterfacePermission()
* - .toCreateRoute()
* - .toCreateRouteServerEndpoint()
* - .toCreateTags()
* - .toCreateTrafficMirrorSession()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVerifiedAccessEndpoint()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toDeleteClientVpnRoute()
* - .toDeleteNetworkAcl()
* - .toDeleteNetworkAclEntry()
* - .toDeleteNetworkInterface()
* - .toDeleteNetworkInterfacePermission()
* - .toDeleteRoute()
* - .toDeleteRouteTable()
* - .toDeleteSecurityGroup()
* - .toDeleteSubnet()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDescribeSecurityGroupReferences()
* - .toDetachNetworkInterface()
* - .toDisableRouteServerPropagation()
* - .toDisableVgwRoutePropagation()
* - .toDisassociateAddress()
* - .toDisassociateNatGatewayAddress()
* - .toDisassociateRouteTable()
* - .toDisassociateSecurityGroupVpc()
* - .toDisassociateSubnetCidrBlock()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toEnableRouteServerPropagation()
* - .toEnableVgwRoutePropagation()
* - .toGetRouteServerPropagations()
* - .toImportInstance()
* - .toModifyClientVpnEndpoint()
* - .toModifyFleet()
* - .toModifyInstanceAttribute()
* - .toModifyLocalGatewayRoute()
* - .toModifyNetworkInterfaceAttribute()
* - .toModifySecurityGroupRules()
* - .toModifySpotFleetRequest()
* - .toModifySubnetAttribute()
* - .toModifyTransitGatewayVpcAttachment()
* - .toModifyVerifiedAccessEndpoint()
* - .toModifyVpcEndpoint()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toReplaceNetworkAclAssociation()
* - .toReplaceNetworkAclEntry()
* - .toReplaceRoute()
* - .toReplaceRouteTableAssociation()
* - .toRequestSpotFleet()
* - .toRequestSpotInstances()
* - .toResetNetworkInterfaceAttribute()
* - .toRevokeSecurityGroupEgress()
* - .toRevokeSecurityGroupIngress()
* - .toRunInstances()
* - .toUnassignIpv6Addresses()
* - .toUnassignPrivateIpAddresses()
* - .toUpdateSecurityGroupRuleDescriptionsEgress()
* - .toUpdateSecurityGroupRuleDescriptionsIngress()
*
* Applies to resource types:
* - carrier-gateway
* - network-acl
* - network-interface
* - route-table
* - security-group
* - subnet
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifVpc(value, operator) {
return this.if(`Vpc`, value, operator ?? 'ArnLike');
}
/**
* Filters access by the ID of a virtual private cloud (VPC)
*
* Applies to actions:
* - .toAcceptVpcPeeringConnection()
* - .toApplySecurityGroupsToClientVpnTargetNetwork()
* - .toAssociateDhcpOptions()
* - .toAssociateRouteServer()
* - .toAssociateSecurityGroupVpc()
* - .toAssociateVpcCidrBlock()
* - .toAttachClassicLinkVpc()
* - .toAttachInternetGateway()
* - .toAttachVpnGateway()
* - .toCreateCarrierGateway()
* - .toCreateClientVpnEndpoint()
* - .toCreateEgressOnlyInternetGateway()
* - .toCreateFlowLogs()
* - .toCreateLocalGatewayRouteTableVpcAssociation()
* - .toCreateNetworkAcl()
* - .toCreateRouteTable()
* - .toCreateSecurityGroup()
* - .toCreateSubnet()
* - .toCreateTags()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVpc()
* - .toCreateVpcBlockPublicAccessExclusion()
* - .toCreateVpcEndpoint()
* - .toCreateVpcPeeringConnection()
* - .toDeleteVpc()
* - .toDescribeVpcAttribute()
* - .toDetachClassicLinkVpc()
* - .toDetachInternetGateway()
* - .toDetachVpnGateway()
* - .toDisableVpcClassicLink()
* - .toDisableVpcClassicLinkDnsSupport()
* - .toDisassociateRouteServer()
* - .toDisassociateSecurityGroupVpc()
* - .toDisassociateVpcCidrBlock()
* - .toEnableVpcClassicLink()
* - .toEnableVpcClassicLinkDnsSupport()
* - .toGetSecurityGroupsForVpc()
* - .toModifyClientVpnEndpoint()
* - .toModifyVpcAttribute()
* - .toModifyVpcTenancy()
*
* Applies to resource types:
* - vpc
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpcID(value, operator) {
return this.if(`VpcID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a VPC peering connection
*
* Applies to actions:
* - .toAcceptVpcPeeringConnection()
* - .toCreateNetworkInsightsPath()
* - .toCreateTags()
* - .toCreateVpcPeeringConnection()
* - .toDeleteVpcPeeringConnection()
* - .toModifyVpcPeeringConnectionOptions()
* - .toRejectVpcPeeringConnection()
*
* Applies to resource types:
* - vpc-peering-connection
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpcPeeringConnectionID(value, operator) {
return this.if(`VpcPeeringConnectionID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the name of the VPC endpoint service
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-iam.html
*
* Applies to actions:
* - .toCreateTrafficMirrorTarget()
* - .toCreateVpcEndpoint()
* - .toDeleteVpcEndpoints()
*
* Applies to resource types:
* - vpc-endpoint
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpceServiceName(value, operator) {
return this.if(`VpceServiceName`, value, operator ?? 'StringLike');
}
/**
* Filters access by the service owner of the VPC endpoint service (amazon, aws-marketplace, or an AWS account ID)
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-iam.html
*
* Applies to actions:
* - .toCreateTrafficMirrorTarget()
* - .toCreateVpcEndpoint()
*
* Applies to resource types:
* - vpc-endpoint
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpceServiceOwner(value, operator) {
return this.if(`VpceServiceOwner`, value, operator ?? 'StringLike');
}
/**
* Filters access by the private DNS name of the VPC endpoint service
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-iam.html
*
* Applies to actions:
* - .toCreateVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServiceConfiguration()
*
* Applies to resource types:
* - vpc-endpoint-service
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpceServicePrivateDnsName(value, operator) {
return this.if(`VpceServicePrivateDnsName`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway attachment
*
* Applies to actions:
* - .toAcceptTransitGatewayMulticastDomainAssociations()
* - .toAcceptTransitGatewayPeeringAttachment()
* - .toAcceptTransitGatewayVpcAttachment()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toAssociateTransitGatewayPolicyTable()
* - .toAssociateTransitGatewayRouteTable()
* - .toCreateFlowLogs()
* - .toCreateTags()
* - .toCreateTransitGatewayConnect()
* - .toCreateTransitGatewayConnectPeer()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPrefixListReference()
* - .toCreateTransitGatewayRoute()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVpnConnection()
* - .toDeleteTransitGatewayConnect()
* - .toDeleteTransitGatewayPeeringAttachment()
* - .toDeleteTransitGatewayVpcAttachment()
* - .toDisableTransitGatewayRouteTablePropagation()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toDisassociateTransitGatewayPolicyTable()
* - .toDisassociateTransitGatewayRouteTable()
* - .toEnableTransitGatewayRouteTablePropagation()
* - .toModifyTransitGatewayPrefixListReference()
* - .toModifyTransitGatewayVpcAttachment()
* - .toRejectTransitGatewayMulticastDomainAssociations()
* - .toRejectTransitGatewayPeeringAttachment()
* - .toRejectTransitGatewayVpcAttachment()
* - .toReplaceTransitGatewayRoute()
*
* Applies to resource types:
* - transit-gateway-attachment
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayAttachmentId(value, operator) {
return this.if(`transitGatewayAttachmentId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway connect peer
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateTransitGatewayConnectPeer()
* - .toDeleteTransitGatewayConnectPeer()
*
* Applies to resource types:
* - transit-gateway-connect-peer
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayConnectPeerId(value, operator) {
return this.if(`transitGatewayConnectPeerId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway
*
* Applies to actions:
* - .toCreateFlowLogs()
* - .toCreateNetworkInsightsPath()
* - .toCreateTags()
* - .toCreateTransitGateway()
* - .toCreateTransitGatewayMulticastDomain()
* - .toCreateTransitGatewayPeeringAttachment()
* - .toCreateTransitGatewayPolicyTable()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayVpcAttachment()
* - .toCreateVpnConnection()
* - .toDeleteTransitGateway()
* - .toModifyTransitGateway()
*
* Applies to resource types:
* - transit-gateway
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayId(value, operator) {
return this.if(`transitGatewayId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway multicast domain
*
* Applies to actions:
* - .toAcceptTransitGatewayMulticastDomainAssociations()
* - .toAssociateTransitGatewayMulticastDomain()
* - .toCreateTags()
* - .toCreateTransitGatewayMulticastDomain()
* - .toDeleteTransitGatewayMulticastDomain()
* - .toDeregisterTransitGatewayMulticastGroupMembers()
* - .toDeregisterTransitGatewayMulticastGroupSources()
* - .toDisassociateTransitGatewayMulticastDomain()
* - .toGetTransitGatewayMulticastDomainAssociations()
* - .toRegisterTransitGatewayMulticastGroupMembers()
* - .toRegisterTransitGatewayMulticastGroupSources()
* - .toRejectTransitGatewayMulticastDomainAssociations()
* - .toSearchTransitGatewayMulticastGroups()
*
* Applies to resource types:
* - transit-gateway-multicast-domain
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayMulticastDomainId(value, operator) {
return this.if(`transitGatewayMulticastDomainId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway policy table
*
* Applies to actions:
* - .toAssociateTransitGatewayPolicyTable()
* - .toCreateTags()
* - .toCreateTransitGatewayPolicyTable()
* - .toDeleteTransitGatewayPolicyTable()
* - .toDisassociateTransitGatewayPolicyTable()
* - .toGetTransitGatewayPolicyTableAssociations()
* - .toGetTransitGatewayPolicyTableEntries()
*
* Applies to resource types:
* - transit-gateway-policy-table
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayPolicyTableId(value, operator) {
return this.if(`transitGatewayPolicyTableId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway route table announcement
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toDeleteTransitGatewayRouteTableAnnouncement()
* - .toDisableTransitGatewayRouteTablePropagation()
* - .toEnableTransitGatewayRouteTablePropagation()
*
* Applies to resource types:
* - transit-gateway-route-table-announcement
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayRouteTableAnnouncementId(value, operator) {
return this.if(`transitGatewayRouteTableAnnouncementId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the ID of a transit gateway route table
*
* Applies to actions:
* - .toAssociateTransitGatewayRouteTable()
* - .toCreateTags()
* - .toCreateTransitGatewayPrefixListReference()
* - .toCreateTransitGatewayRoute()
* - .toCreateTransitGatewayRouteTable()
* - .toCreateTransitGatewayRouteTableAnnouncement()
* - .toDeleteTransitGatewayPrefixListReference()
* - .toDeleteTransitGatewayRoute()
* - .toDeleteTransitGatewayRouteTable()
* - .toDisableTransitGatewayRouteTablePropagation()
* - .toDisassociateTransitGatewayRouteTable()
* - .toEnableTransitGatewayRouteTablePropagation()
* - .toModifyTransitGateway()
* - .toModifyTransitGatewayPrefixListReference()
* - .toReplaceTransitGatewayRoute()
* - .toSearchTransitGatewayRoutes()
*
* Applies to resource types:
* - transit-gateway-route-table
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifTransitGatewayRouteTableId(value, operator) {
return this.if(`transitGatewayRouteTableId`, value, operator ?? 'StringLike');
}
/**
* Filters access by multi region of the VPC endpoint service
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-iam.html
*
* Applies to actions:
* - .toAcceptVpcEndpointConnections()
* - .toCreateTags()
* - .toCreateVpcEndpointConnectionNotification()
* - .toCreateVpcEndpointServiceConfiguration()
* - .toDeleteVpcEndpointConnectionNotifications()
* - .toDeleteVpcEndpointServiceConfigurations()
* - .toDescribeVpcEndpointServicePermissions()
* - .toModifyVpcEndpointConnectionNotification()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toRejectVpcEndpointConnections()
* - .toStartVpcEndpointServicePrivateDnsVerification()
*
* Applies to resource types:
* - vpc-endpoint-service
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpceMultiRegion(value, operator) {
return this.if(`vpceMultiRegion`, value, operator ?? 'StringLike');
}
/**
* Filters access by the region of the VPC endpoint service
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-iam.html
*
* Applies to actions:
* - .toCreateTags()
* - .toCreateVpcEndpointConnectionNotification()
* - .toCreateVpcEndpointServiceConfiguration()
*
* Applies to resource types:
* - vpc-endpoint-service
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpceServiceRegion(value, operator) {
return this.if(`vpceServiceRegion`, value, operator ?? 'StringLike');
}
/**
* Filters access by the supported region of the VPC endpoint service
*
* https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-iam.html
*
* Applies to actions:
* - .toAcceptVpcEndpointConnections()
* - .toCreateTags()
* - .toDeleteVpcEndpointConnectionNotifications()
* - .toDeleteVpcEndpointServiceConfigurations()
* - .toDescribeVpcEndpointServicePermissions()
* - .toModifyVpcEndpointConnectionNotification()
* - .toModifyVpcEndpointServiceConfiguration()
* - .toModifyVpcEndpointServicePayerResponsibility()
* - .toModifyVpcEndpointServicePermissions()
* - .toRejectVpcEndpointConnections()
* - .toStartVpcEndpointServicePrivateDnsVerification()
*
* Applies to resource types:
* - vpc-endpoint-service
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifVpceSupportedRegion(value, operator) {
return this.if(`vpceSupportedRegion`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [ec2](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'ec2';
this.accessLevelList = {
Write: [
'AcceptAddressTransfer',
'AcceptCapacityReservationBillingOwnership',
'AcceptReservedInstancesExchangeQuote',
'AcceptTransitGatewayMulticastDomainAssociations',
'AcceptTransitGatewayPeeringAttachment',
'AcceptTransitGatewayVpcAttachment',
'AcceptVpcEndpointConnections',
'AcceptVpcPeeringConnection',
'AdvertiseByoipCidr',
'AllocateAddress',
'AllocateHosts',
'AllocateIpamPoolCidr',
'ApplySecurityGroupsToClientVpnTargetNetwork',
'AssignIpv6Addresses',
'AssignPrivateIpAddresses',
'AssignPrivateNatGatewayAddress',
'AssociateAddress',
'AssociateCapacityReservationBillingOwner',
'AssociateClientVpnTargetNetwork',
'AssociateDhcpOptions',
'AssociateEnclaveCertificateIamRole',
'AssociateIamInstanceProfile',
'AssociateInstanceEventWindow',
'AssociateIpamByoasn',
'AssociateIpamResourceDiscovery',
'AssociateNatGatewayAddress',
'AssociateRouteServer',
'AssociateRouteTable',
'AssociateSecurityGroupVpc',
'AssociateSubnetCidrBlock',
'AssociateTransitGatewayMulticastDomain',
'AssociateTransitGatewayPolicyTable',
'AssociateTransitGatewayRouteTable',
'AssociateTrunkInterface',
'AssociateVerifiedAccessInstanceWebAcl',
'AssociateVpcCidrBlock',
'AttachClassicLinkVpc',
'AttachInternetGateway',
'AttachNetworkInterface',
'AttachVerifiedAccessTrustProvider',
'AttachVolume',
'AttachVpnGateway',
'AuthorizeClientVpnIngress',
'AuthorizeSecurityGroupEgress',
'AuthorizeSecurityGroupIngress',
'BundleInstance',
'CancelBundleTask',
'CancelCapacityReservation',
'CancelCapacityReservationFleets',
'CancelConversionTask',
'CancelDeclarativePoliciesReport',
'CancelExportTask',
'CancelImageLaunchPermission',
'CancelImportTask',
'CancelReservedInstancesListing',
'CancelSpotFleetRequests',
'CancelSpotInstanceRequests',
'ConfirmProductInstance',
'CopyFpgaImage',
'CopyImage',
'CopySnapshot',
'CreateCapacityReservation',
'CreateCapacityReservationBySplitting',
'CreateCapacityReservationFleet',
'CreateCarrierGateway',
'CreateClientVpnEndpoint',
'CreateClientVpnRoute',
'CreateCoipCidr',
'CreateCoipPool',
'CreateCoipPoolPermission',
'CreateCustomerGateway',
'CreateDefaultSubnet',
'CreateDefaultVpc',
'CreateDhcpOptions',
'CreateEgressOnlyInternetGateway',
'CreateFleet',
'CreateFlowLogs',
'CreateFpgaImage',
'CreateImage',
'CreateInstanceConnectEndpoint',
'CreateInstanceEventWindow',
'CreateInstanceExportTask',
'CreateInternetGateway',
'CreateIpam',
'CreateIpamExternalResourceVerificationToken',
'CreateIpamPool',
'CreateIpamResourceDiscovery',
'CreateIpamScope',
'CreateKeyPair',
'CreateLaunchTemplate',
'CreateLaunchTemplateVersion',
'CreateLocalGatewayRoute',
'CreateLocalGatewayRouteTable',
'CreateLocalGatewayRouteTablePermission',
'CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation',
'CreateLocalGatewayRouteTableVpcAssociation',
'CreateLocalGatewayVirtualInterface',
'CreateLocalGatewayVirtualInterfaceGroup',
'CreateManagedPrefixList',
'CreateNatGateway',
'CreateNetworkAcl',
'CreateNetworkAclEntry',
'CreateNetworkInsightsAccessScope',
'CreateNetworkInsightsPath',
'CreateNetworkInterface',
'CreatePlacementGroup',
'CreatePublicIpv4Pool',
'CreateReplaceRootVolumeTask',
'CreateReservedInstancesListing',
'CreateRestoreImageTask',
'CreateRoute',
'CreateRouteServer',
'CreateRouteServerEndpoint',
'CreateRouteServerPeer',
'CreateRouteTable',
'CreateSecurityGroup',
'CreateSnapshot',
'CreateSnapshots',
'CreateSpotDatafeedSubscription',
'CreateStoreImageTask',
'CreateSubnet',
'CreateSubnetCidrReservation',
'CreateTrafficMirrorFilter',
'CreateTrafficMirrorFilterRule',
'CreateTrafficMirrorSession',
'CreateTrafficMirrorTarget',
'CreateTransitGateway',
'CreateTransitGatewayConnect',
'CreateTransitGatewayConnectPeer',
'CreateTransitGatewayMulticastDomain',
'CreateTransitGatewayPeeringAttachment',
'CreateTransitGatewayPolicyTable',
'CreateTransitGatewayPrefixListReference',
'CreateTransitGatewayRoute',
'CreateTransitGatewayRouteTable',
'CreateTransitGatewayRouteTableAnnouncement',
'CreateTransitGatewayVpcAttachment',
'CreateVerifiedAccessEndpoint',
'CreateVerifiedAccessGroup',
'CreateVerifiedAccessInstance',
'CreateVerifiedAccessTrustProvider',
'CreateVolume',
'CreateVpc',
'CreateVpcBlockPublicAccessExclusion',
'CreateVpcEndpoint',
'CreateVpcEndpointConnectionNotification',
'CreateVpcEndpointServiceConfiguration',
'CreateVpcPeeringConnection',
'CreateVpnConnection',
'CreateVpnConnectionRoute',
'CreateVpnGateway',
'DeleteCarrierGateway',
'DeleteClientVpnEndpoint',
'DeleteClientVpnRoute',
'DeleteCoipCidr',
'DeleteCoipPool',
'DeleteCoipPoolPermission',
'DeleteCustomerGateway',
'DeleteDhcpOptions',
'DeleteEgressOnlyInternetGateway',
'DeleteFleets',
'DeleteFlowLogs',
'DeleteFpgaImage',
'DeleteInstanceConnectEndpoint',
'DeleteInstanceEventWindow',
'DeleteInternetGateway',
'DeleteIpam',
'DeleteIpamExternalResourceVerificationToken',
'DeleteIpamPool',
'DeleteIpamResourceDiscovery',
'DeleteIpamScope',
'DeleteKeyPair',
'DeleteLaunchTemplate',
'DeleteLaunchTemplateVersions',
'DeleteLocalGatewayRoute',
'DeleteLocalGatewayRouteTable',
'DeleteLocalGatewayRouteTablePermission',
'DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation',
'DeleteLocalGatewayRouteTableVpcAssociation',
'DeleteLocalGatewayVirtualInterface',
'DeleteLocalGatewayVirtualInterfaceGroup',
'DeleteManagedPrefixList',
'DeleteNatGateway',
'DeleteNetworkAcl',
'DeleteNetworkAclEntry',
'DeleteNetworkInsightsAccessScope',
'DeleteNetworkInsightsAccessScopeAnalysis',
'DeleteNetworkInsightsAnalysis',
'DeleteNetworkInsightsPath',
'DeleteNetworkInterface',
'DeletePlacementGroup',
'DeletePublicIpv4Pool',
'DeleteQueuedReservedInstances',
'DeleteResourcePolicy',
'DeleteRoute',
'DeleteRouteServer',
'DeleteRouteServerEndpoint',
'DeleteRouteServerPeer',
'DeleteRouteTable',
'DeleteSecurityGroup',
'DeleteSnapshot',
'DeleteSpotDatafeedSubscription',
'DeleteSubnet',
'DeleteSubnetCidrReservation',
'DeleteTrafficMirrorFilter',
'DeleteTrafficMirrorFilterRule',
'DeleteTrafficMirrorSession',
'DeleteTrafficMirrorTarget',
'DeleteTransitGateway',
'DeleteTransitGatewayConnect',
'DeleteTransitGatewayConnectPeer',
'DeleteTransitGatewayMulticastDomain',
'DeleteTransitGatewayPeeringAttachment',
'DeleteTransitGatewayPolicyTable',
'DeleteTransitGatewayPrefixListReference',
'DeleteTransitGatewayRoute',
'DeleteTransitGatewayRouteTable',
'DeleteTransitGatewayRouteTableAnnouncement',
'DeleteTransitGatewayVpcAttachment',
'DeleteVerifiedAccessEndpoint',
'DeleteVerifiedAccessGroup',
'DeleteVerifiedAccessInstance',
'DeleteVerifiedAccessTrustProvider',
'DeleteVolume',
'DeleteVpc',
'DeleteVpcBlockPublicAccessExclusion',
'DeleteVpcEndpointConnectionNotifications',
'DeleteVpcEndpointServiceConfigurations',
'DeleteVpcEndpoints',
'DeleteVpcPeeringConnection',
'DeleteVpnConnection',
'DeleteVpnConnectionRoute',
'DeleteVpnGateway',
'DeprovisionByoipCidr',
'DeprovisionIpamByoasn',
'DeprovisionIpamPoolCidr',
'DeprovisionPublicIpv4PoolCidr',
'DeregisterImage',
'DeregisterInstanceEventNotificationAttributes',
'DeregisterTransitGatewayMulticastGroupMembers',
'DeregisterTransitGatewayMulticastGroupSources',
'DetachClassicLinkVpc',
'DetachInternetGateway',
'DetachNetworkInterface',
'DetachVerifiedAccessTrustProvider',
'DetachVolume',
'DetachVpnGateway',
'DisableAddressTransfer',
'DisableAllowedImagesSettings',
'DisableAwsNetworkPerformanceMetricSubscription',
'DisableEbsEncryptionByDefault',
'DisableFastLaunch',
'DisableFastSnapshotRestores',
'DisableImage',
'DisableImageBlockPublicAccess',
'DisableImageDeprecation',
'DisableImageDeregistrationProtection',
'DisableIpamOrganizationAdminAccount',
'DisableRouteServerPropagation',
'DisableSerialConsoleAccess',
'DisableSnapshotBlockPublicAccess',
'DisableTransitGatewayRouteTablePropagation',
'DisableVgwRoutePropagation',
'DisableVpcClassicLink',
'DisableVpcClassicLinkDnsSupport',
'DisassociateAddress',
'DisassociateCapacityReservationBillingOwner',
'DisassociateClientVpnTargetNetwork',
'DisassociateEnclaveCertificateIamRole',
'DisassociateIamInstanceProfile',
'DisassociateInstanceEventWindow',
'DisassociateIpamByoasn',
'DisassociateIpamResourceDiscovery',
'DisassociateNatGatewayAddress',
'DisassociateRouteServer',
'DisassociateRouteTable',
'DisassociateSecurityGroupVpc',
'DisassociateSubnetCidrBlock',
'DisassociateTransitGatewayMulticastDomain',
'DisassociateTransitGatewayPolicyTable',
'DisassociateTransitGatewayRouteTable',
'DisassociateTrunkInterface',
'DisassociateVerifiedAccessInstanceWebAcl',
'DisassociateVpcCidrBlock',
'EnableAddressTransfer',
'EnableAllowedImagesSettings',
'EnableAwsNetworkPerformanceMetricSubscription',
'EnableEbsEncryptionByDefault',
'EnableFastLaunch',
'EnableFastSnapshotRestores',
'EnableImage',
'EnableImageBlockPublicAccess',
'EnableImageDeprecation',
'EnableImageDeregistrationProtection',
'EnableIpamOrganizationAdminAccount',
'EnableReachabilityAnalyzerOrganizationSharing',
'EnableRouteServerPropagation',
'EnableSerialConsoleAccess',
'EnableSnapshotBlockPublicAccess',
'EnableTransitGatewayRouteTablePropagation',
'EnableVgwRoutePropagation',
'EnableVolumeIO',
'EnableVpcClassicLink',
'EnableVpcClassicLinkDnsSupport',
'ExportImage',
'ExportTransitGatewayRoutes',
'ImportByoipCidrToIpam',
'ImportClientVpnClientCertificateRevocationList',
'ImportImage',
'ImportInstance',
'ImportKeyPair',
'ImportSnapshot',
'ImportVolume',
'InjectApiError',
'LockSnapshot',
'ModifyAddressAttribute',
'ModifyAvailabilityZoneGroup',
'ModifyCapacityReservation',
'ModifyCapacityReservationFleet',
'ModifyClientVpnEndpoint',
'ModifyDefaultCreditSpecification',
'ModifyEbsDefaultKmsKeyId',
'ModifyFleet',
'ModifyFpgaImageAttribute',
'ModifyHosts',
'ModifyIdFormat',
'ModifyIdentityIdFormat',
'ModifyImageAttribute',
'ModifyInstanceAttribute',
'ModifyInstanceCapacityReservationAttributes',
'ModifyInstanceCpuOptions',
'ModifyInstanceCreditSpecification',
'ModifyInstanceEventStartTime',
'ModifyInstanceEventWindow',
'ModifyInstanceMaintenanceOptions',
'ModifyInstanceMetadataDefaults',
'ModifyInstanceMetadataOptions',
'ModifyInstanceNetworkPerformanceOptions',
'ModifyInstancePlacement',
'ModifyIpam',
'ModifyIpamPool',
'ModifyIpamResourceCidr',
'ModifyIpamResourceDiscovery',
'ModifyIpamScope',
'ModifyLaunchTemplate',
'ModifyLocalGatewayRoute',
'ModifyManagedPrefixList',
'ModifyNetworkInterfaceAttribute',
'ModifyPrivateDnsNameOptions',
'ModifyReservedInstances',
'ModifyRouteServer',
'ModifySecurityGroupRules',
'ModifySnapshotTier',
'ModifySpotFleetRequest',
'ModifySubnetAttribute',
'ModifyTrafficMirrorFilterNetworkServices',
'ModifyTrafficMirrorFilterRule',
'ModifyTrafficMirrorSession',
'ModifyTransitGateway',
'ModifyTransitGatewayPrefixListReference',
'ModifyTransitGatewayVpcAttachment',
'ModifyVerifiedAccessEndpoint',
'ModifyVerifiedAccessEndpointPolicy',
'ModifyVerifiedAccessGroup',
'ModifyVerifiedAccessGroupPolicy',
'ModifyVerifiedAccessInstance',
'ModifyVerifiedAccessInstanceLoggingConfiguration',
'ModifyVerifiedAccessTrustProvider',
'ModifyVolume',
'ModifyVolumeAttribute',
'ModifyVpcAttribute',
'ModifyVpcBlockPublicAccessExclusion',
'ModifyVpcBlockPublicAccessOptions',
'ModifyVpcEndpoint',
'ModifyVpcEndpointConnectionNotification',
'ModifyVpcEndpointServiceConfiguration',
'ModifyVpcEndpointServicePayerResponsibility',
'ModifyVpcPeeringConnectionOptions',
'ModifyVpcTenancy',
'ModifyVpnConnection',
'ModifyVpnConnectionOptions',
'ModifyVpnTunnelCertificate',
'ModifyVpnTunnelOptions',
'MonitorInstances',
'MoveAddressToVpc',
'MoveByoipCidrToIpam',
'MoveCapacityReservationInstances',
'PauseVolumeIO',
'ProvisionByoipCidr',
'ProvisionIpamByoasn',
'ProvisionIpamPoolCidr',
'ProvisionPublicIpv4PoolCidr',
'PurchaseCapacityBlock',
'PurchaseCapacityBlockExtension',
'PurchaseHostReservation',
'PurchaseReservedInstancesOffering',
'PurchaseScheduledInstances',
'PutResourcePolicy',
'RebootInstances',
'RegisterImage',
'RegisterInstanceEventNotificationAttributes',
'RegisterTransitGatewayMulticastGroupMembers',
'RegisterTransitGatewayMulticastGroupSources',
'RejectCapacityReservationBillingOwnership',
'RejectTransitGatewayMulticastDomainAssociations',
'RejectTransitGatewayPeeringAttachment',
'RejectTransitGatewayVpcAttachment',
'RejectVpcEndpointConnections',
'RejectVpcPeeringConnection',
'ReleaseAddress',
'ReleaseHosts',
'ReleaseIpamPoolAllocation',
'ReplaceIamInstanceProfileAssociation',
'ReplaceImageCriteriaInAllowedImagesSettings',
'ReplaceNetworkAclAssociation',
'ReplaceNetworkAclEntry',
'ReplaceRoute',
'ReplaceRouteTableAssociation',
'ReplaceTransitGatewayRoute',
'ReplaceVpnTunnel',
'ReportInstanceStatus',
'RequestSpotFleet',
'RequestSpotInstances',
'ResetAddressAttribute',
'ResetEbsDefaultKmsKeyId',
'ResetFpgaImageAttribute',
'ResetImageAttribute',
'ResetInstanceAttribute',
'ResetNetworkInterfaceAttribute',
'RestoreAddressToClassic',
'RestoreImageFromRecycleBin',
'RestoreManagedPrefixListVersion',
'RestoreSnapshotFromRecycleBin',
'RestoreSnapshotTier',
'RevokeClientVpnIngress',
'RevokeSecurityGroupEgress',
'RevokeSecurityGroupIngress',
'RunInstances',
'RunScheduledInstances',
'SendDiagnosticInterrupt',
'SendSpotInstanceInterruptions',
'StartInstances',
'StartNetworkInsightsAccessScopeAnalysis',
'StartNetworkInsightsAnalysis',
'StartVpcEndpointServicePrivateDnsVerification',
'StopInstances',
'TerminateClientVpnConnections',
'TerminateInstances',
'UnassignIpv6Addresses',
'UnassignPrivateIpAddresses',
'UnassignPrivateNatGatewayAddress',
'UnlockSnapshot',
'UnmonitorInstances',
'UpdateSecurityGroupRuleDescriptionsEgress',
'UpdateSecurityGroupRuleDescriptionsIngress',
'WithdrawByoipCidr'
],
'Permissions management': [
'CreateNetworkInterfacePermission',
'DeleteNetworkInterfacePermission',
'ModifySnapshotAttribute',
'ModifyVpcEndpointServicePermissions',
'ResetSnapshotAttribute'
],
Tagging: [
'CreateTags',
'DeleteTags'
],
List: [
'DescribeAccountAttributes',
'DescribeAddressTransfers',
'DescribeAddresses',
'DescribeAddressesAttribute',
'DescribeAggregateIdFormat',
'DescribeAvailabilityZones',
'DescribeAwsNetworkPerformanceMetricSubscriptions',
'DescribeBundleTasks',
'DescribeByoipCidrs',
'DescribeCapacityBlockExtensionHistory',
'DescribeCapacityBlockExtensionOfferings',
'DescribeCapacityBlockOfferings',
'DescribeCapacityReservationBillingRequests',
'DescribeCapacityReservationFleets',
'DescribeCapacityReservations',
'DescribeCarrierGateways',
'DescribeClassicLinkInstances',
'DescribeClientVpnAuthorizationRules',
'DescribeClientVpnConnections',
'DescribeClientVpnEndpoints',
'DescribeClientVpnRoutes',
'DescribeClientVpnTargetNetworks',
'DescribeCoipPools',
'DescribeConversionTasks',
'DescribeCustomerGateways',
'DescribeDeclarativePoliciesReports',
'DescribeDhcpOptions',
'DescribeEgressOnlyInternetGateways',
'DescribeElasticGpus',
'DescribeExportImageTasks',
'DescribeExportTasks',
'DescribeFastLaunchImages',
'DescribeFastSnapshotRestores',
'DescribeFleetHistory',
'DescribeFleetInstances',
'DescribeFleets',
'DescribeFlowLogs',
'DescribeFpgaImageAttribute',
'DescribeFpgaImages',
'DescribeHostReservationOfferings',
'DescribeHostReservations',
'DescribeHosts',
'DescribeIamInstanceProfileAssociations',
'DescribeIdFormat',
'DescribeIdentityIdFormat',
'DescribeImageAttribute',
'DescribeImages',
'DescribeImportImageTasks',
'DescribeImportSnapshotTasks',
'DescribeInstanceAttribute',
'DescribeInstanceConnectEndpoints',
'DescribeInstanceCreditSpecifications',
'DescribeInstanceEventNotificationAttributes',
'DescribeInstanceEventWindows',
'DescribeInstanceImageMetadata',
'DescribeInstanceStatus',
'DescribeInstanceTopology',
'DescribeInstanceTypeOfferings',
'DescribeInstanceTypes',
'DescribeInstances',
'DescribeInternetGateways',
'DescribeIpamByoasn',
'DescribeIpamExternalResourceVerificationTokens',
'DescribeIpamPools',
'DescribeIpamResourceDiscoveries',
'DescribeIpamResourceDiscoveryAssociations',
'DescribeIpamScopes',
'DescribeIpams',
'DescribeIpv6Pools',
'DescribeKeyPairs',
'DescribeLaunchTemplateVersions',
'DescribeLaunchTemplates',
'DescribeLocalGatewayRouteTablePermissions',
'DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations',
'DescribeLocalGatewayRouteTableVpcAssociations',
'DescribeLocalGatewayRouteTables',
'DescribeLocalGatewayVirtualInterfaceGroups',
'DescribeLocalGatewayVirtualInterfaces',
'DescribeLocalGateways',
'DescribeLockedSnapshots',
'DescribeMacHosts',
'DescribeManagedPrefixLists',
'DescribeMovingAddresses',
'DescribeNatGateways',
'DescribeNetworkAcls',
'DescribeNetworkInsightsAccessScopeAnalyses',
'DescribeNetworkInsightsAccessScopes',
'DescribeNetworkInsightsAnalyses',
'DescribeNetworkInsightsPaths',
'DescribeNetworkInterfaceAttribute',
'DescribeNetworkInterfacePermissions',
'DescribeNetworkInterfaces',
'DescribeOutpostLags',
'DescribePlacementGroups',
'DescribePrefixLists',
'DescribePrincipalIdFormat',
'DescribePublicIpv4Pools',
'DescribeRegions',
'DescribeReplaceRootVolumeTasks',
'DescribeReservedInstances',
'DescribeReservedInstancesListings',
'DescribeReservedInstancesModifications',
'DescribeReservedInstancesOfferings',
'DescribeRouteServerEndpoints',
'DescribeRouteServerPeers',
'DescribeRouteServers',
'DescribeRouteTables',
'DescribeScheduledInstanceAvailability',
'DescribeScheduledInstances',
'DescribeSecurityGroupReferences',
'DescribeSecurityGroupRules',
'DescribeSecurityGroupVpcAssociations',
'DescribeSecurityGroups',
'DescribeServiceLinkVirtualInterfaces',
'DescribeSnapshotAttribute',
'DescribeSnapshotTierStatus',
'DescribeSnapshots',
'DescribeSpotDatafeedSubscription',
'DescribeSpotFleetInstances',
'DescribeSpotFleetRequestHistory',
'DescribeSpotFleetRequests',
'DescribeSpotInstanceRequests',
'DescribeSpotPriceHistory',
'DescribeStaleSecurityGroups',
'DescribeStoreImageTasks',
'DescribeSubnets',
'DescribeTags',
'DescribeTrafficMirrorFilterRules',
'DescribeTrafficMirrorFilters',
'DescribeTrafficMirrorSessions',
'DescribeTrafficMirrorTargets',
'DescribeTransitGatewayAttachments',
'DescribeTransitGatewayConnectPeers',
'DescribeTransitGatewayConnects',
'DescribeTransitGatewayMulticastDomains',
'DescribeTransitGatewayPeeringAttachments',
'DescribeTransitGatewayPolicyTables',
'DescribeTransitGatewayRouteTableAnnouncements',
'DescribeTransitGatewayRouteTables',
'DescribeTransitGatewayVpcAttachments',
'DescribeTransitGateways',
'DescribeTrunkInterfaceAssociations',
'DescribeVerifiedAccessEndpoints',
'DescribeVerifiedAccessGroups',
'DescribeVerifiedAccessInstanceLoggingConfigurations',
'DescribeVerifiedAccessInstanceWebAclAssociations',
'DescribeVerifiedAccessInstances',
'DescribeVerifiedAccessTrustProviders',
'DescribeVolumeAttribute',
'DescribeVolumeStatus',
'DescribeVolumes',
'DescribeVolumesModifications',
'DescribeVpcAttribute',
'DescribeVpcBlockPublicAccessExclusions',
'DescribeVpcBlockPublicAccessOptions',
'DescribeVpcClassicLink',
'DescribeVpcClassicLinkDnsSupport',
'DescribeVpcEndpointAssociations',
'DescribeVpcEndpointConnectionNotifications',
'DescribeVpcEndpointConnections',
'DescribeVpcEndpointServiceConfigurations',
'DescribeVpcEndpointServicePermissions',
'DescribeVpcEndpointServices',
'DescribeVpcEndpoints',
'DescribeVpcPeeringConnections',
'DescribeVpcs',
'DescribeVpnConnections',
'DescribeVpnGateways',
'GetGroupsForCapacityReservation',
'GetInstanceMetadataDefaults',
'GetInstanceTypesFromInstanceRequirements',
'GetIpamPoolAllocations',
'GetTransitGatewayAttachmentPropagations',
'GetTransitGatewayMulticastDomainAssociations',
'GetTransitGatewayPolicyTableAssociations',
'GetTransitGatewayPolicyTableEntries',
'GetTransitGatewayPrefixListReferences',
'GetTransitGatewayRouteTableAssociations',
'GetTransitGatewayRouteTablePropagations',
'GetVerifiedAccessEndpointPolicy',
'GetVerifiedAccessEndpointTargets',
'GetVerifiedAccessGroupPolicy',
'GetVerifiedAccessInstanceWebAcl',
'GetVpnConnectionDeviceSampleConfiguration',
'GetVpnConnectionDeviceTypes',
'GetVpnTunnelReplacementStatus',
'ListImagesInRecycleBin',
'ListSnapshotsInRecycleBin',
'SearchLocalGatewayRoutes',
'SearchTransitGatewayMulticastGroups',
'SearchTransitGatewayRoutes'
],
Read: [
'ExportClientVpnClientCertificateRevocationList',
'ExportClientVpnClientConfiguration',
'ExportVerifiedAccessInstanceClientConfiguration',
'GetAllowedImagesSettings',
'GetAssociatedEnclaveCertificateIamRoles',
'GetAssociatedIpv6PoolCidrs',
'GetAwsNetworkPerformanceData',
'GetCapacityReservationUsage',
'GetCoipPoolUsage',
'GetConsoleOutput',
'GetConsoleScreenshot',
'GetDeclarativePoliciesReportSummary',
'GetDefaultCreditSpecification',
'GetEbsDefaultKmsKeyId',
'GetEbsEncryptionByDefault',
'GetFlowLogsIntegrationTemplate',
'GetHostReservationPurchasePreview',
'GetImageBlockPublicAccessState',
'GetInstanceTpmEkPub',
'GetInstanceUefiData',
'GetIpamAddressHistory',
'GetIpamDiscoveredAccounts',
'GetIpamDiscoveredPublicAddresses',
'GetIpamDiscoveredResourceCidrs',
'GetIpamPoolCidrs',
'GetIpamResourceCidrs',
'GetLaunchTemplateData',
'GetManagedPrefixListAssociations',
'GetManagedPrefixListEntries',
'GetNetworkInsightsAccessScopeAnalysisFindings',
'GetNetworkInsightsAccessScopeContent',
'GetPasswordData',
'GetReservedInstancesExchangeQuote',
'GetResourcePolicy',
'GetRouteServerAssociations',
'GetRouteServerPropagations',
'GetRouteServerRoutingDatabase',
'GetSecurityGroupsForVpc',
'GetSerialConsoleAccessStatus',
'GetSnapshotBlockPublicAccessState',
'GetSpotPlacementScores',
'GetSubnetCidrReservations',
'StartDeclarativePoliciesReport'
]
};
}
}
exports.Ec2 = Ec2;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWMyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsd0JBQWU7SUFHdEM7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSwyQ0FBMkM7UUFDaEQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLHNDQUFzQztRQUMzQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksaURBQWlEO1FBQ3RELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSx1Q0FBdUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLG1DQUFtQztRQUN4QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksOEJBQThCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLG9CQUFvQjtRQUN6QixPQUFP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TUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F3Qkc7SUFDSSxpQkFBaUIsQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQzdFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLFVBQVUsQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxlQUFlLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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O2dCQUN6Qyw0QkFBNEI7Z0JBQzVCLDhCQUE4QjtnQkFDOUIsNkJBQTZCO2dCQUM3QixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsc0JBQXNCO2dCQUN0QixxQ0FBcUM7Z0JBQ3JDLCtCQUErQjtnQkFDL0IsdUJBQXVCO2dCQUN2QiwyQkFBMkI7Z0JBQzNCLGdDQUFnQztnQkFDaEMsbUNBQW1DO2dCQUNuQyxnQ0FBZ0M7Z0JBQ2hDLHFCQUFxQjtnQkFDckIscUJBQXFCO2dCQUNyQix1QkFBdUI7Z0JBQ3ZCLDJCQUEyQjtnQkFDM0Isa0NBQWtDO2dCQUNsQyxnQ0FBZ0M7Z0JBQ2hDLGtCQUFrQjtnQkFDbEIsc0JBQXNCO2dCQUN0Qix1QkFBdUI7Z0JBQ3ZCLGtDQUFrQztnQkFDbEMsNkJBQTZCO2dCQUM3QiwrQ0FBK0M7Z0JBQy9DLHNDQUFzQztnQkFDdEMsaUJBQWlCO2dCQUNqQixtQ0FBbUM7Z0JBQ25DLG1CQUFtQjtnQkFDbkIsNEJBQTRCO2dCQUM1Qiw0QkFBNEI7Z0JBQzVCLCtCQUErQjtnQkFDL0IseUJBQXlCO2dCQUN6Qiw4QkFBOEI7Z0JBQzlCLG1DQUFtQztnQkFDbkMsd0JBQXdCO2dCQUN4QiwyQkFBMkI7Z0JBQzNCLGdDQUFnQzthQUNqQztTQUNGLENBQUM7SUFzNVJGLENBQUM7Q0FDRjtBQXgrbUJELGtCQXcrbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtlYzJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2FtYXpvbmVjMi5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIEVjMiBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ2VjMic7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjY2VwdCBhbiBFbGFzdGljIElQIGFkZHJlc3MgdHJhbnNmZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWNjZXB0QWRkcmVzc1RyYW5zZmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdEFkZHJlc3NUcmFuc2ZlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXB0QWRkcmVzc1RyYW5zZmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWNjZXB0IGFzc2lnbiBiaWxsaW5nIG9mIHRoZSBhdmFpbGFibGUgY2FwYWNpdHkgb2YgYSBzaGFyZWQgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gdG8gdGhlIGNhbGxpbmcgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhY2NlcHQgYSBDb252ZXJ0aWJsZSBSZXNlcnZlZCBJbnN0YW5jZSBleGNoYW5nZSBxdW90ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BY2NlcHRSZXNlcnZlZEluc3RhbmNlc0V4Y2hhbmdlUXVvdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWNjZXB0UmVzZXJ2ZWRJbnN0YW5jZXNFeGNoYW5nZVF1b3RlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBY2NlcHRSZXNlcnZlZEluc3RhbmNlc0V4Y2hhbmdlUXVvdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhY2NlcHQgYSByZXF1ZXN0IHRvIGFzc29jaWF0ZSBzdWJuZXRzIHdpdGggYSB0cmFuc2l0IGdhdGV3YXkgbXVsdGljYXN0IGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BY2NlcHRUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbkFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BY2NlcHRUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbkFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXB0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhY2NlcHQgYSB0cmFuc2l0IGdhdGV3YXkgcGVlcmluZyBhdHRhY2htZW50IHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWNjZXB0VHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BY2NlcHRUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBY2NlcHRUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWNjZXB0IGEgcmVxdWVzdCB0byBhdHRhY2ggYSBWUEMgdG8gYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWNjZXB0VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXB0VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWNjZXB0IG9uZSBvciBtb3JlIGludGVyZmFjZSBWUEMgZW5kcG9pbnQgY29ubmVjdGlvbnMgdG8geW91ciBWUEMgZW5kcG9pbnQgc2VydmljZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BY2NlcHRWcGNFbmRwb2ludENvbm5lY3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FjY2VwdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FjY2VwdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhY2NlcHQgYSBWUEMgcGVlcmluZyBjb25uZWN0aW9uIHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FjY2VwdFZwY1BlZXJpbmdDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWR2ZXJ0aXNlIGFuIElQIGFkZHJlc3MgcmFuZ2UgdGhhdCBpcyBwcm92aXNpb25lZCBmb3IgdXNlIGluIEFXUyB0aHJvdWdoIGJyaW5nIHlvdXIgb3duIElQIGFkZHJlc3NlcyAoQllPSVApXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0FkdmVydGlzZUJ5b2lwQ2lkci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BZHZlcnRpc2VCeW9pcENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FkdmVydGlzZUJ5b2lwQ2lkcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFsbG9jYXRlIGFuIEVsYXN0aWMgSVAgYWRkcmVzcyAoRUlQKSB0byB5b3VyIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWxsb2NhdGVBZGRyZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FsbG9jYXRlQWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWxsb2NhdGVBZGRyZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWxsb2NhdGUgYSBEZWRpY2F0ZWQgSG9zdCB0byB5b3VyIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWxsb2NhdGVIb3N0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BbGxvY2F0ZUhvc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBbGxvY2F0ZUhvc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWxsb2NhdGUgYSBDSURSIGZyb20gYW4gQW1hem9uIFZQQyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pIHBvb2xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWxsb2NhdGVJcGFtUG9vbENpZHIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWxsb2NhdGVJcGFtUG9vbENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FsbG9jYXRlSXBhbVBvb2xDaWRyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXBwbHkgYSBzZWN1cml0eSBncm91cCB0byB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIENsaWVudCBWUE4gZW5kcG9pbnQgYW5kIGEgdGFyZ2V0IG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXBwbHlTZWN1cml0eUdyb3Vwc1RvQ2xpZW50VnBuVGFyZ2V0TmV0d29yay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzaWduIG9uZSBvciBtb3JlIElQdjYgYWRkcmVzc2VzIHRvIGEgbmV0d29yayBpbnRlcmZhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzaWduSXB2NkFkZHJlc3Nlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NpZ25JcHY2QWRkcmVzc2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NpZ25JcHY2QWRkcmVzc2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzaWduIG9uZSBvciBtb3JlIHNlY29uZGFyeSBwcml2YXRlIElQIGFkZHJlc3NlcyB0byBhIG5ldHdvcmsgaW50ZXJmYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc2lnblByaXZhdGVJcEFkZHJlc3Nlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc2lnblByaXZhdGVJcEFkZHJlc3NlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc2lnbiBvbmUgb3IgbW9yZSBzZWNvbmRhcnkgcHJpdmF0ZSBJUCBhZGRyZXNzZXMgdG8gYSBwcml2YXRlIE5BVCBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NpZ25Qcml2YXRlTmF0R2F0ZXdheUFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhbiBFbGFzdGljIElQIGFkZHJlc3MgKEVJUCkgd2l0aCBhbiBpbnN0YW5jZSBvciBhIG5ldHdvcmsgaW50ZXJmYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZUFkZHJlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlQWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlQWRkcmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc2lnbiBiaWxsaW5nIG9mIHRoZSB1bnVzZWQgY2FwYWNpdHkgb2YgYSBzaGFyZWQgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gdG8gYSBjb25zdW1lciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIHRhcmdldCBuZXR3b3JrIHdpdGggYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBvciBkaXNhc3NvY2lhdGUgYSBzZXQgb2YgREhDUCBvcHRpb25zIHdpdGggYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlRGhjcE9wdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlRGhjcE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZURoY3BPcHRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGFuIEFDTSBjZXJ0aWZpY2F0ZSB3aXRoIGFuIElBTSByb2xlIHRvIGJlIHVzZWQgaW4gYW4gRUMyIEVuY2xhdmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlRW5jbGF2ZUNlcnRpZmljYXRlSWFtUm9sZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVFbmNsYXZlQ2VydGlmaWNhdGVJYW1Sb2xlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVFbmNsYXZlQ2VydGlmaWNhdGVJYW1Sb2xlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGFuIElBTSBpbnN0YW5jZSBwcm9maWxlIHdpdGggYSBydW5uaW5nIG9yIHN0b3BwZWQgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGlhbTpQYXNzUm9sZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBvbmUgb3IgbW9yZSB0YXJnZXRzIHdpdGggYW4gZXZlbnQgd2luZG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZUluc3RhbmNlRXZlbnRXaW5kb3cuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhbiBBdXRvbm9tb3VzIFN5c3RlbSBOdW1iZXIgKEFTTikgd2l0aCBhIEJZT0lQIENJRFJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlSXBhbUJ5b2Fzbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVJcGFtQnlvYXNuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVJcGFtQnlvYXNuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGFuIElQQU0gcmVzb3VyY2UgZGlzY292ZXJ5IHdpdGggYW4gQW1hem9uIFZQQyBJUEFNXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVJcGFtUmVzb3VyY2VEaXNjb3ZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhbiBFbGFzdGljIElQIGFkZHJlc3MgYW5kIHByaXZhdGUgSVAgYWRkcmVzcyB3aXRoIGEgcHVibGljIE5hdCBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIHJvdXRlIHNlcnZlciB3aXRoIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZVJvdXRlU2VydmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVJvdXRlU2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVSb3V0ZVNlcnZlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIHN1Ym5ldCBvciBnYXRld2F5IHdpdGggYSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVSb3V0ZVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVJvdXRlVGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYSBzZWN1cml0eSBncm91cCB3aXRoIGFub3RoZXIgVlBDIGluIHRoZSBzYW1lIFJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYSBDSURSIGJsb2NrIHdpdGggYSBzdWJuZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlU3VibmV0Q2lkckJsb2NrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlU3VibmV0Q2lkckJsb2NrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGFuIGF0dGFjaG1lbnQgYW5kIGxpc3Qgb2Ygc3VibmV0cyB3aXRoIGEgdHJhbnNpdCBnYXRld2F5IG11bHRpY2FzdCBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGEgcG9saWN5IHRhYmxlIHdpdGggYSB0cmFuc2l0IGdhdGV3YXkgYXR0YWNobWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYW4gYXR0YWNobWVudCB3aXRoIGEgdHJhbnNpdCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIGJyYW5jaCBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGEgdHJ1bmsgbmV0d29yayBpbnRlcmZhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlVHJ1bmtJbnRlcmZhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlVHJ1bmtJbnRlcmZhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVRydW5rSW50ZXJmYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGFuIEFXUyBXZWIgQXBwbGljYXRpb24gRmlyZXdhbGwgKFdBRikgd2ViIGFjY2VzcyBjb250cm9sIGxpc3QgKEFDTCkgd2l0aCBhIFZlcmlmaWVkIEFjY2VzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZlcmlmaWVkLWFjY2Vzcy9sYXRlc3QvdWcvd2FmLWludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2woKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYSBDSURSIGJsb2NrIHdpdGggYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlVnBjQ2lkckJsb2NrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVZwY0NpZHJCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlVnBjQ2lkckJsb2NrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGluayBhbiBFQzItQ2xhc3NpYyBpbnN0YW5jZSB0byBhIENsYXNzaWNMaW5rLWVuYWJsZWQgVlBDIHRocm91Z2ggb25lIG9yIG1vcmUgb2YgdGhlIFZQQydzIHNlY3VyaXR5IGdyb3Vwc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BdHRhY2hDbGFzc2ljTGlua1ZwYy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXR0YWNoQ2xhc3NpY0xpbmtWcGMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRhY2ggYW4gaW50ZXJuZXQgZ2F0ZXdheSB0byBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BdHRhY2hJbnRlcm5ldEdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXR0YWNoSW50ZXJuZXRHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBdHRhY2hJbnRlcm5ldEdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRhY2ggYSBuZXR3b3JrIGludGVyZmFjZSB0byBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRhY2ggYSB0cnVzdCBwcm92aWRlciB0byBhIFZlcmlmaWVkIEFjY2VzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BdHRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXR0YWNoVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBdHRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRhY2ggYW4gRUJTIHZvbHVtZSB0byBhIHJ1bm5pbmcgb3Igc3RvcHBlZCBpbnN0YW5jZSBhbmQgZXhwb3NlIGl0IHRvIHRoZSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXR0YWNoVm9sdW1lLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0F0dGFjaFZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXR0YWNoVm9sdW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXR0YWNoIGEgdmlydHVhbCBwcml2YXRlIGdhdGV3YXkgdG8gYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXR0YWNoVnBuR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BdHRhY2hWcG5HYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBdHRhY2hWcG5HYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIGFuIGluYm91bmQgYXV0aG9yaXphdGlvbiBydWxlIHRvIGEgQ2xpZW50IFZQTiBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BdXRob3JpemVDbGllbnRWcG5JbmdyZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0F1dGhvcml6ZUNsaWVudFZwbkluZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0F1dGhvcml6ZUNsaWVudFZwbkluZ3Jlc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgb25lIG9yIG1vcmUgb3V0Ym91bmQgcnVsZXMgdG8gYSBWUEMgc2VjdXJpdHkgZ3JvdXAuIFBvbGljaWVzIHVzaW5nIHRoZSBzZWN1cml0eS1ncm91cC1ydWxlIHJlc291cmNlLWxldmVsIHBlcm1pc3Npb24gYXJlIG9ubHkgZW5mb3JjZWQgd2hlbiB0aGUgQVBJIHJlcXVlc3QgaW5jbHVkZXMgVGFnU3BlY2lmaWNhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXV0aG9yaXplU2VjdXJpdHlHcm91cEVncmVzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BdXRob3JpemVTZWN1cml0eUdyb3VwRWdyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBdXRob3JpemVTZWN1cml0eUdyb3VwRWdyZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIG9uZSBvciBtb3JlIGluYm91bmQgcnVsZXMgdG8gYSBWUEMgc2VjdXJpdHkgZ3JvdXAuIFBvbGljaWVzIHVzaW5nIHRoZSBzZWN1cml0eS1ncm91cC1ydWxlIHJlc291cmNlLWxldmVsIHBlcm1pc3Npb24gYXJlIG9ubHkgZW5mb3JjZWQgd2hlbiB0aGUgQVBJIHJlcXVlc3QgaW5jbHVkZXMgVGFnU3BlY2lmaWNhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXV0aG9yaXplU2VjdXJpdHlHcm91cEluZ3Jlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEluZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0F1dGhvcml6ZVNlY3VyaXR5R3JvdXBJbmdyZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYnVuZGxlIGFuIGluc3RhbmNlIHN0b3JlLWJhY2tlZCBXaW5kb3dzIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0J1bmRsZUluc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0J1bmRsZUluc3RhbmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCdW5kbGVJbnN0YW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhIGJ1bmRsaW5nIG9wZXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DYW5jZWxCdW5kbGVUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbEJ1bmRsZVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbEJ1bmRsZVRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYSBDYXBhY2l0eSBSZXNlcnZhdGlvbiBhbmQgcmVsZWFzZSB0aGUgcmVzZXJ2ZWQgY2FwYWNpdHlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsQ2FwYWNpdHlSZXNlcnZhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxDYXBhY2l0eVJlc2VydmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxDYXBhY2l0eVJlc2VydmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIG9uZSBvciBtb3JlIENhcGFjaXR5IFJlc2VydmF0aW9uIEZsZWV0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb25cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DYW5jZWxDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYW4gYWN0aXZlIGNvbnZlcnNpb24gdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DYW5jZWxDb252ZXJzaW9uVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxDb252ZXJzaW9uVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsQ29udmVyc2lvblRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYSBkZWNsYXJhdGl2ZSBwb2xpY2llcyByZXBvcnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsRGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxEZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxEZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGFuIGFjdGl2ZSBleHBvcnQgdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DYW5jZWxFeHBvcnRUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbEV4cG9ydFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbEV4cG9ydFRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgeW91ciBBV1MgYWNjb3VudCBmcm9tIHRoZSBsYXVuY2ggcGVybWlzc2lvbnMgZm9yIHRoZSBzcGVjaWZpZWQgQU1JXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhbmNlbEltYWdlTGF1bmNoUGVybWlzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxJbWFnZUxhdW5jaFBlcm1pc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbEltYWdlTGF1bmNoUGVybWlzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhbiBpbi1wcm9jZXNzIGltcG9ydCB2aXJ0dWFsIG1hY2hpbmUgb3IgaW1wb3J0IHNuYXBzaG90IHRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsSW1wb3J0VGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxJbXBvcnRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxJbXBvcnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGEgUmVzZXJ2ZWQgSW5zdGFuY2UgbGlzdGluZyBvbiB0aGUgUmVzZXJ2ZWQgSW5zdGFuY2UgTWFya2V0cGxhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsUmVzZXJ2ZWRJbnN0YW5jZXNMaXN0aW5nLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbFJlc2VydmVkSW5zdGFuY2VzTGlzdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsUmVzZXJ2ZWRJbnN0YW5jZXNMaXN0aW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIG9uZSBvciBtb3JlIFNwb3QgRmxlZXQgcmVxdWVzdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsU3BvdEZsZWV0UmVxdWVzdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsU3BvdEZsZWV0UmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFNwb3RGbGVldFJlcXVlc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIG9uZSBvciBtb3JlIFNwb3QgSW5zdGFuY2UgcmVxdWVzdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsU3BvdEluc3RhbmNlUmVxdWVzdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsU3BvdEluc3RhbmNlUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFNwb3RJbnN0YW5jZVJlcXVlc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gb3duZWQgcHJvZHVjdCBjb2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Db25maXJtUHJvZHVjdEluc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvbmZpcm1Qcm9kdWN0SW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NvbmZpcm1Qcm9kdWN0SW5zdGFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IGEgc291cmNlIEFtYXpvbiBGUEdBIGltYWdlIChBRkkpIHRvIHRoZSBjdXJyZW50IFJlZ2lvbi4gUmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMgc3BlY2lmaWVkIGZvciB0aGlzIGFjdGlvbiBhcHBseSB0byB0aGUgbmV3IEFGSSBvbmx5LiBUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgc291cmNlIEFGSVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Db3B5RnBnYUltYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvcHlGcGdhSW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NvcHlGcGdhSW1hZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IGFuIEFtYXpvbiBNYWNoaW5lIEltYWdlIChBTUkpIGZyb20gYSBzb3VyY2UgUmVnaW9uIHRvIHRoZSBjdXJyZW50IFJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Db3B5SW1hZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ29weUltYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDb3B5SW1hZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IGEgcG9pbnQtaW4tdGltZSBzbmFwc2hvdCBvZiBhbiBFQlMgdm9sdW1lIGFuZCBzdG9yZSBpdCBpbiBBbWF6b24gUzMuIFJlc291cmNlLWxldmVsIHBlcm1pc3Npb25zIHNwZWNpZmllZCBmb3IgdGhpcyBhY3Rpb24gYXBwbHkgdG8gYm90aCB0aGUgc25hcHNob3QgY29weSBhbmQgdGhlIHNvdXJjZSBzbmFwc2hvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Db3B5U25hcHNob3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ29weVNuYXBzaG90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDb3B5U25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBDYXBhY2l0eSBSZXNlcnZhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gYnkgc3BsaXR0aW5nIHRoZSBhdmFpbGFibGUgY2FwYWNpdHkgb2YgdGhlIHNvdXJjZSBDYXBhY2l0eSBSZXNlcnZhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBDYXBhY2l0eSBSZXNlcnZhdGlvbiBGbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25cbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKiAtIGVjMjpEZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25zXG4gICAqIC0gZWMyOkRlc2NyaWJlSW5zdGFuY2VzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgY2FycmllciBnYXRld2F5IGFuZCBwcm92aWRlcyBDU1AgY29ubmVjdGl2aXR5IHRvIFZQQyBjdXN0b21lcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQ2FycmllckdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ2FycmllckdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNhcnJpZXJHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgQ2xpZW50IFZQTiBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDbGllbnRWcG5FbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDbGllbnRWcG5FbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ2xpZW50VnBuRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgYSBuZXR3b3JrIHJvdXRlIHRvIGEgQ2xpZW50IFZQTiBlbmRwb2ludCdzIHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUNsaWVudFZwblJvdXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNsaWVudFZwblJvdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDbGllbnRWcG5Sb3V0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJhbmdlIG9mIGN1c3RvbWVyLW93bmVkIElQIChDb0lQKSBhZGRyZXNzZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQ29pcENpZHIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ29pcENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNvaXBDaWRyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcG9vbCBvZiBjdXN0b21lci1vd25lZCBJUCAoQ29JUCkgYWRkcmVzc2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUNvaXBQb29sLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNvaXBQb29sKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDb2lwUG9vbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFsbG93IGEgc2VydmljZSB0byBhY2Nlc3MgYSBjdXN0b21lci1vd25lZCBJUCAoQ29JUCkgcG9vbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL291dHBvc3RzL2xhdGVzdC91c2VyZ3VpZGUvaWRlbnRpdHktYWNjZXNzLW1hbmFnZW1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ29pcFBvb2xQZXJtaXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDb2lwUG9vbFBlcm1pc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBjdXN0b21lciBnYXRld2F5LCB3aGljaCBwcm92aWRlcyBpbmZvcm1hdGlvbiB0byBBV1MgYWJvdXQgeW91ciBjdXN0b21lciBnYXRld2F5IGRldmljZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDdXN0b21lckdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ3VzdG9tZXJHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDdXN0b21lckdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBkZWZhdWx0IHN1Ym5ldCBpbiBhIHNwZWNpZmllZCBBdmFpbGFiaWxpdHkgWm9uZSBpbiBhIGRlZmF1bHQgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZURlZmF1bHRTdWJuZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRGVmYXVsdFN1Ym5ldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRGVmYXVsdFN1Ym5ldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGRlZmF1bHQgVlBDIHdpdGggYSBkZWZhdWx0IHN1Ym5ldCBpbiBlYWNoIEF2YWlsYWJpbGl0eSBab25lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZURlZmF1bHRWcGMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRGVmYXVsdFZwYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRGVmYXVsdFZwYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHNldCBvZiBESENQIG9wdGlvbnMgZm9yIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZURoY3BPcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZURoY3BPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVEaGNwT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5IGZvciBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsYXVuY2ggYW4gRUMyIEZsZWV0LiBSZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBhY3Rpb24gZG8gbm90IGluY2x1ZGUgdGhlIHJlc291cmNlcyBzcGVjaWZpZWQgaW4gYSBsYXVuY2ggdGVtcGxhdGUuIFRvIHNwZWNpZnkgcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMgZm9yIHJlc291cmNlcyBzcGVjaWZpZWQgaW4gYSBsYXVuY2ggdGVtcGxhdGUsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIHJlc291cmNlcyBpbiB0aGUgUnVuSW5zdGFuY2VzIGFjdGlvbiBzdGF0ZW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIG9uZSBvciBtb3JlIGZsb3cgbG9ncyB0byBjYXB0dXJlIElQIHRyYWZmaWMgZm9yIGEgbmV0d29yayBpbnRlcmZhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqIC0gZWNzOkxpc3RDbHVzdGVyc1xuICAgKiAtIGVjczpMaXN0Q29udGFpbmVySW5zdGFuY2VzXG4gICAqIC0gZWNzOkxpc3RTZXJ2aWNlc1xuICAgKiAtIGVjczpMaXN0VGFza0RlZmluaXRpb25zXG4gICAqIC0gZWNzOkxpc3RUYXNrc1xuICAgKiAtIGlhbTpQYXNzUm9sZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUZsb3dMb2dzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUZsb3dMb2dzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVGbG93TG9ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBBbWF6b24gRlBHQSBJbWFnZSAoQUZJKSBmcm9tIGEgZGVzaWduIGNoZWNrcG9pbnQgKERDUClcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRnBnYUltYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUZwZ2FJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRnBnYUltYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIEFtYXpvbiBFQlMtYmFja2VkIEFNSSBmcm9tIGEgc3RvcHBlZCBvciBydW5uaW5nIEFtYXpvbiBFQlMtYmFja2VkIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUltYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUltYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVJbWFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBFQzIgSW5zdGFuY2UgQ29ubmVjdCBFbmRwb2ludCB0aGF0IGFsbG93cyB5b3UgdG8gY29ubmVjdCB0byBhbiBpbnN0YW5jZSB3aXRob3V0IGEgcHVibGljIElQdjQgYWRkcmVzc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gZXZlbnQgd2luZG93IGluIHdoaWNoIHNjaGVkdWxlZCBldmVudHMgZm9yIHRoZSBhc3NvY2lhdGVkIEFtYXpvbiBFQzIgaW5zdGFuY2VzIGNhbiBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlSW5zdGFuY2VFdmVudFdpbmRvdy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJbnN0YW5jZUV2ZW50V2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVJbnN0YW5jZUV2ZW50V2luZG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZXhwb3J0IGEgcnVubmluZyBvciBzdG9wcGVkIGluc3RhbmNlIHRvIGFuIEFtYXpvbiBTMyBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIGludGVybmV0IGdhdGV3YXkgZm9yIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUludGVybmV0R2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJbnRlcm5ldEdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUludGVybmV0R2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBBbWF6b24gVlBDIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqIC0gaWFtOkNyZWF0ZVNlcnZpY2VMaW5rZWRSb2xlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlSXBhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJcGFtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVJcGFtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdmVyaWZpY2F0aW9uIHRva2VuLCB3aGljaCBwcm92ZXMgb3duZXJzaGlwIG9mIGFuIGV4dGVybmFsIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBJUCBhZGRyZXNzIHBvb2wgZm9yIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSwgd2hpY2ggaXMgYSBjb2xsZWN0aW9uIG9mIGNvbnRpZ3VvdXMgSVAgYWRkcmVzcyBDSURSc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVJcGFtUG9vbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJcGFtUG9vbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlSXBhbVBvb2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gSVBBTSByZXNvdXJjZSBkaXNjb3ZlcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqIC0gaWFtOkNyZWF0ZVNlcnZpY2VMaW5rZWRSb2xlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBzY29wZSwgd2hpY2ggaXMgdGhlIGhpZ2hlc3QtbGV2ZWwgY29udGFpbmVyIHdpdGhpbiBJUEFNXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUlwYW1TY29wZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJcGFtU2NvcGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUlwYW1TY29wZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIDIwNDgtYml0IFJTQSBrZXkgcGFpclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVLZXlQYWlyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUtleVBhaXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUtleVBhaXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBsYXVuY2ggdGVtcGxhdGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqIC0gc3NtOkdldFBhcmFtZXRlcnNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVMYXVuY2hUZW1wbGF0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMYXVuY2hUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGF1bmNoVGVtcGxhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgdmVyc2lvbiBvZiBhIGxhdW5jaCB0ZW1wbGF0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gc3NtOkdldFBhcmFtZXRlcnNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVMYXVuY2hUZW1wbGF0ZVZlcnNpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMYXVuY2hUZW1wbGF0ZVZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBzdGF0aWMgcm91dGUgZm9yIGEgbG9jYWwgZ2F0ZXdheSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTG9jYWxHYXRld2F5Um91dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBsb2NhbCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFsbG93IGEgc2VydmljZSB0byBhY2Nlc3MgYSBsb2NhbCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb3V0cG9zdHMvbGF0ZXN0L3VzZXJndWlkZS9pZGVudGl0eS1hY2Nlc3MtbWFuYWdlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlUGVybWlzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVBlcm1pc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBsb2NhbCBnYXRld2F5IHJvdXRlIHRhYmxlIHZpcnR1YWwgaW50ZXJmYWNlIGdyb3VwIGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIFZQQyB3aXRoIGEgbG9jYWwgZ2F0ZXdheSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBsb2NhbCBnYXRld2F5IHZpcnR1YWwgaW50ZXJmYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxvY2FsIGdhdGV3YXkgdmlydHVhbCBpbnRlcmZhY2UgZ3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbWFuYWdlZCBwcmVmaXggbGlzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVNYW5hZ2VkUHJlZml4TGlzdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNYW5hZ2VkUHJlZml4TGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTWFuYWdlZFByZWZpeExpc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBOQVQgZ2F0ZXdheSBpbiBhIHN1Ym5ldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVOYXRHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU5hdEdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU5hdEdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXR3b3JrIEFDTCBpbiBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVOZXR3b3JrQWNsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU5ldHdvcmtBY2woKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU5ldHdvcmtBY2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBudW1iZXJlZCBlbnRyeSAoYSBydWxlKSBpbiBhIG5ldHdvcmsgQUNMXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZU5ldHdvcmtBY2xFbnRyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVOZXR3b3JrQWNsRW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU5ldHdvcmtBY2xFbnRyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIE5ldHdvcmsgQWNjZXNzIFNjb3BlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHBhdGggdG8gYW5hbHl6ZSBmb3IgcmVhY2hhYmlsaXR5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGguaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldHdvcmsgaW50ZXJmYWNlIGluIGEgc3VibmV0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTmV0d29ya0ludGVyZmFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHBlcm1pc3Npb24gZm9yIGFuIEFXUy1hdXRob3JpemVkIHVzZXIgdG8gcGVyZm9ybSBjZXJ0YWluIG9wZXJhdGlvbnMgb24gYSBuZXR3b3JrIGludGVyZmFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHBsYWNlbWVudCBncm91cFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVQbGFjZW1lbnRHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVQbGFjZW1lbnRHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUGxhY2VtZW50R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBwdWJsaWMgSVB2NCBhZGRyZXNzIHBvb2wgZm9yIHB1YmxpYyBJUHY0IENJRFJzIHRoYXQgeW91IG93biBhbmQgYnJpbmcgdG8gQW1hem9uIHRvIG1hbmFnZSB3aXRoIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVQdWJsaWNJcHY0UG9vbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVQdWJsaWNJcHY0UG9vbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUHVibGljSXB2NFBvb2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSByb290IHZvbHVtZSByZXBsYWNlbWVudCB0YXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpc3RpbmcgZm9yIFN0YW5kYXJkIFJlc2VydmVkIEluc3RhbmNlcyB0byBiZSBzb2xkIGluIHRoZSBSZXNlcnZlZCBJbnN0YW5jZSBNYXJrZXRwbGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVSZXNlcnZlZEluc3RhbmNlc0xpc3RpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUmVzZXJ2ZWRJbnN0YW5jZXNMaXN0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSZXNlcnZlZEluc3RhbmNlc0xpc3RpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHRhc2sgdGhhdCByZXN0b3JlcyBhbiBBTUkgZnJvbSBhbiBTMyBvYmplY3QgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHVzaW5nIENyZWF0ZVN0b3JlSW1hZ2VUYXNrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJlc3RvcmVJbWFnZVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUmVzdG9yZUltYWdlVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUmVzdG9yZUltYWdlVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJvdXRlIGluIGEgVlBDIHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJvdXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJvdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSb3V0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJvdXRlIHNlcnZlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICogLSBzbnM6Q3JlYXRlVG9waWNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVSb3V0ZVNlcnZlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSb3V0ZVNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUm91dGVTZXJ2ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSByb3V0ZSBzZXJ2ZXIgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpBdXRob3JpemVTZWN1cml0eUdyb3VwSW5ncmVzc1xuICAgKiAtIGVjMjpDcmVhdGVOZXR3b3JrSW50ZXJmYWNlXG4gICAqIC0gZWMyOkNyZWF0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uXG4gICAqIC0gZWMyOkNyZWF0ZVNlY3VyaXR5R3JvdXBcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKiAtIGVjMjpEZXNjcmliZVNlY3VyaXR5R3JvdXBzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlUm91dGVTZXJ2ZXJFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSb3V0ZVNlcnZlckVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSb3V0ZVNlcnZlckVuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcm91dGUgc2VydmVyIHBlZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpBdXRob3JpemVTZWN1cml0eUdyb3VwSW5ncmVzc1xuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlUm91dGVTZXJ2ZXJQZWVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJvdXRlU2VydmVyUGVlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUm91dGVTZXJ2ZXJQZWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcm91dGUgdGFibGUgZm9yIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJvdXRlVGFibGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUm91dGVUYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUm91dGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHNlY3VyaXR5IGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVNlY3VyaXR5R3JvdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlU2VjdXJpdHlHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU2VjdXJpdHlHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHNuYXBzaG90IG9mIGFuIEVCUyB2b2x1bWUgYW5kIHN0b3JlIGl0IGluIEFtYXpvbiBTM1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVTbmFwc2hvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgY3Jhc2gtY29uc2lzdGVudCBzbmFwc2hvdHMgb2YgbXVsdGlwbGUgRUJTIHZvbHVtZXMgYW5kIHN0b3JlIHRoZW0gaW4gQW1hem9uIFMzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVNuYXBzaG90cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTbmFwc2hvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVNuYXBzaG90cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGRhdGEgZmVlZCBmb3IgU3BvdCBJbnN0YW5jZXMgdG8gdmlldyBTcG90IEluc3RhbmNlIHVzYWdlIGxvZ3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU3BvdERhdGFmZWVkU3Vic2NyaXB0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU3BvdERhdGFmZWVkU3Vic2NyaXB0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcmUgYW4gQU1JIGFzIGEgc2luZ2xlIG9iamVjdCBpbiBhbiBTMyBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU3RvcmVJbWFnZVRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlU3RvcmVJbWFnZVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN0b3JlSW1hZ2VUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc3VibmV0IGluIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVN1Ym5ldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdWJuZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN1Ym5ldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHN1Ym5ldCBDSURSIHJlc2VydmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVN1Ym5ldENpZHJSZXNlcnZhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdWJuZXRDaWRyUmVzZXJ2YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVN1Ym5ldENpZHJSZXNlcnZhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBvciBvdmVyd3JpdGUgb25lIG9yIG1vcmUgdGFncyBmb3IgQW1hem9uIEVDMiByZXNvdXJjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQ3JlYXRlQWN0aW9uKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVRhZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVGFncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHRyYWZmaWMgbWlycm9yIGZpbHRlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYWZmaWNNaXJyb3JGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYWZmaWNNaXJyb3JGaWx0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0cmFmZmljIG1pcnJvciBmaWx0ZXIgcnVsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVHJhZmZpY01pcnJvckZpbHRlclJ1bGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0cmFmZmljIG1pcnJvciBzZXNzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUcmFmZmljTWlycm9yU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHRyYWZmaWMgbWlycm9yIHRhcmdldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFmZmljTWlycm9yVGFyZ2V0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJhbnNpdEdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVHJhbnNpdEdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYW5zaXRHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgQ29ubmVjdCBhdHRhY2htZW50IGZyb20gYSBzcGVjaWZpZWQgdHJhbnNpdCBnYXRld2F5IGF0dGFjaG1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgQ29ubmVjdCBwZWVyIGJldHdlZW4gYSB0cmFuc2l0IGdhdGV3YXkgYW5kIGFuIGFwcGxpYW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBtdWx0aWNhc3QgZG9tYWluIGZvciBhIHRyYW5zaXQgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXF1ZXN0IGEgdHJhbnNpdCBnYXRld2F5IHBlZXJpbmcgYXR0YWNobWVudCBiZXR3ZWVuIGEgcmVxdWVzdGVyIGFuZCBhY2NlcHRlciB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdHJhbnNpdCBnYXRld2F5IHBvbGljeSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0cmFuc2l0IGdhdGV3YXkgcHJlZml4IGxpc3QgcmVmZXJlbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHN0YXRpYyByb3V0ZSBmb3IgYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcm91dGUgdGFibGUgZm9yIGEgdHJhbnNpdCBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBhbm5vdW5jZW1lbnQgZm9yIGEgdHJhbnNpdCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGF0dGFjaCBhIFZQQyB0byBhIHRyYW5zaXQgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBWZXJpZmllZCBBY2Nlc3MgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgVmVyaWZpZWQgQWNjZXNzIGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZlcmlmaWVkQWNjZXNzR3JvdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVmVyaWZpZWRBY2Nlc3NHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFZlcmlmaWVkIEFjY2VzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB2ZXJpZmllZCB0cnVzdCBwcm92aWRlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gRUJTIHZvbHVtZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVWb2x1bWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWb2x1bWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBWUEMgd2l0aCBhIHNwZWNpZmllZCBDSURSIGJsb2NrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZwYy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVWcGMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVZwYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBleGNsdXNpb24gbGlzdCBmb3IgYmxvY2tlZCBwdWJsaWMgYWNjZXNzIG9uIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFZQQyBlbmRwb2ludCBmb3IgYW4gQVdTIHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqIC0gcm91dGU1MzpBc3NvY2lhdGVWUENXaXRoSG9zdGVkWm9uZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZwY0VuZHBvaW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVZwY0VuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWcGNFbmRwb2ludCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gbm90aWZpY2F0aW9uIGZvciBhIFZQQyBlbmRwb2ludCBvciBWUEMgZW5kcG9pbnQgc2VydmljZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBWUEMgZW5kcG9pbnQgc2VydmljZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHNlcnZpY2UgY29uc3VtZXJzIChBV1MgYWNjb3VudHMsIElBTSB1c2VycywgYW5kIElBTSByb2xlcykgY2FuIGNvbm5lY3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVxdWVzdCBhIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gVlBDc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVWcGNQZWVyaW5nQ29ubmVjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVWcGNQZWVyaW5nQ29ubmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBWUE4gY29ubmVjdGlvbiBiZXR3ZWVuIGEgdmlydHVhbCBwcml2YXRlIGdhdGV3YXkgb3IgdHJhbnNpdCBnYXRld2F5IGFuZCBhIGN1c3RvbWVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVnBuQ29ubmVjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVWcG5Db25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVWcG5Db25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc3RhdGljIHJvdXRlIGZvciBhIFZQTiBjb25uZWN0aW9uIGJldHdlZW4gYSB2aXJ0dWFsIHByaXZhdGUgZ2F0ZXdheSBhbmQgYSBjdXN0b21lciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZwbkNvbm5lY3Rpb25Sb3V0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVWcG5Db25uZWN0aW9uUm91dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVZwbkNvbm5lY3Rpb25Sb3V0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVZwbkdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVnBuR2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVnBuR2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGNhcnJpZXIgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVDYXJyaWVyR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDYXJyaWVyR2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQ2FycmllckdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUNsaWVudFZwbkVuZHBvaW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNsaWVudFZwbkVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDbGllbnRWcG5FbmRwb2ludCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHJvdXRlIGZyb20gYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUNsaWVudFZwblJvdXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNsaWVudFZwblJvdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDbGllbnRWcG5Sb3V0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHJhbmdlIG9mIGN1c3RvbWVyLW93bmVkIElQIChDb0lQKSBhZGRyZXNzZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ29pcENpZHIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ29pcENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvaXBDaWRyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcG9vbCBvZiBjdXN0b21lci1vd25lZCBJUCAoQ29JUCkgYWRkcmVzc2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUNvaXBQb29sLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNvaXBQb29sKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDb2lwUG9vbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbnkgYSBzZXJ2aWNlIGZyb20gYWNjZXNzaW5nIGEgY3VzdG9tZXItb3duZWQgSVAgKENvSVApIHBvb2xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vdXRwb3N0cy9sYXRlc3QvdXNlcmd1aWRlL2lkZW50aXR5LWFjY2Vzcy1tYW5hZ2VtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNvaXBQb29sUGVybWlzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQ29pcFBvb2xQZXJtaXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgY3VzdG9tZXIgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVDdXN0b21lckdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ3VzdG9tZXJHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDdXN0b21lckdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzZXQgb2YgREhDUCBvcHRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZURoY3BPcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZURoY3BPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVEaGNwT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBlZ3Jlc3Mtb25seSBpbnRlcm5ldCBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRWdyZXNzT25seUludGVybmV0R2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRWdyZXNzT25seUludGVybmV0R2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBvbmUgb3IgbW9yZSBFQzIgRmxlZXRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUZsZWV0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVGbGVldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUZsZWV0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBvbmUgb3IgbW9yZSBmbG93IGxvZ3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRmxvd0xvZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRmxvd0xvZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUZsb3dMb2dzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIEFtYXpvbiBGUEdBIEltYWdlIChBRkkpXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUZwZ2FJbWFnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVGcGdhSW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUZwZ2FJbWFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBFQzIgSW5zdGFuY2UgQ29ubmVjdCBFbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBldmVudCB3aW5kb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlSW5zdGFuY2VFdmVudFdpbmRvdy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbnN0YW5jZUV2ZW50V2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVJbnN0YW5jZUV2ZW50V2luZG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGludGVybmV0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlSW50ZXJuZXRHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUludGVybmV0R2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlSW50ZXJuZXRHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBhbmQgcmVtb3ZlIGFsbCBtb25pdG9yZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIElQQU0gaW5jbHVkaW5nIHRoZSBoaXN0b3JpY2FsIGRhdGEgZm9yIENJRFJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUlwYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlSXBhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlSXBhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHZlcmlmaWNhdGlvbiB0b2tlbiwgd2hpY2ggcHJvdmVzIG93bmVyc2hpcCBvZiBhbiBleHRlcm5hbCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VuLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gQW1hem9uIFZQQyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pIHBvb2xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlSXBhbVBvb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlSXBhbVBvb2woKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUlwYW1Qb29sJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIElQQU0gcmVzb3VyY2UgZGlzY292ZXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJcGFtUmVzb3VyY2VEaXNjb3ZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgc2NvcGUgZm9yIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVJcGFtU2NvcGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlSXBhbVNjb3BlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVJcGFtU2NvcGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBrZXkgcGFpciBieSByZW1vdmluZyB0aGUgcHVibGljIGtleSBmcm9tIEFtYXpvbiBFQzJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlS2V5UGFpci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVLZXlQYWlyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVLZXlQYWlyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbGF1bmNoIHRlbXBsYXRlIGFuZCBpdHMgYXNzb2NpYXRlZCB2ZXJzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMYXVuY2hUZW1wbGF0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMYXVuY2hUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTGF1bmNoVGVtcGxhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgb25lIG9yIG1vcmUgdmVyc2lvbnMgb2YgYSBsYXVuY2ggdGVtcGxhdGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMYXVuY2hUZW1wbGF0ZVZlcnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMYXVuY2hUZW1wbGF0ZVZlcnNpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcm91dGUgZnJvbSBhIGxvY2FsIGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTG9jYWxHYXRld2F5Um91dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTG9jYWxHYXRld2F5Um91dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbG9jYWwgZ2F0ZXdheSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZW55IGEgc2VydmljZSBmcm9tIGFjY2Vzc2luZyBhIGxvY2FsIGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vdXRwb3N0cy9sYXRlc3QvdXNlcmd1aWRlL2lkZW50aXR5LWFjY2Vzcy1tYW5hZ2VtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlUGVybWlzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGxvY2FsIGdhdGV3YXkgcm91dGUgdGFibGUgdmlydHVhbCBpbnRlcmZhY2UgZ3JvdXAgYXNzb2NpYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBWUEMgYW5kIGxvY2FsIGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbG9jYWwgZ2F0ZXdheSB2aXJ0dWFsIGludGVyZmFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBsb2NhbCBnYXRld2F5IHZpcnR1YWwgaW50ZXJmYWNlIGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIG1hbmFnZWQgcHJlZml4IGxpc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTWFuYWdlZFByZWZpeExpc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTWFuYWdlZFByZWZpeExpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU1hbmFnZWRQcmVmaXhMaXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgTkFUIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTmF0R2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVOYXRHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVOYXRHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbmV0d29yayBBQ0xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTmV0d29ya0FjbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVOZXR3b3JrQWNsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVOZXR3b3JrQWNsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGluYm91bmQgb3Igb3V0Ym91bmQgZW50cnkgKHJ1bGUpIGZyb20gYSBuZXR3b3JrIEFDTFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVOZXR3b3JrQWNsRW50cnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTmV0d29ya0FjbEVudHJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVOZXR3b3JrQWNsRW50cnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBOZXR3b3JrIEFjY2VzcyBTY29wZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBOZXR3b3JrIEFjY2VzcyBTY29wZSBhbmFseXNpc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBuZXR3b3JrIGluc2lnaHRzIGFuYWx5c2lzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c0FuYWx5c2lzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c0FuYWx5c2lzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVOZXR3b3JrSW5zaWdodHNBbmFseXNpcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIG5ldHdvcmsgaW5zaWdodHMgcGF0aFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVOZXR3b3JrSW5zaWdodHNQYXRoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBkZXRhY2hlZCBuZXR3b3JrIGludGVyZmFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVOZXR3b3JrSW50ZXJmYWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBwZXJtaXNzaW9uIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbmV0d29yayBpbnRlcmZhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBwbGFjZW1lbnQgZ3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUGxhY2VtZW50R3JvdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUGxhY2VtZW50R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVBsYWNlbWVudEdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcHVibGljIElQdjQgYWRkcmVzcyBwb29sIGZvciBwdWJsaWMgSVB2NCBDSURScyB0aGF0IHlvdSBvd24gYW5kIGJyb3VnaHQgdG8gQW1hem9uIHRvIG1hbmFnZSB3aXRoIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVQdWJsaWNJcHY0UG9vbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVQdWJsaWNJcHY0UG9vbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUHVibGljSXB2NFBvb2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHF1ZXVlZCBwdXJjaGFzZXMgZm9yIHRoZSBzcGVjaWZpZWQgUmVzZXJ2ZWQgSW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVF1ZXVlZFJlc2VydmVkSW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVF1ZXVlZFJlc2VydmVkSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVRdWV1ZWRSZXNlcnZlZEluc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSBhbiBJQU0gcG9saWN5IHRoYXQgZW5hYmxlcyBjcm9zcy1hY2NvdW50IHNoYXJpbmcgZnJvbSBhIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC9pcGFtL3NoYXJlLXBvb2wtaXBhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZXNvdXJjZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVzb3VyY2VQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByb3V0ZSBmcm9tIGEgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUm91dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUm91dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJvdXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcm91dGUgc2VydmVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBzbnM6RGVsZXRlVG9waWNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVSb3V0ZVNlcnZlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSb3V0ZVNlcnZlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUm91dGVTZXJ2ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByb3V0ZSBzZXJ2ZXIgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpEZWxldGVOZXR3b3JrSW50ZXJmYWNlXG4gICAqIC0gZWMyOkRlbGV0ZVNlY3VyaXR5R3JvdXBcbiAgICogLSBlYzI6UmV2b2tlU2VjdXJpdHlHcm91cEluZ3Jlc3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVSb3V0ZVNlcnZlckVuZHBvaW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByb3V0ZSBzZXJ2ZXIgcGVlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOlJldm9rZVNlY3VyaXR5R3JvdXBJbmdyZXNzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUm91dGVTZXJ2ZXJQZWVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJvdXRlU2VydmVyUGVlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUm91dGVTZXJ2ZXJQZWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUm91dGVUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSb3V0ZVRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSb3V0ZVRhYmxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc2VjdXJpdHkgZ3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU2VjdXJpdHlHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTZWN1cml0eUdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTZWN1cml0eUdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc25hcHNob3Qgb2YgYW4gRUJTIHZvbHVtZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVTbmFwc2hvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlU25hcHNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBkYXRhIGZlZWQgZm9yIFNwb3QgSW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTcG90RGF0YWZlZWRTdWJzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHN1Ym5ldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVTdWJuZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3VibmV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTdWJuZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzdWJuZXQgQ0lEUiByZXNlcnZhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVTdWJuZXRDaWRyUmVzZXJ2YXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3VibmV0Q2lkclJlc2VydmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTdWJuZXRDaWRyUmVzZXJ2YXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgb25lIG9yIG1vcmUgdGFncyBmcm9tIEFtYXpvbiBFQzIgcmVzb3VyY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZ1xuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVGFncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUYWdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUYWdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhZmZpYyBtaXJyb3IgZmlsdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVHJhZmZpY01pcnJvckZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhZmZpY01pcnJvckZpbHRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHRyYWZmaWMgbWlycm9yIGZpbHRlciBydWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHRyYWZmaWMgbWlycm9yIHNlc3Npb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhZmZpY01pcnJvclNlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVHJhZmZpY01pcnJvclNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhZmZpYyBtaXJyb3IgdGFyZ2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYWZmaWNNaXJyb3JUYXJnZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVHJhZmZpY01pcnJvclRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhZmZpY01pcnJvclRhcmdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHRyYW5zaXQgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVUcmFuc2l0R2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhbnNpdEdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB0cmFuc2l0IGdhdGV3YXkgY29ubmVjdCBhdHRhY2htZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheUNvbm5lY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHRyYW5zaXQgZ2F0ZXdheSBjb25uZWN0IHBlZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhbnNpdCBnYXRld2F5IG11bHRpY2FzdCBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcGVlcmluZyBhdHRhY2htZW50IGZyb20gYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhbnNpdCBnYXRld2F5IHBvbGljeSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB0cmFuc2l0IGdhdGV3YXkgcHJlZml4IGxpc3QgcmVmZXJlbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHJvdXRlIGZyb20gYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhbnNpdCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHRyYW5zaXQgZ2F0ZXdheSByb3V0ZSB0YWJsZSBhbm5vdW5jZW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgVlBDIGF0dGFjaG1lbnQgZnJvbSBhIHRyYW5zaXQgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBWZXJpZmllZCBBY2Nlc3MgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgVmVyaWZpZWQgQWNjZXNzIGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZlcmlmaWVkQWNjZXNzR3JvdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVmVyaWZpZWRBY2Nlc3NHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVmVyaWZpZWRBY2Nlc3NHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIFZlcmlmaWVkIEFjY2VzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB2ZXJpZmllZCB0cnVzdCBwcm92aWRlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gRUJTIHZvbHVtZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVWb2x1bWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVWb2x1bWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVnBjLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVZwYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVnBjJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGV4Y2x1c2lvbiBsaXN0IGZvciBibG9ja2VkIHB1YmxpYyBhY2Nlc3Mgb24gYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIG9uZSBvciBtb3JlIFZQQyBlbmRwb2ludCBjb25uZWN0aW9uIG5vdGlmaWNhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIG9uZSBvciBtb3JlIFZQQyBlbmRwb2ludCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBvbmUgb3IgbW9yZSBWUEMgZW5kcG9pbnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZwY0VuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWcGNFbmRwb2ludHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZwY0VuZHBvaW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZwY1BlZXJpbmdDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgVlBOIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVnBuQ29ubmVjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWcG5Db25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVWcG5Db25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc3RhdGljIHJvdXRlIGZvciBhIFZQTiBjb25uZWN0aW9uIGJldHdlZW4gYSB2aXJ0dWFsIHByaXZhdGUgZ2F0ZXdheSBhbmQgYSBjdXN0b21lciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZwbkNvbm5lY3Rpb25Sb3V0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWcG5Db25uZWN0aW9uUm91dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZwbkNvbm5lY3Rpb25Sb3V0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZwbkdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVnBuR2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVnBuR2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbGVhc2UgYW4gSVAgYWRkcmVzcyByYW5nZSB0aGF0IHdhcyBwcm92aXNpb25lZCB0aHJvdWdoIGJyaW5nIHlvdXIgb3duIElQIGFkZHJlc3NlcyAoQllPSVApLCBhbmQgdG8gZGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIGFkZHJlc3MgcG9vbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXByb3Zpc2lvbkJ5b2lwQ2lkci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXByb3Zpc2lvbkJ5b2lwQ2lkcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVwcm92aXNpb25CeW9pcENpZHInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXByb3Zpc2lvbiBhbiBBdXRvbm9tb3VzIFN5c3RlbSBOdW1iZXIgKEFTTikgZnJvbSBhbiBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVwcm92aXNpb25JcGFtQnlvYXNuLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlcHJvdmlzaW9uSXBhbUJ5b2FzbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVwcm92aXNpb25JcGFtQnlvYXNuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVwcm92aXNpb24gYSBDSURSIHByb3Zpc2lvbmVkIGZyb20gYW4gQW1hem9uIFZQQyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pIHBvb2xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVwcm92aXNpb25JcGFtUG9vbENpZHIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVwcm92aXNpb25JcGFtUG9vbENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlcHJvdmlzaW9uSXBhbVBvb2xDaWRyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVwcm92aXNpb24gYSBDSURSIGZyb20gYSBwdWJsaWMgSVB2NCBwb29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlcHJvdmlzaW9uUHVibGljSXB2NFBvb2xDaWRyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlcHJvdmlzaW9uUHVibGljSXB2NFBvb2xDaWRyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXByb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcmVnaXN0ZXIgYW4gQW1hem9uIE1hY2hpbmUgSW1hZ2UgKEFNSSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVyZWdpc3RlckltYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlcmVnaXN0ZXJJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVyZWdpc3RlckltYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRhZ3MgZnJvbSB0aGUgc2V0IG9mIHRhZ3MgdG8gaW5jbHVkZSBpbiBub3RpZmljYXRpb25zIGFib3V0IHNjaGVkdWxlZCBldmVudHMgZm9yIHlvdXIgaW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlcmVnaXN0ZXJJbnN0YW5jZUV2ZW50Tm90aWZpY2F0aW9uQXR0cmlidXRlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXJlZ2lzdGVySW5zdGFuY2VFdmVudE5vdGlmaWNhdGlvbkF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlcmVnaXN0ZXJJbnN0YW5jZUV2ZW50Tm90aWZpY2F0aW9uQXR0cmlidXRlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcmVnaXN0ZXIgb25lIG9yIG1vcmUgbmV0d29yayBpbnRlcmZhY2UgbWVtYmVycyBmcm9tIGEgZ3JvdXAgSVAgYWRkcmVzcyBpbiBhIHRyYW5zaXQgZ2F0ZXdheSBtdWx0aWNhc3QgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cE1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcmVnaXN0ZXIgb25lIG9yIG1vcmUgbmV0d29yayBpbnRlcmZhY2Ugc291cmNlcyBmcm9tIGEgZ3JvdXAgSVAgYWRkcmVzcyBpbiBhIHRyYW5zaXQgZ2F0ZXdheSBtdWx0aWNhc3QgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQWNjb3VudEF0dHJpYnV0ZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVBY2NvdW50QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVBY2NvdW50QXR0cmlidXRlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGFuIEVsYXN0aWMgSVAgYWRkcmVzcyB0cmFuc2ZlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQWRkcmVzc1RyYW5zZmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUFkZHJlc3NUcmFuc2ZlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQWRkcmVzc1RyYW5zZmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIEVsYXN0aWMgSVAgYWRkcmVzc2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVBZGRyZXNzZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVBZGRyZXNzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQWRkcmVzc2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHNwZWNpZmllZCBFbGFzdGljIElQIGFkZHJlc3Nlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQWRkcmVzc2VzQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQWRkcmVzc2VzQXR0cmlidXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUFkZHJlc3Nlc0F0dHJpYnV0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBsb25nZXIgSUQgZm9ybWF0IHNldHRpbmdzIGZvciBhbGwgcmVzb3VyY2UgdHlwZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUFnZ3JlZ2F0ZUlkRm9ybWF0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQWdncmVnYXRlSWRGb3JtYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQWdncmVnYXRlSWRGb3JtYXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBvZiB0aGUgQXZhaWxhYmlsaXR5IFpvbmVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB5b3VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUF2YWlsYWJpbGl0eVpvbmVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQXZhaWxhYmlsaXR5Wm9uZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQXZhaWxhYmlsaXR5Wm9uZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgY3VycmVudCBpbmZyYXN0cnVjdHVyZSBwZXJmb3JtYW5jZSBtZXRyaWMgc3Vic2NyaXB0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQXdzTmV0d29ya1BlcmZvcm1hbmNlTWV0cmljU3Vic2NyaXB0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQXdzTmV0d29ya1BlcmZvcm1hbmNlTWV0cmljU3Vic2NyaXB0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGJ1bmRsaW5nIHRhc2tzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVCdW5kbGVUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUJ1bmRsZVRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUJ1bmRsZVRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIElQIGFkZHJlc3MgcmFuZ2VzIHRoYXQgd2VyZSBwcm92aXNpb25lZCB0aHJvdWdoIGJyaW5nIHlvdXIgb3duIElQIGFkZHJlc3NlcyAoQllPSVApXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVCeW9pcENpZHJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQnlvaXBDaWRycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVCeW9pcENpZHJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgQ2FwYWNpdHkgQmxvY2sgZXh0ZW5zaW9ucyBoaXN0b3J5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uSGlzdG9yeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25IaXN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25IaXN0b3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgQ2FwYWNpdHkgQmxvY2sgZXh0ZW5zaW9ucyBvZmZlcmluZ3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25PZmZlcmluZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25PZmZlcmluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBDYXBhY2l0eSBCbG9jayBvZmZlcmluZ3MgYXZhaWxhYmxlIGZvciBwdXJjaGFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja09mZmVyaW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUNhcGFjaXR5QmxvY2tPZmZlcmluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja09mZmVyaW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHJlcXVlc3RzIHRvIGFzc2lnbiB0aGUgYmlsbGluZyBvZiB0aGUgdW51c2VkIGNhcGFjaXR5IG9mIGEgQ2FwYWNpdHkgUmVzZXJ2YXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nUmVxdWVzdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ1JlcXVlc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nUmVxdWVzdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBDYXBhY2l0eSBSZXNlcnZhdGlvbiBGbGVldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBDYXBhY2l0eSBSZXNlcnZhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ2FwYWNpdHlSZXNlcnZhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQ2FwYWNpdHlSZXNlcnZhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBDYXJyaWVyIEdhdGV3YXlzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDYXJyaWVyR2F0ZXdheXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDYXJyaWVyR2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQ2FycmllckdhdGV3YXlzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgbGlua2VkIEVDMi1DbGFzc2ljIGluc3RhbmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ2xhc3NpY0xpbmtJbnN0YW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDbGFzc2ljTGlua0luc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVDbGFzc2ljTGlua0luc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBhdXRob3JpemF0aW9uIHJ1bGVzIGZvciBhIENsaWVudCBWUE4gZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNsaWVudFZwbkF1dGhvcml6YXRpb25SdWxlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUNsaWVudFZwbkF1dGhvcml6YXRpb25SdWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVDbGllbnRWcG5BdXRob3JpemF0aW9uUnVsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhY3RpdmUgY2xpZW50IGNvbm5lY3Rpb25zIGFuZCBjb25uZWN0aW9ucyB0aGF0IGhhdmUgYmVlbiB0ZXJtaW5hdGVkIHdpdGhpbiB0aGUgbGFzdCA2MCBtaW51dGVzIGZvciBhIENsaWVudCBWUE4gZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUNsaWVudFZwbkNvbm5lY3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBDbGllbnQgVlBOIGVuZHBvaW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ2xpZW50VnBuRW5kcG9pbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ2xpZW50VnBuRW5kcG9pbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNsaWVudFZwbkVuZHBvaW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSByb3V0ZXMgZm9yIGEgQ2xpZW50IFZQTiBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNsaWVudFZwblJvdXRlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSB0YXJnZXQgbmV0d29ya3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgQ2xpZW50IFZQTiBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ2xpZW50VnBuVGFyZ2V0TmV0d29ya3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDbGllbnRWcG5UYXJnZXROZXR3b3JrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVDbGllbnRWcG5UYXJnZXROZXR3b3JrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBzcGVjaWZpZWQgY3VzdG9tZXItb3duZWQgYWRkcmVzcyBwb29scyBvciBhbGwgb2YgeW91ciBjdXN0b21lci1vd25lZCBhZGRyZXNzIHBvb2xzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDb2lwUG9vbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVDb2lwUG9vbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQ29pcFBvb2xzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgY29udmVyc2lvbiB0YXNrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ29udmVyc2lvblRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ29udmVyc2lvblRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNvbnZlcnNpb25UYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGN1c3RvbWVyIGdhdGV3YXlzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVDdXN0b21lckdhdGV3YXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ3VzdG9tZXJHYXRld2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVDdXN0b21lckdhdGV3YXlzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgZGVjbGFyYXRpdmUgcG9saWNpZXMgcmVwb3J0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlRGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVEZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVEZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIERIQ1Agb3B0aW9ucyBzZXRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVEaGNwT3B0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZURoY3BPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZURoY3BPcHRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgZWdyZXNzLW9ubHkgaW50ZXJuZXQgZ2F0ZXdheXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRWdyZXNzT25seUludGVybmV0R2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRWdyZXNzT25seUludGVybmV0R2F0ZXdheXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhbiBFbGFzdGljIEdyYXBoaWNzIGFjY2VsZXJhdG9yIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVFbGFzdGljR3B1cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUVsYXN0aWNHcHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUVsYXN0aWNHcHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgZXhwb3J0IGltYWdlIHRhc2tzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVFeHBvcnRJbWFnZVRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRXhwb3J0SW1hZ2VUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVFeHBvcnRJbWFnZVRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgZXhwb3J0IGluc3RhbmNlIHRhc2tzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVFeHBvcnRUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUV4cG9ydFRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUV4cG9ydFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgZmFzdC1sYXVuY2ggZW5hYmxlZCBXaW5kb3dzIEFNSXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUZhc3RMYXVuY2hJbWFnZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVGYXN0TGF1bmNoSW1hZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUZhc3RMYXVuY2hJbWFnZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgc3RhdGUgb2YgZmFzdCBzbmFwc2hvdCByZXN0b3JlcyBmb3Igc25hcHNob3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVGYXN0U25hcHNob3RSZXN0b3Jlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUZhc3RTbmFwc2hvdFJlc3RvcmVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUZhc3RTbmFwc2hvdFJlc3RvcmVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGV2ZW50cyBmb3IgYW4gRUMyIEZsZWV0IGR1cmluZyBhIHNwZWNpZmllZCB0aW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVGbGVldEhpc3RvcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVGbGVldEhpc3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRmxlZXRIaXN0b3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHJ1bm5pbmcgaW5zdGFuY2VzIGZvciBhbiBFQzIgRmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUZsZWV0SW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRmxlZXRJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRmxlZXRJbnN0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBFQzIgRmxlZXRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVGbGVldHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVGbGVldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRmxlZXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgZmxvdyBsb2dzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVGbG93TG9ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUZsb3dMb2dzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUZsb3dMb2dzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gQW1hem9uIEZQR0EgSW1hZ2UgKEFGSSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUZwZ2FJbWFnZUF0dHJpYnV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUZwZ2FJbWFnZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVGcGdhSW1hZ2VBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBBbWF6b24gRlBHQSBJbWFnZXMgKEFGSXMpXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVGcGdhSW1hZ2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRnBnYUltYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVGcGdhSW1hZ2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIERlZGljYXRlZCBIb3N0IFJlc2VydmF0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gcHVyY2hhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUhvc3RSZXNlcnZhdGlvbk9mZmVyaW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUhvc3RSZXNlcnZhdGlvbk9mZmVyaW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVIb3N0UmVzZXJ2YXRpb25PZmZlcmluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgRGVkaWNhdGVkIEhvc3QgUmVzZXJ2YXRpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBEZWRpY2F0ZWQgSG9zdHMgaW4gdGhlIEFXUyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVIb3N0UmVzZXJ2YXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSG9zdFJlc2VydmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVIb3N0UmVzZXJ2YXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgRGVkaWNhdGVkIEhvc3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVIb3N0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUhvc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUhvc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIElBTSBpbnN0YW5jZSBwcm9maWxlIGFzc29jaWF0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBJRCBmb3JtYXQgc2V0dGluZ3MgZm9yIHJlc291cmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSWRGb3JtYXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJZEZvcm1hdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJZEZvcm1hdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBJRCBmb3JtYXQgc2V0dGluZ3MgZm9yIHJlc291cmNlcyBmb3IgYW4gSUFNIHVzZXIsIElBTSByb2xlLCBvciByb290IHVzZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUlkZW50aXR5SWRGb3JtYXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJZGVudGl0eUlkRm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUlkZW50aXR5SWRGb3JtYXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhbiBhdHRyaWJ1dGUgb2YgYW4gQW1hem9uIE1hY2hpbmUgSW1hZ2UgKEFNSSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUltYWdlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW1hZ2VBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlSW1hZ2VBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBpbWFnZXMgKEFNSXMsIEFLSXMsIGFuZCBBUklzKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW1hZ2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW1hZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUltYWdlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGltcG9ydCB2aXJ0dWFsIG1hY2hpbmUgb3IgaW1wb3J0IHNuYXBzaG90IHRhc2tzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJbXBvcnRJbWFnZVRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW1wb3J0SW1hZ2VUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJbXBvcnRJbWFnZVRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgaW1wb3J0IHNuYXBzaG90IHRhc2tzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJbXBvcnRTbmFwc2hvdFRhc2tzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW1wb3J0U25hcHNob3RUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJbXBvcnRTbmFwc2hvdFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUluc3RhbmNlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBFQzIgSW5zdGFuY2UgQ29ubmVjdCBFbmRwb2ludHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUluc3RhbmNlQ29ubmVjdEVuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUluc3RhbmNlQ29ubmVjdEVuZHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgY3JlZGl0IG9wdGlvbiBmb3IgQ1BVIHVzYWdlIG9mIG9uZSBvciBtb3JlIGJ1cnN0YWJsZSBwZXJmb3JtYW5jZSBpbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgc2V0IG9mIHRhZ3MgdG8gaW5jbHVkZSBpbiBub3RpZmljYXRpb25zIGFib3V0IHNjaGVkdWxlZCBldmVudHMgZm9yIHlvdXIgaW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJbnN0YW5jZUV2ZW50Tm90aWZpY2F0aW9uQXR0cmlidXRlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUluc3RhbmNlRXZlbnROb3RpZmljYXRpb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlRXZlbnROb3RpZmljYXRpb25BdHRyaWJ1dGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHNwZWNpZmllZCBldmVudCB3aW5kb3dzIG9yIGFsbCBldmVudCB3aW5kb3dzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJbnN0YW5jZUV2ZW50V2luZG93cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUluc3RhbmNlRXZlbnRXaW5kb3dzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlRXZlbnRXaW5kb3dzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIEFNSSB0aGF0IHdhcyB1c2VkIHRvIGxhdW5jaCBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW5zdGFuY2VJbWFnZU1ldGFkYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW5zdGFuY2VJbWFnZU1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlSW1hZ2VNZXRhZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBzdGF0dXMgb2Ygb25lIG9yIG1vcmUgaW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJbnN0YW5jZVN0YXR1cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUluc3RhbmNlU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSB0cmVlLWJhc2VkIGhpZXJhcmNoeSB0aGF0IHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIGhvc3QgcGxhY2VtZW50IG9mIEVDMiBpbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUluc3RhbmNlVG9wb2xvZ3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJbnN0YW5jZVRvcG9sb2d5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlVG9wb2xvZ3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgc2V0IG9mIGluc3RhbmNlIHR5cGVzIHRoYXQgYXJlIG9mZmVyZWQgaW4gYSBsb2NhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW5zdGFuY2VUeXBlT2ZmZXJpbmdzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW5zdGFuY2VUeXBlT2ZmZXJpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlVHlwZU9mZmVyaW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBkZXRhaWxzIG9mIGluc3RhbmNlIHR5cGVzIHRoYXQgYXJlIG9mZmVyZWQgaW4gYSBsb2NhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW5zdGFuY2VUeXBlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUluc3RhbmNlVHlwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlSW5zdGFuY2VUeXBlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGluc3RhbmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUluc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGludGVybmV0IGdhdGV3YXlzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJbnRlcm5ldEdhdGV3YXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW50ZXJuZXRHYXRld2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJbnRlcm5ldEdhdGV3YXlzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSBicmluZyB5b3VyIG93biBBdXRvbm9tb3VzIFN5c3RlbSBOdW1iZXIgKEJZT0FTTikgdGhhdCB5b3UndmUgYnJvdWdodCB0byBJUEFNXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJcGFtQnlvYXNuLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSXBhbUJ5b2FzbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJcGFtQnlvYXNuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdmVyaWZpY2F0aW9uIHRva2Vucywgd2hpY2ggcHJvdmVzIG93bmVyc2hpcCBvZiBhbiBleHRlcm5hbCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBwb29sc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSXBhbVBvb2xzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSXBhbVBvb2xzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUlwYW1Qb29scycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIElQQU0gcmVzb3VyY2UgZGlzY292ZXJpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUlwYW1SZXNvdXJjZURpc2NvdmVyaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSByZXNvdXJjZSBkaXNjb3ZlcnkgYXNzb2NpYXRpb25zIHdpdGggYW4gQW1hem9uIFZQQyBJUEFNXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVJcGFtUmVzb3VyY2VEaXNjb3ZlcnlBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJcGFtUmVzb3VyY2VEaXNjb3ZlcnlBc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJ5QXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgQW1hem9uIFZQQyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pIHNjb3Blc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSXBhbVNjb3Blcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUlwYW1TY29wZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlSXBhbVNjb3BlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSXBhbXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVJcGFtcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVJcGFtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIElQdjYgYWRkcmVzcyBwb29sc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSXB2NlBvb2xzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSXB2NlBvb2xzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUlwdjZQb29scycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGtleSBwYWlyc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlS2V5UGFpcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVLZXlQYWlycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVLZXlQYWlycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGxhdW5jaCB0ZW1wbGF0ZSB2ZXJzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBzc206R2V0UGFyYW1ldGVyc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIGxhdW5jaCB0ZW1wbGF0ZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUxhdW5jaFRlbXBsYXRlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxhdW5jaFRlbXBsYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVMYXVuY2hUZW1wbGF0ZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhbGxvdyBhIHNlcnZpY2UgdG8gZGVzY3JpYmUgbG9jYWwgZ2F0ZXdheSByb3V0ZSB0YWJsZSBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb3V0cG9zdHMvbGF0ZXN0L3VzZXJndWlkZS9pZGVudGl0eS1hY2Nlc3MtbWFuYWdlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlUGVybWlzc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgYXNzb2NpYXRpb25zIGJldHdlZW4gdmlydHVhbCBpbnRlcmZhY2UgZ3JvdXBzIGFuZCBsb2NhbCBnYXRld2F5IHJvdXRlIHRhYmxlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gVlBDcyBhbmQgbG9jYWwgZ2F0ZXdheSByb3V0ZSB0YWJsZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBsb2NhbCBnYXRld2F5IHJvdXRlIHRhYmxlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTG9jYWxHYXRld2F5Um91dGVUYWJsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGxvY2FsIGdhdGV3YXkgdmlydHVhbCBpbnRlcmZhY2UgZ3JvdXBzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXBzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgbG9jYWwgZ2F0ZXdheSB2aXJ0dWFsIGludGVyZmFjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBsb2NhbCBnYXRld2F5c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTG9jYWxHYXRld2F5cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxvY2FsR2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTG9jYWxHYXRld2F5cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBsb2NrIHN0YXR1cyBmb3IgYSBzbmFwc2hvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTG9ja2VkU25hcHNob3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTG9ja2VkU25hcHNob3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUxvY2tlZFNuYXBzaG90cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHlvdXIgRUMyIE1hYyBEZWRpY2F0ZWQgaG9zdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZU1hY0hvc3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTWFjSG9zdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTWFjSG9zdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB5b3VyIG1hbmFnZWQgcHJlZml4IGxpc3RzIGFuZCBhbnkgQVdTLW1hbmFnZWQgcHJlZml4IGxpc3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVNYW5hZ2VkUHJlZml4TGlzdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVNYW5hZ2VkUHJlZml4TGlzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTWFuYWdlZFByZWZpeExpc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgRWxhc3RpYyBJUCBhZGRyZXNzZXMgdGhhdCBhcmUgYmVpbmcgbW92ZWQgdG8gdGhlIEVDMi1WUEMgcGxhdGZvcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZU1vdmluZ0FkZHJlc3Nlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZU1vdmluZ0FkZHJlc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVNb3ZpbmdBZGRyZXNzZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBOQVQgZ2F0ZXdheXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZU5hdEdhdGV3YXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTmF0R2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTmF0R2F0ZXdheXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBuZXR3b3JrIEFDTHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZU5ldHdvcmtBY2xzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTmV0d29ya0FjbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTmV0d29ya0FjbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBOZXR3b3JrIEFjY2VzcyBTY29wZSBhbmFseXNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBOZXR3b3JrIEFjY2VzcyBTY29wZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3Blcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBuZXR3b3JrIGluc2lnaHRzIGFuYWx5c2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVOZXR3b3JrSW5zaWdodHNBbmFseXNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FuYWx5c2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FuYWx5c2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgbmV0d29yayBpbnNpZ2h0cyBwYXRoc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTmV0d29ya0luc2lnaHRzUGF0aHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVOZXR3b3JrSW5zaWdodHNQYXRocygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVOZXR3b3JrSW5zaWdodHNQYXRocycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgbmV0d29yayBpbnRlcmZhY2UgYXR0cmlidXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldHdvcmsgaW50ZXJmYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgbmV0d29yayBpbnRlcmZhY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVOZXR3b3JrSW50ZXJmYWNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgT3V0cG9zdCBMQUdzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVPdXRwb3N0TGFncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZU91dHBvc3RMYWdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZU91dHBvc3RMYWdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgcGxhY2VtZW50IGdyb3Vwc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUGxhY2VtZW50R3JvdXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUGxhY2VtZW50R3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVBsYWNlbWVudEdyb3VwcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGF2YWlsYWJsZSBBV1Mgc2VydmljZXMgaW4gYSBwcmVmaXggbGlzdCBmb3JtYXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVByZWZpeExpc3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUHJlZml4TGlzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUHJlZml4TGlzdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgSUQgZm9ybWF0IHNldHRpbmdzIGZvciB0aGUgcm9vdCB1c2VyIGFuZCBhbGwgSUFNIHJvbGVzIGFuZCBJQU0gdXNlcnMgdGhhdCBoYXZlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGEgbG9uZ2VyIElEICgxNy1jaGFyYWN0ZXIgSUQpIHByZWZlcmVuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVByaW5jaXBhbElkRm9ybWF0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUHJpbmNpcGFsSWRGb3JtYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUHJpbmNpcGFsSWRGb3JtYXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBJUHY0IGFkZHJlc3MgcG9vbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVB1YmxpY0lwdjRQb29scy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVB1YmxpY0lwdjRQb29scygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVQdWJsaWNJcHY0UG9vbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBBV1MgUmVnaW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHlvdXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUmVnaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVJlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUmVnaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgcm9vdCB2b2x1bWUgcmVwbGFjZW1lbnQgdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUmVwbGFjZVJvb3RWb2x1bWVUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVJlcGxhY2VSb290Vm9sdW1lVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUmVwbGFjZVJvb3RWb2x1bWVUYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHB1cmNoYXNlZCBSZXNlcnZlZCBJbnN0YW5jZXMgaW4geW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVSZXNlcnZlZEluc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgeW91ciBhY2NvdW50J3MgUmVzZXJ2ZWQgSW5zdGFuY2UgbGlzdGluZ3MgaW4gdGhlIFJlc2VydmVkIEluc3RhbmNlIE1hcmtldHBsYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVSZXNlcnZlZEluc3RhbmNlc0xpc3RpbmdzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUmVzZXJ2ZWRJbnN0YW5jZXNMaXN0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVSZXNlcnZlZEluc3RhbmNlc0xpc3RpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIG1vZGlmaWNhdGlvbnMgbWFkZSB0byBvbmUgb3IgbW9yZSBSZXNlcnZlZCBJbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzTW9kaWZpY2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzTW9kaWZpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVSZXNlcnZlZEluc3RhbmNlc01vZGlmaWNhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgUmVzZXJ2ZWQgSW5zdGFuY2Ugb2ZmZXJpbmdzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgcHVyY2hhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmdzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUmVzZXJ2ZWRJbnN0YW5jZXNPZmZlcmluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUmVzZXJ2ZWRJbnN0YW5jZXNPZmZlcmluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSByb3V0ZSBzZXJ2ZXIgZW5kcG9pbnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVSb3V0ZVNlcnZlckVuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVJvdXRlU2VydmVyRW5kcG9pbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVJvdXRlU2VydmVyRW5kcG9pbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgcm91dGUgc2VydmVyIHBlZXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVSb3V0ZVNlcnZlclBlZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUm91dGVTZXJ2ZXJQZWVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVSb3V0ZVNlcnZlclBlZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgcm91dGUgc2VydmVyc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUm91dGVTZXJ2ZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUm91dGVTZXJ2ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVJvdXRlU2VydmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHJvdXRlIHRhYmxlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUm91dGVUYWJsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVSb3V0ZVRhYmxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVSb3V0ZVRhYmxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGZpbmQgYXZhaWxhYmxlIHNjaGVkdWxlcyBmb3IgU2NoZWR1bGVkIEluc3RhbmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlU2NoZWR1bGVkSW5zdGFuY2VBdmFpbGFiaWxpdHkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVTY2hlZHVsZWRJbnN0YW5jZUF2YWlsYWJpbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTY2hlZHVsZWRJbnN0YW5jZUF2YWlsYWJpbGl0eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIFNjaGVkdWxlZCBJbnN0YW5jZXMgaW4geW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTY2hlZHVsZWRJbnN0YW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVTY2hlZHVsZWRJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU2NoZWR1bGVkSW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIFZQQ3Mgb24gdGhlIG90aGVyIHNpZGUgb2YgYSBWUEMgcGVlcmluZyBjb25uZWN0aW9uIHRoYXQgYXJlIHJlZmVyZW5jaW5nIHNwZWNpZmllZCBWUEMgc2VjdXJpdHkgZ3JvdXBzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTZWN1cml0eUdyb3VwUmVmZXJlbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVNlY3VyaXR5R3JvdXBSZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNlY3VyaXR5R3JvdXBSZWZlcmVuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgb2YgeW91ciBzZWN1cml0eSBncm91cCBydWxlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlU2VjdXJpdHlHcm91cFJ1bGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU2VjdXJpdHlHcm91cFJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNlY3VyaXR5R3JvdXBSdWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHNlY3VyaXR5IGdyb3VwIFZQQyBhc3NvY2lhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVNlY3VyaXR5R3JvdXBWcGNBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVTZWN1cml0eUdyb3VwVnBjQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNlY3VyaXR5R3JvdXBWcGNBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBzZWN1cml0eSBncm91cHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVNlY3VyaXR5R3JvdXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU2VjdXJpdHlHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU2VjdXJpdHlHcm91cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBzZXJ2aWNlIGxpbmsgdmlydHVhbCBpbnRlcmZhY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTZXJ2aWNlTGlua1ZpcnR1YWxJbnRlcmZhY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU2VydmljZUxpbmtWaXJ0dWFsSW50ZXJmYWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTZXJ2aWNlTGlua1ZpcnR1YWxJbnRlcmZhY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gYXR0cmlidXRlIG9mIGEgc25hcHNob3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVNuYXBzaG90QXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgc3RvcmFnZSB0aWVyIHN0YXR1cyBmb3IgQW1hem9uIEVCUyBzbmFwc2hvdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVNuYXBzaG90VGllclN0YXR1cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVNuYXBzaG90VGllclN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTbmFwc2hvdFRpZXJTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBFQlMgc25hcHNob3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTbmFwc2hvdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVTbmFwc2hvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU25hcHNob3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGRhdGEgZmVlZCBmb3IgU3BvdCBJbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTcG90RGF0YWZlZWRTdWJzY3JpcHRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgcnVubmluZyBpbnN0YW5jZXMgZm9yIGEgU3BvdCBGbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlU3BvdEZsZWV0SW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU3BvdEZsZWV0SW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNwb3RGbGVldEluc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBldmVudHMgZm9yIGEgU3BvdCBGbGVldCByZXF1ZXN0IGR1cmluZyBhIHNwZWNpZmllZCB0aW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0SGlzdG9yeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVNwb3RGbGVldFJlcXVlc3RIaXN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNwb3RGbGVldFJlcXVlc3RIaXN0b3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgU3BvdCBGbGVldCByZXF1ZXN0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlU3BvdEZsZWV0UmVxdWVzdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIFNwb3QgSW5zdGFuY2UgcmVxdWVzdHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVNwb3RJbnN0YW5jZVJlcXVlc3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU3BvdEluc3RhbmNlUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU3BvdEluc3RhbmNlUmVxdWVzdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgU3BvdCBJbnN0YW5jZSBwcmljZSBoaXN0b3J5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTcG90UHJpY2VIaXN0b3J5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU3BvdFByaWNlSGlzdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTcG90UHJpY2VIaXN0b3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHN0YWxlIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBzZWN1cml0eSBncm91cHMgaW4gYSBzcGVjaWZpZWQgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTdGFsZVNlY3VyaXR5R3JvdXBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU3RhbGVTZWN1cml0eUdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTdGFsZVNlY3VyaXR5R3JvdXBzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHByb2dyZXNzIG9mIHRoZSBBTUkgc3RvcmUgdGFza3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVN0b3JlSW1hZ2VUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVN0b3JlSW1hZ2VUYXNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTdG9yZUltYWdlVGFza3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBzdWJuZXRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTdWJuZXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU3VibmV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTdWJuZXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgdGFncyBmb3IgYW4gQW1hem9uIEVDMiByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGFncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVGFncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRyYWZmaWMgbWlycm9yIGZpbHRlcnMgdGhhdCBkZXRlcm1pbmUgdGhlIHRyYWZmaWMgdGhhdCBpcyBtaXJyb3JlZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVHJhZmZpY01pcnJvckZpbHRlclJ1bGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVHJhZmZpY01pcnJvckZpbHRlclJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHRyYWZmaWMgbWlycm9yIGZpbHRlcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRyYWZmaWNNaXJyb3JGaWx0ZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVHJhZmZpY01pcnJvckZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVHJhZmZpY01pcnJvckZpbHRlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSB0cmFmZmljIG1pcnJvciBzZXNzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVHJhZmZpY01pcnJvclNlc3Npb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVHJhZmZpY01pcnJvclNlc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYWZmaWNNaXJyb3JTZXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHRyYWZmaWMgbWlycm9yIHRhcmdldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRyYWZmaWNNaXJyb3JUYXJnZXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVHJhZmZpY01pcnJvclRhcmdldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVHJhZmZpY01pcnJvclRhcmdldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBhdHRhY2htZW50cyBiZXR3ZWVuIHJlc291cmNlcyBhbmQgdHJhbnNpdCBnYXRld2F5c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlBdHRhY2htZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRyYW5zaXRHYXRld2F5QXR0YWNobWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlBdHRhY2htZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHRyYW5zaXQgZ2F0ZXdheSBjb25uZWN0IHBlZXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgdHJhbnNpdCBnYXRld2F5IGNvbm5lY3QgYXR0YWNobWVudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRyYW5zaXRHYXRld2F5Q29ubmVjdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheUNvbm5lY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYW5zaXRHYXRld2F5Q29ubmVjdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSB0cmFuc2l0IGdhdGV3YXkgbXVsdGljYXN0IGRvbWFpbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWlucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWlucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSB0cmFuc2l0IGdhdGV3YXkgcGVlcmluZyBhdHRhY2htZW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgdHJhbnNpdCBnYXRld2F5IHBvbGljeSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgdHJhbnNpdCBnYXRld2F5IHJvdXRlIHRhYmxlIGFubm91bmNlbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIHRyYW5zaXQgZ2F0ZXdheSByb3V0ZSB0YWJsZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBWUEMgYXR0YWNobWVudHMgb24gYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSB0cmFuc2l0IGdhdGV3YXlzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUcmFuc2l0R2F0ZXdheXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgbmV0d29yayBpbnRlcmZhY2UgdHJ1bmsgYXNzb2NpYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUcnVua0ludGVyZmFjZUFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRydW5rSW50ZXJmYWNlQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRydW5rSW50ZXJmYWNlQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHNwZWNpZmllZCBWZXJpZmllZCBBY2Nlc3MgZW5kcG9pbnRzIG9yIGFsbCBWZXJpZmllZCBBY2Nlc3MgZW5kcG9pbnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWZXJpZmllZEFjY2Vzc0VuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHNwZWNpZmllZCBWZXJpZmllZCBBY2Nlc3MgZ3JvdXBzIG9yIGFsbCBWZXJpZmllZCBBY2Nlc3MgZ3JvdXBzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWZXJpZmllZEFjY2Vzc0dyb3Vwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZlcmlmaWVkQWNjZXNzR3JvdXBzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGN1cnJlbnQgbG9nZ2luZyBjb25maWd1cmF0aW9uIGZvciB0aGUgVmVyaWZpZWQgQWNjZXNzIGluc3RhbmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUxvZ2dpbmdDb25maWd1cmF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VMb2dnaW5nQ29uZmlndXJhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUxvZ2dpbmdDb25maWd1cmF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBBV1MgV2ViIEFwcGxpY2F0aW9uIEZpcmV3YWxsIChXQUYpIHdlYiBhY2Nlc3MgY29udHJvbCBsaXN0IChBQ0wpIGFzc29jaWF0aW9ucyBmb3IgYSBWZXJpZmllZCBBY2Nlc3MgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZlcmlmaWVkLWFjY2Vzcy9sYXRlc3QvdWcvd2FmLWludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbEFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWZXJpZmllZEFjY2Vzc0luc3RhbmNlV2ViQWNsQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIHNwZWNpZmllZCBWZXJpZmllZCBBY2Nlc3MgaW5zdGFuY2VzIG9yIGFsbCBWZXJpZmllZCBBY2Nlc3MgaW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWZXJpZmllZEFjY2Vzc0luc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgZGV0YWlscyBvZiBleGlzdGluZyBWZXJpZmllZCBBY2Nlc3MgdHJ1c3QgcHJvdmlkZXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gYXR0cmlidXRlIG9mIGFuIEVCUyB2b2x1bWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWb2x1bWVBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIG9uZSBvciBtb3JlIEVCUyB2b2x1bWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWb2x1bWVTdGF0dXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVWb2x1bWVTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVm9sdW1lU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgb25lIG9yIG1vcmUgRUJTIHZvbHVtZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZvbHVtZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVWb2x1bWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZvbHVtZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgY3VycmVudCBtb2RpZmljYXRpb24gc3RhdHVzIG9mIG9uZSBvciBtb3JlIEVCUyB2b2x1bWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWb2x1bWVzTW9kaWZpY2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZvbHVtZXNNb2RpZmljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZvbHVtZXNNb2RpZmljYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gYXR0cmlidXRlIG9mIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWcGNBdHRyaWJ1dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVWcGNBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVnBjQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gZXhjbHVzaW9uIGxpc3QgZm9yIGJsb2NrZWQgcHVibGljIGFjY2VzcyBvbiBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9wdGlvbnMgZm9yIGJsb2NrZWQgcHVibGljIGFjY2VzcyBvbiBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjQmxvY2tQdWJsaWNBY2Nlc3NPcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBjQmxvY2tQdWJsaWNBY2Nlc3NPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZwY0Jsb2NrUHVibGljQWNjZXNzT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBDbGFzc2ljTGluayBzdGF0dXMgb2Ygb25lIG9yIG1vcmUgVlBDc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjQ2xhc3NpY0xpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVWcGNDbGFzc2ljTGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWcGNDbGFzc2ljTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBDbGFzc2ljTGluayBETlMgc3VwcG9ydCBzdGF0dXMgb2Ygb25lIG9yIG1vcmUgVlBDc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjQ2xhc3NpY0xpbmtEbnNTdXBwb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBjQ2xhc3NpY0xpbmtEbnNTdXBwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZwY0NsYXNzaWNMaW5rRG5zU3VwcG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBWUEMgZW5kcG9pbnQgYXNzb2NpYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWcGNFbmRwb2ludEFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZwY0VuZHBvaW50QXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZwY0VuZHBvaW50QXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIGNvbm5lY3Rpb24gbm90aWZpY2F0aW9ucyBmb3IgVlBDIGVuZHBvaW50cyBhbmQgVlBDIGVuZHBvaW50IHNlcnZpY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgdGhlIFZQQyBlbmRwb2ludCBjb25uZWN0aW9ucyB0byB5b3VyIFZQQyBlbmRwb2ludCBzZXJ2aWNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjRW5kcG9pbnRDb25uZWN0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVnBjRW5kcG9pbnRDb25uZWN0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIFZQQyBlbmRwb2ludCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25zICh5b3VyIHNlcnZpY2VzKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBwcmluY2lwYWxzIChzZXJ2aWNlIGNvbnN1bWVycykgdGhhdCBhcmUgcGVybWl0dGVkIHRvIGRpc2NvdmVyIHlvdXIgVlBDIGVuZHBvaW50IHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZwY0VuZHBvaW50U2VydmljZVBlcm1pc3Npb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhbGwgc3VwcG9ydGVkIEFXUyBzZXJ2aWNlcyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyBhIFZQQyBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZwY0VuZHBvaW50U2VydmljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIFZQQyBlbmRwb2ludHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZwY0VuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVZwY0VuZHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVWcGNFbmRwb2ludHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBWUEMgcGVlcmluZyBjb25uZWN0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVnBjUGVlcmluZ0Nvbm5lY3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBjUGVlcmluZ0Nvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZwY1BlZXJpbmdDb25uZWN0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBvciBtb3JlIFZQQ3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZwY3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVWcGNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVZwY3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSBWUE4gY29ubmVjdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZwbkNvbm5lY3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBuQ29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVnBuQ29ubmVjdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBvbmUgb3IgbW9yZSB2aXJ0dWFsIHByaXZhdGUgZ2F0ZXdheXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVZwbkdhdGV3YXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVnBuR2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVnBuR2F0ZXdheXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bmxpbmsgKGRldGFjaCkgYSBsaW5rZWQgRUMyLUNsYXNzaWMgaW5zdGFuY2UgZnJvbSBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXRhY2hDbGFzc2ljTGlua1ZwYy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXRhY2hDbGFzc2ljTGlua1ZwYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGV0YWNoQ2xhc3NpY0xpbmtWcGMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXRhY2ggYW4gaW50ZXJuZXQgZ2F0ZXdheSBmcm9tIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RldGFjaEludGVybmV0R2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXRhY2hJbnRlcm5ldEdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RldGFjaEludGVybmV0R2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRldGFjaCBhIG5ldHdvcmsgaW50ZXJmYWNlIGZyb20gYW4gaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGV0YWNoTmV0d29ya0ludGVyZmFjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXRhY2hOZXR3b3JrSW50ZXJmYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGV0YWNoIGEgdHJ1c3QgcHJvdmlkZXIgZnJvbSBhIFZlcmlmaWVkIEFjY2VzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGV0YWNoVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXRhY2ggYW4gRUJTIHZvbHVtZSBmcm9tIGFuIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RldGFjaFZvbHVtZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXRhY2hWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RldGFjaFZvbHVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRldGFjaCBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5IGZyb20gYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGV0YWNoVnBuR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXRhY2hWcG5HYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXRhY2hWcG5HYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBFbGFzdGljIElQIGFkZHJlc3MgdHJhbnNmZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZUFkZHJlc3NUcmFuc2Zlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhYmxlQWRkcmVzc1RyYW5zZmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlQWRkcmVzc1RyYW5zZmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBhbGxvd2VkIGltYWdlcyBzZXR0aW5nc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhYmxlQWxsb3dlZEltYWdlc1NldHRpbmdzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVBbGxvd2VkSW1hZ2VzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2FibGVBbGxvd2VkSW1hZ2VzU2V0dGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhYmxlIGluZnJhc3RydWN0dXJlIHBlcmZvcm1hbmNlIG1ldHJpYyBzdWJzY3JpcHRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVBd3NOZXR3b3JrUGVyZm9ybWFuY2VNZXRyaWNTdWJzY3JpcHRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgRUJTIGVuY3J5cHRpb24gYnkgZGVmYXVsdCBmb3IgeW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVFYnNFbmNyeXB0aW9uQnlEZWZhdWx0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVFYnNFbmNyeXB0aW9uQnlEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlRWJzRW5jcnlwdGlvbkJ5RGVmYXVsdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgZmFzdGVyIGxhdW5jaGluZyBmb3IgV2luZG93cyBBTUlzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVGYXN0TGF1bmNoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVGYXN0TGF1bmNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlRmFzdExhdW5jaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgZmFzdCBzbmFwc2hvdCByZXN0b3JlcyBmb3Igb25lIG9yIG1vcmUgc25hcHNob3RzIGluIHNwZWNpZmllZCBBdmFpbGFiaWxpdHkgWm9uZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVGYXN0U25hcHNob3RSZXN0b3JlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBhbiBBTUlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZUltYWdlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYWJsZUltYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBibG9jayBwdWJsaWMgYWNjZXNzIGZvciBBTUlzIGF0IHRoZSBhY2NvdW50IGxldmVsIGluIHRoZSBzcGVjaWZpZWQgQVdTIFJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhYmxlSW1hZ2VCbG9ja1B1YmxpY0FjY2Vzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhYmxlSW1hZ2VCbG9ja1B1YmxpY0FjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYWJsZUltYWdlQmxvY2tQdWJsaWNBY2Nlc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgdGhlIGRlcHJlY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgQU1JXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlSW1hZ2VEZXByZWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgZGVyZWdpc3RyYXRpb24gcHJvdGVjdGlvbiBmb3IgYW4gQU1JLiBXaGVuIGRlcmVnaXN0cmF0aW9uIHByb3RlY3Rpb24gaXMgZGlzYWJsZWQsIHRoZSBBTUkgY2FuIGJlIGRlcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZUltYWdlRGVyZWdpc3RyYXRpb25Qcm90ZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhYmxlIGFuIEFXUyBPcmdhbml6YXRpb25zIG1lbWJlciBhY2NvdW50IGFzIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBhZG1pbiBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBvcmdhbml6YXRpb25zOkRlcmVnaXN0ZXJEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2FibGVJcGFtT3JnYW5pemF0aW9uQWRtaW5BY2NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSByb3V0ZSBzZXJ2ZXIgcHJvcGFnYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZVJvdXRlU2VydmVyUHJvcGFnYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZVJvdXRlU2VydmVyUHJvcGFnYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2FibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBhY2Nlc3MgdG8gdGhlIEVDMiBzZXJpYWwgY29uc29sZSBvZiBhbGwgaW5zdGFuY2VzIGZvciB5b3VyIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZVNlcmlhbENvbnNvbGVBY2Nlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZVNlcmlhbENvbnNvbGVBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2FibGVTZXJpYWxDb25zb2xlQWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSB0aGUgYmxvY2sgcHVibGljIGFjY2VzcyBmb3Igc25hcHNob3RzIHNldHRpbmcgZm9yIGEgUmVnaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlU25hcHNob3RCbG9ja1B1YmxpY0FjY2VzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgYSByZXNvdXJjZSBhdHRhY2htZW50IGZyb20gcHJvcGFnYXRpbmcgcm91dGVzIHRvIHRoZSBzcGVjaWZpZWQgcHJvcGFnYXRpb24gcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5IGZyb20gcHJvcGFnYXRpbmcgcm91dGVzIHRvIGEgc3BlY2lmaWVkIHJvdXRlIHRhYmxlIG9mIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlVmd3Um91dGVQcm9wYWdhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgQ2xhc3NpY0xpbmsgZm9yIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVWcGNDbGFzc2ljTGluay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhYmxlVnBjQ2xhc3NpY0xpbmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2FibGVWcGNDbGFzc2ljTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2FibGUgQ2xhc3NpY0xpbmsgRE5TIHN1cHBvcnQgZm9yIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2FibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZVZwY0NsYXNzaWNMaW5rRG5zU3VwcG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYWJsZVZwY0NsYXNzaWNMaW5rRG5zU3VwcG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhbiBFbGFzdGljIElQIGFkZHJlc3MgZnJvbSBhbiBpbnN0YW5jZSBvciBuZXR3b3JrIGludGVyZmFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVBZGRyZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUFkZHJlc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYSBwZW5kaW5nIHJlcXVlc3QgdG8gYXNzaWduIGJpbGxpbmcgb2YgdGhlIHVudXNlZCBjYXBhY2l0eSBvZiBhIENhcGFjaXR5IFJlc2VydmF0aW9uIHRvIGEgY29uc3VtZXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSB0YXJnZXQgbmV0d29yayBmcm9tIGEgQ2xpZW50IFZQTiBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVDbGllbnRWcG5UYXJnZXROZXR3b3JrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYW4gQUNNIGNlcnRpZmljYXRlIGZyb20gYSBJQU0gcm9sZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVFbmNsYXZlQ2VydGlmaWNhdGVJYW1Sb2xlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZUVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYW4gSUFNIGluc3RhbmNlIHByb2ZpbGUgZnJvbSBhIHJ1bm5pbmcgb3Igc3RvcHBlZCBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgb25lIG9yIG1vcmUgdGFyZ2V0cyBmcm9tIGFuIGV2ZW50IHdpbmRvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVJbnN0YW5jZUV2ZW50V2luZG93Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZUluc3RhbmNlRXZlbnRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUluc3RhbmNlRXZlbnRXaW5kb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYW4gQXV0b25vbW91cyBTeXN0ZW0gTnVtYmVyIChBU04pIGZyb20gYSBCWU9JUCBDSURSXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZUlwYW1CeW9hc24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlSXBhbUJ5b2FzbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlSXBhbUJ5b2FzbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhIHJlc291cmNlIGRpc2NvdmVyeSBmcm9tIGFuIEFtYXpvbiBWUEMgSVBBTVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVJcGFtUmVzb3VyY2VEaXNjb3ZlcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVJcGFtUmVzb3VyY2VEaXNjb3ZlcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBzZWNvbmRhcnkgRWxhc3RpYyBJUCBhZGRyZXNzIGZyb20gYSBwdWJsaWMgTkFUIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlTmF0R2F0ZXdheUFkZHJlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTmF0R2F0ZXdheUFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgcm91dGUgc2VydmVyIGZyb20gYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVJvdXRlU2VydmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgc3VibmV0IGZyb20gYSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVSb3V0ZVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBzZWN1cml0eSBncm91cCBmcm9tIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlU2VjdXJpdHlHcm91cFZwYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlU2VjdXJpdHlHcm91cFZwYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhIENJRFIgYmxvY2sgZnJvbSBhIHN1Ym5ldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVTdWJuZXRDaWRyQmxvY2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlU3VibmV0Q2lkckJsb2NrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVTdWJuZXRDaWRyQmxvY2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgb25lIG9yIG1vcmUgc3VibmV0cyBmcm9tIGEgdHJhbnNpdCBnYXRld2F5IG11bHRpY2FzdCBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgcG9saWN5IHRhYmxlIGZyb20gYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgcmVzb3VyY2UgYXR0YWNobWVudCBmcm9tIGEgdHJhbnNpdCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhIGJyYW5jaCBuZXR3b3JrIGludGVyZmFjZSB0byBhIHRydW5rIG5ldHdvcmsgaW50ZXJmYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZVRydW5rSW50ZXJmYWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVRydW5rSW50ZXJmYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVUcnVua0ludGVyZmFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhbiBBV1MgV2ViIEFwcGxpY2F0aW9uIEZpcmV3YWxsIChXQUYpIHdlYiBhY2Nlc3MgY29udHJvbCBsaXN0IChBQ0wpIGZyb20gYSBWZXJpZmllZCBBY2Nlc3MgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92ZXJpZmllZC1hY2Nlc3MvbGF0ZXN0L3VnL3dhZi1pbnRlZ3JhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlV2ViQWNsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlV2ViQWNsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgQ0lEUiBibG9jayBmcm9tIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZVZwY0NpZHJCbG9jay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVWcGNDaWRyQmxvY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVZwY0NpZHJCbG9jaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBFbGFzdGljIElQIGFkZHJlc3MgdHJhbnNmZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlQWRkcmVzc1RyYW5zZmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuYWJsZUFkZHJlc3NUcmFuc2ZlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5hYmxlQWRkcmVzc1RyYW5zZmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGFsbG93ZWQgaW1hZ2VzIHNldHRpbmdzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZUFsbG93ZWRJbWFnZXNTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVBbGxvd2VkSW1hZ2VzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuYWJsZUFsbG93ZWRJbWFnZXNTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBpbmZyYXN0cnVjdHVyZSBwZXJmb3JtYW5jZSBzdWJzY3JpcHRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVBd3NOZXR3b3JrUGVyZm9ybWFuY2VNZXRyaWNTdWJzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBFQlMgZW5jcnlwdGlvbiBieSBkZWZhdWx0IGZvciB5b3VyIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlRWJzRW5jcnlwdGlvbkJ5RGVmYXVsdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVFYnNFbmNyeXB0aW9uQnlEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVFYnNFbmNyeXB0aW9uQnlEZWZhdWx0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGZhc3RlciBsYXVuY2hpbmcgZm9yIFdpbmRvd3MgQU1Jc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZUxhdW5jaFRlbXBsYXRlXG4gICAqIC0gZWMyOkNyZWF0ZVNuYXBzaG90XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICogLSBlYzI6RGVsZXRlU25hcHNob3RcbiAgICogLSBlYzI6RGVzY3JpYmVJbWFnZXNcbiAgICogLSBlYzI6RGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZVxuICAgKiAtIGVjMjpEZXNjcmliZUluc3RhbmNlU3RhdHVzXG4gICAqIC0gZWMyOkRlc2NyaWJlSW5zdGFuY2VUeXBlT2ZmZXJpbmdzXG4gICAqIC0gZWMyOkRlc2NyaWJlSW5zdGFuY2VzXG4gICAqIC0gZWMyOkRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9uc1xuICAgKiAtIGVjMjpEZXNjcmliZUxhdW5jaFRlbXBsYXRlc1xuICAgKiAtIGVjMjpEZXNjcmliZVNuYXBzaG90c1xuICAgKiAtIGVjMjpEZXNjcmliZVN1Ym5ldHNcbiAgICogLSBlYzI6UnVuSW5zdGFuY2VzXG4gICAqIC0gZWMyOlN0b3BJbnN0YW5jZXNcbiAgICogLSBlYzI6VGVybWluYXRlSW5zdGFuY2VzXG4gICAqIC0gaWFtOlBhc3NSb2xlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlRmFzdExhdW5jaC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVGYXN0TGF1bmNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVGYXN0TGF1bmNoJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGZhc3Qgc25hcHNob3QgcmVzdG9yZXMgZm9yIG9uZSBvciBtb3JlIHNuYXBzaG90cyBpbiBzcGVjaWZpZWQgQXZhaWxhYmlsaXR5IFpvbmVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVGYXN0U25hcHNob3RSZXN0b3JlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlLWVuYWJsZSBhIGRpc2FibGVkIEFNSVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FbmFibGVJbWFnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5hYmxlSW1hZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmFibGUgYmxvY2sgcHVibGljIGFjY2VzcyBmb3IgQU1JcyBhdCB0aGUgYWNjb3VudCBsZXZlbCBpbiB0aGUgc3BlY2lmaWVkIEFXUyBSZWdpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlSW1hZ2VCbG9ja1B1YmxpY0FjY2Vzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVJbWFnZUJsb2NrUHVibGljQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVJbWFnZUJsb2NrUHVibGljQWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGRlcHJlY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgQU1JIGF0IHRoZSBzcGVjaWZpZWQgZGF0ZSBhbmQgdGltZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FbmFibGVJbWFnZURlcHJlY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuYWJsZUltYWdlRGVwcmVjYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuYWJsZUltYWdlRGVwcmVjYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmFibGUgZGVyZWdpc3RyYXRpb24gcHJvdGVjdGlvbiBmb3IgYW4gQU1JLiBXaGVuIGRlcmVnaXN0cmF0aW9uIHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlIEFNSSBjYW4ndCBiZSBkZXJlZ2lzdGVyZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuYWJsZUltYWdlRGVyZWdpc3RyYXRpb25Qcm90ZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGFuIEFXUyBPcmdhbml6YXRpb25zIG1lbWJlciBhY2NvdW50IGFzIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBhZG1pbiBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBpYW06Q3JlYXRlU2VydmljZUxpbmtlZFJvbGVcbiAgICogLSBvcmdhbml6YXRpb25zOkVuYWJsZUFXU1NlcnZpY2VBY2Nlc3NcbiAgICogLSBvcmdhbml6YXRpb25zOlJlZ2lzdGVyRGVsZWdhdGVkQWRtaW5pc3RyYXRvclxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZUlwYW1Pcmdhbml6YXRpb25BZG1pbkFjY291bnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRW5hYmxlSXBhbU9yZ2FuaXphdGlvbkFkbWluQWNjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5hYmxlSXBhbU9yZ2FuaXphdGlvbkFkbWluQWNjb3VudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBvcmdhbml6YXRpb24gc2hhcmluZyBvZiByZWFjaGFiaWxpdHkgYW5hbHl6ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGlhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZVxuICAgKiAtIG9yZ2FuaXphdGlvbnM6RW5hYmxlQVdTU2VydmljZUFjY2Vzc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZVJlYWNoYWJpbGl0eUFuYWx5emVyT3JnYW5pemF0aW9uU2hhcmluZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVSZWFjaGFiaWxpdHlBbmFseXplck9yZ2FuaXphdGlvblNoYXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuYWJsZVJlYWNoYWJpbGl0eUFuYWx5emVyT3JnYW5pemF0aW9uU2hhcmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSByb3V0ZSBzZXJ2ZXIgcHJvcGFnYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlUm91dGVTZXJ2ZXJQcm9wYWdhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGFjY2VzcyB0byB0aGUgRUMyIHNlcmlhbCBjb25zb2xlIG9mIGFsbCBpbnN0YW5jZXMgZm9yIHlvdXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FbmFibGVTZXJpYWxDb25zb2xlQWNjZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuYWJsZVNlcmlhbENvbnNvbGVBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0VuYWJsZVNlcmlhbENvbnNvbGVBY2Nlc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmFibGUgb3IgbW9kaWZ5IHRoZSBibG9jayBwdWJsaWMgYWNjZXNzIGZvciBzbmFwc2hvdHMgc2V0dGluZyBmb3IgYSBSZWdpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlU25hcHNob3RCbG9ja1B1YmxpY0FjY2Vzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIGFuIGF0dGFjaG1lbnQgdG8gcHJvcGFnYXRlIHJvdXRlcyB0byBhIHByb3BhZ2F0aW9uIHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBhIHZpcnR1YWwgcHJpdmF0ZSBnYXRld2F5IHRvIHByb3BhZ2F0ZSByb3V0ZXMgdG8gYSBWUEMgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRW5hYmxlVmd3Um91dGVQcm9wYWdhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIEkvTyBvcGVyYXRpb25zIGZvciBhIHZvbHVtZSB0aGF0IGhhZCBJL08gb3BlcmF0aW9ucyBkaXNhYmxlZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FbmFibGVWb2x1bWVJTy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVWb2x1bWVJTygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5hYmxlVm9sdW1lSU8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmFibGUgYSBWUEMgZm9yIENsYXNzaWNMaW5rXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0VuYWJsZVZwY0NsYXNzaWNMaW5rLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuYWJsZVZwY0NsYXNzaWNMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVWcGNDbGFzc2ljTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBhIFZQQyB0byBzdXBwb3J0IEROUyBob3N0bmFtZSByZXNvbHV0aW9uIGZvciBDbGFzc2ljTGlua1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FbmFibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRW5hYmxlVnBjQ2xhc3NpY0xpbmtEbnNTdXBwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmFibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkb3dubG9hZCB0aGUgY2xpZW50IGNlcnRpZmljYXRlIHJldm9jYXRpb24gbGlzdCBmb3IgYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFeHBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZG93bmxvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBDbGllbnQgVlBOIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRDbGllbnRWcG5DbGllbnRDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFeHBvcnRDbGllbnRWcG5DbGllbnRDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZXhwb3J0IGFuIEFtYXpvbiBNYWNoaW5lIEltYWdlIChBTUkpIHRvIGEgVk0gZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FeHBvcnRJbWFnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRXhwb3J0SW1hZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBleHBvcnQgcm91dGVzIGZyb20gYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGUgdG8gYW4gQW1hem9uIFMzIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FeHBvcnRUcmFuc2l0R2F0ZXdheVJvdXRlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRUcmFuc2l0R2F0ZXdheVJvdXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRXhwb3J0VHJhbnNpdEdhdGV3YXlSb3V0ZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBleHBvcnQgYSB2ZXJpZmllZCBhY2Nlc3MgaW5zdGFuY2UgY2xpZW50IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FeHBvcnRWZXJpZmllZEFjY2Vzc0luc3RhbmNlQ2xpZW50Q29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRWZXJpZmllZEFjY2Vzc0luc3RhbmNlQ2xpZW50Q29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRXhwb3J0VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUNsaWVudENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGFsbG93ZWQgc2V0dGluZ3MgZm9yIGltYWdlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEFsbG93ZWRJbWFnZXNTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBbGxvd2VkSW1hZ2VzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEFsbG93ZWRJbWFnZXNTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgbGlzdCBvZiByb2xlcyBhc3NvY2lhdGVkIHdpdGggYW4gQUNNIGNlcnRpZmljYXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0QXNzb2NpYXRlZEVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEFzc29jaWF0ZWRFbmNsYXZlQ2VydGlmaWNhdGVJYW1Sb2xlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QXNzb2NpYXRlZEVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBJUHY2IENJRFIgYmxvY2sgYXNzb2NpYXRpb25zIGZvciBhIHNwZWNpZmllZCBJUHY2IGFkZHJlc3MgcG9vbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEFzc29jaWF0ZWRJcHY2UG9vbENpZHJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEFzc29jaWF0ZWRJcHY2UG9vbENpZHJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBc3NvY2lhdGVkSXB2NlBvb2xDaWRycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBuZXR3b3JrIHBlcmZvcm1hbmNlIGRhdGFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRBd3NOZXR3b3JrUGVyZm9ybWFuY2VEYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEF3c05ldHdvcmtQZXJmb3JtYW5jZURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEF3c05ldHdvcmtQZXJmb3JtYW5jZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdXNhZ2UgaW5mb3JtYXRpb24gYWJvdXQgYSBDYXBhY2l0eSBSZXNlcnZhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENhcGFjaXR5UmVzZXJ2YXRpb25Vc2FnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDYXBhY2l0eVJlc2VydmF0aW9uVXNhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENhcGFjaXR5UmVzZXJ2YXRpb25Vc2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBhbGxvY2F0aW9ucyBmcm9tIHRoZSBzcGVjaWZpZWQgY3VzdG9tZXItb3duZWQgYWRkcmVzcyBwb29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Q29pcFBvb2xVc2FnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb2lwUG9vbFVzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb2lwUG9vbFVzYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBjb25zb2xlIG91dHB1dCBmb3IgYW4gaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDb25zb2xlT3V0cHV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbnNvbGVPdXRwdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENvbnNvbGVPdXRwdXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIEpQRy1mb3JtYXQgc2NyZWVuc2hvdCBvZiBhIHJ1bm5pbmcgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDb25zb2xlU2NyZWVuc2hvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29uc29sZVNjcmVlbnNob3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHJlcG9ydCBzdW1tYXJ5IG9mIGRlY2xhcmF0aXZlIHBvbGljaWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydFN1bW1hcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydFN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnRTdW1tYXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBkZWZhdWx0IGNyZWRpdCBvcHRpb24gZm9yIENQVSB1c2FnZSBvZiBhIGJ1cnN0YWJsZSBwZXJmb3JtYW5jZSBpbnN0YW5jZSBmYW1pbHlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXREZWZhdWx0Q3JlZGl0U3BlY2lmaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREZWZhdWx0Q3JlZGl0U3BlY2lmaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGVmYXVsdENyZWRpdFNwZWNpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIElEIG9mIHRoZSBkZWZhdWx0IGN1c3RvbWVyIG1hc3RlciBrZXkgKENNSykgZm9yIEVCUyBlbmNyeXB0aW9uIGJ5IGRlZmF1bHRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRFYnNEZWZhdWx0S21zS2V5SWQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RWJzRGVmYXVsdEttc0tleUlkKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFYnNEZWZhdWx0S21zS2V5SWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB3aGV0aGVyIEVCUyBlbmNyeXB0aW9uIGJ5IGRlZmF1bHQgaXMgZW5hYmxlZCBmb3IgeW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RWJzRW5jcnlwdGlvbkJ5RGVmYXVsdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFYnNFbmNyeXB0aW9uQnlEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFYnNFbmNyeXB0aW9uQnlEZWZhdWx0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgYSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSB0byBzdHJlYW1saW5lIHRoZSBpbnRlZ3JhdGlvbiBvZiBWUEMgZmxvdyBsb2dzIHdpdGggQW1hem9uIEF0aGVuYVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEZsb3dMb2dzSW50ZWdyYXRpb25UZW1wbGF0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRGbG93TG9nc0ludGVncmF0aW9uVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEZsb3dMb2dzSW50ZWdyYXRpb25UZW1wbGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHJlc291cmNlIGdyb3VwcyB0byB3aGljaCBhIENhcGFjaXR5IFJlc2VydmF0aW9uIGhhcyBiZWVuIGFkZGVkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0R3JvdXBzRm9yQ2FwYWNpdHlSZXNlcnZhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRHcm91cHNGb3JDYXBhY2l0eVJlc2VydmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRHcm91cHNGb3JDYXBhY2l0eVJlc2VydmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHJldmlldyBhIHJlc2VydmF0aW9uIHB1cmNoYXNlIHdpdGggY29uZmlndXJhdGlvbnMgdGhhdCBtYXRjaCB0aG9zZSBvZiBhIERlZGljYXRlZCBIb3N0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0SG9zdFJlc2VydmF0aW9uUHVyY2hhc2VQcmV2aWV3Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEhvc3RSZXNlcnZhdGlvblB1cmNoYXNlUHJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SG9zdFJlc2VydmF0aW9uUHVyY2hhc2VQcmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGJsb2NrIHB1YmxpYyBhY2Nlc3MgZm9yIEFNSXMgYXQgdGhlIGFjY291bnQgbGV2ZWwgaW4gdGhlIHNwZWNpZmllZCBBV1MgUmVnaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0SW1hZ2VCbG9ja1B1YmxpY0FjY2Vzc1N0YXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEltYWdlQmxvY2tQdWJsaWNBY2Nlc3NTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SW1hZ2VCbG9ja1B1YmxpY0FjY2Vzc1N0YXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmlldyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBtZXRhZGF0YSBzZXJ2aWNlIChJTURTKSBzZXR0aW5ncyBzZXQgZm9yIHlvdXIgYWNjb3VudCBpbiB0aGUgc3BlY2lmaWVkIFJlZ2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEluc3RhbmNlTWV0YWRhdGFEZWZhdWx0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJbnN0YW5jZU1ldGFkYXRhRGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEluc3RhbmNlTWV0YWRhdGFEZWZhdWx0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgcHVibGljIGVuZG9yc2VtZW50IGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIE5pdHJvIFRydXN0ZWQgUGxhdGZvcm0gTW9kdWxlIChOaXRyb1RQTSkgZm9yIHRoZSBzcGVjaWZpZWQgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJbnN0YW5jZVRwbUVrUHViLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEluc3RhbmNlVHBtRWtQdWIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEluc3RhbmNlVHBtRWtQdWInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2aWV3IGEgbGlzdCBvZiBpbnN0YW5jZSB0eXBlcyB3aXRoIHNwZWNpZmllZCBpbnN0YW5jZSBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0SW5zdGFuY2VUeXBlc0Zyb21JbnN0YW5jZVJlcXVpcmVtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJbnN0YW5jZVR5cGVzRnJvbUluc3RhbmNlUmVxdWlyZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJbnN0YW5jZVR5cGVzRnJvbUluc3RhbmNlUmVxdWlyZW1lbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgVUVGSSB2YXJpYWJsZSBzdG9yZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEluc3RhbmNlVWVmaURhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SW5zdGFuY2VVZWZpRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGhpc3RvcmljYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBDSURSIHdpdGhpbiBhbiBBbWF6b24gVlBDIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkgc2NvcGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJcGFtQWRkcmVzc0hpc3RvcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SXBhbUFkZHJlc3NIaXN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJcGFtQWRkcmVzc0hpc3RvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBJUEFNIGRpc2NvdmVyZWQgYWNjb3VudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJcGFtRGlzY292ZXJlZEFjY291bnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldElwYW1EaXNjb3ZlcmVkQWNjb3VudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldElwYW1EaXNjb3ZlcmVkQWNjb3VudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgcHVibGljIElQIGFkZHJlc3NlcyB0aGF0IGhhdmUgYmVlbiBkaXNjb3ZlcmVkIGJ5IElQQU1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJcGFtRGlzY292ZXJlZFB1YmxpY0FkZHJlc3Nlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJcGFtRGlzY292ZXJlZFB1YmxpY0FkZHJlc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SXBhbURpc2NvdmVyZWRQdWJsaWNBZGRyZXNzZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgcmVzb3VyY2UgQ0lEUnMgdGhhdCBhcmUgbW9uaXRvcmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBkaXNjb3ZlcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJcGFtRGlzY292ZXJlZFJlc291cmNlQ2lkcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SXBhbURpc2NvdmVyZWRSZXNvdXJjZUNpZHJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJcGFtRGlzY292ZXJlZFJlc291cmNlQ2lkcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaXN0IG9mIGFsbCB0aGUgQ0lEUiBhbGxvY2F0aW9ucyBpbiBhbiBBbWF6b24gVlBDIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkgcG9vbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldElwYW1Qb29sQWxsb2NhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SXBhbVBvb2xBbGxvY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SXBhbVBvb2xBbGxvY2F0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgQ0lEUnMgcHJvdmlzaW9uZWQgdG8gYW4gQW1hem9uIFZQQyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pIHBvb2xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJcGFtUG9vbENpZHJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldElwYW1Qb29sQ2lkcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldElwYW1Qb29sQ2lkcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlcyBpbiBhbiBBbWF6b24gVlBDIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkgc2NvcGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRJcGFtUmVzb3VyY2VDaWRycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJcGFtUmVzb3VyY2VDaWRycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SXBhbVJlc291cmNlQ2lkcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIGZvciB1c2Ugd2l0aCBhIG5ldyBsYXVuY2ggdGVtcGxhdGUgb3IgbGF1bmNoIHRlbXBsYXRlIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRMYXVuY2hUZW1wbGF0ZURhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMYXVuY2hUZW1wbGF0ZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBtYW5hZ2VkIHByZWZpeCBsaXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TWFuYWdlZFByZWZpeExpc3RBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TWFuYWdlZFByZWZpeExpc3RBc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1hbmFnZWRQcmVmaXhMaXN0QXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnRyaWVzIGZvciBhIHNwZWNpZmllZCBtYW5hZ2VkIHByZWZpeCBsaXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TWFuYWdlZFByZWZpeExpc3RFbnRyaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE1hbmFnZWRQcmVmaXhMaXN0RW50cmllcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TWFuYWdlZFByZWZpeExpc3RFbnRyaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBmaW5kaW5ncyBmb3Igb25lIG9yIG1vcmUgTmV0d29yayBBY2Nlc3MgU2NvcGUgYW5hbHlzZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzRmluZGluZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpc0ZpbmRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzRmluZGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGNvbnRlbnQgZm9yIGEgc3BlY2lmaWVkIE5ldHdvcmsgQWNjZXNzIFNjb3BlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVDb250ZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVDb250ZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIGVuY3J5cHRlZCBhZG1pbmlzdHJhdG9yIHBhc3N3b3JkIGZvciBhIHJ1bm5pbmcgV2luZG93cyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFBhc3N3b3JkRGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRQYXNzd29yZERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFBhc3N3b3JkRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIHF1b3RlIGFuZCBleGNoYW5nZSBpbmZvcm1hdGlvbiBmb3IgZXhjaGFuZ2luZyBvbmUgb3IgbW9yZSBDb252ZXJ0aWJsZSBSZXNlcnZlZCBJbnN0YW5jZXMgZm9yIGEgbmV3IENvbnZlcnRpYmxlIFJlc2VydmVkIEluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UmVzZXJ2ZWRJbnN0YW5jZXNFeGNoYW5nZVF1b3RlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlc2VydmVkSW5zdGFuY2VzRXhjaGFuZ2VRdW90ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzZXJ2ZWRJbnN0YW5jZXNFeGNoYW5nZVF1b3RlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gSUFNIHBvbGljeSB0aGF0IGVuYWJsZXMgY3Jvc3MtYWNjb3VudCBzaGFyaW5nXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L2lwYW0vc2hhcmUtcG9vbC1pcGFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhc3NvY2lhdGlvbnMgZm9yIGEgcm91dGUgc2VydmVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Um91dGVTZXJ2ZXJBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Um91dGVTZXJ2ZXJBc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJvdXRlU2VydmVyQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHByb3BhZ2F0aW9ucyBmb3IgYSByb3V0ZSBzZXJ2ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRSb3V0ZVNlcnZlclByb3BhZ2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSb3V0ZVNlcnZlclByb3BhZ2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Um91dGVTZXJ2ZXJQcm9wYWdhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHJvdXRpbmcgZGF0YWJhc2UgZm9yIGEgcm91dGUgc2VydmVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Um91dGVTZXJ2ZXJSb3V0aW5nRGF0YWJhc2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Um91dGVTZXJ2ZXJSb3V0aW5nRGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJvdXRlU2VydmVyUm91dGluZ0RhdGFiYXNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBsaXN0IG9mIHNlY3VyaXR5IGdyb3VwcyBmb3IgYSBzcGVjaWZpZWQgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U2VjdXJpdHlHcm91cHNGb3JWcGMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2VjdXJpdHlHcm91cHNGb3JWcGMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlY3VyaXR5R3JvdXBzRm9yVnBjJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIGFjY2VzcyBzdGF0dXMgb2YgeW91ciBhY2NvdW50IHRvIHRoZSBFQzIgc2VyaWFsIGNvbnNvbGUgb2YgYWxsIGluc3RhbmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFNlcmlhbENvbnNvbGVBY2Nlc3NTdGF0dXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2VyaWFsQ29uc29sZUFjY2Vzc1N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U2VyaWFsQ29uc29sZUFjY2Vzc1N0YXR1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBibG9jayBwdWJsaWMgYWNjZXNzIGZvciBzbmFwc2hvdHMgc2V0dGluZyBmb3IgYSBSZWdpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzU3RhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U25hcHNob3RCbG9ja1B1YmxpY0FjY2Vzc1N0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzU3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYWxjdWxhdGUgdGhlIFNwb3QgcGxhY2VtZW50IHNjb3JlIGZvciBhIFJlZ2lvbiBvciBBdmFpbGFiaWxpdHkgWm9uZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBjYXBhY2l0eSBhbmQgY29tcHV0ZSByZXF1aXJlbWVudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTcG90UGxhY2VtZW50U2NvcmVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNwb3RQbGFjZW1lbnRTY29yZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNwb3RQbGFjZW1lbnRTY29yZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VibmV0IENJRFIgcmVzZXJ2YXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0U3VibmV0Q2lkclJlc2VydmF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdWJuZXRDaWRyUmVzZXJ2YXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTdWJuZXRDaWRyUmVzZXJ2YXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgcm91dGUgdGFibGVzIHRvIHdoaWNoIGEgcmVzb3VyY2UgYXR0YWNobWVudCBwcm9wYWdhdGVzIHJvdXRlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFRyYW5zaXRHYXRld2F5QXR0YWNobWVudFByb3BhZ2F0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUcmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRQcm9wYWdhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRyYW5zaXRHYXRld2F5QXR0YWNobWVudFByb3BhZ2F0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXNzb2NpYXRpb25zIGZvciBhIHRyYW5zaXQgZ2F0ZXdheSBtdWx0aWNhc3QgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGFzc29jaWF0aW9ucyBmb3IgYSB0cmFuc2l0IGdhdGV3YXkgcG9saWN5IHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGFzc29jaWF0aW9ucyBmb3IgYSB0cmFuc2l0IGdhdGV3YXkgcG9saWN5IHRhYmxlIGVudHJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUVudHJpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVFbnRyaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHByZWZpeCBsaXN0IHJlZmVyZW5jZXMgZm9yIGEgdHJhbnNpdCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGFzc29jaWF0aW9ucyBmb3IgYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvdXRlIHRhYmxlIHByb3BhZ2F0aW9ucyBmb3IgYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzaG93IHRoZSBWZXJpZmllZCBBY2Nlc3MgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRWZXJpZmllZEFjY2Vzc0VuZHBvaW50UG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdmVyaWZpZWQgYWNjZXNzIGVuZHBvaW50IHRhcmdldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRWZXJpZmllZEFjY2Vzc0VuZHBvaW50VGFyZ2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRWZXJpZmllZEFjY2Vzc0VuZHBvaW50VGFyZ2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFRhcmdldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzaG93IHRoZSBjb250ZW50cyBvZiB0aGUgVmVyaWZpZWQgQWNjZXNzIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhlIGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VmVyaWZpZWRBY2Nlc3NHcm91cFBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRWZXJpZmllZEFjY2Vzc0dyb3VwUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRWZXJpZmllZEFjY2Vzc0dyb3VwUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2hvdyB0aGUgQVdTIFdlYiBBcHBsaWNhdGlvbiBGaXJld2FsbCAoV0FGKSB3ZWIgYWNjZXNzIGNvbnRyb2wgbGlzdCAoQUNMKSBmb3IgYSBWZXJpZmllZCBBY2Nlc3MgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZlcmlmaWVkLWFjY2Vzcy9sYXRlc3QvdWcvd2FmLWludGVncmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2woKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkb3dubG9hZCBhbiBBV1MtcHJvdmlkZWQgc2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSB1c2VkIHdpdGggdGhlIGN1c3RvbWVyIGdhdGV3YXkgZGV2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VnBuQ29ubmVjdGlvbkRldmljZVNhbXBsZUNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VnBuQ29ubmVjdGlvbkRldmljZVNhbXBsZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZwbkNvbm5lY3Rpb25EZXZpY2VTYW1wbGVDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gb2J0YWluIGEgbGlzdCBvZiBjdXN0b21lciBnYXRld2F5IGRldmljZXMgZm9yIHdoaWNoIHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGVzIGNhbiBiZSBwcm92aWRlZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFZwbkNvbm5lY3Rpb25EZXZpY2VUeXBlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRWcG5Db25uZWN0aW9uRGV2aWNlVHlwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZwbkNvbm5lY3Rpb25EZXZpY2VUeXBlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHZpZXcgYXZhaWxhYmxlIHR1bm5lbCBlbmRwb2ludCBtYWludGVuYW5jZSBldmVudHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRWcG5UdW5uZWxSZXBsYWNlbWVudFN0YXR1cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRWcG5UdW5uZWxSZXBsYWNlbWVudFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VnBuVHVubmVsUmVwbGFjZW1lbnRTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0cmFuc2ZlciBleGlzdGluZyBCWU9JUCBJUHY0IENJRFJzIHRvIElQQU1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L2lwYW0vdHV0b3JpYWxzLWJ5b2lwLWlwYW0tdHJhbnNmZXItaXB2NC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9JbXBvcnRCeW9pcENpZHJUb0lwYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0ltcG9ydEJ5b2lwQ2lkclRvSXBhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwbG9hZCBhIGNsaWVudCBjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGxpc3QgdG8gYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0ltcG9ydENsaWVudFZwbkNsaWVudENlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW1wb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGltcG9ydCBzaW5nbGUgb3IgbXVsdGktdm9sdW1lIGRpc2sgaW1hZ2VzIG9yIEVCUyBzbmFwc2hvdHMgaW50byBhbiBBbWF6b24gTWFjaGluZSBJbWFnZSAoQU1JKVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9JbXBvcnRJbWFnZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9JbXBvcnRJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW1wb3J0SW1hZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gaW1wb3J0IGluc3RhbmNlIHRhc2sgdXNpbmcgbWV0YWRhdGEgZnJvbSBhIGRpc2sgaW1hZ2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfSW1wb3J0SW5zdGFuY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0SW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0ltcG9ydEluc3RhbmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW1wb3J0IGEgcHVibGljIGtleSBmcm9tIGFuIFJTQSBrZXkgcGFpciB0aGF0IHdhcyBjcmVhdGVkIHdpdGggYSB0aGlyZC1wYXJ0eSB0b29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0ltcG9ydEtleVBhaXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0S2V5UGFpcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW1wb3J0S2V5UGFpcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGltcG9ydCBhIGRpc2sgaW50byBhbiBFQlMgc25hcHNob3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfSW1wb3J0U25hcHNob3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0U25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0ltcG9ydFNuYXBzaG90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIGltcG9ydCB2b2x1bWUgdGFzayB1c2luZyBtZXRhZGF0YSBmcm9tIGEgZGlzayBpbWFnZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9JbXBvcnRWb2x1bWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0Vm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdJbXBvcnRWb2x1bWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0ZW1wb3JhcmlseSBpbmplY3QgZXJyb3JzIGZvciB0YXJnZXQgQVBJIHJlcXVlc3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZGaXNBY3Rpb25JZCgpXG4gICAqIC0gLmlmRmlzVGFyZ2V0QXJucygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Zpcy9sYXRlc3QvdXNlcmd1aWRlL2Zpcy1hY3Rpb25zLXJlZmVyZW5jZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9JbmplY3RBcGlFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW5qZWN0QXBpRXJyb3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IEFtYXpvbiBNYWNoaW5lIEltYWdlcyAoQU1JcykgdGhhdCBhcmUgY3VycmVudGx5IGluIHRoZSBSZWN5Y2xlIEJpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RJbWFnZXNJblJlY3ljbGVCaW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEltYWdlc0luUmVjeWNsZUJpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEltYWdlc0luUmVjeWNsZUJpbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIEFtYXpvbiBFQlMgc25hcHNob3RzIHRoYXQgYXJlIGN1cnJlbnRseSBpbiB0aGUgUmVjeWNsZSBCaW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U25hcHNob3RzSW5SZWN5Y2xlQmluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTbmFwc2hvdHNJblJlY3ljbGVCaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTbmFwc2hvdHNJblJlY3ljbGVCaW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2NrIGFuIEFtYXpvbiBFQlMgc25hcHNob3QgaW4gZWl0aGVyIGdvdmVybmFuY2Ugb3IgY29tcGxpYW5jZSBtb2RlIHRvIHByb3RlY3QgaXQgYWdhaW5zdCBhY2NpZGVudGFsIG9yIG1hbGljaW91cyBkZWxldGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTG9ja1NuYXBzaG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xvY2tTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9ja1NuYXBzaG90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGFuIGF0dHJpYnV0ZSBvZiB0aGUgc3BlY2lmaWVkIEVsYXN0aWMgSVAgYWRkcmVzc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlBZGRyZXNzQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUFkZHJlc3NBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUFkZHJlc3NBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIG9wdC1pbiBzdGF0dXMgb2YgdGhlIExvY2FsIFpvbmUgYW5kIFdhdmVsZW5ndGggWm9uZSBncm91cCBmb3IgeW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUF2YWlsYWJpbGl0eVpvbmVHcm91cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlBdmFpbGFiaWxpdHlab25lR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUF2YWlsYWJpbGl0eVpvbmVHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIENhcGFjaXR5IFJlc2VydmF0aW9uJ3MgY2FwYWNpdHkgYW5kIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0IGlzIHRvIGJlIHJlbGVhc2VkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIENhcGFjaXR5IFJlc2VydmF0aW9uIEZsZWV0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6TW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIENsaWVudCBWUE4gZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUNsaWVudFZwbkVuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBhY2NvdW50IGxldmVsIGRlZmF1bHQgY3JlZGl0IG9wdGlvbiBmb3IgQ1BVIHVzYWdlIG9mIGJ1cnN0YWJsZSBwZXJmb3JtYW5jZSBpbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5RGVmYXVsdENyZWRpdFNwZWNpZmljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5RGVmYXVsdENyZWRpdFNwZWNpZmljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeURlZmF1bHRDcmVkaXRTcGVjaWZpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGN1c3RvbWVyIG1hc3RlciBrZXkgKENNSykgZm9yIEVCUyBlbmNyeXB0aW9uIGJ5IGRlZmF1bHQgZm9yIHlvdXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlFYnNEZWZhdWx0S21zS2V5SWQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5RWJzRGVmYXVsdEttc0tleUlkKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlFYnNEZWZhdWx0S21zS2V5SWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYW4gRUMyIEZsZWV0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUZsZWV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlGbGVldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhbiBhdHRyaWJ1dGUgb2YgYW4gQW1hem9uIEZQR0EgSW1hZ2UgKEFGSSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5RnBnYUltYWdlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUZwZ2FJbWFnZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5RnBnYUltYWdlQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGEgRGVkaWNhdGVkIEhvc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SG9zdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SG9zdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUhvc3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBJRCBmb3JtYXQgZm9yIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SWRGb3JtYXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SWRGb3JtYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUlkRm9ybWF0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBJRCBmb3JtYXQgb2YgYSByZXNvdXJjZSBmb3IgYSBzcGVjaWZpYyBwcmluY2lwYWwgaW4geW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUlkZW50aXR5SWRGb3JtYXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SWRlbnRpdHlJZEZvcm1hdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SWRlbnRpdHlJZEZvcm1hdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhbiBhdHRyaWJ1dGUgb2YgYW4gQW1hem9uIE1hY2hpbmUgSW1hZ2UgKEFNSSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SW1hZ2VBdHRyaWJ1dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SW1hZ2VBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUltYWdlQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGFuIGF0dHJpYnV0ZSBvZiBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIENhcGFjaXR5IFJlc2VydmF0aW9uIHNldHRpbmdzIGZvciBhIHN0b3BwZWQgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SW5zdGFuY2VDYXBhY2l0eVJlc2VydmF0aW9uQXR0cmlidXRlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBDUFUgb3B0aW9ucyBvbiBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SW5zdGFuY2VDcHVPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNyZWRpdCBvcHRpb24gZm9yIENQVSB1c2FnZSBvbiBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIHN0YXJ0IHRpbWUgZm9yIGEgc2NoZWR1bGVkIEVDMiBpbnN0YW5jZSBldmVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUluc3RhbmNlRXZlbnRTdGFydFRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUluc3RhbmNlRXZlbnRTdGFydFRpbWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIHNwZWNpZmllZCBldmVudCB3aW5kb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SW5zdGFuY2VFdmVudFdpbmRvdy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlJbnN0YW5jZUV2ZW50V2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJbnN0YW5jZUV2ZW50V2luZG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSByZWNvdmVyeSBiZWhhdmlvdXIgZm9yIGFuIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUluc3RhbmNlTWFpbnRlbmFuY2VPcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUluc3RhbmNlTWFpbnRlbmFuY2VPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgZGVmYXVsdCBpbnN0YW5jZSBtZXRhZGF0YSBzZXJ2aWNlIChJTURTKSBzZXR0aW5ncyBmb3IgeW91ciBhY2NvdW50IGluIHRoZSBzcGVjaWZpZWQgUmVnaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YURlZmF1bHRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUluc3RhbmNlTWV0YWRhdGFEZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YURlZmF1bHRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBtZXRhZGF0YSBvcHRpb25zIGZvciBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIG5ldHdvcmsgcGVyZm9ybWFuY2Ugb3B0aW9ucyBmb3IgYW4gaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBwbGFjZW1lbnQgYXR0cmlidXRlcyBmb3IgYW4gaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUluc3RhbmNlUGxhY2VtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9ucyBvZiBhbiBBbWF6b24gVlBDIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5SXBhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlJcGFtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJcGFtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9ucyBvZiBhbiBBbWF6b24gVlBDIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkgcG9vbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJcGFtUG9vbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlJcGFtUG9vbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SXBhbVBvb2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb25zIG9mIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSByZXNvdXJjZSBDSURSXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeUlwYW1SZXNvdXJjZUNpZHIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SXBhbVJlc291cmNlQ2lkcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5SXBhbVJlc291cmNlQ2lkcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIHJlc291cmNlIGRpc2NvdmVyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJcGFtUmVzb3VyY2VEaXNjb3ZlcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SXBhbVJlc291cmNlRGlzY292ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJcGFtUmVzb3VyY2VEaXNjb3ZlcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb25zIG9mIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBzY29wZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlJcGFtU2NvcGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5SXBhbVNjb3BlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlJcGFtU2NvcGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYSBsYXVuY2ggdGVtcGxhdGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5TGF1bmNoVGVtcGxhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5TGF1bmNoVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeUxhdW5jaFRlbXBsYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGEgbG9jYWwgZ2F0ZXdheSByb3V0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlMb2NhbEdhdGV3YXlSb3V0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlMb2NhbEdhdGV3YXlSb3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5TG9jYWxHYXRld2F5Um91dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYSBtYW5hZ2VkIHByZWZpeCBsaXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeU1hbmFnZWRQcmVmaXhMaXN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeU1hbmFnZWRQcmVmaXhMaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlNYW5hZ2VkUHJlZml4TGlzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhbiBhdHRyaWJ1dGUgb2YgYSBuZXR3b3JrIGludGVyZmFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIG9wdGlvbnMgZm9yIGluc3RhbmNlIGhvc3RuYW1lcyBmb3IgdGhlIHNwZWNpZmllZCBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXR0cmlidXRlcyBvZiBvbmUgb3IgbW9yZSBSZXNlcnZlZCBJbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5UmVzZXJ2ZWRJbnN0YW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5UmVzZXJ2ZWRJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVJlc2VydmVkSW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGEgcm91dGUgc2VydmVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVJvdXRlU2VydmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVJvdXRlU2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlSb3V0ZVNlcnZlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgcnVsZXMgb2YgYSBzZWN1cml0eSBncm91cFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlTZWN1cml0eUdyb3VwUnVsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5U2VjdXJpdHlHcm91cFJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlTZWN1cml0eUdyb3VwUnVsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgb3IgcmVtb3ZlIHBlcm1pc3Npb24gc2V0dGluZ3MgZm9yIGEgc25hcHNob3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlTbmFwc2hvdEF0dHJpYnV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlTbmFwc2hvdEF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhcmNoaXZlIEFtYXpvbiBFQlMgc25hcHNob3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVNuYXBzaG90VGllci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlTbmFwc2hvdFRpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVNuYXBzaG90VGllcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIFNwb3QgRmxlZXQgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlTcG90RmxlZXRSZXF1ZXN0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVNwb3RGbGVldFJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVNwb3RGbGVldFJlcXVlc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYW4gYXR0cmlidXRlIG9mIGEgc3VibmV0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVN1Ym5ldEF0dHJpYnV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlTdWJuZXRBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVN1Ym5ldEF0dHJpYnV0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFsbG93IG9yIHJlc3RyaWN0IG1pcnJvcmluZyBuZXR3b3JrIHNlcnZpY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVRyYWZmaWNNaXJyb3JGaWx0ZXJOZXR3b3JrU2VydmljZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlck5ldHdvcmtTZXJ2aWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlck5ldHdvcmtTZXJ2aWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhIHRyYWZmaWMgbWlycm9yIHJ1bGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlclJ1bGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlclJ1bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGEgdHJhZmZpYyBtaXJyb3Igc2Vzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlUcmFmZmljTWlycm9yU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlUcmFmZmljTWlycm9yU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5VHJhZmZpY01pcnJvclNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VHJhbnNpdEdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VHJhbnNpdEdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVRyYW5zaXRHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGEgdHJhbnNpdCBnYXRld2F5IHByZWZpeCBsaXN0IHJlZmVyZW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYSBWUEMgYXR0YWNobWVudCBvbiBhIHRyYW5zaXQgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBWZXJpZmllZCBBY2Nlc3MgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VmVyaWZpZWRBY2Nlc3NFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBzcGVjaWZpZWQgVmVyaWZpZWQgQWNjZXNzIGVuZHBvaW50IHBvbGljeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50UG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIHNwZWNpZmllZCBWZXJpZmllZCBBY2Nlc3MgR3JvdXAgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWZXJpZmllZEFjY2Vzc0dyb3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIHNwZWNpZmllZCBWZXJpZmllZCBBY2Nlc3MgZ3JvdXAgcG9saWN5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXBQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NHcm91cFBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5VmVyaWZpZWRBY2Nlc3NHcm91cFBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFZlcmlmaWVkIEFjY2VzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWZXJpZmllZEFjY2Vzc0luc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBWZXJpZmllZCBBY2Nlc3MgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUxvZ2dpbmdDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VMb2dnaW5nQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUxvZ2dpbmdDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgVmVyaWZpZWQgQWNjZXNzIHRydXN0IHByb3ZpZGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgcGFyYW1ldGVycyBvZiBhbiBFQlMgdm9sdW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVZvbHVtZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZvbHVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhbiBhdHRyaWJ1dGUgb2YgYSB2b2x1bWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5Vm9sdW1lQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZvbHVtZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5Vm9sdW1lQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGFuIGF0dHJpYnV0ZSBvZiBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWcGNBdHRyaWJ1dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VnBjQXR0cmlidXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlWcGNBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgYW4gZXhjbHVzaW9uIGxpc3QgZm9yIGJsb2NrZWQgcHVibGljIGFjY2VzcyBvbiBhIFZQQ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9kaWZ5VnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgb3B0aW9ucyBmb3IgYmxvY2tlZCBwdWJsaWMgYWNjZXNzIG9uIGEgVlBDXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVZwY0Jsb2NrUHVibGljQWNjZXNzT3B0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWcGNCbG9ja1B1YmxpY0FjY2Vzc09wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwY0Jsb2NrUHVibGljQWNjZXNzT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhbiBhdHRyaWJ1dGUgb2YgYSBWUEMgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VnBjRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VnBjRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwY0VuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGEgY29ubmVjdGlvbiBub3RpZmljYXRpb24gZm9yIGEgVlBDIGVuZHBvaW50IG9yIFZQQyBlbmRwb2ludCBzZXJ2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgYXR0cmlidXRlcyBvZiBhIFZQQyBlbmRwb2ludCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBwYXllciByZXNwb25zaWJpbGl0eSBmb3IgYSBWUEMgZW5kcG9pbnQgc2VydmljZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQYXllclJlc3BvbnNpYmlsaXR5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZwY0VuZHBvaW50U2VydmljZVBheWVyUmVzcG9uc2liaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwY0VuZHBvaW50U2VydmljZVBheWVyUmVzcG9uc2liaWxpdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIHBlcm1pc3Npb25zIGZvciBhIFZQQyBlbmRwb2ludCBzZXJ2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwY0VuZHBvaW50U2VydmljZVBlcm1pc3Npb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBWUEMgcGVlcmluZyBjb25uZWN0aW9uIG9wdGlvbnMgb24gb25lIHNpZGUgb2YgYSBWUEMgcGVlcmluZyBjb25uZWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vZGlmeVZwY1BlZXJpbmdDb25uZWN0aW9uT3B0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWcGNQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwY1BlZXJpbmdDb25uZWN0aW9uT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgaW5zdGFuY2UgdGVuYW5jeSBhdHRyaWJ1dGUgb2YgYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VnBjVGVuYW5jeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb2RpZnlWcGNUZW5hbmN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdNb2RpZnlWcGNUZW5hbmN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSB0YXJnZXQgZ2F0ZXdheSBvZiBhIFNpdGUtdG8tU2l0ZSBWUE4gY29ubmVjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWcG5Db25uZWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZwbkNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwbkNvbm5lY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvbm5lY3Rpb24gb3B0aW9ucyBmb3IgeW91ciBTaXRlLXRvLVNpdGUgVlBOIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VnBuQ29ubmVjdGlvbk9wdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VnBuQ29ubmVjdGlvbk9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwbkNvbm5lY3Rpb25PcHRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjZXJ0aWZpY2F0ZSBmb3IgYSBTaXRlLXRvLVNpdGUgVlBOIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTW9kaWZ5VnBuVHVubmVsQ2VydGlmaWNhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9kaWZ5VnBuVHVubmVsQ2VydGlmaWNhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwblR1bm5lbENlcnRpZmljYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBvcHRpb25zIGZvciBhIFNpdGUtdG8tU2l0ZSBWUE4gY29ubmVjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ01vZGlmeVZwblR1bm5lbE9wdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmFibGUgZGV0YWlsZWQgbW9uaXRvcmluZyBmb3IgYSBydW5uaW5nIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vbml0b3JJbnN0YW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW9uaXRvckluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW9uaXRvckluc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vdmUgYW4gRWxhc3RpYyBJUCBhZGRyZXNzIGZyb20gdGhlIEVDMi1DbGFzc2ljIHBsYXRmb3JtIHRvIHRoZSBFQzItVlBDIHBsYXRmb3JtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vdmVBZGRyZXNzVG9WcGMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW92ZUFkZHJlc3NUb1ZwYygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW92ZUFkZHJlc3NUb1ZwYycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vdmUgYSBCWU9JUCBJUHY0IENJRFIgdG8gQW1hem9uIFZQQyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pIGZyb20gYSBwdWJsaWMgSVB2NCBwb29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01vdmVCeW9pcENpZHJUb0lwYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTW92ZUJ5b2lwQ2lkclRvSXBhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW92ZUJ5b2lwQ2lkclRvSXBhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1vdmUgYXZhaWxhYmxlIGNhcGFjaXR5IGZyb20gYSBzb3VyY2UgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gdG8gYSBkZXN0aW5hdGlvbiBDYXBhY2l0eSBSZXNlcnZhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0ZW1wb3JhcmlseSBwYXVzZSBJL08gb3BlcmF0aW9ucyBmb3IgYSB0YXJnZXQgQW1hem9uIEVCUyB2b2x1bWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9maXMvbGF0ZXN0L3VzZXJndWlkZS9maXMtYWN0aW9ucy1yZWZlcmVuY2UuaHRtbCNlYnMtYWN0aW9ucy1yZWZlcmVuY2VcbiAgICovXG4gIHB1YmxpYyB0b1BhdXNlVm9sdW1lSU8oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1BhdXNlVm9sdW1lSU8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwcm92aXNpb24gYW4gYWRkcmVzcyByYW5nZSBmb3IgdXNlIGluIEFXUyB0aHJvdWdoIGJyaW5nIHlvdXIgb3duIElQIGFkZHJlc3NlcyAoQllPSVApLCBhbmQgdG8gY3JlYXRlIGEgY29ycmVzcG9uZGluZyBhZGRyZXNzIHBvb2xcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHJvdmlzaW9uQnlvaXBDaWRyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Byb3Zpc2lvbkJ5b2lwQ2lkcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHJvdmlzaW9uQnlvaXBDaWRyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHJvdmlzaW9uIGFuIEF1dG9ub21vdXMgU3lzdGVtIE51bWJlciAoQVNOKSBmb3IgdXNlIGluIGFuIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Qcm92aXNpb25JcGFtQnlvYXNuLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Byb3Zpc2lvbklwYW1CeW9hc24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Byb3Zpc2lvbklwYW1CeW9hc24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwcm92aXNpb24gYSBDSURSIHRvIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBwb29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Byb3Zpc2lvbklwYW1Qb29sQ2lkci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Qcm92aXNpb25JcGFtUG9vbENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Byb3Zpc2lvbklwYW1Qb29sQ2lkcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHByb3Zpc2lvbiBhIENJRFIgdG8gYSBwdWJsaWMgSVB2NCBwb29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Byb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Qcm92aXNpb25QdWJsaWNJcHY0UG9vbENpZHIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Byb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1cmNoYXNlIGEgQ2FwYWNpdHkgQmxvY2sgb2ZmZXJpbmdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGVjMjpDcmVhdGVUYWdzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHVyY2hhc2VDYXBhY2l0eUJsb2NrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1cmNoYXNlQ2FwYWNpdHlCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHVyY2hhc2VDYXBhY2l0eUJsb2NrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHVyY2hhc2UgYSBDYXBhY2l0eSBCbG9jayBleHRlbnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHVyY2hhc2VDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1cmNoYXNlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHVyY2hhc2VDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHVyY2hhc2UgYSByZXNlcnZhdGlvbiB3aXRoIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWF0Y2ggdGhvc2Ugb2YgYSBEZWRpY2F0ZWQgSG9zdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXJjaGFzZUhvc3RSZXNlcnZhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXJjaGFzZUhvc3RSZXNlcnZhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHVyY2hhc2VIb3N0UmVzZXJ2YXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXJjaGFzZSBhIFJlc2VydmVkIEluc3RhbmNlIG9mZmVyaW5nXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1cmNoYXNlUmVzZXJ2ZWRJbnN0YW5jZXNPZmZlcmluZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXJjaGFzZVJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1cmNoYXNlUmVzZXJ2ZWRJbnN0YW5jZXNPZmZlcmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1cmNoYXNlIG9uZSBvciBtb3JlIFNjaGVkdWxlZCBJbnN0YW5jZXMgd2l0aCBhIHNwZWNpZmllZCBzY2hlZHVsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXJjaGFzZVNjaGVkdWxlZEluc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXJjaGFzZVNjaGVkdWxlZEluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHVyY2hhc2VTY2hlZHVsZWRJbnN0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRhY2ggYW4gSUFNIHBvbGljeSB0aGF0IGVuYWJsZXMgY3Jvc3MtYWNjb3VudCBzaGFyaW5nIHRvIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L2lwYW0vc2hhcmUtcG9vbC1pcGFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlcXVlc3QgYSByZWJvb3Qgb2Ygb25lIG9yIG1vcmUgaW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlYm9vdEluc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWJvb3RJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlYm9vdEluc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlZ2lzdGVyIGFuIEFtYXpvbiBNYWNoaW5lIEltYWdlIChBTUkpXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlZ2lzdGVySW1hZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVnaXN0ZXJJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVnaXN0ZXJJbWFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCB0YWdzIHRvIHRoZSBzZXQgb2YgdGFncyB0byBpbmNsdWRlIGluIG5vdGlmaWNhdGlvbnMgYWJvdXQgc2NoZWR1bGVkIGV2ZW50cyBmb3IgeW91ciBpbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVnaXN0ZXJJbnN0YW5jZUV2ZW50Tm90aWZpY2F0aW9uQXR0cmlidXRlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWdpc3Rlckluc3RhbmNlRXZlbnROb3RpZmljYXRpb25BdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWdpc3Rlckluc3RhbmNlRXZlbnROb3RpZmljYXRpb25BdHRyaWJ1dGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVnaXN0ZXIgb25lIG9yIG1vcmUgbmV0d29yayBpbnRlcmZhY2VzIGFzIGEgbWVtYmVyIG9mIGEgZ3JvdXAgSVAgYWRkcmVzcyBpbiBhIHRyYW5zaXQgZ2F0ZXdheSBtdWx0aWNhc3QgZG9tYWluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cE1lbWJlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlZ2lzdGVyIG9uZSBvciBtb3JlIG5ldHdvcmsgaW50ZXJmYWNlcyBhcyBhIHNvdXJjZSBvZiBhIGdyb3VwIElQIGFkZHJlc3MgaW4gYSB0cmFuc2l0IGdhdGV3YXkgbXVsdGljYXN0IGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWplY3QgYSByZXF1ZXN0IHRvIGFzc2lnbiBiaWxsaW5nIG9mIHRoZSBhdmFpbGFibGUgY2FwYWNpdHkgb2YgYSBzaGFyZWQgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gdG8geW91ciBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlamVjdCByZXF1ZXN0cyB0byBhc3NvY2lhdGUgY3Jvc3MtYWNjb3VudCBzdWJuZXRzIHdpdGggYSB0cmFuc2l0IGdhdGV3YXkgbXVsdGljYXN0IGRvbWFpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWplY3RUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbkFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWplY3RUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbkFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVqZWN0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWplY3QgYSB0cmFuc2l0IGdhdGV3YXkgcGVlcmluZyBhdHRhY2htZW50IHJlcXVlc3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVqZWN0VHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWplY3RUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWplY3RUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVqZWN0IGEgcmVxdWVzdCB0byBhdHRhY2ggYSBWUEMgdG8gYSB0cmFuc2l0IGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVqZWN0VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlamVjdFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVqZWN0VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVqZWN0IG9uZSBvciBtb3JlIFZQQyBlbmRwb2ludCBjb25uZWN0aW9uIHJlcXVlc3RzIHRvIGEgVlBDIGVuZHBvaW50IHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVqZWN0VnBjRW5kcG9pbnRDb25uZWN0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWplY3RWcGNFbmRwb2ludENvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWplY3RWcGNFbmRwb2ludENvbm5lY3Rpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVqZWN0IGEgVlBDIHBlZXJpbmcgY29ubmVjdGlvbiByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlamVjdFZwY1BlZXJpbmdDb25uZWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlamVjdFZwY1BlZXJpbmdDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWplY3RWcGNQZWVyaW5nQ29ubmVjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbGVhc2UgYW4gRWxhc3RpYyBJUCBhZGRyZXNzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlbGVhc2VBZGRyZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlbGVhc2VBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWxlYXNlQWRkcmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbGVhc2Ugb25lIG9yIG1vcmUgT24tRGVtYW5kIERlZGljYXRlZCBIb3N0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWxlYXNlSG9zdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVsZWFzZUhvc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWxlYXNlSG9zdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWxlYXNlIGFuIGFsbG9jYXRpb24gd2l0aGluIGFuIEFtYXpvbiBWUEMgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKSBwb29sXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlbGVhc2VJcGFtUG9vbEFsbG9jYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVsZWFzZUlwYW1Qb29sQWxsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVsZWFzZUlwYW1Qb29sQWxsb2NhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlcGxhY2UgYW4gSUFNIGluc3RhbmNlIHByb2ZpbGUgZm9yIGFuIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBpYW06UGFzc1JvbGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXBsYWNlIGltYWdlIGNyaXRlcmlhIGluIGFsbG93ZWQgaW1hZ2VzIHNldHRpbmdzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlcGxhY2VJbWFnZUNyaXRlcmlhSW5BbGxvd2VkSW1hZ2VzU2V0dGluZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVwbGFjZUltYWdlQ3JpdGVyaWFJbkFsbG93ZWRJbWFnZXNTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVwbGFjZUltYWdlQ3JpdGVyaWFJbkFsbG93ZWRJbWFnZXNTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB3aGljaCBuZXR3b3JrIEFDTCBhIHN1Ym5ldCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVwbGFjZU5ldHdvcmtBY2xBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXBsYWNlTmV0d29ya0FjbEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXBsYWNlTmV0d29ya0FjbEFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVwbGFjZSBhbiBlbnRyeSAocnVsZSkgaW4gYSBuZXR3b3JrIEFDTFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXBsYWNlTmV0d29ya0FjbEVudHJ5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlcGxhY2VOZXR3b3JrQWNsRW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlcGxhY2VOZXR3b3JrQWNsRW50cnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXBsYWNlIGEgcm91dGUgd2l0aGluIGEgcm91dGUgdGFibGUgaW4gYSBWUENcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVwbGFjZVJvdXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlcGxhY2VSb3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVwbGFjZVJvdXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSByb3V0ZSB0YWJsZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHN1Ym5ldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXBsYWNlUm91dGVUYWJsZUFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlcGxhY2VSb3V0ZVRhYmxlQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlcGxhY2VSb3V0ZVRhYmxlQXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXBsYWNlIGEgcm91dGUgaW4gYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVwbGFjZVRyYW5zaXRHYXRld2F5Um91dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVwbGFjZVRyYW5zaXRHYXRld2F5Um91dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlcGxhY2VUcmFuc2l0R2F0ZXdheVJvdXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVwbGFjZSBhIFZQTiB0dW5uZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVwbGFjZVZwblR1bm5lbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXBsYWNlVnBuVHVubmVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXBsYWNlVnBuVHVubmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3VibWl0IGZlZWRiYWNrIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVwb3J0SW5zdGFuY2VTdGF0dXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVwb3J0SW5zdGFuY2VTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlcG9ydEluc3RhbmNlU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgU3BvdCBGbGVldCByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1JlcXVlc3RTcG90RmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVxdWVzdFNwb3RGbGVldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVxdWVzdFNwb3RGbGVldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFNwb3QgSW5zdGFuY2UgcmVxdWVzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICogLSBpYW06UGFzc1JvbGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXF1ZXN0U3BvdEluc3RhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVxdWVzdFNwb3RJbnN0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXNldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBzcGVjaWZpZWQgSVAgYWRkcmVzc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXNldEFkZHJlc3NBdHRyaWJ1dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzZXRBZGRyZXNzQXR0cmlidXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXNldEFkZHJlc3NBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXNldCB0aGUgZGVmYXVsdCBjdXN0b21lciBtYXN0ZXIga2V5IChDTUspIGZvciBFQlMgZW5jcnlwdGlvbiBmb3IgeW91ciBhY2NvdW50IHRvIHVzZSB0aGUgQVdTLW1hbmFnZWQgQ01LIGZvciBFQlNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzZXRFYnNEZWZhdWx0S21zS2V5SWQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzZXRFYnNEZWZhdWx0S21zS2V5SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc2V0RWJzRGVmYXVsdEttc0tleUlkJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzZXQgYW4gYXR0cmlidXRlIG9mIGFuIEFtYXpvbiBGUEdBIEltYWdlIChBRkkpIHRvIGl0cyBkZWZhdWx0IHZhbHVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Jlc2V0RnBnYUltYWdlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc2V0RnBnYUltYWdlQXR0cmlidXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXNldEZwZ2FJbWFnZUF0dHJpYnV0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlc2V0IGFuIGF0dHJpYnV0ZSBvZiBhbiBBbWF6b24gTWFjaGluZSBJbWFnZSAoQU1JKSB0byBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXNldEltYWdlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc2V0SW1hZ2VBdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc2V0SW1hZ2VBdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXNldCBhbiBhdHRyaWJ1dGUgb2YgYW4gaW5zdGFuY2UgdG8gaXRzIGRlZmF1bHQgdmFsdWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzZXRJbnN0YW5jZUF0dHJpYnV0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXNldEluc3RhbmNlQXR0cmlidXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXNldEluc3RhbmNlQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzZXQgYW4gYXR0cmlidXRlIG9mIGEgbmV0d29yayBpbnRlcmZhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzZXROZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc2V0TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzZXROZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzZXQgcGVybWlzc2lvbiBzZXR0aW5ncyBmb3IgYSBzbmFwc2hvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Jlc2V0U25hcHNob3RBdHRyaWJ1dGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzZXRTbmFwc2hvdEF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzZXRTbmFwc2hvdEF0dHJpYnV0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlc3RvcmUgYW4gRWxhc3RpYyBJUCBhZGRyZXNzIHRoYXQgd2FzIHByZXZpb3VzbHkgbW92ZWQgdG8gdGhlIEVDMi1WUEMgcGxhdGZvcm0gYmFjayB0byB0aGUgRUMyLUNsYXNzaWMgcGxhdGZvcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzdG9yZUFkZHJlc3NUb0NsYXNzaWMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzdG9yZUFkZHJlc3NUb0NsYXNzaWMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVBZGRyZXNzVG9DbGFzc2ljJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhbiBBbWF6b24gTWFjaGluZSBJbWFnZSAoQU1JKSBmcm9tIHRoZSBSZWN5Y2xlIEJpblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXN0b3JlSW1hZ2VGcm9tUmVjeWNsZUJpbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXN0b3JlSW1hZ2VGcm9tUmVjeWNsZUJpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzdG9yZUltYWdlRnJvbVJlY3ljbGVCaW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXN0b3JlIHRoZSBlbnRyaWVzIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uIG9mIGEgbWFuYWdlZCBwcmVmaXggbGlzdCB0byBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcmVmaXggbGlzdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXN0b3JlTWFuYWdlZFByZWZpeExpc3RWZXJzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc3RvcmVNYW5hZ2VkUHJlZml4TGlzdFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVNYW5hZ2VkUHJlZml4TGlzdFZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXN0b3JlIGFuIEFtYXpvbiBFQlMgc25hcHNob3QgZnJvbSB0aGUgUmVjeWNsZSBCaW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzdG9yZVNuYXBzaG90RnJvbVJlY3ljbGVCaW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVzdG9yZVNuYXBzaG90RnJvbVJlY3ljbGVCaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVTbmFwc2hvdEZyb21SZWN5Y2xlQmluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhbiBhcmNoaXZlZCBBbWF6b24gRUJTIHNuYXBzaG90IGZvciB1c2UgdGVtcG9yYXJpbHkgb3IgcGVybWFuZW50bHksIG9yIG1vZGlmeSB0aGUgcmVzdG9yZSBwZXJpb2Qgb3IgcmVzdG9yZSB0eXBlIGZvciBhIHNuYXBzaG90IHRoYXQgd2FzIHByZXZpb3VzbHkgdGVtcG9yYXJpbHkgcmVzdG9yZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVzdG9yZVNuYXBzaG90VGllci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXN0b3JlU25hcHNob3RUaWVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXN0b3JlU25hcHNob3RUaWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIGFuIGluYm91bmQgYXV0aG9yaXphdGlvbiBydWxlIGZyb20gYSBDbGllbnQgVlBOIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Jldm9rZUNsaWVudFZwbkluZ3Jlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmV2b2tlQ2xpZW50VnBuSW5ncmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmV2b2tlQ2xpZW50VnBuSW5ncmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSBvbmUgb3IgbW9yZSBvdXRib3VuZCBydWxlcyBmcm9tIGEgVlBDIHNlY3VyaXR5IGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Jldm9rZVNlY3VyaXR5R3JvdXBFZ3Jlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmV2b2tlU2VjdXJpdHlHcm91cEVncmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmV2b2tlU2VjdXJpdHlHcm91cEVncmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSBvbmUgb3IgbW9yZSBpbmJvdW5kIHJ1bGVzIGZyb20gYSBzZWN1cml0eSBncm91cFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXZva2VTZWN1cml0eUdyb3VwSW5ncmVzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZXZva2VTZWN1cml0eUdyb3VwSW5ncmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmV2b2tlU2VjdXJpdHlHcm91cEluZ3Jlc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsYXVuY2ggb25lIG9yIG1vcmUgaW5zdGFuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBlYzI6Q3JlYXRlVGFnc1xuICAgKiAtIGlhbTpQYXNzUm9sZVxuICAgKiAtIHNzbTpHZXRQYXJhbWV0ZXJzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUnVuSW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1J1bkluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUnVuSW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGF1bmNoIG9uZSBvciBtb3JlIFNjaGVkdWxlZCBJbnN0YW5jZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUnVuU2NoZWR1bGVkSW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1J1blNjaGVkdWxlZEluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUnVuU2NoZWR1bGVkSW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciByb3V0ZXMgaW4gYSBsb2NhbCBnYXRld2F5IHJvdXRlIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU2VhcmNoTG9jYWxHYXRld2F5Um91dGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaExvY2FsR2F0ZXdheVJvdXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoTG9jYWxHYXRld2F5Um91dGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciBncm91cHMsIHNvdXJjZXMsIGFuZCBtZW1iZXJzIGluIGEgdHJhbnNpdCBnYXRld2F5IG11bHRpY2FzdCBkb21haW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TZWFyY2hUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3Vwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggZm9yIHJvdXRlcyBpbiBhIHRyYW5zaXQgZ2F0ZXdheSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlYXJjaFRyYW5zaXRHYXRld2F5Um91dGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaFRyYW5zaXRHYXRld2F5Um91dGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hUcmFuc2l0R2F0ZXdheVJvdXRlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlbmQgYSBkaWFnbm9zdGljIGludGVycnVwdCB0byBhbiBBbWF6b24gRUMyIGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlbmREaWFnbm9zdGljSW50ZXJydXB0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZW5kRGlhZ25vc3RpY0ludGVycnVwdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludGVycnVwdCBhIFNwb3QgSW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9maXMvbGF0ZXN0L3VzZXJndWlkZS9maXMtYWN0aW9ucy1yZWZlcmVuY2UuaHRtbCNzZW5kLXNwb3QtaW5zdGFuY2UtaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHVibGljIHRvU2VuZFNwb3RJbnN0YW5jZUludGVycnVwdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBkZWNsYXJhdGl2ZSBwb2xpY2llcyByZXBvcnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnREZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHN0b3BwZWQgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRJbnN0YW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0SW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBOZXR3b3JrIEFjY2VzcyBTY29wZSBhbmFseXNpc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhbmFseXppbmcgYSBzcGVjaWZpZWQgcGF0aFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gZWMyOkNyZWF0ZVRhZ3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydE5ldHdvcmtJbnNpZ2h0c0FuYWx5c2lzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0TmV0d29ya0luc2lnaHRzQW5hbHlzaXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0TmV0d29ya0luc2lnaHRzQW5hbHlzaXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCB0aGUgcHJpdmF0ZSBETlMgdmVyaWZpY2F0aW9uIHByb2Nlc3MgZm9yIGEgVlBDIGVuZHBvaW50IHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRWcGNFbmRwb2ludFNlcnZpY2VQcml2YXRlRG5zVmVyaWZpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0VnBjRW5kcG9pbnRTZXJ2aWNlUHJpdmF0ZURuc1ZlcmlmaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRWcGNFbmRwb2ludFNlcnZpY2VQcml2YXRlRG5zVmVyaWZpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcCBhbiBBbWF6b24gRUJTLWJhY2tlZCBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdG9wSW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BJbnN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0b3BJbnN0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0ZXJtaW5hdGUgYWN0aXZlIENsaWVudCBWUE4gZW5kcG9pbnQgY29ubmVjdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGVybWluYXRlQ2xpZW50VnBuQ29ubmVjdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGVybWluYXRlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Rlcm1pbmF0ZUNsaWVudFZwbkNvbm5lY3Rpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2h1dCBkb3duIG9uZSBvciBtb3JlIGluc3RhbmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UZXJtaW5hdGVJbnN0YW5jZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGVybWluYXRlSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUZXJtaW5hdGVJbnN0YW5jZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bmFzc2lnbiBvbmUgb3IgbW9yZSBJUHY2IGFkZHJlc3NlcyBmcm9tIGEgbmV0d29yayBpbnRlcmZhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW5hc3NpZ25JcHY2QWRkcmVzc2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VuYXNzaWduSXB2NkFkZHJlc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW5hc3NpZ25JcHY2QWRkcmVzc2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdW5hc3NpZ24gb25lIG9yIG1vcmUgc2Vjb25kYXJ5IHByaXZhdGUgSVAgYWRkcmVzc2VzIGZyb20gYSBuZXR3b3JrIGludGVyZmFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbmFzc2lnblByaXZhdGVJcEFkZHJlc3Nlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbmFzc2lnblByaXZhdGVJcEFkZHJlc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW5hc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bmFzc2lnbiBzZWNvbmRhcnkgcHJpdmF0ZSBJUHY0IGFkZHJlc3NlcyBmcm9tIGEgcHJpdmF0ZSBOQVQgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbmFzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbmFzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW5hc3NpZ25Qcml2YXRlTmF0R2F0ZXdheUFkZHJlc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bmxvY2sgYSBzbmFwc2hvdCB0aGF0IGlzIGxvY2tlZCBpbiBnb3Zlcm5hbmNlIG1vZGUgb3IgaW4gY29tcGxpYW5jZSBtb2RlIHdoaWxlIHN0aWxsIGluIHRoZSBjb29saW5nLW9mZiBwZXJpb2RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW5sb2NrU25hcHNob3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW5sb2NrU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VubG9ja1NuYXBzaG90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBkZXRhaWxlZCBtb25pdG9yaW5nIGZvciBhIHJ1bm5pbmcgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW5tb25pdG9ySW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VubW9uaXRvckluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW5tb25pdG9ySW5zdGFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGRlc2NyaXB0aW9ucyBmb3Igb25lIG9yIG1vcmUgb3V0Ym91bmQgcnVsZXMgaW4gYSBWUEMgc2VjdXJpdHkgZ3JvdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNFZ3Jlc3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNFZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVNlY3VyaXR5R3JvdXBSdWxlRGVzY3JpcHRpb25zRWdyZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGRlc2NyaXB0aW9ucyBmb3Igb25lIG9yIG1vcmUgaW5ib3VuZCBydWxlcyBpbiBhIHNlY3VyaXR5IGdyb3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVNlY3VyaXR5R3JvdXBSdWxlRGVzY3JpcHRpb25zSW5ncmVzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVTZWN1cml0eUdyb3VwUnVsZURlc2NyaXB0aW9uc0luZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVNlY3VyaXR5R3JvdXBSdWxlRGVzY3JpcHRpb25zSW5ncmVzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgYWR2ZXJ0aXNpbmcgYW4gYWRkcmVzcyByYW5nZSB0aGF0IHdhcyBwcm92aXNpb25lZCBmb3IgdXNlIGluIEFXUyB0aHJvdWdoIGJyaW5nIHlvdXIgb3duIElQIGFkZHJlc3NlcyAoQllPSVApXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1dpdGhkcmF3QnlvaXBDaWRyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1dpdGhkcmF3QnlvaXBDaWRyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdXaXRoZHJhd0J5b2lwQ2lkcicpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQWNjZXB0QWRkcmVzc1RyYW5zZmVyJyxcbiAgICAgICdBY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCcsXG4gICAgICAnQWNjZXB0UmVzZXJ2ZWRJbnN0YW5jZXNFeGNoYW5nZVF1b3RlJyxcbiAgICAgICdBY2NlcHRUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbkFzc29jaWF0aW9ucycsXG4gICAgICAnQWNjZXB0VHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudCcsXG4gICAgICAnQWNjZXB0VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50JyxcbiAgICAgICdBY2NlcHRWcGNFbmRwb2ludENvbm5lY3Rpb25zJyxcbiAgICAgICdBY2NlcHRWcGNQZWVyaW5nQ29ubmVjdGlvbicsXG4gICAgICAnQWR2ZXJ0aXNlQnlvaXBDaWRyJyxcbiAgICAgICdBbGxvY2F0ZUFkZHJlc3MnLFxuICAgICAgJ0FsbG9jYXRlSG9zdHMnLFxuICAgICAgJ0FsbG9jYXRlSXBhbVBvb2xDaWRyJyxcbiAgICAgICdBcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrJyxcbiAgICAgICdBc3NpZ25JcHY2QWRkcmVzc2VzJyxcbiAgICAgICdBc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMnLFxuICAgICAgJ0Fzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcycsXG4gICAgICAnQXNzb2NpYXRlQWRkcmVzcycsXG4gICAgICAnQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcicsXG4gICAgICAnQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaycsXG4gICAgICAnQXNzb2NpYXRlRGhjcE9wdGlvbnMnLFxuICAgICAgJ0Fzc29jaWF0ZUVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGUnLFxuICAgICAgJ0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZScsXG4gICAgICAnQXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdycsXG4gICAgICAnQXNzb2NpYXRlSXBhbUJ5b2FzbicsXG4gICAgICAnQXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5JyxcbiAgICAgICdBc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcycsXG4gICAgICAnQXNzb2NpYXRlUm91dGVTZXJ2ZXInLFxuICAgICAgJ0Fzc29jaWF0ZVJvdXRlVGFibGUnLFxuICAgICAgJ0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMnLFxuICAgICAgJ0Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaycsXG4gICAgICAnQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4nLFxuICAgICAgJ0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUnLFxuICAgICAgJ0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZScsXG4gICAgICAnQXNzb2NpYXRlVHJ1bmtJbnRlcmZhY2UnLFxuICAgICAgJ0Fzc29jaWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2wnLFxuICAgICAgJ0Fzc29jaWF0ZVZwY0NpZHJCbG9jaycsXG4gICAgICAnQXR0YWNoQ2xhc3NpY0xpbmtWcGMnLFxuICAgICAgJ0F0dGFjaEludGVybmV0R2F0ZXdheScsXG4gICAgICAnQXR0YWNoTmV0d29ya0ludGVyZmFjZScsXG4gICAgICAnQXR0YWNoVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyJyxcbiAgICAgICdBdHRhY2hWb2x1bWUnLFxuICAgICAgJ0F0dGFjaFZwbkdhdGV3YXknLFxuICAgICAgJ0F1dGhvcml6ZUNsaWVudFZwbkluZ3Jlc3MnLFxuICAgICAgJ0F1dGhvcml6ZVNlY3VyaXR5R3JvdXBFZ3Jlc3MnLFxuICAgICAgJ0F1dGhvcml6ZVNlY3VyaXR5R3JvdXBJbmdyZXNzJyxcbiAgICAgICdCdW5kbGVJbnN0YW5jZScsXG4gICAgICAnQ2FuY2VsQnVuZGxlVGFzaycsXG4gICAgICAnQ2FuY2VsQ2FwYWNpdHlSZXNlcnZhdGlvbicsXG4gICAgICAnQ2FuY2VsQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0cycsXG4gICAgICAnQ2FuY2VsQ29udmVyc2lvblRhc2snLFxuICAgICAgJ0NhbmNlbERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQnLFxuICAgICAgJ0NhbmNlbEV4cG9ydFRhc2snLFxuICAgICAgJ0NhbmNlbEltYWdlTGF1bmNoUGVybWlzc2lvbicsXG4gICAgICAnQ2FuY2VsSW1wb3J0VGFzaycsXG4gICAgICAnQ2FuY2VsUmVzZXJ2ZWRJbnN0YW5jZXNMaXN0aW5nJyxcbiAgICAgICdDYW5jZWxTcG90RmxlZXRSZXF1ZXN0cycsXG4gICAgICAnQ2FuY2VsU3BvdEluc3RhbmNlUmVxdWVzdHMnLFxuICAgICAgJ0NvbmZpcm1Qcm9kdWN0SW5zdGFuY2UnLFxuICAgICAgJ0NvcHlGcGdhSW1hZ2UnLFxuICAgICAgJ0NvcHlJbWFnZScsXG4gICAgICAnQ29weVNuYXBzaG90JyxcbiAgICAgICdDcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uJyxcbiAgICAgICdDcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcnLFxuICAgICAgJ0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCcsXG4gICAgICAnQ3JlYXRlQ2FycmllckdhdGV3YXknLFxuICAgICAgJ0NyZWF0ZUNsaWVudFZwbkVuZHBvaW50JyxcbiAgICAgICdDcmVhdGVDbGllbnRWcG5Sb3V0ZScsXG4gICAgICAnQ3JlYXRlQ29pcENpZHInLFxuICAgICAgJ0NyZWF0ZUNvaXBQb29sJyxcbiAgICAgICdDcmVhdGVDb2lwUG9vbFBlcm1pc3Npb24nLFxuICAgICAgJ0NyZWF0ZUN1c3RvbWVyR2F0ZXdheScsXG4gICAgICAnQ3JlYXRlRGVmYXVsdFN1Ym5ldCcsXG4gICAgICAnQ3JlYXRlRGVmYXVsdFZwYycsXG4gICAgICAnQ3JlYXRlRGhjcE9wdGlvbnMnLFxuICAgICAgJ0NyZWF0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXknLFxuICAgICAgJ0NyZWF0ZUZsZWV0JyxcbiAgICAgICdDcmVhdGVGbG93TG9ncycsXG4gICAgICAnQ3JlYXRlRnBnYUltYWdlJyxcbiAgICAgICdDcmVhdGVJbWFnZScsXG4gICAgICAnQ3JlYXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQnLFxuICAgICAgJ0NyZWF0ZUluc3RhbmNlRXZlbnRXaW5kb3cnLFxuICAgICAgJ0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaycsXG4gICAgICAnQ3JlYXRlSW50ZXJuZXRHYXRld2F5JyxcbiAgICAgICdDcmVhdGVJcGFtJyxcbiAgICAgICdDcmVhdGVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VuJyxcbiAgICAgICdDcmVhdGVJcGFtUG9vbCcsXG4gICAgICAnQ3JlYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5JyxcbiAgICAgICdDcmVhdGVJcGFtU2NvcGUnLFxuICAgICAgJ0NyZWF0ZUtleVBhaXInLFxuICAgICAgJ0NyZWF0ZUxhdW5jaFRlbXBsYXRlJyxcbiAgICAgICdDcmVhdGVMYXVuY2hUZW1wbGF0ZVZlcnNpb24nLFxuICAgICAgJ0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlJyxcbiAgICAgICdDcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlJyxcbiAgICAgICdDcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlUGVybWlzc2lvbicsXG4gICAgICAnQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uJyxcbiAgICAgICdDcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24nLFxuICAgICAgJ0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UnLFxuICAgICAgJ0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cCcsXG4gICAgICAnQ3JlYXRlTWFuYWdlZFByZWZpeExpc3QnLFxuICAgICAgJ0NyZWF0ZU5hdEdhdGV3YXknLFxuICAgICAgJ0NyZWF0ZU5ldHdvcmtBY2wnLFxuICAgICAgJ0NyZWF0ZU5ldHdvcmtBY2xFbnRyeScsXG4gICAgICAnQ3JlYXRlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGUnLFxuICAgICAgJ0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgnLFxuICAgICAgJ0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2UnLFxuICAgICAgJ0NyZWF0ZVBsYWNlbWVudEdyb3VwJyxcbiAgICAgICdDcmVhdGVQdWJsaWNJcHY0UG9vbCcsXG4gICAgICAnQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrJyxcbiAgICAgICdDcmVhdGVSZXNlcnZlZEluc3RhbmNlc0xpc3RpbmcnLFxuICAgICAgJ0NyZWF0ZVJlc3RvcmVJbWFnZVRhc2snLFxuICAgICAgJ0NyZWF0ZVJvdXRlJyxcbiAgICAgICdDcmVhdGVSb3V0ZVNlcnZlcicsXG4gICAgICAnQ3JlYXRlUm91dGVTZXJ2ZXJFbmRwb2ludCcsXG4gICAgICAnQ3JlYXRlUm91dGVTZXJ2ZXJQZWVyJyxcbiAgICAgICdDcmVhdGVSb3V0ZVRhYmxlJyxcbiAgICAgICdDcmVhdGVTZWN1cml0eUdyb3VwJyxcbiAgICAgICdDcmVhdGVTbmFwc2hvdCcsXG4gICAgICAnQ3JlYXRlU25hcHNob3RzJyxcbiAgICAgICdDcmVhdGVTcG90RGF0YWZlZWRTdWJzY3JpcHRpb24nLFxuICAgICAgJ0NyZWF0ZVN0b3JlSW1hZ2VUYXNrJyxcbiAgICAgICdDcmVhdGVTdWJuZXQnLFxuICAgICAgJ0NyZWF0ZVN1Ym5ldENpZHJSZXNlcnZhdGlvbicsXG4gICAgICAnQ3JlYXRlVHJhZmZpY01pcnJvckZpbHRlcicsXG4gICAgICAnQ3JlYXRlVHJhZmZpY01pcnJvckZpbHRlclJ1bGUnLFxuICAgICAgJ0NyZWF0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uJyxcbiAgICAgICdDcmVhdGVUcmFmZmljTWlycm9yVGFyZ2V0JyxcbiAgICAgICdDcmVhdGVUcmFuc2l0R2F0ZXdheScsXG4gICAgICAnQ3JlYXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0JyxcbiAgICAgICdDcmVhdGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyJyxcbiAgICAgICdDcmVhdGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbicsXG4gICAgICAnQ3JlYXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudCcsXG4gICAgICAnQ3JlYXRlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZScsXG4gICAgICAnQ3JlYXRlVHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlJyxcbiAgICAgICdDcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlJyxcbiAgICAgICdDcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUnLFxuICAgICAgJ0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCcsXG4gICAgICAnQ3JlYXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50JyxcbiAgICAgICdDcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50JyxcbiAgICAgICdDcmVhdGVWZXJpZmllZEFjY2Vzc0dyb3VwJyxcbiAgICAgICdDcmVhdGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlJyxcbiAgICAgICdDcmVhdGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXInLFxuICAgICAgJ0NyZWF0ZVZvbHVtZScsXG4gICAgICAnQ3JlYXRlVnBjJyxcbiAgICAgICdDcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbicsXG4gICAgICAnQ3JlYXRlVnBjRW5kcG9pbnQnLFxuICAgICAgJ0NyZWF0ZVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbicsXG4gICAgICAnQ3JlYXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbicsXG4gICAgICAnQ3JlYXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24nLFxuICAgICAgJ0NyZWF0ZVZwbkNvbm5lY3Rpb24nLFxuICAgICAgJ0NyZWF0ZVZwbkNvbm5lY3Rpb25Sb3V0ZScsXG4gICAgICAnQ3JlYXRlVnBuR2F0ZXdheScsXG4gICAgICAnRGVsZXRlQ2FycmllckdhdGV3YXknLFxuICAgICAgJ0RlbGV0ZUNsaWVudFZwbkVuZHBvaW50JyxcbiAgICAgICdEZWxldGVDbGllbnRWcG5Sb3V0ZScsXG4gICAgICAnRGVsZXRlQ29pcENpZHInLFxuICAgICAgJ0RlbGV0ZUNvaXBQb29sJyxcbiAgICAgICdEZWxldGVDb2lwUG9vbFBlcm1pc3Npb24nLFxuICAgICAgJ0RlbGV0ZUN1c3RvbWVyR2F0ZXdheScsXG4gICAgICAnRGVsZXRlRGhjcE9wdGlvbnMnLFxuICAgICAgJ0RlbGV0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXknLFxuICAgICAgJ0RlbGV0ZUZsZWV0cycsXG4gICAgICAnRGVsZXRlRmxvd0xvZ3MnLFxuICAgICAgJ0RlbGV0ZUZwZ2FJbWFnZScsXG4gICAgICAnRGVsZXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQnLFxuICAgICAgJ0RlbGV0ZUluc3RhbmNlRXZlbnRXaW5kb3cnLFxuICAgICAgJ0RlbGV0ZUludGVybmV0R2F0ZXdheScsXG4gICAgICAnRGVsZXRlSXBhbScsXG4gICAgICAnRGVsZXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbicsXG4gICAgICAnRGVsZXRlSXBhbVBvb2wnLFxuICAgICAgJ0RlbGV0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeScsXG4gICAgICAnRGVsZXRlSXBhbVNjb3BlJyxcbiAgICAgICdEZWxldGVLZXlQYWlyJyxcbiAgICAgICdEZWxldGVMYXVuY2hUZW1wbGF0ZScsXG4gICAgICAnRGVsZXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucycsXG4gICAgICAnRGVsZXRlTG9jYWxHYXRld2F5Um91dGUnLFxuICAgICAgJ0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUnLFxuICAgICAgJ0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9uJyxcbiAgICAgICdEZWxldGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb24nLFxuICAgICAgJ0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbicsXG4gICAgICAnRGVsZXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZScsXG4gICAgICAnRGVsZXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwJyxcbiAgICAgICdEZWxldGVNYW5hZ2VkUHJlZml4TGlzdCcsXG4gICAgICAnRGVsZXRlTmF0R2F0ZXdheScsXG4gICAgICAnRGVsZXRlTmV0d29ya0FjbCcsXG4gICAgICAnRGVsZXRlTmV0d29ya0FjbEVudHJ5JyxcbiAgICAgICdEZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZScsXG4gICAgICAnRGVsZXRlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcycsXG4gICAgICAnRGVsZXRlTmV0d29ya0luc2lnaHRzQW5hbHlzaXMnLFxuICAgICAgJ0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgnLFxuICAgICAgJ0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2UnLFxuICAgICAgJ0RlbGV0ZVBsYWNlbWVudEdyb3VwJyxcbiAgICAgICdEZWxldGVQdWJsaWNJcHY0UG9vbCcsXG4gICAgICAnRGVsZXRlUXVldWVkUmVzZXJ2ZWRJbnN0YW5jZXMnLFxuICAgICAgJ0RlbGV0ZVJlc291cmNlUG9saWN5JyxcbiAgICAgICdEZWxldGVSb3V0ZScsXG4gICAgICAnRGVsZXRlUm91dGVTZXJ2ZXInLFxuICAgICAgJ0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQnLFxuICAgICAgJ0RlbGV0ZVJvdXRlU2VydmVyUGVlcicsXG4gICAgICAnRGVsZXRlUm91dGVUYWJsZScsXG4gICAgICAnRGVsZXRlU2VjdXJpdHlHcm91cCcsXG4gICAgICAnRGVsZXRlU25hcHNob3QnLFxuICAgICAgJ0RlbGV0ZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbicsXG4gICAgICAnRGVsZXRlU3VibmV0JyxcbiAgICAgICdEZWxldGVTdWJuZXRDaWRyUmVzZXJ2YXRpb24nLFxuICAgICAgJ0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXInLFxuICAgICAgJ0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlJyxcbiAgICAgICdEZWxldGVUcmFmZmljTWlycm9yU2Vzc2lvbicsXG4gICAgICAnRGVsZXRlVHJhZmZpY01pcnJvclRhcmdldCcsXG4gICAgICAnRGVsZXRlVHJhbnNpdEdhdGV3YXknLFxuICAgICAgJ0RlbGV0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdCcsXG4gICAgICAnRGVsZXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcicsXG4gICAgICAnRGVsZXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4nLFxuICAgICAgJ0RlbGV0ZVRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQnLFxuICAgICAgJ0RlbGV0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUnLFxuICAgICAgJ0RlbGV0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZScsXG4gICAgICAnRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZScsXG4gICAgICAnRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlJyxcbiAgICAgICdEZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnQnLFxuICAgICAgJ0RlbGV0ZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCcsXG4gICAgICAnRGVsZXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludCcsXG4gICAgICAnRGVsZXRlVmVyaWZpZWRBY2Nlc3NHcm91cCcsXG4gICAgICAnRGVsZXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZScsXG4gICAgICAnRGVsZXRlVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyJyxcbiAgICAgICdEZWxldGVWb2x1bWUnLFxuICAgICAgJ0RlbGV0ZVZwYycsXG4gICAgICAnRGVsZXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24nLFxuICAgICAgJ0RlbGV0ZVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbnMnLFxuICAgICAgJ0RlbGV0ZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb25zJyxcbiAgICAgICdEZWxldGVWcGNFbmRwb2ludHMnLFxuICAgICAgJ0RlbGV0ZVZwY1BlZXJpbmdDb25uZWN0aW9uJyxcbiAgICAgICdEZWxldGVWcG5Db25uZWN0aW9uJyxcbiAgICAgICdEZWxldGVWcG5Db25uZWN0aW9uUm91dGUnLFxuICAgICAgJ0RlbGV0ZVZwbkdhdGV3YXknLFxuICAgICAgJ0RlcHJvdmlzaW9uQnlvaXBDaWRyJyxcbiAgICAgICdEZXByb3Zpc2lvbklwYW1CeW9hc24nLFxuICAgICAgJ0RlcHJvdmlzaW9uSXBhbVBvb2xDaWRyJyxcbiAgICAgICdEZXByb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkcicsXG4gICAgICAnRGVyZWdpc3RlckltYWdlJyxcbiAgICAgICdEZXJlZ2lzdGVySW5zdGFuY2VFdmVudE5vdGlmaWNhdGlvbkF0dHJpYnV0ZXMnLFxuICAgICAgJ0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycycsXG4gICAgICAnRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzJyxcbiAgICAgICdEZXRhY2hDbGFzc2ljTGlua1ZwYycsXG4gICAgICAnRGV0YWNoSW50ZXJuZXRHYXRld2F5JyxcbiAgICAgICdEZXRhY2hOZXR3b3JrSW50ZXJmYWNlJyxcbiAgICAgICdEZXRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXInLFxuICAgICAgJ0RldGFjaFZvbHVtZScsXG4gICAgICAnRGV0YWNoVnBuR2F0ZXdheScsXG4gICAgICAnRGlzYWJsZUFkZHJlc3NUcmFuc2ZlcicsXG4gICAgICAnRGlzYWJsZUFsbG93ZWRJbWFnZXNTZXR0aW5ncycsXG4gICAgICAnRGlzYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbicsXG4gICAgICAnRGlzYWJsZUVic0VuY3J5cHRpb25CeURlZmF1bHQnLFxuICAgICAgJ0Rpc2FibGVGYXN0TGF1bmNoJyxcbiAgICAgICdEaXNhYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMnLFxuICAgICAgJ0Rpc2FibGVJbWFnZScsXG4gICAgICAnRGlzYWJsZUltYWdlQmxvY2tQdWJsaWNBY2Nlc3MnLFxuICAgICAgJ0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uJyxcbiAgICAgICdEaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24nLFxuICAgICAgJ0Rpc2FibGVJcGFtT3JnYW5pemF0aW9uQWRtaW5BY2NvdW50JyxcbiAgICAgICdEaXNhYmxlUm91dGVTZXJ2ZXJQcm9wYWdhdGlvbicsXG4gICAgICAnRGlzYWJsZVNlcmlhbENvbnNvbGVBY2Nlc3MnLFxuICAgICAgJ0Rpc2FibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzJyxcbiAgICAgICdEaXNhYmxlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb24nLFxuICAgICAgJ0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uJyxcbiAgICAgICdEaXNhYmxlVnBjQ2xhc3NpY0xpbmsnLFxuICAgICAgJ0Rpc2FibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUFkZHJlc3MnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXInLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGUnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZScsXG4gICAgICAnRGlzYXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdycsXG4gICAgICAnRGlzYXNzb2NpYXRlSXBhbUJ5b2FzbicsXG4gICAgICAnRGlzYXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5JyxcbiAgICAgICdEaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcycsXG4gICAgICAnRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXInLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaycsXG4gICAgICAnRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4nLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZScsXG4gICAgICAnRGlzYXNzb2NpYXRlVHJ1bmtJbnRlcmZhY2UnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2wnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVZwY0NpZHJCbG9jaycsXG4gICAgICAnRW5hYmxlQWRkcmVzc1RyYW5zZmVyJyxcbiAgICAgICdFbmFibGVBbGxvd2VkSW1hZ2VzU2V0dGluZ3MnLFxuICAgICAgJ0VuYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbicsXG4gICAgICAnRW5hYmxlRWJzRW5jcnlwdGlvbkJ5RGVmYXVsdCcsXG4gICAgICAnRW5hYmxlRmFzdExhdW5jaCcsXG4gICAgICAnRW5hYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMnLFxuICAgICAgJ0VuYWJsZUltYWdlJyxcbiAgICAgICdFbmFibGVJbWFnZUJsb2NrUHVibGljQWNjZXNzJyxcbiAgICAgICdFbmFibGVJbWFnZURlcHJlY2F0aW9uJyxcbiAgICAgICdFbmFibGVJbWFnZURlcmVnaXN0cmF0aW9uUHJvdGVjdGlvbicsXG4gICAgICAnRW5hYmxlSXBhbU9yZ2FuaXphdGlvbkFkbWluQWNjb3VudCcsXG4gICAgICAnRW5hYmxlUmVhY2hhYmlsaXR5QW5hbHl6ZXJPcmdhbml6YXRpb25TaGFyaW5nJyxcbiAgICAgICdFbmFibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uJyxcbiAgICAgICdFbmFibGVTZXJpYWxDb25zb2xlQWNjZXNzJyxcbiAgICAgICdFbmFibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzJyxcbiAgICAgICdFbmFibGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbicsXG4gICAgICAnRW5hYmxlVmd3Um91dGVQcm9wYWdhdGlvbicsXG4gICAgICAnRW5hYmxlVm9sdW1lSU8nLFxuICAgICAgJ0VuYWJsZVZwY0NsYXNzaWNMaW5rJyxcbiAgICAgICdFbmFibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQnLFxuICAgICAgJ0V4cG9ydEltYWdlJyxcbiAgICAgICdFeHBvcnRUcmFuc2l0R2F0ZXdheVJvdXRlcycsXG4gICAgICAnSW1wb3J0QnlvaXBDaWRyVG9JcGFtJyxcbiAgICAgICdJbXBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0JyxcbiAgICAgICdJbXBvcnRJbWFnZScsXG4gICAgICAnSW1wb3J0SW5zdGFuY2UnLFxuICAgICAgJ0ltcG9ydEtleVBhaXInLFxuICAgICAgJ0ltcG9ydFNuYXBzaG90JyxcbiAgICAgICdJbXBvcnRWb2x1bWUnLFxuICAgICAgJ0luamVjdEFwaUVycm9yJyxcbiAgICAgICdMb2NrU25hcHNob3QnLFxuICAgICAgJ01vZGlmeUFkZHJlc3NBdHRyaWJ1dGUnLFxuICAgICAgJ01vZGlmeUF2YWlsYWJpbGl0eVpvbmVHcm91cCcsXG4gICAgICAnTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbicsXG4gICAgICAnTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0JyxcbiAgICAgICdNb2RpZnlDbGllbnRWcG5FbmRwb2ludCcsXG4gICAgICAnTW9kaWZ5RGVmYXVsdENyZWRpdFNwZWNpZmljYXRpb24nLFxuICAgICAgJ01vZGlmeUVic0RlZmF1bHRLbXNLZXlJZCcsXG4gICAgICAnTW9kaWZ5RmxlZXQnLFxuICAgICAgJ01vZGlmeUZwZ2FJbWFnZUF0dHJpYnV0ZScsXG4gICAgICAnTW9kaWZ5SG9zdHMnLFxuICAgICAgJ01vZGlmeUlkRm9ybWF0JyxcbiAgICAgICdNb2RpZnlJZGVudGl0eUlkRm9ybWF0JyxcbiAgICAgICdNb2RpZnlJbWFnZUF0dHJpYnV0ZScsXG4gICAgICAnTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUnLFxuICAgICAgJ01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMnLFxuICAgICAgJ01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucycsXG4gICAgICAnTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uJyxcbiAgICAgICdNb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lJyxcbiAgICAgICdNb2RpZnlJbnN0YW5jZUV2ZW50V2luZG93JyxcbiAgICAgICdNb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucycsXG4gICAgICAnTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YURlZmF1bHRzJyxcbiAgICAgICdNb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucycsXG4gICAgICAnTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zJyxcbiAgICAgICdNb2RpZnlJbnN0YW5jZVBsYWNlbWVudCcsXG4gICAgICAnTW9kaWZ5SXBhbScsXG4gICAgICAnTW9kaWZ5SXBhbVBvb2wnLFxuICAgICAgJ01vZGlmeUlwYW1SZXNvdXJjZUNpZHInLFxuICAgICAgJ01vZGlmeUlwYW1SZXNvdXJjZURpc2NvdmVyeScsXG4gICAgICAnTW9kaWZ5SXBhbVNjb3BlJyxcbiAgICAgICdNb2RpZnlMYXVuY2hUZW1wbGF0ZScsXG4gICAgICAnTW9kaWZ5TG9jYWxHYXRld2F5Um91dGUnLFxuICAgICAgJ01vZGlmeU1hbmFnZWRQcmVmaXhMaXN0JyxcbiAgICAgICdNb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlJyxcbiAgICAgICdNb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMnLFxuICAgICAgJ01vZGlmeVJlc2VydmVkSW5zdGFuY2VzJyxcbiAgICAgICdNb2RpZnlSb3V0ZVNlcnZlcicsXG4gICAgICAnTW9kaWZ5U2VjdXJpdHlHcm91cFJ1bGVzJyxcbiAgICAgICdNb2RpZnlTbmFwc2hvdFRpZXInLFxuICAgICAgJ01vZGlmeVNwb3RGbGVldFJlcXVlc3QnLFxuICAgICAgJ01vZGlmeVN1Ym5ldEF0dHJpYnV0ZScsXG4gICAgICAnTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlck5ldHdvcmtTZXJ2aWNlcycsXG4gICAgICAnTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlclJ1bGUnLFxuICAgICAgJ01vZGlmeVRyYWZmaWNNaXJyb3JTZXNzaW9uJyxcbiAgICAgICdNb2RpZnlUcmFuc2l0R2F0ZXdheScsXG4gICAgICAnTW9kaWZ5VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlJyxcbiAgICAgICdNb2RpZnlUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQnLFxuICAgICAgJ01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQnLFxuICAgICAgJ01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3knLFxuICAgICAgJ01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXAnLFxuICAgICAgJ01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXBQb2xpY3knLFxuICAgICAgJ01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UnLFxuICAgICAgJ01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VMb2dnaW5nQ29uZmlndXJhdGlvbicsXG4gICAgICAnTW9kaWZ5VmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyJyxcbiAgICAgICdNb2RpZnlWb2x1bWUnLFxuICAgICAgJ01vZGlmeVZvbHVtZUF0dHJpYnV0ZScsXG4gICAgICAnTW9kaWZ5VnBjQXR0cmlidXRlJyxcbiAgICAgICdNb2RpZnlWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbicsXG4gICAgICAnTW9kaWZ5VnBjQmxvY2tQdWJsaWNBY2Nlc3NPcHRpb25zJyxcbiAgICAgICdNb2RpZnlWcGNFbmRwb2ludCcsXG4gICAgICAnTW9kaWZ5VnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9uJyxcbiAgICAgICdNb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uJyxcbiAgICAgICdNb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQYXllclJlc3BvbnNpYmlsaXR5JyxcbiAgICAgICdNb2RpZnlWcGNQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMnLFxuICAgICAgJ01vZGlmeVZwY1RlbmFuY3knLFxuICAgICAgJ01vZGlmeVZwbkNvbm5lY3Rpb24nLFxuICAgICAgJ01vZGlmeVZwbkNvbm5lY3Rpb25PcHRpb25zJyxcbiAgICAgICdNb2RpZnlWcG5UdW5uZWxDZXJ0aWZpY2F0ZScsXG4gICAgICAnTW9kaWZ5VnBuVHVubmVsT3B0aW9ucycsXG4gICAgICAnTW9uaXRvckluc3RhbmNlcycsXG4gICAgICAnTW92ZUFkZHJlc3NUb1ZwYycsXG4gICAgICAnTW92ZUJ5b2lwQ2lkclRvSXBhbScsXG4gICAgICAnTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMnLFxuICAgICAgJ1BhdXNlVm9sdW1lSU8nLFxuICAgICAgJ1Byb3Zpc2lvbkJ5b2lwQ2lkcicsXG4gICAgICAnUHJvdmlzaW9uSXBhbUJ5b2FzbicsXG4gICAgICAnUHJvdmlzaW9uSXBhbVBvb2xDaWRyJyxcbiAgICAgICdQcm92aXNpb25QdWJsaWNJcHY0UG9vbENpZHInLFxuICAgICAgJ1B1cmNoYXNlQ2FwYWNpdHlCbG9jaycsXG4gICAgICAnUHVyY2hhc2VDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uJyxcbiAgICAgICdQdXJjaGFzZUhvc3RSZXNlcnZhdGlvbicsXG4gICAgICAnUHVyY2hhc2VSZXNlcnZlZEluc3RhbmNlc09mZmVyaW5nJyxcbiAgICAgICdQdXJjaGFzZVNjaGVkdWxlZEluc3RhbmNlcycsXG4gICAgICAnUHV0UmVzb3VyY2VQb2xpY3knLFxuICAgICAgJ1JlYm9vdEluc3RhbmNlcycsXG4gICAgICAnUmVnaXN0ZXJJbWFnZScsXG4gICAgICAnUmVnaXN0ZXJJbnN0YW5jZUV2ZW50Tm90aWZpY2F0aW9uQXR0cmlidXRlcycsXG4gICAgICAnUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycycsXG4gICAgICAnUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcycsXG4gICAgICAnUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAnLFxuICAgICAgJ1JlamVjdFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zJyxcbiAgICAgICdSZWplY3RUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50JyxcbiAgICAgICdSZWplY3RUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQnLFxuICAgICAgJ1JlamVjdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMnLFxuICAgICAgJ1JlamVjdFZwY1BlZXJpbmdDb25uZWN0aW9uJyxcbiAgICAgICdSZWxlYXNlQWRkcmVzcycsXG4gICAgICAnUmVsZWFzZUhvc3RzJyxcbiAgICAgICdSZWxlYXNlSXBhbVBvb2xBbGxvY2F0aW9uJyxcbiAgICAgICdSZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24nLFxuICAgICAgJ1JlcGxhY2VJbWFnZUNyaXRlcmlhSW5BbGxvd2VkSW1hZ2VzU2V0dGluZ3MnLFxuICAgICAgJ1JlcGxhY2VOZXR3b3JrQWNsQXNzb2NpYXRpb24nLFxuICAgICAgJ1JlcGxhY2VOZXR3b3JrQWNsRW50cnknLFxuICAgICAgJ1JlcGxhY2VSb3V0ZScsXG4gICAgICAnUmVwbGFjZVJvdXRlVGFibGVBc3NvY2lhdGlvbicsXG4gICAgICAnUmVwbGFjZVRyYW5zaXRHYXRld2F5Um91dGUnLFxuICAgICAgJ1JlcGxhY2VWcG5UdW5uZWwnLFxuICAgICAgJ1JlcG9ydEluc3RhbmNlU3RhdHVzJyxcbiAgICAgICdSZXF1ZXN0U3BvdEZsZWV0JyxcbiAgICAgICdSZXF1ZXN0U3BvdEluc3RhbmNlcycsXG4gICAgICAnUmVzZXRBZGRyZXNzQXR0cmlidXRlJyxcbiAgICAgICdSZXNldEVic0RlZmF1bHRLbXNLZXlJZCcsXG4gICAgICAnUmVzZXRGcGdhSW1hZ2VBdHRyaWJ1dGUnLFxuICAgICAgJ1Jlc2V0SW1hZ2VBdHRyaWJ1dGUnLFxuICAgICAgJ1Jlc2V0SW5zdGFuY2VBdHRyaWJ1dGUnLFxuICAgICAgJ1Jlc2V0TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZScsXG4gICAgICAnUmVzdG9yZUFkZHJlc3NUb0NsYXNzaWMnLFxuICAgICAgJ1Jlc3RvcmVJbWFnZUZyb21SZWN5Y2xlQmluJyxcbiAgICAgICdSZXN0b3JlTWFuYWdlZFByZWZpeExpc3RWZXJzaW9uJyxcbiAgICAgICdSZXN0b3JlU25hcHNob3RGcm9tUmVjeWNsZUJpbicsXG4gICAgICAnUmVzdG9yZVNuYXBzaG90VGllcicsXG4gICAgICAnUmV2b2tlQ2xpZW50VnBuSW5ncmVzcycsXG4gICAgICAnUmV2b2tlU2VjdXJpdHlHcm91cEVncmVzcycsXG4gICAgICAnUmV2b2tlU2VjdXJpdHlHcm91cEluZ3Jlc3MnLFxuICAgICAgJ1J1bkluc3RhbmNlcycsXG4gICAgICAnUnVuU2NoZWR1bGVkSW5zdGFuY2VzJyxcbiAgICAgICdTZW5kRGlhZ25vc3RpY0ludGVycnVwdCcsXG4gICAgICAnU2VuZFNwb3RJbnN0YW5jZUludGVycnVwdGlvbnMnLFxuICAgICAgJ1N0YXJ0SW5zdGFuY2VzJyxcbiAgICAgICdTdGFydE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXMnLFxuICAgICAgJ1N0YXJ0TmV0d29ya0luc2lnaHRzQW5hbHlzaXMnLFxuICAgICAgJ1N0YXJ0VnBjRW5kcG9pbnRTZXJ2aWNlUHJpdmF0ZURuc1ZlcmlmaWNhdGlvbicsXG4gICAgICAnU3RvcEluc3RhbmNlcycsXG4gICAgICAnVGVybWluYXRlQ2xpZW50VnBuQ29ubmVjdGlvbnMnLFxuICAgICAgJ1Rlcm1pbmF0ZUluc3RhbmNlcycsXG4gICAgICAnVW5hc3NpZ25JcHY2QWRkcmVzc2VzJyxcbiAgICAgICdVbmFzc2lnblByaXZhdGVJcEFkZHJlc3NlcycsXG4gICAgICAnVW5hc3NpZ25Qcml2YXRlTmF0R2F0ZXdheUFkZHJlc3MnLFxuICAgICAgJ1VubG9ja1NuYXBzaG90JyxcbiAgICAgICdVbm1vbml0b3JJbnN0YW5jZXMnLFxuICAgICAgJ1VwZGF0ZVNlY3VyaXR5R3JvdXBSdWxlRGVzY3JpcHRpb25zRWdyZXNzJyxcbiAgICAgICdVcGRhdGVTZWN1cml0eUdyb3VwUnVsZURlc2NyaXB0aW9uc0luZ3Jlc3MnLFxuICAgICAgJ1dpdGhkcmF3QnlvaXBDaWRyJ1xuICAgIF0sXG4gICAgJ1Blcm1pc3Npb25zIG1hbmFnZW1lbnQnOiBbXG4gICAgICAnQ3JlYXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24nLFxuICAgICAgJ0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uJyxcbiAgICAgICdNb2RpZnlTbmFwc2hvdEF0dHJpYnV0ZScsXG4gICAgICAnTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMnLFxuICAgICAgJ1Jlc2V0U25hcHNob3RBdHRyaWJ1dGUnXG4gICAgXSxcbiAgICBUYWdnaW5nOiBbXG4gICAgICAnQ3JlYXRlVGFncycsXG4gICAgICAnRGVsZXRlVGFncydcbiAgICBdLFxuICAgIExpc3Q6IFtcbiAgICAgICdEZXNjcmliZUFjY291bnRBdHRyaWJ1dGVzJyxcbiAgICAgICdEZXNjcmliZUFkZHJlc3NUcmFuc2ZlcnMnLFxuICAgICAgJ0Rlc2NyaWJlQWRkcmVzc2VzJyxcbiAgICAgICdEZXNjcmliZUFkZHJlc3Nlc0F0dHJpYnV0ZScsXG4gICAgICAnRGVzY3JpYmVBZ2dyZWdhdGVJZEZvcm1hdCcsXG4gICAgICAnRGVzY3JpYmVBdmFpbGFiaWxpdHlab25lcycsXG4gICAgICAnRGVzY3JpYmVBd3NOZXR3b3JrUGVyZm9ybWFuY2VNZXRyaWNTdWJzY3JpcHRpb25zJyxcbiAgICAgICdEZXNjcmliZUJ1bmRsZVRhc2tzJyxcbiAgICAgICdEZXNjcmliZUJ5b2lwQ2lkcnMnLFxuICAgICAgJ0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbkhpc3RvcnknLFxuICAgICAgJ0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncycsXG4gICAgICAnRGVzY3JpYmVDYXBhY2l0eUJsb2NrT2ZmZXJpbmdzJyxcbiAgICAgICdEZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nUmVxdWVzdHMnLFxuICAgICAgJ0Rlc2NyaWJlQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0cycsXG4gICAgICAnRGVzY3JpYmVDYXBhY2l0eVJlc2VydmF0aW9ucycsXG4gICAgICAnRGVzY3JpYmVDYXJyaWVyR2F0ZXdheXMnLFxuICAgICAgJ0Rlc2NyaWJlQ2xhc3NpY0xpbmtJbnN0YW5jZXMnLFxuICAgICAgJ0Rlc2NyaWJlQ2xpZW50VnBuQXV0aG9yaXphdGlvblJ1bGVzJyxcbiAgICAgICdEZXNjcmliZUNsaWVudFZwbkNvbm5lY3Rpb25zJyxcbiAgICAgICdEZXNjcmliZUNsaWVudFZwbkVuZHBvaW50cycsXG4gICAgICAnRGVzY3JpYmVDbGllbnRWcG5Sb3V0ZXMnLFxuICAgICAgJ0Rlc2NyaWJlQ2xpZW50VnBuVGFyZ2V0TmV0d29ya3MnLFxuICAgICAgJ0Rlc2NyaWJlQ29pcFBvb2xzJyxcbiAgICAgICdEZXNjcmliZUNvbnZlcnNpb25UYXNrcycsXG4gICAgICAnRGVzY3JpYmVDdXN0b21lckdhdGV3YXlzJyxcbiAgICAgICdEZXNjcmliZURlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnRzJyxcbiAgICAgICdEZXNjcmliZURoY3BPcHRpb25zJyxcbiAgICAgICdEZXNjcmliZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlzJyxcbiAgICAgICdEZXNjcmliZUVsYXN0aWNHcHVzJyxcbiAgICAgICdEZXNjcmliZUV4cG9ydEltYWdlVGFza3MnLFxuICAgICAgJ0Rlc2NyaWJlRXhwb3J0VGFza3MnLFxuICAgICAgJ0Rlc2NyaWJlRmFzdExhdW5jaEltYWdlcycsXG4gICAgICAnRGVzY3JpYmVGYXN0U25hcHNob3RSZXN0b3JlcycsXG4gICAgICAnRGVzY3JpYmVGbGVldEhpc3RvcnknLFxuICAgICAgJ0Rlc2NyaWJlRmxlZXRJbnN0YW5jZXMnLFxuICAgICAgJ0Rlc2NyaWJlRmxlZXRzJyxcbiAgICAgICdEZXNjcmliZUZsb3dMb2dzJyxcbiAgICAgICdEZXNjcmliZUZwZ2FJbWFnZUF0dHJpYnV0ZScsXG4gICAgICAnRGVzY3JpYmVGcGdhSW1hZ2VzJyxcbiAgICAgICdEZXNjcmliZUhvc3RSZXNlcnZhdGlvbk9mZmVyaW5ncycsXG4gICAgICAnRGVzY3JpYmVIb3N0UmVzZXJ2YXRpb25zJyxcbiAgICAgICdEZXNjcmliZUhvc3RzJyxcbiAgICAgICdEZXNjcmliZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9ucycsXG4gICAgICAnRGVzY3JpYmVJZEZvcm1hdCcsXG4gICAgICAnRGVzY3JpYmVJZGVudGl0eUlkRm9ybWF0JyxcbiAgICAgICdEZXNjcmliZUltYWdlQXR0cmlidXRlJyxcbiAgICAgICdEZXNjcmliZUltYWdlcycsXG4gICAgICAnRGVzY3JpYmVJbXBvcnRJbWFnZVRhc2tzJyxcbiAgICAgICdEZXNjcmliZUltcG9ydFNuYXBzaG90VGFza3MnLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUnLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnRzJyxcbiAgICAgICdEZXNjcmliZUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbnMnLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VFdmVudE5vdGlmaWNhdGlvbkF0dHJpYnV0ZXMnLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VFdmVudFdpbmRvd3MnLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VJbWFnZU1ldGFkYXRhJyxcbiAgICAgICdEZXNjcmliZUluc3RhbmNlU3RhdHVzJyxcbiAgICAgICdEZXNjcmliZUluc3RhbmNlVG9wb2xvZ3knLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VUeXBlT2ZmZXJpbmdzJyxcbiAgICAgICdEZXNjcmliZUluc3RhbmNlVHlwZXMnLFxuICAgICAgJ0Rlc2NyaWJlSW5zdGFuY2VzJyxcbiAgICAgICdEZXNjcmliZUludGVybmV0R2F0ZXdheXMnLFxuICAgICAgJ0Rlc2NyaWJlSXBhbUJ5b2FzbicsXG4gICAgICAnRGVzY3JpYmVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VucycsXG4gICAgICAnRGVzY3JpYmVJcGFtUG9vbHMnLFxuICAgICAgJ0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJpZXMnLFxuICAgICAgJ0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJ5QXNzb2NpYXRpb25zJyxcbiAgICAgICdEZXNjcmliZUlwYW1TY29wZXMnLFxuICAgICAgJ0Rlc2NyaWJlSXBhbXMnLFxuICAgICAgJ0Rlc2NyaWJlSXB2NlBvb2xzJyxcbiAgICAgICdEZXNjcmliZUtleVBhaXJzJyxcbiAgICAgICdEZXNjcmliZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnMnLFxuICAgICAgJ0Rlc2NyaWJlTGF1bmNoVGVtcGxhdGVzJyxcbiAgICAgICdEZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9ucycsXG4gICAgICAnRGVzY3JpYmVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb25zJyxcbiAgICAgICdEZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0Rlc2NyaWJlTG9jYWxHYXRld2F5Um91dGVUYWJsZXMnLFxuICAgICAgJ0Rlc2NyaWJlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwcycsXG4gICAgICAnRGVzY3JpYmVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlcycsXG4gICAgICAnRGVzY3JpYmVMb2NhbEdhdGV3YXlzJyxcbiAgICAgICdEZXNjcmliZUxvY2tlZFNuYXBzaG90cycsXG4gICAgICAnRGVzY3JpYmVNYWNIb3N0cycsXG4gICAgICAnRGVzY3JpYmVNYW5hZ2VkUHJlZml4TGlzdHMnLFxuICAgICAgJ0Rlc2NyaWJlTW92aW5nQWRkcmVzc2VzJyxcbiAgICAgICdEZXNjcmliZU5hdEdhdGV3YXlzJyxcbiAgICAgICdEZXNjcmliZU5ldHdvcmtBY2xzJyxcbiAgICAgICdEZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzZXMnLFxuICAgICAgJ0Rlc2NyaWJlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVzJyxcbiAgICAgICdEZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FuYWx5c2VzJyxcbiAgICAgICdEZXNjcmliZU5ldHdvcmtJbnNpZ2h0c1BhdGhzJyxcbiAgICAgICdEZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUnLFxuICAgICAgJ0Rlc2NyaWJlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb25zJyxcbiAgICAgICdEZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VzJyxcbiAgICAgICdEZXNjcmliZU91dHBvc3RMYWdzJyxcbiAgICAgICdEZXNjcmliZVBsYWNlbWVudEdyb3VwcycsXG4gICAgICAnRGVzY3JpYmVQcmVmaXhMaXN0cycsXG4gICAgICAnRGVzY3JpYmVQcmluY2lwYWxJZEZvcm1hdCcsXG4gICAgICAnRGVzY3JpYmVQdWJsaWNJcHY0UG9vbHMnLFxuICAgICAgJ0Rlc2NyaWJlUmVnaW9ucycsXG4gICAgICAnRGVzY3JpYmVSZXBsYWNlUm9vdFZvbHVtZVRhc2tzJyxcbiAgICAgICdEZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzJyxcbiAgICAgICdEZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzTGlzdGluZ3MnLFxuICAgICAgJ0Rlc2NyaWJlUmVzZXJ2ZWRJbnN0YW5jZXNNb2RpZmljYXRpb25zJyxcbiAgICAgICdEZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmdzJyxcbiAgICAgICdEZXNjcmliZVJvdXRlU2VydmVyRW5kcG9pbnRzJyxcbiAgICAgICdEZXNjcmliZVJvdXRlU2VydmVyUGVlcnMnLFxuICAgICAgJ0Rlc2NyaWJlUm91dGVTZXJ2ZXJzJyxcbiAgICAgICdEZXNjcmliZVJvdXRlVGFibGVzJyxcbiAgICAgICdEZXNjcmliZVNjaGVkdWxlZEluc3RhbmNlQXZhaWxhYmlsaXR5JyxcbiAgICAgICdEZXNjcmliZVNjaGVkdWxlZEluc3RhbmNlcycsXG4gICAgICAnRGVzY3JpYmVTZWN1cml0eUdyb3VwUmVmZXJlbmNlcycsXG4gICAgICAnRGVzY3JpYmVTZWN1cml0eUdyb3VwUnVsZXMnLFxuICAgICAgJ0Rlc2NyaWJlU2VjdXJpdHlHcm91cFZwY0Fzc29jaWF0aW9ucycsXG4gICAgICAnRGVzY3JpYmVTZWN1cml0eUdyb3VwcycsXG4gICAgICAnRGVzY3JpYmVTZXJ2aWNlTGlua1ZpcnR1YWxJbnRlcmZhY2VzJyxcbiAgICAgICdEZXNjcmliZVNuYXBzaG90QXR0cmlidXRlJyxcbiAgICAgICdEZXNjcmliZVNuYXBzaG90VGllclN0YXR1cycsXG4gICAgICAnRGVzY3JpYmVTbmFwc2hvdHMnLFxuICAgICAgJ0Rlc2NyaWJlU3BvdERhdGFmZWVkU3Vic2NyaXB0aW9uJyxcbiAgICAgICdEZXNjcmliZVNwb3RGbGVldEluc3RhbmNlcycsXG4gICAgICAnRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0SGlzdG9yeScsXG4gICAgICAnRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0cycsXG4gICAgICAnRGVzY3JpYmVTcG90SW5zdGFuY2VSZXF1ZXN0cycsXG4gICAgICAnRGVzY3JpYmVTcG90UHJpY2VIaXN0b3J5JyxcbiAgICAgICdEZXNjcmliZVN0YWxlU2VjdXJpdHlHcm91cHMnLFxuICAgICAgJ0Rlc2NyaWJlU3RvcmVJbWFnZVRhc2tzJyxcbiAgICAgICdEZXNjcmliZVN1Ym5ldHMnLFxuICAgICAgJ0Rlc2NyaWJlVGFncycsXG4gICAgICAnRGVzY3JpYmVUcmFmZmljTWlycm9yRmlsdGVyUnVsZXMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhZmZpY01pcnJvckZpbHRlcnMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhZmZpY01pcnJvclNlc3Npb25zJyxcbiAgICAgICdEZXNjcmliZVRyYWZmaWNNaXJyb3JUYXJnZXRzJyxcbiAgICAgICdEZXNjcmliZVRyYW5zaXRHYXRld2F5QXR0YWNobWVudHMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcnMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlDb25uZWN0cycsXG4gICAgICAnRGVzY3JpYmVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbnMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudHMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZXMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50cycsXG4gICAgICAnRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVzJyxcbiAgICAgICdEZXNjcmliZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudHMnLFxuICAgICAgJ0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlzJyxcbiAgICAgICdEZXNjcmliZVRydW5rSW50ZXJmYWNlQXNzb2NpYXRpb25zJyxcbiAgICAgICdEZXNjcmliZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRzJyxcbiAgICAgICdEZXNjcmliZVZlcmlmaWVkQWNjZXNzR3JvdXBzJyxcbiAgICAgICdEZXNjcmliZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VMb2dnaW5nQ29uZmlndXJhdGlvbnMnLFxuICAgICAgJ0Rlc2NyaWJlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbEFzc29jaWF0aW9ucycsXG4gICAgICAnRGVzY3JpYmVWZXJpZmllZEFjY2Vzc0luc3RhbmNlcycsXG4gICAgICAnRGVzY3JpYmVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXJzJyxcbiAgICAgICdEZXNjcmliZVZvbHVtZUF0dHJpYnV0ZScsXG4gICAgICAnRGVzY3JpYmVWb2x1bWVTdGF0dXMnLFxuICAgICAgJ0Rlc2NyaWJlVm9sdW1lcycsXG4gICAgICAnRGVzY3JpYmVWb2x1bWVzTW9kaWZpY2F0aW9ucycsXG4gICAgICAnRGVzY3JpYmVWcGNBdHRyaWJ1dGUnLFxuICAgICAgJ0Rlc2NyaWJlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb25zJyxcbiAgICAgICdEZXNjcmliZVZwY0Jsb2NrUHVibGljQWNjZXNzT3B0aW9ucycsXG4gICAgICAnRGVzY3JpYmVWcGNDbGFzc2ljTGluaycsXG4gICAgICAnRGVzY3JpYmVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQnLFxuICAgICAgJ0Rlc2NyaWJlVnBjRW5kcG9pbnRBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0Rlc2NyaWJlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucycsXG4gICAgICAnRGVzY3JpYmVWcGNFbmRwb2ludENvbm5lY3Rpb25zJyxcbiAgICAgICdEZXNjcmliZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb25zJyxcbiAgICAgICdEZXNjcmliZVZwY0VuZHBvaW50U2VydmljZVBlcm1pc3Npb25zJyxcbiAgICAgICdEZXNjcmliZVZwY0VuZHBvaW50U2VydmljZXMnLFxuICAgICAgJ0Rlc2NyaWJlVnBjRW5kcG9pbnRzJyxcbiAgICAgICdEZXNjcmliZVZwY1BlZXJpbmdDb25uZWN0aW9ucycsXG4gICAgICAnRGVzY3JpYmVWcGNzJyxcbiAgICAgICdEZXNjcmliZVZwbkNvbm5lY3Rpb25zJyxcbiAgICAgICdEZXNjcmliZVZwbkdhdGV3YXlzJyxcbiAgICAgICdHZXRHcm91cHNGb3JDYXBhY2l0eVJlc2VydmF0aW9uJyxcbiAgICAgICdHZXRJbnN0YW5jZU1ldGFkYXRhRGVmYXVsdHMnLFxuICAgICAgJ0dldEluc3RhbmNlVHlwZXNGcm9tSW5zdGFuY2VSZXF1aXJlbWVudHMnLFxuICAgICAgJ0dldElwYW1Qb29sQWxsb2NhdGlvbnMnLFxuICAgICAgJ0dldFRyYW5zaXRHYXRld2F5QXR0YWNobWVudFByb3BhZ2F0aW9ucycsXG4gICAgICAnR2V0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMnLFxuICAgICAgJ0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVFbnRyaWVzJyxcbiAgICAgICdHZXRUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2VzJyxcbiAgICAgICdHZXRUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0dldFRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9ucycsXG4gICAgICAnR2V0VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFBvbGljeScsXG4gICAgICAnR2V0VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFRhcmdldHMnLFxuICAgICAgJ0dldFZlcmlmaWVkQWNjZXNzR3JvdXBQb2xpY3knLFxuICAgICAgJ0dldFZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2wnLFxuICAgICAgJ0dldFZwbkNvbm5lY3Rpb25EZXZpY2VTYW1wbGVDb25maWd1cmF0aW9uJyxcbiAgICAgICdHZXRWcG5Db25uZWN0aW9uRGV2aWNlVHlwZXMnLFxuICAgICAgJ0dldFZwblR1bm5lbFJlcGxhY2VtZW50U3RhdHVzJyxcbiAgICAgICdMaXN0SW1hZ2VzSW5SZWN5Y2xlQmluJyxcbiAgICAgICdMaXN0U25hcHNob3RzSW5SZWN5Y2xlQmluJyxcbiAgICAgICdTZWFyY2hMb2NhbEdhdGV3YXlSb3V0ZXMnLFxuICAgICAgJ1NlYXJjaFRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBzJyxcbiAgICAgICdTZWFyY2hUcmFuc2l0R2F0ZXdheVJvdXRlcydcbiAgICBdLFxuICAgIFJlYWQ6IFtcbiAgICAgICdFeHBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0JyxcbiAgICAgICdFeHBvcnRDbGllbnRWcG5DbGllbnRDb25maWd1cmF0aW9uJyxcbiAgICAgICdFeHBvcnRWZXJpZmllZEFjY2Vzc0luc3RhbmNlQ2xpZW50Q29uZmlndXJhdGlvbicsXG4gICAgICAnR2V0QWxsb3dlZEltYWdlc1NldHRpbmdzJyxcbiAgICAgICdHZXRBc3NvY2lhdGVkRW5jbGF2ZUNlcnRpZmljYXRlSWFtUm9sZXMnLFxuICAgICAgJ0dldEFzc29jaWF0ZWRJcHY2UG9vbENpZHJzJyxcbiAgICAgICdHZXRBd3NOZXR3b3JrUGVyZm9ybWFuY2VEYXRhJyxcbiAgICAgICdHZXRDYXBhY2l0eVJlc2VydmF0aW9uVXNhZ2UnLFxuICAgICAgJ0dldENvaXBQb29sVXNhZ2UnLFxuICAgICAgJ0dldENvbnNvbGVPdXRwdXQnLFxuICAgICAgJ0dldENvbnNvbGVTY3JlZW5zaG90JyxcbiAgICAgICdHZXREZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0U3VtbWFyeScsXG4gICAgICAnR2V0RGVmYXVsdENyZWRpdFNwZWNpZmljYXRpb24nLFxuICAgICAgJ0dldEVic0RlZmF1bHRLbXNLZXlJZCcsXG4gICAgICAnR2V0RWJzRW5jcnlwdGlvbkJ5RGVmYXVsdCcsXG4gICAgICAnR2V0Rmxvd0xvZ3NJbnRlZ3JhdGlvblRlbXBsYXRlJyxcbiAgICAgICdHZXRIb3N0UmVzZXJ2YXRpb25QdXJjaGFzZVByZXZpZXcnLFxuICAgICAgJ0dldEltYWdlQmxvY2tQdWJsaWNBY2Nlc3NTdGF0ZScsXG4gICAgICAnR2V0SW5zdGFuY2VUcG1Fa1B1YicsXG4gICAgICAnR2V0SW5zdGFuY2VVZWZpRGF0YScsXG4gICAgICAnR2V0SXBhbUFkZHJlc3NIaXN0b3J5JyxcbiAgICAgICdHZXRJcGFtRGlzY292ZXJlZEFjY291bnRzJyxcbiAgICAgICdHZXRJcGFtRGlzY292ZXJlZFB1YmxpY0FkZHJlc3NlcycsXG4gICAgICAnR2V0SXBhbURpc2NvdmVyZWRSZXNvdXJjZUNpZHJzJyxcbiAgICAgICdHZXRJcGFtUG9vbENpZHJzJyxcbiAgICAgICdHZXRJcGFtUmVzb3VyY2VDaWRycycsXG4gICAgICAnR2V0TGF1bmNoVGVtcGxhdGVEYXRhJyxcbiAgICAgICdHZXRNYW5hZ2VkUHJlZml4TGlzdEFzc29jaWF0aW9ucycsXG4gICAgICAnR2V0TWFuYWdlZFByZWZpeExpc3RFbnRyaWVzJyxcbiAgICAgICdHZXROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzRmluZGluZ3MnLFxuICAgICAgJ0dldE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQ29udGVudCcsXG4gICAgICAnR2V0UGFzc3dvcmREYXRhJyxcbiAgICAgICdHZXRSZXNlcnZlZEluc3RhbmNlc0V4Y2hhbmdlUXVvdGUnLFxuICAgICAgJ0dldFJlc291cmNlUG9saWN5JyxcbiAgICAgICdHZXRSb3V0ZVNlcnZlckFzc29jaWF0aW9ucycsXG4gICAgICAnR2V0Um91dGVTZXJ2ZXJQcm9wYWdhdGlvbnMnLFxuICAgICAgJ0dldFJvdXRlU2VydmVyUm91dGluZ0RhdGFiYXNlJyxcbiAgICAgICdHZXRTZWN1cml0eUdyb3Vwc0ZvclZwYycsXG4gICAgICAnR2V0U2VyaWFsQ29uc29sZUFjY2Vzc1N0YXR1cycsXG4gICAgICAnR2V0U25hcHNob3RCbG9ja1B1YmxpY0FjY2Vzc1N0YXRlJyxcbiAgICAgICdHZXRTcG90UGxhY2VtZW50U2NvcmVzJyxcbiAgICAgICdHZXRTdWJuZXRDaWRyUmVzZXJ2YXRpb25zJyxcbiAgICAgICdTdGFydERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBlbGFzdGljLWlwIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2VsYXN0aWMtaXAtYWRkcmVzc2VzLWVpcC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhbGxvY2F0aW9uSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgYWxsb2NhdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQWxsb2NhdGlvbklkKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmRG9tYWluKClcbiAgICogLSAuaWZQdWJsaWNJcEFkZHJlc3MoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uRWxhc3RpY0lwKGFsbG9jYXRpb25JZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZWxhc3RpYy1pcC8keyBhbGxvY2F0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNhcGFjaXR5LXJlc2VydmF0aW9uLWZsZWV0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBjYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldChjYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2FwYWNpdHktcmVzZXJ2YXRpb24tZmxlZXQvJHsgY2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNhcGFjaXR5LXJlc2VydmF0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2VjMi1jYXBhY2l0eS1yZXNlcnZhdGlvbnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2FwYWNpdHlSZXNlcnZhdGlvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGNhcGFjaXR5UmVzZXJ2YXRpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdmFpbGFiaWxpdHlab25lKClcbiAgICogLSAuaWZBdmFpbGFiaWxpdHlab25lSWQoKVxuICAgKiAtIC5pZkNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCgpXG4gICAqIC0gLmlmQ3JlYXRlRGF0ZSgpXG4gICAqIC0gLmlmRGVzdGluYXRpb25DYXBhY2l0eVJlc2VydmF0aW9uSWQoKVxuICAgKiAtIC5pZkVic09wdGltaXplZCgpXG4gICAqIC0gLmlmRW5kRGF0ZSgpXG4gICAqIC0gLmlmRW5kRGF0ZVR5cGUoKVxuICAgKiAtIC5pZkVwaGVtZXJhbFN0b3JhZ2UoKVxuICAgKiAtIC5pZkluc3RhbmNlQ291bnQoKVxuICAgKiAtIC5pZkluc3RhbmNlTWF0Y2hDcml0ZXJpYSgpXG4gICAqIC0gLmlmSW5zdGFuY2VQbGF0Zm9ybSgpXG4gICAqIC0gLmlmSW5zdGFuY2VUeXBlKClcbiAgICogLSAuaWZJc0xhdW5jaFRlbXBsYXRlUmVzb3VyY2UoKVxuICAgKiAtIC5pZkxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAuaWZPdXRwb3N0QXJuKClcbiAgICogLSAuaWZQbGFjZW1lbnRHcm91cCgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmU291cmNlQ2FwYWNpdHlSZXNlcnZhdGlvbklkKClcbiAgICogLSAuaWZUZW5hbmN5KClcbiAgICovXG4gIHB1YmxpYyBvbkNhcGFjaXR5UmVzZXJ2YXRpb24oY2FwYWNpdHlSZXNlcnZhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjYXBhY2l0eS1yZXNlcnZhdGlvbi8keyBjYXBhY2l0eVJlc2VydmF0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNhcnJpZXItZ2F0ZXdheSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9DYXJyaWVyX0dhdGV3YXkuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2FycmllckdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjYXJyaWVyR2F0ZXdheUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVGVuYW5jeSgpXG4gICAqIC0gLmlmVnBjKClcbiAgICovXG4gIHB1YmxpYyBvbkNhcnJpZXJHYXRld2F5KGNhcnJpZXJHYXRld2F5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhcnJpZXItZ2F0ZXdheS8keyBjYXJyaWVyR2F0ZXdheUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBjZXJ0aWZpY2F0ZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hY20vbGF0ZXN0L3VzZXJndWlkZS9hdXRoZW4tb3ZlcnZpZXcuaHRtbCNhY20tcmVzb3VyY2VzLW9wZXJhdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIGNlcnRpZmljYXRlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgY2VydGlmaWNhdGVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25DZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06YWNtOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjZXJ0aWZpY2F0ZS8keyBjZXJ0aWZpY2F0ZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBjbGllbnQtdnBuLWVuZHBvaW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvY2xpZW50dnBuLWFkbWluL3doYXQtaXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50VnBuRW5kcG9pbnRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjbGllbnRWcG5FbmRwb2ludElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkNsaWVudFJvb3RDZXJ0aWZpY2F0ZUNoYWluQXJuKClcbiAgICogLSAuaWZDbG91ZHdhdGNoTG9nR3JvdXBBcm4oKVxuICAgKiAtIC5pZkNsb3Vkd2F0Y2hMb2dTdHJlYW1Bcm4oKVxuICAgKiAtIC5pZkRpcmVjdG9yeUFybigpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmU2FtbFByb3ZpZGVyQXJuKClcbiAgICogLSAuaWZTZXJ2ZXJDZXJ0aWZpY2F0ZUFybigpXG4gICAqL1xuICBwdWJsaWMgb25DbGllbnRWcG5FbmRwb2ludChjbGllbnRWcG5FbmRwb2ludElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjbGllbnQtdnBuLWVuZHBvaW50LyR7IGNsaWVudFZwbkVuZHBvaW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGN1c3RvbWVyLWdhdGV3YXkgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBuL2xhdGVzdC9zMnN2cG4vVlBDX1ZQTi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjdXN0b21lckdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjdXN0b21lckdhdGV3YXlJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQ3VzdG9tZXJHYXRld2F5KGN1c3RvbWVyR2F0ZXdheUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjdXN0b21lci1nYXRld2F5LyR7IGN1c3RvbWVyR2F0ZXdheUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBkZWNsYXJhdGl2ZS1wb2xpY2llcy1yZXBvcnQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGRlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBkZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkRlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQoZGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpkZWNsYXJhdGl2ZS1wb2xpY2llcy1yZXBvcnQvJHsgZGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBkZWRpY2F0ZWQtaG9zdCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9kZWRpY2F0ZWQtaG9zdHMtb3ZlcnZpZXcuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZGVkaWNhdGVkSG9zdElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGRlZGljYXRlZEhvc3RJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdXRvUGxhY2VtZW50KClcbiAgICogLSAuaWZBdmFpbGFiaWxpdHlab25lKClcbiAgICogLSAuaWZIb3N0UmVjb3ZlcnkoKVxuICAgKiAtIC5pZkluc3RhbmNlVHlwZSgpXG4gICAqIC0gLmlmSXNMYXVuY2hUZW1wbGF0ZVJlc291cmNlKClcbiAgICogLSAuaWZMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLmlmUXVhbnRpdHkoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uRGVkaWNhdGVkSG9zdChkZWRpY2F0ZWRIb3N0SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmRlZGljYXRlZC1ob3N0LyR7IGRlZGljYXRlZEhvc3RJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZGhjcC1vcHRpb25zIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL1ZQQ19ESENQX09wdGlvbnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZGhjcE9wdGlvbnNJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBkaGNwT3B0aW9uc0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmRGhjcE9wdGlvbnNJRCgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25EaGNwT3B0aW9ucyhkaGNwT3B0aW9uc0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpkaGNwLW9wdGlvbnMvJHsgZGhjcE9wdGlvbnNJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZWdyZXNzLW9ubHktaW50ZXJuZXQtZ2F0ZXdheSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9lZ3Jlc3Mtb25seS1pbnRlcm5ldC1nYXRld2F5Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBlZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkoZWdyZXNzT25seUludGVybmV0R2F0ZXdheUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTplZ3Jlc3Mtb25seS1pbnRlcm5ldC1nYXRld2F5LyR7IGVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZWxhc3RpYy1ncHUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9XaW5kb3dzR3VpZGUvZWxhc3RpYy1ncHVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGVsYXN0aWNHcHVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBlbGFzdGljR3B1SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZFbGFzdGljR3B1VHlwZSgpXG4gICAqIC0gLmlmSXNMYXVuY2hUZW1wbGF0ZVJlc291cmNlKClcbiAgICogLSAuaWZMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25FbGFzdGljR3B1KGVsYXN0aWNHcHVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZWxhc3RpYy1ncHUvJHsgZWxhc3RpY0dwdUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBlbGFzdGljLWluZmVyZW5jZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljLWluZmVyZW5jZS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvd2hhdC1pcy1laS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhY2NlbGVyYXRvcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGFjY2VsZXJhdG9ySWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uRWxhc3RpY0luZmVyZW5jZShhY2NlbGVyYXRvcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWxhc3RpYy1pbmZlcmVuY2U6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmVsYXN0aWMtaW5mZXJlbmNlLWFjY2VsZXJhdG9yLyR7IGFjY2VsZXJhdG9ySWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGV4cG9ydC1pbWFnZS10YXNrIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZtLWltcG9ydC9sYXRlc3QvdXNlcmd1aWRlL3ZtaW1wb3J0LWltYWdlLWltcG9ydC5odG1sI2V4cG9ydC12bS1pbWFnZVxuICAgKlxuICAgKiBAcGFyYW0gZXhwb3J0SW1hZ2VUYXNrSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZXhwb3J0SW1hZ2VUYXNrSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkV4cG9ydEltYWdlVGFzayhleHBvcnRJbWFnZVRhc2tJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZXhwb3J0LWltYWdlLXRhc2svJHsgZXhwb3J0SW1hZ2VUYXNrSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGV4cG9ydC1pbnN0YW5jZS10YXNrIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZtLWltcG9ydC9sYXRlc3QvdXNlcmd1aWRlL3ZtZXhwb3J0Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGV4cG9ydFRhc2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBleHBvcnRUYXNrSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkV4cG9ydEluc3RhbmNlVGFzayhleHBvcnRUYXNrSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmV4cG9ydC1pbnN0YW5jZS10YXNrLyR7IGV4cG9ydFRhc2tJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZmxlZXQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWMyLWZsZWV0Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZsZWV0SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZmxlZXRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkZsZWV0KGZsZWV0SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmZsZWV0LyR7IGZsZWV0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGZwZ2EtaW1hZ2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGZwZ2FJbWFnZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZwZ2FJbWFnZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZk93bmVyKClcbiAgICogLSAuaWZQdWJsaWMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uRnBnYUltYWdlKGZwZ2FJbWFnZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpmcGdhLWltYWdlLyR7IGZwZ2FJbWFnZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBob3N0LXJlc2VydmF0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBob3N0UmVzZXJ2YXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBob3N0UmVzZXJ2YXRpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uSG9zdFJlc2VydmF0aW9uKGhvc3RSZXNlcnZhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpob3N0LXJlc2VydmF0aW9uLyR7IGhvc3RSZXNlcnZhdGlvbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpbWFnZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9BTUlzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGltYWdlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW1hZ2VJZC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmSW1hZ2VJRCgpXG4gICAqIC0gLmlmSW1hZ2VUeXBlKClcbiAgICogLSAuaWZJc0xhdW5jaFRlbXBsYXRlUmVzb3VyY2UoKVxuICAgKiAtIC5pZkxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAuaWZPd25lcigpXG4gICAqIC0gLmlmUHVibGljKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZSb290RGV2aWNlVHlwZSgpXG4gICAqL1xuICBwdWJsaWMgb25JbWFnZShpbWFnZUlkOiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTo6aW1hZ2UvJHsgaW1hZ2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgaW1wb3J0LWltYWdlLXRhc2sgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdm0taW1wb3J0L2xhdGVzdC91c2VyZ3VpZGUvdm1pbXBvcnQtaW1hZ2UtaW1wb3J0Lmh0bWwjaW1wb3J0LXZtLWltYWdlXG4gICAqXG4gICAqIEBwYXJhbSBpbXBvcnRJbWFnZVRhc2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpbXBvcnRJbWFnZVRhc2tJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uSW1wb3J0SW1hZ2VUYXNrKGltcG9ydEltYWdlVGFza0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbXBvcnQtaW1hZ2UtdGFzay8keyBpbXBvcnRJbWFnZVRhc2tJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgaW1wb3J0LXNuYXBzaG90LXRhc2sgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdm0taW1wb3J0L2xhdGVzdC91c2VyZ3VpZGUvdm1pbXBvcnQtaW1wb3J0LXNuYXBzaG90Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGltcG9ydFNuYXBzaG90VGFza0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIGltcG9ydFNuYXBzaG90VGFza0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JbXBvcnRTbmFwc2hvdFRhc2soaW1wb3J0U25hcHNob3RUYXNrSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmltcG9ydC1zbmFwc2hvdC10YXNrLyR7IGltcG9ydFNuYXBzaG90VGFza0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpbnN0YW5jZS1jb25uZWN0LWVuZHBvaW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBpbnN0YW5jZUNvbm5lY3RFbmRwb2ludElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGluc3RhbmNlQ29ubmVjdEVuZHBvaW50SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmU3VibmV0SUQoKVxuICAgKi9cbiAgcHVibGljIG9uSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQoaW5zdGFuY2VDb25uZWN0RW5kcG9pbnRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aW5zdGFuY2UtY29ubmVjdC1lbmRwb2ludC8keyBpbnN0YW5jZUNvbm5lY3RFbmRwb2ludElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpbnN0YW5jZS1ldmVudC13aW5kb3cgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGluc3RhbmNlRXZlbnRXaW5kb3dJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpbnN0YW5jZUV2ZW50V2luZG93SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkluc3RhbmNlRXZlbnRXaW5kb3coaW5zdGFuY2VFdmVudFdpbmRvd0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbnN0YW5jZS1ldmVudC13aW5kb3cvJHsgaW5zdGFuY2VFdmVudFdpbmRvd0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpbnN0YW5jZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9JbnN0YW5jZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gaW5zdGFuY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpbnN0YW5jZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF2YWlsYWJpbGl0eVpvbmUoKVxuICAgKiAtIC5pZkNwdU9wdGlvbnNBbWRTZXZTbnAoKVxuICAgKiAtIC5pZkVic09wdGltaXplZCgpXG4gICAqIC0gLmlmSW5zdGFuY2VBdXRvUmVjb3ZlcnkoKVxuICAgKiAtIC5pZkluc3RhbmNlQmFuZHdpZHRoV2VpZ2h0aW5nKClcbiAgICogLSAuaWZJbnN0YW5jZUlEKClcbiAgICogLSAuaWZJbnN0YW5jZU1hcmtldFR5cGUoKVxuICAgKiAtIC5pZkluc3RhbmNlTWV0YWRhdGFUYWdzKClcbiAgICogLSAuaWZJbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC5pZkluc3RhbmNlVHlwZSgpXG4gICAqIC0gLmlmSXNMYXVuY2hUZW1wbGF0ZVJlc291cmNlKClcbiAgICogLSAuaWZMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLmlmTWFuYWdlZFJlc291cmNlT3BlcmF0b3IoKVxuICAgKiAtIC5pZk1ldGFkYXRhSHR0cEVuZHBvaW50KClcbiAgICogLSAuaWZNZXRhZGF0YUh0dHBQdXRSZXNwb25zZUhvcExpbWl0KClcbiAgICogLSAuaWZNZXRhZGF0YUh0dHBUb2tlbnMoKVxuICAgKiAtIC5pZk5ld0luc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLmlmUGxhY2VtZW50R3JvdXAoKVxuICAgKiAtIC5pZlByb2R1Y3RDb2RlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZSb290RGV2aWNlVHlwZSgpXG4gICAqIC0gLmlmVGVuYW5jeSgpXG4gICAqL1xuICBwdWJsaWMgb25JbnN0YW5jZShpbnN0YW5jZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbnN0YW5jZS8keyBpbnN0YW5jZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpbnRlcm5ldC1nYXRld2F5IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL1ZQQ19JbnRlcm5ldF9HYXRld2F5Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGludGVybmV0R2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGludGVybmV0R2F0ZXdheUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmSW50ZXJuZXRHYXRld2F5SUQoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uSW50ZXJuZXRHYXRld2F5KGludGVybmV0R2F0ZXdheUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppbnRlcm5ldC1nYXRld2F5LyR7IGludGVybmV0R2F0ZXdheUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpcGFtLWV4dGVybmFsLXJlc291cmNlLXZlcmlmaWNhdGlvbi10b2tlbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gaXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW5JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VuKGlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW5JZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmlwYW0tZXh0ZXJuYWwtcmVzb3VyY2UtdmVyaWZpY2F0aW9uLXRva2VuLyR7IGlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW5JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgaXBhbSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gaXBhbUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGlwYW1JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JcGFtKGlwYW1JZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmlwYW0vJHsgaXBhbUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpcGFtLXBvb2wgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGlwYW1Qb29sSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaXBhbVBvb2xJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JcGFtUG9vbChpcGFtUG9vbElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjo6JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aXBhbS1wb29sLyR7IGlwYW1Qb29sSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGlwYW0tcmVzb3VyY2UtZGlzY292ZXJ5LWFzc29jaWF0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBpcGFtUmVzb3VyY2VEaXNjb3ZlcnlBc3NvY2lhdGlvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGlwYW1SZXNvdXJjZURpc2NvdmVyeUFzc29jaWF0aW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JcGFtUmVzb3VyY2VEaXNjb3ZlcnlBc3NvY2lhdGlvbihpcGFtUmVzb3VyY2VEaXNjb3ZlcnlBc3NvY2lhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjo6JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnktYXNzb2NpYXRpb24vJHsgaXBhbVJlc291cmNlRGlzY292ZXJ5QXNzb2NpYXRpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgaXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnkgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGlwYW1SZXNvdXJjZURpc2NvdmVyeUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGlwYW1SZXNvdXJjZURpc2NvdmVyeUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uSXBhbVJlc291cmNlRGlzY292ZXJ5KGlwYW1SZXNvdXJjZURpc2NvdmVyeUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjo6JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06aXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnkvJHsgaXBhbVJlc291cmNlRGlzY292ZXJ5SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGlwYW0tc2NvcGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGlwYW1TY29wZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGlwYW1TY29wZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbklwYW1TY29wZShpcGFtU2NvcGVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmlwYW0tc2NvcGUvJHsgaXBhbVNjb3BlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNvaXAtcG9vbCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gaXB2NFBvb2xDb2lwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaXB2NFBvb2xDb2lwSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkNvaXBQb29sKGlwdjRQb29sQ29pcElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjb2lwLXBvb2wvJHsgaXB2NFBvb2xDb2lwSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGlwdjRwb29sLWVjMiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS91c2luZy1pbnN0YW5jZS1hZGRyZXNzaW5nLmh0bWwjaXAtYWRkcmVzc2luZy1laXBzXG4gICAqXG4gICAqIEBwYXJhbSBpcHY0UG9vbEVjMklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGlwdjRQb29sRWMySWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbklwdjRwb29sRWMyKGlwdjRQb29sRWMySWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmlwdjRwb29sLWVjMi8keyBpcHY0UG9vbEVjMklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBpcHY2cG9vbC1lYzIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvdXNpbmctaW5zdGFuY2UtYWRkcmVzc2luZy5odG1sI2lwdjYtYWRkcmVzc2luZ1xuICAgKlxuICAgKiBAcGFyYW0gaXB2NlBvb2xFYzJJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBpcHY2UG9vbEVjMklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25JcHY2cG9vbEVjMihpcHY2UG9vbEVjMklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTppcHY2cG9vbC1lYzIvJHsgaXB2NlBvb2xFYzJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUga2V5LXBhaXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWMyLWtleS1wYWlycy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBrZXlQYWlyTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBrZXlQYWlyTmFtZS5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZklzTGF1bmNoVGVtcGxhdGVSZXNvdXJjZSgpXG4gICAqIC0gLmlmS2V5UGFpck5hbWUoKVxuICAgKiAtIC5pZktleVBhaXJUeXBlKClcbiAgICogLSAuaWZMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25LZXlQYWlyKGtleVBhaXJOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTprZXktcGFpci8keyBrZXlQYWlyTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbGF1bmNoLXRlbXBsYXRlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2VjMi1sYXVuY2gtdGVtcGxhdGVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGxhdW5jaFRlbXBsYXRlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbGF1bmNoVGVtcGxhdGVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZJc0xhdW5jaFRlbXBsYXRlUmVzb3VyY2UoKVxuICAgKiAtIC5pZkxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAuaWZNYW5hZ2VkUmVzb3VyY2VPcGVyYXRvcigpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25MYXVuY2hUZW1wbGF0ZShsYXVuY2hUZW1wbGF0ZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpsYXVuY2gtdGVtcGxhdGUvJHsgbGF1bmNoVGVtcGxhdGVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbGljZW5zZS1jb25maWd1cmF0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xpY2Vuc2UtbWFuYWdlci9sYXRlc3QvdXNlcmd1aWRlL2NyZWF0ZS1saWNlbnNlLWNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gbGljZW5zZUNvbmZpZ3VyYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsaWNlbnNlQ29uZmlndXJhdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkxpY2Vuc2VDb25maWd1cmF0aW9uKGxpY2Vuc2VDb25maWd1cmF0aW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpsaWNlbnNlLW1hbmFnZXI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmxpY2Vuc2UtY29uZmlndXJhdGlvbjokeyBsaWNlbnNlQ29uZmlndXJhdGlvbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBsb2NhbC1nYXRld2F5IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL291dHBvc3RzL2xhdGVzdC91c2VyZ3VpZGUvb3V0cG9zdHMtbG9jYWwtZ2F0ZXdheXMuaHRtbCNsZ3dcbiAgICpcbiAgICogQHBhcmFtIGxvY2FsR2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGxvY2FsR2F0ZXdheUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Mb2NhbEdhdGV3YXkobG9jYWxHYXRld2F5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmxvY2FsLWdhdGV3YXkvJHsgbG9jYWxHYXRld2F5SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGxvY2FsLWdhdGV3YXktcm91dGUtdGFibGUtdmlydHVhbC1pbnRlcmZhY2UtZ3JvdXAtYXNzb2NpYXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb3V0cG9zdHMvbGF0ZXN0L3VzZXJndWlkZS9vdXRwb3N0cy1sb2NhbC1nYXRld2F5cy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBsb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uKGxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlLXZpcnR1YWwtaW50ZXJmYWNlLWdyb3VwLWFzc29jaWF0aW9uLyR7IGxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlLXZwYy1hc3NvY2lhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vdXRwb3N0cy9sYXRlc3QvdXNlcmd1aWRlL291dHBvc3RzLWxvY2FsLWdhdGV3YXlzLmh0bWwjdnBjLWFzc29jaWF0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0gbG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbihsb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb25JZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZS12cGMtYXNzb2NpYXRpb24vJHsgbG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGxvY2FsLWdhdGV3YXktcm91dGUtdGFibGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb3V0cG9zdHMvbGF0ZXN0L3VzZXJndWlkZS9vdXRwb3N0cy1sb2NhbC1nYXRld2F5cy5odG1sI3JvdXRlLXRhYmxlc1xuICAgKlxuICAgKiBAcGFyYW0gbG9jYWxHYXRld2F5Um91dGV0YWJsZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGxvY2FsR2F0ZXdheVJvdXRldGFibGVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTG9jYWxHYXRld2F5Um91dGVUYWJsZShsb2NhbEdhdGV3YXlSb3V0ZXRhYmxlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmxvY2FsLWdhdGV3YXktcm91dGUtdGFibGUvJHsgbG9jYWxHYXRld2F5Um91dGV0YWJsZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBsb2NhbC1nYXRld2F5LXZpcnR1YWwtaW50ZXJmYWNlLWdyb3VwIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL291dHBvc3RzL2xhdGVzdC91c2VyZ3VpZGUvb3V0cG9zdHMtbG9jYWwtZ2F0ZXdheXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gbG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cChsb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXBJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bG9jYWwtZ2F0ZXdheS12aXJ0dWFsLWludGVyZmFjZS1ncm91cC8keyBsb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXBJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbG9jYWwtZ2F0ZXdheS12aXJ0dWFsLWludGVyZmFjZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vdXRwb3N0cy9sYXRlc3QvdXNlcmd1aWRlL291dHBvc3RzLWxvY2FsLWdhdGV3YXlzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UobG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpsb2NhbC1nYXRld2F5LXZpcnR1YWwtaW50ZXJmYWNlLyR7IGxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbmF0Z2F0ZXdheSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtbmF0LWdhdGV3YXkuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gbmF0R2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIG5hdEdhdGV3YXlJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTmF0Z2F0ZXdheShuYXRHYXRld2F5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om5hdGdhdGV3YXkvJHsgbmF0R2F0ZXdheUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBuZXR3b3JrLWFjbCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtbmV0d29yay1hY2xzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG5hY2xJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBuYWNsSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZOZXR3b3JrQWNsSUQoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlZwYygpXG4gICAqL1xuICBwdWJsaWMgb25OZXR3b3JrQWNsKG5hY2xJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bmV0d29yay1hY2wvJHsgbmFjbElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBuZXR3b3JrLWluc2lnaHRzLWFjY2Vzcy1zY29wZS1hbmFseXNpcyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpc0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIG5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXNJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcyhuZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om5ldHdvcmstaW5zaWdodHMtYWNjZXNzLXNjb3BlLWFuYWx5c2lzLyR7IG5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXNJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbmV0d29yay1pbnNpZ2h0cy1hY2Nlc3Mtc2NvcGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIG5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGUobmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bmV0d29yay1pbnNpZ2h0cy1hY2Nlc3Mtc2NvcGUvJHsgbmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgbmV0d29yay1pbnNpZ2h0cy1hbmFseXNpcyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29ya0luc2lnaHRzQW5hbHlzaXNJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBuZXR3b3JrSW5zaWdodHNBbmFseXNpc0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25OZXR3b3JrSW5zaWdodHNBbmFseXNpcyhuZXR3b3JrSW5zaWdodHNBbmFseXNpc0lkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpuZXR3b3JrLWluc2lnaHRzLWFuYWx5c2lzLyR7IG5ldHdvcmtJbnNpZ2h0c0FuYWx5c2lzSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG5ldHdvcmstaW5zaWdodHMtcGF0aCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29ya0luc2lnaHRzUGF0aElkIC0gSWRlbnRpZmllciBmb3IgdGhlIG5ldHdvcmtJbnNpZ2h0c1BhdGhJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTmV0d29ya0luc2lnaHRzUGF0aChuZXR3b3JrSW5zaWdodHNQYXRoSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om5ldHdvcmstaW5zaWdodHMtcGF0aC8keyBuZXR3b3JrSW5zaWdodHNQYXRoSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG5ldHdvcmstaW50ZXJmYWNlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL3VzaW5nLWVuaS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBuZXR3b3JrSW50ZXJmYWNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbmV0d29ya0ludGVyZmFjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXNzb2NpYXRlUHVibGljSXBBZGRyZXNzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXV0aG9yaXplZFNlcnZpY2UoKVxuICAgKiAtIC5pZkF1dGhvcml6ZWRVc2VyKClcbiAgICogLSAuaWZBdmFpbGFiaWxpdHlab25lKClcbiAgICogLSAuaWZJc0xhdW5jaFRlbXBsYXRlUmVzb3VyY2UoKVxuICAgKiAtIC5pZkxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAuaWZNYW5hZ2VkUmVzb3VyY2VPcGVyYXRvcigpXG4gICAqIC0gLmlmTmV0d29ya0ludGVyZmFjZUlEKClcbiAgICogLSAuaWZQZXJtaXNzaW9uKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZTdWJuZXQoKVxuICAgKiAtIC5pZlZwYygpXG4gICAqL1xuICBwdWJsaWMgb25OZXR3b3JrSW50ZXJmYWNlKG5ldHdvcmtJbnRlcmZhY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bmV0d29yay1pbnRlcmZhY2UvJHsgbmV0d29ya0ludGVyZmFjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBvdXRwb3N0LWxhZyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBvdXRwb3N0TGFnSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgb3V0cG9zdExhZ0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25PdXRwb3N0TGFnKG91dHBvc3RMYWdJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06b3V0cG9zdC1sYWcvJHsgb3V0cG9zdExhZ0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBwbGFjZW1lbnQtZ3JvdXAgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvcGxhY2VtZW50LWdyb3Vwcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZW1lbnRHcm91cE5hbWUgLSBJZGVudGlmaWVyIGZvciB0aGUgcGxhY2VtZW50R3JvdXBOYW1lLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmSXNMYXVuY2hUZW1wbGF0ZVJlc291cmNlKClcbiAgICogLSAuaWZMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLmlmUGxhY2VtZW50R3JvdXBOYW1lKClcbiAgICogLSAuaWZQbGFjZW1lbnRHcm91cFN0cmF0ZWd5KClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblBsYWNlbWVudEdyb3VwKHBsYWNlbWVudEdyb3VwTmFtZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06cGxhY2VtZW50LWdyb3VwLyR7IHBsYWNlbWVudEdyb3VwTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcHJlZml4LWxpc3QgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvbWFuYWdlZC1wcmVmaXgtbGlzdHMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcHJlZml4TGlzdElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHByZWZpeExpc3RJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblByZWZpeExpc3QocHJlZml4TGlzdElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpwcmVmaXgtbGlzdC8keyBwcmVmaXhMaXN0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHJlcGxhY2Utcm9vdC12b2x1bWUtdGFzayB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9yZXBsYWNlLXJvb3QuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcmVwbGFjZVJvb3RWb2x1bWVUYXNrSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVwbGFjZVJvb3RWb2x1bWVUYXNrSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblJlcGxhY2VSb290Vm9sdW1lVGFzayhyZXBsYWNlUm9vdFZvbHVtZVRhc2tJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06cmVwbGFjZS1yb290LXZvbHVtZS10YXNrLyR7IHJlcGxhY2VSb290Vm9sdW1lVGFza0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSByZXNlcnZlZC1pbnN0YW5jZXMgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWMyLXJlc2VydmVkLWluc3RhbmNlcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlc2VydmF0aW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXZhaWxhYmlsaXR5Wm9uZSgpXG4gICAqIC0gLmlmSW5zdGFuY2VUeXBlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmdUeXBlKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVGVuYW5jeSgpXG4gICAqL1xuICBwdWJsaWMgb25SZXNlcnZlZEluc3RhbmNlcyhyZXNlcnZhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpyZXNlcnZlZC1pbnN0YW5jZXMvJHsgcmVzZXJ2YXRpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZ3JvdXAgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVJHL2xhdGVzdC91c2VyZ3VpZGUvcmVzb3VyY2UtZ3JvdXBzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGdyb3VwTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBncm91cE5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uR3JvdXAoZ3JvdXBOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cmVzb3VyY2UtZ3JvdXBzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpncm91cC8keyBncm91cE5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHJvbGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfcm9sZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcm9sZU5hbWVXaXRoUGF0aCAtIElkZW50aWZpZXIgZm9yIHRoZSByb2xlTmFtZVdpdGhQYXRoLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqL1xuICBwdWJsaWMgb25Sb2xlKHJvbGVOYW1lV2l0aFBhdGg6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06aWFtOjokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpyb2xlLyR7IHJvbGVOYW1lV2l0aFBhdGggfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHJvdXRlLXNlcnZlci1lbmRwb2ludCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9yb3V0ZS1zZXJ2ZXItdGVybXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcm91dGVTZXJ2ZXJFbmRwb2ludElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJvdXRlU2VydmVyRW5kcG9pbnRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF2YWlsYWJpbGl0eVpvbmUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUm91dGVTZXJ2ZXJFbmRwb2ludChyb3V0ZVNlcnZlckVuZHBvaW50SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnJvdXRlLXNlcnZlci1lbmRwb2ludC8keyByb3V0ZVNlcnZlckVuZHBvaW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHJvdXRlLXNlcnZlciB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9yb3V0ZS1zZXJ2ZXItdGVybXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcm91dGVTZXJ2ZXJJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByb3V0ZVNlcnZlcklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Sb3V0ZVNlcnZlcihyb3V0ZVNlcnZlcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpyb3V0ZS1zZXJ2ZXIvJHsgcm91dGVTZXJ2ZXJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcm91dGUtc2VydmVyLXBlZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvcm91dGUtc2VydmVyLXRlcm1zLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHJvdXRlU2VydmVyUGVlcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJvdXRlU2VydmVyUGVlcklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXZhaWxhYmlsaXR5Wm9uZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Sb3V0ZVNlcnZlclBlZXIocm91dGVTZXJ2ZXJQZWVySWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnJvdXRlLXNlcnZlci1wZWVyLyR7IHJvdXRlU2VydmVyUGVlcklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSByb3V0ZS10YWJsZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9WUENfUm91dGVfVGFibGVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHJvdXRlVGFibGVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByb3V0ZVRhYmxlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZSb3V0ZVRhYmxlSUQoKVxuICAgKiAtIC5pZlZwYygpXG4gICAqL1xuICBwdWJsaWMgb25Sb3V0ZVRhYmxlKHJvdXRlVGFibGVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06cm91dGUtdGFibGUvJHsgcm91dGVUYWJsZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBzZWN1cml0eS1ncm91cCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9lYzItc2VjdXJpdHktZ3JvdXBzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHNlY3VyaXR5R3JvdXBJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eUdyb3VwSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmSXNMYXVuY2hUZW1wbGF0ZVJlc291cmNlKClcbiAgICogLSAuaWZMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmU2VjdXJpdHlHcm91cElEKClcbiAgICogLSAuaWZWcGMoKVxuICAgKi9cbiAgcHVibGljIG9uU2VjdXJpdHlHcm91cChzZWN1cml0eUdyb3VwSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnNlY3VyaXR5LWdyb3VwLyR7IHNlY3VyaXR5R3JvdXBJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc2VjdXJpdHktZ3JvdXAtcnVsZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gc2VjdXJpdHlHcm91cFJ1bGVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eUdyb3VwUnVsZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25TZWN1cml0eUdyb3VwUnVsZShzZWN1cml0eUdyb3VwUnVsZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpzZWN1cml0eS1ncm91cC1ydWxlLyR7IHNlY3VyaXR5R3JvdXBSdWxlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHNuYXBzaG90IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vicy9sYXRlc3QvdXNlcmd1aWRlL2Vicy1zbmFwc2hvdHMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gc25hcHNob3RJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzbmFwc2hvdElkLlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkFkZEdyb3VwKClcbiAgICogLSAuaWZBZGRVc2VySWQoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdmFpbGFiaWxpdHlab25lKClcbiAgICogLSAuaWZFbmNyeXB0ZWQoKVxuICAgKiAtIC5pZklzTGF1bmNoVGVtcGxhdGVSZXNvdXJjZSgpXG4gICAqIC0gLmlmTGF1bmNoVGVtcGxhdGUoKVxuICAgKiAtIC5pZkxvY2F0aW9uKClcbiAgICogLSAuaWZPdXRwb3N0QXJuKClcbiAgICogLSAuaWZPd25lcigpXG4gICAqIC0gLmlmUGFyZW50U25hcHNob3QoKVxuICAgKiAtIC5pZlBhcmVudFZvbHVtZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZW1vdmVHcm91cCgpXG4gICAqIC0gLmlmUmVtb3ZlVXNlcklkKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmU25hcHNob3RDb29sT2ZmUGVyaW9kKClcbiAgICogLSAuaWZTbmFwc2hvdElEKClcbiAgICogLSAuaWZTbmFwc2hvdExvY2tEdXJhdGlvbigpXG4gICAqIC0gLmlmU25hcHNob3RUaW1lKClcbiAgICogLSAuaWZTb3VyY2VBdmFpbGFiaWxpdHlab25lKClcbiAgICogLSAuaWZTb3VyY2VPdXRwb3N0QXJuKClcbiAgICogLSAuaWZWb2x1bWVTaXplKClcbiAgICovXG4gIHB1YmxpYyBvblNuYXBzaG90KHNuYXBzaG90SWQ6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OjpzbmFwc2hvdC8keyBzbmFwc2hvdElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBzcG90LWZsZWV0LXJlcXVlc3QgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHNwb3RGbGVldFJlcXVlc3RJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzcG90RmxlZXRSZXF1ZXN0SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25TcG90RmxlZXRSZXF1ZXN0KHNwb3RGbGVldFJlcXVlc3RJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06c3BvdC1mbGVldC1yZXF1ZXN0LyR7IHNwb3RGbGVldFJlcXVlc3RJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc3BvdC1pbnN0YW5jZXMtcmVxdWVzdCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS91c2luZy1zcG90LWluc3RhbmNlcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBzcG90SW5zdGFuY2VSZXF1ZXN0SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgc3BvdEluc3RhbmNlUmVxdWVzdElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25TcG90SW5zdGFuY2VzUmVxdWVzdChzcG90SW5zdGFuY2VSZXF1ZXN0SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnNwb3QtaW5zdGFuY2VzLXJlcXVlc3QvJHsgc3BvdEluc3RhbmNlUmVxdWVzdElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBzdWJuZXQtY2lkci1yZXNlcnZhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9zdWJuZXQtY2lkci1yZXNlcnZhdGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBzdWJuZXRDaWRyUmVzZXJ2YXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzdWJuZXRDaWRyUmVzZXJ2YXRpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uU3VibmV0Q2lkclJlc2VydmF0aW9uKHN1Ym5ldENpZHJSZXNlcnZhdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpzdWJuZXQtY2lkci1yZXNlcnZhdGlvbi8keyBzdWJuZXRDaWRyUmVzZXJ2YXRpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgc3VibmV0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL1ZQQ19TdWJuZXRzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHN1Ym5ldElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHN1Ym5ldElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF2YWlsYWJpbGl0eVpvbmUoKVxuICAgKiAtIC5pZklzTGF1bmNoVGVtcGxhdGVSZXNvdXJjZSgpXG4gICAqIC0gLmlmTGF1bmNoVGVtcGxhdGUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlN1Ym5ldElEKClcbiAgICogLSAuaWZWcGMoKVxuICAgKi9cbiAgcHVibGljIG9uU3VibmV0KHN1Ym5ldElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpzdWJuZXQvJHsgc3VibmV0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHRyYWZmaWMtbWlycm9yLWZpbHRlciB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L21pcnJvcmluZy90cmFmZmljLW1pcnJvcmluZy1maWx0ZXIuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gdHJhZmZpY01pcnJvckZpbHRlcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHRyYWZmaWNNaXJyb3JGaWx0ZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblRyYWZmaWNNaXJyb3JGaWx0ZXIodHJhZmZpY01pcnJvckZpbHRlcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp0cmFmZmljLW1pcnJvci1maWx0ZXIvJHsgdHJhZmZpY01pcnJvckZpbHRlcklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0cmFmZmljLW1pcnJvci1maWx0ZXItcnVsZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L21pcnJvcmluZy90cmFmZmljLW1pcnJvcmluZy1maWx0ZXIuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gdHJhZmZpY01pcnJvckZpbHRlclJ1bGVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB0cmFmZmljTWlycm9yRmlsdGVyUnVsZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVHJhZmZpY01pcnJvckZpbHRlclJ1bGUodHJhZmZpY01pcnJvckZpbHRlclJ1bGVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dHJhZmZpYy1taXJyb3ItZmlsdGVyLXJ1bGUvJHsgdHJhZmZpY01pcnJvckZpbHRlclJ1bGVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdHJhZmZpYy1taXJyb3Itc2Vzc2lvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L21pcnJvcmluZy90cmFmZmljLW1pcnJvcmluZy1zZXNzaW9uLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHRyYWZmaWNNaXJyb3JTZXNzaW9uSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdHJhZmZpY01pcnJvclNlc3Npb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblRyYWZmaWNNaXJyb3JTZXNzaW9uKHRyYWZmaWNNaXJyb3JTZXNzaW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnRyYWZmaWMtbWlycm9yLXNlc3Npb24vJHsgdHJhZmZpY01pcnJvclNlc3Npb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdHJhZmZpYy1taXJyb3ItdGFyZ2V0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvbWlycm9yaW5nL3RyYWZmaWMtbWlycm9yaW5nLXRhcmdldC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB0cmFmZmljTWlycm9yVGFyZ2V0SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdHJhZmZpY01pcnJvclRhcmdldElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25UcmFmZmljTWlycm9yVGFyZ2V0KHRyYWZmaWNNaXJyb3JUYXJnZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dHJhZmZpYy1taXJyb3ItdGFyZ2V0LyR7IHRyYWZmaWNNaXJyb3JUYXJnZXRJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdHJhbnNpdC1nYXRld2F5LWF0dGFjaG1lbnQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC90Z3cvaG93LXRyYW5zaXQtZ2F0ZXdheXMtd29yay5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZUcmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRJZCgpXG4gICAqL1xuICBwdWJsaWMgb25UcmFuc2l0R2F0ZXdheUF0dGFjaG1lbnQodHJhbnNpdEdhdGV3YXlBdHRhY2htZW50SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnRyYW5zaXQtZ2F0ZXdheS1hdHRhY2htZW50LyR7IHRyYW5zaXRHYXRld2F5QXR0YWNobWVudElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0cmFuc2l0LWdhdGV3YXktY29ubmVjdC1wZWVyIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVySWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcklkKClcbiAgICovXG4gIHB1YmxpYyBvblRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIodHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp0cmFuc2l0LWdhdGV3YXktY29ubmVjdC1wZWVyLyR7IHRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdHJhbnNpdC1nYXRld2F5IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdGd3L2hvdy10cmFuc2l0LWdhdGV3YXlzLXdvcmsuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNpdEdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2l0R2F0ZXdheUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlRyYW5zaXRHYXRld2F5SWQoKVxuICAgKi9cbiAgcHVibGljIG9uVHJhbnNpdEdhdGV3YXkodHJhbnNpdEdhdGV3YXlJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dHJhbnNpdC1nYXRld2F5LyR7IHRyYW5zaXRHYXRld2F5SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHRyYW5zaXQtZ2F0ZXdheS1tdWx0aWNhc3QtZG9tYWluIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdGd3L3Rndy1tdWx0aWNhc3Qtb3ZlcnZpZXcuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5JZCAtIElkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5JZCgpXG4gICAqL1xuICBwdWJsaWMgb25UcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbih0cmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp0cmFuc2l0LWdhdGV3YXktbXVsdGljYXN0LWRvbWFpbi8keyB0cmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0cmFuc2l0LWdhdGV3YXktcG9saWN5LXRhYmxlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUlkKClcbiAgICovXG4gIHB1YmxpYyBvblRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUodHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp0cmFuc2l0LWdhdGV3YXktcG9saWN5LXRhYmxlLyR7IHRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlLWFubm91bmNlbWVudCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnRJZCgpXG4gICAqL1xuICBwdWJsaWMgb25UcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnQodHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZS1hbm5vdW5jZW1lbnQvJHsgdHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3Rndy9ob3ctdHJhbnNpdC1nYXRld2F5cy13b3JrLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUlkKClcbiAgICovXG4gIHB1YmxpYyBvblRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSh0cmFuc2l0R2F0ZXdheVJvdXRlVGFibGVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlLyR7IHRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHZlcmlmaWVkQWNjZXNzRW5kcG9pbnRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB2ZXJpZmllZEFjY2Vzc0VuZHBvaW50SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblZlcmlmaWVkQWNjZXNzRW5kcG9pbnQodmVyaWZpZWRBY2Nlc3NFbmRwb2ludElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnQvJHsgdmVyaWZpZWRBY2Nlc3NFbmRwb2ludElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnQtdGFyZ2V0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI0VDMl9BUk5fRm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB2ZXJpZmllZEFjY2Vzc0VuZHBvaW50VGFyZ2V0SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdmVyaWZpZWRBY2Nlc3NFbmRwb2ludFRhcmdldElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25WZXJpZmllZEFjY2Vzc0VuZHBvaW50VGFyZ2V0KHZlcmlmaWVkQWNjZXNzRW5kcG9pbnRUYXJnZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dmVyaWZpZWQtYWNjZXNzLWVuZHBvaW50LXRhcmdldC8keyB2ZXJpZmllZEFjY2Vzc0VuZHBvaW50VGFyZ2V0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZlcmlmaWVkLWFjY2Vzcy1ncm91cCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gdmVyaWZpZWRBY2Nlc3NHcm91cElkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZlcmlmaWVkQWNjZXNzR3JvdXBJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVmVyaWZpZWRBY2Nlc3NHcm91cCh2ZXJpZmllZEFjY2Vzc0dyb3VwSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZlcmlmaWVkLWFjY2Vzcy1ncm91cC8keyB2ZXJpZmllZEFjY2Vzc0dyb3VwSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZlcmlmaWVkLWFjY2Vzcy1pbnN0YW5jZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNFQzJfQVJOX0Zvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gdmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZlcmlmaWVkQWNjZXNzSW5zdGFuY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZSh2ZXJpZmllZEFjY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZlcmlmaWVkLWFjY2Vzcy1pbnN0YW5jZS8keyB2ZXJpZmllZEFjY2Vzc0luc3RhbmNlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZlcmlmaWVkLWFjY2Vzcy1wb2xpY3kgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHZlcmlmaWVkQWNjZXNzUG9saWN5SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdmVyaWZpZWRBY2Nlc3NQb2xpY3lJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVmVyaWZpZWRBY2Nlc3NQb2xpY3kodmVyaWZpZWRBY2Nlc3NQb2xpY3lJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dmVyaWZpZWQtYWNjZXNzLXBvbGljeS8keyB2ZXJpZmllZEFjY2Vzc1BvbGljeUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2ZXJpZmllZC1hY2Nlc3MtdHJ1c3QtcHJvdmlkZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjRUMyX0FSTl9Gb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25WZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIodmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVySWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZlcmlmaWVkLWFjY2Vzcy10cnVzdC1wcm92aWRlci8keyB2ZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdm9sdW1lIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vicy9sYXRlc3QvdXNlcmd1aWRlL2Vicy12b2x1bWVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZvbHVtZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZvbHVtZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF2YWlsYWJpbGl0eVpvbmUoKVxuICAgKiAtIC5pZkVuY3J5cHRlZCgpXG4gICAqIC0gLmlmSXNMYXVuY2hUZW1wbGF0ZVJlc291cmNlKClcbiAgICogLSAuaWZLbXNLZXlJZCgpXG4gICAqIC0gLmlmTGF1bmNoVGVtcGxhdGUoKVxuICAgKiAtIC5pZk1hbmFnZWRSZXNvdXJjZU9wZXJhdG9yKClcbiAgICogLSAuaWZQYXJlbnRTbmFwc2hvdCgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVm9sdW1lSUQoKVxuICAgKiAtIC5pZlZvbHVtZUlvcHMoKVxuICAgKiAtIC5pZlZvbHVtZVNpemUoKVxuICAgKiAtIC5pZlZvbHVtZVRocm91Z2hwdXQoKVxuICAgKiAtIC5pZlZvbHVtZVR5cGUoKVxuICAgKi9cbiAgcHVibGljIG9uVm9sdW1lKHZvbHVtZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp2b2x1bWUvJHsgdm9sdW1lSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZwYy1ibG9jay1wdWJsaWMtYWNjZXNzLWV4Y2x1c2lvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtYmxvY2stcHVibGljLWFjY2Vzcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB2cGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKHZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZwYy1ibG9jay1wdWJsaWMtYWNjZXNzLWV4Y2x1c2lvbi8keyB2cGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2cGMtZW5kcG9pbnQtY29ubmVjdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9lbmRwb2ludC1zZXJ2aWNlcy1vdmVydmlldy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB2cGNFbmRwb2ludENvbm5lY3Rpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSB2cGNFbmRwb2ludENvbm5lY3Rpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVnBjRW5kcG9pbnRDb25uZWN0aW9uKHZwY0VuZHBvaW50Q29ubmVjdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp2cGMtZW5kcG9pbnQtY29ubmVjdGlvbi8keyB2cGNFbmRwb2ludENvbm5lY3Rpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdnBjLWVuZHBvaW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL2VuZHBvaW50LXNlcnZpY2VzLW92ZXJ2aWV3Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZwY0VuZHBvaW50SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdnBjRW5kcG9pbnRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZSZWdpb24oKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZWcGNlU2VydmljZU5hbWUoKVxuICAgKiAtIC5pZlZwY2VTZXJ2aWNlT3duZXIoKVxuICAgKi9cbiAgcHVibGljIG9uVnBjRW5kcG9pbnQodnBjRW5kcG9pbnRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dnBjLWVuZHBvaW50LyR7IHZwY0VuZHBvaW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZwYy1lbmRwb2ludC1zZXJ2aWNlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL2VuZHBvaW50LXNlcnZpY2VzLW92ZXJ2aWV3Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZwY0VuZHBvaW50U2VydmljZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZwY0VuZHBvaW50U2VydmljZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlZwY2VTZXJ2aWNlUHJpdmF0ZURuc05hbWUoKVxuICAgKiAtIC5pZlZwY2VNdWx0aVJlZ2lvbigpXG4gICAqIC0gLmlmVnBjZVNlcnZpY2VSZWdpb24oKVxuICAgKiAtIC5pZlZwY2VTdXBwb3J0ZWRSZWdpb24oKVxuICAgKi9cbiAgcHVibGljIG9uVnBjRW5kcG9pbnRTZXJ2aWNlKHZwY0VuZHBvaW50U2VydmljZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp2cGMtZW5kcG9pbnQtc2VydmljZS8keyB2cGNFbmRwb2ludFNlcnZpY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdnBjLWVuZHBvaW50LXNlcnZpY2UtcGVybWlzc2lvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3ByaXZhdGVsaW5rL3ZwYy1lbmRwb2ludHMtYWNjZXNzLmh0bWwjdnBjLWVuZHBvaW50LXBvbGljaWVzXG4gICAqXG4gICAqIEBwYXJhbSB2cGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9uSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25WcGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9uKHZwY0VuZHBvaW50U2VydmljZVBlcm1pc3Npb25JZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dnBjLWVuZHBvaW50LXNlcnZpY2UtcGVybWlzc2lvbi8keyB2cGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZwYy1mbG93LWxvZyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9mbG93LWxvZ3MuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gdnBjRmxvd0xvZ0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZwY0Zsb3dMb2dJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVnBjRmxvd0xvZyh2cGNGbG93TG9nSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZwYy1mbG93LWxvZy8keyB2cGNGbG93TG9nSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZwYyB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9WUENfU3VibmV0cy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB2cGNJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB2cGNJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXR0cmlidXRlKClcbiAgICogLSAuaWZJcHY0SXBhbVBvb2xJZCgpXG4gICAqIC0gLmlmSXB2NklwYW1Qb29sSWQoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlRlbmFuY3koKVxuICAgKiAtIC5pZlZwY0lEKClcbiAgICovXG4gIHB1YmxpYyBvblZwYyh2cGNJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmVjMjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06dnBjLyR7IHZwY0lkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2cGMtcGVlcmluZy1jb25uZWN0aW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvcGVlcmluZy93aGF0LWlzLXZwYy1wZWVyaW5nLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZwY1BlZXJpbmdDb25uZWN0aW9uSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgdnBjUGVlcmluZ0Nvbm5lY3Rpb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZkFjY2VwdGVyVnBjKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZXF1ZXN0ZXJWcGMoKVxuICAgKiAtIC5pZlJlc291cmNlVGFnKClcbiAgICogLSAuaWZWcGNQZWVyaW5nQ29ubmVjdGlvbklEKClcbiAgICovXG4gIHB1YmxpYyBvblZwY1BlZXJpbmdDb25uZWN0aW9uKHZwY1BlZXJpbmdDb25uZWN0aW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZwYy1wZWVyaW5nLWNvbm5lY3Rpb24vJHsgdnBjUGVlcmluZ0Nvbm5lY3Rpb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdnBuLWNvbm5lY3Rpb24tZGV2aWNlLXR5cGUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBuL2xhdGVzdC9zMnN2cG4vVlBDX1ZQTi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB2cG5Db25uZWN0aW9uRGV2aWNlVHlwZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZwbkNvbm5lY3Rpb25EZXZpY2VUeXBlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqL1xuICBwdWJsaWMgb25WcG5Db25uZWN0aW9uRGV2aWNlVHlwZSh2cG5Db25uZWN0aW9uRGV2aWNlVHlwZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp2cG4tY29ubmVjdGlvbi1kZXZpY2UtdHlwZS8keyB2cG5Db25uZWN0aW9uRGV2aWNlVHlwZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2cG4tY29ubmVjdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cG4vbGF0ZXN0L3Myc3Zwbi9WUENfVlBOLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHZwbkNvbm5lY3Rpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSB2cG5Db25uZWN0aW9uSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBdHRyaWJ1dGUoKVxuICAgKiAtIC5pZkF0dHJpYnV0ZSgpXG4gICAqIC0gLmlmQXV0aGVudGljYXRpb25UeXBlKClcbiAgICogLSAuaWZEUERUaW1lb3V0U2Vjb25kcygpXG4gICAqIC0gLmlmR2F0ZXdheVR5cGUoKVxuICAgKiAtIC5pZklLRVZlcnNpb25zKClcbiAgICogLSAuaWZJbnNpZGVUdW5uZWxDaWRyKClcbiAgICogLSAuaWZJbnNpZGVUdW5uZWxJcHY2Q2lkcigpXG4gICAqIC0gLmlmUGhhc2UxREhHcm91cCgpXG4gICAqIC0gLmlmUGhhc2UxRW5jcnlwdGlvbkFsZ29yaXRobXMoKVxuICAgKiAtIC5pZlBoYXNlMUludGVncml0eUFsZ29yaXRobXMoKVxuICAgKiAtIC5pZlBoYXNlMUxpZmV0aW1lU2Vjb25kcygpXG4gICAqIC0gLmlmUGhhc2UyREhHcm91cCgpXG4gICAqIC0gLmlmUGhhc2UyRW5jcnlwdGlvbkFsZ29yaXRobXMoKVxuICAgKiAtIC5pZlBoYXNlMkludGVncml0eUFsZ29yaXRobXMoKVxuICAgKiAtIC5pZlBoYXNlMkxpZmV0aW1lU2Vjb25kcygpXG4gICAqIC0gLmlmUmVnaW9uKClcbiAgICogLSAuaWZSZWtleUZ1enpQZXJjZW50YWdlKClcbiAgICogLSAuaWZSZWtleU1hcmdpblRpbWVTZWNvbmRzKClcbiAgICogLSAuaWZSZXBsYXlXaW5kb3dTaXplUGFja2V0cygpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZlJvdXRpbmdUeXBlKClcbiAgICovXG4gIHB1YmxpYyBvblZwbkNvbm5lY3Rpb24odnBuQ29ubmVjdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZWMyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp2cG4tY29ubmVjdGlvbi8keyB2cG5Db25uZWN0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHZwbi1nYXRld2F5IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL1ZQQ19WUE4uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gdnBuR2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHZwbkdhdGV3YXlJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKiAtIC5pZlJlZ2lvbigpXG4gICAqIC0gLmlmUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVnBuR2F0ZXdheSh2cG5HYXRld2F5SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTplYzI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnZwbi1nYXRld2F5LyR7IHZwbkdhdGV3YXlJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvc3VwcG9ydGVkLWlhbS1hY3Rpb25zLXRhZ2dpbmcuaHRtbCNjb250cm9sLXRhZ2dpbmdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdEFkZHJlc3NUcmFuc2ZlcigpXG4gICAqIC0gLnRvQWxsb2NhdGVBZGRyZXNzKClcbiAgICogLSAudG9BbGxvY2F0ZUhvc3RzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJcGFtUmVzb3VyY2VEaXNjb3ZlcnkoKVxuICAgKiAtIC50b0F1dGhvcml6ZVNlY3VyaXR5R3JvdXBFZ3Jlc3MoKVxuICAgKiAtIC50b0F1dGhvcml6ZVNlY3VyaXR5R3JvdXBJbmdyZXNzKClcbiAgICogLSAudG9Db3B5SW1hZ2UoKVxuICAgKiAtIC50b0NvcHlTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0KClcbiAgICogLSAudG9DcmVhdGVDYXJyaWVyR2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZUNvaXBQb29sKClcbiAgICogLSAudG9DcmVhdGVDdXN0b21lckdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZURoY3BPcHRpb25zKClcbiAgICogLSAudG9DcmVhdGVFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0NyZWF0ZUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlQ29ubmVjdEVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV2ZW50V2luZG93KClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbSgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbigpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbVBvb2woKVxuICAgKiAtIC50b0NyZWF0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbVNjb3BlKClcbiAgICogLSAudG9DcmVhdGVLZXlQYWlyKClcbiAgICogLSAudG9DcmVhdGVMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UoKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlTWFuYWdlZFByZWZpeExpc3QoKVxuICAgKiAtIC50b0NyZWF0ZU5hdEdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtBY2woKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9DcmVhdGVQbGFjZW1lbnRHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlUHVibGljSXB2NFBvb2woKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlUmVzdG9yZUltYWdlVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlU2VydmVyUGVlcigpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlU3VibmV0KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhZmZpY01pcnJvclNlc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheUNvbm5lY3QoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0dyb3VwKClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlKClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b0NyZWF0ZVZvbHVtZSgpXG4gICAqIC0gLnRvQ3JlYXRlVnBjKClcbiAgICogLSAudG9DcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9DcmVhdGVWcG5HYXRld2F5KClcbiAgICogLSAudG9EZWxldGVUYWdzKClcbiAgICogLSAudG9FeHBvcnRJbWFnZSgpXG4gICAqIC0gLnRvSW1wb3J0SW1hZ2UoKVxuICAgKiAtIC50b0ltcG9ydEtleVBhaXIoKVxuICAgKiAtIC50b0ltcG9ydFNuYXBzaG90KClcbiAgICogLSAudG9QdXJjaGFzZUNhcGFjaXR5QmxvY2soKVxuICAgKiAtIC50b1JlZ2lzdGVySW1hZ2UoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0YXJ0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcygpXG4gICAqIC0gLnRvU3RhcnROZXR3b3JrSW5zaWdodHNBbmFseXNpcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZWxhc3RpYy1pcFxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uLWZsZWV0XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICogLSBjYXJyaWVyLWdhdGV3YXlcbiAgICogLSBjbGllbnQtdnBuLWVuZHBvaW50XG4gICAqIC0gY3VzdG9tZXItZ2F0ZXdheVxuICAgKiAtIGRlY2xhcmF0aXZlLXBvbGljaWVzLXJlcG9ydFxuICAgKiAtIGRlZGljYXRlZC1ob3N0XG4gICAqIC0gZGhjcC1vcHRpb25zXG4gICAqIC0gZWdyZXNzLW9ubHktaW50ZXJuZXQtZ2F0ZXdheVxuICAgKiAtIGVsYXN0aWMtZ3B1XG4gICAqIC0gZXhwb3J0LWltYWdlLXRhc2tcbiAgICogLSBleHBvcnQtaW5zdGFuY2UtdGFza1xuICAgKiAtIGZsZWV0XG4gICAqIC0gZnBnYS1pbWFnZVxuICAgKiAtIGhvc3QtcmVzZXJ2YXRpb25cbiAgICogLSBpbWFnZVxuICAgKiAtIGltcG9ydC1pbWFnZS10YXNrXG4gICAqIC0gaW1wb3J0LXNuYXBzaG90LXRhc2tcbiAgICogLSBpbnN0YW5jZS1jb25uZWN0LWVuZHBvaW50XG4gICAqIC0gaW5zdGFuY2UtZXZlbnQtd2luZG93XG4gICAqIC0gaW5zdGFuY2VcbiAgICogLSBpbnRlcm5ldC1nYXRld2F5XG4gICAqIC0gaXBhbS1leHRlcm5hbC1yZXNvdXJjZS12ZXJpZmljYXRpb24tdG9rZW5cbiAgICogLSBpcGFtXG4gICAqIC0gaXBhbS1wb29sXG4gICAqIC0gaXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnktYXNzb2NpYXRpb25cbiAgICogLSBpcGFtLXJlc291cmNlLWRpc2NvdmVyeVxuICAgKiAtIGlwYW0tc2NvcGVcbiAgICogLSBjb2lwLXBvb2xcbiAgICogLSBpcHY0cG9vbC1lYzJcbiAgICogLSBpcHY2cG9vbC1lYzJcbiAgICogLSBrZXktcGFpclxuICAgKiAtIGxhdW5jaC10ZW1wbGF0ZVxuICAgKiAtIGxvY2FsLWdhdGV3YXlcbiAgICogLSBsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlLXZpcnR1YWwtaW50ZXJmYWNlLWdyb3VwLWFzc29jaWF0aW9uXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZS12cGMtYXNzb2NpYXRpb25cbiAgICogLSBsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS12aXJ0dWFsLWludGVyZmFjZS1ncm91cFxuICAgKiAtIGxvY2FsLWdhdGV3YXktdmlydHVhbC1pbnRlcmZhY2VcbiAgICogLSBuYXRnYXRld2F5XG4gICAqIC0gbmV0d29yay1hY2xcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLWFjY2Vzcy1zY29wZS1hbmFseXNpc1xuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtYWNjZXNzLXNjb3BlXG4gICAqIC0gbmV0d29yay1pbnNpZ2h0cy1hbmFseXNpc1xuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtcGF0aFxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqIC0gb3V0cG9zdC1sYWdcbiAgICogLSBwbGFjZW1lbnQtZ3JvdXBcbiAgICogLSBwcmVmaXgtbGlzdFxuICAgKiAtIHJlcGxhY2Utcm9vdC12b2x1bWUtdGFza1xuICAgKiAtIHJlc2VydmVkLWluc3RhbmNlc1xuICAgKiAtIHJvdXRlLXNlcnZlci1lbmRwb2ludFxuICAgKiAtIHJvdXRlLXNlcnZlclxuICAgKiAtIHJvdXRlLXNlcnZlci1wZWVyXG4gICAqIC0gcm91dGUtdGFibGVcbiAgICogLSBzZWN1cml0eS1ncm91cFxuICAgKiAtIHNlY3VyaXR5LWdyb3VwLXJ1bGVcbiAgICogLSBzbmFwc2hvdFxuICAgKiAtIHNwb3QtZmxlZXQtcmVxdWVzdFxuICAgKiAtIHNwb3QtaW5zdGFuY2VzLXJlcXVlc3RcbiAgICogLSBzdWJuZXQtY2lkci1yZXNlcnZhdGlvblxuICAgKiAtIHN1Ym5ldFxuICAgKiAtIHRyYWZmaWMtbWlycm9yLWZpbHRlclxuICAgKiAtIHRyYWZmaWMtbWlycm9yLWZpbHRlci1ydWxlXG4gICAqIC0gdHJhZmZpYy1taXJyb3Itc2Vzc2lvblxuICAgKiAtIHRyYWZmaWMtbWlycm9yLXRhcmdldFxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1hdHRhY2htZW50XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LWNvbm5lY3QtcGVlclxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheVxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1tdWx0aWNhc3QtZG9tYWluXG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXBvbGljeS10YWJsZVxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZS1hbm5vdW5jZW1lbnRcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktcm91dGUtdGFibGVcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnRcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnQtdGFyZ2V0XG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWdyb3VwXG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWluc3RhbmNlXG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLXBvbGljeVxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy10cnVzdC1wcm92aWRlclxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHZwYy1ibG9jay1wdWJsaWMtYWNjZXNzLWV4Y2x1c2lvblxuICAgKiAtIHZwYy1lbmRwb2ludC1jb25uZWN0aW9uXG4gICAqIC0gdnBjLWVuZHBvaW50XG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2VcbiAgICogLSB2cGMtZW5kcG9pbnQtc2VydmljZS1wZXJtaXNzaW9uXG4gICAqIC0gdnBjLWZsb3ctbG9nXG4gICAqIC0gdnBjXG4gICAqIC0gdnBjLXBlZXJpbmctY29ubmVjdGlvblxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqIC0gdnBuLWdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGEgdGFnIGtleSBhbmQgdmFsdWUgcGFpciBvZiBhIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9jb250cm9sLWFjY2Vzcy13aXRoLXRhZ3MuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0FjY2VwdFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9BY2NlcHRUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9BY2NlcHRUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0FjY2VwdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0FjY2VwdFZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9BbGxvY2F0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0FsbG9jYXRlSXBhbVBvb2xDaWRyKClcbiAgICogLSAudG9BcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9Bc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b0Fzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlRGhjcE9wdGlvbnMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9Bc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlVnBjQ2lkckJsb2NrKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXR0YWNoSW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvQXR0YWNoVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvQXV0aG9yaXplQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEVncmVzcygpXG4gICAqIC0gLnRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEluZ3Jlc3MoKVxuICAgKiAtIC50b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMoKVxuICAgKiAtIC50b0NhbmNlbERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQoKVxuICAgKiAtIC50b0NhbmNlbEV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NhbmNlbEltYWdlTGF1bmNoUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ2FuY2VsSW1wb3J0VGFzaygpXG4gICAqIC0gLnRvQ2FuY2VsU3BvdEZsZWV0UmVxdWVzdHMoKVxuICAgKiAtIC50b0NhbmNlbFNwb3RJbnN0YW5jZVJlcXVlc3RzKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcoKVxuICAgKiAtIC50b0NyZWF0ZUNhcnJpZXJHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0NyZWF0ZUNvaXBDaWRyKClcbiAgICogLSAudG9DcmVhdGVDb2lwUG9vbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29pcFBvb2xQZXJtaXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrKClcbiAgICogLSAudG9DcmVhdGVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VuKClcbiAgICogLSAudG9DcmVhdGVJcGFtUG9vbCgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbVNjb3BlKClcbiAgICogLSAudG9DcmVhdGVMYXVuY2hUZW1wbGF0ZVZlcnNpb24oKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UoKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlTmF0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0FjbCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0FjbEVudHJ5KClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVTZXJ2ZXJFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVTZXJ2ZXJQZWVyKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVTZWN1cml0eUdyb3VwKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVTdG9yZUltYWdlVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlU3VibmV0KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhZmZpY01pcnJvclNlc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzR3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVZvbHVtZSgpXG4gICAqIC0gLnRvQ3JlYXRlVnBjKClcbiAgICogLSAudG9DcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb25Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlQ2FycmllckdhdGV3YXkoKVxuICAgKiAtIC50b0RlbGV0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlQ29pcENpZHIoKVxuICAgKiAtIC50b0RlbGV0ZUNvaXBQb29sKClcbiAgICogLSAudG9EZWxldGVDb2lwUG9vbFBlcm1pc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZUN1c3RvbWVyR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlRGhjcE9wdGlvbnMoKVxuICAgKiAtIC50b0RlbGV0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0RlbGV0ZUZsZWV0cygpXG4gICAqIC0gLnRvRGVsZXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0RlbGV0ZUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvRGVsZXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZUluc3RhbmNlRXZlbnRXaW5kb3coKVxuICAgKiAtIC50b0RlbGV0ZUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbSgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbigpXG4gICAqIC0gLnRvRGVsZXRlSXBhbVBvb2woKVxuICAgKiAtIC50b0RlbGV0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbVNjb3BlKClcbiAgICogLSAudG9EZWxldGVLZXlQYWlyKClcbiAgICogLSAudG9EZWxldGVMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucygpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9uKClcbiAgICogLSAudG9EZWxldGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZSgpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwKClcbiAgICogLSAudG9EZWxldGVNYW5hZ2VkUHJlZml4TGlzdCgpXG4gICAqIC0gLnRvRGVsZXRlTmF0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0FjbCgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0FjbEVudHJ5KClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcygpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0luc2lnaHRzQW5hbHlzaXMoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKClcbiAgICogLSAudG9EZWxldGVQbGFjZW1lbnRHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlUHVibGljSXB2NFBvb2woKVxuICAgKiAtIC50b0RlbGV0ZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZWxldGVSb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyUGVlcigpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0RlbGV0ZVN1Ym5ldCgpXG4gICAqIC0gLnRvRGVsZXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlVHJhZmZpY01pcnJvckZpbHRlcigpXG4gICAqIC0gLnRvRGVsZXRlVHJhZmZpY01pcnJvckZpbHRlclJ1bGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9EZWxldGVUcmFmZmljTWlycm9yVGFyZ2V0KClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0KClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbigpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc0dyb3VwKClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlKClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVsZXRlVnBjKClcbiAgICogLSAudG9EZWxldGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvRGVsZXRlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucygpXG4gICAqIC0gLnRvRGVsZXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbnMoKVxuICAgKiAtIC50b0RlbGV0ZVZwY0VuZHBvaW50cygpXG4gICAqIC0gLnRvRGVsZXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZVZwbkNvbm5lY3Rpb25Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVwcm92aXNpb25JcGFtQnlvYXNuKClcbiAgICogLSAudG9EZXByb3Zpc2lvbklwYW1Qb29sQ2lkcigpXG4gICAqIC0gLnRvRGVwcm92aXNpb25QdWJsaWNJcHY0UG9vbENpZHIoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5BdXRob3JpemF0aW9uUnVsZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblRhcmdldE5ldHdvcmtzKClcbiAgICogLSAudG9EZXNjcmliZUZsZWV0SGlzdG9yeSgpXG4gICAqIC0gLnRvRGVzY3JpYmVGbGVldEluc3RhbmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlU2VjdXJpdHlHcm91cFJlZmVyZW5jZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlU3BvdEZsZWV0SW5zdGFuY2VzKClcbiAgICogLSAudG9EZXNjcmliZVNwb3RGbGVldFJlcXVlc3RIaXN0b3J5KClcbiAgICogLSAudG9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcigpXG4gICAqIC0gLnRvRGV0YWNoVm9sdW1lKClcbiAgICogLSAudG9EZXRhY2hWcG5HYXRld2F5KClcbiAgICogLSAudG9EaXNhYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9EaXNhYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2UoKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0Rpc2FibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlVnBjQ2xhc3NpY0xpbmsoKVxuICAgKiAtIC50b0Rpc2FibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbCgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVnBjQ2lkckJsb2NrKClcbiAgICogLSAudG9FbmFibGVBZGRyZXNzVHJhbnNmZXIoKVxuICAgKiAtIC50b0VuYWJsZUZhc3RMYXVuY2goKVxuICAgKiAtIC50b0VuYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9FbmFibGVJbWFnZSgpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0VuYWJsZVJvdXRlU2VydmVyUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0VuYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVWb2x1bWVJTygpXG4gICAqIC0gLnRvRW5hYmxlVnBjQ2xhc3NpY0xpbmsoKVxuICAgKiAtIC50b0VuYWJsZVZwY0NsYXNzaWNMaW5rRG5zU3VwcG9ydCgpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRXhwb3J0SW1hZ2UoKVxuICAgKiAtIC50b0V4cG9ydFZlcmlmaWVkQWNjZXNzSW5zdGFuY2VDbGllbnRDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9HZXRDYXBhY2l0eVJlc2VydmF0aW9uVXNhZ2UoKVxuICAgKiAtIC50b0dldENvaXBQb29sVXNhZ2UoKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXREZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0U3VtbWFyeSgpXG4gICAqIC0gLnRvR2V0Rmxvd0xvZ3NJbnRlZ3JhdGlvblRlbXBsYXRlKClcbiAgICogLSAudG9HZXRHcm91cHNGb3JDYXBhY2l0eVJlc2VydmF0aW9uKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVRwbUVrUHViKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRJcGFtQWRkcmVzc0hpc3RvcnkoKVxuICAgKiAtIC50b0dldElwYW1EaXNjb3ZlcmVkQWNjb3VudHMoKVxuICAgKiAtIC50b0dldElwYW1EaXNjb3ZlcmVkUHVibGljQWRkcmVzc2VzKClcbiAgICogLSAudG9HZXRJcGFtRGlzY292ZXJlZFJlc291cmNlQ2lkcnMoKVxuICAgKiAtIC50b0dldElwYW1Qb29sQWxsb2NhdGlvbnMoKVxuICAgKiAtIC50b0dldElwYW1Qb29sQ2lkcnMoKVxuICAgKiAtIC50b0dldElwYW1SZXNvdXJjZUNpZHJzKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldE1hbmFnZWRQcmVmaXhMaXN0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9HZXRNYW5hZ2VkUHJlZml4TGlzdEVudHJpZXMoKVxuICAgKiAtIC50b0dldE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXNGaW5kaW5ncygpXG4gICAqIC0gLnRvR2V0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVDb250ZW50KClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b0dldFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9HZXRSb3V0ZVNlcnZlckFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvR2V0Um91dGVTZXJ2ZXJQcm9wYWdhdGlvbnMoKVxuICAgKiAtIC50b0dldFJvdXRlU2VydmVyUm91dGluZ0RhdGFiYXNlKClcbiAgICogLSAudG9HZXRTZWN1cml0eUdyb3Vwc0ZvclZwYygpXG4gICAqIC0gLnRvR2V0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVFbnRyaWVzKClcbiAgICogLSAudG9HZXRWZXJpZmllZEFjY2Vzc0VuZHBvaW50UG9saWN5KClcbiAgICogLSAudG9HZXRWZXJpZmllZEFjY2Vzc0VuZHBvaW50VGFyZ2V0cygpXG4gICAqIC0gLnRvR2V0VmVyaWZpZWRBY2Nlc3NHcm91cFBvbGljeSgpXG4gICAqIC0gLnRvR2V0VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbCgpXG4gICAqIC0gLnRvR2V0VnBuQ29ubmVjdGlvbkRldmljZVNhbXBsZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldFZwblR1bm5lbFJlcGxhY2VtZW50U3RhdHVzKClcbiAgICogLSAudG9JbXBvcnRCeW9pcENpZHJUb0lwYW0oKVxuICAgKiAtIC50b0ltcG9ydENsaWVudFZwbkNsaWVudENlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QoKVxuICAgKiAtIC50b0ltcG9ydEltYWdlKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvSW1wb3J0Vm9sdW1lKClcbiAgICogLSAudG9Mb2NrU25hcHNob3QoKVxuICAgKiAtIC50b01vZGlmeUFkZHJlc3NBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeUZsZWV0KClcbiAgICogLSAudG9Nb2RpZnlGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUhvc3RzKClcbiAgICogLSAudG9Nb2RpZnlJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50V2luZG93KClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeUlwYW0oKVxuICAgKiAtIC50b01vZGlmeUlwYW1Qb29sKClcbiAgICogLSAudG9Nb2RpZnlJcGFtUmVzb3VyY2VDaWRyKClcbiAgICogLSAudG9Nb2RpZnlJcGFtUmVzb3VyY2VEaXNjb3ZlcnkoKVxuICAgKiAtIC50b01vZGlmeUlwYW1TY29wZSgpXG4gICAqIC0gLnRvTW9kaWZ5TGF1bmNoVGVtcGxhdGUoKVxuICAgKiAtIC50b01vZGlmeUxvY2FsR2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9Nb2RpZnlNYW5hZ2VkUHJlZml4TGlzdCgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlSZXNlcnZlZEluc3RhbmNlcygpXG4gICAqIC0gLnRvTW9kaWZ5Um91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b01vZGlmeVNlY3VyaXR5R3JvdXBSdWxlcygpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvTW9kaWZ5U3BvdEZsZWV0UmVxdWVzdCgpXG4gICAqIC0gLnRvTW9kaWZ5U3VibmV0QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlUcmFmZmljTWlycm9yRmlsdGVyTmV0d29ya1NlcnZpY2VzKClcbiAgICogLSAudG9Nb2RpZnlUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhZmZpY01pcnJvclNlc3Npb24oKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5KClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NFbmRwb2ludCgpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFBvbGljeSgpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NHcm91cCgpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NHcm91cFBvbGljeSgpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZSgpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZSgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlWcGNBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludCgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQYXllclJlc3BvbnNpYmlsaXR5KClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjUGVlcmluZ0Nvbm5lY3Rpb25PcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlWcGNUZW5hbmN5KClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsQ2VydGlmaWNhdGUoKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b01vdmVCeW9pcENpZHJUb0lwYW0oKVxuICAgKiAtIC50b01vdmVDYXBhY2l0eVJlc2VydmF0aW9uSW5zdGFuY2VzKClcbiAgICogLSAudG9QYXVzZVZvbHVtZUlPKClcbiAgICogLSAudG9Qcm92aXNpb25JcGFtQnlvYXNuKClcbiAgICogLSAudG9Qcm92aXNpb25JcGFtUG9vbENpZHIoKVxuICAgKiAtIC50b1Byb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkcigpXG4gICAqIC0gLnRvUHVyY2hhc2VDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uKClcbiAgICogLSAudG9QdXJjaGFzZUhvc3RSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvUHV0UmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9SZWplY3RUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9SZWplY3RUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b1JlamVjdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKVxuICAgKiAtIC50b1JlamVjdFZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9SZWxlYXNlQWRkcmVzcygpXG4gICAqIC0gLnRvUmVsZWFzZUhvc3RzKClcbiAgICogLSAudG9SZWxlYXNlSXBhbVBvb2xBbGxvY2F0aW9uKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcGxhY2VOZXR3b3JrQWNsQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcGxhY2VOZXR3b3JrQWNsRW50cnkoKVxuICAgKiAtIC50b1JlcGxhY2VSb3V0ZSgpXG4gICAqIC0gLnRvUmVwbGFjZVJvdXRlVGFibGVBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b1JlcGxhY2VWcG5UdW5uZWwoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXNldEFkZHJlc3NBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0RnBnYUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldEltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldE5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc3RvcmVJbWFnZUZyb21SZWN5Y2xlQmluKClcbiAgICogLSAudG9SZXN0b3JlTWFuYWdlZFByZWZpeExpc3RWZXJzaW9uKClcbiAgICogLSAudG9SZXN0b3JlU25hcHNob3RGcm9tUmVjeWNsZUJpbigpXG4gICAqIC0gLnRvUmVzdG9yZVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvUmV2b2tlQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvUmV2b2tlU2VjdXJpdHlHcm91cEVncmVzcygpXG4gICAqIC0gLnRvUmV2b2tlU2VjdXJpdHlHcm91cEluZ3Jlc3MoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvU2VhcmNoTG9jYWxHYXRld2F5Um91dGVzKClcbiAgICogLSAudG9TZWFyY2hUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwcygpXG4gICAqIC0gLnRvU2VhcmNoVHJhbnNpdEdhdGV3YXlSb3V0ZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0YXJ0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcygpXG4gICAqIC0gLnRvU3RhcnROZXR3b3JrSW5zaWdodHNBbmFseXNpcygpXG4gICAqIC0gLnRvU3RhcnRWcGNFbmRwb2ludFNlcnZpY2VQcml2YXRlRG5zVmVyaWZpY2F0aW9uKClcbiAgICogLSAudG9TdG9wSW5zdGFuY2VzKClcbiAgICogLSAudG9UZXJtaW5hdGVDbGllbnRWcG5Db25uZWN0aW9ucygpXG4gICAqIC0gLnRvVGVybWluYXRlSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmFzc2lnbklwdjZBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICogLSAudG9VbmFzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvVW5sb2NrU25hcHNob3QoKVxuICAgKiAtIC50b1VubW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNFZ3Jlc3MoKVxuICAgKiAtIC50b1VwZGF0ZVNlY3VyaXR5R3JvdXBSdWxlRGVzY3JpcHRpb25zSW5ncmVzcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZWxhc3RpYy1pcFxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uLWZsZWV0XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICogLSBjYXJyaWVyLWdhdGV3YXlcbiAgICogLSBjbGllbnQtdnBuLWVuZHBvaW50XG4gICAqIC0gY3VzdG9tZXItZ2F0ZXdheVxuICAgKiAtIGRlY2xhcmF0aXZlLXBvbGljaWVzLXJlcG9ydFxuICAgKiAtIGRlZGljYXRlZC1ob3N0XG4gICAqIC0gZGhjcC1vcHRpb25zXG4gICAqIC0gZWdyZXNzLW9ubHktaW50ZXJuZXQtZ2F0ZXdheVxuICAgKiAtIGVsYXN0aWMtZ3B1XG4gICAqIC0gZXhwb3J0LWltYWdlLXRhc2tcbiAgICogLSBleHBvcnQtaW5zdGFuY2UtdGFza1xuICAgKiAtIGZsZWV0XG4gICAqIC0gZnBnYS1pbWFnZVxuICAgKiAtIGhvc3QtcmVzZXJ2YXRpb25cbiAgICogLSBpbWFnZVxuICAgKiAtIGltcG9ydC1pbWFnZS10YXNrXG4gICAqIC0gaW1wb3J0LXNuYXBzaG90LXRhc2tcbiAgICogLSBpbnN0YW5jZS1jb25uZWN0LWVuZHBvaW50XG4gICAqIC0gaW5zdGFuY2UtZXZlbnQtd2luZG93XG4gICAqIC0gaW5zdGFuY2VcbiAgICogLSBpbnRlcm5ldC1nYXRld2F5XG4gICAqIC0gaXBhbS1leHRlcm5hbC1yZXNvdXJjZS12ZXJpZmljYXRpb24tdG9rZW5cbiAgICogLSBpcGFtXG4gICAqIC0gaXBhbS1wb29sXG4gICAqIC0gaXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnktYXNzb2NpYXRpb25cbiAgICogLSBpcGFtLXJlc291cmNlLWRpc2NvdmVyeVxuICAgKiAtIGlwYW0tc2NvcGVcbiAgICogLSBjb2lwLXBvb2xcbiAgICogLSBpcHY0cG9vbC1lYzJcbiAgICogLSBpcHY2cG9vbC1lYzJcbiAgICogLSBrZXktcGFpclxuICAgKiAtIGxhdW5jaC10ZW1wbGF0ZVxuICAgKiAtIGxvY2FsLWdhdGV3YXlcbiAgICogLSBsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlLXZpcnR1YWwtaW50ZXJmYWNlLWdyb3VwLWFzc29jaWF0aW9uXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZS12cGMtYXNzb2NpYXRpb25cbiAgICogLSBsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS12aXJ0dWFsLWludGVyZmFjZS1ncm91cFxuICAgKiAtIGxvY2FsLWdhdGV3YXktdmlydHVhbC1pbnRlcmZhY2VcbiAgICogLSBuYXRnYXRld2F5XG4gICAqIC0gbmV0d29yay1hY2xcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLWFjY2Vzcy1zY29wZS1hbmFseXNpc1xuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtYWNjZXNzLXNjb3BlXG4gICAqIC0gbmV0d29yay1pbnNpZ2h0cy1hbmFseXNpc1xuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtcGF0aFxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqIC0gb3V0cG9zdC1sYWdcbiAgICogLSBwbGFjZW1lbnQtZ3JvdXBcbiAgICogLSBwcmVmaXgtbGlzdFxuICAgKiAtIHJlcGxhY2Utcm9vdC12b2x1bWUtdGFza1xuICAgKiAtIHJlc2VydmVkLWluc3RhbmNlc1xuICAgKiAtIHJvdXRlLXNlcnZlci1lbmRwb2ludFxuICAgKiAtIHJvdXRlLXNlcnZlclxuICAgKiAtIHJvdXRlLXNlcnZlci1wZWVyXG4gICAqIC0gcm91dGUtdGFibGVcbiAgICogLSBzZWN1cml0eS1ncm91cFxuICAgKiAtIHNlY3VyaXR5LWdyb3VwLXJ1bGVcbiAgICogLSBzbmFwc2hvdFxuICAgKiAtIHNwb3QtZmxlZXQtcmVxdWVzdFxuICAgKiAtIHNwb3QtaW5zdGFuY2VzLXJlcXVlc3RcbiAgICogLSBzdWJuZXQtY2lkci1yZXNlcnZhdGlvblxuICAgKiAtIHN1Ym5ldFxuICAgKiAtIHRyYWZmaWMtbWlycm9yLWZpbHRlclxuICAgKiAtIHRyYWZmaWMtbWlycm9yLWZpbHRlci1ydWxlXG4gICAqIC0gdHJhZmZpYy1taXJyb3Itc2Vzc2lvblxuICAgKiAtIHRyYWZmaWMtbWlycm9yLXRhcmdldFxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1hdHRhY2htZW50XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LWNvbm5lY3QtcGVlclxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheVxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1tdWx0aWNhc3QtZG9tYWluXG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXBvbGljeS10YWJsZVxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZS1hbm5vdW5jZW1lbnRcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktcm91dGUtdGFibGVcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnRcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtZW5kcG9pbnQtdGFyZ2V0XG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWdyb3VwXG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWluc3RhbmNlXG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLXBvbGljeVxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy10cnVzdC1wcm92aWRlclxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHZwYy1ibG9jay1wdWJsaWMtYWNjZXNzLWV4Y2x1c2lvblxuICAgKiAtIHZwYy1lbmRwb2ludC1jb25uZWN0aW9uXG4gICAqIC0gdnBjLWVuZHBvaW50XG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2VcbiAgICogLSB2cGMtZW5kcG9pbnQtc2VydmljZS1wZXJtaXNzaW9uXG4gICAqIC0gdnBjLWZsb3ctbG9nXG4gICAqIC0gdnBjXG4gICAqIC0gdnBjLXBlZXJpbmctY29ubmVjdGlvblxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqIC0gdnBuLWdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSBsaXN0IG9mIHRhZyBrZXlzIHRoYXQgYXJlIGFsbG93ZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL3N1cHBvcnRlZC1pYW0tYWN0aW9ucy10YWdnaW5nLmh0bWwjY29udHJvbC10YWdnaW5nXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRBZGRyZXNzVHJhbnNmZXIoKVxuICAgKiAtIC50b0FsbG9jYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQWxsb2NhdGVIb3N0cygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9BdXRob3JpemVTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9BdXRob3JpemVTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvQ29weUltYWdlKClcbiAgICogLSAudG9Db3B5U25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2FycmllckdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVDb2lwUG9vbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ3VzdG9tZXJHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVEaGNwT3B0aW9ucygpXG4gICAqIC0gLnRvQ3JlYXRlRWdyZXNzT25seUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVGcGdhSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrKClcbiAgICogLSAudG9DcmVhdGVJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZUlwYW0oKVxuICAgKiAtIC50b0NyZWF0ZUlwYW1FeHRlcm5hbFJlc291cmNlVmVyaWZpY2F0aW9uVG9rZW4oKVxuICAgKiAtIC50b0NyZWF0ZUlwYW1Qb29sKClcbiAgICogLSAudG9DcmVhdGVJcGFtUmVzb3VyY2VEaXNjb3ZlcnkoKVxuICAgKiAtIC50b0NyZWF0ZUlwYW1TY29wZSgpXG4gICAqIC0gLnRvQ3JlYXRlS2V5UGFpcigpXG4gICAqIC0gLnRvQ3JlYXRlTGF1bmNoVGVtcGxhdGUoKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZU1hbmFnZWRQcmVmaXhMaXN0KClcbiAgICogLSAudG9DcmVhdGVOYXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrQWNsKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlUGxhY2VtZW50R3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVB1YmxpY0lwdjRQb29sKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVJlc3RvcmVJbWFnZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlU2VydmVyKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVNlcnZlckVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVNlcnZlclBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZVNlY3VyaXR5R3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90KClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0NyZWF0ZVN1Ym5ldCgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVHJhZmZpY01pcnJvckZpbHRlcigpXG4gICAqIC0gLnRvQ3JlYXRlVHJhZmZpY01pcnJvckZpbHRlclJ1bGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yVGFyZ2V0KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbigpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZSgpXG4gICAqIC0gLnRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZVZwYygpXG4gICAqIC0gLnRvQ3JlYXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlVGFncygpXG4gICAqIC0gLnRvRXhwb3J0SW1hZ2UoKVxuICAgKiAtIC50b0ltcG9ydEltYWdlKClcbiAgICogLSAudG9JbXBvcnRLZXlQYWlyKClcbiAgICogLSAudG9JbXBvcnRTbmFwc2hvdCgpXG4gICAqIC0gLnRvUHVyY2hhc2VDYXBhY2l0eUJsb2NrKClcbiAgICogLSAudG9SZWdpc3RlckltYWdlKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9TdGFydE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzaXMoKVxuICAgKiAtIC50b1N0YXJ0TmV0d29ya0luc2lnaHRzQW5hbHlzaXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGVsYXN0aWMtaXBcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvbi1mbGVldFxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqIC0gY2Fycmllci1nYXRld2F5XG4gICAqIC0gY2xpZW50LXZwbi1lbmRwb2ludFxuICAgKiAtIGN1c3RvbWVyLWdhdGV3YXlcbiAgICogLSBkZWNsYXJhdGl2ZS1wb2xpY2llcy1yZXBvcnRcbiAgICogLSBkZWRpY2F0ZWQtaG9zdFxuICAgKiAtIGRoY3Atb3B0aW9uc1xuICAgKiAtIGVncmVzcy1vbmx5LWludGVybmV0LWdhdGV3YXlcbiAgICogLSBlbGFzdGljLWdwdVxuICAgKiAtIGV4cG9ydC1pbWFnZS10YXNrXG4gICAqIC0gZXhwb3J0LWluc3RhbmNlLXRhc2tcbiAgICogLSBmbGVldFxuICAgKiAtIGZwZ2EtaW1hZ2VcbiAgICogLSBob3N0LXJlc2VydmF0aW9uXG4gICAqIC0gaW1hZ2VcbiAgICogLSBpbXBvcnQtaW1hZ2UtdGFza1xuICAgKiAtIGltcG9ydC1zbmFwc2hvdC10YXNrXG4gICAqIC0gaW5zdGFuY2UtY29ubmVjdC1lbmRwb2ludFxuICAgKiAtIGluc3RhbmNlLWV2ZW50LXdpbmRvd1xuICAgKiAtIGluc3RhbmNlXG4gICAqIC0gaW50ZXJuZXQtZ2F0ZXdheVxuICAgKiAtIGlwYW0tZXh0ZXJuYWwtcmVzb3VyY2UtdmVyaWZpY2F0aW9uLXRva2VuXG4gICAqIC0gaXBhbVxuICAgKiAtIGlwYW0tcG9vbFxuICAgKiAtIGlwYW0tcmVzb3VyY2UtZGlzY292ZXJ5LWFzc29jaWF0aW9uXG4gICAqIC0gaXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnlcbiAgICogLSBpcGFtLXNjb3BlXG4gICAqIC0gY29pcC1wb29sXG4gICAqIC0gaXB2NHBvb2wtZWMyXG4gICAqIC0gaXB2NnBvb2wtZWMyXG4gICAqIC0ga2V5LXBhaXJcbiAgICogLSBsYXVuY2gtdGVtcGxhdGVcbiAgICogLSBsb2NhbC1nYXRld2F5XG4gICAqIC0gbG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZS12aXJ0dWFsLWludGVyZmFjZS1ncm91cC1hc3NvY2lhdGlvblxuICAgKiAtIGxvY2FsLWdhdGV3YXktcm91dGUtdGFibGUtdnBjLWFzc29jaWF0aW9uXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZVxuICAgKiAtIGxvY2FsLWdhdGV3YXktdmlydHVhbC1pbnRlcmZhY2UtZ3JvdXBcbiAgICogLSBsb2NhbC1nYXRld2F5LXZpcnR1YWwtaW50ZXJmYWNlXG4gICAqIC0gbmF0Z2F0ZXdheVxuICAgKiAtIG5ldHdvcmstYWNsXG4gICAqIC0gbmV0d29yay1pbnNpZ2h0cy1hY2Nlc3Mtc2NvcGUtYW5hbHlzaXNcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLWFjY2Vzcy1zY29wZVxuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtYW5hbHlzaXNcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLXBhdGhcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKiAtIG91dHBvc3QtbGFnXG4gICAqIC0gcGxhY2VtZW50LWdyb3VwXG4gICAqIC0gcHJlZml4LWxpc3RcbiAgICogLSByZXBsYWNlLXJvb3Qtdm9sdW1lLXRhc2tcbiAgICogLSByZXNlcnZlZC1pbnN0YW5jZXNcbiAgICogLSByb3V0ZS1zZXJ2ZXItZW5kcG9pbnRcbiAgICogLSByb3V0ZS1zZXJ2ZXJcbiAgICogLSByb3V0ZS1zZXJ2ZXItcGVlclxuICAgKiAtIHJvdXRlLXRhYmxlXG4gICAqIC0gc2VjdXJpdHktZ3JvdXBcbiAgICogLSBzZWN1cml0eS1ncm91cC1ydWxlXG4gICAqIC0gc25hcHNob3RcbiAgICogLSBzcG90LWZsZWV0LXJlcXVlc3RcbiAgICogLSBzcG90LWluc3RhbmNlcy1yZXF1ZXN0XG4gICAqIC0gc3VibmV0LWNpZHItcmVzZXJ2YXRpb25cbiAgICogLSBzdWJuZXRcbiAgICogLSB0cmFmZmljLW1pcnJvci1maWx0ZXJcbiAgICogLSB0cmFmZmljLW1pcnJvci1maWx0ZXItcnVsZVxuICAgKiAtIHRyYWZmaWMtbWlycm9yLXNlc3Npb25cbiAgICogLSB0cmFmZmljLW1pcnJvci10YXJnZXRcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktYXR0YWNobWVudFxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1jb25uZWN0LXBlZXJcbiAgICogLSB0cmFuc2l0LWdhdGV3YXlcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktbXVsdGljYXN0LWRvbWFpblxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1wb2xpY3ktdGFibGVcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktcm91dGUtdGFibGUtYW5ub3VuY2VtZW50XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlXG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWVuZHBvaW50XG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWVuZHBvaW50LXRhcmdldFxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1ncm91cFxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1pbnN0YW5jZVxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1wb2xpY3lcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtdHJ1c3QtcHJvdmlkZXJcbiAgICogLSB2b2x1bWVcbiAgICogLSB2cGMtYmxvY2stcHVibGljLWFjY2Vzcy1leGNsdXNpb25cbiAgICogLSB2cGMtZW5kcG9pbnQtY29ubmVjdGlvblxuICAgKiAtIHZwYy1lbmRwb2ludFxuICAgKiAtIHZwYy1lbmRwb2ludC1zZXJ2aWNlXG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2UtcGVybWlzc2lvblxuICAgKiAtIHZwYy1mbG93LWxvZ1xuICAgKiAtIHZwY1xuICAgKiAtIHZwYy1wZWVyaW5nLWNvbm5lY3Rpb25cbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKiAtIHZwbi1nYXRld2F5XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzVGFnS2V5cyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlRhZ0tleXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIGFuIGFjY2VwdGVyIFZQQyBpbiBhIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb25cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvcGVlcmluZy9zZWN1cml0eS1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9EZWxldGVWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjUGVlcmluZ0Nvbm5lY3Rpb25PcHRpb25zKClcbiAgICogLSAudG9SZWplY3RWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjLXBlZXJpbmctY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkFjY2VwdGVyVnBjKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBBY2NlcHRlclZwY2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBncm91cCBiZWluZyBhZGRlZCB0byBhIHNuYXBzaG90XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90QXR0cmlidXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBzbmFwc2hvdFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkFkZEdyb3VwKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBBZGQvZ3JvdXBgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgYWNjb3VudCBpZCBiZWluZyBhZGRlZCB0byBhIHNuYXBzaG90XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90QXR0cmlidXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBzbmFwc2hvdFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkFkZFVzZXJJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQWRkL3VzZXJJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBhbGxvY2F0aW9uIElEIG9mIHRoZSBFbGFzdGljIElQIGFkZHJlc3NcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0QWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvQ3JlYXRlTmF0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGlzYWJsZUFkZHJlc3NUcmFuc2ZlcigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTmF0R2F0ZXdheUFkZHJlc3MoKVxuICAgKiAtIC50b0VuYWJsZUFkZHJlc3NUcmFuc2ZlcigpXG4gICAqIC0gLnRvTW9kaWZ5QWRkcmVzc0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVsZWFzZUFkZHJlc3MoKVxuICAgKiAtIC50b1Jlc2V0QWRkcmVzc0F0dHJpYnV0ZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZWxhc3RpYy1pcFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkFsbG9jYXRpb25JZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQWxsb2NhdGlvbklkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciB0aGUgdXNlciB3YW50cyB0byBhc3NvY2lhdGUgYSBwdWJsaWMgSVAgYWRkcmVzcyB3aXRoIHRoZSBpbnN0YW5jZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBgdHJ1ZWAgb3IgYGZhbHNlYC4gKipEZWZhdWx0OioqIGB0cnVlYFxuICAgKi9cbiAgcHVibGljIGlmQXNzb2NpYXRlUHVibGljSXBBZGRyZXNzKHZhbHVlPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLmlmKGBBc3NvY2lhdGVQdWJsaWNJcEFkZHJlc3NgLCAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogdHJ1ZSksICdCb29sJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYW4gYXR0cmlidXRlIG9mIGEgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2F0dHJpYnV0ZS1rZXlcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b01vZGlmeUFkZHJlc3NBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb25GbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeUZsZWV0KClcbiAgICogLSAudG9Nb2RpZnlGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUhvc3RzKClcbiAgICogLSAudG9Nb2RpZnlJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeUlwYW0oKVxuICAgKiAtIC50b01vZGlmeUlwYW1Qb29sKClcbiAgICogLSAudG9Nb2RpZnlJcGFtUmVzb3VyY2VDaWRyKClcbiAgICogLSAudG9Nb2RpZnlJcGFtU2NvcGUoKVxuICAgKiAtIC50b01vZGlmeUxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAudG9Nb2RpZnlNYW5hZ2VkUHJlZml4TGlzdCgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlSZXNlcnZlZEluc3RhbmNlcygpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvTW9kaWZ5U3BvdEZsZWV0UmVxdWVzdCgpXG4gICAqIC0gLnRvTW9kaWZ5U3VibmV0QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlUcmFmZmljTWlycm9yRmlsdGVyTmV0d29ya1NlcnZpY2VzKClcbiAgICogLSAudG9Nb2RpZnlUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhZmZpY01pcnJvclNlc3Npb24oKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5KClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVZwY0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50U2VydmljZVBheWVyUmVzcG9uc2liaWxpdHkoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50U2VydmljZVBlcm1pc3Npb25zKClcbiAgICogLSAudG9Nb2RpZnlWcGNQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeVZwY1RlbmFuY3koKVxuICAgKiAtIC50b01vZGlmeVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwbkNvbm5lY3Rpb25PcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxDZXJ0aWZpY2F0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsT3B0aW9ucygpXG4gICAqIC0gLnRvUmVzZXRBZGRyZXNzQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldEZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZWxhc3RpYy1pcFxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uLWZsZWV0XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICogLSBjbGllbnQtdnBuLWVuZHBvaW50XG4gICAqIC0gZGVkaWNhdGVkLWhvc3RcbiAgICogLSBmbGVldFxuICAgKiAtIGZwZ2EtaW1hZ2VcbiAgICogLSBpbWFnZVxuICAgKiAtIGluc3RhbmNlLWNvbm5lY3QtZW5kcG9pbnRcbiAgICogLSBpbnN0YW5jZVxuICAgKiAtIGlwYW0tZXh0ZXJuYWwtcmVzb3VyY2UtdmVyaWZpY2F0aW9uLXRva2VuXG4gICAqIC0gaXBhbVxuICAgKiAtIGlwYW0tcG9vbFxuICAgKiAtIGlwYW0tc2NvcGVcbiAgICogLSBsYXVuY2gtdGVtcGxhdGVcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKiAtIHByZWZpeC1saXN0XG4gICAqIC0gcmVzZXJ2ZWQtaW5zdGFuY2VzXG4gICAqIC0gc2VjdXJpdHktZ3JvdXBcbiAgICogLSBzbmFwc2hvdFxuICAgKiAtIHNwb3QtZmxlZXQtcmVxdWVzdFxuICAgKiAtIHN1Ym5ldFxuICAgKiAtIHRyYWZmaWMtbWlycm9yLWZpbHRlclxuICAgKiAtIHRyYWZmaWMtbWlycm9yLWZpbHRlci1ydWxlXG4gICAqIC0gdHJhZmZpYy1taXJyb3Itc2Vzc2lvblxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1hdHRhY2htZW50XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlXG4gICAqIC0gdm9sdW1lXG4gICAqIC0gdnBjLWVuZHBvaW50XG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2VcbiAgICogLSB2cGNcbiAgICogLSB2cGMtcGVlcmluZy1jb25uZWN0aW9uXG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBdHRyaWJ1dGVFeGlzdHModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEF0dHJpYnV0ZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGFuIGF0dHJpYnV0ZSBiZWluZyBzZXQgb24gYSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYXR0cmlidXRlLWtleVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvTW9kaWZ5QWRkcmVzc0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0KClcbiAgICogLSAudG9Nb2RpZnlDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvTW9kaWZ5RmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SG9zdHMoKVxuICAgKiAtIC50b01vZGlmeUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDYXBhY2l0eVJlc2VydmF0aW9uQXR0cmlidXRlcygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcHVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb24oKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlRXZlbnRTdGFydFRpbWUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWFpbnRlbmFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhRGVmYXVsdHMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlJcGFtKClcbiAgICogLSAudG9Nb2RpZnlJcGFtUG9vbCgpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbVJlc291cmNlQ2lkcigpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbVNjb3BlKClcbiAgICogLSAudG9Nb2RpZnlMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TWFuYWdlZFByZWZpeExpc3QoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5UmVzZXJ2ZWRJbnN0YW5jZXMoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b01vZGlmeVNwb3RGbGVldFJlcXVlc3QoKVxuICAgKiAtIC50b01vZGlmeVN1Ym5ldEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlck5ldHdvcmtTZXJ2aWNlcygpXG4gICAqIC0gLnRvTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlclJ1bGUoKVxuICAgKiAtIC50b01vZGlmeVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZSgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlWcGNBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQYXllclJlc3BvbnNpYmlsaXR5KClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjUGVlcmluZ0Nvbm5lY3Rpb25PcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlWcGNUZW5hbmN5KClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsQ2VydGlmaWNhdGUoKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKVxuICAgKiAtIC50b1Jlc2V0QWRkcmVzc0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0SW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGVsYXN0aWMtaXBcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvbi1mbGVldFxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqIC0gY2xpZW50LXZwbi1lbmRwb2ludFxuICAgKiAtIGRlZGljYXRlZC1ob3N0XG4gICAqIC0gZmxlZXRcbiAgICogLSBmcGdhLWltYWdlXG4gICAqIC0gaW1hZ2VcbiAgICogLSBpbnN0YW5jZS1jb25uZWN0LWVuZHBvaW50XG4gICAqIC0gaW5zdGFuY2VcbiAgICogLSBpcGFtLWV4dGVybmFsLXJlc291cmNlLXZlcmlmaWNhdGlvbi10b2tlblxuICAgKiAtIGlwYW1cbiAgICogLSBpcGFtLXBvb2xcbiAgICogLSBpcGFtLXNjb3BlXG4gICAqIC0gbGF1bmNoLXRlbXBsYXRlXG4gICAqIC0gbmV0d29yay1pbnRlcmZhY2VcbiAgICogLSBwcmVmaXgtbGlzdFxuICAgKiAtIHJlc2VydmVkLWluc3RhbmNlc1xuICAgKiAtIHNlY3VyaXR5LWdyb3VwXG4gICAqIC0gc25hcHNob3RcbiAgICogLSBzcG90LWZsZWV0LXJlcXVlc3RcbiAgICogLSBzdWJuZXRcbiAgICogLSB0cmFmZmljLW1pcnJvci1maWx0ZXJcbiAgICogLSB0cmFmZmljLW1pcnJvci1maWx0ZXItcnVsZVxuICAgKiAtIHRyYWZmaWMtbWlycm9yLXNlc3Npb25cbiAgICogLSB0cmFuc2l0LWdhdGV3YXktYXR0YWNobWVudFxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheVxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZVxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHZwYy1lbmRwb2ludFxuICAgKiAtIHZwYy1lbmRwb2ludC1zZXJ2aWNlXG4gICAqIC0gdnBjXG4gICAqIC0gdnBjLXBlZXJpbmctY29ubmVjdGlvblxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEF0dHJpYnV0ZS8keyBhdHRyaWJ1dGVOYW1lIH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgYXV0aGVudGljYXRpb24gdHlwZSBmb3IgdGhlIFZQTiB0dW5uZWwgZW5kcG9pbnRzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cG4vbGF0ZXN0L3Myc3Zwbi92cG4tYXV0aGVudGljYXRpb24tYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsT3B0aW9ucygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBdXRoZW50aWNhdGlvblR5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEF1dGhlbnRpY2F0aW9uVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBV1Mgc2VydmljZSB0aGF0IGhhcyBwZXJtaXNzaW9uIHRvIHVzZSBhIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXV0aG9yaXplZFNlcnZpY2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEF1dGhvcml6ZWRTZXJ2aWNlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYW4gSUFNIHByaW5jaXBhbCB0aGF0IGhhcyBwZXJtaXNzaW9uIHRvIHVzZSBhIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvTW9kaWZ5TG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF1dGhvcml6ZWRVc2VyKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBBdXRob3JpemVkVXNlcmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBdXRvIFBsYWNlbWVudCBwcm9wZXJ0aWVzIG9mIGEgRGVkaWNhdGVkIEhvc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWxsb2NhdGVIb3N0cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZGVkaWNhdGVkLWhvc3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBdXRvUGxhY2VtZW50KHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBBdXRvUGxhY2VtZW50YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIG5hbWUgb2YgYW4gQXZhaWxhYmlsaXR5IFpvbmUgaW4gYW4gQVdTIFJlZ2lvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvQWxsb2NhdGVIb3N0cygpXG4gICAqIC0gLnRvQXNzaWduSXB2NkFkZHJlc3NlcygpXG4gICAqIC0gLnRvQXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0NyZWF0ZU5hdEdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlU2VydmVyUGVlcigpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yU2Vzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyUGVlcigpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0RlbGV0ZVN1Ym5ldCgpXG4gICAqIC0gLnRvRGVsZXRlVm9sdW1lKClcbiAgICogLSAudG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cE1lbWJlcnMoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVTdWJuZXRDaWRyQmxvY2soKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9FbmFibGVGYXN0U25hcHNob3RSZXN0b3JlcygpXG4gICAqIC0gLnRvRW5hYmxlVm9sdW1lSU8oKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVRwbUVrUHViKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldFBhc3N3b3JkRGF0YSgpXG4gICAqIC0gLnRvSW1wb3J0SW5zdGFuY2UoKVxuICAgKiAtIC50b0ltcG9ydFZvbHVtZSgpXG4gICAqIC0gLnRvTW9kaWZ5RmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlSZXNlcnZlZEluc3RhbmNlcygpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNwb3RGbGVldFJlcXVlc3QoKVxuICAgKiAtIC50b01vZGlmeVN1Ym5ldEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWUoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b01vdmVDYXBhY2l0eVJlc2VydmF0aW9uSW5zdGFuY2VzKClcbiAgICogLSAudG9QYXVzZVZvbHVtZUlPKClcbiAgICogLSAudG9SZWJvb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cE1lbWJlcnMoKVxuICAgKiAtIC50b1JlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKVxuICAgKiAtIC50b1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcGxhY2VOZXR3b3JrQWNsQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcGxhY2VSb3V0ZVRhYmxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldE5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvU2VuZERpYWdub3N0aWNJbnRlcnJ1cHQoKVxuICAgKiAtIC50b1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zKClcbiAgICogLSAudG9TdGFydEluc3RhbmNlcygpXG4gICAqIC0gLnRvU3RvcEluc3RhbmNlcygpXG4gICAqIC0gLnRvVGVybWluYXRlSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmFzc2lnbklwdjZBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICogLSAudG9Vbm1vbml0b3JJbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqIC0gZGVkaWNhdGVkLWhvc3RcbiAgICogLSBpbnN0YW5jZVxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqIC0gcmVzZXJ2ZWQtaW5zdGFuY2VzXG4gICAqIC0gcm91dGUtc2VydmVyLWVuZHBvaW50XG4gICAqIC0gcm91dGUtc2VydmVyLXBlZXJcbiAgICogLSBzbmFwc2hvdFxuICAgKiAtIHN1Ym5ldFxuICAgKiAtIHZvbHVtZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF2YWlsYWJpbGl0eVpvbmUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEF2YWlsYWJpbGl0eVpvbmVgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgSUQgb2YgYW4gQXZhaWxhYmlsaXR5IFpvbmUgaW4gYW4gQVdTIFJlZ2lvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF2YWlsYWJpbGl0eVpvbmVJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQXZhaWxhYmlsaXR5Wm9uZUlkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gRmxlZXRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9HZXRDYXBhY2l0eVJlc2VydmF0aW9uVXNhZ2UoKVxuICAgKiAtIC50b0dldEdyb3Vwc0ZvckNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b01vZGlmeUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b01vdmVDYXBhY2l0eVJlc2VydmF0aW9uSW5zdGFuY2VzKClcbiAgICogLSAudG9QdXJjaGFzZUNhcGFjaXR5QmxvY2soKVxuICAgKiAtIC50b1B1cmNoYXNlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbigpXG4gICAqIC0gLnRvUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0KHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIHRoZSBjbGllbnQgcm9vdCBjZXJ0aWZpY2F0ZSBjaGFpblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9Bc3NvY2lhdGVDbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9BdXRob3JpemVDbGllbnRWcG5JbmdyZXNzKClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0RlbGV0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5Db25uZWN0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5Sb3V0ZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuVGFyZ2V0TmV0d29ya3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0V4cG9ydENsaWVudFZwbkNsaWVudENlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QoKVxuICAgKiAtIC50b0V4cG9ydENsaWVudFZwbkNsaWVudENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0ltcG9ydENsaWVudFZwbkNsaWVudENlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QoKVxuICAgKiAtIC50b01vZGlmeUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9SZXZva2VDbGllbnRWcG5JbmdyZXNzKClcbiAgICogLSAudG9UZXJtaW5hdGVDbGllbnRWcG5Db25uZWN0aW9ucygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gY2xpZW50LXZwbi1lbmRwb2ludFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkNsaWVudFJvb3RDZXJ0aWZpY2F0ZUNoYWluQXJuKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDbGllbnRSb290Q2VydGlmaWNhdGVDaGFpbkFybmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgdGhlIENsb3VkV2F0Y2ggTG9ncyBsb2cgZ3JvdXBcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXBwbHlTZWN1cml0eUdyb3Vwc1RvQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXV0aG9yaXplQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwblJvdXRlKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblRhcmdldE5ldHdvcmtzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9FeHBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9FeHBvcnRDbGllbnRWcG5DbGllbnRDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9JbXBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9Nb2RpZnlDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvUmV2b2tlQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvVGVybWluYXRlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNsaWVudC12cG4tZW5kcG9pbnRcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZDbG91ZHdhdGNoTG9nR3JvdXBBcm4odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYENsb3Vkd2F0Y2hMb2dHcm91cEFybmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgdGhlIENsb3VkV2F0Y2ggTG9ncyBsb2cgc3RyZWFtXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FwcGx5U2VjdXJpdHlHcm91cHNUb0NsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0F1dGhvcml6ZUNsaWVudFZwbkluZ3Jlc3MoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZUNsaWVudFZwblJvdXRlKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwbkNvbm5lY3Rpb25zKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblJvdXRlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5UYXJnZXROZXR3b3JrcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvSW1wb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpXG4gICAqIC0gLnRvTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b1Jldm9rZUNsaWVudFZwbkluZ3Jlc3MoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUNsaWVudFZwbkNvbm5lY3Rpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjbGllbnQtdnBuLWVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ2xvdWR3YXRjaExvZ1N0cmVhbUFybih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQ2xvdWR3YXRjaExvZ1N0cmVhbUFybmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBzdGF0ZSBvZiBBTUQgU0VWLVNOUCBDUFUgT3B0aW9ucy4gQ3VycmVudGx5LCBvbmx5IFVTIEVhc3QgKE9oaW8pIGFuZCBFdXJvcGUgKElyZWxhbmQpIGFyZSBzdXBwb3J0ZWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL3Nldi1zbnAuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXR0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0Q29uc29sZU91dHB1dCgpXG4gICAqIC0gLnRvR2V0Q29uc29sZVNjcmVlbnNob3QoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVHBtRWtQdWIoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVWVmaURhdGEoKVxuICAgKiAtIC50b0dldExhdW5jaFRlbXBsYXRlRGF0YSgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1Jlc2V0SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvU2VuZERpYWdub3N0aWNJbnRlcnJ1cHQoKVxuICAgKiAtIC50b1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zKClcbiAgICogLSAudG9TdGFydEluc3RhbmNlcygpXG4gICAqIC0gLnRvU3RvcEluc3RhbmNlcygpXG4gICAqIC0gLnRvVGVybWluYXRlSW5zdGFuY2VzKClcbiAgICogLSAudG9Vbm1vbml0b3JJbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ3B1T3B0aW9uc0FtZFNldlNucCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQ3B1T3B0aW9uc0FtZFNldlNucGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UtY3JlYXRpbmcgQVBJIGFjdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvc3VwcG9ydGVkLWlhbS1hY3Rpb25zLXRhZ2dpbmcuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ3JlYXRlQWN0aW9uKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDcmVhdGVBY3Rpb25gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gd2FzIGNyZWF0ZWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2RhdGUgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0RhdGUpLiAqKkRlZmF1bHQ6KiogYERhdGVFcXVhbHNgXG4gICAqL1xuICBwdWJsaWMgaWZDcmVhdGVEYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgKERhdGUgfCBzdHJpbmcpW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBEYXRlKS5nZXRNb250aCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgKGl0ZW0gYXMgRGF0ZSkuZ2V0TW9udGggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGl0ZW0gPSAoaXRlbSBhcyBEYXRlKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlmKGBDcmVhdGVEYXRlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdEYXRlRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIERQRCB0aW1lb3V0IG9jY3VycyBvbiBhIFZQTiB0dW5uZWxcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtudW1lcmljIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19OdW1lcmljKS4gKipEZWZhdWx0OioqIGBOdW1lcmljRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmRFBEVGltZW91dFNlY29uZHModmFsdWU6IG51bWJlciB8IG51bWJlcltdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYERQRFRpbWVvdXRTZWNvbmRzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIHRoZSBDYXBhY2l0eSBSZXNlcnZhdGlvbiB0aGF0IHlvdSB3YW50IHRvIG1vdmUgY2FwYWNpdHkgaW50b1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKClcbiAgICogLSAudG9EZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25PZmZlcmluZ3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b01vdmVDYXBhY2l0eVJlc2VydmF0aW9uSW5zdGFuY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZEZXN0aW5hdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb25JZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgRGVzdGluYXRpb25DYXBhY2l0eVJlc2VydmF0aW9uSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgSUQgb2YgYSBkeW5hbWljIGhvc3QgY29uZmlndXJhdGlvbiBwcm90b2NvbCAoREhDUCkgb3B0aW9ucyBzZXRcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZURoY3BPcHRpb25zKClcbiAgICogLSAudG9DcmVhdGVEaGNwT3B0aW9ucygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlRGhjcE9wdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGRoY3Atb3B0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkRoY3BPcHRpb25zSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYERoY3BPcHRpb25zSURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIHRoZSBkaXJlY3RvcnlcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXBwbHlTZWN1cml0eUdyb3Vwc1RvQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXV0aG9yaXplQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwblJvdXRlKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblRhcmdldE5ldHdvcmtzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9FeHBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9FeHBvcnRDbGllbnRWcG5DbGllbnRDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9JbXBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9Nb2RpZnlDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvUmV2b2tlQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvVGVybWluYXRlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNsaWVudC12cG4tZW5kcG9pbnRcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZEaXJlY3RvcnlBcm4odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYERpcmVjdG9yeUFybmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBkb21haW4gb2YgdGhlIEVsYXN0aWMgSVAgYWRkcmVzc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRBZGRyZXNzVHJhbnNmZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9DcmVhdGVOYXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EaXNhYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvRW5hYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9Nb2RpZnlBZGRyZXNzQXR0cmlidXRlKClcbiAgICogLSAudG9SZWxlYXNlQWRkcmVzcygpXG4gICAqIC0gLnRvUmVzZXRBZGRyZXNzQXR0cmlidXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBlbGFzdGljLWlwXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmRG9tYWluKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBEb21haW5gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB3aGV0aGVyIHRoZSBpbnN0YW5jZSBpcyBlbmFibGVkIGZvciBFQlMgb3B0aW1pemF0aW9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25PZmZlcmluZ3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0Q29uc29sZU91dHB1dCgpXG4gICAqIC0gLnRvR2V0Q29uc29sZVNjcmVlbnNob3QoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVHBtRWtQdWIoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVWVmaURhdGEoKVxuICAgKiAtIC50b0dldExhdW5jaFRlbXBsYXRlRGF0YSgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDYXBhY2l0eVJlc2VydmF0aW9uQXR0cmlidXRlcygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcHVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb24oKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlRXZlbnRTdGFydFRpbWUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWFpbnRlbmFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZVBsYWNlbWVudCgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKClcbiAgICogLSAudG9Nb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKiAtIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBgdHJ1ZWAgb3IgYGZhbHNlYC4gKipEZWZhdWx0OioqIGB0cnVlYFxuICAgKi9cbiAgcHVibGljIGlmRWJzT3B0aW1pemVkKHZhbHVlPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLmlmKGBFYnNPcHRpbWl6ZWRgLCAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogdHJ1ZSksICdCb29sJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2YgRWxhc3RpYyBHcmFwaGljcyBhY2NlbGVyYXRvclxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGVsYXN0aWMtZ3B1XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmRWxhc3RpY0dwdVR5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEVsYXN0aWNHcHVUeXBlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciB0aGUgRUJTIHZvbHVtZSBpcyBlbmNyeXB0ZWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9Db3B5U25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9FbmFibGVGYXN0U25hcHNob3RSZXN0b3JlcygpXG4gICAqIC0gLnRvRW5hYmxlVm9sdW1lSU8oKVxuICAgKiAtIC50b0ltcG9ydEluc3RhbmNlKClcbiAgICogLSAudG9JbXBvcnRWb2x1bWUoKVxuICAgKiAtIC50b0xvY2tTbmFwc2hvdCgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdEZyb21SZWN5Y2xlQmluKClcbiAgICogLSAudG9SZXN0b3JlU25hcHNob3RUaWVyKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1VubG9ja1NuYXBzaG90KClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBzbmFwc2hvdFxuICAgKiAtIHZvbHVtZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgYHRydWVgIG9yIGBmYWxzZWAuICoqRGVmYXVsdDoqKiBgdHJ1ZWBcbiAgICovXG4gIHB1YmxpYyBpZkVuY3J5cHRlZCh2YWx1ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5pZihgRW5jcnlwdGVkYCwgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHRydWUpLCAnQm9vbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBDYXBhY2l0eSBSZXNlcnZhdGlvbiBlbmRzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9Bc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtkYXRlIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19EYXRlKS4gKipEZWZhdWx0OioqIGBEYXRlRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmRW5kRGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IChEYXRlIHwgc3RyaW5nKVtdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgRGF0ZSkuZ2V0TW9udGggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdmFsdWUgPSAodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIChpdGVtIGFzIERhdGUpLmdldE1vbnRoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpdGVtID0gKGl0ZW0gYXMgRGF0ZSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pZihgRW5kRGF0ZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnRGF0ZUVxdWFscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB3YXkgaW4gd2hpY2ggdGhlIENhcGFjaXR5IFJlc2VydmF0aW9uIGVuZHNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmRW5kRGF0ZVR5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEVuZERhdGVUeXBlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciB0aGUgaW5zdGFuY2UgaXMgZW5hYmxlZCBmb3IgZXBoZW1lcmFsIHN0b3JhZ2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIGB0cnVlYCBvciBgZmFsc2VgLiAqKkRlZmF1bHQ6KiogYHRydWVgXG4gICAqL1xuICBwdWJsaWMgaWZFcGhlbWVyYWxTdG9yYWdlKHZhbHVlPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLmlmKGBFcGhlbWVyYWxTdG9yYWdlYCwgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHRydWUpLCAnQm9vbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBBV1MgRklTIGFjdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZmlzL2xhdGVzdC91c2VyZ3VpZGUvZmlzLWFjdGlvbnMtcmVmZXJlbmNlLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0luamVjdEFwaUVycm9yKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZGaXNBY3Rpb25JZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgRmlzQWN0aW9uSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIGFuIEFXUyBGSVMgdGFyZ2V0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9maXMvbGF0ZXN0L3VzZXJndWlkZS9maXMtYWN0aW9ucy1yZWZlcmVuY2UuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvSW5qZWN0QXBpRXJyb3IoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkZpc1RhcmdldEFybnModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEZpc1RhcmdldEFybnNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgZ2F0ZXdheSB0eXBlIGZvciBhIFZQTiBlbmRwb2ludCBvbiB0aGUgQVdTIHNpZGUgb2YgYSBWUE4gY29ubmVjdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBuL2xhdGVzdC9zMnN2cG4vdnBuLWF1dGhlbnRpY2F0aW9uLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmR2F0ZXdheVR5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEdhdGV3YXlUeXBlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciBob3N0IHJlY292ZXJ5IGlzIGVuYWJsZWQgZm9yIGEgRGVkaWNhdGVkIEhvc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWxsb2NhdGVIb3N0cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZGVkaWNhdGVkLWhvc3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZIb3N0UmVjb3ZlcnkodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEhvc3RSZWNvdmVyeWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBpbnRlcm5ldCBrZXkgZXhjaGFuZ2UgKElLRSkgdmVyc2lvbnMgdGhhdCBhcmUgcGVybWl0dGVkIGZvciBhIFZQTiB0dW5uZWxcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZklLRVZlcnNpb25zKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBJS0VWZXJzaW9uc2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBpbWFnZVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ2FuY2VsSW1hZ2VMYXVuY2hQZXJtaXNzaW9uKClcbiAgICogLSAudG9Db3B5SW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVSZXN0b3JlSW1hZ2VUYXNrKClcbiAgICogLSAudG9DcmVhdGVTdG9yZUltYWdlVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVyZWdpc3RlckltYWdlKClcbiAgICogLSAudG9EZXNjcmliZUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9EaXNhYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlRGVyZWdpc3RyYXRpb25Qcm90ZWN0aW9uKClcbiAgICogLSAudG9FbmFibGVGYXN0TGF1bmNoKClcbiAgICogLSAudG9FbmFibGVJbWFnZSgpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0V4cG9ydEltYWdlKClcbiAgICogLSAudG9JbXBvcnRJbWFnZSgpXG4gICAqIC0gLnRvTW9kaWZ5RmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9SZWdpc3RlckltYWdlKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVzZXRJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzdG9yZUltYWdlRnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gaW1hZ2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbWFnZUlEKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBJbWFnZUlEYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2YgaW1hZ2UgKG1hY2hpbmUsIGFraSwgb3IgYXJpKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DYW5jZWxJbWFnZUxhdW5jaFBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVN0b3JlSW1hZ2VUYXNrKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZXJlZ2lzdGVySW1hZ2UoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rpc2FibGVGYXN0TGF1bmNoKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2UoKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0VuYWJsZUZhc3RMYXVuY2goKVxuICAgKiAtIC50b0VuYWJsZUltYWdlKClcbiAgICogLSAudG9FbmFibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9FbmFibGVJbWFnZURlcmVnaXN0cmF0aW9uUHJvdGVjdGlvbigpXG4gICAqIC0gLnRvRXhwb3J0SW1hZ2UoKVxuICAgKiAtIC50b0ltcG9ydEltYWdlKClcbiAgICogLSAudG9Nb2RpZnlGbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5SW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXNldEltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXN0b3JlSW1hZ2VGcm9tUmVjeWNsZUJpbigpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbWFnZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkltYWdlVHlwZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW1hZ2VUeXBlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHJhbmdlIG9mIGluc2lkZSBJUCBhZGRyZXNzZXMgZm9yIGEgVlBOIHR1bm5lbFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBuL2xhdGVzdC9zMnN2cG4vdnBuLWF1dGhlbnRpY2F0aW9uLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmSW5zaWRlVHVubmVsQ2lkcih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zaWRlVHVubmVsQ2lkcmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGEgcmFuZ2Ugb2YgaW5zaWRlIElQdjYgYWRkcmVzc2VzIGZvciBhIFZQTiB0dW5uZWxcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkluc2lkZVR1bm5lbElwdjZDaWRyKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBJbnNpZGVUdW5uZWxJcHY2Q2lkcmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHdoZXRoZXIgdGhlIGluc3RhbmNlIHR5cGUgc3VwcG9ydHMgYXV0byByZWNvdmVyeVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvRGV0YWNoVm9sdW1lKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVRwbUVrUHViKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldFBhc3N3b3JkRGF0YSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1Jlc2V0SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvU2VuZERpYWdub3N0aWNJbnRlcnJ1cHQoKVxuICAgKiAtIC50b1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zKClcbiAgICogLSAudG9TdG9wSW5zdGFuY2VzKClcbiAgICogLSAudG9UZXJtaW5hdGVJbnN0YW5jZXMoKVxuICAgKiAtIC50b1VubW9uaXRvckluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbnN0YW5jZUF1dG9SZWNvdmVyeSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zdGFuY2VBdXRvUmVjb3ZlcnlgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgYmFuZHdpZHRoIHdlaWdodGluZyBvZiBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXR0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0Q29uc29sZU91dHB1dCgpXG4gICAqIC0gLnRvR2V0Q29uc29sZVNjcmVlbnNob3QoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVHBtRWtQdWIoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVWVmaURhdGEoKVxuICAgKiAtIC50b0dldExhdW5jaFRlbXBsYXRlRGF0YSgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcG9ydEluc3RhbmNlU3RhdHVzKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkluc3RhbmNlQmFuZHdpZHRoV2VpZ2h0aW5nKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBJbnN0YW5jZUJhbmR3aWR0aFdlaWdodGluZ2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9Bc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtudW1lcmljIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19OdW1lcmljKS4gKipEZWZhdWx0OioqIGBOdW1lcmljRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmSW5zdGFuY2VDb3VudCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zdGFuY2VDb3VudGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnTnVtZXJpY0VxdWFscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXR0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0Q29uc29sZU91dHB1dCgpXG4gICAqIC0gLnRvR2V0Q29uc29sZVNjcmVlbnNob3QoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVHBtRWtQdWIoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVWVmaURhdGEoKVxuICAgKiAtIC50b0dldExhdW5jaFRlbXBsYXRlRGF0YSgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1JlcG9ydEluc3RhbmNlU3RhdHVzKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkluc3RhbmNlSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEluc3RhbmNlSURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbWFya2V0IG9yIHB1cmNoYXNpbmcgb3B0aW9uIG9mIGFuIGluc3RhbmNlIChjYXBhY2l0eS1ibG9jaywgb24tZGVtYW5kLCBvciBzcG90KVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkluc3RhbmNlTWFya2V0VHlwZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zdGFuY2VNYXJrZXRUeXBlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2YgaW5zdGFuY2UgbGF1bmNoZXMgdGhhdCB0aGUgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gYWNjZXB0c1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKClcbiAgICogLSAudG9EZXNjcmliZUNhcGFjaXR5QmxvY2tFeHRlbnNpb25PZmZlcmluZ3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b01vdmVDYXBhY2l0eVJlc2VydmF0aW9uSW5zdGFuY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbnN0YW5jZU1hdGNoQ3JpdGVyaWEodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEluc3RhbmNlTWF0Y2hDcml0ZXJpYWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHdoZXRoZXIgdGhlIGluc3RhbmNlIGFsbG93cyBhY2Nlc3MgdG8gaW5zdGFuY2UgdGFncyBmcm9tIHRoZSBpbnN0YW5jZSBtZXRhZGF0YVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvRGV0YWNoVm9sdW1lKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVRwbUVrUHViKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldFBhc3N3b3JkRGF0YSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXBsYWNlSWFtSW5zdGFuY2VQcm9maWxlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1Jlc2V0SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvU2VuZERpYWdub3N0aWNJbnRlcnJ1cHQoKVxuICAgKiAtIC50b1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zKClcbiAgICogLSAudG9TdG9wSW5zdGFuY2VzKClcbiAgICogLSAudG9UZXJtaW5hdGVJbnN0YW5jZXMoKVxuICAgKiAtIC50b1VubW9uaXRvckluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbnN0YW5jZU1ldGFkYXRhVGFncyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zdGFuY2VNZXRhZGF0YVRhZ3NgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdHlwZSBvZiBvcGVyYXRpbmcgc3lzdGVtIGZvciB3aGljaCB0aGUgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gcmVzZXJ2ZXMgY2FwYWNpdHlcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmSW5zdGFuY2VQbGF0Zm9ybSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zdGFuY2VQbGF0Zm9ybWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgYW4gaW5zdGFuY2UgcHJvZmlsZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkluc3RhbmNlUHJvZmlsZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5zdGFuY2VQcm9maWxlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2YgaW5zdGFuY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0FsbG9jYXRlSG9zdHMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvQXR0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeVJlc2VydmVkSW5zdGFuY2VzKClcbiAgICogLSAudG9Nb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKiAtIGRlZGljYXRlZC1ob3N0XG4gICAqIC0gaW5zdGFuY2VcbiAgICogLSByZXNlcnZlZC1pbnN0YW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbnN0YW5jZVR5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEluc3RhbmNlVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBpbnRlcm5ldCBnYXRld2F5XG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9BdHRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlSW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9EZXRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b1JlcGxhY2VSb3V0ZVRhYmxlQXNzb2NpYXRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGludGVybmV0LWdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZJbnRlcm5ldEdhdGV3YXlJRCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW50ZXJuZXRHYXRld2F5SURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgSUQgb2YgYW4gSVBBTSBwb29sIHByb3ZpZGVkIGZvciBJUHY0IENJRFIgYmxvY2sgYWxsb2NhdGlvblxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVZwY0NpZHJCbG9jaygpXG4gICAqIC0gLnRvQ3JlYXRlVnBjKClcbiAgICogLSAudG9DcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwY1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZklwdjRJcGFtUG9vbElkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBJcHY0SXBhbVBvb2xJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBJUEFNIHBvb2wgcHJvdmlkZWQgZm9yIElQdjYgQ0lEUiBibG9jayBhbGxvY2F0aW9uXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVSb3V0ZVNlcnZlcigpXG4gICAqIC0gLnRvQXNzb2NpYXRlU2VjdXJpdHlHcm91cFZwYygpXG4gICAqIC0gLnRvQXNzb2NpYXRlVnBjQ2lkckJsb2NrKClcbiAgICogLSAudG9DcmVhdGVWcGMoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVSb3V0ZVNlcnZlcigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlU2VjdXJpdHlHcm91cFZwYygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmSXB2NklwYW1Qb29sSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYElwdjZJcGFtUG9vbElkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciB1c2VycyBhcmUgYWJsZSB0byBvdmVycmlkZSByZXNvdXJjZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBsYXVuY2ggdGVtcGxhdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKiAtIGRlZGljYXRlZC1ob3N0XG4gICAqIC0gZWxhc3RpYy1ncHVcbiAgICogLSBpbWFnZVxuICAgKiAtIGluc3RhbmNlXG4gICAqIC0ga2V5LXBhaXJcbiAgICogLSBsYXVuY2gtdGVtcGxhdGVcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKiAtIHBsYWNlbWVudC1ncm91cFxuICAgKiAtIHNlY3VyaXR5LWdyb3VwXG4gICAqIC0gc25hcHNob3RcbiAgICogLSBzdWJuZXRcbiAgICogLSB2b2x1bWVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIGB0cnVlYCBvciBgZmFsc2VgLiAqKkRlZmF1bHQ6KiogYHRydWVgXG4gICAqL1xuICBwdWJsaWMgaWZJc0xhdW5jaFRlbXBsYXRlUmVzb3VyY2UodmFsdWU/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYElzTGF1bmNoVGVtcGxhdGVSZXNvdXJjZWAsICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiB0cnVlKSwgJ0Jvb2wnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbmFtZSBvZiBhIGtleSBwYWlyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0RlbGV0ZUtleVBhaXIoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGtleS1wYWlyXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmS2V5UGFpck5hbWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEtleVBhaXJOYW1lYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2YgYSBrZXkgcGFpclxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVLZXlQYWlyKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZWxldGVLZXlQYWlyKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBrZXktcGFpclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZktleVBhaXJUeXBlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBLZXlQYWlyVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBBV1MgS01TIGtleSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlVm9sdW1lKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2b2x1bWVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZLbXNLZXlJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgS21zS2V5SWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIGEgbGF1bmNoIHRlbXBsYXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICogLSBkZWRpY2F0ZWQtaG9zdFxuICAgKiAtIGVsYXN0aWMtZ3B1XG4gICAqIC0gaW1hZ2VcbiAgICogLSBpbnN0YW5jZVxuICAgKiAtIGtleS1wYWlyXG4gICAqIC0gbGF1bmNoLXRlbXBsYXRlXG4gICAqIC0gbmV0d29yay1pbnRlcmZhY2VcbiAgICogLSBwbGFjZW1lbnQtZ3JvdXBcbiAgICogLSBzZWN1cml0eS1ncm91cFxuICAgKiAtIHNuYXBzaG90XG4gICAqIC0gc3VibmV0XG4gICAqIC0gdm9sdW1lXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmTGF1bmNoVGVtcGxhdGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYExhdW5jaFRlbXBsYXRlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgc25hcHNob3QgY29weVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBzbmFwc2hvdFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkxvY2F0aW9uKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBMb2NhdGlvbmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBwcmVzZW5jZSBvZiBhbiBFQzIgb3BlcmF0b3IgcHJvdmlzaW9uaW5nIGEgbWFuYWdlZCByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvQXR0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoVGVtcGxhdGUoKVxuICAgKiAtIC50b0RlbGV0ZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnMoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKClcbiAgICogLSAudG9EZWxldGVWb2x1bWUoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvRW5hYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRW5hYmxlVm9sdW1lSU8oKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVRwbUVrUHViKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldFBhc3N3b3JkRGF0YSgpXG4gICAqIC0gLnRvSW1wb3J0SW5zdGFuY2UoKVxuICAgKiAtIC50b0ltcG9ydFZvbHVtZSgpXG4gICAqIC0gLnRvTW9kaWZ5RmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5U3BvdEZsZWV0UmVxdWVzdCgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVzZXRJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXROZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5hc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9VbmFzc2lnblByaXZhdGVJcEFkZHJlc3NlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKiAtIGxhdW5jaC10ZW1wbGF0ZVxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqIC0gdm9sdW1lXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmTWFuYWdlZFJlc291cmNlT3BlcmF0b3IodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE1hbmFnZWRSZXNvdXJjZU9wZXJhdG9yYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciB0aGUgSFRUUCBlbmRwb2ludCBpcyBlbmFibGVkIGZvciB0aGUgaW5zdGFuY2UgbWV0YWRhdGEgc2VydmljZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk1ldGFkYXRhSHR0cEVuZHBvaW50KHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBNZXRhZGF0YUh0dHBFbmRwb2ludGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBhbGxvd2VkIG51bWJlciBvZiBob3BzIHdoZW4gY2FsbGluZyB0aGUgaW5zdGFuY2UgbWV0YWRhdGEgc2VydmljZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtudW1lcmljIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19OdW1lcmljKS4gKipEZWZhdWx0OioqIGBOdW1lcmljRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmTWV0YWRhdGFIdHRwUHV0UmVzcG9uc2VIb3BMaW1pdCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgTWV0YWRhdGFIdHRwUHV0UmVzcG9uc2VIb3BMaW1pdGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnTnVtZXJpY0VxdWFscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHdoZXRoZXIgdG9rZW5zIGFyZSByZXF1aXJlZCB3aGVuIGNhbGxpbmcgdGhlIGluc3RhbmNlIG1ldGFkYXRhIHNlcnZpY2UgKG9wdGlvbmFsIG9yIHJlcXVpcmVkKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk1ldGFkYXRhSHR0cFRva2Vucyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgTWV0YWRhdGFIdHRwVG9rZW5zYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgbmV0d29yayBhY2Nlc3MgY29udHJvbCBsaXN0IChBQ0wpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrQWNsKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrQWNsRW50cnkoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtBY2woKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gbmV0d29yay1hY2xcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZOZXR3b3JrQWNsSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE5ldHdvcmtBY2xJRGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhbiBlbGFzdGljIG5ldHdvcmsgaW50ZXJmYWNlXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yVGFyZ2V0KClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9Nb2RpZnlMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Jlc2V0TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmFzc2lnbklwdjZBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk5ldHdvcmtJbnRlcmZhY2VJRCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgTmV0d29ya0ludGVyZmFjZUlEYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgaW5zdGFuY2UgcHJvZmlsZSBiZWluZyBhdHRhY2hlZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b1JlcGxhY2VJYW1JbnN0YW5jZVByb2ZpbGVBc3NvY2lhdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZOZXdJbnN0YW5jZVByb2ZpbGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE5ld0luc3RhbmNlUHJvZmlsZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgdGhlIE91dHBvc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0NvcHlTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlZ2lzdGVySW1hZ2UoKVxuICAgKiAtIC50b1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb25cbiAgICogLSBzbmFwc2hvdFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk91dHBvc3RBcm4odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE91dHBvc3RBcm5gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgb3duZXIgb2YgdGhlIHJlc291cmNlIChhbWF6b24sIGF3cy1tYXJrZXRwbGFjZSwgb3IgYW4gQVdTIGFjY291bnQgSUQpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NhbmNlbEltYWdlTGF1bmNoUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ29weUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvQ29weUltYWdlKClcbiAgICogLSAudG9Db3B5U25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVGcGdhSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVJlc3RvcmVJbWFnZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVN0b3JlSW1hZ2VUYXNrKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rpc2FibGVGYXN0TGF1bmNoKClcbiAgICogLSAudG9EaXNhYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZSgpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlRGVwcmVjYXRpb24oKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZURlcmVnaXN0cmF0aW9uUHJvdGVjdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRW5hYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0VuYWJsZUltYWdlKClcbiAgICogLSAudG9FbmFibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9FbmFibGVJbWFnZURlcmVnaXN0cmF0aW9uUHJvdGVjdGlvbigpXG4gICAqIC0gLnRvRXhwb3J0SW1hZ2UoKVxuICAgKiAtIC50b0ltcG9ydEltYWdlKClcbiAgICogLSAudG9JbXBvcnRTbmFwc2hvdCgpXG4gICAqIC0gLnRvTG9ja1NuYXBzaG90KClcbiAgICogLSAudG9Nb2RpZnlGbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5RnBnYUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvUmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RGbGVldCgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Jlc2V0RnBnYUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldEltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldFNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9SZXN0b3JlSW1hZ2VGcm9tUmVjeWNsZUJpbigpXG4gICAqIC0gLnRvUmVzdG9yZVNuYXBzaG90RnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5sb2NrU25hcHNob3QoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGZwZ2EtaW1hZ2VcbiAgICogLSBpbWFnZVxuICAgKiAtIHNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmT3duZXIodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE93bmVyYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgcGFyZW50IHNuYXBzaG90XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvQ29weVNuYXBzaG90KClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVWb2x1bWUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0VuYWJsZVZvbHVtZUlPKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvSW1wb3J0Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gc25hcHNob3RcbiAgICogLSB2b2x1bWVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQYXJlbnRTbmFwc2hvdCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGFyZW50U25hcHNob3RgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIHRoZSBwYXJlbnQgdm9sdW1lIGZyb20gd2hpY2ggdGhlIHNuYXBzaG90IHdhcyBjcmVhdGVkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NvcHlTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvRGVzY3JpYmVTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9FbmFibGVGYXN0U25hcHNob3RSZXN0b3JlcygpXG4gICAqIC0gLnRvSW1wb3J0SW1hZ2UoKVxuICAgKiAtIC50b0ltcG9ydFNuYXBzaG90KClcbiAgICogLSAudG9Mb2NrU25hcHNob3QoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b1JlZ2lzdGVySW1hZ2UoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXNldFNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9SZXN0b3JlU25hcHNob3RGcm9tUmVjeWNsZUJpbigpXG4gICAqIC0gLnRvUmVzdG9yZVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmxvY2tTbmFwc2hvdCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gc25hcHNob3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQYXJlbnRWb2x1bWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFBhcmVudFZvbHVtZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0eXBlIG9mIHBlcm1pc3Npb24gZm9yIGEgcmVzb3VyY2UgKElOU1RBTkNFLUFUVEFDSCBvciBFSVAtQVNTT0NJQVRFKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludCgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTmF0R2F0ZXdheUFkZHJlc3MoKVxuICAgKiAtIC50b01vZGlmeUxvY2FsR2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gbmV0d29yay1pbnRlcmZhY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQZXJtaXNzaW9uKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBQZXJtaXNzaW9uYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIERpZmZpZS1IZWxsbWFuIGdyb3VwIG51bWJlcnMgdGhhdCBhcmUgcGVybWl0dGVkIGZvciBhIFZQTiB0dW5uZWwgZm9yIHRoZSBwaGFzZSAxIElLRSBuZWdvdGlhdGlvbnNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlBoYXNlMURIR3JvdXAodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFBoYXNlMURIR3JvdXBgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG1zIHRoYXQgYXJlIHBlcm1pdHRlZCBmb3IgYSBWUE4gdHVubmVsIGZvciB0aGUgcGhhc2UgMSBJS0UgbmVnb3RpYXRpb25zXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cG4vbGF0ZXN0L3Myc3Zwbi92cG4tYXV0aGVudGljYXRpb24tYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsT3B0aW9ucygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQaGFzZTFFbmNyeXB0aW9uQWxnb3JpdGhtcyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGhhc2UxRW5jcnlwdGlvbkFsZ29yaXRobXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgaW50ZWdyaXR5IGFsZ29yaXRobXMgdGhhdCBhcmUgcGVybWl0dGVkIGZvciBhIFZQTiB0dW5uZWwgZm9yIHRoZSBwaGFzZSAxIElLRSBuZWdvdGlhdGlvbnNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlBoYXNlMUludGVncml0eUFsZ29yaXRobXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFBoYXNlMUludGVncml0eUFsZ29yaXRobXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbGlmZXRpbWUgaW4gc2Vjb25kcyBmb3IgcGhhc2UgMSBvZiB0aGUgSUtFIG5lZ290aWF0aW9ucyBmb3IgYSBWUE4gdHVubmVsXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cG4vbGF0ZXN0L3Myc3Zwbi92cG4tYXV0aGVudGljYXRpb24tYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsT3B0aW9ucygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbbnVtZXJpYyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfTnVtZXJpYykuICoqRGVmYXVsdDoqKiBgTnVtZXJpY0VxdWFsc2BcbiAgICovXG4gIHB1YmxpYyBpZlBoYXNlMUxpZmV0aW1lU2Vjb25kcyh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGhhc2UxTGlmZXRpbWVTZWNvbmRzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIERpZmZpZS1IZWxsbWFuIGdyb3VwIG51bWJlcnMgdGhhdCBhcmUgcGVybWl0dGVkIGZvciBhIFZQTiB0dW5uZWwgZm9yIHRoZSBwaGFzZSAyIElLRSBuZWdvdGlhdGlvbnNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlBoYXNlMkRIR3JvdXAodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFBoYXNlMkRIR3JvdXBgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG1zIHRoYXQgYXJlIHBlcm1pdHRlZCBmb3IgYSBWUE4gdHVubmVsIGZvciB0aGUgcGhhc2UgMiBJS0UgbmVnb3RpYXRpb25zXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cG4vbGF0ZXN0L3Myc3Zwbi92cG4tYXV0aGVudGljYXRpb24tYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsT3B0aW9ucygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQaGFzZTJFbmNyeXB0aW9uQWxnb3JpdGhtcyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGhhc2UyRW5jcnlwdGlvbkFsZ29yaXRobXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgaW50ZWdyaXR5IGFsZ29yaXRobXMgdGhhdCBhcmUgcGVybWl0dGVkIGZvciBhIFZQTiB0dW5uZWwgZm9yIHRoZSBwaGFzZSAyIElLRSBuZWdvdGlhdGlvbnNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlBoYXNlMkludGVncml0eUFsZ29yaXRobXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFBoYXNlMkludGVncml0eUFsZ29yaXRobXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbGlmZXRpbWUgaW4gc2Vjb25kcyBmb3IgcGhhc2UgMiBvZiB0aGUgSUtFIG5lZ290aWF0aW9ucyBmb3IgYSBWUE4gdHVubmVsXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cG4vbGF0ZXN0L3Myc3Zwbi92cG4tYXV0aGVudGljYXRpb24tYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuVHVubmVsT3B0aW9ucygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbbnVtZXJpYyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfTnVtZXJpYykuICoqRGVmYXVsdDoqKiBgTnVtZXJpY0VxdWFsc2BcbiAgICovXG4gIHB1YmxpYyBpZlBoYXNlMkxpZmV0aW1lU2Vjb25kcyh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGhhc2UyTGlmZXRpbWVTZWNvbmRzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgcGxhY2VtZW50IGdyb3VwXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CeVNwbGl0dGluZygpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrRXh0ZW5zaW9uT2ZmZXJpbmdzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9EZXRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvRGV0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvRGV0YWNoVm9sdW1lKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldFBhc3N3b3JkRGF0YSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTmV0d29ya1BlcmZvcm1hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VQbGFjZW1lbnQoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVqZWN0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b1JlcGxhY2VJYW1JbnN0YW5jZVByb2ZpbGVBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9TdGFydEluc3RhbmNlcygpXG4gICAqIC0gLnRvU3RvcEluc3RhbmNlcygpXG4gICAqIC0gLnRvVGVybWluYXRlSW5zdGFuY2VzKClcbiAgICogLSAudG9Vbm1vbml0b3JJbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqIC0gaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQbGFjZW1lbnRHcm91cCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGxhY2VtZW50R3JvdXBgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbmFtZSBvZiBhIHBsYWNlbWVudCBncm91cFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZVBsYWNlbWVudEdyb3VwKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZWxldGVQbGFjZW1lbnRHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlUmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b0dldFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZVBsYWNlbWVudCgpXG4gICAqIC0gLnRvUHV0UmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHBsYWNlbWVudC1ncm91cFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlBsYWNlbWVudEdyb3VwTmFtZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGxhY2VtZW50R3JvdXBOYW1lYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGluc3RhbmNlIHBsYWNlbWVudCBzdHJhdGVneSB1c2VkIGJ5IHRoZSBwbGFjZW1lbnQgZ3JvdXAgKGNsdXN0ZXIsIHNwcmVhZCwgb3IgcGFydGl0aW9uKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlUGxhY2VtZW50R3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0RlbGV0ZVBsYWNlbWVudEdyb3VwKClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvR2V0UmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9QdXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RGbGVldCgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gcGxhY2VtZW50LWdyb3VwXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUGxhY2VtZW50R3JvdXBTdHJhdGVneSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUGxhY2VtZW50R3JvdXBTdHJhdGVneWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBwcm9kdWN0IGNvZGUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFNSVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlRXhwb3J0VGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0Q29uc29sZU91dHB1dCgpXG4gICAqIC0gLnRvR2V0Q29uc29sZVNjcmVlbnNob3QoKVxuICAgKiAtIC50b0dldEluc3RhbmNlVWVmaURhdGEoKVxuICAgKiAtIC50b0dldExhdW5jaFRlbXBsYXRlRGF0YSgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDYXBhY2l0eVJlc2VydmF0aW9uQXR0cmlidXRlcygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcHVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb24oKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlRXZlbnRTdGFydFRpbWUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWFpbnRlbmFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZVBsYWNlbWVudCgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKClcbiAgICogLSAudG9Nb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9SZWJvb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlcGxhY2VJYW1JbnN0YW5jZVByb2ZpbGVBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVzZXRJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9UZXJtaW5hdGVJbnN0YW5jZXMoKVxuICAgKiAtIC50b1VubW9uaXRvckluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQcm9kdWN0Q29kZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUHJvZHVjdENvZGVgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB3aGV0aGVyIHRoZSBpbWFnZSBoYXMgcHVibGljIGxhdW5jaCBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DYW5jZWxJbWFnZUxhdW5jaFBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVGcGdhSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlU3RvcmVJbWFnZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0RlbGV0ZUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvRGVyZWdpc3RlckltYWdlKClcbiAgICogLSAudG9EZXNjcmliZUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9EaXNhYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlRGVyZWdpc3RyYXRpb25Qcm90ZWN0aW9uKClcbiAgICogLSAudG9FbmFibGVGYXN0TGF1bmNoKClcbiAgICogLSAudG9FbmFibGVJbWFnZSgpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0V4cG9ydEltYWdlKClcbiAgICogLSAudG9JbXBvcnRJbWFnZSgpXG4gICAqIC0gLnRvTW9kaWZ5RmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXNldEZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzdG9yZUltYWdlRnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZnBnYS1pbWFnZVxuICAgKiAtIGltYWdlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBgdHJ1ZWAgb3IgYGZhbHNlYC4gKipEZWZhdWx0OioqIGB0cnVlYFxuICAgKi9cbiAgcHVibGljIGlmUHVibGljKHZhbHVlPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLmlmKGBQdWJsaWNgLCAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogdHJ1ZSksICdCb29sJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSBwdWJsaWMgSVAgYWRkcmVzc1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRBZGRyZXNzVHJhbnNmZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9DcmVhdGVOYXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EaXNhYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVBZGRyZXNzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvRW5hYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9Nb2RpZnlBZGRyZXNzQXR0cmlidXRlKClcbiAgICogLSAudG9SZWxlYXNlQWRkcmVzcygpXG4gICAqIC0gLnRvUmVzZXRBZGRyZXNzQXR0cmlidXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBlbGFzdGljLWlwXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUHVibGljSXBBZGRyZXNzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBQdWJsaWNJcEFkZHJlc3NgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbnVtYmVyIG9mIERlZGljYXRlZCBIb3N0cyBpbiBhIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWxsb2NhdGVIb3N0cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gZGVkaWNhdGVkLWhvc3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbbnVtZXJpYyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfTnVtZXJpYykuICoqRGVmYXVsdDoqKiBgTnVtZXJpY0VxdWFsc2BcbiAgICovXG4gIHB1YmxpYyBpZlF1YW50aXR5KHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBRdWFudGl0eWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnTnVtZXJpY0VxdWFscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBuYW1lIG9mIHRoZSBBV1MgUmVnaW9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdEFkZHJlc3NUcmFuc2ZlcigpXG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0FjY2VwdFJlc2VydmVkSW5zdGFuY2VzRXhjaGFuZ2VRdW90ZSgpXG4gICAqIC0gLnRvQWNjZXB0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0FjY2VwdFRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0FjY2VwdFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvQWNjZXB0VnBjRW5kcG9pbnRDb25uZWN0aW9ucygpXG4gICAqIC0gLnRvQWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0FkdmVydGlzZUJ5b2lwQ2lkcigpXG4gICAqIC0gLnRvQWxsb2NhdGVBZGRyZXNzKClcbiAgICogLSAudG9BbGxvY2F0ZUhvc3RzKClcbiAgICogLSAudG9BbGxvY2F0ZUlwYW1Qb29sQ2lkcigpXG4gICAqIC0gLnRvQXBwbHlTZWN1cml0eUdyb3Vwc1RvQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzaWduSXB2NkFkZHJlc3NlcygpXG4gICAqIC0gLnRvQXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlTmF0R2F0ZXdheUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Fzc29jaWF0ZURoY3BPcHRpb25zKClcbiAgICogLSAudG9Bc3NvY2lhdGVFbmNsYXZlQ2VydGlmaWNhdGVJYW1Sb2xlKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUluc3RhbmNlRXZlbnRXaW5kb3coKVxuICAgKiAtIC50b0Fzc29jaWF0ZUlwYW1CeW9hc24oKVxuICAgKiAtIC50b0Fzc29jaWF0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTmF0R2F0ZXdheUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlU2VydmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9Bc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjKClcbiAgICogLSAudG9Bc3NvY2lhdGVTdWJuZXRDaWRyQmxvY2soKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRydW5rSW50ZXJmYWNlKClcbiAgICogLSAudG9Bc3NvY2lhdGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlV2ViQWNsKClcbiAgICogLSAudG9Bc3NvY2lhdGVWcGNDaWRyQmxvY2soKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0F0dGFjaFZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcigpXG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9BdHRhY2hWcG5HYXRld2F5KClcbiAgICogLSAudG9BdXRob3JpemVDbGllbnRWcG5JbmdyZXNzKClcbiAgICogLSAudG9BdXRob3JpemVTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9BdXRob3JpemVTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvQnVuZGxlSW5zdGFuY2UoKVxuICAgKiAtIC50b0NhbmNlbEJ1bmRsZVRhc2soKVxuICAgKiAtIC50b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMoKVxuICAgKiAtIC50b0NhbmNlbENvbnZlcnNpb25UYXNrKClcbiAgICogLSAudG9DYW5jZWxEZWNsYXJhdGl2ZVBvbGljaWVzUmVwb3J0KClcbiAgICogLSAudG9DYW5jZWxFeHBvcnRUYXNrKClcbiAgICogLSAudG9DYW5jZWxJbWFnZUxhdW5jaFBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NhbmNlbEltcG9ydFRhc2soKVxuICAgKiAtIC50b0NhbmNlbFJlc2VydmVkSW5zdGFuY2VzTGlzdGluZygpXG4gICAqIC0gLnRvQ2FuY2VsU3BvdEZsZWV0UmVxdWVzdHMoKVxuICAgKiAtIC50b0NhbmNlbFNwb3RJbnN0YW5jZVJlcXVlc3RzKClcbiAgICogLSAudG9Db25maXJtUHJvZHVjdEluc3RhbmNlKClcbiAgICogLSAudG9Db3B5RnBnYUltYWdlKClcbiAgICogLSAudG9Db3B5SW1hZ2UoKVxuICAgKiAtIC50b0NvcHlTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUNhcnJpZXJHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0NyZWF0ZUNvaXBDaWRyKClcbiAgICogLSAudG9DcmVhdGVDb2lwUG9vbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29pcFBvb2xQZXJtaXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVDdXN0b21lckdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZURlZmF1bHRTdWJuZXQoKVxuICAgKiAtIC50b0NyZWF0ZURlZmF1bHRWcGMoKVxuICAgKiAtIC50b0NyZWF0ZURoY3BPcHRpb25zKClcbiAgICogLSAudG9DcmVhdGVFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0NyZWF0ZUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZUluc3RhbmNlQ29ubmVjdEVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV2ZW50V2luZG93KClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NyZWF0ZUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbSgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbigpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbVBvb2woKVxuICAgKiAtIC50b0NyZWF0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbVNjb3BlKClcbiAgICogLSAudG9DcmVhdGVLZXlQYWlyKClcbiAgICogLSAudG9DcmVhdGVMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9uKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZU1hbmFnZWRQcmVmaXhMaXN0KClcbiAgICogLSAudG9DcmVhdGVOYXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrQWNsKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrQWNsRW50cnkoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlUGxhY2VtZW50R3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVB1YmxpY0lwdjRQb29sKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVJlc2VydmVkSW5zdGFuY2VzTGlzdGluZygpXG4gICAqIC0gLnRvQ3JlYXRlUmVzdG9yZUltYWdlVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlU2VydmVyKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVNlcnZlckVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVNlcnZlclBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZVNlY3VyaXR5R3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90KClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0NyZWF0ZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlU3RvcmVJbWFnZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVN1Ym5ldCgpXG4gICAqIC0gLnRvQ3JlYXRlU3VibmV0Q2lkclJlc2VydmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhZmZpY01pcnJvclNlc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheUNvbm5lY3QoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzR3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcigpXG4gICAqIC0gLnRvQ3JlYXRlVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVWcGMoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKClcbiAgICogLSAudG9DcmVhdGVWcGNFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9uKClcbiAgICogLSAudG9DcmVhdGVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvblJvdXRlKClcbiAgICogLSAudG9DcmVhdGVWcG5HYXRld2F5KClcbiAgICogLSAudG9EZWxldGVDYXJyaWVyR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZUNsaWVudFZwblJvdXRlKClcbiAgICogLSAudG9EZWxldGVDb2lwQ2lkcigpXG4gICAqIC0gLnRvRGVsZXRlQ29pcFBvb2woKVxuICAgKiAtIC50b0RlbGV0ZUNvaXBQb29sUGVybWlzc2lvbigpXG4gICAqIC0gLnRvRGVsZXRlQ3VzdG9tZXJHYXRld2F5KClcbiAgICogLSAudG9EZWxldGVEaGNwT3B0aW9ucygpXG4gICAqIC0gLnRvRGVsZXRlRWdyZXNzT25seUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlRmxlZXRzKClcbiAgICogLSAudG9EZWxldGVGbG93TG9ncygpXG4gICAqIC0gLnRvRGVsZXRlRnBnYUltYWdlKClcbiAgICogLSAudG9EZWxldGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvRGVsZXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvRGVsZXRlSW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9EZWxldGVJcGFtKClcbiAgICogLSAudG9EZWxldGVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VuKClcbiAgICogLSAudG9EZWxldGVJcGFtUG9vbCgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9EZWxldGVJcGFtU2NvcGUoKVxuICAgKiAtIC50b0RlbGV0ZUtleVBhaXIoKVxuICAgKiAtIC50b0RlbGV0ZUxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAudG9EZWxldGVMYXVuY2hUZW1wbGF0ZVZlcnNpb25zKClcbiAgICogLSAudG9EZWxldGVMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWaXJ0dWFsSW50ZXJmYWNlR3JvdXBBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZwY0Fzc29jaWF0aW9uKClcbiAgICogLSAudG9EZWxldGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlKClcbiAgICogLSAudG9EZWxldGVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlR3JvdXAoKVxuICAgKiAtIC50b0RlbGV0ZU1hbmFnZWRQcmVmaXhMaXN0KClcbiAgICogLSAudG9EZWxldGVOYXRHYXRld2F5KClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrQWNsKClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrQWNsRW50cnkoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlKClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzKClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW5zaWdodHNBbmFseXNpcygpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZVBsYWNlbWVudEdyb3VwKClcbiAgICogLSAudG9EZWxldGVQdWJsaWNJcHY0UG9vbCgpXG4gICAqIC0gLnRvRGVsZXRlUXVldWVkUmVzZXJ2ZWRJbnN0YW5jZXMoKVxuICAgKiAtIC50b0RlbGV0ZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZWxldGVSb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyUGVlcigpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0RlbGV0ZVNwb3REYXRhZmVlZFN1YnNjcmlwdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlU3VibmV0KClcbiAgICogLSAudG9EZWxldGVTdWJuZXRDaWRyUmVzZXJ2YXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVRhZ3MoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXIoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlKClcbiAgICogLSAudG9EZWxldGVUcmFmZmljTWlycm9yU2Vzc2lvbigpXG4gICAqIC0gLnRvRGVsZXRlVHJhZmZpY01pcnJvclRhcmdldCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXkoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcigpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvRGVsZXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludCgpXG4gICAqIC0gLnRvRGVsZXRlVmVyaWZpZWRBY2Nlc3NHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZSgpXG4gICAqIC0gLnRvRGVsZXRlVmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKClcbiAgICogLSAudG9EZWxldGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZVZwYygpXG4gICAqIC0gLnRvRGVsZXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24oKVxuICAgKiAtIC50b0RlbGV0ZVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbnMoKVxuICAgKiAtIC50b0RlbGV0ZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb25zKClcbiAgICogLSAudG9EZWxldGVWcGNFbmRwb2ludHMoKVxuICAgKiAtIC50b0RlbGV0ZVZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9EZWxldGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9EZWxldGVWcG5Db25uZWN0aW9uUm91dGUoKVxuICAgKiAtIC50b0RlbGV0ZVZwbkdhdGV3YXkoKVxuICAgKiAtIC50b0RlcHJvdmlzaW9uQnlvaXBDaWRyKClcbiAgICogLSAudG9EZXByb3Zpc2lvbklwYW1CeW9hc24oKVxuICAgKiAtIC50b0RlcHJvdmlzaW9uSXBhbVBvb2xDaWRyKClcbiAgICogLSAudG9EZXByb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkcigpXG4gICAqIC0gLnRvRGVyZWdpc3RlckltYWdlKClcbiAgICogLSAudG9EZXJlZ2lzdGVySW5zdGFuY2VFdmVudE5vdGlmaWNhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzKClcbiAgICogLSAudG9EZXNjcmliZUFjY291bnRBdHRyaWJ1dGVzKClcbiAgICogLSAudG9EZXNjcmliZUFkZHJlc3NUcmFuc2ZlcnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQWRkcmVzc2VzKClcbiAgICogLSAudG9EZXNjcmliZUFkZHJlc3Nlc0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVBZ2dyZWdhdGVJZEZvcm1hdCgpXG4gICAqIC0gLnRvRGVzY3JpYmVBdmFpbGFiaWxpdHlab25lcygpXG4gICAqIC0gLnRvRGVzY3JpYmVBd3NOZXR3b3JrUGVyZm9ybWFuY2VNZXRyaWNTdWJzY3JpcHRpb25zKClcbiAgICogLSAudG9EZXNjcmliZUJ1bmRsZVRhc2tzKClcbiAgICogLSAudG9EZXNjcmliZUJ5b2lwQ2lkcnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbkhpc3RvcnkoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eUJsb2NrT2ZmZXJpbmdzKClcbiAgICogLSAudG9EZXNjcmliZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nUmVxdWVzdHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXBhY2l0eVJlc2VydmF0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYXJyaWVyR2F0ZXdheXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xhc3NpY0xpbmtJbnN0YW5jZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuQXV0aG9yaXphdGlvblJ1bGVzKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwbkNvbm5lY3Rpb25zKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwbkVuZHBvaW50cygpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5Sb3V0ZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuVGFyZ2V0TmV0d29ya3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ29pcFBvb2xzKClcbiAgICogLSAudG9EZXNjcmliZUNvbnZlcnNpb25UYXNrcygpXG4gICAqIC0gLnRvRGVzY3JpYmVDdXN0b21lckdhdGV3YXlzKClcbiAgICogLSAudG9EZXNjcmliZURlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnRzKClcbiAgICogLSAudG9EZXNjcmliZURoY3BPcHRpb25zKClcbiAgICogLSAudG9EZXNjcmliZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXlzKClcbiAgICogLSAudG9EZXNjcmliZUVsYXN0aWNHcHVzKClcbiAgICogLSAudG9EZXNjcmliZUV4cG9ydEltYWdlVGFza3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlRXhwb3J0VGFza3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlRmFzdExhdW5jaEltYWdlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVGYXN0U25hcHNob3RSZXN0b3JlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVGbGVldEhpc3RvcnkoKVxuICAgKiAtIC50b0Rlc2NyaWJlRmxlZXRJbnN0YW5jZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlRmxlZXRzKClcbiAgICogLSAudG9EZXNjcmliZUZsb3dMb2dzKClcbiAgICogLSAudG9EZXNjcmliZUZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVGcGdhSW1hZ2VzKClcbiAgICogLSAudG9EZXNjcmliZUhvc3RSZXNlcnZhdGlvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVIb3N0UmVzZXJ2YXRpb25zKClcbiAgICogLSAudG9EZXNjcmliZUhvc3RzKClcbiAgICogLSAudG9EZXNjcmliZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVJZEZvcm1hdCgpXG4gICAqIC0gLnRvRGVzY3JpYmVJZGVudGl0eUlkRm9ybWF0KClcbiAgICogLSAudG9EZXNjcmliZUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9EZXNjcmliZUltYWdlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbXBvcnRJbWFnZVRhc2tzKClcbiAgICogLSAudG9EZXNjcmliZUltcG9ydFNuYXBzaG90VGFza3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnRzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VFdmVudE5vdGlmaWNhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VFdmVudFdpbmRvd3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VJbWFnZU1ldGFkYXRhKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlU3RhdHVzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlVG9wb2xvZ3koKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VUeXBlT2ZmZXJpbmdzKClcbiAgICogLSAudG9EZXNjcmliZUluc3RhbmNlVHlwZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VzKClcbiAgICogLSAudG9EZXNjcmliZUludGVybmV0R2F0ZXdheXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSXBhbUJ5b2FzbigpXG4gICAqIC0gLnRvRGVzY3JpYmVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VucygpXG4gICAqIC0gLnRvRGVzY3JpYmVJcGFtUG9vbHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJpZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSXBhbVJlc291cmNlRGlzY292ZXJ5QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9EZXNjcmliZUlwYW1TY29wZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSXBhbXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlSXB2NlBvb2xzKClcbiAgICogLSAudG9EZXNjcmliZUtleVBhaXJzKClcbiAgICogLSAudG9EZXNjcmliZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlTGF1bmNoVGVtcGxhdGVzKClcbiAgICogLSAudG9EZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9EZXNjcmliZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlTG9jYWxHYXRld2F5Um91dGVUYWJsZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwcygpXG4gICAqIC0gLnRvRGVzY3JpYmVMb2NhbEdhdGV3YXlWaXJ0dWFsSW50ZXJmYWNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVMb2NhbEdhdGV3YXlzKClcbiAgICogLSAudG9EZXNjcmliZUxvY2tlZFNuYXBzaG90cygpXG4gICAqIC0gLnRvRGVzY3JpYmVNYWNIb3N0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVNYW5hZ2VkUHJlZml4TGlzdHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlTW92aW5nQWRkcmVzc2VzKClcbiAgICogLSAudG9EZXNjcmliZU5hdEdhdGV3YXlzKClcbiAgICogLSAudG9EZXNjcmliZU5ldHdvcmtBY2xzKClcbiAgICogLSAudG9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQW5hbHlzZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVzKClcbiAgICogLSAudG9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c0FuYWx5c2VzKClcbiAgICogLSAudG9EZXNjcmliZU5ldHdvcmtJbnNpZ2h0c1BhdGhzKClcbiAgICogLSAudG9EZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb25zKClcbiAgICogLSAudG9EZXNjcmliZU5ldHdvcmtJbnRlcmZhY2VzKClcbiAgICogLSAudG9EZXNjcmliZU91dHBvc3RMYWdzKClcbiAgICogLSAudG9EZXNjcmliZVBsYWNlbWVudEdyb3VwcygpXG4gICAqIC0gLnRvRGVzY3JpYmVQcmVmaXhMaXN0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVQcmluY2lwYWxJZEZvcm1hdCgpXG4gICAqIC0gLnRvRGVzY3JpYmVQdWJsaWNJcHY0UG9vbHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlUmVnaW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVSZXBsYWNlUm9vdFZvbHVtZVRhc2tzKClcbiAgICogLSAudG9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzKClcbiAgICogLSAudG9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzTGlzdGluZ3MoKVxuICAgKiAtIC50b0Rlc2NyaWJlUmVzZXJ2ZWRJbnN0YW5jZXNNb2RpZmljYXRpb25zKClcbiAgICogLSAudG9EZXNjcmliZVJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmdzKClcbiAgICogLSAudG9EZXNjcmliZVJvdXRlU2VydmVyRW5kcG9pbnRzKClcbiAgICogLSAudG9EZXNjcmliZVJvdXRlU2VydmVyUGVlcnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlUm91dGVTZXJ2ZXJzKClcbiAgICogLSAudG9EZXNjcmliZVJvdXRlVGFibGVzKClcbiAgICogLSAudG9EZXNjcmliZVNjaGVkdWxlZEluc3RhbmNlQXZhaWxhYmlsaXR5KClcbiAgICogLSAudG9EZXNjcmliZVNjaGVkdWxlZEluc3RhbmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVTZWN1cml0eUdyb3VwUmVmZXJlbmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVTZWN1cml0eUdyb3VwUnVsZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlU2VjdXJpdHlHcm91cFZwY0Fzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVTZWN1cml0eUdyb3VwcygpXG4gICAqIC0gLnRvRGVzY3JpYmVTZXJ2aWNlTGlua1ZpcnR1YWxJbnRlcmZhY2VzKClcbiAgICogLSAudG9EZXNjcmliZVNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9EZXNjcmliZVNuYXBzaG90VGllclN0YXR1cygpXG4gICAqIC0gLnRvRGVzY3JpYmVTbmFwc2hvdHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlU3BvdERhdGFmZWVkU3Vic2NyaXB0aW9uKClcbiAgICogLSAudG9EZXNjcmliZVNwb3RGbGVldEluc3RhbmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0SGlzdG9yeSgpXG4gICAqIC0gLnRvRGVzY3JpYmVTcG90RmxlZXRSZXF1ZXN0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVTcG90SW5zdGFuY2VSZXF1ZXN0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVTcG90UHJpY2VIaXN0b3J5KClcbiAgICogLSAudG9EZXNjcmliZVN0YWxlU2VjdXJpdHlHcm91cHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlU3RvcmVJbWFnZVRhc2tzKClcbiAgICogLSAudG9EZXNjcmliZVN1Ym5ldHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVGFncygpXG4gICAqIC0gLnRvRGVzY3JpYmVUcmFmZmljTWlycm9yRmlsdGVyUnVsZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhZmZpY01pcnJvckZpbHRlcnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhZmZpY01pcnJvclNlc3Npb25zKClcbiAgICogLSAudG9EZXNjcmliZVRyYWZmaWNNaXJyb3JUYXJnZXRzKClcbiAgICogLSAudG9EZXNjcmliZVRyYW5zaXRHYXRld2F5QXR0YWNobWVudHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlDb25uZWN0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50cygpXG4gICAqIC0gLnRvRGVzY3JpYmVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVzKClcbiAgICogLSAudG9EZXNjcmliZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudHMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVHJhbnNpdEdhdGV3YXlzKClcbiAgICogLSAudG9EZXNjcmliZVRydW5rSW50ZXJmYWNlQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRzKClcbiAgICogLSAudG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzR3JvdXBzKClcbiAgICogLSAudG9EZXNjcmliZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VMb2dnaW5nQ29uZmlndXJhdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVWZXJpZmllZEFjY2Vzc0luc3RhbmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXJzKClcbiAgICogLSAudG9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWb2x1bWVTdGF0dXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVm9sdW1lcygpXG4gICAqIC0gLnRvRGVzY3JpYmVWb2x1bWVzTW9kaWZpY2F0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb25zKClcbiAgICogLSAudG9EZXNjcmliZVZwY0Jsb2NrUHVibGljQWNjZXNzT3B0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNDbGFzc2ljTGluaygpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjRW5kcG9pbnRBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNFbmRwb2ludENvbm5lY3Rpb25zKClcbiAgICogLSAudG9EZXNjcmliZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb25zKClcbiAgICogLSAudG9EZXNjcmliZVZwY0VuZHBvaW50U2VydmljZVBlcm1pc3Npb25zKClcbiAgICogLSAudG9EZXNjcmliZVZwY0VuZHBvaW50U2VydmljZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjRW5kcG9pbnRzKClcbiAgICogLSAudG9EZXNjcmliZVZwY1BlZXJpbmdDb25uZWN0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNzKClcbiAgICogLSAudG9EZXNjcmliZVZwbkNvbm5lY3Rpb25zKClcbiAgICogLSAudG9EZXNjcmliZVZwbkdhdGV3YXlzKClcbiAgICogLSAudG9EZXRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvRGV0YWNoSW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZXRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGV0YWNoVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvRGlzYWJsZUFkZHJlc3NUcmFuc2ZlcigpXG4gICAqIC0gLnRvRGlzYWJsZUFsbG93ZWRJbWFnZXNTZXR0aW5ncygpXG4gICAqIC0gLnRvRGlzYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbigpXG4gICAqIC0gLnRvRGlzYWJsZUVic0VuY3J5cHRpb25CeURlZmF1bHQoKVxuICAgKiAtIC50b0Rpc2FibGVGYXN0TGF1bmNoKClcbiAgICogLSAudG9EaXNhYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZSgpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlQmxvY2tQdWJsaWNBY2Nlc3MoKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0Rpc2FibGVJcGFtT3JnYW5pemF0aW9uQWRtaW5BY2NvdW50KClcbiAgICogLSAudG9EaXNhYmxlUm91dGVTZXJ2ZXJQcm9wYWdhdGlvbigpXG4gICAqIC0gLnRvRGlzYWJsZVNlcmlhbENvbnNvbGVBY2Nlc3MoKVxuICAgKiAtIC50b0Rpc2FibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzKClcbiAgICogLSAudG9EaXNhYmxlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlVnBjQ2xhc3NpY0xpbmsoKVxuICAgKiAtIC50b0Rpc2FibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSXBhbUJ5b2FzbigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVHJ1bmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2woKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVZwY0NpZHJCbG9jaygpXG4gICAqIC0gLnRvRW5hYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9FbmFibGVBbGxvd2VkSW1hZ2VzU2V0dGluZ3MoKVxuICAgKiAtIC50b0VuYWJsZUF3c05ldHdvcmtQZXJmb3JtYW5jZU1ldHJpY1N1YnNjcmlwdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlRWJzRW5jcnlwdGlvbkJ5RGVmYXVsdCgpXG4gICAqIC0gLnRvRW5hYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRW5hYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0VuYWJsZUltYWdlKClcbiAgICogLSAudG9FbmFibGVJbWFnZUJsb2NrUHVibGljQWNjZXNzKClcbiAgICogLSAudG9FbmFibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9FbmFibGVJbWFnZURlcmVnaXN0cmF0aW9uUHJvdGVjdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlSXBhbU9yZ2FuaXphdGlvbkFkbWluQWNjb3VudCgpXG4gICAqIC0gLnRvRW5hYmxlUmVhY2hhYmlsaXR5QW5hbHl6ZXJPcmdhbml6YXRpb25TaGFyaW5nKClcbiAgICogLSAudG9FbmFibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVTZXJpYWxDb25zb2xlQWNjZXNzKClcbiAgICogLSAudG9FbmFibGVTbmFwc2hvdEJsb2NrUHVibGljQWNjZXNzKClcbiAgICogLSAudG9FbmFibGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlVmd3Um91dGVQcm9wYWdhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlVm9sdW1lSU8oKVxuICAgKiAtIC50b0VuYWJsZVZwY0NsYXNzaWNMaW5rKClcbiAgICogLSAudG9FbmFibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQoKVxuICAgKiAtIC50b0V4cG9ydENsaWVudFZwbkNsaWVudENlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QoKVxuICAgKiAtIC50b0V4cG9ydENsaWVudFZwbkNsaWVudENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0V4cG9ydEltYWdlKClcbiAgICogLSAudG9FeHBvcnRUcmFuc2l0R2F0ZXdheVJvdXRlcygpXG4gICAqIC0gLnRvRXhwb3J0VmVyaWZpZWRBY2Nlc3NJbnN0YW5jZUNsaWVudENvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldEFsbG93ZWRJbWFnZXNTZXR0aW5ncygpXG4gICAqIC0gLnRvR2V0QXNzb2NpYXRlZEVuY2xhdmVDZXJ0aWZpY2F0ZUlhbVJvbGVzKClcbiAgICogLSAudG9HZXRBc3NvY2lhdGVkSXB2NlBvb2xDaWRycygpXG4gICAqIC0gLnRvR2V0QXdzTmV0d29ya1BlcmZvcm1hbmNlRGF0YSgpXG4gICAqIC0gLnRvR2V0Q2FwYWNpdHlSZXNlcnZhdGlvblVzYWdlKClcbiAgICogLSAudG9HZXRDb2lwUG9vbFVzYWdlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0RGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydFN1bW1hcnkoKVxuICAgKiAtIC50b0dldERlZmF1bHRDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9HZXRFYnNEZWZhdWx0S21zS2V5SWQoKVxuICAgKiAtIC50b0dldEVic0VuY3J5cHRpb25CeURlZmF1bHQoKVxuICAgKiAtIC50b0dldEZsb3dMb2dzSW50ZWdyYXRpb25UZW1wbGF0ZSgpXG4gICAqIC0gLnRvR2V0R3JvdXBzRm9yQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvR2V0SG9zdFJlc2VydmF0aW9uUHVyY2hhc2VQcmV2aWV3KClcbiAgICogLSAudG9HZXRJbWFnZUJsb2NrUHVibGljQWNjZXNzU3RhdGUoKVxuICAgKiAtIC50b0dldEluc3RhbmNlTWV0YWRhdGFEZWZhdWx0cygpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUeXBlc0Zyb21JbnN0YW5jZVJlcXVpcmVtZW50cygpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0SXBhbUFkZHJlc3NIaXN0b3J5KClcbiAgICogLSAudG9HZXRJcGFtRGlzY292ZXJlZEFjY291bnRzKClcbiAgICogLSAudG9HZXRJcGFtRGlzY292ZXJlZFB1YmxpY0FkZHJlc3NlcygpXG4gICAqIC0gLnRvR2V0SXBhbURpc2NvdmVyZWRSZXNvdXJjZUNpZHJzKClcbiAgICogLSAudG9HZXRJcGFtUG9vbEFsbG9jYXRpb25zKClcbiAgICogLSAudG9HZXRJcGFtUG9vbENpZHJzKClcbiAgICogLSAudG9HZXRJcGFtUmVzb3VyY2VDaWRycygpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRNYW5hZ2VkUHJlZml4TGlzdEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvR2V0TWFuYWdlZFByZWZpeExpc3RFbnRyaWVzKClcbiAgICogLSAudG9HZXROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzRmluZGluZ3MoKVxuICAgKiAtIC50b0dldE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQ29udGVudCgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9HZXRSZXNlcnZlZEluc3RhbmNlc0V4Y2hhbmdlUXVvdGUoKVxuICAgKiAtIC50b0dldFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9HZXRSb3V0ZVNlcnZlckFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvR2V0Um91dGVTZXJ2ZXJQcm9wYWdhdGlvbnMoKVxuICAgKiAtIC50b0dldFJvdXRlU2VydmVyUm91dGluZ0RhdGFiYXNlKClcbiAgICogLSAudG9HZXRTZWN1cml0eUdyb3Vwc0ZvclZwYygpXG4gICAqIC0gLnRvR2V0U2VyaWFsQ29uc29sZUFjY2Vzc1N0YXR1cygpXG4gICAqIC0gLnRvR2V0U25hcHNob3RCbG9ja1B1YmxpY0FjY2Vzc1N0YXRlKClcbiAgICogLSAudG9HZXRTcG90UGxhY2VtZW50U2NvcmVzKClcbiAgICogLSAudG9HZXRTdWJuZXRDaWRyUmVzZXJ2YXRpb25zKClcbiAgICogLSAudG9HZXRUcmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRQcm9wYWdhdGlvbnMoKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9HZXRUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9HZXRUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlRW50cmllcygpXG4gICAqIC0gLnRvR2V0VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlcygpXG4gICAqIC0gLnRvR2V0VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9HZXRUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbnMoKVxuICAgKiAtIC50b0dldFZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3koKVxuICAgKiAtIC50b0dldFZlcmlmaWVkQWNjZXNzRW5kcG9pbnRUYXJnZXRzKClcbiAgICogLSAudG9HZXRWZXJpZmllZEFjY2Vzc0dyb3VwUG9saWN5KClcbiAgICogLSAudG9HZXRWZXJpZmllZEFjY2Vzc0luc3RhbmNlV2ViQWNsKClcbiAgICogLSAudG9HZXRWcG5Db25uZWN0aW9uRGV2aWNlU2FtcGxlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VnBuQ29ubmVjdGlvbkRldmljZVR5cGVzKClcbiAgICogLSAudG9HZXRWcG5UdW5uZWxSZXBsYWNlbWVudFN0YXR1cygpXG4gICAqIC0gLnRvSW1wb3J0QnlvaXBDaWRyVG9JcGFtKClcbiAgICogLSAudG9JbXBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9JbXBvcnRJbWFnZSgpXG4gICAqIC0gLnRvSW1wb3J0SW5zdGFuY2UoKVxuICAgKiAtIC50b0ltcG9ydEtleVBhaXIoKVxuICAgKiAtIC50b0ltcG9ydFNuYXBzaG90KClcbiAgICogLSAudG9JbXBvcnRWb2x1bWUoKVxuICAgKiAtIC50b0luamVjdEFwaUVycm9yKClcbiAgICogLSAudG9MaXN0SW1hZ2VzSW5SZWN5Y2xlQmluKClcbiAgICogLSAudG9MaXN0U25hcHNob3RzSW5SZWN5Y2xlQmluKClcbiAgICogLSAudG9Mb2NrU25hcHNob3QoKVxuICAgKiAtIC50b01vZGlmeUFkZHJlc3NBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUF2YWlsYWJpbGl0eVpvbmVHcm91cCgpXG4gICAqIC0gLnRvTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5Q2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0KClcbiAgICogLSAudG9Nb2RpZnlDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvTW9kaWZ5RGVmYXVsdENyZWRpdFNwZWNpZmljYXRpb24oKVxuICAgKiAtIC50b01vZGlmeUVic0RlZmF1bHRLbXNLZXlJZCgpXG4gICAqIC0gLnRvTW9kaWZ5RmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SG9zdHMoKVxuICAgKiAtIC50b01vZGlmeUlkRm9ybWF0KClcbiAgICogLSAudG9Nb2RpZnlJZGVudGl0eUlkRm9ybWF0KClcbiAgICogLSAudG9Nb2RpZnlJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ2FwYWNpdHlSZXNlcnZhdGlvbkF0dHJpYnV0ZXMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3B1T3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcmVkaXRTcGVjaWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50U3RhcnRUaW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUV2ZW50V2luZG93KClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1haW50ZW5hbmNlT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNZXRhZGF0YURlZmF1bHRzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZVBsYWNlbWVudCgpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbSgpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbVBvb2woKVxuICAgKiAtIC50b01vZGlmeUlwYW1SZXNvdXJjZUNpZHIoKVxuICAgKiAtIC50b01vZGlmeUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbVNjb3BlKClcbiAgICogLSAudG9Nb2RpZnlMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b01vZGlmeU1hbmFnZWRQcmVmaXhMaXN0KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeVJlc2VydmVkSW5zdGFuY2VzKClcbiAgICogLSAudG9Nb2RpZnlSb3V0ZVNlcnZlcigpXG4gICAqIC0gLnRvTW9kaWZ5U2VjdXJpdHlHcm91cFJ1bGVzKClcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RUaWVyKClcbiAgICogLSAudG9Nb2RpZnlTcG90RmxlZXRSZXF1ZXN0KClcbiAgICogLSAudG9Nb2RpZnlTdWJuZXRBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVRyYWZmaWNNaXJyb3JGaWx0ZXJOZXR3b3JrU2VydmljZXMoKVxuICAgKiAtIC50b01vZGlmeVRyYWZmaWNNaXJyb3JGaWx0ZXJSdWxlKClcbiAgICogLSAudG9Nb2RpZnlUcmFmZmljTWlycm9yU2Vzc2lvbigpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXkoKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50UG9saWN5KClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0dyb3VwKClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0dyb3VwUG9saWN5KClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0luc3RhbmNlKClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0luc3RhbmNlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcigpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVZwY0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24oKVxuICAgKiAtIC50b01vZGlmeVZwY0Jsb2NrUHVibGljQWNjZXNzT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGF5ZXJSZXNwb25zaWJpbGl0eSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b01vZGlmeVZwY1BlZXJpbmdDb25uZWN0aW9uT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjVGVuYW5jeSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbk9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbENlcnRpZmljYXRlKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICogLSAudG9Nb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9Nb3ZlQWRkcmVzc1RvVnBjKClcbiAgICogLSAudG9Nb3ZlQnlvaXBDaWRyVG9JcGFtKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUHJvdmlzaW9uQnlvaXBDaWRyKClcbiAgICogLSAudG9Qcm92aXNpb25JcGFtQnlvYXNuKClcbiAgICogLSAudG9Qcm92aXNpb25JcGFtUG9vbENpZHIoKVxuICAgKiAtIC50b1Byb3Zpc2lvblB1YmxpY0lwdjRQb29sQ2lkcigpXG4gICAqIC0gLnRvUHVyY2hhc2VDYXBhY2l0eUJsb2NrKClcbiAgICogLSAudG9QdXJjaGFzZUNhcGFjaXR5QmxvY2tFeHRlbnNpb24oKVxuICAgKiAtIC50b1B1cmNoYXNlSG9zdFJlc2VydmF0aW9uKClcbiAgICogLSAudG9QdXJjaGFzZVJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmcoKVxuICAgKiAtIC50b1B1cmNoYXNlU2NoZWR1bGVkSW5zdGFuY2VzKClcbiAgICogLSAudG9QdXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZWdpc3RlckltYWdlKClcbiAgICogLSAudG9SZWdpc3Rlckluc3RhbmNlRXZlbnROb3RpZmljYXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvUmVqZWN0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvUmVqZWN0VnBjRW5kcG9pbnRDb25uZWN0aW9ucygpXG4gICAqIC0gLnRvUmVqZWN0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b1JlbGVhc2VBZGRyZXNzKClcbiAgICogLSAudG9SZWxlYXNlSG9zdHMoKVxuICAgKiAtIC50b1JlbGVhc2VJcGFtUG9vbEFsbG9jYXRpb24oKVxuICAgKiAtIC50b1JlcGxhY2VJYW1JbnN0YW5jZVByb2ZpbGVBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZUltYWdlQ3JpdGVyaWFJbkFsbG93ZWRJbWFnZXNTZXR0aW5ncygpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqIC0gLnRvUmVwbGFjZVJvdXRlKClcbiAgICogLSAudG9SZXBsYWNlUm91dGVUYWJsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXBsYWNlVHJhbnNpdEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvUmVwbGFjZVZwblR1bm5lbCgpXG4gICAqIC0gLnRvUmVwb3J0SW5zdGFuY2VTdGF0dXMoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXNldEFkZHJlc3NBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0RWJzRGVmYXVsdEttc0tleUlkKClcbiAgICogLSAudG9SZXNldEZwZ2FJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXROZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXNldFNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9SZXN0b3JlQWRkcmVzc1RvQ2xhc3NpYygpXG4gICAqIC0gLnRvUmVzdG9yZUltYWdlRnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1Jlc3RvcmVNYW5hZ2VkUHJlZml4TGlzdFZlcnNpb24oKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdEZyb21SZWN5Y2xlQmluKClcbiAgICogLSAudG9SZXN0b3JlU25hcHNob3RUaWVyKClcbiAgICogLSAudG9SZXZva2VDbGllbnRWcG5JbmdyZXNzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9SdW5TY2hlZHVsZWRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlYXJjaExvY2FsR2F0ZXdheVJvdXRlcygpXG4gICAqIC0gLnRvU2VhcmNoVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cHMoKVxuICAgKiAtIC50b1NlYXJjaFRyYW5zaXRHYXRld2F5Um91dGVzKClcbiAgICogLSAudG9TZW5kRGlhZ25vc3RpY0ludGVycnVwdCgpXG4gICAqIC0gLnRvU2VuZFNwb3RJbnN0YW5jZUludGVycnVwdGlvbnMoKVxuICAgKiAtIC50b1N0YXJ0RGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydCgpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0YXJ0TmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcygpXG4gICAqIC0gLnRvU3RhcnROZXR3b3JrSW5zaWdodHNBbmFseXNpcygpXG4gICAqIC0gLnRvU3RhcnRWcGNFbmRwb2ludFNlcnZpY2VQcml2YXRlRG5zVmVyaWZpY2F0aW9uKClcbiAgICogLSAudG9TdG9wSW5zdGFuY2VzKClcbiAgICogLSAudG9UZXJtaW5hdGVDbGllbnRWcG5Db25uZWN0aW9ucygpXG4gICAqIC0gLnRvVGVybWluYXRlSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmFzc2lnbklwdjZBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICogLSAudG9VbmFzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvVW5sb2NrU25hcHNob3QoKVxuICAgKiAtIC50b1VubW9uaXRvckluc3RhbmNlcygpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNFZ3Jlc3MoKVxuICAgKiAtIC50b1VwZGF0ZVNlY3VyaXR5R3JvdXBSdWxlRGVzY3JpcHRpb25zSW5ncmVzcygpXG4gICAqIC0gLnRvV2l0aGRyYXdCeW9pcENpZHIoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGVsYXN0aWMtaXBcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvbi1mbGVldFxuICAgKiAtIGNhcGFjaXR5LXJlc2VydmF0aW9uXG4gICAqIC0gY2Fycmllci1nYXRld2F5XG4gICAqIC0gY2xpZW50LXZwbi1lbmRwb2ludFxuICAgKiAtIGN1c3RvbWVyLWdhdGV3YXlcbiAgICogLSBkZWNsYXJhdGl2ZS1wb2xpY2llcy1yZXBvcnRcbiAgICogLSBkZWRpY2F0ZWQtaG9zdFxuICAgKiAtIGRoY3Atb3B0aW9uc1xuICAgKiAtIGVncmVzcy1vbmx5LWludGVybmV0LWdhdGV3YXlcbiAgICogLSBlbGFzdGljLWdwdVxuICAgKiAtIGV4cG9ydC1pbWFnZS10YXNrXG4gICAqIC0gZXhwb3J0LWluc3RhbmNlLXRhc2tcbiAgICogLSBmbGVldFxuICAgKiAtIGZwZ2EtaW1hZ2VcbiAgICogLSBob3N0LXJlc2VydmF0aW9uXG4gICAqIC0gaW1hZ2VcbiAgICogLSBpbXBvcnQtaW1hZ2UtdGFza1xuICAgKiAtIGltcG9ydC1zbmFwc2hvdC10YXNrXG4gICAqIC0gaW5zdGFuY2UtY29ubmVjdC1lbmRwb2ludFxuICAgKiAtIGluc3RhbmNlLWV2ZW50LXdpbmRvd1xuICAgKiAtIGluc3RhbmNlXG4gICAqIC0gaW50ZXJuZXQtZ2F0ZXdheVxuICAgKiAtIGlwYW0tZXh0ZXJuYWwtcmVzb3VyY2UtdmVyaWZpY2F0aW9uLXRva2VuXG4gICAqIC0gaXBhbVxuICAgKiAtIGlwYW0tcG9vbFxuICAgKiAtIGlwYW0tcmVzb3VyY2UtZGlzY292ZXJ5LWFzc29jaWF0aW9uXG4gICAqIC0gaXBhbS1yZXNvdXJjZS1kaXNjb3ZlcnlcbiAgICogLSBpcGFtLXNjb3BlXG4gICAqIC0gY29pcC1wb29sXG4gICAqIC0gaXB2NHBvb2wtZWMyXG4gICAqIC0gaXB2NnBvb2wtZWMyXG4gICAqIC0ga2V5LXBhaXJcbiAgICogLSBsYXVuY2gtdGVtcGxhdGVcbiAgICogLSBsb2NhbC1nYXRld2F5XG4gICAqIC0gbG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZS12aXJ0dWFsLWludGVyZmFjZS1ncm91cC1hc3NvY2lhdGlvblxuICAgKiAtIGxvY2FsLWdhdGV3YXktcm91dGUtdGFibGUtdnBjLWFzc29jaWF0aW9uXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS1yb3V0ZS10YWJsZVxuICAgKiAtIGxvY2FsLWdhdGV3YXktdmlydHVhbC1pbnRlcmZhY2UtZ3JvdXBcbiAgICogLSBsb2NhbC1nYXRld2F5LXZpcnR1YWwtaW50ZXJmYWNlXG4gICAqIC0gbmF0Z2F0ZXdheVxuICAgKiAtIG5ldHdvcmstYWNsXG4gICAqIC0gbmV0d29yay1pbnNpZ2h0cy1hY2Nlc3Mtc2NvcGUtYW5hbHlzaXNcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLWFjY2Vzcy1zY29wZVxuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtYW5hbHlzaXNcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLXBhdGhcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKiAtIG91dHBvc3QtbGFnXG4gICAqIC0gcGxhY2VtZW50LWdyb3VwXG4gICAqIC0gcHJlZml4LWxpc3RcbiAgICogLSByZXBsYWNlLXJvb3Qtdm9sdW1lLXRhc2tcbiAgICogLSByZXNlcnZlZC1pbnN0YW5jZXNcbiAgICogLSByb3V0ZS1zZXJ2ZXItZW5kcG9pbnRcbiAgICogLSByb3V0ZS1zZXJ2ZXJcbiAgICogLSByb3V0ZS1zZXJ2ZXItcGVlclxuICAgKiAtIHJvdXRlLXRhYmxlXG4gICAqIC0gc2VjdXJpdHktZ3JvdXBcbiAgICogLSBzZWN1cml0eS1ncm91cC1ydWxlXG4gICAqIC0gc25hcHNob3RcbiAgICogLSBzcG90LWZsZWV0LXJlcXVlc3RcbiAgICogLSBzcG90LWluc3RhbmNlcy1yZXF1ZXN0XG4gICAqIC0gc3VibmV0LWNpZHItcmVzZXJ2YXRpb25cbiAgICogLSBzdWJuZXRcbiAgICogLSB0cmFmZmljLW1pcnJvci1maWx0ZXJcbiAgICogLSB0cmFmZmljLW1pcnJvci1maWx0ZXItcnVsZVxuICAgKiAtIHRyYWZmaWMtbWlycm9yLXNlc3Npb25cbiAgICogLSB0cmFmZmljLW1pcnJvci10YXJnZXRcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktYXR0YWNobWVudFxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1jb25uZWN0LXBlZXJcbiAgICogLSB0cmFuc2l0LWdhdGV3YXlcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktbXVsdGljYXN0LWRvbWFpblxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1wb2xpY3ktdGFibGVcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktcm91dGUtdGFibGUtYW5ub3VuY2VtZW50XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlXG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWVuZHBvaW50XG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLWVuZHBvaW50LXRhcmdldFxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1ncm91cFxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1pbnN0YW5jZVxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1wb2xpY3lcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtdHJ1c3QtcHJvdmlkZXJcbiAgICogLSB2b2x1bWVcbiAgICogLSB2cGMtYmxvY2stcHVibGljLWFjY2Vzcy1leGNsdXNpb25cbiAgICogLSB2cGMtZW5kcG9pbnQtY29ubmVjdGlvblxuICAgKiAtIHZwYy1lbmRwb2ludFxuICAgKiAtIHZwYy1lbmRwb2ludC1zZXJ2aWNlXG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2UtcGVybWlzc2lvblxuICAgKiAtIHZwYy1mbG93LWxvZ1xuICAgKiAtIHZwY1xuICAgKiAtIHZwYy1wZWVyaW5nLWNvbm5lY3Rpb25cbiAgICogLSB2cG4tY29ubmVjdGlvbi1kZXZpY2UtdHlwZVxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqIC0gdnBuLWdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZSZWdpb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFJlZ2lvbmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBwZXJjZW50YWdlIG9mIGluY3JlYXNlIG9mIHRoZSByZWtleSB3aW5kb3cgKGRldGVybWluZWQgYnkgdGhlIHJla2V5IG1hcmdpbiB0aW1lKSB3aXRoaW4gd2hpY2ggdGhlIHJla2V5IHRpbWUgaXMgcmFuZG9tbHkgc2VsZWN0ZWQgZm9yIGEgVlBOIHR1bm5lbFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBuL2xhdGVzdC9zMnN2cG4vdnBuLWF1dGhlbnRpY2F0aW9uLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW251bWVyaWMgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX051bWVyaWMpLiAqKkRlZmF1bHQ6KiogYE51bWVyaWNFcXVhbHNgXG4gICAqL1xuICBwdWJsaWMgaWZSZWtleUZ1enpQZXJjZW50YWdlKHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZWtleUZ1enpQZXJjZW50YWdlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIG1hcmdpbiB0aW1lIGJlZm9yZSB0aGUgcGhhc2UgMiBsaWZldGltZSBleHBpcmVzIGZvciBhIFZQTiB0dW5uZWxcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Zwbi9sYXRlc3QvczJzdnBuL3Zwbi1hdXRoZW50aWNhdGlvbi1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtudW1lcmljIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19OdW1lcmljKS4gKipEZWZhdWx0OioqIGBOdW1lcmljRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmUmVrZXlNYXJnaW5UaW1lU2Vjb25kcyh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUmVrZXlNYXJnaW5UaW1lU2Vjb25kc2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnTnVtZXJpY0VxdWFscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBncm91cCBiZWluZyByZW1vdmVkIGZyb20gYSBzbmFwc2hvdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gc25hcHNob3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZSZW1vdmVHcm91cCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUmVtb3ZlL2dyb3VwYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGFjY291bnQgaWQgYmVpbmcgcmVtb3ZlZCBmcm9tIGEgc25hcHNob3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVtb3ZlVXNlcklkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZW1vdmUvdXNlcklkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIG51bWJlciBvZiBwYWNrZXRzIGluIGFuIElLRSByZXBsYXkgd2luZG93XG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5Db25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cG4tY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlJlcGxheVdpbmRvd1NpemVQYWNrZXRzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZXBsYXlXaW5kb3dTaXplUGFja2V0c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgYSByZXF1ZXN0ZXIgVlBDIGluIGEgVlBDIHBlZXJpbmcgY29ubmVjdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC9wZWVyaW5nL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZVZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNQZWVyaW5nQ29ubmVjdGlvbk9wdGlvbnMoKVxuICAgKiAtIC50b1JlamVjdFZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cGMtcGVlcmluZy1jb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVxdWVzdGVyVnBjKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZXF1ZXN0ZXJWcGNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgcGF5bWVudCBvcHRpb24gb2YgdGhlIFJlc2VydmVkIEluc3RhbmNlIG9mZmVyaW5nIChObyBVcGZyb250LCBQYXJ0aWFsIFVwZnJvbnQsIG9yIEFsbCBVcGZyb250KVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWMyLXJlc2VydmVkLWluc3RhbmNlcy5odG1sI3JpLXBheW1lbnQtb3B0aW9uc1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvTW9kaWZ5UmVzZXJ2ZWRJbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHJlc2VydmVkLWluc3RhbmNlc1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlJlc2VydmVkSW5zdGFuY2VzT2ZmZXJpbmdUeXBlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZXNlcnZlZEluc3RhbmNlc09mZmVyaW5nVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGEgdGFnIGtleSBhbmQgdmFsdWUgcGFpciBvZiBhIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9jb250cm9sLWFjY2Vzcy13aXRoLXRhZ3MuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0Q2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcnNoaXAoKVxuICAgKiAtIC50b0FjY2VwdFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9BY2NlcHRUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9BY2NlcHRUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0FjY2VwdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0FjY2VwdFZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9BbGxvY2F0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0FsbG9jYXRlSXBhbVBvb2xDaWRyKClcbiAgICogLSAudG9BcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9Bc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b0Fzc2lnblByaXZhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlRGhjcE9wdGlvbnMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9Bc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlVnBjQ2lkckJsb2NrKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXR0YWNoSW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdHRhY2hWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvQXR0YWNoVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvQXV0aG9yaXplQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEVncmVzcygpXG4gICAqIC0gLnRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEluZ3Jlc3MoKVxuICAgKiAtIC50b0NhbmNlbENhcGFjaXR5UmVzZXJ2YXRpb25GbGVldHMoKVxuICAgKiAtIC50b0NhbmNlbERlY2xhcmF0aXZlUG9saWNpZXNSZXBvcnQoKVxuICAgKiAtIC50b0NhbmNlbEV4cG9ydFRhc2soKVxuICAgKiAtIC50b0NhbmNlbEltYWdlTGF1bmNoUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ2FuY2VsSW1wb3J0VGFzaygpXG4gICAqIC0gLnRvQ2FuY2VsU3BvdEZsZWV0UmVxdWVzdHMoKVxuICAgKiAtIC50b0NhbmNlbFNwb3RJbnN0YW5jZVJlcXVlc3RzKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcoKVxuICAgKiAtIC50b0NyZWF0ZUNhcnJpZXJHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0NyZWF0ZUNvaXBDaWRyKClcbiAgICogLSAudG9DcmVhdGVDb2lwUG9vbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29pcFBvb2xQZXJtaXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0NyZWF0ZUltYWdlKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrKClcbiAgICogLSAudG9DcmVhdGVJcGFtRXh0ZXJuYWxSZXNvdXJjZVZlcmlmaWNhdGlvblRva2VuKClcbiAgICogLSAudG9DcmVhdGVJcGFtUG9vbCgpXG4gICAqIC0gLnRvQ3JlYXRlSXBhbVNjb3BlKClcbiAgICogLSAudG9DcmVhdGVMYXVuY2hUZW1wbGF0ZVZlcnNpb24oKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGVUYWJsZVZpcnR1YWxJbnRlcmZhY2VHcm91cEFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2UoKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVZpcnR1YWxJbnRlcmZhY2VHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlTmF0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0FjbCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0FjbEVudHJ5KClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVTZXJ2ZXJFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVTZXJ2ZXJQZWVyKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVTZWN1cml0eUdyb3VwKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVTdG9yZUltYWdlVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlU3VibmV0KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yRmlsdGVyUnVsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhZmZpY01pcnJvclNlc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzR3JvdXAoKVxuICAgKiAtIC50b0NyZWF0ZVZvbHVtZSgpXG4gICAqIC0gLnRvQ3JlYXRlVnBjKClcbiAgICogLSAudG9DcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb25Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlQ2FycmllckdhdGV3YXkoKVxuICAgKiAtIC50b0RlbGV0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlQ29pcENpZHIoKVxuICAgKiAtIC50b0RlbGV0ZUNvaXBQb29sKClcbiAgICogLSAudG9EZWxldGVDb2lwUG9vbFBlcm1pc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZUN1c3RvbWVyR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlRGhjcE9wdGlvbnMoKVxuICAgKiAtIC50b0RlbGV0ZUVncmVzc09ubHlJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0RlbGV0ZUZsZWV0cygpXG4gICAqIC0gLnRvRGVsZXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0RlbGV0ZUZwZ2FJbWFnZSgpXG4gICAqIC0gLnRvRGVsZXRlSW5zdGFuY2VDb25uZWN0RW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZUluc3RhbmNlRXZlbnRXaW5kb3coKVxuICAgKiAtIC50b0RlbGV0ZUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbSgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbUV4dGVybmFsUmVzb3VyY2VWZXJpZmljYXRpb25Ub2tlbigpXG4gICAqIC0gLnRvRGVsZXRlSXBhbVBvb2woKVxuICAgKiAtIC50b0RlbGV0ZUlwYW1SZXNvdXJjZURpc2NvdmVyeSgpXG4gICAqIC0gLnRvRGVsZXRlSXBhbVNjb3BlKClcbiAgICogLSAudG9EZWxldGVLZXlQYWlyKClcbiAgICogLSAudG9EZWxldGVMYXVuY2hUZW1wbGF0ZSgpXG4gICAqIC0gLnRvRGVsZXRlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucygpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVQZXJtaXNzaW9uKClcbiAgICogLSAudG9EZWxldGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVmlydHVhbEludGVyZmFjZUdyb3VwQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZSgpXG4gICAqIC0gLnRvRGVsZXRlTG9jYWxHYXRld2F5VmlydHVhbEludGVyZmFjZUdyb3VwKClcbiAgICogLSAudG9EZWxldGVNYW5hZ2VkUHJlZml4TGlzdCgpXG4gICAqIC0gLnRvRGVsZXRlTmF0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0FjbCgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0FjbEVudHJ5KClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0luc2lnaHRzQWNjZXNzU2NvcGVBbmFseXNpcygpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0luc2lnaHRzQW5hbHlzaXMoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uKClcbiAgICogLSAudG9EZWxldGVQbGFjZW1lbnRHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlUHVibGljSXB2NFBvb2woKVxuICAgKiAtIC50b0RlbGV0ZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZWxldGVSb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlU2VydmVyUGVlcigpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0RlbGV0ZVN1Ym5ldCgpXG4gICAqIC0gLnRvRGVsZXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlVHJhZmZpY01pcnJvckZpbHRlcigpXG4gICAqIC0gLnRvRGVsZXRlVHJhZmZpY01pcnJvckZpbHRlclJ1bGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9EZWxldGVUcmFmZmljTWlycm9yVGFyZ2V0KClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0KClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheUNvbm5lY3RQZWVyKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbigpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc0dyb3VwKClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc0luc3RhbmNlKClcbiAgICogLSAudG9EZWxldGVWZXJpZmllZEFjY2Vzc1RydXN0UHJvdmlkZXIoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVsZXRlVnBjKClcbiAgICogLSAudG9EZWxldGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvRGVsZXRlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucygpXG4gICAqIC0gLnRvRGVsZXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbnMoKVxuICAgKiAtIC50b0RlbGV0ZVZwY0VuZHBvaW50cygpXG4gICAqIC0gLnRvRGVsZXRlVnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZVZwbkNvbm5lY3Rpb25Sb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVwcm92aXNpb25JcGFtQnlvYXNuKClcbiAgICogLSAudG9EZXByb3Zpc2lvbklwYW1Qb29sQ2lkcigpXG4gICAqIC0gLnRvRGVwcm92aXNpb25QdWJsaWNJcHY0UG9vbENpZHIoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5BdXRob3JpemF0aW9uUnVsZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblRhcmdldE5ldHdvcmtzKClcbiAgICogLSAudG9EZXNjcmliZUZsZWV0SGlzdG9yeSgpXG4gICAqIC0gLnRvRGVzY3JpYmVGbGVldEluc3RhbmNlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlU2VjdXJpdHlHcm91cFJlZmVyZW5jZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlU3BvdEZsZWV0SW5zdGFuY2VzKClcbiAgICogLSAudG9EZXNjcmliZVNwb3RGbGVldFJlcXVlc3RIaXN0b3J5KClcbiAgICogLSAudG9EZXNjcmliZVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlcigpXG4gICAqIC0gLnRvRGV0YWNoVm9sdW1lKClcbiAgICogLSAudG9EZXRhY2hWcG5HYXRld2F5KClcbiAgICogLSAudG9EaXNhYmxlQWRkcmVzc1RyYW5zZmVyKClcbiAgICogLSAudG9EaXNhYmxlRmFzdExhdW5jaCgpXG4gICAqIC0gLnRvRGlzYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2UoKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZURlcHJlY2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0Rpc2FibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhYmxlVnBjQ2xhc3NpY0xpbmsoKVxuICAgKiAtIC50b0Rpc2FibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUlhbUluc3RhbmNlUHJvZmlsZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVOYXRHYXRld2F5QWRkcmVzcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlUm91dGVTZXJ2ZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVmVyaWZpZWRBY2Nlc3NJbnN0YW5jZVdlYkFjbCgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVnBjQ2lkckJsb2NrKClcbiAgICogLSAudG9FbmFibGVBZGRyZXNzVHJhbnNmZXIoKVxuICAgKiAtIC50b0VuYWJsZUZhc3RMYXVuY2goKVxuICAgKiAtIC50b0VuYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9FbmFibGVJbWFnZSgpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0VuYWJsZVJvdXRlU2VydmVyUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0VuYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVWb2x1bWVJTygpXG4gICAqIC0gLnRvRW5hYmxlVnBjQ2xhc3NpY0xpbmsoKVxuICAgKiAtIC50b0VuYWJsZVZwY0NsYXNzaWNMaW5rRG5zU3VwcG9ydCgpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRXhwb3J0SW1hZ2UoKVxuICAgKiAtIC50b0V4cG9ydFZlcmlmaWVkQWNjZXNzSW5zdGFuY2VDbGllbnRDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9HZXRDb2lwUG9vbFVzYWdlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0RGVjbGFyYXRpdmVQb2xpY2llc1JlcG9ydFN1bW1hcnkoKVxuICAgKiAtIC50b0dldEZsb3dMb2dzSW50ZWdyYXRpb25UZW1wbGF0ZSgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0SXBhbUFkZHJlc3NIaXN0b3J5KClcbiAgICogLSAudG9HZXRJcGFtRGlzY292ZXJlZEFjY291bnRzKClcbiAgICogLSAudG9HZXRJcGFtRGlzY292ZXJlZFB1YmxpY0FkZHJlc3NlcygpXG4gICAqIC0gLnRvR2V0SXBhbURpc2NvdmVyZWRSZXNvdXJjZUNpZHJzKClcbiAgICogLSAudG9HZXRJcGFtUG9vbEFsbG9jYXRpb25zKClcbiAgICogLSAudG9HZXRJcGFtUG9vbENpZHJzKClcbiAgICogLSAudG9HZXRJcGFtUmVzb3VyY2VDaWRycygpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRNYW5hZ2VkUHJlZml4TGlzdEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvR2V0TWFuYWdlZFByZWZpeExpc3RFbnRyaWVzKClcbiAgICogLSAudG9HZXROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzRmluZGluZ3MoKVxuICAgKiAtIC50b0dldE5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlQ29udGVudCgpXG4gICAqIC0gLnRvR2V0UGFzc3dvcmREYXRhKClcbiAgICogLSAudG9HZXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvR2V0Um91dGVTZXJ2ZXJBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0dldFJvdXRlU2VydmVyUHJvcGFnYXRpb25zKClcbiAgICogLSAudG9HZXRSb3V0ZVNlcnZlclJvdXRpbmdEYXRhYmFzZSgpXG4gICAqIC0gLnRvR2V0U2VjdXJpdHlHcm91cHNGb3JWcGMoKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9HZXRUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9HZXRUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlRW50cmllcygpXG4gICAqIC0gLnRvR2V0VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFBvbGljeSgpXG4gICAqIC0gLnRvR2V0VmVyaWZpZWRBY2Nlc3NFbmRwb2ludFRhcmdldHMoKVxuICAgKiAtIC50b0dldFZlcmlmaWVkQWNjZXNzR3JvdXBQb2xpY3koKVxuICAgKiAtIC50b0dldFZlcmlmaWVkQWNjZXNzSW5zdGFuY2VXZWJBY2woKVxuICAgKiAtIC50b0dldFZwbkNvbm5lY3Rpb25EZXZpY2VTYW1wbGVDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9HZXRWcG5UdW5uZWxSZXBsYWNlbWVudFN0YXR1cygpXG4gICAqIC0gLnRvSW1wb3J0QnlvaXBDaWRyVG9JcGFtKClcbiAgICogLSAudG9JbXBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9JbXBvcnRJbWFnZSgpXG4gICAqIC0gLnRvSW1wb3J0SW5zdGFuY2UoKVxuICAgKiAtIC50b0ltcG9ydFZvbHVtZSgpXG4gICAqIC0gLnRvTG9ja1NuYXBzaG90KClcbiAgICogLSAudG9Nb2RpZnlBZGRyZXNzQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlDYXBhY2l0eVJlc2VydmF0aW9uRmxlZXQoKVxuICAgKiAtIC50b01vZGlmeUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlGbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5RnBnYUltYWdlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlIb3N0cygpXG4gICAqIC0gLnRvTW9kaWZ5SW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFdpbmRvdygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlJcGFtKClcbiAgICogLSAudG9Nb2RpZnlJcGFtUG9vbCgpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbVJlc291cmNlQ2lkcigpXG4gICAqIC0gLnRvTW9kaWZ5SXBhbVJlc291cmNlRGlzY292ZXJ5KClcbiAgICogLSAudG9Nb2RpZnlJcGFtU2NvcGUoKVxuICAgKiAtIC50b01vZGlmeUxhdW5jaFRlbXBsYXRlKClcbiAgICogLSAudG9Nb2RpZnlMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TWFuYWdlZFByZWZpeExpc3QoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVByaXZhdGVEbnNOYW1lT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5UmVzZXJ2ZWRJbnN0YW5jZXMoKVxuICAgKiAtIC50b01vZGlmeVJvdXRlU2VydmVyKClcbiAgICogLSAudG9Nb2RpZnlTZWN1cml0eUdyb3VwUnVsZXMoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b01vZGlmeVNwb3RGbGVldFJlcXVlc3QoKVxuICAgKiAtIC50b01vZGlmeVN1Ym5ldEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlck5ldHdvcmtTZXJ2aWNlcygpXG4gICAqIC0gLnRvTW9kaWZ5VHJhZmZpY01pcnJvckZpbHRlclJ1bGUoKVxuICAgKiAtIC50b01vZGlmeVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnRQb2xpY3koKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXAoKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzR3JvdXBQb2xpY3koKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2UoKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzSW5zdGFuY2VMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VmVyaWZpZWRBY2Nlc3NUcnVzdFByb3ZpZGVyKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWUoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGF5ZXJSZXNwb25zaWJpbGl0eSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b01vZGlmeVZwY1BlZXJpbmdDb25uZWN0aW9uT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjVGVuYW5jeSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBuQ29ubmVjdGlvbk9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbENlcnRpZmljYXRlKClcbiAgICogLSAudG9Nb2RpZnlWcG5UdW5uZWxPcHRpb25zKClcbiAgICogLSAudG9Nb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9Nb3ZlQnlvaXBDaWRyVG9JcGFtKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUHJvdmlzaW9uSXBhbUJ5b2FzbigpXG4gICAqIC0gLnRvUHJvdmlzaW9uSXBhbVBvb2xDaWRyKClcbiAgICogLSAudG9Qcm92aXNpb25QdWJsaWNJcHY0UG9vbENpZHIoKVxuICAgKiAtIC50b1B1cmNoYXNlSG9zdFJlc2VydmF0aW9uKClcbiAgICogLSAudG9QdXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZWdpc3RlckltYWdlKClcbiAgICogLSAudG9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvUmVqZWN0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvUmVqZWN0VnBjRW5kcG9pbnRDb25uZWN0aW9ucygpXG4gICAqIC0gLnRvUmVqZWN0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b1JlbGVhc2VBZGRyZXNzKClcbiAgICogLSAudG9SZWxlYXNlSG9zdHMoKVxuICAgKiAtIC50b1JlbGVhc2VJcGFtUG9vbEFsbG9jYXRpb24oKVxuICAgKiAtIC50b1JlcGxhY2VJYW1JbnN0YW5jZVByb2ZpbGVBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqIC0gLnRvUmVwbGFjZVJvdXRlKClcbiAgICogLSAudG9SZXBsYWNlUm91dGVUYWJsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXBsYWNlVHJhbnNpdEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvUmVwbGFjZVZwblR1bm5lbCgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RGbGVldCgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Jlc2V0QWRkcmVzc0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRGcGdhSW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0SW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc2V0TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzdG9yZUltYWdlRnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1Jlc3RvcmVNYW5hZ2VkUHJlZml4TGlzdFZlcnNpb24oKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdEZyb21SZWN5Y2xlQmluKClcbiAgICogLSAudG9SZXN0b3JlU25hcHNob3RUaWVyKClcbiAgICogLSAudG9SZXZva2VDbGllbnRWcG5JbmdyZXNzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9TZWFyY2hMb2NhbEdhdGV3YXlSb3V0ZXMoKVxuICAgKiAtIC50b1NlYXJjaFRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBzKClcbiAgICogLSAudG9TZWFyY2hUcmFuc2l0R2F0ZXdheVJvdXRlcygpXG4gICAqIC0gLnRvU2VuZERpYWdub3N0aWNJbnRlcnJ1cHQoKVxuICAgKiAtIC50b1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zKClcbiAgICogLSAudG9TdGFydEluc3RhbmNlcygpXG4gICAqIC0gLnRvU3RhcnROZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzKClcbiAgICogLSAudG9TdGFydE5ldHdvcmtJbnNpZ2h0c0FuYWx5c2lzKClcbiAgICogLSAudG9TdGFydFZwY0VuZHBvaW50U2VydmljZVByaXZhdGVEbnNWZXJpZmljYXRpb24oKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUNsaWVudFZwbkNvbm5lY3Rpb25zKClcbiAgICogLSAudG9UZXJtaW5hdGVJbnN0YW5jZXMoKVxuICAgKiAtIC50b1VuYXNzaWduSXB2NkFkZHJlc3NlcygpXG4gICAqIC0gLnRvVW5hc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9VbmxvY2tTbmFwc2hvdCgpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9VcGRhdGVTZWN1cml0eUdyb3VwUnVsZURlc2NyaXB0aW9uc0VncmVzcygpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNJbmdyZXNzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBlbGFzdGljLWlwXG4gICAqIC0gY2FwYWNpdHktcmVzZXJ2YXRpb24tZmxlZXRcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKiAtIGNhcnJpZXItZ2F0ZXdheVxuICAgKiAtIGNsaWVudC12cG4tZW5kcG9pbnRcbiAgICogLSBjdXN0b21lci1nYXRld2F5XG4gICAqIC0gZGVjbGFyYXRpdmUtcG9saWNpZXMtcmVwb3J0XG4gICAqIC0gZGVkaWNhdGVkLWhvc3RcbiAgICogLSBkaGNwLW9wdGlvbnNcbiAgICogLSBlZ3Jlc3Mtb25seS1pbnRlcm5ldC1nYXRld2F5XG4gICAqIC0gZWxhc3RpYy1ncHVcbiAgICogLSBleHBvcnQtaW1hZ2UtdGFza1xuICAgKiAtIGV4cG9ydC1pbnN0YW5jZS10YXNrXG4gICAqIC0gZmxlZXRcbiAgICogLSBmcGdhLWltYWdlXG4gICAqIC0gaG9zdC1yZXNlcnZhdGlvblxuICAgKiAtIGltYWdlXG4gICAqIC0gaW1wb3J0LWltYWdlLXRhc2tcbiAgICogLSBpbXBvcnQtc25hcHNob3QtdGFza1xuICAgKiAtIGluc3RhbmNlLWNvbm5lY3QtZW5kcG9pbnRcbiAgICogLSBpbnN0YW5jZS1ldmVudC13aW5kb3dcbiAgICogLSBpbnN0YW5jZVxuICAgKiAtIGludGVybmV0LWdhdGV3YXlcbiAgICogLSBpcGFtLWV4dGVybmFsLXJlc291cmNlLXZlcmlmaWNhdGlvbi10b2tlblxuICAgKiAtIGlwYW1cbiAgICogLSBpcGFtLXBvb2xcbiAgICogLSBpcGFtLXJlc291cmNlLWRpc2NvdmVyeS1hc3NvY2lhdGlvblxuICAgKiAtIGlwYW0tcmVzb3VyY2UtZGlzY292ZXJ5XG4gICAqIC0gaXBhbS1zY29wZVxuICAgKiAtIGNvaXAtcG9vbFxuICAgKiAtIGlwdjRwb29sLWVjMlxuICAgKiAtIGlwdjZwb29sLWVjMlxuICAgKiAtIGtleS1wYWlyXG4gICAqIC0gbGF1bmNoLXRlbXBsYXRlXG4gICAqIC0gbG9jYWwtZ2F0ZXdheVxuICAgKiAtIGxvY2FsLWdhdGV3YXktcm91dGUtdGFibGUtdmlydHVhbC1pbnRlcmZhY2UtZ3JvdXAtYXNzb2NpYXRpb25cbiAgICogLSBsb2NhbC1nYXRld2F5LXJvdXRlLXRhYmxlLXZwYy1hc3NvY2lhdGlvblxuICAgKiAtIGxvY2FsLWdhdGV3YXktcm91dGUtdGFibGVcbiAgICogLSBsb2NhbC1nYXRld2F5LXZpcnR1YWwtaW50ZXJmYWNlLWdyb3VwXG4gICAqIC0gbG9jYWwtZ2F0ZXdheS12aXJ0dWFsLWludGVyZmFjZVxuICAgKiAtIG5hdGdhdGV3YXlcbiAgICogLSBuZXR3b3JrLWFjbFxuICAgKiAtIG5ldHdvcmstaW5zaWdodHMtYWNjZXNzLXNjb3BlLWFuYWx5c2lzXG4gICAqIC0gbmV0d29yay1pbnNpZ2h0cy1hY2Nlc3Mtc2NvcGVcbiAgICogLSBuZXR3b3JrLWluc2lnaHRzLWFuYWx5c2lzXG4gICAqIC0gbmV0d29yay1pbnNpZ2h0cy1wYXRoXG4gICAqIC0gbmV0d29yay1pbnRlcmZhY2VcbiAgICogLSBvdXRwb3N0LWxhZ1xuICAgKiAtIHBsYWNlbWVudC1ncm91cFxuICAgKiAtIHByZWZpeC1saXN0XG4gICAqIC0gcmVwbGFjZS1yb290LXZvbHVtZS10YXNrXG4gICAqIC0gcmVzZXJ2ZWQtaW5zdGFuY2VzXG4gICAqIC0gcm91dGUtc2VydmVyLWVuZHBvaW50XG4gICAqIC0gcm91dGUtc2VydmVyXG4gICAqIC0gcm91dGUtc2VydmVyLXBlZXJcbiAgICogLSByb3V0ZS10YWJsZVxuICAgKiAtIHNlY3VyaXR5LWdyb3VwXG4gICAqIC0gc2VjdXJpdHktZ3JvdXAtcnVsZVxuICAgKiAtIHNuYXBzaG90XG4gICAqIC0gc3BvdC1mbGVldC1yZXF1ZXN0XG4gICAqIC0gc3BvdC1pbnN0YW5jZXMtcmVxdWVzdFxuICAgKiAtIHN1Ym5ldC1jaWRyLXJlc2VydmF0aW9uXG4gICAqIC0gc3VibmV0XG4gICAqIC0gdHJhZmZpYy1taXJyb3ItZmlsdGVyXG4gICAqIC0gdHJhZmZpYy1taXJyb3ItZmlsdGVyLXJ1bGVcbiAgICogLSB0cmFmZmljLW1pcnJvci1zZXNzaW9uXG4gICAqIC0gdHJhZmZpYy1taXJyb3ItdGFyZ2V0XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LWF0dGFjaG1lbnRcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktY29ubmVjdC1wZWVyXG4gICAqIC0gdHJhbnNpdC1nYXRld2F5XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LW11bHRpY2FzdC1kb21haW5cbiAgICogLSB0cmFuc2l0LWdhdGV3YXktcG9saWN5LXRhYmxlXG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlLWFubm91bmNlbWVudFxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZVxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1lbmRwb2ludFxuICAgKiAtIHZlcmlmaWVkLWFjY2Vzcy1lbmRwb2ludC10YXJnZXRcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtZ3JvdXBcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtaW5zdGFuY2VcbiAgICogLSB2ZXJpZmllZC1hY2Nlc3MtcG9saWN5XG4gICAqIC0gdmVyaWZpZWQtYWNjZXNzLXRydXN0LXByb3ZpZGVyXG4gICAqIC0gdm9sdW1lXG4gICAqIC0gdnBjLWJsb2NrLXB1YmxpYy1hY2Nlc3MtZXhjbHVzaW9uXG4gICAqIC0gdnBjLWVuZHBvaW50LWNvbm5lY3Rpb25cbiAgICogLSB2cGMtZW5kcG9pbnRcbiAgICogLSB2cGMtZW5kcG9pbnQtc2VydmljZVxuICAgKiAtIHZwYy1lbmRwb2ludC1zZXJ2aWNlLXBlcm1pc3Npb25cbiAgICogLSB2cGMtZmxvdy1sb2dcbiAgICogLSB2cGNcbiAgICogLSB2cGMtcGVlcmluZy1jb25uZWN0aW9uXG4gICAqIC0gdnBuLWNvbm5lY3Rpb25cbiAgICogLSB2cG4tZ2F0ZXdheVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSZXNvdXJjZVRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnN0YW5jZSBtZXRhZGF0YSBzZXJ2aWNlIGZvciByZXRyaWV2aW5nIElBTSByb2xlIGNyZWRlbnRpYWxzIGZvciBFQzJcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtudW1lcmljIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19OdW1lcmljKS4gKipEZWZhdWx0OioqIGBOdW1lcmljRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmUm9sZURlbGl2ZXJ5KHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBSb2xlRGVsaXZlcnlgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ051bWVyaWNFcXVhbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgcm9vdCBkZXZpY2UgdHlwZSBvZiB0aGUgaW5zdGFuY2UgKGVicyBvciBpbnN0YW5jZS1zdG9yZSlcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlQWRkcmVzcygpXG4gICAqIC0gLnRvQXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXR0YWNoTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DYW5jZWxJbWFnZUxhdW5jaFBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrKClcbiAgICogLSAudG9DcmVhdGVOZXR3b3JrSW5zaWdodHNQYXRoKClcbiAgICogLSAudG9DcmVhdGVSZXBsYWNlUm9vdFZvbHVtZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlU3RvcmVJbWFnZVRhc2soKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGlzYWJsZUZhc3RMYXVuY2goKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZSgpXG4gICAqIC0gLnRvRGlzYWJsZUltYWdlRGVwcmVjYXRpb24oKVxuICAgKiAtIC50b0Rpc2FibGVJbWFnZURlcmVnaXN0cmF0aW9uUHJvdGVjdGlvbigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlSWFtSW5zdGFuY2VQcm9maWxlKClcbiAgICogLSAudG9FbmFibGVGYXN0TGF1bmNoKClcbiAgICogLSAudG9FbmFibGVJbWFnZSgpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXByZWNhdGlvbigpXG4gICAqIC0gLnRvRW5hYmxlSW1hZ2VEZXJlZ2lzdHJhdGlvblByb3RlY3Rpb24oKVxuICAgKiAtIC50b0V4cG9ydEltYWdlKClcbiAgICogLSAudG9HZXRDb25zb2xlT3V0cHV0KClcbiAgICogLSAudG9HZXRDb25zb2xlU2NyZWVuc2hvdCgpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VUcG1Fa1B1YigpXG4gICAqIC0gLnRvR2V0SW5zdGFuY2VVZWZpRGF0YSgpXG4gICAqIC0gLnRvR2V0TGF1bmNoVGVtcGxhdGVEYXRhKClcbiAgICogLSAudG9HZXRQYXNzd29yZERhdGEoKVxuICAgKiAtIC50b0ltcG9ydEltYWdlKClcbiAgICogLSAudG9Nb2RpZnlGbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5SW1hZ2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNhcGFjaXR5UmVzZXJ2YXRpb25BdHRyaWJ1dGVzKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNwdU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQ3JlZGl0U3BlY2lmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VFdmVudFN0YXJ0VGltZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VNYWludGVuYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWV0YWRhdGFPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU5ldHdvcmtQZXJmb3JtYW5jZU9wdGlvbnMoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlUGxhY2VtZW50KClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlQcml2YXRlRG5zTmFtZU9wdGlvbnMoKVxuICAgKiAtIC50b01vbml0b3JJbnN0YW5jZXMoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1JlYm9vdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVzZXRJbWFnZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzZXRJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzdG9yZUltYWdlRnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvU2VuZERpYWdub3N0aWNJbnRlcnJ1cHQoKVxuICAgKiAtIC50b1NlbmRTcG90SW5zdGFuY2VJbnRlcnJ1cHRpb25zKClcbiAgICogLSAudG9TdGFydEluc3RhbmNlcygpXG4gICAqIC0gLnRvU3RvcEluc3RhbmNlcygpXG4gICAqIC0gLnRvVGVybWluYXRlSW5zdGFuY2VzKClcbiAgICogLSAudG9Vbm1vbml0b3JJbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGltYWdlXG4gICAqIC0gaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZSb290RGV2aWNlVHlwZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUm9vdERldmljZVR5cGVgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgSUQgb2YgYSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVSb3V0ZSgpXG4gICAqIC0gLnRvRGVsZXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGlzYWJsZVJvdXRlU2VydmVyUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0Rpc2FibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9FbmFibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9HZXRSb3V0ZVNlcnZlclByb3BhZ2F0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b1JlcGxhY2VSb3V0ZSgpXG4gICAqIC0gLnRvUmVwbGFjZVJvdXRlVGFibGVBc3NvY2lhdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gcm91dGUtdGFibGVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZSb3V0ZVRhYmxlSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFJvdXRlVGFibGVJRGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSByb3V0aW5nIHR5cGUgZm9yIHRoZSBWUE4gY29ubmVjdGlvblxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBuL2xhdGVzdC9zMnN2cG4vdnBuLWF1dGhlbnRpY2F0aW9uLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b01vZGlmeVZwblR1bm5lbE9wdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwbi1jb25uZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUm91dGluZ1R5cGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFJvdXRpbmdUeXBlYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgSUFNIFNBTUwgaWRlbnRpdHkgcHJvdmlkZXJcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXBwbHlTZWN1cml0eUdyb3Vwc1RvQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXV0aG9yaXplQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvQ3JlYXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwblJvdXRlKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZWxldGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2xpZW50VnBuUm91dGVzKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblRhcmdldE5ldHdvcmtzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9FeHBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9FeHBvcnRDbGllbnRWcG5DbGllbnRDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9JbXBvcnRDbGllbnRWcG5DbGllbnRDZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0KClcbiAgICogLSAudG9Nb2RpZnlDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvUmV2b2tlQ2xpZW50VnBuSW5ncmVzcygpXG4gICAqIC0gLnRvVGVybWluYXRlQ2xpZW50VnBuQ29ubmVjdGlvbnMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGNsaWVudC12cG4tZW5kcG9pbnRcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZTYW1sUHJvdmlkZXJBcm4odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFNhbWxQcm92aWRlckFybmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhIHNlY3VyaXR5IGdyb3VwXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9Bc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjKClcbiAgICogLSAudG9BdHRhY2hDbGFzc2ljTGlua1ZwYygpXG4gICAqIC0gLnRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEVncmVzcygpXG4gICAqIC0gLnRvQXV0aG9yaXplU2VjdXJpdHlHcm91cEluZ3Jlc3MoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVmVyaWZpZWRBY2Nlc3NFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZVNlY3VyaXR5R3JvdXAoKVxuICAgKiAtIC50b0Rlc2NyaWJlU2VjdXJpdHlHcm91cFJlZmVyZW5jZXMoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0ltcG9ydEluc3RhbmNlKClcbiAgICogLSAudG9Nb2RpZnlDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeU5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNlY3VyaXR5R3JvdXBSdWxlcygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90RmxlZXQoKVxuICAgKiAtIC50b1JlcXVlc3RTcG90SW5zdGFuY2VzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9VcGRhdGVTZWN1cml0eUdyb3VwUnVsZURlc2NyaXB0aW9uc0VncmVzcygpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNJbmdyZXNzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBzZWN1cml0eS1ncm91cFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlNlY3VyaXR5R3JvdXBJRCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU2VjdXJpdHlHcm91cElEYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FwcGx5U2VjdXJpdHlHcm91cHNUb0NsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0F1dGhvcml6ZUNsaWVudFZwbkluZ3Jlc3MoKVxuICAgKiAtIC50b0NyZWF0ZUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b0RlbGV0ZUNsaWVudFZwblJvdXRlKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwbkNvbm5lY3Rpb25zKClcbiAgICogLSAudG9EZXNjcmliZUNsaWVudFZwblJvdXRlcygpXG4gICAqIC0gLnRvRGVzY3JpYmVDbGllbnRWcG5UYXJnZXROZXR3b3JrcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpXG4gICAqIC0gLnRvRXhwb3J0Q2xpZW50VnBuQ2xpZW50Q29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvSW1wb3J0Q2xpZW50VnBuQ2xpZW50Q2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCgpXG4gICAqIC0gLnRvTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b1Jldm9rZUNsaWVudFZwbkluZ3Jlc3MoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUNsaWVudFZwbkNvbm5lY3Rpb25zKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjbGllbnQtdnBuLWVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU2VydmVyQ2VydGlmaWNhdGVBcm4odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFNlcnZlckNlcnRpZmljYXRlQXJuYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGNvbXBsaWFuY2UgbW9kZSBjb29saW5nLW9mZiBwZXJpb2RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvTG9ja1NuYXBzaG90KClcbiAgICogLSAudG9VbmxvY2tTbmFwc2hvdCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gc25hcHNob3RcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbbnVtZXJpYyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfTnVtZXJpYykuICoqRGVmYXVsdDoqKiBgTnVtZXJpY0VxdWFsc2BcbiAgICovXG4gIHB1YmxpYyBpZlNuYXBzaG90Q29vbE9mZlBlcmlvZCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU25hcHNob3RDb29sT2ZmUGVyaW9kYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgc25hcHNob3RcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NvcHlTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlSW1hZ2UoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvRGVsZXRlU25hcHNob3QoKVxuICAgKiAtIC50b0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rpc2FibGVGYXN0U25hcHNob3RSZXN0b3JlcygpXG4gICAqIC0gLnRvRW5hYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0ltcG9ydEltYWdlKClcbiAgICogLSAudG9JbXBvcnRTbmFwc2hvdCgpXG4gICAqIC0gLnRvTG9ja1NuYXBzaG90KClcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RUaWVyKClcbiAgICogLSAudG9SZWdpc3RlckltYWdlKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVzZXRTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzdG9yZVNuYXBzaG90RnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5sb2NrU25hcHNob3QoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU25hcHNob3RJRCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU25hcHNob3RJRGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBzbmFwc2hvdCBsb2NrIGR1cmF0aW9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0xvY2tTbmFwc2hvdCgpXG4gICAqIC0gLnRvVW5sb2NrU25hcHNob3QoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW251bWVyaWMgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX051bWVyaWMpLiAqKkRlZmF1bHQ6KiogYE51bWVyaWNFcXVhbHNgXG4gICAqL1xuICBwdWJsaWMgaWZTbmFwc2hvdExvY2tEdXJhdGlvbih2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU25hcHNob3RMb2NrRHVyYXRpb25gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ051bWVyaWNFcXVhbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgaW5pdGlhdGlvbiB0aW1lIG9mIGEgc25hcHNob3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ29weVNuYXBzaG90KClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZVNuYXBzaG90KClcbiAgICogLSAudG9EZXNjcmliZVNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9EaXNhYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0VuYWJsZUZhc3RTbmFwc2hvdFJlc3RvcmVzKClcbiAgICogLSAudG9JbXBvcnRJbWFnZSgpXG4gICAqIC0gLnRvSW1wb3J0U25hcHNob3QoKVxuICAgKiAtIC50b0xvY2tTbmFwc2hvdCgpXG4gICAqIC0gLnRvTW9kaWZ5U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90VGllcigpXG4gICAqIC0gLnRvUmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RGbGVldCgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Jlc2V0U25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdEZyb21SZWN5Y2xlQmluKClcbiAgICogLSAudG9SZXN0b3JlU25hcHNob3RUaWVyKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1VubG9ja1NuYXBzaG90KClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBzbmFwc2hvdFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtkYXRlIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19EYXRlKS4gKipEZWZhdWx0OioqIGBEYXRlRXF1YWxzYFxuICAgKi9cbiAgcHVibGljIGlmU25hcHNob3RUaW1lKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgKERhdGUgfCBzdHJpbmcpW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBEYXRlKS5nZXRNb250aCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgKGl0ZW0gYXMgRGF0ZSkuZ2V0TW9udGggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGl0ZW0gPSAoaXRlbSBhcyBEYXRlKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlmKGBTbmFwc2hvdFRpbWVgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0RhdGVFcXVhbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbmFtZSBvZiB0aGUgQXZhaWxhYmlsaXR5IFpvbmUgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90KClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdHMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU291cmNlQXZhaWxhYmlsaXR5Wm9uZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU291cmNlQXZhaWxhYmlsaXR5Wm9uZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiB0aGUgQ2FwYWNpdHkgUmVzZXJ2YXRpb24gZnJvbSB3aGljaCB5b3Ugd2FudCB0byBtb3ZlIGNhcGFjaXR5XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICogLSAudG9Bc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9DcmVhdGVDYXBhY2l0eVJlc2VydmF0aW9uQnlTcGxpdHRpbmcoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJpbGxpbmdPd25lcigpXG4gICAqIC0gLnRvTW92ZUNhcGFjaXR5UmVzZXJ2YXRpb25JbnN0YW5jZXMoKVxuICAgKiAtIC50b1JlamVjdENhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXJzaGlwKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlNvdXJjZUNhcGFjaXR5UmVzZXJ2YXRpb25JZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU291cmNlQ2FwYWNpdHlSZXNlcnZhdGlvbklkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIEFSTiBvZiB0aGUgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1VzZXJHdWlkZS9pYW0tcG9saWNpZXMtZm9yLWFtYXpvbi1lYzIuaHRtbCNhbWF6b24tZWMyLWtleXNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbYXJuIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19BUk4pLiAqKkRlZmF1bHQ6KiogYEFybkxpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZTb3VyY2VJbnN0YW5jZUFSTih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU291cmNlSW5zdGFuY2VBUk5gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgQVJOIG9mIHRoZSBPdXRwb3N0IGZyb20gd2hpY2ggdGhlIHJlcXVlc3Qgb3JpZ2luYXRlZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvRGVzY3JpYmVTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVnaXN0ZXJJbWFnZSgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RGbGVldCgpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHNuYXBzaG90XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU291cmNlT3V0cG9zdEFybih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU291cmNlT3V0cG9zdEFybmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnQXJuTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgdGhlIHN1Ym5ldFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JTZXNzaW9uKClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EZWxldGVOZXR3b3JrSW50ZXJmYWNlUGVybWlzc2lvbigpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cFNvdXJjZXMoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9Nb2RpZnlMb2NhbEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvUmVxdWVzdFNwb3RJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Jlc2V0TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmFzc2lnbklwdjZBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBuZXR3b3JrLWludGVyZmFjZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlN1Ym5ldCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU3VibmV0YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgc3VibmV0XG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVDbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9Bc3NvY2lhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9Bc3NvY2lhdGVTdWJuZXRDaWRyQmxvY2soKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5Sb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTmF0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVTZXJ2ZXJFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlU3VibmV0KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0Jsb2NrUHVibGljQWNjZXNzRXhjbHVzaW9uKClcbiAgICogLSAudG9DcmVhdGVWcGNFbmRwb2ludCgpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0RlbGV0ZUluc3RhbmNlQ29ubmVjdEVuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVTdWJuZXQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0ltcG9ydEluc3RhbmNlKClcbiAgICogLSAudG9Nb2RpZnlGbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5U3BvdEZsZWV0UmVxdWVzdCgpXG4gICAqIC0gLnRvTW9kaWZ5U3VibmV0QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b01vZGlmeVZlcmlmaWVkQWNjZXNzRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50KClcbiAgICogLSAudG9SZXBsYWNlTmV0d29ya0FjbEFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXBsYWNlUm91dGVUYWJsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBpbnN0YW5jZS1jb25uZWN0LWVuZHBvaW50XG4gICAqIC0gc3VibmV0XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU3VibmV0SUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFN1Ym5ldElEYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRlbmFuY3kgb2YgdGhlIFZQQyBvciBpbnN0YW5jZSAoZGVmYXVsdCwgZGVkaWNhdGVkLCBvciBob3N0KVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvQWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0FwcGx5U2VjdXJpdHlHcm91cHNUb0NsaWVudFZwblRhcmdldE5ldHdvcmsoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUNhcGFjaXR5UmVzZXJ2YXRpb25CaWxsaW5nT3duZXIoKVxuICAgKiAtIC50b0Fzc29jaWF0ZURoY3BPcHRpb25zKClcbiAgICogLSAudG9Bc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlU2VydmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjKClcbiAgICogLSAudG9Bc3NvY2lhdGVWcGNDaWRyQmxvY2soKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0F0dGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0F0dGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvQXR0YWNoVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQ2FwYWNpdHlSZXNlcnZhdGlvbkJ5U3BsaXR0aW5nKClcbiAgICogLSAudG9DcmVhdGVDYXJyaWVyR2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlRWdyZXNzT25seUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW5zdGFuY2VFeHBvcnRUYXNrKClcbiAgICogLSAudG9DcmVhdGVMb2NhbEdhdGV3YXlSb3V0ZVRhYmxlVnBjQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtBY2woKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVJlcGxhY2VSb290Vm9sdW1lVGFzaygpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVTdWJuZXQoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9EZWxldGVWcGMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQ2FwYWNpdHlCbG9ja0V4dGVuc2lvbk9mZmVyaW5ncygpXG4gICAqIC0gLnRvRGVzY3JpYmVJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9EZXRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0RldGFjaE5ldHdvcmtJbnRlcmZhY2UoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRGV0YWNoVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvRGlzYWJsZVZwY0NsYXNzaWNMaW5rKClcbiAgICogLSAudG9EaXNhYmxlVnBjQ2xhc3NpY0xpbmtEbnNTdXBwb3J0KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVJYW1JbnN0YW5jZVByb2ZpbGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVJvdXRlU2VydmVyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVWcGNDaWRyQmxvY2soKVxuICAgKiAtIC50b0VuYWJsZVZwY0NsYXNzaWNMaW5rKClcbiAgICogLSAudG9FbmFibGVWcGNDbGFzc2ljTGlua0Ruc1N1cHBvcnQoKVxuICAgKiAtIC50b0dldENvbnNvbGVPdXRwdXQoKVxuICAgKiAtIC50b0dldENvbnNvbGVTY3JlZW5zaG90KClcbiAgICogLSAudG9HZXRJbnN0YW5jZVRwbUVrUHViKClcbiAgICogLSAudG9HZXRJbnN0YW5jZVVlZmlEYXRhKClcbiAgICogLSAudG9HZXRMYXVuY2hUZW1wbGF0ZURhdGEoKVxuICAgKiAtIC50b0dldFBhc3N3b3JkRGF0YSgpXG4gICAqIC0gLnRvR2V0U2VjdXJpdHlHcm91cHNGb3JWcGMoKVxuICAgKiAtIC50b01vZGlmeUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDYXBhY2l0eVJlc2VydmF0aW9uQXR0cmlidXRlcygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VDcHVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUNyZWRpdFNwZWNpZmljYXRpb24oKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlRXZlbnRTdGFydFRpbWUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlTWFpbnRlbmFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZU1ldGFkYXRhT3B0aW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VOZXR3b3JrUGVyZm9ybWFuY2VPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZVBsYWNlbWVudCgpXG4gICAqIC0gLnRvTW9kaWZ5TmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5UHJpdmF0ZURuc05hbWVPcHRpb25zKClcbiAgICogLSAudG9Nb2RpZnlSZXNlcnZlZEluc3RhbmNlcygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlWcGNUZW5hbmN5KClcbiAgICogLSAudG9Nb25pdG9ySW5zdGFuY2VzKClcbiAgICogLSAudG9Nb3ZlQ2FwYWNpdHlSZXNlcnZhdGlvbkluc3RhbmNlcygpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUmVib290SW5zdGFuY2VzKClcbiAgICogLSAudG9SZWplY3RDYXBhY2l0eVJlc2VydmF0aW9uQmlsbGluZ093bmVyc2hpcCgpXG4gICAqIC0gLnRvUmVwbGFjZUlhbUluc3RhbmNlUHJvZmlsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXNldEluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9SdW5JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlbmREaWFnbm9zdGljSW50ZXJydXB0KClcbiAgICogLSAudG9TZW5kU3BvdEluc3RhbmNlSW50ZXJydXB0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRJbnN0YW5jZXMoKVxuICAgKiAtIC50b1N0b3BJbnN0YW5jZXMoKVxuICAgKiAtIC50b1Rlcm1pbmF0ZUluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5tb25pdG9ySW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXBhY2l0eS1yZXNlcnZhdGlvblxuICAgKiAtIGNhcnJpZXItZ2F0ZXdheVxuICAgKiAtIGluc3RhbmNlXG4gICAqIC0gcmVzZXJ2ZWQtaW5zdGFuY2VzXG4gICAqIC0gdnBjXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVGVuYW5jeSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVGVuYW5jeWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhIHZvbHVtZVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRW5hYmxlVm9sdW1lSU8oKVxuICAgKiAtIC50b0ltcG9ydEluc3RhbmNlKClcbiAgICogLSAudG9JbXBvcnRWb2x1bWUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWUoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2b2x1bWVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZWb2x1bWVJRCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVm9sdW1lSURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGhlIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgb3BlcmF0aW9ucyBwZXIgc2Vjb25kIChJT1BTKSBwcm92aXNpb25lZCBmb3IgdGhlIHZvbHVtZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BdHRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0RldGFjaFZvbHVtZSgpXG4gICAqIC0gLnRvRW5hYmxlVm9sdW1lSU8oKVxuICAgKiAtIC50b0ltcG9ydEluc3RhbmNlKClcbiAgICogLSAudG9JbXBvcnRWb2x1bWUoKVxuICAgKiAtIC50b01vZGlmeUluc3RhbmNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWUoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUGF1c2VWb2x1bWVJTygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2b2x1bWVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbbnVtZXJpYyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfTnVtZXJpYykuICoqRGVmYXVsdDoqKiBgTnVtZXJpY0VxdWFsc2BcbiAgICovXG4gIHB1YmxpYyBpZlZvbHVtZUlvcHModmFsdWU6IG51bWJlciB8IG51bWJlcltdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFZvbHVtZUlvcHNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ051bWVyaWNFcXVhbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgc2l6ZSBvZiB0aGUgdm9sdW1lLCBpbiBHaUJcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9Db3B5U25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVJbWFnZSgpXG4gICAqIC0gLnRvQ3JlYXRlUmVwbGFjZVJvb3RWb2x1bWVUYXNrKClcbiAgICogLSAudG9DcmVhdGVTbmFwc2hvdCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3RzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWb2x1bWUoKVxuICAgKiAtIC50b0RlbGV0ZVNuYXBzaG90KClcbiAgICogLSAudG9EZWxldGVWb2x1bWUoKVxuICAgKiAtIC50b0Rlc2NyaWJlU25hcHNob3RBdHRyaWJ1dGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0Rpc2FibGVGYXN0U25hcHNob3RSZXN0b3JlcygpXG4gICAqIC0gLnRvRW5hYmxlRmFzdFNuYXBzaG90UmVzdG9yZXMoKVxuICAgKiAtIC50b0VuYWJsZVZvbHVtZUlPKClcbiAgICogLSAudG9JbXBvcnRJbWFnZSgpXG4gICAqIC0gLnRvSW1wb3J0SW5zdGFuY2UoKVxuICAgKiAtIC50b0ltcG9ydFNuYXBzaG90KClcbiAgICogLSAudG9JbXBvcnRWb2x1bWUoKVxuICAgKiAtIC50b0xvY2tTbmFwc2hvdCgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeVNuYXBzaG90QXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b01vZGlmeVZvbHVtZSgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9QYXVzZVZvbHVtZUlPKClcbiAgICogLSAudG9SZWdpc3RlckltYWdlKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVzZXRTbmFwc2hvdEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvUmVzdG9yZVNuYXBzaG90RnJvbVJlY3ljbGVCaW4oKVxuICAgKiAtIC50b1Jlc3RvcmVTbmFwc2hvdFRpZXIoKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqIC0gLnRvVW5sb2NrU25hcHNob3QoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHNuYXBzaG90XG4gICAqIC0gdm9sdW1lXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW251bWVyaWMgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX051bWVyaWMpLiAqKkRlZmF1bHQ6KiogYE51bWVyaWNFcXVhbHNgXG4gICAqL1xuICBwdWJsaWMgaWZWb2x1bWVTaXplKHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBWb2x1bWVTaXplYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRocm91Z2hwdXQgb2YgdGhlIHZvbHVtZSwgaW4gTWlCcHNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVWb2x1bWUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0VuYWJsZVZvbHVtZUlPKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvSW1wb3J0Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdm9sdW1lXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW251bWVyaWMgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX051bWVyaWMpLiAqKkRlZmF1bHQ6KiogYE51bWVyaWNFcXVhbHNgXG4gICAqL1xuICBwdWJsaWMgaWZWb2x1bWVUaHJvdWdocHV0KHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBWb2x1bWVUaHJvdWdocHV0YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdOdW1lcmljRXF1YWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHR5cGUgb2Ygdm9sdW1lIChncDIsIGdwMywgaW8xLCBpbzIsIHN0MSwgc2MxLCBvciBzdGFuZGFyZClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lhbS1wb2xpY2llcy1mb3ItYW1hem9uLWVjMi5odG1sI2FtYXpvbi1lYzIta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXR0YWNoVm9sdW1lKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlU25hcHNob3QoKVxuICAgKiAtIC50b0NyZWF0ZVNuYXBzaG90cygpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVWb2x1bWUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVm9sdW1lQXR0cmlidXRlKClcbiAgICogLSAudG9EZXRhY2hWb2x1bWUoKVxuICAgKiAtIC50b0VuYWJsZVZvbHVtZUlPKClcbiAgICogLSAudG9JbXBvcnRJbnN0YW5jZSgpXG4gICAqIC0gLnRvSW1wb3J0Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlJbnN0YW5jZUF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5Vm9sdW1lKClcbiAgICogLSAudG9Nb2RpZnlWb2x1bWVBdHRyaWJ1dGUoKVxuICAgKiAtIC50b1BhdXNlVm9sdW1lSU8oKVxuICAgKiAtIC50b1J1bkluc3RhbmNlcygpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdm9sdW1lXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVm9sdW1lVHlwZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVm9sdW1lVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBUk4gb2YgdGhlIFZQQ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWZvci1hbWF6b24tZWMyLmh0bWwjYW1hem9uLWVjMi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BcHBseVNlY3VyaXR5R3JvdXBzVG9DbGllbnRWcG5UYXJnZXROZXR3b3JrKClcbiAgICogLSAudG9Bc3NpZ25JcHY2QWRkcmVzc2VzKClcbiAgICogLSAudG9Bc3NpZ25Qcml2YXRlSXBBZGRyZXNzZXMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVNlY3VyaXR5R3JvdXBWcGMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVN1Ym5ldENpZHJCbG9jaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9BdXRob3JpemVTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9BdXRob3JpemVTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvQ3JlYXRlRmxlZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVJbnN0YW5jZUNvbm5lY3RFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTG9jYWxHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0NyZWF0ZU5hdEdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0NyZWF0ZVJvdXRlKClcbiAgICogLSAudG9DcmVhdGVSb3V0ZVNlcnZlckVuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yU2Vzc2lvbigpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVWcGNCbG9ja1B1YmxpY0FjY2Vzc0V4Y2x1c2lvbigpXG4gICAqIC0gLnRvRGVsZXRlQ2xpZW50VnBuUm91dGUoKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtBY2woKVxuICAgKiAtIC50b0RlbGV0ZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0ludGVyZmFjZSgpXG4gICAqIC0gLnRvRGVsZXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24oKVxuICAgKiAtIC50b0RlbGV0ZVJvdXRlKClcbiAgICogLSAudG9EZWxldGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9EZWxldGVTZWN1cml0eUdyb3VwKClcbiAgICogLSAudG9EZWxldGVTdWJuZXQoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvRGVyZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzKClcbiAgICogLSAudG9EZXNjcmliZVNlY3VyaXR5R3JvdXBSZWZlcmVuY2VzKClcbiAgICogLSAudG9EZXRhY2hOZXR3b3JrSW50ZXJmYWNlKClcbiAgICogLSAudG9EaXNhYmxlUm91dGVTZXJ2ZXJQcm9wYWdhdGlvbigpXG4gICAqIC0gLnRvRGlzYWJsZVZnd1JvdXRlUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUFkZHJlc3MoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU5hdEdhdGV3YXlBZGRyZXNzKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVSb3V0ZVRhYmxlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVTdWJuZXRDaWRyQmxvY2soKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9FbmFibGVSb3V0ZVNlcnZlclByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVWZ3dSb3V0ZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9HZXRSb3V0ZVNlcnZlclByb3BhZ2F0aW9ucygpXG4gICAqIC0gLnRvSW1wb3J0SW5zdGFuY2UoKVxuICAgKiAtIC50b01vZGlmeUNsaWVudFZwbkVuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlGbGVldCgpXG4gICAqIC0gLnRvTW9kaWZ5SW5zdGFuY2VBdHRyaWJ1dGUoKVxuICAgKiAtIC50b01vZGlmeUxvY2FsR2F0ZXdheVJvdXRlKClcbiAgICogLSAudG9Nb2RpZnlOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9Nb2RpZnlTZWN1cml0eUdyb3VwUnVsZXMoKVxuICAgKiAtIC50b01vZGlmeVNwb3RGbGVldFJlcXVlc3QoKVxuICAgKiAtIC50b01vZGlmeVN1Ym5ldEF0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9Nb2RpZnlWZXJpZmllZEFjY2Vzc0VuZHBvaW50KClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludCgpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwTWVtYmVycygpXG4gICAqIC0gLnRvUmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvUmVwbGFjZU5ldHdvcmtBY2xFbnRyeSgpXG4gICAqIC0gLnRvUmVwbGFjZVJvdXRlKClcbiAgICogLSAudG9SZXBsYWNlUm91dGVUYWJsZUFzc29jaWF0aW9uKClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEZsZWV0KClcbiAgICogLSAudG9SZXF1ZXN0U3BvdEluc3RhbmNlcygpXG4gICAqIC0gLnRvUmVzZXROZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwRWdyZXNzKClcbiAgICogLSAudG9SZXZva2VTZWN1cml0eUdyb3VwSW5ncmVzcygpXG4gICAqIC0gLnRvUnVuSW5zdGFuY2VzKClcbiAgICogLSAudG9VbmFzc2lnbklwdjZBZGRyZXNzZXMoKVxuICAgKiAtIC50b1VuYXNzaWduUHJpdmF0ZUlwQWRkcmVzc2VzKClcbiAgICogLSAudG9VcGRhdGVTZWN1cml0eUdyb3VwUnVsZURlc2NyaXB0aW9uc0VncmVzcygpXG4gICAqIC0gLnRvVXBkYXRlU2VjdXJpdHlHcm91cFJ1bGVEZXNjcmlwdGlvbnNJbmdyZXNzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBjYXJyaWVyLWdhdGV3YXlcbiAgICogLSBuZXR3b3JrLWFjbFxuICAgKiAtIG5ldHdvcmstaW50ZXJmYWNlXG4gICAqIC0gcm91dGUtdGFibGVcbiAgICogLSBzZWN1cml0eS1ncm91cFxuICAgKiAtIHN1Ym5ldFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlZwYyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVnBjYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgdmlydHVhbCBwcml2YXRlIGNsb3VkIChWUEMpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvQXBwbHlTZWN1cml0eUdyb3Vwc1RvQ2xpZW50VnBuVGFyZ2V0TmV0d29yaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlRGhjcE9wdGlvbnMoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVJvdXRlU2VydmVyKClcbiAgICogLSAudG9Bc3NvY2lhdGVTZWN1cml0eUdyb3VwVnBjKClcbiAgICogLSAudG9Bc3NvY2lhdGVWcGNDaWRyQmxvY2soKVxuICAgKiAtIC50b0F0dGFjaENsYXNzaWNMaW5rVnBjKClcbiAgICogLSAudG9BdHRhY2hJbnRlcm5ldEdhdGV3YXkoKVxuICAgKiAtIC50b0F0dGFjaFZwbkdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZUNhcnJpZXJHYXRld2F5KClcbiAgICogLSAudG9DcmVhdGVDbGllbnRWcG5FbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlRWdyZXNzT25seUludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlRmxvd0xvZ3MoKVxuICAgKiAtIC50b0NyZWF0ZUxvY2FsR2F0ZXdheVJvdXRlVGFibGVWcGNBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0FjbCgpXG4gICAqIC0gLnRvQ3JlYXRlUm91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlU2VjdXJpdHlHcm91cCgpXG4gICAqIC0gLnRvQ3JlYXRlU3VibmV0KClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZwYygpXG4gICAqIC0gLnRvQ3JlYXRlVnBjQmxvY2tQdWJsaWNBY2Nlc3NFeGNsdXNpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50KClcbiAgICogLSAudG9DcmVhdGVWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVnBjKClcbiAgICogLSAudG9EZXNjcmliZVZwY0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvRGV0YWNoQ2xhc3NpY0xpbmtWcGMoKVxuICAgKiAtIC50b0RldGFjaEludGVybmV0R2F0ZXdheSgpXG4gICAqIC0gLnRvRGV0YWNoVnBuR2F0ZXdheSgpXG4gICAqIC0gLnRvRGlzYWJsZVZwY0NsYXNzaWNMaW5rKClcbiAgICogLSAudG9EaXNhYmxlVnBjQ2xhc3NpY0xpbmtEbnNTdXBwb3J0KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVSb3V0ZVNlcnZlcigpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlU2VjdXJpdHlHcm91cFZwYygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVnBjQ2lkckJsb2NrKClcbiAgICogLSAudG9FbmFibGVWcGNDbGFzc2ljTGluaygpXG4gICAqIC0gLnRvRW5hYmxlVnBjQ2xhc3NpY0xpbmtEbnNTdXBwb3J0KClcbiAgICogLSAudG9HZXRTZWN1cml0eUdyb3Vwc0ZvclZwYygpXG4gICAqIC0gLnRvTW9kaWZ5Q2xpZW50VnBuRW5kcG9pbnQoKVxuICAgKiAtIC50b01vZGlmeVZwY0F0dHJpYnV0ZSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjVGVuYW5jeSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVnBjSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFZwY0lEYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgVlBDIHBlZXJpbmcgY29ubmVjdGlvblxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0VnBjUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZU5ldHdvcmtJbnNpZ2h0c1BhdGgoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwY1BlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9EZWxldGVWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjUGVlcmluZ0Nvbm5lY3Rpb25PcHRpb25zKClcbiAgICogLSAudG9SZWplY3RWcGNQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjLXBlZXJpbmctY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlZwY1BlZXJpbmdDb25uZWN0aW9uSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFZwY1BlZXJpbmdDb25uZWN0aW9uSURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbmFtZSBvZiB0aGUgVlBDIGVuZHBvaW50IHNlcnZpY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1lbmRwb2ludHMtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRyYWZmaWNNaXJyb3JUYXJnZXQoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVWcGNFbmRwb2ludHMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwYy1lbmRwb2ludFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlZwY2VTZXJ2aWNlTmFtZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVnBjZVNlcnZpY2VOYW1lYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHNlcnZpY2Ugb3duZXIgb2YgdGhlIFZQQyBlbmRwb2ludCBzZXJ2aWNlIChhbWF6b24sIGF3cy1tYXJrZXRwbGFjZSwgb3IgYW4gQVdTIGFjY291bnQgSUQpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtZW5kcG9pbnRzLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUcmFmZmljTWlycm9yVGFyZ2V0KClcbiAgICogLSAudG9DcmVhdGVWcGNFbmRwb2ludCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjLWVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVnBjZVNlcnZpY2VPd25lcih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVnBjZVNlcnZpY2VPd25lcmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBwcml2YXRlIEROUyBuYW1lIG9mIHRoZSBWUEMgZW5kcG9pbnQgc2VydmljZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLWVuZHBvaW50cy1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZWcGNlU2VydmljZVByaXZhdGVEbnNOYW1lKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBWcGNlU2VydmljZVByaXZhdGVEbnNOYW1lYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgdHJhbnNpdCBnYXRld2F5IGF0dGFjaG1lbnRcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9BY2NlcHRUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9BY2NlcHRUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZUZsb3dMb2dzKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheUNvbm5lY3QoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXIoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5UHJlZml4TGlzdFJlZmVyZW5jZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVZwbkNvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Q29ubmVjdCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlQZWVyaW5nQXR0YWNobWVudCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50KClcbiAgICogLSAudG9EaXNhYmxlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlUHJvcGFnYXRpb24oKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0VuYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvUmVqZWN0VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnQoKVxuICAgKiAtIC50b1JlamVjdFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvUmVwbGFjZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1hdHRhY2htZW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVHJhbnNpdEdhdGV3YXlBdHRhY2htZW50SWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYHRyYW5zaXRHYXRld2F5QXR0YWNobWVudElkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgdHJhbnNpdCBnYXRld2F5IGNvbm5lY3QgcGVlclxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcigpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LWNvbm5lY3QtcGVlclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlRyYW5zaXRHYXRld2F5Q29ubmVjdFBlZXJJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgdHJhbnNpdEdhdGV3YXlDb25uZWN0UGVlcklkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgdHJhbnNpdCBnYXRld2F5XG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVGbG93TG9ncygpXG4gICAqIC0gLnRvQ3JlYXRlTmV0d29ya0luc2lnaHRzUGF0aCgpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBlZXJpbmdBdHRhY2htZW50KClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlVnBuQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVHJhbnNpdEdhdGV3YXkoKVxuICAgKiAtIC50b01vZGlmeVRyYW5zaXRHYXRld2F5KClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB0cmFuc2l0LWdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZUcmFuc2l0R2F0ZXdheUlkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGB0cmFuc2l0R2F0ZXdheUlkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIElEIG9mIGEgdHJhbnNpdCBnYXRld2F5IG11bHRpY2FzdCBkb21haW5cbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9Bc3NvY2lhdGVUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbigpXG4gICAqIC0gLnRvQ3JlYXRlVGFncygpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluKClcbiAgICogLSAudG9EZXJlZ2lzdGVyVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cE1lbWJlcnMoKVxuICAgKiAtIC50b0RlcmVnaXN0ZXJUcmFuc2l0R2F0ZXdheU11bHRpY2FzdEdyb3VwU291cmNlcygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW4oKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25zKClcbiAgICogLSAudG9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJzKClcbiAgICogLSAudG9SZWdpc3RlclRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VzKClcbiAgICogLSAudG9SZWplY3RUcmFuc2l0R2F0ZXdheU11bHRpY2FzdERvbWFpbkFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvU2VhcmNoVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3RHcm91cHMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1tdWx0aWNhc3QtZG9tYWluXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5JZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgdHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5JZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhIHRyYW5zaXQgZ2F0ZXdheSBwb2xpY3kgdGFibGVcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVRyYW5zaXRHYXRld2F5UG9saWN5VGFibGUoKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0dldFRyYW5zaXRHYXRld2F5UG9saWN5VGFibGVFbnRyaWVzKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB0cmFuc2l0LWdhdGV3YXktcG9saWN5LXRhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVHJhbnNpdEdhdGV3YXlQb2xpY3lUYWJsZUlkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGB0cmFuc2l0R2F0ZXdheVBvbGljeVRhYmxlSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgSUQgb2YgYSB0cmFuc2l0IGdhdGV3YXkgcm91dGUgdGFibGUgYW5ub3VuY2VtZW50XG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudCgpXG4gICAqIC0gLnRvRGlzYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9FbmFibGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVQcm9wYWdhdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlLWFubm91bmNlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUFubm91bmNlbWVudElkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGB0cmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBbm5vdW5jZW1lbnRJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBJRCBvZiBhIHRyYW5zaXQgZ2F0ZXdheSByb3V0ZSB0YWJsZVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0NyZWF0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQW5ub3VuY2VtZW50KClcbiAgICogLSAudG9EZWxldGVUcmFuc2l0R2F0ZXdheVByZWZpeExpc3RSZWZlcmVuY2UoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGUoKVxuICAgKiAtIC50b0RlbGV0ZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSgpXG4gICAqIC0gLnRvRGlzYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUoKVxuICAgKiAtIC50b0VuYWJsZVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlUcmFuc2l0R2F0ZXdheSgpXG4gICAqIC0gLnRvTW9kaWZ5VHJhbnNpdEdhdGV3YXlQcmVmaXhMaXN0UmVmZXJlbmNlKClcbiAgICogLSAudG9SZXBsYWNlVHJhbnNpdEdhdGV3YXlSb3V0ZSgpXG4gICAqIC0gLnRvU2VhcmNoVHJhbnNpdEdhdGV3YXlSb3V0ZXMoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHRyYW5zaXQtZ2F0ZXdheS1yb3V0ZS10YWJsZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUlkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGB0cmFuc2l0R2F0ZXdheVJvdXRlVGFibGVJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IG11bHRpIHJlZ2lvbiBvZiB0aGUgVlBDIGVuZHBvaW50IHNlcnZpY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1lbmRwb2ludHMtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKVxuICAgKiAtIC50b0NyZWF0ZVRhZ3MoKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9ucygpXG4gICAqIC0gLnRvRGVsZXRlVnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbnMoKVxuICAgKiAtIC50b0Rlc2NyaWJlVnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b01vZGlmeVZwY0VuZHBvaW50Q29ubmVjdGlvbk5vdGlmaWNhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGF5ZXJSZXNwb25zaWJpbGl0eSgpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b1JlamVjdFZwY0VuZHBvaW50Q29ubmVjdGlvbnMoKVxuICAgKiAtIC50b1N0YXJ0VnBjRW5kcG9pbnRTZXJ2aWNlUHJpdmF0ZURuc1ZlcmlmaWNhdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gdnBjLWVuZHBvaW50LXNlcnZpY2VcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZWcGNlTXVsdGlSZWdpb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYHZwY2VNdWx0aVJlZ2lvbmAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSByZWdpb24gb2YgdGhlIFZQQyBlbmRwb2ludCBzZXJ2aWNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtZW5kcG9pbnRzLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9DcmVhdGVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVZwY0VuZHBvaW50U2VydmljZUNvbmZpZ3VyYXRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIHZwYy1lbmRwb2ludC1zZXJ2aWNlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmVnBjZVNlcnZpY2VSZWdpb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYHZwY2VTZXJ2aWNlUmVnaW9uYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHN1cHBvcnRlZCByZWdpb24gb2YgdGhlIFZQQyBlbmRwb2ludCBzZXJ2aWNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtZW5kcG9pbnRzLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRWcGNFbmRwb2ludENvbm5lY3Rpb25zKClcbiAgICogLSAudG9DcmVhdGVUYWdzKClcbiAgICogLSAudG9EZWxldGVWcGNFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25zKClcbiAgICogLSAudG9EZWxldGVWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9ucygpXG4gICAqIC0gLnRvRGVzY3JpYmVWcGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvTW9kaWZ5VnBjRW5kcG9pbnRDb25uZWN0aW9uTm90aWZpY2F0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQYXllclJlc3BvbnNpYmlsaXR5KClcbiAgICogLSAudG9Nb2RpZnlWcGNFbmRwb2ludFNlcnZpY2VQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvUmVqZWN0VnBjRW5kcG9pbnRDb25uZWN0aW9ucygpXG4gICAqIC0gLnRvU3RhcnRWcGNFbmRwb2ludFNlcnZpY2VQcml2YXRlRG5zVmVyaWZpY2F0aW9uKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSB2cGMtZW5kcG9pbnQtc2VydmljZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlZwY2VTdXBwb3J0ZWRSZWdpb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYHZwY2VTdXBwb3J0ZWRSZWdpb25gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2VjMl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYW1hem9uZWMyLmh0bWwpLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHM/OiBpYW0uUG9saWN5U3RhdGVtZW50UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbn1cbiJdfQ==