UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

135 lines 18.9 kB
import { HttpClient } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { findKey, memoize, some } from 'lodash-es'; import { BehaviorSubject, switchMap, shareReplay, catchError, of, tap, debounceTime, } from 'rxjs'; import { API_GATEWAY } from '../constants/constants'; import { WorkspaceHelperService } from './workspace-helper.service'; import * as i0 from "@angular/core"; export class KubernetesSchemaService { constructor() { this.http = inject(HttpClient); // 移除可选依赖注入,改为直接注入 this.workspaceHelper = inject(WorkspaceHelperService); this.initialized = false; this.schemaCache = new Map(); this.schemaCache$$ = new BehaviorSubject(new Map()); this.getDefinitionKey = memoize((k8sResourceDefinition, definitions) => { return findKey(definitions, (def) => { return some(def['x-kubernetes-group-version-kind'], ({ group, version, kind }) => { return ((k8sResourceDefinition?.apiGroup ?? '') === (group || '') && k8sResourceDefinition?.apiVersion === version && k8sResourceDefinition?.kind === kind); }); }); }, k8sResourceDefinition => { return [ k8sResourceDefinition.apiGroup || 'core', k8sResourceDefinition.apiVersion, k8sResourceDefinition.kind, ].join('~'); }); } get definitions() { return this.schemaCache?.get(this.workspaceHelper?.baseParamsSnapshot.cluster || 'global')?.definitions; } // 延迟初始化方法 ensureInitialized() { if (!this.initialized && this.workspaceHelper) { this.workspaceHelper.baseParams.subscribe(() => { this.clearCache(); }); this.initialized = true; } } /** * 获取当前集群的 OpenAPI schema */ getOpenAPISchema() { this.ensureInitialized(); // 如果没有 WorkspaceHelperService,返回 null if (!this.workspaceHelper) { console.warn('WorkspaceHelperService not available, cannot fetch OpenAPI schema'); return of(null); } return this.workspaceHelper.baseParams.pipe(switchMap(workspace => { const cluster = workspace.cluster || 'global'; const cached = this.schemaCache.get(cluster); if (cached) { return of(cached); } return this.fetchOpenAPISchema(cluster).pipe(tap(schema => { if (schema) { this.schemaCache.set(cluster, schema); this.schemaCache$$.next(new Map(this.schemaCache)); } }), catchError(error => { console.error(`Failed to fetch OpenAPI schema for cluster ${cluster}:`, error); return of(null); })); }), shareReplay(1)); } /** * 根据 Kubernetes 资源类型获取对应的 schema */ getResourceSchema(apiVersion, kind) { return this.getOpenAPISchema().pipe(switchMap(openApiDoc => { if (!openApiDoc?.definitions) { return of(null); } const parts = apiVersion.split('/'); const group = parts.length === 1 ? '' : parts[0]; const version = parts.length === 1 ? parts[0] : parts[1]; const definitionKey = this.getDefinitionKey({ apiGroup: group, apiVersion: version, kind, }, openApiDoc.definitions); const schema = openApiDoc.definitions[definitionKey]; return of(schema || null); })); } /** * 获取所有可用的资源定义 */ getAllResourceDefinitions() { return this.getOpenAPISchema().pipe(switchMap(openApiDoc => { return of(openApiDoc?.definitions || null); })); } /** * 清理缓存 */ clearCache() { this.schemaCache.clear(); this.schemaCache$$.next(new Map()); } /** * 获取缓存状态 */ getCacheStatus() { return this.schemaCache$$.asObservable(); } /** * 检查 WorkspaceHelperService 是否可用 */ isWorkspaceHelperAvailable() { return !!this.workspaceHelper; } /** * 从 Kubernetes API 获取 OpenAPI schema */ fetchOpenAPISchema(cluster) { const url = `${API_GATEWAY}/kubernetes/${cluster}/openapi/v2`; return this.http.get(url).pipe(debounceTime(500), catchError(error => { console.error(`Failed to fetch OpenAPI schema for cluster ${cluster}:`, error); return of(null); })); } static { this.ɵfac = function KubernetesSchemaService_Factory(t) { return new (t || KubernetesSchemaService)(); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: KubernetesSchemaService, factory: KubernetesSchemaService.ɵfac, providedIn: 'root' }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KubernetesSchemaService, [{ type: Injectable, args: [{ providedIn: 'root' }] }], null, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ViZXJuZXRlcy1zY2hlbWEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jb3JlL3NlcnZpY2VzL2t1YmVybmV0ZXMtc2NoZW1hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBRUwsZUFBZSxFQUNmLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxFQUNWLEVBQUUsRUFDRixHQUFHLEVBQ0gsWUFBWSxHQUNiLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSXJELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUdwRSxNQUFNLE9BQU8sdUJBQXVCO0lBRHBDO1FBRW1CLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0Msa0JBQWtCO1FBQ1Qsb0JBQWUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNYLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFDbkQsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FFbEQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBa0pMLHFCQUFnQixHQUFHLE9BQU8sQ0FDaEMsQ0FDRSxxQkFJQyxFQUNELFdBQW1DLEVBQzNCLEVBQUU7WUFDVixPQUFPLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUEwQixFQUFFLEVBQUU7Z0JBQ3pELE9BQU8sSUFB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VSxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsMEJBQTBCO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsT0FBZTtRQUN4QyxNQUFNLEdBQUcsR0FBRyxHQUFHLFdBQVcsZUFBZSxPQUFPLGFBQWEsQ0FBQztRQUU5RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFvQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQy9DLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQ1gsOENBQThDLE9BQU8sR0FBRyxFQUN4RCxLQUFLLENBQ04sQ0FBQztZQUNGLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO3dGQXpKVSx1QkFBdUI7dUVBQXZCLHVCQUF1QixXQUF2Qix1QkFBdUIsbUJBRFYsTUFBTTs7aUZBQ25CLHVCQUF1QjtjQURuQyxVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmluZEtleSwgbWVtb2l6ZSwgc29tZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBCZWhhdmlvclN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIGNhdGNoRXJyb3IsXG4gIG9mLFxuICB0YXAsXG4gIGRlYm91bmNlVGltZSxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFQSV9HQVRFV0FZIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPcGVuQVBJVjJEb2N1bWVudCB9IGZyb20gJy4uL3R5cGVzL29wZW5hcGknO1xuaW1wb3J0IHsgT3BlbkFQSVYzU2NoZW1hT2JqZWN0LCBPcGVuQVBJVjNTY2hlbWFPYmplY3RzIH0gZnJvbSAnLi4vdHlwZXMvc2NoZW1hJztcblxuaW1wb3J0IHsgV29ya3NwYWNlSGVscGVyU2VydmljZSB9IGZyb20gJy4vd29ya3NwYWNlLWhlbHBlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBLdWJlcm5ldGVzU2NoZW1hU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgLy8g56e76Zmk5Y+v6YCJ5L6d6LWW5rOo5YWl77yM5pS55Li655u05o6l5rOo5YWlXG4gIHJlYWRvbmx5IHdvcmtzcGFjZUhlbHBlciA9IGluamVjdChXb3Jrc3BhY2VIZWxwZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT3BlbkFQSVYyRG9jdW1lbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hQ2FjaGUkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgTWFwPHN0cmluZywgT3BlbkFQSVYyRG9jdW1lbnQ+XG4gID4obmV3IE1hcCgpKTtcblxuICBnZXQgZGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hQ2FjaGU/LmdldChcbiAgICAgIHRoaXMud29ya3NwYWNlSGVscGVyPy5iYXNlUGFyYW1zU25hcHNob3QuY2x1c3RlciB8fCAnZ2xvYmFsJyxcbiAgICApPy5kZWZpbml0aW9ucztcbiAgfVxuXG4gIC8vIOW7tui/n+WIneWni+WMluaWueazlVxuICBwcml2YXRlIGVuc3VyZUluaXRpYWxpemVkKCkge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLndvcmtzcGFjZUhlbHBlcikge1xuICAgICAgdGhpcy53b3Jrc3BhY2VIZWxwZXIuYmFzZVBhcmFtcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjembhue+pOeahCBPcGVuQVBJIHNjaGVtYVxuICAgKi9cbiAgZ2V0T3BlbkFQSVNjaGVtYSgpOiBPYnNlcnZhYmxlPE9wZW5BUElWMkRvY3VtZW50IHwgbnVsbD4ge1xuICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAgIC8vIOWmguaenOayoeaciSBXb3Jrc3BhY2VIZWxwZXJTZXJ2aWNl77yM6L+U5ZueIG51bGxcbiAgICBpZiAoIXRoaXMud29ya3NwYWNlSGVscGVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdXb3Jrc3BhY2VIZWxwZXJTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNhbm5vdCBmZXRjaCBPcGVuQVBJIHNjaGVtYScsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLndvcmtzcGFjZUhlbHBlci5iYXNlUGFyYW1zLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAod29ya3NwYWNlID0+IHtcbiAgICAgICAgY29uc3QgY2x1c3RlciA9IHdvcmtzcGFjZS5jbHVzdGVyIHx8ICdnbG9iYWwnO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNjaGVtYUNhY2hlLmdldChjbHVzdGVyKTtcblxuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaE9wZW5BUElTY2hlbWEoY2x1c3RlcikucGlwZShcbiAgICAgICAgICB0YXAoc2NoZW1hID0+IHtcbiAgICAgICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY2hlbWFDYWNoZS5zZXQoY2x1c3Rlciwgc2NoZW1hKTtcbiAgICAgICAgICAgICAgdGhpcy5zY2hlbWFDYWNoZSQkLm5leHQobmV3IE1hcCh0aGlzLnNjaGVtYUNhY2hlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIE9wZW5BUEkgc2NoZW1hIGZvciBjbHVzdGVyICR7Y2x1c3Rlcn06YCxcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBLdWJlcm5ldGVzIOi1hOa6kOexu+Wei+iOt+WPluWvueW6lOeahCBzY2hlbWFcbiAgICovXG4gIGdldFJlc291cmNlU2NoZW1hKFxuICAgIGFwaVZlcnNpb246IHN0cmluZyxcbiAgICBraW5kOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8T3BlbkFQSVYzU2NoZW1hT2JqZWN0IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmdldE9wZW5BUElTY2hlbWEoKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKG9wZW5BcGlEb2MgPT4ge1xuICAgICAgICBpZiAoIW9wZW5BcGlEb2M/LmRlZmluaXRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSBhcGlWZXJzaW9uLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gcGFydHMubGVuZ3RoID09PSAxID8gJycgOiBwYXJ0c1swXTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogcGFydHNbMV07XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb25LZXkgPSB0aGlzLmdldERlZmluaXRpb25LZXkoXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXBpR3JvdXA6IGdyb3VwLFxuICAgICAgICAgICAgYXBpVmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVuQXBpRG9jLmRlZmluaXRpb25zLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IG9wZW5BcGlEb2MuZGVmaW5pdGlvbnNbZGVmaW5pdGlvbktleV07XG4gICAgICAgIHJldHVybiBvZihzY2hlbWEgfHwgbnVsbCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaJgOacieWPr+eUqOeahOi1hOa6kOWumuS5iVxuICAgKi9cbiAgZ2V0QWxsUmVzb3VyY2VEZWZpbml0aW9ucygpOiBPYnNlcnZhYmxlPFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgT3BlbkFQSVYzU2NoZW1hT2JqZWN0XG4gID4gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3BlbkFQSVNjaGVtYSgpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAob3BlbkFwaURvYyA9PiB7XG4gICAgICAgIHJldHVybiBvZihvcGVuQXBpRG9jPy5kZWZpbml0aW9ucyB8fCBudWxsKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5riF55CG57yT5a2YXG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZW1hQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnNjaGVtYUNhY2hlJCQubmV4dChuZXcgTWFwKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlue8k+WtmOeKtuaAgVxuICAgKi9cbiAgZ2V0Q2FjaGVTdGF0dXMoKTogT2JzZXJ2YWJsZTxNYXA8c3RyaW5nLCBPcGVuQVBJVjJEb2N1bWVudD4+IHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWFDYWNoZSQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOajgOafpSBXb3Jrc3BhY2VIZWxwZXJTZXJ2aWNlIOaYr+WQpuWPr+eUqFxuICAgKi9cbiAgaXNXb3Jrc3BhY2VIZWxwZXJBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy53b3Jrc3BhY2VIZWxwZXI7XG4gIH1cblxuICAvKipcbiAgICog5LuOIEt1YmVybmV0ZXMgQVBJIOiOt+WPliBPcGVuQVBJIHNjaGVtYVxuICAgKi9cbiAgcHJpdmF0ZSBmZXRjaE9wZW5BUElTY2hlbWEoY2x1c3Rlcjogc3RyaW5nKTogT2JzZXJ2YWJsZTxPcGVuQVBJVjJEb2N1bWVudD4ge1xuICAgIGNvbnN0IHVybCA9IGAke0FQSV9HQVRFV0FZfS9rdWJlcm5ldGVzLyR7Y2x1c3Rlcn0vb3BlbmFwaS92MmA7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxPcGVuQVBJVjJEb2N1bWVudD4odXJsKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIE9wZW5BUEkgc2NoZW1hIGZvciBjbHVzdGVyICR7Y2x1c3Rlcn06YCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmaW5pdGlvbktleSA9IG1lbW9pemUoXG4gICAgKFxuICAgICAgazhzUmVzb3VyY2VEZWZpbml0aW9uOiB7XG4gICAgICAgIGFwaUdyb3VwOiBzdHJpbmc7XG4gICAgICAgIGFwaVZlcnNpb246IHN0cmluZztcbiAgICAgICAga2luZDogc3RyaW5nO1xuICAgICAgfSxcbiAgICAgIGRlZmluaXRpb25zOiBPcGVuQVBJVjNTY2hlbWFPYmplY3RzLFxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gZmluZEtleShkZWZpbml0aW9ucywgKGRlZjogT3BlbkFQSVYzU2NoZW1hT2JqZWN0KSA9PiB7XG4gICAgICAgIHJldHVybiBzb21lKFxuICAgICAgICAgIGRlZlsneC1rdWJlcm5ldGVzLWdyb3VwLXZlcnNpb24ta2luZCddIGFzIEFycmF5PHtcbiAgICAgICAgICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgICAgICAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgICAgICAgICBraW5kOiBzdHJpbmc7XG4gICAgICAgICAgfT4sXG4gICAgICAgICAgKHsgZ3JvdXAsIHZlcnNpb24sIGtpbmQgfSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGs4c1Jlc291cmNlRGVmaW5pdGlvbj8uYXBpR3JvdXAgPz8gJycpID09PSAoZ3JvdXAgfHwgJycpICYmXG4gICAgICAgICAgICAgIGs4c1Jlc291cmNlRGVmaW5pdGlvbj8uYXBpVmVyc2lvbiA9PT0gdmVyc2lvbiAmJlxuICAgICAgICAgICAgICBrOHNSZXNvdXJjZURlZmluaXRpb24/LmtpbmQgPT09IGtpbmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgazhzUmVzb3VyY2VEZWZpbml0aW9uID0+IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGs4c1Jlc291cmNlRGVmaW5pdGlvbi5hcGlHcm91cCB8fCAnY29yZScsXG4gICAgICAgIGs4c1Jlc291cmNlRGVmaW5pdGlvbi5hcGlWZXJzaW9uLFxuICAgICAgICBrOHNSZXNvdXJjZURlZmluaXRpb24ua2luZCxcbiAgICAgIF0uam9pbignficpO1xuICAgIH0sXG4gICk7XG59XG4iXX0=