UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

74 lines 18 kB
import { cloneDeep, get, uniq } from 'lodash-es'; import { filter, map, mergeMap, share, take, tap } from 'rxjs/operators'; /** * An abstract class to simplify implementing the DynamicDetailsResolver interface for performing bulk resolving. */ export class DynamicBulkDetailsResolver { constructor(dynamicResolver) { this.dynamicResolver = dynamicResolver; /** * Map containing the ids to be retrieved per bulk request. */ this.idsGroupedByBulkId = new Map(); this.resultsOfBulkLoad = this.dynamicResolver.bulkResolvingTrigger$.pipe(map(bulkRequestId => ({ uniqIds: uniq(this.idsGroupedByBulkId.get(bulkRequestId) || []), bulkRequestId })), tap(({ bulkRequestId }) => this.idsGroupedByBulkId.delete(bulkRequestId)), mergeMap(({ uniqIds, bulkRequestId }) => this.performBulkRequest(uniqIds, bulkRequestId)), share()); } resolve(config, attribute, bulkRequestId) { const valueBehindAttribute = get(config, attribute); const idOrIds = this.extractIdsToBeRetrieved(valueBehindAttribute); if (!idOrIds) { return; } if (Array.isArray(idOrIds) && !idOrIds.length) { return []; } const idsArray = Array.isArray(idOrIds) ? idOrIds : [idOrIds]; this.addIdsToBeLoaded(bulkRequestId, ...idsArray); return this.getResult$(bulkRequestId).pipe(map(({ result: retrievedEntities, errors }) => { if (Array.isArray(idOrIds)) { return idOrIds.map((id, index) => retrievedEntities.find(tmp => this.isEntityOfId(tmp, id)) || this.buildRetrievalAlert(valueBehindAttribute[index], errors)); } return (retrievedEntities.find(tmp => this.isEntityOfId(tmp, idOrIds)) || this.buildRetrievalAlert(valueBehindAttribute, errors)); })); } /** * Provides an Observable of the results of the given bulkRequestId. */ getResult$(bulkRequestId) { return this.resultsOfBulkLoad.pipe(filter(({ bulkRequestId: bId }) => bulkRequestId === bId), map(({ result, errors }) => ({ result, errors })), take(1), map(result => cloneDeep(result))); } /** * Adds a single id or an array of ids to the idsGroupedByBulkId Map for the provided bulkRequestId. */ addIdsToBeLoaded(bulkRequestId, ...ids) { let groupedIds = this.idsGroupedByBulkId.get(bulkRequestId); if (!groupedIds) { groupedIds = []; this.idsGroupedByBulkId.set(bulkRequestId, groupedIds); } groupedIds.push(...ids); } /** * Default implementation compatible with serializing an object or an Array of objects. * Calls serializeSingleObject for an object and for every entry within the array. */ serialize(config, attribute) { const valueBehindAttribute = get(config, attribute); if (Array.isArray(valueBehindAttribute)) { return valueBehindAttribute.map(entry => this.serializeSingleObject(entry)); } return this.serializeSingleObject(valueBehindAttribute); } /** * Checks wether an object is of given id. * Will by default compare the id attribute with the given id. */ isEntityOfId(obj, id) { return obj?.id === id; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1kZXRhaWxzLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLWRldGFpbHMtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBNkN6RTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsMEJBQTBCO0lBZ0I5QyxZQUFzQixlQUF1QztRQUF2QyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFMN0Q7O1dBRUc7UUFDTyx1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUd6RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQ3RFLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvRCxhQUFhO1NBQ2QsQ0FBQyxDQUFDLEVBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUN6RSxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUN6RixLQUFLLEVBQUUsQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUFXLEVBQ1gsU0FBaUIsRUFDakIsYUFBcUI7UUFPckIsTUFBTSxvQkFBb0IsR0FBbUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBRWxELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQ3hDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FDaEIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDWixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUNoRSxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sQ0FDTCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFrQyxFQUFFLE1BQU0sQ0FBQyxDQUNyRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FDUixhQUFxQjtRQUVyQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQ2hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEtBQUssR0FBRyxDQUFDLEVBQ3pELEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDakQsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsYUFBcUIsRUFBRSxHQUFHLEdBQWE7UUFDdEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsTUFBVyxFQUFFLFNBQWlCO1FBQ3RDLE1BQU0sb0JBQW9CLEdBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQWtDRDs7O09BR0c7SUFDTyxZQUFZLENBQUMsR0FBTSxFQUFFLEVBQVU7UUFDdkMsT0FBTyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbG9uZURlZXAsIGdldCwgdW5pcSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHNoYXJlLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEeW5hbWljQnVsa1JldHJpZXZhbEVycm9yIH0gZnJvbSAnLi9keW5hbWljLWJ1bGstcmV0cmlldmFsLWVycm9yLm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnRBbGVydCB9IGZyb20gJy4vZHluYW1pYy1jb21wb25lbnQtYWxlcnQubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY1Jlc29sdmVyU2VydmljZSB9IGZyb20gJy4vZHluYW1pYy1yZXNvbHZlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBBIER5bmFtaWNEZXRhaWxzUmVzb2x2ZXIgaXMgcmVzcG9uc2libGUgdG8gcmVzb2x2ZSBpdGVtcyBvZiBhIGR5bmFtaWMgY29tcG9uZW50cyBjb25maWd1cmF0aW9uLlxuICogSWRlYWxseSB0aGUgcmVzb2x2ZSBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gYSB3YXkgdGhhdCBjYXVzZXMgbm90IGEgcmVxdWVzdCBwZXIgY29tcG9uZW50IGluc3RhbmNlLlxuICogSW5zdGVhZCBpdCBzaG91bGQgY29sbGVjdCB0aGUgcmVxdWVzdHMgaXQgd291bGQgbGlrZSB0byBwZXJmb3JtIHdpdGhpbiB0aGUgcmVzb2x2ZSBtZXRob2QsXG4gKiBhbmQgcmV0dXJucyBhIFByb21pc2UvT2JzZXJ2YWJsZSB0aGF0IHRha2VzIGNhcmUgdGhhdCBkdXBsaWNhdGUgb2JqZWN0cyBhcmUganVzdCByZXRyaWV2ZWQgYSBzaW5nbGUgdGltZS5cbiAqIFRoZSBidWxrUmVzb2x2aW5nVHJpZ2dlciQgb2YgdGhlIER5bmFtaWNSZXNvbHZlclNlcnZpY2UgY2FuIGJlIHV0aWxpemVkIHRvIGtub3cgd2hlbiBidWxrIHJlc29sdmluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICpcbiAqIFRoZSBzZXJpYWxpemUgbWV0aG9kIGlzIHVzZWQgZm9yIHN0b3JpbmcgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBiYWNrZW5kLlxuICogSXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIGEgd2F5LCB0aGF0IHdpbGwgcmVkdWNlIGl0J3Mgb3V0cHV0IHRvIG9ubHkgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXNcbiAqIG9mIHRoZSBlbnRpdHkgdGhhdCBhcmUgbmVlZGVkIGZvciByZXRyaWV2aW5nIGl0IGFmdGVyd2FyZHMgYWdhaW4gdmlhIHRoZSByZXNvbHZlIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljRGV0YWlsc1Jlc29sdmVyPFQgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVzb2x2ZS9yZWZyZXNoIGEgY2VydGFpbiBhdHRyaWJ1dGUgb2YgYSB3aWRnZXRzIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSAge2FueX0gY29uZmlnIFRoZSBkeW5hbWljIGNvbXBvbmVudHMgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBhdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvZiB0aGUgZHluYW1pYyBjb21wb25lbnRzIGNvbmZpZ3VyYXRpb24gdG8gYmUgcmVzb2x2ZWQuXG4gICAqIEByZXR1cm5zIFRcbiAgICovXG4gIHJlc29sdmUoXG4gICAgY29uZmlnOiBhbnksXG4gICAgYXR0cmlidXRlOiBzdHJpbmcsXG4gICAgYnVsa1JlcXVlc3RJZDogbnVtYmVyXG4gICk6XG4gICAgfCBUXG4gICAgfCBBcnJheTxEeW5hbWljQ29tcG9uZW50QWxlcnQ8VD4gfCBUPlxuICAgIHwgRHluYW1pY0NvbXBvbmVudEFsZXJ0PFQ+XG4gICAgfCBQcm9taXNlPFQgfCBBcnJheTxEeW5hbWljQ29tcG9uZW50QWxlcnQ8VD4gfCBUPiB8IER5bmFtaWNDb21wb25lbnRBbGVydDxUPj5cbiAgICB8IE9ic2VydmFibGU8VCB8IEFycmF5PER5bmFtaWNDb21wb25lbnRBbGVydDxUPiB8IFQ+IHwgRHluYW1pY0NvbXBvbmVudEFsZXJ0PFQ+PjtcblxuICAvKipcbiAgICogVXNlZCB0byBzZXJpYWxpemUgYSBjZXJ0YWluIGF0dHJpYnV0ZSBvZiBhIGR5bmFtaWMgY29tcG9uZW50cyBjb25maWd1cmF0aW9uLlxuICAgKiBUaGlzIGlzIGUuZy4gdXNlZCB3aGVuIHN0b3JpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSB3aWRnZXQgb24gYSBkYXNoYm9hcmQgdG8gdGhlIGJhY2tlbmQuXG4gICAqIFVzdWFsbHkgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJlZHVjZSB0aGUgc3RvcmVkIGNvbmZpZ3VyYXRpb24gdG8gb25seSBlLmcuIHRoZSBpZCBvZiB0aGUgZW50aXR5IGluc3RlYWQgb2Ygc3RvcmluZyB0aGUgY29tcGxldGUgZW50aXR5LlxuICAgKiBAcGFyYW0gIHthbnl9IGNvbmZpZyBUaGUgZHluYW1pYyBjb21wb25lbnRzIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gYXR0cmlidXRlICBUaGUgYXR0cmlidXRlIG9mIHRoZSBkeW5hbWljIGNvbXBvbmVudHMgY29uZmlndXJhdGlvbiB0byBiZSBzZXJpYWxpemVkLlxuICAgKiBAcmV0dXJucyBhbnkgVGhlIHNlcmlhbGl6ZWQgdmFsdWUgYmVoaW5kIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzZXJpYWxpemUoY29uZmlnOiBhbnksIGF0dHJpYnV0ZTogc3RyaW5nKTogUGFydGlhbDxUPiB8IEFycmF5PFBhcnRpYWw8VD4+O1xufVxuXG4vKipcbiAqIEFuIGFic3RyYWN0IGNsYXNzIHRvIHNpbXBsaWZ5IGltcGxlbWVudGluZyB0aGUgRHluYW1pY0RldGFpbHNSZXNvbHZlciBpbnRlcmZhY2UgZm9yIHBlcmZvcm1pbmcgYnVsayByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeW5hbWljQnVsa0RldGFpbHNSZXNvbHZlcjxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT5cbiAgaW1wbGVtZW50cyBEeW5hbWljRGV0YWlsc1Jlc29sdmVyPFQ+XG57XG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHRzIG9mIGFsbCBidWxrIHJlcXVlc3RzLlxuICAgKi9cbiAgcmVzdWx0c09mQnVsa0xvYWQ6IE9ic2VydmFibGU8e1xuICAgIHJlc3VsdDogVFtdO1xuICAgIGJ1bGtSZXF1ZXN0SWQ6IG51bWJlcjtcbiAgICBlcnJvcnM6IER5bmFtaWNCdWxrUmV0cmlldmFsRXJyb3JbXTtcbiAgfT47XG4gIC8qKlxuICAgKiBNYXAgY29udGFpbmluZyB0aGUgaWRzIHRvIGJlIHJldHJpZXZlZCBwZXIgYnVsayByZXF1ZXN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGlkc0dyb3VwZWRCeUJ1bGtJZCA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmdbXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZHluYW1pY1Jlc29sdmVyOiBEeW5hbWljUmVzb2x2ZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy5yZXN1bHRzT2ZCdWxrTG9hZCA9IHRoaXMuZHluYW1pY1Jlc29sdmVyLmJ1bGtSZXNvbHZpbmdUcmlnZ2VyJC5waXBlKFxuICAgICAgbWFwKGJ1bGtSZXF1ZXN0SWQgPT4gKHtcbiAgICAgICAgdW5pcUlkczogdW5pcSh0aGlzLmlkc0dyb3VwZWRCeUJ1bGtJZC5nZXQoYnVsa1JlcXVlc3RJZCkgfHwgW10pLFxuICAgICAgICBidWxrUmVxdWVzdElkXG4gICAgICB9KSksXG4gICAgICB0YXAoKHsgYnVsa1JlcXVlc3RJZCB9KSA9PiB0aGlzLmlkc0dyb3VwZWRCeUJ1bGtJZC5kZWxldGUoYnVsa1JlcXVlc3RJZCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgdW5pcUlkcywgYnVsa1JlcXVlc3RJZCB9KSA9PiB0aGlzLnBlcmZvcm1CdWxrUmVxdWVzdCh1bmlxSWRzLCBidWxrUmVxdWVzdElkKSksXG4gICAgICBzaGFyZSgpXG4gICAgKTtcbiAgfVxuXG4gIHJlc29sdmUoXG4gICAgY29uZmlnOiBhbnksXG4gICAgYXR0cmlidXRlOiBzdHJpbmcsXG4gICAgYnVsa1JlcXVlc3RJZDogbnVtYmVyXG4gICk6XG4gICAgfCBUXG4gICAgfCBBcnJheTxEeW5hbWljQ29tcG9uZW50QWxlcnQ8VD4gfCBUPlxuICAgIHwgRHluYW1pY0NvbXBvbmVudEFsZXJ0PFQ+XG4gICAgfCBQcm9taXNlPFQgfCBBcnJheTxEeW5hbWljQ29tcG9uZW50QWxlcnQ8VD4gfCBUPiB8IER5bmFtaWNDb21wb25lbnRBbGVydDxUPj5cbiAgICB8IE9ic2VydmFibGU8VCB8IEFycmF5PER5bmFtaWNDb21wb25lbnRBbGVydDxUPiB8IFQ+IHwgRHluYW1pY0NvbXBvbmVudEFsZXJ0PFQ+PiB7XG4gICAgY29uc3QgdmFsdWVCZWhpbmRBdHRyaWJ1dGU6IFBhcnRpYWw8VD4gfCBBcnJheTxQYXJ0aWFsPFQ+PiA9IGdldChjb25maWcsIGF0dHJpYnV0ZSk7XG4gICAgY29uc3QgaWRPcklkcyA9IHRoaXMuZXh0cmFjdElkc1RvQmVSZXRyaWV2ZWQodmFsdWVCZWhpbmRBdHRyaWJ1dGUpO1xuICAgIGlmICghaWRPcklkcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpZE9ySWRzKSAmJiAhaWRPcklkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaWRzQXJyYXkgPSBBcnJheS5pc0FycmF5KGlkT3JJZHMpID8gaWRPcklkcyA6IFtpZE9ySWRzXTtcbiAgICB0aGlzLmFkZElkc1RvQmVMb2FkZWQoYnVsa1JlcXVlc3RJZCwgLi4uaWRzQXJyYXkpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzdWx0JChidWxrUmVxdWVzdElkKS5waXBlKFxuICAgICAgbWFwKCh7IHJlc3VsdDogcmV0cmlldmVkRW50aXRpZXMsIGVycm9ycyB9KSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkT3JJZHMpKSB7XG4gICAgICAgICAgcmV0dXJuIGlkT3JJZHMubWFwKFxuICAgICAgICAgICAgKGlkLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgcmV0cmlldmVkRW50aXRpZXMuZmluZCh0bXAgPT4gdGhpcy5pc0VudGl0eU9mSWQodG1wLCBpZCkpIHx8XG4gICAgICAgICAgICAgIHRoaXMuYnVpbGRSZXRyaWV2YWxBbGVydCh2YWx1ZUJlaGluZEF0dHJpYnV0ZVtpbmRleF0sIGVycm9ycylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcmV0cmlldmVkRW50aXRpZXMuZmluZCh0bXAgPT4gdGhpcy5pc0VudGl0eU9mSWQodG1wLCBpZE9ySWRzKSkgfHxcbiAgICAgICAgICB0aGlzLmJ1aWxkUmV0cmlldmFsQWxlcnQodmFsdWVCZWhpbmRBdHRyaWJ1dGUgYXMgUGFydGlhbDxUPiwgZXJyb3JzKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIGJ1bGtSZXF1ZXN0SWQuXG4gICAqL1xuICBnZXRSZXN1bHQkKFxuICAgIGJ1bGtSZXF1ZXN0SWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPHsgcmVzdWx0OiBUW107IGVycm9yczogRHluYW1pY0J1bGtSZXRyaWV2YWxFcnJvcltdIH0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRzT2ZCdWxrTG9hZC5waXBlKFxuICAgICAgZmlsdGVyKCh7IGJ1bGtSZXF1ZXN0SWQ6IGJJZCB9KSA9PiBidWxrUmVxdWVzdElkID09PSBiSWQpLFxuICAgICAgbWFwKCh7IHJlc3VsdCwgZXJyb3JzIH0pID0+ICh7IHJlc3VsdCwgZXJyb3JzIH0pKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAocmVzdWx0ID0+IGNsb25lRGVlcChyZXN1bHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHNpbmdsZSBpZCBvciBhbiBhcnJheSBvZiBpZHMgdG8gdGhlIGlkc0dyb3VwZWRCeUJ1bGtJZCBNYXAgZm9yIHRoZSBwcm92aWRlZCBidWxrUmVxdWVzdElkLlxuICAgKi9cbiAgYWRkSWRzVG9CZUxvYWRlZChidWxrUmVxdWVzdElkOiBudW1iZXIsIC4uLmlkczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBsZXQgZ3JvdXBlZElkcyA9IHRoaXMuaWRzR3JvdXBlZEJ5QnVsa0lkLmdldChidWxrUmVxdWVzdElkKTtcbiAgICBpZiAoIWdyb3VwZWRJZHMpIHtcbiAgICAgIGdyb3VwZWRJZHMgPSBbXTtcbiAgICAgIHRoaXMuaWRzR3JvdXBlZEJ5QnVsa0lkLnNldChidWxrUmVxdWVzdElkLCBncm91cGVkSWRzKTtcbiAgICB9XG4gICAgZ3JvdXBlZElkcy5wdXNoKC4uLmlkcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXRpYmxlIHdpdGggc2VyaWFsaXppbmcgYW4gb2JqZWN0IG9yIGFuIEFycmF5IG9mIG9iamVjdHMuXG4gICAqIENhbGxzIHNlcmlhbGl6ZVNpbmdsZU9iamVjdCBmb3IgYW4gb2JqZWN0IGFuZCBmb3IgZXZlcnkgZW50cnkgd2l0aGluIHRoZSBhcnJheS5cbiAgICovXG4gIHNlcmlhbGl6ZShjb25maWc6IGFueSwgYXR0cmlidXRlOiBzdHJpbmcpOiBQYXJ0aWFsPFQ+IHwgQXJyYXk8UGFydGlhbDxUPj4ge1xuICAgIGNvbnN0IHZhbHVlQmVoaW5kQXR0cmlidXRlOiBUIHwgVFtdID0gZ2V0KGNvbmZpZywgYXR0cmlidXRlKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZUJlaGluZEF0dHJpYnV0ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZUJlaGluZEF0dHJpYnV0ZS5tYXAoZW50cnkgPT4gdGhpcy5zZXJpYWxpemVTaW5nbGVPYmplY3QoZW50cnkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplU2luZ2xlT2JqZWN0KHZhbHVlQmVoaW5kQXR0cmlidXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW4gY2FzZSBhIHNwZWNpZmljIGlkIHdhc24ndCBmb3VuZCBhcyBwYXJ0IG9mIHRoZSByZXR1cm5lZCBkYXRhc2V0LlxuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGRSZXRyaWV2YWxBbGVydChcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4sXG4gICAgZXJyb3JzPzogQXJyYXk8eyBpZDogc3RyaW5nOyBzdGF0dXM6IG51bWJlcjsgc3RhdHVzVGV4dDogc3RyaW5nIH0+XG4gICk6IER5bmFtaWNDb21wb25lbnRBbGVydDtcblxuICAvKipcbiAgICogVXNlZCB0byBwZXJmb3JtIHRoZSByZXF1ZXN0KHMpIHRvIHJldHJpZXZlIHRoZSBwcm92aWRlZCBpZHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGVyZm9ybUJ1bGtSZXF1ZXN0KFxuICAgIHVuaXFJZHM6IHN0cmluZ1tdLFxuICAgIGJ1bGtSZXF1ZXN0SWQ6IG51bWJlclxuICApOlxuICAgIHwgUHJvbWlzZTx7IHJlc3VsdDogVFtdOyBidWxrUmVxdWVzdElkOiBudW1iZXI7IGVycm9yczogRHluYW1pY0J1bGtSZXRyaWV2YWxFcnJvcltdIH0+XG4gICAgfCBPYnNlcnZhYmxlPHsgcmVzdWx0OiBUW107IGJ1bGtSZXF1ZXN0SWQ6IG51bWJlcjsgZXJyb3JzOiBEeW5hbWljQnVsa1JldHJpZXZhbEVycm9yW10gfT47XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgaWRzIHRvIGJlIHByb3ZpZGVkIHRvIHRoZSBwZXJmb3JtQnVsa1JlcXVlc3QgbWV0aG9kIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZXh0cmFjdElkc1RvQmVSZXRyaWV2ZWQoXG4gICAgdmFsdWVCZWhpbmRBdHRyaWJ1dGU6IFBhcnRpYWw8VD4gfCBBcnJheTxQYXJ0aWFsPFQ+PlxuICApOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUmVzcG9uc2libGUgZm9yIHNlcmlhbGl6aW5nIGEgc2luZ2xlIG9iamVjdC4gVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgZS5nLiBzdG9yZWQgaW4gdGhlIHdpZGdldHMgY29uZmlndXJhdGlvbiB0byB0aGUgYmFja2VuZC5cbiAgICogSXQgc2hvdWxkIHJlZHVjZSB0aGUgcHJvdmlkZWQgb2JqZWN0IHRvIGl0J3MgZXNzZW50aWFscyBhdHRyaWJ1dGVzIHRvIGZpbmQgaXQgdmlhIEFQSSwgc28gZS5nLiB0aGUgaWQuXG4gICAqIEl0IGlzIGJhc2ljYWxseSByZXZlcnNpbmcgdGhlIHRoaW5nIHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSByZXNvbHZlIG1ldGhvZC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXJpYWxpemVTaW5nbGVPYmplY3Qob2JqOiBUKTogUGFydGlhbDxUPjtcblxuICAvKipcbiAgICogQ2hlY2tzIHdldGhlciBhbiBvYmplY3QgaXMgb2YgZ2l2ZW4gaWQuXG4gICAqIFdpbGwgYnkgZGVmYXVsdCBjb21wYXJlIHRoZSBpZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gaWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNFbnRpdHlPZklkKG9iajogVCwgaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvYmo/LmlkID09PSBpZDtcbiAgfVxufVxuIl19