UNPKG

@versatiledatakit/data-pipelines

Version:

Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')

135 lines 16.8 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ import { Inject, Injectable } from '@angular/core'; import { EMPTY, expand, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { TaurusBaseApiService } from '@versatiledatakit/shared'; import { ErrorUtil } from '../shared/utils'; import { DATA_PIPELINES_CONFIGS } from '../model'; import * as i0 from "@angular/core"; import * as i1 from "./data-jobs-base.api.service"; import * as i2 from "@angular/common/http"; export class DataJobsPublicApiService extends TaurusBaseApiService { /** * ** Constructor. */ constructor(dataPipelinesConfig, dataJobsBaseService, httpClient) { super(DataJobsPublicApiService.CLASS_NAME); this.dataPipelinesConfig = dataPipelinesConfig; this.dataJobsBaseService = dataJobsBaseService; this.httpClient = httpClient; this.registerErrorCodes(DataJobsPublicApiService); } /** * ** Retrieve all DataJobs for Team. */ getAllDataJobs(team) { const pageSize = 1000; let pageNumber = 1; let dataJobs = []; return this._getDataJobsPage(team, pageNumber, pageSize).pipe(expand((dataJobPage) => { if (dataJobPage.totalPages <= pageNumber) { return EMPTY; } else { return this._getDataJobsPage(team, ++pageNumber, pageSize); } }), map((dataJobPage) => { dataJobs = dataJobs.concat(dataJobPage.content); return dataJobs; }), catchError((error) => throwError(() => ErrorUtil.extractError(error)))); } /** * ** Get total number of Data Jobs assets for Team. */ getDataJobsTotal(team) { const filters = [ { property: 'config.team', pattern: team, sort: null } ]; return this.dataJobsBaseService .getJobs(team, `query jobsQuery($filter: [Predicate], $search: String, $pageNumber: Int, $pageSize: Int) { jobs(filter: $filter, search: $search, pageNumber: $pageNumber, pageSize: $pageSize) { content { jobName config { team } } totalPages totalItems } }`, { filter: filters, search: null, pageNumber: 1, pageSize: 1 }) .pipe(map((response) => response?.data?.totalItems ?? 0), catchError((error) => throwError(() => ErrorUtil.extractError(error)))); } /** * ** Returns OAuth app client id for given Team name. */ getTeamOAuthClientId(teamName) { return this.httpClient.get(`${this._resolvePipelinesServiceUrl()}/data-jobs/teams/${teamName}/oauth-credentials/client-id`); } /** * ** Returns inventory of found OAuth apps client ids for given Team names. */ getInventoryOfTeamsOAuthClientIds(clientIds) { return this.httpClient.post(`${this._resolvePipelinesServiceUrl()}/data-jobs/oauth-credentials/client-ids`, clientIds); } /** * ** Retrieve the data-jobs page. */ _getDataJobsPage(team, pageNumber, pageSize, filters = [], searchQueryValue = null) { return this.dataJobsBaseService .getJobs(team, `query jobsQuery($filter: [Predicate], $search: String, $pageNumber: Int, $pageSize: Int) { jobs(filter: $filter, search: $search, pageNumber: $pageNumber, pageSize: $pageSize) { content { jobName config { team description sourceUrl } } totalPages totalItems } }`, { filter: filters, search: searchQueryValue, pageNumber, pageSize }) .pipe(map((response) => response.data)); } _resolvePipelinesServiceUrl() { return this.dataPipelinesConfig?.resourceServer?.getUrl ? this.dataPipelinesConfig.resourceServer.getUrl() : ''; } } /** * @inheritDoc */ DataJobsPublicApiService.CLASS_NAME = 'DataJobsPublicApiService'; /** * @inheritDoc */ DataJobsPublicApiService.PUBLIC_NAME = 'Data-Pipelines-Service'; DataJobsPublicApiService.ɵfac = function DataJobsPublicApiService_Factory(t) { return new (t || DataJobsPublicApiService)(i0.ɵɵinject(DATA_PIPELINES_CONFIGS), i0.ɵɵinject(i1.DataJobsBaseApiService), i0.ɵɵinject(i2.HttpClient)); }; DataJobsPublicApiService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: DataJobsPublicApiService, factory: DataJobsPublicApiService.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataJobsPublicApiService, [{ type: Injectable }], function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DATA_PIPELINES_CONFIGS] }] }, { type: i1.DataJobsBaseApiService }, { type: i2.HttpClient }]; }, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1qb2JzLXB1YmxpYy5hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEtcGlwZWxpbmVzL3NyYy9saWIvc2VydmljZXMvZGF0YS1qb2JzLXB1YmxpYy5hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBMkQsTUFBTSxVQUFVLENBQUM7Ozs7QUFLM0csTUFBTSxPQUFPLHdCQUF5QixTQUFRLG9CQUE4QztJQVd4Rjs7T0FFRztJQUNILFlBQ3FELG1CQUF3QyxFQUN4RSxtQkFBMkMsRUFDM0MsVUFBc0I7UUFFdkMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBSk0sd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4RSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXdCO1FBQzNDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFJdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLElBQVk7UUFVdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLFFBQVEsR0FBYyxF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RSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEgsQ0FBQzs7QUE3SkQ7O0dBRUc7QUFDc0IsbUNBQVUsR0FBVywwQkFBMkIsQ0FBQTtBQUV6RTs7R0FFRztBQUNzQixvQ0FBVyxHQUFXLHdCQUF5QixDQUFBO2dHQVQvRCx3QkFBd0IsY0FlckIsc0JBQXNCOzhFQWZ6Qix3QkFBd0IsV0FBeEIsd0JBQXdCO3VGQUF4Qix3QkFBd0I7Y0FEcEMsVUFBVTs7c0JBZ0JGLE1BQU07dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBFTVBUWSwgZXhwYW5kLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFwaVByZWRpY2F0ZSwgVGF1cnVzQmFzZUFwaVNlcnZpY2UgfSBmcm9tICdAdmVyc2F0aWxlZGF0YWtpdC9zaGFyZWQnO1xuXG5pbXBvcnQgeyBFcnJvclV0aWwgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMnO1xuXG5pbXBvcnQgeyBEQVRBX1BJUEVMSU5FU19DT05GSUdTLCBEYXRhSm9iLCBEYXRhSm9iUGFnZSwgRGF0YVBpcGVsaW5lc0NvbmZpZywgSVBjc09BdXRoRHRvIH0gZnJvbSAnLi4vbW9kZWwnO1xuXG5pbXBvcnQgeyBEYXRhSm9ic0Jhc2VBcGlTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWpvYnMtYmFzZS5hcGkuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhSm9ic1B1YmxpY0FwaVNlcnZpY2UgZXh0ZW5kcyBUYXVydXNCYXNlQXBpU2VydmljZTxEYXRhSm9ic1B1YmxpY0FwaVNlcnZpY2U+IHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBDTEFTU19OQU1FOiBzdHJpbmcgPSAnRGF0YUpvYnNQdWJsaWNBcGlTZXJ2aWNlJztcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IFBVQkxJQ19OQU1FOiBzdHJpbmcgPSAnRGF0YS1QaXBlbGluZXMtU2VydmljZSc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChEQVRBX1BJUEVMSU5FU19DT05GSUdTKSBwcml2YXRlIHJlYWRvbmx5IGRhdGFQaXBlbGluZXNDb25maWc6IERhdGFQaXBlbGluZXNDb25maWcsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YUpvYnNCYXNlU2VydmljZTogRGF0YUpvYnNCYXNlQXBpU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKERhdGFKb2JzUHVibGljQXBpU2VydmljZS5DTEFTU19OQU1FKTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXJyb3JDb2RlcyhEYXRhSm9ic1B1YmxpY0FwaVNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHJpZXZlIGFsbCBEYXRhSm9icyBmb3IgVGVhbS5cbiAgICAgKi9cbiAgICBnZXRBbGxEYXRhSm9icyh0ZWFtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFxuICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICBqb2JOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgY29uZmlnPzoge1xuICAgICAgICAgICAgICAgIHRlYW0/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgc291cmNlVXJsPzogc3RyaW5nO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfT5cbiAgICA+IHtcbiAgICAgICAgY29uc3QgcGFnZVNpemUgPSAxMDAwO1xuICAgICAgICBsZXQgcGFnZU51bWJlciA9IDE7XG4gICAgICAgIGxldCBkYXRhSm9iczogRGF0YUpvYltdID0gW107XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldERhdGFKb2JzUGFnZSh0ZWFtLCBwYWdlTnVtYmVyLCBwYWdlU2l6ZSkucGlwZShcbiAgICAgICAgICAgIGV4cGFuZCgoZGF0YUpvYlBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUpvYlBhZ2UudG90YWxQYWdlcyA8PSBwYWdlTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RGF0YUpvYnNQYWdlKHRlYW0sICsrcGFnZU51bWJlciwgcGFnZVNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKChkYXRhSm9iUGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGFKb2JzID0gZGF0YUpvYnMuY29uY2F0KGRhdGFKb2JQYWdlLmNvbnRlbnQgYXMgdW5rbm93biBhcyBEYXRhSm9iW10pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFKb2JzO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4gdGhyb3dFcnJvcigoKSA9PiBFcnJvclV0aWwuZXh0cmFjdEVycm9yKGVycm9yIGFzIEVycm9yKSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IHRvdGFsIG51bWJlciBvZiBEYXRhIEpvYnMgYXNzZXRzIGZvciBUZWFtLlxuICAgICAqL1xuICAgIGdldERhdGFKb2JzVG90YWwodGVhbTogc3RyaW5nKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyczogQXBpUHJlZGljYXRlW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHk6ICdjb25maWcudGVhbScsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogdGVhbSxcbiAgICAgICAgICAgICAgICBzb3J0OiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUpvYnNCYXNlU2VydmljZVxuICAgICAgICAgICAgLmdldEpvYnMoXG4gICAgICAgICAgICAgICAgdGVhbSxcbiAgICAgICAgICAgICAgICBgcXVlcnkgam9ic1F1ZXJ5KCRmaWx0ZXI6IFtQcmVkaWNhdGVdLCAkc2VhcmNoOiBTdHJpbmcsICRwYWdlTnVtYmVyOiBJbnQsICRwYWdlU2l6ZTogSW50KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ICBqb2JzKGZpbHRlcjogJGZpbHRlciwgc2VhcmNoOiAkc2VhcmNoLCBwYWdlTnVtYmVyOiAkcGFnZU51bWJlciwgcGFnZVNpemU6ICRwYWdlU2l6ZSkge1xuXHRcdFx0XHRcdFx0ICAgIGNvbnRlbnQge1xuXHRcdFx0XHRcdFx0ICAgICAgam9iTmFtZVxuXHRcdFx0XHRcdFx0ICAgICAgY29uZmlnIHtcblx0XHRcdFx0XHRcdCAgICAgICAgdGVhbVxuXHRcdFx0XHRcdFx0ICAgICAgfVxuXHRcdFx0XHRcdFx0ICAgIH1cblx0XHRcdFx0XHRcdCAgICB0b3RhbFBhZ2VzXG5cdFx0XHRcdFx0XHQgICAgdG90YWxJdGVtc1xuXHRcdFx0XHRcdFx0ICB9XG5cdFx0XHRcdFx0XHR9YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiAxLFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlPy5kYXRhPy50b3RhbEl0ZW1zID8/IDApLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB0aHJvd0Vycm9yKCgpID0+IEVycm9yVXRpbC5leHRyYWN0RXJyb3IoZXJyb3IgYXMgRXJyb3IpKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmV0dXJucyBPQXV0aCBhcHAgY2xpZW50IGlkIGZvciBnaXZlbiBUZWFtIG5hbWUuXG4gICAgICovXG4gICAgZ2V0VGVhbU9BdXRoQ2xpZW50SWQodGVhbU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8SVBjc09BdXRoRHRvPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PElQY3NPQXV0aER0bz4oXG4gICAgICAgICAgICBgJHt0aGlzLl9yZXNvbHZlUGlwZWxpbmVzU2VydmljZVVybCgpfS9kYXRhLWpvYnMvdGVhbXMvJHt0ZWFtTmFtZX0vb2F1dGgtY3JlZGVudGlhbHMvY2xpZW50LWlkYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgaW52ZW50b3J5IG9mIGZvdW5kIE9BdXRoIGFwcHMgY2xpZW50IGlkcyBmb3IgZ2l2ZW4gVGVhbSBuYW1lcy5cbiAgICAgKi9cbiAgICBnZXRJbnZlbnRvcnlPZlRlYW1zT0F1dGhDbGllbnRJZHMoY2xpZW50SWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8SVBjc09BdXRoRHRvW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PElQY3NPQXV0aER0b1tdPihcbiAgICAgICAgICAgIGAke3RoaXMuX3Jlc29sdmVQaXBlbGluZXNTZXJ2aWNlVXJsKCl9L2RhdGEtam9icy9vYXV0aC1jcmVkZW50aWFscy9jbGllbnQtaWRzYCxcbiAgICAgICAgICAgIGNsaWVudElkc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHJpZXZlIHRoZSBkYXRhLWpvYnMgcGFnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXREYXRhSm9ic1BhZ2UoXG4gICAgICAgIHRlYW06IHN0cmluZyxcbiAgICAgICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgICAgICBwYWdlU2l6ZTogbnVtYmVyLFxuICAgICAgICBmaWx0ZXJzOiBBcGlQcmVkaWNhdGVbXSA9IFtdLFxuICAgICAgICBzZWFyY2hRdWVyeVZhbHVlOiBzdHJpbmcgPSBudWxsXG4gICAgKTogT2JzZXJ2YWJsZTxEYXRhSm9iUGFnZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhSm9ic0Jhc2VTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Sm9icyhcbiAgICAgICAgICAgICAgICB0ZWFtLFxuICAgICAgICAgICAgICAgIGBxdWVyeSBqb2JzUXVlcnkoJGZpbHRlcjogW1ByZWRpY2F0ZV0sICRzZWFyY2g6IFN0cmluZywgJHBhZ2VOdW1iZXI6IEludCwgJHBhZ2VTaXplOiBJbnQpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQgIGpvYnMoZmlsdGVyOiAkZmlsdGVyLCBzZWFyY2g6ICRzZWFyY2gsIHBhZ2VOdW1iZXI6ICRwYWdlTnVtYmVyLCBwYWdlU2l6ZTogJHBhZ2VTaXplKSB7XG5cdFx0XHRcdFx0XHQgICAgY29udGVudCB7XG5cdFx0XHRcdFx0XHQgICAgICBqb2JOYW1lXG5cdFx0XHRcdFx0XHQgICAgICBjb25maWcge1xuXHRcdFx0XHRcdFx0ICAgICAgICB0ZWFtXG5cdFx0XHRcdFx0XHQgICAgICAgIGRlc2NyaXB0aW9uXG5cdFx0XHRcdFx0XHQgICAgICAgIHNvdXJjZVVybFxuXHRcdFx0XHRcdFx0ICAgICAgfVxuXHRcdFx0XHRcdFx0ICAgIH1cblx0XHRcdFx0XHRcdCAgICB0b3RhbFBhZ2VzXG5cdFx0XHRcdFx0XHQgICAgdG90YWxJdGVtc1xuXHRcdFx0XHRcdFx0ICB9XG5cdFx0XHRcdFx0XHR9YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiBzZWFyY2hRdWVyeVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvbHZlUGlwZWxpbmVzU2VydmljZVVybCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhUGlwZWxpbmVzQ29uZmlnPy5yZXNvdXJjZVNlcnZlcj8uZ2V0VXJsID8gdGhpcy5kYXRhUGlwZWxpbmVzQ29uZmlnLnJlc291cmNlU2VydmVyLmdldFVybCgpIDogJyc7XG4gICAgfVxufVxuIl19