UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

2,100 lines 184 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Deadline = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [deadline](https://docs.aws.amazon.com/service-authorization/latest/reference/list_deadline.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class Deadline extends shared_1.PolicyStatement {
    /**
     * Grants permission to associate a member to a farm
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToFarm.html
     */
    toAssociateMemberToFarm() {
        return this.to('AssociateMemberToFarm');
    }
    /**
     * Grants permission to associate a member to a fleet
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToFleet.html
     */
    toAssociateMemberToFleet() {
        return this.to('AssociateMemberToFleet');
    }
    /**
     * Grants permission to associate a member to a job
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToJob.html
     */
    toAssociateMemberToJob() {
        return this.to('AssociateMemberToJob');
    }
    /**
     * Grants permission to associate a member to a queue
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssociateMemberToQueue.html
     */
    toAssociateMemberToQueue() {
        return this.to('AssociateMemberToQueue');
    }
    /**
     * Grants permission to assume a fleet role for read-only access
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeFleetRoleForRead.html
     */
    toAssumeFleetRoleForRead() {
        return this.to('AssumeFleetRoleForRead');
    }
    /**
     * Grants permission to assume a fleet role for a worker
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeFleetRoleForWorker.html
     */
    toAssumeFleetRoleForWorker() {
        return this.to('AssumeFleetRoleForWorker');
    }
    /**
     * Grants permission to assume a queue role for read-only access
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeQueueRoleForRead.html
     */
    toAssumeQueueRoleForRead() {
        return this.to('AssumeQueueRoleForRead');
    }
    /**
     * Grants permission to assume a queue role for a user
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeQueueRoleForUser.html
     */
    toAssumeQueueRoleForUser() {
        return this.to('AssumeQueueRoleForUser');
    }
    /**
     * Grants permission to assume a queue role for a worker
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_AssumeQueueRoleForWorker.html
     */
    toAssumeQueueRoleForWorker() {
        return this.to('AssumeQueueRoleForWorker');
    }
    /**
     * Grants permission to get a job entity for a worker
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_BatchGetJobEntity.html
     */
    toBatchGetJobEntity() {
        return this.to('BatchGetJobEntity');
    }
    /**
     * Grants permission to copy a job template to an Amazon S3 bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CopyJobTemplate.html
     */
    toCopyJobTemplate() {
        return this.to('CopyJobTemplate');
    }
    /**
     * Grants permission to create a budget
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateBudget.html
     */
    toCreateBudget() {
        return this.to('CreateBudget');
    }
    /**
     * Grants permission to create a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateFarm.html
     */
    toCreateFarm() {
        return this.to('CreateFarm');
    }
    /**
     * Grants permission to create a fleet
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateFleet.html
     */
    toCreateFleet() {
        return this.to('CreateFleet');
    }
    /**
     * Grants permission to create a job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateJob.html
     */
    toCreateJob() {
        return this.to('CreateJob');
    }
    /**
     * Grants permission to create a license endpoint for licensed software or products
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateLicenseEndpoint.html
     */
    toCreateLicenseEndpoint() {
        return this.to('CreateLicenseEndpoint');
    }
    /**
     * Grants permission to create a limit for a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateLimit.html
     */
    toCreateLimit() {
        return this.to('CreateLimit');
    }
    /**
     * Grants permission to create a monitor
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateMonitor.html
     */
    toCreateMonitor() {
        return this.to('CreateMonitor');
    }
    /**
     * Grants permission to create a queue
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueue.html
     */
    toCreateQueue() {
        return this.to('CreateQueue');
    }
    /**
     * Grants permission to create a queue environment
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueEnvironment.html
     */
    toCreateQueueEnvironment() {
        return this.to('CreateQueueEnvironment');
    }
    /**
     * Grants permission to create a queue-fleet association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueFleetAssociation.html
     */
    toCreateQueueFleetAssociation() {
        return this.to('CreateQueueFleetAssociation');
    }
    /**
     * Grants permission to create a queue-limit association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueLimitAssociation.html
     */
    toCreateQueueLimitAssociation() {
        return this.to('CreateQueueLimitAssociation');
    }
    /**
     * Grants permission to create a storage profile for a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateStorageProfile.html
     */
    toCreateStorageProfile() {
        return this.to('CreateStorageProfile');
    }
    /**
     * Grants permission to create a worker
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateWorker.html
     */
    toCreateWorker() {
        return this.to('CreateWorker');
    }
    /**
     * Grants permission to delete a budget
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteBudget.html
     */
    toDeleteBudget() {
        return this.to('DeleteBudget');
    }
    /**
     * Grants permission to delete a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteFarm.html
     */
    toDeleteFarm() {
        return this.to('DeleteFarm');
    }
    /**
     * Grants permission to delete a fleet
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteFleet.html
     */
    toDeleteFleet() {
        return this.to('DeleteFleet');
    }
    /**
     * Grants permission to delete a license endpoint
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteLicenseEndpoint.html
     */
    toDeleteLicenseEndpoint() {
        return this.to('DeleteLicenseEndpoint');
    }
    /**
     * Grants permission to delete a limit
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteLimit.html
     */
    toDeleteLimit() {
        return this.to('DeleteLimit');
    }
    /**
     * Grants permission to delete a metered product
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteMeteredProduct.html
     */
    toDeleteMeteredProduct() {
        return this.to('DeleteMeteredProduct');
    }
    /**
     * Grants permission to delete a monitor
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteMonitor.html
     */
    toDeleteMonitor() {
        return this.to('DeleteMonitor');
    }
    /**
     * Grants permission to delete a queue
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueue.html
     */
    toDeleteQueue() {
        return this.to('DeleteQueue');
    }
    /**
     * Grants permission to delete a queue environment
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueueEnvironment.html
     */
    toDeleteQueueEnvironment() {
        return this.to('DeleteQueueEnvironment');
    }
    /**
     * Grants permission to delete a queue-fleet association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueueFleetAssociation.html
     */
    toDeleteQueueFleetAssociation() {
        return this.to('DeleteQueueFleetAssociation');
    }
    /**
     * Grants permission to delete a queue-limit association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteQueueLimitAssociation.html
     */
    toDeleteQueueLimitAssociation() {
        return this.to('DeleteQueueLimitAssociation');
    }
    /**
     * Grants permission to delete a storage profile
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteStorageProfile.html
     */
    toDeleteStorageProfile() {
        return this.to('DeleteStorageProfile');
    }
    /**
     * Grants permission to delete a volume
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteVolume.html
     */
    toDeleteVolume() {
        return this.to('DeleteVolume');
    }
    /**
     * Grants permission to delete a worker
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DeleteWorker.html
     */
    toDeleteWorker() {
        return this.to('DeleteWorker');
    }
    /**
     * Grants permission to disassociate a member from a farm
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromFarm.html
     */
    toDisassociateMemberFromFarm() {
        return this.to('DisassociateMemberFromFarm');
    }
    /**
     * Grants permission to disassociate a member from a fleet
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromFleet.html
     */
    toDisassociateMemberFromFleet() {
        return this.to('DisassociateMemberFromFleet');
    }
    /**
     * Grants permission to disassociate a member from a job
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromJob.html
     */
    toDisassociateMemberFromJob() {
        return this.to('DisassociateMemberFromJob');
    }
    /**
     * Grants permission to disassociate a member from a queue
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_DisassociateMemberFromQueue.html
     */
    toDisassociateMemberFromQueue() {
        return this.to('DisassociateMemberFromQueue');
    }
    /**
     * Grants permission to get a budget
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetBudget.html
     */
    toGetBudget() {
        return this.to('GetBudget');
    }
    /**
     * Grants permission to get a farm
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetFarm.html
     */
    toGetFarm() {
        return this.to('GetFarm');
    }
    /**
     * Grants permission to get a fleet
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetFleet.html
     */
    toGetFleet() {
        return this.to('GetFleet');
    }
    /**
     * Grants permission to get a job
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetJob.html
     */
    toGetJob() {
        return this.to('GetJob');
    }
    /**
     * Grants permission to get a license endpoint
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetLicenseEndpoint.html
     */
    toGetLicenseEndpoint() {
        return this.to('GetLicenseEndpoint');
    }
    /**
     * Grants permission to get a limit
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetLimit.html
     */
    toGetLimit() {
        return this.to('GetLimit');
    }
    /**
     * Grants permission to get a monitor
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetMonitor.html
     */
    toGetMonitor() {
        return this.to('GetMonitor');
    }
    /**
     * Grants permission to get settings for a monitor
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetMonitorSettings.html
     */
    toGetMonitorSettings() {
        return this.to('GetMonitorSettings');
    }
    /**
     * Grants permission to get a queue
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueue.html
     */
    toGetQueue() {
        return this.to('GetQueue');
    }
    /**
     * Grants permission to get a queue environment
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueueEnvironment.html
     */
    toGetQueueEnvironment() {
        return this.to('GetQueueEnvironment');
    }
    /**
     * Grants permission to get a queue-fleet association
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueueFleetAssociation.html
     */
    toGetQueueFleetAssociation() {
        return this.to('GetQueueFleetAssociation');
    }
    /**
     * Grants permission to get a queue-limit association
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetQueueLimitAssociation.html
     */
    toGetQueueLimitAssociation() {
        return this.to('GetQueueLimitAssociation');
    }
    /**
     * Grants permission to get a session for a job
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetSession.html
     */
    toGetSession() {
        return this.to('GetSession');
    }
    /**
     * Grants permission to get a session action for a job
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetSessionAction.html
     */
    toGetSessionAction() {
        return this.to('GetSessionAction');
    }
    /**
     * Grants permission to get all collected statistics for sessions
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetSessionsStatisticsAggregation.html
     */
    toGetSessionsStatisticsAggregation() {
        return this.to('GetSessionsStatisticsAggregation');
    }
    /**
     * Grants permission to get a step in a job
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStep.html
     */
    toGetStep() {
        return this.to('GetStep');
    }
    /**
     * Grants permission to get a storage profile
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStorageProfile.html
     */
    toGetStorageProfile() {
        return this.to('GetStorageProfile');
    }
    /**
     * Grants permission to get a storage profile for a queue
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetStorageProfileForQueue.html
     */
    toGetStorageProfileForQueue() {
        return this.to('GetStorageProfileForQueue');
    }
    /**
     * Grants permission to get a job task
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetTask.html
     */
    toGetTask() {
        return this.to('GetTask');
    }
    /**
     * Grants permission to get a volume
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetVolume.html
     */
    toGetVolume() {
        return this.to('GetVolume');
    }
    /**
     * Grants permission to get a worker
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_GetWorker.html
     */
    toGetWorker() {
        return this.to('GetWorker');
    }
    /**
     * Grants permission to list all available metered products within a license endpoint
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListAvailableMeteredProducts.html
     */
    toListAvailableMeteredProducts() {
        return this.to('ListAvailableMeteredProducts');
    }
    /**
     * Grants permission to list all budgets for a farm
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListBudgets.html
     */
    toListBudgets() {
        return this.to('ListBudgets');
    }
    /**
     * Grants permission to list all members of a farm
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFarmMembers.html
     */
    toListFarmMembers() {
        return this.to('ListFarmMembers');
    }
    /**
     * Grants permission to list all farms
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFarms.html
     */
    toListFarms() {
        return this.to('ListFarms');
    }
    /**
     * Grants permission to list all members of a fleet
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFleetMembers.html
     */
    toListFleetMembers() {
        return this.to('ListFleetMembers');
    }
    /**
     * Grants permission to list all fleets
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListFleets.html
     */
    toListFleets() {
        return this.to('ListFleets');
    }
    /**
     * Grants permission to list all members of a job
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListJobMembers.html
     */
    toListJobMembers() {
        return this.to('ListJobMembers');
    }
    /**
     * Grants permission to get a job's parameter definitions in the job template
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListJobParameterDefinitions.html
     */
    toListJobParameterDefinitions() {
        return this.to('ListJobParameterDefinitions');
    }
    /**
     * Grants permission to list all jobs in a queue
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListJobs.html
     */
    toListJobs() {
        return this.to('ListJobs');
    }
    /**
     * Grants permission to list all license endpoints
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListLicenseEndpoints.html
     */
    toListLicenseEndpoints() {
        return this.to('ListLicenseEndpoints');
    }
    /**
     * Grants permission to list all limits in a farm
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListLimits.html
     */
    toListLimits() {
        return this.to('ListLimits');
    }
    /**
     * Grants permission to list all metered products in a license endpoint
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListMeteredProducts.html
     */
    toListMeteredProducts() {
        return this.to('ListMeteredProducts');
    }
    /**
     * Grants permission to list all monitors
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListMonitors.html
     */
    toListMonitors() {
        return this.to('ListMonitors');
    }
    /**
     * Grants permission to list all queue environments to which a queue is associated
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueEnvironments.html
     */
    toListQueueEnvironments() {
        return this.to('ListQueueEnvironments');
    }
    /**
     * Grants permission to list all queue-fleet associations
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueFleetAssociations.html
     */
    toListQueueFleetAssociations() {
        return this.to('ListQueueFleetAssociations');
    }
    /**
     * Grants permission to list all queue-limit associations
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueLimitAssociations.html
     */
    toListQueueLimitAssociations() {
        return this.to('ListQueueLimitAssociations');
    }
    /**
     * Grants permission to list all members in a queue
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueueMembers.html
     */
    toListQueueMembers() {
        return this.to('ListQueueMembers');
    }
    /**
     * Grants permission to list all queues on a farm
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListQueues.html
     */
    toListQueues() {
        return this.to('ListQueues');
    }
    /**
     * Grants permission to list all session actions for a job
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSessionActions.html
     */
    toListSessionActions() {
        return this.to('ListSessionActions');
    }
    /**
     * Grants permission to list all sessions for a job
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSessions.html
     */
    toListSessions() {
        return this.to('ListSessions');
    }
    /**
     * Grants permission to list all sessions for a worker
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSessionsForWorker.html
     */
    toListSessionsForWorker() {
        return this.to('ListSessionsForWorker');
    }
    /**
     * Grants permission to list the step consumers for a job step
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStepConsumers.html
     */
    toListStepConsumers() {
        return this.to('ListStepConsumers');
    }
    /**
     * Grants permission to list dependencies for a job step
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStepDependencies.html
     */
    toListStepDependencies() {
        return this.to('ListStepDependencies');
    }
    /**
     * Grants permission to list all steps for a job
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListSteps.html
     */
    toListSteps() {
        return this.to('ListSteps');
    }
    /**
     * Grants permission to list all storage profiles in a farm
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStorageProfiles.html
     */
    toListStorageProfiles() {
        return this.to('ListStorageProfiles');
    }
    /**
     * Grants permission to list all storage profiles in a queue
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListStorageProfilesForQueue.html
     */
    toListStorageProfilesForQueue() {
        return this.to('ListStorageProfilesForQueue');
    }
    /**
     * Grants permission to list all tags on specified Deadline Cloud resources
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListTagsForResource.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to list all tasks for a job
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListTasks.html
     */
    toListTasks() {
        return this.to('ListTasks');
    }
    /**
     * Grants permission to list volumes
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListVolumes.html
     */
    toListVolumes() {
        return this.to('ListVolumes');
    }
    /**
     * Grants permission to list all workers in a fleet
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_ListWorkers.html
     */
    toListWorkers() {
        return this.to('ListWorkers');
    }
    /**
     * Grants permission to add a metered product to a license endpoint
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_PutMeteredProduct.html
     */
    toPutMeteredProduct() {
        return this.to('PutMeteredProduct');
    }
    /**
     * Grants permission to search for jobs in multiple queues
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchJobs.html
     */
    toSearchJobs() {
        return this.to('SearchJobs');
    }
    /**
     * Grants permission to search the steps within a single job or to search the steps for multiple queues
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchSteps.html
     */
    toSearchSteps() {
        return this.to('SearchSteps');
    }
    /**
     * Grants permission to search the tasks within a single job or to search the tasks for multiple queues
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchTasks.html
     */
    toSearchTasks() {
        return this.to('SearchTasks');
    }
    /**
     * Grants permission to search for workers in multiple fleets
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_SearchWorkers.html
     */
    toSearchWorkers() {
        return this.to('SearchWorkers');
    }
    /**
     * Grants permission to get all collected statistics for sessions
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_StartSessionsStatisticsAggregation.html
     */
    toStartSessionsStatisticsAggregation() {
        return this.to('StartSessionsStatisticsAggregation');
    }
    /**
     * Grants permission to add or overwrite one or more tags for the specified Deadline Cloud resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_TagResource.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to disassociate one or more tags from the specified Deadline Cloud resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UntagResource.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to update a budget
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateBudget.html
     */
    toUpdateBudget() {
        return this.to('UpdateBudget');
    }
    /**
     * Grants permission to update a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateFarm.html
     */
    toUpdateFarm() {
        return this.to('UpdateFarm');
    }
    /**
     * Grants permission to update a fleet
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateFleet.html
     */
    toUpdateFleet() {
        return this.to('UpdateFleet');
    }
    /**
     * Grants permission to update a job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateJob.html
     */
    toUpdateJob() {
        return this.to('UpdateJob');
    }
    /**
     * Grants permission to update a limit for a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateLimit.html
     */
    toUpdateLimit() {
        return this.to('UpdateLimit');
    }
    /**
     * Grants permission to update a monitor
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateMonitor.html
     */
    toUpdateMonitor() {
        return this.to('UpdateMonitor');
    }
    /**
     * Grants permission to update settings for a monitor
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateMonitorSettings.html
     */
    toUpdateMonitorSettings() {
        return this.to('UpdateMonitorSettings');
    }
    /**
     * Grants permission to update a queue
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueue.html
     */
    toUpdateQueue() {
        return this.to('UpdateQueue');
    }
    /**
     * Grants permission to update a queue environment
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueueEnvironment.html
     */
    toUpdateQueueEnvironment() {
        return this.to('UpdateQueueEnvironment');
    }
    /**
     * Grants permission to update a queue-fleet association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueueFleetAssociation.html
     */
    toUpdateQueueFleetAssociation() {
        return this.to('UpdateQueueFleetAssociation');
    }
    /**
     * Grants permission to update a queue-limit association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateQueueLimitAssociation.html
     */
    toUpdateQueueLimitAssociation() {
        return this.to('UpdateQueueLimitAssociation');
    }
    /**
     * Grants permission to update a session for a job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateSession.html
     */
    toUpdateSession() {
        return this.to('UpdateSession');
    }
    /**
     * Grants permission to update a step for a job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateStep.html
     */
    toUpdateStep() {
        return this.to('UpdateStep');
    }
    /**
     * Grants permission to update a storage profile for a farm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateStorageProfile.html
     */
    toUpdateStorageProfile() {
        return this.to('UpdateStorageProfile');
    }
    /**
     * Grants permission to update a task
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateTask.html
     */
    toUpdateTask() {
        return this.to('UpdateTask');
    }
    /**
     * Grants permission to update a worker
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateWorker.html
     */
    toUpdateWorker() {
        return this.to('UpdateWorker');
    }
    /**
     * Grants permission to update the schedule for a worker
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_UpdateWorkerSchedule.html
     */
    toUpdateWorkerSchedule() {
        return this.to('UpdateWorkerSchedule');
    }
    /**
     * Grants permission to get the latest version of an application
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/deadline-cloud-jobs.html
     */
    toGetApplicationVersion() {
        return this.to('GetApplicationVersion');
    }
    /**
     * Grants permission to read job template
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/working-with-deadline-monitor.html
     */
    toGetJobTemplate() {
        return this.to('GetJobTemplate');
    }
    /**
     * Adds a resource of type budget to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/manage-costs.html
     *
     * @param farmId - Identifier for the farmId.
     * @param budgetId - Identifier for the budgetId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     */
    onBudget(farmId, budgetId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/budget/${budgetId}`);
    }
    /**
     * Adds a resource of type farm to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/farms.html
     *
     * @param farmId - Identifier for the farmId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     */
    onFarm(farmId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}`);
    }
    /**
     * Adds a resource of type fleet to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/manage-fleets.html
     *
     * @param farmId - Identifier for the farmId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     * - .ifFleetMembershipLevels()
     */
    onFleet(farmId, fleetId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/fleet/${fleetId}`);
    }
    /**
     * Adds a resource of type job to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/deadline-cloud-jobs.html
     *
     * @param farmId - Identifier for the farmId.
     * @param queueId - Identifier for the queueId.
     * @param jobId - Identifier for the jobId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     * - .ifJobMembershipLevels()
     * - .ifQueueMembershipLevels()
     */
    onJob(farmId, queueId, jobId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/queue/${queueId}/job/${jobId}`);
    }
    /**
     * Adds a resource of type license-endpoint to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/cmf-ubl.html
     *
     * @param licenseEndpointId - Identifier for the licenseEndpointId.
     * @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:
     * - .ifAwsResourceTag()
     */
    onLicenseEndpoint(licenseEndpointId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:license-endpoint/${licenseEndpointId}`);
    }
    /**
     * Adds a resource of type monitor to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/working-with-deadline-monitor.html
     *
     * @param monitorId - Identifier for the monitorId.
     * @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:
     * - .ifAwsResourceTag()
     */
    onMonitor(monitorId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:monitor/${monitorId}`);
    }
    /**
     * Adds a resource of type queue to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/queues.html
     *
     * @param farmId - Identifier for the farmId.
     * @param queueId - Identifier for the queueId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     * - .ifQueueMembershipLevels()
     */
    onQueue(farmId, queueId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/queue/${queueId}`);
    }
    /**
     * Adds a resource of type volume to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/volumes.html
     *
     * @param farmId - Identifier for the farmId.
     * @param fleetId - Identifier for the fleetId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     * - .ifFleetMembershipLevels()
     */
    onVolume(farmId, fleetId, volumeId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/fleet/${fleetId}/volume/${volumeId}`);
    }
    /**
     * Adds a resource of type worker to the statement
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam.html
     *
     * @param farmId - Identifier for the farmId.
     * @param fleetId - Identifier for the fleetId.
     * @param workerId - Identifier for the workerId.
     * @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:
     * - .ifAwsResourceTag()
     * - .ifFarmMembershipLevels()
     * - .ifFleetMembershipLevels()
     */
    onWorker(farmId, fleetId, workerId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:deadline:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:farm/${farmId}/fleet/${fleetId}/worker/${workerId}`);
    }
    /**
     * Filters access by the tags that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCreateBudget()
     * - .toCreateFarm()
     * - .toCreateFleet()
     * - .toCreateJob()
     * - .toCreateLicenseEndpoint()
     * - .toCreateMonitor()
     * - .toCreateQueue()
     * - .toCreateWorker()
     * - .toTagResource()
     *
     * @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 the tags associated with the resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toAssociateMemberToFarm()
     * - .toAssociateMemberToFleet()
     * - .toAssociateMemberToJob()
     * - .toAssociateMemberToQueue()
     * - .toAssumeFleetRoleForRead()
     * - .toAssumeFleetRoleForWorker()
     * - .toAssumeQueueRoleForRead()
     * - .toAssumeQueueRoleForUser()
     * - .toAssumeQueueRoleForWorker()
     * - .toBatchGetJobEntity()
     * - .toCopyJobTemplate()
     * - .toCreateBudget()
     * - .toCreateFarm()
     * - .toCreateFleet()
     * - .toCreateJob()
     * - .toCreateLicenseEndpoint()
     * - .toCreateLimit()
     * - .toCreateMonitor()
     * - .toCreateQueue()
     * - .toCreateQueueEnvironment()
     * - .toCreateQueueFleetAssociation()
     * - .toCreateQueueLimitAssociation()
     * - .toCreateStorageProfile()
     * - .toCreateWorker()
     * - .toDeleteBudget()
     * - .toDeleteFarm()
     * - .toDeleteFleet()
     * - .toDeleteLicenseEndpoint()
     * - .toDeleteLimit()
     * - .toDeleteMeteredProduct()
     * - .toDeleteMonitor()
     * - .toDeleteQueue()
     * - .toDeleteQueueEnvironment()
     * - .toDeleteQueueFleetAssociation()
     * - .toDeleteQueueLimitAssociation()
     * - .toDeleteStorageProfile()
     * - .toDeleteVolume()
     * - .toDeleteWorker()
     * - .toDisassociateMemberFromFarm()
     * - .toDisassociateMemberFromFleet()
     * - .toDisassociateMemberFromJob()
     * - .toDisassociateMemberFromQueue()
     * - .toGetBudget()
     * - .toGetFarm()
     * - .toGetFleet()
     * - .toGetJob()
     * - .toGetLicenseEndpoint()
     * - .toGetLimit()
     * - .toGetMonitor()
     * - .toGetMonitorSettings()
     * - .toGetQueue()
     * - .toGetQueueEnvironment()
     * - .toGetQueueFleetAssociation()
     * - .toGetQueueLimitAssociation()
     * - .toGetSession()
     * - .toGetSessionAction()
     * - .toGetSessionsStatisticsAggregation()
     * - .toGetStep()
     * - .toGetStorageProfile()
     * - .toGetStorageProfileForQueue()
     * - .toGetTask()
     * - .toGetVolume()
     * - .toGetWorker()
     * - .toListBudgets()
     * - .toListFarmMembers()
     * - .toListFarms()
     * - .toListFleetMembers()
     * - .toListFleets()
     * - .toListJobMembers()
     * - .toListJobParameterDefinitions()
     * - .toListJobs()
     * - .toListLicenseEndpoints()
     * - .toListLimits()
     * - .toListMeteredProducts()
     * - .toListMonitors()
     * - .toListQueueEnvironments()
     * - .toListQueueFleetAssociations()
     * - .toListQueueLimitAssociations()
     * - .toListQueueMembers()
     * - .toListQueues()
     * - .toListSessionActions()
     * - .toListSessions()
     * - .toListSessionsForWorker()
     * - .toListStepConsumers()
     * - .toListStepDependencies()
     * - .toListSteps()
     * - .toListStorageProfiles()
     * - .toListStorageProfilesForQueue()
     * - .toListTagsForResource()
     * - .toListTasks()
     * - .toListVolumes()
     * - .toListWorkers()
     * - .toPutMeteredProduct()
     * - .toSearchJobs()
     * - .toSearchSteps()
     * - .toSearchTasks()
     * - .toStartSessionsStatisticsAggregation()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateBudget()
     * - .toUpdateFarm()
     * - .toUpdateFleet()
     * - .toUpdateJob()
     * - .toUpdateLimit()
     * - .toUpdateMonitor()
     * - .toUpdateMonitorSettings()
     * - .toUpdateQueue()
     * - .toUpdateQueueEnvironment()
     * - .toUpdateQueueFleetAssociation()
     * - .toUpdateQueueLimitAssociation()
     * - .toUpdateSession()
     * - .toUpdateStep()
     * - .toUpdateStorageProfile()
     * - .toUpdateTask()
     * - .toUpdateWorker()
     * - .toUpdateWorkerSchedule()
     * - .toGetApplicationVersion()
     * - .toGetJobTemplate()
     *
     * Applies to resource types:
     * - budget
     * - farm
     * - fleet
     * - job
     * - license-endpoint
     * - monitor
     * - queue
     * - volume
     * - worker
     *
     * @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 the tag keys that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toCreateBudget()
     * - .toCreateFarm()
     * - .toCreateFleet()
     * - .toCreateJob()
     * - .toCreateLicenseEndpoint()
     * - .toCreateMonitor()
     * - .toCreateQueue()
     * - .toCreateWorker()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * @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 associated membership level of the principal provided in the request
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toAssociateMemberToFarm()
     * - .toAssociateMemberToFleet()
     * - .toAssociateMemberToJob()
     * - .toAssociateMemberToQueue()
     * - .toDisassociateMemberFromFarm()
     * - .toDisassociateMemberFromFleet()
     * - .toDisassociateMemberFromJob()
     * - .toDisassociateMemberFromQueue()
     *
     * @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`
     */
    ifAssociatedMembershipLevel(value, operator) {
        return this.if(`AssociatedMembershipLevel`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the allowed action in the request
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toListTagsForResource()
     * - .toTagResource()
     *
     * @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`
     */
    ifCalledAction(value, operator) {
        return this.if(`CalledAction`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by membership levels on the farm
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toAssociateMemberToFarm()
     * - .toAssociateMemberToFleet()
     * - .toAssociateMemberToJob()
     * - .toAssociateMemberToQueue()
     * - .toAssumeFleetRoleForRead()
     * - .toAssumeFleetRoleForWorker()
     * - .toAssumeQueueRoleForRead()
     * - .toAssumeQueueRoleForUser()
     * - .toAssumeQueueRoleForWorker()
     * - .toBatchGetJobEntity()
     * - .toCopyJobTemplate()
     * - .toCreateBudget()
     * - .toCreateFarm()
     * - .toCreateFleet()
     * - .toCreateJob()
     * - .toCreateLimit()
     * - .toCreateQueue()
     * - .toCreateQueueEnvironment()
     * - .toCreateQueueFleetAssociation()
     * - .toCreateQueueLimitAssociation()
     * - .toCreateStorageProfile()
     * - .toCreateWorker()
     * - .toDeleteBudget()
     * - .toDeleteFarm()
     * - .toDeleteFleet()
     * - .toDeleteLimit()
     * - .toDeleteQueue()
     * - .toDeleteQueueEnvironment()
     * - .toDeleteQueueFleetAssociation()
     * - .toDeleteQueueLimitAssociation()
     * - .toDeleteStorageProfile()
     * - .toDeleteVolume()
     * - .toDeleteWorker()
     * - .toDisassociateMemberFromFarm()
     * - .toDisassociateMemberFromFleet()
     * - .toDisassociateMemberFromJob()
     * - .toDisassociateMemberFromQueue()
     * - .toGetBudget()
     * - .toGetFarm()
     * - .toGetFleet()
     * - .toGetJob()
     * - .toGetLimit()
     * - .toGetQueue()
     * - .toGetQueueEnvironment()
     * - .toGetQueueFleetAssociation()
     * - .toGetQueueLimitAssociation()
     * - .toGetSession()
     * - .toGetSessionAction()
     * - .toGetSessionsStatisticsAggregation()
     * - .toGetStep()
     * - .toGetStorageProfile()
     * - .toGetStorageProfileForQueue()
     * - .toGetTask()
     * - .toGetVolume()
     * - .toGetWorker()
     * - .toListBudgets()
     * - .toListFarmMembers()
     * - .toListFarms()
     * - .toListFleetMembers()
     * - .toListFleets()
     * - .toListJobMembers()
     * - .toListJobParameterDefinitions()
     * - .toListJobs()
     * - .toListLimits()
     * - .toListQueueEnvironments()
     * - .toListQueueFleetAssociations()
     * - .toListQueueLimitAssociations()
     * - .toListQueueMembers()
     * - .toListQueues()
     * - .toListSessionActions()
     * - .toListSessions()
     * - .toListSessionsForWorker()
     * - .toListStepConsumers()
     * - .toListStepDependencies()
     * - .toListSteps()
     * - .toListStorageProfiles()
     * - .toListStorageProfilesForQueue()
     * - .toListTagsForResource()
     * - .toListTasks()
     * - .toListVolumes()
     * - .toListWorkers()
     * - .toSearchJobs()
     * - .toSearchSteps()
     * - .toSearchTasks()
     * - .toStartSessionsStatisticsAggregation()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateBudget()
     * - .toUpdateFarm()
     * - .toUpdateFleet()
     * - .toUpdateJob()
     * - .toUpdateLimit()
     * - .toUpdateQueue()
     * - .toUpdateQueueEnvironment()
     * - .toUpdateQueueFleetAssociation()
     * - .toUpdateQueueLimitAssociation()
     * - .toUpdateSession()
     * - .toUpdateStep()
     * - .toUpdateStorageProfile()
     * - .toUpdateTask()
     * - .toUpdateWorker()
     * - .toUpdateWorkerSchedule()
     * - .toGetJobTemplate()
     *
     * Applies to resource types:
     * - budget
     * - farm
     * - fleet
     * - job
     * - queue
     * - volume
     * - worker
     *
     * @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`
     */
    ifFarmMembershipLevels(value, operator) {
        return this.if(`FarmMembershipLevels`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by membership levels on the fleet
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toAssociateMemberToFleet()
     * - .toAssumeFleetRoleForRead()
     * - .toAssumeFleetRoleForWorker()
     * - .toAssumeQueueRoleForWorker()
     * - .toBatchGetJobEntity()
     * - .toCreateFleet()
     * - .toCreateQueueFleetAssociation()
     * - .toCreateWorker()
     * - .toDeleteFleet()
     * - .toDeleteQueueFleetAssociation()
     * - .toDeleteVolume()
     * - .toDeleteWorker()
     * - .toDisassociateMemberFromFleet()
     * - .toGetFleet()
     * - .toGetQueueFleetAssociation()
     * - .toGetSessionsStatisticsAggregation()
     * - .toGetVolume()
     * - .toGetWorker()
     * - .toListFleetMembers()
     * - .toListFleets()
     * - .toListQueueFleetAssociations()
     * - .toListSessionsForWorker()
     * - .toListTagsForResource()
     * - .toListVolumes()
     * - .toListWorkers()
     * - .toStartSessionsStatisticsAggregation()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateFleet()
     * - .toUpdateQueueFleetAssociation()
     * - .toUpdateWorker()
     * - .toUpdateWorkerSchedule()
     *
     * Applies to resource types:
     * - fleet
     * - volume
     * - worker
     *
     * @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`
     */
    ifFleetMembershipLevels(value, operator) {
        return this.if(`FleetMembershipLevels`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by membership levels on the job
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toAssociateMemberToJob()
     * - .toCopyJobTemplate()
     * - .toCreateJob()
     * - .toDisassociateMemberFromJob()
     * - .toGetJob()
     * - .toGetSession()
     * - .toGetSessionAction()
     * - .toGetStep()
     * - .toGetTask()
     * - .toListJobMembers()
     * - .toListJobParameterDefinitions()
     * - .toListJobs()
     * - .toListSessionActions()
     * - .toListSessions()
     * - .toListStepConsumers()
     * - .toListStepDependencies()
     * - .toListSteps()
     * - .toListTagsForResource()
     * - .toListTasks()
     * - .toSearchSteps()
     * - .toSearchTasks()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateJob()
     * - .toUpdateSession()
     * - .toUpdateStep()
     * - .toUpdateTask()
     * - .toGetJobTemplate()
     *
     * Applies to resource types:
     * - job
     *
     * @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`
     */
    ifJobMembershipLevels(value, operator) {
        return this.if(`JobMembershipLevels`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the membership level passed in the request
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toAssociateMemberToFarm()
     * - .toAssociateMemberToFleet()
     * - .toAssociateMemberToJob()
     * - .toAssociateMemberToQueue()
     *
     * @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`
     */
    ifMembershipLevel(value, operator) {
        return this.if(`MembershipLevel`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the principle ID provided in the request
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toListFarms()
     * - .toListFleets()
     * - .toListJobs()
     * - .toListQueues()
     *
     * @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`
     */
    ifPrincipalId(value, operator) {
        return this.if(`PrincipalId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by membership levels on the queue
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toAssociateMemberToJob()
     * - .toAssociateMemberToQueue()
     * - .toAssumeQueueRoleForRead()
     * - .toAssumeQueueRoleForUser()
     * - .toAssumeQueueRoleForWorker()
     * - .toCopyJobTemplate()
     * - .toCreateJob()
     * - .toCreateQueue()
     * - .toCreateQueueEnvironment()
     * - .toCreateQueueFleetAssociation()
     * - .toCreateQueueLimitAssociation()
     * - .toDeleteQueue()
     * - .toDeleteQueueEnvironment()
     * - .toDeleteQueueFleetAssociation()
     * - .toDeleteQueueLimitAssociation()
     * - .toDisassociateMemberFromJob()
     * - .toDisassociateMemberFromQueue()
     * - .toGetJob()
     * - .toGetQueue()
     * - .toGetQueueEnvironment()
     * - .toGetQueueFleetAssociation()
     * - .toGetQueueLimitAssociation()
     * - .toGetSession()
     * - .toGetSessionAction()
     * - .toGetSessionsStatisticsAggregation()
     * - .toGetStep()
     * - .toGetStorageProfileForQueue()
     * - .toGetTask()
     * - .toListJobMembers()
     * - .toListJobParameterDefinitions()
     * - .toListJobs()
     * - .toListQueueEnvironments()
     * - .toListQueueFleetAssociations()
     * - .toListQueueLimitAssociations()
     * - .toListQueueMembers()
     * - .toListQueues()
     * - .toListSessionActions()
     * - .toListSessions()
     * - .toListStepConsumers()
     * - .toListStepDependencies()
     * - .toListSteps()
     * - .toListStorageProfilesForQueue()
     * - .toListTagsForResource()
     * - .toListTasks()
     * - .toSearchJobs()
     * - .toSearchSteps()
     * - .toSearchTasks()
     * - .toStartSessionsStatisticsAggregation()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateJob()
     * - .toUpdateQueue()
     * - .toUpdateQueueEnvironment()
     * - .toUpdateQueueFleetAssociation()
     * - .toUpdateQueueLimitAssociation()
     * - .toUpdateSession()
     * - .toUpdateStep()
     * - .toUpdateTask()
     * - .toGetJobTemplate()
     *
     * Applies to resource types:
     * - job
     * - queue
     *
     * @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`
     */
    ifQueueMembershipLevels(value, operator) {
        return this.if(`QueueMembershipLevels`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the user calling the Deadline Cloud API
     *
     * https://docs.aws.amazon.com/deadline-cloud/latest/userguide/security-iam-service-with-iam.html
     *
     * Applies to actions:
     * - .toListFarms()
     * - .toListFleets()
     * - .toListJobs()
     * - .toListQueues()
     *
     * @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`
     */
    ifRequesterPrincipalId(value, operator) {
        return this.if(`RequesterPrincipalId`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [deadline](https://docs.aws.amazon.com/service-authorization/latest/reference/list_deadline.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'deadline';
        this.accessLevelList = {
            'Permissions management': [
                'AssociateMemberToFarm',
                'AssociateMemberToFleet',
                'AssociateMemberToJob',
                'AssociateMemberToQueue',
                'DisassociateMemberFromFarm',
                'DisassociateMemberFromFleet',
                'DisassociateMemberFromJob',
                'DisassociateMemberFromQueue'
            ],
            Write: [
                'AssociateMemberToFarm',
                'AssociateMemberToFleet',
                'AssociateMemberToJob',
                'AssociateMemberToQueue',
                'AssumeFleetRoleForRead',
                'AssumeFleetRoleForWorker',
                'AssumeQueueRoleForRead',
                'AssumeQueueRoleForUser',
                'AssumeQueueRoleForWorker',
                'CopyJobTemplate',
                'CreateBudget',
                'CreateFarm',
                'CreateFleet',
                'CreateJob',
                'CreateLicenseEndpoint',
                'CreateLimit',
                'CreateMonitor',
                'CreateQueue',
                'CreateQueueEnvironment',
                'CreateQueueFleetAssociation',
                'CreateQueueLimitAssociation',
                'CreateStorageProfile',
                'CreateWorker',
                'DeleteBudget',
                'DeleteFarm',
                'DeleteFleet',
                'DeleteLicenseEndpoint',
                'DeleteLimit',
                'DeleteMeteredProduct',
                'DeleteMonitor',
                'DeleteQueue',
                'DeleteQueueEnvironment',
                'DeleteQueueFleetAssociation',
                'DeleteQueueLimitAssociation',
                'DeleteStorageProfile',
                'DeleteVolume',
                'DeleteWorker',
                'DisassociateMemberFromFarm',
                'DisassociateMemberFromFleet',
                'DisassociateMemberFromJob',
                'DisassociateMemberFromQueue',
                'PutMeteredProduct',
                'TagResource',
                'UntagResource',
                'UpdateBudget',
                'UpdateFarm',
                'UpdateFleet',
                'UpdateJob',
                'UpdateLimit',
                'UpdateMonitor',
                'UpdateMonitorSettings',
                'UpdateQueue',
                'UpdateQueueEnvironment',
                'UpdateQueueFleetAssociation',
                'UpdateQueueLimitAssociation',
                'UpdateSession',
                'UpdateStep',
                'UpdateStorageProfile',
                'UpdateTask',
                'UpdateWorker',
                'UpdateWorkerSchedule'
            ],
            Read: [
                'BatchGetJobEntity',
                'GetBudget',
                'GetFarm',
                'GetFleet',
                'GetJob',
                'GetLicenseEndpoint',
                'GetLimit',
                'GetMonitor',
                'GetMonitorSettings',
                'GetQueue',
                'GetQueueEnvironment',
                'GetQueueFleetAssociation',
                'GetQueueLimitAssociation',
                'GetSession',
                'GetSessionAction',
                'GetSessionsStatisticsAggregation',
                'GetStep',
                'GetStorageProfile',
                'GetStorageProfileForQueue',
                'GetTask',
                'GetVolume',
                'GetWorker',
                'ListTagsForResource',
                'SearchJobs',
                'SearchSteps',
                'SearchTasks',
                'SearchWorkers',
                'StartSessionsStatisticsAggregation',
                'GetApplicationVersion',
                'GetJobTemplate'
            ],
            List: [
                'ListAvailableMeteredProducts',
                'ListBudgets',
                'ListFarmMembers',
                'ListFarms',
                'ListFleetMembers',
                'ListFleets',
                'ListJobMembers',
                'ListJobParameterDefinitions',
                'ListJobs',
                'ListLicenseEndpoints',
                'ListLimits',
                'ListMeteredProducts',
                'ListMonitors',
                'ListQueueEnvironments',
                'ListQueueFleetAssociations',
                'ListQueueLimitAssociations',
                'ListQueueMembers',
                'ListQueues',
                'ListSessionActions',
                'ListSessions',
                'ListSessionsForWorker',
                'ListStepConsumers',
                'ListStepDependencies',
                'ListSteps',
                'ListStorageProfiles',
                'ListStorageProfilesForQueue',
                'ListTasks',
                'ListVolumes',
                'ListWorkers'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.Deadline = Deadline;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZWFkbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsUUFBUyxTQUFRLHdCQUFlO0lBRzNDOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFD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QUNaLGdCQUFnQjtnQkFDaEIsNkJBQTZCO2dCQUM3QixVQUFVO2dCQUNWLHNCQUFzQjtnQkFDdEIsWUFBWTtnQkFDWixxQkFBcUI7Z0JBQ3JCLGNBQWM7Z0JBQ2QsdUJBQXVCO2dCQUN2Qiw0QkFBNEI7Z0JBQzVCLDRCQUE0QjtnQkFDNUIsa0JBQWtCO2dCQUNsQixZQUFZO2dCQUNaLG9CQUFvQjtnQkFDcEIsY0FBYztnQkFDZCx1QkFBdUI7Z0JBQ3ZCLG1CQUFtQjtnQkFDbkIsc0JBQXNCO2dCQUN0QixXQUFXO2dCQUNYLHFCQUFxQjtnQkFDckIsNkJBQTZCO2dCQUM3QixXQUFXO2dCQUNYLGFBQWE7Z0JBQ2IsYUFBYTthQUNkO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUE4dkJGLENBQUM7Q0FDRjtBQXZyRUQsNEJBdXJFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbZGVhZGxpbmVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2RlYWRsaW5lLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgRGVhZGxpbmUgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdkZWFkbGluZSc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIG1lbWJlciB0byBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlTWVtYmVyVG9GYXJtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlTWVtYmVyVG9GYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGEgbWVtYmVyIHRvIGEgZmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzb2NpYXRlTWVtYmVyVG9GbGVldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVNZW1iZXJUb0ZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVNZW1iZXJUb0ZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGEgbWVtYmVyIHRvIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZU1lbWJlclRvSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZU1lbWJlclRvSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVNZW1iZXJUb0pvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIG1lbWJlciB0byBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc29jaWF0ZU1lbWJlclRvUXVldWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlTWVtYmVyVG9RdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlTWVtYmVyVG9RdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc3VtZSBhIGZsZWV0IHJvbGUgZm9yIHJlYWQtb25seSBhY2Nlc3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lRmxlZXRSb2xlRm9yUmVhZC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3N1bWVGbGVldFJvbGVGb3JSZWFkKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3N1bWVGbGVldFJvbGVGb3JSZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzdW1lIGEgZmxlZXQgcm9sZSBmb3IgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lRmxlZXRSb2xlRm9yV29ya2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc3VtZUZsZWV0Um9sZUZvcldvcmtlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzdW1lRmxlZXRSb2xlRm9yV29ya2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzdW1lIGEgcXVldWUgcm9sZSBmb3IgcmVhZC1vbmx5IGFjY2Vzc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3N1bWVRdWV1ZVJvbGVGb3JSZWFkLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3N1bWUgYSBxdWV1ZSByb2xlIGZvciBhIHVzZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lUXVldWVSb2xlRm9yVXNlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3N1bWVRdWV1ZVJvbGVGb3JVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3N1bWVRdWV1ZVJvbGVGb3JVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzdW1lIGEgcXVldWUgcm9sZSBmb3IgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXNzdW1lUXVldWVSb2xlRm9yV29ya2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzdW1lUXVldWVSb2xlRm9yV29ya2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgam9iIGVudGl0eSBmb3IgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9CYXRjaEdldEpvYkVudGl0eS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldEpvYkVudGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRKb2JFbnRpdHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IGEgam9iIHRlbXBsYXRlIHRvIGFuIEFtYXpvbiBTMyBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ29weUpvYlRlbXBsYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvcHlKb2JUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ29weUpvYlRlbXBsYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgYnVkZ2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUJ1ZGdldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCdWRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUJ1ZGdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRmFybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVGYXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVGYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgZmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpY2Vuc2UgZW5kcG9pbnQgZm9yIGxpY2Vuc2VkIHNvZnR3YXJlIG9yIHByb2R1Y3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxpY2Vuc2VFbmRwb2ludC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMaWNlbnNlRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpbWl0IGZvciBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlTGltaXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGltaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxpbWl0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVRdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUXVldWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZUVudmlyb25tZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVF1ZXVlRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVF1ZXVlRW52aXJvbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUXVldWVGbGVldEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBxdWV1ZS1saW1pdCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBzdG9yYWdlIHByb2ZpbGUgZm9yIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVTdG9yYWdlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTdG9yYWdlUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlU3RvcmFnZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB3b3JrZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlV29ya2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVdvcmtlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlV29ya2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgYnVkZ2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUJ1ZGdldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVCdWRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUJ1ZGdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRmFybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVGYXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVGYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgZmxlZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRmxlZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUZsZWV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbGljZW5zZSBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMaWNlbnNlRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTGljZW5zZUVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMaWNlbnNlRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBsaW1pdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMaW1pdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMaW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTGltaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBtZXRlcmVkIHByb2R1Y3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTWV0ZXJlZFByb2R1Y3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTWV0ZXJlZFByb2R1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU1ldGVyZWRQcm9kdWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVRdWV1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUXVldWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZUVudmlyb25tZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUXVldWVGbGVldEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBxdWV1ZS1saW1pdCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzdG9yYWdlIHByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU3RvcmFnZVByb2ZpbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3RvcmFnZVByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVN0b3JhZ2VQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdm9sdW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVZvbHVtZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVZvbHVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHdvcmtlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVXb3JrZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlV29ya2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVXb3JrZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBtZW1iZXIgZnJvbSBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZhcm0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZhcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GYXJtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgbWVtYmVyIGZyb20gYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnQsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBtZW1iZXIgZnJvbSBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnQsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBtZW1iZXIgZnJvbSBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGJ1ZGdldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEJ1ZGdldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRCdWRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEJ1ZGdldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRGYXJtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZhcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEZhcm0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEZsZWV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEZsZWV0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRGbGVldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRMaWNlbnNlRW5kcG9pbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGljZW5zZUVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMaWNlbnNlRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaW1pdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldExpbWl0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldExpbWl0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMaW1pdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIG1vbml0b3JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc2V0dGluZ3MgZm9yIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldE1vbml0b3JTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNb25pdG9yU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vbml0b3JTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UXVldWUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXVlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgcXVldWUgZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRRdWV1ZUVudmlyb25tZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXVlRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXVlRW52aXJvbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHF1ZXVlLWxpbWl0IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXVlTGltaXRBc3NvY2lhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc2Vzc2lvbiBmb3IgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzZXNzaW9uIGFjdGlvbiBmb3IgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTZXNzaW9uQWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb25BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb25BY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYWxsIGNvbGxlY3RlZCBzdGF0aXN0aWNzIGZvciBzZXNzaW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHN0ZXAgaW4gYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdGVwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0ZXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0ZXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzdG9yYWdlIHByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdG9yYWdlUHJvZmlsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdG9yYWdlUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U3RvcmFnZVByb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBzdG9yYWdlIHByb2ZpbGUgZm9yIGEgcXVldWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRTdG9yYWdlUHJvZmlsZUZvclF1ZXVlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBqb2IgdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFRhc2suaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHZvbHVtZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFZvbHVtZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRWb2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZvbHVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIHdvcmtlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFdvcmtlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdvcmtlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIGF2YWlsYWJsZSBtZXRlcmVkIHByb2R1Y3RzIHdpdGhpbiBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QXZhaWxhYmxlTWV0ZXJlZFByb2R1Y3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBdmFpbGFibGVNZXRlcmVkUHJvZHVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBdmFpbGFibGVNZXRlcmVkUHJvZHVjdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBidWRnZXRzIGZvciBhIGZhcm1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QnVkZ2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QnVkZ2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJ1ZGdldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBtZW1iZXJzIG9mIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RGYXJtTWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmFybU1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RGYXJtTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIGZhcm1zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZhcm1zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RGYXJtcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEZhcm1zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWVtYmVycyBvZiBhIGZsZWV0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZsZWV0TWVtYmVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmxlZXRNZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RmxlZXRNZW1iZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgZmxlZXRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEZsZWV0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmxlZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RmxlZXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWVtYmVycyBvZiBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RKb2JNZW1iZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RKb2JNZW1iZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Sm9iTWVtYmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGpvYidzIHBhcmFtZXRlciBkZWZpbml0aW9ucyBpbiB0aGUgam9iIHRlbXBsYXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEpvYlBhcmFtZXRlckRlZmluaXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEpvYlBhcmFtZXRlckRlZmluaXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgam9icyBpbiBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEpvYnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbGljZW5zZSBlbmRwb2ludHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0TGljZW5zZUVuZHBvaW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TGljZW5zZUVuZHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdExpY2Vuc2VFbmRwb2ludHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBsaW1pdHMgaW4gYSBmYXJtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdExpbWl0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TGltaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TGltaXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgbWV0ZXJlZCBwcm9kdWN0cyBpbiBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0TWV0ZXJlZFByb2R1Y3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RNZXRlcmVkUHJvZHVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNZXRlcmVkUHJvZHVjdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBtb25pdG9yc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RNb25pdG9ycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TW9uaXRvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNb25pdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHF1ZXVlIGVudmlyb25tZW50cyB0byB3aGljaCBhIHF1ZXVlIGlzIGFzc29jaWF0ZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVFbnZpcm9ubWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFF1ZXVlRW52aXJvbm1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UXVldWVFbnZpcm9ubWVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBxdWV1ZS1mbGVldCBhc3NvY2lhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFF1ZXVlRmxlZXRBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBxdWV1ZS1saW1pdCBhc3NvY2lhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVMaW1pdEFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UXVldWVMaW1pdEFzc29jaWF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFF1ZXVlTGltaXRBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBtZW1iZXJzIGluIGEgcXVldWVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UXVldWVNZW1iZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RRdWV1ZU1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RRdWV1ZU1lbWJlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBxdWV1ZXMgb24gYSBmYXJtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFF1ZXVlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UXVldWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgc2Vzc2lvbiBhY3Rpb25zIGZvciBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9uQWN0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbkFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9uQWN0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHNlc3Npb25zIGZvciBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHNlc3Npb25zIGZvciBhIHdvcmtlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9uc0Zvcldvcmtlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbnNGb3JXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9uc0ZvcldvcmtlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHN0ZXAgY29uc3VtZXJzIGZvciBhIGpvYiBzdGVwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFN0ZXBDb25zdW1lcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0ZXBDb25zdW1lcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTdGVwQ29uc3VtZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkZXBlbmRlbmNpZXMgZm9yIGEgam9iIHN0ZXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U3RlcERlcGVuZGVuY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U3RlcERlcGVuZGVuY2llcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN0ZXBEZXBlbmRlbmNpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBzdGVwcyBmb3IgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U3RlcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0ZXBzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3RlcHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBzdG9yYWdlIHByb2ZpbGVzIGluIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdG9yYWdlUHJvZmlsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN0b3JhZ2VQcm9maWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFN0b3JhZ2VQcm9maWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHN0b3JhZ2UgcHJvZmlsZXMgaW4gYSBxdWV1ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U3RvcmFnZVByb2ZpbGVzRm9yUXVldWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRhZ3Mgb24gc3BlY2lmaWVkIERlYWRsaW5lIENsb3VkIHJlc291cmNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRhc2tzIGZvciBhIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYXNrcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgdm9sdW1lc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RWb2x1bWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RWb2x1bWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Vm9sdW1lcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHdvcmtlcnMgaW4gYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RXb3JrZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RXb3JrZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0V29ya2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBhIG1ldGVyZWQgcHJvZHVjdCB0byBhIGxpY2Vuc2UgZW5kcG9pbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0TWV0ZXJlZFByb2R1Y3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0TWV0ZXJlZFByb2R1Y3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dE1ldGVyZWRQcm9kdWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciBqb2JzIGluIG11bHRpcGxlIHF1ZXVlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlYXJjaEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoSm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoSm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCB0aGUgc3RlcHMgd2l0aGluIGEgc2luZ2xlIGpvYiBvciB0byBzZWFyY2ggdGhlIHN0ZXBzIGZvciBtdWx0aXBsZSBxdWV1ZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TZWFyY2hTdGVwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hTdGVwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoU3RlcHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggdGhlIHRhc2tzIHdpdGhpbiBhIHNpbmdsZSBqb2Igb3IgdG8gc2VhcmNoIHRoZSB0YXNrcyBmb3IgbXVsdGlwbGUgcXVldWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU2VhcmNoVGFza3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlYXJjaFRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciB3b3JrZXJzIGluIG11bHRpcGxlIGZsZWV0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlYXJjaFdvcmtlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoV29ya2VycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoV29ya2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhbGwgY29sbGVjdGVkIHN0YXRpc3RpY3MgZm9yIHNlc3Npb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIG9yIG92ZXJ3cml0ZSBvbmUgb3IgbW9yZSB0YWdzIGZvciB0aGUgc3BlY2lmaWVkIERlYWRsaW5lIENsb3VkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBvbmUgb3IgbW9yZSB0YWdzIGZyb20gdGhlIHNwZWNpZmllZCBEZWFkbGluZSBDbG91ZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBidWRnZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlQnVkZ2V0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUJ1ZGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQnVkZ2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVGYXJtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUZhcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUZhcm0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBmbGVldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVGbGVldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVGbGVldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRmxlZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgbGltaXQgZm9yIGEgZmFybVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVMaW1pdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVMaW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTGltaXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZU1vbml0b3IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTW9uaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTW9uaXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBzZXR0aW5ncyBmb3IgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZU1vbml0b3JTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVNb25pdG9yU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1vbml0b3JTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVF1ZXVlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVRdWV1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlRW52aXJvbm1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUXVldWVFbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUXVldWVFbnZpcm9ubWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlLWZsZWV0IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHF1ZXVlLWxpbWl0IGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHNlc3Npb24gZm9yIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVNlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0ZXAgZm9yIGEgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVN0ZXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU3RlcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHN0b3JhZ2UgcHJvZmlsZSBmb3IgYSBmYXJtXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVN0b3JhZ2VQcm9maWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVN0b3JhZ2VQcm9maWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTdG9yYWdlUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlVGFzay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgd29ya2VyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVdvcmtlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVdvcmtlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgc2NoZWR1bGUgZm9yIGEgd29ya2VyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVdvcmtlclNjaGVkdWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVdvcmtlclNjaGVkdWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVXb3JrZXJTY2hlZHVsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYW4gYXBwbGljYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL2RlYWRsaW5lLWNsb3VkLWpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QXBwbGljYXRpb25WZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBcHBsaWNhdGlvblZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWFkIGpvYiB0ZW1wbGF0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvd29ya2luZy13aXRoLWRlYWRsaW5lLW1vbml0b3IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Sm9iVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEpvYlRlbXBsYXRlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgJ1Blcm1pc3Npb25zIG1hbmFnZW1lbnQnOiBbXG4gICAgICAnQXNzb2NpYXRlTWVtYmVyVG9GYXJtJyxcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb0ZsZWV0JyxcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb0pvYicsXG4gICAgICAnQXNzb2NpYXRlTWVtYmVyVG9RdWV1ZScsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZhcm0nLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GbGVldCcsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUpvYicsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbVF1ZXVlJ1xuICAgIF0sXG4gICAgV3JpdGU6IFtcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb0Zhcm0nLFxuICAgICAgJ0Fzc29jaWF0ZU1lbWJlclRvRmxlZXQnLFxuICAgICAgJ0Fzc29jaWF0ZU1lbWJlclRvSm9iJyxcbiAgICAgICdBc3NvY2lhdGVNZW1iZXJUb1F1ZXVlJyxcbiAgICAgICdBc3N1bWVGbGVldFJvbGVGb3JSZWFkJyxcbiAgICAgICdBc3N1bWVGbGVldFJvbGVGb3JXb3JrZXInLFxuICAgICAgJ0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQnLFxuICAgICAgJ0Fzc3VtZVF1ZXVlUm9sZUZvclVzZXInLFxuICAgICAgJ0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcicsXG4gICAgICAnQ29weUpvYlRlbXBsYXRlJyxcbiAgICAgICdDcmVhdGVCdWRnZXQnLFxuICAgICAgJ0NyZWF0ZUZhcm0nLFxuICAgICAgJ0NyZWF0ZUZsZWV0JyxcbiAgICAgICdDcmVhdGVKb2InLFxuICAgICAgJ0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCcsXG4gICAgICAnQ3JlYXRlTGltaXQnLFxuICAgICAgJ0NyZWF0ZU1vbml0b3InLFxuICAgICAgJ0NyZWF0ZVF1ZXVlJyxcbiAgICAgICdDcmVhdGVRdWV1ZUVudmlyb25tZW50JyxcbiAgICAgICdDcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nLFxuICAgICAgJ0NyZWF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbicsXG4gICAgICAnQ3JlYXRlU3RvcmFnZVByb2ZpbGUnLFxuICAgICAgJ0NyZWF0ZVdvcmtlcicsXG4gICAgICAnRGVsZXRlQnVkZ2V0JyxcbiAgICAgICdEZWxldGVGYXJtJyxcbiAgICAgICdEZWxldGVGbGVldCcsXG4gICAgICAnRGVsZXRlTGljZW5zZUVuZHBvaW50JyxcbiAgICAgICdEZWxldGVMaW1pdCcsXG4gICAgICAnRGVsZXRlTWV0ZXJlZFByb2R1Y3QnLFxuICAgICAgJ0RlbGV0ZU1vbml0b3InLFxuICAgICAgJ0RlbGV0ZVF1ZXVlJyxcbiAgICAgICdEZWxldGVRdWV1ZUVudmlyb25tZW50JyxcbiAgICAgICdEZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24nLFxuICAgICAgJ0RlbGV0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbicsXG4gICAgICAnRGVsZXRlU3RvcmFnZVByb2ZpbGUnLFxuICAgICAgJ0RlbGV0ZVZvbHVtZScsXG4gICAgICAnRGVsZXRlV29ya2VyJyxcbiAgICAgICdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmFybScsXG4gICAgICAnRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZsZWV0JyxcbiAgICAgICdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iJyxcbiAgICAgICdEaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUnLFxuICAgICAgJ1B1dE1ldGVyZWRQcm9kdWN0JyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQnVkZ2V0JyxcbiAgICAgICdVcGRhdGVGYXJtJyxcbiAgICAgICdVcGRhdGVGbGVldCcsXG4gICAgICAnVXBkYXRlSm9iJyxcbiAgICAgICdVcGRhdGVMaW1pdCcsXG4gICAgICAnVXBkYXRlTW9uaXRvcicsXG4gICAgICAnVXBkYXRlTW9uaXRvclNldHRpbmdzJyxcbiAgICAgICdVcGRhdGVRdWV1ZScsXG4gICAgICAnVXBkYXRlUXVldWVFbnZpcm9ubWVudCcsXG4gICAgICAnVXBkYXRlUXVldWVGbGVldEFzc29jaWF0aW9uJyxcbiAgICAgICdVcGRhdGVRdWV1ZUxpbWl0QXNzb2NpYXRpb24nLFxuICAgICAgJ1VwZGF0ZVNlc3Npb24nLFxuICAgICAgJ1VwZGF0ZVN0ZXAnLFxuICAgICAgJ1VwZGF0ZVN0b3JhZ2VQcm9maWxlJyxcbiAgICAgICdVcGRhdGVUYXNrJyxcbiAgICAgICdVcGRhdGVXb3JrZXInLFxuICAgICAgJ1VwZGF0ZVdvcmtlclNjaGVkdWxlJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0JhdGNoR2V0Sm9iRW50aXR5JyxcbiAgICAgICdHZXRCdWRnZXQnLFxuICAgICAgJ0dldEZhcm0nLFxuICAgICAgJ0dldEZsZWV0JyxcbiAgICAgICdHZXRKb2InLFxuICAgICAgJ0dldExpY2Vuc2VFbmRwb2ludCcsXG4gICAgICAnR2V0TGltaXQnLFxuICAgICAgJ0dldE1vbml0b3InLFxuICAgICAgJ0dldE1vbml0b3JTZXR0aW5ncycsXG4gICAgICAnR2V0UXVldWUnLFxuICAgICAgJ0dldFF1ZXVlRW52aXJvbm1lbnQnLFxuICAgICAgJ0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbicsXG4gICAgICAnR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uJyxcbiAgICAgICdHZXRTZXNzaW9uJyxcbiAgICAgICdHZXRTZXNzaW9uQWN0aW9uJyxcbiAgICAgICdHZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbicsXG4gICAgICAnR2V0U3RlcCcsXG4gICAgICAnR2V0U3RvcmFnZVByb2ZpbGUnLFxuICAgICAgJ0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUnLFxuICAgICAgJ0dldFRhc2snLFxuICAgICAgJ0dldFZvbHVtZScsXG4gICAgICAnR2V0V29ya2VyJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJyxcbiAgICAgICdTZWFyY2hKb2JzJyxcbiAgICAgICdTZWFyY2hTdGVwcycsXG4gICAgICAnU2VhcmNoVGFza3MnLFxuICAgICAgJ1NlYXJjaFdvcmtlcnMnLFxuICAgICAgJ1N0YXJ0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24nLFxuICAgICAgJ0dldEFwcGxpY2F0aW9uVmVyc2lvbicsXG4gICAgICAnR2V0Sm9iVGVtcGxhdGUnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEF2YWlsYWJsZU1ldGVyZWRQcm9kdWN0cycsXG4gICAgICAnTGlzdEJ1ZGdldHMnLFxuICAgICAgJ0xpc3RGYXJtTWVtYmVycycsXG4gICAgICAnTGlzdEZhcm1zJyxcbiAgICAgICdMaXN0RmxlZXRNZW1iZXJzJyxcbiAgICAgICdMaXN0RmxlZXRzJyxcbiAgICAgICdMaXN0Sm9iTWVtYmVycycsXG4gICAgICAnTGlzdEpvYlBhcmFtZXRlckRlZmluaXRpb25zJyxcbiAgICAgICdMaXN0Sm9icycsXG4gICAgICAnTGlzdExpY2Vuc2VFbmRwb2ludHMnLFxuICAgICAgJ0xpc3RMaW1pdHMnLFxuICAgICAgJ0xpc3RNZXRlcmVkUHJvZHVjdHMnLFxuICAgICAgJ0xpc3RNb25pdG9ycycsXG4gICAgICAnTGlzdFF1ZXVlRW52aXJvbm1lbnRzJyxcbiAgICAgICdMaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucycsXG4gICAgICAnTGlzdFF1ZXVlTGltaXRBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0xpc3RRdWV1ZU1lbWJlcnMnLFxuICAgICAgJ0xpc3RRdWV1ZXMnLFxuICAgICAgJ0xpc3RTZXNzaW9uQWN0aW9ucycsXG4gICAgICAnTGlzdFNlc3Npb25zJyxcbiAgICAgICdMaXN0U2Vzc2lvbnNGb3JXb3JrZXInLFxuICAgICAgJ0xpc3RTdGVwQ29uc3VtZXJzJyxcbiAgICAgICdMaXN0U3RlcERlcGVuZGVuY2llcycsXG4gICAgICAnTGlzdFN0ZXBzJyxcbiAgICAgICdMaXN0U3RvcmFnZVByb2ZpbGVzJyxcbiAgICAgICdMaXN0U3RvcmFnZVByb2ZpbGVzRm9yUXVldWUnLFxuICAgICAgJ0xpc3RUYXNrcycsXG4gICAgICAnTGlzdFZvbHVtZXMnLFxuICAgICAgJ0xpc3RXb3JrZXJzJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgYnVkZ2V0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvbWFuYWdlLWNvc3RzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZhcm1JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmYXJtSWQuXG4gICAqIEBwYXJhbSBidWRnZXRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBidWRnZXRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICovXG4gIHB1YmxpYyBvbkJ1ZGdldChmYXJtSWQ6IHN0cmluZywgYnVkZ2V0SWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfS9idWRnZXQvJHsgYnVkZ2V0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGZhcm0gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9mYXJtcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBmYXJtSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZmFybUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmRmFybU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uRmFybShmYXJtSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGZsZWV0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvbWFuYWdlLWZsZWV0cy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBmYXJtSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZmFybUlkLlxuICAgKiBAcGFyYW0gZmxlZXRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmbGVldElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmRmFybU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKiAtIC5pZkZsZWV0TWVtYmVyc2hpcExldmVscygpXG4gICAqL1xuICBwdWJsaWMgb25GbGVldChmYXJtSWQ6IHN0cmluZywgZmxlZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmRlYWRsaW5lOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpmYXJtLyR7IGZhcm1JZCB9L2ZsZWV0LyR7IGZsZWV0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGpvYiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL2RlYWRsaW5lLWNsb3VkLWpvYnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZmFybUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZhcm1JZC5cbiAgICogQHBhcmFtIHF1ZXVlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcXVldWVJZC5cbiAgICogQHBhcmFtIGpvYklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGpvYklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmRmFybU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKiAtIC5pZkpvYk1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKiAtIC5pZlF1ZXVlTWVtYmVyc2hpcExldmVscygpXG4gICAqL1xuICBwdWJsaWMgb25Kb2IoZmFybUlkOiBzdHJpbmcsIHF1ZXVlSWQ6IHN0cmluZywgam9iSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfS9xdWV1ZS8keyBxdWV1ZUlkIH0vam9iLyR7IGpvYklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBsaWNlbnNlLWVuZHBvaW50IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvY21mLXVibC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBsaWNlbnNlRW5kcG9pbnRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsaWNlbnNlRW5kcG9pbnRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTGljZW5zZUVuZHBvaW50KGxpY2Vuc2VFbmRwb2ludElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZGVhZGxpbmU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmxpY2Vuc2UtZW5kcG9pbnQvJHsgbGljZW5zZUVuZHBvaW50SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG1vbml0b3IgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS93b3JraW5nLXdpdGgtZGVhZGxpbmUtbW9uaXRvci5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBtb25pdG9ySWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbW9uaXRvcklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Nb25pdG9yKG1vbml0b3JJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmRlYWRsaW5lOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptb25pdG9yLyR7IG1vbml0b3JJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcXVldWUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9xdWV1ZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZmFybUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZhcm1JZC5cbiAgICogQHBhcmFtIHF1ZXVlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcXVldWVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICogLSAuaWZRdWV1ZU1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uUXVldWUoZmFybUlkOiBzdHJpbmcsIHF1ZXVlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpkZWFkbGluZTokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZmFybS8keyBmYXJtSWQgfS9xdWV1ZS8keyBxdWV1ZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB2b2x1bWUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS92b2x1bWVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZhcm1JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmYXJtSWQuXG4gICAqIEBwYXJhbSBmbGVldElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZsZWV0SWQuXG4gICAqIEBwYXJhbSB2b2x1bWVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB2b2x1bWVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICogLSAuaWZGbGVldE1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uVm9sdW1lKGZhcm1JZDogc3RyaW5nLCBmbGVldElkOiBzdHJpbmcsIHZvbHVtZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZGVhZGxpbmU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmZhcm0vJHsgZmFybUlkIH0vZmxlZXQvJHsgZmxlZXRJZCB9L3ZvbHVtZS8keyB2b2x1bWVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgd29ya2VyIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGZhcm1JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBmYXJtSWQuXG4gICAqIEBwYXJhbSBmbGVldElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGZsZWV0SWQuXG4gICAqIEBwYXJhbSB3b3JrZXJJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3b3JrZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKClcbiAgICogLSAuaWZGbGVldE1lbWJlcnNoaXBMZXZlbHMoKVxuICAgKi9cbiAgcHVibGljIG9uV29ya2VyKGZhcm1JZDogc3RyaW5nLCBmbGVldElkOiBzdHJpbmcsIHdvcmtlcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06ZGVhZGxpbmU6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmZhcm0vJHsgZmFybUlkIH0vZmxlZXQvJHsgZmxlZXRJZCB9L3dvcmtlci8keyB3b3JrZXJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVCdWRnZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZhcm0oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9uaXRvcigpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWUoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9GbGVldCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKiAtIC50b0Fzc3VtZUZsZWV0Um9sZUZvclJlYWQoKVxuICAgKiAtIC50b0Fzc3VtZUZsZWV0Um9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQXNzdW1lUXVldWVSb2xlRm9yUmVhZCgpXG4gICAqIC0gLnRvQXNzdW1lUXVldWVSb2xlRm9yVXNlcigpXG4gICAqIC0gLnRvQXNzdW1lUXVldWVSb2xlRm9yV29ya2VyKClcbiAgICogLSAudG9CYXRjaEdldEpvYkVudGl0eSgpXG4gICAqIC0gLnRvQ29weUpvYlRlbXBsYXRlKClcbiAgICogLSAudG9DcmVhdGVCdWRnZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZhcm0oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTGltaXQoKVxuICAgKiAtIC50b0NyZWF0ZU1vbml0b3IoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlKClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlU3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvRGVsZXRlQnVkZ2V0KClcbiAgICogLSAudG9EZWxldGVGYXJtKClcbiAgICogLSAudG9EZWxldGVGbGVldCgpXG4gICAqIC0gLnRvRGVsZXRlTGljZW5zZUVuZHBvaW50KClcbiAgICogLSAudG9EZWxldGVMaW1pdCgpXG4gICAqIC0gLnRvRGVsZXRlTWV0ZXJlZFByb2R1Y3QoKVxuICAgKiAtIC50b0RlbGV0ZU1vbml0b3IoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlKClcbiAgICogLSAudG9EZWxldGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9EZWxldGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlU3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b0RlbGV0ZVZvbHVtZSgpXG4gICAqIC0gLnRvRGVsZXRlV29ya2VyKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmFybSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTWVtYmVyRnJvbUZsZWV0KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUoKVxuICAgKiAtIC50b0dldEJ1ZGdldCgpXG4gICAqIC0gLnRvR2V0RmFybSgpXG4gICAqIC0gLnRvR2V0RmxlZXQoKVxuICAgKiAtIC50b0dldEpvYigpXG4gICAqIC0gLnRvR2V0TGljZW5zZUVuZHBvaW50KClcbiAgICogLSAudG9HZXRMaW1pdCgpXG4gICAqIC0gLnRvR2V0TW9uaXRvcigpXG4gICAqIC0gLnRvR2V0TW9uaXRvclNldHRpbmdzKClcbiAgICogLSAudG9HZXRRdWV1ZSgpXG4gICAqIC0gLnRvR2V0UXVldWVFbnZpcm9ubWVudCgpXG4gICAqIC0gLnRvR2V0UXVldWVGbGVldEFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRRdWV1ZUxpbWl0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldFNlc3Npb24oKVxuICAgKiAtIC50b0dldFNlc3Npb25BY3Rpb24oKVxuICAgKiAtIC50b0dldFNlc3Npb25zU3RhdGlzdGljc0FnZ3JlZ2F0aW9uKClcbiAgICogLSAudG9HZXRTdGVwKClcbiAgICogLSAudG9HZXRTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvR2V0U3RvcmFnZVByb2ZpbGVGb3JRdWV1ZSgpXG4gICAqIC0gLnRvR2V0VGFzaygpXG4gICAqIC0gLnRvR2V0Vm9sdW1lKClcbiAgICogLSAudG9HZXRXb3JrZXIoKVxuICAgKiAtIC50b0xpc3RCdWRnZXRzKClcbiAgICogLSAudG9MaXN0RmFybU1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RGYXJtcygpXG4gICAqIC0gLnRvTGlzdEZsZWV0TWVtYmVycygpXG4gICAqIC0gLnRvTGlzdEZsZWV0cygpXG4gICAqIC0gLnRvTGlzdEpvYk1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpXG4gICAqIC0gLnRvTGlzdEpvYnMoKVxuICAgKiAtIC50b0xpc3RMaWNlbnNlRW5kcG9pbnRzKClcbiAgICogLSAudG9MaXN0TGltaXRzKClcbiAgICogLSAudG9MaXN0TWV0ZXJlZFByb2R1Y3RzKClcbiAgICogLSAudG9MaXN0TW9uaXRvcnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUVudmlyb25tZW50cygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlRmxlZXRBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUxpbWl0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9MaXN0UXVldWVNZW1iZXJzKClcbiAgICogLSAudG9MaXN0UXVldWVzKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbkFjdGlvbnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9ucygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25zRm9yV29ya2VyKClcbiAgICogLSAudG9MaXN0U3RlcENvbnN1bWVycygpXG4gICAqIC0gLnRvTGlzdFN0ZXBEZXBlbmRlbmNpZXMoKVxuICAgKiAtIC50b0xpc3RTdGVwcygpXG4gICAqIC0gLnRvTGlzdFN0b3JhZ2VQcm9maWxlcygpXG4gICAqIC0gLnRvTGlzdFN0b3JhZ2VQcm9maWxlc0ZvclF1ZXVlKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9MaXN0VGFza3MoKVxuICAgKiAtIC50b0xpc3RWb2x1bWVzKClcbiAgICogLSAudG9MaXN0V29ya2VycygpXG4gICAqIC0gLnRvUHV0TWV0ZXJlZFByb2R1Y3QoKVxuICAgKiAtIC50b1NlYXJjaEpvYnMoKVxuICAgKiAtIC50b1NlYXJjaFN0ZXBzKClcbiAgICogLSAudG9TZWFyY2hUYXNrcygpXG4gICAqIC0gLnRvU3RhcnRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUJ1ZGdldCgpXG4gICAqIC0gLnRvVXBkYXRlRmFybSgpXG4gICAqIC0gLnRvVXBkYXRlRmxlZXQoKVxuICAgKiAtIC50b1VwZGF0ZUpvYigpXG4gICAqIC0gLnRvVXBkYXRlTGltaXQoKVxuICAgKiAtIC50b1VwZGF0ZU1vbml0b3IoKVxuICAgKiAtIC50b1VwZGF0ZU1vbml0b3JTZXR0aW5ncygpXG4gICAqIC0gLnRvVXBkYXRlUXVldWUoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9VcGRhdGVTZXNzaW9uKClcbiAgICogLSAudG9VcGRhdGVTdGVwKClcbiAgICogLSAudG9VcGRhdGVTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvVXBkYXRlVGFzaygpXG4gICAqIC0gLnRvVXBkYXRlV29ya2VyKClcbiAgICogLSAudG9VcGRhdGVXb3JrZXJTY2hlZHVsZSgpXG4gICAqIC0gLnRvR2V0QXBwbGljYXRpb25WZXJzaW9uKClcbiAgICogLSAudG9HZXRKb2JUZW1wbGF0ZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gYnVkZ2V0XG4gICAqIC0gZmFybVxuICAgKiAtIGZsZWV0XG4gICAqIC0gam9iXG4gICAqIC0gbGljZW5zZS1lbmRwb2ludFxuICAgKiAtIG1vbml0b3JcbiAgICogLSBxdWV1ZVxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHdvcmtlclxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFnIGtleXMgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVCdWRnZXQoKVxuICAgKiAtIC50b0NyZWF0ZUZhcm0oKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZUxpY2Vuc2VFbmRwb2ludCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9uaXRvcigpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWUoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIGFzc29jaWF0ZWQgbWVtYmVyc2hpcCBsZXZlbCBvZiB0aGUgcHJpbmNpcGFsIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS1zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9GbGVldCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GYXJtKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXNzb2NpYXRlZE1lbWJlcnNoaXBMZXZlbCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgQXNzb2NpYXRlZE1lbWJlcnNoaXBMZXZlbGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBhbGxvd2VkIGFjdGlvbiBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ2FsbGVkQWN0aW9uKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDYWxsZWRBY3Rpb25gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBtZW1iZXJzaGlwIGxldmVscyBvbiB0aGUgZmFybVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb0Zhcm0oKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmxlZXQoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvSm9iKClcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb1F1ZXVlKClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JSZWFkKClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JXb3JrZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclVzZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQmF0Y2hHZXRKb2JFbnRpdHkoKVxuICAgKiAtIC50b0NvcHlKb2JUZW1wbGF0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlQnVkZ2V0KClcbiAgICogLSAudG9DcmVhdGVGYXJtKClcbiAgICogLSAudG9DcmVhdGVGbGVldCgpXG4gICAqIC0gLnRvQ3JlYXRlSm9iKClcbiAgICogLSAudG9DcmVhdGVMaW1pdCgpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWUoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvQ3JlYXRlV29ya2VyKClcbiAgICogLSAudG9EZWxldGVCdWRnZXQoKVxuICAgKiAtIC50b0RlbGV0ZUZhcm0oKVxuICAgKiAtIC50b0RlbGV0ZUZsZWV0KClcbiAgICogLSAudG9EZWxldGVMaW1pdCgpXG4gICAqIC0gLnRvRGVsZXRlUXVldWUoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9EZWxldGVTdG9yYWdlUHJvZmlsZSgpXG4gICAqIC0gLnRvRGVsZXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVXb3JrZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GYXJtKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tRmxlZXQoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21RdWV1ZSgpXG4gICAqIC0gLnRvR2V0QnVkZ2V0KClcbiAgICogLSAudG9HZXRGYXJtKClcbiAgICogLSAudG9HZXRGbGVldCgpXG4gICAqIC0gLnRvR2V0Sm9iKClcbiAgICogLSAudG9HZXRMaW1pdCgpXG4gICAqIC0gLnRvR2V0UXVldWUoKVxuICAgKiAtIC50b0dldFF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uQWN0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvR2V0U3RlcCgpXG4gICAqIC0gLnRvR2V0U3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b0dldFN0b3JhZ2VQcm9maWxlRm9yUXVldWUoKVxuICAgKiAtIC50b0dldFRhc2soKVxuICAgKiAtIC50b0dldFZvbHVtZSgpXG4gICAqIC0gLnRvR2V0V29ya2VyKClcbiAgICogLSAudG9MaXN0QnVkZ2V0cygpXG4gICAqIC0gLnRvTGlzdEZhcm1NZW1iZXJzKClcbiAgICogLSAudG9MaXN0RmFybXMoKVxuICAgKiAtIC50b0xpc3RGbGVldE1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RGbGVldHMoKVxuICAgKiAtIC50b0xpc3RKb2JNZW1iZXJzKClcbiAgICogLSAudG9MaXN0Sm9iUGFyYW1ldGVyRGVmaW5pdGlvbnMoKVxuICAgKiAtIC50b0xpc3RKb2JzKClcbiAgICogLSAudG9MaXN0TGltaXRzKClcbiAgICogLSAudG9MaXN0UXVldWVFbnZpcm9ubWVudHMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUZsZWV0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9MaXN0UXVldWVMaW1pdEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlTWVtYmVycygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlcygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25BY3Rpb25zKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9uc0ZvcldvcmtlcigpXG4gICAqIC0gLnRvTGlzdFN0ZXBDb25zdW1lcnMoKVxuICAgKiAtIC50b0xpc3RTdGVwRGVwZW5kZW5jaWVzKClcbiAgICogLSAudG9MaXN0U3RlcHMoKVxuICAgKiAtIC50b0xpc3RTdG9yYWdlUHJvZmlsZXMoKVxuICAgKiAtIC50b0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRhc2tzKClcbiAgICogLSAudG9MaXN0Vm9sdW1lcygpXG4gICAqIC0gLnRvTGlzdFdvcmtlcnMoKVxuICAgKiAtIC50b1NlYXJjaEpvYnMoKVxuICAgKiAtIC50b1NlYXJjaFN0ZXBzKClcbiAgICogLSAudG9TZWFyY2hUYXNrcygpXG4gICAqIC0gLnRvU3RhcnRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUJ1ZGdldCgpXG4gICAqIC0gLnRvVXBkYXRlRmFybSgpXG4gICAqIC0gLnRvVXBkYXRlRmxlZXQoKVxuICAgKiAtIC50b1VwZGF0ZUpvYigpXG4gICAqIC0gLnRvVXBkYXRlTGltaXQoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlKClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlU3RlcCgpXG4gICAqIC0gLnRvVXBkYXRlU3RvcmFnZVByb2ZpbGUoKVxuICAgKiAtIC50b1VwZGF0ZVRhc2soKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtlcigpXG4gICAqIC0gLnRvVXBkYXRlV29ya2VyU2NoZWR1bGUoKVxuICAgKiAtIC50b0dldEpvYlRlbXBsYXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBidWRnZXRcbiAgICogLSBmYXJtXG4gICAqIC0gZmxlZXRcbiAgICogLSBqb2JcbiAgICogLSBxdWV1ZVxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHdvcmtlclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkZhcm1NZW1iZXJzaGlwTGV2ZWxzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBGYXJtTWVtYmVyc2hpcExldmVsc2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IG1lbWJlcnNoaXAgbGV2ZWxzIG9uIHRoZSBmbGVldFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb0ZsZWV0KClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JSZWFkKClcbiAgICogLSAudG9Bc3N1bWVGbGVldFJvbGVGb3JXb3JrZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQmF0Y2hHZXRKb2JFbnRpdHkoKVxuICAgKiAtIC50b0NyZWF0ZUZsZWV0KClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtlcigpXG4gICAqIC0gLnRvRGVsZXRlRmxlZXQoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVm9sdW1lKClcbiAgICogLSAudG9EZWxldGVXb3JrZXIoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21GbGVldCgpXG4gICAqIC0gLnRvR2V0RmxlZXQoKVxuICAgKiAtIC50b0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24oKVxuICAgKiAtIC50b0dldFZvbHVtZSgpXG4gICAqIC0gLnRvR2V0V29ya2VyKClcbiAgICogLSAudG9MaXN0RmxlZXRNZW1iZXJzKClcbiAgICogLSAudG9MaXN0RmxlZXRzKClcbiAgICogLSAudG9MaXN0UXVldWVGbGVldEFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25zRm9yV29ya2VyKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9MaXN0Vm9sdW1lcygpXG4gICAqIC0gLnRvTGlzdFdvcmtlcnMoKVxuICAgKiAtIC50b1N0YXJ0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVGbGVldCgpXG4gICAqIC0gLnRvVXBkYXRlUXVldWVGbGVldEFzc29jaWF0aW9uKClcbiAgICogLSAudG9VcGRhdGVXb3JrZXIoKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtlclNjaGVkdWxlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBmbGVldFxuICAgKiAtIHZvbHVtZVxuICAgKiAtIHdvcmtlclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkZsZWV0TWVtYmVyc2hpcExldmVscyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgRmxlZXRNZW1iZXJzaGlwTGV2ZWxzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgbWVtYmVyc2hpcCBsZXZlbHMgb24gdGhlIGpvYlxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVNZW1iZXJUb0pvYigpXG4gICAqIC0gLnRvQ29weUpvYlRlbXBsYXRlKClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZU1lbWJlckZyb21Kb2IoKVxuICAgKiAtIC50b0dldEpvYigpXG4gICAqIC0gLnRvR2V0U2Vzc2lvbigpXG4gICAqIC0gLnRvR2V0U2Vzc2lvbkFjdGlvbigpXG4gICAqIC0gLnRvR2V0U3RlcCgpXG4gICAqIC0gLnRvR2V0VGFzaygpXG4gICAqIC0gLnRvTGlzdEpvYk1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpXG4gICAqIC0gLnRvTGlzdEpvYnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9uQWN0aW9ucygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25zKClcbiAgICogLSAudG9MaXN0U3RlcENvbnN1bWVycygpXG4gICAqIC0gLnRvTGlzdFN0ZXBEZXBlbmRlbmNpZXMoKVxuICAgKiAtIC50b0xpc3RTdGVwcygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRhc2tzKClcbiAgICogLSAudG9TZWFyY2hTdGVwcygpXG4gICAqIC0gLnRvU2VhcmNoVGFza3MoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVKb2IoKVxuICAgKiAtIC50b1VwZGF0ZVNlc3Npb24oKVxuICAgKiAtIC50b1VwZGF0ZVN0ZXAoKVxuICAgKiAtIC50b1VwZGF0ZVRhc2soKVxuICAgKiAtIC50b0dldEpvYlRlbXBsYXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBqb2JcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZKb2JNZW1iZXJzaGlwTGV2ZWxzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBKb2JNZW1iZXJzaGlwTGV2ZWxzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIG1lbWJlcnNoaXAgbGV2ZWwgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZWFkbGluZS1jbG91ZC9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS1zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvRmFybSgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9GbGVldCgpXG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk1lbWJlcnNoaXBMZXZlbCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgTWVtYmVyc2hpcExldmVsYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHByaW5jaXBsZSBJRCBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGVhZGxpbmUtY2xvdWQvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0tc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9MaXN0RmFybXMoKVxuICAgKiAtIC50b0xpc3RGbGVldHMoKVxuICAgKiAtIC50b0xpc3RKb2JzKClcbiAgICogLSAudG9MaXN0UXVldWVzKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZQcmluY2lwYWxJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUHJpbmNpcGFsSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBtZW1iZXJzaGlwIGxldmVscyBvbiB0aGUgcXVldWVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlTWVtYmVyVG9Kb2IoKVxuICAgKiAtIC50b0Fzc29jaWF0ZU1lbWJlclRvUXVldWUoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclJlYWQoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvclVzZXIoKVxuICAgKiAtIC50b0Fzc3VtZVF1ZXVlUm9sZUZvcldvcmtlcigpXG4gICAqIC0gLnRvQ29weUpvYlRlbXBsYXRlKClcbiAgICogLSAudG9DcmVhdGVKb2IoKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlKClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9DcmVhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVldWUoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tSm9iKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVNZW1iZXJGcm9tUXVldWUoKVxuICAgKiAtIC50b0dldEpvYigpXG4gICAqIC0gLnRvR2V0UXVldWUoKVxuICAgKiAtIC50b0dldFF1ZXVlRW52aXJvbm1lbnQoKVxuICAgKiAtIC50b0dldFF1ZXVlRmxlZXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0UXVldWVMaW1pdEFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uQWN0aW9uKClcbiAgICogLSAudG9HZXRTZXNzaW9uc1N0YXRpc3RpY3NBZ2dyZWdhdGlvbigpXG4gICAqIC0gLnRvR2V0U3RlcCgpXG4gICAqIC0gLnRvR2V0U3RvcmFnZVByb2ZpbGVGb3JRdWV1ZSgpXG4gICAqIC0gLnRvR2V0VGFzaygpXG4gICAqIC0gLnRvTGlzdEpvYk1lbWJlcnMoKVxuICAgKiAtIC50b0xpc3RKb2JQYXJhbWV0ZXJEZWZpbml0aW9ucygpXG4gICAqIC0gLnRvTGlzdEpvYnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUVudmlyb25tZW50cygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlRmxlZXRBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RRdWV1ZUxpbWl0QXNzb2NpYXRpb25zKClcbiAgICogLSAudG9MaXN0UXVldWVNZW1iZXJzKClcbiAgICogLSAudG9MaXN0UXVldWVzKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbkFjdGlvbnMoKVxuICAgKiAtIC50b0xpc3RTZXNzaW9ucygpXG4gICAqIC0gLnRvTGlzdFN0ZXBDb25zdW1lcnMoKVxuICAgKiAtIC50b0xpc3RTdGVwRGVwZW5kZW5jaWVzKClcbiAgICogLSAudG9MaXN0U3RlcHMoKVxuICAgKiAtIC50b0xpc3RTdG9yYWdlUHJvZmlsZXNGb3JRdWV1ZSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRhc2tzKClcbiAgICogLSAudG9TZWFyY2hKb2JzKClcbiAgICogLSAudG9TZWFyY2hTdGVwcygpXG4gICAqIC0gLnRvU2VhcmNoVGFza3MoKVxuICAgKiAtIC50b1N0YXJ0U2Vzc2lvbnNTdGF0aXN0aWNzQWdncmVnYXRpb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVKb2IoKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlKClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUVudmlyb25tZW50KClcbiAgICogLSAudG9VcGRhdGVRdWV1ZUZsZWV0QXNzb2NpYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXVlTGltaXRBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlU3RlcCgpXG4gICAqIC0gLnRvVXBkYXRlVGFzaygpXG4gICAqIC0gLnRvR2V0Sm9iVGVtcGxhdGUoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGpvYlxuICAgKiAtIHF1ZXVlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUXVldWVNZW1iZXJzaGlwTGV2ZWxzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBRdWV1ZU1lbWJlcnNoaXBMZXZlbHNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdXNlciBjYWxsaW5nIHRoZSBEZWFkbGluZSBDbG91ZCBBUElcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2RlYWRsaW5lLWNsb3VkL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLXNlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvTGlzdEZhcm1zKClcbiAgICogLSAudG9MaXN0RmxlZXRzKClcbiAgICogLSAudG9MaXN0Sm9icygpXG4gICAqIC0gLnRvTGlzdFF1ZXVlcygpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVxdWVzdGVyUHJpbmNpcGFsSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFJlcXVlc3RlclByaW5jaXBhbElkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtkZWFkbGluZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfZGVhZGxpbmUuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19