UNPKG

@iotize/ionic

Version:

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

146 lines 20.6 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 { 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 */ TapInfoDAOService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoDAOService, deps: [{ token: i1.TapInfoConfigService }, { token: i2.TapInfoCacheService }, { token: i3.CurrentDeviceService }, { token: i4.TapApiExplorerService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ TapInfoDAOService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoDAOService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoDAOService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tZGFvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvc3JjL2xpYi90YXAtaW5mby90YXAtaW5mby1kYW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsYUFBYSxFQUViLFFBQVEsR0FFVCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBRTNDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDO0FBRWhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNVLG9CQUEwQyxFQUMxQyxtQkFBd0MsRUFDeEMsVUFBZ0MsRUFDaEMscUJBQTRDO1FBSDVDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxlQUFVLEdBQVYsVUFBVSxDQUFzQjtRQUNoQywwQkFBcUIsR0FBckIs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QyxDQUFDO2lCQUMzQjthQUNGLENBQUM7U0FDSDthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUNFLGtCQUFrQixDQUFDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxJQUNyRCxvREFBb0QsQ0FDckQsQ0FBQztTQUNIO0tBQ0Y7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0NvZGVFcnJvciB9IGZyb20gJ0Bpb3RpemUvY29tbW9uL2Vycm9yJztcbmltcG9ydCB7XG4gIFBhdGhQYXJhbWV0ZXIsXG4gIFNlcnZpY2VDYWxsVHlwZSxcbiAgVGFwRXJyb3IsXG4gIFRhcFJlc3BvbnNlLFxufSBmcm9tICdAaW90aXplL3RhcCc7XG5pbXBvcnQgeyBUYXBSZXF1ZXN0RnJhbWUgfSBmcm9tICdAaW90aXplL3RhcC9jbGllbnQvYXBpJztcbmltcG9ydCB7IFRhcENsaWVudEVycm9yIH0gZnJvbSAnQGlvdGl6ZS90YXAvY2xpZW50L2ltcGwnO1xuaW1wb3J0IHsgQ3VycmVudERldmljZVNlcnZpY2UgfSBmcm9tICcuLi9jdXJyZW50LWRldmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFRhcEFwaUV4cGxvcmVyU2VydmljZSB9IGZyb20gJy4uL3RhcC1hcGktZXhwbG9yZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXBDb25maWdHZXRWYWx1ZVR5cGUsXG4gIFRhcENvbmZpZ1B1dFZhbHVlVHlwZSxcbn0gZnJvbSAnLi4vdGFwLWNvbmZpZy1pdGVtL3RhcC1jb25maWctaXRlbS1iYXNlJztcbmltcG9ydCB7IFRhcEluZm9LZXkgfSBmcm9tICcuL2RlZmluaXRpb25zJztcbmltcG9ydCB7IFRhcEluZm9DYWNoZVNlcnZpY2UgfSBmcm9tICcuL3RhcC1pbmZvLWNhY2hlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFwSW5mb0NvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3RhcC1pbmZvLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZUNhY2hlS2V5IH0gZnJvbSAnLi91dGlsaXR5JztcblxuY29uc3QgVEFHID0gJ1RhcEluZm9EQU9TZXJ2aWNlJztcblxuLyoqXG4gKiBUYXAgaW5mbyBEYXRhIEFjY2VzcyBPYmplY3Qgc2VydmljZSBmb3IgcmVhbCBMd00yTSByZXNvdXJjZXNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRhcEluZm9EQU9TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0YXBJbmZvQ29uZmlnU2VydmljZTogVGFwSW5mb0NvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YXBJbmZvQ2FjaGVTZXJ2aWNlOiBUYXBJbmZvQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwU2VydmljZTogQ3VycmVudERldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YXBBcGlFeHBsb3JlclNlcnZpY2U6IFRhcEFwaUV4cGxvcmVyU2VydmljZVxuICApIHt9XG5cbiAgaGFzUHV0KHJlc3VsdDogVGFwSW5mb0tleSk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9nZXRQdXQocmVzdWx0KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UHV0KGtleTogVGFwSW5mb0tleSk6IFRhcENvbmZpZ1B1dFZhbHVlVHlwZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmZvQ29uZmlnID0gdGhpcy50YXBJbmZvQ29uZmlnU2VydmljZS5maW5kQnlLZXkoa2V5KTtcbiAgICBpZiAoIWluZm9Db25maWc/LnB1dFZhbHVlKSB7XG4gICAgICBjb25zdCBuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSA9IHRoaXMudGFwQXBpRXhwbG9yZXJTZXJ2aWNlLmdldEJ5VXJsKFxuICAgICAgICBUYXBSZXF1ZXN0RnJhbWUuTWV0aG9kVHlwZS5QVVQsXG4gICAgICAgIGtleS5rZXlcbiAgICAgICk7XG4gICAgICBpZiAoIW5hdGl2ZUx3bTJtUmVxdWVzdFRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXN5bmMgKHRhcCwgdmFsdWUsIC4uLnBhdGhQYXJhbWV0ZXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPVxuICAgICAgICAgIHBhdGhQYXJhbWV0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gZmlsbFdpdGhQYXRoUGFyYW1ldGVycyhuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSwgcGF0aFBhcmFtZXRlcnMpXG4gICAgICAgICAgICA6IHsgLi4ubmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUgfTtcbiAgICAgICAgcmVxdWVzdC5ib2R5ID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0YXAubHdtMm0uZXhlY3V0ZShyZXF1ZXN0KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbmZvQ29uZmlnLnB1dFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHB1dDxWYWx1ZVR5cGU+KFxuICAgIGtleTogVGFwSW5mb0tleSxcbiAgICB2YWx1ZTogVmFsdWVUeXBlXG4gICk6IFByb21pc2U8VGFwUmVzcG9uc2U8YW55Pj4ge1xuICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXBPclVuZGVmaW5lZDtcbiAgICBjb25zdCBwdXQgPSB0aGlzLl9nZXRQdXQoa2V5KTtcbiAgICBpZiAoIXB1dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXAgcmVzb3VyY2UgJyR7a2V5LmtleX0nIGlzIG5vdCBlZGl0YWJsZWApO1xuICAgIH1cbiAgICBpZiAoIXRhcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXAgc2VsZWN0ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHB1dCh0YXAsIHZhbHVlLCAuLi4oa2V5LnBhcmFtcyB8fCBbXSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgcmVzdWx0LnN1Y2Nlc3NmdWwoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXQoa2V5OiBUYXBJbmZvS2V5KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcCA9IHRoaXMudGFwU2VydmljZS50YXBPclVuZGVmaW5lZDtcbiAgICAgIGRlYnVnKFRBRywgYHJlZnJlc2hLZXkgXCIke2NyZWF0ZUNhY2hlS2V5KGtleSl9XCIgc3RhcnRgKTtcbiAgICAgIGlmICghdGFwKSB7XG4gICAgICAgIHRocm93IFRhcENsaWVudEVycm9yLm5vdENvbm5lY3RlZEVycm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2UuY2xlYXJLZXkoa2V5KTtcblxuICAgICAgbGV0IHJlYWRlcjogVGFwQ29uZmlnR2V0VmFsdWVUeXBlPGFueT4gfCBmYWxzZSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGluZm9Db25maWcgPSB0aGlzLnRhcEluZm9Db25maWdTZXJ2aWNlLmZpbmRCeUtleShrZXkpO1xuICAgICAgaWYgKCFpbmZvQ29uZmlnPy5nZXRWYWx1ZSkge1xuICAgICAgICBjb25zdCBuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSA9IHRoaXMudGFwQXBpRXhwbG9yZXJTZXJ2aWNlLmdldEJ5VXJsKFxuICAgICAgICAgIFRhcFJlcXVlc3RGcmFtZS5NZXRob2RUeXBlLkdFVCxcbiAgICAgICAgICBrZXkua2V5XG4gICAgICAgICk7XG4gICAgICAgIGlmIChuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSkge1xuICAgICAgICAgIGxldCBuYXRpdmVMd20ybVJlcXVlc3QgPSBuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZTtcbiAgICAgICAgICBpZiAoa2V5LnBhcmFtcykge1xuICAgICAgICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0ID0gZmlsbFdpdGhQYXRoUGFyYW1ldGVycyhcbiAgICAgICAgICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUsXG4gICAgICAgICAgICAgIGtleS5wYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlYWRlciA9IGFzeW5jICh0YXApID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGFwLmx3bTJtLmV4ZWN1dGUobmF0aXZlTHdtMm1SZXF1ZXN0KSkuYm9keSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFRhcCBSZXNvdXJjZSAnR0VUICR7a2V5LmtleX0nYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlYWRlciA9IGluZm9Db25maWcuZ2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAvLyBDaGVjayByZXNvdXJjZSBpbmZvIGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2Uuc2V0S2V5SW5mbyhrZXksIHtcbiAgICAgICAgICBsb2FkRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRhcC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRocm93IFRhcENsaWVudEVycm9yLm5vdENvbm5lY3RlZEVycm9yKCk7XG4gICAgICB9XG4gICAgICAvLyBsZXQgY2FjaGVLZXkgPSB0aGlzLl9jcmVhdGVDYWNoZUtleShrZXksIHBhcmFtcyk7XG4gICAgICBjb25zdCByZXNwb25zZU9yQm9keSA9IGF3YWl0IHJlYWRlcih0YXAsIC4uLihrZXkucGFyYW1zIHx8IFtdKSk7XG4gICAgICBjb25zdCBib2R5ID1cbiAgICAgICAgdHlwZW9mIHJlc3BvbnNlT3JCb2R5Wydib2R5J10gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHJlc3BvbnNlT3JCb2R5Wydib2R5J10oKVxuICAgICAgICAgIDogcmVzcG9uc2VPckJvZHk7XG4gICAgICByZXR1cm4gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLnNldEtleVZhbHVlKGtleSwgYm9keSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMudGFwSW5mb0NhY2hlU2VydmljZS5zZXRLZXlFcnJvcihrZXksIGVycik7XG4gICAgICBpZiAoaXNDb2RlRXJyb3IoVGFwRXJyb3IuQ29kZS5SZXNwb25zZVN0YXR1c0Vycm9yLCBlcnIpKSB7XG4gICAgICAgIC8vIERvIG5vdCB0aHJvdywgdGFwIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaWxsV2l0aFBhdGhQYXJhbWV0ZXJzKFxuICBuYXRpdmVMd20ybVJlcXVlc3Q6IFNlcnZpY2VDYWxsVHlwZTxhbnksIGFueT4sXG4gIHBhcmFtczogYW55W11cbik6IFNlcnZpY2VDYWxsVHlwZTxhbnksIGFueT4ge1xuICBjb25zdCBwYXJhbWV0ZXJzID0gUGF0aFBhcmFtZXRlci5leHRyYWN0UGFyYW1zKG5hdGl2ZUx3bTJtUmVxdWVzdC5wYXRoKTtcbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9PSBwYXJhbXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7bmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGhBbGlhcyB8fCBuYXRpdmVMd20ybVJlcXVlc3QucGF0aH0gZXhwZWN0cyAke1xuICAgICAgICBwYXJhbWV0ZXJzLmxlbmd0aFxuICAgICAgfSBwYXRoIHBhcmFtZXRlcnMgYnV0IGdpdmVuICR7cGFyYW1zLmxlbmd0aH1gXG4gICAgKTtcbiAgfVxuICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBuYXRpdmVMd20ybVJlcXVlc3QgPSB7XG4gICAgICAgIC4uLm5hdGl2ZUx3bTJtUmVxdWVzdCxcbiAgICAgICAgcGF0aFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBbcGFyYW1ldGVyc1swXV06IHBhcmFtc1swXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7XG4gICAgICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGhBbGlhcyB8fCBuYXRpdmVMd20ybVJlcXVlc3QucGF0aFxuICAgICAgICB9IG1vcmUgdGhhbiAxIHBhdGggcGFyYW1ldGVyIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRgXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmF0aXZlTHdtMm1SZXF1ZXN0O1xufVxuIl19