@nova-ui/bits
Version:
SolarWinds Nova Framework
144 lines • 23.3 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Input, ViewEncapsulation, } from "@angular/core";
import { DomSanitizer } from "@angular/platform-browser";
import _find from "lodash/find";
import _has from "lodash/has";
import _includes from "lodash/includes";
import _isEqual from "lodash/isEqual";
import _isNumber from "lodash/isNumber";
import _isString from "lodash/isString";
import _isUndefined from "lodash/isUndefined";
import { imagesPresetToken } from "../../constants/images.constants";
import { LoggerService } from "../../services/log-service";
import { UtilService } from "../../services/util.service";
import * as i0 from "@angular/core";
import * as i1 from "../../services/log-service";
import * as i2 from "../../services/util.service";
import * as i3 from "@angular/platform-browser";
/**
* <example-url>./../examples/index.html#/image</example-url>
*/
export class ImageComponent {
constructor(logger, utilService, changeDetector, images, domSanitizer, el) {
this.logger = logger;
this.utilService = utilService;
this.changeDetector = changeDetector;
this.images = images;
this.domSanitizer = domSanitizer;
this.el = el;
/**
* Sets the width of the container parent image
*/
this.width = "auto";
/**
* Sets the height of the container parent image
*/
this.height = "auto";
this.getImage = (imageName) => _find(this.images, (img) => _isEqual(img.name, imageName));
}
ngOnInit() {
const dimensionImputs = [this.height, this.width];
dimensionImputs.forEach((item) => {
if (!_isUndefined(item) && !this.isImageSizeValid(item)) {
this.logger.error("Image size should be specified in 'px', '%', or 'auto");
}
});
}
ngOnChanges(changes) {
if (changes.image || changes.description) {
this.imageName =
this.image.name || this.getImage(this.image)?.name || null;
this.imageTemplate = this.getImageTemplate();
}
}
ngAfterViewInit() {
if (this.autoFill) {
try {
const svg = this.el.nativeElement.querySelector("svg");
svg.setAttribute("width", "100%");
svg.setAttribute("height", "100%");
}
catch (e) {
console.warn("Can't apply 'autoFill' to nui-image, because it is only applicable to SVG type of images");
return;
}
}
/**
* Fix bug for Safari with wrong alignment of floated SVG images
*/
if (this.float && !this.width && this.utilService.browser?.isSafari()) {
const svg = this.el.nativeElement.querySelector("svg");
if (!svg) {
return;
}
this.width = svg.width.baseVal.value + "px";
this.changeDetector.detectChanges();
}
}
getImageTemplate() {
const image = this.image.code ? this.image : this.getImage(this.image);
let imageHtml = "";
if (_has(image, "code") && _isString(image.code)) {
imageHtml = image.code;
this.hasAlt = false;
}
else {
imageHtml = `<img src="${this.image}" alt="${this.description}">`;
this.hasAlt = true;
}
return this.domSanitizer.bypassSecurityTrustHtml(imageHtml);
}
isImageSizeValid(input) {
return (_isNumber(parseFloat(input)) &&
(_includes(input, "px") ||
_includes(input, "%") ||
_includes(input, "auto")));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImageComponent, deps: [{ token: i1.LoggerService }, { token: i2.UtilService }, { token: i0.ChangeDetectorRef }, { token: imagesPresetToken }, { token: i3.DomSanitizer }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ImageComponent, selector: "nui-image", inputs: { image: "image", description: "description", float: "float", margin: "margin", isWatermark: "isWatermark", width: "width", height: "height", autoFill: "autoFill" }, host: { attributes: { "role": "img" }, properties: { "attr.aria-label": "hasAlt ? null : description || imageName" } }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"nui-image nui-image__hidden\"\n [innerHTML]=\"imageTemplate\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n [class.nui-image__left]=\"float === 'left'\"\n [class.nui-image__right]=\"float === 'right'\"\n [class.nui-image__margin-centered]=\"margin === 'centered'\"\n [class.nui-image__margin-small]=\"margin === 'small'\"\n [class.nui-image__margin-large]=\"margin === 'large'\"\n [class.nui-image__watermarked]=\"isWatermark\"\n></div>\n", styles: [".nui-image{width:70%;margin:5px 10px;float:none}.nui-image img,.nui-image svg{width:100%}.nui-image__left{float:left}.nui-image__right{float:right}.nui-image__margin-centered{margin:0 auto}.nui-image__margin-small{margin:10px}.nui-image__margin-large{margin:10px 15px}.nui-image__watermarked{opacity:.3}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImageComponent, decorators: [{
type: Component,
args: [{ selector: "nui-image", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
role: "img",
"[attr.aria-label]": "hasAlt ? null : description || imageName",
}, template: "<div\n class=\"nui-image nui-image__hidden\"\n [innerHTML]=\"imageTemplate\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n [class.nui-image__left]=\"float === 'left'\"\n [class.nui-image__right]=\"float === 'right'\"\n [class.nui-image__margin-centered]=\"margin === 'centered'\"\n [class.nui-image__margin-small]=\"margin === 'small'\"\n [class.nui-image__margin-large]=\"margin === 'large'\"\n [class.nui-image__watermarked]=\"isWatermark\"\n></div>\n", styles: [".nui-image{width:70%;margin:5px 10px;float:none}.nui-image img,.nui-image svg{width:100%}.nui-image__left{float:left}.nui-image__right{float:right}.nui-image__margin-centered{margin:0 auto}.nui-image__margin-small{margin:10px}.nui-image__margin-large{margin:10px 15px}.nui-image__watermarked{opacity:.3}\n"] }]
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.UtilService }, { type: i0.ChangeDetectorRef }, { type: Array, decorators: [{
type: Inject,
args: [imagesPresetToken]
}] }, { type: i3.DomSanitizer }, { type: i0.ElementRef }], propDecorators: { image: [{
type: Input
}], description: [{
type: Input
}], float: [{
type: Input
}], margin: [{
type: Input
}], isWatermark: [{
type: Input
}], width: [{
type: Input
}], height: [{
type: Input
}], autoFill: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbWFnZS9pbWFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2ltYWdlL2ltYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBSUwsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxP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QUFFLDBDQUEwQztxQkFDbEU7OzBCQThDSSxNQUFNOzJCQUFDLGlCQUFpQjs2RkF4Q2IsS0FBSztzQkFBcEIsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBSVUsTUFBTTtzQkFBckIsS0FBSztnQkFJVSxXQUFXO3NCQUExQixLQUFLO2dCQUlVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBSVUsTUFBTTtzQkFBckIsS0FBSztnQkFJVSxRQUFRO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgX2ZpbmQgZnJvbSBcImxvZGFzaC9maW5kXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwibG9kYXNoL2hhc1wiO1xuaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwibG9kYXNoL2luY2x1ZGVzXCI7XG5pbXBvcnQgX2lzRXF1YWwgZnJvbSBcImxvZGFzaC9pc0VxdWFsXCI7XG5pbXBvcnQgX2lzTnVtYmVyIGZyb20gXCJsb2Rhc2gvaXNOdW1iZXJcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcImxvZGFzaC9pc1N0cmluZ1wiO1xuaW1wb3J0IF9pc1VuZGVmaW5lZCBmcm9tIFwibG9kYXNoL2lzVW5kZWZpbmVkXCI7XG5cbmltcG9ydCB7IElJbWFnZXNQcmVzZXRJdGVtIH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgaW1hZ2VzUHJlc2V0VG9rZW4gfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2ltYWdlcy5jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbG9nLXNlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3V0aWwuc2VydmljZVwiO1xuXG4vKipcbiAqIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL2ltYWdlPC9leGFtcGxlLXVybD5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLWltYWdlXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9pbWFnZS5jb21wb25lbnQuaHRtbFwiLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0eWxlVXJsczogW1wiLi9pbWFnZS5jb21wb25lbnQubGVzc1wiXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgcm9sZTogXCJpbWdcIixcbiAgICAgICAgXCJbYXR0ci5hcmlhLWxhYmVsXVwiOiBcImhhc0FsdCA/IG51bGwgOiBkZXNjcmlwdGlvbiB8fCBpbWFnZU5hbWVcIixcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBJbWFnZSBuYW1lIGZyb20gbnVpIGltYWdlIHByZXNldCBvciBleHRlcm5hbCBzb3VyY2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW1hZ2U6IGFueTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYXJpYS1sYWJlbCB0ZXh0IG9yIGFsdCBmb3IgaW1hZ2UgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEF2YWlsYWJsZSB2YWx1ZXMgYXJlOiAnbGVmdCcgYW5kICdyaWdodCdcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZmxvYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBdmFpbGFibGUgdmFsdWVzIGFyZTogJ2NlbnRlcmVkJywgJ3NtYWxsJywgJ2xhcmdlJ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXJnaW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAnVHJ1ZScgd2lsbCBhcHBseSAzMCUgb3BhY2l0eSB0byB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaXNXYXRlcm1hcms6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBwYXJlbnQgaW1hZ2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmVyIHBhcmVudCBpbWFnZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ6IHN0cmluZyA9IFwiYXV0b1wiO1xuICAgIC8qKlxuICAgICAqIFdoZW4gc2V0IHRvIHRydWUgc2V0cyB0aGUgaGFyZGNvZGVkIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHN2ZyB0byAxMDAlIHRvIGZpbGwgdGhlIHBhcmVudCBjb250YWluZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b0ZpbGw6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgaW1hZ2VUZW1wbGF0ZTogU2FmZUh0bWw7XG4gICAgcHVibGljIGltYWdlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICBwdWJsaWMgaGFzQWx0OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoaW1hZ2VzUHJlc2V0VG9rZW4pIHByaXZhdGUgaW1hZ2VzOiBBcnJheTxJSW1hZ2VzUHJlc2V0SXRlbT4sXG4gICAgICAgIHByaXZhdGUgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbkltcHV0czogc3RyaW5nW10gPSBbdGhpcy5oZWlnaHQsIHRoaXMud2lkdGhdO1xuXG4gICAgICAgIGRpbWVuc2lvbkltcHV0cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9pc1VuZGVmaW5lZChpdGVtKSAmJiAhdGhpcy5pc0ltYWdlU2l6ZVZhbGlkKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiSW1hZ2Ugc2l6ZSBzaG91bGQgYmUgc3BlY2lmaWVkIGluICdweCcsICclJywgb3IgJ2F1dG9cIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmltYWdlIHx8IGNoYW5nZXMuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VOYW1lID1cbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlLm5hbWUgfHwgdGhpcy5nZXRJbWFnZSh0aGlzLmltYWdlKT8ubmFtZSB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5pbWFnZVRlbXBsYXRlID0gdGhpcy5nZXRJbWFnZVRlbXBsYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hdXRvRmlsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcInN2Z1wiKTtcbiAgICAgICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCIxMDAlXCIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBhcHBseSAnYXV0b0ZpbGwnIHRvIG51aS1pbWFnZSwgYmVjYXVzZSBpdCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gU1ZHIHR5cGUgb2YgaW1hZ2VzXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXggYnVnIGZvciBTYWZhcmkgd2l0aCB3cm9uZyBhbGlnbm1lbnQgb2YgZmxvYXRlZCBTVkcgaW1hZ2VzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5mbG9hdCAmJiAhdGhpcy53aWR0aCAmJiB0aGlzLnV0aWxTZXJ2aWNlLmJyb3dzZXI/LmlzU2FmYXJpKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXN2Zykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHN2Zy53aWR0aC5iYXNlVmFsLnZhbHVlICsgXCJweFwiO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW1hZ2VUZW1wbGF0ZSgpOiBTYWZlSHRtbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZS5jb2RlID8gdGhpcy5pbWFnZSA6IHRoaXMuZ2V0SW1hZ2UodGhpcy5pbWFnZSk7XG4gICAgICAgIGxldCBpbWFnZUh0bWw6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIGlmIChfaGFzKGltYWdlLCBcImNvZGVcIikgJiYgX2lzU3RyaW5nKGltYWdlLmNvZGUpKSB7XG4gICAgICAgICAgICBpbWFnZUh0bWwgPSBpbWFnZS5jb2RlO1xuICAgICAgICAgICAgdGhpcy5oYXNBbHQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGltYWdlSHRtbCA9IGA8aW1nIHNyYz1cIiR7dGhpcy5pbWFnZX1cIiBhbHQ9XCIke3RoaXMuZGVzY3JpcHRpb259XCI+YDtcbiAgICAgICAgICAgIHRoaXMuaGFzQWx0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChpbWFnZUh0bWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW1hZ2UgPSAoaW1hZ2VOYW1lOiBzdHJpbmcpOiBJSW1hZ2VzUHJlc2V0SXRlbSB8IHVuZGVmaW5lZCA9PlxuICAgICAgICBfZmluZCh0aGlzLmltYWdlcywgKGltZzogSUltYWdlc1ByZXNldEl0ZW0pID0+XG4gICAgICAgICAgICBfaXNFcXVhbChpbWcubmFtZSwgaW1hZ2VOYW1lKVxuICAgICAgICApO1xuXG4gICAgcHJpdmF0ZSBpc0ltYWdlU2l6ZVZhbGlkKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIF9pc051bWJlcihwYXJzZUZsb2F0KGlucHV0KSkgJiZcbiAgICAgICAgICAgIChfaW5jbHVkZXMoaW5wdXQsIFwicHhcIikgfHxcbiAgICAgICAgICAgICAgICBfaW5jbHVkZXMoaW5wdXQsIFwiJVwiKSB8fFxuICAgICAgICAgICAgICAgIF9pbmNsdWRlcyhpbnB1dCwgXCJhdXRvXCIpKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cIm51aS1pbWFnZSBudWktaW1hZ2VfX2hpZGRlblwiXG4gICAgW2lubmVySFRNTF09XCJpbWFnZVRlbXBsYXRlXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgW3N0eWxlLndpZHRoXT1cIndpZHRoXCJcbiAgICBbY2xhc3MubnVpLWltYWdlX19sZWZ0XT1cImZsb2F0ID09PSAnbGVmdCdcIlxuICAgIFtjbGFzcy5udWktaW1hZ2VfX3JpZ2h0XT1cImZsb2F0ID09PSAncmlnaHQnXCJcbiAgICBbY2xhc3MubnVpLWltYWdlX19tYXJnaW4tY2VudGVyZWRdPVwibWFyZ2luID09PSAnY2VudGVyZWQnXCJcbiAgICBbY2xhc3MubnVpLWltYWdlX19tYXJnaW4tc21hbGxdPVwibWFyZ2luID09PSAnc21hbGwnXCJcbiAgICBbY2xhc3MubnVpLWltYWdlX19tYXJnaW4tbGFyZ2VdPVwibWFyZ2luID09PSAnbGFyZ2UnXCJcbiAgICBbY2xhc3MubnVpLWltYWdlX193YXRlcm1hcmtlZF09XCJpc1dhdGVybWFya1wiXG4+PC9kaXY+XG4iXX0=