UNPKG

ng-cw-v12

Version:

Angular UI component library

445 lines 89.7 kB
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Subject } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "./click-outside.directive";
import * as i3 from "@angular/forms";
export class ColorPickerComponent {
    constructor(ele) {
        this.ele = ele;
        this.ncSize = 'default';
        this.ncFormat = 'hexa';
        this.ncValue = '#ff0000ff'; //#ff0000ff #ff0000 rgba(255,0,0,1) rgb(255,0,0,1) rgb(255,0,0)
        this.ncValueChange = new EventEmitter();
        this.ncOnchange = new EventEmitter();
        this.$ncValueChangeSubject = new Subject();
        this.panelShow = false;
        //HSV是基于色相H(hue)、饱和度S(saturation)、明度V(Value)
        this.hsv = {
            hue: 360,
            saturation: 100,
            value: 100
        };
        this.hueColor = '255,0,0'; //用于颜色面板、色相按钮
        this.rgb = [];
        this.alpha = 1;
        this.hexa = '';
        this.init = true;
    }
    ngOnInit() {
        this.$ncValueChangeSubject.pipe(debounceTime(500), distinctUntilChanged((n, o) => {
            return n === o;
        })).subscribe((_value) => {
            //初始时执行两次setNcValue,防抖后执行一次这里
            //由于init为true,初始时不触发ncOnchange而是将init改为false
            //后续执行setNcValue时init为false,触发ncOnchange
            if (!this.init) {
                this.ncOnchange.emit(_value);
            }
            else {
                this.init = false;
            }
        });
        //根据初始值设置面板
        this.setPanel();
        //绑定点击事件
        this.bindEvent();
    }
    //绑定点击、移动事件
    bindEvent() {
        //色相柱
        this.setHueSlider = this.setHueSlider.bind(this);
        let colorBar = this.ele.nativeElement.querySelector('#colorBar');
        let divSlider = this.ele.nativeElement.querySelector('#divSlider');
        colorBar.addEventListener('mousedown', (e) => {
            this.setHueSlider(e);
            this.ele.nativeElement.addEventListener('mousemove', this.setHueSlider);
        });
        divSlider.addEventListener('mousedown', (e) => {
            this.setHueSlider(e);
            this.ele.nativeElement.addEventListener('mousemove', this.setHueSlider);
        });
        this.ele.nativeElement.addEventListener('mouseup', () => {
            this.ele.nativeElement.removeEventListener('mousemove', this.setHueSlider);
        });
        //透明柱状
        this.setAlpha = this.setAlpha.bind(this);
        let alphaBar = this.ele.nativeElement.querySelector('#alphaBar');
        let divAlphaSlider = this.ele.nativeElement.querySelector('#divAlphaSlider');
        alphaBar.addEventListener('mousedown', (e) => {
            this.setAlpha(e);
            this.ele.nativeElement.addEventListener('mousemove', this.setAlpha);
        });
        divAlphaSlider.addEventListener('mousedown', (e) => {
            this.setAlpha(e);
            this.ele.nativeElement.addEventListener('mousemove', this.setAlpha);
        });
        this.ele.nativeElement.addEventListener('mouseup', () => {
            this.ele.nativeElement.removeEventListener('mousemove', this.setAlpha);
        });
        //颜色面板
        this.setSaturationAndValue = this.setSaturationAndValue.bind(this);
        let colorPanel = this.ele.nativeElement.querySelector('#colorPanel');
        let divPicker = this.ele.nativeElement.querySelector('#divPicker');
        colorPanel.addEventListener('mousedown', (e) => {
            this.setSaturationAndValue(e);
            this.ele.nativeElement.addEventListener('mousemove', this.setSaturationAndValue);
        });
        divPicker.addEventListener('mousedown', (e) => {
            this.setSaturationAndValue(e);
            this.ele.nativeElement.addEventListener('mousemove', this.setSaturationAndValue);
        });
        this.ele.nativeElement.addEventListener('mouseup', () => {
            this.ele.nativeElement.removeEventListener('mousemove', this.setSaturationAndValue);
        });
    }
    //根据默认值初始化面板
    setPanel() {
        if (this.ncValue.charAt(0) == '#') {
            let rgba = this.hexaToRgba(this.ncValue);
            this.rgb = [rgba[0], rgba[1], rgba[2]];
            this.alpha = rgba[3];
        }
        else {
            let match = this.ncValue.match(/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)$/); //rgba(255,0,0,1)
            if (!match) {
                match = this.ncValue.match(/^rgb\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)$/); //rgb(255,0,0,1)
            }
            if (!match) {
                match = this.ncValue.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); //rgb(255,0,0)
            }
            let red = parseInt(match[1], 10);
            let green = parseInt(match[2], 10);
            let blue = parseInt(match[3], 10);
            let alpha = parseFloat(match[4]);
            this.rgb = [red, green, blue];
            if (Number.isNaN(alpha)) {
                this.alpha = 1;
            }
            else {
                this.alpha = alpha;
            }
        }
        this.alphaChange();
        this.rgbChange();
    }
    //设置ncValue
    setNcValue() {
        setTimeout(() => {
            if (this.ncFormat == 'hexa') {
                this.ncValue = this.hexa;
            }
            else {
                this.ncValue = `rgba(${this.rgb[0]},${this.rgb[1]},${this.rgb[2]},${this.alpha})`;
            }
            this.ncValueChange.emit(this.ncValue); //双向绑定
            this.$ncValueChangeSubject.next(this.ncValue); //触发值改变回调
        });
    }
    //触发器点击
    blockClick() {
        let blockDom = this.ele.nativeElement.querySelector('.nc-color-picker-block'); //触发器
        const clientRect = blockDom.getBoundingClientRect(); //触发器位置
        let panelDom = this.ele.nativeElement.querySelector('.nc-color-picker-panel'); //弹出面板
        //触发器大小
        let blockWidth = 0;
        let blockHeight = 0;
        if (this.ncSize == 'small') {
            blockWidth = 16;
            blockHeight = 16;
        }
        else if (this.ncSize == 'large') {
            blockWidth = 32;
            blockHeight = 32;
        }
        else {
            blockWidth = 24;
            blockHeight = 24;
        }
        let panelHeight = 290; //弹出面板高
        let panelWidth = 282; //弹出面板宽
        let gap = 20; //预留间隙
        let windowHeight = window.innerHeight;
        let windowWidth = window.innerWidth;
        //清除三角形
        panelDom.classList.remove('topTriangle');
        panelDom.classList.remove('bottomTriangle');
        panelDom.classList.remove('leftTriangle');
        panelDom.classList.remove('rightTriangle');
        if (clientRect.left < (panelWidth / 2 - blockWidth / 2) && clientRect.top < (panelHeight / 2 - blockHeight / 2)) {
            //右下弹出(触发器位于窗口左上角)
            panelDom.style.left = blockWidth + gap / 2 + 'px';
            panelDom.style.top = blockHeight + gap / 2 + 'px';
        }
        else if (windowWidth - clientRect.right < (panelWidth / 2 - blockWidth / 2) && windowHeight - clientRect.bottom < (panelHeight / 2 - blockHeight / 2)) {
            //左上弹出(触发器位于窗口右下角)
            panelDom.style.right = blockWidth + gap / 2 + 'px';
            panelDom.style.bottom = blockHeight + gap / 2 + 'px';
        }
        else if (clientRect.left < (panelWidth / 2 - blockWidth / 2) && windowHeight - clientRect.bottom < (panelHeight / 2 - blockHeight / 2)) {
            //右上弹出(触发器位于窗口左下角)
            panelDom.style.left = blockWidth + gap / 2 + 'px';
            panelDom.style.bottom = blockHeight + gap / 2 + 'px';
        }
        else if (clientRect.top < (panelHeight / 2 - blockHeight / 2) && windowWidth - clientRect.right < (panelWidth / 2 - blockWidth / 2)) {
            //左下弹出(触发器位于窗口右上角)
            panelDom.style.right = blockWidth + gap / 2 + 'px';
            panelDom.style.top = blockHeight + gap / 2 + 'px';
        }
        else if (clientRect.left >= (panelWidth / 2 - blockWidth / 2) && windowWidth - clientRect.right >= (panelWidth / 2 - blockWidth / 2) && windowHeight - clientRect.bottom >= panelHeight + gap) {
            //下弹出(左右下空间足够)
            panelDom.style.left = -(panelWidth / 2 - blockWidth / 2) + 'px';
            panelDom.style.top = blockHeight + gap + 'px';
            panelDom.classList.add('topTriangle'); //添加三角形
        }
        else if (clientRect.left >= (panelWidth / 2 - blockWidth / 2) && windowWidth - clientRect.right >= (panelWidth / 2 - blockWidth / 2) && clientRect.top >= panelHeight + gap) {
            //上弹出(左右上空间足够)
            panelDom.style.left = -(panelWidth / 2 - blockWidth / 2) + 'px';
            panelDom.style.bottom = blockHeight + gap + 'px';
            panelDom.classList.add('bottomTriangle'); //添加三角形
        }
        else if (clientRect.top >= (panelHeight / 2 - blockHeight / 2) && windowHeight - clientRect.bottom >= (panelHeight / 2 - blockHeight / 2) && windowWidth - clientRect.right >= panelWidth + gap) {
            //右弹出(上下右空间足够)
            panelDom.style.left = blockHeight + gap + 'px';
            panelDom.style.bottom = -(panelHeight / 2 - blockHeight / 2) + 'px';
            panelDom.classList.add('leftTriangle'); //添加三角形
        }
        else if (clientRect.top >= (panelHeight / 2 - blockHeight / 2) && windowHeight - clientRect.bottom >= (panelHeight / 2 - blockHeight / 2) && clientRect.left >= panelWidth + gap) {
            //左弹出(上下左空间足够)
            panelDom.style.right = blockHeight + gap + 'px';
            panelDom.style.bottom = -(panelHeight / 2 - blockHeight / 2) + 'px';
            panelDom.classList.add('rightTriangle'); //添加三角形
        }
        setTimeout(() => {
            //加延迟让clickOut先触发
            this.panelShow = true;
        });
    }
    //点击色相柱,计算色相H(hue)
    setHueSlider(event) {
        let colorBar = this.ele.nativeElement.querySelector('#colorBar');
        let divSlider = this.ele.nativeElement.querySelector('#divSlider');
        let colorBarWIDTH = colorBar.clientWidth;
        const clientRect = colorBar.getBoundingClientRect();
        // 获取位置信息
        let xDiff = event.clientX - clientRect.left;
        xDiff = xDiff > colorBarWIDTH ? colorBarWIDTH : (xDiff < 0 ? 0 : xDiff); //0-200
        // 设置滑块的位置,保证滑块至少一半在面板内
        divSlider.style.left = xDiff - 6 + 'px';
        // 色相在360度以内,计算对应的比例值, 0 - 360
        this.hsv.hue = Math.round((xDiff / colorBarWIDTH) * 360 * 100) / 100 | 0;
        //转换
        this.rgb = this.hsvToRgb(this.hsv.hue, this.hsv.saturation, this.hsv.value);
        this.hueColor = this.hsvToRgb(this.hsv.hue, 100, 100).join(',');
        this.hexa = this.rgbaToHexa(this.rgb[0], this.rgb[1], this.rgb[2], this.alpha);
        this.setNcValue();
    }
    //点击透明柱,计算透明度
    setAlpha(event) {
        let alphaBar = this.ele.nativeElement.querySelector('#alphaBar');
        let divAlphaSlider = this.ele.nativeElement.querySelector('#divAlphaSlider');
        let alphaBarWIDTH = alphaBar.clientWidth;
        const clientRect = alphaBar.getBoundingClientRect();
        // 获取位置信息
        let xDiff = event.clientX - clientRect.left;
        xDiff = xDiff > alphaBarWIDTH ? alphaBarWIDTH : (xDiff < 0 ? 0 : xDiff); //0-200
        // 设置滑块的位置,保证滑块至少一半在面板内
        divAlphaSlider.style.left = xDiff - 6 + 'px';
        //透明度取值在0-1
        this.alpha = (100 - Math.round(100 - xDiff / alphaBarWIDTH * 100)) / 100;
        //转换
        this.hexa = this.rgbaToHexa(this.rgb[0], this.rgb[1], this.rgb[2], this.alpha);
        this.setNcValue();
    }
    //点击颜色面板,计算饱和度S(saturation)、明度V(Value)
    setSaturationAndValue(event) {
        let colorPanel = this.ele.nativeElement.querySelector('#colorPanel');
        let divPicker = this.ele.nativeElement.querySelector('#divPicker');
        let panelWIDTH = colorPanel.clientWidth;
        let panelHEIGHT = colorPanel.clientHeight;
        // 计算鼠标移动位置,面板宽度panelWIDTH,高度panelHEIGHT
        const clientRect = colorPanel.getBoundingClientRect();
        let yDiff = event.clientY - clientRect.top;
        let xDiff = event.clientX - clientRect.left;
        xDiff = xDiff > panelWIDTH ? panelWIDTH : (xDiff < 0 ? 0 : xDiff);
        yDiff = yDiff > panelHEIGHT ? panelHEIGHT : (yDiff < 0 ? 0 : yDiff);
        // 设置滑块位置,保证滑块至少一半在面板内
        divPicker.style.top = yDiff - 8 + 'px';
        divPicker.style.left = xDiff - 8 + 'px';
        // 饱和度和明度,这里没有取百分比的值,后续转换时需要注意
        this.hsv.saturation = Math.round(xDiff / panelWIDTH * 100);
        this.hsv.value = Math.round((1 - yDiff / panelHEIGHT) * 100);
        //转换
        this.rgb = this.hsvToRgb(this.hsv.hue, this.hsv.saturation, this.hsv.value);
        this.hexa = this.rgbaToHexa(this.rgb[0], this.rgb[1], this.rgb[2], this.alpha);
        this.setNcValue();
    }
    //hsv转rgb (h:0-360 s: 0-100 v: 0-100)
    hsvToRgb(hue, saturation, value) {
        saturation = saturation * 255 / 100 | 0;
        value = value * 255 / 100 | 0;
        if (saturation === 0) {
            return [value, value, value];
        }
        else {
            let satVal = (255 - saturation) * value / 255 | 0;
            let ligVal = (value - satVal) * (hue % 60) / 60 | 0;
            if (hue === 360) {
                return [value, satVal + ligVal, satVal];
            }
            else if (hue < 60) {
                return [value, satVal + ligVal, satVal];
            }
            else if (hue < 120) {
                return [value - ligVal, value, satVal];
            }
            else if (hue < 180) {
                return [satVal, value, satVal + ligVal];
            }
            else if (hue < 240) {
                return [satVal, value - ligVal, value];
            }
            else if (hue < 300) {
                return [satVal + ligVal, satVal, value];
            }
            else if (hue < 360) {
                return [value, satVal, value - ligVal];
            }
            else {
                return [0, 0, 0];
            }
        }
    }
    //rgb转hsv (h:0-100 s: 0-100 v: 0-100)
    rgbToHsv(r, g, b) {
        (r /= 255), (g /= 255), (b /= 255);
        let max = Math.max(r, g, b), min = Math.min(r, g, b);
        let h, s, v = max;
        let d = max - min;
        s = max === 0 ? 0 : d / max;
        if (max === min) {
            h = 0; // achromatic
        }
        else {
            switch (max) {
                case r:
                    h = (g - b) / d + (g < b ? 6 : 0);
                    break;
                case g:
                    h = (b - r) / d + 2;
                    break;
                case b:
                    h = (r - g) / d + 4;
                    break;
            }
            h /= 6;
        }
        return [Math.round(h * 100), Math.round(s * 100), Math.round(v * 100)];
    }
    //rgba转hexa
    rgbaToHexa(red, green, blue, alpha) {
        red = this.getHex(red);
        green = this.getHex(green);
        blue = this.getHex(blue);
        alpha = Math.round(alpha * 255);
        alpha = this.getHex(alpha);
        return '#' + red + green + blue + alpha;
    }
    getHex(num) {
        let val = num.toString(16);
        val = (val.length === 1) ? ('0' + val) : val;
        return val;
    }
    //hex转rgba
    hexaToRgba(color) {
        const value = color.slice(color.indexOf('#') + 1);
        const isShort = value.length === 3 || value.length === 4;
        const hasAlpha = value.length === 4 || value.length === 8;
        const r = isShort ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2);
        const g = isShort ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4);
        const b = isShort ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6);
        let a = hasAlpha ? (isShort ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';
        a = parseFloat((parseInt(a, 16) / 255).toFixed(2));
        return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), a];
    }
    //输入rgb
    rgbChange() {
        this.hexa = this.rgbaToHexa(this.rgb[0], this.rgb[1], this.rgb[2], this.alpha);
        let hsv = this.rgbToHsv(this.rgb[0], this.rgb[1], this.rgb[2]); //hsv(rgb转,h:0-100)
        //更改this.hsv(选取,h:0-360)值
        //防止接着选取色相时setHueSlider使用默认的saturation和value
        //或选取颜色面板时setSaturationAndValue使用默认的hue
        this.hsv.hue = Math.round(360 * hsv[0] * 0.01); //0-100转0-360
        this.hsv.saturation = hsv[1];
        this.hsv.value = hsv[2];
        this.hueColor = this.hsvToRgb(this.hsv.hue, 100, 100).join(',');
        //调整色相中按钮位置
        let colorBar = this.ele.nativeElement.querySelector('#colorBar');
        let divSlider = this.ele.nativeElement.querySelector('#divSlider');
        let colorBarWIDTH = colorBar.clientWidth;
        divSlider.style.left = colorBarWIDTH * hsv[0] * 0.01 - 6 + 'px';
        //调整颜色面板中按钮位置
        let colorPanel = this.ele.nativeElement.querySelector('#colorPanel');
        let divPicker = this.ele.nativeElement.querySelector('#divPicker');
        let panelWIDTH = colorPanel.clientWidth;
        let panelHEIGHT = colorPanel.clientHeight;
        divPicker.style.left = panelWIDTH * hsv[1] * 0.01 - 8 + 'px';
        // divPicker.style.bottom = panelHEIGHT * hsv[2] * 0.01 - 8 + 'px';
        divPicker.style.top = panelHEIGHT * (100 - hsv[2]) * 0.01 - 8 + 'px';
        this.setNcValue();
    }
    //输入a
    alphaChange() {
        this.hexa = this.rgbaToHexa(this.rgb[0], this.rgb[1], this.rgb[2], this.alpha);
        //调整透明带中按钮位置
        let alphaBar = this.ele.nativeElement.querySelector('#alphaBar');
        let divAlphaSlider = this.ele.nativeElement.querySelector('#divAlphaSlider');
        let alphaBarWIDTH = alphaBar.clientWidth;
        divAlphaSlider.style.left = alphaBarWIDTH * this.alpha - 6 + 'px';
        this.setNcValue();
    }
    //输入hex
    hexChange() {
        if (this.hexa.charAt(0) != '#') {
            return;
        }
        if (this.hexa.length != 7 && this.hexa.length != 9) {
            return;
        }
        let rgba = this.hexaToRgba(this.hexa);
        this.rgb = [rgba[0], rgba[1], rgba[2]];
        this.alpha = rgba[3];
        this.rgbChange();
        this.alphaChange();
    }
    clickOut() {
        if (this.panelShow) {
            this.panelShow = false;
            this.ele.nativeElement.removeEventListener('mousemove', this.setHueSlider);
            this.ele.nativeElement.removeEventListener('mousemove', this.setAlpha);
            this.ele.nativeElement.removeEventListener('mousemove', this.setSaturationAndValue);
        }
    }
}
ColorPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ColorPickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
ColorPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ColorPickerComponent, selector: "nc-color-picker", inputs: { ncSize: "ncSize", ncFormat: "ncFormat", ncValue: "ncValue" }, outputs: { ncValueChange: "ncValueChange", ncOnchange: "ncOnchange" }, ngImport: i0, template: "<div class=\"nc-color-picker\">\r\n    <!--\u89E6\u53D1\u5668-->\r\n    <div class=\"nc-color-picker-block\" [ngClass]=\"'block-' + ncSize\" (click)=\"blockClick()\">\r\n        <div class=\"nc-color-picker-block-inner\" [ngStyle]=\"{'background-color': ncValue}\"></div>\r\n    </div>\r\n\r\n    <!--\u5F39\u51FA\u9762\u677F-->\r\n    <div class=\"nc-color-picker-panel\" [hidden]=\"!panelShow\" ncClickOutside (ncClickOut)=\"clickOut()\">\r\n        <!-- \u989C\u8272\u9762\u677F -->\r\n        <div class=\"div-panel\">\r\n            <div id=\"colorPanel\" class=\"color-panel\" [ngStyle]=\"{'background-color': 'rgb(' + hueColor + ')'}\"></div>\r\n            <div id=\"divPicker\" class=\"div-picker\"></div>\r\n        </div>\r\n        <!--\u67F1\u72B6\u6761-->\r\n        <div class=\"slider-panel\">\r\n            <div>\r\n                <!-- \u8272\u76F8\u67F1 -->\r\n                <div class=\"div-color\">\r\n                    <div id=\"colorBar\" class=\"color-bar\"></div>\r\n                    <div id=\"divSlider\" class=\"div-slider\" [ngStyle]=\"{'background-color': 'rgb(' + hueColor + ')'}\">\r\n                    </div>\r\n                </div>\r\n                <!-- \u900F\u660E\u67F1\u72B6 -->\r\n                <div class=\"div-alpha\">\r\n                    <div id=\"alphaBar\" class=\"alpha-bar\"\r\n                        [ngStyle]=\"{'background': 'linear-gradient(to right, rgba(255, 0, 4, 0), rgb(' + rgb[0] + ',' + rgb[1] + ','+ rgb[2] + '))'}\">\r\n                    </div>\r\n                    <div id=\"divAlphaSlider\" class=\"div-slider\"\r\n                        [ngStyle]=\"{'background-color': 'rgba(' + rgb[0] + ',' + rgb[1] + ','+ rgb[2] + ',' + alpha  + ')'}\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <!--color\u5C55\u793A-->\r\n            <div class=\"color-show\">\r\n                <div class=\"color-show-block\"\r\n                    [ngStyle]=\"{'background-color': 'rgba(' + rgb[0] + ',' + rgb[1] + ','+ rgb[2] + ',' + alpha  + ')'}\">\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <!--\u503C\u5C55\u793A-->\r\n        <div class=\"result-panel\">\r\n            <div class=\"result-row\">\r\n                <div class=\"result-title\">RGBA</div>\r\n                <div class=\"result-input\">\r\n                    <input class=\"nc-input-number\" style=\"width: 42px;\" type=\"number\" [(ngModel)]=\"rgb[0]\" [min]=\"0\"\r\n                        [max]=\"255\" step=\"1\" (ngModelChange)=\"rgbChange()\">\r\n\r\n                    <input class=\"nc-input-number\" style=\"width: 42px;\" type=\"number\" [(ngModel)]=\"rgb[1]\" [min]=\"0\"\r\n                        [max]=\"255\" step=\"1\" (ngModelChange)=\"rgbChange()\">\r\n\r\n                    <input class=\"nc-input-number\" style=\"width: 42px;\" type=\"number\" [(ngModel)]=\"rgb[2]\" [min]=\"0\"\r\n                        [max]=\"255\" step=\"1\" (ngModelChange)=\"rgbChange()\">\r\n\r\n                    <input class=\"nc-input-number\" style=\"width: 42px;\" type=\"number\" [(ngModel)]=\"alpha\" [min]=\"0\"\r\n                        [max]=\"1\" step=\"0.01\" (ngModelChange)=\"alphaChange()\">\r\n                </div>\r\n            </div>\r\n            <div class=\"result-row\">\r\n                <div class=\"result-title\">HEXA</div>\r\n                <div class=\"result-input\">\r\n                    <input class=\"nc-input nc-input-sm\" placeholder=\"Basic usage\" [(ngModel)]=\"hexa\"\r\n                        (ngModelChange)=\"hexChange()\">\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <!--\u8C03\u8BD5\u4EE3\u7801-->\r\n        <!-- <div style=\"margin-top: 20px;\">rgba:{{rgb[0] + ',' + rgb[1] + ','+ rgb[2] + ',' + alpha}}</div>\r\n        <div>hexa:{{hexa}}</div>\r\n        <div>hsv(\u9009\u53D6,h:0-360):{{hsv.hue + ',' + hsv.saturation + ',' + hsv.value}}</div>\r\n        <div>hsv(rgb\u8F6C,h:0-100):{{rgbToHsv(rgb[0],rgb[1],rgb[2])}}</div> -->\r\n    </div>\r\n</div>", styles: [".nc-color-picker{position:relative}.nc-color-picker .nc-color-picker-block{cursor:pointer;background-image:conic-gradient(rgba(0,0,0,.06) 0 25%,transparent 0 50%,rgba(0,0,0,.06) 0 75%,transparent 0);background-size:50% 50%;overflow:hidden}.nc-color-picker .nc-color-picker-block .nc-color-picker-block-inner{width:100%;height:100%}.nc-color-picker .block-default{width:24px;height:24px}.nc-color-picker .block-small{width:16px;height:16px}.nc-color-picker .block-large{width:32px;height:32px}.nc-color-picker .bottomTriangle:before{content:\"\";display:block;position:absolute;left:131px;top:290px;border-width:10px;border-style:solid dashed dashed dashed;border-color:white transparent transparent transparent}.nc-color-picker .leftTriangle:before{content:\"\";display:block;position:absolute;left:-20px;top:135px;border-width:10px;border-style:dashed solid dashed dashed;border-color:transparent white transparent transparent}.nc-color-picker .topTriangle:before{content:\"\";display:block;position:absolute;left:131px;top:-20px;border-width:10px;border-style:dashed dashed solid dashed;border-color:transparent transparent white transparent}.nc-color-picker .rightTriangle:before{content:\"\";display:block;position:absolute;right:-20px;top:135px;border-width:10px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent white}.nc-color-picker .nc-color-picker-panel{position:absolute;z-index:1001;width:-moz-fit-content;width:fit-content;padding:12px 16px;background-color:#fff;background-clip:padding-box;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.nc-color-picker .nc-color-picker-panel .div-panel{position:relative;width:250px;height:160px;cursor:pointer;overflow:hidden;margin-bottom:10px}.nc-color-picker .nc-color-picker-panel .color-panel{position:relative;height:100%;width:100%;background:linear-gradient(to top,#000,transparent),linear-gradient(to right,#FFF,transparent)}.nc-color-picker .nc-color-picker-panel .div-picker{width:16px;height:16px;position:absolute;left:242px;top:-8px;border-radius:50%;border:1px solid white}.nc-color-picker .nc-color-picker-panel .slider-panel{display:flex;align-items:center;justify-content:space-between}.nc-color-picker .nc-color-picker-panel .slider-panel .div-color{position:relative;width:214px;height:8px;margin-bottom:10px;cursor:pointer}.nc-color-picker .nc-color-picker-panel .slider-panel .color-bar{background:linear-gradient(to right,#f00,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00);width:100%;height:100%;border-radius:2px}.nc-color-picker .nc-color-picker-panel .slider-panel .div-slider{position:absolute;bottom:-2px;left:208px;width:12px;height:12px;border-radius:50%;border:1px solid white}.nc-color-picker .nc-color-picker-panel .slider-panel .div-alpha{position:relative;width:214px;height:8px;cursor:pointer;background-image:conic-gradient(rgba(0,0,0,.06) 0 25%,transparent 0 50%,rgba(0,0,0,.06) 0 75%,transparent 0);background-size:8px 8px}.nc-color-picker .nc-color-picker-panel .slider-panel .alpha-bar{width:100%;height:100%;border-radius:2px}.nc-color-picker .nc-color-picker-panel .slider-panel .color-show{width:28px;height:28px;background-image:conic-gradient(rgba(0,0,0,.06) 0 25%,transparent 0 50%,rgba(0,0,0,.06) 0 75%,transparent 0);background-size:50% 50%;overflow:hidden;border-radius:2px}.nc-color-picker .nc-color-picker-panel .slider-panel .color-show .color-show-block{width:100%;height:100%}.nc-color-picker .nc-color-picker-panel .result-panel .result-row{margin-top:10px;display:flex;align-items:center;justify-content:space-between}.nc-color-picker .nc-color-picker-panel .result-panel .result-row .result-title{width:50px}.nc-color-picker .nc-color-picker-panel .result-panel .result-row .result-input{width:calc(100% - 50px);display:flex;align-items:center;justify-content:space-between}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.ClickOutsideDirective, selector: "[ncClickOutside]", outputs: ["ncClickOut"] }, { type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i3.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i3.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ColorPickerComponent, decorators: [{
            type: Component,
            args: [{
                    selector: 'nc-color-picker',
                    templateUrl: './color-picker.component.html',
                    styleUrls: ['./color-picker.component.less']
                }]
        }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncSize: [{
                type: Input
            }], ncFormat: [{
                type: Input
            }], ncValue: [{
                type: Input
            }], ncValueChange: [{
                type: Output
            }], ncOnchange: [{
                type: Output
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2NvbG9yLXBpY2tlci9jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFPcEUsTUFBTSxPQUFPLG9CQUFvQjtJQXNCL0IsWUFBb0IsR0FBZTtRQUFmLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFyQjFCLFdBQU0sR0FBa0MsU0FBUyxDQUFDO1FBQ2xELGFBQVEsR0FBb0IsTUFBTSxDQUFDO1FBQ25DLFlBQU8sR0FBVyxXQUFXLENBQUMsQ0FBQSwrREFBK0Q7UUFDNUYsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTFDLDBCQUFxQixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDM0MsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQiw0Q0FBNEM7UUFDNUMsUUFBRyxHQUFRO1lBQ1QsR0FBRyxFQUFFLEdBQUc7WUFDUixVQUFVLEVBQUUsR0FBRztZQUNmLEtBQUssRUFBRSxHQUFHO1NBQ1gsQ0FBQztRQUNGLGFBQVEsR0FBUSxTQUFTLENBQUMsQ0FBQSxhQUFhO1FBRXZDLFFBQUcsR0FBUSxFQUFFLENBQUM7UUFDZCxVQUFLLEdBQVcsQ0FBQyxDQUFDO1FB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QVcsR0FBRyxHQUFHLEVBQUU7WUFDL0wsY0FBYztZQUNkLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDaEUsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDOUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQSxPQUFPO1NBQzlDO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDN0ssY0FBYztZQUNkLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDaEUsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDakQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBLE9BQU87U0FDakQ7YUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLFVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDak0sY0FBYztZQUNkLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDcEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQSxPQUFPO1NBQy9DO2FBQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDbEwsY0FBYztZQUNkLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2hELFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDcEUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQSxPQUFPO1NBQ2hEO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsWUFBWSxDQUFDLEtBQVU7UUFDckIsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLGFBQWEsR0FBUSxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BELFNBQVM7UUFDVCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUMsS0FBSyxHQUFHLEtBQUssR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEsT0FBTztRQUMvRSx1QkFBdUI7UUFDdkIsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDeEMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFekUsSUFBSTtRQUNKLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxhQUFhO0lBQ2IsUUFBUSxDQUFDLEtBQVU7UUFDakIsSUFBSSxRQUFRLEdBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLElBQUksY0FBYyxHQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksYUFBYSxHQUFRLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsU0FBUztRQUNULElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QyxLQUFLLEdBQUcsS0FBSyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxPQUFPO1FBQy9FLHVCQUF1QjtRQUN2QixjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM3QyxXQUFXO1FBQ1gsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXpFLElBQUk7UUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9FLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLHFCQUFxQixDQUFDLEtBQVU7UUFDOUIsSUFBSSxVQUFVLEdBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQ3hDLElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFFMUMsd0NBQXdDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUMzQyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUMsS0FBSyxHQUFHLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLEtBQUssR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRSxzQkFBc0I7UUFDdEIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdkMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFeEMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUU3RCxJQUFJO1FBQ0osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxRQUFRLENBQUMsR0FBVyxFQUFFLFVBQWtCLEVBQUUsS0FBYTtRQUNyRCxVQUFVLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcs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M0IsV0FBVyxFQUFFLCtCQUErQjtvQkFDNUMsU0FBUyxFQUFFLENBQUMsK0JBQStCLENBQUM7aUJBQzdDO2lHQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtY29sb3ItcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29sb3ItcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb2xvci1waWNrZXIuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29sb3JQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG5jU2l6ZTogJ3NtYWxsJyB8ICdkZWZhdWx0JyB8ICdsYXJnZScgPSAnZGVmYXVsdCc7XHJcbiAgQElucHV0KCkgbmNGb3JtYXQ6ICdoZXhhJyB8ICdyZ2JhJyA9ICdoZXhhJztcclxuICBASW5wdXQoKSBuY1ZhbHVlOiBzdHJpbmcgPSAnI2ZmMDAwMGZmJzsvLyNmZjAwMDBmZiAjZmYwMDAwIHJnYmEoMjU1LDAsMCwxKSByZ2IoMjU1LDAsMCwxKSByZ2IoMjU1LDAsMClcclxuICBAT3V0cHV0KCkgbmNWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgbmNPbmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgJG5jVmFsdWVDaGFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHBhbmVsU2hvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vSFNW5piv5Z+65LqO6Imy55u4SChodWUp44CB6aWx5ZKM5bqmUyhzYXR1cmF0aW9uKeOAgeaYjuW6plYoVmFsdWUpXHJcbiAgaHN2OiBhbnkgPSB7XHJcbiAgICBodWU6IDM2MCxcclxuICAgIHNhdHVyYXRpb246IDEwMCxcclxuICAgIHZhbHVlOiAxMDBcclxuICB9O1xyXG4gIGh1ZUNvbG9yOiBhbnkgPSAnMjU1LDAsMCc7Ly/nlKjkuo7popzoibLpnaLmnb/jgIHoibLnm7jmjInpkq5cclxuXHJcbiAgcmdiOiBhbnkgPSBbXTtcclxuICBhbHBoYTogbnVtYmVyID0gMTtcclxuICBoZXhhOiBzdHJpbmcgPSAnJztcclxuICBpbml0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGU6IEVsZW1lbnRSZWYpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuJG5jVmFsdWVDaGFuZ2VTdWJqZWN0LnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSg1MDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgobjogc3RyaW5nLCBvOiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICAgICAgICByZXR1cm4gbiA9PT0gbztcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKChfdmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAvL+WIneWni+aXtuaJp+ihjOS4pOasoXNldE5jVmFsdWXvvIzpmLLmipblkI7miafooYzkuIDmrKHov5nph4xcclxuICAgICAgLy/nlLHkuo5pbml05Li6dHJ1Ze+8jOWIneWni+aXtuS4jeinpuWPkW5jT25jaGFuZ2XogIzmmK/lsIZpbml05pS55Li6ZmFsc2VcclxuICAgICAgLy/lkI7nu63miafooYxzZXROY1ZhbHVl5pe2aW5pdOS4umZhbHNl77yM6Kem5Y+RbmNPbmNoYW5nZVxyXG4gICAgICBpZiAoIXRoaXMuaW5pdCkge1xyXG4gICAgICAgIHRoaXMubmNPbmNoYW5nZS5lbWl0KF92YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbml0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy/moLnmja7liJ3lp4vlgLzorr7nva7pnaLmnb9cclxuICAgIHRoaXMuc2V0UGFuZWwoKTtcclxuICAgIC8v57uR5a6a54K55Ye75LqL5Lu2XHJcbiAgICB0aGlzLmJpbmRFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy/nu5Hlrprngrnlh7vjgIHnp7vliqjkuovku7ZcclxuICBiaW5kRXZlbnQoKSB7XHJcbiAgICAvL+iJsuebuOafsVxyXG4gICAgdGhpcy5zZXRIdWVTbGlkZXIgPSB0aGlzLnNldEh1ZVNsaWRlci5iaW5kKHRoaXMpO1xyXG4gICAgbGV0IGNvbG9yQmFyOiBhbnkgPSB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb2xvckJhcicpO1xyXG4gICAgbGV0IGRpdlNsaWRlcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZGl2U2xpZGVyJyk7XHJcbiAgICBjb2xvckJhci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0SHVlU2xpZGVyKGUpO1xyXG4gICAgICB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuc2V0SHVlU2xpZGVyKTtcclxuICAgIH0pO1xyXG4gICAgZGl2U2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZXRIdWVTbGlkZXIoZSk7XHJcbiAgICAgIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5zZXRIdWVTbGlkZXIpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5zZXRIdWVTbGlkZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy/pgI/mmI7mn7HnirZcclxuICAgIHRoaXMuc2V0QWxwaGEgPSB0aGlzLnNldEFscGhhLmJpbmQodGhpcyk7XHJcbiAgICBsZXQgYWxwaGFCYXI6IGFueSA9IHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2FscGhhQmFyJyk7XHJcbiAgICBsZXQgZGl2QWxwaGFTbGlkZXI6IGFueSA9IHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2RpdkFscGhhU2xpZGVyJyk7XHJcbiAgICBhbHBoYUJhci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0QWxwaGEoZSk7XHJcbiAgICAgIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5zZXRBbHBoYSk7XHJcbiAgICB9KTtcclxuICAgIGRpdkFscGhhU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZXRBbHBoYShlKTtcclxuICAgICAgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnNldEFscGhhKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuc2V0QWxwaGEpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy/popzoibLpnaLmnb9cclxuICAgIHRoaXMuc2V0U2F0dXJhdGlvbkFuZFZhbHVlID0gdGhpcy5zZXRTYXR1cmF0aW9uQW5kVmFsdWUuYmluZCh0aGlzKTtcclxuICAgIGxldCBjb2xvclBhbmVsOiBhbnkgPSB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb2xvclBhbmVsJyk7XHJcbiAgICBsZXQgZGl2UGlja2VyOiBhbnkgPSB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkaXZQaWNrZXInKTtcclxuICAgIGNvbG9yUGFuZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNldFNhdHVyYXRpb25BbmRWYWx1ZShlKTtcclxuICAgICAgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnNldFNhdHVyYXRpb25BbmRWYWx1ZSk7XHJcbiAgICB9KTtcclxuICAgIGRpdlBpY2tlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0U2F0dXJhdGlvbkFuZFZhbHVlKGUpO1xyXG4gICAgICB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuc2V0U2F0dXJhdGlvbkFuZFZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuc2V0U2F0dXJhdGlvbkFuZFZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy/moLnmja7pu5jorqTlgLzliJ3lp4vljJbpnaLmnb9cclxuICBzZXRQYW5lbCgpIHtcclxuICAgIGlmICh0aGlzLm5jVmFsdWUuY2hhckF0KDApID09ICcjJykge1xyXG4gICAgICBsZXQgcmdiYSA9IHRoaXMuaGV4YVRvUmdiYSh0aGlzLm5jVmFsdWUpO1xyXG5cclxuICAgICAgdGhpcy5yZ2IgPSBbcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXV07XHJcbiAgICAgIHRoaXMuYWxwaGEgPSByZ2JhWzNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG1hdGNoOiBhbnkgPSB0aGlzLm5jVmFsdWUubWF0Y2goL15yZ2JhXFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKSxcXHMqKFtcXGQuXSspXFwpJC8pOy8vcmdiYSgyNTUsMCwwLDEpXHJcbiAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICBtYXRjaCA9IHRoaXMubmNWYWx1ZS5tYXRjaCgvXnJnYlxcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihbXFxkLl0rKVxcKSQvKTsvL3JnYigyNTUsMCwwLDEpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgIG1hdGNoID0gdGhpcy5uY1ZhbHVlLm1hdGNoKC9ecmdiXFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKVxcKSQvKTsvL3JnYigyNTUsMCwwKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCByZWQ6IGFueSA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XHJcbiAgICAgIGxldCBncmVlbjogYW55ID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcclxuICAgICAgbGV0IGJsdWU6IGFueSA9IHBhcnNlSW50KG1hdGNoWzNdLCAxMCk7XHJcbiAgICAgIGxldCBhbHBoYTogYW55ID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XHJcblxyXG4gICAgICB0aGlzLnJnYiA9IFtyZWQsIGdyZWVuLCBibHVlXTtcclxuICAgICAgaWYgKE51bWJlci5pc05hTihhbHBoYSkpIHtcclxuICAgICAgICB0aGlzLmFscGhhID0gMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFscGhhID0gYWxwaGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFscGhhQ2hhbmdlKCk7XHJcbiAgICB0aGlzLnJnYkNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgLy/orr7nva5uY1ZhbHVlXHJcbiAgc2V0TmNWYWx1ZSgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5uY0Zvcm1hdCA9PSAnaGV4YScpIHtcclxuICAgICAgICB0aGlzLm5jVmFsdWUgPSB0aGlzLmhleGE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uY1ZhbHVlID0gYHJnYmEoJHt0aGlzLnJnYlswXX0sJHt0aGlzLnJnYlsxXX0sJHt0aGlzLnJnYlsyXX0sJHt0aGlzLmFscGhhfSlgO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubmNWYWx1ZUNoYW5nZS5lbWl0KHRoaXMubmNWYWx1ZSk7Ly/lj4zlkJHnu5HlrppcclxuICAgICAgdGhpcy4kbmNWYWx1ZUNoYW5nZVN1YmplY3QubmV4dCh0aGlzLm5jVmFsdWUpOy8v6Kem5Y+R5YC85pS55Y+Y5Zue6LCDXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy/op6blj5Hlmajngrnlh7tcclxuICBibG9ja0NsaWNrKCkge1xyXG4gICAgbGV0IGJsb2NrRG9tOiBhbnkgPSB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYy1jb2xvci1waWNrZXItYmxvY2snKTsvL+inpuWPkeWZqFxyXG4gICAgY29uc3QgY2xpZW50UmVjdCA9IGJsb2NrRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOy8v6Kem5Y+R5Zmo5L2N572uXHJcbiAgICBsZXQgcGFuZWxEb206IGFueSA9IHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5jLWNvbG9yLXBpY2tlci1wYW5lbCcpOy8v5by55Ye66Z2i5p2/XHJcbiAgICAvL+inpuWPkeWZqOWkp+Wwj1xyXG4gICAgbGV0IGJsb2NrV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgYmxvY2tIZWlnaHQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5uY1NpemUgPT0gJ3NtYWxsJykge1xyXG4gICAgICBibG9ja1dpZHRoID0gMTY7XHJcbiAgICAgIGJsb2NrSGVpZ2h0ID0gMTY7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubmNTaXplID09ICdsYXJnZScpIHtcclxuICAgICAgYmxvY2tXaWR0aCA9IDMyO1xyXG4gICAgICBibG9ja0hlaWdodCA9IDMyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmxvY2tXaWR0aCA9IDI0O1xyXG4gICAgICBibG9ja0hlaWdodCA9IDI0O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYW5lbEhlaWdodDogbnVtYmVyID0gMjkwOy8v5by55Ye66Z2i5p2/6auYXHJcbiAgICBsZXQgcGFuZWxXaWR0aDogbnVtYmVyID0gMjgyOy8v5by55Ye66Z2i5p2/5a69XHJcbiAgICBsZXQgZ2FwOiBudW1iZXIgPSAyMDsvL+mihOeVmemXtOmamVxyXG4gICAgbGV0IHdpbmRvd0hlaWdodDogbnVtYmVyID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgbGV0IHdpbmRvd1dpZHRoOiBudW1iZXIgPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcbiAgICAvL+a4hemZpOS4ieinkuW9olxyXG4gICAgcGFuZWxEb20uY2xhc3NMaXN0LnJlbW92ZSgndG9wVHJpYW5nbGUnKTtcclxuICAgIHBhbmVsRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2JvdHRvbVRyaWFuZ2xlJyk7XHJcbiAgICBwYW5lbERvbS5jbGFzc0xpc3QucmVtb3ZlKCdsZWZ0VHJpYW5nbGUnKTtcclxuICAgIHBhbmVsRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3JpZ2h0VHJpYW5nbGUnKTtcclxuXHJcbiAgICBpZiAoY2xpZW50UmVjdC5sZWZ0IDwgKHBhbmVsV2lkdGggLyAyIC0gYmxvY2tXaWR0aCAvIDIpICYmIGNsaWVudFJlY3QudG9wIDwgKHBhbmVsSGVpZ2h0IC8gMiAtIGJsb2NrSGVpZ2h0IC8gMikpIHtcclxuICAgICAgLy/lj7PkuIvlvLnlh7oo6Kem5Y+R5Zmo5L2N5LqO56qX5Y+j5bem5LiK6KeSKVxyXG4gICAgICBwYW5lbERvbS5zdHlsZS5sZWZ0ID0gYmxvY2tXaWR0aCArIGdhcCAvIDIgKyAncHgnO1xyXG4gICAgICBwYW5lbERvbS5zdHlsZS50b3AgPSBibG9ja0hlaWdodCArIGdhcCAvIDIgKyAncHgnO1xyXG4gICAgfSBlbHNlIGlmICh3aW5kb3dXaWR0aCAtIGNsaWVudFJlY3QucmlnaHQgPCAocGFuZWxXaWR0aCAvIDIgLSBibG9ja1dpZHRoIC8gMikgJiYgd2luZG93SGVpZ2h0IC0gY2xpZW50UmVjdC5ib3R0b20gPCAocGFuZWxIZWlnaHQgLyAyIC0gYmxvY2tIZWlnaHQgLyAyKSkge1xyXG4gICAgICAvL+W3puS4iuW8ueWHuijop6blj5HlmajkvY3kuo7nqpflj6Plj7PkuIvop5IpXHJcbiAgICAgIHBhbmVsRG9tLnN0eWxlLnJpZ2h0ID0gYmxvY2tXaWR0aCArIGdhcCAvIDIgKyAncHgnO1xyXG4gICAgICBwYW5lbERvbS5zdHlsZS5ib3R0b20gPSBibG9ja0hlaWdodCArIGdhcCAvIDIgKyAncHgnO1xyXG4gICAgfSBlbHNlIGlmIChjbGllbnRSZWN0LmxlZnQgPCAocGFuZWxXaWR0aCAvIDIgLSBibG9ja1dpZHRoIC8gMikgJiYgd2luZG93SGVpZ2h0IC0gY2xpZW50UmVjdC5ib3R0b20gPCAocGFuZWxIZWlnaHQgLyAyIC0gYmxvY2tIZWlnaHQgLyAyKSkge1xyXG4gICAgICAvL+WPs+S4iuW8ueWHuijop6blj5HlmajkvY3kuo7nqpflj6Plt6bkuIvop5IpXHJcbiAgICAgIHBhbmVsRG9tLnN0eWxlLmxlZnQgPSBibG9ja1dpZHRoICsgZ2FwIC8gMiArICdweCc7XHJcbiAgICAgIHBhbmVsRG9tLnN0eWxlLmJvdHRvbSA9IGJsb2NrSGVpZ2h0ICsgZ2FwIC8gMiArICdweCc7XHJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFJlY3QudG9wIDwgKHBhbmVsSGVpZ2h0IC8gMiAtIGJsb2NrSGVpZ2h0IC8gMikgJiYgd2luZG93V2lkdGggLSBjbGllbnRSZWN0LnJpZ2h0IDwgKHBhbmVsV2lkdGggLyAyIC0gYmxvY2tXaWR0aCAvIDIpKSB7XHJcbiAgICAgIC8v5bem5LiL5by55Ye6KOinpuWPkeWZqOS9jeS6jueql+WPo+WPs+S4iuinkilcclxuICAgICAgcGFuZWxEb20uc3R5bGUucmlnaHQgPSBibG9ja1dpZHRoICsgZ2FwIC8gMiArICdweCc7XHJcbiAgICAgIHBhbmVsRG9tLnN0eWxlLnRvcCA9IGJsb2NrSGVpZ2h0ICsgZ2FwIC8gMiArICdweCc7XHJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFJlY3QubGVmdCA+PSAocGFuZWxXaWR0aCAvIDIgLSBibG9ja1dpZHRoIC8gMikgJiYgd2luZG93V2lkdGggLSBjbGllbnRSZWN0LnJpZ2h0ID49IChwYW5lbFdpZHRoIC8gMiAtIGJsb2NrV2lkdGggLyAyKSAmJiB3aW5kb3dIZWlnaHQgLSBjbGllbnRSZWN0LmJvdHRvbSA+PSBwYW5lbEhlaWdodCArIGdhcCkge1xyXG4gICAgICAvL+S4i+W8ueWHuijlt6blj7PkuIvnqbrpl7TotrPlpJ8pXHJcbiAgICAgIHBhbmVsRG9tLnN0eWxlLmxlZnQgPSAtKHBhbmVsV2lkdGggLyAyIC0gYmxvY2tXaWR0aCAvIDIpICsgJ3B4JztcclxuICAgICAgcGFuZWxEb20uc3R5bGUudG9wID0gYmxvY2tIZWlnaHQgKyBnYXAgKyAncHgnO1xyXG4gICAgICBwYW5lbERvbS5jbGFzc0xpc3QuYWRkKCd0b3BUcmlhbmdsZScpOy8v5re75Yqg5LiJ6KeS5b2iXHJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFJlY3QubGVmdCA+PSAocGFuZWxXaWR0aCAvIDIgLSBibG9ja1dpZHRoIC8gMikgJiYgd2luZG93V2lkdGggLSBjbGllbnRSZWN0LnJpZ2h0ID49IChwYW5lbFdpZHRoIC8gMiAtIGJsb2NrV2lkdGggLyAyKSAmJiBjbGllbnRSZWN0LnRvcCA+PSBwYW5lbEhlaWdodCArIGdhcCkge1xyXG4gICAgICAvL+S4iuW8ueWHuijlt6blj7PkuIrnqbrpl7TotrPlpJ8pXHJcbiAgICAgIHBhbmVsRG9tLnN0eWxlLmxlZnQgPSAtKHBhbmVsV2lkdGggLyAyIC0gYmxvY2tXaWR0aCAvIDIpICsgJ3B4JztcclxuICAgICAgcGFuZWxEb20uc3R5bGUuYm90dG9tID0gYmxvY2tIZWlnaHQgKyBnYXAgKyAncHgnO1xyXG4gICAgICBwYW5lbERvbS5jbGFzc0xpc3QuYWRkKCdib3R0b21UcmlhbmdsZScpOy8v5re75Yqg5LiJ6KeS5b2iXHJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFJlY3QudG9wID49IChwYW5lbEhlaWdodCAvIDIgLSBibG9ja0hlaWdodCAvIDIpICYmIHdpbmRvd0hlaWdodCAtIGNsaWVudFJlY3QuYm90dG9tID49IChwYW5lbEhlaWdodCAvIDIgLSBibG9ja0hlaWdodCAvIDIpICYmIHdpbmRvd1dpZHRoIC0gY2xpZW50UmVjdC5yaWdodCA+PSBwYW5lbFdpZHRoICsgZ2FwKSB7XHJcbiAgICAgIC8v5Y+z5by55Ye6KOS4iuS4i+WPs+epuumXtOi2s+WknylcclxuICAgICAgcGFuZWxEb20uc3R5bGUubGVmdCA9IGJsb2NrSGVpZ2h0ICsgZ2FwICsgJ3B4JztcclxuICAgICAgcGFuZWxEb20uc3R5bGUuYm90dG9tID0gLShwYW5lbEhlaWdodCAvIDIgLSBibG9ja0hlaWdodCAvIDIpICsgJ3B4JztcclxuICAgICAgcGFuZWxEb20uY2xhc3NMaXN0LmFkZCgnbGVmdFRyaWFuZ2xlJyk7Ly/mt7vliqDkuInop5LlvaJcclxuICAgIH0gZWxzZSBpZiAoY2xpZW50UmVjdC50b3AgPj0gKHBhbmVsSGVpZ2h0IC8gMiAtIGJsb2NrSGVpZ2h0IC8gMikgJiYgd2luZG93SGVpZ2h0IC0gY2xpZW50UmVjdC5ib3R0b20gPj0gKHBhbmVsSGVpZ2h0IC8gMiAtIGJsb2NrSGVpZ2h0IC8gMikgJiYgY2xpZW50UmVjdC5sZWZ0ID49IHBhbmVsV2lkdGggKyBnYXApIHtcclxuICAgICAgLy/lt6blvLnlh7oo5LiK5LiL5bem56m66Ze06Laz5aSfKVxyXG4gICAgICBwYW5lbERvbS5zdHlsZS5yaWdodCA9IGJsb2NrSGVpZ2h0ICsgZ2FwICsgJ3B4JztcclxuICAgICAgcGFuZWxEb20uc3R5bGUuYm90dG9tID0gLShwYW5lbEhlaWdodCAvIDIgLSBibG9ja0hlaWdodCAvIDIpICsgJ3B4JztcclxuICAgICAgcGFuZWxEb20uY2xhc3NMaXN0LmFkZCgncmlnaHRUcmlhbmdsZScpOy8v5re75Yqg5LiJ6KeS5b2iXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8v5Yqg5bu26L+f6K6pY2xpY2tPdXTlhYjop6blj5FcclxuICAgICAgdGhpcy5wYW5lbFNob3cgPSB0cnVlO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8v54K55Ye76Imy55u45p+x77yM6K6h566X6Imy55u4SChodWUpXHJcbiAgc2V0SHVlU2xpZGVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBjb2xvckJhcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY29sb3JCYXInKTtcclxuICAgIGxldCBkaXZTbGlkZXI6IGFueSA9IHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2RpdlNsaWRlcicpO1xyXG4gICAgbGV0IGNvbG9yQmFyV0lEVEg6IGFueSA9IGNvbG9yQmFyLmNsaWVudFdpZHRoO1xyXG4gICAgY29uc3QgY2xpZW50UmVjdCA9IGNvbG9yQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgLy8g6I635Y+W5L2N572u5L+h5oGvXHJcbiAgICBsZXQgeERpZmYgPSBldmVudC5jbGllbnRYIC0gY2xpZW50UmVjdC5sZWZ0O1xyXG4gICAgeERpZmYgPSB4RGlmZiA+IGNvbG9yQmFyV0lEVEggPyBjb2xvckJhcldJRFRIIDogKHhEaWZmIDwgMCA/IDAgOiB4RGlmZik7Ly8wLTIwMFxyXG4gICAgLy8g6K6+572u5ruR5Z2X55qE5L2N572u77yM5L+d6K+B5ruR5Z2X6Iez5bCR5LiA5Y2K5Zyo6Z2i5p2/5YaFXHJcbiAgICBkaXZTbGlkZXIuc3R5bGUubGVmdCA9IHhEaWZmIC0gNiArICdweCc7XHJcbiAgICAvLyDoibLnm7jlnKgzNjDluqbku6XlhoXvvIzorqHnrpflr7nlupTnmoTmr5TkvovlgLzvvIwgMCAtIDM2MFxyXG4gICAgdGhpcy5oc3YuaHVlID0gTWF0aC5yb3VuZCgoeERpZmYgLyBjb2xvckJhcldJRFRIKSAqIDM2MCAqIDEwMCkgLyAxMDAgfCAwO1xyXG5cclxuICAgIC8v6L2s5o2iXHJcbiAgICB0aGlzLnJnYiA9IHRoaXMuaHN2VG9SZ2IodGhpcy5oc3YuaHVlLCB0aGlzLmhzdi5zYXR1cmF0aW9uLCB0aGlzLmhzdi52YWx1ZSk7XHJcbiAgICB0aGlzLmh1ZUNvbG9yID0gdGhpcy5oc3ZUb1JnYih0aGlzLmhzdi5odWUsIDEwMCwgMTAwKS5qb2luKCcsJyk7XHJcbiAgICB0aGlzLmhleGEgPSB0aGlzLnJnYmFUb0hleGEodGhpcy5yZ2JbMF0sIHRoaXMucmdiWzFdLCB0aGlzLnJnYlsyXSwgdGhpcy5hbHBoYSk7XHJcblxyXG4gICAgdGhpcy5zZXROY1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvL+eCueWHu+mAj+aYjuafse+8jOiuoeeul+mAj+aYjuW6plxyXG4gIHNldEFscGhhKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBhbHBoYUJhcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjYWxwaGFCYXInKTtcclxuICAgIGxldCBkaXZBbHBoYVNsaWRlcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZGl2QWxwaGFTbGlkZXInKTtcclxuICAgIGxldCBhbHBoYUJhcldJRFRIOiBhbnkgPSBhbHBoYUJhci5jbGllbnRXaWR0aDtcclxuICAgIGNvbnN0IGNsaWVudFJlY3QgPSBhbHBoYUJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIC8vIOiOt+WPluS9jee9ruS/oeaBr1xyXG4gICAgbGV0IHhEaWZmID0gZXZlbnQuY2xpZW50WCAtIGNsaWVudFJlY3QubGVmdDtcclxuICAgIHhEaWZmID0geERpZmYgPiBhbHBoYUJhcldJRFRIID8gYWxwaGFCYXJXSURUSCA6ICh4RGlmZiA8IDAgPyAwIDogeERpZmYpOy8vMC0yMDBcclxuICAgIC8vIOiuvue9rua7keWdl+eahOS9jee9ru+8jOS/neivgea7keWdl+iHs+WwkeS4gOWNiuWcqOmdouadv+WGhVxyXG4gICAgZGl2QWxwaGFTbGlkZXIuc3R5bGUubGVmdCA9IHhEaWZmIC0gNiArICdweCc7XHJcbiAgICAvL+mAj+aYjuW6puWPluWAvOWcqDAtMVxyXG4gICAgdGhpcy5hbHBoYSA9ICgxMDAgLSBNYXRoLnJvdW5kKDEwMCAtIHhEaWZmIC8gYWxwaGFCYXJXSURUSCAqIDEwMCkpIC8gMTAwO1xyXG5cclxuICAgIC8v6L2s5o2iXHJcbiAgICB0aGlzLmhleGEgPSB0aGlzLnJnYmFUb0hleGEodGhpcy5yZ2JbMF0sIHRoaXMucmdiWzFdLCB0aGlzLnJnYlsyXSwgdGhpcy5hbHBoYSk7XHJcblxyXG4gICAgdGhpcy5zZXROY1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvL+eCueWHu+minOiJsumdouadv++8jOiuoeeul+mlseWSjOW6plMoc2F0dXJhdGlvbinjgIHmmI7luqZWKFZhbHVlKVxyXG4gIHNldFNhdHVyYXRpb25BbmRWYWx1ZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgY29sb3JQYW5lbDogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY29sb3JQYW5lbCcpO1xyXG4gICAgbGV0IGRpdlBpY2tlcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZGl2UGlja2VyJyk7XHJcbiAgICBsZXQgcGFuZWxXSURUSCA9IGNvbG9yUGFuZWwuY2xpZW50V2lkdGg7XHJcbiAgICBsZXQgcGFuZWxIRUlHSFQgPSBjb2xvclBhbmVsLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAvLyDorqHnrpfpvKDmoIfnp7vliqjkvY3nva7vvIzpnaLmnb/lrr3luqZwYW5lbFdJRFRI77yM6auY5bqmcGFuZWxIRUlHSFRcclxuICAgIGNvbnN0IGNsaWVudFJlY3QgPSBjb2xvclBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgbGV0IHlEaWZmID0gZXZlbnQuY2xpZW50WSAtIGNsaWVudFJlY3QudG9wO1xyXG4gICAgbGV0IHhEaWZmID0gZXZlbnQuY2xpZW50WCAtIGNsaWVudFJlY3QubGVmdDtcclxuICAgIHhEaWZmID0geERpZmYgPiBwYW5lbFdJRFRIID8gcGFuZWxXSURUSCA6ICh4RGlmZiA8IDAgPyAwIDogeERpZmYpO1xyXG4gICAgeURpZmYgPSB5RGlmZiA+IHBhbmVsSEVJR0hUID8gcGFuZWxIRUlHSFQgOiAoeURpZmYgPCAwID8gMCA6IHlEaWZmKTtcclxuXHJcbiAgICAvLyDorr7nva7mu5HlnZfkvY3nva7vvIzkv53or4Hmu5HlnZfoh7PlsJHkuIDljYrlnKjpnaLmnb/lhoVcclxuICAgIGRpdlBpY2tlci5zdHlsZS50b3AgPSB5RGlmZiAtIDggKyAncHgnO1xyXG4gICAgZGl2UGlja2VyLnN0eWxlLmxlZnQgPSB4RGlmZiAtIDggKyAncHgnO1xyXG5cclxuICAgIC8vIOmlseWSjOW6puWSjOaYjuW6pu+8jOi/memHjOayoeacieWPlueZvuWIhuavlOeahOWAvO+8jOWQjue7rei9rOaNouaXtumcgOimgeazqOaEj1xyXG4gICAgdGhpcy5oc3Yuc2F0dXJhdGlvbiA9IE1hdGgucm91bmQoeERpZmYgLyBwYW5lbFdJRFRIICogMTAwKTtcclxuICAgIHRoaXMuaHN2LnZhbHVlID0gTWF0aC5yb3VuZCgoMSAtIHlEaWZmIC8gcGFuZWxIRUlHSFQpICogMTAwKTtcclxuXHJcbiAgICAvL+i9rOaNolxyXG4gICAgdGhpcy5yZ2IgPSB0aGlzLmhzdlRvUmdiKHRoaXMuaHN2Lmh1ZSwgdGhpcy5oc3Yuc2F0dXJhdGlvbiwgdGhpcy5oc3YudmFsdWUpO1xyXG4gICAgdGhpcy5oZXhhID0gdGhpcy5yZ2JhVG9IZXhhKHRoaXMucmdiWzBdLCB0aGlzLnJnYlsxXSwgdGhpcy5yZ2JbMl0sIHRoaXMuYWxwaGEpO1xyXG5cclxuICAgIHRoaXMuc2V0TmNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy9oc3bovaxyZ2IgKGjvvJowLTM2MCBzOiAwLTEwMCB2OiAwLTEwMClcclxuICBoc3ZUb1JnYihodWU6IG51bWJlciwgc2F0dXJhdGlvbjogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBzYXR1cmF0aW9uID0gc2F0dXJhdGlvbiAqIDI1NSAvIDEwMCB8IDBcclxuICAgIHZhbHVlID0gdmFsdWUgKiAyNTUgLyAxMDAgfCAwXHJcblxyXG4gICAgaWYgKHNhdHVyYXRpb24gPT09IDApIHtcclxuICAgICAgcmV0dXJuIFt2YWx1ZSwgdmFsdWUsIHZhbHVlXVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHNhdFZhbCA9ICgyNTUgLSBzYXR1cmF0aW9uKSAqIHZhbHVlIC8gMjU1IHwgMFxyXG4gICAgICBsZXQgbGlnVmFsID0gKHZhbHVlIC0gc2F0VmFsKSAqIChodWUgJSA2MCkgLyA2MCB8IDBcclxuICAgICAgaWYgKGh1ZSA9PT0gMzYwKSB7XHJcbiAgICAgICAgcmV0dXJuIFt2YWx1ZSwgc2F0VmFsICsgbGlnVmFsLCBzYXRWYWxdXHJcbiAgICAgIH0gZWxzZSBpZiAoaHVlIDwgNjApIHtcclxuICAgICAgICByZXR1cm4gW3ZhbHVlLCBzYXRWYWwgKyBsaWdWYWwsIHNhdFZhbF1cclxuICAgICAgfSBlbHNlIGlmIChodWUgPCAxMjApIHtcclxuICAgICAgICByZXR1cm4gW3ZhbHVlIC0gbGlnVmFsLCB2YWx1ZSwgc2F0VmFsXVxyXG4gICAgICB9IGVsc2UgaWYgKGh1ZSA8IDE4MCkge1xyXG4gICAgICAgIHJldHVybiBbc2F0VmFsLCB2YWx1ZSwgc2F0VmFsICsgbGlnVmFsXVxyXG4gICAgICB9IGVsc2UgaWYgKGh1ZSA8IDI0MCkge1xyXG4gICAgICAgIHJldHVybiBbc2F0VmFsLCB2YWx1ZSAtIGxpZ1ZhbCwgdmFsdWVdXHJcbiAgICAgIH0gZWxzZSBpZiAoaHVlIDwgMzAwKSB7XHJcbiAgICAgICAgcmV0dXJuIFtzYXRWYWwgKyBsaWdWYWwsIHNhdFZhbCwgdmFsdWVdXHJcbiAgICAgIH0gZWxzZSBpZiAoaHVlIDwgMzYwKSB7XHJcbiAgICAgICAgcmV0dXJuIFt2YWx1ZSwgc2F0VmFsLCB2YWx1ZSAtIGxpZ1ZhbF1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gWzAsIDAsIDBdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vcmdi6L2saHN2ICho77yaMC0xMDAgczogMC0xMDAgdjogMC0xMDApXHJcbiAgcmdiVG9Ic3YocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcikge1xyXG4gICAgKHIgLz0gMjU1KSwgKGcgLz0gMjU1KSwgKGIgLz0gMjU1KTtcclxuICAgIGxldCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwgbWluID0gTWF0aC5taW4ociwgZywgYik7XHJcbiAgICBsZXQgaDogYW55LCBzOiBhbnksIHY6IGFueSA9IG1heDtcclxuXHJcbiAgICBsZXQgZCA9IG1heCAtIG1pbjtcclxuICAgIHMgPSBtYXggPT09IDAgPyAwIDogZCAvIG1heDtcclxuXHJcbiAgICBpZiAobWF4ID09PSBtaW4pIHtcclxuICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWNcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN3aXRjaCAobWF4KSB7XHJcbiAgICAgICAgY2FzZSByOlxyXG4gICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBnOlxyXG4gICAgICAgICAgaCA9IChiIC0gcikgLyBkICsgMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgYjpcclxuICAgICAgICAgIGggPSAociAtIGcpIC8gZCArIDQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBoIC89IDY7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtNYXRoLnJvdW5kKGggKiAxMDApLCBNYXRoLnJvdW5kKHMgKiAxMDApLCBNYXRoLnJvdW5kKHYgKiAxMDApXTtcclxuICB9XHJcblxyXG4gIC8vcmdiYei9rGhleGFcclxuICByZ2JhVG9IZXhhKHJlZDogYW55LCBncmVlbjogYW55LCBibHVlOiBhbnksIGFscGhhOiBhbnkpIHtcclxuICAgIHJlZCA9IHRoaXMuZ2V0SGV4KHJlZCk7XHJcbiAgICBncmVlbiA9IHRoaXMuZ2V0SGV4KGdyZWVuKTtcclxuICAgIGJsdWUgPSB0aGlzLmdldEhleChibHVlKTtcclxuICAgIGFscGhhID0gTWF0aC5yb3VuZChhbHBoYSAqIDI1NSk7XHJcbiAgICBhbHBoYSA9IHRoaXMuZ2V0SGV4KGFscGhhKTtcclxuICAgIHJldHVybiAnIycgKyByZWQgKyBncmVlbiArIGJsdWUgKyBhbHBoYTtcclxuICB9XHJcbiAgZ2V0SGV4KG51bTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdmFsID0gbnVtLnRvU3RyaW5nKDE2KVxyXG4gICAgdmFsID0gKHZhbC5sZW5ndGggPT09IDEpID8gKCcwJyArIHZhbCkgOiB2YWxcclxuICAgIHJldHVybiB2YWxcclxuICB9XHJcblxyXG4gIC8vaGV46L2scmdiYVxyXG4gIGhleGFUb1JnYmEoY29sb3I6IHN0cmluZykge1xyXG4gICAgY29uc3QgdmFsdWUgPSBjb2xvci5zbGljZShjb2xvci5pbmRleE9mKCcjJykgKyAxKTtcclxuICAgIGNvbnN0IGlzU2hvcnQgPSB2YWx1ZS5sZW5ndGggPT09IDMgfHwgdmFsdWUubGVuZ3RoID09PSA0O1xyXG4gICAgY29uc3QgaGFzQWxwaGEgPSB2YWx1ZS5sZW5ndGggPT09IDQgfHwgdmFsdWUubGVuZ3RoID09PSA4O1xyXG4gICAgY29uc3QgciA9IGlzU2hvcnQgPyAodmFsdWUuY2hhckF0KDApICsgdmFsdWUuY2hhckF0KDApKSA6IHZhbHVlLnN1YnN0cmluZygwLCAyKTtcclxuICAgIGNvbnN0IGcgPSBpc1Nob3J0ID8gKHZhbHVlLmNoYXJBdCgxKSArIHZhbHVlLmNoYXJBdCgxKSkgOiB2YWx1ZS5zdWJzdHJpbmcoMiwgNCk7XHJcbiAgICBjb25zdCBiID0gaXNTaG9ydCA/ICh2YWx1ZS5jaGFyQXQoMikgKyB2YWx1ZS5jaGFyQXQoMikpIDogdmFsdWUuc3Vic3RyaW5nKDQsIDYpO1xyXG4gICAgbGV0IGE6IGFueSA9IGhhc0FscGhhID8gKGlzU2hvcnQgPyAodmFsdWUuY2hhckF0KDMpICsgdmFsdWUuY2hhckF0KDMpKSA6IHZhbHVlLnN1YnN0cmluZyg2LCA4KSkgOiAnRkYnO1xyXG4gICAgYSA9IHBhcnNlRmxvYXQoKHBhcnNlSW50KGEsIDE2KSAvIDI1NSkudG9GaXhlZCgyKSk7XHJcbiAgICByZXR1cm4gW3BhcnNlSW50KHIsIDE2KSwgcGFyc2VJbnQoZywgMTYpLCBwYXJzZUludChiLCAxNiksIGFdO1xyXG4gIH1cclxuXHJcbiAgLy/ovpPlhaVyZ2JcclxuICByZ2JDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmhleGEgPSB0aGlzLnJnYmFUb0hleGEodGhpcy5yZ2JbMF0sIHRoaXMucmdiWzFdLCB0aGlzLnJnYlsyXSwgdGhpcy5hbHBoYSk7XHJcbiAgICBsZXQgaHN2ID0gdGhpcy5yZ2JUb0hzdih0aGlzLnJnYlswXSwgdGhpcy5yZ2JbMV0sIHRoaXMucmdiWzJdKTsvL2hzdihyZ2LovawsaDowLTEwMClcclxuICAgIC8v5pu05pS5dGhpcy5oc3Yo6YCJ5Y+WLGg6MC0zNjAp5YC8XHJcbiAgICAvL+mYsuatouaOpeedgOmAieWPluiJsuebuOaXtnNldEh1ZVNsaWRlcuS9v+eUqOm7mOiupOeahHNhdHVyYXRpb27lkox2YWx1ZVxyXG4gICAgLy/miJbpgInlj5bpopzoibLpnaLmnb/ml7ZzZXRTYXR1cmF0aW9uQW5kVmFsdWXkvb/nlKjpu5jorqTnmoRodWVcclxuICAgIHRoaXMuaHN2Lmh1ZSA9IE1hdGgucm91bmQoMzYwICogaHN2WzBdICogMC4wMSk7Ly8wLTEwMOi9rDAtMzYwXHJcbiAgICB0aGlzLmhzdi5zYXR1cmF0aW9uID0gaHN2WzFdO1xyXG4gICAgdGhpcy5oc3YudmFsdWUgPSBoc3ZbMl07XHJcbiAgICB0aGlzLmh1ZUNvbG9yID0gdGhpcy5oc3ZUb1JnYih0aGlzLmhzdi5odWUsIDEwMCwgMTAwKS5qb2luKCcsJyk7XHJcblxyXG4gICAgLy/osIPmlbToibLnm7jkuK3mjInpkq7kvY3nva5cclxuICAgIGxldCBjb2xvckJhcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY29sb3JCYXInKTtcclxuICAgIGxldCBkaXZTbGlkZXI6IGFueSA9IHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2RpdlNsaWRlcicpO1xyXG4gICAgbGV0IGNvbG9yQmFyV0lEVEg6IGFueSA9IGNvbG9yQmFyLmNsaWVudFdpZHRoO1xyXG4gICAgZGl2U2xpZGVyLnN0eWxlLmxlZnQgPSBjb2xvckJhcldJRFRIICogaHN2WzBdICogMC4wMSAtIDYgKyAncHgnO1xyXG5cclxuICAgIC8v6LCD5pW06aKc6Imy6Z2i5p2/5Lit5oyJ6ZKu5L2N572uXHJcbiAgICBsZXQgY29sb3JQYW5lbDogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY29sb3JQYW5lbCcpO1xyXG4gICAgbGV0IGRpdlBpY2tlcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZGl2UGlja2VyJyk7XHJcbiAgICBsZXQgcGFuZWxXSURUSCA9IGNvbG9yUGFuZWwuY2xpZW50V2lkdGg7XHJcbiAgICBsZXQgcGFuZWxIRUlHSFQgPSBjb2xvclBhbmVsLmNsaWVudEhlaWdodDtcclxuICAgIGRpdlBpY2tlci5zdHlsZS5sZWZ0ID0gcGFuZWxXSURUSCAqIGhzdlsxXSAqIDAuMDEgLSA4ICsgJ3B4JztcclxuICAgIC8vIGRpdlBpY2tlci5zdHlsZS5ib3R0b20gPSBwYW5lbEhFSUdIVCAqIGhzdlsyXSAqIDAuMDEgLSA4ICsgJ3B4JztcclxuICAgIGRpdlBpY2tlci5zdHlsZS50b3AgPSBwYW5lbEhFSUdIVCAqICgxMDAgLSBoc3ZbMl0pICogMC4wMSAtIDggKyAncHgnO1xyXG5cclxuICAgIHRoaXMuc2V0TmNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy/ovpPlhaVhXHJcbiAgYWxwaGFDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmhleGEgPSB0aGlzLnJnYmFUb0hleGEodGhpcy5yZ2JbMF0sIHRoaXMucmdiWzFdLCB0aGlzLnJnYlsyXSwgdGhpcy5hbHBoYSk7XHJcblxyXG4gICAgLy/osIPmlbTpgI/mmI7luKbkuK3mjInpkq7kvY3nva5cclxuICAgIGxldCBhbHBoYUJhcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjYWxwaGFCYXInKTtcclxuICAgIGxldCBkaXZBbHBoYVNsaWRlcjogYW55ID0gdGhpcy5lbGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjZGl2QWxwaGFTbGlkZXInKTtcclxuICAgIGxldCBhbHBoYUJhcldJRFRIOiBhbnkgPSBhbHBoYUJhci5jbGllbnRXaWR0aDtcclxuICAgIGRpdkFscGhhU2xpZGVyLnN0eWxlLmxlZnQgPSBhbHBoYUJhcldJRFRIICogdGhpcy5hbHBoYSAtIDYgKyAncHgnO1xyXG5cclxuICAgIHRoaXMuc2V0TmNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy/ovpPlhaVoZXhcclxuICBoZXhDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5oZXhhLmNoYXJBdCgwKSAhPSAnIycpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaGV4YS5sZW5ndGggIT0gNyAmJiB0aGlzLmhleGEubGVuZ3RoICE9IDkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHJnYmEgPSB0aGlzLmhleGFUb1JnYmEodGhpcy5oZXhhKTtcclxuICAgIHRoaXMucmdiID0gW3JnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl1dO1xyXG4gICAgdGhpcy5hbHBoYSA9IHJnYmFbM107XHJcbiAgICB0aGlzLnJnYkNoYW5nZSgpO1xyXG4gICAgdGhpcy5hbHBoYUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgY2xpY2tPdXQoKSB7XHJcbiAgICBpZiAodGhpcy5wYW5lbFNob3cpIHtcclxuICAgICAgdGhpcy5wYW5lbFNob3cgPSBmYWxzZTtcclxuICAgICAgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnNldEh1ZVNsaWRlcik7XHJcbiAgICAgIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5zZXRBbHBoYSk7XHJcbiAgICAgIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5zZXRTYXR1cmF0aW9uQW5kVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibmMtY29sb3ItcGlja2VyXCI+XHJcbiAgICA8IS0t6Kem5Y+R5ZmoLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmMtY29sb3ItcGlja2VyLWJsb2NrXCIgW25nQ2xhc3NdPVwiJ2Jsb2NrLScgKyBuY1NpemVcIiAoY2xpY2spPVwiYmxvY2tDbGljaygpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5jLWNvbG9yLXBpY2tlci1ibG9jay1pbm5lclwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IG5jVmFsdWV9XCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0t5by55Ye66Z2i5p2/LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmMtY29sb3ItcGlja2VyLXBhbmVsXCIgW2hpZGRlbl09XCIhcGFuZWxTaG93XCIgbmNDbGlja091dHNpZGUgKG5jQ2xpY2tPdXQpPVwiY2xpY2tPdXQoKVwiPlxyXG4gICAgICAgIDwhLS0g6aKc6Imy6Z2i5p2/IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtcGFuZWxcIj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImNvbG9yUGFuZWxcIiBjbGFzcz1cImNvbG9yLXBhbmVsXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYignICsgaHVlQ29sb3IgKyAnKSd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkaXZQaWNrZXJcIiBjbGFzcz1cImRpdi1waWNrZXJcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0t5p+x54q25p2hLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1wYW5lbFwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSDoibLnm7jmn7EgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImNvbG9yQmFyXCIgY2xhc3M9XCJjb2xvci1iYXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGl2U2xpZGVyXCIgY2xhc3M9XCJkaXYtc2xpZGVyXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYignICsgaHVlQ29sb3IgKyAnKSd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0g6YCP5piO5p+x54q2IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1hbHBoYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJhbHBoYUJhclwiIGNsYXNzPVwiYWxwaGEtYmFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDAsIDQsIDApLCByZ2IoJyArIHJnYlswXSArICcsJyArIHJnYlsxXSArICcsJysgcmdiWzJdICsgJykpJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGl2QWxwaGFTbGlkZXJcIiBjbGFzcz1cImRpdi1zbGlkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiAncmdiYSgnICsgcmdiWzBdICsgJywnICsgcmdiWzFdICsgJywnKyByZ2JbMl0gKyAnLCcgKyBhbHBoYSAgKyAnKSd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS1jb2xvcuWxleekui0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sb3Itc2hvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLXNob3ctYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2JhKCcgKyByZ2JbMF0gKyAnLCcgKyByZ2JbMV0gKyAnLCcrIHJnYlsyXSArICcsJyArIGFscGhhICArICcpJ31cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0t5YC85bGV56S6LS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdC1wYW5lbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0LXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdC10aXRsZVwiPlJHQkE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHQtaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJuYy1pbnB1dC1udW1iZXJcIiBzdHlsZT1cIndpZHRoOiA0MnB4O1wiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInJnYlswXVwiIFttaW5dPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiMjU1XCIgc3RlcD1cIjFcIiAobmdNb2RlbENoYW5nZSk9XCJyZ2JDaGFuZ2UoKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJuYy1pbnB1dC1udW1iZXJcIiBzdHlsZT1cIndpZHRoOiA0MnB4O1wiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInJnYlsxXVwiIFttaW5dPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiMjU1XCIgc3RlcD1cIjFcIiAobmdNb2RlbENoYW5nZSk9XCJyZ2JDaGFuZ2UoKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJuYy1pbnB1dC1udW1iZXJcIiBzdHlsZT1cIndpZHRoOiA0MnB4O1wiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInJnYlsyXVwiIFttaW5dPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiMjU1XCIgc3RlcD1cIjFcIiAobmdNb2RlbENoYW5nZSk9XCJyZ2JDaGFuZ2UoKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJuYy1pbnB1dC1udW1iZXJcIiBzdHlsZT1cIndpZHRoOiA0MnB4O1wiIHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImFscGhhXCIgW21pbl09XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCIxXCIgc3RlcD1cIjAuMDFcIiAobmdNb2RlbENoYW5nZSk9XCJhbHBoYUNoYW5nZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHQtcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0LXRpdGxlXCI+SEVYQTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdC1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm5jLWlucHV0IG5jLWlucHV0LXNtXCIgcGxhY2Vob2xkZXI9XCJCYXNpYyB1c2FnZVwiIFsobmdNb2RlbCldPVwiaGV4YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhleENoYW5nZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS3osIPor5Xku6PnoIEtLT5cclxuICAgICAgICA8IS0tIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4O1wiPnJnYmE6e3tyZ2JbMF0gKyAnLCcgKyByZ2JbMV0gKyAnLCcrIHJnYlsyXSArICcsJyArIGFscGhhfX08L2Rpdj5cclxuICAgICAgICA8ZGl2PmhleGE6e3toZXhhfX08L2Rpdj5cclxuICAgICAgICA8ZGl2PmhzdijpgInlj5YsaDowLTM2MCk6e3toc3YuaHVlICsgJywnICsgaHN2LnNhdHVyYXRpb24gKyAnLCcgKyBoc3YudmFsdWV9fTwvZGl2PlxyXG4gICAgICAgIDxkaXY+aHN2KHJnYui9rCxoOjAtMTAwKTp7e3JnYlRvSHN2KHJnYlswXSxyZ2JbMV0scmdiWzJdKX19PC9kaXY+IC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==