rb-letter-avatar
Version:
Angular letter avatar component
259 lines (258 loc) • 40.7 kB
JavaScript
import { Component, ElementRef, Input } from "@angular/core";
import { Attributes, LAmeta } from "./lameta";
export class RbLetterAvatarComponent {
constructor(el) {
this._meta = new LAmeta();
this.attribute = new Attributes();
this.base = "data:image/svg+xml;base64,";
this.charCount = "1";
this.letteravatar = el.nativeElement;
}
ngAfterViewInit() {
if (!this.alphabetcolors) {
this.alphabetcolors = this.getPropertyValue(this.attribute.alphabetcolors) ?
this.getPropertyValue(this.attribute.alphabetcolors) : this._meta.defaultColors;
}
if (!this.textColor) {
this.textColor = this.getPropertyValue(this.attribute.textColor) ?
this.getPropertyValue(this.attribute.textColor) : this._meta.defaultTextColor;
}
if (!this.avatarcustombgcolor) {
this.avatarcustombgcolor = this.getPropertyValue(this.attribute.avatarcustombgcolor);
}
if (!this.avatarborder) {
this.avatarborder = this.getPropertyValue(this.attribute.avatarborder) ?
this.getPropertyValue(this.attribute.avatarborder) : this._meta.defaultAvatarborder;
}
if (!this.defaultBorder) {
this.defaultBorder = this.getPropertyValue(this.attribute.defaultBorder) ?
this.getPropertyValue(this.attribute.defaultBorder) : this._meta.defaultBorder;
}
if (!this.triangleup) {
this.triangleup = this.getPropertyValue(this.attribute.triangleup) ?
this.getPropertyValue(this.attribute.triangleup) : this._meta.defaultTriangleup;
}
if (!this.fontsize) {
this.fontsize = this.getPropertyValue(this.attribute.fontsize) ?
this.getPropertyValue(this.attribute.fontsize) : this._meta.deafultFontsize;
}
if (!this.height) {
this.height = this.getPropertyValue(this.attribute.height) ?
this.getPropertyValue(this.attribute.height) : this._meta.defaultHeight;
}
if (!this.width) {
this.width = this.getPropertyValue(this.attribute.width) ?
this.getPropertyValue(this.attribute.width) : this._meta.deafultWidth;
}
if (!this.radius) {
this.radius = this.getPropertyValue(this.attribute.radius) ?
this.getPropertyValue(this.attribute.radius) : this._meta.defaultRadius;
}
if (!this.dynamic) {
this.dynamic = this.getPropertyValue(this.attribute.dynamic) ?
this.getPropertyValue(this.attribute.dynamic) : false;
}
if (!this.rotatedeg) {
this.rotatedeg = this.getPropertyValue(this.attribute.rotatedeg) ?
this.getPropertyValue(this.attribute.rotatedeg) : this._meta.defaultRotatedeg;
}
if (!this.fontWeight) {
this.fontWeight = this.getPropertyValue(this.attribute.fontWeight) ?
this.getPropertyValue(this.attribute.fontWeight) : this._meta.defaultFontWeight;
}
if (!this.fontFamily) {
this.fontFamily = this.getPropertyValue(this.attribute.fontFamily) ?
this.getPropertyValue(this.attribute.fontFamily) : this._meta.defaultFontFamily;
}
if (!this.shape) {
this.shape = this.getPropertyValue(this.attribute.shape);
}
if (!this.data) {
this.data = this.getPropertyValue(this.attribute.data);
}
this.createAvatar();
}
getPropertyValue(property) {
let result = "";
result = this.letteravatar.getAttribute(property);
return result;
}
createAvatar() {
let c = "";
if (this.charCount === "2") {
let _data = this.getFirstAndLastName(this.data.toUpperCase());
if (_data) {
c = _data;
}
else {
c = this.data.substring(0, +this.charCount).toUpperCase();
}
}
else {
c = this.data.substring(0, +this.charCount).toUpperCase();
}
let textTag = this.getCharacterTextTag(c, this.textColor, this.fontFamily, this.fontWeight, this.fontsize);
let colorIndex;
let color = "";
/**
* Populate the colors according to attributes
*/
if (c.charCodeAt(0) < 65) {
color = this.getRandomColors();
}
else {
colorIndex = Math.floor((c.charCodeAt(0) - 65) % this.alphabetcolors.length);
color = this.alphabetcolors[colorIndex];
}
if (this.avatarcustombgcolor) {
color = this.avatarcustombgcolor;
}
this.createSvg(this.width, this.height, color, textTag);
let lvcomponent = this.getLVText();
let svgHtml = window.btoa(unescape(encodeURIComponent(lvcomponent)));
let component;
let base = this.base;
let _style = "";
if (this.avatarBorderStyle) {
_style = this.avatarBorderStyle;
}
else if (this.avatarborder === "true") {
_style = this.defaultBorder;
}
if (this.rotatedeg !== "0") {
// tslint:disable-next-line:max-line-length
_style = "-ms-transform: rotate(" + this.rotatedeg + "deg); -webkit-transform: rotate(" + this.rotatedeg + "deg); transform: rotate(" + this.rotatedeg + "deg)";
}
if (this.shape) {
if (this.shape === "round") {
let round_style = this.radius + _style;
if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) {
let img_size = "width:" + this.width + "px;height:" + this.height + "px;";
component = "<img src=" + this.data + " style='" + img_size + round_style + "' />";
}
else {
component = "<img src=" + base + svgHtml + " style='" + round_style + "' title='" + this.data + "' />";
}
}
}
else {
if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) {
let img_size = "width:" + this.width + "px;height:" + this.height + "px;";
component = "<img src=" + this.data + " style='" + img_size + _style + "' />";
}
else {
component = "<img src=" + base + svgHtml + " style='" + _style + "' title='" + this.data + "' />";
}
}
this.letteravatar.innerHTML = component;
}
getLVText() {
let lvTag = document.createElement("div");
lvTag.appendChild(this.imageTag.cloneNode());
return this.imageTag.outerHTML;
}
/**
* Populate the svg tag which will used for the avatar generation
* @param width
* @param height
* @param color
* @returns
*/
createSvg(width, height, color, cobj) {
let svgTag = document.createElement("svg");
svgTag.setAttribute("xmlns", "http://www.w3.org/2000/svg");
svgTag.setAttribute("pointer-events", "none");
svgTag.setAttribute("width", width);
svgTag.setAttribute("height", height);
svgTag.setAttribute("style", "background-color:" + color + ";width:" + width + "px" + ";height:" + height + "px");
svgTag.appendChild(cobj);
this.imageTag = svgTag;
return svgTag.innerHTML;
}
/**
* Generate the Letter tag by using the svg text element
* @param character
* @param textColor
* @param fontFamily
* @param fontWeight
* @param fontsize
* @returns
*/
// tslint:disable-next-line:max-line-length
getCharacterTextTag(character, textColor, fontFamily, fontWeight, fontsize) {
let textTag = document.createElement("text");
textTag.setAttribute("text-anchor", "middle");
textTag.setAttribute("x", "50%");
textTag.setAttribute("y", "50%");
textTag.setAttribute("dy", "0.35em");
textTag.setAttribute("pointer-events", "auto");
textTag.setAttribute("fill", textColor);
textTag.setAttribute("font-family", fontFamily);
textTag.setAttribute("style", "font-weight:" + fontWeight + ";font-size:" + fontsize + "px");
textTag.innerText = character;
return textTag;
}
/**
* Get the random colors
* @returns
*/
getRandomColors() {
let letters = "0123456789ABCDEF".split("");
let _color = "#";
for (let i = 0; i < 6; i++) {
_color += letters[Math.floor(Math.random() * 16)];
}
return _color;
}
/**
* get the first name and last name first letters and combined and form the letter avatar
* @param data
* @returns
*/
getFirstAndLastName(data) {
let names = data.split(" ");
if (names && names.length >= 2) {
let firstName = names[0];
let lastName = names[1];
if (firstName && lastName) {
let text = firstName.substr(0, 1) + lastName.substr(0, 1);
return text;
}
else {
return data.substr(0, 2);
}
}
}
}
RbLetterAvatarComponent.decorators = [
{ type: Component, args: [{
selector: "rb-letter-avatar",
template: "<ng-content></ng-content>"
},] },
];
/** @nocollapse */
RbLetterAvatarComponent.ctorParameters = () => [
{ type: ElementRef, },
];
RbLetterAvatarComponent.propDecorators = {
"alphabetcolors": [{ type: Input, args: ["avatar-alphabet-colors",] },],
"textColor": [{ type: Input, args: ["avatar-text-color",] },],
"defaultBorder": [{ type: Input, args: ["avatar-default-border",] },],
"triangleup": [{ type: Input, args: ["avatar-triangle-up",] },],
"fontsize": [{ type: Input, args: ["avatar-font-size",] },],
"height": [{ type: Input, args: ["avatar-height",] },],
"width": [{ type: Input, args: ["avatar-width",] },],
"fontWeight": [{ type: Input, args: ["avatar-font-weight",] },],
"fontFamily": [{ type: Input, args: ["avatar-font-family",] },],
"radius": [{ type: Input, args: ["avatar-radius",] },],
"dynamic": [{ type: Input, args: ["avatar-dynamic",] },],
"rotatedeg": [{ type: Input, args: ["avatar-rotate-degree",] },],
"charCount": [{ type: Input, args: ["avatar-char-count",] },],
"data": [{ type: Input, args: ["avatar-data",] },],
"avatarBorderStyle": [{ type: Input, args: ["avatar-border-style",] },],
"avatarborder": [{ type: Input, args: ["avatar-border",] },],
"avatarcustomborder": [{ type: Input, args: ["avatar-custom-border",] },],
"shape": [{ type: Input, args: ["avatar-shape",] },],
"avatarcustombgcolor": [{ type: Input, args: ["avatar-custom-bg-color",] },],
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmItbGV0dGVyLWF2YXRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9yYi1sZXR0ZXItYXZhdGFyLyIsInNvdXJjZXMiOlsibGV0dGVyLWF2YXRhci9yYi1sZXR0ZXItYXZhdGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBaUIsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBUTlDLE1BQU07SUEyQkYsWUFBWSxFQUFjO3FCQXhCRixJQUFJLE1BQU0sRUFBRTt5QkFDSixJQUFJLFVBQVUsRUFBRTtvQkFXakMsNEJBQTRCO3lCQUlLLEdBQUc7UUFTL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQ3hDO0lBRUQsZUFBZTtRQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7U0FDdkY7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMs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QjsyQkFDMUIsS0FBSyxTQUFDLG9CQUFvQjt1QkFFMUIsS0FBSyxTQUFDLGVBQWU7d0JBQ3JCLEtBQUssU0FBQyxnQkFBZ0I7MEJBQ3RCLEtBQUssU0FBQyxzQkFBc0I7MEJBQzVCLEtBQUssU0FBQyxtQkFBbUI7cUJBQ3pCLEtBQUssU0FBQyxhQUFhO2tDQUNuQixLQUFLLFNBQUMscUJBQXFCOzZCQUMzQixLQUFLLFNBQUMsZUFBZTttQ0FDckIsS0FBSyxTQUFDLHNCQUFzQjtzQkFDNUIsS0FBSyxTQUFDLGNBQWM7b0NBQ3BCLEtBQUssU0FBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIExBbWV0YSB9IGZyb20gXCIuL2xhbWV0YVwiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiB1bmVzY2FwZSh4OiBzdHJpbmcpOiBzdHJpbmc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcInJiLWxldHRlci1hdmF0YXJcIixcclxuICAgIHRlbXBsYXRlOiBcIjxuZy1jb250ZW50PjwvbmctY29udGVudD5cIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmJMZXR0ZXJBdmF0YXJDb21wb25lbnQgIHtcclxuICAgIHByaXZhdGUgbGV0dGVyYXZhdGFyOiBhbnk7XHJcbiAgICBwcml2YXRlIGltYWdlVGFnOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX21ldGE6IExBbWV0YSA9IG5ldyBMQW1ldGEoKTtcclxuICAgIHByaXZhdGUgYXR0cmlidXRlOiBBdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICBASW5wdXQoXCJhdmF0YXItYWxwaGFiZXQtY29sb3JzXCIpIGFscGhhYmV0Y29sb3JzOiBzdHJpbmdbXTtcclxuICAgIEBJbnB1dChcImF2YXRhci10ZXh0LWNvbG9yXCIpIHRleHRDb2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWRlZmF1bHQtYm9yZGVyXCIpIGRlZmF1bHRCb3JkZXI6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci10cmlhbmdsZS11cFwiKSB0cmlhbmdsZXVwOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC1zaXplXCIpIGZvbnRzaXplOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItaGVpZ2h0XCIpIGhlaWdodDogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXdpZHRoXCIpIHdpZHRoOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC13ZWlnaHRcIikgZm9udFdlaWdodDogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWZvbnQtZmFtaWx5XCIpIGZvbnRGYW1pbHk6IHN0cmluZztcclxuICAgIGJhc2U6IHN0cmluZyA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxcIjtcclxuICAgIEBJbnB1dChcImF2YXRhci1yYWRpdXNcIikgcmFkaXVzOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZHluYW1pY1wiKSBkeW5hbWljOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItcm90YXRlLWRlZ3JlZVwiKSByb3RhdGVkZWc6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1jaGFyLWNvdW50XCIpIGNoYXJDb3VudDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZGF0YVwiKSBkYXRhOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItYm9yZGVyLXN0eWxlXCIpIGF2YXRhckJvcmRlclN0eWxlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItYm9yZGVyXCIpIGF2YXRhcmJvcmRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWN1c3RvbS1ib3JkZXJcIikgYXZhdGFyY3VzdG9tYm9yZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItc2hhcGVcIikgc2hhcGU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1jdXN0b20tYmctY29sb3JcIikgYXZhdGFyY3VzdG9tYmdjb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgdGhpcy5sZXR0ZXJhdmF0YXIgPSBlbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWxwaGFiZXRjb2xvcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5hbHBoYWJldGNvbG9ycyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hbHBoYWJldGNvbG9ycykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmFscGhhYmV0Y29sb3JzKSA6IHRoaXMuX21ldGEuZGVmYXVsdENvbG9ycztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRleHRDb2xvcikge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50ZXh0Q29sb3IpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50ZXh0Q29sb3IpIDogdGhpcy5fbWV0YS5kZWZhdWx0VGV4dENvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJjdXN0b21iZ2NvbG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hdmF0YXJib3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmF0YXJib3JkZXIgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYXZhdGFyYm9yZGVyKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYXZhdGFyYm9yZGVyKSA6IHRoaXMuX21ldGEuZGVmYXVsdEF2YXRhcmJvcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kZWZhdWx0Qm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJvcmRlciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kZWZhdWx0Qm9yZGVyKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZGVmYXVsdEJvcmRlcikgOiB0aGlzLl9tZXRhLmRlZmF1bHRCb3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy50cmlhbmdsZXVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJpYW5nbGV1cCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50cmlhbmdsZXVwKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUudHJpYW5nbGV1cCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRUcmlhbmdsZXVwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZm9udHNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb250c2l6ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250c2l6ZSkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRzaXplKSA6IHRoaXMuX21ldGEuZGVhZnVsdEZvbnRzaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmhlaWdodCkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmhlaWdodCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy53aWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLndpZHRoKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUud2lkdGgpIDogdGhpcy5fbWV0YS5kZWFmdWx0V2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5yYWRpdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucmFkaXVzKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucmFkaXVzKSA6IHRoaXMuX21ldGEuZGVmYXVsdFJhZGl1cztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWMpIHtcclxuICAgICAgICAgICAgdGhpcy5keW5hbWljID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmR5bmFtaWMpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5keW5hbWljKSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMucm90YXRlZGVnKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm90YXRlZGVnID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnJvdGF0ZWRlZykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnJvdGF0ZWRlZykgOiB0aGlzLl9tZXRhLmRlZmF1bHRSb3RhdGVkZWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250V2VpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFdlaWdodCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250V2VpZ2h0KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udFdlaWdodCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRGb250V2VpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZm9udEZhbWlseSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udEZhbWlseSkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRGYW1pbHkpIDogdGhpcy5fbWV0YS5kZWZhdWx0Rm9udEZhbWlseTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnNoYXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcGUgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuc2hhcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlQXZhdGFyKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0gXCJcIjtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLmxldHRlcmF2YXRhci5nZXRBdHRyaWJ1dGUocHJvcGVydHkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVBdmF0YXIoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhckNvdW50ID09PSBcIjJcIikge1xyXG4gICAgICAgICAgICBsZXQgX2RhdGE6IHN0cmluZyA9IHRoaXMuZ2V0Rmlyc3RBbmRMYXN0TmFtZSh0aGlzLmRhdGEudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYyA9IF9kYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYyA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCwgK3RoaXMuY2hhckNvdW50KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYyA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCwgK3RoaXMuY2hhckNvdW50KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdGV4dFRhZzogSFRNTEVsZW1lbnQgPSB0aGlzLmdldENoYXJhY3RlclRleHRUYWcoYywgdGhpcy50ZXh0Q29sb3IsIHRoaXMuZm9udEZhbWlseSwgdGhpcy5mb250V2VpZ2h0LCB0aGlzLmZvbnRzaXplKTtcclxuICAgICAgICBsZXQgY29sb3JJbmRleDogbnVtYmVyO1xyXG4gICAgICAgIGxldCBjb2xvcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUG9wdWxhdGUgdGhlIGNvbG9ycyBhY2NvcmRpbmcgdG8gYXR0cmlidXRlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChjLmNoYXJDb2RlQXQoMCkgPCA2NSkge1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuZ2V0UmFuZG9tQ29sb3JzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29sb3JJbmRleCA9IE1hdGguZmxvb3IoKGMuY2hhckNvZGVBdCgwKSAtIDY1KSAlIHRoaXMuYWxwaGFiZXRjb2xvcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgY29sb3IgPSB0aGlzLmFscGhhYmV0Y29sb3JzW2NvbG9ySW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvcikge1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBjb2xvciwgdGV4dFRhZyk7XHJcbiAgICAgICAgbGV0IGx2Y29tcG9uZW50OnN0cmluZyA9IHRoaXMuZ2V0TFZUZXh0KCk7XHJcbiAgICAgICAgbGV0IHN2Z0h0bWw6IHN0cmluZyA9IHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChsdmNvbXBvbmVudCkpKTtcclxuICAgICAgICBsZXQgY29tcG9uZW50OiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IGJhc2U6IHN0cmluZyA9IHRoaXMuYmFzZTtcclxuICAgICAgICBsZXQgX3N0eWxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0aGlzLmF2YXRhckJvcmRlclN0eWxlKSB7XHJcbiAgICAgICAgICAgIF9zdHlsZSA9IHRoaXMuYXZhdGFyQm9yZGVyU3R5bGU7XHJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuYXZhdGFyYm9yZGVyID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBfc3R5bGUgPSB0aGlzLmRlZmF1bHRCb3JkZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb3RhdGVkZWcgIT09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgX3N0eWxlID0gXCItbXMtdHJhbnNmb3JtOiByb3RhdGUoXCIgKyB0aGlzLnJvdGF0ZWRlZyArIFwiZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaGFwZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gXCJyb3VuZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm91bmRfc3R5bGU6IHN0cmluZyA9IHRoaXMucmFkaXVzICsgX3N0eWxlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbmRleE9mKFwiaHR0cFwiKSA+IC0xIHx8IHRoaXMuZGF0YS5pbmRleE9mKFwiZGF0YTppbWFnZVwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltZ19zaXplOiBzdHJpbmcgPSBcIndpZHRoOlwiICsgdGhpcy53aWR0aCArIFwicHg7aGVpZ2h0OlwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFwiPGltZyBzcmM9XCIgKyB0aGlzLmRhdGEgKyBcIiBzdHlsZT0nXCIgKyBpbWdfc2l6ZSArIHJvdW5kX3N0eWxlICsgXCInICAvPlwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgYmFzZSArIHN2Z0h0bWwgKyBcIiBzdHlsZT0nXCIgKyByb3VuZF9zdHlsZSArIFwiJyB0aXRsZT0nXCIgKyB0aGlzLmRhdGEgKyBcIicgLz5cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5kZXhPZihcImh0dHBcIikgPiAtMSB8fCB0aGlzLmRhdGEuaW5kZXhPZihcImRhdGE6aW1hZ2VcIikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGltZ19zaXplOiBzdHJpbmcgPSBcIndpZHRoOlwiICsgdGhpcy53aWR0aCArIFwicHg7aGVpZ2h0OlwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIHRoaXMuZGF0YSArIFwiIHN0eWxlPSdcIiArIGltZ19zaXplICsgX3N0eWxlICsgXCInICAvPlwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIGJhc2UgKyBzdmdIdG1sICsgXCIgc3R5bGU9J1wiICsgX3N0eWxlICsgXCInIHRpdGxlPSdcIiArIHRoaXMuZGF0YSArIFwiJyAvPlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxldHRlcmF2YXRhci5pbm5lckhUTUwgPSBjb21wb25lbnQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TFZUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGx2VGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgbHZUYWcuYXBwZW5kQ2hpbGQodGhpcy5pbWFnZVRhZy5jbG9uZU5vZGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VUYWcub3V0ZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUG9wdWxhdGUgdGhlIHN2ZyB0YWcgd2hpY2ggd2lsbCB1c2VkIGZvciB0aGUgYXZhdGFyIGdlbmVyYXRpb25cclxuICAgICAqIEBwYXJhbSB3aWR0aFxyXG4gICAgICogQHBhcmFtIGhlaWdodFxyXG4gICAgICogQHBhcmFtIGNvbG9yXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN2Zyh3aWR0aDogc3RyaW5nLCBoZWlnaHQ6IHN0cmluZywgY29sb3I6IHN0cmluZywgY29iajogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xyXG5cclxuICAgICAgICBsZXQgc3ZnVGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIik7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIik7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgd2lkdGgpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaGVpZ2h0KTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJiYWNrZ3JvdW5kLWNvbG9yOlwiICsgY29sb3IgKyBcIjt3aWR0aDpcIiArIHdpZHRoICsgXCJweFwiICsgXCI7aGVpZ2h0OlwiICsgaGVpZ2h0ICsgXCJweFwiKTtcclxuICAgICAgICBzdmdUYWcuYXBwZW5kQ2hpbGQoY29iaik7XHJcbiAgICAgICAgdGhpcy5pbWFnZVRhZyA9IHN2Z1RhZztcclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z1RhZy5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgR2VuZXJhdGUgdGhlIExldHRlciB0YWcgYnkgdXNpbmcgdGhlIHN2ZyB0ZXh0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXJcclxuICAgICAqIEBwYXJhbSB0ZXh0Q29sb3JcclxuICAgICAqIEBwYXJhbSBmb250RmFtaWx5XHJcbiAgICAgKiBAcGFyYW0gZm9udFdlaWdodFxyXG4gICAgICogQHBhcmFtIGZvbnRzaXplXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwcml2YXRlIGdldENoYXJhY3RlclRleHRUYWcoY2hhcmFjdGVyOnN0cmluZywgdGV4dENvbG9yOiBzdHJpbmcsIGZvbnRGYW1pbHk6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nLCBmb250c2l6ZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGxldCB0ZXh0VGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiNTAlXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwieVwiLCBcIjUwJVwiKTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcImR5XCIsIFwiMC4zNWVtXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwicG9pbnRlci1ldmVudHNcIiwgXCJhdXRvXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0ZXh0Q29sb3IpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZm9udEZhbWlseSk7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImZvbnQtd2VpZ2h0OlwiICsgZm9udFdlaWdodCArIFwiO2ZvbnQtc2l6ZTpcIiArIGZvbnRzaXplICsgXCJweFwiKTtcclxuICAgICAgICB0ZXh0VGFnLmlubmVyVGV4dCA9IGNoYXJhY3RlcjtcclxuICAgICAgICByZXR1cm4gdGV4dFRhZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcmFuZG9tIGNvbG9yc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRSYW5kb21Db2xvcnMoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbGV0dGVyczogc3RyaW5nW10gPSBcIjAxMjM0NTY3ODlBQkNERUZcIi5zcGxpdChcIlwiKTtcclxuICAgICAgICBsZXQgX2NvbG9yOiBzdHJpbmcgPSBcIiNcIjtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9jb2xvciArPSBsZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBnZXQgdGhlIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZSBmaXJzdCBsZXR0ZXJzIGFuZCBjb21iaW5lZCBhbmQgZm9ybSB0aGUgbGV0dGVyIGF2YXRhclxyXG4gICAgICogQHBhcmFtIGRhdGFcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Rmlyc3RBbmRMYXN0TmFtZShkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBkYXRhLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBpZiAobmFtZXMgJiYgbmFtZXMubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0TmFtZTogc3RyaW5nID0gbmFtZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBsYXN0TmFtZTogc3RyaW5nID0gbmFtZXNbMV07XHJcbiAgICAgICAgICAgIGlmIChmaXJzdE5hbWUgJiYgbGFzdE5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBmaXJzdE5hbWUuc3Vic3RyKDAsIDEpICsgbGFzdE5hbWUuc3Vic3RyKDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5zdWJzdHIoMCwgMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=