UNPKG

@ribajs/bs4

Version:

Bootstrap 4 module for Riba.js

341 lines 28.1 kB
import Color from "@sphinxxxx/color-conversion"; import { Component } from "@ribajs/core"; import { EventDispatcher } from "@ribajs/events"; import { hasChildNodesTrim } from "@ribajs/utils/src/dom.js"; import { debounce } from "@ribajs/utils/src/control"; class EventBucket { events = []; add(target, type, handler) { target.addEventListener(type, handler, false); this.events.push({ target, type, handler, }); } remove(target, type, handler) { this.events = this.events.filter((e) => { let isMatch = true; if (target && target !== e.target) { isMatch = false; } if (type && type !== e.type) { isMatch = false; } if (handler && handler !== e.handler) { isMatch = false; } if (isMatch) { EventBucket._doRemove(e.target, e.type, e.handler); } return !isMatch; }); } static _doRemove(target, type, handler) { target.removeEventListener(type, handler, false); } destroy() { this.events.forEach((e) => EventBucket._doRemove(e.target, e.type, e.handler)); this.events = []; } } const dragTrack = (eventBucket, area, callback) => { let dragging = false; const clamp = (val, min, max) => { return Math.max(min, Math.min(val, max)); }; const onMove = (e, info, starting) => { if (starting) { dragging = true; } if (!dragging) { return; } e.preventDefault(); const bounds = area.getBoundingClientRect(), w = bounds.width, h = bounds.height, x = info.clientX, y = info.clientY; const relX = clamp(x - bounds.left, 0, w), relY = clamp(y - bounds.top, 0, h); callback(relX / w, relY / h); }; const onMouse = (e, starting) => { const button = e.buttons === undefined ? e.which : e.buttons; if (button === 1) { onMove(e, e, starting); } else { dragging = false; } }; function onTouch(e, starting) { if (e.touches.length === 1) { onMove(e, e.touches[0], starting); } else { dragging = false; } } eventBucket.add(area, "mousedown", (e) => { onMouse(e, true); }); eventBucket.add(area, "touchstart", (e) => { onTouch(e, true); }); eventBucket.add(window, "mousemove", onMouse); eventBucket.add(area, "touchmove", onTouch); eventBucket.add(window, "mouseup", () => { dragging = false; }); eventBucket.add(area, "touchend", () => { dragging = false; }); eventBucket.add(area, "touchcancel", () => { dragging = false; }); }; const BG_TRANSP = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2'%3E%3Cpath d='M1,0H0V1H2V2H1' fill='lightgrey'/%3E%3C/svg%3E")`; const HUES = 360; const EVENT_KEY = "keydown"; function stopEvent(e) { e.preventDefault(); e.stopPropagation(); } function onKey(bucket, target, keys, handler, stop = false) { bucket.add(target, EVENT_KEY, function (e) { if (keys.indexOf(e.key) >= 0) { if (stop) { stopEvent(e); } handler(e); } }); } export class Bs4ColorPickerComponent extends Component { static tagName = "bs4-colorpicker"; static get observedAttributes() { return [ "namespace", "alpha", "editor", "editor-format", "cancel-button", "okay-button", "color", ]; } eventDispatcher; color; _debug = false; scope = { namespace: "main", hsl: [], cssHue: "", cssHsl: "", cssHsla: "", alphaBg: "", color: "#0cf", alpha: true, editor: true, editorFormat: "hex", cancelButton: false, okayButton: false, }; events = new EventBucket(); _domH = null; _domSL = null; _domA = null; _domEdit = null; _domSample = null; _domOkay = null; _domCancel = null; constructor() { super(); } connectedCallback() { super.connectedCallback(); super.init(Bs4ColorPickerComponent.observedAttributes); } requiredAttributes() { return []; } async beforeBind() { await super.beforeBind(); this.eventDispatcher = EventDispatcher.getInstance("bs4-colorpicker:" + this.scope.namespace); this.setColor(this.scope.color); this.updateUI(); this.bindEvents(); } async afterTemplate(template) { await super.afterTemplate(template); this.setElements(); } onChange(color) { this.debug("onChange", color); this.eventDispatcher?.trigger("change", color); } onDone(color) { this.debug("onDone", color); this.eventDispatcher?.trigger("done", color); } async template() { if (hasChildNodesTrim(this)) { return null; } else { const { default: template } = await import("./bs4-colorpicker.component.html?raw"); return template; } } parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) { super.parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace); if (attributeName === "color") { this.setColor(this.scope.color); } } setColor(color, flags = { silent: false }) { return debounce(this._setColor.bind(this))(color, flags); } _setColor(color, flags = { silent: false }) { if (typeof color === "string") { color = color.trim(); } if (!color) { return; } flags = flags || {}; let c; try { c = new Color(color); } catch (ex) { if (flags.failSilently) { return; } throw ex; } if (!this.scope.alpha) { const hsla = c.hsla; hsla[3] = 1; c.hsla = hsla; } this.color = c; this.setHSLA(null, null, null, null, flags); } setElements() { this._domH = this.querySelector(".picker_hue"); this._domSL = this.querySelector(".picker_sl"); this._domA = this.querySelector(".picker_alpha"); this._domEdit = this.querySelector(".picker_editor") || null; this._domSample = this.querySelector(".picker_sample"); this._domOkay = this.querySelector(".picker_done"); this._domCancel = this.querySelector(".picker_cancel"); } disconnectedCallback() { this.events.destroy(); } bindEvents() { const events = this.events; const addEvent = (target, type, handler) => { events.add(target, type, handler); }; addEvent(this, "click", (e) => e.preventDefault()); const _dragTrack = dragTrack.bind(this); if (!this._domH || !this._domSL || !this._domA || !this._domEdit || !this._domOkay) { throw new Error("Not ready!"); } _dragTrack(events, this._domH, (x) => this.setHSLA(x)); _dragTrack(events, this._domSL, (x, y) => this.setHSLA(null, x, 1 - y)); if (this.scope.alpha) { _dragTrack(events, this._domA, (x, y) => this.setHSLA(null, null, null, 1 - y)); } addEvent(this._domEdit, "input", (e) => { const input = e.target; this.setColor(input.value, { fromEditor: true, failSilently: true, }); }); addEvent(this._domEdit, "focus", (e) => { const input = e.target; if (input.selectionStart === input.selectionEnd) { input.select(); } }); const onDoneProxy = () => { this.onDone(this.color); }; addEvent(this._domOkay, "click", onDoneProxy); onKey(events, this, ["Enter"], onDoneProxy); } setHSLA(h = null, s = null, l = null, a = null, flags = {}) { if (!this.color) { throw new Error("Not ready!"); } const hsla = this.color.hsla; [h, s, l, a].forEach((x, i) => { if (x || x === 0) { hsla[i] = x; } }); this.color.hsla = hsla; this.updateUI(flags); if (this.onChange && !flags.silent) { this.onChange(this.color); } } updateUI(flags = {}) { return debounce(this._updateUI.bind(this))(flags); } _updateUI(flags = {}) { if (!this || !this.color) { return; } this.scope.hsl = this.color.hsla; this.scope.cssHue = `hsl(${this.scope.hsl[0] * HUES}, 100%, 50%)`; this.scope.cssHsl = this.color.hslString; this.scope.cssHsla = this.color.hslaString; if (!this._domH || !this._domSL || !this._domA) { throw new Error("Color ui elements not found!"); } const thumbH = this._domH.querySelector(".picker_selector"); const thumbSL = this._domSL.querySelector(".picker_selector"); const thumbA = this._domA.querySelector(".picker_selector"); if (!thumbH || !thumbSL || !thumbA || !this._domEdit || !this._domSample) { console.error(thumbH, thumbSL, thumbA, this._domA, this._domSL, this._domH, this._domEdit, this._domSample); throw new Error("Not ready!"); } const posX = (parent, child, relX) => { child.style.left = relX * 100 + "%"; }; const posY = (parent, child, relY) => { child.style.top = relY * 100 + "%"; }; posX(this._domH, thumbH, this.scope.hsl[0]); posX(this._domSL, thumbSL, this.scope.hsl[1]); posY(this._domSL, thumbSL, 1 - this.scope.hsl[2]); posY(this._domA, thumbA, 1 - this.scope.hsl[3]); const opaque = this.scope.cssHsl; const transp = opaque.replace("hsl", "hsla").replace(")", ", 0)"); const bg = `linear-gradient(${[opaque, transp]})`; this.scope.alphaBg = bg + ", " + BG_TRANSP; if (!flags.fromEditor) { const format = this.scope.editorFormat, alpha = this.scope.alpha; let color; switch (format) { case "rgb": color = this.color.printRGB(alpha); break; case "hsl": color = this.color.printHSL(alpha); break; default: color = this.color.printHex(alpha); } this.scope.color = color; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LWNvbG9ycGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2JzNC1jb2xvcnBpY2tlci9iczQtY29sb3JwaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sS0FBSyxNQUFNLDZCQUE2QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVFyRCxNQUFNLFdBQVc7SUFDTCxNQUFNLEdBQXNCLEVBQUUsQ0FBQztJQUV6QyxHQUFHLENBQUMsTUFBNEIsRUFBRSxJQUFtQixFQUFFLE9BQVk7UUFDakUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixNQUFNO1lBQ04sSUFBSTtZQUNKLE9BQU87U0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQW1CLEVBQUUsSUFBbUIsRUFBRSxPQUFZO1FBQzNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNyQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNsQixDQUFDO1lBQ0QsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNsQixDQUFDO1lBQ0QsSUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNsQixDQUFDO1lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFxQixFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBbUIsRUFBRSxJQUFtQixFQUFFLE9BQVk7UUFDckUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3hCLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQXFCLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQ2xFLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLFNBQVMsR0FBRyxDQUNoQixXQUF3QixFQUN4QixJQUFpQixFQUNqQixRQUFhLEVBQ2IsRUFBRTtJQUNGLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVyQixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDdEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLENBQ2IsQ0FBMEIsRUFDMUIsSUFBMEMsRUFDMUMsUUFBaUIsRUFDakIsRUFBRTtRQUNGLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUVuQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFDekMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQ2hCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUNqQixDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFDaEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFbkIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDdkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFckMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBYSxFQUFFLFFBQWlCLEVBQUUsRUFBRTtRQUNuRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUM3RCxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBRUksQ0FBQztZQUNKLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLFNBQVMsT0FBTyxDQUFDLENBQWEsRUFBRSxRQUFpQjtRQUMvQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDO2FBRUksQ0FBQztZQUNKLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFRRCxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFhLEVBQUUsRUFBRTtRQUNuRCxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0gsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBYSxFQUFFLEVBQUU7UUFDcEQsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUNILFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN0QyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0gsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNyQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0gsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUN4QyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUcsc0pBQXNKLENBQUM7QUFDekssTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBRWpCLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUU1QixTQUFTLFNBQVMsQ0FBQyxDQUFRO0lBRXpCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNuQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDdEIsQ0FBQztBQUNELFNBQVMsS0FBSyxDQUNaLE1BQW1CLEVBQ25CLE1BQW1CLEVBQ25CLElBQWMsRUFDZCxPQUFZLEVBQ1osSUFBSSxHQUFHLEtBQUs7SUFFWixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFnQjtRQUN0RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFXRCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsU0FBUztJQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLGlCQUFpQixDQUFDO0lBQzFDLE1BQU0sS0FBSyxrQkFBa0I7UUFDM0IsT0FBTztZQUNMLFdBQVc7WUFDWCxPQUFPO1lBQ1AsUUFBUTtZQUNSLGVBQWU7WUFDZixlQUFlO1lBQ2YsYUFBYTtZQUNiLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQztJQUVTLGVBQWUsQ0FBbUI7SUFFckMsS0FBSyxDQUFTO0lBQ2QsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLEtBQUssR0FBVTtRQUNwQixTQUFTLEVBQUUsTUFBTTtRQUNqQixHQUFHLEVBQUUsRUFBRTtRQUNQLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTSxFQUFFLEVBQUU7UUFDVixPQUFPLEVBQUUsRUFBRTtRQUNYLE9BQU8sRUFBRSxFQUFFO1FBQ1gsS0FBSyxFQUFFLE1BQU07UUFDYixLQUFLLEVBQUUsSUFBSTtRQUNYLE1BQU0sRUFBRSxJQUFJO1FBQ1osWUFBWSxFQUFFLEtBQUs7UUFDbkIsWUFBWSxFQUFFLEtBQUs7UUFDbkIsVUFBVSxFQUFFLEtBQUs7S0FDbEIsQ0FBQztJQUVRLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTNCLEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBQ2pDLE1BQU0sR0FBdUIsSUFBSSxDQUFDO0lBQ2xDLEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBQ2pDLFFBQVEsR0FBNEIsSUFBSSxDQUFDO0lBQ3pDLFVBQVUsR0FBdUIsSUFBSSxDQUFDO0lBQ3RDLFFBQVEsR0FBdUIsSUFBSSxDQUFDO0lBQ3BDLFVBQVUsR0FBdUIsSUFBSSxDQUFDO0lBRWhEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRVMsaUJBQWlCO1FBQ3pCLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVTLEtBQUssQ0FBQyxVQUFVO1FBQ3hCLE1BQU0sS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FDaEQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQzFDLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRVMsS0FBSyxDQUFDLGFBQWEsQ0FDM0IsUUFBcUM7UUFFckMsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBS1MsUUFBUSxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFLUyxNQUFNLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVTLEtBQUssQ0FBQyxRQUFRO1FBQ3RCLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FDeEMsc0NBQXNDLENBQ3ZDLENBQUM7WUFDRixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVTLDhCQUE4QixDQUN0QyxhQUFxQixFQUNyQixRQUFhLEVBQ2IsUUFBYSxFQUNiLFNBQXdCO1FBRXhCLEtBQUssQ0FBQyw4QkFBOEIsQ0FDbEMsYUFBYSxFQUNiLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxDQUNWLENBQUM7UUFDRixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFRUyxRQUFRLENBQUMsS0FBYSxFQUFFLFFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO1FBQzlELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxTQUFTLENBQUMsS0FBYSxFQUFFLFFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO1FBQy9ELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQztRQUNOLElBQUksQ0FBQztZQUVILENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNaLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFUyxXQUFXO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRO1lBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBc0IsSUFBSSxJQUFJLENBQUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFLUyxvQkFBb0I7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBS1MsVUFBVTtRQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTNCLE1BQU0sUUFBUSxHQUFHLENBQ2YsTUFBc0MsRUFDdEMsSUFBbUIsRUFDbkIsT0FBWSxFQUNaLEVBQUU7WUFDRixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBR0YsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRy9ELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFHeEMsSUFDRSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ1gsQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNaLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDWCxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2QsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNkLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQWtCLEVBQUUsQ0FDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDaEIsQ0FBQztRQUdGLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUM3QixDQUFDO1FBR0YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN0RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDdEMsQ0FBQztRQUNKLENBQUM7UUFHRCxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFhLEVBQUUsRUFBRTtZQUNqRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBMEIsQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQWEsRUFBRSxFQUFFO1lBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUEwQixDQUFDO1lBRTNDLElBQUksS0FBSyxDQUFDLGNBQWMsS0FBSyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQU9TLE9BQU8sQ0FDZixJQUFtQixJQUFJLEVBQ3ZCLElBQW1CLElBQUksRUFDdkIsSUFBbUIsSUFBSSxFQUN2QixJQUFtQixJQUFJLEVBQ3ZCLFFBQWEsRUFBRTtRQUVmLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRXZCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRVMsUUFBUSxDQUFDLFFBQWEsRUFBRTtRQUNoQyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxTQUFTLENBQUMsUUFBYSxFQUFFO1FBQ2pDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBRTNDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUNyQyxrQkFBa0IsQ0FDRyxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUN2QyxrQkFBa0IsQ0FDRyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUNyQyxrQkFBa0IsQ0FDRyxDQUFDO1FBRXhCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sQ0FBQyxLQUFLLENBQ1gsTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1lBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFtQixFQUFFLEtBQWtCLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDckUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdEMsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFtQixFQUFFLEtBQWtCLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFDckUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFHNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBR2xELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBR2xELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBSTNDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQ3BDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUUzQixJQUFJLEtBQWEsQ0FBQztZQUNsQixRQUFRLE1BQU0sRUFBRSxDQUFDO2dCQUNmLEtBQUssS0FBSztvQkFDUixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1IsS0FBSyxLQUFLO29CQUNSLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkMsTUFBTTtnQkFDUjtvQkFDRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQyJ9