From 58c32c4f21d85c5c6fc0a64f3d9bc1ea1cdb0f32 Mon Sep 17 00:00:00 2001 From: Hufe921 Date: Thu, 30 Jun 2022 22:25:34 +0800 Subject: [PATCH] feat:add laTex particle --- .vscode/settings.json | 1 + src/editor/core/draw/Draw.ts | 18 +- .../core/draw/particle/ImageParticle.ts | 36 +- .../core/draw/particle/latex/LaTexParticle.ts | 34 + .../draw/particle/latex/utils/LaTexUtils.ts | 1082 +++++++++++ .../core/draw/particle/latex/utils/hershey.ts | 1632 +++++++++++++++++ .../core/draw/particle/latex/utils/symbols.ts | 298 +++ src/editor/core/position/Position.ts | 2 +- src/editor/dataset/enum/Element.ts | 3 +- src/editor/interface/Element.ts | 5 + src/mock.ts | 11 + 11 files changed, 3099 insertions(+), 23 deletions(-) create mode 100644 src/editor/core/draw/particle/latex/LaTexParticle.ts create mode 100644 src/editor/core/draw/particle/latex/utils/LaTexUtils.ts create mode 100644 src/editor/core/draw/particle/latex/utils/hershey.ts create mode 100644 src/editor/core/draw/particle/latex/utils/symbols.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index e6ed169..0ba75df 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,7 @@ "dist", "node_modules", "yarn.lock", + "src/editor/core/draw/particle/latex/utils" ], "typescript.tsdk": "node_modules/typescript/lib", "editor.codeActionsOnSave": { diff --git a/src/editor/core/draw/Draw.ts b/src/editor/core/draw/Draw.ts index 1b63299..e750a34 100644 --- a/src/editor/core/draw/Draw.ts +++ b/src/editor/core/draw/Draw.ts @@ -21,6 +21,7 @@ import { Strikeout } from './richtext/Strikeout' import { Underline } from './richtext/Underline' import { ElementType } from '../../dataset/enum/Element' import { ImageParticle } from './particle/ImageParticle' +import { LaTexParticle } from './particle/latex/LaTexParticle' import { TextParticle } from './particle/TextParticle' import { PageNumber } from './frame/PageNumber' import { ScrollObserver } from '../observer/ScrollObserver' @@ -67,6 +68,7 @@ export class Draw { private highlight: Highlight private historyManager: HistoryManager private imageParticle: ImageParticle + private laTexParticle: LaTexParticle private textParticle: TextParticle private tableParticle: TableParticle private tableTool: TableTool @@ -117,6 +119,7 @@ export class Draw { this.strikeout = new Strikeout(this) this.highlight = new Highlight(this) this.imageParticle = new ImageParticle(this) + this.laTexParticle = new LaTexParticle(this) this.textParticle = new TextParticle(this) this.tableParticle = new TableParticle(this) this.tableTool = new TableTool(this) @@ -528,7 +531,13 @@ export class Draw { boundingBoxAscent: 0, boundingBoxDescent: 0 } - if (element.type === ElementType.IMAGE) { + if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) { + if (element.type === ElementType.LATEX) { + const { svg, width, height } = this.laTexParticle.convertLaTextToSVG(element.value) + element.width = width + element.height = height + element.laTexSVG = svg + } const elementWidth = element.width! * scale const elementHeight = element.height! * scale // 图片超出尺寸后自适应 @@ -705,7 +714,7 @@ export class Draw { curRow.width += metrics.width if (curRow.height < height) { curRow.height = height - if (element.type === ElementType.IMAGE) { + if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) { curRow.ascent = metrics.height } else { curRow.ascent = ascent @@ -749,7 +758,7 @@ export class Draw { for (let j = 0; j < curRow.elementList.length; j++) { const element = curRow.elementList[j] const metrics = element.metrics - const offsetY = element.type === ElementType.IMAGE + const offsetY = element.type === ElementType.IMAGE || element.type === ElementType.LATEX ? curRow.ascent - metrics.height : curRow.ascent const positionItem: IElementPosition = { @@ -773,6 +782,9 @@ export class Draw { if (element.type === ElementType.IMAGE) { this.textParticle.complete() this.imageParticle.render(ctx, element, x, y + offsetY) + } else if (element.type === ElementType.LATEX) { + this.textParticle.complete() + this.laTexParticle.render(ctx, element, x, y + offsetY) } else if (element.type === ElementType.TABLE) { if (isCrossRowCol) { rangeRecord.x = x diff --git a/src/editor/core/draw/particle/ImageParticle.ts b/src/editor/core/draw/particle/ImageParticle.ts index e40253e..d6c802e 100644 --- a/src/editor/core/draw/particle/ImageParticle.ts +++ b/src/editor/core/draw/particle/ImageParticle.ts @@ -6,26 +6,26 @@ import { Draw } from '../Draw' export class ImageParticle { - private container: HTMLDivElement - private canvas: HTMLCanvasElement - private draw: Draw - private options: Required - private curElement: IElement | null - private curPosition: IElementPosition | null - private imageCache: Map + protected container: HTMLDivElement + protected canvas: HTMLCanvasElement + protected draw: Draw + protected options: Required + protected curElement: IElement | null + protected curPosition: IElementPosition | null + protected imageCache: Map // 拖拽改变尺寸 - private resizerSelection: HTMLDivElement - private resizerHandleList: HTMLDivElement[] - private resizerImageContainer: HTMLDivElement - private resizerImage: HTMLImageElement - private width: number - private height: number - private mousedownX: number - private mousedownY: number - private curHandleIndex: number + protected resizerSelection: HTMLDivElement + protected resizerHandleList: HTMLDivElement[] + protected resizerImageContainer: HTMLDivElement + protected resizerImage: HTMLImageElement + protected width: number + protected height: number + protected mousedownX: number + protected mousedownY: number + protected curHandleIndex: number // 预览选区 - private previewerContainer: HTMLDivElement | null - private previewerImage: HTMLImageElement | null + protected previewerContainer: HTMLDivElement | null + protected previewerImage: HTMLImageElement | null constructor(draw: Draw) { this.container = draw.getContainer() diff --git a/src/editor/core/draw/particle/latex/LaTexParticle.ts b/src/editor/core/draw/particle/latex/LaTexParticle.ts new file mode 100644 index 0000000..9af54bd --- /dev/null +++ b/src/editor/core/draw/particle/latex/LaTexParticle.ts @@ -0,0 +1,34 @@ +import { IElement } from '../../../../interface/Element' +import { ImageParticle } from '../ImageParticle' +import { LaTexSVG, LaTexUtils } from './utils/LaTexUtils' + +export class LaTexParticle extends ImageParticle { + + public convertLaTextToSVG(laTex: string): LaTexSVG { + return new LaTexUtils(laTex).svg({ + SCALE_X: 10, + SCALE_Y: 10, + MARGIN_X: 0, + MARGIN_Y: 0 + }) + } + + public render(ctx: CanvasRenderingContext2D, element: IElement, x: number, y: number) { + const { scale } = this.options + const width = element.width! * scale + const height = element.height! * scale + if (this.imageCache.has(element.value)) { + const img = this.imageCache.get(element.value)! + ctx.drawImage(img, x, y, width, height) + } else { + const img = new Image() + img.src = element.laTexSVG! + img.onload = () => { + ctx.drawImage(img, x, y, width, height) + this.imageCache.set(element.value, img) + } + } + } + +} + diff --git a/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts b/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts new file mode 100644 index 0000000..4d7f615 --- /dev/null +++ b/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts @@ -0,0 +1,1082 @@ +import { HERSHEY } from './hershey' +import { SYMB, Symb, asciiMap } from './symbols' + +const CONFIG: Record = { + SUB_SUP_SCALE: 0.5, + SQRT_MAG_SCALE: 0.5, + FRAC_SCALE: 0.85, + LINE_SPACING: 0.5, + FRAC_SPACING: 0.4, +} + +function tokenize(str: string): string[] { + str = str.replace(/\n/g, ' ') + let i = 0 + const tokens: string[] = [] + let curr = '' + while (i < str.length) { + if (str[i] == ' ') { + if (curr.length) { + tokens.push(curr) + curr = '' + } + } else if (str[i] == '\\') { + if (curr.length == 1 && curr[0] == '\\') { + curr += str[i] + tokens.push(curr) + curr = '' + } else { + if (curr.length) { + tokens.push(curr) + } + curr = str[i] + } + } else if (/[A-Za-z0-9\.]/.test(str[i])) { + curr += str[i] + } else { + if (curr.length && curr != '\\') { + tokens.push(curr) + curr = '' + } + curr += str[i] + tokens.push(curr) + curr = '' + } + i++ + } + if (curr.length) tokens.push(curr) + return tokens +} + +interface Bbox { + x: number, y: number, w: number, h: number +} + +interface Expr { + type: string; + text: string; + mode: string; + chld: Expr[]; + bbox: Bbox; +} + +function parseAtom(x: string): Expr { + // @ts-ignore + return { type: SYMB[x] ? 'symb' : 'char', mode: 'math', text: x, chld: [], bbox: null } +} + +function parse(tokens: string[]): Expr { + let i = 0 + let expr: Expr = { + // @ts-ignore + type: 'node', text: '', mode: 'math', chld: [], bbox: null + } + + function takeOpt(): Expr | null { + if (tokens[i] != '[') { + return null + } + let lvl = 0 + let j = i + while (j < tokens.length) { + if (tokens[j] == '[') { + lvl++ + } else if (tokens[j] == ']') { + lvl-- + if (!lvl) { + break + } + } + j++ + } + const ret: Expr = parse(tokens.slice(i + 1, j)) + i = j + return ret + } + + function takeN(n: number): Expr[] { + let j: number = i + let j0: number = j + let lvl = 0 + let cnt = 0 + const ret: Expr[] = [] + while (j < tokens.length) { + if (tokens[j] == '{') { + if (!lvl) { + j0 = j + } + lvl++ + } else if (tokens[j] == '}') { + lvl-- + if (!lvl) { + ret.push(parse(tokens.slice(j0 + 1, j))) + cnt++ + if (cnt == n) { + break + } + } + } else { + if (lvl == 0) { + ret.push(parseAtom(tokens[j])) + cnt++ + if (cnt == n) { + break + } + } + } + j++ + } + i = j + return ret + } + + for (i = 0; i < tokens.length; i++) { + const s: Symb = SYMB[tokens[i]] + const e: Expr = { + // @ts-ignore + type: '', text: tokens[i], mode: 'math', chld: [], bbox: null + } + if (s) { + if (s.arity) { + i++ + e.type = 'func' + let opt: Expr | null = null + if (s.flags.opt) { + opt = takeOpt() + if (opt) i++ + } + const chld: Expr[] = takeN(s.arity) + e.chld = chld + if (opt) { + e.chld.push(opt) + } + } else { + e.type = 'symb' + } + } else { + if (tokens[i] == '{') { + e.type = 'node' + e.text = '' + e.chld = takeN(1) + } else { + e.type = 'char' + } + } + expr.chld.push(e) + } + if (expr.chld.length == 1) { + expr = expr.chld[0] + } + return expr +} + +function environments(exprs: Expr[]) { + let i = 0 + while (i < exprs.length) { + if (exprs[i].text == '\\begin') { + let j: number + for (j = i; j < exprs.length; j++) { + if (exprs[j].text == '\\end') { + break + } + } + const es: Expr[] = exprs.splice(i + 1, j - (i + 1)) + environments(es) + exprs[i].text = exprs[i].chld[0].text + exprs[i].chld = es + exprs.splice(i + 1, 1) + } + i++ + } +} + +function transform(expr: Expr, sclx: number, scly: number, x: number, y: number, notFirst?: boolean) { + if (scly == null) { + scly = sclx + } + if (!expr.bbox) return + if (notFirst) { + expr.bbox.x *= sclx + expr.bbox.y *= scly + } + expr.bbox.w *= sclx + expr.bbox.h *= scly + for (let i = 0; i < expr.chld.length; i++) { + transform(expr.chld[i], sclx, scly, 0, 0, true) + } + expr.bbox.x += x + expr.bbox.y += y +} + +function computeBbox(exprs: Expr[]): Bbox { + let xmin = Infinity; let xmax = -Infinity + let ymin = Infinity; let ymax = -Infinity + for (let i = 0; i < exprs.length; i++) { + if (!exprs[i].bbox) { + continue + } + xmin = Math.min(xmin, exprs[i].bbox.x) + ymin = Math.min(ymin, exprs[i].bbox.y) + xmax = Math.max(xmax, exprs[i].bbox.x + exprs[i].bbox.w) + ymax = Math.max(ymax, exprs[i].bbox.y + exprs[i].bbox.h) + } + return { x: xmin, y: ymin, w: xmax - xmin, h: ymax - ymin } +} + +function group(exprs: Expr[]): Expr { + if (!exprs.length) { + // @ts-ignore + return null + } + const bbox: Bbox = computeBbox(exprs) + // console.log(exprs,bbox); + for (let i = 0; i < exprs.length; i++) { + if (!exprs[i].bbox) { + continue + } + exprs[i].bbox.x -= bbox.x + exprs[i].bbox.y -= bbox.y + } + const expr: Expr = { + type: 'node', text: '', mode: 'math', + chld: exprs, bbox + } + return expr +} + +function align(exprs: Expr[], alignment = 'center'): void { + for (let i = 0; i < exprs.length; i++) { + if (exprs[i].text == '^' || exprs[i].text == '\'') { + let h = 0 + let j = i + while (j > 0 && (exprs[j].text == '^' || exprs[j].text == '_' || exprs[j].text == '\'')) { + j-- + } + h = exprs[j].bbox.y + if (exprs[i].text == '\'') { + exprs[i].bbox.y = h + } else { + // @ts-ignore + transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0) + if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) { + exprs[i].bbox.y = h - exprs[i].bbox.h + } else if (exprs[j].text == '\\int') { + exprs[i].bbox.y = h + } else { + exprs[i].bbox.y = h - exprs[i].bbox.h / 2 + } + } + } else if (exprs[i].text == '_') { + let h = 1 + let j = i + while (j > 0 && (exprs[j].text == '^' || exprs[j].text == '_' || exprs[j].text == '\'')) { + j-- + } + h = exprs[j].bbox.y + exprs[j].bbox.h + // @ts-ignore + transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0) + if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) { + exprs[i].bbox.y = h + } else if (exprs[j].text == '\\int') { + exprs[i].bbox.y = h - exprs[i].bbox.h + } else { + exprs[i].bbox.y = h - exprs[i].bbox.h / 2 + } + } + } + function searchHigh(i: number, l: string, r: string, dir: number, lvl0: number): number[] { + let j = i + let lvl = lvl0 + let ymin = Infinity + let ymax = -Infinity + while ((dir > 0) ? (j < exprs.length) : (j >= 0)) { + if (exprs[j].text == l) { + lvl++ + } else if (exprs[j].text == r) { + lvl-- + if (lvl == 0) { + break + } + } else if (exprs[j].text == '^' || exprs[j].text == '_') { + //skip + } else if (exprs[j].bbox) { + ymin = Math.min(ymin, exprs[j].bbox.y) + ymax = Math.max(ymax, exprs[j].bbox.y + exprs[j].bbox.h) + } + j += dir + } + return [ymin, ymax] + } + for (let i = 0; i < exprs.length; i++) { + if (exprs[i].text == '\\left') { + const [ymin, ymax] = searchHigh(i, '\\left', '\\right', 1, 0) + if (ymin != Infinity && ymax != -Infinity) { + exprs[i].bbox.y = ymin + transform(exprs[i], 1, ((ymax - ymin) / exprs[i].bbox.h), 0, 0) + } + } else if (exprs[i].text == '\\right') { + const [ymin, ymax] = searchHigh(i, '\\right', '\\left', -1, 0) + if (ymin != Infinity && ymax != -Infinity) { + exprs[i].bbox.y = ymin + transform(exprs[i], 1, ((ymax - ymin) / exprs[i].bbox.h), 0, 0) + } + } else if (exprs[i].text == '\\middle') { + const [lmin, lmax] = searchHigh(i, '\\right', '\\left', -1, 1) + const [rmin, rmax] = searchHigh(i, '\\left', '\\right', 1, 1) + const ymin = Math.min(lmin, rmin) + const ymax = Math.max(lmax, rmax) + if (ymin != Infinity && ymax != -Infinity) { + exprs[i].bbox.y = ymin + transform(exprs[i], 1, ((ymax - ymin) / exprs[i].bbox.h), 0, 0) + } + } + } + + if (!exprs.some((x) => (x.text == '&' || x.text == '\\\\'))) { + return + } + + const rows: Expr[][][] = [] + let row: Expr[][] = [] + let cell: Expr[] = [] + + for (let i = 0; i < exprs.length; i++) { + if (exprs[i].text == '&') { + row.push(cell) + cell = [] + } else if (exprs[i].text == '\\\\') { + if (cell.length) { + row.push(cell) + cell = [] + } + rows.push(row) + row = [] + } else { + cell.push(exprs[i]) + } + } + if (cell.length) { + row.push(cell) + } + if (row.length) { + rows.push(row) + } + const colws: number[] = [] + const erows: Expr[][] = [] + for (let i = 0; i < rows.length; i++) { + const erow: Expr[] = [] + for (let j = 0; j < rows[i].length; j++) { + const e: Expr = group(rows[i][j]) + if (e) { + colws[j] = colws[j] || 0 + colws[j] = Math.max(e.bbox.w + 1, colws[j]) + } + erow[j] = e + } + erows.push(erow) + } + + const ybds: number[][] = [] + for (let i = 0; i < erows.length; i++) { + let ymin = Infinity + let ymax = -Infinity + for (let j = 0; j < erows[i].length; j++) { + if (!erows[i][j]) { + continue + } + ymin = Math.min(ymin, erows[i][j].bbox.y) + ymax = Math.max(ymax, erows[i][j].bbox.y + erows[i][j].bbox.h) + } + ybds.push([ymin, ymax]) + } + + for (let i = 0; i < ybds.length; i++) { + if (ybds[i][0] == Infinity || ybds[i][1] == Infinity) { + ybds[i][0] = i == 0 ? 0 : ybds[i - 1][1] + ybds[i][1] = ybds[i][0] + 2 + } + } + + for (let i = 1; i < erows.length; i++) { + const shft = ybds[i - 1][1] - ybds[i][0] + CONFIG.LINE_SPACING + for (let j = 0; j < erows[i].length; j++) { + if (erows[i][j]) { + erows[i][j].bbox.y += shft + } + } + ybds[i][0] += shft + ybds[i][1] += shft + } + + + exprs.splice(0, exprs.length) + for (let i = 0; i < erows.length; i++) { + let dx = 0 + for (let j = 0; j < erows[i].length; j++) { + const e: Expr = erows[i][j] + if (!e) { + dx += (colws[j]) + continue + } + e.bbox.x += dx + dx += (colws[j] - e.bbox.w) + // e.bbox.w = colws[j]; + if (alignment == 'center') { + e.bbox.x += (colws[j] - e.bbox.w) / 2 + } else if (alignment == 'left') { + //ok + } else if (alignment == 'right') { + e.bbox.x += (colws[j] - e.bbox.w) + } else if (alignment == 'equation') { + if (j != erows[i].length - 1) { + e.bbox.x += (colws[j] - e.bbox.w) + } + } + exprs.push(e) + } + } +} + +function plan(expr: Expr, mode = 'math'): void { + const tmd: string = { + '\\text': 'text', + '\\mathnormal': 'math', + '\\mathrm': 'rm', + '\\mathit': 'it', + '\\mathbf': 'bf', + '\\mathsf': 'sf', + '\\mathtt': 'tt', + '\\mathfrak': 'frak', + '\\mathcal': 'cal', + '\\mathbb': 'bb', + '\\mathscr': 'scr', + '\\rm': 'rm', + '\\it': 'it', + '\\bf': 'bf', + '\\sf': 'tt', + '\\tt': 'tt', + '\\frak': 'frak', + '\\cal': 'cal', + '\\bb': 'bb', + '\\scr': 'scr', + }[expr.text] ?? mode + if (!expr.chld.length) { + if (SYMB[expr.text]) { + if (SYMB[expr.text].flags.big) { + if (expr.text == '\\lim') { + expr.bbox = { x: 0, y: 0, w: 3.5, h: 2 } + } else { + expr.bbox = { x: 0, y: -0.5, w: 3, h: 3 } + } + } else if (SYMB[expr.text].flags.txt) { + let w = 0 + for (let i = 1; i < expr.text.length; i++) { + w += HERSHEY(asciiMap(expr.text[i], 'text')).w + } + w /= 16 + expr.bbox = { x: 0, y: 0, w: w, h: 2 } + } else if (SYMB[expr.text].glyph) { + let w = HERSHEY(SYMB[expr.text].glyph).w + w /= 16 + if (expr.text == '\\int' || expr.text == '\\oint') { + expr.bbox = { x: 0, y: -1.5, w: w, h: 5 } + } else { + expr.bbox = { x: 0, y: 0, w: w, h: 2 } + } + } else { + expr.bbox = { x: 0, y: 0, w: 1, h: 2 } + } + } else { + let w = 0 + for (let i = 0; i < expr.text.length; i++) { + if (!HERSHEY(asciiMap(expr.text[i], tmd))) { + continue + } + if (tmd == 'tt') { + w += 16 + } else { + w += HERSHEY(asciiMap(expr.text[i], tmd)).w + } + } + w /= 16 + expr.bbox = { x: 0, y: 0, w: w, h: 2 } + } + expr.mode = tmd + return + } + if (expr.text == '\\frac') { + const a: Expr = expr.chld[0] + const b: Expr = expr.chld[1] + const s: number = CONFIG.FRAC_SCALE + plan(a) + plan(b) + a.bbox.x = 0 + a.bbox.y = 0 + b.bbox.x = 0 + b.bbox.y = 0 + const mw: number = Math.max(a.bbox.w, b.bbox.w) * s + // @ts-ignore + transform(a, s, null, (mw - a.bbox.w * s) / 2, 0) + // @ts-ignore + transform(b, s, null, (mw - b.bbox.w * s) / 2, a.bbox.h + CONFIG.FRAC_SPACING) + expr.bbox = { x: 0, y: -a.bbox.h + 1 - CONFIG.FRAC_SPACING / 2, w: mw, h: a.bbox.h + b.bbox.h + CONFIG.FRAC_SPACING } + } else if (expr.text == '\\binom') { + const a: Expr = expr.chld[0] + const b: Expr = expr.chld[1] + plan(a) + plan(b) + a.bbox.x = 0 + a.bbox.y = 0 + b.bbox.x = 0 + b.bbox.y = 0 + const mw: number = Math.max(a.bbox.w, b.bbox.w) + // @ts-ignore + transform(a, 1, null, (mw - a.bbox.w) / 2 + 1, 0) + // @ts-ignore + transform(b, 1, null, (mw - b.bbox.w) / 2 + 1, a.bbox.h) + expr.bbox = { x: 0, y: -a.bbox.h + 1, w: mw + 2, h: a.bbox.h + b.bbox.h } + } else if (expr.text == '\\sqrt') { + const e: Expr = expr.chld[0] + plan(e) + const f: Expr = expr.chld[1] + let pl = 0 + if (f) { + plan(f) + pl = Math.max(f.bbox.w * CONFIG.SQRT_MAG_SCALE - 0.5, 0) + // @ts-ignore + transform(f, CONFIG.SQRT_MAG_SCALE, null, 0, 0.5) + } + // @ts-ignore + transform(e, 1, null, 1 + pl, 0.5) + expr.bbox = { x: 0, y: 2 - e.bbox.h - 0.5, w: e.bbox.w + 1 + pl, h: e.bbox.h + 0.5 } + + } else if (SYMB[expr.text] && SYMB[expr.text].flags.hat) { + const e: Expr = expr.chld[0] + plan(e) + const y0 = e.bbox.y - 0.5 + e.bbox.y = 0.5 + expr.bbox = { x: 0, y: y0, w: e.bbox.w, h: e.bbox.h + 0.5 } + + } else if (SYMB[expr.text] && SYMB[expr.text].flags.mat) { + const e: Expr = expr.chld[0] + plan(e) + expr.bbox = { x: 0, y: 0, w: e.bbox.w, h: e.bbox.h + 0.5 } + + } else { + let dx = 0 + let dy = 0 + let mh = 1 + for (let i = 0; i < expr.chld.length; i++) { + const c: Expr = expr.chld[i] + // @ts-ignore + const spac: number = { + '\\quad': 2, + '\\,': 2 * 3 / 18, + '\\:': 2 * 4 / 18, + '\\;': 2 * 5 / 18, + '\\!': 2 * (-3) / 18, + }[c.text] ?? null + + if (c.text == '\\\\') { + dy += mh + dx = 0 + mh = 1 + continue + } else if (c.text == '&') { + continue + } else if (spac != null) { + dx += spac + continue + } else { + plan(c, tmd) + // @ts-ignore + transform(c, 1, null, dx, dy) + if (c.text == '^' || c.text == '_' || c.text == '\'') { + let j: number = i + while (j > 0 && (expr.chld[j].text == '^' || expr.chld[j].text == '_' || expr.chld[j].text == '\'')) { + j-- + } + const wasBig = SYMB[expr.chld[j].text] && SYMB[expr.chld[j].text].flags.big + if (c.text == '\'') { + let k = j + 1 + let nth = 0 + while (k < i) { + if (expr.chld[k].text == '\'') { + nth++ + } + k++ + } + c.bbox.x = expr.chld[j].bbox.x + expr.chld[j].bbox.w + c.bbox.w * nth + dx = Math.max(dx, c.bbox.x + c.bbox.w) + } else { + if (wasBig) { + const ex = expr.chld[j].bbox.x + (expr.chld[j].bbox.w - c.bbox.w * CONFIG.SUB_SUP_SCALE) / 2 + c.bbox.x = ex + dx = Math.max(dx, expr.chld[j].bbox.x + expr.chld[j].bbox.w + (c.bbox.w * CONFIG.SUB_SUP_SCALE - expr.chld[j].bbox.w) / 2) + } else { + c.bbox.x = expr.chld[j].bbox.x + expr.chld[j].bbox.w + dx = Math.max(dx, c.bbox.x + c.bbox.w * CONFIG.SUB_SUP_SCALE) + } + } + } else { + dx += c.bbox.w + } + if (mode == 'text') { + dx += 1 + } + mh = Math.max(c.bbox.y + c.bbox.h - dy, mh) + } + } + dy += mh + const m2s: Record = { + 'bmatrix': ['[', ']'], + 'pmatrix': ['(', ')'], + 'Bmatrix': ['\\{', '\\}'], + 'cases': ['\\{'] + } + const alt: string = { + 'bmatrix': 'center', + 'pmatrix': 'center', + 'Bmatrix': 'center', + 'cases': 'left', + 'matrix': 'center', + 'aligned': 'equation', + }[expr.text] ?? 'left' + + const hasLp = !!m2s[expr.text] + const hasRp = !!m2s[expr.text] && m2s[expr.text].length > 1 + + align(expr.chld, alt) + const bb = computeBbox(expr.chld) + if (expr.text == '\\text') { + bb.x -= 1 + bb.w += 2 + } + + for (let i = 0; i < expr.chld.length; i++) { + // @ts-ignore + transform(expr.chld[i], 1, null, -bb.x + (hasLp ? 1.5 : 0), -bb.y) + } + expr.bbox = { x: 0, y: 0, w: bb.w + 1.5 * Number(hasLp) + 1.5 * Number(hasRp), h: bb.h } + + if (hasLp) { + expr.chld.unshift({ + type: 'symb', text: m2s[expr.text][0], mode: expr.mode, chld: [], bbox: { x: 0, y: 0, w: 1, h: bb.h } + }) + } + if (hasRp) { + expr.chld.push({ + type: 'symb', text: m2s[expr.text][1], mode: expr.mode, chld: [], bbox: { x: bb.w + 2, y: 0, w: 1, h: bb.h } + }) + } + if (hasLp || hasRp || expr.text == 'matrix') { + expr.type = 'node' + expr.text = '' + expr.bbox.y -= (expr.bbox.h - 2) / 2 + } + } +} + +function flatten(expr: Expr) { + function flat(expr: Expr, dx: number, dy: number): Expr[] { + const ff: Expr[] = [] + if (expr.bbox) { + dx += expr.bbox.x + dy += expr.bbox.y + if (expr.text == '\\frac') { + const h: number = expr.chld[1].bbox.y - (expr.chld[0].bbox.y + expr.chld[0].bbox.h) + const e: Expr = { + type: 'symb', + mode: expr.mode, + text: '\\bar', + bbox: { + x: dx, + y: dy + (expr.chld[1].bbox.y - h / 2) - h / 2, + w: expr.bbox.w, + h: h, + }, chld: [], + } + ff.push(e) + } else if (expr.text == '\\sqrt') { + const h: number = expr.chld[0].bbox.y + const xx: number = Math.max(0, expr.chld[0].bbox.x - expr.chld[0].bbox.h / 2) + const e: Expr = { + type: 'symb', + mode: expr.mode, + text: '\\sqrt', + bbox: { + x: dx + xx, + y: dy + h / 2, + w: expr.chld[0].bbox.x - xx, + h: expr.bbox.h - h / 2, + }, chld: [], + } + ff.push(e) + ff.push({ + type: 'symb', + text: '\\bar', + mode: expr.mode, + bbox: { + x: dx + expr.chld[0].bbox.x, + y: dy, + w: expr.bbox.w - expr.chld[0].bbox.x, + h: h, + }, chld: [], + }) + } else if (expr.text == '\\binom') { + const w = Math.min(expr.chld[0].bbox.x, expr.chld[1].bbox.x) + const e: Expr = { + type: 'symb', + mode: expr.mode, + text: '(', + bbox: { + x: dx, + y: dy, + w: w, + h: expr.bbox.h, + }, chld: [], + } + ff.push(e) + ff.push({ + type: 'symb', + text: ')', + mode: expr.mode, + bbox: { + x: dx + expr.bbox.w - w, + y: dy, + w: w, + h: expr.bbox.h, + }, chld: [], + }) + } else if (SYMB[expr.text] && SYMB[expr.text].flags.hat) { + const h: number = expr.chld[0].bbox.y + const e: Expr = { + type: 'symb', + mode: expr.mode, + text: expr.text, + bbox: { + x: dx, + y: dy, + w: expr.bbox.w, + h: h, + }, chld: [], + } + ff.push(e) + } else if (SYMB[expr.text] && SYMB[expr.text].flags.mat) { + const h: number = expr.chld[0].bbox.h + const e: Expr = { + type: 'symb', + text: expr.text, + mode: expr.mode, + bbox: { + x: dx, + y: dy + h, + w: expr.bbox.w, + h: expr.bbox.h - h, + }, chld: [], + } + ff.push(e) + } else if (expr.type != 'node' + && expr.text != '^' + && expr.text != '_' + ) { + const e: Expr = { + type: expr.type == 'func' ? 'symb' : expr.type, text: expr.text, mode: expr.mode, bbox: { + x: dx, + y: dy, + w: expr.bbox.w, + h: expr.bbox.h + }, chld: [], + } + ff.push(e) + } + } + for (let i = 0; i < expr.chld.length; i++) { + const f = flat(expr.chld[i], dx, dy) + ff.push(...f) + } + return ff + } + const f = flat(expr, -expr.bbox.x, -expr.bbox.y) + expr.type = 'node' + expr.text = '' + expr.chld = f +} + +function render(expr: Expr): number[][][] { + const o: number[][][] = [] + for (let i = 0; i < expr.chld.length; i++) { + const e: Expr = expr.chld[i] + let s = e.bbox.h / 2 + let isSmallHat = false + if (SYMB[e.text] && SYMB[e.text].flags.hat && + !SYMB[e.text].flags.xfl && !SYMB[e.text].flags.yfl) { + s *= 4 + isSmallHat = true + } + if (SYMB[e.text] && SYMB[e.text].glyph) { + const d = HERSHEY(SYMB[e.text].glyph) + for (let j = 0; j < d.polylines.length; j++) { + const l: number[][] = [] + + for (let k = 0; k < d.polylines[j].length; k++) { + let x = d.polylines[j][k][0] + let y = d.polylines[j][k][1] + + if (SYMB[e.text].flags.xfl) { + x = (x - d.xmin) / Math.max(d.xmax - d.xmin, 1) * e.bbox.w + x += e.bbox.x + } else if (d.w / 16 * s > e.bbox.w) { + x = x / Math.max(d.w, 1) * e.bbox.w + x += e.bbox.x + } else { + + x = x / 16 * s + const p = (e.bbox.w - d.w / 16 * s) / 2 + x += e.bbox.x + p + } + if (SYMB[e.text].flags.yfl) { + y = (y - d.ymin) / Math.max(d.ymax - d.ymin, 1) * e.bbox.h + y += e.bbox.y + } else { + y = y / 16 * s + if (isSmallHat) { + const p = (d.ymax + d.ymin) / 2 + y -= p / 16 * s + } + y += e.bbox.y + e.bbox.h / 2 + } + l.push([x, y]) + } + o.push(l) + } + } else if ((SYMB[e.text] && SYMB[e.text].flags.txt) || (e.type == 'char')) { + let x0 = e.bbox.x + const isVerb = !!(SYMB[e.text] && SYMB[e.text].flags.txt) + for (let n = Number(isVerb); n < e.text.length; n++) { + const d = HERSHEY(asciiMap(e.text[n], isVerb ? 'text' : e.mode)) + if (!d) { + console.warn('unmapped character: ' + e.text[n]) + continue + } + for (let j = 0; j < d.polylines.length; j++) { + const l: number[][] = [] + for (let k = 0; k < d.polylines[j].length; k++) { + let x = d.polylines[j][k][0] + let y = d.polylines[j][k][1] + x /= 16 + y /= 16 + x *= s + y *= s + if (e.mode == 'tt') { + if (d.w > 16) { + x *= 16 / d.w + } else { + x += (16 - d.w) / 2 / 16 + } + + } + x += x0 + y += e.bbox.y + e.bbox.h / 2 + l.push([x, y]) + } + o.push(l) + } + if (e.mode == 'tt') { + x0 += s + } else { + x0 += d.w / 16 * s + } + } + } + } + return o +} + +interface ExportOpt { + MIN_CHAR_H?: number; + MAX_W?: number; + MAX_H?: number; + MARGIN_X?: number; + MARGIN_Y?: number; + SCALE_X?: number; + SCALE_Y?: number; + STROKE_W?: number; + FG_COLOR?: string; + BG_COLOR?: string; +} + +function nf(x: number): number { + return Math.round(x * 100) / 100 +} + +export interface LaTexSVG { + svg: string; + width: number; + height: number; +} + +export class LaTexUtils { + _latex: string; + _tree: Expr; + _tokens: string[]; + _polylines: number[][][]; + + constructor(latex: string) { + this._latex = latex + this._tokens = tokenize(latex) + this._tree = parse(this._tokens) + environments(this._tree.chld) + plan(this._tree) + flatten(this._tree) + this._polylines = render(this._tree) + } + + private resolveScale(opt?: ExportOpt): number[] { + if (opt == undefined) { + return [16, 16, 16, 16] + } + let sclx: number = opt.SCALE_X ?? 16 + let scly: number = opt.SCALE_Y ?? 16 + + if (opt.MIN_CHAR_H != undefined) { + let mh = 0 + for (let i = 0; i < this._tree.chld.length; i++) { + const c: Expr = this._tree.chld[i] + if (c.type == 'char' || + (SYMB[c.text] && + (SYMB[c.text].flags.txt || !Object.keys(SYMB[c.text].flags).length))) { + mh = Math.min(c.bbox.h, mh) + } + } + const s: number = Math.max(1, opt.MIN_CHAR_H / mh) + sclx *= s + scly *= s + } + if (opt.MAX_W != undefined) { + const s0 = sclx + sclx = Math.min(sclx, opt.MAX_W / this._tree.bbox.w) + scly *= (sclx / s0) + } + if (opt.MAX_H != undefined) { + const s0 = scly + scly = Math.min(scly, opt.MAX_H / this._tree.bbox.h) + sclx *= (scly / s0) + } + const px: number = opt.MARGIN_X ?? sclx + const py: number = opt.MARGIN_Y ?? scly + return [px, py, sclx, scly] + } + + polylines(opt?: ExportOpt): number[][][] { + if (!opt) opt = {} + const polylines: number[][][] = [] + const [px, py, sclx, scly] = this.resolveScale(opt) + for (let i = 0; i < this._polylines.length; i++) { + polylines.push([]) + for (let j = 0; j < this._polylines[i].length; j++) { + const [x, y] = this._polylines[i][j] + polylines[polylines.length - 1].push([px + x * sclx, py + y * scly]) + } + } + return polylines + } + + pathd(opt?: ExportOpt): string { + if (!opt) opt = {} + let d = '' + const [px, py, sclx, scly] = this.resolveScale(opt) + for (let i = 0; i < this._polylines.length; i++) { + for (let j = 0; j < this._polylines[i].length; j++) { + const [x, y] = this._polylines[i][j] + d += (!j) ? 'M' : 'L' + d += `${nf(px + x * sclx)} ${nf(py + y * scly)}` + } + } + return d + } + + svg(opt: ExportOpt): LaTexSVG { + if (!opt) opt = {} + const [px, py, sclx, scly] = this.resolveScale(opt) + const w = nf(this._tree.bbox.w * sclx + px * 2) + const h = nf(this._tree.bbox.h * scly + py * 2) + let o = `` + if (opt.BG_COLOR) { + o += `` + } + o += `` + o += `` + return { + svg: `data:image/svg+xml;base64,${window.btoa(o)}`, + width: w, + height: h + } + } + + pdf(opt: ExportOpt): string { + if (!opt) opt = {} + const [px, py, sclx, scly] = this.resolveScale(opt) + + const width = nf(this._tree.bbox.w * sclx + px * 2) + const height = nf(this._tree.bbox.h * scly + py * 2) + let head = `%PDF-1.1\n%%¥±ë\n1 0 obj\n<< /Type /Catalog\n/Pages 2 0 R\n>>endobj + 2 0 obj\n<< /Type /Pages\n/Kids [3 0 R]\n/Count 1\n/MediaBox [0 0 ${width} ${height}]\n>>\nendobj + 3 0 obj\n<< /Type /Page\n/Parent 2 0 R\n/Resources\n<< /Font\n<< /F1\n<< /Type /Font + /Subtype /Type1\n/BaseFont /Times-Roman\n>>\n>>\n>>\n/Contents [` + let pdf = '' + let count = 4 + for (let i = 0; i < this._polylines.length; i++) { + pdf += `${count} 0 obj \n<< /Length 0 >>\n stream\n 1 j 1 J ${opt.STROKE_W ?? 1} w\n` + for (let j = 0; j < this._polylines[i].length; j++) { + const [x, y] = this._polylines[i][j] + pdf += `${nf(px + x * sclx)} ${nf(height - (py + y * scly))} ${j ? 'l' : 'm'} ` + } + pdf += '\nS\nendstream\nendobj\n' + head += `${count} 0 R ` + count++ + } + head += ']\n>>\nendobj\n' + pdf += '\ntrailer\n<< /Root 1 0 R \n /Size 0\n >>startxref\n\n%%EOF\n' + return head + pdf + } + + boxes(opt: ExportOpt): Bbox[] { + if (!opt) opt = {} + const [px, py, sclx, scly] = this.resolveScale(opt) + const bs: Bbox[] = [] + for (let i = 0; i < this._tree.chld.length; i++) { + const { x, y, w, h } = this._tree.chld[i].bbox + bs.push({ x: px + x * sclx, y: py + y * scly, w: w * sclx, h: h * scly }) + } + return bs + } + + box(opt: ExportOpt): Bbox { + if (!opt) opt = {} + const [px, py, sclx, scly] = this.resolveScale(opt) + return { + x: px + this._tree.bbox.x * sclx, + y: py + this._tree.bbox.y * scly, + w: this._tree.bbox.w * sclx, + h: this._tree.bbox.h * scly + } + } +} + +const _impl: Record = { tokenize, parse, environments, plan, flatten, render } + +export { CONFIG, _impl } \ No newline at end of file diff --git a/src/editor/core/draw/particle/latex/utils/hershey.ts b/src/editor/core/draw/particle/latex/utils/hershey.ts new file mode 100644 index 0000000..efe4115 --- /dev/null +++ b/src/editor/core/draw/particle/latex/utils/hershey.ts @@ -0,0 +1,1632 @@ +interface HersheyEntry { + w: number; + xmin: number; + xmax: number; + ymin: number; + ymax: number; + polylines: Array>>; +} + +const ordR = 'R'.charCodeAt(0) + +export function HERSHEY(i: number): HersheyEntry { + if (data[i] == null) { + compile(i) + } + return data[i] +} + +function compile(i: number): void { + const entry: string = raw[i] + if (entry == null) { + return + } + const bound: string = entry.substring(3, 5) + const xmin: number = 1 * bound.charCodeAt(0) - ordR + const xmax: number = 1 * bound.charCodeAt(1) - ordR + const content: string = entry.substring(5) + + const polylines: Array>> = [[]] + let ymin = Infinity + let ymax = -Infinity + let zmin = Infinity + let zmax = -Infinity + let j = 0 + while (j < content.length) { + const digit: string = content.substring(j, j + 2) + if (digit == ' R') { + polylines.push([]) + } else { + const x: number = digit.charCodeAt(0) - ordR - xmin + const y: number = digit.charCodeAt(1) - ordR + ymin = Math.min(y, ymin) + ymax = Math.max(y, ymax) + zmin = Math.min(x, zmin) + zmax = Math.max(x, zmax) + polylines[polylines.length - 1].push([x, y]) + } + j += 2 + } + data[i] = { + w: xmax - xmin, + xmin: zmin, + xmax: zmax, + ymin: ymin, + ymax: ymax, + polylines: polylines, + } +} +const data: Record = {} + +const raw: Record = { + 1: ' 9MWRMNV RRMVV RPSTS', + 2: ' 16MWOMOV ROMSMUNUPSQ ROQSQURUUSVOV', + 3: ' 11MXVNTMRMPNOPOSPURVTVVU', + 4: ' 12MWOMOV ROMRMTNUPUSTURVOV', + 5: ' 12MWOMOV ROMUM ROQSQ ROVUV', + 6: ' 9MVOMOV ROMUM ROQSQ', + 7: ' 15MXVNTMRMPNOPOSPURVTVVUVR RSRVR', + 8: ' 9MWOMOV RUMUV ROQUQ', + 9: ' 3PTRMRV', + 10: ' 7NUSMSTRVPVOTOS', + 11: ' 9MWOMOV RUMOS RQQUV', + 12: ' 6MVOMOV ROVUV', + 13: ' 12LXNMNV RNMRV RVMRV RVMVV', + 14: ' 9MWOMOV ROMUV RUMUV', + 15: ' 14MXRMPNOPOSPURVSVUUVSVPUNSMRM', + 16: ' 10MWOMOV ROMSMUNUQSROR', + 17: ' 17MXRMPNOPOSPURVSVUUVSVPUNSMRM RSTVW', + 18: ' 13MWOMOV ROMSMUNUQSROR RRRUV', + 19: ' 13MWUNSMQMONOOPPTRUSUUSVQVOU', + 20: ' 6MWRMRV RNMVM', + 21: ' 9MXOMOSPURVSVUUVSVM', + 22: ' 6MWNMRV RVMRV', + 23: ' 12LXNMPV RRMPV RRMTV RVMTV', + 24: ' 6MWOMUV RUMOV', + 25: ' 7MWNMRQRV RVMRQ', + 26: ' 9MWUMOV ROMUM ROVUV', + 27: ' 9MWRMNV RRMVV RPSTS', + 28: ' 16MWOMOV ROMSMUNUPSQ ROQSQURUUSVOV', + 29: ' 6MVOMOV ROMUM', + 30: ' 9MWRMNV RRMVV RNVVV', + 31: ' 12MWOMOV ROMUM ROQSQ ROVUV', + 32: ' 9MWUMOV ROMUM ROVUV', + 33: ' 9MWOMOV RUMUV ROQUQ', + 34: ' 20MXRMPNOPOSPURVSVUUVSVPUNSMRM RQQTR RTQQR', + 35: ' 3PTRMRV', + 36: ' 9MWOMOV RUMOS RQQUV', + 37: ' 6MWRMNV RRMVV', + 38: ' 12LXNMNV RNMRV RVMRV RVMVV', + 39: ' 9MWOMOV ROMUV RUMUV', + 40: ' 12MWOMUM RPQTR RTQPR ROVUV', + 41: ' 14MXRMPNOPOSPURVSVUUVSVPUNSMRM', + 42: ' 9MWOMOV RUMUV ROMUM', + 43: ' 10MWOMOV ROMSMUNUQSROR', + 44: ' 10MWOMRQOV ROMUM ROVUV', + 45: ' 6MWRMRV RNMVM', + 46: ' 15MWNONNOMPMQNRPRV RVOVNUMTMSNRP', + 47: ' 13LXRMRV RPONPNSPTTTVSVPTOPO', + 48: ' 6MWOMUV RUMOV', + 49: ' 12LXRMRV RNOOPOSQTSTUSUPVO', + 50: ' 13MXOVQVOROPPNRMSMUNVPVRTVVV', + 200: ' 12MWRMPNOPOSPURVTUUSUPTNRM', + 201: ' 4MWPORMRV', + 202: ' 9MWONQMSMUNUPTROVUV', + 203: ' 15MWONQMSMUNUPSQ RRQSQURUUSVQVOU', + 204: ' 7MWSMSV RSMNSVS', + 205: ' 14MWPMOQQPRPTQUSTURVQVOU RPMTM', + 206: ' 14MWTMRMPNOPOSPURVTUUSTQRPPQOS', + 207: ' 6MWUMQV ROMUM', + 208: ' 19MWQMONOPQQSQUPUNSMQM RQQOROUQVSVUUURSQ', + 209: ' 14MWUPTRRSPROPPNRMTNUPUSTURVPV', + 210: ' 6PURURVSVSURU', + 211: ' 7PUSVRVRUSUSWRY', + 212: ' 12PURPRQSQSPRP RRURVSVSURU', + 213: ' 13PURPRQSQSPRP RSVRVRUSUSWRY', + 214: ' 12PURMRR RSMSR RRURVSVSURU', + 215: ' 17NWPNRMSMUNUPRQRRSRSQUP RRURVSVSURU', + 216: ' 3PTRMRQ', + 217: ' 6NVPMPQ RTMTQ', + 218: ' 10NVQMPNPPQQSQTPTNSMQM', + 219: ' 16MWUNSMQMONOPQQTRUSUUSVQVOU RRLRW', + 220: ' 3MWVLNW', + 221: ' 7OVTLRNQPQSRUTW', + 222: ' 7NUPLRNSPSSRUPW', + 223: ' 3PTRLRW', + 224: ' 3LXNRVR', + 225: ' 6LXRNRV RNRVR', + 226: ' 6LXNPVP RNTVT', + 227: ' 6MWOOUU RUOOU', + 228: ' 9MWRORU ROPUT RUPOT', + 229: ' 6PURQRRSRSQRQ', + 230: ' 7PUSMRORQSQSPRP', + 231: ' 7PUSNRNRMSMSORQ', + 232: ' 7LXSOVRSU RNRVR', + 233: ' 12MXRLPW RULSW ROPVP ROSVS', + 234: ' 21LXVRURTSSURVOVNUNSORRQSPSNRMPMONOPQSSUUVVV', + 235: ' 20LXNNOQOSNV RVNUQUSVV RNNQOSOVN RNVQUSUVV', + 501: ' 9I[RFJ[ RRFZ[ RMTWT', + 502: ' 24G\\KFK[ RKFTFWGXHYJYLXNWOTP RKPTPWQXRYTYWXYWZT[K[', + 503: ' 19H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV', + 504: ' 16G\\KFK[ RKFRFUGWIXKYNYSXVWXUZR[K[', + 505: ' 12H[LFL[ RLFYF RLPTP RL[Y[', + 506: ' 9HZLFL[ RLFYF RLPTP', + 507: ' 23H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS RUSZS', + 508: ' 9G]KFK[ RYFY[ RKPYP', + 509: ' 3NVRFR[', + 510: ' 11JZVFVVUYTZR[P[NZMYLVLT', + 511: ' 9G\\KFK[ RYFKT RPOY[', + 512: ' 6HYLFL[ RL[X[', + 513: ' 12F^JFJ[ RJFR[ RZFR[ RZFZ[', + 514: ' 9G]KFK[ RKFY[ RYFY[', + 515: ' 22G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF', + 516: ' 14G\\KFK[ RKFTFWGXHYJYMXOWPTQKQ', + 517: ' 25G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RSWY]', + 518: ' 17G\\KFK[ RKFTFWGXHYJYLXNWOTPKP RRPY[', + 519: ' 21H\\YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX', + 520: ' 6JZRFR[ RKFYF', + 521: ' 11G]KFKULXNZQ[S[VZXXYUYF', + 522: ' 6I[JFR[ RZFR[', + 523: ' 12F^HFM[ RRFM[ RRFW[ R\\FW[', + 524: ' 6H\\KFY[ RYFK[', + 525: ' 7I[JFRPR[ RZFRP', + 526: ' 9H\\YFK[ RKFYF RK[Y[', + 527: ' 9I[RFJ[ RRFZ[ RMTWT', + 528: ' 24G\\KFK[ RKFTFWGXHYJYLXNWOTP RKPTPWQXRYTYWXYWZT[K[', + 529: ' 6HYLFL[ RLFXF', + 530: ' 9I[RFJ[ RRFZ[ RJ[Z[', + 531: ' 12H[LFL[ RLFYF RLPTP RL[Y[', + 532: ' 9H\\YFK[ RKFYF RK[Y[', + 533: ' 9G]KFK[ RYFY[ RKPYP', + 534: ' 25G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF ROPUP', + 535: ' 3NVRFR[', + 536: ' 9G\\KFK[ RYFKT RPOY[', + 537: ' 6I[RFJ[ RRFZ[', + 538: ' 12F^JFJ[ RJFR[ RZFR[ RZFZ[', + 539: ' 9G]KFK[ RKFY[ RYFY[', + 540: ' 9I[KFYF ROPUP RK[Y[', + 541: ' 22G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF', + 542: ' 9G]KFK[ RYFY[ RKFYF', + 543: ' 14G\\KFK[ RKFTFWGXHYJYMXOWPTQKQ', + 544: ' 10I[KFRPK[ RKFYF RK[Y[', + 545: ' 6JZRFR[ RKFYF', + 546: ' 19I[KKKILGMFOFPGQIRMR[ RYKYIXGWFUFTGSIRM', + 547: ' 21H\\RFR[ RPKMLLMKOKRLTMUPVTVWUXTYRYOXMWLTKPK', + 548: ' 6H\\KFY[ RK[YF', + 549: ' 18G]RFR[ RILJLKMLQMSNTQUSUVTWSXQYMZL[L', + 550: ' 17H\\K[O[LTKPKLLINGQFSFVGXIYLYPXTU[Y[', + 551: ' 20G[G[IZLWOSSLVFV[UXSUQSNQLQKRKTLVNXQZT[Y[', + 552: ' 41F]SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFXFZG[I[KZMYNWOTP RSPTPWQXRYTYWXYWZU[R[PZOX', + 553: ' 24H\\TLTMUNWNYMZKZIYGWFTFQGOIMLLNKRKVLYMZO[Q[TZVXWV', + 554: ' 35G^TFRGQIPMOSNVMXKZI[G[FZFXGWIWKXMZP[S[VZXXZT[O[KZHYGWFTFRHRJSMUPWRZT\\U', + 555: ' 28H\\VJVKWLYLZKZIYGVFRFOGNINLONPOSPPPMQLRKTKWLYMZP[S[VZXXYV', + 556: ' 28H\\RLPLNKMINGQFTFXG[G]F RXGVNTTRXPZN[L[JZIXIVJULUNV RQPZP', + 557: ' 29G^G[IZMVPQQNRJRGQFPFOGNINLONQOUOXNYMZKZQYVXXVZS[O[LZJXIVIT', + 558: ' 38F^MMKLJJJIKGMFNFPGQIQKPONULYJ[H[GZGX RMRVOXN[L]J^H^G]F\\FZHXLVRUWUZV[W[YZZY\\V', + 559: ' 25IZWVUTSQROQLQIRGSFUFVGWIWLVQTVSXQZO[M[KZJXJVKUMUOV', + 560: ' 25JYT^R[PVOPOJPGRFTFUGVJVMURR[PaOdNfLgKfKdLaN^P\\SZWX', + 561: ' 39F^MMKLJJJIKGMFNFPGQIQKPONULYJ[H[GZGX R^I^G]F\\FZGXIVLTNROPO RROSQSXTZU[V[XZYY[V', + 562: ' 29I\\MRORSQVOXMYKYHXFVFUGTISNRSQVPXNZL[J[IZIXJWLWNXQZT[V[YZ[X', + 563: ' 45@aEMCLBJBICGEFFFHGIIIKHPGTE[ RGTJLLHMGOFPFRGSISKRPQTO[ RQTTLVHWGYFZF\\G]I]K\\PZWZZ[[\\[^Z_YaV', + 564: ' 32E]JMHLGJGIHGJFKFMGNINKMPLTJ[ RLTOLQHRGTFVFXGYIYKXPVWVZW[X[ZZ[Y]V', + 565: ' 29H]TFQGOIMLLNKRKVLYMZO[Q[TZVXXUYSZOZKYHXGVFTFRHRKSNUQWSZU\\V', + 566: ' 31F_SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFZF\\G]H^J^M]O\\PZQWQUPTO', + 567: ' 32H^ULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWSSWPYNZK[I[HZHXIWKWMXPZS[V[YZ[X', + 568: ' 38F_SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFYF[G\\H]J]M\\O[PYQVQSPTQUSUXVZX[ZZ[Y]V', + 569: ' 28H\\H[JZLXOTQQSMTJTGSFRFQGPIPKQMSOVQXSYUYWXYWZT[P[MZKXJVJT', + 570: ' 25H[RLPLNKMINGQFTFXG[G]F RXGVNTTRXPZN[L[JZIXIVJULUNV', + 571: ' 33E]JMHLGJGIHGJFKFMGNINKMOLRKVKXLZN[P[RZSYUUXMZF RXMWQVWVZW[X[ZZ[Y]V', + 572: ' 32F]KMILHJHIIGKFLFNGOIOKNOMRLVLYM[O[QZTWVTXPYMZIZGYFXFWGVIVKWNYP[Q', + 573: ' 25C_HMFLEJEIFGHFIFKGLILLK[ RUFK[ RUFS[ RaF_G\\JYNVTS[', + 574: ' 36F^NLLLKKKILGNFPFRGSISLQUQXRZT[V[XZYXYVXUVU R]I]G\\FZFXGVITLPUNXLZJ[H[GZGX', + 575: ' 38F]KMILHJHIIGKFLFNGOIOKNOMRLVLXMZN[P[RZTXVUWSYM R[FYMVWT]RbPfNgMfMdNaP^S[VY[V', + 576: ' 40H]ULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWTTWPZN[K[JZJXKWNWPXQYR[R^QaPcNfLgKfKdLaN^Q[TYZV', + 583: ' 9I[JFR[ RZFR[ RJFZF', + 601: ' 18I\\XMX[ RXPVNTMQMONMPLSLUMXOZQ[T[VZXX', + 602: ' 18H[LFL[ RLPNNPMSMUNWPXSXUWXUZS[P[NZLX', + 603: ' 15I[XPVNTMQMONMPLSLUMXOZQ[T[VZXX', + 604: ' 18I\\XFX[ RXPVNTMQMONMPLSLUMXOZQ[T[VZXX', + 605: ' 18I[LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX', + 606: ' 9MYWFUFSGRJR[ ROMVM', + 607: ' 23I\\XMX]W`VaTbQbOa RXPVNTMQMONMPLSLUMXOZQ[T[VZXX', + 608: ' 11I\\MFM[ RMQPNRMUMWNXQX[', + 609: ' 9NVQFRGSFREQF RRMR[', + 610: ' 12MWRFSGTFSERF RSMS^RaPbNb', + 611: ' 9IZMFM[ RWMMW RQSX[', + 612: ' 3NVRFR[', + 613: ' 19CaGMG[ RGQJNLMOMQNRQR[ RRQUNWMZM\\N]Q][', + 614: ' 11I\\MMM[ RMQPNRMUMWNXQX[', + 615: ' 18I\\QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM', + 616: ' 18H[LMLb RLPNNPMSMUNWPXSXUWXUZS[P[NZLX', + 617: ' 18I\\XMXb RXPVNTMQMONMPLSLUMXOZQ[T[VZXX', + 618: ' 9KXOMO[ ROSPPRNTMWM', + 619: ' 18J[XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX', + 620: ' 9MYRFRWSZU[W[ ROMVM', + 621: ' 11I\\MMMWNZP[S[UZXW RXMX[', + 622: ' 6JZLMR[ RXMR[', + 623: ' 12G]JMN[ RRMN[ RRMV[ RZMV[', + 624: ' 6J[MMX[ RXMM[', + 625: ' 10JZLMR[ RXMR[P_NaLbKb', + 626: ' 9J[XMM[ RMMXM RM[X[', + 627: ' 24H]QMONMPLRKUKXLZN[P[RZUWWTYPZM RQMSMTNUPWXXZY[Z[', + 628: ' 31I\\UFSGQIOMNPMTLZKb RUFWFYHYKXMWNUORO RROTPVRWTWWVYUZS[Q[OZNYMV', + 629: ' 17I\\JPLNNMOMQNROSRSVR[ RZMYPXRR[P_Ob', + 630: ' 24I[TMQMONMPLSLVMYNZP[R[TZVXWUWRVOTMRKQIQGRFTFVGXI', + 631: ' 19JZWOVNTMQMONOPPRSS RSSOTMVMXNZP[S[UZWX', + 632: ' 23JYTFRGQHQIRJUKXK RXKTMQONRMUMWNYP[S]T_TaSbQbP`', + 633: ' 19H\\IQJOLMNMONOPNTL[ RNTPPRNTMVMXOXRWWTb', + 634: ' 27G\\HQIOKMMMNNNPMUMXNZO[Q[SZUWVUWRXMXJWGUFSFRHRJSMUPWRZT', + 635: ' 9LWRMPTOXOZP[R[TYUW', + 636: ' 19I[OMK[ RYNXMWMUNQROSNS RNSPTQUSZT[U[VZ', + 637: ' 9JZKFMFOGPHX[ RRML[', + 638: ' 21H]OMIb RNQMVMYO[Q[SZUXWT RYMWTVXVZW[Y[[Y\\W', + 639: ' 14I[LMOMNSMXL[ RYMXPWRUURXOZL[', + 640: ' 29JZTFRGQHQIRJUKXK RUKRLPMOOOQQSTTVT RTTPUNVMXMZO\\S^T_TaRbPb', + 641: ' 18J[RMPNNPMSMVNYOZQ[S[UZWXXUXRWOVNTMRM', + 642: ' 13G]PML[ RUMVSWXX[ RIPKNNM[M', + 643: ' 19I[MSMVNYOZQ[S[UZWXXUXRWOVNTMRMPNNPMSIb', + 644: ' 18I][MQMONMPLSLVMYNZP[R[TZVXWUWRVOUNSM', + 645: ' 8H\\SMP[ RJPLNOMZM', + 646: ' 16H\\IQJOLMNMONOPMVMYO[Q[TZVXXTYPYM', + 647: ' 21G]ONMOKQJTJWKYLZN[Q[TZWXYUZRZOXMVMTORSPXMb', + 648: ' 14I[KMMMOOU`WbYb RZMYOWRM]K`Jb', + 649: ' 20F]VFNb RGQHOJMLMMNMPLULXMZO[Q[TZVXXUZP[M', + 650: ' 23F]NMLNJQITIWJZK[M[OZQW RRSQWRZS[U[WZYWZTZQYNXM', + 651: ' 22L\\UUTSRRPRNSMTLVLXMZO[Q[SZTXVRUWUZV[W[YZZY\\V', + 652: ' 23M[MVOSRNSLTITGSFQGPIOMNTNZO[P[RZTXUUURVVWWYW[V', + 653: ' 14MXTTTSSRQROSNTMVMXNZP[S[VYXV', + 654: ' 24L\\UUTSRRPRNSMTLVLXMZO[Q[SZTXZF RVRUWUZV[W[YZZY\\V', + 655: ' 17NXOYQXRWSUSSRRQROSNUNXOZQ[S[UZVYXV', + 656: ' 24OWOVSQUNVLWIWGVFTGSIQQNZKaJdJfKgMfNcOZP[R[TZUYWV', + 657: ' 28L[UUTSRRPRNSMTLVLXMZO[Q[SZTY RVRTYPdOfMgLfLdMaP^S\\U[XY[V', + 658: ' 29M\\MVOSRNSLTITGSFQGPIOMNSM[ RM[NXOVQSSRURVSVUUXUZV[W[YZZY\\V', + 659: ' 16PWSMSNTNTMSM RPVRRPXPZQ[R[TZUYWV', + 660: ' 20PWSMSNTNTMSM RPVRRLdKfIgHfHdIaL^O\\Q[TYWV', + 661: ' 33M[MVOSRNSLTITGSFQGPIOMNSM[ RM[NXOVQSSRURVSVUTVQV RQVSWTZU[V[XZYY[V', + 662: ' 18OWOVQSTNULVIVGUFSGRIQMPTPZQ[R[TZUYWV', + 663: ' 33E^EVGSIRJSJTIXH[ RIXJVLSNRPRQSQTPXO[ RPXQVSSURWRXSXUWXWZX[Y[[Z\\Y^V', + 664: ' 23J\\JVLSNROSOTNXM[ RNXOVQSSRURVSVUUXUZV[W[YZZY\\V', + 665: ' 23LZRRPRNSMTLVLXMZO[Q[SZTYUWUUTSRRQSQURWTXWXYWZV', + 666: ' 24KZKVMSNQMUGg RMUNSPRRRTSUUUWTYSZQ[ RMZO[R[UZWYZV', + 667: ' 27L[UUTSRRPRNSMTLVLXMZO[Q[SZ RVRUUSZPaOdOfPgRfScS\\U[XY[V', + 668: ' 15MZMVOSPQPSSSTTTVSYSZT[U[WZXYZV', + 669: ' 16NYNVPSQQQSSVTXTZR[ RNZP[T[VZWYYV', + 670: ' 16OXOVQSSO RVFPXPZQ[S[UZVYXV RPNWN', + 671: ' 19L[LVNRLXLZM[O[QZSXUU RVRTXTZU[V[XZYY[V', + 672: ' 17L[LVNRMWMZN[O[RZTXUUUR RURVVWWYW[V', + 673: ' 25I^LRJTIWIYJ[L[NZPX RRRPXPZQ[S[UZWXXUXR RXRYVZW\\W^V', + 674: ' 20JZJVLSNRPRQSQZR[U[XYZV RWSVRTRSSOZN[L[KZ', + 675: ' 23L[LVNRLXLZM[O[QZSXUU RVRPdOfMgLfLdMaP^S\\U[XY[V', + 676: ' 23LZLVNSPRRRTTTVSXQZN[P\\Q^QaPdOfMgLfLdMaP^S\\WYZV', + 677: ' 22J\\K[NZQXSVUSWOXKXIWGUFSGRHQJPOPTQXRZT[V[XZYY', + 683: ' 26I[WUWRVOUNSMQMONMPLSLVMYNZP[R[TZVXWUXPXKWHVGTFRFPGNI', + 684: ' 16JZWNUMRMPNNPMSMVNYOZQ[T[VZ RMTUT', + 685: ' 23J[TFRGPJOLNOMTMXNZO[Q[SZUWVUWRXMXIWGVFTF RNPWP', + 686: ' 21H\\VFNb RQMNNLPKSKVLXNZQ[S[VZXXYUYRXPVNSMQM', + 687: ' 16I[XOWNTMQMNNMOLQLSMUOWSZT\\T^S_Q_', + 700: ' 18H\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF', + 701: ' 5H\\NJPISFS[', + 702: ' 15H\\LKLJMHNGPFTFVGWHXJXLWNUQK[Y[', + 703: ' 16H\\MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW', + 704: ' 7H\\UFKTZT RUFU[', + 705: ' 18H\\WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW', + 706: ' 24H\\XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT', + 707: ' 6H\\YFO[ RKFYF', + 708: ' 30H\\PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF', + 709: ' 24H\\XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX', + 710: ' 6MWRYQZR[SZRY', + 711: ' 9MWSZR[QZRYSZS\\R^Q_', + 712: ' 12MWRMQNROSNRM RRYQZR[SZRY', + 713: ' 15MWRMQNROSNRM RSZR[QZRYSZS\\R^Q_', + 714: ' 9MWRFRT RRYQZR[SZRY', + 715: ' 21I[LKLJMHNGPFTFVGWHXJXLWNVORQRT RRYQZR[SZRY', + 716: ' 3NVRFRM', + 717: ' 6JZNFNM RVFVM', + 718: ' 14KYQFOGNINKOMQNSNUMVKVIUGSFQF', + 719: ' 27H\\PBP_ RTBT_ RYIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX', + 720: ' 3G][BIb', + 721: ' 11KYVBTDRGPKOPOTPYR]T`Vb', + 722: ' 11KYNBPDRGTKUPUTTYR]P`Nb', + 723: ' 3NVRBRb', + 724: ' 3E_IR[R', + 725: ' 6E_RIR[ RIR[R', + 726: ' 6E_IO[O RIU[U', + 727: ' 6G]KKYY RYKKY', + 728: ' 9JZRLRX RMOWU RWOMU', + 729: ' 6MWRQQRRSSRRQ', + 730: ' 8MWSFRGQIQKRLSKRJ', + 731: ' 8MWRHQGRFSGSIRKQL', + 732: ' 9E_UMXP[RXTUW RIR[R', + 733: ' 12H]SBLb RYBRb RLOZO RKUYU', + 734: ' 35E_\\O\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\Z\\Y', + 735: ' 28G]IIJKKOKUJYI[ R[IZKYOYUZY[[ RIIKJOKUKYJ[I RI[KZOYUYYZ[[', + 737: ' 6KYOBO[ RUBU[', + 738: ' 6F^RBR[ RI[[[', + 739: ' 4F^[BI[[[', + 740: ' 18E_RIQJRKSJRI RIYHZI[JZIY R[YZZ[[\\Z[Y', + 741: ' 33F^RHNLKPJSJUKWMXOXQWRU RRHVLYPZSZUYWWXUXSWRU RRUQYP\\ RRUSYT\\ RP\\T\\', + 742: ' 26F^RNQKPINHMHKIJKJOKRLTNWR\\ RRNSKTIVHWHYIZKZOYRXTVWR\\', + 743: ' 20F^RGPJLOIR RRGTJXO[R RIRLUPZR] R[RXUTZR]', + 744: ' 48F^RTTWVXXXZW[U[SZQXPVPSQ RSQUOVMVKUISHQHOINKNMOOQQ RQQNPLPJQISIUJWLXNXPWRT RRTQYP\\ RRTSYT\\ RP\\T\\', + 745: ' 55F^RRR[Q\\ RRVQ\\ RRIQHOHNINKONRR RRISHUHVIVKUNRR RRRNOLNJNIOIQJR RRRVOXNZN[O[QZR RRRNULVJVIUISJR RRRVUXVZV[U[SZR', + 746: ' 55F^ISJSLTMVMXLZ RISIRJQLQMRNTNWMYLZ RRGPIOLOOQUQXPZR\\ RRGTIULUOSUSXTZR\\ R[S[RZQXQWRVTVWWYXZ R[SZSXTWVWXXZ RKVYV', + 750: ' 18PSSRRSQSPRPQQPRPSQSSRUQV RQQQRRRRQQQ', + 751: ' 16PTQPPQPSQTSTTSTQSPQP RRQQRRSSRRQ', + 752: ' 9NVPOTU RTOPU RNRVR', + 753: ' 28MWRKQMOPMR RRKSMUPWR RRMOQ RRMUQ RROPQ RROTQ RQQSQ RMRWR', + 754: ' 26MWMRMQNOONQMSMUNVOWQWR RPNTN ROOUO RNPVP RNQVQ RMRWR', + 755: ' 14LRLFLRRRLF RLIPQ RLLOR RLOMQ', + 756: ' 10MWRKQMOPMR RRKSMUPWR', + 757: ' 11MWWRWQVOUNSMQMONNOMQMR', + 758: ' 13G]]R]P\\MZJWHTGPGMHJJHMGPGR', + 759: ' 11MWMRMSNUOVQWSWUVVUWSWR', + 760: ' 7LXLPNRQSSSVRXP', + 761: ' 6RURUTTURTPRO', + 762: ' 7RVRRUPVNVLUKTK', + 763: ' 7NRRROPNNNLOKPK', + 764: ' 21MWWHVGTFQFOGNHMJMLNNOOUSVTWVWXVZU[S\\P\\N[MZ', + 765: ' 21G]IWHVGTGQHOINKMMMONPOTUUVWWYW[V\\U]S]P\\N[M', + 766: ' 31G]RRTUUVWWYW[V\\U]S]Q\\O[NYMWMUNTOPUOVMWKWIVHUGSGQHOINKMMMONPORR', + 767: ' 22H\\KFK[ RHF[FQP[Z RZV[Y\\[ RZVZY RWYZY RWYZZ\\[', + 768: ' 30KYUARBPCNELHKLKRLUNWQXSXVWXUYR RKPLMNKQJSJVKXMYPYVXZV]T_R`Oa', + 796: ' 3>f>RfR', + 797: ' 3D`D``D', + 798: ' 3RRR>Rf', + 799: ' 3D`DD``', + 800: ' 3D`DR`R', + 801: ' 3F^FY^K', + 802: ' 3KYK^YF', + 803: ' 3RRRDR`', + 804: ' 3KYKFY^', + 805: ' 3F^FK^Y', + 806: ' 3KYKRYR', + 807: ' 3MWMWWM', + 808: ' 3RRRKRY', + 809: ' 3MWMMWW', + 810: ' 8GRRGPGMHJJHMGPGR', + 811: ' 8GRGRGTHWJZM\\P]R]', + 812: ' 8R]R]T]W\\ZZ\\W]T]R', + 813: ' 8R]]R]P\\MZJWHTGRG', + 814: ' 9D`DOGQKSPTTTYS]Q`O', + 815: ' 9PUUDSGQKPPPTQYS]U`', + 816: ' 9OTODQGSKTPTTSYQ]O`', + 817: ' 9D`DUGSKQPPTPYQ]S`U', + 818: ' 5KYRJYNKVRZ', + 819: ' 5JZJRNKVYZR', + 820: ' 5KYKVKNYVYN', + 821: ' 5JZLXJPZTXL', + 822: ' 23JZJ]L]O\\Q[TXUVVSVOULTJSIQIPJOLNONSOVPXS[U\\X]Z]', + 823: ' 23I]]Z]X\\U[SXPVOSNONLOJPIQISJTLUOVSVVUXT[Q\\O]L]J', + 824: ' 23JZZGXGUHSIPLONNQNUOXPZQ[S[TZUXVUVQUNTLQIOHLGJG', + 825: ' 23G[GJGLHOIQLTNUQVUVXUZT[S[QZPXOUNQNNOLPISHUGXGZ', + 826: ' 21E[EPFRHTJUMVQVUUXSZP[NZLWLSMQNNPLSKVKYL\\M^', + 827: ' 19EYETHVKWPWSVVTXQYNYLXKVKSLPNNQMTMYN\\P_', + 828: ' 26OUQOOQOSQUSUUSUQSOQO RQPPQPSQTSTTSTQSPQP RRQQRRSSRRQ', + 829: ' 11RWRMSMUNVOWQWSVUUVSWRW', + 830: ' 9D`DRJR RORUR RZR`R', + 831: ' 5D`DUDO`O`U', + 832: ' 6JZRDJR RRDZR', + 833: ' 9D`DR`R RJYZY RP`T`', + 834: ' 9D`DR`R RDRRb R`RRb', + 840: ' 18KYQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK', + 841: ' 6LXLLLXXXXLLL', + 842: ' 5KYRJKVYVRJ', + 843: ' 6LXRHLRR\\XRRH', + 844: ' 12JZRIPOJOOSMYRUWYUSZOTORI', + 845: ' 6KYRKRY RKRYR', + 846: ' 6MWMMWW RWMMW', + 847: ' 9MWRLRX RMOWU RWOMU', + 850: ' 35NVQNOONQNSOUQVSVUUVSVQUOSNQN ROQOS RPPPT RQOQU RRORU RSOSU RTPTT RUQUS', + 851: ' 27NVNNNVVVVNNN ROOOU RPOPU RQOQU RRORU RSOSU RTOTU RUOUU', + 852: ' 17MWRLMUWURL RROOT RROUT RRRQT RRRST', + 853: ' 17LULRUWUMLR RORTU RORTO RRRTS RRRTQ', + 854: ' 17MWRXWOMORX RRUUP RRUOP RRRSP RRRQP', + 855: ' 17OXXROMOWXR RURPO RURPU RRRPQ RRRPS', + 856: ' 22LXRLNWXPLPVWRL RRRRL RRRLP RRRNW RRRVW RRRXP', + 857: ' 11RYRKRY RRKYNRQ RSMVNSO', + 860: ' 13MWRLRX ROOUO RMUOWQXSXUWWU', + 861: ' 11LXRLRX RLQMOWOXQ RPWTW', + 862: ' 14KYMNWX RWNMX ROLLOKQ RULXOYQ', + 863: ' 18I[NII[ RVI[[ RMM[[ RWMI[ RNIVI RMMWM', + 864: ' 21I[RGRV RMJWP RWJMP RIVL\\ R[VX\\ RIV[V RL\\X\\', + 865: ' 11G[MJSV RKPSL RG\\[\\[RG\\', + 866: ' 14LXPLPPLPLTPTPXTXTTXTXPTPTLPL', + 867: ' 32KYYPXNVLSKQKNLLNKQKSLVNXQYSYVXXVYT RYPWNUMSMQNPOOQOSPUQVSWUWWVYT', + 868: ' 10KYRJKVYVRJ RRZYNKNRZ', + 869: ' 34G]PIPGQFSFTGTI RGZHXJVKTLPLKMJOIUIWJXKXPYTZV\\X]Z RGZ]Z RQZP[Q\\S\\T[SZ', + 870: ' 64JZRMRS RRSQ\\ RRSS\\ RQ\\S\\ RRMQJPHNG RQJNG RRMSJTHVG RSJVG RRMNKLKJM RPLLLJM RRMVKXKZM RTLXLZM RRMPNOOOR RRMPOOR RRMTNUOUR RRMTOUR', + 871: ' 94JZRIRK RRNRP RRSRU RRYQ\\ RRYS\\ RQ\\S\\ RRGQIPJ RRGSITJ RPJRITJ RRKPNNOMN RRKTNVOWN RNOPORNTOVO RRPPSNTLTKRKSLT RRPTSVTXTYRYSXT RNTPTRSTTVT RRUPXOYMZLZKYJWJYLZ RRUTXUYWZXZYYZWZYXZ RMZOZRYUZWZ', + 872: ' 40JZRYQ\\ RRYS\\ RQ\\S\\ RRYUZXZZXZUYTWTYRZOYMWLUMVJUHSGQGOHNJOMMLKMJOKRMTKTJUJXLZOZRY', + 873: ' 32JZRYQ\\ RRYS\\ RQ\\S\\ RRYVXVVXUXRZQZLYIXHVHTGPGNHLHKIJLJQLRLUNVNXRY', + 874: ' 15I[IPKR RLKNP RRGRO RXKVP R[PYR', + 899: ' 6QSRQQRRSSRRQ', + 900: ' 10PTQPPQPSQTSTTSTQSPQP', + 901: ' 14NVQNOONQNSOUQVSVUUVSVQUOSNQN', + 902: ' 18MWQMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM', + 903: ' 18KYQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK', + 904: ' 22G]PGMHJJHMGPGTHWJZM\\P]T]W\\ZZ\\W]T]P\\MZJWHTGPG', + 905: ' 34AcPALBJCGEEGCJBLAPATBXCZE]G_JaLbPcTcXbZa]__]aZbXcTcPbLaJ_G]EZCXBTAPA', + 906: ' 34fRAPCMDJDGCEA>H@JAMAZB]D_G`M`PaRc RRATCWDZD]C_AfHdJcMcZb]`_]`W`TaRc', + 909: ' 33AcRAPCMDJDGCEABGAKAPBTDXG\\L`Rc RRATCWDZD]C_AbGcKcPbT`X]\\X`Rc RBHbH', + 997: ' 3MWMXWX', + 998: ' 3JZJZZZ', + 999: ' 3JZJ]Z]', + 1001: ' 18KYRKMX RRNVX RRKWX ROTTT RKXPX RTXYX', + 1002: ' 35JZNKNX ROKOX RLKSKVLWNVPSQ RSKULVNUPSQ ROQSQVRWTWUVWSXLX RSQURVTVUUWSX', + 1003: ' 24KYVLWKWOVLTKQKOLNMMPMSNVOWQXTXVWWU RQKOMNPNSOVQX', + 1004: ' 26JZNKNX ROKOX RLKSKVLWMXPXSWVVWSXLX RSKULVMWPWSVVUWSX', + 1005: ' 22JYNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXVXVTUX', + 1006: ' 20JXNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXQX', + 1007: ' 36K[VLWKWOVLTKQKOLNMMPMSNVOWQXTXVW RQKOMNPNSOVQX RTXUWVU RVSVX RWSWX RTSYS', + 1008: ' 27J[NKNX ROKOX RVKVX RWKWX RLKQK RTKYK ROQVQ RLXQX RTXYX', + 1009: ' 12NWRKRX RSKSX RPKUK RPXUX', + 1010: ' 19LXSKSURWQX RTKTUSWQXPXNWMUNTOUNV RQKVK', + 1011: ' 27JZNKNX ROKOX RWKOS RQQVX RRQWX RLKQK RTKYK RLXQX RTXYX', + 1012: ' 14KXOKOX RPKPX RMKRK RMXWXWTVX', + 1013: ' 30I\\MKMX RNNRX RNKRU RWKRX RWKWX RXKXX RKKNK RWKZK RKXOX RUXZX', + 1014: ' 21JZNKNX ROMVX ROKVV RVKVX RLKOK RTKXK RLXPX', + 1015: ' 32KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK', + 1016: ' 25JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX', + 1017: ' 47KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK RPWPUQTSTTUUZV[W[XZ RTUUXVZW[', + 1018: ' 37JZNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX RSRTSUWVXWXXW RSRUSVWWX', + 1019: ' 32KZVMWKWOVMULSKQKOLNMNOOPQQTRVSWT RNNOOQPTQVRWSWVVWTXRXPWOVNTNXOV', + 1020: ' 16KZRKRX RSKSX RNKMOMKXKXOWK RPXUX', + 1021: ' 20J[NKNUOWQXTXVWWUWK ROKOUPWQX RLKQK RUKYK', + 1022: ' 15KYMKRX RNKRU RWKRX RKKPK RTKYK', + 1023: ' 24I[LKOX RMKOT RRKOX RRKUX RSKUT RXKUX RJKOK RVKZK', + 1024: ' 21KZNKVX ROKWX RWKNX RLKQK RTKYK RLXQX RTXYX', + 1025: ' 20LYNKRRRX ROKSR RWKSRSX RLKQK RTKYK RPXUX', + 1026: ' 16LYVKNX RWKOX ROKNONKWK RNXWXWTVX', + 1027: ' 18KYRKMX RRNVX RRKWX ROTTT RKXPX RTXYX', + 1028: ' 35JZNKNX ROKOX RLKSKVLWNVPSQ RSKULVNUPSQ ROQSQVRWTWUVWSXLX RSQURVTVUUWSX', + 1029: ' 14KXOKOX RPKPX RMKWKWOVK RMXRX', + 1030: ' 15KYRKLX RRMWX RRKXX RMWVW RLXXX', + 1031: ' 22JYNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXVXVTUX', + 1032: ' 16LYVKNX RWKOX ROKNONKWK RNXWXWTVX', + 1033: ' 27J[NKNX ROKOX RVKVX RWKWX RLKQK RTKYK ROQVQ RLXQX RTXYX', + 1034: ' 44KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK RQOQT RTOTT RQQTQ RQRTR', + 1035: ' 12NWRKRX RSKSX RPKUK RPXUX', + 1036: ' 27JZNKNX ROKOX RWKOS RQQVX RRQWX RLKQK RTKYK RLXQX RTXYX', + 1037: ' 15KYRKMX RRNVX RRKWX RKXPX RTXYX', + 1038: ' 30I\\MKMX RNNRX RNKRU RWKRX RWKWX RXKXX RKKNK RWKZK RKXOX RUXZX', + 1039: ' 21JZNKNX ROMVX ROKVV RVKVX RLKOK RTKXK RLXPX', + 1040: ' 36JZMJLM RXJWM RPPOS RUPTS RMVLY RXVWY RMKWK RMLWL RPQTQ RPRTR RMWWW RMXWX', + 1041: ' 32KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK', + 1042: ' 21J[NKNX ROKOX RVKVX RWKWX RLKYK RLXQX RTXYX', + 1043: ' 25JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX', + 1044: ' 20K[MKRQ RNKSQMX RMKWKXOVK RNWWW RMXWXXTVX', + 1045: ' 16KZRKRX RSKSX RNKMOMKXKXOWK RPXUX', + 1046: ' 33KZMONLOKPKQLRORX RXOWLVKUKTLSOSX RMONMOLPLQMRO RXOWMVLULTMSO RPXUX', + 1047: ' 40KZRKRX RSKSX RQNNOMQMRNTQUTUWTXRXQWOTNQN RQNOONQNROTQU RTUVTWRWQVOTN RPKUK RPXUX', + 1048: ' 21KZNKVX ROKWX RWKNX RLKQK RTKYK RLXQX RTXYX', + 1049: ' 33J[RKRX RSKSX RLPMONOOSQU RTUVSWOXOYP RMONROTQUTUVTWRXO RPKUK RPXUX', + 1050: ' 35KZMVNXQXMRMONMOLQKTKVLWMXOXRTXWXXV ROUNRNOOMQK RTKVMWOWRVU RNWPW RUWWW', + 1051: ' 18KYTKKX RSMTX RTKUX RNTTT RIXNX RRXWX', + 1052: ' 34JYPKLX RQKMX RNKUKWLWNVPSQ RUKVLVNUPSQ ROQRQTRUSUUTWQXJX RRQTSTUSWQX', + 1053: ' 25KXVLWLXKWNVLTKRKPLOMNOMRMUNWPXRXTWUU RRKPMOONRNVPX', + 1054: ' 26JYPKLX RQKMX RNKTKVLWNWQVTUVTWQXJX RTKULVNVQUTTVSWQX', + 1055: ' 22JYPKLX RQKMX RSORS RNKXKWNWK ROQRQ RJXTXUUSX', + 1056: ' 20JXPKLX RQKMX RSORS RNKXKWNWK ROQRQ RJXOX', + 1057: ' 33KYVLWLXKWNVLTKRKPLOMNOMRMUNWPXRXTWUVVS RRKPMOONRNVPX RRXTVUS RSSXS', + 1058: ' 27J[PKLX RQKMX RXKTX RYKUX RNKSK RVK[K ROQVQ RJXOX RRXWX', + 1059: ' 12NWTKPX RUKQX RRKWK RNXSX', + 1060: ' 19LXUKRUQWPX RVKSURWPXOXMWLUMTNUMV RSKXK', + 1061: ' 27JZPKLX RQKMX RYKOR RRPTX RSPUX RNKSK RVK[K RJXOX RRXWX', + 1062: ' 14KXQKMX RRKNX ROKTK RKXUXVUTX', + 1063: ' 30I\\OKKX ROMPX RPKQV RYKPX RYKUX RZKVX RMKPK RYK\\K RIXMX RSXXX', + 1064: ' 21JZPKLX RPKTX RQKTU RXKTX RNKQK RVKZK RJXNX', + 1065: ' 32KYRKPLOMNOMRMUNWPXRXTWUVVTWQWNVLTKRK RRKPMOONRNVPX RRXTVUTVQVMTK', + 1066: ' 24JYPKLX RQKMX RNKUKWLXMXOWQTROR RUKWMWOVQTR RJXOX', + 1067: ' 46KYRKPLOMNOMRMUNWPXRXTWUVVTWQWNVLTKRK RRKPMOONRNVPX RRXTVUTVQVMTK ROWOVPUQURVRZS[T[UZ RRVSZT[', + 1068: ' 35JZPKLX RQKMX RNKUKWLXMXOWQTROR RUKWMWOVQTR RSRTWUXVXWW RSRTSUWVX RJXOX', + 1069: ' 28KZWLXLYKXNWLUKRKPLOMOOPPUSVT RONPOURVSVVUWSXPXNWMULXMWNW', + 1070: ' 16KZTKPX RUKQX RPKNNOKZKYNYK RNXSX', + 1071: ' 20J[PKMUMWOXSXUWVUYK RQKNUNWOX RNKSK RWK[K', + 1072: ' 15KYOKPX RPKQV RYKPX RMKRK RVK[K', + 1073: ' 24I[NKMX ROKNV RTKMX RTKSX RUKTV RZKSX RLKQK RXK\\K', + 1074: ' 21KZPKTX RQKUX RYKLX RNKSK RVK[K RJXOX RRXWX', + 1075: ' 20LYPKRQPX RQKSQ RYKSQQX RNKSK RVK[K RNXSX', + 1076: ' 16LYXKLX RYKMX RQKONPKYK RLXUXVUTX', + 1101: ' 32LZQOPPPQOQOPQOTOVQVWWXXX RTOUQUWWX RURRSPTOUOWPXSXTWUU RRSPUPWQX', + 1102: ' 29JYNKNX ROKOX RORPPROTOVPWRWUVWTXRXPWOU RTOUPVRVUUWTX RLKOK', + 1103: ' 24LXVQUQURVRVQUPSOQOOPNRNUOWQXSXUWVV RQOPPOROUPWQX', + 1104: ' 32L[VKVX RWKWX RVRUPSOQOOPNRNUOWQXSXUWVU RQOPPOROUPWQX RTKWK RVXYX', + 1105: ' 26LXOSVSVRUPSOQOOPNRNUOWQXSXUWVV RUSUQSO RQOPPOROUPWQX', + 1106: ' 20LWTKULUMVMVLTKRKPMPX RRKQMQX RNOSO RNXSX', + 1107: ' 42LYQOOQOSQUSUUSUQSOQO RQOPQPSQU RSUTSTQSO RTPUOVO RPTOUOXPYTYVZ ROWPXTXVYV[T\\P\\N[NYPX', + 1108: ' 28J[NKNX ROKOX RORPPROTOVPWRWX RTOUPVRVX RLKOK RLXQX RTXYX', + 1109: ' 18NWRKRLSLSKRK RRORX RSOSX RPOSO RPXUX', + 1110: ' 23NWSKSLTLTKSK RSOSZR\\ RTOTZR\\P\\O[OZPZP[O[ RQOTO', + 1111: ' 27JZNKNX ROKOX RWOOU RRSVX RSSWX RLKOK RTOYO RLXQX RTXYX', + 1112: ' 12NWRKRX RSKSX RPKSK RPXUX', + 1113: ' 44F_JOJX RKOKX RKRLPNOPORPSRSX RPOQPRRRX RSRTPVOXOZP[R[X RXOYPZRZX RHOKO RHXMX RPXUX RXX]X', + 1114: ' 28J[NONX ROOOX RORPPROTOVPWRWX RTOUPVRVX RLOOO RLXQX RTXYX', + 1115: ' 28LYQOOPNRNUOWQXTXVWWUWRVPTOQO RQOPPOROUPWQX RTXUWVUVRUPTO', + 1116: ' 32JYNON\\ ROOO\\ RORPPROTOVPWRWUVWTXRXPWOU RTOUPVRVUUWTX RLOOO RL\\Q\\', + 1117: ' 29KYUOU\\ RVOV\\ RURTPROPONPMRMUNWPXRXTWUU RPOOPNRNUOWPX RS\\X\\', + 1118: ' 22KXOOOX RPOPX RPRQPSOUOVPVQUQUPVP RMOPO RMXRX', + 1119: ' 26LYTOUPUQVQVPTOQOOPORQSTTVU ROQQRTSVTVWTXQXOWOVPVPWQX', + 1120: ' 14LWPKPVRXTXUWUV RQKQVRX RNOTO', + 1121: ' 28J[NONUOWQXSXUWVU ROOOUPWQX RVOVX RWOWX RLOOO RTOWO RVXYX', + 1122: ' 15KYNORX ROORV RVORX RLOQO RTOXO', + 1123: ' 24I[LOOX RMOOU RROOX RROUX RSOUU RXOUX RJOOO RVOZO', + 1124: ' 21KYNOUX ROOVX RVONX RLOQO RTOXO RLXPX RSXXX', + 1125: ' 23KYNORX ROORV RVORXP[N\\M\\L[LZMZM[L[ RLOQO RTOXO', + 1126: ' 16LXUONX RVOOX ROONQNOVO RNXVXVVUX', + 1127: ' 32K[QOOPNQMSMUNWPXQXSWUUWRXO RQOOQNSNUOWPX RQOSOUPWWXX RSOTPVWXXYX', + 1128: ' 40KXRKPMOOMUK\\ RQLPNNTL\\ RRKTKVLVNUPRQ RTKULUNTPRQ RRQTRUTUVTWRXQXOWNT RRQSRTTTVRX', + 1129: ' 19KYLQNOPORPSSSXR\\ RLQNPPPRQSS RWOVRSXQ\\', + 1130: ' 39KYSOQOOPNQMSMUNWPXRXTWUVVTVRUPRNQLQKRJTJUKVM RQOOQNSNVPX RRXTVUTUQSO RQLRKTKVM', + 1131: ' 27LXVPTOQOOPOQPRRS RQOPPPQRS RRSOTNUNWPXSXUW RRSPTOUOWPX', + 1132: ' 28LWRKQLQMSNVNVMSNPOOPNRNTOVPWRXSYS[R\\P\\O[ RSNQOPPOROTPVRX', + 1133: ' 26IYJRKPLONOOPOQMX RMONPNQLX ROQPPROTOVPVRS\\ RTOUPURR\\', + 1134: ' 35IYJSKQLPNPOQOVPX RMPNQNUOWPXQXSWTVUTVQVNULTKRKQLQNRPURWS RQXSVTTUQUNTK', + 1135: ' 13NWROPVPWQXSXUWVU RSOQVQWRX', + 1136: ' 26KYOOLX RPOMX RUOVPWPVOTORQOR RORPSRWTXVWWU RORQSSWTX', + 1137: ' 15LXLKNKPLWX RNKOLVX RRPMX RRPNX', + 1138: ' 26KZOOK\\ RPOL\\ RNUNWOXQXSWTV RVOTVTWUXWXXWYU RWOUVUWVX', + 1139: ' 19JYNOMX ROONUMX RVRVOWOVRTUQWNXMX RLOOO', + 1140: ' 36MXRKQLQMSNVN RTNQOPPPRRSUS RTNROQPQRRS RSSPTOUOWQXSYTZT[S\\Q\\ RSSQTPUPWQX', + 1141: ' 28KXQOOPNQMSMUNWPXRXTWUVVTVRUPSOQO RQOOQNSNVPX RRXTVUTUQSO', + 1142: ' 20IZPPMX RPPNX RTPSX RTPTX RKQMOXO RKQMPXP', + 1143: ' 29JXSOQOOPNQMSJ\\ RQOOQNSK\\ RSOUPVRVTUVTWRXPXNWMU RSOUQUTTVRX', + 1144: ' 28K[YOQOOPNQMSMUNWPXRXTWUVVTVRUPYP RQOOQNSNVPX RRXTVUTUQSO', + 1145: ' 14KZSPQX RSPRX RMQOOXO RMQOPXP', + 1146: ' 24JXKRLPMOOOPPPROUOWPX RNOOPORNUNWPXQXSWUUVRVOUOVP', + 1147: ' 35KZOPNQMSMUNWPXRXUWWUXRXPWOUOTPSRRUO\\ RMUNVPWRWUVWTXR RXQWPUPSR RRUQXP\\', + 1148: ' 17KXMONOPPS[T\\ RNOOPR[T\\U\\ RVOTRNYL\\', + 1149: ' 28I[TKQ\\ RUKP\\ RJRKPLONOOPOVPWSWUVWT RMONPNTOWPXSXUWWTXRYO', + 1150: ' 36JZNPPPPONPMQLSLUMWNXPXQWRUSR RLUNWPWRU RRRRWSXUXWVXTXRWPVOVPWP RRUSWUWWV', + 1151: ' 32KZVOTVTWUXWXXWYU RWOUVUWVX RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX', + 1152: ' 32JXOKMR RPKNRNVPX RNROPQOSOUPVRVTUVTWRXPXNWMUMR RSOUQUTTVRX RMKPK', + 1153: ' 22KXUPUQVQUPSOQOOPNQMSMUNWPXRXTWUV RQOOQNSNVPX', + 1154: ' 35KZWKTVTWUXWXXWYU RXKUVUWVX RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX RUKXK', + 1155: ' 23KWNURTTSURUPSOQOOPNQMSMUNWPXRXTWUV RQOOQNSNVPX', + 1156: ' 23MXWKXLXKVKTLSNPYO[N\\ RVKULTNQYP[N\\L\\L[M\\ RPOVO', + 1157: ' 34KYVOTVSYR[ RWOUVTYR[P\\M\\L[M[N\\ RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX', + 1158: ' 29KZPKLX RQKMX ROQPPROTOVPVRUUUWVX RTOUPURTUTWUXWXXWYU RNKQK', + 1159: ' 26MWSKSLTLTKSK RNROPPOROSPSRRURWSX RQORPRRQUQWRXTXUWVU', + 1160: ' 26MWTKTLULUKTK RORPPQOSOTPTRRYQ[O\\M\\M[N\\ RROSPSRQYP[O\\', + 1161: ' 32KXPKLX RQKMX RVPUQVQVPUOTORQPROR RORPSQWRXTXUWVU RORQSRWSX RNKQK', + 1162: ' 16NVSKPVPWQXSXTWUU RTKQVQWRX RQKTK', + 1163: ' 46F^GRHPIOKOLPLQJX RJOKPKQIX RLQMPOOQOSPSQQX RQORPRQPX RSQTPVOXOZPZRYUYWZX RXOYPYRXUXWYX[X\\W]U', + 1164: ' 33J[KRLPMOOOPPPQNX RNOOPOQMX RPQQPSOUOWPWRVUVWWX RUOVPVRUUUWVXXXYWZU', + 1165: ' 28KXQOOPNQMSMUNWPXRXTWUVVTVRUPSOQO RQOOQNSNVPX RRXTVUTUQSO', + 1166: ' 35JYKRLPMOOOPPPQM\\ RNOOPOQL\\ RPQROTOVPWRWTVVUWSXQXOVOT RTOVQVTUVSX RJ\\O\\', + 1167: ' 28KYVOR\\ RWOS\\ RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX RP\\U\\', + 1168: ' 22LXMRNPOOQORPRQPX RPOQPQQOX RRQSPUOVOWPWQVQWP', + 1169: ' 24LYVPVQWQVPTOQOOPORQSTTVU ROQQRTSVTVWTXQXOWNVOVOW', + 1170: ' 16NWSKPVPWQXSXTWUU RTKQVQWRX RPOUO', + 1171: ' 33IZJRKPLONOOPORNUNWOX RMONPNRMUMWOXQXSWTV RVOTVTWUXWXXWYU RWOUVUWVX', + 1172: ' 24JXKRLPMOOOPPPROUOWPX RNOOPORNUNWPXQXSWUUVRVOUOVP', + 1173: ' 37H\\IRJPKOMONPNRMUMWNX RLOMPMRLULWNXOXQWRV RTORVRWTX RUOSVSWTXUXWWYUZRZOYOZP', + 1174: ' 38JZMRNPPOROSPSR RQORPRRQUPWNXMXLWLVMVLW RXPWQXQXPWOVOTPSRRURWSX RQUQWRXTXVWWU', + 1175: ' 35IYJRKPLONOOPORNUNWOX RMONPNRMUMWOXQXSWTV RVOTVSYR[ RWOUVTYR[P\\M\\L[M[N\\', + 1176: ' 27KYWOWPVQNVMWMX RNQOOROUQ ROPRPUQVQ RNVOVRWUW ROVRXUXVV', + 1177: ' 39H[RKSLSMTMTLRKOKMLLNLX ROKNLMNMX RXKYLYMZMZLXKVKTMTX RVKUMUX RJOWO RJXOX RRXWX', + 1178: ' 29J[UKVLWLWKQKOLNNNX RQKPLONOX RVOVX RWOWX RLOWO RLXQX RTXYX', + 1179: ' 27J[WKQKOLNNNX RQKPLONOX RUKVLVX RWKWX RLOVO RLXQX RTXYX', + 1180: ' 48F_PKQLQMRMRLPKMKKLJNJX RMKLLKNKX RYKZL[L[KUKSLRNRX RUKTLSNSX RZOZX R[O[X RHO[O RHXMX RPXUX RXX]X', + 1181: ' 46F_PKQLQMRMRLPKMKKLJNJX RMKLLKNKX R[KUKSLRNRX RUKTLSNSX RYKZLZX R[K[X RHOZO RHXMX RPXUX RXX]X', + 1182: ' 12NWRORX RSOSX RPOSO RPXUX', + 1184: ' 21LXVPTOROPPOQNSNUOWQXSXUW RROPQOSOVQX ROSSS', + 1185: ' 35LYSKQLPMOONRNUOWPXRXTWUVVTWQWNVLUKSK RSKQMPOOSOVPX RRXTVUTVPVMUK ROQVQ', + 1186: ' 34KZTKQ\\ RUKP\\ RQONPMRMUNWQXTXWWXUXRWPTOQO RQOOPNRNUOWQX RTXVWWUWRVPTO', + 1187: ' 22LXUPVRVQUPSOQOOPNRNTOVRX RQOOQOTPVRXSYS[R\\P\\', + 1191: ' 45I[VKWLXLVKSKQLPMOOLYK[J\\ RSKQMPOMYL[J\\H\\H[I\\ RZK[L[KYKWLVNSYR[Q\\ RYKXLWNTYS[Q\\O\\O[P\\ RLOYO', + 1192: ' 38IZVKWLXLXKSKQLPMOOLYK[J\\ RSKQMPOMYL[J\\H\\H[I\\ RVOTVTWUXWXXWYU RWOUVUWVX RLOWO', + 1193: ' 38IZVKWL RXKSKQLPMOOLYK[J\\ RSKQMPOMYL[J\\H\\H[I\\ RWKTVTWUXWXXWYU RXKUVUWVX RLOVO', + 1194: ' 63F^SKTLTM RULSKPKNLMMLOIYH[G\\ RPKNMMOJYI[G\\E\\E[F\\ RZK[L\\L\\KWKUL RTMSOPYO[N\\ RWKUMTOQYP[N\\L\\L[M\\ RZOXVXWYX[X\\W]U R[OYVYWZX RIO[O', + 1195: ' 63F^SKTLTM RULSKPKNLMMLOIYH[G\\ RPKNMMOJYI[G\\E\\E[F\\ RZK[L R\\KWKUL RTMSOPYO[N\\ RWKUMTOQYP[N\\L\\L[M\\ R[KXVXWYX[X\\W]U R\\KYVYWZX RIOZO', + 1196: ' 20MWNROPPOROSPSRRURWSX RQORPRRQUQWRXTXUWVU', + 1200: ' 28LYQKOLNONTOWQXTXVWWTWOVLTKQK RQKPLOOOTPWQX RTXUWVTVOULTK', + 1201: ' 10LYPNSKSX RRLRX ROXVX', + 1202: ' 35LYOMONNNNMOLQKTKVLWNVPTQQROSNUNX RTKULVNUPTQ RNWOVPVSWVWWV RPVSXVXWVWU', + 1203: ' 39LYOMONNNNMOLQKTKVLWNVPTQ RTKULVNUPTQ RRQTQVRWTWUVWTXQXOWNVNUOUOV RTQURVTVUUWTX', + 1204: ' 13LYSMSX RTKTX RTKMTXT RQXVX', + 1205: ' 33LYOKNQ ROKVK ROLSLVK RNQOPQOTOVPWRWUVWTXQXOWNVNUOUOV RTOUPVRVUUWTX', + 1206: ' 36LYVMVNWNWMVLTKRKPLOMNPNUOWQXTXVWWUWSVQTPQPNR RRKPMOPOUPWQX RTXUWVUVSUQTP', + 1207: ' 22LYNKNO RVMRTPX RWKTQQX RNMPKRKUM RNMPLRLUMVM', + 1208: ' 51LYQKOLNNOPQQTQVPWNVLTKQK RQKPLONPPQQ RTQUPVNULTK RQQORNTNUOWQXTXVWWUWTVRTQ RQQPROTOUPWQX RTXUWVUVTURTQ', + 1209: ' 36LYOVOUNUNVOWQXSXUWVVWSWNVLTKQKOLNNNPORQSTSWQ RSXUVVSVNULTK RQKPLONOPPRQS', + 1210: ' 6NVRVQWRXSWRV', + 1211: ' 8NVSWRXQWRVSWSYQ[', + 1212: ' 12NVROQPRQSPRO RRVQWRXSWRV', + 1213: ' 14NVROQPRQSPRO RSWRXQWRVSWSYQ[', + 1214: ' 15NVRKQLRSSLRK RRLRO RRVQWRXSWRV', + 1215: ' 29LYNNONOONONNOLQKTKVLWNWOVQSRRSRTST RTKVMVPUQSR RRWRXSXSWRW', + 1216: ' 6OVRKRP RSKRP', + 1217: ' 12LXOKOP RPKOP RUKUP RVKUP', + 1218: ' 10MWQKPLPNQOSOTNTLSKQK', + 1219: ' 9MWRJRP ROKUO RUKOO', + 1220: ' 3KZXHM\\', + 1221: ' 16MWUHSJQMPPPTQWSZU\\ RSJRLQPQTRXSZ', + 1222: ' 16MWOHQJSMTPTTSWQZO\\ RQJRLSPSTRXQZ', + 1223: ' 12MWPHP\\ RQHQ\\ RPHUH RP\\U\\', + 1224: ' 12MWSHS\\ RTHT\\ ROHTH RO\\T\\', + 1225: ' 38LWSHQIPJPLRNSP RQIPL RSNRQ RPJQLSNSPRQPRRSSTSVQXPZ RRSSV RPXQ[ RSTRVPXPZQ[S\\', + 1226: ' 38MXQHSITJTLRNQP RSITL RQNRQ RTJSLQNQPRQTRRSQTQVSXTZ RRSQV RTXS[ RQTRVTXTZS[Q\\', + 1227: ' 4MWTHPRT\\', + 1228: ' 4MWPHTRP\\', + 1229: ' 3OURHR\\', + 1230: ' 6MWPHP\\ RTHT\\', + 1231: ' 3I[LRXR', + 1232: ' 6I[RLRX RLRXR', + 1233: ' 9JZRMRX RMRWR RMXWX', + 1234: ' 9JZRMRX RMMWM RMRWR', + 1235: ' 6JZMMWW RWMMW', + 1236: ' 6NVRQQRRSSRRQ', + 1237: ' 15I[RLQMRNSMRL RLRXR RRVQWRXSWRV', + 1238: ' 6I[LPXP RLTXT', + 1239: ' 9I[WLMX RLPXP RLTXT', + 1240: ' 9I[LNXN RLRXR RLVXV', + 1241: ' 4JZWLMRWX', + 1242: ' 4JZMLWRMX', + 1243: ' 10JZWKMOWS RMTWT RMXWX', + 1244: ' 10JZMKWOMS RMTWT RMXWX', + 1245: ' 21H[YUWUUTTSRPQOONNNLOKQKRLTNUOUQTRSTPUOWNYN', + 1246: ' 16JZLTLRMPOPUSWSXR RLRMQOQUTWTXRXP', + 1247: ' 8JZMSRPWS RMSRQWS', + 1248: ' 7NVSKPO RSKTLPO', + 1249: ' 7NVQKTO RQKPLTO', + 1250: ' 14LXNKOMQNSNUMVK RNKONQOSOUNVK', + 1251: ' 8NVSLRMQLRKSLSNQP', + 1252: ' 8NVSKQMQORPSORNQO', + 1253: ' 8NVQLRMSLRKQLQNSP', + 1254: ' 8NVQKSMSORPQORNSO', + 1256: ' 11JZWMQMONNOMQMSNUOVQWWW', + 1257: ' 11JZMMMSNUOVQWSWUVVUWSWM', + 1258: ' 11JZMMSMUNVOWQWSVUUVSWMW', + 1259: ' 11JZMWMQNOONQMSMUNVOWQWW', + 1260: ' 14JZWMQMONNOMQMSNUOVQWWW RMRUR', + 1261: ' 13I[TOUPXRUTTU RUPWRUT RLRWR', + 1262: ' 13MWRMRX ROPPORLTOUP RPORMTO', + 1263: ' 13I[POOPLROTPU ROPMROT RMRXR', + 1264: ' 13MWRLRW ROTPURXTUUT RPURWTU', + 1265: ' 37KYVSUPSOQOOPNQMSMUNWPXRXTWUVVTWQWNVLTKQKPLQLRK RQOOQNSNVPX RRXTVUTVQVNULTK', + 1266: ' 15JZLKRX RMKRV RXKRX RLKXK RNLWL', + 1267: ' 10G[IOLORW RKORX R[FRX', + 1268: ' 26I[XIXJYJYIXHVHTJSLROQUPYO[ RUITKSORUQXPZN\\L\\K[KZLZL[', + 1269: ' 40I[XIXJYJYIXHVHTJSLROQUPYO[ RUITKSORUQXPZN\\L\\K[KZLZL[ RQNOONQNSOUQVSVUUVSVQUOSNQN', + 1270: ' 26H\\ZRYTWUVUTTSSQPPONNMNKOJQJRKTMUNUPTQSSPTOVNWNYOZQZR', + 1271: ' 26JZXKLX ROKPLPNOOMOLNLLMKOKSLVLXK RUTTUTWUXWXXWXUWTUT', + 1272: ' 41J[YPXPXQYQYPXOWOVPUTTVSWQXOXMWLVLTMSORRPSNSLRKPKOLONPQUWWXXXYW ROXMVMTOR RONPPVWWX', + 1273: ' 29J[UPSOQOPQPRQTSTUS RUOUSVTXTYRYQXNVLSKRKOLMNLQLRMUOWRXSXVW', + 1274: ' 34KZQHQ\\ RTHT\\ RWLVLVMWMWLUKPKNLNNOPVSWT RNNOOVRWTWVVWTXQXOWNVNUOUOVNV', + 1275: ' 12KYRKN\\ RVKR\\ RNQWQ RMVVV', + 1276: ' 40LXTLSLSMTMTLSKQKPLPNQPTRUS RPNQOTQUSUUSW RQPOROTPVSXTY ROTPUSWTYT[S\\Q\\P[PZQZQ[P[', + 1277: ' 29LXRKQLRMSLRK RRMRQ RRQQSRVSSRQ RRVR\\ RPOONNOOPPOTOUNVOUPTO', + 1278: ' 42LXRMSLRKQLRMRQQRSURV RRQSRQURVRZQ[R\\S[RZ RPOONNOOPPOTOUNVOUPTO RPXOWNXOYPXTXUWVXUYTX', + 1279: ' 12LYVKVX RNKVK RQQVQ RNXVX', + 1281: ' 24H\\QKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK RRQQRRSSRRQ', + 1282: ' 33LYQKPLPMQN RTKULUMTN RRNPOOQORPTRUSUUTVRVQUOSNRN RRURY RSUSY ROWVW', + 1283: ' 23LYRKPLONOOPQRRSRUQVOVNULSKRK RRRRX RSRSX ROUVU', + 1284: ' 24H\\QKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK RRKRY RKRYR', + 1285: ' 25JYRRPQOQMRLTLUMWOXPXRWSUSTRR RWMRR RRMWMWR RRMVNWR', + 1286: ' 25JZLLMKOKQLRNRPQRPSNT ROKPLQNQQPS RVKUX RWKTX RNTXT', + 1287: ' 27JYNKNU ROKNR RNROPQOSOUPVQVTTVTXUYVYWX RSOUQUTTV RLKOK', + 1288: ' 27LYONRKRQ RVNSKSQ RRQPROTOUPWRXSXUWVUVTURSQ RRTRUSUSTRT', + 1289: ' 27JZRKRY RMKMPNRPSTSVRWPWK RLMMKNM RQMRKSM RVMWKXM ROVUV', + 1290: ' 27JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXVXVUUX', + 1291: ' 20LYWKTKQLONNQNSOVQXTYWY RWKTLRNQQQSRVTXWY', + 1292: ' 23JZRRPQOQMRLTLUMWOXPXRWSUSTRR RSLQQ RWMRR RXQSS', + 1293: ' 12KYPMTW RTMPW RMPWT RWPMT', + 1294: ' 34J[OUMULVLXMYOYPXPVNTMRMONMOLQKTKVLWMXOXRWTUVUXVYXYYXYVXUVU RNMPLULWM', + 1295: ' 34J[OOMOLNLLMKOKPLPNNPMRMUNWOXQYTYVXWWXUXRWPUNULVKXKYLYNXOVO RNWPXUXWW', + 1401: ' 21F^KHK\\ RLHL\\ RXHX\\ RYHY\\ RHH\\H RH\\O\\ RU\\\\\\', + 1402: ' 20H]KHRQJ\\ RJHQQ RJHYHZMXH RK[X[ RJ\\Y\\ZWX\\', + 1403: ' 20KYVBTDRGPKOPOTPYR]T`Vb RTDRHQKPPPTQYR\\T`', + 1404: ' 20KYNBPDRGTKUPUTTYR]P`Nb RPDRHSKTPTTSYR\\P`', + 1405: ' 12KYOBOb RPBPb ROBVB RObVb', + 1406: ' 12KYTBTb RUBUb RNBUB RNbUb', + 1407: ' 40KYTBRCQDPFPHQJRKSMSOQQ RRCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra RQSSUSWRYQZP\\P^Q`RaTb', + 1408: ' 40KYPBRCSDTFTHSJRKQMQOSQ RRCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra RSSQUQWRYSZT\\T^S`RaPb', + 1409: ' 24KYU@RCPFOIOLPOSVTYT\\S_Ra RRCQEPHPKQNTUUXU[T^RaOd', + 1410: ' 24KYO@RCTFUIULTOQVPYP\\Q_Ra RRCSETHTKSNPUOXO[P^RaUd', + 1411: ' 13AXCRGRR` RGSRa RFSRb RX:Rb', + 1412: ' 32F^[CZD[E\\D\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia', + 2001: ' 18H\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[', + 2002: ' 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[', + 2003: ' 32G\\XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXXYV RQFOGMILKKNKSLVMXOZQ[', + 2004: ' 30G]LFL[ RMFM[ RIFSFVGXIYKZNZSYVXXVZS[I[ RSFUGWIXKYNYSXVWXUZS[', + 2005: ' 22G\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[', + 2006: ' 20G[LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[P[', + 2007: ' 40G^XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXX RQFOGMILKKNKSLVMXOZQ[ RXSX[ RYSY[ RUS\\S', + 2008: ' 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RLPXP RH[O[ RU[\\[', + 2009: ' 12MXRFR[ RSFS[ ROFVF RO[V[', + 2010: ' 20KZUFUWTZR[P[NZMXMVNUOVNW RTFTWSZR[ RQFXF', + 2011: ' 27F\\KFK[ RLFL[ RYFLS RQOY[ RPOX[ RHFOF RUF[F RH[O[ RU[[[', + 2012: ' 14I[NFN[ ROFO[ RKFRF RK[Z[ZUY[', + 2013: ' 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][', + 2014: ' 21G^LFL[ RMFYY RMHY[ RYFY[ RIFMF RVF\\F RI[O[', + 2015: ' 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF', + 2016: ' 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[', + 2017: ' 64G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF RNYNXOVQURUTVUXV_W`Y`Z^Z] RUXV\\W^X_Y_Z^', + 2018: ' 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUPMP RUFWGXHYJYLXNWOUP RI[P[ RRPTQURXYYZZZ[Y RTQUSWZX[Z[[Y[X', + 2019: ' 34H\\XIYFYLXIVGSFPFMGKIKKLMMNOOUQWRYT RKKMMONUPWQXRYTYXWZT[Q[NZLXKUK[LX', + 2020: ' 16I\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[', + 2021: ' 23F^KFKULXNZQ[S[VZXXYUYF RLFLUMXOZQ[ RHFOF RVF\\F', + 2022: ' 15H\\KFR[ RLFRX RYFR[ RIFOF RUF[F', + 2023: ' 24F^JFN[ RKFNV RRFN[ RRFV[ RSFVV RZFV[ RGFNF RWF]F', + 2024: ' 21H\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[', + 2025: ' 20H]KFRQR[ RLFSQS[ RZFSQ RIFOF RVF\\F RO[V[', + 2026: ' 16H\\XFK[ RYFL[ RLFKLKFYF RK[Y[YUX[', + 2027: ' 18H\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[', + 2028: ' 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[', + 2029: ' 14I[NFN[ ROFO[ RKFZFZLYF RK[R[', + 2030: ' 15H\\RFJ[ RRFZ[ RRIY[ RKZYZ RJ[Z[', + 2031: ' 22G\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[', + 2032: ' 16H\\XFK[ RYFL[ RLFKLKFYF RK[Y[YUX[', + 2033: ' 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RLPXP RH[O[ RU[\\[', + 2034: ' 56G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF ROMOT RUMUT ROPUP ROQUQ', + 2035: ' 12MXRFR[ RSFS[ ROFVF RO[V[', + 2036: ' 27F\\KFK[ RLFL[ RYFLS RQOY[ RPOX[ RHFOF RUF[F RH[O[ RU[[[', + 2037: ' 15H\\RFK[ RRFY[ RRIX[ RI[O[ RU[[[', + 2038: ' 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][', + 2039: ' 21G^LFL[ RMFYY RMHY[ RYFY[ RIFMF RVF\\F RI[O[', + 2040: ' 36G]KEJJ RZEYJ RONNS RVNUS RKWJ\\ RZWY\\ RKGYG RKHYH ROPUP ROQUQ RKYYY RKZYZ', + 2041: ' 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF', + 2042: ' 21F^KFK[ RLFL[ RXFX[ RYFY[ RHF\\F RH[O[ RU[\\[', + 2043: ' 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[', + 2044: ' 20H]KFRPJ[ RJFQP RJFYFZLXF RKZXZ RJ[Y[ZUX[', + 2045: ' 16I\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[', + 2046: ' 33I\\KKKILGMFOFPGQIRMR[ RKIMGOGQI RZKZIYGXFVFUGTISMS[ RZIXGVGTI RO[V[', + 2047: ' 48H]RFR[ RSFS[ RPKMLLMKOKRLTMUPVUVXUYTZRZOYMXLUKPK RPKNLMMLOLRMTNUPV RUVWUXTYRYOXMWLUK ROFVF RO[V[', + 2048: ' 21H\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[', + 2049: ' 41G^RFR[ RSFS[ RIMJLLMMQNSOTQU RJLKMLQMSNTQUTUWTXSYQZM[L RTUVTWSXQYM[L\\M ROFVF RO[V[', + 2050: ' 43G]JXK[O[MWKSJPJLKIMGPFTFWGYIZLZPYSWWU[Y[ZX RMWLTKPKLLINGPF RTFVGXIYLYPXTWW RKZNZ RVZYZ', + 2051: ' 18H\\UFH[ RUFV[ RTHU[ RLUUU RF[L[ RR[X[', + 2052: ' 41F^OFI[ RPFJ[ RLFWFZG[I[KZNYOVP RWFYGZIZKYNXOVP RMPVPXQYSYUXXVZR[F[ RVPWQXSXUWXUZR[', + 2053: ' 34H]ZH[H\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[S[UZWXXV RTFRGPINLMOLSLVMYNZP[', + 2054: ' 30F]OFI[ RPFJ[ RLFUFXGYHZKZOYSWWUYSZO[F[ RUFWGXHYKYOXSVWTYRZO[', + 2055: ' 22F]OFI[ RPFJ[ RTLRT RLF[FZLZF RMPSP RF[U[WVT[', + 2056: ' 20F\\OFI[ RPFJ[ RTLRT RLF[FZLZF RMPSP RF[M[', + 2057: ' 42H^ZH[H\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[R[UZWXYT RTFRGPINLMOLSLVMYNZP[ RR[TZVXXT RUT\\T', + 2058: ' 27E_NFH[ ROFI[ R[FU[ R\\FV[ RKFRF RXF_F RLPXP RE[L[ RR[Y[', + 2059: ' 12LYUFO[ RVFP[ RRFYF RL[S[', + 2060: ' 21I[XFSWRYQZO[M[KZJXJVKULVKW RWFRWQYO[ RTF[F', + 2061: ' 27F]OFI[ RPFJ[ R]FLS RSOW[ RROV[ RLFSF RYF_F RF[M[ RS[Y[', + 2062: ' 14H\\QFK[ RRFL[ RNFUF RH[W[YUV[', + 2063: ' 30E`NFH[ RNFO[ ROFPY R\\FO[ R\\FV[ R]FW[ RKFOF R\\F`F RE[K[ RS[Z[', + 2064: ' 21F_OFI[ ROFVX ROIV[ R\\FV[ RLFOF RYF_F RF[L[', + 2065: ' 42G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF RSFQGOIMLLOKSKVLYN[ RQ[SZUXWUXRYNYKXHVF', + 2066: ' 27F]OFI[ RPFJ[ RLFXF[G\\I\\K[NYPUQMQ RXFZG[I[KZNXPUQ RF[M[', + 2067: ' 61G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF RSFQGOIMLLOKSKVLYN[ RQ[SZUXWUXRYNYKXHVF RLYLXMVOUPURVSXS_T`V`W^W] RSXT^U_V_W^', + 2068: ' 42F^OFI[ RPFJ[ RLFWFZG[I[KZNYOVPMP RWFYGZIZKYNXOVP RRPTQURVZW[Y[ZYZX RURWYXZYZZY RF[M[', + 2069: ' 35G^ZH[H\\F[L[JZHYGVFRFOGMIMKNMONVRXT RMKOMVQWRXTXWWYVZS[O[LZKYJWJUI[JYKY', + 2070: ' 16H]UFO[ RVFP[ ROFLLNF]F\\L\\F RL[S[', + 2071: ' 25F_NFKQJUJXKZN[R[UZWXXU\\F ROFLQKUKXLZN[ RKFRF RYF_F', + 2072: ' 15H\\NFO[ ROFPY R\\FO[ RLFRF RXF^F', + 2073: ' 24E_MFK[ RNFLY RUFK[ RUFS[ RVFTY R]FS[ RJFQF RZF`F', + 2074: ' 21G]NFU[ ROFV[ R\\FH[ RLFRF RXF^F RF[L[ RR[X[', + 2075: ' 20H]NFRPO[ ROFSPP[ R]FSP RLFRF RYF_F RL[S[', + 2076: ' 16G][FH[ R\\FI[ ROFLLNF\\F RH[V[XUU[', + 2077: ' 46H\\KILKXWYYY[ RLLXX RKIKKLMXYY[ RPPLTKVKXLZK[ RKVMZ RLTLVMXMZK[ RSSXN RVIVLWNYNYLWKVI RVIWLYN', + 2101: ' 39I]NONPMPMONNPMTMVNWOXQXXYZZ[ RWOWXXZZ[[[ RWQVRPSMTLVLXMZP[S[UZWX RPSNTMVMXNZP[', + 2102: ' 33G\\LFL[ RMFM[ RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIFMF', + 2103: ' 28H[WPVQWRXQXPVNTMQMNNLPKSKULXNZQ[S[VZXX RQMONMPLSLUMXOZQ[', + 2104: ' 36H]WFW[ RXFX[ RWPUNSMQMNNLPKSKULXNZQ[S[UZWX RQMONMPLSLUMXOZQ[ RTFXF RW[[[', + 2105: ' 31H[LSXSXQWOVNTMQMNNLPKSKULXNZQ[S[VZXX RWSWPVN RQMONMPLSLUMXOZQ[', + 2106: ' 22KXUGTHUIVHVGUFSFQGPIP[ RSFRGQIQ[ RMMUM RM[T[', + 2107: ' 60I\\QMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM RONNPNTOV RUVVTVPUN RVOWNYMYNWN RNUMVLXLYM[P\\U\\X]Y^ RLYMZP[U[X\\Y^Y_XaUbObLaK_K^L\\O[', + 2108: ' 28G]LFL[ RMFM[ RMPONRMTMWNXPX[ RTMVNWPW[ RIFMF RI[P[ RT[[[', + 2109: ' 18MXRFQGRHSGRF RRMR[ RSMS[ ROMSM RO[V[', + 2110: ' 25MXSFRGSHTGSF RTMT_SaQbObNaN`O_P`Oa RSMS_RaQb RPMTM', + 2111: ' 27G\\LFL[ RMFM[ RWMMW RRSX[ RQSW[ RIFMF RTMZM RI[P[ RT[Z[', + 2112: ' 12MXRFR[ RSFS[ ROFSF RO[V[', + 2113: ' 44BcGMG[ RHMH[ RHPJNMMOMRNSPS[ ROMQNRPR[ RSPUNXMZM]N^P^[ RZM\\N]P][ RDMHM RD[K[ RO[V[ RZ[a[', + 2114: ' 28G]LML[ RMMM[ RMPONRMTMWNXPX[ RTMVNWPW[ RIMMM RI[P[ RT[[[', + 2115: ' 36H\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM', + 2116: ' 36G\\LMLb RMMMb RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIMMM RIbPb', + 2117: ' 33H\\WMWb RXMXb RWPUNSMQMNNLPKSKULXNZQ[S[UZWX RQMONMPLSLUMXOZQ[ RTb[b', + 2118: ' 23IZNMN[ ROMO[ ROSPPRNTMWMXNXOWPVOWN RKMOM RK[R[', + 2119: ' 32J[WOXMXQWOVNTMPMNNMOMQNRPSUUWVXW RMPNQPRUTWUXVXYWZU[Q[OZNYMWM[NY', + 2120: ' 16KZPFPWQZS[U[WZXX RQFQWRZS[ RMMUM', + 2121: ' 28G]LMLXMZP[R[UZWX RMMMXNZP[ RWMW[ RXMX[ RIMMM RTMXM RW[[[', + 2122: ' 15I[LMR[ RMMRY RXMR[ RJMPM RTMZM', + 2123: ' 24F^JMN[ RKMNX RRMN[ RRMV[ RSMVX RZMV[ RGMNM RWM]M', + 2124: ' 21H\\LMW[ RMMX[ RXML[ RJMPM RTMZM RJ[P[ RT[Z[', + 2125: ' 22H[LMR[ RMMRY RXMR[P_NaLbKbJaK`La RJMPM RTMZM', + 2126: ' 16I[WML[ RXMM[ RMMLQLMXM RL[X[XWW[', + 2127: ' 40G^QMNNLPKRJUJXKZN[P[RZUWWTYPZM RQMONMPLRKUKXLZN[ RQMSMUNVPXXYZZ[ RSMTNUPWXXZZ[[[', + 2128: ' 57G\\TFQGOIMMLPKTJZIb RTFRGPINMMPLTKZJb RTFVFXGYHYKXMWNTOPO RVFXHXKWMVNTO RPOTPVRWTWWVYUZR[P[NZMYLV RPOSPURVTVWUYTZR[', + 2129: ' 28H\\IPKNMMOMQNROSRSVRZOb RJOLNPNRO RZMYPXRSYP^Nb RYMXPWRSY', + 2130: ' 44I\\VNTMRMONMQLTLWMYNZP[R[UZWWXTXQWOSJRHRFSEUEWFYH RRMPNNQMTMXNZ RR[TZVWWTWPVNTKSISGTFVFYH', + 2131: ' 32I[XPVNTMPMNNNPPRSS RPMONOPQRSS RSSNTLVLXMZP[S[UZWX RSSOTMVMXNZP[', + 2132: ' 31I[TFRGQHQIRJUKZKZJWKSMPOMRLULWMYP[S]T_TaSbQbPa RULQONRMUMWNYP[', + 2133: ' 32G]HQIOKMNMONOPNTL[ RMMNNNPMTK[ RNTPPRNTMVMXNYOYRXWUb RVMXOXRWWTb', + 2134: ' 44F]GQHOJMMMNNNPMUMXNZO[ RLMMNMPLULXMZO[Q[SZUXWUXRYMYIXGVFTFRHRJSMUPWRZT RSZUWVUWRXMXIWGVF', + 2135: ' 15LXRMPTOXOZP[S[UYVW RSMQTPXPZQ[', + 2136: ' 29H\\NMJ[ ROMK[ RXMYNZNYMWMUNQROSMS ROSQTSZT[ ROSPTRZS[U[WZYW', + 2137: ' 23H\\KFMFOGPHQJWXXZY[ RMFOHPJVXWZY[Z[ RRMJ[ RRMK[', + 2138: ' 28F]MMGb RNMHb RMPLVLYN[P[RZTXVU RXMUXUZV[Y[[Y\\W RYMVXVZW[', + 2139: ' 24H\\NML[ ROMNSMXL[ RYMXQVU RZMYPXRVUTWQYOZL[ RKMOM', + 2140: ' 45IZTFRGQHQIRJUKXK RUKQLOMNONQPSSTVT RUKRLPMOOOQQSST RSTOUMVLXLZN\\S^T_TaRbPb RSTPUNVMXMZO\\S^', + 2141: ' 32I[RMONMQLTLWMYNZP[R[UZWWXTXQWOVNTMRM RRMPNNQMTMXNZ RR[TZVWWTWPVN', + 2142: ' 22G]PNL[ RPNM[ RVNV[ RVNW[ RIPKNNM[M RIPKONN[N', + 2143: ' 31H[LVMYNZP[R[UZWWXTXQWOVNTMRMONMQLTHb RR[TZVWWTWPVN RRMPNNQMTIb', + 2144: ' 35H][MQMNNLQKTKWLYMZO[Q[TZVWWTWQVOUNSM RQMONMQLTLXMZ RQ[SZUWVTVPUN RUN[N', + 2145: ' 16H\\SNP[ RSNQ[ RJPLNOMZM RJPLOONZN', + 2146: ' 31H\\IQJOLMOMPNPPNVNYP[ RNMONOPMVMYNZP[Q[TZVXXUYRYOXMWNXOYR RXUYO', + 2147: ' 37G]ONMOKQJTJWKYLZN[Q[TZWXYUZRZOXMVMTORSPXMb RJWLYNZQZTYWWYU RZOXNVNTPRSPYNb', + 2148: ' 23I[KMMMONPPU_VaWb RMMNNOPT_UaWbYb RZMYOWRM]K`Jb', + 2149: ' 34F]UFOb RVFNb RGQHOJMMMNNNPMUMXOZRZTYWVYS RLMMNMPLULXMZO[R[TZVXXUYS[M', + 2150: ' 44F]JQLOONNMLNJQITIWJZK[M[OZQWRT RIWJYKZMZOYQW RQTQWRZS[U[WZYWZTZQYNXMWNYOZQ RQWRYSZUZWYYW', + 2151: ' 39H]XMVTUXUZV[Y[[Y\\W RYMWTVXVZW[ RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ', + 2152: ' 36H[PFLSLVMYNZ RQFMS RMSNPPNRMTMVNWOXQXTWWUZR[P[NZMWMS RVNWPWTVWTZR[ RMFQF', + 2153: ' 25I[WPWQXQXPWNUMRMONMQLTLWMYNZP[R[UZWW RRMPNNQMTMXNZ', + 2154: ' 42H]ZFVTUXUZV[Y[[Y\\W R[FWTVXVZW[ RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ RWF[F', + 2155: ' 26I[MVQUTTWRXPWNUMRMONMQLTLWMYNZP[R[UZWX RRMPNNQMTMXNZ', + 2156: ' 35KZZGYHZI[H[GZFXFVGUHTJSMP[O_Na RXFVHUJTNRWQ[P^O`NaLbJbIaI`J_K`Ja ROMYM', + 2157: ' 43H\\YMU[T^RaObLbJaI`I_J^K_J` RXMT[S^QaOb RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ', + 2158: ' 31H]PFJ[ RQFK[ RMTOPQNSMUMWNXOXQVWVZW[ RUMWOWQUWUZV[Y[[Y\\W RMFQF', + 2159: ' 26LYUFTGUHVGUF RMQNOPMSMTNTQRWRZS[ RRMSNSQQWQZR[U[WYXW', + 2160: ' 32LYVFUGVHWGVF RNQOOQMTMUNUQR[Q^P`OaMbKbJaJ`K_L`Ka RSMTNTQQ[P^O`Mb', + 2161: ' 34H\\PFJ[ RQFK[ RXNWOXPYOYNXMWMUNQROSMS ROSQTSZT[ ROSPTRZS[U[WZYW RMFQF', + 2162: ' 18MYUFQTPXPZQ[T[VYWW RVFRTQXQZR[ RRFVF', + 2163: ' 52AbBQCOEMHMINIPHTF[ RGMHNHPGTE[ RHTJPLNNMPMRNSOSQP[ RPMRORQO[ RRTTPVNXMZM\\N]O]Q[W[Z\\[ RZM\\O\\QZWZZ[[^[`YaW', + 2164: ' 37F]GQHOJMMMNNNPMTK[ RLMMNMPLTJ[ RMTOPQNSMUMWNXOXQVWVZW[ RUMWOWQUWUZV[Y[[Y\\W', + 2165: ' 32I[RMONMQLTLWMYNZP[R[UZWWXTXQWOVNTMRM RRMPNNQMTMXNZ RR[TZVWWTWPVN', + 2166: ' 42G\\HQIOKMNMONOPNTJb RMMNNNPMTIb RNTOQQNSMUMWNXOYQYTXWVZS[Q[OZNWNT RWNXPXTWWUZS[ RFbMb', + 2167: ' 33H\\XMRb RYMSb RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ RObVb', + 2168: ' 26IZJQKOMMPMQNQPPTN[ ROMPNPPOTM[ RPTRPTNVMXMYNYOXPWOXN', + 2169: ' 28J[XOXPYPYOXNUMRMONNONQORVVWW RNPOQVUWVWYVZS[P[MZLYLXMXMY', + 2170: ' 18KYTFPTOXOZP[S[UYVW RUFQTPXPZQ[ RNMWM', + 2171: ' 37F]GQHOJMMMNNNQLWLYN[ RLMMNMQKWKYLZN[P[RZTXVT RXMVTUXUZV[Y[[Y\\W RYMWTVXVZW[', + 2172: ' 26H\\IQJOLMOMPNPQNWNYP[ RNMONOQMWMYNZP[Q[TZVXXUYQYMXMYO', + 2173: ' 41C`DQEOGMJMKNKQIWIYK[ RIMJNJQHWHYIZK[M[OZQXRV RTMRVRYSZU[W[YZ[X\\V]R]M\\M]O RUMSVSYU[', + 2174: ' 42H\\KQMNOMRMSOSR RQMRORRQVPXNZL[K[JZJYKXLYKZ RQVQYR[U[WZYW RYNXOYPZOZNYMXMVNTPSRRVRYS[', + 2175: ' 41G\\HQIOKMNMONOQMWMYO[ RMMNNNQLWLYMZO[Q[SZUXWT RZMV[U^SaPbMbKaJ`J_K^L_K` RYMU[T^RaPb', + 2176: ' 31H\\YMXOVQNWLYK[ RLQMOOMRMVO RMOONRNVOXO RLYNYRZUZWY RNYR[U[WYXW', + 2177: ' 43G^VGUHVIWHWGUFRFOGMILLL[ RRFPGNIMLM[ R\\G[H\\I]H]G\\FZFXGWIW[ RZFYGXIX[ RIM[M RI[P[ RT[[[', + 2178: ' 33G]WGVHWIXHWGUFRFOGMILLL[ RRFPGNIMLM[ RWMW[ RXMX[ RIMXM RI[P[ RT[[[', + 2179: ' 35G]VGUHVIWHWGUF RXFRFOGMILLL[ RRFPGNIMLM[ RWHW[ RXFX[ RIMWM RI[P[ RT[[[', + 2180: ' 54BcRGQHRISHRGPFMFJGHIGLG[ RMFKGIIHLH[ R]G\\H]I^H]G[FXFUGSIRLR[ RXFVGTISLS[ R]M][ R^M^[ RDM^M RD[K[ RO[V[ RZ[a[', + 2181: ' 56BcRGQHRISHRGPFMFJGHIGLG[ RMFKGIIHLH[ R\\G[H\\I]H]G[F R^FXFUGSIRLR[ RXFVGTISLS[ R]H][ R^F^[ RDM]M RD[K[ RO[V[ RZ[a[', + 2182: ' 12MXRMR[ RSMS[ ROMSM RO[V[', + 2184: ' 25IZWNUMRMONMPLSLVMYNZQ[T[VZ RRMPNNPMSMVNYOZQ[ RMTUT', + 2185: ' 43I\\TFQGOJNLMOLTLXMZO[Q[TZVWWUXRYMYIXGVFTF RTFRGPJOLNOMTMXNZO[ RQ[SZUWVUWRXMXIWGVF RNPWP', + 2186: ' 42G]UFOb RVFNb RQMMNKPJSJVKXMZP[S[WZYXZUZRYPWNTMQM RQMNNLPKSKVLXNZP[ RS[VZXXYUYRXPVNTM', + 2187: ' 27I[TMVNXPXOWNTMQMNNMOLQLSMUOWSZ RQMONNOMQMSNUSZT\\T^S_Q_', + 2190: ' 45G]LMKNJPJRKUOYP[ RJRKTOXP[P]O`MbLbKaJ_J\\KXMTOQRNTMVMYNZPZTYXWZU[T[SZSXTWUXTY RVMXNYPYTXXWZ', + 2191: ' 69E_YGXHYIZHYGWFTFQGOINKMNLRJ[I_Ha RTFRGPIOKNNLWK[J^I`HaFbDbCaC`D_E`Da R_G^H_I`H`G_F]F[GZHYJXMU[T_Sa R]F[HZJYNWWV[U^T`SaQbObNaN`O_P`Oa RIM^M', + 2192: ' 52F^[GZH[I\\H[GXFUFRGPIOKNNMRK[J_Ia RUFSGQIPKONMWL[K^J`IaGbEbDaD`E_F`Ea RYMWTVXVZW[Z[\\Y]W RZMXTWXWZX[ RJMZM', + 2193: ' 54F^YGXHYIZHZGXF R\\FUFRGPIOKNNMRK[J_Ia RUFSGQIPKONMWL[K^J`IaGbEbDaD`E_F`Ea R[FWTVXVZW[Z[\\Y]W R\\FXTWXWZX[ RJMYM', + 2194: ' 86@cTGSHTIUHTGRFOFLGJIIKHNGRE[D_Ca ROFMGKIJKINGWF[E^D`CaAb?b>a>`?_@`?a R`G_H`IaH`G]FZFWGUITKSNRRP[O_Na RZFXGVIUKTNRWQ[P^O`NaLbJbIaI`J_K`Ja R^M\\T[X[Z\\[_[aYbW R_M]T\\X\\Z][ RDM_M', + 2195: ' 88@cTGSHTIUHTGRFOFLGJIIKHNGRE[D_Ca ROFMGKIJKINGWF[E^D`CaAb?b>a>`?_@`?a R^G]H^I_H_G]F RaFZFWGUITKSNRRP[O_Na RZFXGVIUKTNRWQ[P^O`NaLbJbIaI`J_K`Ja R`F\\T[X[Z\\[_[aYbW RaF]T\\X\\Z][ RDM^M', + 2196: ' 20LYMQNOPMSMTNTQRWRZS[ RRMSNSQQWQZR[U[WYXW', + 2200: ' 40H\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF RQFOGNHMJLOLRMWNYOZQ[ RS[UZVYWWXRXOWJVHUGSF', + 2201: ' 11H\\NJPISFS[ RRGR[ RN[W[', + 2202: ' 45H\\LJMKLLKKKJLHMGPFTFWGXHYJYLXNUPPRNSLUKXK[ RTFVGWHXJXLWNTPPR RKYLXNXSZVZXYYX RNXS[W[XZYXYV', + 2203: ' 47H\\LJMKLLKKKJLHMGPFTFWGXIXLWNTOQO RTFVGWIWLVNTO RTOVPXRYTYWXYWZT[P[MZLYKWKVLUMVLW RWQXTXWWYVZT[', + 2204: ' 13H\\THT[ RUFU[ RUFJUZU RQ[X[', + 2205: ' 39H\\MFKP RKPMNPMSMVNXPYSYUXXVZS[P[MZLYKWKVLUMVLW RSMUNWPXSXUWXUZS[ RMFWF RMGRGWF', + 2206: ' 48H\\WIVJWKXJXIWGUFRFOGMILKKOKULXNZQ[S[VZXXYUYTXQVOSNRNOOMQLT RRFPGNIMKLOLUMXOZQ[ RS[UZWXXUXTWQUOSN', + 2207: ' 31H\\KFKL RKJLHNFPFUIWIXHYF RLHNGPGUI RYFYIXLTQSSRVR[ RXLSQRSQVQ[', + 2208: ' 63H\\PFMGLILLMNPOTOWNXLXIWGTFPF RPFNGMIMLNNPO RTOVNWLWIVGTF RPOMPLQKSKWLYMZP[T[WZXYYWYSXQWPTO RPONPMQLSLWMYNZP[ RT[VZWYXWXSWQVPTO', + 2209: ' 48H\\XMWPURRSQSNRLPKMKLLINGQFSFVGXIYLYRXVWXUZR[O[MZLXLWMVNWMX RQSORMPLMLLMIOGQF RSFUGWIXLXRWVVXTZR[', + 2210: ' 6MWRYQZR[SZRY', + 2211: ' 8MWR[QZRYSZS\\R^Q_', + 2212: ' 12MWRMQNROSNRM RRYQZR[SZRY', + 2213: ' 14MWRMQNROSNRM RR[QZRYSZS\\R^Q_', + 2214: ' 15MWRFQHRTSHRF RRHRN RRYQZR[SZRY', + 2215: ' 32I[MJNKMLLKLJMHNGPFSFVGWHXJXLWNVORQRT RSFUGVHWJWLVNTP RRYQZR[SZRY', + 2216: ' 6NVRFQM RSFQM', + 2217: ' 12JZNFMM ROFMM RVFUM RWFUM', + 2218: ' 14KYQFOGNINKOMQNSNUMVKVIUGSFQF', + 2219: ' 9JZRFRR RMIWO RWIMO', + 2220: ' 3G][BIb', + 2221: ' 20KYVBTDRGPKOPOTPYR]T`Vb RTDRHQKPPPTQYR\\T`', + 2222: ' 20KYNBPDRGTKUPUTTYR]P`Nb RPDRHSKTPTTSYR\\P`', + 2223: ' 12KYOBOb RPBPb ROBVB RObVb', + 2224: ' 12KYTBTb RUBUb RNBUB RNbUb', + 2225: ' 40KYTBRCQDPFPHQJRKSMSOQQ RRCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra RQSSUSWRYQZP\\P^Q`RaTb', + 2226: ' 40KYPBRCSDTFTHSJRKQMQOSQ RRCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra RSSQUQWRYSZT\\T^S`RaPb', + 2227: ' 4KYUBNRUb', + 2228: ' 4KYOBVROb', + 2229: ' 3NVRBRb', + 2230: ' 6KYOBOb RUBUb', + 2231: ' 3E_IR[R', + 2232: ' 6E_RIR[ RIR[R', + 2233: ' 9F^RJR[ RJRZR RJ[Z[', + 2234: ' 9F^RJR[ RJJZJ RJRZR', + 2235: ' 6G]KKYY RYKKY', + 2236: ' 6MWRQQRRSSRRQ', + 2237: ' 15E_RIQJRKSJRI RIR[R RRYQZR[SZRY', + 2238: ' 6E_IO[O RIU[U', + 2239: ' 9E_YIK[ RIO[O RIU[U', + 2240: ' 9E_IM[M RIR[R RIW[W', + 2241: ' 4F^ZIJRZ[', + 2242: ' 4F^JIZRJ[', + 2243: ' 10F^ZFJMZT RJVZV RJ[Z[', + 2244: ' 10F^JFZMJT RJVZV RJ[Z[', + 2245: ' 21F_[WYWWVUTRPQOONMNKOJQJSKUMVOVQURTUPWNYM[M', + 2246: ' 24F^IUISJPLONOPPTSVTXTZS[Q RISJQLPNPPQTTVUXUZT[Q[O', + 2247: ' 8G]JTROZT RJTRPZT', + 2248: ' 7LXTFOL RTFUGOL', + 2249: ' 7LXPFUL RPFOGUL', + 2250: ' 18H\\KFLHNJQKSKVJXHYF RKFLINKQLSLVKXIYF', + 2251: ' 8MWRHQGRFSGSIRKQL', + 2252: ' 8MWSFRGQIQKRLSKRJ', + 2253: ' 8MWRHSGRFQGQIRKSL', + 2254: ' 8MWQFRGSISKRLQKRJ', + 2255: ' 10E[HMLMRY RKMR[ R[BR[', + 2256: ' 13F^ZJSJOKMLKNJQJSKVMXOYSZZZ', + 2257: ' 13F^JJJQKULWNYQZSZVYXWYUZQZJ', + 2258: ' 13F^JJQJUKWLYNZQZSYVWXUYQZJZ', + 2259: ' 13F^JZJSKOLMNKQJSJVKXMYOZSZZ', + 2260: ' 16F^ZJSJOKMLKNJQJSKVMXOYSZZZ RJRVR', + 2261: ' 11E_XP[RXT RUMZRUW RIRZR', + 2262: ' 11JZPLRITL RMORJWO RRJR[', + 2263: ' 11E_LPIRLT ROMJROW RJR[R', + 2264: ' 11JZPXR[TX RMURZWU RRIRZ', + 2265: ' 44I\\XRWOVNTMRMONMQLTLWMYNZP[R[UZWXXUYPYKXHWGUFRFPGOHOIPIPH RRMPNNQMTMXNZ RR[TZVXWUXPXKWHUF', + 2266: ' 15H\\JFR[ RKFRY RZFR[ RJFZF RKGYG', + 2267: ' 10AbDMIMRY RHNR[ Rb:R[', + 2268: ' 32F^[CZD[E\\D\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia', + 2269: ' 50F^[CZD[E\\D\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia RQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK', + 2270: ' 26F_\\S[UYVWVUUTTQPPONNLNJOIQISJULVNVPUQTTPUOWNYN[O\\Q\\S', + 2271: ' 32F^[FI[ RNFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F RWTUUTWTYV[X[ZZ[X[VYTWT', + 2272: ' 49F_[NZO[P\\O\\N[MZMYNXPVUTXRZP[M[JZIXIUJSPORMSKSIRGPFNGMIMKNNPQUXWZZ[[[\\Z\\Y RM[KZJXJUKSMQ RMKNMVXXZZ[', + 2273: ' 56E`WNVLTKQKOLNMMPMSNUPVSVUUVS RQKOMNPNSOUPV RWKVSVUXVZV\\T]Q]O\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX RXKWSWUXV', + 2274: ' 42H\\PBP_ RTBT_ RXIWJXKYJYIWGTFPFMGKIKKLMMNOOUQWRYT RKKMMONUPWQXRYTYXWZT[P[MZKXKWLVMWLX', + 2275: ' 12H]SFLb RYFRb RLQZQ RKWYW', + 2276: ' 46JZUITJUKVJVIUGSFQFOGNINKOMQOVR ROMTPVRWTWVVXTZ RPNNPMRMTNVPXU[ RNVSYU[V]V_UaSbQbOaN_N^O]P^O_', + 2277: ' 30JZRFQHRJSHRF RRFRb RRQQTRbSTRQ RLMNNPMNLLM RLMXM RTMVNXMVLTM', + 2278: ' 56JZRFQHRJSHRF RRFRT RRPQRSVRXQVSRRP RRTRb RR^Q`RbS`R^ RLMNNPMNLLM RLMXM RTMVNXMVLTM RL[N\\P[NZL[ RL[X[ RT[V\\X[VZT[', + 2279: ' 12I\\XFX[ RKFXF RPPXP RK[X[', + 2281: ' 38E`QFNGKIILHOHRIUKXNZQ[T[WZZX\\U]R]O\\LZIWGTFQF RROQPQQRRSRTQTPSORO RRPRQSQSPRP', + 2282: ' 45J[PFNGOIQJ RPFOGOI RUFWGVITJ RUFVGVI RQJOKNLMNMQNSOTQUTUVTWSXQXNWLVKTJQJ RRUR[ RSUS[ RNXWX', + 2283: ' 27I\\RFOGMILLLMMPORRSSSVRXPYMYLXIVGSFRF RRSR[ RSSS[ RNWWW', + 2284: ' 28D`PFMGJIHLGOGSHVJYM[P\\T\\W[ZY\\V]S]O\\LZIWGTFPF RRFR\\ RGQ]Q', + 2285: ' 31G`PMMNKPJSJTKWMYPZQZTYVWWTWSVPTNQMPM R]GWG[HUN R]G]M\\IVO R\\HVN', + 2286: ' 28F\\IIJGLFOFQGRIRLQOPQNSKU ROFPGQIQMPPNS RVFT[ RWFS[ RKUYU', + 2287: ' 30I\\MFMU RNFMQ RMQNOONQMTMWNXPXRWTUV RTMVNWPWRTXTZU[W[YY RKFNF', + 2288: ' 44I\\RNOOMQLTLUMXOZR[S[VZXXYUYTXQVOSNRN RRHNJRFRN RSHWJSFSN RRSQTQURVSVTUTTSSRS RRTRUSUSTRT', + 2289: ' 37G^QHRFR[ RTHSFS[ RJHKFKMLPNRQSRS RMHLFLNMQ R[HZFZMYPWRTSSS RXHYFYNXQ RNWWW', + 2290: ' 31G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[Y[YVX[', + 2291: ' 24H[YGUGQHNJLMKPKSLVNYQ[U\\Y\\ RYGVHSJQMPPPSQVSYV[Y\\', + 2292: ' 27F_OQMQKRJSIUIWJYKZM[O[QZRYSWSURSQROQ RSHPQ RZJRR R\\QST', + 2293: ' 12H\\OKUY RUKOY RKOYU RYOKU', + 2294: ' 48F^NVLUKUIVHXHYI[K\\L\\N[OYOXNVKRJOJMKJMHPGTGWHYJZMZOYRVVUXUYV[X\\Y\\[[\\Y\\X[VYUXUVV RJMKKMIPHTHWIYKZM', + 2295: ' 48F^NMLNKNIMHKHJIHKGLGNHOJOKNMKQJTJVKYM[P\\T\\W[YYZVZTYQVMUKUJVHXGYG[H\\J\\K[MYNXNVM RJVKXMZP[T[WZYXZV', + 2301: ' 40F_JMILIJJHLGNGPHQIRKSP RIJKHMHOIPJQLRPR[ R[M\\L\\J[HYGWGUHTISKRP R\\JZHXHVIUJTLSPS[', + 2302: ' 51F^IGJKKMMOPPTPWOYMZK[G RIGJJKLMNPOTOWNYLZJ[G RPONPMQLSLVMXOZQ[S[UZWXXVXSWQVPTO RPPNQMSMVNY RVYWVWSVQTP', + 2303: ' 30F^MJMV RNKNU RVKVU RWJWV RIGKIMJPKTKWJYI[G RIYKWMVPUTUWVYW[Y', + 2304: ' 48F^[ILIJJILINJPLQNQPPQNQLPJ[J RIMJOKPMQ RQMPKOJMI RIXXXZW[U[SZQXPVPTQSSSUTWIW R[TZRYQWP RSTTVUWWX', + 2305: ' 48F]OUMTLTJUIWIXJZL[M[OZPXPWOUJPINIKJILHOGSGWHYJZLZOYRVUUWUYV[X[YZZX RMSKPJNJKKILH RSGVHXJYLYOXRVU', + 2306: ' 48G_HKKHMKMV RJILLLV RMKPHRKRU ROIQLQU RRKUHWKW[ RTIVLV[ RWKZH[J\\M\\P[SZUXWUYP[ RYIZJ[M[PZSYUWWTYP[', + 2307: ' 41F^ISMSLRKOKMLJNHQGSGVHXJYMYOXRWS[S RITOTMRLOLMMJOHQG RSGUHWJXMXOWRUT[T RKXYX RKYYY', + 2308: ' 30F_GLJIMLMX RIJLMLX RMLPISLSX ROJRMRX RSLVIYLYW[Y RUJXMXXZZ]W', + 2309: ' 33G]ZIJY RZIWJQJ RXKUKQJ RZIYLYR RXKXNYR RQRJR RPSMSJR RQRQY RPSPVQY', + 2310: ' 33F^HOJKOU RJMOWRPWPZO[M[KZIXHWHUITKTMUPVRWUWXUZ RWHVIUKUMWQXTXWWYUZ', + 2311: ' 36F^IOLLPN RKMOORLUN RQMTOWLYN RVMXO[L RIULRPT RKSOURRUT RQSTUWRYT RVSXU[R', + 2312: ' 48F^JHNJPLQOQRPUNWJY RJHMIOJQLRO RRRQUOWMXJY RZHWIUJSLRO RRRSUUWWXZY RZHVJTLSOSRTUVWZY RIP[P RIQ[Q', + 2317: ' 12NVQQQSSSSQQQ RQQSS RSQQS', + 2318: ' 18JZMPQRTTVVWYW[V]U^ RMQST RMRPSTUVWWY', + 2319: ' 18JZWKVMTOPQMR RSPMS RUFVGWIWKVNTPQRMT', + 2320: ' 36H\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR', + 2321: ' 36H\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR', + 2322: ' 34J[SMPNNPMRMTNVPWRWUVWTXRXPWNUMSM ROPUM RNRVN RMTWO RNUXP ROVWR RPWVT', + 2323: ' 18JZOGO^ RUFU] RMNWL RMOWM RMWWU RMXWV', + 2324: ' 18JZNFNX RVLV^ RNNVL RNOVM RNWVU RNXVV', + 2325: ' 25JZNBNW RNNQLTLVMWOWQVSSUQVNW RNNQMTMVN RUMVOVQUSSU', + 2326: ' 18E_HIHL R\\I\\L RHI\\I RHJ\\J RHK\\K RHL\\L', + 2327: ' 18JZMNMQ RWNWQ RMNWN RMOWO RMPWP RMQWQ', + 2328: ' 49JZMLWX RMLONQOTOVNWMWKUKUMTO RONTO RQOWM RVKVN RULWL RWXUVSUPUNVMWMYOYOWPU RUVPU RSUMW RNVNY RMXOX', + 2329: ' 26JZPOOMOKMKMMNNPOSOUNWL RNKNN RMLOL RMMSO RPOUN RWLWY', + 2330: ' 86A^GfHfIeIdHcGcFdFfGhIiKiNhPfQdR`RUQ;Q4R/S-U,V,X-Y/Y3X6W8U;P?JCHEFHEJDNDREVGYJ[N\\R\\V[XZZW[T[PZMYKWITHPHMIKKJNJRKUMW RGdGeHeHdGd RU;Q?LCIFGIFKENERFVGXJ[ RR\\U[WZYWZTZPYMXKVITH', + 2331: '103EfNSOUQVSVUUVSVQUOSNQNOONPMSMVNYP[S\\V\\Y[[Y\\W]T]P\\MZJXIUHRHOIMJKLIOHSHXI]KaMcPeTfYf]e`cba RKLJNIRIXJ\\L`NbQdUeYe]d_cba RPOTO ROPUP RNQVQ RNRVR RNSVS ROTUT RPUTU RaLaNcNcLaL RbLbN RaMcM RaVaXcXcVaV RbVbX RaWcW', + 2332: ' 30D`H@Hd RM@Md RW@Wd R\\@\\d RMMWK RMNWL RMOWM RMWWU RMXWV RMYWW', + 2367: ' 12NVQQQSSSSQQQ RQQSS RSQQS', + 2368: ' 18JZMPQRTTVVWYW[V]U^ RMQST RMRPSTUVWWY', + 2369: ' 18JZWKVMTOPQMR RSPMS RUFVGWIWKVNTPQRMT', + 2370: ' 32H\\PMMNLOKQKSLUMVPWTWWVXUYSYQXOWNTMPM RMNLPLSMUNVPW RWVXTXQWOVNTM', + 2371: ' 36H\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR', + 2372: ' 34J[SMPNNPMRMTNVPWRWUVWTXRXPWNUMSM ROPUM RNRVN RMTWO RNUXP ROVWR RPWVT', + 2373: ' 18JZOGO^ RUFU] RMNWL RMOWM RMWWU RMXWV', + 2374: ' 18JZNFNX RVLV^ RNNVL RNOVM RNWVU RNXVV', + 2375: ' 25JZNBNW RNNQLTLVMWOWQVSSUQVNW RNNQMTMVN RUMVOVQUSSU', + 2376: ' 18E_HIHL R\\I\\L RHI\\I RHJ\\J RHK\\K RHL\\L', + 2377: ' 18JZMNMQ RWNWQ RMNWN RMOWO RMPWP RMQWQ', + 2378: ' 36JZQCVMRTRU RULQS RTITKPRRUUY RW\\UYSXQXOYN[N]O_Ra RW\\UZSYOYO]P_Ra RSXPZN]', + 2379: ' 26JZPOOMOKMKMMNNPOSOUNWL RNKNN RMLOL RMMSO RPOUN RWLSY', + 2380: ' 86A^GfHfIeIdHcGcFdFfGhIiKiNhPfQdR`RUQ;Q4R/S-U,V,X-Y/Y3X6W8U;P?JCHEFHEJDNDREVGYJ[N\\R\\V[XZZW[T[PZMYKWITHPHMIKKJNJRKUMW RGdGeHeHdGd RU;Q?LCIFGIFKENERFVGXJ[ RR\\U[WZYWZTZPYMXKVITH', + 2381: ' 89IjNQOOQNSNUOVQVSUUSVQVOUNTMQMNNKPISHWH[I^K`NaRaW`[_]]`ZcVfQiMk RWHZI]K_N`R`W_[^]\\`YcTgQi RPOTO ROPUP RNQVQ RNRVR RNSVS ROTUT RPUTU ReLeNgNgLeL RfLfN ReMgM ReVeXgXgVeV RfVfX ReWgW', + 2382: ' 85D`H>Hf RI>If RM>Mf RQBSBSDQDQAR?T>W>Y?[A\\D\\I[LYNWOUOSNRLQNOQNROSQVRXSVUUWUYV[X\\[\\`[cYeWfTfReQcQ`S`SbQb RRBRD RQCSC RY?ZA[D[IZLYN RRLRNPQNRPSRVRX RYVZX[[[`ZcYe RR`Rb RQaSa', + 2401: ' 21AcHBHb RIBIb R[B[b R\\B\\b RDB`B RDbMb RWb`b', + 2402: ' 23BaGBQPFb RFBPP REBPQ REB\\B^I[B RGa\\a RFb\\b^[[b', + 2403: ' 28I[X+U1R8P=OANFMNMVN^OcPgRlUsXy RU1S6Q; +} + +const SYMB: Record = { + '\\frac': { glyph: 0, arity: 2, flags: {} }, + '\\binom': { glyph: 0, arity: 2, flags: {} }, + '\\sqrt': { glyph: 2267, arity: 1, flags: { opt: true, xfl: true, yfl: true } }, + '^': { glyph: 0, arity: 1, flags: {} }, + '_': { glyph: 0, arity: 1, flags: {} }, + '(': { glyph: 2221, arity: 0, flags: { yfl: true } }, + ')': { glyph: 2222, arity: 0, flags: { yfl: true } }, + '[': { glyph: 2223, arity: 0, flags: { yfl: true } }, + ']': { glyph: 2224, arity: 0, flags: { yfl: true } }, + '\\langle': { glyph: 2227, arity: 0, flags: { yfl: true } }, + '\\rangle': { glyph: 2228, arity: 0, flags: { yfl: true } }, + '|': { glyph: 2229, arity: 0, flags: { yfl: true } }, + + '\\|': { glyph: 2230, arity: 0, flags: { yfl: true } }, + '\\{': { glyph: 2225, arity: 0, flags: { yfl: true } }, + '\\}': { glyph: 2226, arity: 0, flags: { yfl: true } }, + + '\\#': { glyph: 2275, arity: 0, flags: {} }, + '\\$': { glyph: 2274, arity: 0, flags: {} }, + '\\&': { glyph: 2273, arity: 0, flags: {} }, + '\\%': { glyph: 2271, arity: 0, flags: {} }, + + /*semantics*/ + '\\begin': { glyph: 0, arity: 1, flags: {} }, + '\\end': { glyph: 0, arity: 1, flags: {} }, + '\\left': { glyph: 0, arity: 1, flags: {} }, + '\\right': { glyph: 0, arity: 1, flags: {} }, + '\\middle': { glyph: 0, arity: 1, flags: {} }, + + /*operators*/ + '\\cdot': { glyph: 2236, arity: 0, flags: {} }, + '\\pm': { glyph: 2233, arity: 0, flags: {} }, + '\\mp': { glyph: 2234, arity: 0, flags: {} }, + '\\times': { glyph: 2235, arity: 0, flags: {} }, + '\\div': { glyph: 2237, arity: 0, flags: {} }, + '\\leqq': { glyph: 2243, arity: 0, flags: {} }, + '\\geqq': { glyph: 2244, arity: 0, flags: {} }, + '\\leq': { glyph: 2243, arity: 0, flags: {} }, + '\\geq': { glyph: 2244, arity: 0, flags: {} }, + '\\propto': { glyph: 2245, arity: 0, flags: {} }, + '\\sim': { glyph: 2246, arity: 0, flags: {} }, + '\\equiv': { glyph: 2240, arity: 0, flags: {} }, + '\\dagger': { glyph: 2277, arity: 0, flags: {} }, + '\\ddagger': { glyph: 2278, arity: 0, flags: {} }, + '\\ell': { glyph: 662, arity: 0, flags: {} }, + + /*accents*/ + '\\vec': { glyph: 2261, arity: 1, flags: { hat: true, xfl: true, yfl: true } }, + '\\overrightarrow': { glyph: 2261, arity: 1, flags: { hat: true, xfl: true, yfl: true } }, + '\\overleftarrow': { glyph: 2263, arity: 1, flags: { hat: true, xfl: true, yfl: true } }, + '\\bar': { glyph: 2231, arity: 1, flags: { hat: true, xfl: true } }, + '\\overline': { glyph: 2231, arity: 1, flags: { hat: true, xfl: true } }, + '\\widehat': { glyph: 2247, arity: 1, flags: { hat: true, xfl: true, yfl: true } }, + '\\hat': { glyph: 2247, arity: 1, flags: { hat: true } }, + '\\acute': { glyph: 2248, arity: 1, flags: { hat: true } }, + '\\grave': { glyph: 2249, arity: 1, flags: { hat: true } }, + '\\breve': { glyph: 2250, arity: 1, flags: { hat: true } }, + '\\tilde': { glyph: 2246, arity: 1, flags: { hat: true } }, + '\\underline': { glyph: 2231, arity: 1, flags: { mat: true, xfl: true } }, + + '\\not': { glyph: 2220, arity: 1, flags: {} }, + + '\\neq': { glyph: 2239, arity: 1, flags: {} }, + '\\ne': { glyph: 2239, arity: 1, flags: {} }, + '\\exists': { glyph: 2279, arity: 0, flags: {} }, + '\\in': { glyph: 2260, arity: 0, flags: {} }, + '\\subset': { glyph: 2256, arity: 0, flags: {} }, + '\\supset': { glyph: 2258, arity: 0, flags: {} }, + '\\cup': { glyph: 2257, arity: 0, flags: {} }, + '\\cap': { glyph: 2259, arity: 0, flags: {} }, + '\\infty': { glyph: 2270, arity: 0, flags: {} }, + '\\partial': { glyph: 2265, arity: 0, flags: {} }, + '\\nabla': { glyph: 2266, arity: 0, flags: {} }, + '\\aleph': { glyph: 2077, arity: 0, flags: {} }, + '\\wp': { glyph: 2190, arity: 0, flags: {} }, + '\\therefore': { glyph: 740, arity: 0, flags: {} }, + '\\mid': { glyph: 2229, arity: 0, flags: {} }, + + '\\sum': { glyph: 2402, arity: 0, flags: { big: true } }, + '\\prod': { glyph: 2401, arity: 0, flags: { big: true } }, + '\\bigoplus': { glyph: 2284, arity: 0, flags: { big: true } }, + '\\bigodot': { glyph: 2281, arity: 0, flags: { big: true } }, + '\\int': { glyph: 2412, arity: 0, flags: { yfl: true } }, + '\\oint': { glyph: 2269, arity: 0, flags: { yfl: true } }, + '\\oplus': { glyph: 1284, arity: 0, flags: {} }, + '\\odot': { glyph: 1281, arity: 0, flags: {} }, + '\\perp': { glyph: 738, arity: 0, flags: {} }, + '\\angle': { glyph: 739, arity: 0, flags: {} }, + '\\triangle': { glyph: 842, arity: 0, flags: {} }, + '\\Box': { glyph: 841, arity: 0, flags: {} }, + + '\\rightarrow': { glyph: 2261, arity: 0, flags: {} }, + '\\to': { glyph: 2261, arity: 0, flags: {} }, + '\\leftarrow': { glyph: 2263, arity: 0, flags: {} }, + '\\gets': { glyph: 2263, arity: 0, flags: {} }, + '\\circ': { glyph: 902, arity: 0, flags: {} }, + '\\bigcirc': { glyph: 904, arity: 0, flags: {} }, + '\\bullet': { glyph: 828, arity: 0, flags: {} }, + '\\star': { glyph: 856, arity: 0, flags: {} }, + '\\diamond': { glyph: 743, arity: 0, flags: {} }, + '\\ast': { glyph: 728, arity: 0, flags: {} }, + + /*verbatim symbols*/ + '\\log': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\ln': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\exp': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\mod': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\lim': { glyph: 0, arity: 0, flags: { txt: true, big: true } }, + + '\\sin': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\cos': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\tan': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\csc': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\sec': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\cot': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\sinh': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\cosh': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\tanh': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\csch': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\sech': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\coth': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\arcsin': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\arccos': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\arctan': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\arccsc': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\arcsec': { glyph: 0, arity: 0, flags: { txt: true } }, + '\\arccot': { glyph: 0, arity: 0, flags: { txt: true } }, + + /*font modes*/ + '\\text': { glyph: 0, arity: 1, flags: {} }, + '\\mathnormal': { glyph: 0, arity: 1, flags: {} }, + '\\mathrm': { glyph: 0, arity: 1, flags: {} }, + '\\mathit': { glyph: 0, arity: 1, flags: {} }, + '\\mathbf': { glyph: 0, arity: 1, flags: {} }, + '\\mathsf': { glyph: 0, arity: 1, flags: {} }, + '\\mathtt': { glyph: 0, arity: 1, flags: {} }, + '\\mathfrak': { glyph: 0, arity: 1, flags: {} }, + '\\mathcal': { glyph: 0, arity: 1, flags: {} }, + '\\mathbb': { glyph: 0, arity: 1, flags: {} }, + '\\mathscr': { glyph: 0, arity: 1, flags: {} }, + '\\rm': { glyph: 0, arity: 1, flags: {} }, + '\\it': { glyph: 0, arity: 1, flags: {} }, + '\\bf': { glyph: 0, arity: 1, flags: {} }, + '\\sf': { glyph: 0, arity: 1, flags: {} }, + '\\tt': { glyph: 0, arity: 1, flags: {} }, + '\\frak': { glyph: 0, arity: 1, flags: {} }, + '\\cal': { glyph: 0, arity: 1, flags: {} }, + '\\bb': { glyph: 0, arity: 1, flags: {} }, + '\\scr': { glyph: 0, arity: 1, flags: {} }, + + '\\quad': { glyph: 0, arity: 0, flags: {} }, + '\\,': { glyph: 0, arity: 0, flags: {} }, + '\\.': { glyph: 0, arity: 0, flags: {} }, + '\\;': { glyph: 0, arity: 0, flags: {} }, + '\\!': { glyph: 0, arity: 0, flags: {} }, + + /*greek letters*/ + '\\alpha': { glyph: 2127, flags: {} }, + '\\beta': { glyph: 2128, flags: {} }, + '\\gamma': { glyph: 2129, flags: {} }, + '\\delta': { glyph: 2130, flags: {} }, + '\\varepsilon': { glyph: 2131, flags: {} }, + '\\zeta': { glyph: 2132, flags: {} }, + '\\eta': { glyph: 2133, flags: {} }, + '\\vartheta': { glyph: 2134, flags: {} }, + '\\iota': { glyph: 2135, flags: {} }, + '\\kappa': { glyph: 2136, flags: {} }, + '\\lambda': { glyph: 2137, flags: {} }, + '\\mu': { glyph: 2138, flags: {} }, + '\\nu': { glyph: 2139, flags: {} }, + '\\xi': { glyph: 2140, flags: {} }, + '\\omicron': { glyph: 2141, flags: {} }, + '\\pi': { glyph: 2142, flags: {} }, + '\\rho': { glyph: 2143, flags: {} }, + '\\sigma': { glyph: 2144, flags: {} }, + '\\tau': { glyph: 2145, flags: {} }, + '\\upsilon': { glyph: 2146, flags: {} }, + '\\varphi': { glyph: 2147, flags: {} }, + '\\chi': { glyph: 2148, flags: {} }, + '\\psi': { glyph: 2149, flags: {} }, + '\\omega': { glyph: 2150, flags: {} }, + + '\\epsilon': { glyph: 2184, flags: {} }, + '\\theta': { glyph: 2185, flags: {} }, + '\\phi': { glyph: 2186, flags: {} }, + '\\varsigma': { glyph: 2187, flags: {} }, + + '\\Alpha': { glyph: 2027, flags: {} }, + '\\Beta': { glyph: 2028, flags: {} }, + '\\Gamma': { glyph: 2029, flags: {} }, + '\\Delta': { glyph: 2030, flags: {} }, + '\\Epsilon': { glyph: 2031, flags: {} }, + '\\Zeta': { glyph: 2032, flags: {} }, + '\\Eta': { glyph: 2033, flags: {} }, + '\\Theta': { glyph: 2034, flags: {} }, + '\\Iota': { glyph: 2035, flags: {} }, + '\\Kappa': { glyph: 2036, flags: {} }, + '\\Lambda': { glyph: 2037, flags: {} }, + '\\Mu': { glyph: 2038, flags: {} }, + '\\Nu': { glyph: 2039, flags: {} }, + '\\Xi': { glyph: 2040, flags: {} }, + '\\Omicron': { glyph: 2041, flags: {} }, + '\\Pi': { glyph: 2042, flags: {} }, + '\\Rho': { glyph: 2043, flags: {} }, + '\\Sigma': { glyph: 2044, flags: {} }, + '\\Tau': { glyph: 2045, flags: {} }, + '\\Upsilon': { glyph: 2046, flags: {} }, + '\\Phi': { glyph: 2047, flags: {} }, + '\\Chi': { glyph: 2048, flags: {} }, + '\\Psi': { glyph: 2049, flags: {} }, + '\\Omega': { glyph: 2050, flags: {} }, +} + +export { SYMB } + +export function asciiMap(x: string, mode = 'math'): number { + const c = x.charCodeAt(0) + if (65 <= c && c <= 90) { + const d = c - 65 + if (mode == 'text' || mode == 'rm') { + return d + 2001 + } else if (mode == 'tt') { + return d + 501 + } else if (mode == 'bf' || mode == 'bb') { + return d + 3001 + } else if (mode == 'sf') { + return d + 2501 + } else if (mode == 'frak') { + return d + 3301 + } else if (mode == 'scr' || mode == 'cal') { + return d + 2551 + } else { + return d + 2051 + } + } + if (97 <= c && c <= 122) { + const d = c - 97 + if (mode == 'text' || mode == 'rm') { + return d + 2101 + } else if (mode == 'tt') { + return d + 601 + } else if (mode == 'bf' || mode == 'bb') { + return d + 3101 + } else if (mode == 'sf') { + return d + 2601 + } else if (mode == 'frak') { + return d + 3401 + } else if (mode == 'scr' || mode == 'cal') { + return d + 2651 + } else { + return d + 2151 + } + } + if (48 <= c && c <= 57) { + const d = c - 48 + if (mode == 'it') { + return d + 2750 + } else if (mode == 'bf') { + return d + 3200 + } else if (mode == 'tt') { + return d + 700 + } else { + return d + 2200 + } + } + + return { + '.': 2210, + ',': 2211, + ':': 2212, + ';': 2213, + '!': 2214, + '?': 2215, + '\'': 2216, + '"': 2217, + '*': 2219, + '/': 2220, + '-': 2231, + '+': 2232, + '=': 2238, + '<': 2241, + '>': 2242, + '~': 2246, + '@': 2273, + '\\': 804, + }[x] +} diff --git a/src/editor/core/position/Position.ts b/src/editor/core/position/Position.ts index 83ab088..468a88d 100644 --- a/src/editor/core/position/Position.ts +++ b/src/editor/core/position/Position.ts @@ -116,7 +116,7 @@ export class Position { } } // 图片区域均为命中 - if (element.type === ElementType.IMAGE) { + if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) { return { index: curPositionIndex, isDirectHit: true, diff --git a/src/editor/dataset/enum/Element.ts b/src/editor/dataset/enum/Element.ts index e1e6c8b..f9294ad 100644 --- a/src/editor/dataset/enum/Element.ts +++ b/src/editor/dataset/enum/Element.ts @@ -8,5 +8,6 @@ export enum ElementType { SEPARATOR = 'separator', PAGE_BREAK = 'pageBreak', CONTROL = 'control', - CHECKBOX = 'checkbox' + CHECKBOX = 'checkbox', + LATEX = 'latex' } \ No newline at end of file diff --git a/src/editor/interface/Element.ts b/src/editor/interface/Element.ts index 81125df..0121b6e 100644 --- a/src/editor/interface/Element.ts +++ b/src/editor/interface/Element.ts @@ -65,6 +65,10 @@ export interface ICheckboxElement { checkbox?: ICheckbox; } +export interface ILaTexElement { + laTexSVG?: string; +} + export type IElement = IElementBasic & IElementStyle & ITable @@ -73,6 +77,7 @@ export type IElement = IElementBasic & ISeparator & IControlElement & ICheckboxElement + & ILaTexElement export interface IElementMetrics { width: number; diff --git a/src/mock.ts b/src/mock.ts index ea78682..2a595c7 100644 --- a/src/mock.ts +++ b/src/mock.ts @@ -268,6 +268,17 @@ elementList.push(...[{ value: '\n' }]) +// LaTex公式 +elementList.push(...[{ + value: '医学公式:' +}, +{ + value: `f(x) = {{{a_0}} \over 2} + \sum\limits_{n = 1}^\infty {({a_n}\cos {nx} + {b_n}\sin {nx})}`, + type: ElementType.LATEX +}, { + value: '\n' +}]) + // 模拟结尾文本 elementList.push(...[{ value: 'E',