@alauda-fe/common
Version:
Alauda frontend team common codes.
109 lines • 24.3 kB
JavaScript
/**
* @packageDocumentation
* @module permission
*/
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { forkJoin, of, map, switchMap } from 'rxjs';
import { K8sApiResourceService, getApiPrefixParts } from '../api/public-api';
import { K8sResourceAction, API_GATEWAY, ifExist, publishRef, } from '../core/public-api';
import { isAllowed } from './helpers';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "../api/public-api";
export class K8sPermissionService {
constructor(http, k8sApiResource) {
this.http = http;
this.k8sApiResource = k8sApiResource;
this.getAccess = this.getAccess.bind(this);
this.isAllowed = this.isAllowed.bind(this);
}
getAccess(typeOrResourceParams) {
let params;
let group;
let type$;
if ('resource' in typeOrResourceParams) {
const { advanced: resourceAdvanced, project: resourceProject, cluster: resourceCluster, resource, action, } = typeOrResourceParams;
params = {
advanced: resourceAdvanced,
project: resourceProject,
cluster: resourceCluster,
namespace: resource.metadata.namespace,
name: resource.metadata.name,
action,
};
group = getApiPrefixParts(resource.apiVersion).apiGroup;
type$ = this.k8sApiResource.getResourceType(resource, resourceCluster);
}
else {
params = typeOrResourceParams;
const { apiGroup, type } = this.k8sApiResource.getDefinition(params.type);
group = apiGroup;
type$ = of(type);
}
const { advanced, project, cluster, namespace, name, action, subResource } = params;
const isNameArray = Array.isArray(name);
const isActionArray = Array.isArray(action);
const isArray = isNameArray && isActionArray;
const names = (isNameArray ? name : [name]);
const actions = (isActionArray ? action : [action]);
return type$.pipe(switchMap(type => forkJoin(names.map(name => of(actions).pipe(switchMap(actionList => forkJoin(actionList.map(action => this._getAccess({
action,
project,
cluster,
group,
name,
namespace,
type,
advanced,
subResource,
})))))))), map(accesses => isArray
? accesses
: isActionArray
? accesses[0]
: isNameArray
? accesses.map(accessGroup => accessGroup[0])
: accesses[0][0]), publishRef());
}
isAllowed(typeOrResourceParams) {
if (('name' in typeOrResourceParams &&
Array.isArray(typeOrResourceParams.name)) ||
(typeOrResourceParams.action !== K8sResourceAction.ALL &&
!Array.isArray(typeOrResourceParams.action) &&
typeOrResourceParams.transform == null)) {
typeOrResourceParams.transform = false;
}
// @ts-expect-error
return this.getAccess(typeOrResourceParams).pipe(isAllowed(typeOrResourceParams.transform));
}
// @internal
_getAccess({ action, project, cluster, group, name, namespace, type, advanced, subResource, }) {
return this.http.post(`${API_GATEWAY}${advanced
? '/auth'
: `${ifExist(cluster, `/kubernetes/${cluster}`)}/apis/authorization.k8s.io`}/v1/selfsubjectaccessreviews`, {
apiVersion: 'authorization.k8s.io/v1',
kind: 'SelfSubjectAccessReview',
spec: {
resourceAttributes: {
namespace,
verb: action || (name ? K8sResourceAction.GET : K8sResourceAction.LIST),
group,
resource: type,
name,
cluster: advanced ? cluster : undefined,
project: advanced ? project : undefined,
...(subResource ? { subResource } : {}),
},
},
});
}
static { this.ɵfac = function K8sPermissionService_Factory(t) { return new (t || K8sPermissionService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.K8sApiResourceService)); }; }
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: K8sPermissionService, factory: K8sPermissionService.ɵfac, providedIn: 'root' }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(K8sPermissionService, [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], () => [{ type: i1.HttpClient }, { type: i2.K8sApiResourceService }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXBlcm1pc3Npb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9wZXJtaXNzaW9uL2s4cy1wZXJtaXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3RSxPQUFPLEVBRUwsaUJBQWlCLEVBR2pCLFdBQVcsRUFDWCxPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7OztBQXNCdEMsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixZQUNtQixJQUFnQixFQUNoQixjQUFxQztRQURyQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUV0RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQTBERCxTQUFTLENBQ1Asb0JBRXFDO1FBRXJDLElBQUksTUFBa0MsQ0FBQztRQUN2QyxJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxVQUFVLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEVBQ0osUUFBUSxFQUFFLGdCQUFnQixFQUMxQixPQUFPLEVBQUUsZUFBZSxFQUN4QixPQUFPLEVBQUUsZUFBZSxFQUN4QixRQUFRLEVBQ1IsTUFBTSxHQUNQLEdBQUcsb0JBQW9CLENBQUM7WUFDekIsTUFBTSxHQUFHO2dCQUNQLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDdEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDNUIsTUFBTTthQUN1QixDQUFDO1lBQ2hDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3hELEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDekUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsb0JBQW9CLENBQUM7WUFDOUIsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUUsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUNqQixLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQ3hFLE1BQU0sQ0FBQztRQUNULE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxXQUFXLElBQUksYUFBYSxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQWEsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFRLENBQUM7UUFDM0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNmLFFBQVEsQ0FDTixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDZCxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FDckIsUUFBUSxDQUNOLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBSTtZQUNqQixNQUFNO1lBQ04sT0FBTztZQUNQLE9BQU87WUFDUCxLQUFLO1lBQ0wsSUFBSTtZQUNKLFNBQVM7WUFDVCxJQUFJO1lBQ0osUUFBUTtZQUNSLFdBQVc7U0FDWixDQUFDLENBQ0gsQ0FDRixDQUNGLENBQ0YsQ0FDRixDQUNGLENBQ0YsRUFDRCxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FDYixPQUFPO1lBQ0wsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsYUFBYTtnQkFDZixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDYixDQUFDLENBQUMsV0FBVztvQkFDYixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkIsRUFDRCxVQUFVLEVBQUUsQ0FDYixDQUFDO0lBQ0osQ0FBQztJQTBFRCxTQUFTLENBS1Asb0JBRXFEO1FBRXJELElBQ0UsQ0FBQyxNQUFNLElBQUksb0JBQW9CO1lBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsR0FBRztnQkFDcEQsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztnQkFDM0Msb0JBQW9CLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxFQUN6QyxDQUFDO1lBQ0Qsb0JBQW9CLENBQUMsU0FBUyxHQUFHLEtBQVUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsbUJBQW1CO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FDOUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVk7SUFDSixVQUFVLENBQThCLEVBQzlDLE1BQU0sRUFDTixPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxJQUFJLEVBQ0osU0FBUyxFQUNULElBQUksRUFDSixRQUFRLEVBQ1IsV0FBVyxHQVdaO1FBQ0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsR0FBRyxXQUFXLEdBQ1osUUFBUTtZQUNOLENBQUMsQ0FBQyxPQUFPO1lBQ1QsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUNSLE9BQU8sRUFFUCxlQUFlLE9BQU8sRUFBRSxDQUN6Qiw0QkFDUCw4QkFBOEIsRUFDOUI7WUFDRSxVQUFVLEVBQUUseUJBQXlCO1lBQ3JDLElBQUksRUFBRSx5QkFBeUI7WUFDL0IsSUFBSSxFQUFFO2dCQUNKLGtCQUFrQixFQUFFO29CQUNsQixTQUFTO29CQUNULElBQUksRUFDRixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO29CQUNuRSxLQUFLO29CQUNMLFFBQVEsRUFBRSxJQUFJO29CQUNkLElBQUk7b0JBQ0osT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUN2QyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQ3ZDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDeEM7YUFDRjtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7cUZBalNVLG9CQUFvQjt1RUFBcEIsb0JBQW9CLFdBQXBCLG9CQUFvQixtQkFGbkIsTUFBTTs7aUZBRVAsb0JBQW9CO2NBSGhDLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIHBlcm1pc3Npb25cbiAqL1xuXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIG9mLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBLOHNBcGlSZXNvdXJjZVNlcnZpY2UsIGdldEFwaVByZWZpeFBhcnRzIH0gZnJvbSAnLi4vYXBpL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgSWZFcXVhbCxcbiAgSzhzUmVzb3VyY2VBY3Rpb24sXG4gIEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgU2VsZlN1YmplY3RBY2Nlc3NSZXZpZXcsXG4gIEFQSV9HQVRFV0FZLFxuICBpZkV4aXN0LFxuICBwdWJsaXNoUmVmLFxufSBmcm9tICcuLi9jb3JlL3B1YmxpYy1hcGknO1xuXG5pbXBvcnQgeyBpc0FsbG93ZWQgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgQWxsUGVybWlzc2lvbnMsXG4gIEs4c1Blcm1pc3Npb25UcmFuc2Zvcm1hYmxlLFxuICBLOHNSZXNvdXJjZVBlcm1pc3Npb25NdWx0aVBhcmFtcyxcbiAgSzhzUmVzb3VyY2VQZXJtaXNzaW9uTm9uZVBhcmFtcyxcbiAgSzhzUmVzb3VyY2VQZXJtaXNzaW9uUGFyYW1zLFxuICBLOHNSZXNvdXJjZVBlcm1pc3Npb25TaW5nbGVQYXJhbXMsXG4gIEs4c1Jlc291cmNlUGVybWlzc2lvbldpdGhUcmFuc2Zvcm1QYXJhbXMsXG4gIEs4c1R5cGVQZXJtaXNzaW9uQWN0aW9uc1BhcmFtcyxcbiAgSzhzVHlwZVBlcm1pc3Npb25NYXRyaXhQYXJhbXMsXG4gIEs4c1R5cGVQZXJtaXNzaW9uTXVsdGlQYXJhbXMsXG4gIEs4c1R5cGVQZXJtaXNzaW9uTmFtZXNQYXJhbXMsXG4gIEs4c1R5cGVQZXJtaXNzaW9uTm9uZVBhcmFtcyxcbiAgSzhzVHlwZVBlcm1pc3Npb25QYXJhbXMsXG4gIEs4c1R5cGVQZXJtaXNzaW9uU2luZ2xlUGFyYW1zLFxuICBLOHNUeXBlUGVybWlzc2lvbldpdGhUcmFuc2Zvcm1QYXJhbXMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgSzhzUGVybWlzc2lvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGlSZXNvdXJjZTogSzhzQXBpUmVzb3VyY2VTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmdldEFjY2VzcyA9IHRoaXMuZ2V0QWNjZXNzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pc0FsbG93ZWQgPSB0aGlzLmlzQWxsb3dlZC5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWvuSBLOHMg6LWE5rqQ55qE5pON5L2c5p2D6ZmQ77yM5LiA6Iis5ZKMIGlzQWxsb3dlZCDphY3lkIjkvb/nlKhcbiAgICovXG5cbiAgLyoqXG4gICAqIOagueaNruW3suaciSBLOHMg6LWE5rqQ77yM5LiN5Lyg5YWlIGFjdGlvbiDmiJbkuLogbnVsbCDml7bpu5jorqTlj5YgZ2V0IOaTjeS9nOadg+mZkFxuICAgKi9cbiAgZ2V0QWNjZXNzPFxuICAgIEsgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gICAgVCBleHRlbmRzIEs4c1Jlc291cmNlQWN0aW9uID0gSzhzUmVzb3VyY2VBY3Rpb24uR0VULFxuICA+KFxuICAgIHBhcmFtczogSzhzUmVzb3VyY2VQZXJtaXNzaW9uTm9uZVBhcmFtczxLPixcbiAgKTogT2JzZXJ2YWJsZTxTZWxmU3ViamVjdEFjY2Vzc1JldmlldzxUPj47XG5cbiAgLyoqXG4gICAqIOagueaNruW3suaciSBLOHMg6LWE5rqQ77yM6L+b6KGM5Y2V5Liq5oyH5a6aIGFjdGlvbiDmk43kvZzmnYPpmZBcbiAgICovXG4gIGdldEFjY2VzczxUIGV4dGVuZHMgSzhzUmVzb3VyY2VBY3Rpb24sIEsgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KFxuICAgIHBhcmFtczogSzhzUmVzb3VyY2VQZXJtaXNzaW9uU2luZ2xlUGFyYW1zPEssIFQ+LFxuICApOiBPYnNlcnZhYmxlPFNlbGZTdWJqZWN0QWNjZXNzUmV2aWV3PFQ+PjtcblxuICAvKipcbiAgICog5qC55o2u5bey5pyJIEs4cyDotYTmupDvvIzov5vooYzlpJrkuKrmjIflrpogYWN0aW9uIOaTjeS9nOadg+mZkOWIl+ihqFxuICAgKi9cbiAgZ2V0QWNjZXNzPFQgZXh0ZW5kcyBLOHNSZXNvdXJjZUFjdGlvbiwgSyBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcGFyYW1zOiBLOHNSZXNvdXJjZVBlcm1pc3Npb25NdWx0aVBhcmFtczxLLCBUPixcbiAgKTogT2JzZXJ2YWJsZTxBcnJheTxTZWxmU3ViamVjdEFjY2Vzc1JldmlldzxUPj4+O1xuXG4gIC8qKlxuICAgKiDmoLnmja4gSzhzIOi1hOa6kOexu+Wei++8jOS4jeS8oOWFpSBhY3Rpb24g5oiW5Li6IG51bGwg5pe26buY6K6k5Y+WIGxpc3Qg5pON5L2c5p2D6ZmQXG4gICAqL1xuICBnZXRBY2Nlc3MoXG4gICAgcGFyYW1zOiBLOHNUeXBlUGVybWlzc2lvbk5vbmVQYXJhbXMsXG4gICk6IE9ic2VydmFibGU8U2VsZlN1YmplY3RBY2Nlc3NSZXZpZXc8SzhzUmVzb3VyY2VBY3Rpb24uTElTVD4+O1xuXG4gIC8qKlxuICAgKiDmoLnmja4gSzhzIOi1hOa6kOexu+Wei+WSjOWQjeensOi/m+ihjOWNleS4quaMh+WumiBhY3Rpb24g5pON5L2c5p2D6ZmQ77yM6buY6K6k5Y+WIGdldCDmk43kvZzmnYPpmZBcbiAgICovXG4gIGdldEFjY2VzczxUIGV4dGVuZHMgSzhzUmVzb3VyY2VBY3Rpb24gPSBLOHNSZXNvdXJjZUFjdGlvbi5HRVQ+KFxuICAgIHBhcmFtczogSzhzVHlwZVBlcm1pc3Npb25TaW5nbGVQYXJhbXM8VD4sXG4gICk6IE9ic2VydmFibGU8U2VsZlN1YmplY3RBY2Nlc3NSZXZpZXc8VD4+O1xuXG4gIC8qKlxuICAgKiDmoLnmja4gSzhzIOi1hOa6kOexu+Wei++8jOi/m+ihjOWkmuS4quaMh+WumiBhY3Rpb24g5pON5L2c5oiW6ICF5aSa5Liq5ZCN56ew55qE5p2D6ZmQ5YiX6KGoXG4gICAqL1xuICBnZXRBY2Nlc3M8VCBleHRlbmRzIEs4c1Jlc291cmNlQWN0aW9uPihcbiAgICBwYXJhbXM6IEs4c1R5cGVQZXJtaXNzaW9uTXVsdGlQYXJhbXM8VD4sXG4gICk6IE9ic2VydmFibGU8QXJyYXk8U2VsZlN1YmplY3RBY2Nlc3NSZXZpZXc8VD4+PjtcblxuICAvKipcbiAgICog5qC55o2uIEs4cyDotYTmupDnsbvlnovvvIzov5vooYzlpJrkuKrmjIflrpogYWN0aW9uIOaTjeS9nOWSjOWkmuS4quWQjeensOeahOadg+mZkOS6jOS9jeaVsOe7hOWIl+ihqFxuICAgKi9cbiAgZ2V0QWNjZXNzPFQgZXh0ZW5kcyBLOHNSZXNvdXJjZUFjdGlvbj4oXG4gICAgcGFyYW1zOiBLOHNUeXBlUGVybWlzc2lvbk1hdHJpeFBhcmFtczxUPixcbiAgKTogT2JzZXJ2YWJsZTxBcnJheTxBcnJheTxTZWxmU3ViamVjdEFjY2Vzc1JldmlldzxUPj4+PjtcblxuICBnZXRBY2Nlc3M8VCBleHRlbmRzIEs4c1Jlc291cmNlQWN0aW9uLCBLIGV4dGVuZHMgS3ViZXJuZXRlc1Jlc291cmNlPihcbiAgICB0eXBlT3JSZXNvdXJjZVBhcmFtczpcbiAgICAgIHwgSzhzVHlwZVBlcm1pc3Npb25QYXJhbXM8VD5cbiAgICAgIHwgSzhzUmVzb3VyY2VQZXJtaXNzaW9uUGFyYW1zPEssIFQ+LFxuICApIHtcbiAgICBsZXQgcGFyYW1zOiBLOHNUeXBlUGVybWlzc2lvblBhcmFtczxUPjtcbiAgICBsZXQgZ3JvdXA6IHN0cmluZztcbiAgICBsZXQgdHlwZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBpZiAoJ3Jlc291cmNlJyBpbiB0eXBlT3JSZXNvdXJjZVBhcmFtcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhZHZhbmNlZDogcmVzb3VyY2VBZHZhbmNlZCxcbiAgICAgICAgcHJvamVjdDogcmVzb3VyY2VQcm9qZWN0LFxuICAgICAgICBjbHVzdGVyOiByZXNvdXJjZUNsdXN0ZXIsXG4gICAgICAgIHJlc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICB9ID0gdHlwZU9yUmVzb3VyY2VQYXJhbXM7XG4gICAgICBwYXJhbXMgPSB7XG4gICAgICAgIGFkdmFuY2VkOiByZXNvdXJjZUFkdmFuY2VkLFxuICAgICAgICBwcm9qZWN0OiByZXNvdXJjZVByb2plY3QsXG4gICAgICAgIGNsdXN0ZXI6IHJlc291cmNlQ2x1c3RlcixcbiAgICAgICAgbmFtZXNwYWNlOiByZXNvdXJjZS5tZXRhZGF0YS5uYW1lc3BhY2UsXG4gICAgICAgIG5hbWU6IHJlc291cmNlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIGFjdGlvbixcbiAgICAgIH0gYXMgSzhzVHlwZVBlcm1pc3Npb25QYXJhbXM8VD47XG4gICAgICBncm91cCA9IGdldEFwaVByZWZpeFBhcnRzKHJlc291cmNlLmFwaVZlcnNpb24pLmFwaUdyb3VwO1xuICAgICAgdHlwZSQgPSB0aGlzLms4c0FwaVJlc291cmNlLmdldFJlc291cmNlVHlwZShyZXNvdXJjZSwgcmVzb3VyY2VDbHVzdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zID0gdHlwZU9yUmVzb3VyY2VQYXJhbXM7XG4gICAgICBjb25zdCB7IGFwaUdyb3VwLCB0eXBlIH0gPSB0aGlzLms4c0FwaVJlc291cmNlLmdldERlZmluaXRpb24ocGFyYW1zLnR5cGUpO1xuICAgICAgZ3JvdXAgPSBhcGlHcm91cDtcbiAgICAgIHR5cGUkID0gb2YodHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgYWR2YW5jZWQsIHByb2plY3QsIGNsdXN0ZXIsIG5hbWVzcGFjZSwgbmFtZSwgYWN0aW9uLCBzdWJSZXNvdXJjZSB9ID1cbiAgICAgIHBhcmFtcztcbiAgICBjb25zdCBpc05hbWVBcnJheSA9IEFycmF5LmlzQXJyYXkobmFtZSk7XG4gICAgY29uc3QgaXNBY3Rpb25BcnJheSA9IEFycmF5LmlzQXJyYXkoYWN0aW9uKTtcbiAgICBjb25zdCBpc0FycmF5ID0gaXNOYW1lQXJyYXkgJiYgaXNBY3Rpb25BcnJheTtcbiAgICBjb25zdCBuYW1lcyA9IChpc05hbWVBcnJheSA/IG5hbWUgOiBbbmFtZV0pIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IGFjdGlvbnMgPSAoaXNBY3Rpb25BcnJheSA/IGFjdGlvbiA6IFthY3Rpb25dKSBhcyBUW107XG4gICAgcmV0dXJuIHR5cGUkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAodHlwZSA9PlxuICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PlxuICAgICAgICAgICAgb2YoYWN0aW9ucykucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKGFjdGlvbkxpc3QgPT5cbiAgICAgICAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgICAgICAgIGFjdGlvbkxpc3QubWFwKGFjdGlvbiA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRBY2Nlc3M8VD4oe1xuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdWJSZXNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgbWFwKGFjY2Vzc2VzID0+XG4gICAgICAgIGlzQXJyYXlcbiAgICAgICAgICA/IGFjY2Vzc2VzXG4gICAgICAgICAgOiBpc0FjdGlvbkFycmF5XG4gICAgICAgICAgPyBhY2Nlc3Nlc1swXVxuICAgICAgICAgIDogaXNOYW1lQXJyYXlcbiAgICAgICAgICA/IGFjY2Vzc2VzLm1hcChhY2Nlc3NHcm91cCA9PiBhY2Nlc3NHcm91cFswXSlcbiAgICAgICAgICA6IGFjY2Vzc2VzWzBdWzBdLFxuICAgICAgKSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruW3sue7j+iOt+WPluWIsOeahOaTjeS9nOadg+mZkOWvueixoeaIluWIl+ihqOi9rOWMluS4uuabtOaWueS+v+S9v+eUqOeahOadg+mZkCByZWNvcmQg5oiW5pWw57uEXG4gICAqL1xuXG4gIC8qKlxuICAgKiDmoLnmja7lt7LmnIkgSzhzIOi1hOa6kO+8jOS4jeS8oOWFpSBhY3Rpb24g5oiW5Li6IG51bGwg5pe26L2s5YyW5Li6IGJvb2xlYW5cbiAgICovXG4gIGlzQWxsb3dlZDxUIGV4dGVuZHMgSzhzUmVzb3VyY2VBY3Rpb24sIEsgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KFxuICAgIHBhcmFtczpcbiAgICAgIHwgSzhzUmVzb3VyY2VQZXJtaXNzaW9uTm9uZVBhcmFtczxLPlxuICAgICAgfCBLOHNSZXNvdXJjZVBlcm1pc3Npb25TaW5nbGVQYXJhbXM8SywgVD4sXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIOagueaNruW3suaciSBLOHMg6LWE5rqQ77yM5aSa5LiqIGFjdGlvbiDpu5jorqTovazkuLogcmVjb3Jk77yMYHRyYW5zZm9ybSA9PT0gZmFsc2VgIOaXtui9rOS4uiBgYm9vbGVhbltdYFxuICAgKi9cbiAgaXNBbGxvd2VkPFxuICAgIFQgZXh0ZW5kcyBLOHNSZXNvdXJjZUFjdGlvbixcbiAgICBLIGV4dGVuZHMgS3ViZXJuZXRlc1Jlc291cmNlLFxuICAgIFIgZXh0ZW5kcyBib29sZWFuID0gdHJ1ZSxcbiAgPihcbiAgICBwYXJhbXM6IEs4c1Jlc291cmNlUGVybWlzc2lvbk11bHRpUGFyYW1zPEssIFQ+ICZcbiAgICAgIFBhcnRpYWw8SzhzUGVybWlzc2lvblRyYW5zZm9ybWFibGU8Uj4+LFxuICApOiBPYnNlcnZhYmxlPElmRXF1YWw8UiwgZmFsc2UsIGJvb2xlYW5bXSwgUmVjb3JkPFQsIGJvb2xlYW4+Pj47XG5cbiAgLyoqXG4gICAqIOagueaNriBLOHMg6LWE5rqQ57G75Z6L77yM5LiN5Lyg5YWlIGFjdGlvbi9uYW1lIOaIluS4uiBudWxsIOaXtu+8jOm7mOiupOWPliBnZXQg5p2D6ZmQ77yM6Ieq5Yqo6L2s5YyW5Li6IGJvb2xlYW7vvIxgdHJhbnNmb3JtICE9PSBmYWxzZWAg5pe26L2s5YyW5Li6IHJlY29yZFxuICAgKi9cbiAgaXNBbGxvd2VkPFxuICAgIFQgZXh0ZW5kcyBLOHNSZXNvdXJjZUFjdGlvbiA9IEs4c1Jlc291cmNlQWN0aW9uLkdFVCxcbiAgICBLIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICA+KFxuICAgIHBhcmFtczogSzhzVHlwZVBlcm1pc3Npb25Ob25lUGFyYW1zICZcbiAgICAgIFBhcnRpYWw8SzhzUGVybWlzc2lvblRyYW5zZm9ybWFibGU8Sz4+LFxuICApOiBPYnNlcnZhYmxlPElmRXF1YWw8SywgZmFsc2UsIGJvb2xlYW4sIFJlY29yZDxULCBib29sZWFuPj4+O1xuXG4gIC8qKlxuICAgKiDmoLnmja4gSzhzIOi1hOa6kOexu+Wei++8jOS8oOWFpeWNleS4qiBhY3Rpb24g5oiWIG5hbWUg5pe277yMYGFjdGlvbiA9PT0gQUxMKCopYCDml7boh6rliqjovazljJbkuLrmiYDmnInmnYPpmZDnmoQgcmVjb3Jk77yM5ZCm5YiZ6L2s5YyW5Li6IGBib29sZWFuYFxuICAgKi9cbiAgaXNBbGxvd2VkPFQgZXh0ZW5kcyBLOHNSZXNvdXJjZUFjdGlvbj4oXG4gICAgcGFyYW1zOiBLOHNUeXBlUGVybWlzc2lvblNpbmdsZVBhcmFtczxUPixcbiAgKTogT2JzZXJ2YWJsZTxJZkVxdWFsPFQsIEs4c1Jlc291cmNlQWN0aW9uLkFMTCwgQWxsUGVybWlzc2lvbnMsIGJvb2xlYW4+PjtcblxuICAvKipcbiAgICog5qC55o2uIEs4cyDotYTmupDnsbvlnovvvIzkvKDlhaXljZXkuKogYWN0aW9uIOaIliBuYW1lIOaXtu+8jOiHquWKqOi9rOWMluS4uiByZWNvcmTvvIxgdHJhbnNmb3JtID09PSBmYWxzZWAg5pe26L2s5YyW5Li6IGBib29sZWFuYFxuICAgKi9cbiAgaXNBbGxvd2VkPFQgZXh0ZW5kcyBLOHNSZXNvdXJjZUFjdGlvbiwgSyBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHBhcmFtczogSzhzVHlwZVBlcm1pc3Npb25TaW5nbGVQYXJhbXM8VD4gJiBLOHNQZXJtaXNzaW9uVHJhbnNmb3JtYWJsZTxLPixcbiAgKTogT2JzZXJ2YWJsZTxcbiAgICBJZkVxdWFsPFxuICAgICAgSyxcbiAgICAgIGZhbHNlLFxuICAgICAgYm9vbGVhbixcbiAgICAgIElmRXF1YWw8VCwgSzhzUmVzb3VyY2VBY3Rpb24uQUxMLCBBbGxQZXJtaXNzaW9ucywgUmVjb3JkPFQsIGJvb2xlYW4+PlxuICAgID5cbiAgPjtcblxuICAvKipcbiAgICog5qC55o2uIEs4cyDotYTmupDnsbvlnovvvIzkvKDlhaXlpJrkuKogYWN0aW9uIOaXtu+8jOiHquWKqOi9rOWMluS4uiByZWNvcmTvvIxgdHJhbnNmb3JtID09PSBmYWxzZWAg5pe26L2s5YyW5Li6IGBib29sZWFuW11gXG4gICAqL1xuICBpc0FsbG93ZWQ8VCBleHRlbmRzIEs4c1Jlc291cmNlQWN0aW9uLCBLIGV4dGVuZHMgYm9vbGVhbiA9IHRydWU+KFxuICAgIHBhcmFtczogSzhzVHlwZVBlcm1pc3Npb25BY3Rpb25zUGFyYW1zPFQ+ICZcbiAgICAgIFBhcnRpYWw8SzhzUGVybWlzc2lvblRyYW5zZm9ybWFibGU8Sz4+LFxuICApOiBPYnNlcnZhYmxlPElmRXF1YWw8SywgZmFsc2UsIGJvb2xlYW5bXSwgUmVjb3JkPFQsIGJvb2xlYW4+Pj47XG5cbiAgLyoqXG4gICAqIOagueaNriBLOHMg6LWE5rqQ57G75Z6L77yM5Lyg5YWl5aSa5LiqIG5hbWUg5pe277yM6Ieq5Yqo6L2s5YyW5Li6IGBib29sZWFuW11gXG4gICAqL1xuICBpc0FsbG93ZWQ8VCBleHRlbmRzIEs4c1Jlc291cmNlQWN0aW9uPihcbiAgICBwYXJhbXM6IEs4c1R5cGVQZXJtaXNzaW9uTmFtZXNQYXJhbXM8VD4sXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbltdPjtcblxuICBpc0FsbG93ZWQ8XG4gICAgVCBleHRlbmRzIEs4c1Jlc291cmNlQWN0aW9uLFxuICAgIEsgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gICAgUiBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuICA+KFxuICAgIHR5cGVPclJlc291cmNlUGFyYW1zOlxuICAgICAgfCBLOHNUeXBlUGVybWlzc2lvbldpdGhUcmFuc2Zvcm1QYXJhbXM8VCwgUj5cbiAgICAgIHwgSzhzUmVzb3VyY2VQZXJtaXNzaW9uV2l0aFRyYW5zZm9ybVBhcmFtczxLLCBULCBSPixcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoXG4gICAgICAoJ25hbWUnIGluIHR5cGVPclJlc291cmNlUGFyYW1zICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkodHlwZU9yUmVzb3VyY2VQYXJhbXMubmFtZSkpIHx8XG4gICAgICAodHlwZU9yUmVzb3VyY2VQYXJhbXMuYWN0aW9uICE9PSBLOHNSZXNvdXJjZUFjdGlvbi5BTEwgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodHlwZU9yUmVzb3VyY2VQYXJhbXMuYWN0aW9uKSAmJlxuICAgICAgICB0eXBlT3JSZXNvdXJjZVBhcmFtcy50cmFuc2Zvcm0gPT0gbnVsbClcbiAgICApIHtcbiAgICAgIHR5cGVPclJlc291cmNlUGFyYW1zLnRyYW5zZm9ybSA9IGZhbHNlIGFzIFI7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXR1cm4gdGhpcy5nZXRBY2Nlc3ModHlwZU9yUmVzb3VyY2VQYXJhbXMpLnBpcGUoXG4gICAgICBpc0FsbG93ZWQodHlwZU9yUmVzb3VyY2VQYXJhbXMudHJhbnNmb3JtKSxcbiAgICApO1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIHByaXZhdGUgX2dldEFjY2VzczxUIGV4dGVuZHMgSzhzUmVzb3VyY2VBY3Rpb24+KHtcbiAgICBhY3Rpb24sXG4gICAgcHJvamVjdCxcbiAgICBjbHVzdGVyLFxuICAgIGdyb3VwLFxuICAgIG5hbWUsXG4gICAgbmFtZXNwYWNlLFxuICAgIHR5cGUsXG4gICAgYWR2YW5jZWQsXG4gICAgc3ViUmVzb3VyY2UsXG4gIH06IHtcbiAgICBhY3Rpb246IFQ7XG4gICAgcHJvamVjdD86IHN0cmluZztcbiAgICBjbHVzdGVyPzogc3RyaW5nO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgYWR2YW5jZWQ/OiBib29sZWFuO1xuICAgIHN1YlJlc291cmNlPzogc3RyaW5nO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNlbGZTdWJqZWN0QWNjZXNzUmV2aWV3PFQ+PihcbiAgICAgIGAke0FQSV9HQVRFV0FZfSR7XG4gICAgICAgIGFkdmFuY2VkXG4gICAgICAgICAgPyAnL2F1dGgnXG4gICAgICAgICAgOiBgJHtpZkV4aXN0KFxuICAgICAgICAgICAgICBjbHVzdGVyLFxuXG4gICAgICAgICAgICAgIGAva3ViZXJuZXRlcy8ke2NsdXN0ZXJ9YCxcbiAgICAgICAgICAgICl9L2FwaXMvYXV0aG9yaXphdGlvbi5rOHMuaW9gXG4gICAgICB9L3YxL3NlbGZzdWJqZWN0YWNjZXNzcmV2aWV3c2AsXG4gICAgICB7XG4gICAgICAgIGFwaVZlcnNpb246ICdhdXRob3JpemF0aW9uLms4cy5pby92MScsXG4gICAgICAgIGtpbmQ6ICdTZWxmU3ViamVjdEFjY2Vzc1JldmlldycsXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICByZXNvdXJjZUF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHZlcmI6XG4gICAgICAgICAgICAgIGFjdGlvbiB8fCAobmFtZSA/IEs4c1Jlc291cmNlQWN0aW9uLkdFVCA6IEs4c1Jlc291cmNlQWN0aW9uLkxJU1QpLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgICByZXNvdXJjZTogdHlwZSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjbHVzdGVyOiBhZHZhbmNlZCA/IGNsdXN0ZXIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9qZWN0OiBhZHZhbmNlZCA/IHByb2plY3QgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi4oc3ViUmVzb3VyY2UgPyB7IHN1YlJlc291cmNlIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuIl19