@acrodata/watermark
Version:
Add watermark to your page
177 lines • 25 kB
JavaScript
/** 用于标记是否需要保护 */
export const attributeNameTag = 'data-watermark-tag';
export const observeOptions = {
childList: true,
subtree: true,
attributeFilter: ['style', 'class', attributeNameTag],
};
/** 获取 DataSetKey */
export function getDataSetKey(attributeName) {
return attributeName
.split('-')
.slice(1)
.reduce((prev, cur, index) => {
if (index === 0) {
return cur;
}
return `${prev}${cur[0].toUpperCase() + cur.slice(1)}`;
});
}
/** 将样式对象转换为字符串 */
export const getStyleStr = (style) => {
let str = '';
Object.keys(style).forEach(key => {
const k = key.replace(/([A-Z])/g, '-$1').toLowerCase();
if (style[key] !== '' && style[key] != null) {
str += `${k}:${style[key]};`;
}
});
return str;
};
/** 创建随机 ID */
export const getRandomId = (prefix = '') => {
const uid = window.btoa(decodeURI(encodeURIComponent(prefix)));
return `${uid}-${new Date().getTime()}-${Math.floor(Math.random() * Math.pow(10, 8))}`;
};
/** 获取水印挂载节点 */
export const getContainer = (container) => {
let dom;
if (typeof container === 'string') {
dom = document.querySelector(container);
if (!dom) {
throw new Error(`The watermark container element '${container}' not found!`);
}
}
else {
dom = container ?? document.body;
}
return dom;
};
/** 盲水印解密 */
export const decrypt = (ctx) => {
const originalData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
const data = originalData.data;
for (let i = 0; i < data.length; i++) {
// 筛选每个像素点的R值
if (i % 4 == 0) {
if (data[i] % 2 == 0) {
// 如果 R 值为偶数,说明这个点是没有水印信息的,将其 R 值设为0
data[i] = 0;
}
else {
// 如果 R 值为奇数,说明这个点是有水印信息的,将其 R 值设为255
data[i] = 255;
}
}
else if (i % 4 == 3) {
// 透明度不作处理
continue;
}
else {
// G、B 值设置为 0,不影响
data[i] = 0;
}
}
// 至此,带有水印信息的点都将展示为 `255,0,0`,而没有水印信息的点将展示为 `0,0,0`,将结果绘制到画布
ctx.putImageData(originalData, 0, 0);
};
export const createHost = (watermarkTag) => {
const dom = document.createElement('div');
// 可以隐藏元素的 CSS 属性
const hiddenCSS = {
'display': 'block !important',
'position': 'static !important',
'opacity': '1 !important',
'visibility': 'visible !important',
'transform': 'none !important',
'clip-path': 'none !important',
};
dom.setAttribute('style', getStyleStr(hiddenCSS));
dom.setAttribute(attributeNameTag, watermarkTag);
return dom;
};
export function getDrawPattern(opts) {
const { text, gapX, gapY, offsetY, offsetX, width, height, rotate, opacity, fontSize, fontStyle, fontVariant, fontWeight, fontFamily, fontColor, textAlign, textBaseline, image, blindText, blindFontSize, blindOpacity, } = opts;
return new Promise((resolve, reject) => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const ratio = 1;
const canvasWidth = (Number(gapX) + Number(width)) * ratio;
const canvasHeight = (Number(gapY) + Number(height)) * ratio;
const canvasOffsetLeft = Number(offsetX) || Number(gapX) / 2;
const canvasOffsetTop = Number(offsetY) || Number(gapY) / 2;
canvas.setAttribute('width', `${canvasWidth}px`);
canvas.setAttribute('height', `${canvasHeight}px`);
if (ctx) {
const markWidth = width * ratio;
const markHeight = height * ratio;
// 1. 根据元素中心点旋转
ctx.translate(canvasOffsetLeft * ratio, canvasOffsetTop * ratio);
ctx.translate(markWidth / 2, markHeight / 2); // 1
ctx.rotate((Math.PI / 180) * Number(rotate));
ctx.translate(-markWidth / 2, -markHeight / 2); // 1
// 是否需要增加盲水印文字
if (blindText) {
// 盲水印需要低透明度
ctx.globalAlpha = blindOpacity;
ctx.font = `${blindFontSize}px normal`;
ctx.fillText(blindText, 0, 0);
}
// 设置透明度
ctx.globalAlpha = opacity;
// 优先使用图片
if (image) {
const img = new Image();
img.crossOrigin = 'anonymous';
img.referrerPolicy = 'no-referrer';
img.src = image;
img.onload = () => {
ctx.drawImage(img, 0, 0, markWidth, markHeight);
resolve({
url: ctx.canvas.toDataURL(),
width: canvasWidth,
height: canvasHeight,
});
};
return;
}
// 获取文本的最大宽度
const texts = typeof text === 'string' ? text.split('\n') : text;
const widths = texts.map(item => ctx.measureText(item).width);
const maxWidth = Math.max(...widths);
const markSize = Number(fontSize) * ratio;
// 设置文本对齐方式
ctx.textAlign = textAlign;
// 设置文本位置
ctx.textBaseline = textBaseline;
// 设置字体颜色
ctx.fillStyle = fontColor;
// 设置字体
ctx.font = getFont(`${markSize}px`);
// 文案宽度大于画板宽度
if (maxWidth > width) {
ctx.font = getFont(`${markSize / 2}px`);
}
// 多行文本的上下间距
const textGap = 4;
// 获取行高
const lineHeight = markSize;
// 计算水印在 y 轴上的初始位置
let initY = (markHeight - (fontSize + 4) * texts.length - textGap * (texts.length - 1)) / 2;
initY = initY < 0 ? 0 : initY;
for (let i = 0; i < texts.length; i++) {
ctx.fillText(texts[i] || '', markWidth / 2, initY + lineHeight * (i + 1) + textGap * i);
}
resolve({
url: ctx.canvas.toDataURL(),
width: canvasWidth,
height: canvasHeight,
});
}
function getFont(fontSize) {
return `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize} ${fontFamily}`;
}
return reject();
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy93YXRlcm1hcmsvc3JjL2xpYi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxpQkFBaUI7QUFDakIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsT0FBTyxFQUFFLElBQUk7SUFDYixlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDO0NBQ3RELENBQUM7QUFFRixvQkFBb0I7QUFDcEIsTUFBTSxVQUFVLGFBQWEsQ0FBQyxhQUFxQjtJQUNqRCxPQUFPLGFBQWE7U0FDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDUixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxrQkFBa0I7QUFDbEIsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBc0MsRUFBRSxFQUFFO0lBQ3BFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUViLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZELElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsY0FBYztBQUNkLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRTtJQUN6QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsT0FBTyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN6RixDQUFDLENBQUM7QUFFRixlQUFlO0FBQ2YsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBd0MsRUFBRSxFQUFFO0lBQ3ZFLElBQUksR0FBdUIsQ0FBQztJQUU1QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLFNBQVMsY0FBYyxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sR0FBRyxHQUFHLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLFlBQVk7QUFDWixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUE2QixFQUFFLEVBQUU7SUFDdkQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakYsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLGFBQWE7UUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLG9DQUFvQztnQkFDcEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUM7aUJBQU0sQ0FBQztnQkFDTixxQ0FBcUM7Z0JBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsVUFBVTtZQUNWLFNBQVM7UUFDWCxDQUFDO2FBQU0sQ0FBQztZQUNOLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCw0REFBNEQ7SUFDNUQsR0FBRyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQW9CLEVBQUUsRUFBRTtJQUNqRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLGlCQUFpQjtJQUNqQixNQUFNLFNBQVMsR0FBRztRQUNoQixTQUFTLEVBQUUsa0JBQWtCO1FBQzdCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsU0FBUyxFQUFFLGNBQWM7UUFDekIsWUFBWSxFQUFFLG9CQUFvQjtRQUNsQyxXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLFdBQVcsRUFBRSxpQkFBaUI7S0FDL0IsQ0FBQztJQUNGLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDakQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsY0FBYyxDQUFDLElBQXNCO0lBQ25ELE1BQU0sRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUNiLFlBQVksR0FDYixHQUFHLElBQWtDLENBQUM7SUFDdkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzRCxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDN0QsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1RCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBRW5ELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFFbEMsZUFBZTtZQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNqRSxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM3QyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFFcEQsY0FBYztZQUNkLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsWUFBWTtnQkFDWixHQUFHLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztnQkFDL0IsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLGFBQWEsV0FBVyxDQUFDO2dCQUN2QyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUVELFFBQVE7WUFDUixHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUUxQixTQUFTO1lBQ1QsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN4QixHQUFHLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztnQkFDOUIsR0FBRyxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7Z0JBQ25DLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO2dCQUNoQixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtvQkFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ2hELE9BQU8sQ0FBQzt3QkFDTixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7d0JBQzNCLEtBQUssRUFBRSxXQUFXO3dCQUNsQixNQUFNLEVBQUUsWUFBWTtxQkFDckIsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUVELFlBQVk7WUFDWixNQUFNLEtBQUssR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFFckMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUUxQyxXQUFXO1lBQ1gsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDMUIsU0FBUztZQUNULEdBQUcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBQ2hDLFNBQVM7WUFDVCxHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMxQixPQUFPO1lBQ1AsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQyxDQUFDO1lBRXBDLGFBQWE7WUFDYixJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsWUFBWTtZQUNaLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztZQUVsQixPQUFPO1lBQ1AsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBRTVCLGtCQUFrQjtZQUNsQixJQUFJLEtBQUssR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUYsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxPQUFPLENBQUM7Z0JBQ04sR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMzQixLQUFLLEVBQUUsV0FBVztnQkFDbEIsTUFBTSxFQUFFLFlBQVk7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLFFBQWdCO1lBQy9CLE9BQU8sR0FBRyxTQUFTLElBQUksV0FBVyxJQUFJLFVBQVUsSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0UsQ0FBQztRQUVELE9BQU8sTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2F0ZXJtYXJrT3B0aW9ucywgRHJhd1BhdHRlcm5SZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIOeUqOS6juagh+iusOaYr+WQpumcgOimgeS/neaKpCAqL1xuZXhwb3J0IGNvbnN0IGF0dHJpYnV0ZU5hbWVUYWcgPSAnZGF0YS13YXRlcm1hcmstdGFnJztcblxuZXhwb3J0IGNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICBjaGlsZExpc3Q6IHRydWUsXG4gIHN1YnRyZWU6IHRydWUsXG4gIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZScsICdjbGFzcycsIGF0dHJpYnV0ZU5hbWVUYWddLFxufTtcblxuLyoqIOiOt+WPliBEYXRhU2V0S2V5ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVNldEtleShhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcbiAgICAuc3BsaXQoJy0nKVxuICAgIC5zbGljZSgxKVxuICAgIC5yZWR1Y2UoKHByZXYsIGN1ciwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7cHJldn0ke2N1clswXS50b1VwcGVyQ2FzZSgpICsgY3VyLnNsaWNlKDEpfWA7XG4gICAgfSk7XG59XG5cbi8qKiDlsIbmoLflvI/lr7nosaHovazmjaLkuLrlrZfnrKbkuLIgKi9cbmV4cG9ydCBjb25zdCBnZXRTdHlsZVN0ciA9IChzdHlsZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPikgPT4ge1xuICBsZXQgc3RyID0gJyc7XG5cbiAgT2JqZWN0LmtleXMoc3R5bGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCBrID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHN0eWxlW2tleV0gIT09ICcnICYmIHN0eWxlW2tleV0gIT0gbnVsbCkge1xuICAgICAgc3RyICs9IGAke2t9OiR7c3R5bGVba2V5XX07YDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vKiog5Yib5bu66ZqP5py6IElEICovXG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tSWQgPSAocHJlZml4ID0gJycpID0+IHtcbiAgY29uc3QgdWlkID0gd2luZG93LmJ0b2EoZGVjb2RlVVJJKGVuY29kZVVSSUNvbXBvbmVudChwcmVmaXgpKSk7XG4gIHJldHVybiBgJHt1aWR9LSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIDgpKX1gO1xufTtcblxuLyoqIOiOt+WPluawtOWNsOaMgui9veiKgueCuSAqL1xuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lciA9IChjb250YWluZXI6IFdhdGVybWFya09wdGlvbnNbJ2NvbnRhaW5lciddKSA9PiB7XG4gIGxldCBkb206IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICBpZiAodHlwZW9mIGNvbnRhaW5lciA9PT0gJ3N0cmluZycpIHtcbiAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgaWYgKCFkb20pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHdhdGVybWFyayBjb250YWluZXIgZWxlbWVudCAnJHtjb250YWluZXJ9JyBub3QgZm91bmQhYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbSA9IGNvbnRhaW5lciA/PyBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgcmV0dXJuIGRvbTtcbn07XG5cbi8qKiDnm7LmsLTljbDop6Plr4YgKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICBjb25zdCBkYXRhID0gb3JpZ2luYWxEYXRhLmRhdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIC8vIOetm+mAieavj+S4quWDj+e0oOeCueeahFLlgLxcbiAgICBpZiAoaSAlIDQgPT0gMCkge1xuICAgICAgaWYgKGRhdGFbaV0gJSAyID09IDApIHtcbiAgICAgICAgLy8g5aaC5p6cIFIg5YC85Li65YG25pWw77yM6K+05piO6L+Z5Liq54K55piv5rKh5pyJ5rC05Y2w5L+h5oGv55qE77yM5bCG5YW2IFIg5YC86K6+5Li6MFxuICAgICAgICBkYXRhW2ldID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWmguaenCBSIOWAvOS4uuWlh+aVsO+8jOivtOaYjui/meS4queCueaYr+acieawtOWNsOS/oeaBr+eahO+8jOWwhuWFtiBSIOWAvOiuvuS4ujI1NVxuICAgICAgICBkYXRhW2ldID0gMjU1O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaSAlIDQgPT0gMykge1xuICAgICAgLy8g6YCP5piO5bqm5LiN5L2c5aSE55CGXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR+OAgUIg5YC86K6+572u5Li6IDDvvIzkuI3lvbHlk41cbiAgICAgIGRhdGFbaV0gPSAwO1xuICAgIH1cbiAgfVxuICAvLyDoh7PmraTvvIzluKbmnInmsLTljbDkv6Hmga/nmoTngrnpg73lsIblsZXnpLrkuLogYDI1NSwwLDBg77yM6ICM5rKh5pyJ5rC05Y2w5L+h5oGv55qE54K55bCG5bGV56S65Li6IGAwLDAsMGDvvIzlsIbnu5Pmnpznu5jliLbliLDnlLvluINcbiAgY3R4LnB1dEltYWdlRGF0YShvcmlnaW5hbERhdGEsIDAsIDApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvc3QgPSAod2F0ZXJtYXJrVGFnOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIC8vIOWPr+S7pemakOiXj+WFg+e0oOeahCBDU1Mg5bGe5oCnXG4gIGNvbnN0IGhpZGRlbkNTUyA9IHtcbiAgICAnZGlzcGxheSc6ICdibG9jayAhaW1wb3J0YW50JyxcbiAgICAncG9zaXRpb24nOiAnc3RhdGljICFpbXBvcnRhbnQnLFxuICAgICdvcGFjaXR5JzogJzEgIWltcG9ydGFudCcsXG4gICAgJ3Zpc2liaWxpdHknOiAndmlzaWJsZSAhaW1wb3J0YW50JyxcbiAgICAndHJhbnNmb3JtJzogJ25vbmUgIWltcG9ydGFudCcsXG4gICAgJ2NsaXAtcGF0aCc6ICdub25lICFpbXBvcnRhbnQnLFxuICB9O1xuICBkb20uc2V0QXR0cmlidXRlKCdzdHlsZScsIGdldFN0eWxlU3RyKGhpZGRlbkNTUykpO1xuICBkb20uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWVUYWcsIHdhdGVybWFya1RhZyk7XG4gIHJldHVybiBkb207XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJhd1BhdHRlcm4ob3B0czogV2F0ZXJtYXJrT3B0aW9ucyk6IFByb21pc2U8RHJhd1BhdHRlcm5SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gICAgZ2FwWCxcbiAgICBnYXBZLFxuICAgIG9mZnNldFksXG4gICAgb2Zmc2V0WCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcm90YXRlLFxuICAgIG9wYWNpdHksXG4gICAgZm9udFNpemUsXG4gICAgZm9udFN0eWxlLFxuICAgIGZvbnRWYXJpYW50LFxuICAgIGZvbnRXZWlnaHQsXG4gICAgZm9udEZhbWlseSxcbiAgICBmb250Q29sb3IsXG4gICAgdGV4dEFsaWduLFxuICAgIHRleHRCYXNlbGluZSxcbiAgICBpbWFnZSxcbiAgICBibGluZFRleHQsXG4gICAgYmxpbmRGb250U2l6ZSxcbiAgICBibGluZE9wYWNpdHksXG4gIH0gPSBvcHRzIGFzIFJlcXVpcmVkPFdhdGVybWFya09wdGlvbnM+O1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29uc3QgcmF0aW8gPSAxO1xuXG4gICAgY29uc3QgY2FudmFzV2lkdGggPSAoTnVtYmVyKGdhcFgpICsgTnVtYmVyKHdpZHRoKSkgKiByYXRpbztcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSAoTnVtYmVyKGdhcFkpICsgTnVtYmVyKGhlaWdodCkpICogcmF0aW87XG4gICAgY29uc3QgY2FudmFzT2Zmc2V0TGVmdCA9IE51bWJlcihvZmZzZXRYKSB8fCBOdW1iZXIoZ2FwWCkgLyAyO1xuICAgIGNvbnN0IGNhbnZhc09mZnNldFRvcCA9IE51bWJlcihvZmZzZXRZKSB8fCBOdW1iZXIoZ2FwWSkgLyAyO1xuXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtjYW52YXNXaWR0aH1weGApO1xuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke2NhbnZhc0hlaWdodH1weGApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgY29uc3QgbWFya1dpZHRoID0gd2lkdGggKiByYXRpbztcbiAgICAgIGNvbnN0IG1hcmtIZWlnaHQgPSBoZWlnaHQgKiByYXRpbztcblxuICAgICAgLy8gMS4g5qC55o2u5YWD57Sg5Lit5b+D54K55peL6L2sXG4gICAgICBjdHgudHJhbnNsYXRlKGNhbnZhc09mZnNldExlZnQgKiByYXRpbywgY2FudmFzT2Zmc2V0VG9wICogcmF0aW8pO1xuICAgICAgY3R4LnRyYW5zbGF0ZShtYXJrV2lkdGggLyAyLCBtYXJrSGVpZ2h0IC8gMik7IC8vIDFcbiAgICAgIGN0eC5yb3RhdGUoKE1hdGguUEkgLyAxODApICogTnVtYmVyKHJvdGF0ZSkpO1xuICAgICAgY3R4LnRyYW5zbGF0ZSgtbWFya1dpZHRoIC8gMiwgLW1hcmtIZWlnaHQgLyAyKTsgLy8gMVxuXG4gICAgICAvLyDmmK/lkKbpnIDopoHlop7liqDnm7LmsLTljbDmloflrZdcbiAgICAgIGlmIChibGluZFRleHQpIHtcbiAgICAgICAgLy8g55uy5rC05Y2w6ZyA6KaB5L2O6YCP5piO5bqmXG4gICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGJsaW5kT3BhY2l0eTtcbiAgICAgICAgY3R4LmZvbnQgPSBgJHtibGluZEZvbnRTaXplfXB4IG5vcm1hbGA7XG4gICAgICAgIGN0eC5maWxsVGV4dChibGluZFRleHQsIDAsIDApO1xuICAgICAgfVxuXG4gICAgICAvLyDorr7nva7pgI/mmI7luqZcbiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cbiAgICAgIC8vIOS8mOWFiOS9v+eUqOWbvueJh1xuICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgaW1nLnJlZmVycmVyUG9saWN5ID0gJ25vLXJlZmVycmVyJztcbiAgICAgICAgaW1nLnNyYyA9IGltYWdlO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBtYXJrV2lkdGgsIG1hcmtIZWlnaHQpO1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgdXJsOiBjdHguY2FudmFzLnRvRGF0YVVSTCgpLFxuICAgICAgICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g6I635Y+W5paH5pys55qE5pyA5aSn5a695bqmXG4gICAgICBjb25zdCB0ZXh0cyA9IHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/IHRleHQuc3BsaXQoJ1xcbicpIDogdGV4dDtcbiAgICAgIGNvbnN0IHdpZHRocyA9IHRleHRzLm1hcChpdGVtID0+IGN0eC5tZWFzdXJlVGV4dChpdGVtKS53aWR0aCk7XG4gICAgICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KC4uLndpZHRocyk7XG5cbiAgICAgIGNvbnN0IG1hcmtTaXplID0gTnVtYmVyKGZvbnRTaXplKSAqIHJhdGlvO1xuXG4gICAgICAvLyDorr7nva7mlofmnKzlr7npvZDmlrnlvI9cbiAgICAgIGN0eC50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAvLyDorr7nva7mlofmnKzkvY3nva5cbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSB0ZXh0QmFzZWxpbmU7XG4gICAgICAvLyDorr7nva7lrZfkvZPpopzoibJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBmb250Q29sb3I7XG4gICAgICAvLyDorr7nva7lrZfkvZNcbiAgICAgIGN0eC5mb250ID0gZ2V0Rm9udChgJHttYXJrU2l6ZX1weGApO1xuXG4gICAgICAvLyDmlofmoYjlrr3luqblpKfkuo7nlLvmnb/lrr3luqZcbiAgICAgIGlmIChtYXhXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIGN0eC5mb250ID0gZ2V0Rm9udChgJHttYXJrU2l6ZSAvIDJ9cHhgKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aSa6KGM5paH5pys55qE5LiK5LiL6Ze06LedXG4gICAgICBjb25zdCB0ZXh0R2FwID0gNDtcblxuICAgICAgLy8g6I635Y+W6KGM6auYXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gbWFya1NpemU7XG5cbiAgICAgIC8vIOiuoeeul+awtOWNsOWcqCB5IOi9tOS4iueahOWIneWni+S9jee9rlxuICAgICAgbGV0IGluaXRZID0gKG1hcmtIZWlnaHQgLSAoZm9udFNpemUgKyA0KSAqIHRleHRzLmxlbmd0aCAtIHRleHRHYXAgKiAodGV4dHMubGVuZ3RoIC0gMSkpIC8gMjtcbiAgICAgIGluaXRZID0gaW5pdFkgPCAwID8gMCA6IGluaXRZO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0c1tpXSB8fCAnJywgbWFya1dpZHRoIC8gMiwgaW5pdFkgKyBsaW5lSGVpZ2h0ICogKGkgKyAxKSArIHRleHRHYXAgKiBpKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICB1cmw6IGN0eC5jYW52YXMudG9EYXRhVVJMKCksXG4gICAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGb250KGZvbnRTaXplOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBgJHtmb250U3R5bGV9ICR7Zm9udFZhcmlhbnR9ICR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX0gJHtmb250RmFtaWx5fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlamVjdCgpO1xuICB9KTtcbn1cbiJdfQ==