UNPKG

galhui

Version:

UI library using galho framework

795 lines 68.8 kB
import { G, active, clearEvent, delay, div, g, getAll, isE, onfocusout, svg, toSVG, wrap } from "galho"; import { orray, range } from "galho/orray.js"; import { call, def, isA, isF, isN, isP, isS, l, t } from "galho/util.js"; import { anim } from "./util.js"; export const icons = {}; /**settings */ export const $ = { // c: "_", delay: 500, rem: 16 }; /**words */ export const w = {}; export function word(key) { return key; } export function sentence(format) { const exp = /\{\w+\}/; format.replace(exp, (v) => w[v.slice(1, v.length - 1)]); } export const body = () => new G(document.body); export const doc = () => new G(document); /**selector for element that can gain focus*/ export const focusable = ":not(:disabled):is(a[href],button,input,textarea,select,[tabindex])"; export function icon(d, s) { if (d) { if (isS(d)) d = { d }; else if (isE(d)) return d.c(`icon ${s || ''}`); return svg('svg', { fill: d.c || "currentColor", viewBox: $.is || "0 0 24 24", }, svg('path', { d: d.d })).c(`icon ${s || ''}`); } } export const label = (v, cls) => v && ((isS(v) ? div(0, v) : isA(v) ? div([icon(v[0]), v[1]]) : g(v)))?.c(cls); export function bt(text, click, type = "button") { return g("button", "_ bt", text).p("type", type).on("click", click); } export const link = (text, href) => g("a", "_ link", text).p("href", href); /** button with icon */ export function ibt(i, text, click, type = "button") { return g("button", "_ bt", [icon(i), text]) .p("type", type) .c("icon", !text).on("click", click); } export function positive(i, text, click, type) { return ibt(i, text, click, type).c("accept"); } export function negative(i, text, click, type) { return ibt(i, text, click, type).c("error"); } /** link with icon */ export function ilink(i, text, href) { return g("a", "lk" /* C.link */, [icon(i), text]).p("href", href); } /**close button */ export function close(click) { return g("button", `_ ${"cl" /* C.close */}`, icon(icons.close)).p("type", "button").on("click", click); } /**cancel button */ export function cancel(click) { return negative(icons.cancel, w.cancel, click); } /**confirm button */ export function confirm(click) { return positive(null, w.confirm, click, "submit"); } export function buttons(...buttons) { return div("bs" /* C.buttons */, buttons); } export function img(src, cls) { return g("img", cls).p("src", src); } export function a(href, content, cls) { return g("a", cls, content).p("href", href); } export function hr(cls) { return g("hr", cls); } export function logo(v) { if (v) if (isS(v)) { switch (v[0]) { case ".": case "/": return img(v).c("icon"); case "<": return toSVG(v).c("icon"); } } else return icon(v); } export function hoverBox({ x, y, right: r, bottom: b }, e, [o, side, main]) { /*m:main,s:side,w:windows,e:Element,h:Horizontal */ let { innerHeight: wh, innerWidth: ww } = window, { width: ew, height: eh } = e.rect, h = o == "h", border = $.rem * .4, [ws, wm, es, em, s0, m0, s1, m1] = h ? [wh, ww, eh, ew, y, x, b, r] : [ww, wh, ew, eh, x, y, r, b]; main ||= (m0 + (m1 - m0) / 2) > (wm / 2) ? "s" : "e"; e .css({ //main ["max" + (h ? "Width" : "Height")]: (main == "e" ? wm - m1 : m0) - border * 2 + "px", [h ? "left" : "top"]: (main == "e" ? m1 + border : Math.max(0, m0 - em) - border) + "px", //side ["max" + (h ? "Height" : "Width")]: (side == "e" ? ws - s0 : s1) - border + "px", [h ? "top" : "left"]: Math.max(0, Math.min(ws - es, side == "s" ? s1 - es : side == "e" ? s0 : s0 + (s1 - s0) / 2 - es / 2)) + "px", }); } export function notify(content, { style, close: cl, v, h }) { let temp = div(`_ notify msg ${style || ""} ${v || ""} ${h || ""}`).addTo(body()); let r = () => temp.remove(); temp.add([ content, t(cl) && close(r) ]); setTimeout(r, 2000); } export function menu(items) { return div("_ menu", g("table", 0, items)); } /**menu item */ export function menuitem(i, text, action, side, disabled) { return g("tr", `i ${disabled ? "ds" /* C.disabled */ : ""}`, [ g("td", 0, icon(i)), g("td", 0, text), g("td", "sd" /* C.side */, side), g("td") ]).on("click", !disabled && action); } // export function menuitemFull(){ // return g("tr","i",[g("td"),g("td",{colSpan:3})]) // } /**checkbox */ export function menucb(checked, text, toggle, id, disabled) { let input = g("input", { id, checked, disabled, indeterminate: checked == null, type: "checkbox" }); toggle && input.on("input", () => toggle.call(input, input.e.checked)); return g("tr", `i ${disabled ? "ds" /* C.disabled */ : ""}`, [ g("td", 0, input), g("td", 0, text).on("click", () => input.e.click()), g("td"), g("td") ]).on("click", e => e.stopPropagation()); } export function menuwait(callback) { return call(g("tr", 0, g("td", 0, wait(1 /* WaitType.out */)).p("colSpan", 4)), tr => waiter(tr, callback)); } export const submenu = (i, text, items) => call(g("tr", "i", [ g("td", 0, icon(i)), g("td", 0, text), g("td"), g("td", 0, icon("menuR")) ]), e => { let mn; e.on("click", () => { e.tcls("on" /* C.on */).is('.' + "on" /* C.on */) ? hoverBox(e.rect, (mn ||= g("table", "menu", items)).addTo(e), "h") : mn.remove(); }); }); export const menusep = () => g("tr", "_ hr"); /** @deprecated */ export function menubar(...items) { return div("_ bar", items); } export function containedBar(...items) { return g("nav", "_ bar", div("_ container", items)); } /** @deprecated */ export function right() { return div("r" /* HAlign.right */); } export function mbitem(i, text, action) { return g("button", "i", [icon(i), text]).p({ type: "button" }).on("click", action); } /**menubar separator */ export function mbsep() { return g("hr"); } /**menubar checkbox */ export function barcb(checked, text, toggle, disabled) { let input = g("input", { checked, disabled, indeterminate: checked == null, type: "checkbox" }); toggle && input.on("input", () => toggle.call(input, input.e.checked)); return g("label", `i ${disabled ? "ds" /* C.disabled */ : ""}`, [input, text]); } /**place holder */ export function ph(type = 1 /* WaitType.out */) { switch (type) { case 0 /* WaitType.inline */: case 1 /* WaitType.out */: return div("ld" /* C.loading */, [ //icon({ /*s: size, */d: `loading ${C.centered}` }), //icon({ /*s: size, */d: `loading ${C.itemA} ${C.centered}` }), ]); } } export function waiter(element, cb) { cb && (isP(cb) ? cb : cb?.()).then(t => { if (t instanceof G) { t.c(Array.from(element.e.classList).slice(1)); t.attr("style", (t.attr("style") || "") + (element.attr("style") || "")); } element.replace(t); }); } export function wait(type, body) { if (!isN(type)) { body = type; type = 0 /* WaitType.inline */; } let loader = ph(type); waiter(loader, body); return loader; } //todo: colocar no galhui export function loading(sz = "n") { return div("_ blank", div("_ load " + sz)); } export function busy(arg0, arg1, arg2, arg3) { if (isF(arg0)) { let e = g("span"); (async () => { let t = setTimeout(() => e.replace(e = loading(arg1)), def(arg2, 750)); e.replace(e = await arg0()); clearTimeout(t); })(); // setTimeout(async () => e.replace(e = await arg0()), def(arg2, 750)); // let t = await arg0(); // e.parent && e.replace(t); // e = t; return e; } else { let e = loading(arg2), p, t = setTimeout(() => { p = arg0.add(e).css("position"); arg0.css({ position: "relative" }); }, arg3); let close = () => { e.remove(); clearTimeout(t); arg0.css({ position: p }); }; return (async () => { try { await arg1(close); } finally { close(); } })(); } } export const blobToBase64 = (v) => new Promise((rs, rj) => { var reader = new FileReader(); reader.readAsDataURL(v); reader.onloadend = () => rs(reader.result); reader.onerror = rj; }); export function moveondoc(cursor, move, endcallback) { topLayer().css({ cursor, userSelect: "none" }); doc() .on('mousemove', move) .one('mouseup', e => { topLayer().uncss("cursor", "userSelect"); doc().off('mousemove', move); endcallback?.(e); }); } export const input = (type, name, ph, input) => g("input", { type, name, placeholder: ph }).c("_ in").on("input", input); export const textarea = (name, ph, input) => g("textarea", { name, placeholder: ph }).c("_ in").on("input", input && (function () { input(this.value); })); export const checkbox = (label, input, checked) => g("label", "_ cb", [g("input", { type: "checkbox", checked }).on("input", input && (function () { input(this.checked); })), label]); export function search(input) { let t = g("input", { type: "search", placeholder: w.search }), i = icon(icons.search); input && delay(t, "input", $.delay, () => input(t.e.value)); return (i ? div([t, i]) : t).c("_ in"); } // export const loadImg = () => new Promise<Blob>((cb) => { // let p=g("img",{ onload:()=>cb()}); // }); //#region output export const output = (...content) => g("span", "_ out", content); export const keyVal = (key, val, c, tag = "span") => g(tag, `_ out ${c || ""}`, [key, ": ", val]); export const message = (c, data) => div("_ msg", data).c(c); export const errorMessage = (data) => message("error", data); /**open modal * @returns modal container, to close modal only remove the modal container */ export function modal(hd, bd, actions, sz, blur = true) { // let content = g("dialog", "_ modal " + (sz || "")); content.on("cancel", (e) => { if (!blur) clearEvent(e); else content.remove(); }); content .add(g("form", 0, [ label(hd, "hd"), isE(bd) ? bd.c("bd") : bd, actions && div("ft", actions(() => content.remove(), content)) ])) .addTo(body()) .e.showModal(); return content; // let area = div("_ blank", ).addTo(body); // modal.p("tabIndex", 0).focus(); // blur && mdOnBlur(area); // return area; } export function tabModal(initial, items, actions = (cl) => confirm(cl), sz = "xl") { let form = g("form", "_ tab"); let content = g("dialog", "_ modal " + (sz || ""), form); let hd = div("_ main bar", items.map(([h, b]) => call(label(h, "i"), e => e.on("click", () => { form.set([hd, b, div("ft", actions(() => content.remove(), content))]); hd.childs().c("on", false); e.c("on"); })))); content.addTo(body()).e.showModal(); hd.child(initial).e.click(); return content; } export const showDialog = (e) => e.addTo(body().c("dialog-on")).call("showModal").on("close", () => { e.remove(); body().c("dialog-on", false); }); /**modal with ok and cancel buttons */ export function mdOkCancel(body, sz = "xs", valid = () => true) { return new Promise(ok => modal(null, wrap(body), cl => [ confirm(() => { if (valid) { cl(); ok(true); } }).css({ width: "50%" }), cancel(() => { cl(); ok(false); }).css({ width: "50%" }) ], sz)); } /**modal with yes/no buttons */ export function mdYN(body, sz = "xs", valid = () => true) { return new Promise(ok => modal(null, wrap(body), cl => [ positive(null, w.yes, () => { if (valid) { cl(); ok(true); } }).css({ width: "50%" }), negative(null, w.no, () => { cl(); ok(false); }).css({ width: "50%" }) ], sz)); } /**modal with ok */ export function mdOk(body, sz = "xs") { return new Promise(ok => modal(null, wrap(body), cl => confirm(() => { cl(); ok(); }), sz)); } /**md with error style and ok button */ export function mdError(body, sz = "xs") { return new Promise(ok => modal(null, wrap(body), cl => confirm(() => { cl(); ok(); }), sz).c("error")); } export const topLayer = () => g(getAll(":modal>form").at(-1)) || body(); export function popup(refArea, div, align) { return anim(() => topLayer().contains(div) && hoverBox(refArea(), div, align)); } /**context menu */ export function ctxmenu(e, data, align = "ve") { clearEvent(e); let last = active(), tl = topLayer(); let wheelHandler = (e) => clearEvent(e); let ctx = div("_ menu", g("table", 0, data)).p("tabIndex", 0) .on({ focusout(e) { ctx.contains(e.relatedTarget) || (ctx.remove() && tl.off("wheel", wheelHandler)); }, keydown(e) { if (e.key == "Escape") { e.stopPropagation(); ctx.blur(); } } }).addTo(tl).focus(); ctx.queryAll('button').on('click', function () { last ? last.focus() : this.blur(); }); tl.on("wheel", wheelHandler, { passive: false }); popup(() => new DOMRect(e.clientX, e.clientY, 0, 0), ctx, align); } export function tip(root, tip, align = "v") { if (tip) { if (isP(tip)) { let t = tip; tip = div("_ tip", wait); t.then(v => { tip = wrap(v, "_ tip"); }); } else tip = wrap(tip, "_ tip"); return (root = g(root))?.on({ mouseenter() { let tl = topLayer(); tl.add(tip); anim(() => tl.contains(root) && tip.parent ? hoverBox(root.rect, tip, align) : (tip.remove(), false)); }, mouseleave() { tip.remove(); }, //TODO:focusin,focusout // focusout(e) { // tip.remove() // }, // focusin(){ // } }); } else return root; } /**create root, add handlers */ export function selectRoot(me, options, label, menu, setValue, tag) { let p = me.p; let root = onfocusout(g(tag || "button", `_ in ${"sel" /* C.select */}`, [label.c("bd"), t(p.icon) && icon(icons.dd)?.c("sd" /* C.side */) /*, me.menu*/]), () => null) //me.set("open", false) .p("tabIndex", 0).on({ focus(e) { if (p.off) { if (e.relatedTarget) g(e.relatedTarget).focus(); else root.blur(); } else root.c("on"); }, keydown(e) { switch (e.key) { case "ArrowUp": me.set("open", true); range.move(options, "on", -1, range.tp(e.shiftKey, e.ctrlKey)); break; case "ArrowDown": me.set("open", true); range.move(options, "on", 1, range.tp(e.shiftKey, e.ctrlKey)); break; case "Enter": if (me.p.open) { let _ = (l(options) == 1 ? options[0] : options.tag('on')); _ && setValue(_[options.key]); //sub(range.list(, "on"), options.key as any)[0] me.set("open", false); } else return; // else { // let frm = g(me).closest("form"); // if (frm) frm?.e.requestSubmit(); // else return; // } break; case "Escape": if (me.p.open) { me.set("open", false); break; } else return; default: return; } clearEvent(e); }, }); tag || root.attr("type", "button"); if (t(p.click)) root.on('click', (e) => { // if (p.off) { // e.stopImmediatePropagation(); // } else { } if (!menu.contains(e.target)) me.toggle("open"); }); me.on(state => { if ("off" in state) { if (p.off) me.set("open", false); //{root.blur().attr("disabled", true).p('tabIndex', -1); } root.attr("disabled", p.off); //.p('tabIndex', t(p.tab) ? 0 : -1); } if ("open" in state) { if (p.open && p.off) { me.set("open", false); return; } me.emit('open', p.open); root.c("on", p.open); if (p.open) { root.add(menu); anim(() => { let r = root.rect; return body().contains(menu) && (menu.css("minWidth", r.width + "px"), hoverBox(r, menu, "ve")); }); } else { root.c(["b" /* VAlign.bottom */, "t" /* VAlign.top */], false); menu.remove(); } } }); return root; } export async function setValue(me, label) { let v = me.value; if (label.is("input")) { label.p("value", me.value == null ? "" : me.value); } else { if (v == null) label.c("_ ph").set(me.p.ph); else { let o = await me.option(v); label.c("ph", false).set([me.p.item(o), t(me.p.clear) && close(() => me.value = null)]); me.set("open", false); } } } export const dropdown = (label, items, align = "ve", closeOnBlur) => call(div("_ dd i", label).p("tabIndex", 0), e => { function cl() { mn?.remove(); e.c("on", false); } let mn; // = ; t(closeOnBlur) && onfocusout(e, cl); e.on("click", () => { if (mn?.parent) cl(); else { (mn ||= isF(items) ? items(cl) : menu(items)).addTo(e.c("on")); popup(() => e.rect, mn, align); } }); }); export const idropdown = (label, items, align, closeOnBlur) => dropdown([label, icon(icons.dd)], items, align, closeOnBlur); export const hidden = (head, body, open) => div(`_ ${"ac" /* C.accordion */}`, [ head = div("hd", [ icon("menuR"), head ]).c("on" /* C.on */, !!open).on("click", () => head.tcls("on" /* C.on */)), wrap(body, "bd") ]); export function accordion(items, i = {}) { return orray(items).bind(div("_ accordion"), ([hd, bd], j, p) => { p.place(j * 2, [ hd = div("hd", [ t(i.icon) && icon("menuR"), hd ]).c("on" /* C.on */, i.def == j).on("click", () => { if (hd.is('.' + "on" /* C.on */)) hd.c("on" /* C.on */, false); else { t(i.single) && p.childs("." + "hd").c("on" /* C.on */, false); hd.c("on" /* C.on */); } }), wrap(bd, "bd") ]); }); } export function tab(initial, items) { let hd = div("_ bar", items.map(([h, b]) => call(label(h, "i"), e => e.on("click", () => { d.set([hd, b]); hd.childs().c("on", false); e.c("on"); })))), d = div("_ tab"); hd.child(initial).e.click(); return d; } //#endregion // export interface IOpenSelect<T extends Object = Dic, K extends Key = Key> extends bg.ISelect<T, K> { // input?: 'text' | 'number'; // valid?: (value: string) => boolean; // } // export function openSelect<T extends Object = Dic, K extends Key = Key>(input: (this: Select<T, K>, value) => any, options: (T | K)[], i: IOpenSelect<T, K> = {}) { // let ip = i.labelE = g('input', { type: i.input }).on('input', function () { // input.call(select, this.value); // }); // i.label = (value) => { // ip.p('value', <any>value); // } // let select = new Select<T, K>(i, options); // return select; // } // export interface ISelectBase<T extends Object, K> extends IRoot { // menuE?: S; // labelE?: S; // /**element in menu or menu itself where items will be added */ // items?: S<HTMLTableElement>; // labelParent?: S; // menu?: (this: this, value: T) => One; // /**called when value change */ // setMenu?: (this: this, value: K) => void; // /**elemento dentro da label onde a label vai ser renderizada */ // //labelItem?: S; // //label: S | ((key: K) => void); // } // export abstract class SelectBase<M extends ISelectBase<T, K> = ISelectBase<any, any>, T extends Object = any, K = Key, E extends SelectEvents = SelectEvents> extends E<M, E> { // menu: S; // label: S; // options: L<T, K>; // abstract setValue(...value: K[]): void; // constructor(i: M, options?: Alias<T, K>) { // super(i); // this.options = extend<T, K>(options, { // key: "key", // parse: (e) => isO(e) ? e : { key: e } as any // }); // } // view(): S { // let // i = this.i, // lb = g(i.labelE || 'div').c("bd"); // this.label = i.labelParent || lb // model.labelItem || label; // this.menu = (i.menuE || div(0, i.items = g("table"))).c("_ menu"); // //if (model.menuItems && model.menuItems != this.menu) { // // this.menu.setClass(Cls.fill); // // model.menuItems.setClass(Cls.full); // //} // i.open = false; // //if (!md.menuRender) // // md.menuRender = value => div( null, value[md.key]); // return root(this, i, this.options); // } // protected insertItem(value: T) { // var model = this.i; // return g(model.menu(value)) // //.setClass(Cls.option) // .on('click', (e) => { // e.stopPropagation(); // let k = value[model.key]; // this.setValue(k); // }); // } // } // export interface IMultselect<T extends Object = any, K extends str | num = str> extends ISelectBase<T, K> { // value?: L<K>; // empty?: (empty: boolean, container?: S) => void; // label?: (this: L<K>, value: K, index?: number, container?: S) => void | One;// Child | Promise; // } // export class Multselect<T extends Object = { key: str }, K extends str | num = str> extends SelectBase<IMultselect<T, K>, T, K, { add: K[], remove: K[]; input: K[] } & SelectEvents> { // constructor(i: IMultselect<T, K>, options?: Array<T | K>) { // super(i, options); // this.options.addGroup("on"); // i.value = orray(i.value, { // parse(item) { // if (this.indexOf(item) == -1) // return item; // } // }); // //.bindToE(this, "value"); // } // get value() { return this.i.value; } // view() { // let // i = this.i, // values = i.value, // options = this.options, // div = super.view(), // mItems = i.items, // menu = i.items || this.menu; // this.label.css('flexWrap', 'wrap'); // bind(options, menu, { // insert: this.insertItem.bind(this), // tag(s, active, tag) { // s.c(tag, active); // if (active) { // vScroll(menu, s.e.offsetTop - menu.p('clientHeight') / 2 + s.p('clientHeight') / 2); // } // }, // groups: { // ["on"](e, active) { e.c(C.on, active); } // } // }); // bind(values, menu, { // insert(key) { // let index = itemIndex(options, key); // if (index != -1) // mItems // .child(index) // .c(C.main); // }, // remove(key) { // let index = itemIndex(options, key); // if (index != -1) // mItems // .child(index) // .c(C.main, false); // } // }); // bind(values, this.label, { // insert: i.label, // empty: i.empty // }); // return root(this, i).on("keydown", e => { // switch (e.key) { // case "Delete": { // let target = g(e.target as HTMLElement); // if (is(target, 'input') || is(target, 'textarea') || !this.delete()) // return; // else break; // } // case "Backspace": { // let target = g(e.target as HTMLElement); // if (is(target, 'input') || is(target, 'textarea') || !this.backspace()) // return; // else break; // } // } // keydown(e, this.options); // }); // } // delete() { // let vl = this.i.value; // if (!vl.length) // return false; // this.removeValue(vl[0]); // return true; // } // backspace() { // let vl = this.i.value; // if (!vl.length) // return false; // this.removeValue(z(vl)); // return true; // } // setValue(...values: K[]) { // let md = this.i; // //let list = this.model.value; // if (values.length) { // //let l = list.length; // let inserted: K[] = []; // for (let value of values) { // if (md.value.indexOf(value) == -1) { // inserted.push(value); // } // } // //md.value.push(...values); // if (inserted.length > 0) { // md.value.push(...inserted); // this.emit('add', inserted); // this.emit('input', md.value.slice()); // if (md.open && this.$) // this.setMenu(this.$) // } // } // } // removeValue(...values: K[]) { // let // md = this.i, // removed: K[] = []; // for (let value of values) { // let i = md.value.indexOf(value); // if (i != -1) { // md.value.removeAt(i); // removed.push(value); // } // } // if (removed.length > 0) { // this.emit('remove', removed); // this.emit('input', md.value.slice()); // if (md.open && this.$) // this.setMenu(this.$) // } // } // //setLabel(value: T) { // // var model = this.model; // // return model.menuRender(<T>value) // // .setClass(Cls.option) // // .on('click', (e) => { // // e.stopPropagation(); // // let k = value[model.key]; // // this.set('value', k); // // model.child.setTag(focusKey, k); // // }) // //} // } // export interface IOpenMultselect<T extends Object = Dic, K extends Key = Key> extends IMultselect<T, K> { // input?: 'text' | 'number'; // valid?: (value: string) => boolean; // /**place holder */ // ph?: str; // } // export function openMultselect<T extends Object = Dic, K extends Key = Key>(i: IOpenMultselect<T, K>, allOptions: T[]) { // let // select = new Multselect<T, K>(assign(i, { // label(value) { // i.labelE.p('value', value); // }, // labelE: g('input', { type: i.input, placeholder: i.ph }).on({ // input() { // let arg: Arg<str> = { v: this.value }; // select.emit("type" as any, arg); // if (!arg.p) { // allOptions ||= opts.slice(); // let parts = valid(arg.v.split(/\s+/g)).map(q => new RegExp(q, "gu")); // opts.set(allOptions.filter(o => parts.every(p => p.test(o[i.key])))); // } // if (l(opts) == 1) // addSelection(opts, "on", opts[0], SelectionTp.set); // }, // keydown(e) { // if (e.key == "Enter" && !opts.tags["on"]) { // clearEvent(e); // let arg: Arg<str> = { v: this.value }; // if (i.valid ? i.valid(arg.v) : false) { // select.emit("submit" as any, arg) // if (!arg.p) { // opts.push({ [i.key]: arg.v } as any); // select.setValue(arg.v as K); // } // } // } // } // }) // }), allOptions), // opts = select.options; // g(select).c(C.input) // return select; // } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsaHVpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2FsaHVpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsQ0FBQyxFQUF3RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xMLE9BQU8sRUFBSyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUF3QixJQUFJLEVBQUUsR0FBRyxFQUFxQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBWSxDQUFDLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQTRGakMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFtQixFQUFFLENBQUE7QUFDdkMsY0FBYztBQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBYTtJQUN6QixVQUFVO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixHQUFHLEVBQUUsRUFBRTtDQUNSLENBQUE7QUFDRCxXQUFXO0FBQ1gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFtQixFQUFFLENBQUE7QUFJbkMsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFRLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBVztJQUNsQyxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUM7SUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxH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RyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSTtRQUNwRixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJO1FBQ3hGLE1BQU07UUFDTixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUk7UUFDaEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO0tBQ3BJLENBQUMsQ0FBQztBQUNQLENBQUM7QUFPRCxNQUFNLFVBQVUsTUFBTSxDQUFDLE9BQVksRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFD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