UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

217 lines 25.6 kB
import { __decorate, __metadata, __param } from "tslib"; import { Injectable, SecurityContext, Inject } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "@angular/common"; /** * **Ignite UI for Angular Icon Service** - * * The Ignite UI Icon Service makes it easy for developers to include custom SVG images and use them with IgxIconComponent. * In addition it could be used to associate a custom class to be applied on IgxIconComponent according to given fontSet. * * Example: * ```typescript * this.iconService.registerFontSetAlias('material', 'material-icons'); * this.iconService.addSvgIcon('aruba', '/assets/svg/country_flags/aruba.svg', 'svg-flags'); * ``` */ var IgxIconService = /** @class */ (function () { function IgxIconService(_sanitizer, _document) { this._sanitizer = _sanitizer; this._document = _document; this._fontSet = 'material-icons'; this._fontSetAliases = new Map(); this._cachedSvgIcons = new Set(); } Object.defineProperty(IgxIconService.prototype, "defaultFontSet", { /** * Returns the default font set. *```typescript * const defaultFontSet = this.iconService.defaultFontSet; * ``` */ get: function () { return this._fontSet; }, /** * Sets the default font set. *```typescript * this.iconService.defaultFontSet = 'svg-flags'; * ``` */ set: function (className) { this._fontSet = className; }, enumerable: true, configurable: true }); /** * Registers a custom class to be applied to IgxIconComponent for a given fontSet. *```typescript * this.iconService.registerFontSetAlias('material', 'material-icons'); * ``` */ IgxIconService.prototype.registerFontSetAlias = function (alias, className) { if (className === void 0) { className = alias; } this._fontSetAliases.set(alias, className); return this; }; /** * Returns the custom class, if any, associated to a given fontSet. *```typescript * const fontSetClass = this.iconService.fontSetClassName('material'); * ``` */ IgxIconService.prototype.fontSetClassName = function (alias) { return this._fontSetAliases.get(alias) || alias; }; /** * Adds an SVG image to the cache. SVG source is an url. *```typescript * this.iconService.addSvgIcon('aruba', '/assets/svg/country_flags/aruba.svg', 'svg-flags'); * ``` */ IgxIconService.prototype.addSvgIcon = function (iconName, url, fontSet) { if (fontSet === void 0) { fontSet = ''; } if (iconName && url) { var safeUrl = this._sanitizer.bypassSecurityTrustResourceUrl(url); if (!safeUrl) { throw new Error("The provided URL could not be processed as trusted resource URL by Angular's DomSanitizer: \"" + url + "\"."); } var sanitizedUrl = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl); if (!sanitizedUrl) { throw new Error("The URL provided was not trusted as a resource URL: \"" + url + "\"."); } this.fetchSvg(iconName, url, fontSet); } else { throw new Error('You should provide at least `iconName` and `url` to register an svg icon.'); } }; /** * Adds an SVG image to the cache. SVG source is its text. *```typescript * this.iconService.addSvgIcon('simple', '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"> * <path d="M74 74h54v54H74" /></svg>', 'svg-flags'); * ``` */ IgxIconService.prototype.addSvgIconFromText = function (iconName, iconText, fontSet) { if (fontSet === void 0) { fontSet = ''; } if (iconName && iconText) { this.cacheSvgIcon(iconName, iconText, fontSet); } else { throw new Error('You should provide at least `iconName` and `iconText` to register an svg icon.'); } }; /** * Returns whether a given SVG image is present in the cache. *```typescript * const isSvgCached = this.iconService.isSvgIconCached('aruba', 'svg-flags'); * ``` */ IgxIconService.prototype.isSvgIconCached = function (iconName, fontSet) { if (fontSet === void 0) { fontSet = ''; } var iconKey = this.getSvgIconKey(iconName, fontSet); return this._cachedSvgIcons.has(iconKey); }; /** * Returns the key of a cached SVG image. *```typescript * const svgIconKey = this.iconService.getSvgIconKey('aruba', 'svg-flags'); * ``` */ IgxIconService.prototype.getSvgIconKey = function (iconName, fontSet) { if (fontSet === void 0) { fontSet = ''; } return fontSet + '_' + iconName; }; /** * @hidden */ IgxIconService.prototype.fetchSvg = function (iconName, url, fontSet) { if (fontSet === void 0) { fontSet = ''; } var instance = this; var httpRequest = new XMLHttpRequest(); httpRequest.open('GET', url, true); httpRequest.responseType = 'text'; // load – when the result is ready, that includes HTTP errors like 404. httpRequest.onload = function (event) { if (event) { var request = event.target; if (request.status === 200) { instance.cacheSvgIcon(iconName, request.responseText, fontSet); } else { throw new Error("Could not fetch SVG from url: " + url + "; error: " + request.status + " (" + request.statusText + ")"); } } else { throw new Error("Could not fetch SVG from url: " + url + ";"); } }; // error – when the request couldn’t be made, e.g.network down or invalid URL. httpRequest.onerror = function (event) { if (event) { var request = event.target; throw new Error("Could not fetch SVG from url: " + url + "; error status code: " + request.status + " (" + request.statusText + ")"); } throw new Error("Could not fetch SVG from url: " + url + ";"); }; httpRequest.send(); }; /** * @hidden */ IgxIconService.prototype.cacheSvgIcon = function (iconName, value, fontSet) { if (fontSet === void 0) { fontSet = ''; } if (iconName && value) { this.ensureSvgContainerCreated(); var div = this._document.createElement('DIV'); div.innerHTML = value; var svg = div.querySelector('svg'); if (svg) { var iconKey = this.getSvgIconKey(iconName, fontSet); svg.setAttribute('id', iconKey); svg.setAttribute('fit', ''); svg.setAttribute('preserveAspectRatio', 'xMidYMid meet'); svg.setAttribute('focusable', 'false'); // Disable IE11 default behavior to make SVGs focusable. if (this._cachedSvgIcons.has(iconKey)) { var oldChild = this._svgContainer.querySelector("svg[id='" + iconKey + "']"); this._svgContainer.removeChild(oldChild); } this._svgContainer.appendChild(svg); this._cachedSvgIcons.add(iconKey); } } }; /** * @hidden */ IgxIconService.prototype.ensureSvgContainerCreated = function () { if (!this._svgContainer) { this._svgContainer = this._document.documentElement.querySelector('.igx-svg-container'); if (!this._svgContainer) { this._svgContainer = this._document.createElement('DIV'); this._svgContainer.classList.add('igx-svg-container'); this._document.documentElement.appendChild(this._svgContainer); } } }; IgxIconService.ctorParameters = function () { return [ { type: DomSanitizer }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; IgxIconService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IgxIconService_Factory() { return new IgxIconService(i0.ɵɵinject(i1.DomSanitizer), i0.ɵɵinject(i2.DOCUMENT)); }, token: IgxIconService, providedIn: "root" }); IgxIconService = __decorate([ Injectable({ providedIn: 'root' }), __param(1, Inject(DOCUMENT)), __metadata("design:paramtypes", [DomSanitizer, Object]) ], IgxIconService); return IgxIconService; }()); export { IgxIconService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pY29uL2ljb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFFM0M7Ozs7Ozs7Ozs7O0dBV0c7QUFNSDtJQU1JLHdCQUFvQixVQUF3QixFQUE0QixTQUFjO1FBQWxFLGVBQVUsR0FBVixVQUFVLENBQWM7UUFBNEIsY0FBUyxHQUFULFNBQVMsQ0FBSztRQUw5RSxhQUFRLEdBQUcsZ0JBQWdCLENBQUM7UUFDNUIsb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUU1QyxvQkFBZSxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRWlDLENBQUM7SUFRM0Ysc0JBQUksMENBQWM7UUFObEI7Ozs7O1dBS0c7YUFDSDtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixDQUFDO1FBRUQ7Ozs7O1dBS0c7YUFDSCxVQUFtQixTQUFpQjtZQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUM5QixDQUFDOzs7T0FWQTtJQVlEOzs7OztPQUtHO0lBQ0ksNkNBQW9CLEdBQTNCLFVBQTRCLEtBQWEsRUFBRSxTQUF5QjtRQUF6QiwwQkFBQSxFQUFBLGlCQUF5QjtRQUNoRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0kseUNBQWdCLEdBQXZCLFVBQXdCLEtBQWE7UUFDakMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksbUNBQVUsR0FBakIsVUFBa0IsUUFBZ0IsRUFBRSxHQUFXLEVBQUUsT0FBb0I7UUFBcEIsd0JBQUEsRUFBQSxZQUFvQjtRQUNqRSxJQUFJLFFBQVEsSUFBSSxHQUFHLEVBQUU7WUFDakIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsa0dBQStGLEdBQUcsUUFBSSxDQUFDLENBQUM7YUFDM0g7WUFFRCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBd0QsR0FBRyxRQUFJLENBQUMsQ0FBQzthQUNwRjtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1NBQ2hHO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJDQUFrQixHQUF6QixVQUEwQixRQUFnQixFQUFFLFFBQWdCLEVBQUUsT0FBb0I7UUFBcEIsd0JBQUEsRUFBQSxZQUFvQjtRQUM5RSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7U0FDckc7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSx3Q0FBZSxHQUF0QixVQUF1QixRQUFnQixFQUFFLE9BQW9CO1FBQXBCLHdCQUFBLEVBQUEsWUFBb0I7UUFDekQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxzQ0FBYSxHQUFwQixVQUFxQixRQUFnQixFQUFFLE9BQW9CO1FBQXBCLHdCQUFBLEVBQUEsWUFBb0I7UUFDdkQsT0FBTyxPQUFPLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQ0FBUSxHQUFoQixVQUFpQixRQUFnQixFQUFFLEdBQVcsRUFBRSxPQUFvQjtRQUFwQix3QkFBQSxFQUFBLFlBQW9CO1FBQ2hFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFNLFdBQVcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxXQUFXLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUVsQyx1RUFBdUU7UUFDdkUsV0FBVyxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQW9CO1lBQy9DLElBQUksS0FBSyxFQUFFO2dCQUNQLElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUF3QixDQUFDO2dCQUMvQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUN4QixRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNsRTtxQkFBTTtvQkFDSCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFpQyxHQUFHLGlCQUFZLE9BQU8sQ0FBQyxNQUFNLFVBQUssT0FBTyxDQUFDLFVBQVUsTUFBRyxDQUFDLENBQUM7aUJBQzdHO2FBQ0o7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBaUMsR0FBRyxNQUFHLENBQUMsQ0FBQzthQUM1RDtRQUNMLENBQUMsQ0FBQztRQUVGLDhFQUE4RTtRQUM5RSxXQUFXLENBQUMsT0FBTyxHQUFHLFVBQVUsS0FBb0I7WUFDaEQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQXdCLENBQUM7Z0JBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQWlDLEdBQUcsNkJBQXdCLE9BQU8sQ0FBQyxNQUFNLFVBQUssT0FBTyxDQUFDLFVBQVUsTUFBRyxDQUFDLENBQUM7YUFDekg7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFpQyxHQUFHLE1BQUcsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUVGLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQ0FBWSxHQUFwQixVQUFxQixRQUFnQixFQUFFLEtBQWEsRUFBRSxPQUFvQjtRQUFwQix3QkFBQSxFQUFBLFlBQW9CO1FBQ3RFLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUVqQyxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBZSxDQUFDO1lBRW5ELElBQUksR0FBRyxFQUFFO2dCQUNMLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUV0RCxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsd0RBQXdEO2dCQUVoRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNuQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFXLE9BQU8sT0FBSSxDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM1QztnQkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckM7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGtEQUF5QixHQUFqQztRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2xFO1NBQ0o7SUFDTCxDQUFDOztnQkFwTCtCLFlBQVk7Z0RBQUcsTUFBTSxTQUFDLFFBQVE7OztJQU5yRCxjQUFjO1FBSjFCLFVBQVUsQ0FBQztZQUNSLFVBQVUsRUFBRSxNQUFNO1NBQ3JCLENBQUM7UUFRaUQsV0FBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7eUNBQS9CLFlBQVk7T0FObkMsY0FBYyxDQTJMMUI7eUJBaE5EO0NBZ05DLEFBM0xELElBMkxDO1NBM0xZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBTZWN1cml0eUNvbnRleHQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgSWNvbiBTZXJ2aWNlKiogLVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgSWNvbiBTZXJ2aWNlIG1ha2VzIGl0IGVhc3kgZm9yIGRldmVsb3BlcnMgdG8gaW5jbHVkZSBjdXN0b20gU1ZHIGltYWdlcyBhbmQgdXNlIHRoZW0gd2l0aCBJZ3hJY29uQ29tcG9uZW50LlxuICogSW4gYWRkaXRpb24gaXQgY291bGQgYmUgdXNlZCB0byBhc3NvY2lhdGUgYSBjdXN0b20gY2xhc3MgdG8gYmUgYXBwbGllZCBvbiBJZ3hJY29uQ29tcG9uZW50IGFjY29yZGluZyB0byBnaXZlbiBmb250U2V0LlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyRm9udFNldEFsaWFzKCdtYXRlcmlhbCcsICdtYXRlcmlhbC1pY29ucycpO1xuICogdGhpcy5pY29uU2VydmljZS5hZGRTdmdJY29uKCdhcnViYScsICcvYXNzZXRzL3N2Zy9jb3VudHJ5X2ZsYWdzL2FydWJhLnN2ZycsICdzdmctZmxhZ3MnKTtcbiAqIGBgYFxuICovXG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5cbmV4cG9ydCBjbGFzcyBJZ3hJY29uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBfZm9udFNldCA9ICdtYXRlcmlhbC1pY29ucyc7XG4gICAgcHJpdmF0ZSBfZm9udFNldEFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHByaXZhdGUgX3N2Z0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBfY2FjaGVkU3ZnSWNvbnM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplciwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSkgeyB9XG5cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgZGVmYXVsdCBmb250IHNldC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIGNvbnN0IGRlZmF1bHRGb250U2V0ID0gdGhpcy5pY29uU2VydmljZS5kZWZhdWx0Rm9udFNldDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdEZvbnRTZXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFNldHMgdGhlIGRlZmF1bHQgZm9udCBzZXQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICB0aGlzLmljb25TZXJ2aWNlLmRlZmF1bHRGb250U2V0ID0gJ3N2Zy1mbGFncyc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IGRlZmF1bHRGb250U2V0KGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTZXQgPSBjbGFzc05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJlZ2lzdGVycyBhIGN1c3RvbSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIElneEljb25Db21wb25lbnQgZm9yIGEgZ2l2ZW4gZm9udFNldC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJGb250U2V0QWxpYXMoJ21hdGVyaWFsJywgJ21hdGVyaWFsLWljb25zJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyRm9udFNldEFsaWFzKGFsaWFzOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nID0gYWxpYXMpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZm9udFNldEFsaWFzZXMuc2V0KGFsaWFzLCBjbGFzc05hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgY3VzdG9tIGNsYXNzLCBpZiBhbnksIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBmb250U2V0LlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgY29uc3QgZm9udFNldENsYXNzID0gdGhpcy5pY29uU2VydmljZS5mb250U2V0Q2xhc3NOYW1lKCdtYXRlcmlhbCcpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBmb250U2V0Q2xhc3NOYW1lKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNldEFsaWFzZXMuZ2V0KGFsaWFzKSB8fCBhbGlhcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQWRkcyBhbiBTVkcgaW1hZ2UgdG8gdGhlIGNhY2hlLiBTVkcgc291cmNlIGlzIGFuIHVybC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbignYXJ1YmEnLCAnL2Fzc2V0cy9zdmcvY291bnRyeV9mbGFncy9hcnViYS5zdmcnLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFkZFN2Z0ljb24oaWNvbk5hbWU6IHN0cmluZywgdXJsOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIGlmIChpY29uTmFtZSAmJiB1cmwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhZmVVcmwgPSB0aGlzLl9zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gICAgICAgICAgICBpZiAoIXNhZmVVcmwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm92aWRlZCBVUkwgY291bGQgbm90IGJlIHByb2Nlc3NlZCBhcyB0cnVzdGVkIHJlc291cmNlIFVSTCBieSBBbmd1bGFyJ3MgRG9tU2FuaXRpemVyOiBcIiR7dXJsfVwiLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzYW5pdGl6ZWRVcmwgPSB0aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgc2FmZVVybCk7XG4gICAgICAgICAgICBpZiAoIXNhbml0aXplZFVybCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFVSTCBwcm92aWRlZCB3YXMgbm90IHRydXN0ZWQgYXMgYSByZXNvdXJjZSBVUkw6IFwiJHt1cmx9XCIuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmV0Y2hTdmcoaWNvbk5hbWUsIHVybCwgZm9udFNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBzaG91bGQgcHJvdmlkZSBhdCBsZWFzdCBgaWNvbk5hbWVgIGFuZCBgdXJsYCB0byByZWdpc3RlciBhbiBzdmcgaWNvbi4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBZGRzIGFuIFNWRyBpbWFnZSB0byB0aGUgY2FjaGUuIFNWRyBzb3VyY2UgaXMgaXRzIHRleHQuXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogICB0aGlzLmljb25TZXJ2aWNlLmFkZFN2Z0ljb24oJ3NpbXBsZScsICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDIwMCAyMDBcIj5cbiAgICAgKiAgIDxwYXRoIGQ9XCJNNzQgNzRoNTR2NTRINzRcIiAvPjwvc3ZnPicsICdzdmctZmxhZ3MnKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkU3ZnSWNvbkZyb21UZXh0KGljb25OYW1lOiBzdHJpbmcsIGljb25UZXh0OiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIGlmIChpY29uTmFtZSAmJiBpY29uVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVN2Z0ljb24oaWNvbk5hbWUsIGljb25UZXh0LCBmb250U2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBwcm92aWRlIGF0IGxlYXN0IGBpY29uTmFtZWAgYW5kIGBpY29uVGV4dGAgdG8gcmVnaXN0ZXIgYW4gc3ZnIGljb24uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gU1ZHIGltYWdlIGlzIHByZXNlbnQgaW4gdGhlIGNhY2hlLlxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqICAgY29uc3QgaXNTdmdDYWNoZWQgPSB0aGlzLmljb25TZXJ2aWNlLmlzU3ZnSWNvbkNhY2hlZCgnYXJ1YmEnLCAnc3ZnLWZsYWdzJyk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGlzU3ZnSWNvbkNhY2hlZChpY29uTmFtZTogc3RyaW5nLCBmb250U2V0OiBzdHJpbmcgPSAnJyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpY29uS2V5ID0gdGhpcy5nZXRTdmdJY29uS2V5KGljb25OYW1lLCBmb250U2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN2Z0ljb25zLmhhcyhpY29uS2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUga2V5IG9mIGEgY2FjaGVkIFNWRyBpbWFnZS5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiAgIGNvbnN0IHN2Z0ljb25LZXkgPSB0aGlzLmljb25TZXJ2aWNlLmdldFN2Z0ljb25LZXkoJ2FydWJhJywgJ3N2Zy1mbGFncycpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdmdJY29uS2V5KGljb25OYW1lOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHJldHVybiBmb250U2V0ICsgJ18nICsgaWNvbk5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZmV0Y2hTdmcoaWNvbk5hbWU6IHN0cmluZywgdXJsOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcztcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICAgICAgaHR0cFJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ3RleHQnO1xuXG4gICAgICAgIC8vIGxvYWQg4oCTIHdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSwgdGhhdCBpbmNsdWRlcyBIVFRQIGVycm9ycyBsaWtlIDQwNC5cbiAgICAgICAgaHR0cFJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24gKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQudGFyZ2V0IGFzIFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNhY2hlU3ZnSWNvbihpY29uTmFtZSwgcmVxdWVzdC5yZXNwb25zZVRleHQsIGZvbnRTZXQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZldGNoIFNWRyBmcm9tIHVybDogJHt1cmx9OyBlcnJvcjogJHtyZXF1ZXN0LnN0YXR1c30gKCR7cmVxdWVzdC5zdGF0dXNUZXh0fSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZldGNoIFNWRyBmcm9tIHVybDogJHt1cmx9O2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGVycm9yIOKAkyB3aGVuIHRoZSByZXF1ZXN0IGNvdWxkbuKAmXQgYmUgbWFkZSwgZS5nLm5ldHdvcmsgZG93biBvciBpbnZhbGlkIFVSTC5cbiAgICAgICAgaHR0cFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChldmVudDogUHJvZ3Jlc3NFdmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LnRhcmdldCBhcyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmZXRjaCBTVkcgZnJvbSB1cmw6ICR7dXJsfTsgZXJyb3Igc3RhdHVzIGNvZGU6ICR7cmVxdWVzdC5zdGF0dXN9ICgke3JlcXVlc3Quc3RhdHVzVGV4dH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmZXRjaCBTVkcgZnJvbSB1cmw6ICR7dXJsfTtgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBodHRwUmVxdWVzdC5zZW5kKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgY2FjaGVTdmdJY29uKGljb25OYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGZvbnRTZXQ6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIGlmIChpY29uTmFtZSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVTdmdDb250YWluZXJDcmVhdGVkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgc3ZnID0gZGl2LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIFNWR0VsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChzdmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpY29uS2V5ID0gdGhpcy5nZXRTdmdJY29uS2V5KGljb25OYW1lLCBmb250U2V0KTtcblxuICAgICAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2lkJywgaWNvbktleSk7XG4gICAgICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZml0JywgJycpO1xuICAgICAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuICAgICAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpOyAvLyBEaXNhYmxlIElFMTEgZGVmYXVsdCBiZWhhdmlvciB0byBtYWtlIFNWR3MgZm9jdXNhYmxlLlxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlZFN2Z0ljb25zLmhhcyhpY29uS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRDaGlsZCA9IHRoaXMuX3N2Z0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGBzdmdbaWQ9JyR7aWNvbktleX0nXWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmdDb250YWluZXIucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lci5hcHBlbmRDaGlsZChzdmcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFN2Z0ljb25zLmFkZChpY29uS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuc3VyZVN2Z0NvbnRhaW5lckNyZWF0ZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3ZnQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zdmdDb250YWluZXIgPSB0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlneC1zdmctY29udGFpbmVyJyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N2Z0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N2Z0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpZ3gtc3ZnLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zdmdDb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19