UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

150 lines 20.8 kB
import { Injectable } from '@angular/core'; import { isCodeError } from '@iotize/common/error'; import { PathParameter, TapError, } from '@iotize/tap'; import { TapRequestFrame } from '@iotize/tap/client/api'; import { TapClientError } from '@iotize/tap/client/impl'; import { CurrentDeviceService } from '../current-device.service'; import { debug } from '../logger'; import { TapApiExplorerService } from '../tap-api-explorer.service'; import { TapInfoCacheService } from './tap-info-cache.service'; import { TapInfoConfigService } from './tap-info-config.service'; import { createCacheKey } from './utility'; import * as i0 from "@angular/core"; import * as i1 from "./tap-info-config.service"; import * as i2 from "./tap-info-cache.service"; import * as i3 from "../current-device.service"; import * as i4 from "../tap-api-explorer.service"; const TAG = 'TapInfoDAOService'; /** * Tap info Data Access Object service for real LwM2M resources */ export class TapInfoDAOService { tapInfoConfigService; tapInfoCacheService; tapService; tapApiExplorerService; constructor(tapInfoConfigService, tapInfoCacheService, tapService, tapApiExplorerService) { this.tapInfoConfigService = tapInfoConfigService; this.tapInfoCacheService = tapInfoCacheService; this.tapService = tapService; this.tapApiExplorerService = tapApiExplorerService; } hasPut(result) { return this._getPut(result) !== undefined; } _getPut(key) { const infoConfig = this.tapInfoConfigService.findByKey(key); if (!infoConfig?.putValue) { const nativeLwm2mRequestTemplate = this.tapApiExplorerService.getByUrl(TapRequestFrame.MethodType.PUT, key.key); if (!nativeLwm2mRequestTemplate) { return undefined; } return async (tap, value, ...pathParameters) => { const request = pathParameters.length > 0 ? fillWithPathParameters(nativeLwm2mRequestTemplate, pathParameters) : { ...nativeLwm2mRequestTemplate }; request.body = value; return await tap.lwm2m.execute(request); }; } else { return infoConfig.putValue; } } async put(key, value) { const tap = this.tapService.tapOrUndefined; const put = this._getPut(key); if (!put) { throw new Error(`Tap resource '${key.key}' is not editable`); } if (!tap) { throw new Error(`No tap selected`); } return put(tap, value, ...(key.params || [])).then((result) => { result.successful(); return result; }); } async get(key) { try { const tap = this.tapService.tapOrUndefined; debug(TAG, `refreshKey "${createCacheKey(key)}" start`); if (!tap) { throw TapClientError.notConnectedError(); } this.tapInfoCacheService.clearKey(key); let reader; const infoConfig = this.tapInfoConfigService.findByKey(key); if (!infoConfig?.getValue) { const nativeLwm2mRequestTemplate = this.tapApiExplorerService.getByUrl(TapRequestFrame.MethodType.GET, key.key); if (nativeLwm2mRequestTemplate) { let nativeLwm2mRequest = nativeLwm2mRequestTemplate; if (key.params) { nativeLwm2mRequest = fillWithPathParameters(nativeLwm2mRequestTemplate, key.params); } reader = async (tap) => { return (await tap.lwm2m.execute(nativeLwm2mRequest)).body(); }; } else { throw new Error(`Unknown Tap Resource 'GET ${key.key}'`); } } else { reader = infoConfig.getValue; } if (!reader) { // Check resource info exist return this.tapInfoCacheService.setKeyInfo(key, { loadDate: new Date(), }); } if (!tap.isConnected()) { throw TapClientError.notConnectedError(); } // let cacheKey = this._createCacheKey(key, params); const responseOrBody = await reader(tap, ...(key.params || [])); const body = typeof responseOrBody['body'] === 'function' ? responseOrBody['body']() : responseOrBody; return this.tapInfoCacheService.setKeyValue(key, body); } catch (err) { this.tapInfoCacheService.setKeyError(key, err); if (isCodeError(TapError.Code.ResponseStatusError, err)) { // Do not throw, tap request was successful return; } throw err; } } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoDAOService, deps: [{ token: i1.TapInfoConfigService }, { token: i2.TapInfoCacheService }, { token: i3.CurrentDeviceService }, { token: i4.TapApiExplorerService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoDAOService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoDAOService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: i1.TapInfoConfigService }, { type: i2.TapInfoCacheService }, { type: i3.CurrentDeviceService }, { type: i4.TapApiExplorerService }] }); function fillWithPathParameters(nativeLwm2mRequest, params) { const parameters = PathParameter.extractParams(nativeLwm2mRequest.path); if (parameters.length !== params.length) { throw new Error(`${nativeLwm2mRequest.pathAlias || nativeLwm2mRequest.path} expects ${parameters.length} path parameters but given ${params.length}`); } if (parameters.length > 0) { if (parameters.length === 1) { nativeLwm2mRequest = { ...nativeLwm2mRequest, pathParameters: { [parameters[0]]: params[0], }, }; } else { throw new Error(`${nativeLwm2mRequest.pathAlias || nativeLwm2mRequest.path} more than 1 path parameter is not implemented yet`); } } return nativeLwm2mRequest; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tZGFvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvc3JjL2xpYi90YXAtaW5mby90YXAtaW5mby1kYW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsYUFBYSxFQUViLFFBQVEsR0FFVCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBRTNDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDO0FBRWhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUVsQjtJQUNBO0lBQ0E7SUFDQTtJQUpWLFlBQ1Usb0JBQTBDLEVBQzFDLG1CQUF3QyxFQUN4QyxVQUFnQyxFQUNoQyxxQkFBNEM7UUFINUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGVBQVUsR0FBVixVQUFVLENBQXNC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O0lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixrQkFBa0IsR0FBRztnQkFDbkIsR0FBRyxrQkFBa0I7Z0JBQ3JCLGNBQWMsRUFBRTtvQkFDZCxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQzNCO2FBQ0YsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixHQUNFLGtCQUFrQixDQUFDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxJQUNyRCxvREFBb0QsQ0FDckQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNDb2RlRXJyb3IgfSBmcm9tICdAaW90aXplL2NvbW1vbi9lcnJvcic7XG5pbXBvcnQge1xuICBQYXRoUGFyYW1ldGVyLFxuICBTZXJ2aWNlQ2FsbFR5cGUsXG4gIFRhcEVycm9yLFxuICBUYXBSZXNwb25zZSxcbn0gZnJvbSAnQGlvdGl6ZS90YXAnO1xuaW1wb3J0IHsgVGFwUmVxdWVzdEZyYW1lIH0gZnJvbSAnQGlvdGl6ZS90YXAvY2xpZW50L2FwaSc7XG5pbXBvcnQgeyBUYXBDbGllbnRFcnJvciB9IGZyb20gJ0Bpb3RpemUvdGFwL2NsaWVudC9pbXBsJztcbmltcG9ydCB7IEN1cnJlbnREZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY3VycmVudC1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBUYXBBcGlFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuLi90YXAtYXBpLWV4cGxvcmVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVGFwQ29uZmlnR2V0VmFsdWVUeXBlLFxuICBUYXBDb25maWdQdXRWYWx1ZVR5cGUsXG59IGZyb20gJy4uL3RhcC1jb25maWctaXRlbS90YXAtY29uZmlnLWl0ZW0tYmFzZSc7XG5pbXBvcnQgeyBUYXBJbmZvS2V5IH0gZnJvbSAnLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBUYXBJbmZvQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi90YXAtaW5mby1jYWNoZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRhcEluZm9Db25maWdTZXJ2aWNlIH0gZnJvbSAnLi90YXAtaW5mby1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBjcmVhdGVDYWNoZUtleSB9IGZyb20gJy4vdXRpbGl0eSc7XG5cbmNvbnN0IFRBRyA9ICdUYXBJbmZvREFPU2VydmljZSc7XG5cbi8qKlxuICogVGFwIGluZm8gRGF0YSBBY2Nlc3MgT2JqZWN0IHNlcnZpY2UgZm9yIHJlYWwgTHdNMk0gcmVzb3VyY2VzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBJbmZvREFPU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFwSW5mb0NvbmZpZ1NlcnZpY2U6IFRhcEluZm9Db25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwSW5mb0NhY2hlU2VydmljZTogVGFwSW5mb0NhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIHRhcFNlcnZpY2U6IEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwQXBpRXhwbG9yZXJTZXJ2aWNlOiBUYXBBcGlFeHBsb3JlclNlcnZpY2VcbiAgKSB7fVxuXG4gIGhhc1B1dChyZXN1bHQ6IFRhcEluZm9LZXkpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0UHV0KHJlc3VsdCkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFB1dChrZXk6IFRhcEluZm9LZXkpOiBUYXBDb25maWdQdXRWYWx1ZVR5cGU8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5mb0NvbmZpZyA9IHRoaXMudGFwSW5mb0NvbmZpZ1NlcnZpY2UuZmluZEJ5S2V5KGtleSk7XG4gICAgaWYgKCFpbmZvQ29uZmlnPy5wdXRWYWx1ZSkge1xuICAgICAgY29uc3QgbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUgPSB0aGlzLnRhcEFwaUV4cGxvcmVyU2VydmljZS5nZXRCeVVybChcbiAgICAgICAgVGFwUmVxdWVzdEZyYW1lLk1ldGhvZFR5cGUuUFVULFxuICAgICAgICBrZXkua2V5XG4gICAgICApO1xuICAgICAgaWYgKCFuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFzeW5jICh0YXAsIHZhbHVlLCAuLi5wYXRoUGFyYW1ldGVycykgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID1cbiAgICAgICAgICBwYXRoUGFyYW1ldGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGZpbGxXaXRoUGF0aFBhcmFtZXRlcnMobmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUsIHBhdGhQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgOiB7IC4uLm5hdGl2ZUx3bTJtUmVxdWVzdFRlbXBsYXRlIH07XG4gICAgICAgIHJlcXVlc3QuYm9keSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGFwLmx3bTJtLmV4ZWN1dGUocmVxdWVzdCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5mb0NvbmZpZy5wdXRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwdXQ8VmFsdWVUeXBlPihcbiAgICBrZXk6IFRhcEluZm9LZXksXG4gICAgdmFsdWU6IFZhbHVlVHlwZVxuICApOiBQcm9taXNlPFRhcFJlc3BvbnNlPGFueT4+IHtcbiAgICBjb25zdCB0YXAgPSB0aGlzLnRhcFNlcnZpY2UudGFwT3JVbmRlZmluZWQ7XG4gICAgY29uc3QgcHV0ID0gdGhpcy5fZ2V0UHV0KGtleSk7XG4gICAgaWYgKCFwdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFwIHJlc291cmNlICcke2tleS5rZXl9JyBpcyBub3QgZWRpdGFibGVgKTtcbiAgICB9XG4gICAgaWYgKCF0YXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFwIHNlbGVjdGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBwdXQodGFwLCB2YWx1ZSwgLi4uKGtleS5wYXJhbXMgfHwgW10pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHJlc3VsdC5zdWNjZXNzZnVsKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0KGtleTogVGFwSW5mb0tleSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXAgPSB0aGlzLnRhcFNlcnZpY2UudGFwT3JVbmRlZmluZWQ7XG4gICAgICBkZWJ1ZyhUQUcsIGByZWZyZXNoS2V5IFwiJHtjcmVhdGVDYWNoZUtleShrZXkpfVwiIHN0YXJ0YCk7XG4gICAgICBpZiAoIXRhcCkge1xuICAgICAgICB0aHJvdyBUYXBDbGllbnRFcnJvci5ub3RDb25uZWN0ZWRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLmNsZWFyS2V5KGtleSk7XG5cbiAgICAgIGxldCByZWFkZXI6IFRhcENvbmZpZ0dldFZhbHVlVHlwZTxhbnk+IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvQ29uZmlnID0gdGhpcy50YXBJbmZvQ29uZmlnU2VydmljZS5maW5kQnlLZXkoa2V5KTtcbiAgICAgIGlmICghaW5mb0NvbmZpZz8uZ2V0VmFsdWUpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUgPSB0aGlzLnRhcEFwaUV4cGxvcmVyU2VydmljZS5nZXRCeVVybChcbiAgICAgICAgICBUYXBSZXF1ZXN0RnJhbWUuTWV0aG9kVHlwZS5HRVQsXG4gICAgICAgICAga2V5LmtleVxuICAgICAgICApO1xuICAgICAgICBpZiAobmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUpIHtcbiAgICAgICAgICBsZXQgbmF0aXZlTHdtMm1SZXF1ZXN0ID0gbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGU7XG4gICAgICAgICAgaWYgKGtleS5wYXJhbXMpIHtcbiAgICAgICAgICAgIG5hdGl2ZUx3bTJtUmVxdWVzdCA9IGZpbGxXaXRoUGF0aFBhcmFtZXRlcnMoXG4gICAgICAgICAgICAgIG5hdGl2ZUx3bTJtUmVxdWVzdFRlbXBsYXRlLFxuICAgICAgICAgICAgICBrZXkucGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWFkZXIgPSBhc3luYyAodGFwKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IHRhcC5sd20ybS5leGVjdXRlKG5hdGl2ZUx3bTJtUmVxdWVzdCkpLmJvZHkoKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBUYXAgUmVzb3VyY2UgJ0dFVCAke2tleS5rZXl9J2ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWFkZXIgPSBpbmZvQ29uZmlnLmdldFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgLy8gQ2hlY2sgcmVzb3VyY2UgaW5mbyBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLnNldEtleUluZm8oa2V5LCB7XG4gICAgICAgICAgbG9hZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF0YXAuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICB0aHJvdyBUYXBDbGllbnRFcnJvci5ub3RDb25uZWN0ZWRFcnJvcigpO1xuICAgICAgfVxuICAgICAgLy8gbGV0IGNhY2hlS2V5ID0gdGhpcy5fY3JlYXRlQ2FjaGVLZXkoa2V5LCBwYXJhbXMpO1xuICAgICAgY29uc3QgcmVzcG9uc2VPckJvZHkgPSBhd2FpdCByZWFkZXIodGFwLCAuLi4oa2V5LnBhcmFtcyB8fCBbXSkpO1xuICAgICAgY29uc3QgYm9keSA9XG4gICAgICAgIHR5cGVvZiByZXNwb25zZU9yQm9keVsnYm9keSddID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyByZXNwb25zZU9yQm9keVsnYm9keSddKClcbiAgICAgICAgICA6IHJlc3BvbnNlT3JCb2R5O1xuICAgICAgcmV0dXJuIHRoaXMudGFwSW5mb0NhY2hlU2VydmljZS5zZXRLZXlWYWx1ZShrZXksIGJvZHkpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2Uuc2V0S2V5RXJyb3Ioa2V5LCBlcnIpO1xuICAgICAgaWYgKGlzQ29kZUVycm9yKFRhcEVycm9yLkNvZGUuUmVzcG9uc2VTdGF0dXNFcnJvciwgZXJyKSkge1xuICAgICAgICAvLyBEbyBub3QgdGhyb3csIHRhcCByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsbFdpdGhQYXRoUGFyYW1ldGVycyhcbiAgbmF0aXZlTHdtMm1SZXF1ZXN0OiBTZXJ2aWNlQ2FsbFR5cGU8YW55LCBhbnk+LFxuICBwYXJhbXM6IGFueVtdXG4pOiBTZXJ2aWNlQ2FsbFR5cGU8YW55LCBhbnk+IHtcbiAgY29uc3QgcGFyYW1ldGVycyA9IFBhdGhQYXJhbWV0ZXIuZXh0cmFjdFBhcmFtcyhuYXRpdmVMd20ybVJlcXVlc3QucGF0aCk7XG4gIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAhPT0gcGFyYW1zLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke25hdGl2ZUx3bTJtUmVxdWVzdC5wYXRoQWxpYXMgfHwgbmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGh9IGV4cGVjdHMgJHtcbiAgICAgICAgcGFyYW1ldGVycy5sZW5ndGhcbiAgICAgIH0gcGF0aCBwYXJhbWV0ZXJzIGJ1dCBnaXZlbiAke3BhcmFtcy5sZW5ndGh9YFxuICAgICk7XG4gIH1cbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0ID0ge1xuICAgICAgICAuLi5uYXRpdmVMd20ybVJlcXVlc3QsXG4gICAgICAgIHBhdGhQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgW3BhcmFtZXRlcnNbMF1dOiBwYXJhbXNbMF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgIG5hdGl2ZUx3bTJtUmVxdWVzdC5wYXRoQWxpYXMgfHwgbmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGhcbiAgICAgICAgfSBtb3JlIHRoYW4gMSBwYXRoIHBhcmFtZXRlciBpcyBub3QgaW1wbGVtZW50ZWQgeWV0YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hdGl2ZUx3bTJtUmVxdWVzdDtcbn1cbiJdfQ==