UNPKG

ngx-colors-v

Version:

A beautiful color picker for angular that let you choose from a color palette, using sliders (Hue, Lightness, Alpha sliders) or through text input(hex, rgba, hsla)

247 lines 37.7 kB
import { Injectable } from "@angular/core"; import { Cmyk, Rgba, Hsla, Hsva } from "../clases/formats"; import { ColorFormats } from "../enums/formats"; import * as i0 from "@angular/core"; export class ConverterService { // private active: ColorPickerComponent | null = null; constructor() { } // public setActive(active: ColorPickerComponent | null): void { // this.active = active; // } toFormat(hsva, format) { var output = ""; if (hsva) { switch (format) { case ColorFormats.HEX: var rgba = this.hsvaToRgba(hsva); rgba.denormalize(); var output = this.rgbaToHex(rgba, true); break; case ColorFormats.HSLA: var hsla = this.hsva2hsla(hsva); hsla.denormalize(); var output = hsla.toString(); break; case ColorFormats.RGBA: var rgba = this.hsvaToRgba(hsva); var output = rgba.toString(); break; case ColorFormats.CMYK: var rgba = this.hsvaToRgba(hsva); var cmyk = this.rgbaToCmyk(rgba); break; } } return output; } stringToFormat(color, format) { var hsva = this.stringToHsva(color, true); return this.toFormat(hsva, format); } hsva2hsla(hsva) { const h = hsva.h, s = hsva.s, v = hsva.v, a = hsva.a; if (v === 0) { return new Hsla(h, 0, 0, a); } else if (s === 0 && v === 1) { return new Hsla(h, 1, 1, a); } else { const l = (v * (2 - s)) / 2; return new Hsla(h, (v * s) / (1 - Math.abs(2 * l - 1)), l, a); } } hsla2hsva(hsla) { const h = Math.min(hsla.h, 1), s = Math.min(hsla.s, 1); const l = Math.min(hsla.l, 1), a = Math.min(hsla.a, 1); if (l === 0) { return new Hsva(h, 0, 0, a); } else { const v = l + (s * (1 - Math.abs(2 * l - 1))) / 2; return new Hsva(h, (2 * (v - l)) / v, v, a); } } hsvaToRgba(hsva) { let r, g, b; const h = hsva.h, s = hsva.s, v = hsva.v, a = hsva.a; const i = Math.floor(h * 6); const f = h * 6 - i; const p = v * (1 - s); const q = v * (1 - f * s); const t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: (r = v), (g = t), (b = p); break; case 1: (r = q), (g = v), (b = p); break; case 2: (r = p), (g = v), (b = t); break; case 3: (r = p), (g = q), (b = v); break; case 4: (r = t), (g = p), (b = v); break; case 5: (r = v), (g = p), (b = q); break; default: (r = 0), (g = 0), (b = 0); } return new Rgba(r, g, b, a); } cmykToRgb(cmyk) { const r = (1 - cmyk.c) * (1 - cmyk.k); const g = (1 - cmyk.m) * (1 - cmyk.k); const b = (1 - cmyk.y) * (1 - cmyk.k); return new Rgba(r, g, b, cmyk.a); } rgbaToCmyk(rgba) { const k = 1 - Math.max(rgba.r, rgba.g, rgba.b); if (k === 1) { return new Cmyk(0, 0, 0, 1, rgba.a); } else { const c = (1 - rgba.r - k) / (1 - k); const m = (1 - rgba.g - k) / (1 - k); const y = (1 - rgba.b - k) / (1 - k); return new Cmyk(c, m, y, k, rgba.a); } } rgbaToHsva(rgba) { let h, s; const r = Math.min(rgba.r, 1), g = Math.min(rgba.g, 1); const b = Math.min(rgba.b, 1), a = Math.min(rgba.a, 1); const max = Math.max(r, g, b), min = Math.min(r, g, b); const v = max, d = max - min; s = max === 0 ? 0 : d / max; if (max === min) { h = 0; } 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; default: h = 0; } h /= 6; } return new Hsva(h, s, v, a); } rgbaToHex(rgba, allowHex8) { /* tslint:disable:no-bitwise */ let hex = "#" + ((1 << 24) | (rgba.r << 16) | (rgba.g << 8) | rgba.b) .toString(16) .substr(1); if (rgba.a != 1) { hex += ((1 << 8) | Math.round(rgba.a * 255)).toString(16).substr(1); } /* tslint:enable:no-bitwise */ return hex; } normalizeCMYK(cmyk) { return new Cmyk(cmyk.c / 100, cmyk.m / 100, cmyk.y / 100, cmyk.k / 100, cmyk.a); } denormalizeCMYK(cmyk) { return new Cmyk(Math.floor(cmyk.c * 100), Math.floor(cmyk.m * 100), Math.floor(cmyk.y * 100), Math.floor(cmyk.k * 100), cmyk.a); } denormalizeRGBA(rgba) { return new Rgba(Math.round(rgba.r * 255), Math.round(rgba.g * 255), Math.round(rgba.b * 255), rgba.a); } stringToHsva(colorString = "", allowHex8 = true) { let hsva = null; colorString = (colorString || "").toLowerCase(); const stringParsers = [ { re: /(rgb)a?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*%?,\s*(\d{1,3})\s*%?(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, parse: function (execResult) { return new Rgba(parseInt(execResult[2], 10) / 255, parseInt(execResult[3], 10) / 255, parseInt(execResult[4], 10) / 255, isNaN(parseFloat(execResult[5])) ? 1 : parseFloat(execResult[5])); }, }, { re: /(hsl)a?\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, parse: function (execResult) { return new Hsla(parseInt(execResult[2], 10) / 360, parseInt(execResult[3], 10) / 100, parseInt(execResult[4], 10) / 100, isNaN(parseFloat(execResult[5])) ? 1 : parseFloat(execResult[5])); }, }, ]; if (allowHex8) { stringParsers.push({ re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})?$/, parse: function (execResult) { return new Rgba(parseInt(execResult[1], 16) / 255, parseInt(execResult[2], 16) / 255, parseInt(execResult[3], 16) / 255, parseInt(execResult[4] || "FF", 16) / 255); }, }); } else { stringParsers.push({ re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/, parse: function (execResult) { return new Rgba(parseInt(execResult[1], 16) / 255, parseInt(execResult[2], 16) / 255, parseInt(execResult[3], 16) / 255, 1); }, }); } stringParsers.push({ re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/, parse: function (execResult) { return new Rgba(parseInt(execResult[1] + execResult[1], 16) / 255, parseInt(execResult[2] + execResult[2], 16) / 255, parseInt(execResult[3] + execResult[3], 16) / 255, 1); }, }); for (const key in stringParsers) { if (stringParsers.hasOwnProperty(key)) { const parser = stringParsers[key]; const match = parser.re.exec(colorString), color = match && parser.parse(match); if (color) { if (color instanceof Rgba) { hsva = this.rgbaToHsva(color); } else if (color instanceof Hsla) { hsva = this.hsla2hsva(color); } return hsva; } } } return hsva; } outputFormat(hsva) { return this.hsvaToRgba(hsva).toString(); } getFormatByString(color) { if (color) { color = color.toLowerCase(); let regexHex = /(#([\da-f]{3}(?:[\da-f]{3})?(?:[\da-f]{2})?))/; let regexRGBA = /(rgba\((\d{1,3},\s?){3}(1|0?\.\d+)\)|rgb\(\d{1,3}(,\s?\d{1,3}){2}\))/; let regexHSLA = /(hsla\((\d{1,3}%?,\s?){3}(1|0?\.\d+)\)|hsl\(\d{1,3}%?(,\s?\d{1,3}%?){2}\))/; if (regexHex.test(color)) { return "hex"; } else if (regexRGBA.test(color)) { return "rgba"; } else if (regexHSLA.test(color)) { return "hsla"; } } return "hex"; } } ConverterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); ConverterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ConverterService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ConverterService, decorators: [{ type: Injectable }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29sb3JzL3NyYy9saWIvc2VydmljZXMvY29udmVydGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUdoRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLHNEQUFzRDtJQUV0RCxnQkFBZSxDQUFDO0lBRWhCLGdFQUFnRTtJQUNoRSwwQkFBMEI7SUFDMUIsSUFBSTtJQUVKLFFBQVEsQ0FBQyxJQUFVLEVBQUUsTUFBb0I7UUFDdkMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksSUFBSSxFQUFFO1lBQ1IsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxZQUFZLENBQUMsR0FBRztvQkFDbkIsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNuQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDeEMsTUFBTTtnQkFDUixLQUFLLFlBQVksQ0FBQyxJQUFJO29CQUNwQixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25CLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDN0IsTUFBTTtnQkFDUixLQUFLLFlBQVksQ0FBQyxJQUFJO29CQUNwQixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzdCLE1BQU07Z0JBQ1IsS0FBSyxZQUFZLENBQUMsSUFBSTtvQkFDcEIsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxJQUFJLEdBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsTUFBTTthQUNUO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQWEsRUFBRSxNQUFvQjtRQUN2RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxTQUFTLENBQUMsSUFBVTtRQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNkLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM3QjthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTVCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7SUFFTSxTQUFTLENBQUMsSUFBVTtRQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUMzQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQVU7UUFDMUIsSUFBSSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsQ0FBQztRQUVwQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNkLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNWLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNiLEtBQUssQ0FBQztnQkFDSixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTTtZQUNSO2dCQUNFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sU0FBUyxDQUFDLElBQVU7UUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLE1BQU0sQ0FBQyxHQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO2FBQU07WUFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVyQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQVU7UUFDMUIsSUFBSSxDQUFTLEVBQUUsQ0FBUyxDQUFDO1FBRXpCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFB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QVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7aUJBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNoQyxPQUFPLE1BQU0sQ0FBQzthQUNmO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OzZHQTdVVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQgeyBDbXlrLCBSZ2JhLCBIc2xhLCBIc3ZhIH0gZnJvbSBcIi4uL2NsYXNlcy9mb3JtYXRzXCI7XHJcblxyXG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbG9yLXBpY2tlci9jb2xvci1waWNrZXIuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbG9yRm9ybWF0cyB9IGZyb20gXCIuLi9lbnVtcy9mb3JtYXRzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb252ZXJ0ZXJTZXJ2aWNlIHtcclxuICAvLyBwcml2YXRlIGFjdGl2ZTogQ29sb3JQaWNrZXJDb21wb25lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICAvLyBwdWJsaWMgc2V0QWN0aXZlKGFjdGl2ZTogQ29sb3JQaWNrZXJDb21wb25lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTtcclxuICAvLyB9XHJcblxyXG4gIHRvRm9ybWF0KGhzdmE6IEhzdmEsIGZvcm1hdDogQ29sb3JGb3JtYXRzKSB7XHJcbiAgICB2YXIgb3V0cHV0ID0gXCJcIjtcclxuICAgIGlmIChoc3ZhKSB7XHJcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgICAgY2FzZSBDb2xvckZvcm1hdHMuSEVYOlxyXG4gICAgICAgICAgdmFyIHJnYmE6IFJnYmEgPSB0aGlzLmhzdmFUb1JnYmEoaHN2YSk7XHJcbiAgICAgICAgICByZ2JhLmRlbm9ybWFsaXplKCk7XHJcbiAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5yZ2JhVG9IZXgocmdiYSwgdHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbG9yRm9ybWF0cy5IU0xBOlxyXG4gICAgICAgICAgdmFyIGhzbGE6IEhzbGEgPSB0aGlzLmhzdmEyaHNsYShoc3ZhKTtcclxuICAgICAgICAgIGhzbGEuZGVub3JtYWxpemUoKTtcclxuICAgICAgICAgIHZhciBvdXRwdXQgPSBoc2xhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbG9yRm9ybWF0cy5SR0JBOlxyXG4gICAgICAgICAgdmFyIHJnYmE6IFJnYmEgPSB0aGlzLmhzdmFUb1JnYmEoaHN2YSk7XHJcbiAgICAgICAgICB2YXIgb3V0cHV0ID0gcmdiYS50b1N0cmluZygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb2xvckZvcm1hdHMuQ01ZSzpcclxuICAgICAgICAgIHZhciByZ2JhOiBSZ2JhID0gdGhpcy5oc3ZhVG9SZ2JhKGhzdmEpO1xyXG4gICAgICAgICAgdmFyIGNteWs6IENteWsgPSB0aGlzLnJnYmFUb0NteWsocmdiYSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdHJpbmdUb0Zvcm1hdChjb2xvcjogc3RyaW5nLCBmb3JtYXQ6IENvbG9yRm9ybWF0cykge1xyXG4gICAgdmFyIGhzdmEgPSB0aGlzLnN0cmluZ1RvSHN2YShjb2xvciwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy50b0Zvcm1hdChoc3ZhLCBmb3JtYXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhzdmEyaHNsYShoc3ZhOiBIc3ZhKTogSHNsYSB7XHJcbiAgICBjb25zdCBoID0gaHN2YS5oLFxyXG4gICAgICBzID0gaHN2YS5zLFxyXG4gICAgICB2ID0gaHN2YS52LFxyXG4gICAgICBhID0gaHN2YS5hO1xyXG5cclxuICAgIGlmICh2ID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBuZXcgSHNsYShoLCAwLCAwLCBhKTtcclxuICAgIH0gZWxzZSBpZiAocyA9PT0gMCAmJiB2ID09PSAxKSB7XHJcbiAgICAgIHJldHVybiBuZXcgSHNsYShoLCAxLCAxLCBhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGwgPSAodiAqICgyIC0gcykpIC8gMjtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgSHNsYShoLCAodiAqIHMpIC8gKDEgLSBNYXRoLmFicygyICogbCAtIDEpKSwgbCwgYSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaHNsYTJoc3ZhKGhzbGE6IEhzbGEpOiBIc3ZhIHtcclxuICAgIGNvbnN0IGggPSBNYXRoLm1pbihoc2xhLmgsIDEpLFxyXG4gICAgICBzID0gTWF0aC5taW4oaHNsYS5zLCAxKTtcclxuICAgIGNvbnN0IGwgPSBNYXRoLm1pbihoc2xhLmwsIDEpLFxyXG4gICAgICBhID0gTWF0aC5taW4oaHNsYS5hLCAxKTtcclxuXHJcbiAgICBpZiAobCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbmV3IEhzdmEoaCwgMCwgMCwgYSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB2ID0gbCArIChzICogKDEgLSBNYXRoLmFicygyICogbCAtIDEpKSkgLyAyO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBIc3ZhKGgsICgyICogKHYgLSBsKSkgLyB2LCB2LCBhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoc3ZhVG9SZ2JhKGhzdmE6IEhzdmEpOiBSZ2JhIHtcclxuICAgIGxldCByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0IGggPSBoc3ZhLmgsXHJcbiAgICAgIHMgPSBoc3ZhLnMsXHJcbiAgICAgIHYgPSBoc3ZhLnYsXHJcbiAgICAgIGEgPSBoc3ZhLmE7XHJcblxyXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoaCAqIDYpO1xyXG4gICAgY29uc3QgZiA9IGggKiA2IC0gaTtcclxuICAgIGNvbnN0IHAgPSB2ICogKDEgLSBzKTtcclxuICAgIGNvbnN0IHEgPSB2ICogKDEgLSBmICogcyk7XHJcbiAgICBjb25zdCB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpO1xyXG5cclxuICAgIHN3aXRjaCAoaSAlIDYpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIChyID0gdiksIChnID0gdCksIChiID0gcCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICAociA9IHEpLCAoZyA9IHYpLCAoYiA9IHApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgKHIgPSBwKSwgKGcgPSB2KSwgKGIgPSB0KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIChyID0gcCksIChnID0gcSksIChiID0gdik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgICAociA9IHQpLCAoZyA9IHApLCAoYiA9IHYpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDU6XHJcbiAgICAgICAgKHIgPSB2KSwgKGcgPSBwKSwgKGIgPSBxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICAociA9IDApLCAoZyA9IDApLCAoYiA9IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUmdiYShyLCBnLCBiLCBhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbXlrVG9SZ2IoY215azogQ215ayk6IFJnYmEge1xyXG4gICAgY29uc3QgciA9ICgxIC0gY215ay5jKSAqICgxIC0gY215ay5rKTtcclxuICAgIGNvbnN0IGcgPSAoMSAtIGNteWsubSkgKiAoMSAtIGNteWsuayk7XHJcbiAgICBjb25zdCBiID0gKDEgLSBjbXlrLnkpICogKDEgLSBjbXlrLmspO1xyXG5cclxuICAgIHJldHVybiBuZXcgUmdiYShyLCBnLCBiLCBjbXlrLmEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJnYmFUb0NteWsocmdiYTogUmdiYSk6IENteWsge1xyXG4gICAgY29uc3QgazogbnVtYmVyID0gMSAtIE1hdGgubWF4KHJnYmEuciwgcmdiYS5nLCByZ2JhLmIpO1xyXG5cclxuICAgIGlmIChrID09PSAxKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ215aygwLCAwLCAwLCAxLCByZ2JhLmEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYyA9ICgxIC0gcmdiYS5yIC0gaykgLyAoMSAtIGspO1xyXG4gICAgICBjb25zdCBtID0gKDEgLSByZ2JhLmcgLSBrKSAvICgxIC0gayk7XHJcbiAgICAgIGNvbnN0IHkgPSAoMSAtIHJnYmEuYiAtIGspIC8gKDEgLSBrKTtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgQ215ayhjLCBtLCB5LCBrLCByZ2JhLmEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJnYmFUb0hzdmEocmdiYTogUmdiYSk6IEhzdmEge1xyXG4gICAgbGV0IGg6IG51bWJlciwgczogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0IHIgPSBNYXRoLm1pbihyZ2JhLnIsIDEpLFxyXG4gICAgICBnID0gTWF0aC5taW4ocmdiYS5nLCAxKTtcclxuICAgIGNvbnN0IGIgPSBNYXRoLm1pbihyZ2JhLmIsIDEpLFxyXG4gICAgICBhID0gTWF0aC5taW4ocmdiYS5hLCAxKTtcclxuXHJcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcclxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYik7XHJcblxyXG4gICAgY29uc3QgdjogbnVtYmVyID0gbWF4LFxyXG4gICAgICBkID0gbWF4IC0gbWluO1xyXG5cclxuICAgIHMgPSBtYXggPT09IDAgPyAwIDogZCAvIG1heDtcclxuXHJcbiAgICBpZiAobWF4ID09PSBtaW4pIHtcclxuICAgICAgaCA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKG1heCkge1xyXG4gICAgICAgIGNhc2UgcjpcclxuICAgICAgICAgIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgZzpcclxuICAgICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIGI6XHJcbiAgICAgICAgICBoID0gKHIgLSBnKSAvIGQgKyA0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGggPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBoIC89IDY7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBIc3ZhKGgsIHMsIHYsIGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJnYmFUb0hleChyZ2JhOiBSZ2JhLCBhbGxvd0hleDg/OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2UgKi9cclxuICAgIGxldCBoZXggPVxyXG4gICAgICBcIiNcIiArXHJcbiAgICAgICgoMSA8PCAyNCkgfCAocmdiYS5yIDw8IDE2KSB8IChyZ2JhLmcgPDwgOCkgfCByZ2JhLmIpXHJcbiAgICAgICAgLnRvU3RyaW5nKDE2KVxyXG4gICAgICAgIC5zdWJzdHIoMSk7XHJcblxyXG4gICAgaWYgKHJnYmEuYSAhPSAxKSB7XHJcbiAgICAgIGhleCArPSAoKDEgPDwgOCkgfCBNYXRoLnJvdW5kKHJnYmEuYSAqIDI1NSkpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XHJcbiAgICB9XHJcbiAgICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWJpdHdpc2UgKi9cclxuXHJcbiAgICByZXR1cm4gaGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5vcm1hbGl6ZUNNWUsoY215azogQ215ayk6IENteWsge1xyXG4gICAgcmV0dXJuIG5ldyBDbXlrKFxyXG4gICAgICBjbXlrLmMgLyAxMDAsXHJcbiAgICAgIGNteWsubSAvIDEwMCxcclxuICAgICAgY215ay55IC8gMTAwLFxyXG4gICAgICBjbXlrLmsgLyAxMDAsXHJcbiAgICAgIGNteWsuYVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZW5vcm1hbGl6ZUNNWUsoY215azogQ215ayk6IENteWsge1xyXG4gICAgcmV0dXJuIG5ldyBDbXlrKFxyXG4gICAgICBNYXRoLmZsb29yKGNteWsuYyAqIDEwMCksXHJcbiAgICAgIE1hdGguZmxvb3IoY215ay5tICogMTAwKSxcclxuICAgICAgTWF0aC5mbG9vcihjbXlrLnkgKiAxMDApLFxyXG4gICAgICBNYXRoLmZsb29yKGNteWsuayAqIDEwMCksXHJcbiAgICAgIGNteWsuYVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZW5vcm1hbGl6ZVJHQkEocmdiYTogUmdiYSk6IFJnYmEge1xyXG4gICAgcmV0dXJuIG5ldyBSZ2JhKFxyXG4gICAgICBNYXRoLnJvdW5kKHJnYmEuciAqIDI1NSksXHJcbiAgICAgIE1hdGgucm91bmQocmdiYS5nICogMjU1KSxcclxuICAgICAgTWF0aC5yb3VuZChyZ2JhLmIgKiAyNTUpLFxyXG4gICAgICByZ2JhLmFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RyaW5nVG9Ic3ZhKFxyXG4gICAgY29sb3JTdHJpbmc6IHN0cmluZyA9IFwiXCIsXHJcbiAgICBhbGxvd0hleDg6IGJvb2xlYW4gPSB0cnVlXHJcbiAgKTogSHN2YSB8IG51bGwge1xyXG4gICAgbGV0IGhzdmE6IEhzdmEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBjb2xvclN0cmluZyA9IChjb2xvclN0cmluZyB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGNvbnN0IHN0cmluZ1BhcnNlcnMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICByZTogLyhyZ2IpYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqJT8sXFxzKihcXGR7MSwzfSlcXHMqJT8oPzosXFxzKihcXGQrKD86XFwuXFxkKyk/KVxccyopP1xcKS8sXHJcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChleGVjUmVzdWx0OiBhbnkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmdiYShcclxuICAgICAgICAgICAgcGFyc2VJbnQoZXhlY1Jlc3VsdFsyXSwgMTApIC8gMjU1LFxyXG4gICAgICAgICAgICBwYXJzZUludChleGVjUmVzdWx0WzNdLCAxMCkgLyAyNTUsXHJcbiAgICAgICAgICAgIHBhcnNlSW50KGV4ZWNSZXN1bHRbNF0sIDEwKSAvIDI1NSxcclxuICAgICAgICAgICAgaXNOYU4ocGFyc2VGbG9hdChleGVjUmVzdWx0WzVdKSkgPyAxIDogcGFyc2VGbG9hdChleGVjUmVzdWx0WzVdKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgcmU6IC8oaHNsKWE/XFwoXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pJVxccyosXFxzKihcXGR7MSwzfSklXFxzKig/OixcXHMqKFxcZCsoPzpcXC5cXGQrKT8pXFxzKik/XFwpLyxcclxuICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGV4ZWNSZXN1bHQ6IGFueSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBIc2xhKFxyXG4gICAgICAgICAgICBwYXJzZUludChleGVjUmVzdWx0WzJdLCAxMCkgLyAzNjAsXHJcbiAgICAgICAgICAgIHBhcnNlSW50KGV4ZWNSZXN1bHRbM10sIDEwKSAvIDEwMCxcclxuICAgICAgICAgICAgcGFyc2VJbnQoZXhlY1Jlc3VsdFs0XSwgMTApIC8gMTAwLFxyXG4gICAgICAgICAgICBpc05hTihwYXJzZUZsb2F0KGV4ZWNSZXN1bHRbNV0pKSA/IDEgOiBwYXJzZUZsb2F0KGV4ZWNSZXN1bHRbNV0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIGlmIChhbGxvd0hleDgpIHtcclxuICAgICAgc3RyaW5nUGFyc2Vycy5wdXNoKHtcclxuICAgICAgICByZTogLyMoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pPyQvLFxyXG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoZXhlY1Jlc3VsdDogYW55KSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJnYmEoXHJcbiAgICAgICAgICAgIHBhcnNlSW50KGV4ZWNSZXN1bHRbMV0sIDE2KSAvIDI1NSxcclxuICAgICAgICAgICAgcGFyc2VJbnQoZXhlY1Jlc3VsdFsyXSwgMTYpIC8gMjU1LFxyXG4gICAgICAgICAgICBwYXJzZUludChleGVjUmVzdWx0WzNdLCAxNikgLyAyNTUsXHJcbiAgICAgICAgICAgIHBhcnNlSW50KGV4ZWNSZXN1bHRbNF0gfHwgXCJGRlwiLCAxNikgLyAyNTVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdHJpbmdQYXJzZXJzLnB1c2goe1xyXG4gICAgICAgIHJlOiAvIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KSQvLFxyXG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoZXhlY1Jlc3VsdDogYW55KSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJnYmEoXHJcbiAgICAgICAgICAgIHBhcnNlSW50KGV4ZWNSZXN1bHRbMV0sIDE2KSAvIDI1NSxcclxuICAgICAgICAgICAgcGFyc2VJbnQoZXhlY1Jlc3VsdFsyXSwgMTYpIC8gMjU1LFxyXG4gICAgICAgICAgICBwYXJzZUludChleGVjUmVzdWx0WzNdLCAxNikgLyAyNTUsXHJcbiAgICAgICAgICAgIDFcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RyaW5nUGFyc2Vycy5wdXNoKHtcclxuICAgICAgcmU6IC8jKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pJC8sXHJcbiAgICAgIHBhcnNlOiBmdW5jdGlvbiAoZXhlY1Jlc3VsdDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZ2JhKFxyXG4gICAgICAgICAgcGFyc2VJbnQoZXhlY1Jlc3VsdFsxXSArIGV4ZWNSZXN1bHRbMV0sIDE2KSAvIDI1NSxcclxuICAgICAgICAgIHBhcnNlSW50KGV4ZWNSZXN1bHRbMl0gKyBleGVjUmVzdWx0WzJdLCAxNikgLyAyNTUsXHJcbiAgICAgICAgICBwYXJzZUludChleGVjUmVzdWx0WzNdICsgZXhlY1Jlc3VsdFszXSwgMTYpIC8gMjU1LFxyXG4gICAgICAgICAgMVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzdHJpbmdQYXJzZXJzKSB7XHJcbiAgICAgIGlmIChzdHJpbmdQYXJzZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBjb25zdCBwYXJzZXIgPSBzdHJpbmdQYXJzZXJzW2tleV07XHJcblxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gcGFyc2VyLnJlLmV4ZWMoY29sb3JTdHJpbmcpLFxyXG4gICAgICAgICAgY29sb3I6IGFueSA9IG1hdGNoICYmIHBhcnNlci5wYXJzZShtYXRjaCk7XHJcblxyXG4gICAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgICAgaWYgKGNvbG9yIGluc3RhbmNlb2YgUmdiYSkge1xyXG4gICAgICAgICAgICBoc3ZhID0gdGhpcy5yZ2JhVG9Ic3ZhKGNvbG9yKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY29sb3IgaW5zdGFuY2VvZiBIc2xhKSB7XHJcbiAgICAgICAgICAgIGhzdmEgPSB0aGlzLmhzbGEyaHN2YShjb2xvcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGhzdmE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhzdmE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3V0cHV0Rm9ybWF0KGhzdmE6IEhzdmEpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaHN2YVRvUmdiYShoc3ZhKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1hdEJ5U3RyaW5nKGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgIGNvbG9yID0gY29sb3IudG9Mb3dlckNhc2UoKTtcclxuICAgICAgbGV0IHJlZ2V4SGV4OiBSZWdFeHAgPSAvKCMoW1xcZGEtZl17M30oPzpbXFxkYS1mXXszfSk/KD86W1xcZGEtZl17Mn0pPykpLztcclxuICAgICAgbGV0IHJlZ2V4UkdCQTogUmVnRXhwID1cclxuICAgICAgICAvKHJnYmFcXCgoXFxkezEsM30sXFxzPyl7M30oMXwwP1xcLlxcZCspXFwpfHJnYlxcKFxcZHsxLDN9KCxcXHM/XFxkezEsM30pezJ9XFwpKS87XHJcbiAgICAgIGxldCByZWdleEhTTEE6IFJlZ0V4cCA9XHJcbiAgICAgICAgLyhoc2xhXFwoKFxcZHsxLDN9JT8sXFxzPyl7M30oMXwwP1xcLlxcZCspXFwpfGhzbFxcKFxcZHsxLDN9JT8oLFxccz9cXGR7MSwzfSU/KXsyfVxcKSkvO1xyXG4gICAgICBpZiAocmVnZXhIZXgudGVzdChjb2xvcikpIHtcclxuICAgICAgICByZXR1cm4gXCJoZXhcIjtcclxuICAgICAgfSBlbHNlIGlmIChyZWdleFJHQkEudGVzdChjb2xvcikpIHtcclxuICAgICAgICByZXR1cm4gXCJyZ2JhXCI7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVnZXhIU0xBLnRlc3QoY29sb3IpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHNsYVwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJoZXhcIjtcclxuICB9XHJcbn1cclxuIl19