carbon-components-angular
Version:
Next generation components
140 lines • 15.7 kB
JavaScript
import { Injectable } from "@angular/core";
import { toString } from "@carbon/icon-helpers";
import * as i0 from "@angular/core";
/**
* Abstract class that represent a cache of icons.
*
* The actual caching mechanism will be implementation specific,
* but it's likely a good idea to key by the icons name and/or size.
* Icon name and size will always be strings, and they will be the two consistent
* identifiers of an icon. For the purposes of storage additonal descriptor properties may
* be used, but the name and size are the only ones guarenteed to be passed for lookup purposes.
*/
export class IconCache {
}
/**
* Custom error for when a name can't be found
*/
export class IconNameNotFoundError extends Error {
constructor(name) {
super(`Icon ${name} not found`);
}
}
/**
* Custom error for when a specific size can't be found
*/
export class IconSizeNotFoundError extends Error {
constructor(size, name) {
super("Size ${size} for ${name} not found");
}
}
/**
* Concrete implementation of `IconCache` as a simple in memory cache
*/
export class IconMemoryCache extends IconCache {
constructor() {
super(...arguments);
this.iconMap = new Map();
}
get(name, size) {
if (!this.iconMap.has(name)) {
throw new IconNameNotFoundError(name);
}
const sizeMap = this.iconMap.get(name);
if (!sizeMap.has(size)) {
throw new IconSizeNotFoundError(size, name);
}
return sizeMap.get(size);
}
set(name, size, descriptor) {
if (!this.iconMap.has(name)) {
this.iconMap.set(name, new Map());
}
const sizeMap = this.iconMap.get(name);
sizeMap.set(size, descriptor);
}
}
/**
* The icon service is a singleton service responsible for registering and retriving icons from `@carbon/icons`.
*
* It's important to register icons before use. It's reccommended to register your icons early, likely in your app.component.
*
* To allow for improved tree shaking _do not_ import all the icons from `@carbon/icons` and register them.
* Instead register only the icons in use by your application. If your application makes use of lazy loaded
* modules you may also lazy load the icons used in that module by registering them early on in that module.
*
* `ngOnInit` should be sufficiantly early to register icons.
*
* Example:
* ```
* import { Accessibility16 } from "@carbon/icons";
*
* // ...
*
* class MyComponent implements OnInit {
* constructor(protected iconService: IconService) {}
*
* // ...
*
* ngOnInit() {
* this.iconService.register(Accessibility16);
* }
*
* // ...
* }
* ```
*
* If needed it is possible to register an icon under a different name, via `registerAs`.
*/
export class IconService {
constructor() {
this.iconCache = new IconMemoryCache();
}
/**
* Registers an array of icons based on the metadata provided by `@carbon/icons`
*/
registerAll(descriptors) {
descriptors.forEach(icon => this.register(icon));
}
/**
* Registers an icon based on the metadata provided by `@carbon/icons`
*/
register(descriptor) {
const { name } = descriptor;
this.registerAs(name, descriptor);
}
/**
* Registers an icon based on a uniqe name and metadata provided by `@carbon/icons`
*/
registerAs(name, descriptor) {
const { size } = descriptor;
this.iconCache.set(name, size.toString(), descriptor);
}
/**
* Gets an icon, converts it to a string, and caches the result
*/
get(name, size) {
try {
const icon = this.iconCache.get(name, size.toString());
if (!icon.svg) {
icon.svg = toString(icon);
}
return icon;
}
catch (e) {
throw e;
}
}
/**
* Configure various service settings (caching strategy ...)
*/
configure(options) {
this.iconCache = options.cache;
}
}
IconService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
IconService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ljb24vaWNvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQTZFaEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQWdCLFNBQVM7Q0FTOUI7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxLQUFLO0lBQy9DLFlBQVksSUFBWTtRQUN2QixLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFDL0MsWUFBWSxJQUFZLEVBQUUsSUFBWTtRQUNyQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Q7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFBOUM7O1FBQ1MsWUFBTyxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBb0IxRCxDQUFDO0lBbEJBLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsTUFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsVUFBa0I7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDbEM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBRHhCO1FBRVMsY0FBUyxHQUFjLElBQUksZUFBZSxFQUFFLENBQUM7S0E4Q3JEO0lBNUNBOztPQUVHO0lBQ0ksV0FBVyxDQUFDLFdBQXFCO1FBQ3ZDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLFVBQWtCO1FBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUE0QixDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDakQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQTRCLENBQUM7UUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxHQUFHLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDcEMsSUFBSTtZQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQW1CLENBQUM7WUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUI7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNaO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDWCxNQUFNLENBQUMsQ0FBQztTQUNSO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLE9BQTZCO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDOzt3R0E5Q1csV0FBVzs0R0FBWCxXQUFXOzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHRvU3RyaW5nIH0gZnJvbSBcIkBjYXJib24vaWNvbi1oZWxwZXJzXCI7XG5cbi8vIGljb24gaW1wb3J0c1xuaW1wb3J0IHtcblx0QWRkMTYsXG5cdENhbGVuZGFyMTYsXG5cdENhcmV0RG93bjE2LFxuXHRDYXJldExlZnQxNixcblx0Q2FyZXRSaWdodDE2LFxuXHRDYXJldFVwMTYsXG5cdENoZWNrbWFyazE2LFxuXHRDaGVja21hcmtGaWxsZWQxNixcblx0Q2hlY2ttYXJrT3V0bGluZTE2LFxuXHRDaGV2cm9uRG93bjE2LFxuXHRDaGV2cm9uUmlnaHQxNixcblx0Q2xvc2UxNixcblx0Q29weTE2LFxuXHREb3dubG9hZDE2LFxuXHRFcnJvckZpbGxlZDE2LFxuXHRJbmZvcm1hdGlvbkZpbGxlZDE2LFxuXHRNZW51MTYsXG5cdE92ZXJmbG93TWVudVZlcnRpY2FsMTYsXG5cdFNhdmUxNixcblx0U2V0dGluZ3MxNixcblx0VHJhc2hDYW4xNixcblx0V2FybmluZzE2LFxuXHRXYXJuaW5nRmlsbGVkMTZcbn0gZnJvbSBcIkBjYXJib24vaWNvbnNcIjtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgcGFyc2VkIGljb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJY29uRGVzY3JpcHRvciB7XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudCB0byByZW5kZXIuIEZvciB0aGUgcm9vdCB0aGlzIGlzIGBzdmdgXG5cdCAqL1xuXHRlbGVtOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBBbiBvYmplY3Qgb2YgYXR0cmlidXRlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC5cblx0ICpcblx0ICogVGhlIHR5cGUgaGVyZSBpcyBub24tZXhoYXVzdGl2ZS5cblx0ICovXG5cdGF0dHJzOiB7XG5cdFx0eG1sbnM6IHN0cmluZyxcblx0XHQvLyBuZWVkZWQgYnkgdGhlIGljb24gZGlyZWN0aXZlIHRvIGRldGVybWluZSBvdGhlciBhdHRyaWJ1dGVzXG5cdFx0dmlld0JveDogc3RyaW5nLFxuXHRcdGZpbGw6IHN0cmluZyxcblx0XHQvLyBuZWVkZWQgYnkgdGhlIGljb24gZGlyZWN0aXZlIHRvIGRldGVybWluZSBvdGhlciBhdHRyaWJ1dGVzXG5cdFx0d2lkdGg6IHN0cmluZyxcblx0XHQvLyBuZWVkZWQgYnkgdGhlIGljb24gZGlyZWN0aXZlIHRvIGRldGVybWluZSBvdGhlciBhdHRyaWJ1dGVzXG5cdFx0aGVpZ2h0OiBzdHJpbmcsXG5cdFx0W3g6IHN0cmluZ106IHN0cmluZ1xuXHR9O1xuXHQvKipcblx0ICogVGhlIGNvbnRlbnQgKGNoaWxkcmVuKSBvZiB0aGUgZWxlbWVudCBhcyBhbiBhcnJheSBvZiBgSWNvbkRlc2NyaXB0b3Jgc1xuXHQgKiAodXN1YWxseSB3aXRob3V0IGEgZmV3IGZpZWxkcywgbmFtZWx5IGBuYW1lYCBhbmQgYHNpemVgKVxuXHQgKi9cblx0Y29udGVudDogSWNvbkRlc2NyaXB0b3JbXTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBpY29uLlxuXHQgKlxuXHQgKiBOZWVkZWQgYnkgdGhlIGljb24gc2VydmljZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBzaXplIG9mIHRoZSBpY29uIGluIHBpeGVscy5cblx0ICpcblx0ICogTmVlZGVkIGJ5IHRoZSBpY29uIHNlcnZpY2UuXG5cdCAqL1xuXHRzaXplOiBudW1iZXI7XG5cdC8qKlxuXHQgKiBPcHRpb25hbC4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbXBpbGVkIHN2Zy5cblx0ICogSWYgbWlzc2luZyB0aGUgaWNvbiBzZXJ2aWNlIHdpbGwgYWRkIHRoaXMuXG5cdCAqL1xuXHRzdmc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgdGhhdCByZXByZXNlbnQgYSBjYWNoZSBvZiBpY29ucy5cbiAqXG4gKiBUaGUgYWN0dWFsIGNhY2hpbmcgbWVjaGFuaXNtIHdpbGwgYmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMsXG4gKiBidXQgaXQncyBsaWtlbHkgYSBnb29kIGlkZWEgdG8ga2V5IGJ5IHRoZSBpY29ucyBuYW1lIGFuZC9vciBzaXplLlxuICogSWNvbiBuYW1lIGFuZCBzaXplIHdpbGwgYWx3YXlzIGJlIHN0cmluZ3MsIGFuZCB0aGV5IHdpbGwgYmUgdGhlIHR3byBjb25zaXN0ZW50XG4gKiBpZGVudGlmaWVycyBvZiBhbiBpY29uLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHN0b3JhZ2UgYWRkaXRvbmFsIGRlc2NyaXB0b3IgcHJvcGVydGllcyBtYXlcbiAqIGJlIHVzZWQsIGJ1dCB0aGUgbmFtZSBhbmQgc2l6ZSBhcmUgdGhlIG9ubHkgb25lcyBndWFyZW50ZWVkIHRvIGJlIHBhc3NlZCBmb3IgbG9va3VwIHB1cnBvc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWNvbkNhY2hlIHtcblx0LyoqXG5cdCAqIEZpbmRzIGFuZCByZXR1cm5zIGFuIGljb24gYmFzZWQgb24gaXQncyBuYW1lIGFuZCBzaXplXG5cdCAqL1xuXHRhYnN0cmFjdCBnZXQobmFtZTogc3RyaW5nLCBzaXplOiBzdHJpbmcpOiBvYmplY3Q7XG5cdC8qKlxuXHQgKiBzdG9yZXMgYW4gaWNvbiBkZXNjcmlwdG9yIHRvIHRoZSBjYWNoZVxuXHQgKi9cblx0YWJzdHJhY3Qgc2V0KG5hbWU6IHN0cmluZywgc2l6ZTogc3RyaW5nLCBkZXNjcmlwdG9yOiBvYmplY3QpOiB2b2lkO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBmb3Igd2hlbiBhIG5hbWUgY2FuJ3QgYmUgZm91bmRcbiAqL1xuZXhwb3J0IGNsYXNzIEljb25OYW1lTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIoYEljb24gJHtuYW1lfSBub3QgZm91bmRgKTtcblx0fVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBmb3Igd2hlbiBhIHNwZWNpZmljIHNpemUgY2FuJ3QgYmUgZm91bmRcbiAqL1xuZXhwb3J0IGNsYXNzIEljb25TaXplTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3Ioc2l6ZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcblx0XHRzdXBlcihcIlNpemUgJHtzaXplfSBmb3IgJHtuYW1lfSBub3QgZm91bmRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBgSWNvbkNhY2hlYCBhcyBhIHNpbXBsZSBpbiBtZW1vcnkgY2FjaGVcbiAqL1xuZXhwb3J0IGNsYXNzIEljb25NZW1vcnlDYWNoZSBleHRlbmRzIEljb25DYWNoZSB7XG5cdHByaXZhdGUgaWNvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBvYmplY3Q+PigpO1xuXG5cdGdldChuYW1lOiBzdHJpbmcsIHNpemU6IHN0cmluZykge1xuXHRcdGlmICghdGhpcy5pY29uTWFwLmhhcyhuYW1lKSkge1xuXHRcdFx0dGhyb3cgbmV3IEljb25OYW1lTm90Rm91bmRFcnJvcihuYW1lKTtcblx0XHR9XG5cdFx0Y29uc3Qgc2l6ZU1hcCA9IHRoaXMuaWNvbk1hcC5nZXQobmFtZSk7XG5cdFx0aWYgKCFzaXplTWFwLmhhcyhzaXplKSkge1xuXHRcdFx0dGhyb3cgbmV3IEljb25TaXplTm90Rm91bmRFcnJvcihzaXplLCBuYW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNpemVNYXAuZ2V0KHNpemUpO1xuXHR9XG5cblx0c2V0KG5hbWU6IHN0cmluZywgc2l6ZTogc3RyaW5nLCBkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0XHRpZiAoIXRoaXMuaWNvbk1hcC5oYXMobmFtZSkpIHtcblx0XHRcdHRoaXMuaWNvbk1hcC5zZXQobmFtZSwgbmV3IE1hcCgpKTtcblx0XHR9XG5cdFx0Y29uc3Qgc2l6ZU1hcCA9IHRoaXMuaWNvbk1hcC5nZXQobmFtZSk7XG5cdFx0c2l6ZU1hcC5zZXQoc2l6ZSwgZGVzY3JpcHRvcik7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgaWNvbiBzZXJ2aWNlIGlzIGEgc2luZ2xldG9uIHNlcnZpY2UgcmVzcG9uc2libGUgZm9yIHJlZ2lzdGVyaW5nIGFuZCByZXRyaXZpbmcgaWNvbnMgZnJvbSBgQGNhcmJvbi9pY29uc2AuXG4gKlxuICogSXQncyBpbXBvcnRhbnQgdG8gcmVnaXN0ZXIgaWNvbnMgYmVmb3JlIHVzZS4gSXQncyByZWNjb21tZW5kZWQgdG8gcmVnaXN0ZXIgeW91ciBpY29ucyBlYXJseSwgbGlrZWx5IGluIHlvdXIgYXBwLmNvbXBvbmVudC5cbiAqXG4gKiBUbyBhbGxvdyBmb3IgaW1wcm92ZWQgdHJlZSBzaGFraW5nIF9kbyBub3RfIGltcG9ydCBhbGwgdGhlIGljb25zIGZyb20gYEBjYXJib24vaWNvbnNgIGFuZCByZWdpc3RlciB0aGVtLlxuICogSW5zdGVhZCByZWdpc3RlciBvbmx5IHRoZSBpY29ucyBpbiB1c2UgYnkgeW91ciBhcHBsaWNhdGlvbi4gSWYgeW91ciBhcHBsaWNhdGlvbiBtYWtlcyB1c2Ugb2YgbGF6eSBsb2FkZWRcbiAqIG1vZHVsZXMgeW91IG1heSBhbHNvIGxhenkgbG9hZCB0aGUgaWNvbnMgdXNlZCBpbiB0aGF0IG1vZHVsZSBieSByZWdpc3RlcmluZyB0aGVtIGVhcmx5IG9uIGluIHRoYXQgbW9kdWxlLlxuICpcbiAqIGBuZ09uSW5pdGAgc2hvdWxkIGJlIHN1ZmZpY2lhbnRseSBlYXJseSB0byByZWdpc3RlciBpY29ucy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgXG4gKiBpbXBvcnQgeyBBY2Nlc3NpYmlsaXR5MTYgfSBmcm9tIFwiQGNhcmJvbi9pY29uc1wiO1xuICpcbiAqIC8vIC4uLlxuICpcbiAqIGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAqIFx0Y29uc3RydWN0b3IocHJvdGVjdGVkIGljb25TZXJ2aWNlOiBJY29uU2VydmljZSkge31cbiAqXG4gKiBcdC8vIC4uLlxuICpcbiAqIFx0bmdPbkluaXQoKSB7XG4gKiBcdFx0dGhpcy5pY29uU2VydmljZS5yZWdpc3RlcihBY2Nlc3NpYmlsaXR5MTYpO1xuICogXHR9XG4gKlxuICogXHQvLyAuLi5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIElmIG5lZWRlZCBpdCBpcyBwb3NzaWJsZSB0byByZWdpc3RlciBhbiBpY29uIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHZpYSBgcmVnaXN0ZXJBc2AuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJY29uU2VydmljZSB7XG5cdHByaXZhdGUgaWNvbkNhY2hlOiBJY29uQ2FjaGUgPSBuZXcgSWNvbk1lbW9yeUNhY2hlKCk7XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBhcnJheSBvZiBpY29ucyBiYXNlZCBvbiB0aGUgbWV0YWRhdGEgcHJvdmlkZWQgYnkgYEBjYXJib24vaWNvbnNgXG5cdCAqL1xuXHRwdWJsaWMgcmVnaXN0ZXJBbGwoZGVzY3JpcHRvcnM6IG9iamVjdFtdKSB7XG5cdFx0ZGVzY3JpcHRvcnMuZm9yRWFjaChpY29uID0+IHRoaXMucmVnaXN0ZXIoaWNvbikpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBpY29uIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBwcm92aWRlZCBieSBgQGNhcmJvbi9pY29uc2Bcblx0ICovXG5cdHB1YmxpYyByZWdpc3RlcihkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0XHRjb25zdCB7IG5hbWUgfSA9IGRlc2NyaXB0b3IgYXMgSWNvbkRlc2NyaXB0b3I7XG5cdFx0dGhpcy5yZWdpc3RlckFzKG5hbWUsIGRlc2NyaXB0b3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBpY29uIGJhc2VkIG9uIGEgdW5pcWUgbmFtZSBhbmQgbWV0YWRhdGEgcHJvdmlkZWQgYnkgYEBjYXJib24vaWNvbnNgXG5cdCAqL1xuXHRwdWJsaWMgcmVnaXN0ZXJBcyhuYW1lOiBzdHJpbmcsIGRlc2NyaXB0b3I6IG9iamVjdCkge1xuXHRcdGNvbnN0IHsgc2l6ZSB9ID0gZGVzY3JpcHRvciBhcyBJY29uRGVzY3JpcHRvcjtcblx0XHR0aGlzLmljb25DYWNoZS5zZXQobmFtZSwgc2l6ZS50b1N0cmluZygpLCBkZXNjcmlwdG9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFuIGljb24sIGNvbnZlcnRzIGl0IHRvIGEgc3RyaW5nLCBhbmQgY2FjaGVzIHRoZSByZXN1bHRcblx0ICovXG5cdHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBzaXplOiBzdHJpbmcpOiBJY29uRGVzY3JpcHRvciB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGljb24gPSB0aGlzLmljb25DYWNoZS5nZXQobmFtZSwgc2l6ZS50b1N0cmluZygpKSBhcyBJY29uRGVzY3JpcHRvcjtcblx0XHRcdGlmICghaWNvbi5zdmcpIHtcblx0XHRcdFx0aWNvbi5zdmcgPSB0b1N0cmluZyhpY29uKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpY29uO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZSB2YXJpb3VzIHNlcnZpY2Ugc2V0dGluZ3MgKGNhY2hpbmcgc3RyYXRlZ3kgLi4uKVxuXHQgKi9cblx0cHVibGljIGNvbmZpZ3VyZShvcHRpb25zOiB7IGNhY2hlOiBJY29uQ2FjaGUgfSkge1xuXHRcdHRoaXMuaWNvbkNhY2hlID0gb3B0aW9ucy5jYWNoZTtcblx0fVxufVxuIl19