@nova-ui/bits
Version:
SolarWinds Nova Framework
148 lines • 28.8 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, Component, Input, ViewEncapsulation, } from "@angular/core";
import { DomSanitizer } from "@angular/platform-browser";
import _isInteger from "lodash/isInteger";
import isNil from "lodash/isNil";
import { IconService } from "./icon.service";
import { IconStatus } from "./types";
import * as i0 from "@angular/core";
import * as i1 from "./icon.service";
import * as i2 from "@angular/platform-browser";
import * as i3 from "@angular/common";
/**
* <example-url>./../examples/index.html#/icon</example-url>
*/
export class IconComponent {
static { this.SIZE_MAP = {
medium: "nui-icon-size-md",
small: "nui-icon-size-sm",
}; }
constructor(iconService, sanitizer) {
this.iconService = iconService;
this.sanitizer = sanitizer;
this.brushType = "filled";
this.fillContainer = false;
}
getIconByStatus(status) {
if (!status) {
return "";
}
return this.iconService.getStatusIcon(status);
}
get iconClass() {
const iconClass = ["nui-icon"];
if (!this.iconFound) {
iconClass.push("nui-icon-not-found");
}
else {
if (this.brushType) {
iconClass.push(this.brushType);
}
if (this.iconColor) {
iconClass.push("custom-icon-color", `${this.iconColor}-icon`);
}
if (this.iconHoverColor) {
iconClass.push(`${this.iconHoverColor}-hover-icon`);
}
const sizeClass = IconComponent.SIZE_MAP[this.iconSize];
if (sizeClass) {
iconClass.push(sizeClass);
}
if (this.cssClass) {
iconClass.push(this.cssClass);
}
if (this.fillContainer) {
iconClass.push("nui-icon--fill-container");
}
}
return iconClass.join(" ");
}
set counter(value) {
// eslint-disable-next-line no-undef-init
let counterAttrValue = undefined;
if (!isNil(value)) {
counterAttrValue = +value;
}
if (_isInteger(counterAttrValue)) {
this._counter = counterAttrValue;
}
else {
this._counter = undefined;
}
}
get counter() {
// Using isNil to prevent toString of undefined error
return isNil(this._counter) ? this._counter : this._counter.toString();
}
ngOnChanges(changes) {
if (changes["status"] || changes["childStatus"] || changes["icon"]) {
this.generateIcon();
}
}
generateIcon() {
this.iconData = this.iconService.getIconData(this.icon);
this.iconFound = !!this.iconData;
let resultingSvg = `<div class='nui-icon-item'>${(this.iconData && this.iconData.code) ?? ""}</div>`;
if (this.status) {
resultingSvg += `<div class="nui-icon-item nui-icon-item__child">
${this.getIconByStatus(this.status)}
</div>`;
}
if (this.childStatus) {
resultingSvg += `<div class="nui-icon-item nui-icon-item__grand-child">
${this.getIconByStatus(this.childStatus)}
</div>`;
}
this.resultingSvg =
this.sanitizer.bypassSecurityTrustHtml(resultingSvg);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, deps: [{ token: i1.IconService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: IconComponent, selector: "nui-icon", inputs: { iconColor: "iconColor", brushType: "brushType", iconHoverColor: "iconHoverColor", iconSize: "iconSize", cssClass: "cssClass", fillContainer: "fillContainer", status: "status", childStatus: "childStatus", icon: "icon", counter: "counter" }, host: { attributes: { "role": "img" }, properties: { "attr.aria-label": "icon + ' icon'" }, classAttribute: "nui-icon-wrapper" }, usesOnChanges: true, ngImport: i0, template: "<i\n [ngClass]=\"iconClass\"\n [attr.icon]=\"icon\"\n [attr.counter]=\"counter\"\n [attr.status]=\"status | lowercase\"\n>\n <div class=\"nui-svg-wrapper\" [innerHTML]=\"resultingSvg\"></div>\n</i>\n", styles: [".nui-icon-wrapper{display:inline-flex}.nui-icon-wrapper .nui-svg-wrapper{position:relative}.nui-icon-wrapper .nui-icon-item{position:absolute;top:0;left:0;display:flex}.nui-icon-wrapper .nui-icon-item__child{position:absolute;top:8px;left:8px;z-index:1;transform:scale(.75) translate(-2.5px,-2.5px)}.nui-icon-wrapper .nui-icon-item__grand-child{position:absolute;top:14px;left:14px;z-index:2;transform:scale(.5) translate(-9.5px,-9.5px)}.nui-icon{width:16px;height:16px;background-size:16px;vertical-align:middle;background-repeat:no-repeat;line-height:1.66666667;position:relative}.nui-icon svg{width:16px;height:16px;display:inline-block;background-repeat:no-repeat;line-height:1.66666667}.nui-icon.nui-icon-line-height,.nui-icon.nui-icon-line-height i.nui-icon{line-height:1}.nui-icon.nui-icon-line-height svg{line-height:1}.nui-icon.nui-icon-size-sm svg{width:12px;height:12px}.nui-icon.nui-icon-size-md svg{width:20px;height:20px}.nui-icon.white-icon.stroked svg *,.nui-icon.white-hover-icon.stroked:hover svg *{stroke:var(--nui-color-bg-light,#fff)}.nui-icon.white-icon.filled svg *,.nui-icon.white-hover-icon.filled:hover svg *{fill:var(--nui-color-bg-light,#fff)}.nui-icon.gray-icon.stroked svg *,.nui-icon.gray-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-default,rgba(17, 17, 17, .5))}.nui-icon.gray-icon.filled svg *,.nui-icon.gray-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-default,rgba(17, 17, 17, .5))}.nui-icon.primary-black-icon.stroked svg *,.nui-icon.primary-black-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-highlight-default,#111)}.nui-icon.black-icon.filled svg *,.nui-icon.black-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-highlight-default,#111)}.nui-icon.primary-blue-icon.stroked svg *,.nui-icon.primary-blue-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-active,#0079aa)}.nui-icon.primary-blue-icon.filled svg *,.nui-icon.primary-blue-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-active,#0079aa)}.nui-icon.orange-icon.filled svg *,.nui-icon.orange-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-highlight-platform_bar,#f99d1c)}.nui-icon.orange-icon.stroked svg *,.nui-icon.orange-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-highlight-platform_bar,#f99d1c)}.nui-icon.red-icon.filled svg *,.nui-icon.red-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-critical,#dd2c00)}.nui-icon.red-icon.stroked svg *,.nui-icon.red-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-critical,#dd2c00)}.nui-icon.disabled-gray-icon.filled svg *,.nui-icon.red-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-disabled,rgba(17, 17, 17, .3))}.nui-icon.disabled-gray-icon.stroked svg *,.nui-icon.red-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-disabled,rgba(17, 17, 17, .3))}.nui-icon.nui-icon-not-found{background-color:#f0f}.nui-icon[status]:not([status=\"\"]):after{content:\"\"}.nui-icon[counter]:not([counter=\"\"]):after{border-radius:50%;content:attr(counter);background:#0079aa no-repeat;background:var(--nui-color-active, #0079aa) no-repeat}.nui-icon:after{display:inline-block;background-repeat:no-repeat;position:relative;vertical-align:middle;text-align:center;font-style:normal;color:var(--nui-color-bg-light,#fff);width:12px;height:12px;background-size:12px;line-height:12px;font-size:8px}.nui-icon[status]:not([status=\"\"]),.nui-icon[counter]:not([counter=\"\"]){margin-right:10px}.nui-icon[status]:not([status=\"\"]):after,.nui-icon[counter]:not([counter=\"\"]):after{position:absolute;top:8px;left:8px}.nui-icon.nui-icon-size-sm{width:12px;height:12px;background-size:12px;line-height:1}.nui-icon.nui-icon-size-sm:after{width:12px;height:12px;background-size:12px;line-height:12px;font-size:8px}.nui-icon.nui-icon-size-sm[status]:not([status=\"\"]):after,.nui-icon.nui-icon-size-sm[counter]:not([counter=\"\"]):after{position:absolute;top:6px;left:6px}.nui-icon.nui-icon-size-md{width:20px;height:20px;background-size:20px;line-height:1}.nui-icon.nui-icon-size-md:after{width:20px;height:20px;background-size:20px;line-height:20px;font-size:16px / 2}.nui-icon.nui-icon-size-md[status]:not([status=\"\"]):after,.nui-icon.nui-icon-size-md[counter]:not([counter=\"\"]):after{position:absolute;top:10px;left:10px}.nui-icon.nui-icon--fill-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;margin-top:0}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.LowerCasePipe, name: "lowercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, decorators: [{
type: Component,
args: [{ selector: "nui-icon", changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: "nui-icon-wrapper",
role: "img",
"[attr.aria-label]": "icon + ' icon'",
}, encapsulation: ViewEncapsulation.None, template: "<i\n [ngClass]=\"iconClass\"\n [attr.icon]=\"icon\"\n [attr.counter]=\"counter\"\n [attr.status]=\"status | lowercase\"\n>\n <div class=\"nui-svg-wrapper\" [innerHTML]=\"resultingSvg\"></div>\n</i>\n", styles: [".nui-icon-wrapper{display:inline-flex}.nui-icon-wrapper .nui-svg-wrapper{position:relative}.nui-icon-wrapper .nui-icon-item{position:absolute;top:0;left:0;display:flex}.nui-icon-wrapper .nui-icon-item__child{position:absolute;top:8px;left:8px;z-index:1;transform:scale(.75) translate(-2.5px,-2.5px)}.nui-icon-wrapper .nui-icon-item__grand-child{position:absolute;top:14px;left:14px;z-index:2;transform:scale(.5) translate(-9.5px,-9.5px)}.nui-icon{width:16px;height:16px;background-size:16px;vertical-align:middle;background-repeat:no-repeat;line-height:1.66666667;position:relative}.nui-icon svg{width:16px;height:16px;display:inline-block;background-repeat:no-repeat;line-height:1.66666667}.nui-icon.nui-icon-line-height,.nui-icon.nui-icon-line-height i.nui-icon{line-height:1}.nui-icon.nui-icon-line-height svg{line-height:1}.nui-icon.nui-icon-size-sm svg{width:12px;height:12px}.nui-icon.nui-icon-size-md svg{width:20px;height:20px}.nui-icon.white-icon.stroked svg *,.nui-icon.white-hover-icon.stroked:hover svg *{stroke:var(--nui-color-bg-light,#fff)}.nui-icon.white-icon.filled svg *,.nui-icon.white-hover-icon.filled:hover svg *{fill:var(--nui-color-bg-light,#fff)}.nui-icon.gray-icon.stroked svg *,.nui-icon.gray-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-default,rgba(17, 17, 17, .5))}.nui-icon.gray-icon.filled svg *,.nui-icon.gray-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-default,rgba(17, 17, 17, .5))}.nui-icon.primary-black-icon.stroked svg *,.nui-icon.primary-black-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-highlight-default,#111)}.nui-icon.black-icon.filled svg *,.nui-icon.black-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-highlight-default,#111)}.nui-icon.primary-blue-icon.stroked svg *,.nui-icon.primary-blue-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-active,#0079aa)}.nui-icon.primary-blue-icon.filled svg *,.nui-icon.primary-blue-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-active,#0079aa)}.nui-icon.orange-icon.filled svg *,.nui-icon.orange-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-highlight-platform_bar,#f99d1c)}.nui-icon.orange-icon.stroked svg *,.nui-icon.orange-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-highlight-platform_bar,#f99d1c)}.nui-icon.red-icon.filled svg *,.nui-icon.red-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-critical,#dd2c00)}.nui-icon.red-icon.stroked svg *,.nui-icon.red-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-critical,#dd2c00)}.nui-icon.disabled-gray-icon.filled svg *,.nui-icon.red-hover-icon.filled:hover svg *{fill:var(--nui-color-icon-disabled,rgba(17, 17, 17, .3))}.nui-icon.disabled-gray-icon.stroked svg *,.nui-icon.red-hover-icon.stroked:hover svg *{stroke:var(--nui-color-icon-disabled,rgba(17, 17, 17, .3))}.nui-icon.nui-icon-not-found{background-color:#f0f}.nui-icon[status]:not([status=\"\"]):after{content:\"\"}.nui-icon[counter]:not([counter=\"\"]):after{border-radius:50%;content:attr(counter);background:#0079aa no-repeat;background:var(--nui-color-active, #0079aa) no-repeat}.nui-icon:after{display:inline-block;background-repeat:no-repeat;position:relative;vertical-align:middle;text-align:center;font-style:normal;color:var(--nui-color-bg-light,#fff);width:12px;height:12px;background-size:12px;line-height:12px;font-size:8px}.nui-icon[status]:not([status=\"\"]),.nui-icon[counter]:not([counter=\"\"]){margin-right:10px}.nui-icon[status]:not([status=\"\"]):after,.nui-icon[counter]:not([counter=\"\"]):after{position:absolute;top:8px;left:8px}.nui-icon.nui-icon-size-sm{width:12px;height:12px;background-size:12px;line-height:1}.nui-icon.nui-icon-size-sm:after{width:12px;height:12px;background-size:12px;line-height:12px;font-size:8px}.nui-icon.nui-icon-size-sm[status]:not([status=\"\"]):after,.nui-icon.nui-icon-size-sm[counter]:not([counter=\"\"]):after{position:absolute;top:6px;left:6px}.nui-icon.nui-icon-size-md{width:20px;height:20px;background-size:20px;line-height:1}.nui-icon.nui-icon-size-md:after{width:20px;height:20px;background-size:20px;line-height:20px;font-size:16px / 2}.nui-icon.nui-icon-size-md[status]:not([status=\"\"]):after,.nui-icon.nui-icon-size-md[counter]:not([counter=\"\"]):after{position:absolute;top:10px;left:10px}.nui-icon.nui-icon--fill-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;margin-top:0}\n"] }]
}], ctorParameters: () => [{ type: i1.IconService }, { type: i2.DomSanitizer }], propDecorators: { iconColor: [{
type: Input
}], brushType: [{
type: Input
}], iconHoverColor: [{
type: Input
}], iconSize: [{
type: Input
}], cssClass: [{
type: Input
}], fillContainer: [{
type: Input
}], status: [{
type: Input
}], childStatus: [{
type: Input
}], icon: [{
type: Input
}], counter: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ljb24vaWNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2ljb24vaWNvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQVksVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7OztBQUUvQzs7R0FFRztBQWNILE1BQU0sT0FBTyxhQUFhO2FBQ1IsYUFBUSxHQUE4QjtRQUNoRCxNQUFNLEVBQUUsa0JBQWtCO1FBQzFCLEtBQUssRUFBRSxrQkFBa0I7S0FDNUIsQUFIcUIsQ0FHcEI7SUEyQkYsWUFDWSxXQUF3QixFQUN4QixTQUF1QjtRQUR2QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBeEJuQyxjQUFTLEdB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LFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUM3QyxRQUFRLENBQUM7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixZQUFZLElBQUk7c0NBQ1UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3VDQUNoQyxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLFlBQVksSUFBSTswQ0FDYyxJQUFJLENBQUMsZUFBZSxDQUNsQixJQUFJLENBQUMsV0FBVyxDQUNuQjt3Q0FDRCxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLFlBQVk7WUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdELENBQUM7K0dBN0hRLGFBQWE7bUdBQWIsYUFBYSxpY0NuRDFCLHdOQVFBOzs0RkQyQ2EsYUFBYTtrQkFaekIsU0FBUzsrQkFDSSxVQUFVLG1CQUVILHVCQUF1QixDQUFDLE1BQU0sUUFDekM7d0JBQ0YsS0FBSyxFQUFFLGtCQUFrQjt3QkFDekIsSUFBSSxFQUFFLEtBQUs7d0JBQ1gsbUJBQW1CLEVBQUUsZ0JBQWdCO3FCQUN4QyxpQkFFYyxpQkFBaUIsQ0FBQyxJQUFJOzJHQVNyQyxTQUFTO3NCQURSLEtBQUs7Z0JBR04sU0FBUztzQkFEUixLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUs7Z0JBR04sUUFBUTtzQkFEUCxLQUFLO2dCQUdOLGFBQWE7c0JBRFosS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBR04sV0FBVztzQkFEVixLQUFLO2dCQUdOLElBQUk7c0JBREgsS0FBSztnQkF3REYsT0FBTztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwibG9kYXNoL2lzSW50ZWdlclwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcblxuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tIFwiLi9pY29uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEljb25EYXRhLCBJY29uU3RhdHVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiA8ZXhhbXBsZS11cmw+Li8uLi9leGFtcGxlcy9pbmRleC5odG1sIy9pY29uPC9leGFtcGxlLXVybD5cbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktaWNvblwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vaWNvbi5jb21wb25lbnQuaHRtbFwiLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6IFwibnVpLWljb24td3JhcHBlclwiLFxuICAgICAgICByb2xlOiBcImltZ1wiLFxuICAgICAgICBcIlthdHRyLmFyaWEtbGFiZWxdXCI6IFwiaWNvbiArICcgaWNvbidcIixcbiAgICB9LFxuICAgIHN0eWxlVXJsczogW1wiLi9pY29uLmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIHB1YmxpYyBzdGF0aWMgU0laRV9NQVA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1lZGl1bTogXCJudWktaWNvbi1zaXplLW1kXCIsXG4gICAgICAgIHNtYWxsOiBcIm51aS1pY29uLXNpemUtc21cIixcbiAgICB9O1xuXG4gICAgQElucHV0KClcbiAgICBpY29uQ29sb3I6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIGJydXNoVHlwZTogc3RyaW5nID0gXCJmaWxsZWRcIjtcbiAgICBASW5wdXQoKVxuICAgIGljb25Ib3ZlckNvbG9yOiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBpY29uU2l6ZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgY3NzQ2xhc3M6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIGZpbGxDb250YWluZXIgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb3VudGVyPzogbnVtYmVyO1xuICAgIEBJbnB1dCgpXG4gICAgc3RhdHVzOiBJY29uU3RhdHVzO1xuICAgIEBJbnB1dCgpXG4gICAgY2hpbGRTdGF0dXM6IEljb25TdGF0dXM7XG4gICAgQElucHV0KClcbiAgICBpY29uOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgcmVzdWx0aW5nU3ZnOiBTYWZlSHRtbDtcblxuICAgIHByaXZhdGUgaWNvbkZvdW5kOiBib29sZWFuO1xuICAgIHByaXZhdGUgaWNvbkRhdGE6IEljb25EYXRhO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaWNvblNlcnZpY2U6IEljb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICAgKSB7fVxuXG4gICAgZ2V0SWNvbkJ5U3RhdHVzKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLmdldFN0YXR1c0ljb24oc3RhdHVzKTtcbiAgICB9XG5cbiAgICBnZXQgaWNvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGljb25DbGFzczogc3RyaW5nW10gPSBbXCJudWktaWNvblwiXTtcblxuICAgICAgICBpZiAoIXRoaXMuaWNvbkZvdW5kKSB7XG4gICAgICAgICAgICBpY29uQ2xhc3MucHVzaChcIm51aS1pY29uLW5vdC1mb3VuZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJydXNoVHlwZSkge1xuICAgICAgICAgICAgICAgIGljb25DbGFzcy5wdXNoKHRoaXMuYnJ1c2hUeXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaWNvbkNvbG9yKSB7XG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzLnB1c2goXCJjdXN0b20taWNvbi1jb2xvclwiLCBgJHt0aGlzLmljb25Db2xvcn0taWNvbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pY29uSG92ZXJDb2xvcikge1xuICAgICAgICAgICAgICAgIGljb25DbGFzcy5wdXNoKGAke3RoaXMuaWNvbkhvdmVyQ29sb3J9LWhvdmVyLWljb25gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2l6ZUNsYXNzID0gSWNvbkNvbXBvbmVudC5TSVpFX01BUFt0aGlzLmljb25TaXplXTtcbiAgICAgICAgICAgIGlmIChzaXplQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBpY29uQ2xhc3MucHVzaChzaXplQ2xhc3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jc3NDbGFzcykge1xuICAgICAgICAgICAgICAgIGljb25DbGFzcy5wdXNoKHRoaXMuY3NzQ2xhc3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maWxsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzLnB1c2goXCJudWktaWNvbi0tZmlsbC1jb250YWluZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWNvbkNsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvdW50ZXIodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYtaW5pdFxuICAgICAgICBsZXQgY291bnRlckF0dHJWYWx1ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIWlzTmlsKHZhbHVlKSkge1xuICAgICAgICAgICAgY291bnRlckF0dHJWYWx1ZSA9ICt2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfaXNJbnRlZ2VyKGNvdW50ZXJBdHRyVmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb3VudGVyID0gY291bnRlckF0dHJWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY291bnRlcigpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBVc2luZyBpc05pbCB0byBwcmV2ZW50IHRvU3RyaW5nIG9mIHVuZGVmaW5lZCBlcnJvclxuICAgICAgICByZXR1cm4gaXNOaWwodGhpcy5fY291bnRlcikgPyB0aGlzLl9jb3VudGVyIDogdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzW1wic3RhdHVzXCJdIHx8IGNoYW5nZXNbXCJjaGlsZFN0YXR1c1wiXSB8fCBjaGFuZ2VzW1wiaWNvblwiXSkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUljb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJY29uKCkge1xuICAgICAgICB0aGlzLmljb25EYXRhID0gdGhpcy5pY29uU2VydmljZS5nZXRJY29uRGF0YSh0aGlzLmljb24pO1xuICAgICAgICB0aGlzLmljb25Gb3VuZCA9ICEhdGhpcy5pY29uRGF0YTtcbiAgICAgICAgbGV0IHJlc3VsdGluZ1N2ZyA9IGA8ZGl2IGNsYXNzPSdudWktaWNvbi1pdGVtJz4ke1xuICAgICAgICAgICAgKHRoaXMuaWNvbkRhdGEgJiYgdGhpcy5pY29uRGF0YS5jb2RlKSA/PyBcIlwiXG4gICAgICAgIH08L2Rpdj5gO1xuICAgICAgICBpZiAodGhpcy5zdGF0dXMpIHtcbiAgICAgICAgICAgIHJlc3VsdGluZ1N2ZyArPSBgPGRpdiBjbGFzcz1cIm51aS1pY29uLWl0ZW0gbnVpLWljb24taXRlbV9fY2hpbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5nZXRJY29uQnlTdGF0dXModGhpcy5zdGF0dXMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoaWxkU3RhdHVzKSB7XG4gICAgICAgICAgICByZXN1bHRpbmdTdmcgKz0gYDxkaXYgY2xhc3M9XCJudWktaWNvbi1pdGVtIG51aS1pY29uLWl0ZW1fX2dyYW5kLWNoaWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmdldEljb25CeVN0YXR1cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZFN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0aW5nU3ZnID1cbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHJlc3VsdGluZ1N2Zyk7XG4gICAgfVxufVxuIiwiPGlcbiAgICBbbmdDbGFzc109XCJpY29uQ2xhc3NcIlxuICAgIFthdHRyLmljb25dPVwiaWNvblwiXG4gICAgW2F0dHIuY291bnRlcl09XCJjb3VudGVyXCJcbiAgICBbYXR0ci5zdGF0dXNdPVwic3RhdHVzIHwgbG93ZXJjYXNlXCJcbj5cbiAgICA8ZGl2IGNsYXNzPVwibnVpLXN2Zy13cmFwcGVyXCIgW2lubmVySFRNTF09XCJyZXN1bHRpbmdTdmdcIj48L2Rpdj5cbjwvaT5cbiJdfQ==