UNPKG

prettier

Version:

Prettier is an opinionated code formatter

1,175 lines (1,136 loc) 62.2 kB
(function (factory) { function interopModuleDefault() { var module = factory(); return module.default || module; } if (typeof exports === "object" && typeof module === "object") { module.exports = interopModuleDefault(); } else if (typeof define === "function" && define.amd) { define(interopModuleDefault); } else { var root = typeof globalThis !== "undefined" ? globalThis : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : this || {}; root.doc = interopModuleDefault(); } })(function () { "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/document/public.js var public_exports = {}; __export(public_exports, { builders: () => builders, printer: () => printer, utils: () => utils }); // scripts/build/shims/shared.js var OPTIONAL_OBJECT = 1; var createMethodShim = (methodName, getImplementation) => (flags, object, ...arguments_) => { if (flags | OPTIONAL_OBJECT && (object === void 0 || object === null)) { return; } const implementation = getImplementation.call(object) ?? object[methodName]; return implementation.apply(object, arguments_); }; // scripts/build/shims/method-at.js function stringOrArrayAt(index) { return this[index < 0 ? this.length + index : index]; } var at = /* @__PURE__ */ createMethodShim("at", function() { if (Array.isArray(this) || typeof this === "string") { return stringOrArrayAt; } }); var method_at_default = at; // src/utilities/noop.js var noop = () => { }; var noop_default = noop; // src/document/builders/types.js var DOC_TYPE_STRING = ( /** @type {const} */ "string" ); var DOC_TYPE_ARRAY = ( /** @type {const} */ "array" ); var DOC_TYPE_CURSOR = ( /** @type {const} */ "cursor" ); var DOC_TYPE_INDENT = ( /** @type {const} */ "indent" ); var DOC_TYPE_ALIGN = ( /** @type {const} */ "align" ); var DOC_TYPE_TRIM = ( /** @type {const} */ "trim" ); var DOC_TYPE_GROUP = ( /** @type {const} */ "group" ); var DOC_TYPE_FILL = ( /** @type {const} */ "fill" ); var DOC_TYPE_IF_BREAK = ( /** @type {const} */ "if-break" ); var DOC_TYPE_INDENT_IF_BREAK = ( /** @type {const} */ "indent-if-break" ); var DOC_TYPE_LINE_SUFFIX = ( /** @type {const} */ "line-suffix" ); var DOC_TYPE_LINE_SUFFIX_BOUNDARY = ( /** @type {const} */ "line-suffix-boundary" ); var DOC_TYPE_LINE = ( /** @type {const} */ "line" ); var DOC_TYPE_LABEL = ( /** @type {const} */ "label" ); var DOC_TYPE_BREAK_PARENT = ( /** @type {const} */ "break-parent" ); var VALID_OBJECT_DOC_TYPES = /* @__PURE__ */ new Set([ DOC_TYPE_CURSOR, DOC_TYPE_INDENT, DOC_TYPE_ALIGN, DOC_TYPE_TRIM, DOC_TYPE_GROUP, DOC_TYPE_FILL, DOC_TYPE_IF_BREAK, DOC_TYPE_INDENT_IF_BREAK, DOC_TYPE_LINE_SUFFIX, DOC_TYPE_LINE_SUFFIX_BOUNDARY, DOC_TYPE_LINE, DOC_TYPE_LABEL, DOC_TYPE_BREAK_PARENT ]); // node_modules/trim-newlines/index.js function trimNewlinesEnd(string) { let end = string.length; while (end > 0 && (string[end - 1] === "\r" || string[end - 1] === "\n")) { end--; } return end < string.length ? string.slice(0, end) : string; } // src/utilities/get-or-insert.js function getOrInsertComputed(map, key, callback) { if (!map.has(key)) { const value = callback(key); map.set(key, value); } return map.get(key); } // src/document/utilities/get-doc-type.js function getDocType(doc) { if (typeof doc === "string") { return DOC_TYPE_STRING; } if (Array.isArray(doc)) { return DOC_TYPE_ARRAY; } if (!doc) { return; } const { type } = doc; if (VALID_OBJECT_DOC_TYPES.has(type)) { return type; } } var get_doc_type_default = getDocType; // src/document/utilities/invalid-doc-error.js var disjunctionListFormat = (list) => new Intl.ListFormat("en-US", { type: "disjunction" }).format(list); function getDocErrorMessage(doc) { const type = doc === null ? "null" : typeof doc; if (type !== "string" && type !== "object") { return `Unexpected doc '${type}', Expected it to be 'string' or 'object'.`; } if (get_doc_type_default(doc)) { throw new Error("doc is valid."); } const objectType = Object.prototype.toString.call(doc); if (objectType !== "[object Object]") { return `Unexpected doc '${objectType}'.`; } const EXPECTED_TYPE_VALUES = disjunctionListFormat( [...VALID_OBJECT_DOC_TYPES].map((type2) => `'${type2}'`) ); return `Unexpected doc.type '${doc.type}'. Expected it to be ${EXPECTED_TYPE_VALUES}.`; } var InvalidDocError = class extends Error { name = "InvalidDocError"; constructor(doc) { super(getDocErrorMessage(doc)); this.doc = doc; } }; var invalid_doc_error_default = InvalidDocError; // src/document/utilities/traverse-doc.js var traverseDocOnExitStackMarker = {}; function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) { const docsStack = [doc]; while (docsStack.length > 0) { const doc2 = docsStack.pop(); if (doc2 === traverseDocOnExitStackMarker) { onExit(docsStack.pop()); continue; } if (onExit) { docsStack.push(doc2, traverseDocOnExitStackMarker); } const docType = get_doc_type_default(doc2); if (!docType) { throw new invalid_doc_error_default(doc2); } if (onEnter?.(doc2) === false) { continue; } switch (docType) { case DOC_TYPE_ARRAY: case DOC_TYPE_FILL: { const parts = docType === DOC_TYPE_ARRAY ? doc2 : doc2.parts; for (let ic = parts.length, i = ic - 1; i >= 0; --i) { docsStack.push(parts[i]); } break; } case DOC_TYPE_IF_BREAK: docsStack.push(doc2.flatContents, doc2.breakContents); break; case DOC_TYPE_GROUP: if (shouldTraverseConditionalGroups && doc2.expandedStates) { for (let ic = doc2.expandedStates.length, i = ic - 1; i >= 0; --i) { docsStack.push(doc2.expandedStates[i]); } } else { docsStack.push(doc2.contents); } break; case DOC_TYPE_ALIGN: case DOC_TYPE_INDENT: case DOC_TYPE_INDENT_IF_BREAK: case DOC_TYPE_LABEL: case DOC_TYPE_LINE_SUFFIX: docsStack.push(doc2.contents); break; case DOC_TYPE_STRING: case DOC_TYPE_CURSOR: case DOC_TYPE_TRIM: case DOC_TYPE_LINE_SUFFIX_BOUNDARY: case DOC_TYPE_LINE: case DOC_TYPE_BREAK_PARENT: break; default: throw new invalid_doc_error_default(doc2); } } } var traverse_doc_default = traverseDoc; // src/document/utilities/index.js function mapDoc(doc, cb) { if (typeof doc === "string") { return cb(doc); } const mapped = /* @__PURE__ */ new Map(); return rec(doc); function rec(doc2) { return getOrInsertComputed(mapped, doc2, process2); } function process2(doc2) { switch (get_doc_type_default(doc2)) { case DOC_TYPE_ARRAY: return cb(doc2.map(rec)); case DOC_TYPE_FILL: return cb({ ...doc2, parts: doc2.parts.map(rec) }); case DOC_TYPE_IF_BREAK: return cb({ ...doc2, breakContents: rec(doc2.breakContents), flatContents: rec(doc2.flatContents) }); case DOC_TYPE_GROUP: { let { expandedStates, contents } = doc2; if (expandedStates) { expandedStates = expandedStates.map(rec); contents = expandedStates[0]; } else { contents = rec(contents); } return cb({ ...doc2, contents, expandedStates }); } case DOC_TYPE_ALIGN: case DOC_TYPE_INDENT: case DOC_TYPE_INDENT_IF_BREAK: case DOC_TYPE_LABEL: case DOC_TYPE_LINE_SUFFIX: return cb({ ...doc2, contents: rec(doc2.contents) }); case DOC_TYPE_STRING: case DOC_TYPE_CURSOR: case DOC_TYPE_TRIM: case DOC_TYPE_LINE_SUFFIX_BOUNDARY: case DOC_TYPE_LINE: case DOC_TYPE_BREAK_PARENT: return cb(doc2); default: throw new invalid_doc_error_default(doc2); } } } function findInDoc(doc, fn, defaultValue) { let result = defaultValue; let shouldSkipFurtherProcessing = false; function findInDocOnEnterFn(doc2) { if (shouldSkipFurtherProcessing) { return false; } const maybeResult = fn(doc2); if (maybeResult !== void 0) { shouldSkipFurtherProcessing = true; result = maybeResult; } } traverse_doc_default(doc, findInDocOnEnterFn); return result; } function willBreakFn(doc) { if (doc.type === DOC_TYPE_GROUP && doc.break) { return true; } if (doc.type === DOC_TYPE_LINE && doc.hard) { return true; } if (doc.type === DOC_TYPE_BREAK_PARENT) { return true; } } function willBreak(doc) { return findInDoc(doc, willBreakFn, false); } function breakParentGroup(groupStack) { if (groupStack.length > 0) { const parentGroup = method_at_default( /* OPTIONAL_OBJECT: false */ 0, groupStack, -1 ); if (!parentGroup.expandedStates && !parentGroup.break) { parentGroup.break = "propagated"; } } return null; } function propagateBreaks(doc) { const alreadyVisitedSet = /* @__PURE__ */ new Set(); const groupStack = []; function propagateBreaksOnEnterFn(doc2) { if (doc2.type === DOC_TYPE_BREAK_PARENT) { breakParentGroup(groupStack); } if (doc2.type === DOC_TYPE_GROUP) { groupStack.push(doc2); if (alreadyVisitedSet.has(doc2)) { return false; } alreadyVisitedSet.add(doc2); } } function propagateBreaksOnExitFn(doc2) { if (doc2.type === DOC_TYPE_GROUP) { const group2 = groupStack.pop(); if (group2.break) { breakParentGroup(groupStack); } } } traverse_doc_default( doc, propagateBreaksOnEnterFn, propagateBreaksOnExitFn, /* shouldTraverseConditionalGroups */ true ); } function removeLinesFn(doc) { if (doc.type === DOC_TYPE_LINE && !doc.hard) { return doc.soft ? "" : " "; } if (doc.type === DOC_TYPE_IF_BREAK) { return doc.flatContents; } return doc; } function removeLines(doc) { return mapDoc(doc, removeLinesFn); } function stripTrailingHardlineFromParts(parts) { parts = [...parts]; while (parts.length >= 2 && method_at_default( /* OPTIONAL_OBJECT: false */ 0, parts, -2 ).type === DOC_TYPE_LINE && method_at_default( /* OPTIONAL_OBJECT: false */ 0, parts, -1 ).type === DOC_TYPE_BREAK_PARENT) { parts.length -= 2; } if (parts.length > 0) { const lastPart = stripTrailingHardlineFromDoc(method_at_default( /* OPTIONAL_OBJECT: false */ 0, parts, -1 )); parts[parts.length - 1] = lastPart; } return parts; } function stripTrailingHardlineFromDoc(doc) { switch (get_doc_type_default(doc)) { case DOC_TYPE_INDENT: case DOC_TYPE_INDENT_IF_BREAK: case DOC_TYPE_GROUP: case DOC_TYPE_LINE_SUFFIX: case DOC_TYPE_LABEL: { const contents = stripTrailingHardlineFromDoc(doc.contents); return { ...doc, contents }; } case DOC_TYPE_IF_BREAK: return { ...doc, breakContents: stripTrailingHardlineFromDoc(doc.breakContents), flatContents: stripTrailingHardlineFromDoc(doc.flatContents) }; case DOC_TYPE_FILL: return { ...doc, parts: stripTrailingHardlineFromParts(doc.parts) }; case DOC_TYPE_ARRAY: return stripTrailingHardlineFromParts(doc); case DOC_TYPE_STRING: return trimNewlinesEnd(doc); case DOC_TYPE_ALIGN: case DOC_TYPE_CURSOR: case DOC_TYPE_TRIM: case DOC_TYPE_LINE_SUFFIX_BOUNDARY: case DOC_TYPE_LINE: case DOC_TYPE_BREAK_PARENT: break; default: throw new invalid_doc_error_default(doc); } return doc; } function stripTrailingHardline(doc) { return stripTrailingHardlineFromDoc(cleanDoc(doc)); } function cleanDocFn(doc) { switch (get_doc_type_default(doc)) { case DOC_TYPE_FILL: { const { parts } = doc; if (parts.every((part) => part === "")) { return ""; } if (parts.length === 1) { return parts[0]; } break; } case DOC_TYPE_GROUP: if (!doc.contents && !doc.id && !doc.break && !doc.expandedStates) { return ""; } if (doc.contents.type === DOC_TYPE_GROUP && doc.contents.id === doc.id && doc.contents.break === doc.break && doc.contents.expandedStates === doc.expandedStates) { return doc.contents; } break; case DOC_TYPE_ALIGN: case DOC_TYPE_INDENT: case DOC_TYPE_INDENT_IF_BREAK: case DOC_TYPE_LINE_SUFFIX: if (!doc.contents) { return ""; } break; case DOC_TYPE_IF_BREAK: if (!doc.flatContents && !doc.breakContents) { return ""; } break; case DOC_TYPE_ARRAY: { const parts = []; for (const part of doc) { if (!part) { continue; } const [currentPart, ...restParts] = Array.isArray(part) ? part : [part]; if (typeof currentPart === "string" && typeof method_at_default( /* OPTIONAL_OBJECT: false */ 0, parts, -1 ) === "string") { parts[parts.length - 1] += currentPart; } else { parts.push(currentPart); } parts.push(...restParts); } if (parts.length === 0) { return ""; } if (parts.length === 1) { return parts[0]; } return parts; } case DOC_TYPE_STRING: case DOC_TYPE_CURSOR: case DOC_TYPE_TRIM: case DOC_TYPE_LINE_SUFFIX_BOUNDARY: case DOC_TYPE_LINE: case DOC_TYPE_LABEL: case DOC_TYPE_BREAK_PARENT: break; default: throw new invalid_doc_error_default(doc); } return doc; } function cleanDoc(doc) { return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc)); } function replaceEndOfLine(doc, replacement = literalline) { return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join(replacement, currentDoc.split("\n")) : currentDoc); } function canBreakFn(doc) { if (doc.type === DOC_TYPE_LINE) { return true; } } function canBreak(doc) { return findInDoc(doc, canBreakFn, false); } // src/document/utilities/assert-doc.js var assertDoc = true ? noop_default : ( /** @param {Doc} doc */ function(doc) { traverse_doc_default(doc, (doc2) => { if (typeof doc2 === "string" || checked.has(doc2)) { return false; } checked.add(doc2); }); } ); var assertDocArray = true ? noop_default : ( /** @param {readonly Doc[]} docs @param {boolean} [optional = false] */ function(docs, optional = false) { if (optional && !docs) { return; } if (!Array.isArray(docs)) { throw new TypeError("Unexpected doc array."); } for (const doc of docs) { assertDoc(doc); } } ); var assertDocFillParts = true ? noop_default : ( /** @param {readonly Doc[]} parts */ function(parts) { assertDocArray(parts); if (parts.length > 1 && isEmptyDoc(method_at_default( /* OPTIONAL_OBJECT: false */ 0, parts, -1 ))) { parts = parts.slice(0, -1); } for (const [i, doc] of parts.entries()) { if (i % 2 === 1 && !isValidSeparator(doc)) { const type = get_doc_type_default(doc); throw new Error(`Unexpected non-line-break doc at ${i}. Doc type is ${type}.`); } } } ); var assertAlignType = true ? noop_default : function(alignType) { if (!(typeof alignType === "number" || typeof alignType === "string" || alignType?.type === "root")) { throw new TypeError(`Invalid alignType '${alignType}'.`); } }; // src/document/builders/indent.js function indent(contents) { assertDoc(contents); return { type: DOC_TYPE_INDENT, contents }; } // src/document/builders/align.js function align(alignType, contents) { assertAlignType(alignType); assertDoc(contents); return { type: DOC_TYPE_ALIGN, contents, n: alignType }; } function dedentToRoot(contents) { return align(Number.NEGATIVE_INFINITY, contents); } function markAsRoot(contents) { return align({ type: "root" }, contents); } function dedent(contents) { return align(-1, contents); } function addAlignmentToDoc(doc, size, tabWidth) { assertDoc(doc); let aligned = doc; if (size > 0) { for (let level = 0; level < Math.floor(size / tabWidth); ++level) { aligned = indent(aligned); } aligned = align(size % tabWidth, aligned); aligned = align(Number.NEGATIVE_INFINITY, aligned); } return aligned; } // src/document/builders/break-parent.js var breakParent = { type: DOC_TYPE_BREAK_PARENT }; // src/document/builders/cursor.js var cursor = { type: DOC_TYPE_CURSOR }; // src/document/builders/fill.js function fill(parts) { assertDocFillParts(parts); return { type: DOC_TYPE_FILL, parts }; } // src/document/builders/group.js function group(contents, options = {}) { assertDoc(contents); assertDocArray( options.expandedStates, /* optional */ true ); return { type: DOC_TYPE_GROUP, id: options.id, contents, break: Boolean(options.shouldBreak), expandedStates: options.expandedStates }; } function conditionalGroup(states, options) { return group(states[0], { ...options, expandedStates: states }); } // src/document/builders/if-break.js function ifBreak(breakContents, flatContents = "", options = {}) { assertDoc(breakContents); if (flatContents !== "") { assertDoc(flatContents); } return { type: DOC_TYPE_IF_BREAK, breakContents, flatContents, groupId: options.groupId }; } // src/document/builders/indent-if-break.js function indentIfBreak(contents, options) { assertDoc(contents); return { type: DOC_TYPE_INDENT_IF_BREAK, contents, groupId: options.groupId, negate: options.negate }; } // src/document/builders/join.js function join(separator, docs) { assertDoc(separator); assertDocArray(docs); const parts = []; for (let i = 0; i < docs.length; i++) { if (i !== 0) { parts.push(separator); } parts.push(docs[i]); } return parts; } // src/document/builders/label.js function label(label2, contents) { assertDoc(contents); return label2 ? { type: DOC_TYPE_LABEL, label: label2, contents } : contents; } // src/document/builders/line.js var line = { type: DOC_TYPE_LINE }; var softline = { type: DOC_TYPE_LINE, soft: true }; var hardlineWithoutBreakParent = { type: DOC_TYPE_LINE, hard: true }; var hardline = [hardlineWithoutBreakParent, breakParent]; var literallineWithoutBreakParent = { type: DOC_TYPE_LINE, hard: true, literal: true }; var literalline = [literallineWithoutBreakParent, breakParent]; // src/document/builders/line-suffix.js function lineSuffix(contents) { assertDoc(contents); return { type: DOC_TYPE_LINE_SUFFIX, contents }; } // src/document/builders/line-suffix-boundary.js var lineSuffixBoundary = { type: DOC_TYPE_LINE_SUFFIX_BOUNDARY }; // src/document/builders/trim.js var trim = { type: DOC_TYPE_TRIM }; // scripts/build/shims/method-replace-all.js var stringReplaceAll = String.prototype.replaceAll ?? function(pattern, replacement) { if (pattern.global) { return this.replace(pattern, replacement); } return this.split(pattern).join(replacement); }; var replaceAll = /* @__PURE__ */ createMethodShim("replaceAll", function() { if (typeof this === "string") { return stringReplaceAll; } }); var method_replace_all_default = replaceAll; // src/common/end-of-line.js var OPTION_CR = "cr"; var OPTION_CRLF = "crlf"; var CHARACTER_CR = "\r"; var CHARACTER_CRLF = "\r\n"; var CHARACTER_LF = "\n"; var DEFAULT_EOL = CHARACTER_LF; function convertEndOfLineOptionToCharacter(endOfLineOption) { return endOfLineOption === OPTION_CR ? CHARACTER_CR : endOfLineOption === OPTION_CRLF ? CHARACTER_CRLF : DEFAULT_EOL; } // node_modules/emoji-regex/index.mjs var emoji_regex_default = () => { return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g; }; // node_modules/get-east-asian-width/lookup-data.js var fullwidthMinimalCodePoint = 12288; var fullwidthMaximumCodePoint = 65510; var fullwidthRanges = [12288, 12288, 65281, 65376, 65504, 65510]; var wideMinimalCodePoint = 4352; var wideMaximumCodePoint = 262141; var wideRanges = [4352, 4447, 8986, 8987, 9001, 9002, 9193, 9196, 9200, 9200, 9203, 9203, 9725, 9726, 9748, 9749, 9776, 9783, 9800, 9811, 9855, 9855, 9866, 9871, 9875, 9875, 9889, 9889, 9898, 9899, 9917, 9918, 9924, 9925, 9934, 9934, 9940, 9940, 9962, 9962, 9970, 9971, 9973, 9973, 9978, 9978, 9981, 9981, 9989, 9989, 9994, 9995, 10024, 10024, 10060, 10060, 10062, 10062, 10067, 10069, 10071, 10071, 10133, 10135, 10160, 10160, 10175, 10175, 11035, 11036, 11088, 11088, 11093, 11093, 11904, 11929, 11931, 12019, 12032, 12245, 12272, 12287, 12289, 12350, 12353, 12438, 12441, 12543, 12549, 12591, 12593, 12686, 12688, 12773, 12783, 12830, 12832, 12871, 12880, 42124, 42128, 42182, 43360, 43388, 44032, 55203, 63744, 64255, 65040, 65049, 65072, 65106, 65108, 65126, 65128, 65131, 94176, 94180, 94192, 94198, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 119552, 119638, 119648, 119670, 126980, 126980, 127183, 127183, 127374, 127374, 127377, 127386, 127488, 127490, 127504, 127547, 127552, 127560, 127568, 127569, 127584, 127589, 127744, 127776, 127789, 127797, 127799, 127868, 127870, 127891, 127904, 127946, 127951, 127955, 127968, 127984, 127988, 127988, 127992, 128062, 128064, 128064, 128066, 128252, 128255, 128317, 128331, 128334, 128336, 128359, 128378, 128378, 128405, 128406, 128420, 128420, 128507, 128591, 128640, 128709, 128716, 128716, 128720, 128722, 128725, 128728, 128732, 128735, 128747, 128748, 128756, 128764, 128992, 129003, 129008, 129008, 129292, 129338, 129340, 129349, 129351, 129535, 129648, 129660, 129664, 129674, 129678, 129734, 129736, 129736, 129741, 129756, 129759, 129770, 129775, 129784, 131072, 196605, 196608, 262141]; // node_modules/get-east-asian-width/utilities.js var isInRange = (ranges, codePoint) => { let low = 0; let high = Math.floor(ranges.length / 2) - 1; while (low <= high) { const mid = Math.floor((low + high) / 2); const i = mid * 2; if (codePoint < ranges[i]) { high = mid - 1; } else if (codePoint > ranges[i + 1]) { low = mid + 1; } else { return true; } } return false; }; // node_modules/get-east-asian-width/lookup.js var commonCjkCodePoint = 19968; var [wideFastPathStart, wideFastPathEnd] = /* @__PURE__ */ findWideFastPathRange(wideRanges); function findWideFastPathRange(ranges) { let fastPathStart = ranges[0]; let fastPathEnd = ranges[1]; for (let index = 0; index < ranges.length; index += 2) { const start = ranges[index]; const end = ranges[index + 1]; if (commonCjkCodePoint >= start && commonCjkCodePoint <= end) { return [start, end]; } if (end - start > fastPathEnd - fastPathStart) { fastPathStart = start; fastPathEnd = end; } } return [fastPathStart, fastPathEnd]; } var isFullWidth = (codePoint) => { if (codePoint < fullwidthMinimalCodePoint || codePoint > fullwidthMaximumCodePoint) { return false; } return isInRange(fullwidthRanges, codePoint); }; var isWide = (codePoint) => { if (codePoint >= wideFastPathStart && codePoint <= wideFastPathEnd) { return true; } if (codePoint < wideMinimalCodePoint || codePoint > wideMaximumCodePoint) { return false; } return isInRange(wideRanges, codePoint); }; // node_modules/narrow-emojis/index.js var narrowEmojiRegexp = /^(?:[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u2764\u27A1\u2934\u2935\u2B05-\u2B07]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF3\uDFF5\uDFF7]|\uD83D[\uDC3F\uDC41\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])$/; var isNarrowEmojiCharacter = (character) => narrowEmojiRegexp.test(character); // src/utilities/get-string-width.js var notAsciiRegex = /[^\x20-\x7F]/; function getStringWidth(text) { if (!text) { return 0; } if (!notAsciiRegex.test(text)) { return text.length; } let width = 0; text = text.replace(emoji_regex_default(), (character) => { width += isNarrowEmojiCharacter(character) ? 1 : 2; return ""; }); for (const character of text) { const codePoint = character.codePointAt(0); if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) { continue; } if (codePoint >= 768 && codePoint <= 879) { continue; } if (codePoint >= 65024 && codePoint <= 65039) { continue; } width += isFullWidth(codePoint) || isWide(codePoint) ? 2 : 1; } return width; } var get_string_width_default = getStringWidth; // src/document/printer/indent.js var INDENT_COMMAND_TYPE_INDENT = 0; var INDENT_COMMAND_TYPE_DEDENT = 1; var INDENT_COMMAND_TYPE_WIDTH = 2; var INDENT_COMMAND_TYPE_STRING = 3; var INDENT_COMMAND_INDENT = { type: INDENT_COMMAND_TYPE_INDENT }; var INDENT_COMMAND_DEDENT = { type: INDENT_COMMAND_TYPE_DEDENT }; var ROOT_INDENT = { value: "", length: 0, queue: [], get root() { return ROOT_INDENT; } }; function generateIndent(indent2, command, options) { const queue = command.type === INDENT_COMMAND_TYPE_DEDENT ? indent2.queue.slice(0, -1) : [...indent2.queue, command]; let value = ""; let length = 0; let lastTabs = 0; let lastSpaces = 0; for (const command2 of queue) { switch (command2.type) { case INDENT_COMMAND_TYPE_INDENT: flush(); if (options.useTabs) { addTabs(1); } else { addSpaces(options.tabWidth); } break; case INDENT_COMMAND_TYPE_STRING: { const { string } = command2; flush(); value += string; length += string.length; break; } case INDENT_COMMAND_TYPE_WIDTH: { const { width } = command2; lastTabs += 1; lastSpaces += width; break; } default: throw new Error(`Unexpected indent comment '${command2.type}'.`); } } flushSpaces(); return { ...indent2, value, length, queue }; function addTabs(count) { value += " ".repeat(count); length += options.tabWidth * count; } function addSpaces(count) { value += " ".repeat(count); length += count; } function flush() { if (options.useTabs) { flushTabs(); } else { flushSpaces(); } } function flushTabs() { if (lastTabs > 0) { addTabs(lastTabs); } resetLast(); } function flushSpaces() { if (lastSpaces > 0) { addSpaces(lastSpaces); } resetLast(); } function resetLast() { lastTabs = 0; lastSpaces = 0; } } function makeAlign(indent2, indentOptions, options) { if (!indentOptions) { return indent2; } if (indentOptions.type === "root") { return { ...indent2, root: indent2 }; } if (indentOptions === Number.NEGATIVE_INFINITY) { return indent2.root; } let command; if (typeof indentOptions === "number") { if (indentOptions < 0) { command = INDENT_COMMAND_DEDENT; } else { command = { type: INDENT_COMMAND_TYPE_WIDTH, width: indentOptions }; } } else { command = { type: INDENT_COMMAND_TYPE_STRING, string: indentOptions }; } return generateIndent(indent2, command, options); } function makeIndent(indent2, options) { return generateIndent(indent2, INDENT_COMMAND_INDENT, options); } // src/document/printer/trim-indentation.js function getTrailingIndentionLength(text) { let length = 0; for (let index = text.length - 1; index >= 0; index--) { const character = text[index]; if (character === " " || character === " ") { length++; } else { break; } } return length; } function trimIndentation(text) { const length = getTrailingIndentionLength(text); const trimmed = length === 0 ? text : text.slice(0, text.length - length); return { text: trimmed, count: length }; } // src/document/printer/print-result.js var printResult = class { /** @type {string[]} */ #settledTexts = []; #unsettledText = ""; #settledTextLength = 0; /** @type {number[]} */ #settledPositions = []; /** @type {number[]} */ #unsettledPositions = []; #settle() { const text = this.#unsettledText; if (text !== "") { this.#settledTexts.push(text); this.#settledTextLength += text.length; this.#unsettledText = ""; } for (const position of this.#unsettledPositions) { this.#settledPositions.push(Math.min(position, this.#settledTextLength)); } this.#unsettledPositions.length = 0; } markPosition() { if (this.#settledPositions.length + this.#unsettledPositions.length >= 2) { throw new Error("There are too many 'cursor' in doc."); } this.#unsettledPositions.push( this.#settledTextLength + this.#unsettledText.length ); } /** @param {string} text */ write(text) { this.#unsettledText += text; } trim() { const { text: trimmed, count } = trimIndentation(this.#unsettledText); this.#unsettledText = trimmed; this.#settle(); return count; } finish() { this.#settle(); return { text: this.#settledTexts.join(""), positions: this.#settledPositions }; } }; var print_result_default = printResult; // src/document/printer/printer.js var MODE_BREAK = /* @__PURE__ */ Symbol("MODE_BREAK"); var MODE_FLAT = /* @__PURE__ */ Symbol("MODE_FLAT"); var DOC_FILL_PRINTED_LENGTH = /* @__PURE__ */ Symbol("DOC_FILL_PRINTED_LENGTH"); function fits(next, restCommands, remainingWidth, hasLineSuffix, groupModeMap, mustBeFlat) { if (remainingWidth === Number.POSITIVE_INFINITY) { return true; } let restCommandsIndex = restCommands.length; let hasPendingSpace = false; const commands = [next]; let output = ""; while (remainingWidth >= 0) { if (commands.length === 0) { if (restCommandsIndex === 0) { return true; } commands.push(restCommands[--restCommandsIndex]); continue; } const { mode, doc } = commands.pop(); const docType = get_doc_type_default(doc); switch (docType) { case DOC_TYPE_STRING: if (doc) { if (hasPendingSpace) { output += " "; remainingWidth -= 1; hasPendingSpace = false; } output += doc; remainingWidth -= get_string_width_default(doc); } break; case DOC_TYPE_ARRAY: case DOC_TYPE_FILL: { const parts = docType === DOC_TYPE_ARRAY ? doc : doc.parts; const end = doc[DOC_FILL_PRINTED_LENGTH] ?? 0; for (let index = parts.length - 1; index >= end; index--) { commands.push({ mode, doc: parts[index] }); } break; } case DOC_TYPE_INDENT: case DOC_TYPE_ALIGN: case DOC_TYPE_INDENT_IF_BREAK: case DOC_TYPE_LABEL: commands.push({ mode, doc: doc.contents }); break; case DOC_TYPE_TRIM: { const { text, count } = trimIndentation(output); output = text; remainingWidth += count; break; } case DOC_TYPE_GROUP: { if (mustBeFlat && doc.break) { return false; } const groupMode = doc.break ? MODE_BREAK : mode; const contents = doc.expandedStates && groupMode === MODE_BREAK ? method_at_default( /* OPTIONAL_OBJECT: false */ 0, doc.expandedStates, -1 ) : doc.contents; commands.push({ mode: groupMode, doc: contents }); break; } case DOC_TYPE_IF_BREAK: { const groupMode = doc.groupId ? groupModeMap[doc.groupId] || MODE_FLAT : mode; const