diff --git a/src/dev-center/index.html b/src/dev-center/index.html index 5c0a8219b1..9ff66be3ff 100644 --- a/src/dev-center/index.html +++ b/src/dev-center/index.html @@ -19,6 +19,9 @@ + + + `; const loading_spinner = ``; const drop_area_placeholder = `

Drop your app folder and files here to deploy.

HTML, JS, CSS, ...

`; const index_missing_error = `Please upload an 'index.html' file or if you're uploading a directory, make sure it contains an 'index.html' file at its root.`; -const lock_svg = ''; +const lock_svg = + ''; + // authUsername (async () => { - let user = await puter.auth.getUser(); + let user = await puter.auth.getUser(); - if (user?.username) { - authUsername = user.username; - } -})() + if (user?.username) { + authUsername = user.username; + } +})(); // source_path -if (URLParams.has('source_path')) { - source_path = URLParams.get('source_path'); +if (URLParams.has("source_path")) { + source_path = URLParams.get("source_path"); } else { - source_path = null; + source_path = null; } // domain and APIOrigin -if (URLParams.has('puter.domain')) { - domain = URLParams.get('puter.domain') +if (URLParams.has("puter.domain")) { + domain = URLParams.get("puter.domain"); } // static hosting domain -let static_hosting_domain = 'puter.site'; -if(domain === 'puter.localhost'){ - static_hosting_domain = 'site.puter.localhost'; +let static_hosting_domain = "puter.site"; +if (domain === "puter.localhost") { + static_hosting_domain = "site.puter.localhost"; } // add port to static_hosting_domain if provided -if (URLParams.has('puter.port') && URLParams.get('puter.port')) { - static_hosting_domain = static_hosting_domain + `:` + html_encode(URLParams.get('puter.port')); +if (URLParams.has("puter.port") && URLParams.get("puter.port")) { + static_hosting_domain = + static_hosting_domain + `:` + html_encode(URLParams.get("puter.port")); } // protocol -let protocol = 'https'; -if (URLParams.has('puter.protocol') && URLParams.get('puter.protocol') === 'http') - protocol = 'http'; +let protocol = "https"; +if ( + URLParams.has("puter.protocol") && + URLParams.get("puter.protocol") === "http" +) + protocol = "http"; // port -let port = ''; -if (URLParams.has('puter.port') && URLParams.get('puter.port')) { - port = html_encode(URLParams.get('puter.port')); +let port = ""; +if (URLParams.has("puter.port") && URLParams.get("puter.port")) { + port = html_encode(URLParams.get("puter.port")); } -$(document).ready(function () { - // initialize assets directory - initializeAssetsDirectory(); - - $('#loading').show(); - - setTimeout(async function () { - puter.ui.onLaunchedWithItems(async function (items) { - source_path = items[0].path; - // if source_path is provided, this means that the user is creating a new app/updating an existing app - // by deploying an existing Puter folder. So we create the app and deploy it. - if (source_path) { - // todo if there are no apps, go straight to creating a new app - $('.insta-deploy-modal').get(0).showModal(); - // set item name - $('.insta-deploy-item-name').html(html_encode(items[0].name)); - } - }) +$(document).ready(function() { + // initialize assets directory + initializeAssetsDirectory(); + + $("#loading").show(); + + setTimeout(async function() { + puter.ui.onLaunchedWithItems(async function(items) { + source_path = items[0].path; + // if source_path is provided, this means that the user is creating a new app/updating an existing app + // by deploying an existing Puter folder. So we create the app and deploy it. + if (source_path) { + // todo if there are no apps, go straight to creating a new app + $(".insta-deploy-modal").get(0).showModal(); + // set item name + $(".insta-deploy-item-name").html(html_encode(items[0].name)); + } + }); - // Get dev profile. This is only for puter.com for now as we don't have dev profiles in self-hosted Puter - if(domain === 'puter.com'){ - puter.apps.getDeveloperProfile(async function (dev_profile) { - developer = dev_profile; - if (dev_profile.approved_for_incentive_program && !dev_profile.joined_incentive_program) { - $('#join-incentive-program').show(); - } + // Get dev profile. This is only for puter.com for now as we don't have dev profiles in self-hosted Puter + if (domain === "puter.com") { + puter.apps.getDeveloperProfile(async function(dev_profile) { + developer = dev_profile; + if ( + dev_profile.approved_for_incentive_program && + !dev_profile.joined_incentive_program + ) { + $("#join-incentive-program").show(); + } - // show earn money c2a only if dev is not approved for incentive program or has already joined - if (!dev_profile.approved_for_incentive_program || dev_profile.joined_incentive_program) { - puter.kv.get('earn-money-c2a-closed').then((value) => { - if (value?.result || value === true || value === "true") - return; + // show earn money c2a only if dev is not approved for incentive program or has already joined + if ( + !dev_profile.approved_for_incentive_program || + dev_profile.joined_incentive_program + ) { + puter.kv.get("earn-money-c2a-closed").then((value) => { + if (value?.result || value === true || value === "true") return; - $('#earn-money').get(0).showModal(); - }); - } + $("#earn-money").get(0).showModal(); + }); + } - // show payout method tab if dev has joined incentive program - if (dev_profile.joined_incentive_program) { - $('.tab-btn[data-tab="payout-method"]').show(); - $('#payout-method-email').html(dev_profile.paypal); - } - }) + // show payout method tab if dev has joined incentive program + if (dev_profile.joined_incentive_program) { + $('.tab-btn[data-tab="payout-method"]').show(); + $("#payout-method-email").html(dev_profile.paypal); } - // Get apps - puter.apps.list().then((resp) => { - apps = resp; + }); + } + // Get apps + puter.apps.list().then((resp) => { + apps = resp; - // hide loading - $('#loading').hide(); + // hide loading + $("#loading").hide(); - // set apps - if (apps.length > 0) { - if (activeTab === 'apps') { - $('#no-apps-notice').hide(); - $('#app-list').show(); - } - $('.app-card').remove(); - apps.forEach(app => { - $('#app-list-table > tbody').append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else { - $('#no-apps-notice').show(); - } - }) - }, 1000); + // set apps + if (apps.length > 0) { + if (activeTab === "apps") { + $("#no-apps-notice").hide(); + $("#app-list").show(); + } + $(".app-card").remove(); + apps.forEach((app) => { + $("#app-list-table > tbody").append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else { + $("#no-apps-notice").show(); + } + }); + }, 1000); }); /** - * Refreshes the list of apps in the UI. - * - * @param {boolean} [show_loading=false] - Whether to show a loading indicator while refreshing. - * - */ +* Refreshes the list of apps in the UI. +* +* @param {boolean} [show_loading=false] - Whether to show a loading indicator while refreshing. +* +*/ function refresh_app_list(show_loading = false) { - if (show_loading) - $('#loading').show(); - // get apps - setTimeout(function () { - // uncheck the select all checkbox - $('.select-all-apps').prop('checked', false); - - puter.apps.list().then((apps_res) => { - $('#loading').hide(); - apps = apps_res; - if (apps.length > 0) { - if (activeTab === 'apps') { - $('#no-apps-notice').hide(); - $('#app-list').show(); - } - $('.app-card').remove(); - apps.forEach(app => { - $('#app-list-table > tbody').append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else { - $('#no-apps-notice').show(); - $('#app-list').hide() - } - }) - }, show_loading ? 1000 : 0); + if (show_loading) $("#loading").show(); + // get apps + setTimeout( + function() { + // uncheck the select all checkbox + $(".select-all-apps").prop("checked", false); + + puter.apps.list().then((apps_res) => { + $("#loading").hide(); + apps = apps_res; + if (apps.length > 0) { + if (activeTab === "apps") { + $("#no-apps-notice").hide(); + $("#app-list").show(); + } + $(".app-card").remove(); + apps.forEach((app) => { + $("#app-list-table > tbody").append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else { + $("#no-apps-notice").show(); + $("#app-list").hide(); + } + }); + }, + show_loading ? 1000 : 0 + ); } -$(document).on('click', '.tab-btn', function (e) { - $('section:not(.sidebar)').hide(); - $('.tab-btn').removeClass('active'); - $(this).addClass('active'); - $('section[data-tab="' + $(this).attr('data-tab') + '"]').show(); - - // --------------------------------------------------------------- - // Apps tab - // --------------------------------------------------------------- - if ($(this).attr('data-tab') === 'apps') { - refresh_app_list(); - activeTab = 'apps'; - } - // --------------------------------------------------------------- - // Payout Method tab - // --------------------------------------------------------------- - else if ($(this).attr('data-tab') === 'payout-method') { - activeTab = 'payout-method'; - $('#loading').show(); - setTimeout(function () { - puter.apps.getDeveloperProfile(function (dev_profile) { - // show payout method tab if dev has joined incentive program - if (dev_profile.joined_incentive_program) { - $('#payout-method-email').html(dev_profile.paypal); - } - $('#loading').hide(); - if (activeTab === 'payout-method') - $('#tab-payout-method').show(); - }) - }, 1000); - } -}) - -$(document).on('click', '.create-an-app-btn', async function (e) { - let title = await puter.ui.prompt('Please enter a title for your app:', 'My Awesome App'); +$(document).on("click", ".tab-btn", function(e) { + $("section:not(.sidebar)").hide(); + $(".tab-btn").removeClass("active"); + $(this).addClass("active"); + $('section[data-tab="' + $(this).attr("data-tab") + '"]').show(); + + // --------------------------------------------------------------- + // Apps tab + // --------------------------------------------------------------- + if ($(this).attr("data-tab") === "apps") { + refresh_app_list(); + activeTab = "apps"; + } + // --------------------------------------------------------------- + // Payout Method tab + // --------------------------------------------------------------- + else if ($(this).attr("data-tab") === "payout-method") { + activeTab = "payout-method"; + $("#loading").show(); + setTimeout(function() { + puter.apps.getDeveloperProfile(function(dev_profile) { + // show payout method tab if dev has joined incentive program + if (dev_profile.joined_incentive_program) { + $("#payout-method-email").html(dev_profile.paypal); + } + $("#loading").hide(); + if (activeTab === "payout-method") $("#tab-payout-method").show(); + }); + }, 1000); + } +}); - if (title.length > 60) { - puter.ui.alert(`Title cannot be longer than 60.`, [ - { - label: 'Ok', - }, - ]); - // todo go back to create an app prompt and prefill the title input with the title the user entered - return; - } - else if (title) { - create_app(title); - } -}) +$(document).on("click", ".create-an-app-btn", async function(e) { + let title = await puter.ui.prompt( + "Please enter a title for your app:", + "My Awesome App" + ); + + if (title.length > 60) { + puter.ui.alert(`Title cannot be longer than 60.`, [ + { + label: "Ok", + }, + ]); + // todo go back to create an app prompt and prefill the title input with the title the user entered + return; + } else if (title) { + create_app(title); + } +}); async function create_app(title, source_path = null, items = null) { - // name - let name = slugify(title, { - lower: true, - strict: true, - }); - - // icon - let icon = await getBase64ImageFromUrl('./img/app.svg'); - - // open the 'Creting new app...' modal - let start_ts = Date.now(); - $('.new-app-modal').get(0).showModal(); - - //---------------------------------------------------- - // Create app - //---------------------------------------------------- - puter.apps.create({ - title: title, - name: name, - indexURL: 'https://dev-center.puter.com/coming-soon.html', - icon: icon, - description: ' ', - maximizeOnStart: false, - background: false, - dedupeName: true, - metadata: { - window_resizable: true, - credentialless: true, - }, - + // name + let name = slugify(title, { + lower: true, + strict: true, + }); + + // icon + let icon = await getBase64ImageFromUrl("./img/app.svg"); + + // open the 'Creting new app...' modal + let start_ts = Date.now(); + $(".new-app-modal").get(0).showModal(); + + //---------------------------------------------------- + // Create app + //---------------------------------------------------- + puter.apps + .create({ + title: title, + name: name, + indexURL: "https://dev-center.puter.com/coming-soon.html", + icon: icon, + description: " ", + maximizeOnStart: false, + background: false, + dedupeName: true, + metadata: { + window_resizable: true, + credentialless: true, + }, + }) + .then(async (app) => { + let app_dir; + // ---------------------------------------------------- + // Create app directory in AppData + // ---------------------------------------------------- + app_dir = await puter.fs.mkdir( + `/${authUsername}/AppData/${dev_center_uid}/${app.uid}`, + { overwrite: true, recursive: true, rename: false } + ); + // ---------------------------------------------------- + // Create a router for the app with a fresh hostname + // ---------------------------------------------------- + let subdomain = name + "-" + Math.random().toString(36).substring(2); + await puter.hosting.create(subdomain, app_dir.path); + + // ---------------------------------------------------- + // Update the app with the new hostname + // ---------------------------------------------------- + puter.apps + .update(app.name, { + title: title, + indexURL: source_path + ? protocol + `://${subdomain}.` + static_hosting_domain + : "https://dev-center.puter.com/coming-soon.html", + icon: icon, + description: " ", + maximizeOnStart: false, + background: false, }) .then(async (app) => { - let app_dir; - // ---------------------------------------------------- - // Create app directory in AppData - // ---------------------------------------------------- - app_dir = await puter.fs.mkdir( - `/${authUsername}/AppData/${dev_center_uid}/${app.uid}`, - { overwrite: true, recursive: true, rename: false } - ); - // ---------------------------------------------------- - // Create a router for the app with a fresh hostname - // ---------------------------------------------------- - let subdomain = name + '-' + Math.random().toString(36).substring(2) - await puter.hosting.create(subdomain, app_dir.path); - - // ---------------------------------------------------- - // Update the app with the new hostname - // ---------------------------------------------------- - puter.apps.update(app.name, { - title: title, - indexURL: source_path ? protocol + `://${subdomain}.` + static_hosting_domain : 'https://dev-center.puter.com/coming-soon.html', - icon: icon, - description: ' ', - maximizeOnStart: false, - background: false, - }).then(async (app) => { - // refresh app list - puter.apps.list().then(async (resp) => { - apps = resp; - // Close the 'Creting new app...' modal - // but make sure it was shown for at least 2 seconds - setTimeout(() => { - // open edit app section - edit_app_section(app.name); - // set drop area if source_path was provided or items were dropped - if (source_path || items) { - $('.drop-area').removeClass('drop-area-hover'); - $('.drop-area').addClass('drop-area-ready-to-deploy'); - } - $('.new-app-modal').get(0).close(); - // deploy app if source_path was provided - if (source_path) { - deploy(app, source_path); - } else if (items) { - deploy(app, items); - } - }, (Date.now() - start_ts) > 2000 ? 1 : 2000 - (Date.now() - start_ts)); - }) - }).catch(async (err) => { - console.log(err); - }) - // ---------------------------------------------------- - // Create a "shortcut" on the desktop - // ---------------------------------------------------- - puter.fs.upload(new File([], app.title), - `/${authUsername}/Desktop`, - { - name: app.title, - dedupeName: true, - overwrite: false, - appUID: app.uid, + // refresh app list + puter.apps.list().then(async (resp) => { + apps = resp; + // Close the 'Creting new app...' modal + // but make sure it was shown for at least 2 seconds + setTimeout( + () => { + // open edit app section + edit_app_section(app.name); + // set drop area if source_path was provided or items were dropped + if (source_path || items) { + $(".drop-area").removeClass("drop-area-hover"); + $(".drop-area").addClass("drop-area-ready-to-deploy"); } - ) - }).catch(async (err) => { - $('#create-app-error').show(); - $('#create-app-error').html(err.message); - // scroll to top so that user sees error message - document.body.scrollTop = document.documentElement.scrollTop = 0; + $(".new-app-modal").get(0).close(); + // deploy app if source_path was provided + if (source_path) { + deploy(app, source_path); + } else if (items) { + deploy(app, items); + } + }, + Date.now() - start_ts > 2000 ? 1 : 2000 - (Date.now() - start_ts) + ); + }); }) + .catch(async (err) => { + console.log(err); + }); + // ---------------------------------------------------- + // Create a "shortcut" on the desktop + // ---------------------------------------------------- + puter.fs.upload(new File([], app.title), `/${authUsername}/Desktop`, { + name: app.title, + dedupeName: true, + overwrite: false, + appUID: app.uid, + }); + }) + .catch(async (err) => { + $("#create-app-error").show(); + $("#create-app-error").html(err.message); + // scroll to top so that user sees error message + document.body.scrollTop = document.documentElement.scrollTop = 0; + }); } +$(document).on("click", ".deploy-btn", function(e) { + deploy(currently_editing_app, dropped_items); +}); -$(document).on('click', '.deploy-btn', function (e) { - deploy(currently_editing_app, dropped_items); -}) - -$(document).on('click', '.edit-app, .got-to-edit-app', function (e) { - const cur_app_name = $(this).attr('data-app-name') - edit_app_section(cur_app_name); -}) +$(document).on("click", ".edit-app, .got-to-edit-app", function(e) { + const cur_app_name = $(this).attr("data-app-name"); + edit_app_section(cur_app_name); +}); -$(document).on('click', '.delete-app', async function (e) { - let app_uid = $(this).attr('data-app-uid'); - let app_title = $(this).attr('data-app-title'); - let app_name = $(this).attr('data-app-name'); +$(document).on("click", ".delete-app", async function(e) { + let app_uid = $(this).attr("data-app-uid"); + let app_title = $(this).attr("data-app-title"); + let app_name = $(this).attr("data-app-name"); - // get app - const app_data = await puter.apps.get(app_name); + // get app + const app_data = await puter.apps.get(app_name); - if(app_data.metadata?.locked){ - puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ - { - label: 'Ok', - }, - ], { - type: 'warning', - }); - return; - } - - // confirm delete - const alert_resp = await puter.ui.alert(`Are you sure you want to premanently delete ${html_encode(app_title)}?`, - [ - { - label: 'Yes, delete permanently', - value: 'delete', - type: 'danger', - }, - { - label: 'Cancel' - }, - ] + if (app_data.metadata?.locked) { + puter.ui.alert( + `${app_data.title} is locked and cannot be deleted.`, + [ + { + label: "Ok", + }, + ], + { + type: "warning", + } ); + return; + } + + // confirm delete + const alert_resp = await puter.ui.alert( + `Are you sure you want to premanently delete ${html_encode(app_title)}?`, + [ + { + label: "Yes, delete permanently", + value: "delete", + type: "danger", + }, + { + label: "Cancel", + }, + ] + ); + + if (alert_resp === "delete") { + let init_ts = Date.now(); + $(".deleting-app-modal")?.get(0)?.showModal(); + puter.apps + .delete(app_name) + .then(async (app) => { + setTimeout( + () => { + $(".deleting-app-modal")?.get(0)?.close(); + $(`.app-card[data-uid="${app_uid}"]`).fadeOut( + 200, + function name(params) { + $(this).remove(); + if ($(`.app-card`).length === 0) { + $("section:not(.sidebar)").hide(); + $("#no-apps-notice").show(); + } else { + $("section:not(.sidebar)").hide(); + $("#app-list").show(); + } + count_apps(); + } + ); + }, + // make sure the modal was shown for at least 2 seconds + Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) + ); - if (alert_resp === 'delete') { - let init_ts = Date.now(); - $('.deleting-app-modal')?.get(0)?.showModal(); - puter.apps.delete(app_name).then(async (app) => { - setTimeout(() => { - $('.deleting-app-modal')?.get(0)?.close(); - $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { - $(this).remove(); - if ($(`.app-card`).length === 0) { - $('section:not(.sidebar)').hide(); - $('#no-apps-notice').show(); - } else { - $('section:not(.sidebar)').hide(); - $('#app-list').show(); - } - count_apps(); - }); - }, - // make sure the modal was shown for at least 2 seconds - (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); - - // get app directory - puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }).then(async (stat) => { - // delete subdomain associated with the app dir - puter.hosting.delete(stat.subdomains[0].subdomain) - // delete app directory - puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ) - }) - }).catch(async (err) => { - setTimeout(() => { - - $('.deleting-app-modal')?.get(0)?.close(); - puter.ui.alert(err?.message, [ - { - label: 'Ok', - }, - ]); - }, - // make sure the modal was shown for at least 2 seconds - (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); - }) - } -}) + // get app directory + puter.fs + .stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }) + .then(async (stat) => { + // delete subdomain associated with the app dir + puter.hosting.delete(stat.subdomains[0].subdomain); + // delete app directory + puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ); + }); + }) + .catch(async (err) => { + setTimeout( + () => { + $(".deleting-app-modal")?.get(0)?.close(); + puter.ui.alert(err?.message, [ + { + label: "Ok", + }, + ]); + }, + // make sure the modal was shown for at least 2 seconds + Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) + ); + }); + } +}); // generate app link function applink(app) { - return protocol + `://${domain}${ port ? ':' + port : '' }/app/${app.name}`; + return protocol + `://${domain}${port ? ":" + port : ""}/app/${app.name}`; } /** - * Generates the HTML for the app editing section. - * - * @param {Object} app - The app object containing details of the app to be edited. - * * - * @returns {string} HTML string for the app editing section. - * - * @description - * This function creates the HTML for the app editing interface, including: - * - App icon and title display - * - Options to open, add to desktop, or delete the app - * - Tabs for deployment and settings - * - Form fields for editing various app properties - * - Display of app statistics - * - * The generated HTML includes interactive elements and placeholders for - * dynamic content to be filled or updated by other functions. - * - * @example - * const appEditHTML = generate_edit_app_section(myAppObject); - * $('#edit-app').html(appEditHTML); - */ +* Generates the HTML for the app editing section. +* +* @param {Object} app - The app object containing details of the app to be edited. +* * +* @returns {string} HTML string for the app editing section. +* +* @description +* This function creates the HTML for the app editing interface, including: +* - App icon and title display +* - Options to open, add to desktop, or delete the app +* - Tabs for deployment and settings +* - Form fields for editing various app properties +* - Display of app statistics +* +* The generated HTML includes interactive elements and placeholders for +* dynamic content to be filled or updated by other functions. +* +* @example +* const appEditHTML = generate_edit_app_section(myAppObject); +* $('#edit-app').html(appEditHTML); +*/ function generate_edit_app_section(app) { if(app.result) @@ -555,59 +591,60 @@ function generate_edit_app_section(app) { -

A comma-separated list of file type specifiers. For example if you include .txt, your apps could be opened when a user clicks on a TXT file.

- +

A list of file type specifiers. For example if you include .txt your apps could be opened when a user clicks on a TXT file.

+ +

Window

- +
- +
- +
- + - +
- + - +
- +
- +

Misc

- +

When locked, the app cannot be deleted. This is useful to prevent accidental deletion of important apps.

Advanced

- +

credentialless attribute for the iframe tag.

@@ -617,8 +654,8 @@ function generate_edit_app_section(app) { - ` - return h; + `; + return h; } /* This function keeps track of the original values of the app before it is edited*/ @@ -761,6 +798,30 @@ async function edit_app_section(cur_app_name) { toggleSaveButton(); // Ensure Save button is initially disabled toggleResetButton(); // Ensure Reset button is initially disabled $('#edit-app').show(); + + const filetype_association_input = document.querySelector('textarea[id=edit-app-filetype-associations]'); + tagify = new Tagify(filetype_association_input, { + pattern: /\.(?:[a-z0-9]+)|(?:[a-z]+\/[a-z0-9.-]+)/, // pattern for filetype file like .pdf or MIME type like text/plain + delimiters: null, + whitelist: [ + // Document file types + ".doc", ".docx", ".pdf", ".txt", ".odt", ".rtf", ".tex", + // Spreadsheet file types + ".xls", ".xlsx", ".csv", ".ods", + // Image file types + ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg", ".webp", + // Video file types + ".mp4", ".avi", ".mov", ".wmv", ".mkv", ".flv", ".webm", + // Audio file types + ".mp3", ".wav", ".aac", ".flac", ".ogg", ".m4a", + // Code file types + ".js", ".ts", ".html", ".css", ".json", ".xml", ".php", ".py", ".java", ".cpp", + // Archive file types + ".zip", ".rar", ".7z", ".tar", ".gz", + // Other + ".exe", ".dll", ".iso" + ], + }) // -------------------------------------------------------- // Dragster @@ -897,259 +958,404 @@ async function edit_app_section(cur_app_name) { dropped_items = []; } - return false; + // enable deploy button + $(".deploy-btn").removeClass("disabled"); + } else { + puter.ui.alert( + `You need to have an index.html file in your deployment.`, + [ + { + label: "Ok", + }, + ] + ); + $(".drop-area").removeClass("drop-area-ready-to-deploy"); + $(".deploy-btn").addClass("disabled"); + dropped_items = []; + } + return; + } + // ---------------------------------------------------- + // Multiple Puter files dropped + // ---------------------------------------------------- + else if (items.length > 1) { + let hasIndexHtml = false; + for (let item of items) { + if (item.name.toLowerCase() === "index.html") { + hasIndexHtml = true; + break; } + } - //----------------------------------------------------------------------------- - // Local items dropped - //----------------------------------------------------------------------------- - if (!e.dataTransfer || !e.dataTransfer.items || e.dataTransfer.items.length === 0) - return; + if (hasIndexHtml) { + dropped_items = items; + $(".drop-area").removeClass("drop-area-hover"); + $(".drop-area").addClass("drop-area-ready-to-deploy"); + drop_area_content = `

${items.length} items

Ready to deploy 🚀

Cancel

`; + $(".drop-area").html(drop_area_content); - // get dropped items - dropped_items = await puter.ui.getEntriesFromDataTransferItems(e.dataTransfer.items); - - // generate a flat array of full paths from the dropped items - let paths = []; - for (let item of dropped_items) { - paths.push('/' + (item.fullPath ?? item.filepath)); - } - - // generate a directory tree from the paths - let tree = generateDirTree(paths); - - dropped_items = setRootDirTree(tree, dropped_items); - - // alert if no index.html in root - if (!hasRootIndexHtml(tree)) { - puter.ui.alert(index_missing_error, [ - { - label: 'Ok', - }, - ]); - $('.drop-area').removeClass('drop-area-ready-to-deploy'); - $('.deploy-btn').addClass('disabled'); - dropped_items = []; - return; + // enable deploy button + $(".deploy-btn").removeClass("disabled"); + } else { + puter.ui.alert( + `You need to have an index.html file in your deployment.`, + [ + { + label: "Ok", + }, + ] + ); + $(".drop-area").removeClass("drop-area-ready-to-deploy"); + $(".drop-area").removeClass("drop-area-hover"); + $(".deploy-btn").addClass("disabled"); + dropped_items = []; + } + return; + } + // ---------------------------------------------------- + // One Puter directory dropped + // ---------------------------------------------------- + else if (items.length === 1 && items[0].isDirectory) { + let children = await puter.fs.readdir(items[0].path); + // check if index.html exists, if found, deploy entire directory + for (let child of children) { + if (child.name === "index.html") { + // deploy(currently_editing_app, items[0].path); + dropped_items = items[0].path; + let rootItems = ""; + + if (children.length === 1) rootItems = children[0].name; + else if (children.length === 2) + rootItems = children[0].name + ", " + children[1].name; + else if (children.length === 3) + rootItems = + children[0].name + + ", " + + children[1].name + + ", and" + + children[1].name; + else if (children.length > 3) + rootItems = + children[0].name + + ", " + + children[1].name + + ", and " + + (children.length - 2) + + " more item" + + (children.length - 2 > 1 ? "s" : ""); + + $(".drop-area").removeClass("drop-area-hover"); + $(".drop-area").addClass("drop-area-ready-to-deploy"); + drop_area_content = `

${rootItems}

Ready to deploy 🚀

Cancel

`; + $(".drop-area").html(drop_area_content); + + // enable deploy button + $(".deploy-btn").removeClass("disabled"); + return; } + } - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); + // no index.html in directory + puter.ui.alert(index_missing_error, [ + { + label: "Ok", + }, + ]); + $(".drop-area").removeClass("drop-area-ready-to-deploy"); + $(".deploy-btn").addClass("disabled"); + dropped_items = []; + } - // generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items - let rootItems = ''; + return false; + } + + //----------------------------------------------------------------------------- + // Local items dropped + //----------------------------------------------------------------------------- + if ( + !e.dataTransfer || + !e.dataTransfer.items || + e.dataTransfer.items.length === 0 + ) + return; - if (rootKeys.length === 1) - rootItems = rootKeys[0]; - else if (rootKeys.length === 2) - rootItems = rootKeys[0] + ', ' + rootKeys[1]; - else if (rootKeys.length === 3) - rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and' + rootKeys[1]; - else if (rootKeys.length > 3) - rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and ' + (rootKeys.length - 2) + ' more item' + (rootKeys.length - 2 > 1 ? 's' : ''); + // get dropped items + dropped_items = await puter.ui.getEntriesFromDataTransferItems( + e.dataTransfer.items + ); - rootItems = html_encode(rootItems); - $('.drop-area').removeClass('drop-area-hover'); - $('.drop-area').addClass('drop-area-ready-to-deploy'); - drop_area_content = `

${rootItems}

Ready to deploy 🚀

Cancel

`; - $('.drop-area').html(drop_area_content); + // generate a flat array of full paths from the dropped items + let paths = []; + for (let item of dropped_items) { + paths.push("/" + (item.fullPath ?? item.filepath)); + } - // enable deploy button - $('.deploy-btn').removeClass('disabled'); + // generate a directory tree from the paths + let tree = generateDirTree(paths); - return false; - } - }); + dropped_items = setRootDirTree(tree, dropped_items); - // Focus on the first input - $('#edit-app-title').focus(); + // alert if no index.html in root + if (!hasRootIndexHtml(tree)) { + puter.ui.alert(index_missing_error, [ + { + label: "Ok", + }, + ]); + $(".drop-area").removeClass("drop-area-ready-to-deploy"); + $(".deploy-btn").addClass("disabled"); + dropped_items = []; + return; + } + + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); + + // generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items + let rootItems = ""; + + if (rootKeys.length === 1) rootItems = rootKeys[0]; + else if (rootKeys.length === 2) + rootItems = rootKeys[0] + ", " + rootKeys[1]; + else if (rootKeys.length === 3) + rootItems = rootKeys[0] + ", " + rootKeys[1] + ", and" + rootKeys[1]; + else if (rootKeys.length > 3) + rootItems = + rootKeys[0] + + ", " + + rootKeys[1] + + ", and " + + (rootKeys.length - 2) + + " more item" + + (rootKeys.length - 2 > 1 ? "s" : ""); + + rootItems = html_encode(rootItems); + $(".drop-area").removeClass("drop-area-hover"); + $(".drop-area").addClass("drop-area-ready-to-deploy"); + drop_area_content = `

${rootItems}

Ready to deploy 🚀

Cancel

`; + $(".drop-area").html(drop_area_content); + + // enable deploy button + $(".deploy-btn").removeClass("disabled"); + + return false; + }, + }); + + // Focus on the first input + $("#edit-app-title").focus(); } -$('.jip-submit-btn').on('click', async function (e) { - const first_name = $('#jip-first-name').val(); - const last_name = $('#jip-last-name').val(); - const paypal = $('#jip-paypal').val(); - let error; - - if (first_name === '' || last_name === '' || paypal === '') - error = `All fields are required.`; - else if (first_name.length > 100) - error = `First Name cannot be longer than ${100}.`; - else if (last_name.length > 100) - error = `Last Name cannot be longer than ${100}.`; - else if (paypal.length > 100) - error = `Paypal cannot be longer than ${100}.`; - // check if email is valid - else if (!validateEmail(paypal)) - error = `Paypal email must be a valid email address.`; - - // error? - if (error) { - $('#jip-error').show(); - $('#jip-error').html(error); - document.body.scrollTop = document.documentElement.scrollTop = 0; - return; +$(".jip-submit-btn").on("click", async function(e) { + const first_name = $("#jip-first-name").val(); + const last_name = $("#jip-last-name").val(); + const paypal = $("#jip-paypal").val(); + let error; + + if (first_name === "" || last_name === "" || paypal === "") + error = `All fields are required.`; + else if (first_name.length > 100) + error = `First Name cannot be longer than ${100}.`; + else if (last_name.length > 100) + error = `Last Name cannot be longer than ${100}.`; + else if (paypal.length > 100) + error = `Paypal cannot be longer than ${100}.`; + // check if email is valid + else if (!validateEmail(paypal)) + error = `Paypal email must be a valid email address.`; + + // error? + if (error) { + $("#jip-error").show(); + $("#jip-error").html(error); + document.body.scrollTop = document.documentElement.scrollTop = 0; + return; + } + + // disable submit button + $(".jip-submit-btn").prop("disabled", true); + + $.ajax({ + url: puter.APIOrigin + "/jip", + type: "POST", + async: true, + contentType: "application/json", + data: JSON.stringify({ + first_name: first_name, + last_name: last_name, + paypal: paypal, + }), + headers: { + Authorization: "Bearer " + puter.authToken, + }, + success: function() { + $("#jip-success").show(); + $("#jip-form").hide(); + //enable submit button + $(".jip-submit-btn").prop("disabled", false); + // update dev profile + $("#payout-method-email").html(paypal); + // show payout method tab + $('.tab-btn[data-tab="payout-method"]').show(); + }, + error: function(err) { + $("#jip-error").show(); + $("#jip-error").html(err.message); + // scroll to top so that user sees error message + document.body.scrollTop = document.documentElement.scrollTop = 0; + // enable submit button + $(".jip-submit-btn").prop("disabled", false); + }, + }); +}); + +$(document).on("click", ".edit-app-save-btn", async function(e) { + const title = $("#edit-app-title").val(); + const name = $("#edit-app-name").val(); + const index_url = $("#edit-app-index-url").val(); + const description = $("#edit-app-description").val(); + const uid = $("#edit-app-uid").val(); + const height = $("#edit-app-window-height").val(); + const width = $("#edit-app-window-width").val(); + const top = $("#edit-app-window-top").val(); + const left = $("#edit-app-window-left").val(); + const category = $("#edit-app-category").val(); + + let filetype_associations = $("#edit-app-filetype-associations").val(); + + let icon; + + let error; + + //validation + if (title === "") error = `Title is required.`; + else if (title.length > 60) + error = `Title cannot be longer than ${60}.`; + else if (name === "") error = `Name is required.`; + else if (name.length > 60) + error = `Name cannot be longer than ${60}.`; + else if (index_url === "") error = `Index URL is required.`; + else if (!name.match(/^[a-zA-Z0-9-_-]+$/)) + error = `Name can only contain letters, numbers, dash (-) and underscore (_).`; + else if (!is_valid_url(index_url)) + error = `Index URL must be a valid url.`; + else if ( + !index_url.toLowerCase().startsWith("https://") && + !index_url.toLowerCase().startsWith("http://") + ) + error = `Index URL must start with 'https://' or 'http://'.`; + // height must be a number + else if (isNaN(height)) + error = `Window Height must be a number.`; + // height must be greater than 0 + else if (height <= 0) + error = `Window Height must be greater than 0.`; + // width must be a number + else if (isNaN(width)) + error = `Window Width must be a number.`; + // width must be greater than 0 + else if (width <= 0) + error = `Window Width must be greater than 0.`; + // top must be a number + else if (top && isNaN(top)) + error = `Window Top must be a number.`; + // left must be a number + else if (left && isNaN(left)) + error = `Window Left must be a number.`; + // download icon from URL + else { + let icon_url = $("#edit-app-icon").attr("data-url"); + let icon_base64 = $("#edit-app-icon").attr("data-base64"); + + if (icon_base64) { + icon = icon_base64; + } else if (icon_url) { + icon = await getBase64ImageFromUrl(icon_url); + let app_max_icon_size = 5 * 1024 * 1024; + if (icon.length > app_max_icon_size) + error = `Icon cannot be larger than ${byte_format(app_max_icon_size)}`; + // make sure icon is an image + else if ( + !icon.startsWith("data:image/") && + !icon.startsWith("data:application/octet-stream") + ) + error = `Icon must be an image.`; + } else { + icon = null; } + } - // disable submit button - $('.jip-submit-btn').prop('disabled', true); - - $.ajax({ - url: puter.APIOrigin + "/jip", - type: 'POST', - async: true, - contentType: "application/json", - data: JSON.stringify({ - first_name: first_name, - last_name: last_name, - paypal: paypal, - }), - headers: { - "Authorization": "Bearer " + puter.authToken - }, - success: function () { - $('#jip-success').show(); - $('#jip-form').hide(); - //enable submit button - $('.jip-submit-btn').prop('disabled', false); - // update dev profile - $('#payout-method-email').html(paypal); - // show payout method tab - $('.tab-btn[data-tab="payout-method"]').show(); - }, - error: function (err) { - $('#jip-error').show(); - $('#jip-error').html(err.message); - // scroll to top so that user sees error message - document.body.scrollTop = document.documentElement.scrollTop = 0; - // enable submit button - $('.jip-submit-btn').prop('disabled', false); - } - }) -}) -$(document).on('click', '.edit-app-save-btn', async function (e) { - const title = $('#edit-app-title').val(); - const name = $('#edit-app-name').val(); - const index_url = $('#edit-app-index-url').val(); - const description = $('#edit-app-description').val(); - const uid = $('#edit-app-uid').val(); - const height = $('#edit-app-window-height').val(); - const width = $('#edit-app-window-width').val(); - const top = $('#edit-app-window-top').val(); - const left = $('#edit-app-window-left').val(); - const category = $('#edit-app-category').val(); - - let filetype_associations = $('#edit-app-filetype-associations').val(); - - let icon; - - let error; - - //validation - if (title === '') - error = `Title is required.`; - else if (title.length > 60) - error = `Title cannot be longer than ${60}.`; - else if (name === '') - error = `Name is required.`; - else if (name.length > 60) - error = `Name cannot be longer than ${60}.`; - else if (index_url === '') - error = `Index URL is required.`; - else if (!name.match(/^[a-zA-Z0-9-_-]+$/)) - error = `Name can only contain letters, numbers, dash (-) and underscore (_).`; - else if (!is_valid_url(index_url)) - error = `Index URL must be a valid url.`; - else if (!index_url.toLowerCase().startsWith('https://') && !index_url.toLowerCase().startsWith('http://')) - error = `Index URL must start with 'https://' or 'http://'.`; - // height must be a number - else if (isNaN(height)) - error = `Window Height must be a number.`; - // height must be greater than 0 - else if (height <= 0) - error = `Window Height must be greater than 0.`; - // width must be a number - else if (isNaN(width)) - error = `Window Width must be a number.`; - // width must be greater than 0 - else if (width <= 0) - error = `Window Width must be greater than 0.`; - // top must be a number - else if (top && isNaN(top)) - error = `Window Top must be a number.`; - // left must be a number - else if (left && isNaN(left)) - error = `Window Left must be a number.`; - - // download icon from URL - else { - let icon_url = $('#edit-app-icon').attr('data-url'); - let icon_base64 = $('#edit-app-icon').attr('data-base64'); - - if(icon_base64){ - icon = icon_base64; - }else if (icon_url) { - icon = await getBase64ImageFromUrl(icon_url); - let app_max_icon_size = 5 * 1024 * 1024; - if (icon.length > app_max_icon_size) - error = `Icon cannot be larger than ${byte_format(app_max_icon_size)}`; - // make sure icon is an image - else if (!icon.startsWith('data:image/') && !icon.startsWith('data:application/octet-stream')) - error = `Icon must be an image.`; - }else{ - icon = null; - } + //parse filetype_associations and validations + // Tagify returns a JSON string, so we parse it into an array + filetype_associations = JSON.parse(filetype_associations); + + filetype_associations = filetype_associations.map((type) => { + const fileType = type.value; + + + if ( + !fileType || + fileType === "." || + fileType === "/" + ) { + error = `File Association Type must be valid.`; + return null; // Return null for invalid cases } - // error? - if (error) { - $('#edit-app-error').show(); - $('#edit-app-error').html(error); - document.body.scrollTop = document.documentElement.scrollTop = 0; - return; + const lower = fileType.toLocaleLowerCase(); + + if (fileType.includes("/")) { + return lower; + } else if (fileType.includes(".")) { + return "." + lower.split(".")[1]; + } else { + return "." + lower; } + }).filter(Boolean); // Remove null or undefined values - // show working spinner - puter.ui.showSpinner(); - // parse filetype_associations - filetype_associations = filetype_associations.split(',').map(element => element.trim()); - // disable submit button - $('.edit-app-save-btn').prop('disabled', true); + // error? + if (error) { + $("#edit-app-error").show(); + $("#edit-app-error").html(error); + document.body.scrollTop = document.documentElement.scrollTop = 0; + return; + } - let socialImageUrl = null; - if ($('#edit-app-social-image').attr('data-base64')) { - socialImageUrl = await handleSocialImageUpload(name, $('#edit-app-social-image').attr('data-base64')); - } else if ($('#edit-app-social-image').attr('data-url')) { - socialImageUrl = $('#edit-app-social-image').attr('data-url'); - } - - puter.apps.update(currently_editing_app.name, { - title: title, - name: name, - indexURL: index_url, - icon: icon, - description: description, - maximizeOnStart: $('#edit-app-maximize-on-start').is(":checked"), - background: $('#edit-app-background').is(":checked"), - metadata: { - fullpage_on_landing: $('#edit-app-fullpage-on-landing').is(":checked"), - social_image: socialImageUrl, - category: category || null, - window_size: { - width: width ?? 800, - height: height ?? 600, - }, - window_position: { - top: top, - left: left, - }, - window_resizable: $('#edit-app-window-resizable').is(":checked"), - hide_titlebar: $('#edit-app-hide-titlebar').is(":checked"), - locked: $(`#edit-app-locked`).is(":checked") ?? false, - credentialless: $(`#edit-app-credentialless`).is(":checked") ?? true, + // show working spinner + puter.ui.showSpinner(); + + // disable submit button + $(".edit-app-save-btn").prop("disabled", true); + + let socialImageUrl = null; + if ($("#edit-app-social-image").attr("data-base64")) { + socialImageUrl = await handleSocialImageUpload( + name, + $("#edit-app-social-image").attr("data-base64") + ); + } else if ($("#edit-app-social-image").attr("data-url")) { + socialImageUrl = $("#edit-app-social-image").attr("data-url"); + } + + puter.apps + .update(currently_editing_app.name, { + title: title, + name: name, + indexURL: index_url, + icon: icon, + description: description, + maximizeOnStart: $("#edit-app-maximize-on-start").is(":checked"), + background: $("#edit-app-background").is(":checked"), + metadata: { + fullpage_on_landing: $("#edit-app-fullpage-on-landing").is(":checked"), + social_image: socialImageUrl, + category: category || null, + window_size: { + width: width ?? 800, + height: height ?? 600, }, filetypeAssociations: filetype_associations, }).then(async (app) => { @@ -1200,148 +1406,166 @@ $(document).on('click', '.open-app-btn', async function (e) { puter.ui.launchApp($(this).attr('data-app-name')) }) -$('#earn-money-c2a-close').click(async function (e) { - $('#earn-money').get(0).close(); - puter.kv.set('earn-money-c2a-closed', 'true') -}) +$(document).on("click", ".open-app-btn", async function(e) { + puter.ui.launchApp($(this).attr("data-app-name")); +}); -$('#earn-money::backdrop').click(async function (e) { - alert(); - $('#earn-money').get(0).close(); - puter.kv.set('earn-money-c2a-closed', 'true') -}) +$("#earn-money-c2a-close").click(async function(e) { + $("#earn-money").get(0).close(); + puter.kv.set("earn-money-c2a-closed", "true"); +}); -$(document).on('click', '.edit-app-open-app-btn', async function (e) { - puter.ui.launchApp($(this).attr('data-app-name')) -}) +$("#earn-money::backdrop").click(async function(e) { + alert(); + $("#earn-money").get(0).close(); + puter.kv.set("earn-money-c2a-closed", "true"); +}); -$(document).on('click', '.delete-app-settings', async function (e) { - let app_uid = $(this).attr('data-app-uid'); - let app_name = $(this).attr('data-app-name'); - let app_title = $(this).attr('data-app-title'); +$(document).on("click", ".edit-app-open-app-btn", async function(e) { + puter.ui.launchApp($(this).attr("data-app-name")); +}); - // check if app is locked - const app_data = await puter.apps.get(app_name); +$(document).on("click", ".delete-app-settings", async function(e) { + let app_uid = $(this).attr("data-app-uid"); + let app_name = $(this).attr("data-app-name"); + let app_title = $(this).attr("data-app-title"); - if(app_data.metadata?.locked){ - puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ - { - label: 'Ok', - }, - ], { - type: 'warning', - }); - return; - } + // check if app is locked + const app_data = await puter.apps.get(app_name); - // confirm delete - const alert_resp = await puter.ui.alert(`Are you sure you want to premanently delete ${html_encode(app_title)}?`, - [ - { - label: 'Yes, delete permanently', - value: 'delete', - type: 'danger', - }, - { - label: 'Cancel' - }, - ] + if (app_data.metadata?.locked) { + puter.ui.alert( + `${app_data.title} is locked and cannot be deleted.`, + [ + { + label: "Ok", + }, + ], + { + type: "warning", + } ); + return; + } + + // confirm delete + const alert_resp = await puter.ui.alert( + `Are you sure you want to premanently delete ${html_encode(app_title)}?`, + [ + { + label: "Yes, delete permanently", + value: "delete", + type: "danger", + }, + { + label: "Cancel", + }, + ] + ); + + if (alert_resp === "delete") { + let init_ts = Date.now(); + $(".deleting-app-modal")?.get(0)?.showModal(); + puter.apps + .delete(app_name) + .then(async (app) => { + setTimeout( + () => { + $(".deleting-app-modal")?.get(0)?.close(); + $(".back-to-main-btn").trigger("click"); + }, + // make sure the modal was shown for at least 2 seconds + Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) + ); + // get app directory + puter.fs + .stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }) + .then(async (stat) => { + // delete subdomain associated with the app dir + puter.hosting.delete(stat.subdomains[0].subdomain); + // delete app directory + puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ); + }); + }) + .catch(async (err) => { + setTimeout( + () => { + $(".deleting-app-modal")?.get(0)?.close(); + puter.ui.alert(err?.message, [ + { + label: "Ok", + }, + ]); + }, + Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) + ); + }); + } +}); - if (alert_resp === 'delete') { - let init_ts = Date.now(); - $('.deleting-app-modal')?.get(0)?.showModal(); - puter.apps.delete(app_name).then(async (app) => { - setTimeout(() => { - $('.deleting-app-modal')?.get(0)?.close(); - $('.back-to-main-btn').trigger('click'); - }, - // make sure the modal was shown for at least 2 seconds - (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); - // get app directory - puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }).then(async (stat) => { - // delete subdomain associated with the app dir - puter.hosting.delete(stat.subdomains[0].subdomain) - // delete app directory - puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ) - }) - }).catch(async (err) => { - setTimeout(() => { - $('.deleting-app-modal')?.get(0)?.close(); - puter.ui.alert(err?.message, [ - { - label: 'Ok', - }, - ]); - }, - (Date.now() - init_ts) > 2000 ? 1 : (2000 - (Date.now() - init_ts))); - }) - } -}) - -$(document).on('click', '.edit-app', async function (e) { - $('#edit-app-uid').val($(this).attr('data-app-uid')); -}) - -$(document).on('click', '.back-to-main-btn', function (e) { - $('section:not(.sidebar)').hide(); - $('.tab-btn').removeClass('active'); - $('.tab-btn[data-tab="apps"]').addClass('active'); +$(document).on("click", ".edit-app", async function(e) { + $("#edit-app-uid").val($(this).attr("data-app-uid")); +}); - // get apps - $('#loading').show(); - setTimeout(function () { - puter.apps.list().then((apps_res) => { - // uncheck the select all checkbox - $('.select-all-apps').prop('checked', false); - - $('#loading').hide(); - apps = apps_res; - if (apps.length > 0) { - if (activeTab === 'apps') { - $('#no-apps-notice').hide(); - $('#app-list').show(); - } - $('.app-card').remove(); - apps.forEach(app => { - $('#app-list-table > tbody').append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else - $('#no-apps-notice').show(); - }) - }, 1000); -}) +$(document).on("click", ".back-to-main-btn", function(e) { + $("section:not(.sidebar)").hide(); + $(".tab-btn").removeClass("active"); + $('.tab-btn[data-tab="apps"]').addClass("active"); + + // get apps + $("#loading").show(); + setTimeout(function() { + puter.apps.list().then((apps_res) => { + // uncheck the select all checkbox + $(".select-all-apps").prop("checked", false); + + $("#loading").hide(); + apps = apps_res; + if (apps.length > 0) { + if (activeTab === "apps") { + $("#no-apps-notice").hide(); + $("#app-list").show(); + } + $(".app-card").remove(); + apps.forEach((app) => { + $("#app-list-table > tbody").append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else $("#no-apps-notice").show(); + }); + }, 1000); +}); function count_apps() { - let count = 0; - $('.app-card').each(function () { - count++; - }) - $('.app-count').html(count); - return count; + let count = 0; + $(".app-card").each(function() { + count++; + }); + $(".app-count").html(count); + return count; } // https://stackoverflow.com/a/43467144/1764493 function is_valid_url(string) { - let url; + let url; - try { - url = new URL(string); - } catch (_) { - return false; - } + try { + url = new URL(string); + } catch (_) { + return false; + } - return url.protocol === "http:" || url.protocol === "https:"; + return url.protocol === "http:" || url.protocol === "https:"; } + $(document).on('click', '#edit-app-icon-delete', async function (e) { $('#edit-app-icon').css('background-image', ``); $('#edit-app-icon').removeAttr('data-url'); @@ -1352,26 +1576,31 @@ $(document).on('click', '#edit-app-icon-delete', async function (e) { toggleResetButton(); }) -$(document).on('click', '#edit-app-icon', async function (e) { - const res2 = await puter.ui.showOpenFilePicker({ - accept: "image/*", - }); - const icon = await puter.fs.read(res2.path); - // convert blob to base64 - const reader = new FileReader(); - reader.readAsDataURL(icon); +$(document).on("click", "#edit-app-icon", async function(e) { + const res2 = await puter.ui.showOpenFilePicker({ + accept: "image/*", + }); - reader.onloadend = function () { - let image = reader.result; - // Get file extension - let fileExtension = res2.name.split('.').pop(); + const icon = await puter.fs.read(res2.path); + // convert blob to base64 + const reader = new FileReader(); + reader.readAsDataURL(icon); - // Get MIME type - let mimeType = getMimeType(fileExtension); + reader.onloadend = function() { + let image = reader.result; + // Get file extension + let fileExtension = res2.name.split(".").pop(); + + // Get MIME type + let mimeType = getMimeType(fileExtension); + + // Replace MIME type in the data URL + image = image.replace( + "data:application/octet-stream;base64", + `data:${mimeType};base64` + ); - // Replace MIME type in the data URL - image = image.replace('data:application/octet-stream;base64', `data:${mimeType};base64`); $('#edit-app-icon').css('background-image', `url(${image})`); $('#edit-app-icon').attr('data-base64', image); @@ -1382,30 +1611,35 @@ $(document).on('click', '#edit-app-icon', async function (e) { } }) + async function getBase64ImageFromUrl(imageUrl) { - var res = await fetch(imageUrl); - var blob = await res.blob(); - - return new Promise((resolve, reject) => { - var reader = new FileReader(); - reader.addEventListener("load", function () { - resolve(reader.result); - }, false); - - reader.onerror = () => { - return reject(this); - }; - reader.readAsDataURL(blob); - }) + var res = await fetch(imageUrl); + var blob = await res.blob(); + + return new Promise((resolve, reject) => { + var reader = new FileReader(); + reader.addEventListener( + "load", + function() { + resolve(reader.result); + }, + false + ); + + reader.onerror = () => { + return reject(this); + }; + reader.readAsDataURL(blob); + }); } /** * Generates HTML for an individual app card in the app list. - * + * * @param {Object} app - The app object containing details of the app. - * * + * * * @returns {string} HTML string representing the app card. - * + * * @description * This function creates an HTML string for an app card, which includes: * - Checkbox for app selection @@ -1414,115 +1648,115 @@ async function getBase64ImageFromUrl(imageUrl) { * - Display of app statistics (user count, open count) * - Creation date * - Incentive program status badge (if applicable) - * + * * The generated HTML is designed to be inserted into the app list table. - * It includes data attributes for various interactive features and + * It includes data attributes for various interactive features and * event handling. - * + * * @example * const appCardHTML = generate_app_card(myAppObject); * $('#app-list-table > tbody').append(appCardHTML); */ function generate_app_card(app) { - let h = ``; - h += ``; - // check box - h += ``; - h += `
`; - h += ``; - h += `
`; - h += ``; - // App info - h += ``; - // Icon - h += `
`; - // Info - h += `
`; - // Title - h += `

${html_encode(app.title)}${app.metadata?.locked ? lock_svg : ''}

`; - // // Category - // if (app.metadata?.category) { - // const category = APP_CATEGORIES.find(c => c.id === app.metadata.category); - // if (category) { - // h += `
`; - // h += `${category.label}`; - // h += `
`; - // } - // } - - // link - h += `${html_encode(applink(app))}`; - - // toolbar - h += `
`; - - // Open - h += `Open`; - h += ``; - - // Settings - h += `Settings`; - h += ``; - - // add to desktop - h += `Add Shortcut to Desktop` - h += ``; - - // Delete - h += `Delete`; - h += `
`; - h += ``; - - // users count - h += ``; - h += `${number_format((app.stats.referral_count ?? 0) + app.stats.user_count)}`; - h += ``; - - // opens - h += ``; - h += `${number_format(app.stats.open_count)}`; - h += ``; - - // Created - h += ``; - h += `${moment(app.created_at).format('MMM Do, YYYY')}`; - h += ``; - - h += ``; - h += `
`; - // "Approved for listing" - h += ``; - - // "Approved for opening items" - h += ``; - - // "Approved for incentive program" - h += ``; - h += `
`; - h += ``; - h += ``; - return h; + let h = ``; + h += ``; + // check box + h += ``; + h += `
`; + h += ``; + h += `
`; + h += ``; + // App info + h += ``; + // Icon + h += `
`; + // Info + h += `
`; + // Title + h += `

${html_encode(app.title)}${app.metadata?.locked ? lock_svg : ""}

`; + // // Category + // if (app.metadata?.category) { + // const category = APP_CATEGORIES.find(c => c.id === app.metadata.category); + // if (category) { + // h += `
`; + // h += `${category.label}`; + // h += `
`; + // } + // } + + // link + h += `${html_encode(applink(app))}`; + + // toolbar + h += `
`; + + // Open + h += `Open`; + h += ``; + + // Settings + h += `Settings`; + h += ``; + + // add to desktop + h += `Add Shortcut to Desktop`; + h += ``; + + // Delete + h += `Delete`; + h += `
`; + h += ``; + + // users count + h += ``; + h += `${number_format((app.stats.referral_count ?? 0) + app.stats.user_count)}`; + h += ``; + + // opens + h += ``; + h += `${number_format(app.stats.open_count)}`; + h += ``; + + // Created + h += ``; + h += `${moment(app.created_at).format("MMM Do, YYYY")}`; + h += ``; + + h += ``; + h += `
`; + // "Approved for listing" + h += ``; + + // "Approved for opening items" + h += ``; + + // "Approved for incentive program" + h += ``; + h += `
`; + h += ``; + h += ``; + return h; } /** * Formats a binary-byte integer into the human-readable form with units. - * - * @param {integer} bytes - * @returns + * + * @param {integer} bytes + * @returns */ window.byte_format = (bytes) => { - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; - if (bytes === 0) return '0 Byte'; - const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); - return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; + const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; + if (bytes === 0) return "0 Byte"; + const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); + return Math.round(bytes / Math.pow(1024, i), 2) + " " + sizes[i]; }; /** * check if a string is a valid email address */ function validateEmail(email) { - var re = /\S+@\S+\.\S+/; - return re.test(email); + var re = /\S+@\S+\.\S+/; + return re.test(email); } /** @@ -1536,864 +1770,904 @@ function validateEmail(email) { * @throws {TypeError} If the `number` parameter cannot be converted to a finite number, or if the `decimals` parameter is non-finite and cannot be converted to an absolute number. */ function number_format(number, decimals, dec_point, thousands_sep) { - // Strip all characters but numerical ones. - number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); - var n = !isFinite(+number) ? 0 : +number, - prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), - sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, - dec = (typeof dec_point === 'undefined') ? '.' : dec_point, - s = '', - toFixedFix = function (n, prec) { - var k = Math.pow(10, prec); - return '' + Math.round(n * k) / k; - }; - // Fix for IE parseFloat(0.55).toFixed(0) = 0; - s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); - if (s[0].length > 3) { - s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); - } - if ((s[1] || '').length < prec) { - s[1] = s[1] || ''; - s[1] += new Array(prec - s[1].length + 1).join('0'); - } - return s.join(dec); + // Strip all characters but numerical ones. + number = (number + "").replace(/[^0-9+\-Ee.]/g, ""); + var n = !isFinite(+number) ? 0 : +number, + prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), + sep = typeof thousands_sep === "undefined" ? "," : thousands_sep, + dec = typeof dec_point === "undefined" ? "." : dec_point, + s = "", + toFixedFix = function(n, prec) { + var k = Math.pow(10, prec); + return "" + Math.round(n * k) / k; + }; + // Fix for IE parseFloat(0.55).toFixed(0) = 0; + s = (prec ? toFixedFix(n, prec) : "" + Math.round(n)).split("."); + if (s[0].length > 3) { + s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); + } + if ((s[1] || "").length < prec) { + s[1] = s[1] || ""; + s[1] += new Array(prec - s[1].length + 1).join("0"); + } + return s.join(dec); } -$(document).on('click', '.close-message', function () { - $($(this).attr('data-target')).fadeOut(); +$(document).on("click", ".close-message", function() { + $($(this).attr("data-target")).fadeOut(); }); -$('th.sort').on('click', function (e) { - // determine what column to sort by - const sortByColumn = $(this).attr('data-column'); - - // toggle sort direction - if (sortByColumn === sortBy) { - if (sortDirection === 'asc') - sortDirection = 'desc'; - else - sortDirection = 'asc'; - } - else { - sortBy = sortByColumn; - sortDirection = 'desc'; - } - - // update arrow - $('.sort-arrow').css('display', 'none'); - $('#app-list-table').find('th').removeClass('sorted'); - $(this).find('.sort-arrow-' + sortDirection).css('display', 'inline'); - $(this).addClass('sorted'); - - sort_apps(); +$("th.sort").on("click", function(e) { + // determine what column to sort by + const sortByColumn = $(this).attr("data-column"); + + // toggle sort direction + if (sortByColumn === sortBy) { + if (sortDirection === "asc") sortDirection = "desc"; + else sortDirection = "asc"; + } else { + sortBy = sortByColumn; + sortDirection = "desc"; + } + + // update arrow + $(".sort-arrow").css("display", "none"); + $("#app-list-table").find("th").removeClass("sorted"); + $(this) + .find(".sort-arrow-" + sortDirection) + .css("display", "inline"); + $(this).addClass("sorted"); + + sort_apps(); }); function sort_apps() { - let sorted_apps; - - // sort - if (sortDirection === 'asc'){ - sorted_apps = apps.sort((a, b) => { - if(sortBy === 'name'){ - return a[sortBy].localeCompare(b[sortBy]); - }else if(sortBy === 'created_at'){ - return new Date(a[sortBy]) - new Date(b[sortBy]); - } else if(sortBy === 'user_count' || sortBy === 'open_count'){ - return a.stats[sortBy] - b.stats[sortBy]; - }else{ - a[sortBy] > b[sortBy] ? 1 : -1 - } - }); - }else{ - sorted_apps = apps.sort((a, b) => { - if(sortBy === 'name'){ - return b[sortBy].localeCompare(a[sortBy]); - }else if(sortBy === 'created_at'){ - return new Date(b[sortBy]) - new Date(a[sortBy]); - } else if(sortBy === 'user_count' || sortBy === 'open_count'){ - return b.stats[sortBy] - a.stats[sortBy]; - }else{ - b[sortBy] > a[sortBy] ? 1 : -1 - } - }); - } - // refresh app list - $('.app-card').remove(); - sorted_apps.forEach(app => { - $('#app-list-table > tbody').append(generate_app_card(app)); + let sorted_apps; + + // sort + if (sortDirection === "asc") { + sorted_apps = apps.sort((a, b) => { + if (sortBy === "name") { + return a[sortBy].localeCompare(b[sortBy]); + } else if (sortBy === "created_at") { + return new Date(a[sortBy]) - new Date(b[sortBy]); + } else if (sortBy === "user_count" || sortBy === "open_count") { + return a.stats[sortBy] - b.stats[sortBy]; + } else { + a[sortBy] > b[sortBy] ? 1 : -1; + } + }); + } else { + sorted_apps = apps.sort((a, b) => { + if (sortBy === "name") { + return b[sortBy].localeCompare(a[sortBy]); + } else if (sortBy === "created_at") { + return new Date(b[sortBy]) - new Date(a[sortBy]); + } else if (sortBy === "user_count" || sortBy === "open_count") { + return b.stats[sortBy] - a.stats[sortBy]; + } else { + b[sortBy] > a[sortBy] ? 1 : -1; + } }); + } + // refresh app list + $(".app-card").remove(); + sorted_apps.forEach((app) => { + $("#app-list-table > tbody").append(generate_app_card(app)); + }); - count_apps(); + count_apps(); + // show apps that match search_query and hide apps that don't + if (search_query) { // show apps that match search_query and hide apps that don't - if (search_query) { - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if (app.title.toLowerCase().includes(search_query.toLowerCase())) { - $(`.app-card[data-name="${html_encode(app.name)}"]`).show(); - } else { - $(`.app-card[data-name="${html_encode(app.name)}"]`).hide(); - } - }) - } + apps.forEach((app) => { + if (app.title.toLowerCase().includes(search_query.toLowerCase())) { + $(`.app-card[data-name="${html_encode(app.name)}"]`).show(); + } else { + $(`.app-card[data-name="${html_encode(app.name)}"]`).hide(); + } + }); + } } -window.deploy = async function (app, items) { - let appdata_dir, current_app_dir; - - // disable deploy button - $('.deploy-btn').addClass('disabled'); - - // change drop area text - $('.drop-area').html(deploying_spinner + '
Deploying (0%)
'); - - if (typeof items === 'string' && (items.startsWith('/') || items.startsWith('~'))) { - $('.drop-area').removeClass('drop-area-hover'); - $('.drop-area').addClass('drop-area-ready-to-deploy'); - } - - // -------------------------------------------------------------------- - // Get current directory, we need to delete the existing hostname - // later on - // -------------------------------------------------------------------- - try { - current_app_dir = await puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, - returnSubdomains: true - }); - } catch (err) { - console.log(err); +window.deploy = async function(app, items) { + let appdata_dir, current_app_dir; + + // disable deploy button + $(".deploy-btn").addClass("disabled"); + + // change drop area text + $(".drop-area").html( + deploying_spinner + + '
Deploying (0%)
' + ); + + if ( + typeof items === "string" && + (items.startsWith("/") || items.startsWith("~")) + ) { + $(".drop-area").removeClass("drop-area-hover"); + $(".drop-area").addClass("drop-area-ready-to-deploy"); + } + + // -------------------------------------------------------------------- + // Get current directory, we need to delete the existing hostname + // later on + // -------------------------------------------------------------------- + try { + current_app_dir = await puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, + returnSubdomains: true, + }); + } catch (err) { + console.log(err); + } + + // -------------------------------------------------------------------- + // Delete existing hostnames attached to this app directory if they exist + // -------------------------------------------------------------------- + if (current_app_dir?.subdomains.length > 0) { + for (let subdomain of current_app_dir?.subdomains) { + puter.hosting.delete(subdomain.subdomain); } + } + + // -------------------------------------------------------------------- + // Delete existing app directory + // -------------------------------------------------------------------- + try { + await puter.fs.delete(current_app_dir.path); + } catch (err) { + console.log(err); + } + + // -------------------------------------------------------------------- + // Make an app directory under AppData + // if the directory already exists, it should be overwritten + // -------------------------------------------------------------------- + try { + appdata_dir = await puter.fs.mkdir( + // path + `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, + // options + { overwrite: true, recursive: true, rename: false } + ); + } catch (err) { + console.log(err); + } + + // -------------------------------------------------------------------- + // (A) One Puter Item: If 'items' is a string and starts with /, it's a path to a Puter item + // -------------------------------------------------------------------- + if ( + typeof items === "string" && + (items.startsWith("/") || items.startsWith("~")) + ) { + // perform stat on 'items' + const stat = await puter.fs.stat(items); // -------------------------------------------------------------------- - // Delete existing hostnames attached to this app directory if they exist + // Puter Directory // -------------------------------------------------------------------- - if (current_app_dir?.subdomains.length > 0) { - for (let subdomain of current_app_dir?.subdomains) { - puter.hosting.delete(subdomain.subdomain) + // Perform readdir on 'items' + // todo there is apparently a bug in Puter where sometimes path is literally missing from the items + // returned by readdir. This is the 'path' that readdit didn't return a path for: "~/Desktop/particle-clicker-master" + if (stat.is_dir) { + const files = await puter.fs.readdir(items); + // copy the 'files' to the app directory + if (files.length > 0) { + for (let file of files) { + // perform copy + await puter.fs.copy(file.path, appdata_dir.path, { overwrite: true }); + // update progress + $(".deploy-percent").text( + `(${Math.round((files.indexOf(file) / files.length) * 100)}%)` + ); } + } } - // -------------------------------------------------------------------- - // Delete existing app directory + // Puter File // -------------------------------------------------------------------- - try { - await puter.fs.delete(current_app_dir.path) - } catch (err) { - console.log(err); + else { + // copy the 'files' to the app directory + await puter.fs.copy(items, appdata_dir.path, { overwrite: true }); } - // -------------------------------------------------------------------- - // Make an app directory under AppData - // if the directory already exists, it should be overwritten - // -------------------------------------------------------------------- - try { - appdata_dir = await puter.fs.mkdir( - // path - `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, - // options - { overwrite: true, recursive: true, rename: false } - ) - } catch (err) { - console.log(err); - } + // generate new hostname with a random suffix + let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; // -------------------------------------------------------------------- - // (A) One Puter Item: If 'items' is a string and starts with /, it's a path to a Puter item + // Create a router for the app with the fresh hostname + // we change hostname every time to prevent caching issues // -------------------------------------------------------------------- - if (typeof items === 'string' && (items.startsWith('/') || items.startsWith('~'))) { - // perform stat on 'items' - const stat = await puter.fs.stat(items); - - // -------------------------------------------------------------------- - // Puter Directory - // -------------------------------------------------------------------- - // Perform readdir on 'items' - // todo there is apparently a bug in Puter where sometimes path is literally missing from the items - // returned by readdir. This is the 'path' that readdit didn't return a path for: "~/Desktop/particle-clicker-master" - if (stat.is_dir) { - const files = await puter.fs.readdir(items); - // copy the 'files' to the app directory - if (files.length > 0) { - for (let file of files) { - // perform copy - await puter.fs.copy( - file.path, - appdata_dir.path, - { overwrite: true } - ); - // update progress - $('.deploy-percent').text(`(${Math.round((files.indexOf(file) / files.length) * 100)}%)`); - } - } - } - // -------------------------------------------------------------------- - // Puter File - // -------------------------------------------------------------------- - else { - // copy the 'files' to the app directory - await puter.fs.copy( - items, - appdata_dir.path, - { overwrite: true } - ); - } + puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { + // TODO this endpoint needs to be able to update only the specified fields + puter.apps.update(currently_editing_app.name, { + indexURL: protocol + `://${hostname}.` + static_hosting_domain, + title: currently_editing_app.title, + name: currently_editing_app.name, + icon: currently_editing_app.icon, + description: currently_editing_app.description, + maximizeOnStart: currently_editing_app.maximize_on_start, + background: currently_editing_app.background, + filetypeAssociations: currently_editing_app.filetype_associations, + }); + // set the 'Index URL' field for the 'Settings' tab + $("#edit-app-index-url").val( + protocol + `://${hostname}.` + static_hosting_domain + ); + // show success message + $(".deploy-success-msg").show(); + // reset drop area + reset_drop_area(); + }); + } + // -------------------------------------------------------------------- + // (B) Multiple Puter Items: If `items` is an Array `items[0]` has `uid` + // then it's a Puter Item Array. + // -------------------------------------------------------------------- + else if (Array.isArray(items) && items[0].uid) { + // If there's no index.html in the root, return + if (!hasRootIndexHtml) return; + + // copy the 'files' to the app directory + for (let item of items) { + // perform copy + await puter.fs.copy( + item.fullPath ? item.fullPath : item.path ? item.path : item.filepath, + appdata_dir.path, + { overwrite: true } + ); + // update progress + $(".deploy-percent").text( + `(${Math.round((items.indexOf(item) / items.length) * 100)}%)` + ); + } - // generate new hostname with a random suffix - let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; + // generate new hostname with a random suffix + let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; - // -------------------------------------------------------------------- - // Create a router for the app with the fresh hostname - // we change hostname every time to prevent caching issues - // -------------------------------------------------------------------- - puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { - // TODO this endpoint needs to be able to update only the specified fields - puter.apps.update(currently_editing_app.name, { - indexURL: protocol + `://${hostname}.` + static_hosting_domain, - title: currently_editing_app.title, - name: currently_editing_app.name, - icon: currently_editing_app.icon, - description: currently_editing_app.description, - maximizeOnStart: currently_editing_app.maximize_on_start, - background: currently_editing_app.background, - filetypeAssociations: currently_editing_app.filetype_associations, - }) - // set the 'Index URL' field for the 'Settings' tab - $('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain); - // show success message - $('.deploy-success-msg').show(); - // reset drop area - reset_drop_area(); - }) - } // -------------------------------------------------------------------- - // (B) Multiple Puter Items: If `items` is an Array `items[0]` has `uid` - // then it's a Puter Item Array. + // Create a router for the app with the fresh hostname + // we change hostname every time to prevent caching issues // -------------------------------------------------------------------- - else if (Array.isArray(items) && items[0].uid) { - // If there's no index.html in the root, return - if (!hasRootIndexHtml) - return; - - // copy the 'files' to the app directory - for (let item of items) { - // perform copy - await puter.fs.copy( - item.fullPath ? item.fullPath : item.path ? item.path : item.filepath, - appdata_dir.path, - { overwrite: true } - ); - // update progress - $('.deploy-percent').text(`(${Math.round((items.indexOf(item) / items.length) * 100)}%)`); + puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { + // TODO this endpoint needs to be able to update only the specified fields + puter.apps.update(currently_editing_app.name, { + indexURL: protocol + `://${hostname}.` + static_hosting_domain, + title: currently_editing_app.title, + name: currently_editing_app.name, + icon: currently_editing_app.icon, + description: currently_editing_app.description, + maximizeOnStart: currently_editing_app.maximize_on_start, + background: currently_editing_app.background, + filetypeAssociations: currently_editing_app.filetype_associations, + }); + // set the 'Index URL' field for the 'Settings' tab + $("#edit-app-index-url").val( + protocol + `://${hostname}.` + static_hosting_domain + ); + // show success message + $(".deploy-success-msg").show(); + // reset drop area + reset_drop_area(); + }); + } + + // -------------------------------------------------------------------- + // (C) Local Items: Upload new deploy + // -------------------------------------------------------------------- + else { + puter.fs + .upload( + items, + `/${authUsername}/AppData/${dev_center_uid}/${currently_editing_app.uid}`, + { + dedupeName: false, + overwrite: false, + parsedDataTransferItems: true, + createMissingAncestors: true, + progress: function(operation_id, op_progress) { + $(".deploy-percent").text(`(${op_progress}%)`); + }, } - - // generate new hostname with a random suffix + ) + .then(async (uploaded) => { + // new hostname let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; - // -------------------------------------------------------------------- - // Create a router for the app with the fresh hostname + // ---------------------------------------- + // Create a router for the app with a fresh hostname // we change hostname every time to prevent caching issues - // -------------------------------------------------------------------- + // ---------------------------------------- puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { - // TODO this endpoint needs to be able to update only the specified fields - puter.apps.update(currently_editing_app.name, { - indexURL: protocol + `://${hostname}.` + static_hosting_domain, - title: currently_editing_app.title, - name: currently_editing_app.name, - icon: currently_editing_app.icon, - description: currently_editing_app.description, - maximizeOnStart: currently_editing_app.maximize_on_start, - background: currently_editing_app.background, - filetypeAssociations: currently_editing_app.filetype_associations, - }) - // set the 'Index URL' field for the 'Settings' tab - $('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain); - // show success message - $('.deploy-success-msg').show(); - // reset drop area - reset_drop_area(); - }) - } - - // -------------------------------------------------------------------- - // (C) Local Items: Upload new deploy - // -------------------------------------------------------------------- - else { - puter.fs.upload( - items, - `/${authUsername}/AppData/${dev_center_uid}/${currently_editing_app.uid}`, - { - dedupeName: false, - overwrite: false, - parsedDataTransferItems: true, - createMissingAncestors: true, - progress: function (operation_id, op_progress) { - $('.deploy-percent').text(`(${op_progress}%)`); - }, - }).then(async (uploaded) => { - // new hostname - let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; - - // ---------------------------------------- - // Create a router for the app with a fresh hostname - // we change hostname every time to prevent caching issues - // ---------------------------------------- - puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { - // TODO this endpoint needs to be able to update only the specified fields - puter.apps.update(currently_editing_app.name, { - indexURL: protocol + `://${hostname}.` + static_hosting_domain, - title: currently_editing_app.title, - name: currently_editing_app.name, - icon: currently_editing_app.icon, - description: currently_editing_app.description, - maximizeOnStart: currently_editing_app.maximize_on_start, - background: currently_editing_app.background, - filetypeAssociations: currently_editing_app.filetype_associations, - }) - // set the 'Index URL' field for the 'Settings' tab - $('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain); - // show success message - $('.deploy-success-msg').show(); - // reset drop area - reset_drop_area() - }) - }) - } -} + // TODO this endpoint needs to be able to update only the specified fields + puter.apps.update(currently_editing_app.name, { + indexURL: protocol + `://${hostname}.` + static_hosting_domain, + title: currently_editing_app.title, + name: currently_editing_app.name, + icon: currently_editing_app.icon, + description: currently_editing_app.description, + maximizeOnStart: currently_editing_app.maximize_on_start, + background: currently_editing_app.background, + filetypeAssociations: currently_editing_app.filetype_associations, + }); + // set the 'Index URL' field for the 'Settings' tab + $("#edit-app-index-url").val( + protocol + `://${hostname}.` + static_hosting_domain + ); + // show success message + $(".deploy-success-msg").show(); + // reset drop area + reset_drop_area(); + }); + }); + } +}; -$(document).on('click', '.section-tab-btn', function (e) { - // hide all tabs - $('.section-tab').hide(); - // show section - $('.section-tab[data-tab="' + $(this).attr('data-tab') + '"]').show(); - // remove active class from all tab buttons - $('.section-tab-btn').removeClass('active'); - // add active class to clicked tab button - $(this).addClass('active'); -}) +$(document).on("click", ".section-tab-btn", function(e) { + // hide all tabs + $(".section-tab").hide(); + // show section + $('.section-tab[data-tab="' + $(this).attr("data-tab") + '"]').show(); + // remove active class from all tab buttons + $(".section-tab-btn").removeClass("active"); + // add active class to clicked tab button + $(this).addClass("active"); +}); function generateDirTree(paths) { - const root = {}; - - for (let path of paths) { - let parts = path.split('/'); - let currentNode = root; - for (let part of parts) { - if (!part) continue; // skip empty parts, especially leading one - if (!currentNode[part]) { - currentNode[part] = {}; - } - currentNode = currentNode[part]; - } + const root = {}; + + for (let path of paths) { + let parts = path.split("/"); + let currentNode = root; + for (let part of parts) { + if (!part) continue; // skip empty parts, especially leading one + if (!currentNode[part]) { + currentNode[part] = {}; + } + currentNode = currentNode[part]; } + } - return root; + return root; } function setRootDirTree(tree, items) { - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); - - // If there's only one object in the root, check if it's non-empty and return it - if (rootKeys.length === 1 && typeof tree[rootKeys[0]] === 'object' && Object.keys(tree[rootKeys[0]]).length > 0) { - let newItems = []; - for (let item of items) { - if (item.fullPath) - item.finalPath = item.fullPath.replace(rootKeys[0], ''); - else if (item.path) - item.path = item.path.replace(rootKeys[0], ''); - else - item.filepath = item.filepath.replace(rootKeys[0], ''); - - newItems.push(item); - } - return newItems; - } else { - return items; + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); + + // If there's only one object in the root, check if it's non-empty and return it + if ( + rootKeys.length === 1 && + typeof tree[rootKeys[0]] === "object" && + Object.keys(tree[rootKeys[0]]).length > 0 + ) { + let newItems = []; + for (let item of items) { + if (item.fullPath) + item.finalPath = item.fullPath.replace(rootKeys[0], ""); + else if (item.path) item.path = item.path.replace(rootKeys[0], ""); + else item.filepath = item.filepath.replace(rootKeys[0], ""); + + newItems.push(item); } + return newItems; + } else { + return items; + } } function hasRootIndexHtml(tree) { - // Check if index.html exists in the root - if (tree['index.html']) { - return true; - } - - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); - - // If there's only one directory in the root, check if index.html exists in that directory - if (rootKeys.length === 1 && typeof tree[rootKeys[0]] === 'object' && tree[rootKeys[0]]['index.html']) { - return true; - } - - return false; + // Check if index.html exists in the root + if (tree["index.html"]) { + return true; + } + + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); + + // If there's only one directory in the root, check if index.html exists in that directory + if ( + rootKeys.length === 1 && + typeof tree[rootKeys[0]] === "object" && + tree[rootKeys[0]]["index.html"] + ) { + return true; + } + + return false; } -$(document).on('click', '.close-success-msg', function (e) { - $(this).closest('div').fadeOut(); -}) - -$(document).on('click', '.open-app', function (e) { - puter.ui.launchApp($(this).attr('data-app-name')); -}) +$(document).on("click", ".close-success-msg", function(e) { + $(this).closest("div").fadeOut(); +}); -$(document).on('click', '.insta-deploy-to-new-app', async function (e) { - $('.insta-deploy-modal').get(0).close(); - let title = await puter.ui.prompt('Please enter a title for your app:', 'My Awesome App'); +$(document).on("click", ".open-app", function(e) { + puter.ui.launchApp($(this).attr("data-app-name")); +}); - if (title.length > 60) { - puter.ui.alert(`Title cannot be longer than 60.`, [ - { - label: 'Ok', - }, - ]); - // todo go back to create an app prompt and prefill the title input with the title the user entered - $('.insta-deploy-modal').get(0).showModal(); +$(document).on("click", ".insta-deploy-to-new-app", async function(e) { + $(".insta-deploy-modal").get(0).close(); + let title = await puter.ui.prompt( + "Please enter a title for your app:", + "My Awesome App" + ); + + if (title.length > 60) { + puter.ui.alert(`Title cannot be longer than 60.`, [ + { + label: "Ok", + }, + ]); + // todo go back to create an app prompt and prefill the title input with the title the user entered + $(".insta-deploy-modal").get(0).showModal(); + } else if (title) { + if (source_path) { + create_app(title, source_path); + source_path = null; + } else { + create_app(title, null, dropped_items); + dropped_items = null; } - else if (title) { - if (source_path) { - create_app(title, source_path); - source_path = null; - } else { - create_app(title, null, dropped_items); - dropped_items = null; - } - } else - $('.insta-deploy-modal').get(0).showModal(); + } else $(".insta-deploy-modal").get(0).showModal(); - return; - -}) + return; +}); -$(document).on('click', '.insta-deploy-to-existing-app', function (e) { - $('.insta-deploy-modal').get(0).close(); - $('.insta-deploy-existing-app-select').get(0).showModal(); - $('.insta-deploy-existing-app-list').html(`
${loading_spinner}
`); - puter.apps.list().then((apps) => { - setTimeout(() => { - $('.insta-deploy-existing-app-list').html(''); - if (apps.length === 0) - $('.insta-deploy-existing-app-list').html(` +$(document).on("click", ".insta-deploy-to-existing-app", function(e) { + $(".insta-deploy-modal").get(0).close(); + $(".insta-deploy-existing-app-select").get(0).showModal(); + $(".insta-deploy-existing-app-list").html( + `
${loading_spinner}
` + ); + puter.apps.list().then((apps) => { + setTimeout(() => { + $(".insta-deploy-existing-app-list").html(""); + if (apps.length === 0) + $(".insta-deploy-existing-app-list").html(`
You have no existing apps.
`); - else { - for (let app of apps) { - $('.insta-deploy-existing-app-list').append( - `
- + else { + for (let app of apps) { + $(".insta-deploy-existing-app-list").append( + `
+ ${html_encode(app.title)}
${number_format((app.stats.referral_count ?? 0) + app.stats.user_count)} ${number_format(app.stats.open_count)}
` - ); - } - } - }, 500); - }) - - // todo reset .insta-deploy-existing-app-list on close -}) + ); + } + } + }, 500); + }); -$(document).on('click', '.insta-deploy-app-selector', function (e) { - $('.insta-deploy-app-selector').removeClass('active'); - $(this).addClass('active'); + // todo reset .insta-deploy-existing-app-list on close +}); - // enable deploy button - $('.insta-deploy-existing-app-deploy-btn').removeClass('disabled'); -}) +$(document).on("click", ".insta-deploy-app-selector", function(e) { + $(".insta-deploy-app-selector").removeClass("active"); + $(this).addClass("active"); -$(document).on('click', '.insta-deploy-existing-app-deploy-btn', function (e) { - $('.insta-deploy-existing-app-deploy-btn').addClass('disabled'); - $('.insta-deploy-existing-app-select')?.get(0)?.close(); - // load the 'App Settings' section - edit_app_section($('.insta-deploy-app-selector.active').attr('data-name')); + // enable deploy button + $(".insta-deploy-existing-app-deploy-btn").removeClass("disabled"); +}); - $('.drop-area').removeClass('drop-area-hover'); - $('.drop-area').addClass('drop-area-ready-to-deploy'); - let drop_area_content = `

Ready to deploy 🚀

Cancel

`; - $('.drop-area').html(drop_area_content); +$(document).on("click", ".insta-deploy-existing-app-deploy-btn", function(e) { + $(".insta-deploy-existing-app-deploy-btn").addClass("disabled"); + $(".insta-deploy-existing-app-select")?.get(0)?.close(); + // load the 'App Settings' section + edit_app_section($(".insta-deploy-app-selector.active").attr("data-name")); - // deploy - deploy({ uid: $(e.target).attr('data-uid') }, source_path ?? dropped_items); - $('.insta-deploy-existing-app-list').html(''); -}) + $(".drop-area").removeClass("drop-area-hover"); + $(".drop-area").addClass("drop-area-ready-to-deploy"); + let drop_area_content = `

Ready to deploy 🚀

Cancel

`; + $(".drop-area").html(drop_area_content); -$(document).on('click', '.insta-deploy-cancel', function (e) { - $(this).closest('dialog')?.get(0)?.close(); -}) -$(document).on('click', '.insta-deploy-existing-app-back', function (e) { - $('.insta-deploy-existing-app-select')?.get(0)?.close(); - $('.insta-deploy-modal')?.get(0)?.showModal(); - // disable deploy button - $('.insta-deploy-existing-app-deploy-btn').addClass('disabled'); + // deploy + deploy({ uid: $(e.target).attr("data-uid") }, source_path ?? dropped_items); + $(".insta-deploy-existing-app-list").html(""); +}); - // todo disable the 'an existing app' option if there are no existing apps -}) +$(document).on("click", ".insta-deploy-cancel", function(e) { + $(this).closest("dialog")?.get(0)?.close(); +}); +$(document).on("click", ".insta-deploy-existing-app-back", function(e) { + $(".insta-deploy-existing-app-select")?.get(0)?.close(); + $(".insta-deploy-modal")?.get(0)?.showModal(); + // disable deploy button + $(".insta-deploy-existing-app-deploy-btn").addClass("disabled"); + // todo disable the 'an existing app' option if there are no existing apps +}); -$(document).on('click', '.add-app-to-desktop', function (e) { - let app_title = $(this).attr('data-app-title'); - let app_uid = $(this).attr('data-app-uid'); +$(document).on("click", ".add-app-to-desktop", function(e) { + let app_title = $(this).attr("data-app-title"); + let app_uid = $(this).attr("data-app-uid"); - puter.fs.upload( - new File([], app_title), - `/${authUsername}/Desktop`, + puter.fs + .upload(new File([], app_title), `/${authUsername}/Desktop`, { + name: app_title, + dedupeName: true, + overwrite: false, + appUID: app_uid, + }) + .then(async (uploaded) => { + puter.ui.alert( + `${app_title} shortcut has been added to your desktop.`, + [ + { + label: "Ok", + type: "primary", + }, + ], { - name: app_title, - dedupeName: true, - overwrite: false, - appUID: app_uid, - }).then(async (uploaded) => { - puter.ui.alert(`${app_title} shortcut has been added to your desktop.`, [ - { - label: 'Ok', - type: 'primary', - }, - ], { - type: 'success', - }); - }) - -}) + type: "success", + } + ); + }); +}); function reset_drop_area() { - dropped_items = null; - $('.drop-area').html(drop_area_placeholder); - $('.drop-area').removeClass('drop-area-ready-to-deploy'); - $('.deploy-btn').addClass('disabled'); + dropped_items = null; + $(".drop-area").html(drop_area_placeholder); + $(".drop-area").removeClass("drop-area-ready-to-deploy"); + $(".deploy-btn").addClass("disabled"); } -$('body').on('dragover', function (event) { - // skip if the user is dragging something over the drop area - if ($(event.target).hasClass('drop-area')) - return; +$("body").on("dragover", function(event) { + // skip if the user is dragging something over the drop area + if ($(event.target).hasClass("drop-area")) return; - event.preventDefault(); // Prevent the default behavior - event.stopPropagation(); // Stop the event from propagating + event.preventDefault(); // Prevent the default behavior + event.stopPropagation(); // Stop the event from propagating }); // Developers can drop items anywhere on the page to deploy them -$('body').on('drop', async function (event) { - // skip if the user is dragging something over the drop area - if ($(event.target).hasClass('drop-area')) - return; - - // prevent default behavior - event.preventDefault(); - event.stopPropagation(); - - // retrieve puter items from the event - if (event.detail?.items?.length > 0) { - dropped_items = event.detail.items; - source_path = dropped_items[0].path; - // by deploying an existing Puter folder. So we create the app and deploy it. - if (source_path) { - // todo if there are no apps, go straight to creating a new app - $('.insta-deploy-modal').get(0).showModal(); - // set item name - $('.insta-deploy-item-name').html(html_encode(dropped_items[0].name)); - } - } - //----------------------------------------------------------------------------- - // Local items dropped - //----------------------------------------------------------------------------- - const e = event.originalEvent; - if (!e.dataTransfer || !e.dataTransfer.items || e.dataTransfer.items.length === 0) - return; - - // Get dropped items - dropped_items = await puter.ui.getEntriesFromDataTransferItems(e.dataTransfer.items); - - // Generate a flat array of full paths from the dropped items - let paths = []; - for (let item of dropped_items) { - paths.push('/' + (item.fullPath ?? item.filepath)); +$("body").on("drop", async function(event) { + // skip if the user is dragging something over the drop area + if ($(event.target).hasClass("drop-area")) return; + + // prevent default behavior + event.preventDefault(); + event.stopPropagation(); + + // retrieve puter items from the event + if (event.detail?.items?.length > 0) { + dropped_items = event.detail.items; + source_path = dropped_items[0].path; + // by deploying an existing Puter folder. So we create the app and deploy it. + if (source_path) { + // todo if there are no apps, go straight to creating a new app + $(".insta-deploy-modal").get(0).showModal(); + // set item name + $(".insta-deploy-item-name").html(html_encode(dropped_items[0].name)); } + } + //----------------------------------------------------------------------------- + // Local items dropped + //----------------------------------------------------------------------------- + const e = event.originalEvent; + if ( + !e.dataTransfer || + !e.dataTransfer.items || + e.dataTransfer.items.length === 0 + ) + return; - // Generate a directory tree from the paths - let tree = generateDirTree(paths); - - dropped_items = setRootDirTree(tree, dropped_items); - - // Alert if no index.html in root - if (!hasRootIndexHtml(tree)) { - puter.ui.alert(index_missing_error, [ - { - label: 'Ok', - }, - ]); - $('.drop-area').removeClass('drop-area-ready-to-deploy'); - $('.deploy-btn').addClass('disabled'); - dropped_items = []; - return; - } - - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); - - // Generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items - let rootItems = ''; - - if (rootKeys.length === 1) - rootItems = rootKeys[0]; - else if (rootKeys.length === 2) - rootItems = rootKeys[0] + ', ' + rootKeys[1]; - else if (rootKeys.length === 3) - rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and' + rootKeys[1]; - else if (rootKeys.length > 3) - rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and ' + (rootKeys.length - 2) + ' more item' + (rootKeys.length - 2 > 1 ? 's' : ''); - - // Show insta-deploy modal - $('.insta-deploy-modal').get(0)?.showModal(); - - // Set item name - $('.insta-deploy-item-name').html(html_encode(rootItems)); + // Get dropped items + dropped_items = await puter.ui.getEntriesFromDataTransferItems( + e.dataTransfer.items + ); + + // Generate a flat array of full paths from the dropped items + let paths = []; + for (let item of dropped_items) { + paths.push("/" + (item.fullPath ?? item.filepath)); + } + + // Generate a directory tree from the paths + let tree = generateDirTree(paths); + + dropped_items = setRootDirTree(tree, dropped_items); + + // Alert if no index.html in root + if (!hasRootIndexHtml(tree)) { + puter.ui.alert(index_missing_error, [ + { + label: "Ok", + }, + ]); + $(".drop-area").removeClass("drop-area-ready-to-deploy"); + $(".deploy-btn").addClass("disabled"); + dropped_items = []; + return; + } + + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); + + // Generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items + let rootItems = ""; + + if (rootKeys.length === 1) rootItems = rootKeys[0]; + else if (rootKeys.length === 2) rootItems = rootKeys[0] + ", " + rootKeys[1]; + else if (rootKeys.length === 3) + rootItems = rootKeys[0] + ", " + rootKeys[1] + ", and" + rootKeys[1]; + else if (rootKeys.length > 3) + rootItems = + rootKeys[0] + + ", " + + rootKeys[1] + + ", and " + + (rootKeys.length - 2) + + " more item" + + (rootKeys.length - 2 > 1 ? "s" : ""); + + // Show insta-deploy modal + $(".insta-deploy-modal").get(0)?.showModal(); + + // Set item name + $(".insta-deploy-item-name").html(html_encode(rootItems)); }); -$('.insta-deploy-existing-app-select').on('close', function (e) { - $('.insta-deploy-existing-app-list').html(''); -}) +$(".insta-deploy-existing-app-select").on("close", function(e) { + $(".insta-deploy-existing-app-list").html(""); +}); -$('.refresh-app-list').on('click', function (e) { - $('.loading-modal').get(0)?.showModal(); +$(".refresh-app-list").on("click", function(e) { + $(".loading-modal").get(0)?.showModal(); - puter.apps.list().then((resp) => { - setTimeout(() => { - apps = resp; + puter.apps.list().then((resp) => { + setTimeout(() => { + apps = resp; - $('.app-card').remove(); - apps.forEach(app => { - $('#app-list-table > tbody').append(generate_app_card(app)); - }); + $(".app-card").remove(); + apps.forEach((app) => { + $("#app-list-table > tbody").append(generate_app_card(app)); + }); - count_apps(); + count_apps(); - // preserve search query - if (search_query) { - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if (app.title.toLowerCase().includes(search_query.toLowerCase())) { - $(`.app-card[data-name="${app.name}"]`).show(); - } else { - $(`.app-card[data-name="${app.name}"]`).hide(); - } - }) - } + // preserve search query + if (search_query) { + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if (app.title.toLowerCase().includes(search_query.toLowerCase())) { + $(`.app-card[data-name="${app.name}"]`).show(); + } else { + $(`.app-card[data-name="${app.name}"]`).hide(); + } + }); + } - // preserve sort - sort_apps(); + // preserve sort + sort_apps(); - $('.loading-modal').get(0).close(); - }, 1000); - }) -}) + $(".loading-modal").get(0).close(); + }, 1000); + }); +}); -$(document).on('click', '.search', function (e) { - e.stopPropagation(); - e.preventDefault(); - // don't let click bubble up to window - e.stopImmediatePropagation(); -}) +$(document).on("click", ".search", function(e) { + e.stopPropagation(); + e.preventDefault(); + // don't let click bubble up to window + e.stopImmediatePropagation(); +}); -$(document).on('input change keyup keypress keydown paste cut', '.search', function (e) { +$(document).on( + "input change keyup keypress keydown paste cut", + ".search", + function(e) { // search apps for query search_query = $(this).val().toLowerCase(); - if (search_query === '') { - // hide 'clear search' button - $('.search-clear').hide(); - // show all apps again - $(`.app-card`).show(); + if (search_query === "") { + // hide 'clear search' button + $(".search-clear").hide(); + // show all apps again + $(`.app-card`).show(); } else { - // show 'clear search' button - $('.search-clear').show(); - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if ( - app.title.toLowerCase().includes(search_query.toLowerCase()) - || app.name.toLowerCase().includes(search_query.toLowerCase()) - || app.description.toLowerCase().includes(search_query.toLowerCase()) - || app.uid.toLowerCase().includes(search_query.toLowerCase()) - ) - { - $(`.app-card[data-name="${app.name}"]`).show(); - } else { - $(`.app-card[data-name="${app.name}"]`).hide(); - } - }) + // show 'clear search' button + $(".search-clear").show(); + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if ( + app.title.toLowerCase().includes(search_query.toLowerCase()) || + app.name.toLowerCase().includes(search_query.toLowerCase()) || + app.description.toLowerCase().includes(search_query.toLowerCase()) || + app.uid.toLowerCase().includes(search_query.toLowerCase()) + ) { + $(`.app-card[data-name="${app.name}"]`).show(); + } else { + $(`.app-card[data-name="${app.name}"]`).hide(); + } + }); } -}) + } +); + +$(document).on("click", ".search-clear", function(e) { + $(".search").val(""); + $(".search").trigger("change"); + $(".search").focus(); + search_query = ""; +}); -$(document).on('click', '.search-clear', function (e) { - $('.search').val(''); - $('.search').trigger('change'); - $('.search').focus(); - search_query = ''; -}) +$(document).on("change", ".app-checkbox", function(e) { + // determine if select-all checkbox should be checked, indeterminate, or unchecked + if ($(".app-checkbox:checked").length === $(".app-checkbox").length) { + $(".select-all-apps").prop("indeterminate", false); + $(".select-all-apps").prop("checked", true); + } else if ($(".app-checkbox:checked").length > 0) { + $(".select-all-apps").prop("indeterminate", true); + $(".select-all-apps").prop("checked", false); + } else { + $(".select-all-apps").prop("indeterminate", false); + $(".select-all-apps").prop("checked", false); + } + + // activate row + if ($(this).is(":checked")) $(this).closest("tr").addClass("active"); + else $(this).closest("tr").removeClass("active"); + + // enable delete button if at least one checkbox is checked + if ($(".app-checkbox:checked").length > 0) + $(".delete-apps-btn").removeClass("disabled"); + else $(".delete-apps-btn").addClass("disabled"); +}); -$(document).on('change', '.app-checkbox', function (e) { - // determine if select-all checkbox should be checked, indeterminate, or unchecked - if ($('.app-checkbox:checked').length === $('.app-checkbox').length) { - $('.select-all-apps').prop('indeterminate', false); - $('.select-all-apps').prop('checked', true); - } else if ($('.app-checkbox:checked').length > 0) { - $('.select-all-apps').prop('indeterminate', true); - $('.select-all-apps').prop('checked', false); - } - else { - $('.select-all-apps').prop('indeterminate', false); - $('.select-all-apps').prop('checked', false); +$(document).on("click", ".delete-apps-btn", async function(e) { + // show confirmation alert + let resp = await puter.ui.alert( + `Are you sure you want to delete the selected apps?`, + [ + { + label: "Delete", + type: "danger", + value: "delete", + }, + { + label: "Cancel", + }, + ], + { + type: "warning", } + ); - // activate row - if ($(this).is(':checked')) - $(this).closest('tr').addClass('active'); - else - $(this).closest('tr').removeClass('active'); + if (resp === "delete") { + // disable delete button + // $('.delete-apps-btn').addClass('disabled'); - // enable delete button if at least one checkbox is checked - if ($('.app-checkbox:checked').length > 0) - $('.delete-apps-btn').removeClass('disabled'); - else - $('.delete-apps-btn').addClass('disabled'); - -}) + // show 'deleting' modal + $(".deleting-app-modal")?.get(0)?.showModal(); -$(document).on('click', '.delete-apps-btn', async function (e) { - // show confirmation alert - let resp = await puter.ui.alert(`Are you sure you want to delete the selected apps?`, [ - { - label: 'Delete', - type: 'danger', - value: 'delete', - }, - { - label: 'Cancel', - }, - ], { - type: 'warning', - }); - - if (resp === 'delete') { - // disable delete button - // $('.delete-apps-btn').addClass('disabled'); - - // show 'deleting' modal - $('.deleting-app-modal')?.get(0)?.showModal(); - - let start_ts = Date.now(); - const apps = $('.app-checkbox:checked').toArray(); - - // delete all checked apps - for (let app of apps) { - // get app uid - const app_uid = $(app).attr('data-app-uid'); - const app_name = $(app).attr('data-app-name'); - - // get app - const app_data = await puter.apps.get(app_name); + let start_ts = Date.now(); + const apps = $(".app-checkbox:checked").toArray(); + + // delete all checked apps + for (let app of apps) { + // get app uid + const app_uid = $(app).attr("data-app-uid"); + const app_name = $(app).attr("data-app-name"); + + // get app + const app_data = await puter.apps.get(app_name); + + if (app_data.metadata?.locked) { + if (apps.length === 1) { + puter.ui.alert( + `${app_data.title} is locked and cannot be deleted.`, + [ + { + label: "Ok", + }, + ], + { + type: "warning", + } + ); - if(app_data.metadata?.locked){ - if(apps.length === 1){ - puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ - { - label: 'Ok', - }, - ], { - type: 'warning', - }); + break; + } - break; - } + let resp = await puter.ui.alert( + `${app_data.title} is locked and cannot be deleted.`, + [ + { + label: "Skip and Continue", + value: "Continue", + type: "primary", + }, + { + label: "Cancel", + }, + ], + { + type: "warning", + } + ); - let resp = await puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ - { - label: 'Skip and Continue', - value: 'Continue', - type: 'primary' - }, - { - label: 'Cancel', - }, - ], { - type: 'warning', - }); - - if(resp === 'Cancel') - break; - else if(resp === 'Continue') - continue; - else - continue; - } + if (resp === "Cancel") break; + else if (resp === "Continue") continue; + else continue; + } - // delete app - await puter.apps.delete(app_name) + // delete app + await puter.apps.delete(app_name); - // remove app card - $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { - $(this).remove(); - if ($(`.app-card`).length === 0) { - $('section:not(.sidebar)').hide(); - $('#no-apps-notice').show(); - } else { - $('section:not(.sidebar)').hide(); - $('#app-list').show(); - } - count_apps(); - }); - - try{ - // get app directory - const stat = await puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true - }); - // delete subdomain associated with the app directory - if(stat?.subdomains[0]?.subdomain){ - await puter.hosting.delete(stat.subdomains[0].subdomain) - } - // delete app directory - await puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ) - count_apps(); - } catch(err) { - console.log(err); - } + // remove app card + $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { + $(this).remove(); + if ($(`.app-card`).length === 0) { + $("section:not(.sidebar)").hide(); + $("#no-apps-notice").show(); + } else { + $("section:not(.sidebar)").hide(); + $("#app-list").show(); } - - // close 'deleting' modal - setTimeout(() => { - $('.deleting-app-modal')?.get(0)?.close(); - if($('.app-checkbox:checked').length === 0){ - // disable delete button - $('.delete-apps-btn').addClass('disabled'); - // reset the 'select all' checkbox - $('.select-all-apps').prop('indeterminate', false); - $('.select-all-apps').prop('checked', false); - } - }, (start_ts - Date.now()) > 500 ? 0 : 500); + count_apps(); + }); + + try { + // get app directory + const stat = await puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }); + // delete subdomain associated with the app directory + if (stat?.subdomains[0]?.subdomain) { + await puter.hosting.delete(stat.subdomains[0].subdomain); + } + // delete app directory + await puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ); + count_apps(); + } catch (err) { + console.log(err); + } } -}) -$(document).on('change', '.select-all-apps', function (e) { - if ($(this).is(':checked')) { - $('.app-checkbox').prop('checked', true); - $('.app-card').addClass('active'); - $('.delete-apps-btn').removeClass('disabled'); - } else { - $('.app-checkbox').prop('checked', false); - $('.app-card').removeClass('active'); - $('.delete-apps-btn').addClass('disabled'); - } -}) + // close 'deleting' modal + setTimeout( + () => { + $(".deleting-app-modal")?.get(0)?.close(); + if ($(".app-checkbox:checked").length === 0) { + // disable delete button + $(".delete-apps-btn").addClass("disabled"); + // reset the 'select all' checkbox + $(".select-all-apps").prop("indeterminate", false); + $(".select-all-apps").prop("checked", false); + } + }, + start_ts - Date.now() > 500 ? 0 : 500 + ); + } +}); + +$(document).on("change", ".select-all-apps", function(e) { + if ($(this).is(":checked")) { + $(".app-checkbox").prop("checked", true); + $(".app-card").addClass("active"); + $(".delete-apps-btn").removeClass("disabled"); + } else { + $(".app-checkbox").prop("checked", false); + $(".app-card").removeClass("active"); + $(".delete-apps-btn").addClass("disabled"); + } +}); /** * Get the MIME type for a given file extension. @@ -2402,105 +2676,131 @@ $(document).on('change', '.select-all-apps', function (e) { * @returns {string} The corresponding MIME type, or 'application/octet-stream' if not found. */ function getMimeType(extension) { - const mimeTypes = { - jpg: 'image/jpeg', - jpeg: 'image/jpeg', - png: 'image/png', - gif: 'image/gif', - bmp: 'image/bmp', - webp: 'image/webp', - svg: 'image/svg+xml', - tiff: 'image/tiff', - ico: 'image/x-icon' - }; - - // Remove leading dot if present and convert to lowercase - const cleanExtension = extension.replace(/^\./, '').toLowerCase(); - - // Return the MIME type if found, otherwise return 'application/octet-stream' - return mimeTypes[cleanExtension] || 'application/octet-stream'; + const mimeTypes = { + jpg: "image/jpeg", + jpeg: "image/jpeg", + png: "image/png", + gif: "image/gif", + bmp: "image/bmp", + webp: "image/webp", + svg: "image/svg+xml", + tiff: "image/tiff", + ico: "image/x-icon", + }; + + // Remove leading dot if present and convert to lowercase + const cleanExtension = extension.replace(/^\./, "").toLowerCase(); + + // Return the MIME type if found, otherwise return 'application/octet-stream' + return mimeTypes[cleanExtension] || "application/octet-stream"; } // if edit-app-maximize-on-start is checked, disable window size and position fields -$(document).on('change', '#edit-app-maximize-on-start', function (e) { - if ($(this).is(':checked')) { - $('#edit-app-window-width, #edit-app-window-height').prop('disabled', true); - $('#edit-app-window-top, #edit-app-window-left').prop('disabled', true); - } else { - $('#edit-app-window-width, #edit-app-window-height').prop('disabled', false); - $('#edit-app-window-top, #edit-app-window-left').prop('disabled', false); - } -}) +$(document).on("change", "#edit-app-maximize-on-start", function(e) { + if ($(this).is(":checked")) { + $("#edit-app-window-width, #edit-app-window-height").prop("disabled", true); + $("#edit-app-window-top, #edit-app-window-left").prop("disabled", true); + } else { + $("#edit-app-window-width, #edit-app-window-height").prop( + "disabled", + false + ); + $("#edit-app-window-top, #edit-app-window-left").prop("disabled", false); + } +}); -$(document).on('change', '#edit-app-background', function (e) { - if($('#edit-app-background').is(":checked")){ - disable_window_settings() - }else{ - enable_window_settings() - } -}) +$(document).on("change", "#edit-app-background", function(e) { + if ($("#edit-app-background").is(":checked")) { + disable_window_settings(); + } else { + enable_window_settings(); + } +}); -function disable_window_settings(){ - $('#edit-app-maximize-on-start').prop('disabled', true); - $('#edit-app-fullpage-on-landing').prop('disabled', true); - $('#edit-app-window-width, #edit-app-window-height').prop('disabled', true); - $('#edit-app-window-top, #edit-app-window-left').prop('disabled', true); - $('#edit-app-window-resizable').prop('disabled', true); - $('#edit-app-hide-titlebar').prop('disabled', true); +function disable_window_settings() { + $("#edit-app-maximize-on-start").prop("disabled", true); + $("#edit-app-fullpage-on-landing").prop("disabled", true); + $("#edit-app-window-width, #edit-app-window-height").prop("disabled", true); + $("#edit-app-window-top, #edit-app-window-left").prop("disabled", true); + $("#edit-app-window-resizable").prop("disabled", true); + $("#edit-app-hide-titlebar").prop("disabled", true); } -function enable_window_settings(){ - $('#edit-app-maximize-on-start').prop('disabled', false); - $('#edit-app-fullpage-on-landing').prop('disabled', false); - $('#edit-app-window-width, #edit-app-window-height').prop('disabled', false); - $('#edit-app-window-top, #edit-app-window-left').prop('disabled', false); - $('#edit-app-window-resizable').prop('disabled', false); - $('#edit-app-hide-titlebar').prop('disabled', false); +function enable_window_settings() { + $("#edit-app-maximize-on-start").prop("disabled", false); + $("#edit-app-fullpage-on-landing").prop("disabled", false); + $("#edit-app-window-width, #edit-app-window-height").prop("disabled", false); + $("#edit-app-window-top, #edit-app-window-left").prop("disabled", false); + $("#edit-app-window-resizable").prop("disabled", false); + $("#edit-app-hide-titlebar").prop("disabled", false); } -$(document).on('click', '.reset-deploy', function (e) { - reset_drop_area(); -}) +$(document).on("click", ".reset-deploy", function(e) { + reset_drop_area(); +}); -$(document).on('click', '.sidebar-toggle', function (e) { - $('.sidebar').toggleClass('open'); - $('body').toggleClass('sidebar-open'); -}) +$(document).on("click", ".sidebar-toggle", function(e) { + $(".sidebar").toggleClass("open"); + $("body").toggleClass("sidebar-open"); +}); async function initializeAssetsDirectory() { - try { - // Check if assets_url exists - const existingURL = await puter.kv.get('assets_url'); - if (!existingURL) { - // Create assets directory - const assetsDir = await puter.fs.mkdir( - `/${authUsername}/AppData/${dev_center_uid}/assets`, - { overwrite: false } - ); - - // Publish the directory - const hostname = `assets-${Math.random().toString(36).substring(2)}`; - const route = await puter.hosting.create(hostname, assetsDir.path); - - // Store the URL - await puter.kv.set('assets_url', `https://${hostname}.puter.site`); - } - } catch (err) { - console.error('Error initializing assets directory:', err); + try { + // Check if assets_url exists + const existingURL = await puter.kv.get("assets_url"); + if (!existingURL) { + // Create assets directory + const assetsDir = await puter.fs.mkdir( + `/${authUsername}/AppData/${dev_center_uid}/assets`, + { overwrite: false } + ); + + // Publish the directory + const hostname = `assets-${Math.random().toString(36).substring(2)}`; + const route = await puter.hosting.create(hostname, assetsDir.path); + + // Store the URL + await puter.kv.set("assets_url", `https://${hostname}.puter.site`); } + } catch (err) { + console.error("Error initializing assets directory:", err); + } } function generateSocialImageSection(app) { - return ` + return ` - Remove social image + Remove social image `; } +$(document).on("click", "#edit-app-social-image", async function(e) { + const res = await puter.ui.showOpenFilePicker({ + accept: "image/*", + }); + + const socialImage = await puter.fs.read(res.path); + // Convert blob to base64 for preview + const reader = new FileReader(); + reader.readAsDataURL(socialImage); + + reader.onloadend = function() { + let image = reader.result; + // Get file extension + let fileExtension = res.name.split(".").pop(); + // Get MIME type + let mimeType = getMimeType(fileExtension); + // Replace MIME type in the data URL + image = image.replace( + "data:application/octet-stream;base64", + `data:image/${mimeType};base64` + ); + $(document).on('click', '#edit-app-social-image', async function(e) { const res = await puter.ui.showOpenFilePicker({ @@ -2528,39 +2828,40 @@ $(document).on('click', '#edit-app-social-image', async function(e) { toggleSaveButton(); toggleResetButton(); } + }); -$(document).on('click', '#edit-app-social-image-delete', async function(e) { - $('#edit-app-social-image').css('background-image', ''); - $('#edit-app-social-image').removeAttr('data-url'); - $('#edit-app-social-image').removeAttr('data-base64'); - $('#edit-app-social-image-delete').hide(); +$(document).on("click", "#edit-app-social-image-delete", async function(e) { + $("#edit-app-social-image").css("background-image", ""); + $("#edit-app-social-image").removeAttr("data-url"); + $("#edit-app-social-image").removeAttr("data-base64"); + $("#edit-app-social-image-delete").hide(); }); async function handleSocialImageUpload(app_name, socialImageData) { - if (!socialImageData) return null; - - try { - const assets_url = await puter.kv.get('assets_url'); - if (!assets_url) throw new Error('Assets URL not found'); - - // Convert base64 to blob - const base64Response = await fetch(socialImageData); - const blob = await base64Response.blob(); - - // Get assets directory path - const assetsDir = `/${authUsername}/AppData/${dev_center_uid}/assets`; - - // Upload new image - await puter.fs.upload( - new File([blob], `${app_name}.png`, { type: 'image/png' }), - assetsDir, - { overwrite: true } - ); + if (!socialImageData) return null; - return `${assets_url}/${app_name}.png`; - } catch (err) { - console.error('Error uploading social image:', err); - throw err; - } + try { + const assets_url = await puter.kv.get("assets_url"); + if (!assets_url) throw new Error("Assets URL not found"); + + // Convert base64 to blob + const base64Response = await fetch(socialImageData); + const blob = await base64Response.blob(); + + // Get assets directory path + const assetsDir = `/${authUsername}/AppData/${dev_center_uid}/assets`; + + // Upload new image + await puter.fs.upload( + new File([blob], `${app_name}.png`, { type: "image/png" }), + assetsDir, + { overwrite: true } + ); + + return `${assets_url}/${app_name}.png`; + } catch (err) { + console.error("Error uploading social image:", err); + throw err; + } } diff --git a/src/dev-center/js/html-entities.js b/src/dev-center/js/html-entities.js index c233cb01ee..150e74d0b8 100644 --- a/src/dev-center/js/html-entities.js +++ b/src/dev-center/js/html-entities.js @@ -1 +1,4611 @@ -(()=>{"use strict";var r,e={563:function(r,e,a){var t=this&&this.__assign||function(){return(t=Object.assign||function(r){for(var e,a=1,t=arguments.length;a'"&]/g,nonAscii:/(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,nonAsciiPrintable:/(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,extensive:/(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g},n={mode:"specialChars",level:"all",numeric:"decimal"};e.encode=function(r,e){var a=void 0===(u=(c=void 0===e?n:e).mode)?"specialChars":u,t=void 0===(m=c.numeric)?"decimal":m,o=c.level;if(!r)return"";var c,u,p=i[a],d=s[void 0===o?"all":o].characters,g="hexadecimal"===t;if(p.lastIndex=0,c=p.exec(r)){u="";var m=0;do{m!==c.index&&(u+=r.substring(m,c.index));var f=d[o=c[0]];if(!f){var h=o.length>1?l.getCodePoint(o,0):o.charCodeAt(0);f=(g?"&#x"+h.toString(16):"&#"+h)+";"}u+=f,m=c.index+o.length}while(c=p.exec(r));m!==r.length&&(u+=r.substring(m))}else u=r;return u};var u={scope:"body",level:"all"},p=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g,d=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g,g={xml:{strict:p,attribute:d,body:o.bodyRegExps.xml},html4:{strict:p,attribute:d,body:o.bodyRegExps.html4},html5:{strict:p,attribute:d,body:o.bodyRegExps.html5}},m=t(t({},g),{all:g.html5}),f=String.fromCharCode,h=f(65533),b={level:"all"};e.decodeEntity=function(r,e){var a=void 0===(t=(void 0===e?b:e).level)?"all":t;if(!r)return"";var t=r,o=(r[r.length-1],s[a].entities[r]);if(o)t=o;else if("&"===r[0]&&"#"===r[1]){var i=r[2],n="x"==i||"X"==i?parseInt(r.substr(3),16):parseInt(r.substr(2));t=n>=1114111?h:n>65535?l.fromCodePoint(n):f(c.numericUnicodeMap[n]||n)}return t},e.decode=function(r,e){var a=void 0===e?u:e,t=a.level,o=void 0===t?"all":t,i=a.scope,n=void 0===i?"xml"===o?"strict":"body":i;if(!r)return"";var p=m[o][n],d=s[o].entities,g="attribute"===n,b="strict"===n;p.lastIndex=0;var v,q=p.exec(r);if(q){v="";var y=0;do{y!==q.index&&(v+=r.substring(y,q.index));var w=q[0],x=w,A=w[w.length-1];if(g&&"="===A)x=w;else if(b&&";"!==A)x=w;else{var E=d[w];if(E)x=E;else if("&"===w[0]&&"#"===w[1]){var D=w[2],k="x"==D||"X"==D?parseInt(w.substr(3),16):parseInt(w.substr(2));x=k>=1114111?h:k>65535?l.fromCodePoint(k):f(c.numericUnicodeMap[k]||k)}}v+=x,y=q.index+w.length}while(q=p.exec(r));y!==r.length&&(v+=r.substring(y))}else v=r;return v}},81:(r,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g},e.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©",ª:"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´",µ:"µ","¶":"¶","·":"·","¸":"¸","¹":"¹",º:"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿",À:"À",Á:"Á",Â:"Â",Ã:"Ã",Ä:"Ä",Å:"Å",Æ:"Æ",Ç:"Ç",È:"È",É:"É",Ê:"Ê",Ë:"Ë",Ì:"Ì",Í:"Í",Î:"Î",Ï:"Ï",Ð:"Ð",Ñ:"Ñ",Ò:"Ò",Ó:"Ó",Ô:"Ô",Õ:"Õ",Ö:"Ö","×":"×",Ø:"Ø",Ù:"Ù",Ú:"Ú",Û:"Û",Ü:"Ü",Ý:"Ý",Þ:"Þ",ß:"ß",à:"à",á:"á",â:"â",ã:"ã",ä:"ä",å:"å",æ:"æ",ç:"ç",è:"è",é:"é",ê:"ê",ë:"ë",ì:"ì",í:"í",î:"î",ï:"ï",ð:"ð",ñ:"ñ",ò:"ò",ó:"ó",ô:"ô",õ:"õ",ö:"ö","÷":"÷",ø:"ø",ù:"ù",ú:"ú",û:"û",ü:"ü",ý:"ý",þ:"þ",ÿ:"ÿ",'"':""","&":"&","<":"<",">":">",Œ:"Œ",œ:"œ",Š:"Š",š:"š",Ÿ:"Ÿ",ˆ:"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€",ƒ:"ƒ",Α:"Α",Β:"Β",Γ:"Γ",Δ:"Δ",Ε:"Ε",Ζ:"Ζ",Η:"Η",Θ:"Θ",Ι:"Ι",Κ:"Κ",Λ:"Λ",Μ:"Μ",Ν:"Ν",Ξ:"Ξ",Ο:"Ο",Π:"Π",Ρ:"Ρ",Σ:"Σ",Τ:"Τ",Υ:"Υ",Φ:"Φ",Χ:"Χ",Ψ:"Ψ",Ω:"Ω",α:"α",β:"β",γ:"γ",δ:"δ",ε:"ε",ζ:"ζ",η:"η",θ:"θ",ι:"ι",κ:"κ",λ:"λ",μ:"μ",ν:"ν",ξ:"ξ",ο:"ο",π:"π",ρ:"ρ",ς:"ς",σ:"σ",τ:"τ",υ:"υ",φ:"φ",χ:"χ",ψ:"ψ",ω:"ω",ϑ:"ϑ",ϒ:"ϒ",ϖ:"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄",℘:"℘",ℑ:"ℑ",ℜ:"ℜ","™":"™",ℵ:"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{Æ:"Æ","&":"&",Á:"Á",Ă:"Ă",Â:"Â",А:"А",𝔄:"𝔄",À:"À",Α:"Α",Ā:"Ā","⩓":"⩓",Ą:"Ą",𝔸:"𝔸","⁡":"⁡",Å:"Å",𝒜:"𝒜","≔":"≔",Ã:"Ã",Ä:"Ä","∖":"∖","⫧":"⫧","⌆":"⌆",Б:"Б","∵":"∵",ℬ:"ℬ",Β:"Β",𝔅:"𝔅",𝔹:"𝔹","˘":"˘","≎":"≎",Ч:"Ч","©":"©",Ć:"Ć","⋒":"⋒",ⅅ:"ⅅ",ℭ:"ℭ",Č:"Č",Ç:"Ç",Ĉ:"Ĉ","∰":"∰",Ċ:"Ċ","¸":"¸","·":"·",Χ:"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮",ℂ:"ℂ","∐":"∐","∳":"∳","⨯":"⨯",𝒞:"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑",Ђ:"Ђ",Ѕ:"Ѕ",Џ:"Џ","‡":"‡","↡":"↡","⫤":"⫤",Ď:"Ď",Д:"Д","∇":"∇",Δ:"Δ",𝔇:"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄",ⅆ:"ⅆ",𝔻:"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧",𝒟:"𝒟",Đ:"Đ",Ŋ:"Ŋ",Ð:"Ð",É:"É",Ě:"Ě",Ê:"Ê",Э:"Э",Ė:"Ė",𝔈:"𝔈",È:"È","∈":"∈",Ē:"Ē","◻":"◻","▫":"▫",Ę:"Ę",𝔼:"𝔼",Ε:"Ε","⩵":"⩵","≂":"≂","⇌":"⇌",ℰ:"ℰ","⩳":"⩳",Η:"Η",Ë:"Ë","∃":"∃",ⅇ:"ⅇ",Ф:"Ф",𝔉:"𝔉","◼":"◼","▪":"▪",𝔽:"𝔽","∀":"∀",ℱ:"ℱ",Ѓ:"Ѓ",">":">",Γ:"Γ",Ϝ:"Ϝ",Ğ:"Ğ",Ģ:"Ģ",Ĝ:"Ĝ",Г:"Г",Ġ:"Ġ",𝔊:"𝔊","⋙":"⋙",𝔾:"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳",𝒢:"𝒢","≫":"≫",Ъ:"Ъ",ˇ:"ˇ","^":"^",Ĥ:"Ĥ",ℌ:"ℌ",ℋ:"ℋ",ℍ:"ℍ","─":"─",Ħ:"Ħ","≏":"≏",Е:"Е",IJ:"IJ",Ё:"Ё",Í:"Í",Î:"Î",И:"И",İ:"İ",ℑ:"ℑ",Ì:"Ì",Ī:"Ī",ⅈ:"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢",Į:"Į",𝕀:"𝕀",Ι:"Ι",ℐ:"ℐ",Ĩ:"Ĩ",І:"І",Ï:"Ï",Ĵ:"Ĵ",Й:"Й",𝔍:"𝔍",𝕁:"𝕁",𝒥:"𝒥",Ј:"Ј",Є:"Є",Х:"Х",Ќ:"Ќ",Κ:"Κ",Ķ:"Ķ",К:"К",𝔎:"𝔎",𝕂:"𝕂",𝒦:"𝒦",Љ:"Љ","<":"<",Ĺ:"Ĺ",Λ:"Λ","⟪":"⟪",ℒ:"ℒ","↞":"↞",Ľ:"Ľ",Ļ:"Ļ",Л:"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲",𝔏:"𝔏","⋘":"⋘","⇚":"⇚",Ŀ:"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶",𝕃:"𝕃","↙":"↙","↘":"↘","↰":"↰",Ł:"Ł","≪":"≪","⤅":"⤅",М:"М"," ":" ",ℳ:"ℳ",𝔐:"𝔐","∓":"∓",𝕄:"𝕄",Μ:"Μ",Њ:"Њ",Ń:"Ń",Ň:"Ň",Ņ:"Ņ",Н:"Н","​":"​","\n":" ",𝔑:"𝔑","⁠":"⁠"," ":" ",ℕ:"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤",𝒩:"𝒩",Ñ:"Ñ",Ν:"Ν",Œ:"Œ",Ó:"Ó",Ô:"Ô",О:"О",Ő:"Ő",𝔒:"𝔒",Ò:"Ò",Ō:"Ō",Ω:"Ω",Ο:"Ο",𝕆:"𝕆","“":"“","‘":"‘","⩔":"⩔",𝒪:"𝒪",Ø:"Ø",Õ:"Õ","⨷":"⨷",Ö:"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂",П:"П",𝔓:"𝔓",Φ:"Φ",Π:"Π","±":"±",ℙ:"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝",𝒫:"𝒫",Ψ:"Ψ",'"':""",𝔔:"𝔔",ℚ:"ℚ",𝒬:"𝒬","⤐":"⤐","®":"®",Ŕ:"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖",Ř:"Ř",Ŗ:"Ŗ",Р:"Р",ℜ:"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯",Ρ:"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓",ℝ:"ℝ","⥰":"⥰","⇛":"⇛",ℛ:"ℛ","↱":"↱","⧴":"⧴",Щ:"Щ",Ш:"Ш",Ь:"Ь",Ś:"Ś","⪼":"⪼",Š:"Š",Ş:"Ş",Ŝ:"Ŝ",С:"С",𝔖:"𝔖","↑":"↑",Σ:"Σ","∘":"∘",𝕊:"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔",𝒮:"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇",Þ:"Þ","™":"™",Ћ:"Ћ",Ц:"Ц","\t":" ",Τ:"Τ",Ť:"Ť",Ţ:"Ţ",Т:"Т",𝔗:"𝔗","∴":"∴",Θ:"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈",𝕋:"𝕋","⃛":"⃛",𝒯:"𝒯",Ŧ:"Ŧ",Ú:"Ú","↟":"↟","⥉":"⥉",Ў:"Ў",Ŭ:"Ŭ",Û:"Û",У:"У",Ű:"Ű",𝔘:"𝔘",Ù:"Ù",Ū:"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎",Ų:"Ų",𝕌:"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗",ϒ:"ϒ",Υ:"Υ",Ů:"Ů",𝒰:"𝒰",Ũ:"Ũ",Ü:"Ü","⊫":"⊫","⫫":"⫫",В:"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ",𝔙:"𝔙",𝕍:"𝕍",𝒱:"𝒱","⊪":"⊪",Ŵ:"Ŵ","⋀":"⋀",𝔚:"𝔚",𝕎:"𝕎",𝒲:"𝒲",𝔛:"𝔛",Ξ:"Ξ",𝕏:"𝕏",𝒳:"𝒳",Я:"Я",Ї:"Ї",Ю:"Ю",Ý:"Ý",Ŷ:"Ŷ",Ы:"Ы",𝔜:"𝔜",𝕐:"𝕐",𝒴:"𝒴",Ÿ:"Ÿ",Ж:"Ж",Ź:"Ź",Ž:"Ž",З:"З",Ż:"Ż",Ζ:"Ζ",ℨ:"ℨ",ℤ:"ℤ",𝒵:"𝒵",á:"á",ă:"ă","∾":"∾","∾̳":"∾̳","∿":"∿",â:"â",а:"а",æ:"æ",𝔞:"𝔞",à:"à",ℵ:"ℵ",α:"α",ā:"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼",ą:"ą",𝕒:"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'",å:"å",𝒶:"𝒶","*":"*",ã:"ã",ä:"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶",б:"б","„":"„","⦰":"⦰",β:"β",ℶ:"ℶ","≬":"≬",𝔟:"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐",𝕓:"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦",𝒷:"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮",ć:"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍",č:"č",ç:"ç",ĉ:"ĉ","⩌":"⩌","⩐":"⩐",ċ:"ċ","⦲":"⦲","¢":"¢",𝔠:"𝔠",ч:"ч","✓":"✓",χ:"χ","○":"○","⧃":"⧃",ˆ:"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭",𝕔:"𝕔","℗":"℗","↵":"↵","✗":"✗",𝒸:"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†",ℸ:"ℸ","‐":"‐","⤏":"⤏",ď:"ď",д:"д","⇊":"⇊","⩷":"⩷","°":"°",δ:"δ","⦱":"⦱","⥿":"⥿",𝔡:"𝔡","♦":"♦",ϝ:"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇",ђ:"ђ","⌞":"⌞","⌍":"⌍",$:"$",𝕕:"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌",𝒹:"𝒹",ѕ:"ѕ","⧶":"⧶",đ:"đ","⋱":"⋱","▿":"▿","⦦":"⦦",џ:"џ","⟿":"⟿",é:"é","⩮":"⩮",ě:"ě","≖":"≖",ê:"ê","≕":"≕",э:"э",ė:"ė","≒":"≒",𝔢:"𝔢","⪚":"⪚",è:"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧",ℓ:"ℓ","⪕":"⪕","⪗":"⪗",ē:"ē","∅":"∅"," ":" "," ":" "," ":" ",ŋ:"ŋ"," ":" ",ę:"ę",𝕖:"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱",ε:"ε",ϵ:"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱",ℯ:"ℯ",η:"η",ð:"ð",ë:"ë","€":"€","!":"!",ф:"ф","♀":"♀",ffi:"ffi",ff:"ff",ffl:"ffl",𝔣:"𝔣",fi:"fi",fj:"fj","♭":"♭",fl:"fl","▱":"▱",ƒ:"ƒ",𝕗:"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢",𝒻:"𝒻","⪌":"⪌",ǵ:"ǵ",γ:"γ","⪆":"⪆",ğ:"ğ",ĝ:"ĝ",г:"г",ġ:"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔",𝔤:"𝔤",ℷ:"ℷ",ѓ:"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧",𝕘:"𝕘",ℊ:"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀",ъ:"ъ","⥈":"⥈","↭":"↭",ℏ:"ℏ",ĥ:"ĥ","♥":"♥","…":"…","⊹":"⊹",𝔥:"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪",𝕙:"𝕙","―":"―",𝒽:"𝒽",ħ:"ħ","⁃":"⁃",í:"í",î:"î",и:"и",е:"е","¡":"¡",𝔦:"𝔦",ì:"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩",ij:"ij",ī:"ī",ı:"ı","⊷":"⊷",Ƶ:"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼",ё:"ё",į:"į",𝕚:"𝕚",ι:"ι","¿":"¿",𝒾:"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳",ĩ:"ĩ",і:"і",ï:"ï",ĵ:"ĵ",й:"й",𝔧:"𝔧",ȷ:"ȷ",𝕛:"𝕛",𝒿:"𝒿",ј:"ј",є:"є",κ:"κ",ϰ:"ϰ",ķ:"ķ",к:"к",𝔨:"𝔨",ĸ:"ĸ",х:"х",ќ:"ќ",𝕜:"𝕜",𝓀:"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢",ĺ:"ĺ","⦴":"⦴",λ:"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍",ľ:"ľ",ļ:"ļ",л:"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼",𝔩:"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄",љ:"љ","⥫":"⥫","◺":"◺",ŀ:"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅",𝕝:"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹",𝓁:"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚",ł:"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩",м:"м","—":"—",𝔪:"𝔪","℧":"℧",µ:"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧",𝕞:"𝕞",𝓂:"𝓂",μ:"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮",ń:"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸",ʼn:"ʼn","♮":"♮","⩃":"⩃",ň:"ň",ņ:"ņ","⩭̸":"⩭̸","⩂":"⩂",н:"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨",𝔫:"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺",њ:"њ","≦̸":"≦̸","↚":"↚","‥":"‥",𝕟:"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸",𝓃:"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸",ñ:"ñ",ν:"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧",ó:"ó",ô:"ô",о:"о",ő:"ő","⨸":"⨸","⦼":"⦼",œ:"œ","⦿":"⦿",𝔬:"𝔬","˛":"˛",ò:"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀",ō:"ō",ω:"ω",ο:"ο","⦶":"⦶",𝕠:"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝",ℴ:"ℴ",ª:"ª",º:"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛",ø:"ø","⊘":"⊘",õ:"õ","⨶":"⨶",ö:"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽",п:"п","%":"%",".":".","‰":"‰","‱":"‱",𝔭:"𝔭",φ:"φ",ϕ:"ϕ","☎":"☎",π:"π",ϖ:"ϖ",ℎ:"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕",𝕡:"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰",𝓅:"𝓅",ψ:"ψ"," ":" ",𝔮:"𝔮",𝕢:"𝕢","⁗":"⁗",𝓆:"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱",ŕ:"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐",ř:"ř",ŗ:"ŗ",р:"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽",𝔯:"𝔯","⥬":"⥬",ρ:"ρ",ϱ:"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆",𝕣:"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›",𝓇:"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞",ś:"ś","⪴":"⪴","⪸":"⪸",š:"š",ş:"ş",ŝ:"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓",с:"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶",𝔰:"𝔰","♯":"♯",щ:"щ",ш:"ш","­":"­",σ:"σ",ς:"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀",ь:"ь","/":"/","⧄":"⧄","⌿":"⌿",𝕤:"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀",𝓈:"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪",ß:"ß","⌖":"⌖",τ:"τ",ť:"ť",ţ:"ţ",т:"т","⌕":"⌕",𝔱:"𝔱",θ:"θ",ϑ:"ϑ",þ:"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱",𝕥:"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢",𝓉:"𝓉",ц:"ц",ћ:"ћ",ŧ:"ŧ","⥣":"⥣",ú:"ú",ў:"ў",ŭ:"ŭ",û:"û",у:"у",ű:"ű","⥾":"⥾",𝔲:"𝔲",ù:"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸",ū:"ū",ų:"ų",𝕦:"𝕦",υ:"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎",ů:"ů","◹":"◹",𝓊:"𝓊","⋰":"⋰",ũ:"ũ",ü:"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀",в:"в","⊻":"⊻","≚":"≚","⋮":"⋮",𝔳:"𝔳",𝕧:"𝕧",𝓋:"𝓋","⦚":"⦚",ŵ:"ŵ","⩟":"⩟","≙":"≙",℘:"℘",𝔴:"𝔴",𝕨:"𝕨",𝓌:"𝓌",𝔵:"𝔵",ξ:"ξ","⋻":"⋻",𝕩:"𝕩",𝓍:"𝓍",ý:"ý",я:"я",ŷ:"ŷ",ы:"ы","¥":"¥",𝔶:"𝔶",ї:"ї",𝕪:"𝕪",𝓎:"𝓎",ю:"ю",ÿ:"ÿ",ź:"ź",ž:"ž",з:"з",ż:"ż",ζ:"ζ",𝔷:"𝔷",ж:"ж","⇝":"⇝",𝕫:"𝕫",𝓏:"𝓏","‍":"‍","‌":"‌"}}}},687:(r,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}},967:(r,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.fromCodePoint=String.fromCodePoint||function(r){return String.fromCharCode(Math.floor((r-65536)/1024)+55296,(r-65536)%1024+56320)},e.getCodePoint=String.prototype.codePointAt?function(r,e){return r.codePointAt(e)}:function(r,e){return 1024*(r.charCodeAt(e)-55296)+r.charCodeAt(e+1)-56320+65536},e.highSurrogateFrom=55296,e.highSurrogateTo=56319}},a={};function t(r){var o=a[r];if(void 0!==o)return o.exports;var c=a[r]={exports:{}};return e[r].call(c.exports,c,c.exports,t),c.exports}t.n=r=>{var e=r&&r.__esModule?()=>r.default:()=>r;return t.d(e,{a:e}),e},t.d=(r,e)=>{for(var a in e)t.o(e,a)&&!t.o(r,a)&&Object.defineProperty(r,a,{enumerable:!0,get:e[a]})},t.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),r=t(563),window.html_encode=r.encode,window.html_decode=r.decode})(); \ No newline at end of file +(() => { + "use strict"; + var r, + e = { + 563: function (r, e, a) { + var t = + (this && this.__assign) || + function () { + return (t = + Object.assign || + function (r) { + for (var e, a = 1, t = arguments.length; a < t; a++) + for (var o in (e = arguments[a])) + Object.prototype.hasOwnProperty.call(e, o) && (r[o] = e[o]); + return r; + }).apply(this, arguments); + }; + Object.defineProperty(e, "__esModule", { value: !0 }); + var o = a(81), + c = a(687), + l = a(967), + s = t(t({}, o.namedReferences), { all: o.namedReferences.html5 }), + i = { + specialChars: /[<>'"&]/g, + nonAscii: + /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + nonAsciiPrintable: + /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + extensive: + /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + }, + n = { mode: "specialChars", level: "all", numeric: "decimal" }; + e.encode = function (r, e) { + var a = + void 0 === (u = (c = void 0 === e ? n : e).mode) + ? "specialChars" + : u, + t = void 0 === (m = c.numeric) ? "decimal" : m, + o = c.level; + if (!r) return ""; + var c, + u, + p = i[a], + d = s[void 0 === o ? "all" : o].characters, + g = "hexadecimal" === t; + if (((p.lastIndex = 0), (c = p.exec(r)))) { + u = ""; + var m = 0; + do { + m !== c.index && (u += r.substring(m, c.index)); + var f = d[(o = c[0])]; + if (!f) { + var h = o.length > 1 ? l.getCodePoint(o, 0) : o.charCodeAt(0); + f = (g ? "&#x" + h.toString(16) : "&#" + h) + ";"; + } + (u += f), (m = c.index + o.length); + } while ((c = p.exec(r))); + m !== r.length && (u += r.substring(m)); + } else u = r; + return u; + }; + var u = { scope: "body", level: "all" }, + p = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g, + d = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g, + g = { + xml: { strict: p, attribute: d, body: o.bodyRegExps.xml }, + html4: { strict: p, attribute: d, body: o.bodyRegExps.html4 }, + html5: { strict: p, attribute: d, body: o.bodyRegExps.html5 }, + }, + m = t(t({}, g), { all: g.html5 }), + f = String.fromCharCode, + h = f(65533), + b = { level: "all" }; + (e.decodeEntity = function (r, e) { + var a = void 0 === (t = (void 0 === e ? b : e).level) ? "all" : t; + if (!r) return ""; + var t = r, + o = (r[r.length - 1], s[a].entities[r]); + if (o) t = o; + else if ("&" === r[0] && "#" === r[1]) { + var i = r[2], + n = + "x" == i || "X" == i + ? parseInt(r.substr(3), 16) + : parseInt(r.substr(2)); + t = + n >= 1114111 + ? h + : n > 65535 + ? l.fromCodePoint(n) + : f(c.numericUnicodeMap[n] || n); + } + return t; + }), + (e.decode = function (r, e) { + var a = void 0 === e ? u : e, + t = a.level, + o = void 0 === t ? "all" : t, + i = a.scope, + n = void 0 === i ? ("xml" === o ? "strict" : "body") : i; + if (!r) return ""; + var p = m[o][n], + d = s[o].entities, + g = "attribute" === n, + b = "strict" === n; + p.lastIndex = 0; + var v, + q = p.exec(r); + if (q) { + v = ""; + var y = 0; + do { + y !== q.index && (v += r.substring(y, q.index)); + var w = q[0], + x = w, + A = w[w.length - 1]; + if (g && "=" === A) x = w; + else if (b && ";" !== A) x = w; + else { + var E = d[w]; + if (E) x = E; + else if ("&" === w[0] && "#" === w[1]) { + var D = w[2], + k = + "x" == D || "X" == D + ? parseInt(w.substr(3), 16) + : parseInt(w.substr(2)); + x = + k >= 1114111 + ? h + : k > 65535 + ? l.fromCodePoint(k) + : f(c.numericUnicodeMap[k] || k); + } + } + (v += x), (y = q.index + w.length); + } while ((q = p.exec(r))); + y !== r.length && (v += r.substring(y)); + } else v = r; + return v; + }); + }, + 81: (r, e) => { + Object.defineProperty(e, "__esModule", { value: !0 }), + (e.bodyRegExps = { + xml: /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, + html4: + /&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, + html5: + /&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, + }), + (e.namedReferences = { + xml: { + entities: { + "<": "<", + ">": ">", + """: '"', + "'": "'", + "&": "&", + }, + characters: { + "<": "<", + ">": ">", + '"': """, + "'": "'", + "&": "&", + }, + }, + html4: { + entities: { + "'": "'", + " ": " ", + " ": " ", + "¡": "¡", + "¡": "¡", + "¢": "¢", + "¢": "¢", + "£": "£", + "£": "£", + "¤": "¤", + "¤": "¤", + "¥": "¥", + "¥": "¥", + "¦": "¦", + "¦": "¦", + "§": "§", + "§": "§", + "¨": "¨", + "¨": "¨", + "©": "©", + "©": "©", + "ª": "ª", + "ª": "ª", + "«": "«", + "«": "«", + "¬": "¬", + "¬": "¬", + "­": "­", + "­": "­", + "®": "®", + "®": "®", + "¯": "¯", + "¯": "¯", + "°": "°", + "°": "°", + "±": "±", + "±": "±", + "²": "²", + "²": "²", + "³": "³", + "³": "³", + "´": "´", + "´": "´", + "µ": "µ", + "µ": "µ", + "¶": "¶", + "¶": "¶", + "·": "·", + "·": "·", + "¸": "¸", + "¸": "¸", + "¹": "¹", + "¹": "¹", + "º": "º", + "º": "º", + "»": "»", + "»": "»", + "¼": "¼", + "¼": "¼", + "½": "½", + "½": "½", + "¾": "¾", + "¾": "¾", + "¿": "¿", + "¿": "¿", + "À": "À", + "À": "À", + "Á": "Á", + "Á": "Á", + "Â": "Â", + "Â": "Â", + "Ã": "Ã", + "Ã": "Ã", + "Ä": "Ä", + "Ä": "Ä", + "Å": "Å", + "Å": "Å", + "Æ": "Æ", + "Æ": "Æ", + "Ç": "Ç", + "Ç": "Ç", + "È": "È", + "È": "È", + "É": "É", + "É": "É", + "Ê": "Ê", + "Ê": "Ê", + "Ë": "Ë", + "Ë": "Ë", + "Ì": "Ì", + "Ì": "Ì", + "Í": "Í", + "Í": "Í", + "Î": "Î", + "Î": "Î", + "Ï": "Ï", + "Ï": "Ï", + "Ð": "Ð", + "Ð": "Ð", + "Ñ": "Ñ", + "Ñ": "Ñ", + "Ò": "Ò", + "Ò": "Ò", + "Ó": "Ó", + "Ó": "Ó", + "Ô": "Ô", + "Ô": "Ô", + "Õ": "Õ", + "Õ": "Õ", + "Ö": "Ö", + "Ö": "Ö", + "×": "×", + "×": "×", + "Ø": "Ø", + "Ø": "Ø", + "Ù": "Ù", + "Ù": "Ù", + "Ú": "Ú", + "Ú": "Ú", + "Û": "Û", + "Û": "Û", + "Ü": "Ü", + "Ü": "Ü", + "Ý": "Ý", + "Ý": "Ý", + "Þ": "Þ", + "Þ": "Þ", + "ß": "ß", + "ß": "ß", + "à": "à", + "à": "à", + "á": "á", + "á": "á", + "â": "â", + "â": "â", + "ã": "ã", + "ã": "ã", + "ä": "ä", + "ä": "ä", + "å": "å", + "å": "å", + "æ": "æ", + "æ": "æ", + "ç": "ç", + "ç": "ç", + "è": "è", + "è": "è", + "é": "é", + "é": "é", + "ê": "ê", + "ê": "ê", + "ë": "ë", + "ë": "ë", + "ì": "ì", + "ì": "ì", + "í": "í", + "í": "í", + "î": "î", + "î": "î", + "ï": "ï", + "ï": "ï", + "ð": "ð", + "ð": "ð", + "ñ": "ñ", + "ñ": "ñ", + "ò": "ò", + "ò": "ò", + "ó": "ó", + "ó": "ó", + "ô": "ô", + "ô": "ô", + "õ": "õ", + "õ": "õ", + "ö": "ö", + "ö": "ö", + "÷": "÷", + "÷": "÷", + "ø": "ø", + "ø": "ø", + "ù": "ù", + "ù": "ù", + "ú": "ú", + "ú": "ú", + "û": "û", + "û": "û", + "ü": "ü", + "ü": "ü", + "ý": "ý", + "ý": "ý", + "þ": "þ", + "þ": "þ", + "ÿ": "ÿ", + "ÿ": "ÿ", + """: '"', + """: '"', + "&": "&", + "&": "&", + "<": "<", + "<": "<", + ">": ">", + ">": ">", + "Œ": "Œ", + "œ": "œ", + "Š": "Š", + "š": "š", + "Ÿ": "Ÿ", + "ˆ": "ˆ", + "˜": "˜", + " ": " ", + " ": " ", + " ": " ", + "‌": "‌", + "‍": "‍", + "‎": "‎", + "‏": "‏", + "–": "–", + "—": "—", + "‘": "‘", + "’": "’", + "‚": "‚", + "“": "“", + "”": "”", + "„": "„", + "†": "†", + "‡": "‡", + "‰": "‰", + "‹": "‹", + "›": "›", + "€": "€", + "ƒ": "ƒ", + "Α": "Α", + "Β": "Β", + "Γ": "Γ", + "Δ": "Δ", + "Ε": "Ε", + "Ζ": "Ζ", + "Η": "Η", + "Θ": "Θ", + "Ι": "Ι", + "Κ": "Κ", + "Λ": "Λ", + "Μ": "Μ", + "Ν": "Ν", + "Ξ": "Ξ", + "Ο": "Ο", + "Π": "Π", + "Ρ": "Ρ", + "Σ": "Σ", + "Τ": "Τ", + "Υ": "Υ", + "Φ": "Φ", + "Χ": "Χ", + "Ψ": "Ψ", + "Ω": "Ω", + "α": "α", + "β": "β", + "γ": "γ", + "δ": "δ", + "ε": "ε", + "ζ": "ζ", + "η": "η", + "θ": "θ", + "ι": "ι", + "κ": "κ", + "λ": "λ", + "μ": "μ", + "ν": "ν", + "ξ": "ξ", + "ο": "ο", + "π": "π", + "ρ": "ρ", + "ς": "ς", + "σ": "σ", + "τ": "τ", + "υ": "υ", + "φ": "φ", + "χ": "χ", + "ψ": "ψ", + "ω": "ω", + "ϑ": "ϑ", + "ϒ": "ϒ", + "ϖ": "ϖ", + "•": "•", + "…": "…", + "′": "′", + "″": "″", + "‾": "‾", + "⁄": "⁄", + "℘": "℘", + "ℑ": "ℑ", + "ℜ": "ℜ", + "™": "™", + "ℵ": "ℵ", + "←": "←", + "↑": "↑", + "→": "→", + "↓": "↓", + "↔": "↔", + "↵": "↵", + "⇐": "⇐", + "⇑": "⇑", + "⇒": "⇒", + "⇓": "⇓", + "⇔": "⇔", + "∀": "∀", + "∂": "∂", + "∃": "∃", + "∅": "∅", + "∇": "∇", + "∈": "∈", + "∉": "∉", + "∋": "∋", + "∏": "∏", + "∑": "∑", + "−": "−", + "∗": "∗", + "√": "√", + "∝": "∝", + "∞": "∞", + "∠": "∠", + "∧": "∧", + "∨": "∨", + "∩": "∩", + "∪": "∪", + "∫": "∫", + "∴": "∴", + "∼": "∼", + "≅": "≅", + "≈": "≈", + "≠": "≠", + "≡": "≡", + "≤": "≤", + "≥": "≥", + "⊂": "⊂", + "⊃": "⊃", + "⊄": "⊄", + "⊆": "⊆", + "⊇": "⊇", + "⊕": "⊕", + "⊗": "⊗", + "⊥": "⊥", + "⋅": "⋅", + "⌈": "⌈", + "⌉": "⌉", + "⌊": "⌊", + "⌋": "⌋", + "⟨": "〈", + "⟩": "〉", + "◊": "◊", + "♠": "♠", + "♣": "♣", + "♥": "♥", + "♦": "♦", + }, + characters: { + "'": "'", + " ": " ", + "¡": "¡", + "¢": "¢", + "£": "£", + "¤": "¤", + "¥": "¥", + "¦": "¦", + "§": "§", + "¨": "¨", + "©": "©", + ª: "ª", + "«": "«", + "¬": "¬", + "­": "­", + "®": "®", + "¯": "¯", + "°": "°", + "±": "±", + "²": "²", + "³": "³", + "´": "´", + µ: "µ", + "¶": "¶", + "·": "·", + "¸": "¸", + "¹": "¹", + º: "º", + "»": "»", + "¼": "¼", + "½": "½", + "¾": "¾", + "¿": "¿", + À: "À", + Á: "Á", + Â: "Â", + Ã: "Ã", + Ä: "Ä", + Å: "Å", + Æ: "Æ", + Ç: "Ç", + È: "È", + É: "É", + Ê: "Ê", + Ë: "Ë", + Ì: "Ì", + Í: "Í", + Î: "Î", + Ï: "Ï", + Ð: "Ð", + Ñ: "Ñ", + Ò: "Ò", + Ó: "Ó", + Ô: "Ô", + Õ: "Õ", + Ö: "Ö", + "×": "×", + Ø: "Ø", + Ù: "Ù", + Ú: "Ú", + Û: "Û", + Ü: "Ü", + Ý: "Ý", + Þ: "Þ", + ß: "ß", + à: "à", + á: "á", + â: "â", + ã: "ã", + ä: "ä", + å: "å", + æ: "æ", + ç: "ç", + è: "è", + é: "é", + ê: "ê", + ë: "ë", + ì: "ì", + í: "í", + î: "î", + ï: "ï", + ð: "ð", + ñ: "ñ", + ò: "ò", + ó: "ó", + ô: "ô", + õ: "õ", + ö: "ö", + "÷": "÷", + ø: "ø", + ù: "ù", + ú: "ú", + û: "û", + ü: "ü", + ý: "ý", + þ: "þ", + ÿ: "ÿ", + '"': """, + "&": "&", + "<": "<", + ">": ">", + Œ: "Œ", + œ: "œ", + Š: "Š", + š: "š", + Ÿ: "Ÿ", + ˆ: "ˆ", + "˜": "˜", + " ": " ", + " ": " ", + " ": " ", + "‌": "‌", + "‍": "‍", + "‎": "‎", + "‏": "‏", + "–": "–", + "—": "—", + "‘": "‘", + "’": "’", + "‚": "‚", + "“": "“", + "”": "”", + "„": "„", + "†": "†", + "‡": "‡", + "‰": "‰", + "‹": "‹", + "›": "›", + "€": "€", + ƒ: "ƒ", + Α: "Α", + Β: "Β", + Γ: "Γ", + Δ: "Δ", + Ε: "Ε", + Ζ: "Ζ", + Η: "Η", + Θ: "Θ", + Ι: "Ι", + Κ: "Κ", + Λ: "Λ", + Μ: "Μ", + Ν: "Ν", + Ξ: "Ξ", + Ο: "Ο", + Π: "Π", + Ρ: "Ρ", + Σ: "Σ", + Τ: "Τ", + Υ: "Υ", + Φ: "Φ", + Χ: "Χ", + Ψ: "Ψ", + Ω: "Ω", + α: "α", + β: "β", + γ: "γ", + δ: "δ", + ε: "ε", + ζ: "ζ", + η: "η", + θ: "θ", + ι: "ι", + κ: "κ", + λ: "λ", + μ: "μ", + ν: "ν", + ξ: "ξ", + ο: "ο", + π: "π", + ρ: "ρ", + ς: "ς", + σ: "σ", + τ: "τ", + υ: "υ", + φ: "φ", + χ: "χ", + ψ: "ψ", + ω: "ω", + ϑ: "ϑ", + ϒ: "ϒ", + ϖ: "ϖ", + "•": "•", + "…": "…", + "′": "′", + "″": "″", + "‾": "‾", + "⁄": "⁄", + ℘: "℘", + ℑ: "ℑ", + ℜ: "ℜ", + "™": "™", + ℵ: "ℵ", + "←": "←", + "↑": "↑", + "→": "→", + "↓": "↓", + "↔": "↔", + "↵": "↵", + "⇐": "⇐", + "⇑": "⇑", + "⇒": "⇒", + "⇓": "⇓", + "⇔": "⇔", + "∀": "∀", + "∂": "∂", + "∃": "∃", + "∅": "∅", + "∇": "∇", + "∈": "∈", + "∉": "∉", + "∋": "∋", + "∏": "∏", + "∑": "∑", + "−": "−", + "∗": "∗", + "√": "√", + "∝": "∝", + "∞": "∞", + "∠": "∠", + "∧": "∧", + "∨": "∨", + "∩": "∩", + "∪": "∪", + "∫": "∫", + "∴": "∴", + "∼": "∼", + "≅": "≅", + "≈": "≈", + "≠": "≠", + "≡": "≡", + "≤": "≤", + "≥": "≥", + "⊂": "⊂", + "⊃": "⊃", + "⊄": "⊄", + "⊆": "⊆", + "⊇": "⊇", + "⊕": "⊕", + "⊗": "⊗", + "⊥": "⊥", + "⋅": "⋅", + "⌈": "⌈", + "⌉": "⌉", + "⌊": "⌊", + "⌋": "⌋", + "〈": "⟨", + "〉": "⟩", + "◊": "◊", + "♠": "♠", + "♣": "♣", + "♥": "♥", + "♦": "♦", + }, + }, + html5: { + entities: { + "Æ": "Æ", + "Æ": "Æ", + "&": "&", + "&": "&", + "Á": "Á", + "Á": "Á", + "Ă": "Ă", + "Â": "Â", + "Â": "Â", + "А": "А", + "𝔄": "𝔄", + "À": "À", + "À": "À", + "Α": "Α", + "Ā": "Ā", + "⩓": "⩓", + "Ą": "Ą", + "𝔸": "𝔸", + "⁡": "⁡", + "Å": "Å", + "Å": "Å", + "𝒜": "𝒜", + "≔": "≔", + "Ã": "Ã", + "Ã": "Ã", + "Ä": "Ä", + "Ä": "Ä", + "∖": "∖", + "⫧": "⫧", + "⌆": "⌆", + "Б": "Б", + "∵": "∵", + "ℬ": "ℬ", + "Β": "Β", + "𝔅": "𝔅", + "𝔹": "𝔹", + "˘": "˘", + "ℬ": "ℬ", + "≎": "≎", + "Ч": "Ч", + "©": "©", + "©": "©", + "Ć": "Ć", + "⋒": "⋒", + "ⅅ": "ⅅ", + "ℭ": "ℭ", + "Č": "Č", + "Ç": "Ç", + "Ç": "Ç", + "Ĉ": "Ĉ", + "∰": "∰", + "Ċ": "Ċ", + "¸": "¸", + "·": "·", + "ℭ": "ℭ", + "Χ": "Χ", + "⊙": "⊙", + "⊖": "⊖", + "⊕": "⊕", + "⊗": "⊗", + "∲": "∲", + "”": "”", + "’": "’", + "∷": "∷", + "⩴": "⩴", + "≡": "≡", + "∯": "∯", + "∮": "∮", + "ℂ": "ℂ", + "∐": "∐", + "∳": "∳", + "⨯": "⨯", + "𝒞": "𝒞", + "⋓": "⋓", + "≍": "≍", + "ⅅ": "ⅅ", + "⤑": "⤑", + "Ђ": "Ђ", + "Ѕ": "Ѕ", + "Џ": "Џ", + "‡": "‡", + "↡": "↡", + "⫤": "⫤", + "Ď": "Ď", + "Д": "Д", + "∇": "∇", + "Δ": "Δ", + "𝔇": "𝔇", + "´": "´", + "˙": "˙", + "˝": "˝", + "`": "`", + "˜": "˜", + "⋄": "⋄", + "ⅆ": "ⅆ", + "𝔻": "𝔻", + "¨": "¨", + "⃜": "⃜", + "≐": "≐", + "∯": "∯", + "¨": "¨", + "⇓": "⇓", + "⇐": "⇐", + "⇔": "⇔", + "⫤": "⫤", + "⟸": "⟸", + "⟺": "⟺", + "⟹": "⟹", + "⇒": "⇒", + "⊨": "⊨", + "⇑": "⇑", + "⇕": "⇕", + "∥": "∥", + "↓": "↓", + "⤓": "⤓", + "⇵": "⇵", + "̑": "̑", + "⥐": "⥐", + "⥞": "⥞", + "↽": "↽", + "⥖": "⥖", + "⥟": "⥟", + "⇁": "⇁", + "⥗": "⥗", + "⊤": "⊤", + "↧": "↧", + "⇓": "⇓", + "𝒟": "𝒟", + "Đ": "Đ", + "Ŋ": "Ŋ", + "Ð": "Ð", + "Ð": "Ð", + "É": "É", + "É": "É", + "Ě": "Ě", + "Ê": "Ê", + "Ê": "Ê", + "Э": "Э", + "Ė": "Ė", + "𝔈": "𝔈", + "È": "È", + "È": "È", + "∈": "∈", + "Ē": "Ē", + "◻": "◻", + "▫": "▫", + "Ę": "Ę", + "𝔼": "𝔼", + "Ε": "Ε", + "⩵": "⩵", + "≂": "≂", + "⇌": "⇌", + "ℰ": "ℰ", + "⩳": "⩳", + "Η": "Η", + "Ë": "Ë", + "Ë": "Ë", + "∃": "∃", + "ⅇ": "ⅇ", + "Ф": "Ф", + "𝔉": "𝔉", + "◼": "◼", + "▪": "▪", + "𝔽": "𝔽", + "∀": "∀", + "ℱ": "ℱ", + "ℱ": "ℱ", + "Ѓ": "Ѓ", + ">": ">", + ">": ">", + "Γ": "Γ", + "Ϝ": "Ϝ", + "Ğ": "Ğ", + "Ģ": "Ģ", + "Ĝ": "Ĝ", + "Г": "Г", + "Ġ": "Ġ", + "𝔊": "𝔊", + "⋙": "⋙", + "𝔾": "𝔾", + "≥": "≥", + "⋛": "⋛", + "≧": "≧", + "⪢": "⪢", + "≷": "≷", + "⩾": "⩾", + "≳": "≳", + "𝒢": "𝒢", + "≫": "≫", + "Ъ": "Ъ", + "ˇ": "ˇ", + "^": "^", + "Ĥ": "Ĥ", + "ℌ": "ℌ", + "ℋ": "ℋ", + "ℍ": "ℍ", + "─": "─", + "ℋ": "ℋ", + "Ħ": "Ħ", + "≎": "≎", + "≏": "≏", + "Е": "Е", + "IJ": "IJ", + "Ё": "Ё", + "Í": "Í", + "Í": "Í", + "Î": "Î", + "Î": "Î", + "И": "И", + "İ": "İ", + "ℑ": "ℑ", + "Ì": "Ì", + "Ì": "Ì", + "ℑ": "ℑ", + "Ī": "Ī", + "ⅈ": "ⅈ", + "⇒": "⇒", + "∬": "∬", + "∫": "∫", + "⋂": "⋂", + "⁣": "⁣", + "⁢": "⁢", + "Į": "Į", + "𝕀": "𝕀", + "Ι": "Ι", + "ℐ": "ℐ", + "Ĩ": "Ĩ", + "І": "І", + "Ï": "Ï", + "Ï": "Ï", + "Ĵ": "Ĵ", + "Й": "Й", + "𝔍": "𝔍", + "𝕁": "𝕁", + "𝒥": "𝒥", + "Ј": "Ј", + "Є": "Є", + "Х": "Х", + "Ќ": "Ќ", + "Κ": "Κ", + "Ķ": "Ķ", + "К": "К", + "𝔎": "𝔎", + "𝕂": "𝕂", + "𝒦": "𝒦", + "Љ": "Љ", + "<": "<", + "<": "<", + "Ĺ": "Ĺ", + "Λ": "Λ", + "⟪": "⟪", + "ℒ": "ℒ", + "↞": "↞", + "Ľ": "Ľ", + "Ļ": "Ļ", + "Л": "Л", + "⟨": "⟨", + "←": "←", + "⇤": "⇤", + "⇆": "⇆", + "⌈": "⌈", + "⟦": "⟦", + "⥡": "⥡", + "⇃": "⇃", + "⥙": "⥙", + "⌊": "⌊", + "↔": "↔", + "⥎": "⥎", + "⊣": "⊣", + "↤": "↤", + "⥚": "⥚", + "⊲": "⊲", + "⧏": "⧏", + "⊴": "⊴", + "⥑": "⥑", + "⥠": "⥠", + "↿": "↿", + "⥘": "⥘", + "↼": "↼", + "⥒": "⥒", + "⇐": "⇐", + "⇔": "⇔", + "⋚": "⋚", + "≦": "≦", + "≶": "≶", + "⪡": "⪡", + "⩽": "⩽", + "≲": "≲", + "𝔏": "𝔏", + "⋘": "⋘", + "⇚": "⇚", + "Ŀ": "Ŀ", + "⟵": "⟵", + "⟷": "⟷", + "⟶": "⟶", + "⟸": "⟸", + "⟺": "⟺", + "⟹": "⟹", + "𝕃": "𝕃", + "↙": "↙", + "↘": "↘", + "ℒ": "ℒ", + "↰": "↰", + "Ł": "Ł", + "≪": "≪", + "⤅": "⤅", + "М": "М", + " ": " ", + "ℳ": "ℳ", + "𝔐": "𝔐", + "∓": "∓", + "𝕄": "𝕄", + "ℳ": "ℳ", + "Μ": "Μ", + "Њ": "Њ", + "Ń": "Ń", + "Ň": "Ň", + "Ņ": "Ņ", + "Н": "Н", + "​": "​", + "​": "​", + "​": "​", + "​": "​", + "≫": "≫", + "≪": "≪", + " ": "\n", + "𝔑": "𝔑", + "⁠": "⁠", + " ": " ", + "ℕ": "ℕ", + "⫬": "⫬", + "≢": "≢", + "≭": "≭", + "∦": "∦", + "∉": "∉", + "≠": "≠", + "≂̸": "≂̸", + "∄": "∄", + "≯": "≯", + "≱": "≱", + "≧̸": "≧̸", + "≫̸": "≫̸", + "≹": "≹", + "⩾̸": "⩾̸", + "≵": "≵", + "≎̸": "≎̸", + "≏̸": "≏̸", + "⋪": "⋪", + "⧏̸": "⧏̸", + "⋬": "⋬", + "≮": "≮", + "≰": "≰", + "≸": "≸", + "≪̸": "≪̸", + "⩽̸": "⩽̸", + "≴": "≴", + "⪢̸": "⪢̸", + "⪡̸": "⪡̸", + "⊀": "⊀", + "⪯̸": "⪯̸", + "⋠": "⋠", + "∌": "∌", + "⋫": "⋫", + "⧐̸": "⧐̸", + "⋭": "⋭", + "⊏̸": "⊏̸", + "⋢": "⋢", + "⊐̸": "⊐̸", + "⋣": "⋣", + "⊂⃒": "⊂⃒", + "⊈": "⊈", + "⊁": "⊁", + "⪰̸": "⪰̸", + "⋡": "⋡", + "≿̸": "≿̸", + "⊃⃒": "⊃⃒", + "⊉": "⊉", + "≁": "≁", + "≄": "≄", + "≇": "≇", + "≉": "≉", + "∤": "∤", + "𝒩": "𝒩", + "Ñ": "Ñ", + "Ñ": "Ñ", + "Ν": "Ν", + "Œ": "Œ", + "Ó": "Ó", + "Ó": "Ó", + "Ô": "Ô", + "Ô": "Ô", + "О": "О", + "Ő": "Ő", + "𝔒": "𝔒", + "Ò": "Ò", + "Ò": "Ò", + "Ō": "Ō", + "Ω": "Ω", + "Ο": "Ο", + "𝕆": "𝕆", + "“": "“", + "‘": "‘", + "⩔": "⩔", + "𝒪": "𝒪", + "Ø": "Ø", + "Ø": "Ø", + "Õ": "Õ", + "Õ": "Õ", + "⨷": "⨷", + "Ö": "Ö", + "Ö": "Ö", + "‾": "‾", + "⏞": "⏞", + "⎴": "⎴", + "⏜": "⏜", + "∂": "∂", + "П": "П", + "𝔓": "𝔓", + "Φ": "Φ", + "Π": "Π", + "±": "±", + "ℌ": "ℌ", + "ℙ": "ℙ", + "⪻": "⪻", + "≺": "≺", + "⪯": "⪯", + "≼": "≼", + "≾": "≾", + "″": "″", + "∏": "∏", + "∷": "∷", + "∝": "∝", + "𝒫": "𝒫", + "Ψ": "Ψ", + """: '"', + """: '"', + "𝔔": "𝔔", + "ℚ": "ℚ", + "𝒬": "𝒬", + "⤐": "⤐", + "®": "®", + "®": "®", + "Ŕ": "Ŕ", + "⟫": "⟫", + "↠": "↠", + "⤖": "⤖", + "Ř": "Ř", + "Ŗ": "Ŗ", + "Р": "Р", + "ℜ": "ℜ", + "∋": "∋", + "⇋": "⇋", + "⥯": "⥯", + "ℜ": "ℜ", + "Ρ": "Ρ", + "⟩": "⟩", + "→": "→", + "⇥": "⇥", + "⇄": "⇄", + "⌉": "⌉", + "⟧": "⟧", + "⥝": "⥝", + "⇂": "⇂", + "⥕": "⥕", + "⌋": "⌋", + "⊢": "⊢", + "↦": "↦", + "⥛": "⥛", + "⊳": "⊳", + "⧐": "⧐", + "⊵": "⊵", + "⥏": "⥏", + "⥜": "⥜", + "↾": "↾", + "⥔": "⥔", + "⇀": "⇀", + "⥓": "⥓", + "⇒": "⇒", + "ℝ": "ℝ", + "⥰": "⥰", + "⇛": "⇛", + "ℛ": "ℛ", + "↱": "↱", + "⧴": "⧴", + "Щ": "Щ", + "Ш": "Ш", + "Ь": "Ь", + "Ś": "Ś", + "⪼": "⪼", + "Š": "Š", + "Ş": "Ş", + "Ŝ": "Ŝ", + "С": "С", + "𝔖": "𝔖", + "↓": "↓", + "←": "←", + "→": "→", + "↑": "↑", + "Σ": "Σ", + "∘": "∘", + "𝕊": "𝕊", + "√": "√", + "□": "□", + "⊓": "⊓", + "⊏": "⊏", + "⊑": "⊑", + "⊐": "⊐", + "⊒": "⊒", + "⊔": "⊔", + "𝒮": "𝒮", + "⋆": "⋆", + "⋐": "⋐", + "⋐": "⋐", + "⊆": "⊆", + "≻": "≻", + "⪰": "⪰", + "≽": "≽", + "≿": "≿", + "∋": "∋", + "∑": "∑", + "⋑": "⋑", + "⊃": "⊃", + "⊇": "⊇", + "⋑": "⋑", + "Þ": "Þ", + "Þ": "Þ", + "™": "™", + "Ћ": "Ћ", + "Ц": "Ц", + " ": "\t", + "Τ": "Τ", + "Ť": "Ť", + "Ţ": "Ţ", + "Т": "Т", + "𝔗": "𝔗", + "∴": "∴", + "Θ": "Θ", + "  ": "  ", + " ": " ", + "∼": "∼", + "≃": "≃", + "≅": "≅", + "≈": "≈", + "𝕋": "𝕋", + "⃛": "⃛", + "𝒯": "𝒯", + "Ŧ": "Ŧ", + "Ú": "Ú", + "Ú": "Ú", + "↟": "↟", + "⥉": "⥉", + "Ў": "Ў", + "Ŭ": "Ŭ", + "Û": "Û", + "Û": "Û", + "У": "У", + "Ű": "Ű", + "𝔘": "𝔘", + "Ù": "Ù", + "Ù": "Ù", + "Ū": "Ū", + "_": "_", + "⏟": "⏟", + "⎵": "⎵", + "⏝": "⏝", + "⋃": "⋃", + "⊎": "⊎", + "Ų": "Ų", + "𝕌": "𝕌", + "↑": "↑", + "⤒": "⤒", + "⇅": "⇅", + "↕": "↕", + "⥮": "⥮", + "⊥": "⊥", + "↥": "↥", + "⇑": "⇑", + "⇕": "⇕", + "↖": "↖", + "↗": "↗", + "ϒ": "ϒ", + "Υ": "Υ", + "Ů": "Ů", + "𝒰": "𝒰", + "Ũ": "Ũ", + "Ü": "Ü", + "Ü": "Ü", + "⊫": "⊫", + "⫫": "⫫", + "В": "В", + "⊩": "⊩", + "⫦": "⫦", + "⋁": "⋁", + "‖": "‖", + "‖": "‖", + "∣": "∣", + "|": "|", + "❘": "❘", + "≀": "≀", + " ": " ", + "𝔙": "𝔙", + "𝕍": "𝕍", + "𝒱": "𝒱", + "⊪": "⊪", + "Ŵ": "Ŵ", + "⋀": "⋀", + "𝔚": "𝔚", + "𝕎": "𝕎", + "𝒲": "𝒲", + "𝔛": "𝔛", + "Ξ": "Ξ", + "𝕏": "𝕏", + "𝒳": "𝒳", + "Я": "Я", + "Ї": "Ї", + "Ю": "Ю", + "Ý": "Ý", + "Ý": "Ý", + "Ŷ": "Ŷ", + "Ы": "Ы", + "𝔜": "𝔜", + "𝕐": "𝕐", + "𝒴": "𝒴", + "Ÿ": "Ÿ", + "Ж": "Ж", + "Ź": "Ź", + "Ž": "Ž", + "З": "З", + "Ż": "Ż", + "​": "​", + "Ζ": "Ζ", + "ℨ": "ℨ", + "ℤ": "ℤ", + "𝒵": "𝒵", + "á": "á", + "á": "á", + "ă": "ă", + "∾": "∾", + "∾̳": "∾̳", + "∿": "∿", + "â": "â", + "â": "â", + "´": "´", + "´": "´", + "а": "а", + "æ": "æ", + "æ": "æ", + "⁡": "⁡", + "𝔞": "𝔞", + "à": "à", + "à": "à", + "ℵ": "ℵ", + "ℵ": "ℵ", + "α": "α", + "ā": "ā", + "⨿": "⨿", + "&": "&", + "&": "&", + "∧": "∧", + "⩕": "⩕", + "⩜": "⩜", + "⩘": "⩘", + "⩚": "⩚", + "∠": "∠", + "⦤": "⦤", + "∠": "∠", + "∡": "∡", + "⦨": "⦨", + "⦩": "⦩", + "⦪": "⦪", + "⦫": "⦫", + "⦬": "⦬", + "⦭": "⦭", + "⦮": "⦮", + "⦯": "⦯", + "∟": "∟", + "⊾": "⊾", + "⦝": "⦝", + "∢": "∢", + "Å": "Å", + "⍼": "⍼", + "ą": "ą", + "𝕒": "𝕒", + "≈": "≈", + "⩰": "⩰", + "⩯": "⩯", + "≊": "≊", + "≋": "≋", + "'": "'", + "≈": "≈", + "≊": "≊", + "å": "å", + "å": "å", + "𝒶": "𝒶", + "*": "*", + "≈": "≈", + "≍": "≍", + "ã": "ã", + "ã": "ã", + "ä": "ä", + "ä": "ä", + "∳": "∳", + "⨑": "⨑", + "⫭": "⫭", + "≌": "≌", + "϶": "϶", + "‵": "‵", + "∽": "∽", + "⋍": "⋍", + "⊽": "⊽", + "⌅": "⌅", + "⌅": "⌅", + "⎵": "⎵", + "⎶": "⎶", + "≌": "≌", + "б": "б", + "„": "„", + "∵": "∵", + "∵": "∵", + "⦰": "⦰", + "϶": "϶", + "ℬ": "ℬ", + "β": "β", + "ℶ": "ℶ", + "≬": "≬", + "𝔟": "𝔟", + "⋂": "⋂", + "◯": "◯", + "⋃": "⋃", + "⨀": "⨀", + "⨁": "⨁", + "⨂": "⨂", + "⨆": "⨆", + "★": "★", + "▽": "▽", + "△": "△", + "⨄": "⨄", + "⋁": "⋁", + "⋀": "⋀", + "⤍": "⤍", + "⧫": "⧫", + "▪": "▪", + "▴": "▴", + "▾": "▾", + "◂": "◂", + "▸": "▸", + "␣": "␣", + "▒": "▒", + "░": "░", + "▓": "▓", + "█": "█", + "=⃥": "=⃥", + "≡⃥": "≡⃥", + "⌐": "⌐", + "𝕓": "𝕓", + "⊥": "⊥", + "⊥": "⊥", + "⋈": "⋈", + "╗": "╗", + "╔": "╔", + "╖": "╖", + "╓": "╓", + "═": "═", + "╦": "╦", + "╩": "╩", + "╤": "╤", + "╧": "╧", + "╝": "╝", + "╚": "╚", + "╜": "╜", + "╙": "╙", + "║": "║", + "╬": "╬", + "╣": "╣", + "╠": "╠", + "╫": "╫", + "╢": "╢", + "╟": "╟", + "⧉": "⧉", + "╕": "╕", + "╒": "╒", + "┐": "┐", + "┌": "┌", + "─": "─", + "╥": "╥", + "╨": "╨", + "┬": "┬", + "┴": "┴", + "⊟": "⊟", + "⊞": "⊞", + "⊠": "⊠", + "╛": "╛", + "╘": "╘", + "┘": "┘", + "└": "└", + "│": "│", + "╪": "╪", + "╡": "╡", + "╞": "╞", + "┼": "┼", + "┤": "┤", + "├": "├", + "‵": "‵", + "˘": "˘", + "¦": "¦", + "¦": "¦", + "𝒷": "𝒷", + "⁏": "⁏", + "∽": "∽", + "⋍": "⋍", + "\": "\\", + "⧅": "⧅", + "⟈": "⟈", + "•": "•", + "•": "•", + "≎": "≎", + "⪮": "⪮", + "≏": "≏", + "≏": "≏", + "ć": "ć", + "∩": "∩", + "⩄": "⩄", + "⩉": "⩉", + "⩋": "⩋", + "⩇": "⩇", + "⩀": "⩀", + "∩︀": "∩︀", + "⁁": "⁁", + "ˇ": "ˇ", + "⩍": "⩍", + "č": "č", + "ç": "ç", + "ç": "ç", + "ĉ": "ĉ", + "⩌": "⩌", + "⩐": "⩐", + "ċ": "ċ", + "¸": "¸", + "¸": "¸", + "⦲": "⦲", + "¢": "¢", + "¢": "¢", + "·": "·", + "𝔠": "𝔠", + "ч": "ч", + "✓": "✓", + "✓": "✓", + "χ": "χ", + "○": "○", + "⧃": "⧃", + "ˆ": "ˆ", + "≗": "≗", + "↺": "↺", + "↻": "↻", + "®": "®", + "Ⓢ": "Ⓢ", + "⊛": "⊛", + "⊚": "⊚", + "⊝": "⊝", + "≗": "≗", + "⨐": "⨐", + "⫯": "⫯", + "⧂": "⧂", + "♣": "♣", + "♣": "♣", + ":": ":", + "≔": "≔", + "≔": "≔", + ",": ",", + "@": "@", + "∁": "∁", + "∘": "∘", + "∁": "∁", + "ℂ": "ℂ", + "≅": "≅", + "⩭": "⩭", + "∮": "∮", + "𝕔": "𝕔", + "∐": "∐", + "©": "©", + "©": "©", + "℗": "℗", + "↵": "↵", + "✗": "✗", + "𝒸": "𝒸", + "⫏": "⫏", + "⫑": "⫑", + "⫐": "⫐", + "⫒": "⫒", + "⋯": "⋯", + "⤸": "⤸", + "⤵": "⤵", + "⋞": "⋞", + "⋟": "⋟", + "↶": "↶", + "⤽": "⤽", + "∪": "∪", + "⩈": "⩈", + "⩆": "⩆", + "⩊": "⩊", + "⊍": "⊍", + "⩅": "⩅", + "∪︀": "∪︀", + "↷": "↷", + "⤼": "⤼", + "⋞": "⋞", + "⋟": "⋟", + "⋎": "⋎", + "⋏": "⋏", + "¤": "¤", + "¤": "¤", + "↶": "↶", + "↷": "↷", + "⋎": "⋎", + "⋏": "⋏", + "∲": "∲", + "∱": "∱", + "⌭": "⌭", + "⇓": "⇓", + "⥥": "⥥", + "†": "†", + "ℸ": "ℸ", + "↓": "↓", + "‐": "‐", + "⊣": "⊣", + "⤏": "⤏", + "˝": "˝", + "ď": "ď", + "д": "д", + "ⅆ": "ⅆ", + "‡": "‡", + "⇊": "⇊", + "⩷": "⩷", + "°": "°", + "°": "°", + "δ": "δ", + "⦱": "⦱", + "⥿": "⥿", + "𝔡": "𝔡", + "⇃": "⇃", + "⇂": "⇂", + "⋄": "⋄", + "⋄": "⋄", + "♦": "♦", + "♦": "♦", + "¨": "¨", + "ϝ": "ϝ", + "⋲": "⋲", + "÷": "÷", + "÷": "÷", + "÷": "÷", + "⋇": "⋇", + "⋇": "⋇", + "ђ": "ђ", + "⌞": "⌞", + "⌍": "⌍", + "$": "$", + "𝕕": "𝕕", + "˙": "˙", + "≐": "≐", + "≑": "≑", + "∸": "∸", + "∔": "∔", + "⊡": "⊡", + "⌆": "⌆", + "↓": "↓", + "⇊": "⇊", + "⇃": "⇃", + "⇂": "⇂", + "⤐": "⤐", + "⌟": "⌟", + "⌌": "⌌", + "𝒹": "𝒹", + "ѕ": "ѕ", + "⧶": "⧶", + "đ": "đ", + "⋱": "⋱", + "▿": "▿", + "▾": "▾", + "⇵": "⇵", + "⥯": "⥯", + "⦦": "⦦", + "џ": "џ", + "⟿": "⟿", + "⩷": "⩷", + "≑": "≑", + "é": "é", + "é": "é", + "⩮": "⩮", + "ě": "ě", + "≖": "≖", + "ê": "ê", + "ê": "ê", + "≕": "≕", + "э": "э", + "ė": "ė", + "ⅇ": "ⅇ", + "≒": "≒", + "𝔢": "𝔢", + "⪚": "⪚", + "è": "è", + "è": "è", + "⪖": "⪖", + "⪘": "⪘", + "⪙": "⪙", + "⏧": "⏧", + "ℓ": "ℓ", + "⪕": "⪕", + "⪗": "⪗", + "ē": "ē", + "∅": "∅", + "∅": "∅", + "∅": "∅", + " ": " ", + " ": " ", + " ": " ", + "ŋ": "ŋ", + " ": " ", + "ę": "ę", + "𝕖": "𝕖", + "⋕": "⋕", + "⧣": "⧣", + "⩱": "⩱", + "ε": "ε", + "ε": "ε", + "ϵ": "ϵ", + "≖": "≖", + "≕": "≕", + "≂": "≂", + "⪖": "⪖", + "⪕": "⪕", + "=": "=", + "≟": "≟", + "≡": "≡", + "⩸": "⩸", + "⧥": "⧥", + "≓": "≓", + "⥱": "⥱", + "ℯ": "ℯ", + "≐": "≐", + "≂": "≂", + "η": "η", + "ð": "ð", + "ð": "ð", + "ë": "ë", + "ë": "ë", + "€": "€", + "!": "!", + "∃": "∃", + "ℰ": "ℰ", + "ⅇ": "ⅇ", + "≒": "≒", + "ф": "ф", + "♀": "♀", + "ffi": "ffi", + "ff": "ff", + "ffl": "ffl", + "𝔣": "𝔣", + "fi": "fi", + "fj": "fj", + "♭": "♭", + "fl": "fl", + "▱": "▱", + "ƒ": "ƒ", + "𝕗": "𝕗", + "∀": "∀", + "⋔": "⋔", + "⫙": "⫙", + "⨍": "⨍", + "½": "½", + "½": "½", + "⅓": "⅓", + "¼": "¼", + "¼": "¼", + "⅕": "⅕", + "⅙": "⅙", + "⅛": "⅛", + "⅔": "⅔", + "⅖": "⅖", + "¾": "¾", + "¾": "¾", + "⅗": "⅗", + "⅜": "⅜", + "⅘": "⅘", + "⅚": "⅚", + "⅝": "⅝", + "⅞": "⅞", + "⁄": "⁄", + "⌢": "⌢", + "𝒻": "𝒻", + "≧": "≧", + "⪌": "⪌", + "ǵ": "ǵ", + "γ": "γ", + "ϝ": "ϝ", + "⪆": "⪆", + "ğ": "ğ", + "ĝ": "ĝ", + "г": "г", + "ġ": "ġ", + "≥": "≥", + "⋛": "⋛", + "≥": "≥", + "≧": "≧", + "⩾": "⩾", + "⩾": "⩾", + "⪩": "⪩", + "⪀": "⪀", + "⪂": "⪂", + "⪄": "⪄", + "⋛︀": "⋛︀", + "⪔": "⪔", + "𝔤": "𝔤", + "≫": "≫", + "⋙": "⋙", + "ℷ": "ℷ", + "ѓ": "ѓ", + "≷": "≷", + "⪒": "⪒", + "⪥": "⪥", + "⪤": "⪤", + "≩": "≩", + "⪊": "⪊", + "⪊": "⪊", + "⪈": "⪈", + "⪈": "⪈", + "≩": "≩", + "⋧": "⋧", + "𝕘": "𝕘", + "`": "`", + "ℊ": "ℊ", + "≳": "≳", + "⪎": "⪎", + "⪐": "⪐", + ">": ">", + ">": ">", + "⪧": "⪧", + "⩺": "⩺", + "⋗": "⋗", + "⦕": "⦕", + "⩼": "⩼", + "⪆": "⪆", + "⥸": "⥸", + "⋗": "⋗", + "⋛": "⋛", + "⪌": "⪌", + "≷": "≷", + "≳": "≳", + "≩︀": "≩︀", + "≩︀": "≩︀", + "⇔": "⇔", + " ": " ", + "½": "½", + "ℋ": "ℋ", + "ъ": "ъ", + "↔": "↔", + "⥈": "⥈", + "↭": "↭", + "ℏ": "ℏ", + "ĥ": "ĥ", + "♥": "♥", + "♥": "♥", + "…": "…", + "⊹": "⊹", + "𝔥": "𝔥", + "⤥": "⤥", + "⤦": "⤦", + "⇿": "⇿", + "∻": "∻", + "↩": "↩", + "↪": "↪", + "𝕙": "𝕙", + "―": "―", + "𝒽": "𝒽", + "ℏ": "ℏ", + "ħ": "ħ", + "⁃": "⁃", + "‐": "‐", + "í": "í", + "í": "í", + "⁣": "⁣", + "î": "î", + "î": "î", + "и": "и", + "е": "е", + "¡": "¡", + "¡": "¡", + "⇔": "⇔", + "𝔦": "𝔦", + "ì": "ì", + "ì": "ì", + "ⅈ": "ⅈ", + "⨌": "⨌", + "∭": "∭", + "⧜": "⧜", + "℩": "℩", + "ij": "ij", + "ī": "ī", + "ℑ": "ℑ", + "ℐ": "ℐ", + "ℑ": "ℑ", + "ı": "ı", + "⊷": "⊷", + "Ƶ": "Ƶ", + "∈": "∈", + "℅": "℅", + "∞": "∞", + "⧝": "⧝", + "ı": "ı", + "∫": "∫", + "⊺": "⊺", + "ℤ": "ℤ", + "⊺": "⊺", + "⨗": "⨗", + "⨼": "⨼", + "ё": "ё", + "į": "į", + "𝕚": "𝕚", + "ι": "ι", + "⨼": "⨼", + "¿": "¿", + "¿": "¿", + "𝒾": "𝒾", + "∈": "∈", + "⋹": "⋹", + "⋵": "⋵", + "⋴": "⋴", + "⋳": "⋳", + "∈": "∈", + "⁢": "⁢", + "ĩ": "ĩ", + "і": "і", + "ï": "ï", + "ï": "ï", + "ĵ": "ĵ", + "й": "й", + "𝔧": "𝔧", + "ȷ": "ȷ", + "𝕛": "𝕛", + "𝒿": "𝒿", + "ј": "ј", + "є": "є", + "κ": "κ", + "ϰ": "ϰ", + "ķ": "ķ", + "к": "к", + "𝔨": "𝔨", + "ĸ": "ĸ", + "х": "х", + "ќ": "ќ", + "𝕜": "𝕜", + "𝓀": "𝓀", + "⇚": "⇚", + "⇐": "⇐", + "⤛": "⤛", + "⤎": "⤎", + "≦": "≦", + "⪋": "⪋", + "⥢": "⥢", + "ĺ": "ĺ", + "⦴": "⦴", + "ℒ": "ℒ", + "λ": "λ", + "⟨": "⟨", + "⦑": "⦑", + "⟨": "⟨", + "⪅": "⪅", + "«": "«", + "«": "«", + "←": "←", + "⇤": "⇤", + "⤟": "⤟", + "⤝": "⤝", + "↩": "↩", + "↫": "↫", + "⤹": "⤹", + "⥳": "⥳", + "↢": "↢", + "⪫": "⪫", + "⤙": "⤙", + "⪭": "⪭", + "⪭︀": "⪭︀", + "⤌": "⤌", + "❲": "❲", + "{": "{", + "[": "[", + "⦋": "⦋", + "⦏": "⦏", + "⦍": "⦍", + "ľ": "ľ", + "ļ": "ļ", + "⌈": "⌈", + "{": "{", + "л": "л", + "⤶": "⤶", + "“": "“", + "„": "„", + "⥧": "⥧", + "⥋": "⥋", + "↲": "↲", + "≤": "≤", + "←": "←", + "↢": "↢", + "↽": "↽", + "↼": "↼", + "⇇": "⇇", + "↔": "↔", + "⇆": "⇆", + "⇋": "⇋", + "↭": "↭", + "⋋": "⋋", + "⋚": "⋚", + "≤": "≤", + "≦": "≦", + "⩽": "⩽", + "⩽": "⩽", + "⪨": "⪨", + "⩿": "⩿", + "⪁": "⪁", + "⪃": "⪃", + "⋚︀": "⋚︀", + "⪓": "⪓", + "⪅": "⪅", + "⋖": "⋖", + "⋚": "⋚", + "⪋": "⪋", + "≶": "≶", + "≲": "≲", + "⥼": "⥼", + "⌊": "⌊", + "𝔩": "𝔩", + "≶": "≶", + "⪑": "⪑", + "↽": "↽", + "↼": "↼", + "⥪": "⥪", + "▄": "▄", + "љ": "љ", + "≪": "≪", + "⇇": "⇇", + "⌞": "⌞", + "⥫": "⥫", + "◺": "◺", + "ŀ": "ŀ", + "⎰": "⎰", + "⎰": "⎰", + "≨": "≨", + "⪉": "⪉", + "⪉": "⪉", + "⪇": "⪇", + "⪇": "⪇", + "≨": "≨", + "⋦": "⋦", + "⟬": "⟬", + "⇽": "⇽", + "⟦": "⟦", + "⟵": "⟵", + "⟷": "⟷", + "⟼": "⟼", + "⟶": "⟶", + "↫": "↫", + "↬": "↬", + "⦅": "⦅", + "𝕝": "𝕝", + "⨭": "⨭", + "⨴": "⨴", + "∗": "∗", + "_": "_", + "◊": "◊", + "◊": "◊", + "⧫": "⧫", + "(": "(", + "⦓": "⦓", + "⇆": "⇆", + "⌟": "⌟", + "⇋": "⇋", + "⥭": "⥭", + "‎": "‎", + "⊿": "⊿", + "‹": "‹", + "𝓁": "𝓁", + "↰": "↰", + "≲": "≲", + "⪍": "⪍", + "⪏": "⪏", + "[": "[", + "‘": "‘", + "‚": "‚", + "ł": "ł", + "<": "<", + "<": "<", + "⪦": "⪦", + "⩹": "⩹", + "⋖": "⋖", + "⋋": "⋋", + "⋉": "⋉", + "⥶": "⥶", + "⩻": "⩻", + "⦖": "⦖", + "◃": "◃", + "⊴": "⊴", + "◂": "◂", + "⥊": "⥊", + "⥦": "⥦", + "≨︀": "≨︀", + "≨︀": "≨︀", + "∺": "∺", + "¯": "¯", + "¯": "¯", + "♂": "♂", + "✠": "✠", + "✠": "✠", + "↦": "↦", + "↦": "↦", + "↧": "↧", + "↤": "↤", + "↥": "↥", + "▮": "▮", + "⨩": "⨩", + "м": "м", + "—": "—", + "∡": "∡", + "𝔪": "𝔪", + "℧": "℧", + "µ": "µ", + "µ": "µ", + "∣": "∣", + "*": "*", + "⫰": "⫰", + "·": "·", + "·": "·", + "−": "−", + "⊟": "⊟", + "∸": "∸", + "⨪": "⨪", + "⫛": "⫛", + "…": "…", + "∓": "∓", + "⊧": "⊧", + "𝕞": "𝕞", + "∓": "∓", + "𝓂": "𝓂", + "∾": "∾", + "μ": "μ", + "⊸": "⊸", + "⊸": "⊸", + "⋙̸": "⋙̸", + "≫⃒": "≫⃒", + "≫̸": "≫̸", + "⇍": "⇍", + "⇎": "⇎", + "⋘̸": "⋘̸", + "≪⃒": "≪⃒", + "≪̸": "≪̸", + "⇏": "⇏", + "⊯": "⊯", + "⊮": "⊮", + "∇": "∇", + "ń": "ń", + "∠⃒": "∠⃒", + "≉": "≉", + "⩰̸": "⩰̸", + "≋̸": "≋̸", + "ʼn": "ʼn", + "≉": "≉", + "♮": "♮", + "♮": "♮", + "ℕ": "ℕ", + " ": " ", + " ": " ", + "≎̸": "≎̸", + "≏̸": "≏̸", + "⩃": "⩃", + "ň": "ň", + "ņ": "ņ", + "≇": "≇", + "⩭̸": "⩭̸", + "⩂": "⩂", + "н": "н", + "–": "–", + "≠": "≠", + "⇗": "⇗", + "⤤": "⤤", + "↗": "↗", + "↗": "↗", + "≐̸": "≐̸", + "≢": "≢", + "⤨": "⤨", + "≂̸": "≂̸", + "∄": "∄", + "∄": "∄", + "𝔫": "𝔫", + "≧̸": "≧̸", + "≱": "≱", + "≱": "≱", + "≧̸": "≧̸", + "⩾̸": "⩾̸", + "⩾̸": "⩾̸", + "≵": "≵", + "≯": "≯", + "≯": "≯", + "⇎": "⇎", + "↮": "↮", + "⫲": "⫲", + "∋": "∋", + "⋼": "⋼", + "⋺": "⋺", + "∋": "∋", + "њ": "њ", + "⇍": "⇍", + "≦̸": "≦̸", + "↚": "↚", + "‥": "‥", + "≰": "≰", + "↚": "↚", + "↮": "↮", + "≰": "≰", + "≦̸": "≦̸", + "⩽̸": "⩽̸", + "⩽̸": "⩽̸", + "≮": "≮", + "≴": "≴", + "≮": "≮", + "⋪": "⋪", + "⋬": "⋬", + "∤": "∤", + "𝕟": "𝕟", + "¬": "¬", + "¬": "¬", + "∉": "∉", + "⋹̸": "⋹̸", + "⋵̸": "⋵̸", + "∉": "∉", + "⋷": "⋷", + "⋶": "⋶", + "∌": "∌", + "∌": "∌", + "⋾": "⋾", + "⋽": "⋽", + "∦": "∦", + "∦": "∦", + "⫽⃥": "⫽⃥", + "∂̸": "∂̸", + "⨔": "⨔", + "⊀": "⊀", + "⋠": "⋠", + "⪯̸": "⪯̸", + "⊀": "⊀", + "⪯̸": "⪯̸", + "⇏": "⇏", + "↛": "↛", + "⤳̸": "⤳̸", + "↝̸": "↝̸", + "↛": "↛", + "⋫": "⋫", + "⋭": "⋭", + "⊁": "⊁", + "⋡": "⋡", + "⪰̸": "⪰̸", + "𝓃": "𝓃", + "∤": "∤", + "∦": "∦", + "≁": "≁", + "≄": "≄", + "≄": "≄", + "∤": "∤", + "∦": "∦", + "⋢": "⋢", + "⋣": "⋣", + "⊄": "⊄", + "⫅̸": "⫅̸", + "⊈": "⊈", + "⊂⃒": "⊂⃒", + "⊈": "⊈", + "⫅̸": "⫅̸", + "⊁": "⊁", + "⪰̸": "⪰̸", + "⊅": "⊅", + "⫆̸": "⫆̸", + "⊉": "⊉", + "⊃⃒": "⊃⃒", + "⊉": "⊉", + "⫆̸": "⫆̸", + "≹": "≹", + "ñ": "ñ", + "ñ": "ñ", + "≸": "≸", + "⋪": "⋪", + "⋬": "⋬", + "⋫": "⋫", + "⋭": "⋭", + "ν": "ν", + "#": "#", + "№": "№", + " ": " ", + "⊭": "⊭", + "⤄": "⤄", + "≍⃒": "≍⃒", + "⊬": "⊬", + "≥⃒": "≥⃒", + ">⃒": ">⃒", + "⧞": "⧞", + "⤂": "⤂", + "≤⃒": "≤⃒", + "<⃒": "<⃒", + "⊴⃒": "⊴⃒", + "⤃": "⤃", + "⊵⃒": "⊵⃒", + "∼⃒": "∼⃒", + "⇖": "⇖", + "⤣": "⤣", + "↖": "↖", + "↖": "↖", + "⤧": "⤧", + "Ⓢ": "Ⓢ", + "ó": "ó", + "ó": "ó", + "⊛": "⊛", + "⊚": "⊚", + "ô": "ô", + "ô": "ô", + "о": "о", + "⊝": "⊝", + "ő": "ő", + "⨸": "⨸", + "⊙": "⊙", + "⦼": "⦼", + "œ": "œ", + "⦿": "⦿", + "𝔬": "𝔬", + "˛": "˛", + "ò": "ò", + "ò": "ò", + "⧁": "⧁", + "⦵": "⦵", + "Ω": "Ω", + "∮": "∮", + "↺": "↺", + "⦾": "⦾", + "⦻": "⦻", + "‾": "‾", + "⧀": "⧀", + "ō": "ō", + "ω": "ω", + "ο": "ο", + "⦶": "⦶", + "⊖": "⊖", + "𝕠": "𝕠", + "⦷": "⦷", + "⦹": "⦹", + "⊕": "⊕", + "∨": "∨", + "↻": "↻", + "⩝": "⩝", + "ℴ": "ℴ", + "ℴ": "ℴ", + "ª": "ª", + "ª": "ª", + "º": "º", + "º": "º", + "⊶": "⊶", + "⩖": "⩖", + "⩗": "⩗", + "⩛": "⩛", + "ℴ": "ℴ", + "ø": "ø", + "ø": "ø", + "⊘": "⊘", + "õ": "õ", + "õ": "õ", + "⊗": "⊗", + "⨶": "⨶", + "ö": "ö", + "ö": "ö", + "⌽": "⌽", + "∥": "∥", + "¶": "¶", + "¶": "¶", + "∥": "∥", + "⫳": "⫳", + "⫽": "⫽", + "∂": "∂", + "п": "п", + "%": "%", + ".": ".", + "‰": "‰", + "⊥": "⊥", + "‱": "‱", + "𝔭": "𝔭", + "φ": "φ", + "ϕ": "ϕ", + "ℳ": "ℳ", + "☎": "☎", + "π": "π", + "⋔": "⋔", + "ϖ": "ϖ", + "ℏ": "ℏ", + "ℎ": "ℎ", + "ℏ": "ℏ", + "+": "+", + "⨣": "⨣", + "⊞": "⊞", + "⨢": "⨢", + "∔": "∔", + "⨥": "⨥", + "⩲": "⩲", + "±": "±", + "±": "±", + "⨦": "⨦", + "⨧": "⨧", + "±": "±", + "⨕": "⨕", + "𝕡": "𝕡", + "£": "£", + "£": "£", + "≺": "≺", + "⪳": "⪳", + "⪷": "⪷", + "≼": "≼", + "⪯": "⪯", + "≺": "≺", + "⪷": "⪷", + "≼": "≼", + "⪯": "⪯", + "⪹": "⪹", + "⪵": "⪵", + "⋨": "⋨", + "≾": "≾", + "′": "′", + "ℙ": "ℙ", + "⪵": "⪵", + "⪹": "⪹", + "⋨": "⋨", + "∏": "∏", + "⌮": "⌮", + "⌒": "⌒", + "⌓": "⌓", + "∝": "∝", + "∝": "∝", + "≾": "≾", + "⊰": "⊰", + "𝓅": "𝓅", + "ψ": "ψ", + " ": " ", + "𝔮": "𝔮", + "⨌": "⨌", + "𝕢": "𝕢", + "⁗": "⁗", + "𝓆": "𝓆", + "ℍ": "ℍ", + "⨖": "⨖", + "?": "?", + "≟": "≟", + """: '"', + """: '"', + "⇛": "⇛", + "⇒": "⇒", + "⤜": "⤜", + "⤏": "⤏", + "⥤": "⥤", + "∽̱": "∽̱", + "ŕ": "ŕ", + "√": "√", + "⦳": "⦳", + "⟩": "⟩", + "⦒": "⦒", + "⦥": "⦥", + "⟩": "⟩", + "»": "»", + "»": "»", + "→": "→", + "⥵": "⥵", + "⇥": "⇥", + "⤠": "⤠", + "⤳": "⤳", + "⤞": "⤞", + "↪": "↪", + "↬": "↬", + "⥅": "⥅", + "⥴": "⥴", + "↣": "↣", + "↝": "↝", + "⤚": "⤚", + "∶": "∶", + "ℚ": "ℚ", + "⤍": "⤍", + "❳": "❳", + "}": "}", + "]": "]", + "⦌": "⦌", + "⦎": "⦎", + "⦐": "⦐", + "ř": "ř", + "ŗ": "ŗ", + "⌉": "⌉", + "}": "}", + "р": "р", + "⤷": "⤷", + "⥩": "⥩", + "”": "”", + "”": "”", + "↳": "↳", + "ℜ": "ℜ", + "ℛ": "ℛ", + "ℜ": "ℜ", + "ℝ": "ℝ", + "▭": "▭", + "®": "®", + "®": "®", + "⥽": "⥽", + "⌋": "⌋", + "𝔯": "𝔯", + "⇁": "⇁", + "⇀": "⇀", + "⥬": "⥬", + "ρ": "ρ", + "ϱ": "ϱ", + "→": "→", + "↣": "↣", + "⇁": "⇁", + "⇀": "⇀", + "⇄": "⇄", + "⇌": "⇌", + "⇉": "⇉", + "↝": "↝", + "⋌": "⋌", + "˚": "˚", + "≓": "≓", + "⇄": "⇄", + "⇌": "⇌", + "‏": "‏", + "⎱": "⎱", + "⎱": "⎱", + "⫮": "⫮", + "⟭": "⟭", + "⇾": "⇾", + "⟧": "⟧", + "⦆": "⦆", + "𝕣": "𝕣", + "⨮": "⨮", + "⨵": "⨵", + ")": ")", + "⦔": "⦔", + "⨒": "⨒", + "⇉": "⇉", + "›": "›", + "𝓇": "𝓇", + "↱": "↱", + "]": "]", + "’": "’", + "’": "’", + "⋌": "⋌", + "⋊": "⋊", + "▹": "▹", + "⊵": "⊵", + "▸": "▸", + "⧎": "⧎", + "⥨": "⥨", + "℞": "℞", + "ś": "ś", + "‚": "‚", + "≻": "≻", + "⪴": "⪴", + "⪸": "⪸", + "š": "š", + "≽": "≽", + "⪰": "⪰", + "ş": "ş", + "ŝ": "ŝ", + "⪶": "⪶", + "⪺": "⪺", + "⋩": "⋩", + "⨓": "⨓", + "≿": "≿", + "с": "с", + "⋅": "⋅", + "⊡": "⊡", + "⩦": "⩦", + "⇘": "⇘", + "⤥": "⤥", + "↘": "↘", + "↘": "↘", + "§": "§", + "§": "§", + ";": ";", + "⤩": "⤩", + "∖": "∖", + "∖": "∖", + "✶": "✶", + "𝔰": "𝔰", + "⌢": "⌢", + "♯": "♯", + "щ": "щ", + "ш": "ш", + "∣": "∣", + "∥": "∥", + "­": "­", + "­": "­", + "σ": "σ", + "ς": "ς", + "ς": "ς", + "∼": "∼", + "⩪": "⩪", + "≃": "≃", + "≃": "≃", + "⪞": "⪞", + "⪠": "⪠", + "⪝": "⪝", + "⪟": "⪟", + "≆": "≆", + "⨤": "⨤", + "⥲": "⥲", + "←": "←", + "∖": "∖", + "⨳": "⨳", + "⧤": "⧤", + "∣": "∣", + "⌣": "⌣", + "⪪": "⪪", + "⪬": "⪬", + "⪬︀": "⪬︀", + "ь": "ь", + "/": "/", + "⧄": "⧄", + "⌿": "⌿", + "𝕤": "𝕤", + "♠": "♠", + "♠": "♠", + "∥": "∥", + "⊓": "⊓", + "⊓︀": "⊓︀", + "⊔": "⊔", + "⊔︀": "⊔︀", + "⊏": "⊏", + "⊑": "⊑", + "⊏": "⊏", + "⊑": "⊑", + "⊐": "⊐", + "⊒": "⊒", + "⊐": "⊐", + "⊒": "⊒", + "□": "□", + "□": "□", + "▪": "▪", + "▪": "▪", + "→": "→", + "𝓈": "𝓈", + "∖": "∖", + "⌣": "⌣", + "⋆": "⋆", + "☆": "☆", + "★": "★", + "ϵ": "ϵ", + "ϕ": "ϕ", + "¯": "¯", + "⊂": "⊂", + "⫅": "⫅", + "⪽": "⪽", + "⊆": "⊆", + "⫃": "⫃", + "⫁": "⫁", + "⫋": "⫋", + "⊊": "⊊", + "⪿": "⪿", + "⥹": "⥹", + "⊂": "⊂", + "⊆": "⊆", + "⫅": "⫅", + "⊊": "⊊", + "⫋": "⫋", + "⫇": "⫇", + "⫕": "⫕", + "⫓": "⫓", + "≻": "≻", + "⪸": "⪸", + "≽": "≽", + "⪰": "⪰", + "⪺": "⪺", + "⪶": "⪶", + "⋩": "⋩", + "≿": "≿", + "∑": "∑", + "♪": "♪", + "¹": "¹", + "¹": "¹", + "²": "²", + "²": "²", + "³": "³", + "³": "³", + "⊃": "⊃", + "⫆": "⫆", + "⪾": "⪾", + "⫘": "⫘", + "⊇": "⊇", + "⫄": "⫄", + "⟉": "⟉", + "⫗": "⫗", + "⥻": "⥻", + "⫂": "⫂", + "⫌": "⫌", + "⊋": "⊋", + "⫀": "⫀", + "⊃": "⊃", + "⊇": "⊇", + "⫆": "⫆", + "⊋": "⊋", + "⫌": "⫌", + "⫈": "⫈", + "⫔": "⫔", + "⫖": "⫖", + "⇙": "⇙", + "⤦": "⤦", + "↙": "↙", + "↙": "↙", + "⤪": "⤪", + "ß": "ß", + "ß": "ß", + "⌖": "⌖", + "τ": "τ", + "⎴": "⎴", + "ť": "ť", + "ţ": "ţ", + "т": "т", + "⃛": "⃛", + "⌕": "⌕", + "𝔱": "𝔱", + "∴": "∴", + "∴": "∴", + "θ": "θ", + "ϑ": "ϑ", + "ϑ": "ϑ", + "≈": "≈", + "∼": "∼", + " ": " ", + "≈": "≈", + "∼": "∼", + "þ": "þ", + "þ": "þ", + "˜": "˜", + "×": "×", + "×": "×", + "⊠": "⊠", + "⨱": "⨱", + "⨰": "⨰", + "∭": "∭", + "⤨": "⤨", + "⊤": "⊤", + "⌶": "⌶", + "⫱": "⫱", + "𝕥": "𝕥", + "⫚": "⫚", + "⤩": "⤩", + "‴": "‴", + "™": "™", + "▵": "▵", + "▿": "▿", + "◃": "◃", + "⊴": "⊴", + "≜": "≜", + "▹": "▹", + "⊵": "⊵", + "◬": "◬", + "≜": "≜", + "⨺": "⨺", + "⨹": "⨹", + "⧍": "⧍", + "⨻": "⨻", + "⏢": "⏢", + "𝓉": "𝓉", + "ц": "ц", + "ћ": "ћ", + "ŧ": "ŧ", + "≬": "≬", + "↞": "↞", + "↠": "↠", + "⇑": "⇑", + "⥣": "⥣", + "ú": "ú", + "ú": "ú", + "↑": "↑", + "ў": "ў", + "ŭ": "ŭ", + "û": "û", + "û": "û", + "у": "у", + "⇅": "⇅", + "ű": "ű", + "⥮": "⥮", + "⥾": "⥾", + "𝔲": "𝔲", + "ù": "ù", + "ù": "ù", + "↿": "↿", + "↾": "↾", + "▀": "▀", + "⌜": "⌜", + "⌜": "⌜", + "⌏": "⌏", + "◸": "◸", + "ū": "ū", + "¨": "¨", + "¨": "¨", + "ų": "ų", + "𝕦": "𝕦", + "↑": "↑", + "↕": "↕", + "↿": "↿", + "↾": "↾", + "⊎": "⊎", + "υ": "υ", + "ϒ": "ϒ", + "υ": "υ", + "⇈": "⇈", + "⌝": "⌝", + "⌝": "⌝", + "⌎": "⌎", + "ů": "ů", + "◹": "◹", + "𝓊": "𝓊", + "⋰": "⋰", + "ũ": "ũ", + "▵": "▵", + "▴": "▴", + "⇈": "⇈", + "ü": "ü", + "ü": "ü", + "⦧": "⦧", + "⇕": "⇕", + "⫨": "⫨", + "⫩": "⫩", + "⊨": "⊨", + "⦜": "⦜", + "ϵ": "ϵ", + "ϰ": "ϰ", + "∅": "∅", + "ϕ": "ϕ", + "ϖ": "ϖ", + "∝": "∝", + "↕": "↕", + "ϱ": "ϱ", + "ς": "ς", + "⊊︀": "⊊︀", + "⫋︀": "⫋︀", + "⊋︀": "⊋︀", + "⫌︀": "⫌︀", + "ϑ": "ϑ", + "⊲": "⊲", + "⊳": "⊳", + "в": "в", + "⊢": "⊢", + "∨": "∨", + "⊻": "⊻", + "≚": "≚", + "⋮": "⋮", + "|": "|", + "|": "|", + "𝔳": "𝔳", + "⊲": "⊲", + "⊂⃒": "⊂⃒", + "⊃⃒": "⊃⃒", + "𝕧": "𝕧", + "∝": "∝", + "⊳": "⊳", + "𝓋": "𝓋", + "⫋︀": "⫋︀", + "⊊︀": "⊊︀", + "⫌︀": "⫌︀", + "⊋︀": "⊋︀", + "⦚": "⦚", + "ŵ": "ŵ", + "⩟": "⩟", + "∧": "∧", + "≙": "≙", + "℘": "℘", + "𝔴": "𝔴", + "𝕨": "𝕨", + "℘": "℘", + "≀": "≀", + "≀": "≀", + "𝓌": "𝓌", + "⋂": "⋂", + "◯": "◯", + "⋃": "⋃", + "▽": "▽", + "𝔵": "𝔵", + "⟺": "⟺", + "⟷": "⟷", + "ξ": "ξ", + "⟸": "⟸", + "⟵": "⟵", + "⟼": "⟼", + "⋻": "⋻", + "⨀": "⨀", + "𝕩": "𝕩", + "⨁": "⨁", + "⨂": "⨂", + "⟹": "⟹", + "⟶": "⟶", + "𝓍": "𝓍", + "⨆": "⨆", + "⨄": "⨄", + "△": "△", + "⋁": "⋁", + "⋀": "⋀", + "ý": "ý", + "ý": "ý", + "я": "я", + "ŷ": "ŷ", + "ы": "ы", + "¥": "¥", + "¥": "¥", + "𝔶": "𝔶", + "ї": "ї", + "𝕪": "𝕪", + "𝓎": "𝓎", + "ю": "ю", + "ÿ": "ÿ", + "ÿ": "ÿ", + "ź": "ź", + "ž": "ž", + "з": "з", + "ż": "ż", + "ℨ": "ℨ", + "ζ": "ζ", + "𝔷": "𝔷", + "ж": "ж", + "⇝": "⇝", + "𝕫": "𝕫", + "𝓏": "𝓏", + "‍": "‍", + "‌": "‌", + }, + characters: { + Æ: "Æ", + "&": "&", + Á: "Á", + Ă: "Ă", + Â: "Â", + А: "А", + 𝔄: "𝔄", + À: "À", + Α: "Α", + Ā: "Ā", + "⩓": "⩓", + Ą: "Ą", + 𝔸: "𝔸", + "⁡": "⁡", + Å: "Å", + 𝒜: "𝒜", + "≔": "≔", + Ã: "Ã", + Ä: "Ä", + "∖": "∖", + "⫧": "⫧", + "⌆": "⌆", + Б: "Б", + "∵": "∵", + ℬ: "ℬ", + Β: "Β", + 𝔅: "𝔅", + 𝔹: "𝔹", + "˘": "˘", + "≎": "≎", + Ч: "Ч", + "©": "©", + Ć: "Ć", + "⋒": "⋒", + ⅅ: "ⅅ", + ℭ: "ℭ", + Č: "Č", + Ç: "Ç", + Ĉ: "Ĉ", + "∰": "∰", + Ċ: "Ċ", + "¸": "¸", + "·": "·", + Χ: "Χ", + "⊙": "⊙", + "⊖": "⊖", + "⊕": "⊕", + "⊗": "⊗", + "∲": "∲", + "”": "”", + "’": "’", + "∷": "∷", + "⩴": "⩴", + "≡": "≡", + "∯": "∯", + "∮": "∮", + ℂ: "ℂ", + "∐": "∐", + "∳": "∳", + "⨯": "⨯", + 𝒞: "𝒞", + "⋓": "⋓", + "≍": "≍", + "⤑": "⤑", + Ђ: "Ђ", + Ѕ: "Ѕ", + Џ: "Џ", + "‡": "‡", + "↡": "↡", + "⫤": "⫤", + Ď: "Ď", + Д: "Д", + "∇": "∇", + Δ: "Δ", + 𝔇: "𝔇", + "´": "´", + "˙": "˙", + "˝": "˝", + "`": "`", + "˜": "˜", + "⋄": "⋄", + ⅆ: "ⅆ", + 𝔻: "𝔻", + "¨": "¨", + "⃜": "⃜", + "≐": "≐", + "⇓": "⇓", + "⇐": "⇐", + "⇔": "⇔", + "⟸": "⟸", + "⟺": "⟺", + "⟹": "⟹", + "⇒": "⇒", + "⊨": "⊨", + "⇑": "⇑", + "⇕": "⇕", + "∥": "∥", + "↓": "↓", + "⤓": "⤓", + "⇵": "⇵", + "̑": "̑", + "⥐": "⥐", + "⥞": "⥞", + "↽": "↽", + "⥖": "⥖", + "⥟": "⥟", + "⇁": "⇁", + "⥗": "⥗", + "⊤": "⊤", + "↧": "↧", + 𝒟: "𝒟", + Đ: "Đ", + Ŋ: "Ŋ", + Ð: "Ð", + É: "É", + Ě: "Ě", + Ê: "Ê", + Э: "Э", + Ė: "Ė", + 𝔈: "𝔈", + È: "È", + "∈": "∈", + Ē: "Ē", + "◻": "◻", + "▫": "▫", + Ę: "Ę", + 𝔼: "𝔼", + Ε: "Ε", + "⩵": "⩵", + "≂": "≂", + "⇌": "⇌", + ℰ: "ℰ", + "⩳": "⩳", + Η: "Η", + Ë: "Ë", + "∃": "∃", + ⅇ: "ⅇ", + Ф: "Ф", + 𝔉: "𝔉", + "◼": "◼", + "▪": "▪", + 𝔽: "𝔽", + "∀": "∀", + ℱ: "ℱ", + Ѓ: "Ѓ", + ">": ">", + Γ: "Γ", + Ϝ: "Ϝ", + Ğ: "Ğ", + Ģ: "Ģ", + Ĝ: "Ĝ", + Г: "Г", + Ġ: "Ġ", + 𝔊: "𝔊", + "⋙": "⋙", + 𝔾: "𝔾", + "≥": "≥", + "⋛": "⋛", + "≧": "≧", + "⪢": "⪢", + "≷": "≷", + "⩾": "⩾", + "≳": "≳", + 𝒢: "𝒢", + "≫": "≫", + Ъ: "Ъ", + ˇ: "ˇ", + "^": "^", + Ĥ: "Ĥ", + ℌ: "ℌ", + ℋ: "ℋ", + ℍ: "ℍ", + "─": "─", + Ħ: "Ħ", + "≏": "≏", + Е: "Е", + IJ: "IJ", + Ё: "Ё", + Í: "Í", + Î: "Î", + И: "И", + İ: "İ", + ℑ: "ℑ", + Ì: "Ì", + Ī: "Ī", + ⅈ: "ⅈ", + "∬": "∬", + "∫": "∫", + "⋂": "⋂", + "⁣": "⁣", + "⁢": "⁢", + Į: "Į", + 𝕀: "𝕀", + Ι: "Ι", + ℐ: "ℐ", + Ĩ: "Ĩ", + І: "І", + Ï: "Ï", + Ĵ: "Ĵ", + Й: "Й", + 𝔍: "𝔍", + 𝕁: "𝕁", + 𝒥: "𝒥", + Ј: "Ј", + Є: "Є", + Х: "Х", + Ќ: "Ќ", + Κ: "Κ", + Ķ: "Ķ", + К: "К", + 𝔎: "𝔎", + 𝕂: "𝕂", + 𝒦: "𝒦", + Љ: "Љ", + "<": "<", + Ĺ: "Ĺ", + Λ: "Λ", + "⟪": "⟪", + ℒ: "ℒ", + "↞": "↞", + Ľ: "Ľ", + Ļ: "Ļ", + Л: "Л", + "⟨": "⟨", + "←": "←", + "⇤": "⇤", + "⇆": "⇆", + "⌈": "⌈", + "⟦": "⟦", + "⥡": "⥡", + "⇃": "⇃", + "⥙": "⥙", + "⌊": "⌊", + "↔": "↔", + "⥎": "⥎", + "⊣": "⊣", + "↤": "↤", + "⥚": "⥚", + "⊲": "⊲", + "⧏": "⧏", + "⊴": "⊴", + "⥑": "⥑", + "⥠": "⥠", + "↿": "↿", + "⥘": "⥘", + "↼": "↼", + "⥒": "⥒", + "⋚": "⋚", + "≦": "≦", + "≶": "≶", + "⪡": "⪡", + "⩽": "⩽", + "≲": "≲", + 𝔏: "𝔏", + "⋘": "⋘", + "⇚": "⇚", + Ŀ: "Ŀ", + "⟵": "⟵", + "⟷": "⟷", + "⟶": "⟶", + 𝕃: "𝕃", + "↙": "↙", + "↘": "↘", + "↰": "↰", + Ł: "Ł", + "≪": "≪", + "⤅": "⤅", + М: "М", + " ": " ", + ℳ: "ℳ", + 𝔐: "𝔐", + "∓": "∓", + 𝕄: "𝕄", + Μ: "Μ", + Њ: "Њ", + Ń: "Ń", + Ň: "Ň", + Ņ: "Ņ", + Н: "Н", + "​": "​", + "\n": " ", + 𝔑: "𝔑", + "⁠": "⁠", + " ": " ", + ℕ: "ℕ", + "⫬": "⫬", + "≢": "≢", + "≭": "≭", + "∦": "∦", + "∉": "∉", + "≠": "≠", + "≂̸": "≂̸", + "∄": "∄", + "≯": "≯", + "≱": "≱", + "≧̸": "≧̸", + "≫̸": "≫̸", + "≹": "≹", + "⩾̸": "⩾̸", + "≵": "≵", + "≎̸": "≎̸", + "≏̸": "≏̸", + "⋪": "⋪", + "⧏̸": "⧏̸", + "⋬": "⋬", + "≮": "≮", + "≰": "≰", + "≸": "≸", + "≪̸": "≪̸", + "⩽̸": "⩽̸", + "≴": "≴", + "⪢̸": "⪢̸", + "⪡̸": "⪡̸", + "⊀": "⊀", + "⪯̸": "⪯̸", + "⋠": "⋠", + "∌": "∌", + "⋫": "⋫", + "⧐̸": "⧐̸", + "⋭": "⋭", + "⊏̸": "⊏̸", + "⋢": "⋢", + "⊐̸": "⊐̸", + "⋣": "⋣", + "⊂⃒": "⊂⃒", + "⊈": "⊈", + "⊁": "⊁", + "⪰̸": "⪰̸", + "⋡": "⋡", + "≿̸": "≿̸", + "⊃⃒": "⊃⃒", + "⊉": "⊉", + "≁": "≁", + "≄": "≄", + "≇": "≇", + "≉": "≉", + "∤": "∤", + 𝒩: "𝒩", + Ñ: "Ñ", + Ν: "Ν", + Œ: "Œ", + Ó: "Ó", + Ô: "Ô", + О: "О", + Ő: "Ő", + 𝔒: "𝔒", + Ò: "Ò", + Ō: "Ō", + Ω: "Ω", + Ο: "Ο", + 𝕆: "𝕆", + "“": "“", + "‘": "‘", + "⩔": "⩔", + 𝒪: "𝒪", + Ø: "Ø", + Õ: "Õ", + "⨷": "⨷", + Ö: "Ö", + "‾": "‾", + "⏞": "⏞", + "⎴": "⎴", + "⏜": "⏜", + "∂": "∂", + П: "П", + 𝔓: "𝔓", + Φ: "Φ", + Π: "Π", + "±": "±", + ℙ: "ℙ", + "⪻": "⪻", + "≺": "≺", + "⪯": "⪯", + "≼": "≼", + "≾": "≾", + "″": "″", + "∏": "∏", + "∝": "∝", + 𝒫: "𝒫", + Ψ: "Ψ", + '"': """, + 𝔔: "𝔔", + ℚ: "ℚ", + 𝒬: "𝒬", + "⤐": "⤐", + "®": "®", + Ŕ: "Ŕ", + "⟫": "⟫", + "↠": "↠", + "⤖": "⤖", + Ř: "Ř", + Ŗ: "Ŗ", + Р: "Р", + ℜ: "ℜ", + "∋": "∋", + "⇋": "⇋", + "⥯": "⥯", + Ρ: "Ρ", + "⟩": "⟩", + "→": "→", + "⇥": "⇥", + "⇄": "⇄", + "⌉": "⌉", + "⟧": "⟧", + "⥝": "⥝", + "⇂": "⇂", + "⥕": "⥕", + "⌋": "⌋", + "⊢": "⊢", + "↦": "↦", + "⥛": "⥛", + "⊳": "⊳", + "⧐": "⧐", + "⊵": "⊵", + "⥏": "⥏", + "⥜": "⥜", + "↾": "↾", + "⥔": "⥔", + "⇀": "⇀", + "⥓": "⥓", + ℝ: "ℝ", + "⥰": "⥰", + "⇛": "⇛", + ℛ: "ℛ", + "↱": "↱", + "⧴": "⧴", + Щ: "Щ", + Ш: "Ш", + Ь: "Ь", + Ś: "Ś", + "⪼": "⪼", + Š: "Š", + Ş: "Ş", + Ŝ: "Ŝ", + С: "С", + 𝔖: "𝔖", + "↑": "↑", + Σ: "Σ", + "∘": "∘", + 𝕊: "𝕊", + "√": "√", + "□": "□", + "⊓": "⊓", + "⊏": "⊏", + "⊑": "⊑", + "⊐": "⊐", + "⊒": "⊒", + "⊔": "⊔", + 𝒮: "𝒮", + "⋆": "⋆", + "⋐": "⋐", + "⊆": "⊆", + "≻": "≻", + "⪰": "⪰", + "≽": "≽", + "≿": "≿", + "∑": "∑", + "⋑": "⋑", + "⊃": "⊃", + "⊇": "⊇", + Þ: "Þ", + "™": "™", + Ћ: "Ћ", + Ц: "Ц", + "\t": " ", + Τ: "Τ", + Ť: "Ť", + Ţ: "Ţ", + Т: "Т", + 𝔗: "𝔗", + "∴": "∴", + Θ: "Θ", + "  ": "  ", + " ": " ", + "∼": "∼", + "≃": "≃", + "≅": "≅", + "≈": "≈", + 𝕋: "𝕋", + "⃛": "⃛", + 𝒯: "𝒯", + Ŧ: "Ŧ", + Ú: "Ú", + "↟": "↟", + "⥉": "⥉", + Ў: "Ў", + Ŭ: "Ŭ", + Û: "Û", + У: "У", + Ű: "Ű", + 𝔘: "𝔘", + Ù: "Ù", + Ū: "Ū", + _: "_", + "⏟": "⏟", + "⎵": "⎵", + "⏝": "⏝", + "⋃": "⋃", + "⊎": "⊎", + Ų: "Ų", + 𝕌: "𝕌", + "⤒": "⤒", + "⇅": "⇅", + "↕": "↕", + "⥮": "⥮", + "⊥": "⊥", + "↥": "↥", + "↖": "↖", + "↗": "↗", + ϒ: "ϒ", + Υ: "Υ", + Ů: "Ů", + 𝒰: "𝒰", + Ũ: "Ũ", + Ü: "Ü", + "⊫": "⊫", + "⫫": "⫫", + В: "В", + "⊩": "⊩", + "⫦": "⫦", + "⋁": "⋁", + "‖": "‖", + "∣": "∣", + "|": "|", + "❘": "❘", + "≀": "≀", + " ": " ", + 𝔙: "𝔙", + 𝕍: "𝕍", + 𝒱: "𝒱", + "⊪": "⊪", + Ŵ: "Ŵ", + "⋀": "⋀", + 𝔚: "𝔚", + 𝕎: "𝕎", + 𝒲: "𝒲", + 𝔛: "𝔛", + Ξ: "Ξ", + 𝕏: "𝕏", + 𝒳: "𝒳", + Я: "Я", + Ї: "Ї", + Ю: "Ю", + Ý: "Ý", + Ŷ: "Ŷ", + Ы: "Ы", + 𝔜: "𝔜", + 𝕐: "𝕐", + 𝒴: "𝒴", + Ÿ: "Ÿ", + Ж: "Ж", + Ź: "Ź", + Ž: "Ž", + З: "З", + Ż: "Ż", + Ζ: "Ζ", + ℨ: "ℨ", + ℤ: "ℤ", + 𝒵: "𝒵", + á: "á", + ă: "ă", + "∾": "∾", + "∾̳": "∾̳", + "∿": "∿", + â: "â", + а: "а", + æ: "æ", + 𝔞: "𝔞", + à: "à", + ℵ: "ℵ", + α: "α", + ā: "ā", + "⨿": "⨿", + "∧": "∧", + "⩕": "⩕", + "⩜": "⩜", + "⩘": "⩘", + "⩚": "⩚", + "∠": "∠", + "⦤": "⦤", + "∡": "∡", + "⦨": "⦨", + "⦩": "⦩", + "⦪": "⦪", + "⦫": "⦫", + "⦬": "⦬", + "⦭": "⦭", + "⦮": "⦮", + "⦯": "⦯", + "∟": "∟", + "⊾": "⊾", + "⦝": "⦝", + "∢": "∢", + "⍼": "⍼", + ą: "ą", + 𝕒: "𝕒", + "⩰": "⩰", + "⩯": "⩯", + "≊": "≊", + "≋": "≋", + "'": "'", + å: "å", + 𝒶: "𝒶", + "*": "*", + ã: "ã", + ä: "ä", + "⨑": "⨑", + "⫭": "⫭", + "≌": "≌", + "϶": "϶", + "‵": "‵", + "∽": "∽", + "⋍": "⋍", + "⊽": "⊽", + "⌅": "⌅", + "⎶": "⎶", + б: "б", + "„": "„", + "⦰": "⦰", + β: "β", + ℶ: "ℶ", + "≬": "≬", + 𝔟: "𝔟", + "◯": "◯", + "⨀": "⨀", + "⨁": "⨁", + "⨂": "⨂", + "⨆": "⨆", + "★": "★", + "▽": "▽", + "△": "△", + "⨄": "⨄", + "⤍": "⤍", + "⧫": "⧫", + "▴": "▴", + "▾": "▾", + "◂": "◂", + "▸": "▸", + "␣": "␣", + "▒": "▒", + "░": "░", + "▓": "▓", + "█": "█", + "=⃥": "=⃥", + "≡⃥": "≡⃥", + "⌐": "⌐", + 𝕓: "𝕓", + "⋈": "⋈", + "╗": "╗", + "╔": "╔", + "╖": "╖", + "╓": "╓", + "═": "═", + "╦": "╦", + "╩": "╩", + "╤": "╤", + "╧": "╧", + "╝": "╝", + "╚": "╚", + "╜": "╜", + "╙": "╙", + "║": "║", + "╬": "╬", + "╣": "╣", + "╠": "╠", + "╫": "╫", + "╢": "╢", + "╟": "╟", + "⧉": "⧉", + "╕": "╕", + "╒": "╒", + "┐": "┐", + "┌": "┌", + "╥": "╥", + "╨": "╨", + "┬": "┬", + "┴": "┴", + "⊟": "⊟", + "⊞": "⊞", + "⊠": "⊠", + "╛": "╛", + "╘": "╘", + "┘": "┘", + "└": "└", + "│": "│", + "╪": "╪", + "╡": "╡", + "╞": "╞", + "┼": "┼", + "┤": "┤", + "├": "├", + "¦": "¦", + 𝒷: "𝒷", + "⁏": "⁏", + "\\": "\", + "⧅": "⧅", + "⟈": "⟈", + "•": "•", + "⪮": "⪮", + ć: "ć", + "∩": "∩", + "⩄": "⩄", + "⩉": "⩉", + "⩋": "⩋", + "⩇": "⩇", + "⩀": "⩀", + "∩︀": "∩︀", + "⁁": "⁁", + "⩍": "⩍", + č: "č", + ç: "ç", + ĉ: "ĉ", + "⩌": "⩌", + "⩐": "⩐", + ċ: "ċ", + "⦲": "⦲", + "¢": "¢", + 𝔠: "𝔠", + ч: "ч", + "✓": "✓", + χ: "χ", + "○": "○", + "⧃": "⧃", + ˆ: "ˆ", + "≗": "≗", + "↺": "↺", + "↻": "↻", + "Ⓢ": "Ⓢ", + "⊛": "⊛", + "⊚": "⊚", + "⊝": "⊝", + "⨐": "⨐", + "⫯": "⫯", + "⧂": "⧂", + "♣": "♣", + ":": ":", + ",": ",", + "@": "@", + "∁": "∁", + "⩭": "⩭", + 𝕔: "𝕔", + "℗": "℗", + "↵": "↵", + "✗": "✗", + 𝒸: "𝒸", + "⫏": "⫏", + "⫑": "⫑", + "⫐": "⫐", + "⫒": "⫒", + "⋯": "⋯", + "⤸": "⤸", + "⤵": "⤵", + "⋞": "⋞", + "⋟": "⋟", + "↶": "↶", + "⤽": "⤽", + "∪": "∪", + "⩈": "⩈", + "⩆": "⩆", + "⩊": "⩊", + "⊍": "⊍", + "⩅": "⩅", + "∪︀": "∪︀", + "↷": "↷", + "⤼": "⤼", + "⋎": "⋎", + "⋏": "⋏", + "¤": "¤", + "∱": "∱", + "⌭": "⌭", + "⥥": "⥥", + "†": "†", + ℸ: "ℸ", + "‐": "‐", + "⤏": "⤏", + ď: "ď", + д: "д", + "⇊": "⇊", + "⩷": "⩷", + "°": "°", + δ: "δ", + "⦱": "⦱", + "⥿": "⥿", + 𝔡: "𝔡", + "♦": "♦", + ϝ: "ϝ", + "⋲": "⋲", + "÷": "÷", + "⋇": "⋇", + ђ: "ђ", + "⌞": "⌞", + "⌍": "⌍", + $: "$", + 𝕕: "𝕕", + "≑": "≑", + "∸": "∸", + "∔": "∔", + "⊡": "⊡", + "⌟": "⌟", + "⌌": "⌌", + 𝒹: "𝒹", + ѕ: "ѕ", + "⧶": "⧶", + đ: "đ", + "⋱": "⋱", + "▿": "▿", + "⦦": "⦦", + џ: "џ", + "⟿": "⟿", + é: "é", + "⩮": "⩮", + ě: "ě", + "≖": "≖", + ê: "ê", + "≕": "≕", + э: "э", + ė: "ė", + "≒": "≒", + 𝔢: "𝔢", + "⪚": "⪚", + è: "è", + "⪖": "⪖", + "⪘": "⪘", + "⪙": "⪙", + "⏧": "⏧", + ℓ: "ℓ", + "⪕": "⪕", + "⪗": "⪗", + ē: "ē", + "∅": "∅", + " ": " ", + " ": " ", + " ": " ", + ŋ: "ŋ", + " ": " ", + ę: "ę", + 𝕖: "𝕖", + "⋕": "⋕", + "⧣": "⧣", + "⩱": "⩱", + ε: "ε", + ϵ: "ϵ", + "=": "=", + "≟": "≟", + "⩸": "⩸", + "⧥": "⧥", + "≓": "≓", + "⥱": "⥱", + ℯ: "ℯ", + η: "η", + ð: "ð", + ë: "ë", + "€": "€", + "!": "!", + ф: "ф", + "♀": "♀", + ffi: "ffi", + ff: "ff", + ffl: "ffl", + 𝔣: "𝔣", + fi: "fi", + fj: "fj", + "♭": "♭", + fl: "fl", + "▱": "▱", + ƒ: "ƒ", + 𝕗: "𝕗", + "⋔": "⋔", + "⫙": "⫙", + "⨍": "⨍", + "½": "½", + "⅓": "⅓", + "¼": "¼", + "⅕": "⅕", + "⅙": "⅙", + "⅛": "⅛", + "⅔": "⅔", + "⅖": "⅖", + "¾": "¾", + "⅗": "⅗", + "⅜": "⅜", + "⅘": "⅘", + "⅚": "⅚", + "⅝": "⅝", + "⅞": "⅞", + "⁄": "⁄", + "⌢": "⌢", + 𝒻: "𝒻", + "⪌": "⪌", + ǵ: "ǵ", + γ: "γ", + "⪆": "⪆", + ğ: "ğ", + ĝ: "ĝ", + г: "г", + ġ: "ġ", + "⪩": "⪩", + "⪀": "⪀", + "⪂": "⪂", + "⪄": "⪄", + "⋛︀": "⋛︀", + "⪔": "⪔", + 𝔤: "𝔤", + ℷ: "ℷ", + ѓ: "ѓ", + "⪒": "⪒", + "⪥": "⪥", + "⪤": "⪤", + "≩": "≩", + "⪊": "⪊", + "⪈": "⪈", + "⋧": "⋧", + 𝕘: "𝕘", + ℊ: "ℊ", + "⪎": "⪎", + "⪐": "⪐", + "⪧": "⪧", + "⩺": "⩺", + "⋗": "⋗", + "⦕": "⦕", + "⩼": "⩼", + "⥸": "⥸", + "≩︀": "≩︀", + ъ: "ъ", + "⥈": "⥈", + "↭": "↭", + ℏ: "ℏ", + ĥ: "ĥ", + "♥": "♥", + "…": "…", + "⊹": "⊹", + 𝔥: "𝔥", + "⤥": "⤥", + "⤦": "⤦", + "⇿": "⇿", + "∻": "∻", + "↩": "↩", + "↪": "↪", + 𝕙: "𝕙", + "―": "―", + 𝒽: "𝒽", + ħ: "ħ", + "⁃": "⁃", + í: "í", + î: "î", + и: "и", + е: "е", + "¡": "¡", + 𝔦: "𝔦", + ì: "ì", + "⨌": "⨌", + "∭": "∭", + "⧜": "⧜", + "℩": "℩", + ij: "ij", + ī: "ī", + ı: "ı", + "⊷": "⊷", + Ƶ: "Ƶ", + "℅": "℅", + "∞": "∞", + "⧝": "⧝", + "⊺": "⊺", + "⨗": "⨗", + "⨼": "⨼", + ё: "ё", + į: "į", + 𝕚: "𝕚", + ι: "ι", + "¿": "¿", + 𝒾: "𝒾", + "⋹": "⋹", + "⋵": "⋵", + "⋴": "⋴", + "⋳": "⋳", + ĩ: "ĩ", + і: "і", + ï: "ï", + ĵ: "ĵ", + й: "й", + 𝔧: "𝔧", + ȷ: "ȷ", + 𝕛: "𝕛", + 𝒿: "𝒿", + ј: "ј", + є: "є", + κ: "κ", + ϰ: "ϰ", + ķ: "ķ", + к: "к", + 𝔨: "𝔨", + ĸ: "ĸ", + х: "х", + ќ: "ќ", + 𝕜: "𝕜", + 𝓀: "𝓀", + "⤛": "⤛", + "⤎": "⤎", + "⪋": "⪋", + "⥢": "⥢", + ĺ: "ĺ", + "⦴": "⦴", + λ: "λ", + "⦑": "⦑", + "⪅": "⪅", + "«": "«", + "⤟": "⤟", + "⤝": "⤝", + "↫": "↫", + "⤹": "⤹", + "⥳": "⥳", + "↢": "↢", + "⪫": "⪫", + "⤙": "⤙", + "⪭": "⪭", + "⪭︀": "⪭︀", + "⤌": "⤌", + "❲": "❲", + "{": "{", + "[": "[", + "⦋": "⦋", + "⦏": "⦏", + "⦍": "⦍", + ľ: "ľ", + ļ: "ļ", + л: "л", + "⤶": "⤶", + "⥧": "⥧", + "⥋": "⥋", + "↲": "↲", + "≤": "≤", + "⇇": "⇇", + "⋋": "⋋", + "⪨": "⪨", + "⩿": "⩿", + "⪁": "⪁", + "⪃": "⪃", + "⋚︀": "⋚︀", + "⪓": "⪓", + "⋖": "⋖", + "⥼": "⥼", + 𝔩: "𝔩", + "⪑": "⪑", + "⥪": "⥪", + "▄": "▄", + љ: "љ", + "⥫": "⥫", + "◺": "◺", + ŀ: "ŀ", + "⎰": "⎰", + "≨": "≨", + "⪉": "⪉", + "⪇": "⪇", + "⋦": "⋦", + "⟬": "⟬", + "⇽": "⇽", + "⟼": "⟼", + "↬": "↬", + "⦅": "⦅", + 𝕝: "𝕝", + "⨭": "⨭", + "⨴": "⨴", + "∗": "∗", + "◊": "◊", + "(": "(", + "⦓": "⦓", + "⥭": "⥭", + "‎": "‎", + "⊿": "⊿", + "‹": "‹", + 𝓁: "𝓁", + "⪍": "⪍", + "⪏": "⪏", + "‚": "‚", + ł: "ł", + "⪦": "⪦", + "⩹": "⩹", + "⋉": "⋉", + "⥶": "⥶", + "⩻": "⩻", + "⦖": "⦖", + "◃": "◃", + "⥊": "⥊", + "⥦": "⥦", + "≨︀": "≨︀", + "∺": "∺", + "¯": "¯", + "♂": "♂", + "✠": "✠", + "▮": "▮", + "⨩": "⨩", + м: "м", + "—": "—", + 𝔪: "𝔪", + "℧": "℧", + µ: "µ", + "⫰": "⫰", + "−": "−", + "⨪": "⨪", + "⫛": "⫛", + "⊧": "⊧", + 𝕞: "𝕞", + 𝓂: "𝓂", + μ: "μ", + "⊸": "⊸", + "⋙̸": "⋙̸", + "≫⃒": "≫⃒", + "⇍": "⇍", + "⇎": "⇎", + "⋘̸": "⋘̸", + "≪⃒": "≪⃒", + "⇏": "⇏", + "⊯": "⊯", + "⊮": "⊮", + ń: "ń", + "∠⃒": "∠⃒", + "⩰̸": "⩰̸", + "≋̸": "≋̸", + ʼn: "ʼn", + "♮": "♮", + "⩃": "⩃", + ň: "ň", + ņ: "ņ", + "⩭̸": "⩭̸", + "⩂": "⩂", + н: "н", + "–": "–", + "⇗": "⇗", + "⤤": "⤤", + "≐̸": "≐̸", + "⤨": "⤨", + 𝔫: "𝔫", + "↮": "↮", + "⫲": "⫲", + "⋼": "⋼", + "⋺": "⋺", + њ: "њ", + "≦̸": "≦̸", + "↚": "↚", + "‥": "‥", + 𝕟: "𝕟", + "¬": "¬", + "⋹̸": "⋹̸", + "⋵̸": "⋵̸", + "⋷": "⋷", + "⋶": "⋶", + "⋾": "⋾", + "⋽": "⋽", + "⫽⃥": "⫽⃥", + "∂̸": "∂̸", + "⨔": "⨔", + "↛": "↛", + "⤳̸": "⤳̸", + "↝̸": "↝̸", + 𝓃: "𝓃", + "⊄": "⊄", + "⫅̸": "⫅̸", + "⊅": "⊅", + "⫆̸": "⫆̸", + ñ: "ñ", + ν: "ν", + "#": "#", + "№": "№", + " ": " ", + "⊭": "⊭", + "⤄": "⤄", + "≍⃒": "≍⃒", + "⊬": "⊬", + "≥⃒": "≥⃒", + ">⃒": ">⃒", + "⧞": "⧞", + "⤂": "⤂", + "≤⃒": "≤⃒", + "<⃒": "<⃒", + "⊴⃒": "⊴⃒", + "⤃": "⤃", + "⊵⃒": "⊵⃒", + "∼⃒": "∼⃒", + "⇖": "⇖", + "⤣": "⤣", + "⤧": "⤧", + ó: "ó", + ô: "ô", + о: "о", + ő: "ő", + "⨸": "⨸", + "⦼": "⦼", + œ: "œ", + "⦿": "⦿", + 𝔬: "𝔬", + "˛": "˛", + ò: "ò", + "⧁": "⧁", + "⦵": "⦵", + "⦾": "⦾", + "⦻": "⦻", + "⧀": "⧀", + ō: "ō", + ω: "ω", + ο: "ο", + "⦶": "⦶", + 𝕠: "𝕠", + "⦷": "⦷", + "⦹": "⦹", + "∨": "∨", + "⩝": "⩝", + ℴ: "ℴ", + ª: "ª", + º: "º", + "⊶": "⊶", + "⩖": "⩖", + "⩗": "⩗", + "⩛": "⩛", + ø: "ø", + "⊘": "⊘", + õ: "õ", + "⨶": "⨶", + ö: "ö", + "⌽": "⌽", + "¶": "¶", + "⫳": "⫳", + "⫽": "⫽", + п: "п", + "%": "%", + ".": ".", + "‰": "‰", + "‱": "‱", + 𝔭: "𝔭", + φ: "φ", + ϕ: "ϕ", + "☎": "☎", + π: "π", + ϖ: "ϖ", + ℎ: "ℎ", + "+": "+", + "⨣": "⨣", + "⨢": "⨢", + "⨥": "⨥", + "⩲": "⩲", + "⨦": "⨦", + "⨧": "⨧", + "⨕": "⨕", + 𝕡: "𝕡", + "£": "£", + "⪳": "⪳", + "⪷": "⪷", + "⪹": "⪹", + "⪵": "⪵", + "⋨": "⋨", + "′": "′", + "⌮": "⌮", + "⌒": "⌒", + "⌓": "⌓", + "⊰": "⊰", + 𝓅: "𝓅", + ψ: "ψ", + " ": " ", + 𝔮: "𝔮", + 𝕢: "𝕢", + "⁗": "⁗", + 𝓆: "𝓆", + "⨖": "⨖", + "?": "?", + "⤜": "⤜", + "⥤": "⥤", + "∽̱": "∽̱", + ŕ: "ŕ", + "⦳": "⦳", + "⦒": "⦒", + "⦥": "⦥", + "»": "»", + "⥵": "⥵", + "⤠": "⤠", + "⤳": "⤳", + "⤞": "⤞", + "⥅": "⥅", + "⥴": "⥴", + "↣": "↣", + "↝": "↝", + "⤚": "⤚", + "∶": "∶", + "❳": "❳", + "}": "}", + "]": "]", + "⦌": "⦌", + "⦎": "⦎", + "⦐": "⦐", + ř: "ř", + ŗ: "ŗ", + р: "р", + "⤷": "⤷", + "⥩": "⥩", + "↳": "↳", + "▭": "▭", + "⥽": "⥽", + 𝔯: "𝔯", + "⥬": "⥬", + ρ: "ρ", + ϱ: "ϱ", + "⇉": "⇉", + "⋌": "⋌", + "˚": "˚", + "‏": "‏", + "⎱": "⎱", + "⫮": "⫮", + "⟭": "⟭", + "⇾": "⇾", + "⦆": "⦆", + 𝕣: "𝕣", + "⨮": "⨮", + "⨵": "⨵", + ")": ")", + "⦔": "⦔", + "⨒": "⨒", + "›": "›", + 𝓇: "𝓇", + "⋊": "⋊", + "▹": "▹", + "⧎": "⧎", + "⥨": "⥨", + "℞": "℞", + ś: "ś", + "⪴": "⪴", + "⪸": "⪸", + š: "š", + ş: "ş", + ŝ: "ŝ", + "⪶": "⪶", + "⪺": "⪺", + "⋩": "⋩", + "⨓": "⨓", + с: "с", + "⋅": "⋅", + "⩦": "⩦", + "⇘": "⇘", + "§": "§", + ";": ";", + "⤩": "⤩", + "✶": "✶", + 𝔰: "𝔰", + "♯": "♯", + щ: "щ", + ш: "ш", + "­": "­", + σ: "σ", + ς: "ς", + "⩪": "⩪", + "⪞": "⪞", + "⪠": "⪠", + "⪝": "⪝", + "⪟": "⪟", + "≆": "≆", + "⨤": "⨤", + "⥲": "⥲", + "⨳": "⨳", + "⧤": "⧤", + "⌣": "⌣", + "⪪": "⪪", + "⪬": "⪬", + "⪬︀": "⪬︀", + ь: "ь", + "/": "/", + "⧄": "⧄", + "⌿": "⌿", + 𝕤: "𝕤", + "♠": "♠", + "⊓︀": "⊓︀", + "⊔︀": "⊔︀", + 𝓈: "𝓈", + "☆": "☆", + "⊂": "⊂", + "⫅": "⫅", + "⪽": "⪽", + "⫃": "⫃", + "⫁": "⫁", + "⫋": "⫋", + "⊊": "⊊", + "⪿": "⪿", + "⥹": "⥹", + "⫇": "⫇", + "⫕": "⫕", + "⫓": "⫓", + "♪": "♪", + "¹": "¹", + "²": "²", + "³": "³", + "⫆": "⫆", + "⪾": "⪾", + "⫘": "⫘", + "⫄": "⫄", + "⟉": "⟉", + "⫗": "⫗", + "⥻": "⥻", + "⫂": "⫂", + "⫌": "⫌", + "⊋": "⊋", + "⫀": "⫀", + "⫈": "⫈", + "⫔": "⫔", + "⫖": "⫖", + "⇙": "⇙", + "⤪": "⤪", + ß: "ß", + "⌖": "⌖", + τ: "τ", + ť: "ť", + ţ: "ţ", + т: "т", + "⌕": "⌕", + 𝔱: "𝔱", + θ: "θ", + ϑ: "ϑ", + þ: "þ", + "×": "×", + "⨱": "⨱", + "⨰": "⨰", + "⌶": "⌶", + "⫱": "⫱", + 𝕥: "𝕥", + "⫚": "⫚", + "‴": "‴", + "▵": "▵", + "≜": "≜", + "◬": "◬", + "⨺": "⨺", + "⨹": "⨹", + "⧍": "⧍", + "⨻": "⨻", + "⏢": "⏢", + 𝓉: "𝓉", + ц: "ц", + ћ: "ћ", + ŧ: "ŧ", + "⥣": "⥣", + ú: "ú", + ў: "ў", + ŭ: "ŭ", + û: "û", + у: "у", + ű: "ű", + "⥾": "⥾", + 𝔲: "𝔲", + ù: "ù", + "▀": "▀", + "⌜": "⌜", + "⌏": "⌏", + "◸": "◸", + ū: "ū", + ų: "ų", + 𝕦: "𝕦", + υ: "υ", + "⇈": "⇈", + "⌝": "⌝", + "⌎": "⌎", + ů: "ů", + "◹": "◹", + 𝓊: "𝓊", + "⋰": "⋰", + ũ: "ũ", + ü: "ü", + "⦧": "⦧", + "⫨": "⫨", + "⫩": "⫩", + "⦜": "⦜", + "⊊︀": "⊊︀", + "⫋︀": "⫋︀", + "⊋︀": "⊋︀", + "⫌︀": "⫌︀", + в: "в", + "⊻": "⊻", + "≚": "≚", + "⋮": "⋮", + 𝔳: "𝔳", + 𝕧: "𝕧", + 𝓋: "𝓋", + "⦚": "⦚", + ŵ: "ŵ", + "⩟": "⩟", + "≙": "≙", + ℘: "℘", + 𝔴: "𝔴", + 𝕨: "𝕨", + 𝓌: "𝓌", + 𝔵: "𝔵", + ξ: "ξ", + "⋻": "⋻", + 𝕩: "𝕩", + 𝓍: "𝓍", + ý: "ý", + я: "я", + ŷ: "ŷ", + ы: "ы", + "¥": "¥", + 𝔶: "𝔶", + ї: "ї", + 𝕪: "𝕪", + 𝓎: "𝓎", + ю: "ю", + ÿ: "ÿ", + ź: "ź", + ž: "ž", + з: "з", + ż: "ż", + ζ: "ζ", + 𝔷: "𝔷", + ж: "ж", + "⇝": "⇝", + 𝕫: "𝕫", + 𝓏: "𝓏", + "‍": "‍", + "‌": "‌", + }, + }, + }); + }, + 687: (r, e) => { + Object.defineProperty(e, "__esModule", { value: !0 }), + (e.numericUnicodeMap = { + 0: 65533, + 128: 8364, + 130: 8218, + 131: 402, + 132: 8222, + 133: 8230, + 134: 8224, + 135: 8225, + 136: 710, + 137: 8240, + 138: 352, + 139: 8249, + 140: 338, + 142: 381, + 145: 8216, + 146: 8217, + 147: 8220, + 148: 8221, + 149: 8226, + 150: 8211, + 151: 8212, + 152: 732, + 153: 8482, + 154: 353, + 155: 8250, + 156: 339, + 158: 382, + 159: 376, + }); + }, + 967: (r, e) => { + Object.defineProperty(e, "__esModule", { value: !0 }), + (e.fromCodePoint = + String.fromCodePoint || + function (r) { + return String.fromCharCode( + Math.floor((r - 65536) / 1024) + 55296, + ((r - 65536) % 1024) + 56320 + ); + }), + (e.getCodePoint = String.prototype.codePointAt + ? function (r, e) { + return r.codePointAt(e); + } + : function (r, e) { + return ( + 1024 * (r.charCodeAt(e) - 55296) + + r.charCodeAt(e + 1) - + 56320 + + 65536 + ); + }), + (e.highSurrogateFrom = 55296), + (e.highSurrogateTo = 56319); + }, + }, + a = {}; + function t(r) { + var o = a[r]; + if (void 0 !== o) return o.exports; + var c = (a[r] = { exports: {} }); + return e[r].call(c.exports, c, c.exports, t), c.exports; + } + (t.n = (r) => { + var e = r && r.__esModule ? () => r.default : () => r; + return t.d(e, { a: e }), e; + }), + (t.d = (r, e) => { + for (var a in e) + t.o(e, a) && + !t.o(r, a) && + Object.defineProperty(r, a, { enumerable: !0, get: e[a] }); + }), + (t.o = (r, e) => Object.prototype.hasOwnProperty.call(r, e)), + (r = t(563)), + (window.html_encode = r.encode), + (window.html_decode = r.decode); +})();