cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
505 lines • 46.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MedicalImaging = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [medical-imaging](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awshealthimaging.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class MedicalImaging extends shared_1.PolicyStatement {
/**
* Grants permission to copy an image set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_CopyImageSet.html
*/
toCopyImageSet() {
return this.to('CopyImageSet');
}
/**
* Grants permission to create a data store to ingest imaging data
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_CreateDatastore.html
*/
toCreateDatastore() {
return this.to('CreateDatastore');
}
/**
* Grants permission to delete a data store
*
* Access Level: Write
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_DeleteDatastore.html
*/
toDeleteDatastore() {
return this.to('DeleteDatastore');
}
/**
* Grants permission to delete an image set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_DeleteImageSet.html
*/
toDeleteImageSet() {
return this.to('DeleteImageSet');
}
/**
* Grants permission to get dicom bulkdata in binary format
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
* - .ifSeriesInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_GetDICOMBulkdata.html
*/
toGetDICOMBulkdata() {
return this.to('GetDICOMBulkdata');
}
/**
* Grants permission to get an import job's properties
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_GetDICOMImportJob.html
*/
toGetDICOMImportJob() {
return this.to('GetDICOMImportJob');
}
/**
* Grants permission to get dicom instance in dcm format
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
* - .ifSeriesInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_GetDICOMInstance.html
*/
toGetDICOMInstance() {
return this.to('GetDICOMInstance');
}
/**
* Grants permission to get dicom instance frames in format requested by the customer
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
* - .ifSeriesInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_GetDICOMInstanceFrames.html
*/
toGetDICOMInstanceFrames() {
return this.to('GetDICOMInstanceFrames');
}
/**
* Grants permission to get dicom instance metadata in DICOM JSON format
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
* - .ifSeriesInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_GetDICOMInstanceMetadata.html
*/
toGetDICOMInstanceMetadata() {
return this.to('GetDICOMInstanceMetadata');
}
/**
* Grants permission to retrieve metadata for all DICOM instances belonging to a given DICOM series in DICOM JSON format
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
* - .ifSeriesInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_GetDICOMSeriesMetadata.html
*/
toGetDICOMSeriesMetadata() {
return this.to('GetDICOMSeriesMetadata');
}
/**
* Grants permission to get data store properties
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_GetDatastore.html
*/
toGetDatastore() {
return this.to('GetDatastore');
}
/**
* Grants permission to get image frame properties
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_GetImageFrame.html
*/
toGetImageFrame() {
return this.to('GetImageFrame');
}
/**
* Grants permission to get image set properties
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_GetImageSet.html
*/
toGetImageSet() {
return this.to('GetImageSet');
}
/**
* Grants permission to get image set metadata properties
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_GetImageSetMetadata.html
*/
toGetImageSetMetadata() {
return this.to('GetImageSetMetadata');
}
/**
* Grants permission to list import jobs for a data store
*
* Access Level: List
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_ListDICOMImportJobs.html
*/
toListDICOMImportJobs() {
return this.to('ListDICOMImportJobs');
}
/**
* Grants permission to list data stores
*
* Access Level: List
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_ListDatastores.html
*/
toListDatastores() {
return this.to('ListDatastores');
}
/**
* Grants permission to list versions of an image set
*
* Access Level: List
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_ListImageSetVersions.html
*/
toListImageSetVersions() {
return this.to('ListImageSetVersions');
}
/**
* Grants permission to list tags for a medical imaging resource
*
* Access Level: List
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to search dicom instances that returns data in DICOM JSON format
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
* - .ifSeriesInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_SearchDICOMInstances.html
*/
toSearchDICOMInstances() {
return this.to('SearchDICOMInstances');
}
/**
* Grants permission to search dicom series that returns data in DICOM JSON format
*
* Access Level: Read
*
* Possible conditions:
* - .ifStudyInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_SearchDICOMSeries.html
*/
toSearchDICOMSeries() {
return this.to('SearchDICOMSeries');
}
/**
* Grants permission to search dicom studies that returns data in DICOM JSON format
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_SearchDICOMStudies.html
*/
toSearchDICOMStudies() {
return this.to('SearchDICOMStudies');
}
/**
* Grants permission to search image sets
*
* Access Level: Read
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_SearchImageSets.html
*/
toSearchImageSets() {
return this.to('SearchImageSets');
}
/**
* Grants permission to start a DICOM import job
*
* Access Level: Write
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_StartDICOMImportJob.html
*/
toStartDICOMImportJob() {
return this.to('StartDICOMImportJob');
}
/**
* Grants permission to store dicom instances that returns result in DICOM JSON format
*
* Access Level: Write
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_StoreDICOM.html
*/
toStoreDICOM() {
return this.to('StoreDICOM');
}
/**
* Grants permission to store a dicom study that returns result in DICOM JSON format
*
* Access Level: Write
*
* Possible conditions:
* - .ifStudyInstanceUID()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dicom_StoreDICOMStudy.html
*/
toStoreDICOMStudy() {
return this.to('StoreDICOMStudy');
}
/**
* Grants permission to add tags to a medical imaging resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove tags from a medical imaging resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update image set metadata properties
*
* Access Level: Write
*
* https://docs.aws.amazon.com/healthimaging/latest/APIReference/API_dataplane_UpdateImageSetMetadata.html
*/
toUpdateImageSetMetadata() {
return this.to('UpdateImageSetMetadata');
}
/**
* Adds a resource of type datastore to the statement
*
* https://docs.aws.amazon.com/healthimaging/latest/devguide/API_DatastoreProperties.html
*
* @param datastoreId - Identifier for the datastoreId.
* @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()
*/
onDatastore(datastoreId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:medical-imaging:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:datastore/${datastoreId}`);
}
/**
* Adds a resource of type imageset to the statement
*
* https://docs.aws.amazon.com/healthimaging/latest/devguide/API_ImageSetProperties.html
*
* @param datastoreId - Identifier for the datastoreId.
* @param imageSetId - Identifier for the imageSetId.
* @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()
*/
onImageset(datastoreId, imageSetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:medical-imaging:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:datastore/${datastoreId}/imageset/${imageSetId}`);
}
/**
* Filters access by a tag key and value pair that is allowed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateDatastore()
* - .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 a tag key and value pair of a resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toTagResource()
*
* Applies to resource types:
* - datastore
* - imageset
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsResourceTag(tagKey, value, operator) {
return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by a list of tag keys that are allowed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateDatastore()
* - .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 SeriesInstanceUID parameter in the request
*
* https://docs.aws.amazon.com/service-authorization/latest/reference/list_awshealthimaging.html#awshealthimaging-policy-keys
*
* Applies to actions:
* - .toGetDICOMBulkdata()
* - .toGetDICOMInstance()
* - .toGetDICOMInstanceFrames()
* - .toGetDICOMInstanceMetadata()
* - .toGetDICOMSeriesMetadata()
* - .toSearchDICOMInstances()
*
* @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`
*/
ifSeriesInstanceUID(value, operator) {
return this.if(`SeriesInstanceUID`, value, operator ?? 'StringLike');
}
/**
* Filters access by the StudyInstanceUID parameter in the request
*
* https://docs.aws.amazon.com/service-authorization/latest/reference/list_awshealthimaging.html#awshealthimaging-policy-keys
*
* Applies to actions:
* - .toGetDICOMBulkdata()
* - .toGetDICOMInstance()
* - .toGetDICOMInstanceFrames()
* - .toGetDICOMInstanceMetadata()
* - .toGetDICOMSeriesMetadata()
* - .toSearchDICOMInstances()
* - .toSearchDICOMSeries()
* - .toStoreDICOMStudy()
*
* @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`
*/
ifStudyInstanceUID(value, operator) {
return this.if(`StudyInstanceUID`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [medical-imaging](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awshealthimaging.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'medical-imaging';
this.accessLevelList = {
Write: [
'CopyImageSet',
'CreateDatastore',
'DeleteDatastore',
'DeleteImageSet',
'StartDICOMImportJob',
'StoreDICOM',
'StoreDICOMStudy',
'UpdateImageSetMetadata'
],
Read: [
'GetDICOMBulkdata',
'GetDICOMImportJob',
'GetDICOMInstance',
'GetDICOMInstanceFrames',
'GetDICOMInstanceMetadata',
'GetDICOMSeriesMetadata',
'GetDatastore',
'GetImageFrame',
'GetImageSet',
'GetImageSetMetadata',
'SearchDICOMInstances',
'SearchDICOMSeries',
'SearchDICOMStudies',
'SearchImageSets'
],
List: [
'ListDICOMImportJobs',
'ListDatastores',
'ListImageSetVersions',
'ListTagsForResource'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.MedicalImaging = MedicalImaging;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoaW1hZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlYWx0aGltYWdpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLGNBQWUsU0FBUSx3QkFBZTtJQUdqRDs7Ozs7O09BTUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLDBCQUEwQjtRQUMv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Jy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbbWVkaWNhbC1pbWFnaW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NoZWFsdGhpbWFnaW5nLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgTWVkaWNhbEltYWdpbmcgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdtZWRpY2FsLWltYWdpbmcnO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IGFuIGltYWdlIHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RhdGFwbGFuZV9Db3B5SW1hZ2VTZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ29weUltYWdlU2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDb3B5SW1hZ2VTZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBkYXRhIHN0b3JlIHRvIGluZ2VzdCBpbWFnaW5nIGRhdGFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVEYXRhc3RvcmUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRGF0YXN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVEYXRhc3RvcmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBkYXRhIHN0b3JlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRGF0YXN0b3JlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZURhdGFzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRGF0YXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGltYWdlIHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RhdGFwbGFuZV9EZWxldGVJbWFnZVNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbWFnZVNldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlSW1hZ2VTZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgZGljb20gYnVsa2RhdGEgaW4gYmluYXJ5IGZvcm1hdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZTdHVkeUluc3RhbmNlVUlEKClcbiAgICogLSAuaWZTZXJpZXNJbnN0YW5jZVVJRCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RpY29tX0dldERJQ09NQnVsa2RhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RElDT01CdWxrZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RElDT01CdWxrZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhbiBpbXBvcnQgam9iJ3MgcHJvcGVydGllc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RElDT01JbXBvcnRKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RElDT01JbXBvcnRKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERJQ09NSW1wb3J0Sm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRpY29tIGluc3RhbmNlIGluIGRjbSBmb3JtYXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmU3R1ZHlJbnN0YW5jZVVJRCgpXG4gICAqIC0gLmlmU2VyaWVzSW5zdGFuY2VVSUQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9kaWNvbV9HZXRESUNPTUluc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERJQ09NSW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERJQ09NSW5zdGFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgZGljb20gaW5zdGFuY2UgZnJhbWVzIGluIGZvcm1hdCByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlN0dWR5SW5zdGFuY2VVSUQoKVxuICAgKiAtIC5pZlNlcmllc0luc3RhbmNlVUlEKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfZGljb21fR2V0RElDT01JbnN0YW5jZUZyYW1lcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRESUNPTUluc3RhbmNlRnJhbWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRESUNPTUluc3RhbmNlRnJhbWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRpY29tIGluc3RhbmNlIG1ldGFkYXRhIGluIERJQ09NIEpTT04gZm9ybWF0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlN0dWR5SW5zdGFuY2VVSUQoKVxuICAgKiAtIC5pZlNlcmllc0luc3RhbmNlVUlEKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfZGljb21fR2V0RElDT01JbnN0YW5jZU1ldGFkYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERJQ09NSW5zdGFuY2VNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RElDT01JbnN0YW5jZU1ldGFkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbWV0YWRhdGEgZm9yIGFsbCBESUNPTSBpbnN0YW5jZXMgYmVsb25naW5nIHRvIGEgZ2l2ZW4gRElDT00gc2VyaWVzIGluIERJQ09NIEpTT04gZm9ybWF0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlN0dWR5SW5zdGFuY2VVSUQoKVxuICAgKiAtIC5pZlNlcmllc0luc3RhbmNlVUlEKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfZGljb21fR2V0RElDT01TZXJpZXNNZXRhZGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRESUNPTVNlcmllc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRESUNPTVNlcmllc01ldGFkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRhdGEgc3RvcmUgcHJvcGVydGllc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RGF0YXN0b3JlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERhdGFzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGF0YXN0b3JlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGltYWdlIGZyYW1lIHByb3BlcnRpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RhdGFwbGFuZV9HZXRJbWFnZUZyYW1lLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEltYWdlRnJhbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEltYWdlRnJhbWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW1hZ2Ugc2V0IHByb3BlcnRpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RhdGFwbGFuZV9HZXRJbWFnZVNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJbWFnZVNldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SW1hZ2VTZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW1hZ2Ugc2V0IG1ldGFkYXRhIHByb3BlcnRpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RhdGFwbGFuZV9HZXRJbWFnZVNldE1ldGFkYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEltYWdlU2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEltYWdlU2V0TWV0YWRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGltcG9ydCBqb2JzIGZvciBhIGRhdGEgc3RvcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RESUNPTUltcG9ydEpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdERJQ09NSW1wb3J0Sm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERJQ09NSW1wb3J0Sm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZGF0YSBzdG9yZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3REYXRhc3RvcmVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REYXRhc3RvcmVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RGF0YXN0b3JlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdmVyc2lvbnMgb2YgYW4gaW1hZ2Ugc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9kYXRhcGxhbmVfTGlzdEltYWdlU2V0VmVyc2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEltYWdlU2V0VmVyc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RJbWFnZVNldFZlcnNpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YWdzIGZvciBhIG1lZGljYWwgaW1hZ2luZyByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGRpY29tIGluc3RhbmNlcyB0aGF0IHJldHVybnMgZGF0YSBpbiBESUNPTSBKU09OIGZvcm1hdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZTdHVkeUluc3RhbmNlVUlEKClcbiAgICogLSAuaWZTZXJpZXNJbnN0YW5jZVVJRCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RpY29tX1NlYXJjaERJQ09NSW5zdGFuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaERJQ09NSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hESUNPTUluc3RhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBkaWNvbSBzZXJpZXMgdGhhdCByZXR1cm5zIGRhdGEgaW4gRElDT00gSlNPTiBmb3JtYXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmU3R1ZHlJbnN0YW5jZVVJRCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX2RpY29tX1NlYXJjaERJQ09NU2VyaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaERJQ09NU2VyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hESUNPTVNlcmllcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBkaWNvbSBzdHVkaWVzIHRoYXQgcmV0dXJucyBkYXRhIGluIERJQ09NIEpTT04gZm9ybWF0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9kaWNvbV9TZWFyY2hESUNPTVN0dWRpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoRElDT01TdHVkaWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hESUNPTVN0dWRpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggaW1hZ2Ugc2V0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfZGF0YXBsYW5lX1NlYXJjaEltYWdlU2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hJbWFnZVNldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlYXJjaEltYWdlU2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgRElDT00gaW1wb3J0IGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9oZWFsdGhpbWFnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0RElDT01JbXBvcnRKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRESUNPTUltcG9ydEpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRESUNPTUltcG9ydEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3JlIGRpY29tIGluc3RhbmNlcyB0aGF0IHJldHVybnMgcmVzdWx0IGluIERJQ09NIEpTT04gZm9ybWF0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfZGljb21fU3RvcmVESUNPTS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdG9yZURJQ09NKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9yZURJQ09NJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcmUgYSBkaWNvbSBzdHVkeSB0aGF0IHJldHVybnMgcmVzdWx0IGluIERJQ09NIEpTT04gZm9ybWF0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZTdHVkeUluc3RhbmNlVUlEKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfZGljb21fU3RvcmVESUNPTVN0dWR5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3JlRElDT01TdHVkeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcmVESUNPTVN0dWR5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWRkIHRhZ3MgdG8gYSBtZWRpY2FsIGltYWdpbmcgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgdGFncyBmcm9tIGEgbWVkaWNhbCBpbWFnaW5nIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZ1xuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgaW1hZ2Ugc2V0IG1ldGFkYXRhIHByb3BlcnRpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9kYXRhcGxhbmVfVXBkYXRlSW1hZ2VTZXRNZXRhZGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVJbWFnZVNldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVJbWFnZVNldE1ldGFkYXRhJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdDb3B5SW1hZ2VTZXQnLFxuICAgICAgJ0NyZWF0ZURhdGFzdG9yZScsXG4gICAgICAnRGVsZXRlRGF0YXN0b3JlJyxcbiAgICAgICdEZWxldGVJbWFnZVNldCcsXG4gICAgICAnU3RhcnRESUNPTUltcG9ydEpvYicsXG4gICAgICAnU3RvcmVESUNPTScsXG4gICAgICAnU3RvcmVESUNPTVN0dWR5JyxcbiAgICAgICdVcGRhdGVJbWFnZVNldE1ldGFkYXRhJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldERJQ09NQnVsa2RhdGEnLFxuICAgICAgJ0dldERJQ09NSW1wb3J0Sm9iJyxcbiAgICAgICdHZXRESUNPTUluc3RhbmNlJyxcbiAgICAgICdHZXRESUNPTUluc3RhbmNlRnJhbWVzJyxcbiAgICAgICdHZXRESUNPTUluc3RhbmNlTWV0YWRhdGEnLFxuICAgICAgJ0dldERJQ09NU2VyaWVzTWV0YWRhdGEnLFxuICAgICAgJ0dldERhdGFzdG9yZScsXG4gICAgICAnR2V0SW1hZ2VGcmFtZScsXG4gICAgICAnR2V0SW1hZ2VTZXQnLFxuICAgICAgJ0dldEltYWdlU2V0TWV0YWRhdGEnLFxuICAgICAgJ1NlYXJjaERJQ09NSW5zdGFuY2VzJyxcbiAgICAgICdTZWFyY2hESUNPTVNlcmllcycsXG4gICAgICAnU2VhcmNoRElDT01TdHVkaWVzJyxcbiAgICAgICdTZWFyY2hJbWFnZVNldHMnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdERJQ09NSW1wb3J0Sm9icycsXG4gICAgICAnTGlzdERhdGFzdG9yZXMnLFxuICAgICAgJ0xpc3RJbWFnZVNldFZlcnNpb25zJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZGF0YXN0b3JlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2hlYWx0aGltYWdpbmcvbGF0ZXN0L2Rldmd1aWRlL0FQSV9EYXRhc3RvcmVQcm9wZXJ0aWVzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGRhdGFzdG9yZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGRhdGFzdG9yZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25EYXRhc3RvcmUoZGF0YXN0b3JlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTptZWRpY2FsLWltYWdpbmc6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmRhdGFzdG9yZS8keyBkYXRhc3RvcmVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgaW1hZ2VzZXQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaGVhbHRoaW1hZ2luZy9sYXRlc3QvZGV2Z3VpZGUvQVBJX0ltYWdlU2V0UHJvcGVydGllcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhc3RvcmVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBkYXRhc3RvcmVJZC5cbiAgICogQHBhcmFtIGltYWdlU2V0SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgaW1hZ2VTZXRJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uSW1hZ2VzZXQoZGF0YXN0b3JlSWQ6IHN0cmluZywgaW1hZ2VTZXRJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om1lZGljYWwtaW1hZ2luZzokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZGF0YXN0b3JlLyR7IGRhdGFzdG9yZUlkIH0vaW1hZ2VzZXQvJHsgaW1hZ2VTZXRJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlRGF0YXN0b3JlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXF1ZXN0VGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlcXVlc3RUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBhIHRhZyBrZXkgYW5kIHZhbHVlIHBhaXIgb2YgYSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBkYXRhc3RvcmVcbiAgICogLSBpbWFnZXNldFxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBhIGxpc3Qgb2YgdGFnIGtleXMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtdGFna2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlRGF0YXN0b3JlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzVGFnS2V5cyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlRhZ0tleXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgU2VyaWVzSW5zdGFuY2VVSUQgcGFyYW1ldGVyIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c2hlYWx0aGltYWdpbmcuaHRtbCNhd3NoZWFsdGhpbWFnaW5nLXBvbGljeS1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9HZXRESUNPTUJ1bGtkYXRhKClcbiAgICogLSAudG9HZXRESUNPTUluc3RhbmNlKClcbiAgICogLSAudG9HZXRESUNPTUluc3RhbmNlRnJhbWVzKClcbiAgICogLSAudG9HZXRESUNPTUluc3RhbmNlTWV0YWRhdGEoKVxuICAgKiAtIC50b0dldERJQ09NU2VyaWVzTWV0YWRhdGEoKVxuICAgKiAtIC50b1NlYXJjaERJQ09NSW5zdGFuY2VzKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZTZXJpZXNJbnN0YW5jZVVJRCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU2VyaWVzSW5zdGFuY2VVSURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgU3R1ZHlJbnN0YW5jZVVJRCBwYXJhbWV0ZXIgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzaGVhbHRoaW1hZ2luZy5odG1sI2F3c2hlYWx0aGltYWdpbmctcG9saWN5LWtleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0dldERJQ09NQnVsa2RhdGEoKVxuICAgKiAtIC50b0dldERJQ09NSW5zdGFuY2UoKVxuICAgKiAtIC50b0dldERJQ09NSW5zdGFuY2VGcmFtZXMoKVxuICAgKiAtIC50b0dldERJQ09NSW5zdGFuY2VNZXRhZGF0YSgpXG4gICAqIC0gLnRvR2V0RElDT01TZXJpZXNNZXRhZGF0YSgpXG4gICAqIC0gLnRvU2VhcmNoRElDT01JbnN0YW5jZXMoKVxuICAgKiAtIC50b1NlYXJjaERJQ09NU2VyaWVzKClcbiAgICogLSAudG9TdG9yZURJQ09NU3R1ZHkoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlN0dWR5SW5zdGFuY2VVSUQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFN0dWR5SW5zdGFuY2VVSURgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW21lZGljYWwtaW1hZ2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzaGVhbHRoaW1hZ2luZy5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=