UNPKG

@alfresco/adf-content-services

Version:
274 lines 37.2 kB
/*! * @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