ng-cw-v12
Version:
Angular UI component library
137 lines • 25.5 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class MagicCardDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.ncGradientSize = 200; // 渐变大小,单位px
this.ncGradientColor = '#D9D9D955'; // 内部渐变颜色
this.ncGradientOpacity = 0.8; // 内部渐变透明度
this.ncGradientFrom = '#9E7AFF'; // 边框渐变开始颜色
this.ncGradientTo = '#FE8BBB'; // 边框渐变结束颜色
this.ncCardBackground = 'white'; // 卡片背景颜色
this.mouseX = -200;
this.mouseY = -200;
this.handleMouseEnter = () => {
this.renderer.setStyle(this.borderElement, 'opacity', '1');
this.renderer.setStyle(this.gradientElement, 'opacity', this.ncGradientOpacity.toString());
};
this.handleMouseMove = (e) => {
const rect = this.el.nativeElement.getBoundingClientRect();
this.mouseX = e.clientX - rect.left;
this.mouseY = e.clientY - rect.top;
this.updateGradients();
};
this.handleMouseLeave = () => {
this.mouseX = -this.ncGradientSize;
this.mouseY = -this.ncGradientSize;
this.updateGradients();
this.renderer.setStyle(this.borderElement, 'opacity', '0');
this.renderer.setStyle(this.gradientElement, 'opacity', '0');
};
}
ngOnInit() {
this.setupMagicCard();
this.addEventListeners();
this.initializeMousePosition();
}
setupMagicCard() {
const element = this.el.nativeElement;
// 设置主容器样式
const elementPosition = element.style.position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(element, 'position', 'relative');
}
this.renderer.addClass(element, 'nc-magic-card');
// 获取容器的边框宽度
const computedStyle = getComputedStyle(element);
const borderTopWidth = parseFloat(computedStyle.borderTopWidth) || 0;
const borderRightWidth = parseFloat(computedStyle.borderRightWidth) || 0;
const borderBottomWidth = parseFloat(computedStyle.borderBottomWidth) || 0;
const borderLeftWidth = parseFloat(computedStyle.borderLeftWidth) || 0;
// 如果没有边框,默认使用1px
const maxBorderWidth = Math.max(borderTopWidth, borderRightWidth, borderBottomWidth, borderLeftWidth);
const borderWidth = maxBorderWidth > 0 ? maxBorderWidth : 1;
// 创建边框元素 - 根据实际边框宽度向外扩展
this.borderElement = this.renderer.createElement('div');
this.renderer.addClass(this.borderElement, 'nc-magic-card-border');
this.renderer.setStyle(this.borderElement, 'pointer-events', 'none');
this.renderer.setStyle(this.borderElement, 'position', 'absolute');
this.renderer.setStyle(this.borderElement, 'inset', `-${borderWidth}px`); // 根据边框宽度动态设置
this.renderer.setStyle(this.borderElement, 'border-radius', 'inherit');
this.renderer.setStyle(this.borderElement, 'transition', 'opacity 300ms ease');
this.renderer.setStyle(this.borderElement, 'opacity', '0');
this.renderer.setStyle(this.borderElement, 'z-index', '1');
// 创建背景元素 - 隐藏边框层的内部区域
this.backgroundElement = this.renderer.createElement('div');
this.renderer.addClass(this.backgroundElement, 'nc-magic-card-background');
this.renderer.setStyle(this.backgroundElement, 'pointer-events', 'none');
this.renderer.setStyle(this.backgroundElement, 'position', 'absolute');
this.renderer.setStyle(this.backgroundElement, 'inset', '0');
this.renderer.setStyle(this.backgroundElement, 'border-radius', 'inherit');
this.renderer.setStyle(this.backgroundElement, 'background-color', this.ncCardBackground);
this.renderer.setStyle(this.backgroundElement, 'z-index', '2');
// 创建渐变元素
this.gradientElement = this.renderer.createElement('div');
this.renderer.addClass(this.gradientElement, 'nc-magic-card-gradient');
this.renderer.setStyle(this.gradientElement, 'pointer-events', 'none');
this.renderer.setStyle(this.gradientElement, 'position', 'absolute');
this.renderer.setStyle(this.gradientElement, 'inset', '0');
this.renderer.setStyle(this.gradientElement, 'border-radius', 'inherit');
this.renderer.setStyle(this.gradientElement, 'transition', 'opacity 300ms ease');
this.renderer.setStyle(this.gradientElement, 'opacity', '0');
this.renderer.setStyle(this.gradientElement, 'z-index', '4');
// 原始内容位于背景层之上,渐变层之下
const children = Array.from(element.children);
children.forEach((child) => {
this.renderer.setStyle(child, 'position', 'relative');
this.renderer.setStyle(child, 'z-index', '3');
});
// 添加效果层到原始元素
this.renderer.appendChild(element, this.borderElement);
this.renderer.appendChild(element, this.backgroundElement);
this.renderer.appendChild(element, this.gradientElement);
}
addEventListeners() {
const element = this.el.nativeElement;
this.renderer.listen(element, 'mousemove', this.handleMouseMove);
this.renderer.listen(element, 'mouseleave', this.handleMouseLeave);
this.renderer.listen(element, 'mouseenter', this.handleMouseEnter);
}
initializeMousePosition() {
this.mouseX = -this.ncGradientSize;
this.mouseY = -this.ncGradientSize;
this.updateGradients();
}
updateGradients() {
if (this.borderElement && this.gradientElement) {
// 更新边框渐变
const borderGradient = `radial-gradient(${this.ncGradientSize}px circle at ${this.mouseX}px ${this.mouseY}px, ${this.ncGradientFrom}, ${this.ncGradientTo}, transparent 100%)`;
this.renderer.setStyle(this.borderElement, 'background', borderGradient);
// 更新内部渐变
const innerGradient = `radial-gradient(${this.ncGradientSize}px circle at ${this.mouseX}px ${this.mouseY}px, ${this.ncGradientColor}, transparent 100%)`;
this.renderer.setStyle(this.gradientElement, 'background', innerGradient);
}
}
}
MagicCardDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MagicCardDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
MagicCardDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: MagicCardDirective, selector: "[ncMagicCard]", inputs: { ncGradientSize: "ncGradientSize", ncGradientColor: "ncGradientColor", ncGradientOpacity: "ncGradientOpacity", ncGradientFrom: "ncGradientFrom", ncGradientTo: "ncGradientTo", ncCardBackground: "ncCardBackground" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MagicCardDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncMagicCard]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncGradientSize: [{
type: Input
}], ncGradientColor: [{
type: Input
}], ncGradientOpacity: [{
type: Input
}], ncGradientFrom: [{
type: Input
}], ncGradientTo: [{
type: Input
}], ncCardBackground: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFnaWMtY2FyZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL21hZ2ljLWNhcmQvbWFnaWMtY2FyZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtoRixNQUFNLE9BQU8sa0JBQWtCO0lBa0M3QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFqQ3RELG1CQUFjLEdBQVcsR0FBRyxDQUFDLENBQUEsWUFBWTtRQUN6QyxvQkFBZSxHQUFXLFdBQVcsQ0FBQyxDQUFBLFNBQVM7UUFDL0Msc0JBQWlCLEdBQVcsR0FBRyxDQUFDLENBQUEsVUFBVTtRQUMxQyxtQkFBYyxHQUFXLFNBQVMsQ0FBQyxDQUFBLFdBQVc7UUFDOUMsaUJBQVksR0FBVyxTQUFTLENBQUMsQ0FBQSxXQUFXO1FBQzVDLHFCQUFnQixHQUFXLE9BQU8sQ0FBQyxDQUFBLFNBQVM7UUFFN0MsV0FBTSxHQUFXLENBQUMsR0FBRyxDQUFDO1FBQ3RCLFdBQU0sR0FBVyxDQUFDLEdBQUcsQ0FBQztRQUt0QixxQkFBZ0IsR0FBRyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0YsQ0FBQyxDQUFDO1FBRU0sb0JBQWUsR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQztRQUVNLHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDO0lBRWdFLENBQUM7SUFFbkUsUUFBUTtRQUNOLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUV0QyxVQUFVO1FBQ1YsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLEtBQUssUUFBUSxFQUFFO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFakQsWUFBWTtRQUNaLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RSxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0UsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkUsaUJBQWlCO1FBQ2pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sV0FBVyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDdkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUzRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvRCxTQUFTO1FBQ1QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTdELG9CQUFvQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsYUFBYTtRQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDOUMsU0FBUztZQUNULE1BQU0sY0FBYyxHQUFHLG1CQUFtQixJQUFJLENBQUMsY0FBYyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sTUFBTSxJQUFJLENBQUMsTUFBTSxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLFlBQVkscUJBQXFCLENBQUM7WUFDL0ssSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFekUsU0FBUztZQUNULE1BQU0sYUFBYSxHQUFHLG1CQUFtQixJQUFJLENBQUMsY0FBYyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sTUFBTSxJQUFJLENBQUMsTUFBTSxPQUFPLElBQUksQ0FBQyxlQUFlLHFCQUFxQixDQUFDO1lBQ3pKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQzs7K0dBbklVLGtCQUFrQjttR0FBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBSDlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO3lIQUVVLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuY01hZ2ljQ2FyZF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYWdpY0NhcmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG5jR3JhZGllbnRTaXplOiBudW1iZXIgPSAyMDA7Ly8g5riQ5Y+Y5aSn5bCP77yM5Y2V5L2NcHhcclxuICBASW5wdXQoKSBuY0dyYWRpZW50Q29sb3I6IHN0cmluZyA9ICcjRDlEOUQ5NTUnOy8vIOWGhemDqOa4kOWPmOminOiJslxyXG4gIEBJbnB1dCgpIG5jR3JhZGllbnRPcGFjaXR5OiBudW1iZXIgPSAwLjg7Ly8g5YaF6YOo5riQ5Y+Y6YCP5piO5bqmXHJcbiAgQElucHV0KCkgbmNHcmFkaWVudEZyb206IHN0cmluZyA9ICcjOUU3QUZGJzsvLyDovrnmoYbmuJDlj5jlvIDlp4vpopzoibJcclxuICBASW5wdXQoKSBuY0dyYWRpZW50VG86IHN0cmluZyA9ICcjRkU4QkJCJzsvLyDovrnmoYbmuJDlj5jnu5PmnZ/popzoibJcclxuICBASW5wdXQoKSBuY0NhcmRCYWNrZ3JvdW5kOiBzdHJpbmcgPSAnd2hpdGUnOy8vIOWNoeeJh+iDjOaZr+minOiJslxyXG5cclxuICBwcml2YXRlIG1vdXNlWDogbnVtYmVyID0gLTIwMDtcclxuICBwcml2YXRlIG1vdXNlWTogbnVtYmVyID0gLTIwMDtcclxuICBwcml2YXRlIGJvcmRlckVsZW1lbnQhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIGJhY2tncm91bmRFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBncmFkaWVudEVsZW1lbnQhOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUVudGVyID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICdvcGFjaXR5JywgJzEnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ncmFkaWVudEVsZW1lbnQsICdvcGFjaXR5JywgdGhpcy5uY0dyYWRpZW50T3BhY2l0eS50b1N0cmluZygpKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgdGhpcy5tb3VzZVggPSBlLmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICB0aGlzLm1vdXNlWSA9IGUuY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgdGhpcy51cGRhdGVHcmFkaWVudHMoKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlTGVhdmUgPSAoKSA9PiB7XHJcbiAgICB0aGlzLm1vdXNlWCA9IC10aGlzLm5jR3JhZGllbnRTaXplO1xyXG4gICAgdGhpcy5tb3VzZVkgPSAtdGhpcy5uY0dyYWRpZW50U2l6ZTtcclxuICAgIHRoaXMudXBkYXRlR3JhZGllbnRzKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ29wYWNpdHknLCAnMCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ29wYWNpdHknLCAnMCcpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldHVwTWFnaWNDYXJkKCk7XHJcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVNb3VzZVBvc2l0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwTWFnaWNDYXJkKCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIFxyXG4gICAgLy8g6K6+572u5Li75a655Zmo5qC35byPXHJcbiAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBlbGVtZW50LnN0eWxlLnBvc2l0aW9uO1xyXG4gICAgaWYgKCFlbGVtZW50UG9zaXRpb24gfHwgZWxlbWVudFBvc2l0aW9uID09PSAnc3RhdGljJykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnbmMtbWFnaWMtY2FyZCcpO1xyXG4gICAgXHJcbiAgICAvLyDojrflj5blrrnlmajnmoTovrnmoYblrr3luqZcclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG4gICAgY29uc3QgYm9yZGVyVG9wV2lkdGggPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgpIHx8IDA7XHJcbiAgICBjb25zdCBib3JkZXJSaWdodFdpZHRoID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpIHx8IDA7XHJcbiAgICBjb25zdCBib3JkZXJCb3R0b21XaWR0aCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCkgfHwgMDtcclxuICAgIGNvbnN0IGJvcmRlckxlZnRXaWR0aCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpIHx8IDA7XHJcbiAgICBcclxuICAgIC8vIOWmguaenOayoeaciei+ueahhu+8jOm7mOiupOS9v+eUqDFweFxyXG4gICAgY29uc3QgbWF4Qm9yZGVyV2lkdGggPSBNYXRoLm1heChib3JkZXJUb3BXaWR0aCwgYm9yZGVyUmlnaHRXaWR0aCwgYm9yZGVyQm90dG9tV2lkdGgsIGJvcmRlckxlZnRXaWR0aCk7XHJcbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IG1heEJvcmRlcldpZHRoID4gMCA/IG1heEJvcmRlcldpZHRoIDogMTtcclxuICAgIFxyXG4gICAgLy8g5Yib5bu66L655qGG5YWD57SgIC0g5qC55o2u5a6e6ZmF6L655qGG5a695bqm5ZCR5aSW5omp5bGVXHJcbiAgICB0aGlzLmJvcmRlckVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJvcmRlckVsZW1lbnQsICduYy1tYWdpYy1jYXJkLWJvcmRlcicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ2luc2V0JywgYC0ke2JvcmRlcldpZHRofXB4YCk7IC8vIOagueaNrui+ueahhuWuveW6puWKqOaAgeiuvue9rlxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckVsZW1lbnQsICdib3JkZXItcmFkaXVzJywgJ2luaGVyaXQnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJFbGVtZW50LCAndHJhbnNpdGlvbicsICdvcGFjaXR5IDMwMG1zIGVhc2UnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJFbGVtZW50LCAnb3BhY2l0eScsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ3otaW5kZXgnLCAnMScpO1xyXG4gICAgXHJcbiAgICAvLyDliJvlu7rog4zmma/lhYPntKAgLSDpmpDol4/ovrnmoYblsYLnmoTlhoXpg6jljLrln59cclxuICAgIHRoaXMuYmFja2dyb3VuZEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJhY2tncm91bmRFbGVtZW50LCAnbmMtbWFnaWMtY2FyZC1iYWNrZ3JvdW5kJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2dyb3VuZEVsZW1lbnQsICdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2dyb3VuZEVsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tncm91bmRFbGVtZW50LCAnaW5zZXQnLCAnMCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tncm91bmRFbGVtZW50LCAnYm9yZGVyLXJhZGl1cycsICdpbmhlcml0Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2dyb3VuZEVsZW1lbnQsICdiYWNrZ3JvdW5kLWNvbG9yJywgdGhpcy5uY0NhcmRCYWNrZ3JvdW5kKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iYWNrZ3JvdW5kRWxlbWVudCwgJ3otaW5kZXgnLCAnMicpO1xyXG4gICAgXHJcbiAgICAvLyDliJvlu7rmuJDlj5jlhYPntKBcclxuICAgIHRoaXMuZ3JhZGllbnRFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5ncmFkaWVudEVsZW1lbnQsICduYy1tYWdpYy1jYXJkLWdyYWRpZW50Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnaW5zZXQnLCAnMCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ2JvcmRlci1yYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdyYWRpZW50RWxlbWVudCwgJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAzMDBtcyBlYXNlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnb3BhY2l0eScsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ3JhZGllbnRFbGVtZW50LCAnei1pbmRleCcsICc0Jyk7XHJcbiAgICBcclxuICAgIC8vIOWOn+Wni+WGheWuueS9jeS6juiDjOaZr+WxguS5i+S4iu+8jOa4kOWPmOWxguS5i+S4i1xyXG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGRyZW4pO1xyXG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNoaWxkLCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjaGlsZCwgJ3otaW5kZXgnLCAnMycpO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIOa3u+WKoOaViOaenOWxguWIsOWOn+Wni+WFg+e0oFxyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChlbGVtZW50LCB0aGlzLmJvcmRlckVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChlbGVtZW50LCB0aGlzLmJhY2tncm91bmRFbGVtZW50KTtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCwgdGhpcy5ncmFkaWVudEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVycygpIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ21vdXNlbGVhdmUnLCB0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplTW91c2VQb3NpdGlvbigpIHtcclxuICAgIHRoaXMubW91c2VYID0gLXRoaXMubmNHcmFkaWVudFNpemU7XHJcbiAgICB0aGlzLm1vdXNlWSA9IC10aGlzLm5jR3JhZGllbnRTaXplO1xyXG4gICAgdGhpcy51cGRhdGVHcmFkaWVudHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlR3JhZGllbnRzKCkge1xyXG4gICAgaWYgKHRoaXMuYm9yZGVyRWxlbWVudCAmJiB0aGlzLmdyYWRpZW50RWxlbWVudCkge1xyXG4gICAgICAvLyDmm7TmlrDovrnmoYbmuJDlj5hcclxuICAgICAgY29uc3QgYm9yZGVyR3JhZGllbnQgPSBgcmFkaWFsLWdyYWRpZW50KCR7dGhpcy5uY0dyYWRpZW50U2l6ZX1weCBjaXJjbGUgYXQgJHt0aGlzLm1vdXNlWH1weCAke3RoaXMubW91c2VZfXB4LCAke3RoaXMubmNHcmFkaWVudEZyb219LCAke3RoaXMubmNHcmFkaWVudFRvfSwgdHJhbnNwYXJlbnQgMTAwJSlgO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyRWxlbWVudCwgJ2JhY2tncm91bmQnLCBib3JkZXJHcmFkaWVudCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyDmm7TmlrDlhoXpg6jmuJDlj5hcclxuICAgICAgY29uc3QgaW5uZXJHcmFkaWVudCA9IGByYWRpYWwtZ3JhZGllbnQoJHt0aGlzLm5jR3JhZGllbnRTaXplfXB4IGNpcmNsZSBhdCAke3RoaXMubW91c2VYfXB4ICR7dGhpcy5tb3VzZVl9cHgsICR7dGhpcy5uY0dyYWRpZW50Q29sb3J9LCB0cmFuc3BhcmVudCAxMDAlKWA7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ncmFkaWVudEVsZW1lbnQsICdiYWNrZ3JvdW5kJywgaW5uZXJHcmFkaWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19