@alfresco/adf-content-services
Version:
Alfresco ADF content services
274 lines • 37.2 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Injectable } from '@angular/core';
import { BehaviorSubject, from, Subject } from 'rxjs';
import { SecurityGroupsApi, SecurityMarksApi, AuthorityClearanceApi } from '@alfresco/js-api';
import { UserPreferencesService } from '@alfresco/adf-core';
import { finalize } from 'rxjs/operators';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import * as i0 from "@angular/core";
import * as i1 from "../../services/alfresco-api.service";
import * as i2 from "@alfresco/adf-core";
const DEFAULT_SKIP_COUNT = 0;
const DEFAULT_INCLUDE = 'inUse';
export class SecurityControlsService {
constructor(apiService, userPreferencesService) {
this.apiService = apiService;
this.userPreferencesService = userPreferencesService;
this.groupsPaginatedSource = new Subject();
this.groupsPaginated$ = this.groupsPaginatedSource.asObservable();
this.reloadSecurityControls = new Subject();
this.reloadSecurityControls$ = this.reloadSecurityControls.asObservable();
this._reloadAuthorityClearance = new Subject();
this.reloadAuthorityClearance$ = this._reloadAuthorityClearance.asObservable();
this.marksPaginatedSource = new Subject();
this.marksPaginated$ = this.marksPaginatedSource.asObservable();
this.loadingSource = new BehaviorSubject(true);
this.loading$ = this.loadingSource.asObservable();
}
get groupsApi() {
return this.securityGroup || (this.securityGroup = new SecurityGroupsApi(this.apiService.getInstance()));
}
get marksApi() {
return this.securityMark || (this.securityMark = new SecurityMarksApi(this.apiService.getInstance()));
}
get authorityClearanceApi() {
return this.authorityClearance || (this.authorityClearance = new AuthorityClearanceApi(this.apiService.getInstance()));
}
get reloadAuthorityClearance() {
return this._reloadAuthorityClearance;
}
/**
* Get All security groups
*
* @param skipCount The number of entities that exist in the collection before those included in this list.
* @param maxItems The maximum number of items to return in the list. Default is specified by UserPreferencesService.
* @param include Additional information about the security group
* @returns Promise<SecurityControlsGroupResponse>
*/
getSecurityGroup(skipCount = DEFAULT_SKIP_COUNT, maxItems = this.userPreferencesService.paginationSize, include = DEFAULT_INCLUDE) {
let securityControlsGroupResponse;
return new Promise((resolve, reject) => {
this.groupsApi
.getSecurityGroups({
include,
skipCount,
maxItems
})
.then((response) => {
this.groupsPaginatedSource.next((securityControlsGroupResponse = {
pagination: response.list.pagination,
entries: response.list.entries.map((group) => group.entry)
}));
resolve(securityControlsGroupResponse);
})
.catch((error) => reject(error));
});
}
/**
* Create security group
*
* @param input securityGroupBody.
* @returns Observable<SecurityGroupEntry>
*/
createSecurityGroup(input) {
this.loadingSource.next(true);
const payload = {
...input
};
const opts = {
include: DEFAULT_INCLUDE
};
const promise = this.groupsApi.createSecurityGroup(payload, opts);
return from(promise).pipe(finalize(() => this.loadingSource.next(false)));
}
/**
* Create security marks
*
* @param securityGroupId The key for the security group id.
* @param input securityMarkBody[].
* @returns Promise<SecurityMarkPaging | SecurityMarkEntry>
*/
createSecurityMarks(securityGroupId, input) {
this.loadingSource.next(true);
const promise = this.marksApi
.createSecurityMarks(securityGroupId, input)
.then((result) => {
this.loadingSource.next(false);
return result;
})
.catch((error) => {
this.loadingSource.next(false);
return error;
});
return promise;
}
/**
* Get security mark value
* Gets the value for a selected **securityGroupId**.
*
* @param securityGroupId The key for the security group id.
* @param skipCount The number of entities that exist in the collection before those included in this list.
* @returns Promise<SecurityControlsMarkResponse>
*/
getSecurityMark(securityGroupId, skipCount = DEFAULT_SKIP_COUNT) {
let securityControlsMarkResponse;
return new Promise((resolve, reject) => {
this.marksApi
.getSecurityMarks(securityGroupId, {
skipCount
})
.then((response) => {
this.marksPaginatedSource.next((securityControlsMarkResponse = {
pagination: response.list.pagination,
entries: response.list.entries.map((mark) => mark.entry)
}));
resolve(securityControlsMarkResponse);
})
.catch((error) => reject(error));
});
}
/**
* Update a security groups information
*
* @param securityGroupId The Key of Security Group id for which info is required
* @param input SecurityGroupBody
* @param opts additional information about the security group
* @returns Promise<SecurityGroupEntry>
*/
updateSecurityGroup(securityGroupId, input, opts) {
this.loadingSource.next(true);
const payload = {
...input
};
if (!opts) {
opts = {
DEFAULT_INCLUDE
};
}
const promise = this.groupsApi
.updateSecurityGroup(securityGroupId, payload, opts)
.then((result) => {
this.loadingSource.next(false);
return result;
})
.catch((error) => {
this.loadingSource.next(false);
return error;
});
return promise;
}
/**
* Updates Security Mark value
*
* @param securityGroupId The key for the security group id.
* @param securityMarkId The key for the security mark is in use or not.
* @param input securityMarkBody.
* @returns Promise<SecurityMarkEntry>
*/
updateSecurityMark(securityGroupId, securityMarkId, input) {
this.loadingSource.next(true);
const payload = {
...input
};
const promise = this.marksApi
.updateSecurityMark(securityGroupId, securityMarkId, payload)
.then((result) => {
this.loadingSource.next(false);
return result;
})
.catch((error) => {
this.loadingSource.next(false);
return error;
});
return promise;
}
/**
* Delete security group
*
* @param securityGroupId The key for the security group id.
* @returns Observable<void>
*/
deleteSecurityGroup(securityGroupId) {
this.loadingSource.next(true);
const promise = this.groupsApi.deleteSecurityGroup(securityGroupId);
return from(promise).pipe(finalize(() => this.loadingSource.next(false)));
}
/**
* Delete security mark
*
* @param securityGroupId The key for the security group id.
* @param securityMarkId The key for the security mark id.
* @returns Promise<SecurityMarkEntry>
*/
deleteSecurityMark(securityGroupId, securityMarkId) {
this.loadingSource.next(true);
const promise = this.marksApi
.deleteSecurityMark(securityGroupId, securityMarkId)
.then((result) => {
this.loadingSource.next(false);
return result;
})
.catch((error) => {
this.loadingSource.next(false);
return error;
});
return promise;
}
/**
* Get the authority clearances for a single user/group
*
* @param authorityName The name for the authority for which the clearance is to be fetched. Can be left blank in which case it will fetch it for all users with pagination
* @param skipCount The number of entities that exist in the collection before those included in this list.
* @param maxItems The maximum number of items to return in the list. Default is specified by UserPreferencesService.
* @returns Observable<AuthorityClearanceGroupPaging>
*/
getClearancesForAuthority(authorityName, skipCount = DEFAULT_SKIP_COUNT, maxItems = this.userPreferencesService.paginationSize) {
this.loadingSource.next(true);
const opts = {
skipCount,
maxItems
};
const promise = this.authorityClearanceApi.getAuthorityClearanceForAuthority(authorityName, opts);
return from(promise).pipe(finalize(() => this.loadingSource.next(false)));
}
/**
* Updates the authority clearance.
*
* @param authorityName The name for the authority for which the clearance is to be updated
* @param securityMarksList NodeSecurityMarkBody[]
* @returns Observable<SecurityMarkEntry | SecurityMarkPaging>
*/
updateClearancesForAuthority(authorityName, securityMarksList) {
this.loadingSource.next(true);
const promise = this.authorityClearanceApi.updateAuthorityClearance(authorityName, securityMarksList);
return from(promise).pipe(finalize(() => {
this.loadingSource.next(false);
this._reloadAuthorityClearance.next();
}));
}
reloadSecurityGroups() {
this.reloadSecurityControls.next();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SecurityControlsService, deps: [{ token: i1.AlfrescoApiService }, { token: i2.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SecurityControlsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SecurityControlsService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: i1.AlfrescoApiService }, { type: i2.UserPreferencesService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktY29udHJvbHMtZ3JvdXBzLW1hcmtzLXNlY3VyaXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3NlY3VyaXR5L3NlcnZpY2VzL3NlY3VyaXR5LWNvbnRyb2xzLWdyb3Vwcy1tYXJrcy1zZWN1cml0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR2xFLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBTWhCLHFCQUFxQixFQUl4QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQUV6RSxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3QixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFHaEMsTUFBTSxPQUFPLHVCQUF1QjtJQW1CaEMsWUFBb0IsVUFBOEIsRUFBVSxzQkFBOEM7UUFBdEYsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFBVSwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBbEJsRywwQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBaUMsQ0FBQztRQUM3RSxxQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFckQsMkJBQXNCLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFDcEUsNEJBQXVC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QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFdEcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUNyQixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDOzhHQTNSUSx1QkFBdUI7a0hBQXZCLHVCQUF1QixjQURWLE1BQU07OzJGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNlY3VyaXR5Q29udHJvbHNHcm91cFJlc3BvbnNlIH0gZnJvbSAnLi9tb2RlbHMvc2VjdXJpdHktY29udHJvbHMtZ3JvdXAtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlY3VyaXR5Q29udHJvbHNNYXJrUmVzcG9uc2UgfSBmcm9tICcuL21vZGVscy9zZWN1cml0eS1jb250cm9scy1tYXJrLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICAgIFNlY3VyaXR5R3JvdXBzQXBpLFxuICAgIFNlY3VyaXR5TWFya3NBcGksXG4gICAgU2VjdXJpdHlHcm91cEVudHJ5LFxuICAgIFNlY3VyaXR5TWFya0VudHJ5LFxuICAgIFNlY3VyaXR5R3JvdXBCb2R5LFxuICAgIFNlY3VyaXR5TWFya1BhZ2luZyxcbiAgICBTZWN1cml0eU1hcmtCb2R5LFxuICAgIEF1dGhvcml0eUNsZWFyYW5jZUFwaSxcbiAgICBBdXRob3JpdHlDbGVhcmFuY2VHcm91cFBhZ2luZyxcbiAgICBOb2RlU2VjdXJpdHlNYXJrQm9keSxcbiAgICBHc0dyb3VwSW5jbHVkZVxufSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGZyZXNjb0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbGZyZXNjby1hcGkuc2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfU0tJUF9DT1VOVCA9IDA7XG5jb25zdCBERUZBVUxUX0lOQ0xVREUgPSAnaW5Vc2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5Q29udHJvbHNTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGdyb3Vwc1BhZ2luYXRlZFNvdXJjZSA9IG5ldyBTdWJqZWN0PFNlY3VyaXR5Q29udHJvbHNHcm91cFJlc3BvbnNlPigpO1xuICAgIGdyb3Vwc1BhZ2luYXRlZCQgPSB0aGlzLmdyb3Vwc1BhZ2luYXRlZFNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgcmVsb2FkU2VjdXJpdHlDb250cm9sczogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcmVsb2FkU2VjdXJpdHlDb250cm9scyQgPSB0aGlzLnJlbG9hZFNlY3VyaXR5Q29udHJvbHMuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIF9yZWxvYWRBdXRob3JpdHlDbGVhcmFuY2U6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHJlbG9hZEF1dGhvcml0eUNsZWFyYW5jZSQgPSB0aGlzLl9yZWxvYWRBdXRob3JpdHlDbGVhcmFuY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIG1hcmtzUGFnaW5hdGVkU291cmNlID0gbmV3IFN1YmplY3Q8U2VjdXJpdHlDb250cm9sc01hcmtSZXNwb25zZT4oKTtcbiAgICBtYXJrc1BhZ2luYXRlZCQgPSB0aGlzLm1hcmtzUGFnaW5hdGVkU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBsb2FkaW5nU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBsb2FkaW5nJCA9IHRoaXMubG9hZGluZ1NvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgc2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cHNBcGk7XG4gICAgcHJpdmF0ZSBzZWN1cml0eU1hcms6IFNlY3VyaXR5TWFya3NBcGk7XG4gICAgcHJpdmF0ZSBhdXRob3JpdHlDbGVhcmFuY2U6IEF1dGhvcml0eUNsZWFyYW5jZUFwaTtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSwgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlKSB7fVxuXG4gICAgZ2V0IGdyb3Vwc0FwaSgpOiBTZWN1cml0eUdyb3Vwc0FwaSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3VyaXR5R3JvdXAgfHwgKHRoaXMuc2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3Vwc0FwaSh0aGlzLmFwaVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSkpO1xuICAgIH1cblxuICAgIGdldCBtYXJrc0FwaSgpOiBTZWN1cml0eU1hcmtzQXBpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdXJpdHlNYXJrIHx8ICh0aGlzLnNlY3VyaXR5TWFyayA9IG5ldyBTZWN1cml0eU1hcmtzQXBpKHRoaXMuYXBpU2VydmljZS5nZXRJbnN0YW5jZSgpKSk7XG4gICAgfVxuXG4gICAgZ2V0IGF1dGhvcml0eUNsZWFyYW5jZUFwaSgpOiBBdXRob3JpdHlDbGVhcmFuY2VBcGkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRob3JpdHlDbGVhcmFuY2UgfHwgKHRoaXMuYXV0aG9yaXR5Q2xlYXJhbmNlID0gbmV3IEF1dGhvcml0eUNsZWFyYW5jZUFwaSh0aGlzLmFwaVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSkpO1xuICAgIH1cblxuICAgIGdldCByZWxvYWRBdXRob3JpdHlDbGVhcmFuY2UoKTogU3ViamVjdDx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWxvYWRBdXRob3JpdHlDbGVhcmFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IEFsbCBzZWN1cml0eSBncm91cHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBza2lwQ291bnQgVGhlIG51bWJlciBvZiBlbnRpdGllcyB0aGF0IGV4aXN0IGluIHRoZSBjb2xsZWN0aW9uIGJlZm9yZSB0aG9zZSBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuXG4gICAgICogQHBhcmFtIG1heEl0ZW1zIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4gaW4gdGhlIGxpc3QuIERlZmF1bHQgaXMgc3BlY2lmaWVkIGJ5IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UuXG4gICAgICogQHBhcmFtIGluY2x1ZGUgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdXJpdHkgZ3JvdXBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFNlY3VyaXR5Q29udHJvbHNHcm91cFJlc3BvbnNlPlxuICAgICAqL1xuICAgIGdldFNlY3VyaXR5R3JvdXAoXG4gICAgICAgIHNraXBDb3VudCA9IERFRkFVTFRfU0tJUF9DT1VOVCxcbiAgICAgICAgbWF4SXRlbXMgPSB0aGlzLnVzZXJQcmVmZXJlbmNlc1NlcnZpY2UucGFnaW5hdGlvblNpemUsXG4gICAgICAgIGluY2x1ZGUgPSBERUZBVUxUX0lOQ0xVREVcbiAgICApOiBQcm9taXNlPFNlY3VyaXR5Q29udHJvbHNHcm91cFJlc3BvbnNlPiB7XG4gICAgICAgIGxldCBzZWN1cml0eUNvbnRyb2xzR3JvdXBSZXNwb25zZTogU2VjdXJpdHlDb250cm9sc0dyb3VwUmVzcG9uc2U7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyb3Vwc0FwaVxuICAgICAgICAgICAgICAgIC5nZXRTZWN1cml0eUdyb3Vwcyh7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGUsXG4gICAgICAgICAgICAgICAgICAgIHNraXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3Vwc1BhZ2luYXRlZFNvdXJjZS5uZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3VyaXR5Q29udHJvbHNHcm91cFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHJlc3BvbnNlLmxpc3QucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzOiByZXNwb25zZS5saXN0LmVudHJpZXMubWFwKChncm91cCkgPT4gZ3JvdXAuZW50cnkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNlY3VyaXR5Q29udHJvbHNHcm91cFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgc2VjdXJpdHkgZ3JvdXBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbnB1dCBzZWN1cml0eUdyb3VwQm9keS5cbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPFNlY3VyaXR5R3JvdXBFbnRyeT5cbiAgICAgKi9cbiAgICBjcmVhdGVTZWN1cml0eUdyb3VwKGlucHV0OiBTZWN1cml0eUdyb3VwQm9keSk6IE9ic2VydmFibGU8U2VjdXJpdHlHcm91cEVudHJ5PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ1NvdXJjZS5uZXh0KHRydWUpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZWN1cml0eUdyb3VwQm9keSA9IHtcbiAgICAgICAgICAgIC4uLmlucHV0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9wdHM6IEdzR3JvdXBJbmNsdWRlID0ge1xuICAgICAgICAgICAgaW5jbHVkZTogREVGQVVMVF9JTkNMVURFXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmdyb3Vwc0FwaS5jcmVhdGVTZWN1cml0eUdyb3VwKHBheWxvYWQsIG9wdHMpO1xuXG4gICAgICAgIHJldHVybiBmcm9tKHByb21pc2UpLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5sb2FkaW5nU291cmNlLm5leHQoZmFsc2UpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHNlY3VyaXR5IG1hcmtzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VjdXJpdHlHcm91cElkIFRoZSBrZXkgZm9yIHRoZSBzZWN1cml0eSBncm91cCBpZC5cbiAgICAgKiBAcGFyYW0gaW5wdXQgc2VjdXJpdHlNYXJrQm9keVtdLlxuICAgICAqIEByZXR1cm5zIFByb21pc2U8U2VjdXJpdHlNYXJrUGFnaW5nIHwgU2VjdXJpdHlNYXJrRW50cnk+XG4gICAgICovXG4gICAgY3JlYXRlU2VjdXJpdHlNYXJrcyhzZWN1cml0eUdyb3VwSWQ6IHN0cmluZywgaW5wdXQ6IFNlY3VyaXR5TWFya0JvZHlbXSk6IFByb21pc2U8U2VjdXJpdHlNYXJrUGFnaW5nIHwgU2VjdXJpdHlNYXJrRW50cnk+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nU291cmNlLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1hcmtzQXBpXG4gICAgICAgICAgICAuY3JlYXRlU2VjdXJpdHlNYXJrcyhzZWN1cml0eUdyb3VwSWQsIGlucHV0KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1NvdXJjZS5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNlY3VyaXR5IG1hcmsgdmFsdWVcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBzZWxlY3RlZCAqKnNlY3VyaXR5R3JvdXBJZCoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlY3VyaXR5R3JvdXBJZCBUaGUga2V5IGZvciB0aGUgc2VjdXJpdHkgZ3JvdXAgaWQuXG4gICAgICogQHBhcmFtIHNraXBDb3VudCBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRoYXQgZXhpc3QgaW4gdGhlIGNvbGxlY3Rpb24gYmVmb3JlIHRob3NlIGluY2x1ZGVkIGluIHRoaXMgbGlzdC5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFNlY3VyaXR5Q29udHJvbHNNYXJrUmVzcG9uc2U+XG4gICAgICovXG4gICAgZ2V0U2VjdXJpdHlNYXJrKHNlY3VyaXR5R3JvdXBJZDogc3RyaW5nLCBza2lwQ291bnQgPSBERUZBVUxUX1NLSVBfQ09VTlQpOiBQcm9taXNlPFNlY3VyaXR5Q29udHJvbHNNYXJrUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHNlY3VyaXR5Q29udHJvbHNNYXJrUmVzcG9uc2U6IFNlY3VyaXR5Q29udHJvbHNNYXJrUmVzcG9uc2U7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcmtzQXBpXG4gICAgICAgICAgICAgICAgLmdldFNlY3VyaXR5TWFya3Moc2VjdXJpdHlHcm91cElkLCB7XG4gICAgICAgICAgICAgICAgICAgIHNraXBDb3VudFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya3NQYWdpbmF0ZWRTb3VyY2UubmV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWN1cml0eUNvbnRyb2xzTWFya1Jlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHJlc3BvbnNlLmxpc3QucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzOiByZXNwb25zZS5saXN0LmVudHJpZXMubWFwKChtYXJrKSA9PiBtYXJrLmVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWN1cml0eUNvbnRyb2xzTWFya1Jlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYSBzZWN1cml0eSBncm91cHMgaW5mb3JtYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWN1cml0eUdyb3VwSWQgVGhlIEtleSBvZiBTZWN1cml0eSBHcm91cCBpZCBmb3Igd2hpY2ggaW5mbyBpcyByZXF1aXJlZFxuICAgICAqIEBwYXJhbSBpbnB1dCBTZWN1cml0eUdyb3VwQm9keVxuICAgICAqIEBwYXJhbSBvcHRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlY3VyaXR5IGdyb3VwXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxTZWN1cml0eUdyb3VwRW50cnk+XG4gICAgICovXG4gICAgdXBkYXRlU2VjdXJpdHlHcm91cChzZWN1cml0eUdyb3VwSWQ6IHN0cmluZywgaW5wdXQ6IFNlY3VyaXR5R3JvdXBCb2R5LCBvcHRzPzogYW55KTogUHJvbWlzZTxTZWN1cml0eUdyb3VwRW50cnk+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nU291cmNlLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFNlY3VyaXR5R3JvdXBCb2R5ID0ge1xuICAgICAgICAgICAgLi4uaW5wdXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgIERFRkFVTFRfSU5DTFVERVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ncm91cHNBcGlcbiAgICAgICAgICAgIC51cGRhdGVTZWN1cml0eUdyb3VwKHNlY3VyaXR5R3JvdXBJZCwgcGF5bG9hZCwgb3B0cylcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nU291cmNlLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgU2VjdXJpdHkgTWFyayB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHNlY3VyaXR5R3JvdXBJZCBUaGUga2V5IGZvciB0aGUgc2VjdXJpdHkgZ3JvdXAgaWQuXG4gICAgICogQHBhcmFtIHNlY3VyaXR5TWFya0lkIFRoZSBrZXkgZm9yIHRoZSBzZWN1cml0eSBtYXJrIGlzIGluIHVzZSBvciBub3QuXG4gICAgICogQHBhcmFtIGlucHV0IHNlY3VyaXR5TWFya0JvZHkuXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxTZWN1cml0eU1hcmtFbnRyeT5cbiAgICAgKi9cbiAgICB1cGRhdGVTZWN1cml0eU1hcmsoc2VjdXJpdHlHcm91cElkOiBzdHJpbmcsIHNlY3VyaXR5TWFya0lkOiBzdHJpbmcsIGlucHV0OiBTZWN1cml0eU1hcmtCb2R5KTogUHJvbWlzZTxTZWN1cml0eU1hcmtFbnRyeT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogU2VjdXJpdHlNYXJrQm9keSA9IHtcbiAgICAgICAgICAgIC4uLmlucHV0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1hcmtzQXBpXG4gICAgICAgICAgICAudXBkYXRlU2VjdXJpdHlNYXJrKHNlY3VyaXR5R3JvdXBJZCwgc2VjdXJpdHlNYXJrSWQsIHBheWxvYWQpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nU291cmNlLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1NvdXJjZS5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc2VjdXJpdHkgZ3JvdXBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWN1cml0eUdyb3VwSWQgVGhlIGtleSBmb3IgdGhlIHNlY3VyaXR5IGdyb3VwIGlkLlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGU8dm9pZD5cbiAgICAgKi9cbiAgICBkZWxldGVTZWN1cml0eUdyb3VwKHNlY3VyaXR5R3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubG9hZGluZ1NvdXJjZS5uZXh0KHRydWUpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ncm91cHNBcGkuZGVsZXRlU2VjdXJpdHlHcm91cChzZWN1cml0eUdyb3VwSWQpO1xuXG4gICAgICAgIHJldHVybiBmcm9tKHByb21pc2UpLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5sb2FkaW5nU291cmNlLm5leHQoZmFsc2UpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHNlY3VyaXR5IG1hcmtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWN1cml0eUdyb3VwSWQgVGhlIGtleSBmb3IgdGhlIHNlY3VyaXR5IGdyb3VwIGlkLlxuICAgICAqIEBwYXJhbSBzZWN1cml0eU1hcmtJZCBUaGUga2V5IGZvciB0aGUgc2VjdXJpdHkgbWFyayBpZC5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPFNlY3VyaXR5TWFya0VudHJ5PlxuICAgICAqL1xuICAgIGRlbGV0ZVNlY3VyaXR5TWFyayhzZWN1cml0eUdyb3VwSWQ6IHN0cmluZywgc2VjdXJpdHlNYXJrSWQ6IHN0cmluZyk6IFByb21pc2U8U2VjdXJpdHlNYXJrRW50cnk+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nU291cmNlLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1hcmtzQXBpXG4gICAgICAgICAgICAuZGVsZXRlU2VjdXJpdHlNYXJrKHNlY3VyaXR5R3JvdXBJZCwgc2VjdXJpdHlNYXJrSWQpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nU291cmNlLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1NvdXJjZS5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGF1dGhvcml0eSBjbGVhcmFuY2VzIGZvciBhIHNpbmdsZSB1c2VyL2dyb3VwXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXV0aG9yaXR5TmFtZSBUaGUgbmFtZSBmb3IgdGhlIGF1dGhvcml0eSBmb3Igd2hpY2ggdGhlIGNsZWFyYW5jZSBpcyB0byBiZSBmZXRjaGVkLiBDYW4gYmUgbGVmdCBibGFuayBpbiB3aGljaCBjYXNlIGl0IHdpbGwgZmV0Y2ggaXQgZm9yIGFsbCB1c2VycyB3aXRoIHBhZ2luYXRpb25cbiAgICAgKiBAcGFyYW0gc2tpcENvdW50IFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdGhhdCBleGlzdCBpbiB0aGUgY29sbGVjdGlvbiBiZWZvcmUgdGhvc2UgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LlxuICAgICAqIEBwYXJhbSBtYXhJdGVtcyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuIGluIHRoZSBsaXN0LiBEZWZhdWx0IGlzIHNwZWNpZmllZCBieSBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGU8QXV0aG9yaXR5Q2xlYXJhbmNlR3JvdXBQYWdpbmc+XG4gICAgICovXG4gICAgZ2V0Q2xlYXJhbmNlc0ZvckF1dGhvcml0eShcbiAgICAgICAgYXV0aG9yaXR5TmFtZTogc3RyaW5nLFxuICAgICAgICBza2lwQ291bnQgPSBERUZBVUxUX1NLSVBfQ09VTlQsXG4gICAgICAgIG1heEl0ZW1zID0gdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLnBhZ2luYXRpb25TaXplXG4gICAgKTogT2JzZXJ2YWJsZTxBdXRob3JpdHlDbGVhcmFuY2VHcm91cFBhZ2luZz4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgICAgIHNraXBDb3VudCxcbiAgICAgICAgICAgIG1heEl0ZW1zXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmF1dGhvcml0eUNsZWFyYW5jZUFwaS5nZXRBdXRob3JpdHlDbGVhcmFuY2VGb3JBdXRob3JpdHkoYXV0aG9yaXR5TmFtZSwgb3B0cyk7XG5cbiAgICAgICAgcmV0dXJuIGZyb20ocHJvbWlzZSkucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dChmYWxzZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBhdXRob3JpdHkgY2xlYXJhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1dGhvcml0eU5hbWUgVGhlIG5hbWUgZm9yIHRoZSBhdXRob3JpdHkgZm9yIHdoaWNoIHRoZSBjbGVhcmFuY2UgaXMgdG8gYmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBzZWN1cml0eU1hcmtzTGlzdCBOb2RlU2VjdXJpdHlNYXJrQm9keVtdXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxTZWN1cml0eU1hcmtFbnRyeSB8IFNlY3VyaXR5TWFya1BhZ2luZz5cbiAgICAgKi9cbiAgICB1cGRhdGVDbGVhcmFuY2VzRm9yQXV0aG9yaXR5KFxuICAgICAgICBhdXRob3JpdHlOYW1lOiBzdHJpbmcsXG4gICAgICAgIHNlY3VyaXR5TWFya3NMaXN0OiBOb2RlU2VjdXJpdHlNYXJrQm9keVtdXG4gICAgKTogT2JzZXJ2YWJsZTxTZWN1cml0eU1hcmtFbnRyeSB8IFNlY3VyaXR5TWFya1BhZ2luZz4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuYXV0aG9yaXR5Q2xlYXJhbmNlQXBpLnVwZGF0ZUF1dGhvcml0eUNsZWFyYW5jZShhdXRob3JpdHlOYW1lLCBzZWN1cml0eU1hcmtzTGlzdCk7XG5cbiAgICAgICAgcmV0dXJuIGZyb20ocHJvbWlzZSkucGlwZShcbiAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdTb3VyY2UubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkQXV0aG9yaXR5Q2xlYXJhbmNlLm5leHQoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVsb2FkU2VjdXJpdHlHcm91cHMoKSB7XG4gICAgICAgIHRoaXMucmVsb2FkU2VjdXJpdHlDb250cm9scy5uZXh0KCk7XG4gICAgfVxufVxuIl19