From 3eb631ab4ca6c10235534a768c2bade17e57264c Mon Sep 17 00:00:00 2001 From: = Date: Sat, 28 Nov 2020 04:37:13 +0100 Subject: [PATCH 1/3] QR Code first part --- src/publics/js/dev/utils/qrcode/test.html | 31 +++ src/publics/js/dev/utils/qrcode/test.js | 259 ++++++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 src/publics/js/dev/utils/qrcode/test.html create mode 100644 src/publics/js/dev/utils/qrcode/test.js diff --git a/src/publics/js/dev/utils/qrcode/test.html b/src/publics/js/dev/utils/qrcode/test.html new file mode 100644 index 0000000..b39c45f --- /dev/null +++ b/src/publics/js/dev/utils/qrcode/test.html @@ -0,0 +1,31 @@ + + + + + Title + + + +

QR CODE

+
+ + + diff --git a/src/publics/js/dev/utils/qrcode/test.js b/src/publics/js/dev/utils/qrcode/test.js new file mode 100644 index 0000000..59efd93 --- /dev/null +++ b/src/publics/js/dev/utils/qrcode/test.js @@ -0,0 +1,259 @@ +const size = 25; +const text = 'https://codewe.org/ckdl'; + +function int2bin(int, size=0){ + const str_bin = parseInt(int).toString(2); + return '0'.repeat(Math.max(0, size-str_bin.length)) + str_bin; +} + +/** + * Convert String to binary string with given size + * @param {string} str + * @return {string} + */ +function str2bin(str){ + return str.split('').map(char => { + const tb = char.charCodeAt(0).toString(2); + return '0'.repeat(Math.max(0, 8-tb.length)) + tb; + }).join(''); +} + +function bin2tab(bin, parser = a=>a){ + const bin_array = []; + for(let i=0;i= 256) last ^= 285; + log[i] = last; + antilog[last] = i; +} + +/*************************************\ +| NUMERATORS AND DENOMINATORS | +\*************************************/ + +// codewords are split into 8-bits blocks and convert in numbers +const split = codewords.match(/.{8}/g); +const numbers = split.map(x => parseInt(x,2)); + +// Based on https://www.thonky.com/qr-code-tutorial/error-correction-table +// Data get from 2-M line +const CORRECTOR_COUNT = 16; +// Data get from calculator https://www.thonky.com/qr-code-tutorial/generator-polynomial-tool?degree=16 +const BASE_GENERATOR = [ + [0,16], [120, 15], [104,14], [107,13], [109,12], [102,11], [161,10], [76,9], + [3,8], [91,7],[191,6], [147,5],[169,4], [182,3], [194,2], [225,1], [120, 0] +]; + +// Numerator is calculated according to codewords and CORRECTION_COUNT +let numerator = []; +for(let i=0;i [e[0], e[1]+numbers.length-1]); + +/*************************************\ +| POLYNOMIAL DIVISION | +\*************************************/ + +// log[NUM_ALPHA] is necessary +// log[(DEN_ALPHA + alpha_sup) % 255] + +for(let i=0;i [log[(e[0] + alpha_sup) % 255], e[1]-i]); + + const quotient = []; + for(let i=0;i 0 || n > 0) quotient.push([(antilog[n] || 0), num_x]); + } + numerator = quotient; +} + +const error_correction = numerator.map(e => log[e[0]]); +const error_correction_bin = error_correction.map(x => int2bin(x)).join(''); + +/*************************************\ +| FINAL MESSAGE | +\*************************************/ + +const final_message = codewords + error_correction_bin; +const final_message_array = final_message.split(''); +console.log(final_message); + +/*************************************\ +| BASE MATRIX | +\*************************************/ + +const matrix = new Array(size); + +for(let i=0;i0;line--){ + console.log(line); + for(let col=size-1;col>=0;col--){ + let x = line < 4 ? line*2-1 : line*2; + const y = line%2 === 0 ? col : size-col-1; + if(!reserved.includes(y*size+x)) matrix[y][x] = parseInt(final_message_array.shift()); + x -= 1; + if(!reserved.includes(y*size+x)) matrix[y][x] = parseInt(final_message_array.shift()); + } +} + + + + + + + +// Create and insert +const container = document.getElementById('qrcode'); +const canvas = document.createElement('canvas'); + +canvas.width = size; +canvas.height = size; + +const ctx = canvas.getContext('2d'); +ctx.createImageData(size, size); +const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); +const data = imageData.data; +for (let i=0;i Date: Mon, 30 Nov 2020 12:54:39 +0100 Subject: [PATCH 2/3] QR-code --- src/publics/css/editor.less | 8 ++ src/publics/js/dev/page/editor.js | 3 + src/publics/js/dev/utils/qrcode/test.html | 5 +- src/publics/js/dev/utils/qrcode/test.js | 162 +++++++++++++++------- src/routes/index.js | 12 ++ src/views/editor.html | 12 -- 6 files changed, 136 insertions(+), 66 deletions(-) diff --git a/src/publics/css/editor.less b/src/publics/css/editor.less index 8ab332e..1102203 100644 --- a/src/publics/css/editor.less +++ b/src/publics/css/editor.less @@ -110,6 +110,14 @@ section#editor{ #qrcode{ background-color: white; display: inline-block; + + canvas{ + width: 128px; + height: 128px; + image-rendering: optimizeSpeed; + margin: 10px; + background-color: white; + } } } } diff --git a/src/publics/js/dev/page/editor.js b/src/publics/js/dev/page/editor.js index 29d91bf..9f71835 100644 --- a/src/publics/js/dev/page/editor.js +++ b/src/publics/js/dev/page/editor.js @@ -13,6 +13,7 @@ import {patterns} from "/js/dev/page/editor/prism/patterns.js"; import PrismCustom from "/js/dev/page/editor/prism/prismCustom.js"; import EditorSocket from "/js/dev/page/editor/socket.js"; import _ from "/js/dev/utils/element.js"; +import qrCode from "/js/dev/utils/qrcode/qrcode-m-2.js"; export const socket = new EditorSocket(doc_id); export const editor = new Editable(_.id('editor')); @@ -27,3 +28,5 @@ for(const child of _.id('editor').children){ } export const customize = new Customize(editor); + +qrCode('qrcode', document.documentURI.replace('/editor/', '/e/')); diff --git a/src/publics/js/dev/utils/qrcode/test.html b/src/publics/js/dev/utils/qrcode/test.html index b39c45f..2278bb6 100644 --- a/src/publics/js/dev/utils/qrcode/test.html +++ b/src/publics/js/dev/utils/qrcode/test.html @@ -27,5 +27,8 @@

QR CODE

- + + diff --git a/src/publics/js/dev/utils/qrcode/test.js b/src/publics/js/dev/utils/qrcode/test.js index 59efd93..b8e1053 100644 --- a/src/publics/js/dev/utils/qrcode/test.js +++ b/src/publics/js/dev/utils/qrcode/test.js @@ -1,5 +1,10 @@ -const size = 25; -const text = 'https://codewe.org/ckdl'; +const version = 2; // 1 or 2 +const size = ((version-1)*4)+21; +const text = 'https://codewe.org/abcde'; +const mode = 2; // 0 = Numeric, 1 = Alphanumeric, 2 = Binary +const correction_level = '00'; // https://www.thonky.com/qr-code-tutorial/format-version-information +const mask_pattern = int2bin(1, 3); // https://www.thonky.com/qr-code-tutorial/mask-patterns +const ie = '101000100100101'.split('').map(parseInt); // https://www.thonky.com/qr-code-tutorial/format-version-tables function int2bin(int, size=0){ const str_bin = parseInt(int).toString(2); @@ -18,28 +23,61 @@ function str2bin(str){ }).join(''); } -function bin2tab(bin, parser = a=>a){ - const bin_array = []; - for(let i=0;i int2bin(x, 10)).join(''); + if(text.length%3 === 1) codewords += int2bin(parseInt(text.slice(-1)), 4); + if(text.length%3 === 2) codewords += int2bin(parseInt(text.slice(-2)), 7); + break; + case 1: + codewords += text.match(/.{2}/g).map(function (x){ + if(x.length === 1) x = '0' + x; + return int2bin(alpha(x[0])*45 + alpha(x[1]), 11); + }).join(''); + if(text.length%2 === 1) codewords += int2bin(alpha(text.slice(-1)), 6); + break; + case 2: + codewords += str2bin(text); + break + default: + console.error(`Unknown mode ${mode}`); +} // Terminator codewords += '0000'; @@ -48,6 +86,9 @@ codewords += '0000'; codewords += '0'.repeat((8-(codewords.length % 8))%8); // Byte padding +//TODO Calculate length programmatically +// M-1: 128 +// M-2: 224 const padding_len = 224 - codewords.length; codewords += '1110110000010001'.repeat(18).slice(0, padding_len); @@ -78,13 +119,17 @@ const split = codewords.match(/.{8}/g); const numbers = split.map(x => parseInt(x,2)); // Based on https://www.thonky.com/qr-code-tutorial/error-correction-table -// Data get from 2-M line -const CORRECTOR_COUNT = 16; // Data get from calculator https://www.thonky.com/qr-code-tutorial/generator-polynomial-tool?degree=16 -const BASE_GENERATOR = [ +const BASE_GENERATOR = //[[0, 10], [251,9], [67,8], [46,7], [61,6], [118,5], [70,4], [64,3], [94,2], [32,1], [45, 0]]; + +// 2-M +[ [0,16], [120, 15], [104,14], [107,13], [109,12], [102,11], [161,10], [76,9], [3,8], [91,7],[191,6], [147,5],[169,4], [182,3], [194,2], [225,1], [120, 0] ]; +// 2-M : 16 +// 1-M : 10 +const CORRECTOR_COUNT = BASE_GENERATOR.length-1; // Numerator is calculated according to codewords and CORRECTION_COUNT let numerator = []; @@ -99,11 +144,8 @@ const base_denominator = BASE_GENERATOR.map(e => [e[0], e[1]+numbers.length-1]); | POLYNOMIAL DIVISION | \*************************************/ -// log[NUM_ALPHA] is necessary -// log[(DEN_ALPHA + alpha_sup) % 255] - for(let i=0;i [log[(e[0] + alpha_sup) % 255], e[1]-i]); @@ -112,15 +154,16 @@ for(let i=0;i 0 || n > 0) quotient.push([(antilog[n] || 0), num_x]); + if(i > 0 || n > 0) quotient.push([(n || 0), num_x]); } + numerator = quotient; } -const error_correction = numerator.map(e => log[e[0]]); -const error_correction_bin = error_correction.map(x => int2bin(x)).join(''); +const error_correction = numerator.map(e => e[0]); +const error_correction_bin = error_correction.map(x => int2bin(x, 8)).join(''); /*************************************\ | FINAL MESSAGE | @@ -128,7 +171,11 @@ const error_correction_bin = error_correction.map(x => int2bin(x)).join(''); const final_message = codewords + error_correction_bin; const final_message_array = final_message.split(''); -console.log(final_message); + +console.log(codewords.length, error_correction_bin.length); + +console.log(codewords.match(/.{8}/g).map(x => parseInt(x, 2).toString(16).toUpperCase()).join(' ')); +console.log(error_correction_bin.match(/.{8}/g).map(x => parseInt(x, 2).toString(16).toUpperCase()).join(' ')); /*************************************\ | BASE MATRIX | @@ -137,7 +184,7 @@ console.log(final_message); const matrix = new Array(size); for(let i=0;i0;line--){ - console.log(line); for(let col=size-1;col>=0;col--){ let x = line < 4 ? line*2-1 : line*2; const y = line%2 === 0 ? col : size-col-1; - if(!reserved.includes(y*size+x)) matrix[y][x] = parseInt(final_message_array.shift()); + const mask_reverse = !Boolean(y%2); + if(!reserved.includes(y*size+x)){ + if(final_message_array.length) matrix[y][x] = reverse(parseInt(final_message_array.shift()), mask_reverse); + else matrix[y][x] = reverse(0, mask_reverse); + } x -= 1; - if(!reserved.includes(y*size+x)) matrix[y][x] = parseInt(final_message_array.shift()); + if(!reserved.includes(y*size+x)){ + if(final_message_array.length) matrix[y][x] = reverse(parseInt(final_message_array.shift()), mask_reverse); + else matrix[y][x] = reverse(0, mask_reverse); + } } } @@ -230,6 +285,7 @@ for(let line=(size-1)/2;line>0;line--){ + // Create and insert const container = document.getElementById('qrcode'); const canvas = document.createElement('canvas'); diff --git a/src/routes/index.js b/src/routes/index.js index 6a26f09..c3ba8e3 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -33,6 +33,13 @@ const router = express.Router(); const hook = config.DISCORD_WEBHOOK ? new discordWebhook.Webhook(config.DISCORD_WEBHOOK) : null; +const client = require('prom-client'); + +const qr_scans = new client.Counter({ + name: 'total_qr_scans', + help: 'total_qr_scans', +}); + /** * Route serving editorindex page * @name get/ @@ -78,4 +85,9 @@ router.post('/report-issue', async (req, res, next) => { } }); +router.get('/e/:docId', async (req, res, next) => { + qr_scans.inc(); + res.redirect(`/editor/${req.params.docId}`); +}); + module.exports = router; diff --git a/src/views/editor.html b/src/views/editor.html index 5850d9e..ba5ac26 100644 --- a/src/views/editor.html +++ b/src/views/editor.html @@ -51,16 +51,4 @@

QR Code

{% else %} {% endif %} - - {% endblock %} From 0216a060e7863d6c43a3a8f3506db35995772099 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 30 Nov 2020 12:55:05 +0100 Subject: [PATCH 3/3] QR-code utils and compressed editor --- src/publics/js/dev/utils/qrcode/qrcode-m-2.js | 222 ++++++++++++++++++ src/publics/js/dist/editor.min.js | 1 + 2 files changed, 223 insertions(+) create mode 100644 src/publics/js/dev/utils/qrcode/qrcode-m-2.js create mode 100644 src/publics/js/dist/editor.min.js diff --git a/src/publics/js/dev/utils/qrcode/qrcode-m-2.js b/src/publics/js/dev/utils/qrcode/qrcode-m-2.js new file mode 100644 index 0000000..134ab4f --- /dev/null +++ b/src/publics/js/dev/utils/qrcode/qrcode-m-2.js @@ -0,0 +1,222 @@ +export default function qrCode(id, text){ + const size = 25; + const ie = '101000100100101'.split('').map(Number.parseInt); // https://www.thonky.com/qr-code-tutorial/format-version-tables + + function int2bin(int, size=0){ + const str_bin = Number.parseInt(int).toString(2); + return '0'.repeat(Math.max(0, size-str_bin.length)) + str_bin; + } + + /** + * Convert String to binary string with given size + * @param {string} str + * @return {string} + */ + function str2bin(str){ + return str.split('').map(char => { + const tb = char.charCodeAt(0).toString(2); + return '0'.repeat(Math.max(0, 8-tb.length)) + tb; + }).join(''); + } + + let codewords = '0100' + int2bin(text.length, 8) + str2bin(text) + '0000'; + codewords += '0'.repeat((8-(codewords.length % 8))%8); + codewords += '1110110000010001'.repeat(18).slice(0, 224 - codewords.length); + + /**************************************\ + | CALCULATE LOG AND ANTI-LOG TABLE | + \**************************************/ +// Based on https://www.thonky.com/qr-code-tutorial/log-antilog-table +// Log[x] = 2*Log[x-1] if result < 256 else result XOR 285 +// Antilog is the reversed table of log. Example: Log[2] = 4, so Antilog[4] = 2 + + const log = [1]; + const antilog = [NaN]; + + let last = 1; + for(let i=1;i<256;i++){ + last = 2 * last; + if(last >= 256) last ^= 285; + log[i] = last; + antilog[last] = i; + } + + /*************************************\ + | NUMERATORS AND DENOMINATORS | + \*************************************/ + + const numbers = codewords.match(/.{8}/g).map(x => Number.parseInt(x,2)); + +// Based on https://www.thonky.com/qr-code-tutorial/error-correction-table +// Data get from calculator https://www.thonky.com/qr-code-tutorial/generator-polynomial-tool?degree=16 + const BASE_GENERATOR = [ + [0,16], [120, 15], [104,14], [107,13], [109,12], [102,11], [161,10], [76,9], + [3,8], [91,7],[191,6], [147,5],[169,4], [182,3], [194,2], [225,1], [120, 0] + ]; + + const CORRECTOR_COUNT = BASE_GENERATOR.length-1; + +// Numerator is calculated according to codewords and CORRECTION_COUNT + let numerator = []; + for(let i=0;i [e[0], e[1]+numbers.length-1]); + + /*************************************\ + | POLYNOMIAL DIVISION | + \*************************************/ + + for(let i=0;i [log[(e[0] + alpha_sup) % 255], e[1]-i]); + + const quotient = []; + for(let i=0;i 0 || n > 0) quotient.push([(n || 0), num_x]); + } + + numerator = quotient; + } + const error_correction_bin = numerator.map(x => int2bin(x[0], 8)).join(''); + + /*************************************\ + | FINAL MESSAGE | + \*************************************/ + + const final_message = codewords + error_correction_bin; + const final_message_array = final_message.split(''); + + /*************************************\ + | BASE MATRIX | + \*************************************/ + + const matrix = new Array(size); +"https://codewe.org/abcfe" + for(let i=0;i0;line--){ + for(let col=size-1;col>=0;col--){ + let x = line < 4 ? line*2-1 : line*2; + const y = line%2 === 0 ? col : size-col-1; + const mask_reverse = !Boolean(y%2); + if(!reserved.includes(y*size+x)){ + if(final_message_array.length) matrix[y][x] = reverse(Number.parseInt(final_message_array.shift()), mask_reverse); + else matrix[y][x] = reverse(0, mask_reverse); + } + x -= 1; + if(!reserved.includes(y*size+x)){ + if(final_message_array.length) matrix[y][x] = reverse(Number.parseInt(final_message_array.shift()), mask_reverse); + else matrix[y][x] = reverse(0, mask_reverse); + } + } + } + + + + + + + + +// Create and insert + const container = document.getElementById(id); + const canvas = document.createElement('canvas'); + + canvas.width = size; + canvas.height = size; + + const ctx = canvas.getContext('2d'); + ctx.createImageData(size, size); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const data = imageData.data; + for (let i=0;i{"use strict";var t={843:(t,e,n)=>{n.d(e,{j6:()=>_,Wb:()=>O});const a={generic:[{matches:{1:[{name:"keyword.operator",pattern:/\=|\+/g},{name:"keyword.dot",pattern:/\./g}],2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\(|\s|\[|\=|:|\+|\.|\{|,)(('|")([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/|\#)(?!.*('|").*?[^:](\/\/|\#)).*?$/gm},{name:"constant.numeric",pattern:/\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi},{matches:{1:"keyword"},pattern:/\b(and|array|as|b(ool(ean)?|reak)|c(ase|atch|har|lass|on(st|tinue))|d(ef|elete|o(uble)?)|e(cho|lse(if)?|xit|xtends|xcept)|f(inally|loat|or(each)?|unction)|global|if|import|int(eger)?|long|new|object|or|pr(int|ivate|otected)|public|return|self|st(ring|ruct|atic)|switch|th(en|is|row)|try|(un)?signed|var|void|while)(?=\b)/gi},{name:"constant.language",pattern:/true|false|null/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\||\*|\=/g},{matches:{1:"function.call"},pattern:/(\w+?)(?=\()/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(function)\s(.*?)(?=\()/g}],python:[{name:"variable.self",pattern:/self/g},{name:"constant.language",pattern:/None|True|False|NotImplemented|\.\.\./g},{name:"support.object",pattern:/object/g},{name:"support.function.python",pattern:/\b(bs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|bin|file|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern)(?=\()/g},{matches:{1:"keyword"},pattern:/\b(pass|lambda|with|is|not|in|from|elif|raise|del)(?=\b)/g},{matches:{1:"storage.class",2:"entity.name.class",3:"entity.other.inherited-class"},pattern:/(class)\s+(\w+)\((\w+?)\)/g},{matches:{1:"storage.function",2:"support.magic"},pattern:/(def)\s+(__\w+)(?=\()/g},{name:"support.magic",pattern:/__(name)__/g},{matches:{1:"keyword.control",2:"support.exception.type"},pattern:/(except) (\w+):/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(def)\s+(\w+)(?=\()/g},{name:"entity.name.function.decorator",pattern:/@([\w\.]+)/g},{name:"comment.docstring",pattern:/('{3}|"{3})[\s\S]*?\1/gm}],javascript:[{name:"selector",pattern:/\$(?=\.|\()/g},{name:"support",pattern:/\b(window|document)\b/g},{name:"keyword",pattern:/\b(export|default|from)\b/g},{name:"function.call",pattern:/\b(then)(?=\()/g},{name:"variable.language.this",pattern:/\bthis\b/g},{name:"variable.language.super",pattern:/super(?=\.|\()/g},{name:"storage.type",pattern:/\b(const|let|var)(?=\s)/g},{matches:{1:"support.property"},pattern:/\.(length|node(Name|Value))\b/g},{matches:{1:"support.function"},pattern:/(setTimeout|setInterval)(?=\()/g},{matches:{1:"support.method"},pattern:/\.(getAttribute|replace|push|getElementById|getElementsByClassName|setTimeout|setInterval)(?=\()/g},{name:"string.regexp",matches:{1:"string.regexp.open",2:{name:"constant.regexp.escape",pattern:/\\(.){1}/g},3:"string.regexp.close",4:"string.regexp.modifier"},pattern:/(\/)((?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+)(\/)(?!\/)([igm]{0,3})/g},{matches:{1:"storage.type",3:"entity.function"},pattern:/(var)?(\s|^)(\S+)(?=\s?=\s?function\()/g},{matches:{1:"keyword",2:"variable.type"},pattern:/(new)\s+(?!Promise)([^\(]*)(?=\()/g},{name:"entity.function",pattern:/(\w+)(?=:\s{0,}function)/g},{name:"constant.other",pattern:/\*(?= as)/g},{matches:{1:"keyword",2:"constant.other"},pattern:/(export)\s+(\*)/g},{matches:{1:"storage.type.accessor",2:"entity.name.function"},pattern:/(get|set)\s+(\w+)(?=\()/g},{matches:{2:"entity.name.function"},pattern:/(^\s*)(\w+)(?=\([^\)]*?\)\s*\{)/gm},{matches:{1:"storage.type.class",2:"entity.name.class",3:"storage.modifier.extends",4:"entity.other.inherited-class"},pattern:/(class)\s+(\w+)(?:\s+(extends)\s+(\w+))?(?=\s*\{)/g},{name:"storage.type.function.arrow",pattern:/=>/g},{name:"support.class.promise",pattern:/\bPromise(?=(\(|\.))/g}],java:[{name:"constant",pattern:/\b(false|null|true|[A-Z_]+)\b/g},{matches:{1:"keyword",2:"support.namespace"},pattern:/(import|package)\s(.+)/g},{name:"keyword",pattern:/\b(abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/g},{name:"string",pattern:/(".*?")/g},{name:"char",pattern:/(')(.|\\.|\\u[\dA-Fa-f]{4})\1/g},{name:"integer",pattern:/\b(0x[\da-f]+|\d+)L?\b/g},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/).*?$/gm},{name:"support.annotation",pattern:/@\w+/g},{matches:{1:"entity.function"},pattern:/([^@\.\s]+)\(/g},{name:"entity.class",pattern:/\b([A-Z]\w*)\b/g},{name:"operator",pattern:/(\+{1,2}|-{1,2}|~|!|\*|\/|%|(?:<){1,2}|(?:>){1,3}|instanceof|(?:&){1,2}|\^|\|{1,2}|\?|:|(?:=|!|\+|-|\*|\/|%|\^|\||(?:<){1,2}|(?:>){1,3})?=)/g}],c:[{name:"meta.preprocessor",matches:{1:[{matches:{1:"keyword.define",2:"entity.name"},pattern:/(\w+)\s(\w+)\b/g},{name:"keyword.define",pattern:/endif/g},{name:"constant.numeric",pattern:/\d+/g},{matches:{1:"keyword.include",2:"string"},pattern:/(include)\s(.*?)$/g}]},pattern:/\#([\S\s]*?)$/gm},{name:"keyword",pattern:/\b(do|goto|typedef)\b/g},{name:"entity.label",pattern:/\w+:/g},{matches:{1:"storage.type",3:"storage.type",4:"entity.name.function"},pattern:/\b((un)?signed|const)? ?(void|char|short|int|long|float|double)\*? +((\w+)(?= ?\())?/g},{matches:{2:"entity.name.function"},pattern:/(\w|\*) +((\w+)(?= ?\())/g},{name:"storage.modifier",pattern:/\b(static|extern|auto|register|volatile|inline)\b/g},{name:"support.type",pattern:/\b(struct|union|enum)\b/g}],coffescript:[{name:"comment.block",pattern:/(\#{3})[\s\S]*\1/gm},{name:"string.block",pattern:/('{3}|"{3})[\s\S]*\1/gm},{name:"string.regex",matches:{2:{name:"comment",pattern:/\#(.*?)(?=\n)/g}},pattern:/(\/{3})([\s\S]*)\1/gm},{matches:{1:"keyword"},pattern:/\b(in|when|is|isnt|of|not|unless|until|super)(?=\b)/gi},{name:"keyword.operator",pattern:/\?/g},{name:"constant.language",pattern:/\b(undefined|yes|on|no|off)\b/g},{name:"keyword.variable.coffee",pattern:/@(\w+)/gi},{name:"reset",pattern:/object|class|print/gi},{matches:{1:"entity.name.function",2:"keyword.operator",3:{name:"function.argument.coffee",pattern:/([\@\w]+)/g},4:"keyword.function"},pattern:/(\w+)\s{0,}(=|:)\s{0,}\((.*?)((-|=)>)/gi},{matches:{1:{name:"function.argument.coffee",pattern:/([\@\w]+)/g},2:"keyword.function"},pattern:/\s\((.*?)\)\s{0,}((-|=)>)/gi},{matches:{1:"entity.name.function",2:"keyword.operator",3:"keyword.function"},pattern:/(\w+)\s{0,}(=|:)\s{0,}((-|=)>)/gi},{matches:{1:"storage.class",2:"entity.name.class",3:"storage.modifier.extends",4:"entity.other.inherited-class"},pattern:/\b(class)\s(\w+)(\sextends\s)?([\w\\]*)?\b/g},{matches:{1:"keyword.new",2:{name:"support.class",pattern:/\w+/g}},pattern:/\b(new)\s(.*?)(?=\s)/g}],"c#":[{name:"constant",pattern:/\b(false|null|true)\b/g},{name:"keyword",pattern:/\b(abstract|add|alias|ascending|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|double|do|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|foreach|for|from|get|global|goto|group|if|implicit|int|interface|internal|into|in|is|join|let|lock|long|namespace|new|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|try|typeof|uint|unchecked|ulong|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/g},{matches:{1:"keyword",2:{name:"support.class",pattern:/\w+/g}},pattern:/(typeof)\s([^\$].*?)(\)|;)/g},{matches:{1:"keyword.namespace",2:{name:"support.namespace",pattern:/\w+/g}},pattern:/\b(namespace)\s(.*?);/g},{matches:{1:"storage.modifier",2:"storage.class",3:"entity.name.class",4:"storage.modifier.extends",5:"entity.other.inherited-class"},pattern:/\b(abstract|sealed)?\s?(class)\s(\w+)(\sextends\s)?([\w\\]*)?\s?\{?(\n|\})/g},{name:"keyword.static",pattern:/\b(static)\b/g},{matches:{1:"keyword.new",2:{name:"support.class",pattern:/\w+/g}},pattern:/\b(new)\s([^\$].*?)(?=\)|\(|;|&)/g},{name:"string",pattern:/(")(.*?)\1/g},{name:"integer",pattern:/\b(0x[\da-f]+|\d+)\b/g},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/)[\s\S]*?$/gm},{name:"operator",pattern:/(\+\+|\+=|\+|--|-=|-|<<=|<<|<=|=>|>>=|>>|>=|!=|!|~|\^|\|\||&&|&=|&|\?\?|::|:|\*=|\*|\/=|%=|\|=|==|=)/g},{name:"preprocessor",pattern:/(\#if|\#else|\#elif|\#endif|\#define|\#undef|\#warning|\#error|\#line|\#region|\#endregion|\#pragma)[\s\S]*?$/gm}],css:[{name:"comment",pattern:/\/\*[\s\S]*?\*\//gm},{name:"constant.hex-color",pattern:/#([a-f0-9]{3}|[a-f0-9]{6})(?=;|\s|,|\))/gi},{matches:{1:"constant.numeric",2:"keyword.unit"},pattern:/(\d+)(px|em|cm|s|%)?/g},{name:"string",pattern:/('|")(.*?)\1/g},{name:"support.css-property",matches:{1:"support.vendor-prefix"},pattern:/(-o-|-moz-|-webkit-|-ms-)?[\w-]+(?=\s?:)(?!.*\{)/g},{matches:{1:[{name:"entity.name.sass",pattern:/&/g},{name:"direct-descendant",pattern:/>/g},{name:"entity.name.class",pattern:/\.[\w\-_]+/g},{name:"entity.name.id",pattern:/\#[\w\-_]+/g},{name:"entity.name.pseudo",pattern:/:[\w\-_]+/g},{name:"entity.name.tag",pattern:/\w+/g}]},pattern:/([\w\ ,\n:\.\#\&\;\-_]+)(?=.*\{)/g},{matches:{2:"support.vendor-prefix",3:"support.css-value"},pattern:/(:|,)\s*(-o-|-moz-|-webkit-|-ms-)?([a-zA-Z-]*)(?=\b)(?!.*\{)/g}],go:[{matches:{1:[{name:"keyword.operator",pattern:/\=|\+/g}],2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\(`|"){1}/g}}},pattern:/(\(|\s|\[|\=|:|\+|\{|,)((`|")([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/)(?!.*(`|").*?\1).*?$/gm},{matches:{1:"keyword"},pattern:/\b(d(efault|efer)|fallthrough|go(to)?|range|select)(?=\b)/gi},{name:"keyword",pattern:/\bpackage(?=\s*\w)/gi},{matches:{1:"storage.type",2:"entity.name.struct"},pattern:/\b(type)\s+(\w+)\b(?=\s+struct\b)/gi},{matches:{1:"storage.type",2:"entity.name.type"},pattern:/\b(type)\s+(\w+)\b/gi},{name:"storage.type",pattern:/\b(bool|byte|complex(64|128)|float(32|64)|func|interface|map|rune|string|struct|u?int(8|16|32|64)?|var)(?=\b)/g},{name:"keyword.operator.initialize",pattern:/\:=/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(func)\s+(?:\(.*?\))\s+(.*?)(?=\()/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(func)\s+(.*?)(?=\()/g}],html:[{name:"source.php.embedded",matches:{1:"variable.language.php-tag",2:{language:"php"},3:"variable.language.php-tag"},pattern:/(<\?php|<\?=?(?!xml))([\s\S]*?)(\?>)/gm},{name:"source.css.embedded",matches:{1:{matches:{1:"support.tag.style",2:[{name:"entity.tag.style",pattern:/^style/g},{name:"string",pattern:/('|")(.*?)(\1)/g},{name:"entity.tag.style.attribute",pattern:/(\w+)/g}],3:"support.tag.style"},pattern:/(<\/?)(style.*?)(>)/g},2:{language:"css"},3:"support.tag.style",4:"entity.tag.style",5:"support.tag.style"},pattern:/(<style.*?>)([\s\S]*?)(<\/)(style)(>)/gm},{name:"source.js.embedded",matches:{1:{matches:{1:"support.tag.script",2:[{name:"entity.tag.script",pattern:/^script/g},{name:"string",pattern:/('|")(.*?)(\1)/g},{name:"entity.tag.script.attribute",pattern:/(\w+)/g}],3:"support.tag.script"},pattern:/(<\/?)(script.*?)(>)/g},2:{language:"javascript"},3:"support.tag.script",4:"entity.tag.script",5:"support.tag.script"},pattern:/(<script(?! src).*?>)([\s\S]*?)(<\/)(script)(>)/gm},{name:"comment.html",pattern:/<\!--[\S\s]*?-->/g},{matches:{1:"support.tag.open",2:"support.tag.close"},pattern:/(<)|(\/?\??>)/g},{name:"support.tag",matches:{1:"support.tag",2:"support.tag.special",3:"support.tag-name"},pattern:/(<\??)(\/|\!?)(\w+)/g},{matches:{1:"support.attribute"},pattern:/([a-z-]+)(?=\=)/gi},{matches:{1:"support.operator",2:"string.quote",3:"string.value",4:"string.quote"},pattern:/(=)('|")(.*?)(\2)/g},{matches:{1:"support.operator",2:"support.value"},pattern:/(=)([a-zA-Z\-0-9]*)\b/g},{matches:{1:"support.attribute"},pattern:/\s([\w-]+)(?=\s|>)(?![\s\S]*<)/g}],json:[{matches:{0:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\"|\')(\\?.)*?\1/g},{name:"constant.numeric",pattern:/\b(-?(0x)?\d*\.?[\da-f]+|NaN|-?Infinity)\b/gi},{name:"constant.language",pattern:/\b(true|false|null)\b/g}],lua:[{matches:{1:{name:"keyword.operator",pattern:/\=/g},2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\(|\s|\[|\=)(('|")([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/\-{2}\[{2}\-{2}[\s\S]*?\-{2}\]{2}\-{2}|(\-{2})[\s\S]*?$/gm},{name:"constant.numeric",pattern:/\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi},{matches:{1:"keyword"},pattern:/\b((a|e)nd|in|repeat|break|local|return|do|for|then|else(if)?|function|not|if|or|until|while)(?=\b)/gi},{name:"constant.language",pattern:/true|false|nil/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\||\*|\=|#|\.{2}/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(function)\s+(\w+[\:|\.]?\w+?)(?=\()/g},{matches:{1:"support.function"},pattern:/\b(print|require|module|\w+\.\w+)(?=\()/g}],php:[{name:"support",pattern:/\becho\b/gi},{matches:{1:"variable.dollar-sign",2:"variable"},pattern:/(\$)(\w+)\b/g},{name:"constant.language",pattern:/true|false|null/gi},{name:"constant",pattern:/\b[A-Z0-9_]{2,}\b/g},{name:"keyword.dot",pattern:/\./g},{name:"keyword",pattern:/\b(die|end(for(each)?|switch|if)|case|require(_once)?|include(_once)?)(?=\b)/gi},{matches:{1:"keyword",2:{name:"support.class",pattern:/\w+/g}},pattern:/(instanceof)\s([^\$].*?)(\)|;)/gi},{matches:{1:"support.function"},pattern:/\b(array(_key_exists|_merge|_keys|_shift)?|isset|count|empty|unset|printf|is_(array|string|numeric|object)|sprintf|each|date|time|substr|pos|str(len|pos|tolower|_replace|totime)?|ord|trim|in_array|implode|end|preg_match|explode|fmod|define|link|list|get_class|serialize|file|sort|mail|dir|idate|log|intval|header|chr|function_exists|dirname|preg_replace|file_exists)(?=\()/gi},{name:"variable.language.php-tag",pattern:/(<\?(php)?|\?>)/gi},{matches:{1:"keyword.namespace",2:{name:"support.namespace",pattern:/\w+/g}},pattern:/\b(namespace|use)\s(.*?);/gi},{matches:{1:"storage.modifier",2:"storage.class",3:"entity.name.class",4:"storage.modifier.extends",5:"entity.other.inherited-class",6:"storage.modifier.extends",7:"entity.other.inherited-class"},pattern:/\b(abstract|final)?\s?(class|interface|trait)\s(\w+)(\sextends\s)?([\w\\]*)?(\simplements\s)?([\w\\]*)?\s?\{?(\n|\})/gi},{name:"keyword.static",pattern:/self::|static::/gi},{matches:{1:"storage.function",2:"entity.name.function.magic"},pattern:/(function)\s(__.*?)(?=\()/gi},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(function)\s(.*?)(?=\()/gi},{matches:{1:"keyword.new",2:{name:"support.class",pattern:/\w+/g}},pattern:/\b(new)\s([^\$][a-z0-9_\\]*?)(?=\)|\(|;)/gi},{matches:{1:{name:"support.class",pattern:/\w+/g},2:"keyword.static"},pattern:/([\w\\]*?)(::)(?=\b|\$)/g},{matches:{2:{name:"support.class",pattern:/\w+/g}},pattern:/(\(|,\s?)([\w\\]*?)(?=\s\$)/g}],ruby:[{matches:{1:"variable.language",2:{language:null}},pattern:/^(__END__)\n((?:.*\n)*)/gm},{name:"string",matches:{1:"string.open",2:[{name:"string.interpolation",matches:{1:"string.open",2:{language:"ruby"},3:"string.close"},pattern:/(\#\{)(.*?)(\})/g}],3:"string.close"},pattern:/("|`)(.*?[^\\\1])?(\1)/g},{name:"string",pattern:/('|"|`)([^\\\1\n]|\\.)*?\1/g},{name:"string",pattern:/%[qQ](?=(\(|\[|\{|<|.)(.*?)(?:'|\)|\]|\}|>|\1))(?:\(\2\)|\[\2\]|\{\2\}|\<\2>|\1\2\1)/g},{matches:{1:"string",2:"string",3:"string"},pattern:/(<<)(\w+).*?$([\s\S]*?^\2)/gm},{matches:{1:"string",2:"string",3:"string"},pattern:/(<<\-)(\w+).*?$([\s\S]*?\2)/gm},{name:"string.regexp",matches:{1:"string.regexp",2:{name:"string.regexp",pattern:/\\(.){1}/g},3:"string.regexp",4:"string.regexp"},pattern:/(\/)(.*?)(\/)([a-z]*)/g},{name:"string.regexp",matches:{1:"string.regexp",2:{name:"string.regexp",pattern:/\\(.){1}/g},3:"string.regexp",4:"string.regexp"},pattern:/%r(?=(\(|\[|\{|<|.)(.*?)('|\)|\]|\}|>|\1))(?:\(\2\)|\[\2\]|\{\2\}|\<\2>|\1\2\1)([a-z]*)/g},{name:"comment",pattern:/#.*$/gm},{name:"comment",pattern:/^\=begin[\s\S]*?\=end$/gm},{matches:{1:"constant"},pattern:/(\w+:)[^:]/g},{matches:{1:"constant.symbol"},pattern:/[^:](:(?:\w+|(?=['"](.*?)['"])(?:"\2"|'\2')))/g},{name:"constant.numeric",pattern:/\b(0x[\da-f]+|[\d_]+)\b/g},{name:"support.class",pattern:/\b[A-Z]\w*(?=((\.|::)[A-Za-z]|\[))/g},{name:"constant",pattern:/\b[A-Z]\w*\b/g},{matches:{1:"storage.class",2:"entity.name.class",3:"entity.other.inherited-class"},pattern:/\s*(class)\s+((?:(?:::)?[A-Z]\w*)+)(?:\s+<\s+((?:(?:::)?[A-Z]\w*)+))?/g},{matches:{1:"storage.module",2:"entity.name.class"},pattern:/\s*(module)\s+((?:(?:::)?[A-Z]\w*)+)/g},{name:"variable.global",pattern:/\$([a-zA-Z_]\w*)\b/g},{name:"variable.class",pattern:/@@([a-zA-Z_]\w*)\b/g},{name:"variable.instance",pattern:/@([a-zA-Z_]\w*)\b/g},{matches:{1:"keyword.control"},pattern:/[^\.]\b(BEGIN|begin|case|class|do|else|elsif|END|end|ensure|for|if|in|module|rescue|then|unless|until|when|while)\b(?![?!])/g},{matches:{1:"keyword.control.pseudo-method"},pattern:/[^\.]\b(alias|alias_method|break|next|redo|retry|return|super|undef|yield)\b(?![?!])|\bdefined\?|\bblock_given\?/g},{matches:{1:"constant.language"},pattern:/\b(nil|true|false)\b(?![?!])/g},{matches:{1:"variable.language"},pattern:/\b(__(FILE|LINE)__|self)\b(?![?!])/g},{matches:{1:"keyword.special-method"},pattern:/\b(require|gem|initialize|new|loop|include|extend|raise|attr_reader|attr_writer|attr_accessor|attr|catch|throw|private|module_function|public|protected)\b(?![?!])/g},{name:"keyword.operator",pattern:/\s\?\s|=|<<|<<=|%=|&=|\*=|\*\*=|\+=|\-=|\^=|\|{1,2}=|<<|<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|%|&|\*\*|\*|\+|\-|\/|\||~|>>/g},{matches:{1:"keyword.operator.logical"},pattern:/[^\.]\b(and|not|or)\b/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(def)\s(.*?)(?=(\s|\())/g}],sql:[{matches:{2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"|`){1}/g}}},pattern:/(\(|\s|\[|\=|:|\+|\.|\{|,)(('|"|`)([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/--.*$|\/\*[\s\S]*?\*\/|(\/\/)[\s\S]*?$/gm},{name:"constant.numeric",pattern:/\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi},{name:"function.call",pattern:/(\w+?)(?=\()/g},{name:"keyword",pattern:/\b(ABSOLUTE|ACTION|ADA|ADD|ALL|ALLOCATE|ALTER|AND|ANY|ARE|AS|ASC|ASSERTION|AT|AUTHORIZATION|AVG|BEGIN|BETWEEN|BIT|BIT_LENGTH|BOTH|BY|CASCADE|CASCADED|CASE|CAST|CATALOG|CHAR|CHARACTER|CHARACTER_LENGTH|CHAR_LENGTH|CHECK|CLOSE|COALESCE|COLLATE|COLLATION|COLUMN|COMMIT|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONTINUE|CONVERT|CORRESPONDING|COUNT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATE|DAY|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DESC|DESCRIBE|DESCRIPTOR|DIAGNOSTICS|DISCONNECT|DISTINCT|DOMAIN|DOUBLE|DROP|ELSE|END|END-EXEC|ESCAPE|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXTERNAL|EXTRACT|FALSE|FETCH|FIRST|FLOAT|FOR|FOREIGN|FORTRAN|FOUND|FROM|FULL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|HAVING|HOUR|IDENTITY|IMMEDIATE|IN|INCLUDE|INDEX|INDICATOR|INITIALLY|INNER|INPUT|INSENSITIVE|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|IS|ISOLATION|JOIN|KEY|LANGUAGE|LAST|LEADING|LEFT|LEVEL|LIKE|LIMIT|LOCAL|LOWER|MATCH|MAX|MIN|MINUTE|MODULE|MONTH|NAMES|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONE|NOT|NULL|NULLIF|NUMERIC|OCTET_LENGTH|OF|ON|ONLY|OPEN|OPTION|OR|ORDER|OUTER|OUTPUT|OVERLAPS|PAD|PARTIAL|PASCAL|POSITION|PRECISION|PREPARE|PRESERVE|PRIMARY|PRIOR|PRIVILEGES|PROCEDURE|PUBLIC|READ|REAL|REFERENCES|RELATIVE|RESTRICT|REVOKE|RIGHT|ROLLBACK|ROWS|SCHEMA|SCROLL|SECOND|SECTION|SELECT|SESSION|SESSION_USER|SET|SIZE|SMALLINT|SOME|SPACE|SQL|SQLCA|SQLCODE|SQLERROR|SQLSTATE|SQLWARNING|SUBSTRING|SUM|SYSTEM_USER|TABLE|TEMPORARY|THEN|TIME|TIMESTAMP|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TRAILING|TRANSACTION|TRANSLATE|TRANSLATION|TRIM|TRUE|UNION|UNIQUE|UNKNOWN|UPDATE|UPPER|USAGE|USER|USING|VALUE|VALUES|VARCHAR|VARYING|VIEW|WHEN|WHENEVER|WHERE|WITH|WORK|WRITE|YEAR|ZONE|USE)(?=\b)/gi},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\||\*|=/g}],scheme:[{name:"plain",pattern:/>|</g},{name:"comment",pattern:/;.*$/gm},{name:"constant.language",pattern:/#t|#f|'\(\)/g},{name:"constant.symbol",pattern:/'[^()\s#]+/g},{name:"constant.number",pattern:/\b\d+(?:\.\d*)?\b/g},{name:"string",pattern:/".+?"/g},{matches:{1:"storage.function",2:"variable"},pattern:/\(\s*(define)\s+\(?(\S+)/g},{matches:{1:"keyword"},pattern:/\(\s*(begin|define\-syntax|if|lambda|quasiquote|quote|set!|syntax\-rules|and|and\-let\*|case|cond|delay|do|else|or|let|let\*|let\-syntax|letrec|letrec\-syntax)(?=[\]()\s#])/g},{matches:{1:"entity.function"},pattern:/\(\s*(eqv\?|eq\?|equal\?|number\?|complex\?|real\?|rational\?|integer\?|exact\?|inexact\?|=|<|>|<=|>=|zero\?|positive\?|negative\?|odd\?|even\?|max|min|\+|\-|\*|\/|abs|quotient|remainder|modulo|gcd|lcm|numerator|denominator|floor|ceiling|truncate|round|rationalize|exp|log|sin|cos|tan|asin|acos|atan|sqrt|expt|make\-rectangular|make\-polar|real\-part|imag\-part|magnitude|angle|exact\->inexact|inexact\->exact|number\->string|string\->number|not|boolean\?|pair\?|cons|car|cdr|set\-car!|set\-cdr!|caar|cadr|cdar|cddr|caaar|caadr|cadar|caddr|cdaar|cdadr|cddar|cdddr|caaaar|caaadr|caadar|caaddr|cadaar|cadadr|caddar|cadddr|cdaaar|cdaadr|cdadar|cdaddr|cddaar|cddadr|cdddar|cddddr|null\?|list\?|list|length|append|reverse|list\-tail|list\-ref|memq|memv|member|assq|assv|assoc|symbol\?|symbol\->string|string\->symbol|char\?|char=\?|char<\?|char>\?|char<=\?|char>=\?|char\-ci=\?|char\-ci<\?|char\-ci>\?|char\-ci<=\?|char\-ci>=\?|char\-alphabetic\?|char\-numeric\?|char\-whitespace\?|char\-upper\-case\?|char\-lower\-case\?|char\->integer|integer\->char|char\-upcase|char\-downcase|string\?|make\-string|string|string\-length|string\-ref|string\-set!|string=\?|string\-ci=\?|string<\?|string>\?|string<=\?|string>=\?|string\-ci<\?|string\-ci>\?|string\-ci<=\?|string\-ci>=\?|substring|string\-append|string\->list|list\->string|string\-copy|string\-fill!|vector\?|make\-vector|vector|vector\-length|vector\-ref|vector\-set!|vector\->list|list\->vector|vector\-fill!|procedure\?|apply|map|for\-each|force|call\-with\-current\-continuation|call\/cc|values|call\-with\-values|dynamic\-wind|eval|scheme\-report\-environment|null\-environment|interaction\-environment|call\-with\-input\-file|call\-with\-output\-file|input\-port\?|output\-port\?|current\-input\-port|current\-output\-port|with\-input\-from\-file|with\-output\-to\-file|open\-input\-file|open\-output\-file|close\-input\-port|close\-output\-port|read|read\-char|peek\-char|eof\-object\?|char\-ready\?|write|display|newline|write\-char|load|transcript\-on|transcript\-off)(?=[\]()\s#])/g}],r:[{matches:{1:{name:"keyword.operator",pattern:/\=|<\-|<-/g},2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\(|\s|\[|\=|:)(('|")([^\\\1]|\\.)*?(\3))/gm},{matches:{1:"constant.language"},pattern:/\b(NULL|NA|TRUE|FALSE|T|F|NaN|Inf|NA_integer_|NA_real_|NA_complex_|NA_character_)\b/g},{matches:{1:"constant.symbol"},pattern:/[^0-9a-zA-Z\._](LETTERS|letters|month\.(abb|name)|pi)/g},{name:"keyword.operator",pattern:/<-|<-|-|==|<=|<=|>>|>=|<|>|&&|&&|&|&|!=|\|\|?|\*|\+|\^|\/|%%|%\/%|\=|%in%|%\*%|%o%|%x%|\$|:|~|\[{1,2}|\]{1,2}/g},{matches:{1:"storage",3:"entity.function"},pattern:/(\s|^)(.*)(?=\s?=\s?function\s\()/g},{matches:{1:"storage.function"},pattern:/[^a-zA-Z0-9._](function)(?=\s*\()/g},{matches:{1:"namespace",2:"keyword.operator",3:"function.call"},pattern:/([a-zA-Z][a-zA-Z0-9._]+)([:]{2,3})([.a-zA-Z][a-zA-Z0-9._]*(?=\s*\())\b/g},{name:"support.function",pattern:/(^|[^0-9a-zA-Z\._])(array|character|complex|data\.frame|double|integer|list|logical|matrix|numeric|vector)(?=\s*\()/g}],haskell:[{name:"comment",pattern:/\{\-\-[\s\S(\w+)]+[\-\-][\}$]/gm},{name:"comment",pattern:/\-\-(.*)/g},{matches:{1:"keyword",2:"support.namespace"},pattern:/\b(module)\s(\w+)\s[\(]?(\w+)?[\)?]\swhere/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\/\=|\||\@|\:|\.|\+{2}|\:|\*|\=|#|\.{2}|(\\)[a-zA-Z_]/g},{name:"keyword",pattern:/\b(case|class|foreign|hiding|qualified|data|family|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|in|otherwise|module|newtype|of|then|type|where)\b/g},{name:"keyword",pattern:/[\`][a-zA-Z_']*?[\`]/g},{matches:{1:"keyword",2:"keyword.operator"},pattern:/\b(infix|infixr|infixl)+\s\d+\s(\w+)*/g},{name:"entity.class",pattern:/\b([A-Z][A-Za-z0-9_']*)/g},{name:"meta.preprocessor",matches:{1:[{matches:{1:"keyword.define",2:"entity.name"},pattern:/(\w+)\s(\w+)\b/g},{name:"keyword.define",pattern:/endif/g},{name:"constant.numeric",pattern:/\d+/g},{matches:{1:"keyword.include",2:"string"},pattern:/(include)\s(.*?)$/g}]},pattern:/^\#([\S\s]*?)$/gm}],d:[{name:"constant",pattern:/\b(false|null|true)\b/gm},{name:"keyword",pattern:/\b(abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|else|enum|export|extern|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|in|inout|int|interface|invariant|ireal|is|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|__FILE__|__LINE__|__gshared|__traits|__vector|__parameters)\b/gm},{matches:{1:"keyword",2:{name:"support.class",pattern:/\w+/gm}},pattern:/(typeof)\s([^\$].*?)(\)|;)/gm},{matches:{1:"keyword.namespace",2:{name:"support.namespace",pattern:/\w+/gm}},pattern:/\b(namespace)\s(.*?);/gm},{matches:{1:"storage.modifier",2:"storage.class",3:"entity.name.class",4:"storage.modifier.extends",5:"entity.other.inherited-class"},pattern:/\b(abstract|sealed)?\s?(class)\s(\w+)(\sextends\s)?([\w\\]*)?\s?\{?(\n|\})/gm},{name:"keyword.static",pattern:/\b(static)\b/gm},{matches:{1:"keyword.new",2:{name:"support.class",pattern:/\w+/gm}},pattern:/\b(new)\s([^\$].*?)(?=\)|\(|;|&)/gm},{name:"string",pattern:/("|')(.*?)\1/gm},{name:"integer",pattern:/\b(0x[\da-f]+|\d+)\b/gm},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|\/\+[\s\S]*?\+\/|(\/\/)[\s\S]*?$/gm},{name:"operator",pattern:/(\/|\/=|&=|&&|&|\|=|\|\|\||\-=|\-\-|\-|\+=|\+\+|\+|<=|<<|<|<<=|<>=|<>|>|>>>=|>>=|>=|>>|>>>|!=|!<>=|!<>|!<=|!<|!>=|!>|!|[|]|\$|==|=|\*=|\*|%=|%|\^\^=|\^=|\^\^|\^|~=|~|@|=>|\:)/gm}],smalltalk:[{name:"keyword.pseudovariable",pattern:/self|thisContext/g},{name:"keyword.constant",pattern:/false|nil|true/g},{name:"string",pattern:/'([^']|'')*'/g},{name:"string.symbol",pattern:/#\w+|#'([^']|'')*'/g},{name:"string.character",pattern:/\$\w+/g},{name:"comment",pattern:/"([^"]|"")*"/g},{name:"constant.numeric",pattern:/-?\d+(\.\d+)?((r-?|s)[A-Za-z0-9]+|e-?[0-9]+)?/g},{name:"entity.name.class",pattern:/\b[A-Z]\w*/g},{name:"entity.name.function",pattern:/\b[a-z]\w*:?/g},{name:"entity.name.binary",pattern:/(<|>|&|[=~\|\\\/!@*\-_+])+/g},{name:"operator.delimiter",pattern:/;[\(\)\[\]\{\}]|#\[|#\(^\./g}],oz:[{name:"operator",pattern:/(<:|:>|::|&|@|#|_|\[\]|\.\.\.)/g},{name:"operator.assignment",pattern:/(\=|\:=)/g},{name:"operator.comparison",pattern:/<|=<|==|\=|>=|>/g},{name:"operator.list",pattern:/\b\|\b/g},{name:"constant.numeric",pattern:/(\d+\.\d+|\d+)/g},{name:"constant.language",pattern:/\b(false|true|nil)\b/g},{name:"variable",pattern:/[A-Z][0-9A-z]*/g},{name:"keyword.control",pattern:/(?e-t))}function i(t,e,n,a){return n>=t&&nt&&a${e}`}function c(t,c,l,p=0){let g=c.pattern;if(!g)return!1;const u=!g.global;g=function(t){let e="";return t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),new RegExp(t.source,e)}(g);const d=g.exec(l);if(!d)return!1;!c.name&&c.matches&&"string"==typeof c.matches[0]&&(c.name=c.matches[0],delete c.matches[0]);let m=d[0];const h=d.index+p,f=d[0].length+h;if(h===f)return!1;if(function(t,a){for(let l in n)if(l=parseInt(l,10),r=l,s=n[l],c=a,((o=t)!==r||c!==s)&&o<=r&&c>=s&&(delete n[l],delete e[l]),i(l,n[l],t,a))return!0;var r,s,o,c;return!1}(h,f))return{remaining:l.substr(f-p),offset:f};function b(t,e){const n=d[e];if(!n)return;const s=c.matches[e],i=s.language,l=s.name&&s.matches?s.matches:s,p=function(t,n,s){m=r(function(t,e){let n=0;for(let a=1;a0)if(t.nodeType===Node.TEXT_NODE)t.textContent.length=0){let n=document.getSelection(),a=c.createRange(t,{count:e});a&&(a.collapse(!1),n.removeAllRanges(),n.addRange(a))}}static setRangeStart(t,e){if(e>=0){let n=document.getSelection(),a=c.createRange(t,{count:e});n.getRangeAt(0).setStart(a.endContainer,a.endOffset)}}static getEndPosition(t){let e=0;const n=document.getSelection();if(n&&n.rangeCount>0){let a=n.getRangeAt(0),r=a.cloneRange();r.selectNodeContents(t),r.setEnd(a.endContainer,a.endOffset),e=r.toString().length}return e}static getBeginPosition(t){let e=0;const n=document.getSelection();if(n&&n.rangeCount>0){let a=n.getRangeAt(0),r=a.cloneRange();r.selectNodeContents(t),r.setEnd(a.startContainer,a.startOffset),e=r.toString().length}return e}}class l{static isDebug(){return!0}}class p{constructor(t=0){this.size=t,this.stack=[]}push(t){this.stack.push(t),this.size>=1&&(this.stack=this.stack.slice(-this.size))}get(t){return t<0?this.stack[this.stack.length+t]:this.stack[t]}}class g{constructor(t){this.size=t,this.stack={},this.old=new p(t)}push(t,e){this.stack[t]=e}get(t){return this.stack[t]}add(t,e){this.push(t,{send:Date.now(),data:e})}archive(t,e,n=null){const a=this.stack[t];return delete this.stack[t],a.server=e,a.received=n||Date.now(),this.old.push(a),a}getAll(){return this.stack}getSize(){return Object.keys(this.stack).length}}class u{constructor(t,e,...n){this.name=t,this.verbosity=e,this.fcts=n}}const d={DEBUG:new u("DEBUG",6,console.debug),INFO:new u("INFO",5,console.info),LOG:new u("LOG",4,console.log),WARN:new u("WARN",3,console.warn),ERROR:new u("ERROR",2,console.error),CRITICAL:new u("CRITICAL",1,console.error)},m=window.location.origin,h=new p(1e3);class f{static has(){return l.isDebug()}static entry(t,e,...n){let a=null;e&&e.stack&&(a=e.stack.toString().split(/\r\n|\n/)[1].replace(m,""));const r=class{static full(){const t=new Date;return`${t.getFullYear()}.${t.getMonth()+1}.${t.getDate()}-${t.getHours()}:${t.getMinutes()}:${t.getSeconds()}`}static day(){const t=new Date;return`${t.getFullYear()}.${t.getMonth()+1}.${t.getDate()}`}}.full();if(h.push([r,t,a,n]),f.has()||t.verbosity<=2)for(const e of t.fcts)e(`${r} - ${t.name} - ${a} - `,...n)}static debug(...t){f.entry(d.DEBUG,new Error,...t)}static info(...t){f.entry(d.INFO,new Error,...t)}static log(...t){f.entry(d.LOG,new Error,...t)}static warn(...t){f.entry(d.WARN,new Error,...t)}static error(...t){f.entry(d.ERROR,new Error,...t)}static critical(...t){f.entry(d.CRITICAL,new Error,...t)}}class b{static id(t){return document.getElementById(t)}static class(t){return document.getElementsByClassName(t)}static attribute(t,e){return document.querySelector("["+t+'"'+e+'"]')}}function y(){return 0===window.getSelection().rangeCount?null:window.getSelection().getRangeAt(0).startContainer}function w(t,e=y()){try{return e.nodeType!==Node.TEXT_NODE&&e.hasAttribute(t)?e:w(t,e.parentElement)}catch(t){return null}}function E(t,e=y()){try{return t.includes(e.nodeName.toLowerCase())?e:E(t,e.parentElement)}catch(t){return null}}function v(t){return String(t).replaceAll("<","<").replaceAll(">",">")}class A{constructor(t,e){this.element=t,this.lang=e,this.pattern=a[e].concat(a.generic)}setLang(t){this.lang=t,this.pattern=a[t]|this.pattern}getLang(){return this.lang}getElement(){return this.element}getPattern(){return this.pattern}apply(){const t=new o(this.pattern);this.element.innerHTML=t.refract(v(this.element.innerText)).replaceAll("\n",""),""===this.element.innerHTML.replaceAll("\n","")&&(this.element.innerHTML="
")}ApplyWithCaret(){const t=c.getBeginPosition(this.element);this.apply(),c.setPosition(this.element,t)}static onCurrent(t){return new A(w("uuid"),t)}}class T{static trigger(t,e){document.dispatchEvent(new CustomEvent(t,e))}static triggerCustom(t,e){document.dispatchEvent(new CustomEvent(t,{detail:e}))}}class S{static string(t,e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"){let n="";for(let a=0;a"+t+"

"+e+"

",document.getElementById("body").appendChild(s),setTimeout((()=>{s.remove()}),n)}const k=[16,17,18,19,20,27,33,34,35,36,37,38,39,40,45,112,113,114,115,116,117,118,119,120,121,122,123,144,145,225];class I{static isExtra(t){return k.includes(t)}static ctrl(t){return window.navigator.platform.match("Mac")?t.metaKey:t.ctrlKey}}class C{constructor(t){this.editable=t,this.history=new p(2),this.change=!1,this.getAll()}hasChange(){return this.change}select(t){return document.querySelector(`[uuid='${t}']`)}getAll(){let t=[];for(let e of this.editable.children)e.hasAttribute("uuid")?t.push({uuid:e.getAttribute("uuid"),content:e.innerText.replaceAll("\n","")}):f.error("Error when trying to get all content of lines: ",e," has no UUID attribute.");return this.history.push(t),t}update(t,e){let n=this.select(t);n?(n.innerText=v(e),new A(n,language).apply()):f.warn(`Error when trying to update element with uuid '${t}': No div has this uuid.`)}new(t,e,n){if(this.select(t))f.warn(`Children with uuid ${t} still exist.`);else{const a=this.select(e);a.parentNode.insertBefore(function(t,e,n){const a=document.createElement("div");a.innerHTML=e;for(const[t,e]of Object.entries(n))a.setAttribute(t,e);return a}(0,n+"
",{uuid:t}),a.nextSibling)}}remove(t){let e=this.select(t);e?e.remove():f.warn(`The element with uuid '${t}' can't be removed: it doesn't exist.`)}decompose(t){let e=[],n={};for(const a of t)e.push(a.uuid),n[a.uuid]=a.content;return[e,n]}getDiff(t){const[e,n]=this.decompose(this.history.get(-2)),[a,r]=this.decompose(this.history.get(-1));let s=[];for(const[a,r]of this.history.get(-1).entries())e.includes(r.uuid)?n[r.uuid]===r.content||r.uuid in t&&t[r.uuid]===r.content||s.push(["set",[r.uuid,r.content]]):r.uuid in t?r.content!==t[r.uuid]&&s.push(["set",[r.uuid,r.content]]):s.push(["new",[r.uuid,this.history.get(-1)[a-1].uuid,r.content]]);for(const t of this.history.get(-2))a.includes(t.uuid)||s.push(["delete",[t.uuid]]);return s}}class R{static setLine(t,e){return{type:"set-line",data:{id:t,content:e}}}static newLine(t,e,n){return{type:"new-line",data:{id:t,previous:e,content:n}}}static deleteLine(t){return{type:"delete-line",data:{id:t}}}static save(t){return{type:"save",data:t}}}class L{constructor(t,e=1,n=null){this.element=t,this.oldSize=n||4,this.set(e,n),console.log(this)}set(t,e=null){this.type=t,this.setSize(e)}setSize(t){this.oldSize=this.size,0===this.type?(this.size=t,this.size||(this.size=8),this.element.style.tabSize=this.size+"px"):1===this.type?(this.size=t,this.size||(this.size=4),this.element.style.tabSize=2*this.size+"px"):(this.size=t,this.element.style.tabSize="inherit")}get(){return 1===this.type?" ".repeat(this.size):0===this.type?"\t":void 0}getCompletion(t){return 1===this.type?" ".repeat(this.size-t%this.size):0===this.type?"\t":void 0}getCompletionSize(t){return 1===this.type?this.size-t%this.size:1}updateText(t){const e=Math.max(t.search(/\S/),0),n=~~(e/this.oldSize)*this.size+e%this.oldSize;return" ".repeat(n)+t.slice(e)}}class x{constructor(t){window.WebSocket?(this.options=t||{},f.debug("Websocket connection to",this.uri()),this.ws=new WebSocket(this.uri().href),this.ws.onmessage=this.onMessage,this.waitingStack=new g(120),document.addEventListener("socket.confirm",(t=>{this.confirm(t.detail)})),setInterval((()=>{const t=this.waitingStack.getSize();t>20?N("Connexion","It seems than you are disconnected",2e3,"#ff501e"):t>5&&N("Connexion","It seems than you are disconnected",2e3,"#ff9000")}),1e3),document.addEventListener("socket.receive.ping",(t=>{this.send(JSON.stringify({event:"pong",time:Date.now()}))}))):f.critical("Browser doesn\t support websockets")}uri(){const t=new URL("ws://localhost");if(t.protocol=this.options.secure?"wss":"ws",t.port=this.port(t.protocol.endsWith(":")?t.protocol.slice(0,-1):t.protocol),t.hostname=this.options.hostname||window.location.origin,t.pathname=void 0!==this.options.pathname?"/"+this.options.pathname||0:"",this.options.params)for(const[e,n]of Object.entries(this.options.params))t.searchParams.set(e,n);return t}port(t){return this.options.port&&("wss"===t&&443!==Number(this.options.port)||"ws"===t&&80!==Number(this.options.port))?this.options.port:""}send(t){if("join"!==t.event){const e=S.string(9);this.waitingStack.add(e,t),f.debug(`SEND ${e} to '${t.event}': `,t),t.uuid=e}this.ws.send(JSON.stringify(t))}onMessage(t){try{const e=JSON.parse(t.data);f.debug("RECEIVE PACKET",e),e.event&&e.data?T.triggerCustom(`socket.receive.${e.event}`,e.data):e.code&&e.uuid&&e.time?T.triggerCustom("socket.confirm",e):f.error("This packet hasn't valid event and data.",e)}catch(e){f.debug(e),f.error("This packet can't be parsed as JSON.",t)}}confirm(t){const e=t.code,n=t.uuid,a=t.time;"OK"!==e&&f.warn(`${n} come back with a non OK code.`);const r=this.waitingStack.archive(n,a);f.debug(`up: ${r.server-r.send}ms, down: ${r.received-r.server}ms`)}}const O=new class{constructor(t,e=1e3){this.doc_id=t,this.ws=new x({secure:"https:"===document.location.protocol,port:window.location.port,hostname:window.location.host.includes(":")?window.location.host.split(":")[0]:window.location.host}),this.stack={UPDATE_EVENT:[]},this.preprocess=[],this.ws.ws.onopen=()=>{this.join(),setInterval((()=>{for(const t of this.preprocess)t[0](...t[1]);this.stack.UPDATE_EVENT.length&&this.send("update",this.stack.UPDATE_EVENT.splice(0,this.stack.UPDATE_EVENT.length))}),e)},document.addEventListener("socket.send",(t=>{t.detail.hasOwnProperty("request")&&this.stack.UPDATE_EVENT.push(t.detail.request),t.detail.hasOwnProperty("requests")&&this.stack.UPDATE_EVENT.push(...t.detail.requests)})),document.addEventListener("socket.send_now",(t=>{this.send(t.detail.name,t.detail.requests)})),document.addEventListener("socket.preprocess",(t=>{const e=t.detail[0];let n=t.detail[1];if(void 0===e)return;void 0===n&&(n=[]);const a=[e,n];this.preprocess.includes(a)||(this.preprocess.push(a),f.debug("New socket.preprocess",a))}))}send(t,e={}){this.ws.send({event:t,room:this.doc_id,data:e})}join(){this.send("join")}}(doc_id),_=new class{constructor(t,e=initial_size){this.editable=t,this.tab=Number.isInteger(e)?new L(t,1,e):4,this.linesManager=new C(t),this.last_request={},this.keepSpace=!1,document.addEventListener("socket.receive.update",(t=>{if(t&&t.detail&&t.detail&&"function"==typeof t.detail[Symbol.iterator])for(const e of t.detail)e.type?T.triggerCustom("editor."+e.type,e.data):f.warn("Trying to trigger a null received event.");else f.warn("Trying to iterate on non-iterable data.")})),T.triggerCustom("socket.preprocess",[this.coroutine,[this]]),this.editable.addEventListener("keyup",(t=>{if(!I.isExtra(t.keyCode)){switch(t.keyCode){case 13:try{this.keepSpace=!1;let t=w("uuid"),e=t.previousElementSibling,n=S.string(10);t.setAttribute("uuid",n);let a=e.innerText.search(/\S/);a<0&&(a=0),e.innerText.trimEnd().endsWith(":")&&(a+=this.tab.getCompletionSize(a)),t.innerHTML=" ".repeat(a)+t.innerHTML,c.setPosition(t,a),0===t.innerText.length&&(t.innerHTML="
")}catch(t){f.error("Error when trying to customize the new line")}break;default:t.ctrlKey||t.altKey||A.onCurrent(language).ApplyWithCaret()}this.linesManager.change=!0}})),this.editable.addEventListener("paste",(t=>{const e=document.getSelection();let n=(t.clipboardData||window.clipboardData).getData("text");if(n){const a=n.split("\n");!function(t){return!!E(["div","section"]).hasAttribute("uuid")&&E(["div","section"],e.anchorNode)===E(["div","section"],e.focusNode)&&(1===t.length||e.anchorNode===e.focusNode&&e.anchorOffset===e.focusOffset)}(a)?(t.preventDefault(),f.debug("Prevent action when trying to paste on multiple line."),N("Paste Event","Sorry, you can't past over a multiline selection",5e3)):a.length>1&&(t.preventDefault(),this.multilinesInsert(a))}else t.preventDefault(),f.warn("Error when trying to get the content of your clipboard."),N("Paste Event","Error with content of your clipboard",5e3)})),this.editable.addEventListener("keydown",(t=>{if(I.ctrl(t)&&83===t.keyCode)return t.preventDefault(),void N("Save","Your document is still saved automatically",5e3,"#228b22");if(I.isExtra(t.keyCode))return;const e=document.getSelection(),n=E(["div","section"],e.anchorNode),a=E(["div","section"],e.focusNode),r=w("uuid");if(!r)return t.preventDefault(),void N("Editor","Sorry, your action has been canceled because you are not on any line.",5e3);switch(n.hasAttribute("uuid")&&a.hasAttribute("uuid")&&(0!==c.getBeginPosition(r)&&0!==c.getEndPosition(r)||n===a)||c.setRangeStart(r,1),t.keyCode){case 9:t.preventDefault(),this.insertTab();break;case 13:if(t.shiftKey)return N("Shift+Enter","Please just use Enter to avoid any bugs.",5e3),void t.preventDefault();this.keepSpace?(f.debug("Prevent action when trying to add new line (key is probably maintain)."),t.preventDefault()):this.keepSpace=!0;break;case 8:0===c.getBeginPosition(r)&&(t.preventDefault(),this.removeLine(r))}})),document.addEventListener("editor.set-line",(t=>{const e=t.detail.id,n=t.detail.content;this.last_request[e]=n,this.linesManager.update(e,n)})),document.addEventListener("editor.new-line",(t=>{const e=t.detail.id,n=t.detail.previous,a=t.detail.content;this.last_request[e]=a,this.linesManager.new(e,n,a)})),document.addEventListener("editor.delete-line",(t=>{const e=t.detail.id;e in this.last_request&&delete this.last_request[e],this.linesManager.remove(e)}))}insertTab(){document.getSelection().collapseToStart(),document.getSelection().getRangeAt(0).insertNode(document.createTextNode(this.tab.getCompletion(c.getBeginPosition(w("uuid"))))),document.getSelection().collapseToEnd(),A.onCurrent(language).ApplyWithCaret()}multilinesInsert(t){const e=w("uuid");var n,a,r;e.innerHTML=(n=e.innerText,a=t[0],r=c.getBeginPosition(e),n.slice(0,r)+a+n.slice(r)),A.onCurrent(language).apply();let s=e.getAttribute("uuid");for(let e=1;e
","
"),t.remove(),c.setPosition(e,n)}}coroutine(t){if(t.linesManager.hasChange()){t.linesManager.getAll();const e=t.makeRequestsForDiff();T.triggerCustom("socket.send",{requests:e}),t.linesManager.change=!1}}makeRequestsForDiff(t=this.linesManager.getDiff(this.last_request)){let e=[];for(const n of t)switch(n[0]){case"set":e.push(R.setLine(...n[1]));break;case"new":e.push(R.newLine(...n[1]));break;case"delete":e.push(R.deleteLine(...n[1]))}return e}updateAllHighlighting(){const t=w("uuid");for(const e of this.editable.children)t===e?new A(e,language).ApplyWithCaret():new A(e,language).apply()}}(b.id("editor"));var D,z;new class{constructor(t){this.editor=t,this.current=new Map,this.color=S.randInt(0,255,3),this.uuid=S.string(10),this.request={},document.addEventListener("editor.cursor-moves",(t=>{this.update(t)})),document.dispatchEvent(new CustomEvent("socket.preprocess",{detail:[this.sendCursorPosition,[this]]})),this.editor.addEventListener("focus",(()=>{y()!==this.editor&&(this.request=this.cursorRequest())})),this.editor.addEventListener("click",(()=>{y()!==this.editor&&(this.request=this.cursorRequest())})),this.editor.addEventListener("keypress",(()=>{y()!==this.editor&&(this.request=this.cursorRequest())}))}cursorRequest(){let t=w("uuid");for(const e of this.current.entries())if(e[0]!==this.uuid&&e[1][1]===t)return{};return t.hasAttribute("uuid")?{type:"cursor-moves",data:{uuid:t.getAttribute("uuid"),userId:this.uuid,color:this.color}}:{}}sendCursorPosition(t){const e=t.request;t&&Object.keys(e).length>0&&(T.triggerCustom("socket.send",{request:e}),t.request={})}update(t){const e=t.detail;this.current.has(e.userId)&&(this.current.get(e.userId)[0].remove(),this.current.get(e.userId)[1].removeAttribute("contenteditable"),this.current.get(e.userId)[1].classList.remove("noteditable"),this.current.delete(e.userId));const n=document.querySelector('div[uuid="'+e.uuid+'"]');if(null===n)return void(l.isDebug()&&console.log("Cursor position doesn't exist"));const a=document.createElement("div");a.classList.add("pointer"),a.style.top=n.offsetTop+"px",a.style.backgroundColor="rgb("+e.color[0]+", "+e.color[1]+", "+e.color[2]+")",l.isDebug()&&(a.id=S.string(20)),b.id("body").appendChild(a),n.setAttribute("contenteditable","false"),n.classList.add("noteditable"),setTimeout((()=>{this.current.has(e.userId)&&Date.now()-this.current.get(e.userId)[2]>9e3&&(this.current.get(e.userId)[0].remove(),this.current.get(e.userId)[1].removeAttribute("contenteditable"),this.current.get(e.userId)[1].classList.remove("noteditable"),this.current.delete(e.userId))}),1e4),this.current.set(e.userId,[a,n,Date.now()])}}(b.id("editor")),D=b.id("download"),z=b.id("editor"),D.addEventListener("click",(()=>{const t=z.innerText.replaceAll("\n\n","\n");D.setAttribute("href","data:Content-type, "+escape(t))})),Object.keys(a).includes(language)||(language="generic");for(const t of b.id("editor").children)new A(t,language).apply();new class{constructor(t){this.editable=t,document.getElementById("option-language").addEventListener("change",(t=>{language=t.target.value.toLowerCase(),this.editable.updateAllHighlighting(),O.send("language",{language})})),document.addEventListener("socket.receive.language",(t=>{Object.keys(a).includes(t.detail.language.toLowerCase())&&(language=t.detail.language.toLowerCase(),document.getElementById("option-language").value=language,this.editable.updateAllHighlighting())}));for(const t of Object.keys(a)){const e=document.createElement("option");e.innerText=t,t===language&&(e.selected=!0),document.getElementById("option-language").appendChild(e)}document.getElementById("option-space-size").addEventListener("change",(t=>{_.tab.setSize(t.target.value);for(const t of this.editable.editable.children)t.innerText=_.tab.updateText(t.innerText),new A(t,language).apply();O.send("changeTabSize",{size:t.target.value})})),document.getElementById("option-space-size").value=this.editable.tab.size,document.addEventListener("socket.receive.changeTabSize",(t=>{if(t.detail.size&&Number.isInteger(parseInt(t.detail.size))){_.tab.setSize(t.detail.size),document.getElementById("option-space-size").value=t.detail.size;for(const t of this.editable.editable.children)t.innerText=_.tab.updateText(t.innerText),new A(t,language).apply()}}))}}(_),function(t,e){const n=25,a="101000100100101".split("").map(Number.parseInt);function r(t,e=0){const n=Number.parseInt(t).toString(2);return"0".repeat(Math.max(0,e-n.length))+n}let s="0100"+r(e.length,8)+e.split("").map((t=>{const e=t.charCodeAt(0).toString(2);return"0".repeat(Math.max(0,8-e.length))+e})).join("")+"0000";s+="0".repeat((8-s.length%8)%8),s+="1110110000010001".repeat(18).slice(0,224-s.length);const i=[1],o=[NaN];let c=1;for(let t=1;t<256;t++)c*=2,c>=256&&(c^=285),i[t]=c,o[c]=t;const l=s.match(/.{8}/g).map((t=>Number.parseInt(t,2))),p=[[0,16],[120,15],[104,14],[107,13],[109,12],[102,11],[161,10],[76,9],[3,8],[91,7],[191,6],[147,5],[169,4],[182,3],[194,2],[225,1],[120,0]],g=p.length-1;let u=[];for(let t=0;t[t[0],t[1]+l.length-1]));for(let t=0;t[i[(n[0]+e)%255],n[1]-t])),a=[];for(let t=0;t0||o>0)&&a.push([o||0,r])}u=a}const m=(s+u.map((t=>r(t[0],8))).join("")).split(""),h=new Array(n);for(let t=0;t0;t--)for(let e=24;e>=0;e--){let a=t<4?2*t-1:2*t;const r=t%2==0?e:n-e-1,s=!Boolean(r%2);f.includes(r*n+a)||(m.length?h[r][a]=y(Number.parseInt(m.shift()),s):h[r][a]=y(0,s)),a-=1,f.includes(r*n+a)||(m.length?h[r][a]=y(Number.parseInt(m.shift()),s):h[r][a]=y(0,s))}const w=document.getElementById("qrcode"),E=document.createElement("canvas");E.width=n,E.height=n;const v=E.getContext("2d");v.createImageData(n,n);const A=v.getImageData(0,0,E.width,E.height),T=A.data;for(let t=0;t{for(var a in e)n.o(e,a)&&!n.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n(843)})(); \ No newline at end of file