{"version":3,"sources":["webpack:///./node_modules/monaco-editor/esm/vs/basic-languages/ruby/ruby.js"],"names":["conf","comments","lineComment","blockComment","brackets","autoClosingPairs","open","close","surroundingPairs","indentationRules","increaseIndentPattern","RegExp","decreaseIndentPattern","language","tokenPostfix","keywords","keywordops","builtins","declarations","linedecls","operators","token","symbols","escape","escapes","decpart","decimal","delim","heredelim","regexpctl","regexpesc","tokenizer","root","cases","next","end","for","include","$1","dodecl","switchTo","do","modifier","sstring","dstring","heredoc","interpolated","interpolated_compound","pregexp","regexp","regexcontrol","regexrange","regexpcomment","pstring","qstring","qqstring","whitespace","comment"],"mappings":"gHAAA,qFAIO,IAAIA,EAAO,CACdC,SAAU,CACNC,YAAa,IACbC,aAAc,CAAC,SAAU,SAE7BC,SAAU,CACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,MAEVC,iBAAkB,CACd,CAAEC,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,MAExBC,iBAAkB,CACd,CAAEF,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,KACpB,CAAED,KAAM,IAAKC,MAAO,MAExBE,iBAAkB,CACdC,sBAAuB,IAAIC,OAAO,2MAClCC,sBAAuB,IAAID,OAAO,8FAmD/BE,EAAW,CAClBC,aAAc,QACdC,SAAU,CACN,WACA,eACA,WACA,QACA,MACA,QACA,MACA,QACA,QACA,OACA,QACA,MACA,WACA,KACA,OACA,QACA,MACA,SACA,MACA,QACA,KACA,KACA,SACA,OACA,MACA,MACA,KACA,OACA,SACA,QACA,SACA,OACA,QACA,OACA,OACA,QACA,SACA,QACA,OACA,QACA,SAEJC,WAAY,CAAC,KAAM,KAAM,MAAO,IAAK,IAAK,MAC1CC,SAAU,CACN,UACA,SACA,UACA,UACA,SACA,cACA,YACA,uBACA,yBACA,OAGJC,aAAc,CACV,SACA,QACA,MACA,OACA,KACA,QACA,MACA,KACA,QACA,QACA,UAEJC,UAAW,CAAC,MAAO,OAAQ,KAAM,QAAS,MAAO,KAAM,QAAS,QAAS,UACzEC,UAAW,CACP,IACA,IACA,IACA,MACA,KACA,MACA,KACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,KACA,KACA,KACA,MACA,IACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,MACA,MACA,KACA,MACA,MACA,MAEJhB,SAAU,CACN,CAAEE,KAAM,IAAK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","file":"js/chunk-2d2295e9.da2ae697.js","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nexport var conf = {\n comments: {\n lineComment: '#',\n blockComment: ['=begin', '=end']\n },\n brackets: [\n ['(', ')'],\n ['{', '}'],\n ['[', ']']\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" }\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" }\n ],\n indentationRules: {\n increaseIndentPattern: new RegExp('^\\\\s*((begin|class|(private|protected)\\\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|([^#]*\\\\sdo\\\\b)|([^#]*=\\\\s*(case|if|unless)))\\\\b([^#\\\\{;]|(\"|\\'|/).*\\\\4)*(#.*)?$'),\n decreaseIndentPattern: new RegExp('^\\\\s*([}\\\\]]([,)]?\\\\s*(#|$)|\\\\.[a-zA-Z_]\\\\w*\\\\b)|(end|rescue|ensure|else|elsif|when)\\\\b)')\n }\n};\n/*\n * Ruby language definition\n *\n * Quite a complex language due to elaborate escape sequences\n * and quoting of literate strings/regular expressions, and\n * an 'end' keyword that does not always apply to modifiers like until and while,\n * and a 'do' keyword that sometimes starts a block, but sometimes is part of\n * another statement (like 'while').\n *\n * (1) end blocks:\n * 'end' may end declarations like if or until, but sometimes 'if' or 'until'\n * are modifiers where there is no 'end'. Also, 'do' sometimes starts a block\n * that is ended by 'end', but sometimes it is part of a 'while', 'for', or 'until'\n * To do proper brace matching we do some elaborate state manipulation.\n * some examples:\n *\n * until bla do\n * work until tired\n * list.each do\n * something if test\n * end\n * end\n *\n * or\n *\n * if test\n * something (if test then x end)\n * bar if bla\n * end\n *\n * or, how about using class as a property..\n *\n * class Test\n * def endpoint\n * self.class.endpoint || routes\n * end\n * end\n *\n * (2) quoting:\n * there are many kinds of strings and escape sequences. But also, one can\n * start many string-like things as '%qx' where q specifies the kind of string\n * (like a command, escape expanded, regular expression, symbol etc.), and x is\n * some character and only another 'x' ends the sequence. Except for brackets\n * where the closing bracket ends the sequence.. and except for a nested bracket\n * inside the string like entity. Also, such strings can contain interpolated\n * ruby expressions again (and span multiple lines). Moreover, expanded\n * regular expression can also contain comments.\n */\nexport var language = {\n tokenPostfix: '.ruby',\n keywords: [\n '__LINE__',\n '__ENCODING__',\n '__FILE__',\n 'BEGIN',\n 'END',\n 'alias',\n 'and',\n 'begin',\n 'break',\n 'case',\n 'class',\n 'def',\n 'defined?',\n 'do',\n 'else',\n 'elsif',\n 'end',\n 'ensure',\n 'for',\n 'false',\n 'if',\n 'in',\n 'module',\n 'next',\n 'nil',\n 'not',\n 'or',\n 'redo',\n 'rescue',\n 'retry',\n 'return',\n 'self',\n 'super',\n 'then',\n 'true',\n 'undef',\n 'unless',\n 'until',\n 'when',\n 'while',\n 'yield'\n ],\n keywordops: ['::', '..', '...', '?', ':', '=>'],\n builtins: [\n 'require',\n 'public',\n 'private',\n 'include',\n 'extend',\n 'attr_reader',\n 'protected',\n 'private_class_method',\n 'protected_class_method',\n 'new'\n ],\n // these are closed by 'end' (if, while and until are handled separately)\n declarations: [\n 'module',\n 'class',\n 'def',\n 'case',\n 'do',\n 'begin',\n 'for',\n 'if',\n 'while',\n 'until',\n 'unless'\n ],\n linedecls: ['def', 'case', 'do', 'begin', 'for', 'if', 'while', 'until', 'unless'],\n operators: [\n '^',\n '&',\n '|',\n '<=>',\n '==',\n '===',\n '!~',\n '=~',\n '>',\n '>=',\n '<',\n '<=',\n '<<',\n '>>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '**',\n '~',\n '+@',\n '-@',\n '[]',\n '[]=',\n '`',\n '+=',\n '-=',\n '*=',\n '**=',\n '/=',\n '^=',\n '%=',\n '<<=',\n '>>=',\n '&=',\n '&&=',\n '||=',\n '|='\n ],\n brackets: [\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n { open: '{', close: '}', token: 'delimiter.curly' },\n { open: '[', close: ']', token: 'delimiter.square' }\n ],\n // we include these common regular expressions\n symbols: /[=> where decl is the current opening declaration (like 'class')\n root: [\n // identifiers and keywords\n // most complexity here is due to matching 'end' correctly with declarations.\n // We distinguish a declaration that comes first on a line, versus declarations further on a line (which are most likey modifiers)\n [\n /^(\\s*)([a-z_]\\w*[!?=]?)/,\n [\n 'white',\n {\n cases: {\n 'for|until|while': {\n token: 'keyword.$2',\n next: '@dodecl.$2'\n },\n '@declarations': {\n token: 'keyword.$2',\n next: '@root.$2'\n },\n end: { token: 'keyword.$S2', next: '@pop' },\n '@keywords': 'keyword',\n '@builtins': 'predefined',\n '@default': 'identifier'\n }\n }\n ]\n ],\n [\n /[a-z_]\\w*[!?=]?/,\n {\n cases: {\n 'if|unless|while|until': {\n token: 'keyword.$0x',\n next: '@modifier.$0x'\n },\n for: { token: 'keyword.$2', next: '@dodecl.$2' },\n '@linedecls': { token: 'keyword.$0', next: '@root.$0' },\n end: { token: 'keyword.$S2', next: '@pop' },\n '@keywords': 'keyword',\n '@builtins': 'predefined',\n '@default': 'identifier'\n }\n }\n ],\n [/[A-Z][\\w]*[!?=]?/, 'constructor.identifier'],\n [/\\$[\\w]*/, 'global.constant'],\n [/@[\\w]*/, 'namespace.instance.identifier'],\n [/@@@[\\w]*/, 'namespace.class.identifier'],\n // here document\n [/<<[-~](@heredelim).*/, { token: 'string.heredoc.delimiter', next: '@heredoc.$1' }],\n [/[ \\t\\r\\n]+<<(@heredelim).*/, { token: 'string.heredoc.delimiter', next: '@heredoc.$1' }],\n [/^<<(@heredelim).*/, { token: 'string.heredoc.delimiter', next: '@heredoc.$1' }],\n // whitespace\n { include: '@whitespace' },\n // strings\n [/\"/, { token: 'string.d.delim', next: '@dstring.d.\"' }],\n [/'/, { token: 'string.sq.delim', next: '@sstring.sq' }],\n // % literals. For efficiency, rematch in the 'pstring' state\n [/%([rsqxwW]|Q?)/, { token: '@rematch', next: 'pstring' }],\n // commands and symbols\n [/`/, { token: 'string.x.delim', next: '@dstring.x.`' }],\n [/:(\\w|[$@])\\w*[!?=]?/, 'string.s'],\n [/:\"/, { token: 'string.s.delim', next: '@dstring.s.\"' }],\n [/:'/, { token: 'string.s.delim', next: '@sstring.s' }],\n // regular expressions. Lookahead for a (not escaped) closing forwardslash on the same line\n [/\\/(?=(\\\\\\/|[^\\/\\n])+\\/)/, { token: 'regexp.delim', next: '@regexp' }],\n // delimiters and operators\n [/[{}()\\[\\]]/, '@brackets'],\n [\n /@symbols/,\n {\n cases: {\n '@keywordops': 'keyword',\n '@operators': 'operator',\n '@default': ''\n }\n }\n ],\n [/[;,]/, 'delimiter'],\n // numbers\n [/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/, 'number.hex'],\n [/0[_oO][0-7](_?[0-7])*/, 'number.octal'],\n [/0[bB][01](_?[01])*/, 'number.binary'],\n [/0[dD]@decpart/, 'number'],\n [\n /@decimal((\\.@decpart)?([eE][\\-+]?@decpart)?)/,\n {\n cases: {\n $1: 'number.float',\n '@default': 'number'\n }\n }\n ]\n ],\n // used to not treat a 'do' as a block opener if it occurs on the same\n // line as a 'do' statement: 'while|until|for'\n // dodecl. where decl is the declarations started, like 'while'\n dodecl: [\n [/^/, { token: '', switchTo: '@root.$S2' }],\n [\n /[a-z_]\\w*[!?=]?/,\n {\n cases: {\n end: { token: 'keyword.$S2', next: '@pop' },\n do: { token: 'keyword', switchTo: '@root.$S2' },\n '@linedecls': {\n token: '@rematch',\n switchTo: '@root.$S2'\n },\n '@keywords': 'keyword',\n '@builtins': 'predefined',\n '@default': 'identifier'\n }\n }\n ],\n { include: '@root' }\n ],\n // used to prevent potential modifiers ('if|until|while|unless') to match\n // with 'end' keywords.\n // modifier.x where decl is the declaration starter, like 'if'\n modifier: [\n [/^/, '', '@pop'],\n [\n /[a-z_]\\w*[!?=]?/,\n {\n cases: {\n end: { token: 'keyword.$S2', next: '@pop' },\n 'then|else|elsif|do': {\n token: 'keyword',\n switchTo: '@root.$S2'\n },\n '@linedecls': {\n token: '@rematch',\n switchTo: '@root.$S2'\n },\n '@keywords': 'keyword',\n '@builtins': 'predefined',\n '@default': 'identifier'\n }\n }\n ],\n { include: '@root' }\n ],\n // single quote strings (also used for symbols)\n // sstring. where kind is 'sq' (single quote) or 's' (symbol)\n sstring: [\n [/[^\\\\']+/, 'string.$S2'],\n [/\\\\\\\\|\\\\'|\\\\$/, 'string.$S2.escape'],\n [/\\\\./, 'string.$S2.invalid'],\n [/'/, { token: 'string.$S2.delim', next: '@pop' }]\n ],\n // double quoted \"string\".\n // dstring.. where kind is 'd' (double quoted), 'x' (command), or 's' (symbol)\n // and delim is the ending delimiter (\" or `)\n dstring: [\n [/[^\\\\`\"#]+/, 'string.$S2'],\n [/#/, 'string.$S2.escape', '@interpolated'],\n [/\\\\$/, 'string.$S2.escape'],\n [/@escapes/, 'string.$S2.escape'],\n [/\\\\./, 'string.$S2.escape.invalid'],\n [\n /[`\"]/,\n {\n cases: {\n '$#==$S3': { token: 'string.$S2.delim', next: '@pop' },\n '@default': 'string.$S2'\n }\n }\n ]\n ],\n // literal documents\n // heredoc. where close is the closing delimiter\n heredoc: [\n [\n /^(\\s*)(@heredelim)$/,\n {\n cases: {\n '$2==$S2': ['string.heredoc', { token: 'string.heredoc.delimiter', next: '@pop' }],\n '@default': ['string.heredoc', 'string.heredoc']\n }\n }\n ],\n [/.*/, 'string.heredoc']\n ],\n // interpolated sequence\n interpolated: [\n [/\\$\\w*/, 'global.constant', '@pop'],\n [/@\\w*/, 'namespace.class.identifier', '@pop'],\n [/@@@\\w*/, 'namespace.instance.identifier', '@pop'],\n [\n /[{]/,\n {\n token: 'string.escape.curly',\n switchTo: '@interpolated_compound'\n }\n ],\n ['', '', '@pop'] // just a # is interpreted as a #\n ],\n // any code\n interpolated_compound: [\n [/[}]/, { token: 'string.escape.curly', next: '@pop' }],\n { include: '@root' }\n ],\n // %r quoted regexp\n // pregexp.. where open/close are the open/close delimiter\n pregexp: [\n { include: '@whitespace' },\n // turns out that you can quote using regex control characters, aargh!\n // for example; %r|kgjgaj| is ok (even though | is used for alternation)\n // so, we need to match those first\n [\n /[^\\(\\{\\[\\\\]/,\n {\n cases: {\n '$#==$S3': { token: 'regexp.delim', next: '@pop' },\n '$#==$S2': { token: 'regexp.delim', next: '@push' },\n '~[)}\\\\]]': '@brackets.regexp.escape.control',\n '~@regexpctl': 'regexp.escape.control',\n '@default': 'regexp'\n }\n }\n ],\n { include: '@regexcontrol' }\n ],\n // We match regular expression quite precisely\n regexp: [\n { include: '@regexcontrol' },\n [/[^\\\\\\/]/, 'regexp'],\n ['/[ixmp]*', { token: 'regexp.delim' }, '@pop']\n ],\n regexcontrol: [\n [\n /(\\{)(\\d+(?:,\\d*)?)(\\})/,\n [\n '@brackets.regexp.escape.control',\n 'regexp.escape.control',\n '@brackets.regexp.escape.control'\n ]\n ],\n [\n /(\\[)(\\^?)/,\n ['@brackets.regexp.escape.control', { token: 'regexp.escape.control', next: '@regexrange' }]\n ],\n [/(\\()(\\?[:=!])/, ['@brackets.regexp.escape.control', 'regexp.escape.control']],\n [/\\(\\?#/, { token: 'regexp.escape.control', next: '@regexpcomment' }],\n [/[()]/, '@brackets.regexp.escape.control'],\n [/@regexpctl/, 'regexp.escape.control'],\n [/\\\\$/, 'regexp.escape'],\n [/@regexpesc/, 'regexp.escape'],\n [/\\\\\\./, 'regexp.invalid'],\n [/#/, 'regexp.escape', '@interpolated']\n ],\n regexrange: [\n [/-/, 'regexp.escape.control'],\n [/\\^/, 'regexp.invalid'],\n [/\\\\$/, 'regexp.escape'],\n [/@regexpesc/, 'regexp.escape'],\n [/[^\\]]/, 'regexp'],\n [/\\]/, '@brackets.regexp.escape.control', '@pop']\n ],\n regexpcomment: [\n [/[^)]+/, 'comment'],\n [/\\)/, { token: 'regexp.escape.control', next: '@pop' }]\n ],\n // % quoted strings\n // A bit repetitive since we need to often special case the kind of ending delimiter\n pstring: [\n [/%([qws])\\(/, { token: 'string.$1.delim', switchTo: '@qstring.$1.(.)' }],\n [/%([qws])\\[/, { token: 'string.$1.delim', switchTo: '@qstring.$1.[.]' }],\n [/%([qws])\\{/, { token: 'string.$1.delim', switchTo: '@qstring.$1.{.}' }],\n [/%([qws])' }],\n [/%([qws])(@delim)/, { token: 'string.$1.delim', switchTo: '@qstring.$1.$2.$2' }],\n [/%r\\(/, { token: 'regexp.delim', switchTo: '@pregexp.(.)' }],\n [/%r\\[/, { token: 'regexp.delim', switchTo: '@pregexp.[.]' }],\n [/%r\\{/, { token: 'regexp.delim', switchTo: '@pregexp.{.}' }],\n [/%r' }],\n [/%r(@delim)/, { token: 'regexp.delim', switchTo: '@pregexp.$1.$1' }],\n [/%(x|W|Q?)\\(/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.(.)' }],\n [/%(x|W|Q?)\\[/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.[.]' }],\n [/%(x|W|Q?)\\{/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.{.}' }],\n [/%(x|W|Q?)' }],\n [/%(x|W|Q?)(@delim)/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.$2.$2' }],\n [/%([rqwsxW]|Q?)./, { token: 'invalid', next: '@pop' }],\n [/./, { token: 'invalid', next: '@pop' }] // recover\n ],\n // non-expanded quoted string.\n // qstring...\n // kind = q|w|s (single quote, array, symbol)\n // open = open delimiter\n // close = close delimiter\n qstring: [\n [/\\\\$/, 'string.$S2.escape'],\n [/\\\\./, 'string.$S2.escape'],\n [\n /./,\n {\n cases: {\n '$#==$S4': { token: 'string.$S2.delim', next: '@pop' },\n '$#==$S3': { token: 'string.$S2.delim', next: '@push' },\n '@default': 'string.$S2'\n }\n }\n ]\n ],\n // expanded quoted string.\n // qqstring...\n // kind = Q|W|x (double quote, array, command)\n // open = open delimiter\n // close = close delimiter\n qqstring: [[/#/, 'string.$S2.escape', '@interpolated'], { include: '@qstring' }],\n // whitespace & comments\n whitespace: [\n [/[ \\t\\r\\n]+/, ''],\n [/^\\s*=begin\\b/, 'comment', '@comment'],\n [/#.*$/, 'comment']\n ],\n comment: [\n [/[^=]+/, 'comment'],\n [/^\\s*=begin\\b/, 'comment.invalid'],\n [/^\\s*=end\\b.*/, 'comment', '@pop'],\n [/[=]/, 'comment']\n ]\n }\n};\n"],"sourceRoot":""}