-
Notifications
You must be signed in to change notification settings - Fork 0
/
compiler.js.map
1 lines (1 loc) · 490 KB
/
compiler.js.map
1
{"version":3,"file":"compiler.js","sources":["src/compiler/Stats.ts","node_modules/estree-walker/src/estree-walker.js","node_modules/is-reference/dist/is-reference.es.js","node_modules/periscopic/dist/periscopic.mjs","node_modules/sourcemap-codec/dist/sourcemap-codec.es.js","node_modules/code-red/dist/code-red.mjs","src/compiler/parse/acorn.ts","src/compiler/utils/patterns.ts","src/compiler/parse/read/expression.ts","src/compiler/parse/read/script.ts","src/compiler/parse/read/style.ts","src/compiler/parse/utils/entities.ts","src/compiler/parse/utils/html.ts","src/compiler/utils/full_char_code_at.ts","src/compiler/utils/names.ts","src/compiler/utils/fuzzymatch.ts","src/compiler/parse/state/tag.ts","src/compiler/parse/read/context.ts","src/compiler/utils/trim.ts","src/compiler/parse/state/mustache.ts","node_modules/locate-character/dist/locate-character.es.js","src/compiler/utils/get_code_frame.ts","src/compiler/utils/error.ts","src/compiler/parse/index.ts","src/compiler/compile/render_dom/wrappers/AwaitBlock.ts","src/compiler/compile/render_dom/wrappers/Element/EventHandler.ts","src/compiler/compile/render_dom/wrappers/shared/add_event_handlers.ts","src/compiler/compile/render_dom/wrappers/EachBlock.ts","src/compiler/compile/utils/stringify.ts","src/compiler/compile/render_dom/wrappers/Element/fix_attribute_casing.ts","src/compiler/utils/namespaces.ts","src/compiler/compile/render_dom/wrappers/Element/Attribute.ts","src/compiler/compile/render_dom/wrappers/Element/StyleAttribute.ts","src/compiler/compile/render_dom/wrappers/Element/Binding.ts","src/compiler/compile/render_dom/wrappers/shared/add_actions.ts","src/compiler/compile/nodes/shared/Expression.ts","src/compiler/compile/render_dom/wrappers/Element/index.ts","src/compiler/compile/render_dom/wrappers/IfBlock.ts","src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts","src/compiler/compile/render_dom/wrappers/MustacheTag.ts","src/compiler/compile/render_dom/wrappers/RawMustacheTag.ts","src/compiler/compile/utils/get_slot_data.ts","src/compiler/compile/render_dom/wrappers/Slot.ts","src/compiler/compile/render_dom/wrappers/Text.ts","src/compiler/compile/render_dom/wrappers/Window.ts","src/compiler/compile/render_dom/wrappers/Fragment.ts","src/compiler/compile/render_dom/index.ts","src/compiler/compile/render_ssr/handlers/shared/get_attribute_value.ts","src/compiler/compile/render_ssr/handlers/shared/boolean_attributes.ts","src/compiler/compile/render_ssr/handlers/InlineComponent.ts","src/compiler/compile/render_ssr/Renderer.ts","src/compiler/compile/render_ssr/index.ts","src/compiler/compile/create_module.ts","src/compiler/compile/css/gather_possible_values.ts","src/compiler/compile/css/Selector.ts","src/compiler/compile/utils/hash.ts","src/compiler/compile/css/Stylesheet.ts","src/compiler/compile/nodes/EventHandler.ts","src/compiler/compile/nodes/Comment.ts","src/compiler/compile/nodes/EachBlock.ts","src/compiler/compile/nodes/Binding.ts","src/compiler/compile/nodes/Transition.ts","src/compiler/compile/nodes/Let.ts","src/compiler/compile/nodes/Element.ts","src/compiler/compile/nodes/InlineComponent.ts","src/compiler/compile/nodes/Slot.ts","src/compiler/compile/nodes/Window.ts","src/compiler/compile/nodes/shared/map_children.ts","src/compiler/compile/internal_exports.ts","src/compiler/compile/Component.ts","src/compiler/compile/index.ts","src/compiler/preprocess/index.ts"],"sourcesContent":["const now = (typeof process !== 'undefined' && process.hrtime)\n\t? () => {\n\t\tconst t = process.hrtime();\n\t\treturn t[0] * 1e3 + t[1] / 1e6;\n\t}\n\t: () => self.performance.now();\n\ninterface Timing {\n\tlabel: string;\n\tstart: number;\n\tend: number;\n\tchildren: Timing[];\n}\n\nfunction collapse_timings(timings) {\n\tconst result = {};\n\ttimings.forEach(timing => {\n\t\tresult[timing.label] = Object.assign({\n\t\t\ttotal: timing.end - timing.start\n\t\t}, timing.children && collapse_timings(timing.children));\n\t});\n\treturn result;\n}\n\nexport default class Stats {\n\tstart_time: number;\n\tcurrent_timing: Timing;\n\tcurrent_children: Timing[];\n\ttimings: Timing[];\n\tstack: Timing[];\n\n\tconstructor() {\n\t\tthis.start_time = now();\n\t\tthis.stack = [];\n\t\tthis.current_children = this.timings = [];\n\t}\n\n\tstart(label) {\n\t\tconst timing = {\n\t\t\tlabel,\n\t\t\tstart: now(),\n\t\t\tend: null,\n\t\t\tchildren: []\n\t\t};\n\n\t\tthis.current_children.push(timing);\n\t\tthis.stack.push(timing);\n\n\t\tthis.current_timing = timing;\n\t\tthis.current_children = timing.children;\n\t}\n\n\tstop(label) {\n\t\tif (label !== this.current_timing.label) {\n\t\t\tthrow new Error(`Mismatched timing labels (expected ${this.current_timing.label}, got ${label})`);\n\t\t}\n\n\t\tthis.current_timing.end = now();\n\t\tthis.stack.pop();\n\t\tthis.current_timing = this.stack[this.stack.length - 1];\n\t\tthis.current_children = this.current_timing ? this.current_timing.children : this.timings;\n\t}\n\n\trender() {\n\t\tconst timings = Object.assign({\n\t\t\ttotal: now() - this.start_time\n\t\t}, collapse_timings(this.timings));\n\n\t\treturn {\n\t\t\ttimings\n\t\t};\n\t}\n}\n","function walk(ast, { enter, leave }) {\n\treturn visit(ast, null, enter, leave);\n}\n\nlet should_skip = false;\nlet should_remove = false;\nlet replacement = null;\nconst context = {\n\tskip: () => should_skip = true,\n\tremove: () => should_remove = true,\n\treplace: (node) => replacement = node\n};\n\nfunction replace(parent, prop, index, node) {\n\tif (parent) {\n\t\tif (index !== null) {\n\t\t\tparent[prop][index] = node;\n\t\t} else {\n\t\t\tparent[prop] = node;\n\t\t}\n\t}\n}\n\nfunction remove(parent, prop, index) {\n\tif (parent) {\n\t\tif (index !== null) {\n\t\t\tparent[prop].splice(index, 1);\n\t\t} else {\n\t\t\tdelete parent[prop];\n\t\t}\n\t}\n}\n\nfunction visit(\n\tnode,\n\tparent,\n\tenter,\n\tleave,\n\tprop,\n\tindex\n) {\n\tif (node) {\n\t\tif (enter) {\n\t\t\tconst _should_skip = should_skip;\n\t\t\tconst _should_remove = should_remove;\n\t\t\tconst _replacement = replacement;\n\t\t\tshould_skip = false;\n\t\t\tshould_remove = false;\n\t\t\treplacement = null;\n\n\t\t\tenter.call(context, node, parent, prop, index);\n\n\t\t\tif (replacement) {\n\t\t\t\tnode = replacement;\n\t\t\t\treplace(parent, prop, index, node);\n\t\t\t}\n\n\t\t\tif (should_remove) {\n\t\t\t\tremove(parent, prop, index);\n\t\t\t}\n\n\t\t\tconst skipped = should_skip;\n\t\t\tconst removed = should_remove;\n\n\t\t\tshould_skip = _should_skip;\n\t\t\tshould_remove = _should_remove;\n\t\t\treplacement = _replacement;\n\n\t\t\tif (skipped) return node;\n\t\t\tif (removed) return null;\n\t\t}\n\n\t\tfor (const key in node) {\n\t\t\tconst value = (node )[key];\n\n\t\t\tif (typeof value !== 'object') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\telse if (Array.isArray(value)) {\n\t\t\t\tfor (let j = 0, k = 0; j < value.length; j += 1, k += 1) {\n\t\t\t\t\tif (value[j] !== null && typeof value[j].type === 'string') {\n\t\t\t\t\t\tif (!visit(value[j], node, enter, leave, key, k)) {\n\t\t\t\t\t\t\t// removed\n\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telse if (value !== null && typeof value.type === 'string') {\n\t\t\t\tvisit(value, node, enter, leave, key, null);\n\t\t\t}\n\t\t}\n\n\t\tif (leave) {\n\t\t\tconst _replacement = replacement;\n\t\t\tconst _should_remove = should_remove;\n\t\t\treplacement = null;\n\t\t\tshould_remove = false;\n\n\t\t\tleave.call(context, node, parent, prop, index);\n\n\t\t\tif (replacement) {\n\t\t\t\tnode = replacement;\n\t\t\t\treplace(parent, prop, index, node);\n\t\t\t}\n\n\t\t\tif (should_remove) {\n\t\t\t\tremove(parent, prop, index);\n\t\t\t}\n\n\t\t\tconst removed = should_remove;\n\n\t\t\treplacement = _replacement;\n\t\t\tshould_remove = _should_remove;\n\n\t\t\tif (removed) return null;\n\t\t}\n\t}\n\n\treturn node;\n}\n\nexport { walk };\n","function isReference(node, parent) {\n if (node.type === 'MemberExpression') {\n return !node.computed && isReference(node.object, node);\n }\n if (node.type === 'Identifier') {\n if (!parent)\n return true;\n switch (parent.type) {\n // disregard `bar` in `foo.bar`\n case 'MemberExpression': return parent.computed || node === parent.object;\n // disregard the `foo` in `class {foo(){}}` but keep it in `class {[foo](){}}`\n case 'MethodDefinition': return parent.computed;\n // disregard the `bar` in `{ bar: foo }`, but keep it in `{ [bar]: foo }`\n case 'Property': return parent.computed || node === parent.value;\n // disregard the `bar` in `export { foo as bar }` or\n // the foo in `import { foo as bar }`\n case 'ExportSpecifier':\n case 'ImportSpecifier': return node === parent.local;\n // disregard the `foo` in `foo: while (...) { ... break foo; ... continue foo;}`\n case 'LabeledStatement':\n case 'BreakStatement':\n case 'ContinueStatement': return false;\n default: return true;\n }\n }\n return false;\n}\n\nexport default isReference;\n","import { walk } from 'estree-walker';\nimport is_reference from 'is-reference';\n\nfunction analyze(expression) {\n\tconst map = new WeakMap();\n\n\tlet scope = new Scope(null, false);\n\n\twalk(expression, {\n\t\tenter(node, parent) {\n\t\t\tif (node.type === 'ImportDeclaration') {\n\t\t\t\tnode.specifiers.forEach((specifier) => {\n\t\t\t\t\tscope.declarations.set(specifier.local.name, specifier);\n\t\t\t\t});\n\t\t\t} else if (/(Function(Declaration|Expression)|ArrowFunctionExpression)/.test(node.type)) {\n\t\t\t\tif (node.type === 'FunctionDeclaration') {\n\t\t\t\t\tscope.declarations.set(node.id.name, node);\n\t\t\t\t\tmap.set(node, scope = new Scope(scope, false));\n\t\t\t\t} else {\n\t\t\t\t\tmap.set(node, scope = new Scope(scope, false));\n\t\t\t\t\tif (node.type === 'FunctionExpression' && node.id) scope.declarations.set(node.id.name, node);\n\t\t\t\t}\n\n\t\t\t\tnode.params.forEach((param) => {\n\t\t\t\t\textract_names(param).forEach(name => {\n\t\t\t\t\t\tscope.declarations.set(name, node);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else if (/For(?:In|Of)?Statement/.test(node.type)) {\n\t\t\t\tmap.set(node, scope = new Scope(scope, true));\n\t\t\t} else if (node.type === 'BlockStatement') {\n\t\t\t\tmap.set(node, scope = new Scope(scope, true));\n\t\t\t} else if (/(Class|Variable)Declaration/.test(node.type)) {\n\t\t\t\tscope.add_declaration(node);\n\t\t\t} else if (node.type === 'CatchClause') {\n\t\t\t\tmap.set(node, scope = new Scope(scope, true));\n\n\t\t\t\tif (node.param) {\n\t\t\t\t\textract_names(node.param).forEach(name => {\n\t\t\t\t\t\tscope.declarations.set(name, node.param);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tleave(node) {\n\t\t\tif (map.has(node)) {\n\t\t\t\tscope = scope.parent;\n\t\t\t}\n\t\t}\n\t});\n\n\tconst globals = new Map();\n\n\twalk(expression, {\n\t\tenter(node, parent) {\n\t\t\tif (map.has(node)) scope = map.get(node);\n\n\t\t\tif (node.type === 'Identifier' && is_reference(node, parent)) {\n\t\t\t\tconst owner = scope.find_owner(node.name);\n\t\t\t\tif (!owner) globals.set(node.name, node);\n\n\t\t\t\tadd_reference(scope, node.name);\n\t\t\t}\n\t\t},\n\t\tleave(node) {\n\t\t\tif (map.has(node)) {\n\t\t\t\tscope = scope.parent;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn { map, scope, globals };\n}\n\nfunction add_reference(scope, name) {\n\tscope.references.add(name);\n\tif (scope.parent) add_reference(scope.parent, name);\n}\n\nclass Scope {\n\t\n\t\n\t__init() {this.declarations = new Map();}\n\t__init2() {this.initialised_declarations = new Set();}\n\t__init3() {this.references = new Set();}\n\n\tconstructor(parent, block) {Scope.prototype.__init.call(this);Scope.prototype.__init2.call(this);Scope.prototype.__init3.call(this);\n\t\tthis.parent = parent;\n\t\tthis.block = block;\n\t}\n\n\n\tadd_declaration(node) {\n\t\tif (node.type === 'VariableDeclaration') {\n\t\t\tif (node.kind === 'var' && this.block && this.parent) {\n\t\t\t\tthis.parent.add_declaration(node);\n\t\t\t} else if (node.type === 'VariableDeclaration') {\n\t\t\t\tnode.declarations.forEach((declarator) => {\n\t\t\t\t\textract_names(declarator.id).forEach(name => {\n\t\t\t\t\t\tthis.declarations.set(name, node);\n\t\t\t\t\t\tif (declarator.init) this.initialised_declarations.add(name);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthis.declarations.set(node.id.name, node);\n\t\t}\n\t}\n\n\tfind_owner(name) {\n\t\tif (this.declarations.has(name)) return this;\n\t\treturn this.parent && this.parent.find_owner(name);\n\t}\n\n\thas(name) {\n\t\treturn (\n\t\t\tthis.declarations.has(name) || (this.parent && this.parent.has(name))\n\t\t);\n\t}\n}\n\nfunction extract_names(param) {\n\treturn extract_identifiers(param).map(node => node.name);\n}\n\nfunction extract_identifiers(param) {\n\tconst nodes = [];\n\textractors[param.type] && extractors[param.type](nodes, param);\n\treturn nodes;\n}\n\nconst extractors = {\n\tIdentifier(nodes, param) {\n\t\tnodes.push(param);\n\t},\n\n\tMemberExpression(nodes, param) {\n\t\tlet object = param;\n\t\twhile (object.type === 'MemberExpression') object = object.object;\n\t\tnodes.push(object);\n\t},\n\n\tObjectPattern(nodes, param) {\n\t\tparam.properties.forEach((prop) => {\n\t\t\tif (prop.type === 'RestElement') {\n\t\t\t\tnodes.push(prop.argument);\n\t\t\t} else {\n\t\t\t\textractors[prop.value.type](nodes, prop.value);\n\t\t\t}\n\t\t});\n\t},\n\n\tArrayPattern(nodes, param) {\n\t\tparam.elements.forEach((element) => {\n\t\t\tif (element) extractors[element.type](nodes, element);\n\t\t});\n\t},\n\n\tRestElement(nodes, param) {\n\t\textractors[param.argument.type](nodes, param.argument);\n\t},\n\n\tAssignmentPattern(nodes, param) {\n\t\textractors[param.left.type](nodes, param.left);\n\t}\n};\n\nexport { analyze, Scope, extract_names, extract_identifiers };\n","var charToInteger = {};\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nfor (var i = 0; i < chars.length; i++) {\n charToInteger[chars.charCodeAt(i)] = i;\n}\nfunction decode(mappings) {\n var generatedCodeColumn = 0; // first field\n var sourceFileIndex = 0; // second field\n var sourceCodeLine = 0; // third field\n var sourceCodeColumn = 0; // fourth field\n var nameIndex = 0; // fifth field\n var decoded = [];\n var line = [];\n var segment = [];\n for (var i = 0, j = 0, shift = 0, value = 0, len = mappings.length; i < len; i++) {\n var c = mappings.charCodeAt(i);\n if (c === 44) { // \",\"\n if (segment.length)\n line.push(segment);\n segment = [];\n j = 0;\n }\n else if (c === 59) { // \";\"\n if (segment.length)\n line.push(segment);\n segment = [];\n j = 0;\n decoded.push(line);\n line = [];\n generatedCodeColumn = 0;\n }\n else {\n var integer = charToInteger[c];\n if (integer === undefined) {\n throw new Error('Invalid character (' + String.fromCharCode(c) + ')');\n }\n var hasContinuationBit = integer & 32;\n integer &= 31;\n value += integer << shift;\n if (hasContinuationBit) {\n shift += 5;\n }\n else {\n var shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -value;\n if (value === 0)\n value = -0x80000000;\n }\n if (j == 0) {\n generatedCodeColumn += value;\n segment.push(generatedCodeColumn);\n }\n else if (j === 1) {\n sourceFileIndex += value;\n segment.push(sourceFileIndex);\n }\n else if (j === 2) {\n sourceCodeLine += value;\n segment.push(sourceCodeLine);\n }\n else if (j === 3) {\n sourceCodeColumn += value;\n segment.push(sourceCodeColumn);\n }\n else if (j === 4) {\n nameIndex += value;\n segment.push(nameIndex);\n }\n j++;\n value = shift = 0; // reset\n }\n }\n }\n if (segment.length)\n line.push(segment);\n decoded.push(line);\n return decoded;\n}\nfunction encode(decoded) {\n var sourceFileIndex = 0; // second field\n var sourceCodeLine = 0; // third field\n var sourceCodeColumn = 0; // fourth field\n var nameIndex = 0; // fifth field\n var mappings = '';\n for (var i = 0; i < decoded.length; i++) {\n var line = decoded[i];\n if (i > 0)\n mappings += ';';\n if (line.length === 0)\n continue;\n var generatedCodeColumn = 0; // first field\n var lineMappings = [];\n for (var _i = 0, line_1 = line; _i < line_1.length; _i++) {\n var segment = line_1[_i];\n var segmentMappings = encodeInteger(segment[0] - generatedCodeColumn);\n generatedCodeColumn = segment[0];\n if (segment.length > 1) {\n segmentMappings +=\n encodeInteger(segment[1] - sourceFileIndex) +\n encodeInteger(segment[2] - sourceCodeLine) +\n encodeInteger(segment[3] - sourceCodeColumn);\n sourceFileIndex = segment[1];\n sourceCodeLine = segment[2];\n sourceCodeColumn = segment[3];\n }\n if (segment.length === 5) {\n segmentMappings += encodeInteger(segment[4] - nameIndex);\n nameIndex = segment[4];\n }\n lineMappings.push(segmentMappings);\n }\n mappings += lineMappings.join(',');\n }\n return mappings;\n}\nfunction encodeInteger(num) {\n var result = '';\n num = num < 0 ? (-num << 1) | 1 : num << 1;\n do {\n var clamped = num & 31;\n num >>>= 5;\n if (num > 0) {\n clamped |= 32;\n }\n result += chars[clamped];\n } while (num > 0);\n return result;\n}\n\nexport { decode, encode };\n//# sourceMappingURL=sourcemap-codec.es.js.map\n","import { parse as parse$1, parseExpressionAt as parseExpressionAt$1 } from 'acorn';\nimport { walk } from 'estree-walker';\nimport { analyze } from 'periscopic';\nimport { encode } from 'sourcemap-codec';\n\n// generate an ID that is, to all intents and purposes, unique\nconst id = (Math.round(Math.random() * 1e20)).toString(36);\nconst re = new RegExp(`_${id}_(?:(\\\\d+)|(AT)|(HASH))_(\\\\w+)?`, 'g');\n\nconst get_comment_handlers = (comments, raw) => ({\n\n\t// pass to acorn options\n\tonComment: (block, value, start, end) => {\n\t\tif (block && /\\n/.test(value)) {\n\t\t\tlet a = start;\n\t\t\twhile (a > 0 && raw[a - 1] !== '\\n') a -= 1;\n\n\t\t\tlet b = a;\n\t\t\twhile (/[ \\t]/.test(raw[b])) b += 1;\n\n\t\t\tconst indentation = raw.slice(a, b);\n\t\t\tvalue = value.replace(new RegExp(`^${indentation}`, 'gm'), '');\n\t\t}\n\n\t\tcomments.push({ type: block ? 'Block' : 'Line', value, start, end });\n\t},\n\n\t// pass to estree-walker options\n\tenter(node) {\n\t\tlet comment;\n\n\t\twhile (comments[0] && comments[0].start < (node ).start) {\n\t\t\tcomment = comments.shift();\n\n\t\t\tcomment.value = comment.value.replace(re, (match, id, at, hash, value) => {\n\t\t\t\tif (hash) return `#${value}`;\n\t\t\t\tif (at) return `@${value}`;\n\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\tconst next = comments[0] || node;\n\t\t\t(comment ).has_trailing_newline = (\n\t\t\t\tcomment.type === 'Line' ||\n\t\t\t\t/\\n/.test(raw.slice(comment.end, (next ).start))\n\t\t\t);\n\n\t\t\t(node.leadingComments || (node.leadingComments = [])).push(comment);\n\t\t}\n\t},\n\tleave(node) {\n\t\tif (comments[0]) {\n\t\t\tconst slice = raw.slice((node ).end, comments[0].start);\n\n\t\t\tif (/^[,) \\t]*$/.test(slice)) {\n\t\t\t\tnode.trailingComments = [comments.shift()];\n\t\t\t}\n\t\t}\n\t}\n\n});\n\nfunction handle(node, state) {\n\tconst handler = handlers[node.type];\n\n\tif (!handler) {\n\t\tthrow new Error(`Not implemented ${node.type}`);\n\t}\n\n\tconst result = handler(node, state);\n\n\tif (node.leadingComments) {\n\t\tresult.unshift(c(node.leadingComments.map(comment => comment.type === 'Block'\n\t\t\t? `/*${comment.value}*/${(comment ).has_trailing_newline ? `\\n${state.indent}` : ` `}`\n\t\t\t: `//${comment.value}${(comment ).has_trailing_newline ? `\\n${state.indent}` : ` `}`).join(``)));\n\t}\n\n\tif (node.trailingComments) {\n\t\tstate.comments.push(node.trailingComments[0]); // there is only ever one\n\t}\n\n\treturn result;\n}\n\nfunction c(content, node) {\n\treturn {\n\t\tcontent,\n\t\tloc: node && node.loc,\n\t\thas_newline: /\\n/.test(content)\n\t};\n}\n\nconst OPERATOR_PRECEDENCE = {\n\t'||': 3,\n\t'&&': 4,\n\t'|': 5,\n\t'^': 6,\n\t'&': 7,\n\t'==': 8,\n\t'!=': 8,\n\t'===': 8,\n\t'!==': 8,\n\t'<': 9,\n\t'>': 9,\n\t'<=': 9,\n\t'>=': 9,\n\tin: 9,\n\tinstanceof: 9,\n\t'<<': 10,\n\t'>>': 10,\n\t'>>>': 10,\n\t'+': 11,\n\t'-': 11,\n\t'*': 12,\n\t'%': 12,\n\t'/': 12,\n\t'**': 13,\n};\n\nconst EXPRESSIONS_PRECEDENCE = {\n\tArrayExpression: 20,\n\tTaggedTemplateExpression: 20,\n\tThisExpression: 20,\n\tIdentifier: 20,\n\tLiteral: 18,\n\tTemplateLiteral: 20,\n\tSuper: 20,\n\tSequenceExpression: 20,\n\tMemberExpression: 19,\n\tCallExpression: 19,\n\tNewExpression: 19,\n\tAwaitExpression: 17,\n\tArrowFunctionExpression: 17,\n\tClassExpression: 17,\n\tFunctionExpression: 17,\n\tObjectExpression: 17,\n\tUpdateExpression: 16,\n\tUnaryExpression: 15,\n\tBinaryExpression: 14,\n\tLogicalExpression: 13,\n\tConditionalExpression: 4,\n\tAssignmentExpression: 3,\n\tYieldExpression: 2,\n\tRestElement: 1\n};\n\nfunction needs_parens(node, parent, is_right) {\n\tconst precedence = EXPRESSIONS_PRECEDENCE[node.type];\n\tconst parent_precedence = EXPRESSIONS_PRECEDENCE[parent.type];\n\n\tif (precedence !== parent_precedence) {\n\t\t// Different node types\n\t\treturn (\n\t\t\t(!is_right &&\n\t\t\t\tprecedence === 15 &&\n\t\t\t\tparent_precedence === 14 &&\n\t\t\t\tparent.operator === '**') ||\n\t\t\tprecedence < parent_precedence\n\t\t);\n\t}\n\n\tif (precedence !== 13 && precedence !== 14) {\n\t\t// Not a `LogicalExpression` or `BinaryExpression`\n\t\treturn false;\n\t}\n\n\tif ((node ).operator === '**' && parent.operator === '**') {\n\t\t// Exponentiation operator has right-to-left associativity\n\t\treturn !is_right;\n\t}\n\n\tif (is_right) {\n\t\t// Parenthesis are used if both operators have the same precedence\n\t\treturn (\n\t\t\tOPERATOR_PRECEDENCE[(node ).operator] <=\n\t\t\tOPERATOR_PRECEDENCE[parent.operator]\n\t\t);\n\t}\n\n\treturn (\n\t\tOPERATOR_PRECEDENCE[(node ).operator] <\n\t\tOPERATOR_PRECEDENCE[parent.operator]\n\t);\n}\n\nfunction has_call_expression(node) {\n\twhile (node) {\n\t\tif (node.type[0] === 'CallExpression') {\n\t\t\treturn true;\n\t\t} else if (node.type === 'MemberExpression') {\n\t\t\tnode = node.object;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nconst has_newline = (chunks) => {\n\tfor (let i = 0; i < chunks.length; i += 1) {\n\t\tif (chunks[i].has_newline) return true;\n\t}\n\treturn false;\n};\n\nconst get_length = (chunks) => {\n\tlet total = 0;\n\tfor (let i = 0; i < chunks.length; i += 1) {\n\t\ttotal += chunks[i].content.length;\n\t}\n\treturn total;\n};\n\nconst sum = (a, b) => a + b;\n\nconst join = (nodes, separator) => {\n\tif (nodes.length === 0) return [];\n\tconst joined = [...nodes[0]];\n\tfor (let i = 1; i < nodes.length; i += 1) {\n\t\tjoined.push(separator, ...nodes[i] );\n\t}\n\treturn joined;\n};\n\nconst scoped = (fn) => {\n\treturn (node, state) => {\n\t\treturn fn(node, {\n\t\t\t...state,\n\t\t\tscope: state.scope_map.get(node)\n\t\t});\n\t};\n};\n\nconst deconflict = (name, names) => {\n\tconst original = name;\n\tlet i = 1;\n\n\twhile (names.has(name)) {\n\t\tname = `${original}$${i++}`;\n\t}\n\n\treturn name;\n};\n\nconst handle_body = (nodes, state) => {\n\tconst chunks = [];\n\n\tconst body = nodes.map(statement => {\n\t\tconst chunks = handle(statement, {\n\t\t\t...state,\n\t\t\tindent: state.indent\n\t\t});\n\n\t\twhile (state.comments.length) {\n\t\t\tconst comment = state.comments.shift();\n\t\t\tchunks.push(c(comment.type === 'Block'\n\t\t\t? ` /*${comment.value}*/`\n\t\t\t: ` //${comment.value}`));\n\t\t}\n\n\t\treturn chunks;\n\t});\n\n\tlet needed_padding = false;\n\n\tfor (let i = 0; i < body.length; i += 1) {\n\t\tconst needs_padding = has_newline(body[i]);\n\n\t\tif (i > 0) {\n\t\t\tchunks.push(\n\t\t\t\tc(needs_padding || needed_padding ? `\\n\\n${state.indent}` : `\\n${state.indent}`)\n\t\t\t);\n\t\t}\n\n\t\tchunks.push(\n\t\t\t...body[i]\n\t\t);\n\n\t\tneeded_padding = needs_padding;\n\t}\n\n\treturn chunks;\n};\n\nconst handle_var_declaration = (node, state) => {\n\tconst chunks = [c(`${node.kind} `)];\n\n\tconst declarators = node.declarations.map(d => handle(d, {\n\t\t...state,\n\t\tindent: state.indent + (node.declarations.length === 1 ? '' : '\\t')\n\t}));\n\n\tconst multiple_lines = (\n\t\tdeclarators.some(has_newline) ||\n\t\t(declarators.map(get_length).reduce(sum, 0) + (state.indent.length + declarators.length - 1) * 2) > 80\n\t);\n\n\tconst separator = c(multiple_lines ? `,\\n${state.indent}\\t` : ', ');\n\n\tif (multiple_lines) {\n\t\tchunks.push(...join(declarators, separator));\n\t} else {\n\t\tchunks.push(\n\t\t\t...join(declarators, separator)\n\t\t);\n\t}\n\n\treturn chunks;\n};\n\nconst handlers = {\n\tProgram(node, state) {\n\t\treturn handle_body(node.body, state);\n\t},\n\n\tBlockStatement: scoped((node, state) => {\n\t\treturn [\n\t\t\tc(`{\\n${state.indent}\\t`),\n\t\t\t...handle_body(node.body, { ...state, indent: state.indent + '\\t' }),\n\t\t\tc(`\\n${state.indent}}`)\n\t\t];\n\t}),\n\n\tEmptyStatement(node, state) {\n\t\treturn [];\n\t},\n\n\tParenthesizedExpression(node, state) {\n\t\treturn handle(node.expression, state);\n\t},\n\n\tExpressionStatement(node, state) {\n\t\tconst precedence = EXPRESSIONS_PRECEDENCE[node.expression.type];\n\t\tif (\n\t\t\tprecedence === 3 && (node.expression ).left.type === 'ObjectPattern'\n\t\t) {\n\t\t\t// is an AssignmentExpression to an ObjectPattern\n\t\t\treturn [\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.expression, state),\n\t\t\t\tc(');')\n\t\t\t];\n\t\t}\n\n\t\treturn [\n\t\t\t...handle(node.expression, state),\n\t\t\tc(';')\n\t\t];\n\t},\n\n\tIfStatement(node, state) {\n\t\tconst chunks = [\n\t\t\tc('if ('),\n\t\t\t...handle(node.test, state),\n\t\t\tc(') '),\n\t\t\t...handle(node.consequent, state)\n\t\t];\n\n\t\tif (node.alternate) {\n\t\t\tchunks.push(\n\t\t\t\tc(' else '),\n\t\t\t\t...handle(node.alternate, state)\n\t\t\t);\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tLabeledStatement(node, state) {\n\t\treturn [\n\t\t\t...handle(node.label, state),\n\t\t\tc(': '),\n\t\t\t...handle(node.body, state)\n\t\t];\n\t},\n\n\tBreakStatement(node, state) {\n\t\treturn node.label\n\t\t\t? [c('break '), ...handle(node.label, state), c(';')]\n\t\t\t: [c('break;')];\n\t},\n\n\tContinueStatement(node, state) {\n\t\treturn node.label\n\t\t\t? [c('continue '), ...handle(node.label, state), c(';')]\n\t\t\t: [c('continue;')];\n\t},\n\n\tWithStatement(node, state) {\n\t\treturn [\n\t\t\tc('with ('),\n\t\t\t...handle(node.object, state),\n\t\t\tc(') '),\n\t\t\t...handle(node.body, state)\n\t\t];\n\t},\n\n\tSwitchStatement(node, state) {\n\t\tconst chunks = [\n\t\t\tc('switch ('),\n\t\t\t...handle(node.discriminant, state),\n\t\t\tc(') {')\n\t\t];\n\n\t\tnode.cases.forEach(block => {\n\t\t\tif (block.test) {\n\t\t\t\tchunks.push(\n\t\t\t\t\tc(`\\n${state.indent}\\tcase `),\n\t\t\t\t\t...handle(block.test, { ...state, indent: `${state.indent}\\t` }),\n\t\t\t\t\tc(':')\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchunks.push(c(`\\n${state.indent}\\tdefault:`));\n\t\t\t}\n\n\t\t\tblock.consequent.forEach(statement => {\n\t\t\t\tchunks.push(\n\t\t\t\t\tc(`\\n${state.indent}\\t\\t`),\n\t\t\t\t\t...handle(statement, { ...state, indent: `${state.indent}\\t\\t` })\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tchunks.push(c(`\\n${state.indent}}`));\n\n\t\treturn chunks;\n\t},\n\n\tReturnStatement(node, state) {\n\t\tif (node.argument) {\n\t\t\treturn [\n\t\t\t\tc('return '),\n\t\t\t\t...handle(node.argument, state),\n\t\t\t\tc(';')\n\t\t\t];\n\t\t} else {\n\t\t\treturn [c('return;')];\n\t\t}\n\t},\n\n\tThrowStatement(node, state) {\n\t\treturn [\n\t\t\tc('throw '),\n\t\t\t...handle(node.argument, state),\n\t\t\tc(';')\n\t\t];\n\t},\n\n\tTryStatement(node, state) {\n\t\tconst chunks = [\n\t\t\tc('try '),\n\t\t\t...handle(node.block, state)\n\t\t];\n\n\t\tif (node.handler) {\n\t\t\tif (node.handler.param) {\n\t\t\t\tchunks.push(\n\t\t\t\t\tc(' catch('),\n\t\t\t\t\t...handle(node.handler.param, state),\n\t\t\t\t\tc(') ')\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchunks.push(c(' catch '));\n\t\t\t}\n\n\t\t\tchunks.push(...handle(node.handler.body, state));\n\t\t}\n\n\t\tif (node.finalizer) {\n\t\t\tchunks.push(c(' finally '), ...handle(node.finalizer, state));\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tWhileStatement(node, state) {\n\t\treturn [\n\t\t\tc('while ('),\n\t\t\t...handle(node.test, state),\n\t\t\tc(') '),\n\t\t\t...handle(node.body, state)\n\t\t];\n\t},\n\n\tDoWhileStatement(node, state) {\n\t\treturn [\n\t\t\tc('do '),\n\t\t\t...handle(node.body, state),\n\t\t\tc(' while ('),\n\t\t\t...handle(node.test, state),\n\t\t\tc(');')\n\t\t];\n\t},\n\n\tForStatement: scoped((node, state) => {\n\t\tconst chunks = [c('for (')];\n\n\t\tif (node.init) {\n\t\t\tif ((node.init ).type === 'VariableDeclaration') {\n\t\t\t\tchunks.push(...handle_var_declaration(node.init , state));\n\t\t\t} else {\n\t\t\t\tchunks.push(...handle(node.init, state));\n\t\t\t}\n\t\t}\n\n\t\tchunks.push(c('; '));\n\t\tif (node.test) chunks.push(...handle(node.test, state));\n\t\tchunks.push(c('; '));\n\t\tif (node.update) chunks.push(...handle(node.update, state));\n\n\t\tchunks.push(\n\t\t\tc(') '),\n\t\t\t...handle(node.body, state)\n\t\t);\n\n\t\treturn chunks;\n\t}),\n\n\tForInStatement: scoped((node, state) => {\n\t\tconst chunks = [\n\t\t\tc(`for ${(node ).await ? 'await ' : ''}(`)\n\t\t];\n\n\t\tif ((node.left ).type === 'VariableDeclaration') {\n\t\t\tchunks.push(...handle_var_declaration(node.left , state));\n\t\t} else {\n\t\t\tchunks.push(...handle(node.left, state));\n\t\t}\n\n\t\tchunks.push(\n\t\t\tc(node.type === 'ForInStatement' ? ` in ` : ` of `),\n\t\t\t...handle(node.right, state),\n\t\t\tc(') '),\n\t\t\t...handle(node.body, state)\n\t\t);\n\n\t\treturn chunks;\n\t}),\n\n\tDebuggerStatement(node, state) {\n\t\treturn [c('debugger', node), c(';')];\n\t},\n\n\tFunctionDeclaration: scoped((node, state) => {\n\t\tconst chunks = [];\n\n\t\tif (node.async) chunks.push(c('async '));\n\t\tchunks.push(c(node.generator ? 'function* ' : 'function '));\n\t\tif (node.id) chunks.push(...handle(node.id, state));\n\t\tchunks.push(c('('));\n\n\t\tconst params = node.params.map(p => handle(p, {\n\t\t\t...state,\n\t\t\tindent: state.indent + '\\t'\n\t\t}));\n\n\t\tconst multiple_lines = (\n\t\t\tparams.some(has_newline) ||\n\t\t\t(params.map(get_length).reduce(sum, 0) + (state.indent.length + params.length - 1) * 2) > 80\n\t\t);\n\n\t\tconst separator = c(multiple_lines ? `,\\n${state.indent}` : ', ');\n\n\t\tif (multiple_lines) {\n\t\t\tchunks.push(\n\t\t\t\tc(`\\n${state.indent}\\t`),\n\t\t\t\t...join(params, separator),\n\t\t\t\tc(`\\n${state.indent}`)\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(\n\t\t\t\t...join(params, separator)\n\t\t\t);\n\t\t}\n\n\t\tchunks.push(\n\t\t\tc(') '),\n\t\t\t...handle(node.body, state)\n\t\t);\n\n\t\treturn chunks;\n\t}),\n\n\tVariableDeclaration(node, state) {\n\t\treturn handle_var_declaration(node, state).concat(c(';'));\n\t},\n\n\tVariableDeclarator(node, state) {\n\t\tif (node.init) {\n\t\t\treturn [\n\t\t\t\t...handle(node.id, state),\n\t\t\t\tc(' = '),\n\t\t\t\t...handle(node.init, state)\n\t\t\t];\n\t\t} else {\n\t\t\treturn handle(node.id, state);\n\t\t}\n\t},\n\n\tClassDeclaration(node, state) {\n\t\tconst chunks = [c('class ')];\n\n\t\tif (node.id) chunks.push(...handle(node.id, state), c(' '));\n\n\t\tif (node.superClass) {\n\t\t\tchunks.push(\n\t\t\t\tc('extends '),\n\t\t\t\t...handle(node.superClass, state),\n\t\t\t\tc(' ')\n\t\t\t);\n\t\t}\n\n\t\tchunks.push(...handle(node.body, state));\n\n\t\treturn chunks;\n\t},\n\n\tImportDeclaration(node, state) {\n\t\tconst chunks = [c('import ')];\n\n\t\tconst { length } = node.specifiers;\n\t\tconst source = handle(node.source, state);\n\n\t\tif (length > 0) {\n\t\t\tlet i = 0;\n\n\t\t\twhile (i < length) {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tchunks.push(c(', '));\n\t\t\t\t}\n\n\t\t\t\tconst specifier = node.specifiers[i];\n\n\t\t\t\tif (specifier.type === 'ImportDefaultSpecifier') {\n\t\t\t\t\tchunks.push(c(specifier.local.name, specifier));\n\t\t\t\t\ti += 1;\n\t\t\t\t} else if (specifier.type === 'ImportNamespaceSpecifier') {\n\t\t\t\t\tchunks.push(c('* as ' + specifier.local.name, specifier));\n\t\t\t\t\ti += 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (i < length) {\n\t\t\t\t// we have named specifiers\n\t\t\t\tconst specifiers = node.specifiers.slice(i).map((specifier) => {\n\t\t\t\t\tconst name = handle(specifier.imported, state)[0];\n\t\t\t\t\tconst as = handle(specifier.local, state)[0];\n\n\t\t\t\t\tif (name.content === as.content) {\n\t\t\t\t\t\treturn [as];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [name, c(' as '), as];\n\t\t\t\t});\n\n\t\t\t\tconst width = get_length(chunks) + specifiers.map(get_length).reduce(sum, 0) + (2 * specifiers.length) + 6 + get_length(source);\n\n\t\t\t\tif (width > 80) {\n\t\t\t\t\tchunks.push(\n\t\t\t\t\t\tc(`{\\n\\t`),\n\t\t\t\t\t\t...join(specifiers, c(',\\n\\t')),\n\t\t\t\t\t\tc('\\n}')\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tchunks.push(\n\t\t\t\t\t\tc(`{ `),\n\t\t\t\t\t\t...join(specifiers, c(', ')),\n\t\t\t\t\t\tc(' }')\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchunks.push(c(' from '));\n\t\t}\n\n\t\tchunks.push(\n\t\t\t...source,\n\t\t\tc(';')\n\t\t);\n\n\t\treturn chunks;\n\t},\n\n\tImportExpression(node, state) {\n\t\treturn [c('import('), ...handle(node.source, state), c(')')];\n\t},\n\n\tExportDefaultDeclaration(node, state) {\n\t\tconst chunks = [\n\t\t\tc(`export default `),\n\t\t\t...handle(node.declaration, state)\n\t\t];\n\n\t\tif (node.declaration.type !== 'FunctionDeclaration') {\n\t\t\tchunks.push(c(';'));\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tExportNamedDeclaration(node, state) {\n\t\tconst chunks = [c('export ')];\n\n\t\tif (node.declaration) {\n\t\t\tchunks.push(...handle(node.declaration, state));\n\t\t} else {\n\t\t\tconst specifiers = node.specifiers.map(specifier => {\n\t\t\t\tconst name = handle(specifier.local, state)[0];\n\t\t\t\tconst as = handle(specifier.exported, state)[0];\n\n\t\t\t\tif (name.content === as.content) {\n\t\t\t\t\treturn [name];\n\t\t\t\t}\n\n\t\t\t\treturn [name, c(' as '), as];\n\t\t\t});\n\n\t\t\tconst width = 7 + specifiers.map(get_length).reduce(sum, 0) + 2 * specifiers.length;\n\n\t\t\tif (width > 80) {\n\t\t\t\tchunks.push(\n\t\t\t\t\tc('{\\n\\t'),\n\t\t\t\t\t...join(specifiers, c(',\\n\\t')),\n\t\t\t\t\tc('\\n}')\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tchunks.push(\n\t\t\t\t\tc('{ '),\n\t\t\t\t\t...join(specifiers, c(', ')),\n\t\t\t\t\tc(' }')\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (node.source) {\n\t\t\t\tchunks.push(\n\t\t\t\t\tc(' from '),\n\t\t\t\t\t...handle(node.source, state)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tchunks.push(c(';'));\n\n\t\treturn chunks;\n\t},\n\n\tExportAllDeclaration(node, state) {\n\t\treturn [\n\t\t\tc(`export * from `),\n\t\t\t...handle(node.source, state),\n\t\t\tc(`;`)\n\t\t];\n\t},\n\n\tMethodDefinition(node, state) {\n\t\tconst chunks = [];\n\n\t\tif (node.static) {\n\t\t\tchunks.push(c('static '));\n\t\t}\n\n\t\tif (node.kind === 'get' || node.kind === 'set') {\n\t\t\t// Getter or setter\n\t\t\tchunks.push(c(node.kind + ' '));\n\t\t}\n\n\t\tif (node.value.async) {\n\t\t\tchunks.push(c('async '));\n\t\t}\n\n\t\tif (node.value.generator) {\n\t\t\tchunks.push(c('*'));\n\t\t}\n\n\t\tif (node.computed) {\n\t\t\tchunks.push(\n\t\t\t\tc('['),\n\t\t\t\t...handle(node.key, state),\n\t\t\t\tc(']')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.key, state));\n\t\t}\n\n\t\tchunks.push(c('('));\n\n\t\tconst { params } = node.value;\n\t\tfor (let i = 0; i < params.length; i += 1) {\n\t\t\tchunks.push(...handle(params[i], state));\n\t\t\tif (i < params.length - 1) chunks.push(c(', '));\n\t\t}\n\n\t\tchunks.push(\n\t\t\tc(') '),\n\t\t\t...handle(node.value.body, state)\n\t\t);\n\n\t\treturn chunks;\n\t},\n\n\tArrowFunctionExpression: scoped((node, state) => {\n\t\tconst chunks = [];\n\n\t\tif (node.async) chunks.push(c('async '));\n\n\t\tif (node.params.length === 1 && node.params[0].type === 'Identifier') {\n\t\t\tchunks.push(...handle(node.params[0], state));\n\t\t} else {\n\t\t\tconst params = node.params.map(param => handle(param, {\n\t\t\t\t...state,\n\t\t\t\tindent: state.indent + '\\t'\n\t\t\t}));\n\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...join(params, c(', ')),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t}\n\n\t\tchunks.push(c(' => '));\n\n\t\tif (node.body.type === 'ObjectExpression') {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.body, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.body, state));\n\t\t}\n\n\t\treturn chunks;\n\t}),\n\n\tThisExpression(node, state) {\n\t\treturn [c('this', node)];\n\t},\n\n\tSuper(node, state) {\n\t\treturn [c('super', node)];\n\t},\n\n\tRestElement(node, state) {\n\t\treturn [c('...'), ...handle(node.argument, state)];\n\t},\n\n\tYieldExpression(node, state) {\n\t\tif (node.argument) {\n\t\t\treturn [c(node.delegate ? `yield* ` : `yield `), ...handle(node.argument, state)];\n\t\t}\n\n\t\treturn [c(node.delegate ? `yield*` : `yield`)];\n\t},\n\n\tAwaitExpression(node, state) {\n\t\tif (node.argument) {\n\t\t\tconst precedence = EXPRESSIONS_PRECEDENCE[node.argument.type];\n\n\t\t\tif (precedence && (precedence < EXPRESSIONS_PRECEDENCE.AwaitExpression)) {\n\t\t\t\treturn [c('await ('), ...handle(node.argument, state), c(')')];\n\t\t\t} else {\n\t\t\t\treturn [c('await '), ...handle(node.argument, state)];\n\t\t\t}\n\t\t}\n\n\t\treturn [c('await')];\n\t},\n\n\tTemplateLiteral(node, state) {\n\t\tconst chunks = [c('`')];\n\n\t\tconst { quasis, expressions } = node;\n\n\t\tfor (let i = 0; i < expressions.length; i++) {\n\t\t\tchunks.push(\n\t\t\t\tc(quasis[i].value.raw),\n\t\t\t\tc('${'),\n\t\t\t\t...handle(expressions[i], state),\n\t\t\t\tc('}')\n\t\t\t);\n\t\t}\n\n\t\tchunks.push(\n\t\t\tc(quasis[quasis.length - 1].value.raw),\n\t\t\tc('`')\n\t\t);\n\n\t\treturn chunks;\n\t},\n\n\tTaggedTemplateExpression(node, state) {\n\t\treturn handle(node.tag, state).concat(handle(node.quasi, state));\n\t},\n\n\tArrayExpression(node, state) {\n\t\tconst chunks = [c('[')];\n\n\t\tconst elements = [];\n\t\tlet sparse_commas = [];\n\n\t\tfor (let i = 0; i < node.elements.length; i += 1) {\n\t\t\t// can't use map/forEach because of sparse arrays\n\t\t\tconst element = node.elements[i];\n\t\t\tif (element) {\n\t\t\t\telements.push([...sparse_commas, ...handle(element, {\n\t\t\t\t\t...state,\n\t\t\t\t\tindent: state.indent + '\\t'\n\t\t\t\t})]);\n\t\t\t\tsparse_commas = [];\n\t\t\t} else {\n\t\t\t\tsparse_commas.push(c(','));\n\t\t\t}\n\t\t}\n\n\t\tconst multiple_lines = (\n\t\t\telements.some(has_newline) ||\n\t\t\t(elements.map(get_length).reduce(sum, 0) + (state.indent.length + elements.length - 1) * 2) > 80\n\t\t);\n\n\t\tif (multiple_lines) {\n\t\t\tchunks.push(\n\t\t\t\tc(`\\n${state.indent}\\t`),\n\t\t\t\t...join(elements, c(`,\\n${state.indent}\\t`)),\n\t\t\t\tc(`\\n${state.indent}`),\n\t\t\t\t...sparse_commas\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...join(elements, c(', ')), ...sparse_commas);\n\t\t}\n\n\t\tchunks.push(c(']'));\n\n\t\treturn chunks;\n\t},\n\n\tObjectExpression(node, state) {\n\t\tif (node.properties.length === 0) {\n\t\t\treturn [c('{}')];\n\t\t}\n\n\t\tlet has_inline_comment = false;\n\n\t\tconst chunks = [];\n\t\tconst separator = c(', ');\n\n\t\tnode.properties.forEach((p, i) => {\n\t\t\tchunks.push(...handle(p, {\n\t\t\t\t...state,\n\t\t\t\tindent: state.indent + '\\t'\n\t\t\t}));\n\n\t\t\tif (state.comments.length) {\n\t\t\t\t// TODO generalise this, so it works with ArrayExpressions and other things.\n\t\t\t\t// At present, stuff will just get appended to the closest statement/declaration\n\t\t\t\tchunks.push(c(', '));\n\n\t\t\t\twhile (state.comments.length) {\n\t\t\t\t\tconst comment = state.comments.shift();\n\n\t\t\t\t\tchunks.push(c(comment.type === 'Block'\n\t\t\t\t\t\t? `/*${comment.value}*/\\n${state.indent}\\t`\n\t\t\t\t\t\t: `//${comment.value}\\n${state.indent}\\t`));\n\n\t\t\t\t\tif (comment.type === 'Line') {\n\t\t\t\t\t\thas_inline_comment = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (i < node.properties.length - 1) {\n\t\t\t\t\tchunks.push(separator);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst multiple_lines = (\n\t\t\thas_inline_comment ||\n\t\t\thas_newline(chunks) ||\n\t\t\tget_length(chunks) > 40\n\t\t);\n\n\t\tif (multiple_lines) {\n\t\t\tseparator.content = `,\\n${state.indent}\\t`;\n\t\t}\n\n\t\treturn [\n\t\t\tc(multiple_lines ? `{\\n${state.indent}\\t` : `{ `),\n\t\t\t...chunks,\n\t\t\tc(multiple_lines ? `\\n${state.indent}}` : ` }`)\n\t\t];\n\t},\n\n\tProperty(node, state) {\n\t\tconst value = handle(node.value, state);\n\n\t\tif (node.key === node.value) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// special case\n\t\tif (\n\t\t\t!node.computed &&\n\t\t\tnode.value.type === 'AssignmentPattern' &&\n\t\t\tnode.value.left.type === 'Identifier' &&\n\t\t\tnode.value.left.name === (node.key ).name\n\t\t) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif (node.value.type === 'Identifier' && (\n\t\t\t(node.key.type === 'Identifier' && node.key.name === value[0].content) ||\n\t\t\t(node.key.type === 'Literal' && node.key.value === value[0].content)\n\t\t)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst key = handle(node.key, state);\n\n\t\tif (node.value.type === 'FunctionExpression' && !node.value.id) {\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\tscope: state.scope_map.get(node.value)\n\t\t\t};\n\n\t\t\tconst chunks = node.kind !== 'init'\n\t\t\t\t? [c(`${node.kind} `)]\n\t\t\t\t: [];\n\n\t\t\tif (node.value.async) {\n\t\t\t\tchunks.push(c('async '));\n\t\t\t}\n\t\t\tif (node.value.generator) {\n\t\t\t\tchunks.push(c('*'));\n\t\t\t}\n\n\t\t\tchunks.push(\n\t\t\t\t...(node.computed ? [c('['), ...key, c(']')] : key),\n\t\t\t\tc('('),\n\t\t\t\t...join((node.value ).params.map(param => handle(param, state)), c(', ')),\n\t\t\t\tc(') '),\n\t\t\t\t...handle((node.value ).body, state)\n\t\t\t);\n\n\t\t\treturn chunks;\n\t\t}\n\n\t\tif (node.computed) {\n\t\t\treturn [\n\t\t\t\tc('['),\n\t\t\t\t...key,\n\t\t\t\tc(']: '),\n\t\t\t\t...value\n\t\t\t];\n\t\t}\n\n\t\treturn [\n\t\t\t...key,\n\t\t\tc(': '),\n\t\t\t...value\n\t\t];\n\t},\n\n\tObjectPattern(node, state) {\n\t\tconst chunks = [c('{ ')];\n\n\t\tfor (let i = 0; i < node.properties.length; i += 1) {\n\t\t\tchunks.push(...handle(node.properties[i], state));\n\t\t\tif (i < node.properties.length - 1) chunks.push(c(', '));\n\t\t}\n\n\t\tchunks.push(c(' }'));\n\n\t\treturn chunks;\n\t},\n\n\tSequenceExpression(node, state) {\n\t\tconst expressions = node.expressions.map(e => handle(e, state));\n\n\t\treturn [\n\t\t\tc('('),\n\t\t\t...join(expressions, c(', ')),\n\t\t\tc(')')\n\t\t];\n\t},\n\n\tUnaryExpression(node, state) {\n\t\tconst chunks = [c(node.operator)];\n\n\t\tif (node.operator.length > 1) {\n\t\t\tchunks.push(c(' '));\n\t\t}\n\n\t\tif (\n\t\t\tEXPRESSIONS_PRECEDENCE[node.argument.type] <\n\t\t\tEXPRESSIONS_PRECEDENCE.UnaryExpression\n\t\t) {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.argument, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.argument, state));\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tUpdateExpression(node, state) {\n\t\treturn node.prefix\n\t\t\t? [c(node.operator), ...handle(node.argument, state)]\n\t\t\t: [...handle(node.argument, state), c(node.operator)];\n\t},\n\n\tAssignmentExpression(node, state) {\n\t\treturn [\n\t\t\t...handle(node.left, state),\n\t\t\tc(` ${node.operator || '='} `),\n\t\t\t...handle(node.right, state)\n\t\t];\n\t},\n\n\tBinaryExpression(node, state) {\n\t\tconst chunks = [];\n\n\t\t// TODO\n\t\t// const is_in = node.operator === 'in';\n\t\t// if (is_in) {\n\t\t// \t// Avoids confusion in `for` loops initializers\n\t\t// \tchunks.push(c('('));\n\t\t// }\n\n\t\tif (needs_parens(node.left, node, false)) {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.left, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.left, state));\n\t\t}\n\n\t\tchunks.push(c(` ${node.operator} `));\n\n\t\tif (needs_parens(node.right, node, true)) {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.right, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.right, state));\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tConditionalExpression(node, state) {\n\t\tconst chunks = [];\n\n\t\tif (\n\t\t\tEXPRESSIONS_PRECEDENCE[node.test.type] >\n\t\t\tEXPRESSIONS_PRECEDENCE.ConditionalExpression\n\t\t) {\n\t\t\tchunks.push(...handle(node.test, state));\n\t\t} else {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.test, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t}\n\n\t\tconst child_state = { ...state, indent: state.indent + '\\t' };\n\n\t\tconst consequent = handle(node.consequent, child_state);\n\t\tconst alternate = handle(node.alternate, child_state);\n\n\t\tconst multiple_lines = (\n\t\t\thas_newline(consequent) || has_newline(alternate) ||\n\t\t\tget_length(chunks) + get_length(consequent) + get_length(alternate) > 50\n\t\t);\n\n\t\tif (multiple_lines) {\n\t\t\tchunks.push(\n\t\t\t\tc(`\\n${state.indent}? `),\n\t\t\t\t...consequent,\n\t\t\t\tc(`\\n${state.indent}: `),\n\t\t\t\t...alternate\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(\n\t\t\t\tc(` ? `),\n\t\t\t\t...consequent,\n\t\t\t\tc(` : `),\n\t\t\t\t...alternate\n\t\t\t);\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tNewExpression(node, state) {\n\t\tconst chunks = [c('new ')];\n\n\t\tif (\n\t\t\tEXPRESSIONS_PRECEDENCE[node.callee.type] <\n\t\t\tEXPRESSIONS_PRECEDENCE.CallExpression || has_call_expression(node.callee)\n\t\t) {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.callee, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.callee, state));\n\t\t}\n\n\t\t// TODO this is copied from CallExpression — DRY it out\n\t\tconst args = node.arguments.map(arg => handle(arg, {\n\t\t\t...state,\n\t\t\tindent: state.indent + '\\t'\n\t\t}));\n\n\t\tconst separator = args.some(has_newline) // TODO or length exceeds 80\n\t\t\t? c(',\\n' + state.indent)\n\t\t\t: c(', ');\n\n\t\tchunks.push(\n\t\t\tc('('),\n\t\t\t...join(args, separator) ,\n\t\t\tc(')')\n\t\t);\n\n\t\treturn chunks;\n\t},\n\n\tCallExpression(node, state) {\n\t\tconst chunks = [];\n\n\t\tif (\n\t\t\tEXPRESSIONS_PRECEDENCE[node.callee.type] <\n\t\t\tEXPRESSIONS_PRECEDENCE.CallExpression\n\t\t) {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.callee, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.callee, state));\n\t\t}\n\n\t\tconst args = node.arguments.map(arg => handle(arg, state));\n\n\t\tconst multiple_lines = args.slice(0, -1).some(has_newline); // TODO or length exceeds 80\n\n\t\tif (multiple_lines) {\n\t\t\t// need to handle args again. TODO find alternative approach?\n\t\t\tconst args = node.arguments.map(arg => handle(arg, {\n\t\t\t\t...state,\n\t\t\t\tindent: `${state.indent}\\t`\n\t\t\t}));\n\n\t\t\tchunks.push(\n\t\t\t\tc(`(\\n${state.indent}\\t`),\n\t\t\t\t...join(args, c(`,\\n${state.indent}\\t`)),\n\t\t\t\tc(`\\n${state.indent})`)\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...join(args, c(', ')),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tMemberExpression(node, state) {\n\t\tconst chunks = [];\n\n\t\tif (EXPRESSIONS_PRECEDENCE[node.object.type] < EXPRESSIONS_PRECEDENCE.MemberExpression) {\n\t\t\tchunks.push(\n\t\t\t\tc('('),\n\t\t\t\t...handle(node.object, state),\n\t\t\t\tc(')')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(...handle(node.object, state));\n\t\t}\n\n\t\tif (node.computed) {\n\t\t\tchunks.push(\n\t\t\t\tc('['),\n\t\t\t\t...handle(node.property, state),\n\t\t\t\tc(']')\n\t\t\t);\n\t\t} else {\n\t\t\tchunks.push(\n\t\t\t\tc('.'),\n\t\t\t\t...handle(node.property, state)\n\t\t\t);\n\t\t}\n\n\t\treturn chunks;\n\t},\n\n\tMetaProperty(node, state) {\n\t\treturn [...handle(node.meta, state), c('.'), ...handle(node.property, state)];\n\t},\n\n\tIdentifier(node, state) {\n\t\tlet name = node.name;\n\n\t\tif (name[0] === '@') {\n\t\t\tname = state.getName(name.slice(1));\n\t\t} else if (node.name[0] === '#') {\n\t\t\tconst owner = state.scope.find_owner(node.name);\n\n\t\t\tif (!owner) {\n\t\t\t\tthrow new Error(`Could not find owner for node`);\n\t\t\t}\n\n\t\t\tif (!state.deconflicted.has(owner)) {\n\t\t\t\tstate.deconflicted.set(owner, new Map());\n\t\t\t}\n\n\t\t\tconst deconflict_map = state.deconflicted.get(owner);\n\n\t\t\tif (!deconflict_map.has(node.name)) {\n\t\t\t\tdeconflict_map.set(node.name, deconflict(node.name.slice(1), owner.references));\n\t\t\t}\n\n\t\t\tname = deconflict_map.get(node.name);\n\t\t}\n\n\t\treturn [c(name, node)];\n\t},\n\n\tLiteral(node, state) {\n\t\tif (typeof node.value === 'string') {\n\t\t\treturn [\n\t\t\t\t// TODO do we need to handle weird unicode characters somehow?\n\t\t\t\t// str.replace(/\\\\u(\\d{4})/g, (m, n) => String.fromCharCode(+n))\n\t\t\t\tc(JSON.stringify(node.value).replace(re, (_m, _i, at, hash, name) => {\n\t\t\t\t\tif (at)\treturn '@' + name;\n\t\t\t\t\tif (hash) return '#' + name;\n\t\t\t\t\tthrow new Error(`this shouldn't happen`);\n\t\t\t\t}), node)\n\t\t\t];\n\t\t}\n\n\t\tconst { regex } = node ; // TODO is this right?\n\t\tif (regex) {\n\t\t\treturn [c(`/${regex.pattern}/${regex.flags}`, node)];\n\t\t}\n\n\t\treturn [c(String(node.value), node)];\n\t}\n};\n\nhandlers.ForOfStatement = handlers.ForInStatement;\nhandlers.FunctionExpression = handlers.FunctionDeclaration;\nhandlers.ClassExpression = handlers.ClassDeclaration;\nhandlers.ClassBody = handlers.BlockStatement;\nhandlers.SpreadElement = handlers.RestElement;\nhandlers.ArrayPattern = handlers.ArrayExpression;\nhandlers.LogicalExpression = handlers.BinaryExpression;\nhandlers.AssignmentPattern = handlers.AssignmentExpression;\n\nlet btoa = () => {\n\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n};\nif (typeof window !== 'undefined' && typeof window.btoa === 'function') {\n\tbtoa = (str) => window.btoa(unescape(encodeURIComponent(str)));\n} else if (typeof Buffer === 'function') {\n\tbtoa = (str) => Buffer.from(str, 'utf-8').toString('base64');\n}\n\n\n\n\n\n\n\n\nfunction print(node, opts = {}) {\n\tif (Array.isArray(node)) {\n\t\treturn print({\n\t\t\ttype: 'Program',\n\t\t\tbody: node\n\t\t} , opts);\n\t}\n\n\tconst {\n\t\tgetName = (x) => x\n\t} = opts;\n\n\tlet { map: scope_map, scope } = analyze(node);\n\tconst deconflicted = new WeakMap();\n\n\tconst chunks = handle(node, {\n\t\tindent: '',\n\t\tgetName,\n\t\tscope,\n\t\tscope_map,\n\t\tdeconflicted,\n\t\tcomments: []\n\t});\n\n\t\n\n\tlet code = '';\n\tlet mappings = [];\n\tlet current_line = [];\n\tlet current_column = 0;\n\n\tfor (let i = 0; i < chunks.length; i += 1) {\n\t\tconst chunk = chunks[i];\n\n\t\tcode += chunk.content;\n\n\t\tif (chunk.loc) {\n\t\t\tcurrent_line.push([\n\t\t\t\tcurrent_column,\n\t\t\t\t0, // source index is always zero\n\t\t\t\tchunk.loc.start.line - 1,\n\t\t\t\tchunk.loc.start.column,\n\t\t\t]);\n\t\t}\n\n\t\tfor (let i = 0; i < chunk.content.length; i += 1) {\n\t\t\tif (chunk.content[i] === '\\n') {\n\t\t\t\tmappings.push(current_line);\n\t\t\t\tcurrent_line = [];\n\t\t\t\tcurrent_column = 0;\n\t\t\t} else {\n\t\t\t\tcurrent_column += 1;\n\t\t\t}\n\t\t}\n\n\t\tif (chunk.loc) {\n\t\t\tcurrent_line.push([\n\t\t\t\tcurrent_column,\n\t\t\t\t0, // source index is always zero\n\t\t\t\tchunk.loc.end.line - 1,\n\t\t\t\tchunk.loc.end.column,\n\t\t\t]);\n\t\t}\n\t}\n\n\tmappings.push(current_line);\n\n\tconst map = {\n\t\tversion: 3,\n\t\tnames: [] ,\n\t\tsources: [opts.sourceMapSource || null],\n\t\tsourcesContent: [opts.sourceMapContent || null],\n\t\tmappings: encode(mappings)\n\t};\n\n\tObject.defineProperties(map, {\n\t\ttoString: {\n\t\t\tenumerable: false,\n\t\t\tvalue: function toString() {\n\t\t\t\treturn JSON.stringify(this);\n\t\t\t}\n\t\t},\n\t\ttoUrl: {\n\t\t\tenumerable: false,\n\t\t\tvalue: function toUrl() {\n\t\t\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t\t\t}\n\t\t}\n\t});\n\n\treturn {\n\t\tcode,\n\t\tmap\n\t};\n}\n\nconst sigils = {\n\t'@': 'AT',\n\t'#': 'HASH'\n};\n\nconst join$1 = (strings) => {\n\tlet str = strings[0];\n\tfor (let i = 1; i < strings.length; i += 1) {\n\t\tstr += `_${id}_${i - 1}_${strings[i]}`;\n\t}\n\treturn str.replace(/([@#])(\\w+)/g, (_m, sigil, name) => `_${id}_${sigils[sigil]}_${name}`);\n};\n\nconst flatten_body = (array, target) => {\n\tfor (let i = 0; i < array.length; i += 1) {\n\t\tconst statement = array[i];\n\t\tif (Array.isArray(statement)) {\n\t\t\tflatten_body(statement, target);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (statement.type === 'ExpressionStatement') {\n\t\t\tif (statement.expression === EMPTY) continue;\n\n\t\t\tif (Array.isArray(statement.expression)) {\n\t\t\t\t// TODO this is hacktacular\n\t\t\t\tlet node = statement.expression[0];\n\t\t\t\twhile (Array.isArray(node)) node = node[0];\n\t\t\t\tif (node) node.leadingComments = statement.leadingComments;\n\n\t\t\t\tflatten_body(statement.expression, target);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (/(Expression|Literal)$/.test(statement.expression.type)) {\n\t\t\t\ttarget.push(statement);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (statement.leadingComments) statement.expression.leadingComments = statement.leadingComments;\n\t\t\tif (statement.trailingComments) statement.expression.trailingComments = statement.trailingComments;\n\n\t\t\ttarget.push(statement.expression);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttarget.push(statement);\n\t}\n\n\treturn target;\n};\n\nconst flatten_properties = (array, target) => {\n\tfor (let i = 0; i < array.length; i += 1) {\n\t\tconst property = array[i];\n\n\t\tif (property.value === EMPTY) continue;\n\n\t\tif (property.key === property.value && Array.isArray(property.key)) {\n\t\t\tflatten_properties(property.key, target);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttarget.push(property);\n\t}\n\n\treturn target;\n};\n\nconst flatten = (nodes, target) => {\n\tfor (let i = 0; i < nodes.length; i += 1) {\n\t\tconst node = nodes[i];\n\n\t\tif (node === EMPTY) continue;\n\n\t\tif (Array.isArray(node)) {\n\t\t\tflatten(node, target);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttarget.push(node);\n\t}\n\n\treturn target;\n};\n\nconst EMPTY = { type: 'Empty' };\n\nconst acorn_opts = (comments, raw) => {\n\tconst { onComment } = get_comment_handlers(comments, raw);\n\treturn {\n\t\tecmaVersion: 11,\n\t\tsourceType: 'module',\n\t\tallowAwaitOutsideFunction: true,\n\t\tallowImportExportEverywhere: true,\n\t\tallowReturnOutsideFunction: true,\n\t\tonComment\n\t} ;\n};\n\nconst inject = (raw, node, values, comments) => {\n\tcomments.forEach(comment => {\n\t\tcomment.value = comment.value.replace(re, (m, i) => +i in values ? values[+i] : m);\n\t});\n\n\tconst { enter, leave } = get_comment_handlers(comments, raw);\n\n\twalk(node, {\n\t\tenter,\n\n\t\tleave(node, parent, key, index) {\n\t\t\tif (node.type === 'Identifier') {\n\t\t\t\tre.lastIndex = 0;\n\t\t\t\tconst match = re.exec(node.name);\n\n\t\t\t\tif (match) {\n\t\t\t\t\tif (match[1]) {\n\t\t\t\t\t\tif (+match[1] in values) {\n\t\t\t\t\t\t\tlet value = values[+match[1]];\n\n\t\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\t\tvalue = { type: 'Identifier', name: value, leadingComments: node.leadingComments, trailingComments: node.trailingComments };\n\t\t\t\t\t\t\t} else if (typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = { type: 'Literal', value, leadingComments: node.leadingComments, trailingComments: node.trailingComments };\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.replace(value || EMPTY);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.name = `${match[2] ? `@` : `#`}${match[4]}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === 'Literal') {\n\t\t\t\tif (typeof node.value === 'string') {\n\t\t\t\t\tre.lastIndex = 0;\n\t\t\t\t\tnode.value = node.value.replace(re, (m, i) => +i in values ? values[+i] : m);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === 'TemplateElement') {\n\t\t\t\tre.lastIndex = 0;\n\t\t\t\tnode.value.raw = (node.value.raw ).replace(re, (m, i) => +i in values ? values[+i] : m);\n\t\t\t}\n\n\t\t\tif (node.type === 'Program' || node.type === 'BlockStatement') {\n\t\t\t\tnode.body = flatten_body(node.body, []);\n\t\t\t}\n\n\t\t\tif (node.type === 'ObjectExpression' || node.type === 'ObjectPattern') {\n\t\t\t\tnode.properties = flatten_properties(node.properties, []);\n\t\t\t}\n\n\t\t\tif (node.type === 'ArrayExpression' || node.type === 'ArrayPattern') {\n\t\t\t\tnode.elements = flatten(node.elements, []);\n\t\t\t}\n\n\t\t\tif (node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration' || node.type === 'ArrowFunctionExpression') {\n\t\t\t\tnode.params = flatten(node.params, []);\n\t\t\t}\n\n\t\t\tif (node.type === 'CallExpression' || node.type === 'NewExpression') {\n\t\t\t\tnode.arguments = flatten(node.arguments, []);\n\t\t\t}\n\n\t\t\tif (node.type === 'ImportDeclaration' || node.type === 'ExportNamedDeclaration') {\n\t\t\t\tnode.specifiers = flatten(node.specifiers, []);\n\t\t\t}\n\n\t\t\tif (node.type === 'ForStatement') {\n\t\t\t\tnode.init = node.init === EMPTY ? null : node.init;\n\t\t\t\tnode.test = node.test === EMPTY ? null : node.test;\n\t\t\t\tnode.update = node.update === EMPTY ? null : node.update;\n\t\t\t}\n\n\t\t\tleave(node);\n\t\t}\n\t});\n};\n\nfunction b(strings, ...values) {\n\tconst str = join$1(strings);\n\tconst comments = [];\n\n\ttry {\n\t\tconst ast = parse$1(str, acorn_opts(comments, str));\n\n\t\tinject(str, ast, values, comments);\n\n\t\treturn ast.body;\n\t} catch (err) {\n\t\thandle_error(str, err);\n\t}\n}\n\nfunction x(strings, ...values) {\n\tconst str = join$1(strings);\n\tconst comments = [];\n\n\ttry {\n\t\tconst expression = parseExpressionAt$1(str, 0, acorn_opts(comments, str)) ;\n\n\t\tinject(str, expression, values, comments);\n\n\t\treturn expression;\n\t} catch (err) {\n\t\thandle_error(str, err);\n\t}\n}\n\nfunction p(strings, ...values) {\n\tconst str = `{${join$1(strings)}}`;\n\tconst comments = [];\n\n\ttry {\n\t\tconst expression = parseExpressionAt$1(str, 0, acorn_opts(comments, str)) ;\n\n\t\tinject(str, expression, values, comments);\n\n\t\treturn expression.properties[0];\n\t} catch (err) {\n\t\thandle_error(str, err);\n\t}\n}\n\nfunction handle_error(str, err) {\n\t// TODO location/code frame\n\n\tre.lastIndex = 0;\n\n\tstr = str.replace(re, (m, i, at, hash, name) => {\n\t\tif (at) return `@${name}`;\n\t\tif (hash) return `#${name}`;\n\n\t\treturn '${...}';\n\t});\n\n\tconsole.log(`failed to parse:\\n${str}`);\n\tthrow err;\n}\n\nconst parse = (source, opts) => {\n\tconst comments = [];\n\tconst { onComment, enter, leave } = get_comment_handlers(comments, source);\n\tconst ast = parse$1(source, { onComment, ...opts });\n\twalk(ast , { enter, leave });\n\treturn ast;\n};\n\nconst parseExpressionAt = (source, index, opts) => {\n\tconst comments = [];\n\tconst { onComment, enter, leave } = get_comment_handlers(comments, source);\n\tconst ast = parseExpressionAt$1(source, index, { onComment, ...opts });\n\twalk(ast , { enter, leave });\n\treturn ast;\n};\n\nexport { b, p, parse, parseExpressionAt, print, x };\n","import { Node } from 'acorn';\nimport * as code_red from 'code-red';\n\nexport const parse = (source: string): Node => code_red.parse(source, {\n\tsourceType: 'module',\n\tecmaVersion: 11,\n\tlocations: true\n});\n\nexport const parse_expression_at = (source: string, index: number): Node => code_red.parseExpressionAt(source, index, {\n\tecmaVersion: 11,\n\tlocations: true\n});","export const whitespace = /[ \\t\\r\\n]/;\n\nexport const dimensions = /^(?:offset|client)(?:Width|Height)$/;\n","import { parse_expression_at } from '../acorn';\nimport { Parser } from '../index';\nimport { Identifier, Node, SimpleLiteral } from 'estree';\nimport { whitespace } from '../../utils/patterns';\n\nconst literals = new Map([['true', true], ['false', false], ['null', null]]);\n\nexport default function read_expression(parser: Parser): Node {\n\tconst start = parser.index;\n\n\tconst name = parser.read_until(/\\s*}/);\n\tif (name && /^[a-z]+$/.test(name)) {\n\t\tconst end = start + name.length;\n\n\t\tif (literals.has(name)) {\n\t\t\treturn {\n\t\t\t\ttype: 'Literal',\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tvalue: literals.get(name),\n\t\t\t\traw: name,\n\t\t\t} as SimpleLiteral;\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'Identifier',\n\t\t\tstart,\n\t\t\tend: start + name.length,\n\t\t\tname,\n\t\t} as Identifier;\n\t}\n\n\tparser.index = start;\n\n\ttry {\n\t\tconst node = parse_expression_at(parser.template, parser.index);\n\n\t\tlet num_parens = 0;\n\n\t\tfor (let i = parser.index; i < node.start; i += 1) {\n\t\t\tif (parser.template[i] === '(') num_parens += 1;\n\t\t}\n\n\t\tlet index = node.end;\n\t\twhile (num_parens > 0) {\n\t\t\tconst char = parser.template[index];\n\n\t\t\tif (char === ')') {\n\t\t\t\tnum_parens -= 1;\n\t\t\t} else if (!whitespace.test(char)) {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: 'unexpected-token',\n\t\t\t\t\tmessage: 'Expected )'\n\t\t\t\t}, index);\n\t\t\t}\n\n\t\t\tindex += 1;\n\t\t}\n\n\t\tparser.index = index;\n\n\t\treturn node as Node;\n\t} catch (err) {\n\t\tparser.acorn_error(err);\n\t}\n}\n","import * as acorn from '../acorn';\nimport { Parser } from '../index';\nimport { Script } from '../../interfaces';\nimport { Node, Program } from 'estree';\n\nconst script_closing_tag = '</script>';\n\nfunction get_context(parser: Parser, attributes: any[], start: number): string {\n\tconst context = attributes.find(attribute => attribute.name === 'context');\n\tif (!context) return 'default';\n\n\tif (context.value.length !== 1 || context.value[0].type !== 'Text') {\n\t\tparser.error({\n\t\t\tcode: 'invalid-script',\n\t\t\tmessage: `context attribute must be static`\n\t\t}, start);\n\t}\n\n\tconst value = context.value[0].data;\n\n\tif (value !== 'module') {\n\t\tparser.error({\n\t\t\tcode: `invalid-script`,\n\t\t\tmessage: `If the context attribute is supplied, its value must be \"module\"`\n\t\t}, context.start);\n\t}\n\n\treturn value;\n}\n\nexport default function read_script(parser: Parser, start: number, attributes: Node[]): Script {\n\tconst script_start = parser.index;\n\tconst script_end = parser.template.indexOf(script_closing_tag, script_start);\n\n\tif (script_end === -1) parser.error({\n\t\tcode: `unclosed-script`,\n\t\tmessage: `<script> must have a closing tag`\n\t});\n\n\tconst source = ' '.repeat(script_start) + parser.template.slice(script_start, script_end);\n\tparser.index = script_end + script_closing_tag.length;\n\n\tlet ast: Program;\n\n\ttry {\n\t\tast = acorn.parse(source) as any as Program;\n\t} catch (err) {\n\t\tparser.acorn_error(err);\n\t}\n\n\t// TODO is this necessary?\n\t(ast as any).start = script_start;\n\n\treturn {\n\t\ttype: 'Script',\n\t\tstart,\n\t\tend: parser.index,\n\t\tcontext: get_context(parser, attributes, start),\n\t\tcontent: ast,\n\t};\n}\n","import parse from 'css-tree/lib/parser/index.js';\nimport { walk } from 'estree-walker';\nimport { Parser } from '../index';\nimport { Node } from 'estree';\nimport { Style } from '../../interfaces';\n\nexport default function read_style(parser: Parser, start: number, attributes: Node[]): Style {\n\tconst content_start = parser.index;\n\tconst styles = parser.read_until(/<\\/style>/);\n\tconst content_end = parser.index;\n\n\tlet ast;\n\n\ttry {\n\t\tast = parse(styles, {\n\t\t\tpositions: true,\n\t\t\toffset: content_start,\n\t\t});\n\t} catch (err) {\n\t\tif (err.name === 'CssSyntaxError') {\n\t\t\tparser.error({\n\t\t\t\tcode: `css-syntax-error`,\n\t\t\t\tmessage: err.message\n\t\t\t}, err.offset);\n\t\t} else {\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tast = JSON.parse(JSON.stringify(ast));\n\n\t// tidy up AST\n\twalk(ast, {\n\t\tenter: (node: any) => { // `any` because this isn't an ESTree node\n\t\t\t// replace `ref:a` nodes\n\t\t\tif (node.type === 'Selector') {\n\t\t\t\tfor (let i = 0; i < node.children.length; i += 1) {\n\t\t\t\t\tconst a = node.children[i];\n\t\t\t\t\tconst b = node.children[i + 1];\n\n\t\t\t\t\tif (is_ref_selector(a, b)) {\n\t\t\t\t\t\tparser.error({\n\t\t\t\t\t\t\tcode: `invalid-ref-selector`,\n\t\t\t\t\t\t\tmessage: 'ref selectors are no longer supported'\n\t\t\t\t\t\t}, a.loc.start.offset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === 'Declaration' && node.value.type === 'Value' && node.value.children.length === 0) {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-declaration`,\n\t\t\t\t\tmessage: `Declaration cannot be empty`\n\t\t\t\t}, node.start);\n\t\t\t}\n\n\t\t\tif (node.loc) {\n\t\t\t\tnode.start = node.loc.start.offset;\n\t\t\t\tnode.end = node.loc.end.offset;\n\t\t\t\tdelete node.loc;\n\t\t\t}\n\t\t}\n\t});\n\n\tparser.eat('</style>', true);\n\tconst end = parser.index;\n\n\treturn {\n\t\ttype: 'Style',\n\t\tstart,\n\t\tend,\n\t\tattributes,\n\t\tchildren: ast.children,\n\t\tcontent: {\n\t\t\tstart: content_start,\n\t\t\tend: content_end,\n\t\t\tstyles\n\t\t}\n\t};\n}\n\nfunction is_ref_selector(a: any, b: any) { // TODO add CSS node types\n\tif (!b) return false;\n\n\treturn (\n\t\ta.type === 'TypeSelector' &&\n\t\ta.name === 'ref' &&\n\t\tb.type === 'PseudoClassSelector'\n\t);\n}","// https://dev.w3.org/html5/html-author/charref\nexport default {\n\tCounterClockwiseContourIntegral: 8755,\n\tClockwiseContourIntegral: 8754,\n\tDoubleLongLeftRightArrow: 10234,\n\tDiacriticalDoubleAcute: 733,\n\tNotSquareSupersetEqual: 8931,\n\tCloseCurlyDoubleQuote: 8221,\n\tDoubleContourIntegral: 8751,\n\tFilledVerySmallSquare: 9642,\n\tNegativeVeryThinSpace: 8203,\n\tNotPrecedesSlantEqual: 8928,\n\tNotRightTriangleEqual: 8941,\n\tNotSucceedsSlantEqual: 8929,\n\tCapitalDifferentialD: 8517,\n\tDoubleLeftRightArrow: 8660,\n\tDoubleLongRightArrow: 10233,\n\tEmptyVerySmallSquare: 9643,\n\tNestedGreaterGreater: 8811,\n\tNotDoubleVerticalBar: 8742,\n\tNotLeftTriangleEqual: 8940,\n\tNotSquareSubsetEqual: 8930,\n\tOpenCurlyDoubleQuote: 8220,\n\tReverseUpEquilibrium: 10607,\n\tDoubleLongLeftArrow: 10232,\n\tDownLeftRightVector: 10576,\n\tLeftArrowRightArrow: 8646,\n\tNegativeMediumSpace: 8203,\n\tRightArrowLeftArrow: 8644,\n\tSquareSupersetEqual: 8850,\n\tleftrightsquigarrow: 8621,\n\tDownRightTeeVector: 10591,\n\tDownRightVectorBar: 10583,\n\tLongLeftRightArrow: 10231,\n\tLongleftrightarrow: 10234,\n\tNegativeThickSpace: 8203,\n\tPrecedesSlantEqual: 8828,\n\tReverseEquilibrium: 8651,\n\tRightDoubleBracket: 10215,\n\tRightDownTeeVector: 10589,\n\tRightDownVectorBar: 10581,\n\tRightTriangleEqual: 8885,\n\tSquareIntersection: 8851,\n\tSucceedsSlantEqual: 8829,\n\tblacktriangleright: 9656,\n\tlongleftrightarrow: 10231,\n\tDoubleUpDownArrow: 8661,\n\tDoubleVerticalBar: 8741,\n\tDownLeftTeeVector: 10590,\n\tDownLeftVectorBar: 10582,\n\tFilledSmallSquare: 9724,\n\tGreaterSlantEqual: 10878,\n\tLeftDoubleBracket: 10214,\n\tLeftDownTeeVector: 10593,\n\tLeftDownVectorBar: 10585,\n\tLeftTriangleEqual: 8884,\n\tNegativeThinSpace: 8203,\n\tNotReverseElement: 8716,\n\tNotTildeFullEqual: 8775,\n\tRightAngleBracket: 10217,\n\tRightUpDownVector: 10575,\n\tSquareSubsetEqual: 8849,\n\tVerticalSeparator: 10072,\n\tblacktriangledown: 9662,\n\tblacktriangleleft: 9666,\n\tleftrightharpoons: 8651,\n\trightleftharpoons: 8652,\n\ttwoheadrightarrow: 8608,\n\tDiacriticalAcute: 180,\n\tDiacriticalGrave: 96,\n\tDiacriticalTilde: 732,\n\tDoubleRightArrow: 8658,\n\tDownArrowUpArrow: 8693,\n\tEmptySmallSquare: 9723,\n\tGreaterEqualLess: 8923,\n\tGreaterFullEqual: 8807,\n\tLeftAngleBracket: 10216,\n\tLeftUpDownVector: 10577,\n\tLessEqualGreater: 8922,\n\tNonBreakingSpace: 160,\n\tNotRightTriangle: 8939,\n\tNotSupersetEqual: 8841,\n\tRightTriangleBar: 10704,\n\tRightUpTeeVector: 10588,\n\tRightUpVectorBar: 10580,\n\tUnderParenthesis: 9181,\n\tUpArrowDownArrow: 8645,\n\tcirclearrowright: 8635,\n\tdownharpoonright: 8642,\n\tntrianglerighteq: 8941,\n\trightharpoondown: 8641,\n\trightrightarrows: 8649,\n\ttwoheadleftarrow: 8606,\n\tvartriangleright: 8883,\n\tCloseCurlyQuote: 8217,\n\tContourIntegral: 8750,\n\tDoubleDownArrow: 8659,\n\tDoubleLeftArrow: 8656,\n\tDownRightVector: 8641,\n\tLeftRightVector: 10574,\n\tLeftTriangleBar: 10703,\n\tLeftUpTeeVector: 10592,\n\tLeftUpVectorBar: 10584,\n\tLowerRightArrow: 8600,\n\tNotGreaterEqual: 8817,\n\tNotGreaterTilde: 8821,\n\tNotLeftTriangle: 8938,\n\tOverParenthesis: 9180,\n\tRightDownVector: 8642,\n\tShortRightArrow: 8594,\n\tUpperRightArrow: 8599,\n\tbigtriangledown: 9661,\n\tcirclearrowleft: 8634,\n\tcurvearrowright: 8631,\n\tdownharpoonleft: 8643,\n\tleftharpoondown: 8637,\n\tleftrightarrows: 8646,\n\tnLeftrightarrow: 8654,\n\tnleftrightarrow: 8622,\n\tntrianglelefteq: 8940,\n\trightleftarrows: 8644,\n\trightsquigarrow: 8605,\n\trightthreetimes: 8908,\n\tstraightepsilon: 1013,\n\ttrianglerighteq: 8885,\n\tvartriangleleft: 8882,\n\tDiacriticalDot: 729,\n\tDoubleRightTee: 8872,\n\tDownLeftVector: 8637,\n\tGreaterGreater: 10914,\n\tHorizontalLine: 9472,\n\tInvisibleComma: 8291,\n\tInvisibleTimes: 8290,\n\tLeftDownVector: 8643,\n\tLeftRightArrow: 8596,\n\tLeftrightarrow: 8660,\n\tLessSlantEqual: 10877,\n\tLongRightArrow: 10230,\n\tLongrightarrow: 10233,\n\tLowerLeftArrow: 8601,\n\tNestedLessLess: 8810,\n\tNotGreaterLess: 8825,\n\tNotLessGreater: 8824,\n\tNotSubsetEqual: 8840,\n\tNotVerticalBar: 8740,\n\tOpenCurlyQuote: 8216,\n\tReverseElement: 8715,\n\tRightTeeVector: 10587,\n\tRightVectorBar: 10579,\n\tShortDownArrow: 8595,\n\tShortLeftArrow: 8592,\n\tSquareSuperset: 8848,\n\tTildeFullEqual: 8773,\n\tUpperLeftArrow: 8598,\n\tZeroWidthSpace: 8203,\n\tcurvearrowleft: 8630,\n\tdoublebarwedge: 8966,\n\tdowndownarrows: 8650,\n\thookrightarrow: 8618,\n\tleftleftarrows: 8647,\n\tleftrightarrow: 8596,\n\tleftthreetimes: 8907,\n\tlongrightarrow: 10230,\n\tlooparrowright: 8620,\n\tnshortparallel: 8742,\n\tntriangleright: 8939,\n\trightarrowtail: 8611,\n\trightharpoonup: 8640,\n\ttrianglelefteq: 8884,\n\tupharpoonright: 8638,\n\tApplyFunction: 8289,\n\tDifferentialD: 8518,\n\tDoubleLeftTee: 10980,\n\tDoubleUpArrow: 8657,\n\tLeftTeeVector: 10586,\n\tLeftVectorBar: 10578,\n\tLessFullEqual: 8806,\n\tLongLeftArrow: 10229,\n\tLongleftarrow: 10232,\n\tNotTildeEqual: 8772,\n\tNotTildeTilde: 8777,\n\tPoincareplane: 8460,\n\tPrecedesEqual: 10927,\n\tPrecedesTilde: 8830,\n\tRightArrowBar: 8677,\n\tRightTeeArrow: 8614,\n\tRightTriangle: 8883,\n\tRightUpVector: 8638,\n\tSucceedsEqual: 10928,\n\tSucceedsTilde: 8831,\n\tSupersetEqual: 8839,\n\tUpEquilibrium: 10606,\n\tVerticalTilde: 8768,\n\tVeryThinSpace: 8202,\n\tbigtriangleup: 9651,\n\tblacktriangle: 9652,\n\tdivideontimes: 8903,\n\tfallingdotseq: 8786,\n\thookleftarrow: 8617,\n\tleftarrowtail: 8610,\n\tleftharpoonup: 8636,\n\tlongleftarrow: 10229,\n\tlooparrowleft: 8619,\n\tmeasuredangle: 8737,\n\tntriangleleft: 8938,\n\tshortparallel: 8741,\n\tsmallsetminus: 8726,\n\ttriangleright: 9657,\n\tupharpoonleft: 8639,\n\tDownArrowBar: 10515,\n\tDownTeeArrow: 8615,\n\tExponentialE: 8519,\n\tGreaterEqual: 8805,\n\tGreaterTilde: 8819,\n\tHilbertSpace: 8459,\n\tHumpDownHump: 8782,\n\tIntersection: 8898,\n\tLeftArrowBar: 8676,\n\tLeftTeeArrow: 8612,\n\tLeftTriangle: 8882,\n\tLeftUpVector: 8639,\n\tNotCongruent: 8802,\n\tNotLessEqual: 8816,\n\tNotLessTilde: 8820,\n\tProportional: 8733,\n\tRightCeiling: 8969,\n\tRoundImplies: 10608,\n\tShortUpArrow: 8593,\n\tSquareSubset: 8847,\n\tUnderBracket: 9141,\n\tVerticalLine: 124,\n\tblacklozenge: 10731,\n\texponentiale: 8519,\n\trisingdotseq: 8787,\n\ttriangledown: 9663,\n\ttriangleleft: 9667,\n\tCircleMinus: 8854,\n\tCircleTimes: 8855,\n\tEquilibrium: 8652,\n\tGreaterLess: 8823,\n\tLeftCeiling: 8968,\n\tLessGreater: 8822,\n\tMediumSpace: 8287,\n\tNotPrecedes: 8832,\n\tNotSucceeds: 8833,\n\tOverBracket: 9140,\n\tRightVector: 8640,\n\tRrightarrow: 8667,\n\tRuleDelayed: 10740,\n\tSmallCircle: 8728,\n\tSquareUnion: 8852,\n\tSubsetEqual: 8838,\n\tUpDownArrow: 8597,\n\tUpdownarrow: 8661,\n\tVerticalBar: 8739,\n\tbackepsilon: 1014,\n\tblacksquare: 9642,\n\tcircledcirc: 8858,\n\tcircleddash: 8861,\n\tcurlyeqprec: 8926,\n\tcurlyeqsucc: 8927,\n\tdiamondsuit: 9830,\n\teqslantless: 10901,\n\texpectation: 8496,\n\tnRightarrow: 8655,\n\tnrightarrow: 8603,\n\tpreccurlyeq: 8828,\n\tprecnapprox: 10937,\n\tquaternions: 8461,\n\tstraightphi: 981,\n\tsucccurlyeq: 8829,\n\tsuccnapprox: 10938,\n\tthickapprox: 8776,\n\tupdownarrow: 8597,\n\tBernoullis: 8492,\n\tCirclePlus: 8853,\n\tEqualTilde: 8770,\n\tFouriertrf: 8497,\n\tImaginaryI: 8520,\n\tLaplacetrf: 8466,\n\tLeftVector: 8636,\n\tLleftarrow: 8666,\n\tNotElement: 8713,\n\tNotGreater: 8815,\n\tProportion: 8759,\n\tRightArrow: 8594,\n\tRightFloor: 8971,\n\tRightarrow: 8658,\n\tTildeEqual: 8771,\n\tTildeTilde: 8776,\n\tUnderBrace: 9183,\n\tUpArrowBar: 10514,\n\tUpTeeArrow: 8613,\n\tcircledast: 8859,\n\tcomplement: 8705,\n\tcurlywedge: 8911,\n\teqslantgtr: 10902,\n\tgtreqqless: 10892,\n\tlessapprox: 10885,\n\tlesseqqgtr: 10891,\n\tlmoustache: 9136,\n\tlongmapsto: 10236,\n\tmapstodown: 8615,\n\tmapstoleft: 8612,\n\tnLeftarrow: 8653,\n\tnleftarrow: 8602,\n\tprecapprox: 10935,\n\trightarrow: 8594,\n\trmoustache: 9137,\n\tsqsubseteq: 8849,\n\tsqsupseteq: 8850,\n\tsubsetneqq: 10955,\n\tsuccapprox: 10936,\n\tsupsetneqq: 10956,\n\tupuparrows: 8648,\n\tvarepsilon: 949,\n\tvarnothing: 8709,\n\tBackslash: 8726,\n\tCenterDot: 183,\n\tCircleDot: 8857,\n\tCongruent: 8801,\n\tCoproduct: 8720,\n\tDoubleDot: 168,\n\tDownArrow: 8595,\n\tDownBreve: 785,\n\tDownarrow: 8659,\n\tHumpEqual: 8783,\n\tLeftArrow: 8592,\n\tLeftFloor: 8970,\n\tLeftarrow: 8656,\n\tLessTilde: 8818,\n\tMellintrf: 8499,\n\tMinusPlus: 8723,\n\tNotCupCap: 8813,\n\tNotExists: 8708,\n\tOverBrace: 9182,\n\tPlusMinus: 177,\n\tTherefore: 8756,\n\tThinSpace: 8201,\n\tTripleDot: 8411,\n\tUnionPlus: 8846,\n\tbackprime: 8245,\n\tbacksimeq: 8909,\n\tbigotimes: 10754,\n\tcenterdot: 183,\n\tcheckmark: 10003,\n\tcomplexes: 8450,\n\tdotsquare: 8865,\n\tdownarrow: 8595,\n\tgtrapprox: 10886,\n\tgtreqless: 8923,\n\theartsuit: 9829,\n\tleftarrow: 8592,\n\tlesseqgtr: 8922,\n\tnparallel: 8742,\n\tnshortmid: 8740,\n\tnsubseteq: 8840,\n\tnsupseteq: 8841,\n\tpitchfork: 8916,\n\trationals: 8474,\n\tspadesuit: 9824,\n\tsubseteqq: 10949,\n\tsubsetneq: 8842,\n\tsupseteqq: 10950,\n\tsupsetneq: 8843,\n\ttherefore: 8756,\n\ttriangleq: 8796,\n\tvarpropto: 8733,\n\tDDotrahd: 10513,\n\tDotEqual: 8784,\n\tIntegral: 8747,\n\tLessLess: 10913,\n\tNotEqual: 8800,\n\tNotTilde: 8769,\n\tPartialD: 8706,\n\tPrecedes: 8826,\n\tRightTee: 8866,\n\tSucceeds: 8827,\n\tSuchThat: 8715,\n\tSuperset: 8835,\n\tUarrocir: 10569,\n\tUnderBar: 818,\n\tandslope: 10840,\n\tangmsdaa: 10664,\n\tangmsdab: 10665,\n\tangmsdac: 10666,\n\tangmsdad: 10667,\n\tangmsdae: 10668,\n\tangmsdaf: 10669,\n\tangmsdag: 10670,\n\tangmsdah: 10671,\n\tangrtvbd: 10653,\n\tapproxeq: 8778,\n\tawconint: 8755,\n\tbackcong: 8780,\n\tbarwedge: 8965,\n\tbbrktbrk: 9142,\n\tbigoplus: 10753,\n\tbigsqcup: 10758,\n\tbiguplus: 10756,\n\tbigwedge: 8896,\n\tboxminus: 8863,\n\tboxtimes: 8864,\n\tcapbrcup: 10825,\n\tcircledR: 174,\n\tcircledS: 9416,\n\tcirfnint: 10768,\n\tclubsuit: 9827,\n\tcupbrcap: 10824,\n\tcurlyvee: 8910,\n\tcwconint: 8754,\n\tdoteqdot: 8785,\n\tdotminus: 8760,\n\tdrbkarow: 10512,\n\tdzigrarr: 10239,\n\telinters: 9191,\n\temptyset: 8709,\n\teqvparsl: 10725,\n\tfpartint: 10765,\n\tgeqslant: 10878,\n\tgesdotol: 10884,\n\tgnapprox: 10890,\n\thksearow: 10533,\n\thkswarow: 10534,\n\timagline: 8464,\n\timagpart: 8465,\n\tinfintie: 10717,\n\tintegers: 8484,\n\tintercal: 8890,\n\tintlarhk: 10775,\n\tlaemptyv: 10676,\n\tldrushar: 10571,\n\tleqslant: 10877,\n\tlesdotor: 10883,\n\tllcorner: 8990,\n\tlnapprox: 10889,\n\tlrcorner: 8991,\n\tlurdshar: 10570,\n\tmapstoup: 8613,\n\tmultimap: 8888,\n\tnaturals: 8469,\n\totimesas: 10806,\n\tparallel: 8741,\n\tplusacir: 10787,\n\tpointint: 10773,\n\tprecneqq: 10933,\n\tprecnsim: 8936,\n\tprofalar: 9006,\n\tprofline: 8978,\n\tprofsurf: 8979,\n\traemptyv: 10675,\n\trealpart: 8476,\n\trppolint: 10770,\n\trtriltri: 10702,\n\tscpolint: 10771,\n\tsetminus: 8726,\n\tshortmid: 8739,\n\tsmeparsl: 10724,\n\tsqsubset: 8847,\n\tsqsupset: 8848,\n\tsubseteq: 8838,\n\tsuccneqq: 10934,\n\tsuccnsim: 8937,\n\tsupseteq: 8839,\n\tthetasym: 977,\n\tthicksim: 8764,\n\ttimesbar: 10801,\n\ttriangle: 9653,\n\ttriminus: 10810,\n\ttrpezium: 9186,\n\tulcorner: 8988,\n\turcorner: 8989,\n\tvarkappa: 1008,\n\tvarsigma: 962,\n\tvartheta: 977,\n\tBecause: 8757,\n\tCayleys: 8493,\n\tCconint: 8752,\n\tCedilla: 184,\n\tDiamond: 8900,\n\tDownTee: 8868,\n\tElement: 8712,\n\tEpsilon: 917,\n\tImplies: 8658,\n\tLeftTee: 8867,\n\tNewLine: 10,\n\tNoBreak: 8288,\n\tNotLess: 8814,\n\tOmicron: 927,\n\tOverBar: 175,\n\tProduct: 8719,\n\tUpArrow: 8593,\n\tUparrow: 8657,\n\tUpsilon: 933,\n\talefsym: 8501,\n\tangrtvb: 8894,\n\tangzarr: 9084,\n\tasympeq: 8781,\n\tbacksim: 8765,\n\tbecause: 8757,\n\tbemptyv: 10672,\n\tbetween: 8812,\n\tbigcirc: 9711,\n\tbigodot: 10752,\n\tbigstar: 9733,\n\tboxplus: 8862,\n\tccupssm: 10832,\n\tcemptyv: 10674,\n\tcirscir: 10690,\n\tcoloneq: 8788,\n\tcongdot: 10861,\n\tcudarrl: 10552,\n\tcudarrr: 10549,\n\tcularrp: 10557,\n\tcurarrm: 10556,\n\tdbkarow: 10511,\n\tddagger: 8225,\n\tddotseq: 10871,\n\tdemptyv: 10673,\n\tdiamond: 8900,\n\tdigamma: 989,\n\tdotplus: 8724,\n\tdwangle: 10662,\n\tepsilon: 949,\n\teqcolon: 8789,\n\tequivDD: 10872,\n\tgesdoto: 10882,\n\tgtquest: 10876,\n\tgtrless: 8823,\n\tharrcir: 10568,\n\tintprod: 10812,\n\tisindot: 8949,\n\tlarrbfs: 10527,\n\tlarrsim: 10611,\n\tlbrksld: 10639,\n\tlbrkslu: 10637,\n\tldrdhar: 10599,\n\tlesdoto: 10881,\n\tlessdot: 8918,\n\tlessgtr: 8822,\n\tlesssim: 8818,\n\tlotimes: 10804,\n\tlozenge: 9674,\n\tltquest: 10875,\n\tluruhar: 10598,\n\tmaltese: 10016,\n\tminusdu: 10794,\n\tnapprox: 8777,\n\tnatural: 9838,\n\tnearrow: 8599,\n\tnexists: 8708,\n\tnotinva: 8713,\n\tnotinvb: 8951,\n\tnotinvc: 8950,\n\tnotniva: 8716,\n\tnotnivb: 8958,\n\tnotnivc: 8957,\n\tnpolint: 10772,\n\tnsqsube: 8930,\n\tnsqsupe: 8931,\n\tnvinfin: 10718,\n\tnwarrow: 8598,\n\tolcross: 10683,\n\tomicron: 959,\n\torderof: 8500,\n\torslope: 10839,\n\tpertenk: 8241,\n\tplanckh: 8462,\n\tpluscir: 10786,\n\tplussim: 10790,\n\tplustwo: 10791,\n\tprecsim: 8830,\n\tquatint: 10774,\n\tquesteq: 8799,\n\trarrbfs: 10528,\n\trarrsim: 10612,\n\trbrksld: 10638,\n\trbrkslu: 10640,\n\trdldhar: 10601,\n\trealine: 8475,\n\trotimes: 10805,\n\truluhar: 10600,\n\tsearrow: 8600,\n\tsimplus: 10788,\n\tsimrarr: 10610,\n\tsubedot: 10947,\n\tsubmult: 10945,\n\tsubplus: 10943,\n\tsubrarr: 10617,\n\tsuccsim: 8831,\n\tsupdsub: 10968,\n\tsupedot: 10948,\n\tsuphsub: 10967,\n\tsuplarr: 10619,\n\tsupmult: 10946,\n\tsupplus: 10944,\n\tswarrow: 8601,\n\ttopfork: 10970,\n\ttriplus: 10809,\n\ttritime: 10811,\n\tuparrow: 8593,\n\tupsilon: 965,\n\tuwangle: 10663,\n\tvzigzag: 10650,\n\tzigrarr: 8669,\n\tAacute: 193,\n\tAbreve: 258,\n\tAgrave: 192,\n\tAssign: 8788,\n\tAtilde: 195,\n\tBarwed: 8966,\n\tBumpeq: 8782,\n\tCacute: 262,\n\tCcaron: 268,\n\tCcedil: 199,\n\tColone: 10868,\n\tConint: 8751,\n\tCupCap: 8781,\n\tDagger: 8225,\n\tDcaron: 270,\n\tDotDot: 8412,\n\tDstrok: 272,\n\tEacute: 201,\n\tEcaron: 282,\n\tEgrave: 200,\n\tExists: 8707,\n\tForAll: 8704,\n\tGammad: 988,\n\tGbreve: 286,\n\tGcedil: 290,\n\tHARDcy: 1066,\n\tHstrok: 294,\n\tIacute: 205,\n\tIgrave: 204,\n\tItilde: 296,\n\tJsercy: 1032,\n\tKcedil: 310,\n\tLacute: 313,\n\tLambda: 923,\n\tLcaron: 317,\n\tLcedil: 315,\n\tLmidot: 319,\n\tLstrok: 321,\n\tNacute: 323,\n\tNcaron: 327,\n\tNcedil: 325,\n\tNtilde: 209,\n\tOacute: 211,\n\tOdblac: 336,\n\tOgrave: 210,\n\tOslash: 216,\n\tOtilde: 213,\n\tOtimes: 10807,\n\tRacute: 340,\n\tRarrtl: 10518,\n\tRcaron: 344,\n\tRcedil: 342,\n\tSHCHcy: 1065,\n\tSOFTcy: 1068,\n\tSacute: 346,\n\tScaron: 352,\n\tScedil: 350,\n\tSquare: 9633,\n\tSubset: 8912,\n\tSupset: 8913,\n\tTcaron: 356,\n\tTcedil: 354,\n\tTstrok: 358,\n\tUacute: 218,\n\tUbreve: 364,\n\tUdblac: 368,\n\tUgrave: 217,\n\tUtilde: 360,\n\tVdashl: 10982,\n\tVerbar: 8214,\n\tVvdash: 8874,\n\tYacute: 221,\n\tZacute: 377,\n\tZcaron: 381,\n\taacute: 225,\n\tabreve: 259,\n\tagrave: 224,\n\tandand: 10837,\n\tangmsd: 8737,\n\tangsph: 8738,\n\tapacir: 10863,\n\tapprox: 8776,\n\tatilde: 227,\n\tbarvee: 8893,\n\tbarwed: 8965,\n\tbecaus: 8757,\n\tbernou: 8492,\n\tbigcap: 8898,\n\tbigcup: 8899,\n\tbigvee: 8897,\n\tbkarow: 10509,\n\tbottom: 8869,\n\tbowtie: 8904,\n\tboxbox: 10697,\n\tbprime: 8245,\n\tbrvbar: 166,\n\tbullet: 8226,\n\tbumpeq: 8783,\n\tcacute: 263,\n\tcapand: 10820,\n\tcapcap: 10827,\n\tcapcup: 10823,\n\tcapdot: 10816,\n\tccaron: 269,\n\tccedil: 231,\n\tcirceq: 8791,\n\tcirmid: 10991,\n\tcolone: 8788,\n\tcommat: 64,\n\tcompfn: 8728,\n\tconint: 8750,\n\tcoprod: 8720,\n\tcopysr: 8471,\n\tcularr: 8630,\n\tcupcap: 10822,\n\tcupcup: 10826,\n\tcupdot: 8845,\n\tcurarr: 8631,\n\tcurren: 164,\n\tcylcty: 9005,\n\tdagger: 8224,\n\tdaleth: 8504,\n\tdcaron: 271,\n\tdfisht: 10623,\n\tdivide: 247,\n\tdivonx: 8903,\n\tdlcorn: 8990,\n\tdlcrop: 8973,\n\tdollar: 36,\n\tdrcorn: 8991,\n\tdrcrop: 8972,\n\tdstrok: 273,\n\teacute: 233,\n\teaster: 10862,\n\tecaron: 283,\n\tecolon: 8789,\n\tegrave: 232,\n\tegsdot: 10904,\n\telsdot: 10903,\n\temptyv: 8709,\n\temsp13: 8196,\n\temsp14: 8197,\n\teparsl: 10723,\n\teqcirc: 8790,\n\tequals: 61,\n\tequest: 8799,\n\tfemale: 9792,\n\tffilig: 64259,\n\tffllig: 64260,\n\tforall: 8704,\n\tfrac12: 189,\n\tfrac13: 8531,\n\tfrac14: 188,\n\tfrac15: 8533,\n\tfrac16: 8537,\n\tfrac18: 8539,\n\tfrac23: 8532,\n\tfrac25: 8534,\n\tfrac34: 190,\n\tfrac35: 8535,\n\tfrac38: 8540,\n\tfrac45: 8536,\n\tfrac56: 8538,\n\tfrac58: 8541,\n\tfrac78: 8542,\n\tgacute: 501,\n\tgammad: 989,\n\tgbreve: 287,\n\tgesdot: 10880,\n\tgesles: 10900,\n\tgtlPar: 10645,\n\tgtrarr: 10616,\n\tgtrdot: 8919,\n\tgtrsim: 8819,\n\thairsp: 8202,\n\thamilt: 8459,\n\thardcy: 1098,\n\thearts: 9829,\n\thellip: 8230,\n\thercon: 8889,\n\thomtht: 8763,\n\thorbar: 8213,\n\thslash: 8463,\n\thstrok: 295,\n\thybull: 8259,\n\thyphen: 8208,\n\tiacute: 237,\n\tigrave: 236,\n\tiiiint: 10764,\n\tiinfin: 10716,\n\tincare: 8453,\n\tinodot: 305,\n\tintcal: 8890,\n\tiquest: 191,\n\tisinsv: 8947,\n\titilde: 297,\n\tjsercy: 1112,\n\tkappav: 1008,\n\tkcedil: 311,\n\tkgreen: 312,\n\tlAtail: 10523,\n\tlacute: 314,\n\tlagran: 8466,\n\tlambda: 955,\n\tlangle: 10216,\n\tlarrfs: 10525,\n\tlarrhk: 8617,\n\tlarrlp: 8619,\n\tlarrpl: 10553,\n\tlarrtl: 8610,\n\tlatail: 10521,\n\tlbrace: 123,\n\tlbrack: 91,\n\tlcaron: 318,\n\tlcedil: 316,\n\tldquor: 8222,\n\tlesdot: 10879,\n\tlesges: 10899,\n\tlfisht: 10620,\n\tlfloor: 8970,\n\tlharul: 10602,\n\tllhard: 10603,\n\tlmidot: 320,\n\tlmoust: 9136,\n\tloplus: 10797,\n\tlowast: 8727,\n\tlowbar: 95,\n\tlparlt: 10643,\n\tlrhard: 10605,\n\tlsaquo: 8249,\n\tlsquor: 8218,\n\tlstrok: 322,\n\tlthree: 8907,\n\tltimes: 8905,\n\tltlarr: 10614,\n\tltrPar: 10646,\n\tmapsto: 8614,\n\tmarker: 9646,\n\tmcomma: 10793,\n\tmidast: 42,\n\tmidcir: 10992,\n\tmiddot: 183,\n\tminusb: 8863,\n\tminusd: 8760,\n\tmnplus: 8723,\n\tmodels: 8871,\n\tmstpos: 8766,\n\tnVDash: 8879,\n\tnVdash: 8878,\n\tnacute: 324,\n\tncaron: 328,\n\tncedil: 326,\n\tnearhk: 10532,\n\tnequiv: 8802,\n\tnesear: 10536,\n\tnexist: 8708,\n\tnltrie: 8940,\n\tnprcue: 8928,\n\tnrtrie: 8941,\n\tnsccue: 8929,\n\tnsimeq: 8772,\n\tntilde: 241,\n\tnumero: 8470,\n\tnvDash: 8877,\n\tnvHarr: 10500,\n\tnvdash: 8876,\n\tnvlArr: 10498,\n\tnvrArr: 10499,\n\tnwarhk: 10531,\n\tnwnear: 10535,\n\toacute: 243,\n\todblac: 337,\n\todsold: 10684,\n\tograve: 242,\n\tominus: 8854,\n\torigof: 8886,\n\toslash: 248,\n\totilde: 245,\n\totimes: 8855,\n\tparsim: 10995,\n\tpercnt: 37,\n\tperiod: 46,\n\tpermil: 8240,\n\tphmmat: 8499,\n\tplanck: 8463,\n\tplankv: 8463,\n\tplusdo: 8724,\n\tplusdu: 10789,\n\tplusmn: 177,\n\tpreceq: 10927,\n\tprimes: 8473,\n\tprnsim: 8936,\n\tpropto: 8733,\n\tprurel: 8880,\n\tpuncsp: 8200,\n\tqprime: 8279,\n\trAtail: 10524,\n\tracute: 341,\n\trangle: 10217,\n\trarrap: 10613,\n\trarrfs: 10526,\n\trarrhk: 8618,\n\trarrlp: 8620,\n\trarrpl: 10565,\n\trarrtl: 8611,\n\tratail: 10522,\n\trbrace: 125,\n\trbrack: 93,\n\trcaron: 345,\n\trcedil: 343,\n\trdquor: 8221,\n\trfisht: 10621,\n\trfloor: 8971,\n\trharul: 10604,\n\trmoust: 9137,\n\troplus: 10798,\n\trpargt: 10644,\n\trsaquo: 8250,\n\trsquor: 8217,\n\trthree: 8908,\n\trtimes: 8906,\n\tsacute: 347,\n\tscaron: 353,\n\tscedil: 351,\n\tscnsim: 8937,\n\tsearhk: 10533,\n\tseswar: 10537,\n\tsfrown: 8994,\n\tshchcy: 1097,\n\tsigmaf: 962,\n\tsigmav: 962,\n\tsimdot: 10858,\n\tsmashp: 10803,\n\tsoftcy: 1100,\n\tsolbar: 9023,\n\tspades: 9824,\n\tsqsube: 8849,\n\tsqsupe: 8850,\n\tsquare: 9633,\n\tsquarf: 9642,\n\tssetmn: 8726,\n\tssmile: 8995,\n\tsstarf: 8902,\n\tsubdot: 10941,\n\tsubset: 8834,\n\tsubsim: 10951,\n\tsubsub: 10965,\n\tsubsup: 10963,\n\tsucceq: 10928,\n\tsupdot: 10942,\n\tsupset: 8835,\n\tsupsim: 10952,\n\tsupsub: 10964,\n\tsupsup: 10966,\n\tswarhk: 10534,\n\tswnwar: 10538,\n\ttarget: 8982,\n\ttcaron: 357,\n\ttcedil: 355,\n\ttelrec: 8981,\n\tthere4: 8756,\n\tthetav: 977,\n\tthinsp: 8201,\n\tthksim: 8764,\n\ttimesb: 8864,\n\ttimesd: 10800,\n\ttopbot: 9014,\n\ttopcir: 10993,\n\ttprime: 8244,\n\ttridot: 9708,\n\ttstrok: 359,\n\tuacute: 250,\n\tubreve: 365,\n\tudblac: 369,\n\tufisht: 10622,\n\tugrave: 249,\n\tulcorn: 8988,\n\tulcrop: 8975,\n\turcorn: 8989,\n\turcrop: 8974,\n\tutilde: 361,\n\tvangrt: 10652,\n\tvarphi: 966,\n\tvarrho: 1009,\n\tveebar: 8891,\n\tvellip: 8942,\n\tverbar: 124,\n\twedbar: 10847,\n\twedgeq: 8793,\n\tweierp: 8472,\n\twreath: 8768,\n\txoplus: 10753,\n\txotime: 10754,\n\txsqcup: 10758,\n\txuplus: 10756,\n\txwedge: 8896,\n\tyacute: 253,\n\tzacute: 378,\n\tzcaron: 382,\n\tzeetrf: 8488,\n\tAElig: 198,\n\tAcirc: 194,\n\tAlpha: 913,\n\tAmacr: 256,\n\tAogon: 260,\n\tAring: 197,\n\tBreve: 728,\n\tCcirc: 264,\n\tColon: 8759,\n\tCross: 10799,\n\tDashv: 10980,\n\tDelta: 916,\n\tEcirc: 202,\n\tEmacr: 274,\n\tEogon: 280,\n\tEqual: 10869,\n\tGamma: 915,\n\tGcirc: 284,\n\tHacek: 711,\n\tHcirc: 292,\n\tIJlig: 306,\n\tIcirc: 206,\n\tImacr: 298,\n\tIogon: 302,\n\tIukcy: 1030,\n\tJcirc: 308,\n\tJukcy: 1028,\n\tKappa: 922,\n\tOElig: 338,\n\tOcirc: 212,\n\tOmacr: 332,\n\tOmega: 937,\n\tPrime: 8243,\n\tRBarr: 10512,\n\tScirc: 348,\n\tSigma: 931,\n\tTHORN: 222,\n\tTRADE: 8482,\n\tTSHcy: 1035,\n\tTheta: 920,\n\tTilde: 8764,\n\tUbrcy: 1038,\n\tUcirc: 219,\n\tUmacr: 362,\n\tUnion: 8899,\n\tUogon: 370,\n\tUpTee: 8869,\n\tUring: 366,\n\tVDash: 8875,\n\tVdash: 8873,\n\tWcirc: 372,\n\tWedge: 8896,\n\tYcirc: 374,\n\tacirc: 226,\n\tacute: 180,\n\taelig: 230,\n\taleph: 8501,\n\talpha: 945,\n\tamacr: 257,\n\tamalg: 10815,\n\tangle: 8736,\n\tangrt: 8735,\n\tangst: 8491,\n\taogon: 261,\n\taring: 229,\n\tasymp: 8776,\n\tawint: 10769,\n\tbcong: 8780,\n\tbdquo: 8222,\n\tbepsi: 1014,\n\tblank: 9251,\n\tblk12: 9618,\n\tblk14: 9617,\n\tblk34: 9619,\n\tblock: 9608,\n\tboxDL: 9559,\n\tboxDR: 9556,\n\tboxDl: 9558,\n\tboxDr: 9555,\n\tboxHD: 9574,\n\tboxHU: 9577,\n\tboxHd: 9572,\n\tboxHu: 9575,\n\tboxUL: 9565,\n\tboxUR: 9562,\n\tboxUl: 9564,\n\tboxUr: 9561,\n\tboxVH: 9580,\n\tboxVL: 9571,\n\tboxVR: 9568,\n\tboxVh: 9579,\n\tboxVl: 9570,\n\tboxVr: 9567,\n\tboxdL: 9557,\n\tboxdR: 9554,\n\tboxdl: 9488,\n\tboxdr: 9484,\n\tboxhD: 9573,\n\tboxhU: 9576,\n\tboxhd: 9516,\n\tboxhu: 9524,\n\tboxuL: 9563,\n\tboxuR: 9560,\n\tboxul: 9496,\n\tboxur: 9492,\n\tboxvH: 9578,\n\tboxvL: 9569,\n\tboxvR: 9566,\n\tboxvh: 9532,\n\tboxvl: 9508,\n\tboxvr: 9500,\n\tbreve: 728,\n\tbsemi: 8271,\n\tbsime: 8909,\n\tbsolb: 10693,\n\tbumpE: 10926,\n\tbumpe: 8783,\n\tcaret: 8257,\n\tcaron: 711,\n\tccaps: 10829,\n\tccirc: 265,\n\tccups: 10828,\n\tcedil: 184,\n\tcheck: 10003,\n\tclubs: 9827,\n\tcolon: 58,\n\tcomma: 44,\n\tcrarr: 8629,\n\tcross: 10007,\n\tcsube: 10961,\n\tcsupe: 10962,\n\tctdot: 8943,\n\tcuepr: 8926,\n\tcuesc: 8927,\n\tcupor: 10821,\n\tcuvee: 8910,\n\tcuwed: 8911,\n\tcwint: 8753,\n\tdashv: 8867,\n\tdblac: 733,\n\tddarr: 8650,\n\tdelta: 948,\n\tdharl: 8643,\n\tdharr: 8642,\n\tdiams: 9830,\n\tdisin: 8946,\n\tdoteq: 8784,\n\tdtdot: 8945,\n\tdtrif: 9662,\n\tduarr: 8693,\n\tduhar: 10607,\n\teDDot: 10871,\n\tecirc: 234,\n\tefDot: 8786,\n\temacr: 275,\n\tempty: 8709,\n\teogon: 281,\n\teplus: 10865,\n\tepsiv: 949,\n\teqsim: 8770,\n\tequiv: 8801,\n\terDot: 8787,\n\terarr: 10609,\n\tesdot: 8784,\n\texist: 8707,\n\tfflig: 64256,\n\tfilig: 64257,\n\tfllig: 64258,\n\tfltns: 9649,\n\tforkv: 10969,\n\tfrasl: 8260,\n\tfrown: 8994,\n\tgamma: 947,\n\tgcirc: 285,\n\tgescc: 10921,\n\tgimel: 8503,\n\tgneqq: 8809,\n\tgnsim: 8935,\n\tgrave: 96,\n\tgsime: 10894,\n\tgsiml: 10896,\n\tgtcir: 10874,\n\tgtdot: 8919,\n\tharrw: 8621,\n\thcirc: 293,\n\thoarr: 8703,\n\ticirc: 238,\n\tiexcl: 161,\n\tiiint: 8749,\n\tiiota: 8489,\n\tijlig: 307,\n\timacr: 299,\n\timage: 8465,\n\timath: 305,\n\timped: 437,\n\tinfin: 8734,\n\tiogon: 303,\n\tiprod: 10812,\n\tisinE: 8953,\n\tisins: 8948,\n\tisinv: 8712,\n\tiukcy: 1110,\n\tjcirc: 309,\n\tjmath: 567,\n\tjukcy: 1108,\n\tkappa: 954,\n\tlAarr: 8666,\n\tlBarr: 10510,\n\tlangd: 10641,\n\tlaquo: 171,\n\tlarrb: 8676,\n\tlbarr: 10508,\n\tlbbrk: 10098,\n\tlbrke: 10635,\n\tlceil: 8968,\n\tldquo: 8220,\n\tlescc: 10920,\n\tlhard: 8637,\n\tlharu: 8636,\n\tlhblk: 9604,\n\tllarr: 8647,\n\tlltri: 9722,\n\tlneqq: 8808,\n\tlnsim: 8934,\n\tloang: 10220,\n\tloarr: 8701,\n\tlobrk: 10214,\n\tlopar: 10629,\n\tlrarr: 8646,\n\tlrhar: 8651,\n\tlrtri: 8895,\n\tlsime: 10893,\n\tlsimg: 10895,\n\tlsquo: 8216,\n\tltcir: 10873,\n\tltdot: 8918,\n\tltrie: 8884,\n\tltrif: 9666,\n\tmDDot: 8762,\n\tmdash: 8212,\n\tmicro: 181,\n\tminus: 8722,\n\tmumap: 8888,\n\tnabla: 8711,\n\tnapos: 329,\n\tnatur: 9838,\n\tncong: 8775,\n\tndash: 8211,\n\tneArr: 8663,\n\tnearr: 8599,\n\tngsim: 8821,\n\tnhArr: 8654,\n\tnharr: 8622,\n\tnhpar: 10994,\n\tnlArr: 8653,\n\tnlarr: 8602,\n\tnless: 8814,\n\tnlsim: 8820,\n\tnltri: 8938,\n\tnotin: 8713,\n\tnotni: 8716,\n\tnprec: 8832,\n\tnrArr: 8655,\n\tnrarr: 8603,\n\tnrtri: 8939,\n\tnsime: 8772,\n\tnsmid: 8740,\n\tnspar: 8742,\n\tnsube: 8840,\n\tnsucc: 8833,\n\tnsupe: 8841,\n\tnumsp: 8199,\n\tnwArr: 8662,\n\tnwarr: 8598,\n\tocirc: 244,\n\todash: 8861,\n\toelig: 339,\n\tofcir: 10687,\n\tohbar: 10677,\n\tolarr: 8634,\n\tolcir: 10686,\n\toline: 8254,\n\tomacr: 333,\n\tomega: 969,\n\toperp: 10681,\n\toplus: 8853,\n\torarr: 8635,\n\torder: 8500,\n\tovbar: 9021,\n\tparsl: 11005,\n\tphone: 9742,\n\tplusb: 8862,\n\tpluse: 10866,\n\tpound: 163,\n\tprcue: 8828,\n\tprime: 8242,\n\tprnap: 10937,\n\tprsim: 8830,\n\tquest: 63,\n\trAarr: 8667,\n\trBarr: 10511,\n\tradic: 8730,\n\trangd: 10642,\n\trange: 10661,\n\traquo: 187,\n\trarrb: 8677,\n\trarrc: 10547,\n\trarrw: 8605,\n\tratio: 8758,\n\trbarr: 10509,\n\trbbrk: 10099,\n\trbrke: 10636,\n\trceil: 8969,\n\trdquo: 8221,\n\treals: 8477,\n\trhard: 8641,\n\trharu: 8640,\n\trlarr: 8644,\n\trlhar: 8652,\n\trnmid: 10990,\n\troang: 10221,\n\troarr: 8702,\n\trobrk: 10215,\n\tropar: 10630,\n\trrarr: 8649,\n\trsquo: 8217,\n\trtrie: 8885,\n\trtrif: 9656,\n\tsbquo: 8218,\n\tsccue: 8829,\n\tscirc: 349,\n\tscnap: 10938,\n\tscsim: 8831,\n\tsdotb: 8865,\n\tsdote: 10854,\n\tseArr: 8664,\n\tsearr: 8600,\n\tsetmn: 8726,\n\tsharp: 9839,\n\tsigma: 963,\n\tsimeq: 8771,\n\tsimgE: 10912,\n\tsimlE: 10911,\n\tsimne: 8774,\n\tslarr: 8592,\n\tsmile: 8995,\n\tsqcap: 8851,\n\tsqcup: 8852,\n\tsqsub: 8847,\n\tsqsup: 8848,\n\tsrarr: 8594,\n\tstarf: 9733,\n\tstrns: 175,\n\tsubnE: 10955,\n\tsubne: 8842,\n\tsupnE: 10956,\n\tsupne: 8843,\n\tswArr: 8665,\n\tswarr: 8601,\n\tszlig: 223,\n\ttheta: 952,\n\tthkap: 8776,\n\tthorn: 254,\n\ttilde: 732,\n\ttimes: 215,\n\ttrade: 8482,\n\ttrisb: 10701,\n\ttshcy: 1115,\n\ttwixt: 8812,\n\tubrcy: 1118,\n\tucirc: 251,\n\tudarr: 8645,\n\tudhar: 10606,\n\tuharl: 8639,\n\tuharr: 8638,\n\tuhblk: 9600,\n\tultri: 9720,\n\tumacr: 363,\n\tuogon: 371,\n\tuplus: 8846,\n\tupsih: 978,\n\turing: 367,\n\turtri: 9721,\n\tutdot: 8944,\n\tutrif: 9652,\n\tuuarr: 8648,\n\tvBarv: 10985,\n\tvDash: 8872,\n\tvarpi: 982,\n\tvdash: 8866,\n\tveeeq: 8794,\n\tvltri: 8882,\n\tvprop: 8733,\n\tvrtri: 8883,\n\twcirc: 373,\n\twedge: 8743,\n\txcirc: 9711,\n\txdtri: 9661,\n\txhArr: 10234,\n\txharr: 10231,\n\txlArr: 10232,\n\txlarr: 10229,\n\txodot: 10752,\n\txrArr: 10233,\n\txrarr: 10230,\n\txutri: 9651,\n\tycirc: 375,\n\tAopf: 120120,\n\tAscr: 119964,\n\tAuml: 196,\n\tBarv: 10983,\n\tBeta: 914,\n\tBopf: 120121,\n\tBscr: 8492,\n\tCHcy: 1063,\n\tCOPY: 169,\n\tCdot: 266,\n\tCopf: 8450,\n\tCscr: 119966,\n\tDJcy: 1026,\n\tDScy: 1029,\n\tDZcy: 1039,\n\tDarr: 8609,\n\tDopf: 120123,\n\tDscr: 119967,\n\tEdot: 278,\n\tEopf: 120124,\n\tEscr: 8496,\n\tEsim: 10867,\n\tEuml: 203,\n\tFopf: 120125,\n\tFscr: 8497,\n\tGJcy: 1027,\n\tGdot: 288,\n\tGopf: 120126,\n\tGscr: 119970,\n\tHopf: 8461,\n\tHscr: 8459,\n\tIEcy: 1045,\n\tIOcy: 1025,\n\tIdot: 304,\n\tIopf: 120128,\n\tIota: 921,\n\tIscr: 8464,\n\tIuml: 207,\n\tJopf: 120129,\n\tJscr: 119973,\n\tKHcy: 1061,\n\tKJcy: 1036,\n\tKopf: 120130,\n\tKscr: 119974,\n\tLJcy: 1033,\n\tLang: 10218,\n\tLarr: 8606,\n\tLopf: 120131,\n\tLscr: 8466,\n\tMopf: 120132,\n\tMscr: 8499,\n\tNJcy: 1034,\n\tNopf: 8469,\n\tNscr: 119977,\n\tOopf: 120134,\n\tOscr: 119978,\n\tOuml: 214,\n\tPopf: 8473,\n\tPscr: 119979,\n\tQUOT: 34,\n\tQopf: 8474,\n\tQscr: 119980,\n\tRang: 10219,\n\tRarr: 8608,\n\tRopf: 8477,\n\tRscr: 8475,\n\tSHcy: 1064,\n\tSopf: 120138,\n\tSqrt: 8730,\n\tSscr: 119982,\n\tStar: 8902,\n\tTScy: 1062,\n\tTopf: 120139,\n\tTscr: 119983,\n\tUarr: 8607,\n\tUopf: 120140,\n\tUpsi: 978,\n\tUscr: 119984,\n\tUuml: 220,\n\tVbar: 10987,\n\tVert: 8214,\n\tVopf: 120141,\n\tVscr: 119985,\n\tWopf: 120142,\n\tWscr: 119986,\n\tXopf: 120143,\n\tXscr: 119987,\n\tYAcy: 1071,\n\tYIcy: 1031,\n\tYUcy: 1070,\n\tYopf: 120144,\n\tYscr: 119988,\n\tYuml: 376,\n\tZHcy: 1046,\n\tZdot: 379,\n\tZeta: 918,\n\tZopf: 8484,\n\tZscr: 119989,\n\tandd: 10844,\n\tandv: 10842,\n\tange: 10660,\n\taopf: 120146,\n\tapid: 8779,\n\tapos: 39,\n\tascr: 119990,\n\tauml: 228,\n\tbNot: 10989,\n\tbbrk: 9141,\n\tbeta: 946,\n\tbeth: 8502,\n\tbnot: 8976,\n\tbopf: 120147,\n\tboxH: 9552,\n\tboxV: 9553,\n\tboxh: 9472,\n\tboxv: 9474,\n\tbscr: 119991,\n\tbsim: 8765,\n\tbsol: 92,\n\tbull: 8226,\n\tbump: 8782,\n\tcdot: 267,\n\tcent: 162,\n\tchcy: 1095,\n\tcirE: 10691,\n\tcirc: 710,\n\tcire: 8791,\n\tcomp: 8705,\n\tcong: 8773,\n\tcopf: 120148,\n\tcopy: 169,\n\tcscr: 119992,\n\tcsub: 10959,\n\tcsup: 10960,\n\tdArr: 8659,\n\tdHar: 10597,\n\tdarr: 8595,\n\tdash: 8208,\n\tdiam: 8900,\n\tdjcy: 1106,\n\tdopf: 120149,\n\tdscr: 119993,\n\tdscy: 1109,\n\tdsol: 10742,\n\tdtri: 9663,\n\tdzcy: 1119,\n\teDot: 8785,\n\tecir: 8790,\n\tedot: 279,\n\temsp: 8195,\n\tensp: 8194,\n\teopf: 120150,\n\tepar: 8917,\n\tepsi: 1013,\n\tescr: 8495,\n\tesim: 8770,\n\teuml: 235,\n\teuro: 8364,\n\texcl: 33,\n\tflat: 9837,\n\tfnof: 402,\n\tfopf: 120151,\n\tfork: 8916,\n\tfscr: 119995,\n\tgdot: 289,\n\tgeqq: 8807,\n\tgjcy: 1107,\n\tgnap: 10890,\n\tgneq: 10888,\n\tgopf: 120152,\n\tgscr: 8458,\n\tgsim: 8819,\n\tgtcc: 10919,\n\thArr: 8660,\n\thalf: 189,\n\tharr: 8596,\n\thbar: 8463,\n\thopf: 120153,\n\thscr: 119997,\n\tiecy: 1077,\n\timof: 8887,\n\tiocy: 1105,\n\tiopf: 120154,\n\tiota: 953,\n\tiscr: 119998,\n\tisin: 8712,\n\tiuml: 239,\n\tjopf: 120155,\n\tjscr: 119999,\n\tkhcy: 1093,\n\tkjcy: 1116,\n\tkopf: 120156,\n\tkscr: 120000,\n\tlArr: 8656,\n\tlHar: 10594,\n\tlang: 10216,\n\tlarr: 8592,\n\tlate: 10925,\n\tlcub: 123,\n\tldca: 10550,\n\tldsh: 8626,\n\tleqq: 8806,\n\tljcy: 1113,\n\tlnap: 10889,\n\tlneq: 10887,\n\tlopf: 120157,\n\tlozf: 10731,\n\tlpar: 40,\n\tlscr: 120001,\n\tlsim: 8818,\n\tlsqb: 91,\n\tltcc: 10918,\n\tltri: 9667,\n\tmacr: 175,\n\tmale: 9794,\n\tmalt: 10016,\n\tmlcp: 10971,\n\tmldr: 8230,\n\tmopf: 120158,\n\tmscr: 120002,\n\tnbsp: 160,\n\tncap: 10819,\n\tncup: 10818,\n\tngeq: 8817,\n\tngtr: 8815,\n\tnisd: 8954,\n\tnjcy: 1114,\n\tnldr: 8229,\n\tnleq: 8816,\n\tnmid: 8740,\n\tnopf: 120159,\n\tnpar: 8742,\n\tnscr: 120003,\n\tnsim: 8769,\n\tnsub: 8836,\n\tnsup: 8837,\n\tntgl: 8825,\n\tntlg: 8824,\n\toast: 8859,\n\tocir: 8858,\n\todiv: 10808,\n\todot: 8857,\n\togon: 731,\n\toint: 8750,\n\tomid: 10678,\n\toopf: 120160,\n\topar: 10679,\n\tordf: 170,\n\tordm: 186,\n\toror: 10838,\n\toscr: 8500,\n\tosol: 8856,\n\touml: 246,\n\tpara: 182,\n\tpart: 8706,\n\tperp: 8869,\n\tphiv: 966,\n\tplus: 43,\n\tpopf: 120161,\n\tprap: 10935,\n\tprec: 8826,\n\tprnE: 10933,\n\tprod: 8719,\n\tprop: 8733,\n\tpscr: 120005,\n\tqint: 10764,\n\tqopf: 120162,\n\tqscr: 120006,\n\tquot: 34,\n\trArr: 8658,\n\trHar: 10596,\n\trace: 10714,\n\trang: 10217,\n\trarr: 8594,\n\trcub: 125,\n\trdca: 10551,\n\trdsh: 8627,\n\treal: 8476,\n\trect: 9645,\n\trhov: 1009,\n\tring: 730,\n\tropf: 120163,\n\trpar: 41,\n\trscr: 120007,\n\trsqb: 93,\n\trtri: 9657,\n\tscap: 10936,\n\tscnE: 10934,\n\tsdot: 8901,\n\tsect: 167,\n\tsemi: 59,\n\tsext: 10038,\n\tshcy: 1096,\n\tsime: 8771,\n\tsimg: 10910,\n\tsiml: 10909,\n\tsmid: 8739,\n\tsmte: 10924,\n\tsolb: 10692,\n\tsopf: 120164,\n\tspar: 8741,\n\tsquf: 9642,\n\tsscr: 120008,\n\tstar: 9734,\n\tsubE: 10949,\n\tsube: 8838,\n\tsucc: 8827,\n\tsung: 9834,\n\tsup1: 185,\n\tsup2: 178,\n\tsup3: 179,\n\tsupE: 10950,\n\tsupe: 8839,\n\ttbrk: 9140,\n\ttdot: 8411,\n\ttint: 8749,\n\ttoea: 10536,\n\ttopf: 120165,\n\ttosa: 10537,\n\ttrie: 8796,\n\ttscr: 120009,\n\ttscy: 1094,\n\tuArr: 8657,\n\tuHar: 10595,\n\tuarr: 8593,\n\tuopf: 120166,\n\tupsi: 965,\n\tuscr: 120010,\n\tutri: 9653,\n\tuuml: 252,\n\tvArr: 8661,\n\tvBar: 10984,\n\tvarr: 8597,\n\tvert: 124,\n\tvopf: 120167,\n\tvscr: 120011,\n\twopf: 120168,\n\twscr: 120012,\n\txcap: 8898,\n\txcup: 8899,\n\txmap: 10236,\n\txnis: 8955,\n\txopf: 120169,\n\txscr: 120013,\n\txvee: 8897,\n\tyacy: 1103,\n\tyicy: 1111,\n\tyopf: 120170,\n\tyscr: 120014,\n\tyucy: 1102,\n\tyuml: 255,\n\tzdot: 380,\n\tzeta: 950,\n\tzhcy: 1078,\n\tzopf: 120171,\n\tzscr: 120015,\n\tzwnj: 8204,\n\tAMP: 38,\n\tAcy: 1040,\n\tAfr: 120068,\n\tAnd: 10835,\n\tBcy: 1041,\n\tBfr: 120069,\n\tCap: 8914,\n\tCfr: 8493,\n\tChi: 935,\n\tCup: 8915,\n\tDcy: 1044,\n\tDel: 8711,\n\tDfr: 120071,\n\tDot: 168,\n\tENG: 330,\n\tETH: 208,\n\tEcy: 1069,\n\tEfr: 120072,\n\tEta: 919,\n\tFcy: 1060,\n\tFfr: 120073,\n\tGcy: 1043,\n\tGfr: 120074,\n\tHat: 94,\n\tHfr: 8460,\n\tIcy: 1048,\n\tIfr: 8465,\n\tInt: 8748,\n\tJcy: 1049,\n\tJfr: 120077,\n\tKcy: 1050,\n\tKfr: 120078,\n\tLcy: 1051,\n\tLfr: 120079,\n\tLsh: 8624,\n\tMap: 10501,\n\tMcy: 1052,\n\tMfr: 120080,\n\tNcy: 1053,\n\tNfr: 120081,\n\tNot: 10988,\n\tOcy: 1054,\n\tOfr: 120082,\n\tPcy: 1055,\n\tPfr: 120083,\n\tPhi: 934,\n\tPsi: 936,\n\tQfr: 120084,\n\tREG: 174,\n\tRcy: 1056,\n\tRfr: 8476,\n\tRho: 929,\n\tRsh: 8625,\n\tScy: 1057,\n\tSfr: 120086,\n\tSub: 8912,\n\tSum: 8721,\n\tSup: 8913,\n\tTab: 9,\n\tTau: 932,\n\tTcy: 1058,\n\tTfr: 120087,\n\tUcy: 1059,\n\tUfr: 120088,\n\tVcy: 1042,\n\tVee: 8897,\n\tVfr: 120089,\n\tWfr: 120090,\n\tXfr: 120091,\n\tYcy: 1067,\n\tYfr: 120092,\n\tZcy: 1047,\n\tZfr: 8488,\n\tacd: 8767,\n\tacy: 1072,\n\tafr: 120094,\n\tamp: 38,\n\tand: 8743,\n\tang: 8736,\n\tapE: 10864,\n\tape: 8778,\n\tast: 42,\n\tbcy: 1073,\n\tbfr: 120095,\n\tbot: 8869,\n\tcap: 8745,\n\tcfr: 120096,\n\tchi: 967,\n\tcir: 9675,\n\tcup: 8746,\n\tdcy: 1076,\n\tdeg: 176,\n\tdfr: 120097,\n\tdie: 168,\n\tdiv: 247,\n\tdot: 729,\n\tecy: 1101,\n\tefr: 120098,\n\tegs: 10902,\n\tell: 8467,\n\tels: 10901,\n\teng: 331,\n\teta: 951,\n\teth: 240,\n\tfcy: 1092,\n\tffr: 120099,\n\tgEl: 10892,\n\tgap: 10886,\n\tgcy: 1075,\n\tgel: 8923,\n\tgeq: 8805,\n\tges: 10878,\n\tgfr: 120100,\n\tggg: 8921,\n\tglE: 10898,\n\tgla: 10917,\n\tglj: 10916,\n\tgnE: 8809,\n\tgne: 10888,\n\thfr: 120101,\n\ticy: 1080,\n\tiff: 8660,\n\tifr: 120102,\n\tint: 8747,\n\tjcy: 1081,\n\tjfr: 120103,\n\tkcy: 1082,\n\tkfr: 120104,\n\tlEg: 10891,\n\tlap: 10885,\n\tlat: 10923,\n\tlcy: 1083,\n\tleg: 8922,\n\tleq: 8804,\n\tles: 10877,\n\tlfr: 120105,\n\tlgE: 10897,\n\tlnE: 8808,\n\tlne: 10887,\n\tloz: 9674,\n\tlrm: 8206,\n\tlsh: 8624,\n\tmap: 8614,\n\tmcy: 1084,\n\tmfr: 120106,\n\tmho: 8487,\n\tmid: 8739,\n\tnap: 8777,\n\tncy: 1085,\n\tnfr: 120107,\n\tnge: 8817,\n\tngt: 8815,\n\tnis: 8956,\n\tniv: 8715,\n\tnle: 8816,\n\tnlt: 8814,\n\tnot: 172,\n\tnpr: 8832,\n\tnsc: 8833,\n\tnum: 35,\n\tocy: 1086,\n\tofr: 120108,\n\togt: 10689,\n\tohm: 8486,\n\tolt: 10688,\n\tord: 10845,\n\torv: 10843,\n\tpar: 8741,\n\tpcy: 1087,\n\tpfr: 120109,\n\tphi: 966,\n\tpiv: 982,\n\tprE: 10931,\n\tpre: 10927,\n\tpsi: 968,\n\tqfr: 120110,\n\trcy: 1088,\n\treg: 174,\n\trfr: 120111,\n\trho: 961,\n\trlm: 8207,\n\trsh: 8625,\n\tscE: 10932,\n\tsce: 10928,\n\tscy: 1089,\n\tsfr: 120112,\n\tshy: 173,\n\tsim: 8764,\n\tsmt: 10922,\n\tsol: 47,\n\tsqu: 9633,\n\tsub: 8834,\n\tsum: 8721,\n\tsup: 8835,\n\ttau: 964,\n\ttcy: 1090,\n\ttfr: 120113,\n\ttop: 8868,\n\tucy: 1091,\n\tufr: 120114,\n\tuml: 168,\n\tvcy: 1074,\n\tvee: 8744,\n\tvfr: 120115,\n\twfr: 120116,\n\txfr: 120117,\n\tycy: 1099,\n\tyen: 165,\n\tyfr: 120118,\n\tzcy: 1079,\n\tzfr: 120119,\n\tzwj: 8205,\n\tDD: 8517,\n\tGT: 62,\n\tGg: 8921,\n\tGt: 8811,\n\tIm: 8465,\n\tLT: 60,\n\tLl: 8920,\n\tLt: 8810,\n\tMu: 924,\n\tNu: 925,\n\tOr: 10836,\n\tPi: 928,\n\tPr: 10939,\n\tRe: 8476,\n\tSc: 10940,\n\tXi: 926,\n\tac: 8766,\n\taf: 8289,\n\tap: 8776,\n\tdd: 8518,\n\tee: 8519,\n\teg: 10906,\n\tel: 10905,\n\tgE: 8807,\n\tge: 8805,\n\tgg: 8811,\n\tgl: 8823,\n\tgt: 62,\n\tic: 8291,\n\tii: 8520,\n\tin: 8712,\n\tit: 8290,\n\tlE: 8806,\n\tle: 8804,\n\tlg: 8822,\n\tll: 8810,\n\tlt: 60,\n\tmp: 8723,\n\tmu: 956,\n\tne: 8800,\n\tni: 8715,\n\tnu: 957,\n\toS: 9416,\n\tor: 8744,\n\tpi: 960,\n\tpm: 177,\n\tpr: 8826,\n\trx: 8478,\n\tsc: 8827,\n\twp: 8472,\n\twr: 8768,\n\txi: 958,\n};\n","import entities from './entities';\n\nconst windows_1252 = [\n\t8364,\n\t129,\n\t8218,\n\t402,\n\t8222,\n\t8230,\n\t8224,\n\t8225,\n\t710,\n\t8240,\n\t352,\n\t8249,\n\t338,\n\t141,\n\t381,\n\t143,\n\t144,\n\t8216,\n\t8217,\n\t8220,\n\t8221,\n\t8226,\n\t8211,\n\t8212,\n\t732,\n\t8482,\n\t353,\n\t8250,\n\t339,\n\t157,\n\t382,\n\t376,\n];\n\nconst entity_pattern = new RegExp(\n\t`&(#?(?:x[\\\\w\\\\d]+|\\\\d+|${Object.keys(entities).join('|')}))(?:;|\\\\b)`,\n\t'g'\n);\n\nexport function decode_character_references(html: string) {\n\treturn html.replace(entity_pattern, (match, entity) => {\n\t\tlet code;\n\n\t\t// Handle named entities\n\t\tif (entity[0] !== '#') {\n\t\t\tcode = entities[entity];\n\t\t} else if (entity[1] === 'x') {\n\t\t\tcode = parseInt(entity.substring(2), 16);\n\t\t} else {\n\t\t\tcode = parseInt(entity.substring(1), 10);\n\t\t}\n\n\t\tif (!code) {\n\t\t\treturn match;\n\t\t}\n\n\t\treturn String.fromCodePoint(validate_code(code));\n\t});\n}\n\nconst NUL = 0;\n\n// some code points are verboten. If we were inserting HTML, the browser would replace the illegal\n// code points with alternatives in some cases - since we're bypassing that mechanism, we need\n// to replace them ourselves\n//\n// Source: http://en.wikipedia.org/wiki/Character_encodings_in_HTML#Illegal_characters\nfunction validate_code(code: number) {\n\t// line feed becomes generic whitespace\n\tif (code === 10) {\n\t\treturn 32;\n\t}\n\n\t// ASCII range. (Why someone would use HTML entities for ASCII characters I don't know, but...)\n\tif (code < 128) {\n\t\treturn code;\n\t}\n\n\t// code points 128-159 are dealt with leniently by browsers, but they're incorrect. We need\n\t// to correct the mistake or we'll end up with missing € signs and so on\n\tif (code <= 159) {\n\t\treturn windows_1252[code - 128];\n\t}\n\n\t// basic multilingual plane\n\tif (code < 55296) {\n\t\treturn code;\n\t}\n\n\t// UTF-16 surrogate halves\n\tif (code <= 57343) {\n\t\treturn NUL;\n\t}\n\n\t// rest of the basic multilingual plane\n\tif (code <= 65535) {\n\t\treturn code;\n\t}\n\n\t// supplementary multilingual plane 0x10000 - 0x1ffff\n\tif (code >= 65536 && code <= 131071) {\n\t\treturn code;\n\t}\n\n\t// supplementary ideographic plane 0x20000 - 0x2ffff\n\tif (code >= 131072 && code <= 196607) {\n\t\treturn code;\n\t}\n\n\treturn NUL;\n}\n\n// based on http://developers.whatwg.org/syntax.html#syntax-tag-omission\nconst disallowed_contents = new Map([\n\t['li', new Set(['li'])],\n\t['dt', new Set(['dt', 'dd'])],\n\t['dd', new Set(['dt', 'dd'])],\n\t[\n\t\t'p',\n\t\tnew Set(\n\t\t\t'address article aside blockquote div dl fieldset footer form h1 h2 h3 h4 h5 h6 header hgroup hr main menu nav ol p pre section table ul'.split(\n\t\t\t\t' '\n\t\t\t)\n\t\t),\n\t],\n\t['rt', new Set(['rt', 'rp'])],\n\t['rp', new Set(['rt', 'rp'])],\n\t['optgroup', new Set(['optgroup'])],\n\t['option', new Set(['option', 'optgroup'])],\n\t['thead', new Set(['tbody', 'tfoot'])],\n\t['tbody', new Set(['tbody', 'tfoot'])],\n\t['tfoot', new Set(['tbody'])],\n\t['tr', new Set(['tr', 'tbody'])],\n\t['td', new Set(['td', 'th', 'tr'])],\n\t['th', new Set(['td', 'th', 'tr'])],\n]);\n\n// can this be a child of the parent element, or does it implicitly\n// close it, like `<li>one<li>two`?\nexport function closing_tag_omitted(current: string, next?: string) {\n\tif (disallowed_contents.has(current)) {\n\t\tif (!next || disallowed_contents.get(current).has(next)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n","// Adapted from https://github.com/acornjs/acorn/blob/6584815dca7440e00de841d1dad152302fdd7ca5/src/tokenize.js\n// Reproduced under MIT License https://github.com/acornjs/acorn/blob/master/LICENSE\n\nexport default function full_char_code_at(str: string, i: number): number {\n\tconst code = str.charCodeAt(i);\n\tif (code <= 0xd7ff || code >= 0xe000) return code;\n\n\tconst next = str.charCodeAt(i + 1);\n\treturn (code << 10) + next - 0x35fdc00;\n}","import { isIdentifierStart, isIdentifierChar } from 'acorn';\nimport full_char_code_at from './full_char_code_at';\n\nexport const globals = new Set([\n\t'alert',\n\t'Array',\n\t'Boolean',\n\t'clearInterval',\n\t'clearTimeout',\n\t'confirm',\n\t'console',\n\t'Date',\n\t'decodeURI',\n\t'decodeURIComponent',\n\t'document',\n\t'encodeURI',\n\t'encodeURIComponent',\n\t'Error',\n\t'EvalError',\n\t'Event',\n\t'fetch',\n\t'global',\n\t'globalThis',\n\t'history',\n\t'Infinity',\n\t'InternalError',\n\t'Intl',\n\t'isFinite',\n\t'isNaN',\n\t'JSON',\n\t'localStorage',\n\t'location',\n\t'Map',\n\t'Math',\n\t'NaN',\n\t'navigator',\n\t'Number',\n\t'Object',\n\t'parseFloat',\n\t'parseInt',\n\t'process',\n\t'Promise',\n\t'prompt',\n\t'RangeError',\n\t'ReferenceError',\n\t'RegExp',\n\t'sessionStorage',\n\t'Set',\n\t'setInterval',\n\t'setTimeout',\n\t'String',\n\t'SyntaxError',\n\t'TypeError',\n\t'undefined',\n\t'URIError',\n\t'URL',\n\t'window'\n]);\n\nexport const reserved = new Set([\n\t'arguments',\n\t'await',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'eval',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'function',\n\t'if',\n\t'implements',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'interface',\n\t'let',\n\t'new',\n\t'null',\n\t'package',\n\t'private',\n\t'protected',\n\t'public',\n\t'return',\n\t'static',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield',\n]);\n\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\n\nexport function is_void(name: string) {\n\treturn void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nexport function is_valid(str: string): boolean {\n\tlet i = 0;\n\n\twhile (i < str.length) {\n\t\tconst code = full_char_code_at(str, i);\n\t\tif (!(i === 0 ? isIdentifierStart : isIdentifierChar)(code, true)) return false;\n\n\t\ti += code <= 0xffff ? 1 : 2;\n\t}\n\n\treturn true;\n}\n\nexport function sanitize(name: string) {\n\treturn name\n\t\t.replace(/[^a-zA-Z0-9_]+/g, '_')\n\t\t.replace(/^_/, '')\n\t\t.replace(/_$/, '')\n\t\t.replace(/^[0-9]/, '_$&');\n}\n","export default function fuzzymatch(name: string, names: string[]) {\n\tconst set = new FuzzySet(names);\n\tconst matches = set.get(name);\n\n\treturn matches && matches[0] && matches[0][0] > 0.7 ? matches[0][1] : null;\n}\n\n// adapted from https://github.com/Glench/fuzzyset.js/blob/master/lib/fuzzyset.js\n// BSD Licensed\n\nconst GRAM_SIZE_LOWER = 2;\nconst GRAM_SIZE_UPPER = 3;\n\n// return an edit distance from 0 to 1\nfunction _distance(str1: string, str2: string) {\n\tif (str1 === null && str2 === null)\n\t\tthrow 'Trying to compare two null values';\n\tif (str1 === null || str2 === null) return 0;\n\tstr1 = String(str1);\n\tstr2 = String(str2);\n\n\tconst distance = levenshtein(str1, str2);\n\tif (str1.length > str2.length) {\n\t\treturn 1 - distance / str1.length;\n\t} else {\n\t\treturn 1 - distance / str2.length;\n\t}\n}\n\n// helper functions\nfunction levenshtein(str1: string, str2: string) {\n\tconst current: number[] = [];\n\tlet prev;\n\tlet value;\n\n\tfor (let i = 0; i <= str2.length; i++) {\n\t\tfor (let j = 0; j <= str1.length; j++) {\n\t\t\tif (i && j) {\n\t\t\t\tif (str1.charAt(j - 1) === str2.charAt(i - 1)) {\n\t\t\t\t\tvalue = prev;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = Math.min(current[j], current[j - 1], prev) + 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue = i + j;\n\t\t\t}\n\n\t\t\tprev = current[j];\n\t\t\tcurrent[j] = value;\n\t\t}\n\t}\n\n\treturn current.pop();\n}\n\nconst non_word_regex = /[^\\w, ]+/;\n\nfunction iterate_grams(value: string, gram_size = 2) {\n\tconst simplified = '-' + value.toLowerCase().replace(non_word_regex, '') + '-';\n\tconst len_diff = gram_size - simplified.length;\n\tconst results = [];\n\n\tif (len_diff > 0) {\n\t\tfor (let i = 0; i < len_diff; ++i) {\n\t\t\tvalue += '-';\n\t\t}\n\t}\n\tfor (let i = 0; i < simplified.length - gram_size + 1; ++i) {\n\t\tresults.push(simplified.slice(i, i + gram_size));\n\t}\n\treturn results;\n}\n\nfunction gram_counter(value: string, gram_size = 2) {\n\t// return an object where key=gram, value=number of occurrences\n\tconst result = {};\n\tconst grams = iterate_grams(value, gram_size);\n\tlet i = 0;\n\n\tfor (i; i < grams.length; ++i) {\n\t\tif (grams[i] in result) {\n\t\t\tresult[grams[i]] += 1;\n\t\t} else {\n\t\t\tresult[grams[i]] = 1;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction sort_descending(a, b) {\n\treturn b[0] - a[0];\n}\n\nclass FuzzySet {\n\texact_set = {};\n\tmatch_dict = {};\n\titems = {};\n\n\tconstructor(arr: string[]) {\n\t\t// initialization\n\t\tfor (let i = GRAM_SIZE_LOWER; i < GRAM_SIZE_UPPER + 1; ++i) {\n\t\t\tthis.items[i] = [];\n\t\t}\n\n\t\t// add all the items to the set\n\t\tfor (let i = 0; i < arr.length; ++i) {\n\t\t\tthis.add(arr[i]);\n\t\t}\n\t}\n\n\tadd(value: string) {\n\t\tconst normalized_value = value.toLowerCase();\n\t\tif (normalized_value in this.exact_set) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet i = GRAM_SIZE_LOWER;\n\t\tfor (i; i < GRAM_SIZE_UPPER + 1; ++i) {\n\t\t\tthis._add(value, i);\n\t\t}\n\t}\n\n\t_add(value: string, gram_size: number) {\n\t\tconst normalized_value = value.toLowerCase();\n\t\tconst items = this.items[gram_size] || [];\n\t\tconst index = items.length;\n\n\t\titems.push(0);\n\t\tconst gram_counts = gram_counter(normalized_value, gram_size);\n\t\tlet sum_of_square_gram_counts = 0;\n\t\tlet gram;\n\t\tlet gram_count;\n\n\t\tfor (gram in gram_counts) {\n\t\t\tgram_count = gram_counts[gram];\n\t\t\tsum_of_square_gram_counts += Math.pow(gram_count, 2);\n\t\t\tif (gram in this.match_dict) {\n\t\t\t\tthis.match_dict[gram].push([index, gram_count]);\n\t\t\t} else {\n\t\t\t\tthis.match_dict[gram] = [[index, gram_count]];\n\t\t\t}\n\t\t}\n\t\tconst vector_normal = Math.sqrt(sum_of_square_gram_counts);\n\t\titems[index] = [vector_normal, normalized_value];\n\t\tthis.items[gram_size] = items;\n\t\tthis.exact_set[normalized_value] = value;\n\t}\n\n\tget(value: string) {\n\t\tconst normalized_value = value.toLowerCase();\n\t\tconst result = this.exact_set[normalized_value];\n\n\t\tif (result) {\n\t\t\treturn [[1, result]];\n\t\t}\n\n\t\tlet results = [];\n\t\t// start with high gram size and if there are no results, go to lower gram sizes\n\t\tfor (\n\t\t\tlet gram_size = GRAM_SIZE_UPPER;\n\t\t\tgram_size >= GRAM_SIZE_LOWER;\n\t\t\t--gram_size\n\t\t) {\n\t\t\tresults = this.__get(value, gram_size);\n\t\t\tif (results) {\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t__get(value: string, gram_size: number) {\n\t\tconst normalized_value = value.toLowerCase();\n\t\tconst matches = {};\n\t\tconst gram_counts = gram_counter(normalized_value, gram_size);\n\t\tconst items = this.items[gram_size];\n\t\tlet sum_of_square_gram_counts = 0;\n\t\tlet gram;\n\t\tlet gram_count;\n\t\tlet i;\n\t\tlet index;\n\t\tlet other_gram_count;\n\n\t\tfor (gram in gram_counts) {\n\t\t\tgram_count = gram_counts[gram];\n\t\t\tsum_of_square_gram_counts += Math.pow(gram_count, 2);\n\t\t\tif (gram in this.match_dict) {\n\t\t\t\tfor (i = 0; i < this.match_dict[gram].length; ++i) {\n\t\t\t\t\tindex = this.match_dict[gram][i][0];\n\t\t\t\t\tother_gram_count = this.match_dict[gram][i][1];\n\t\t\t\t\tif (index in matches) {\n\t\t\t\t\t\tmatches[index] += gram_count * other_gram_count;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatches[index] = gram_count * other_gram_count;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst vector_normal = Math.sqrt(sum_of_square_gram_counts);\n\t\tlet results = [];\n\t\tlet match_score;\n\n\t\t// build a results list of [score, str]\n\t\tfor (const match_index in matches) {\n\t\t\tmatch_score = matches[match_index];\n\t\t\tresults.push([\n\t\t\t\tmatch_score / (vector_normal * items[match_index][0]),\n\t\t\t\titems[match_index][1],\n\t\t\t]);\n\t\t}\n\n\t\tresults.sort(sort_descending);\n\n\t\tlet new_results = [];\n\t\tconst end_index = Math.min(50, results.length);\n\t\t// truncate somewhat arbitrarily to 50\n\t\tfor (let i = 0; i < end_index; ++i) {\n\t\t\tnew_results.push([\n\t\t\t\t_distance(results[i][1], normalized_value),\n\t\t\t\tresults[i][1],\n\t\t\t]);\n\t\t}\n\t\tresults = new_results;\n\t\tresults.sort(sort_descending);\n\n\t\tnew_results = [];\n\t\tfor (let i = 0; i < results.length; ++i) {\n\t\t\tif (results[i][0] == results[0][0]) {\n\t\t\t\tnew_results.push([results[i][0], this.exact_set[results[i][1]]]);\n\t\t\t}\n\t\t}\n\n\t\treturn new_results;\n\t}\n}\n","import read_expression from '../read/expression';\nimport read_script from '../read/script';\nimport read_style from '../read/style';\nimport { decode_character_references, closing_tag_omitted } from '../utils/html';\nimport { is_void } from '../../utils/names';\nimport { Parser } from '../index';\nimport { Directive, DirectiveType, TemplateNode, Text } from '../../interfaces';\nimport fuzzymatch from '../../utils/fuzzymatch';\nimport list from '../../utils/list';\n\n// eslint-disable-next-line no-useless-escape\nconst valid_tag_name = /^\\!?[a-zA-Z]{1,}:?[a-zA-Z0-9\\-]*/;\n\nconst meta_tags = new Map([\n\t['svelte:head', 'Head'],\n\t['svelte:options', 'Options'],\n\t['svelte:window', 'Window'],\n\t['svelte:body', 'Body']\n]);\n\nconst valid_meta_tags = Array.from(meta_tags.keys()).concat('svelte:self', 'svelte:component');\n\nconst specials = new Map([\n\t[\n\t\t'script',\n\t\t{\n\t\t\tread: read_script,\n\t\t\tproperty: 'js',\n\t\t},\n\t],\n\t[\n\t\t'style',\n\t\t{\n\t\t\tread: read_style,\n\t\t\tproperty: 'css',\n\t\t},\n\t],\n]);\n\nconst SELF = /^svelte:self(?=[\\s/>])/;\nconst COMPONENT = /^svelte:component(?=[\\s/>])/;\n\nfunction parent_is_head(stack) {\n\tlet i = stack.length;\n\twhile (i--) {\n\t\tconst { type } = stack[i];\n\t\tif (type === 'Head') return true;\n\t\tif (type === 'Element' || type === 'InlineComponent') return false;\n\t}\n\treturn false;\n}\n\nexport default function tag(parser: Parser) {\n\tconst start = parser.index++;\n\n\tlet parent = parser.current();\n\n\tif (parser.eat('!--')) {\n\t\tconst data = parser.read_until(/-->/);\n\t\tparser.eat('-->', true, 'comment was left open, expected -->');\n\n\t\tparser.current().children.push({\n\t\t\tstart,\n\t\t\tend: parser.index,\n\t\t\ttype: 'Comment',\n\t\t\tdata,\n\t\t});\n\n\t\treturn;\n\t}\n\n\tconst is_closing_tag = parser.eat('/');\n\n\tconst name = read_tag_name(parser);\n\n\tif (meta_tags.has(name)) {\n\t\tconst slug = meta_tags.get(name).toLowerCase();\n\t\tif (is_closing_tag) {\n\t\t\tif (\n\t\t\t\t(name === 'svelte:window' || name === 'svelte:body') &&\n\t\t\t\tparser.current().children.length\n\t\t\t) {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-${slug}-content`,\n\t\t\t\t\tmessage: `<${name}> cannot have children`\n\t\t\t\t}, parser.current().children[0].start);\n\t\t\t}\n\t\t} else {\n\t\t\tif (name in parser.meta_tags) {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `duplicate-${slug}`,\n\t\t\t\t\tmessage: `A component can only have one <${name}> tag`\n\t\t\t\t}, start);\n\t\t\t}\n\n\t\t\tif (parser.stack.length > 1) {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-${slug}-placement`,\n\t\t\t\t\tmessage: `<${name}> tags cannot be inside elements or blocks`\n\t\t\t\t}, start);\n\t\t\t}\n\n\t\t\tparser.meta_tags[name] = true;\n\t\t}\n\t}\n\n\tconst type = meta_tags.has(name)\n\t\t? meta_tags.get(name)\n\t\t: (/[A-Z]/.test(name[0]) || name === 'svelte:self' || name === 'svelte:component') ? 'InlineComponent'\n\t\t\t: name === 'title' && parent_is_head(parser.stack) ? 'Title'\n\t\t\t\t: name === 'slot' && !parser.customElement ? 'Slot' : 'Element';\n\n\tconst element: TemplateNode = {\n\t\tstart,\n\t\tend: null, // filled in later\n\t\ttype,\n\t\tname,\n\t\tattributes: [],\n\t\tchildren: [],\n\t};\n\n\tparser.allow_whitespace();\n\n\tif (is_closing_tag) {\n\t\tif (is_void(name)) {\n\t\t\tparser.error({\n\t\t\t\tcode: `invalid-void-content`,\n\t\t\t\tmessage: `<${name}> is a void element and cannot have children, or a closing tag`\n\t\t\t}, start);\n\t\t}\n\n\t\tparser.eat('>', true);\n\n\t\t// close any elements that don't have their own closing tags, e.g. <div><p></div>\n\t\twhile (parent.name !== name) {\n\t\t\tif (parent.type !== 'Element')\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-closing-tag`,\n\t\t\t\t\tmessage: `</${name}> attempted to close an element that was not open`\n\t\t\t\t}, start);\n\n\t\t\tparent.end = start;\n\t\t\tparser.stack.pop();\n\n\t\t\tparent = parser.current();\n\t\t}\n\n\t\tparent.end = parser.index;\n\t\tparser.stack.pop();\n\n\t\treturn;\n\t} else if (closing_tag_omitted(parent.name, name)) {\n\t\tparent.end = start;\n\t\tparser.stack.pop();\n\t}\n\n\tconst unique_names: Set<string> = new Set();\n\n\tlet attribute;\n\twhile ((attribute = read_attribute(parser, unique_names))) {\n\t\telement.attributes.push(attribute);\n\t\tparser.allow_whitespace();\n\t}\n\n\tif (name === 'svelte:component') {\n\t\tconst index = element.attributes.findIndex(attr => attr.type === 'Attribute' && attr.name === 'this');\n\t\tif (!~index) {\n\t\t\tparser.error({\n\t\t\t\tcode: `missing-component-definition`,\n\t\t\t\tmessage: `<svelte:component> must have a 'this' attribute`\n\t\t\t}, start);\n\t\t}\n\n\t\tconst definition = element.attributes.splice(index, 1)[0];\n\t\tif (definition.value === true || definition.value.length !== 1 || definition.value[0].type === 'Text') {\n\t\t\tparser.error({\n\t\t\t\tcode: `invalid-component-definition`,\n\t\t\t\tmessage: `invalid component definition`\n\t\t\t}, definition.start);\n\t\t}\n\n\t\telement.expression = definition.value[0].expression;\n\t}\n\n\t// special cases – top-level <script> and <style>\n\tif (specials.has(name) && parser.stack.length === 1) {\n\t\tconst special = specials.get(name);\n\n\t\tparser.eat('>', true);\n\t\tconst content = special.read(parser, start, element.attributes);\n\t\tif (content) parser[special.property].push(content);\n\t\treturn;\n\t}\n\n\tparser.current().children.push(element);\n\n\tconst self_closing = parser.eat('/') || is_void(name);\n\n\tparser.eat('>', true);\n\n\tif (self_closing) {\n\t\t// don't push self-closing elements onto the stack\n\t\telement.end = parser.index;\n\t} else if (name === 'textarea') {\n\t\t// special case\n\t\telement.children = read_sequence(\n\t\t\tparser,\n\t\t\t() =>\n\t\t\t\tparser.template.slice(parser.index, parser.index + 11) === '</textarea>'\n\t\t);\n\t\tparser.read(/<\\/textarea>/);\n\t\telement.end = parser.index;\n\t} else if (name === 'script') {\n\t\t// special case\n\t\tconst start = parser.index;\n\t\tconst data = parser.read_until(/<\\/script>/);\n\t\tconst end = parser.index;\n\t\telement.children.push({ start, end, type: 'Text', data });\n\t\tparser.eat('</script>', true);\n\t\telement.end = parser.index;\n\t} else if (name === 'style') {\n\t\t// special case\n\t\tconst start = parser.index;\n\t\tconst data = parser.read_until(/<\\/style>/);\n\t\tconst end = parser.index;\n\t\telement.children.push({ start, end, type: 'Text', data });\n\t\tparser.eat('</style>', true);\n\t} else {\n\t\tparser.stack.push(element);\n\t}\n}\n\nfunction read_tag_name(parser: Parser) {\n\tconst start = parser.index;\n\n\tif (parser.read(SELF)) {\n\t\t// check we're inside a block, otherwise this\n\t\t// will cause infinite recursion\n\t\tlet i = parser.stack.length;\n\t\tlet legal = false;\n\n\t\twhile (i--) {\n\t\t\tconst fragment = parser.stack[i];\n\t\t\tif (fragment.type === 'IfBlock' || fragment.type === 'EachBlock') {\n\t\t\t\tlegal = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!legal) {\n\t\t\tparser.error({\n\t\t\t\tcode: `invalid-self-placement`,\n\t\t\t\tmessage: `<svelte:self> components can only exist inside if-blocks or each-blocks`\n\t\t\t}, start);\n\t\t}\n\n\t\treturn 'svelte:self';\n\t}\n\n\tif (parser.read(COMPONENT)) return 'svelte:component';\n\n\tconst name = parser.read_until(/(\\s|\\/|>)/);\n\n\tif (meta_tags.has(name)) return name;\n\n\tif (name.startsWith('svelte:')) {\n\t\tconst match = fuzzymatch(name.slice(7), valid_meta_tags);\n\n\t\tlet message = `Valid <svelte:...> tag names are ${list(valid_meta_tags)}`;\n\t\tif (match) message += ` (did you mean '${match}'?)`;\n\n\t\tparser.error({\n\t\t\tcode: 'invalid-tag-name',\n\t\t\tmessage\n\t\t}, start);\n\t}\n\n\tif (!valid_tag_name.test(name)) {\n\t\tparser.error({\n\t\t\tcode: `invalid-tag-name`,\n\t\t\tmessage: `Expected valid tag name`\n\t\t}, start);\n\t}\n\n\treturn name;\n}\n\nfunction read_attribute(parser: Parser, unique_names: Set<string>) {\n\tconst start = parser.index;\n\n\tif (parser.eat('{')) {\n\t\tparser.allow_whitespace();\n\n\t\tif (parser.eat('...')) {\n\t\t\tconst expression = read_expression(parser);\n\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\n\t\t\treturn {\n\t\t\t\tstart,\n\t\t\t\tend: parser.index,\n\t\t\t\ttype: 'Spread',\n\t\t\t\texpression\n\t\t\t};\n\t\t} else {\n\t\t\tconst value_start = parser.index;\n\n\t\t\tconst name = parser.read_identifier();\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\n\t\t\treturn {\n\t\t\t\tstart,\n\t\t\t\tend: parser.index,\n\t\t\t\ttype: 'Attribute',\n\t\t\t\tname,\n\t\t\t\tvalue: [{\n\t\t\t\t\tstart: value_start,\n\t\t\t\t\tend: value_start + name.length,\n\t\t\t\t\ttype: 'AttributeShorthand',\n\t\t\t\t\texpression: {\n\t\t\t\t\t\tstart: value_start,\n\t\t\t\t\t\tend: value_start + name.length,\n\t\t\t\t\t\ttype: 'Identifier',\n\t\t\t\t\t\tname\n\t\t\t\t\t}\n\t\t\t\t}]\n\t\t\t};\n\t\t}\n\t}\n\n\t// eslint-disable-next-line no-useless-escape\n\tconst name = parser.read_until(/[\\s=\\/>\"']/);\n\tif (!name) return null;\n\n\tlet end = parser.index;\n\n\tparser.allow_whitespace();\n\n\tconst colon_index = name.indexOf(':');\n\tconst type = colon_index !== -1 && get_directive_type(name.slice(0, colon_index));\n\n\tif (unique_names.has(name)) {\n\t\tparser.error({\n\t\t\tcode: `duplicate-attribute`,\n\t\t\tmessage: 'Attributes need to be unique'\n\t\t}, start);\n\t}\n\n\tif (type !== \"EventHandler\") {\n\t\tunique_names.add(name);\n\t}\n\n\tlet value: any[] | true = true;\n\tif (parser.eat('=')) {\n\t\tparser.allow_whitespace();\n\t\tvalue = read_attribute_value(parser);\n\t\tend = parser.index;\n\t} else if (parser.match_regex(/[\"']/)) {\n\t\tparser.error({\n\t\t\tcode: `unexpected-token`,\n\t\t\tmessage: `Expected =`\n\t\t}, parser.index);\n\t}\n\n\tif (type) {\n\t\tconst [directive_name, ...modifiers] = name.slice(colon_index + 1).split('|');\n\n\t\tif (type === 'Ref') {\n\t\t\tparser.error({\n\t\t\t\tcode: `invalid-ref-directive`,\n\t\t\t\tmessage: `The ref directive is no longer supported — use \\`bind:this={${directive_name}}\\` instead`\n\t\t\t}, start);\n\t\t}\n\n\t\tif (value[0]) {\n\t\t\tif ((value as any[]).length > 1 || value[0].type === 'Text') {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-directive-value`,\n\t\t\t\t\tmessage: `Directive value must be a JavaScript expression enclosed in curly braces`\n\t\t\t\t}, value[0].start);\n\t\t\t}\n\t\t}\n\n\t\tconst directive: Directive = {\n\t\t\tstart,\n\t\t\tend,\n\t\t\ttype,\n\t\t\tname: directive_name,\n\t\t\tmodifiers,\n\t\t\texpression: (value[0] && value[0].expression) || null\n\t\t};\n\n\t\tif (type === 'Transition') {\n\t\t\tconst direction = name.slice(0, colon_index);\n\t\t\tdirective.intro = direction === 'in' || direction === 'transition';\n\t\t\tdirective.outro = direction === 'out' || direction === 'transition';\n\t\t}\n\n\t\tif (!directive.expression && (type === 'Binding' || type === 'Class')) {\n\t\t\tdirective.expression = {\n\t\t\t\tstart: directive.start + colon_index + 1,\n\t\t\t\tend: directive.end,\n\t\t\t\ttype: 'Identifier',\n\t\t\t\tname: directive.name\n\t\t\t} as any;\n\t\t}\n\n\t\treturn directive;\n\t}\n\n\treturn {\n\t\tstart,\n\t\tend,\n\t\ttype: 'Attribute',\n\t\tname,\n\t\tvalue,\n\t};\n}\n\nfunction get_directive_type(name: string): DirectiveType {\n\tif (name === 'use') return 'Action';\n\tif (name === 'animate') return 'Animation';\n\tif (name === 'bind') return 'Binding';\n\tif (name === 'class') return 'Class';\n\tif (name === 'on') return 'EventHandler';\n\tif (name === 'let') return 'Let';\n\tif (name === 'ref') return 'Ref';\n\tif (name === 'in' || name === 'out' || name === 'transition') return 'Transition';\n}\n\nfunction read_attribute_value(parser: Parser) {\n\tconst quote_mark = parser.eat(`'`) ? `'` : parser.eat(`\"`) ? `\"` : null;\n\n\tconst regex = (\n\t\tquote_mark === `'` ? /'/ :\n\t\t\tquote_mark === `\"` ? /\"/ :\n\t\t\t\t/(\\/>|[\\s\"'=<>`])/\n\t);\n\n\tconst value = read_sequence(parser, () => !!parser.match_regex(regex));\n\n\tif (quote_mark) parser.index += 1;\n\treturn value;\n}\n\nfunction read_sequence(parser: Parser, done: () => boolean): TemplateNode[] {\n\tlet current_chunk: Text = {\n\t\tstart: parser.index,\n\t\tend: null,\n\t\ttype: 'Text',\n\t\traw: '',\n\t\tdata: null\n\t};\n\n\tfunction flush() {\n\t\tif (current_chunk.raw) {\n\t\t\tcurrent_chunk.data = decode_character_references(current_chunk.raw);\n\t\t\tcurrent_chunk.end = parser.index;\n\t\t\tchunks.push(current_chunk);\n\t\t}\n\t}\n\n\tconst chunks: TemplateNode[] = [];\n\n\twhile (parser.index < parser.template.length) {\n\t\tconst index = parser.index;\n\n\t\tif (done()) {\n\t\t\tflush();\n\t\t\treturn chunks;\n\t\t} else if (parser.eat('{')) {\n\t\t\tflush();\n\n\t\t\tparser.allow_whitespace();\n\t\t\tconst expression = read_expression(parser);\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\n\t\t\tchunks.push({\n\t\t\t\tstart: index,\n\t\t\t\tend: parser.index,\n\t\t\t\ttype: 'MustacheTag',\n\t\t\t\texpression,\n\t\t\t});\n\n\t\t\tcurrent_chunk = {\n\t\t\t\tstart: parser.index,\n\t\t\t\tend: null,\n\t\t\t\ttype: 'Text',\n\t\t\t\traw: '',\n\t\t\t\tdata: null\n\t\t\t};\n\t\t} else {\n\t\t\tcurrent_chunk.raw += parser.template[parser.index++];\n\t\t}\n\t}\n\n\tparser.error({\n\t\tcode: `unexpected-eof`,\n\t\tmessage: `Unexpected end of input`\n\t});\n}\n","import { Parser } from '../index';\n\ninterface Identifier {\n\tstart: number;\n\tend: number;\n\ttype: 'Identifier';\n\tname: string;\n}\n\ninterface Property {\n\tstart: number;\n\tend: number;\n\ttype: 'Property';\n\tkind: 'init' | 'rest';\n\tshorthand: boolean;\n\tkey: Identifier;\n\tvalue: Context;\n}\n\ninterface Context {\n\tstart: number;\n\tend: number;\n\ttype: 'Identifier' | 'ArrayPattern' | 'ObjectPattern' | 'RestIdentifier';\n\tname?: string;\n\telements?: Context[];\n\tproperties?: Property[];\n}\n\nfunction error_on_assignment_pattern(parser: Parser) {\n\tif (parser.eat('=')) {\n\t\tparser.error({\n\t\t\tcode: 'invalid-assignment-pattern',\n\t\t\tmessage: 'Assignment patterns are not supported'\n\t\t}, parser.index - 1);\n\t}\n}\n\nfunction error_on_rest_pattern_not_last(parser: Parser) {\n\tparser.error({\n\t\tcode: 'rest-pattern-not-last',\n\t\tmessage: 'Rest destructuring expected to be last'\n\t}, parser.index);\n}\n\nexport default function read_context(parser: Parser) {\n\tconst context: Context = {\n\t\tstart: parser.index,\n\t\tend: null,\n\t\ttype: null\n\t};\n\n\tif (parser.eat('[')) {\n\t\tcontext.type = 'ArrayPattern';\n\t\tcontext.elements = [];\n\n\t\tdo {\n\t\t\tparser.allow_whitespace();\n\n\t\t\tconst lastContext = context.elements[context.elements.length - 1];\n\t\t\tif (lastContext && lastContext.type === 'RestIdentifier') {\n\t\t\t\terror_on_rest_pattern_not_last(parser);\n\t\t\t}\n\n\t\t\tif (parser.template[parser.index] === ',') {\n\t\t\t\tcontext.elements.push(null);\n\t\t\t} else {\n\t\t\t\tcontext.elements.push(read_context(parser));\n\t\t\t\tparser.allow_whitespace();\n\t\t\t}\n\t\t} while (parser.eat(','));\n\n\t\terror_on_assignment_pattern(parser);\n\t\tparser.eat(']', true);\n\t\tcontext.end = parser.index;\n\t}\n\n\telse if (parser.eat('{')) {\n\t\tcontext.type = 'ObjectPattern';\n\t\tcontext.properties = [];\n\n\t\tdo {\n\t\t\tparser.allow_whitespace();\n\n\t\t\tif (parser.eat('...')) {\n\t\t\t\tparser.allow_whitespace();\n\n\t\t\t\tconst start = parser.index;\n\t\t\t\tconst name = parser.read_identifier();\n\t\t\t\tconst key: Identifier = {\n\t\t\t\t\tstart,\n\t\t\t\t\tend: parser.index,\n\t\t\t\t\ttype: 'Identifier',\n\t\t\t\t\tname\n\t\t\t\t};\n\t\t\t\tconst property: Property = {\n\t\t\t\t\tstart,\n\t\t\t\t\tend: parser.index,\n\t\t\t\t\ttype: 'Property',\n\t\t\t\t\tkind: 'rest',\n\t\t\t\t\tshorthand: true,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: key\n\t\t\t\t};\n\n\t\t\t\tcontext.properties.push(property);\n\n\t\t\t\tparser.allow_whitespace();\n\n\t\t\t\tif (parser.eat(',')) {\n\t\t\t\t\tparser.error({\n\t\t\t\t\t\tcode: `comma-after-rest`,\n\t\t\t\t\t\tmessage: `Comma is not permitted after the rest element`\n\t\t\t\t\t}, parser.index - 1);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst start = parser.index;\n\t\t\tconst name = parser.read_identifier();\n\t\t\tconst key: Identifier = {\n\t\t\t\tstart,\n\t\t\t\tend: parser.index,\n\t\t\t\ttype: 'Identifier',\n\t\t\t\tname\n\t\t\t};\n\t\t\tparser.allow_whitespace();\n\n\t\t\tconst value = parser.eat(':')\n\t\t\t\t? (parser.allow_whitespace(), read_context(parser))\n\t\t\t\t: key;\n\n\t\t\tconst property: Property = {\n\t\t\t\tstart,\n\t\t\t\tend: value.end,\n\t\t\t\ttype: 'Property',\n\t\t\t\tkind: 'init',\n\t\t\t\tshorthand: value.type === 'Identifier' && value.name === name,\n\t\t\t\tkey,\n\t\t\t\tvalue\n\t\t\t};\n\n\t\t\tcontext.properties.push(property);\n\n\t\t\tparser.allow_whitespace();\n\t\t} while (parser.eat(','));\n\n\t\terror_on_assignment_pattern(parser);\n\t\tparser.eat('}', true);\n\t\tcontext.end = parser.index;\n\t}\n\n\telse if (parser.eat('...')) {\n\t\tconst name = parser.read_identifier();\n\t\tif (name) {\n\t\t\tcontext.type = 'RestIdentifier';\n\t\t\tcontext.end = parser.index;\n\t\t\tcontext.name = name;\n\t\t}\n\n\t\telse {\n\t\t\tparser.error({\n\t\t\t\tcode: 'invalid-context',\n\t\t\t\tmessage: 'Expected a rest pattern'\n\t\t\t});\n\t\t}\n\t}\n\n\telse {\n\t\tconst name = parser.read_identifier();\n\t\tif (name) {\n\t\t\tcontext.type = 'Identifier';\n\t\t\tcontext.end = parser.index;\n\t\t\tcontext.name = name;\n\t\t}\n\n\t\telse {\n\t\t\tparser.error({\n\t\t\t\tcode: 'invalid-context',\n\t\t\t\tmessage: 'Expected a name, array pattern or object pattern'\n\t\t\t});\n\t\t}\n\n\t\terror_on_assignment_pattern(parser);\n\t}\n\n\treturn context;\n}\n","import { whitespace } from './patterns';\n\nexport function trim_start(str: string) {\n\tlet i = 0;\n\twhile (whitespace.test(str[i])) i += 1;\n\n\treturn str.slice(i);\n}\n\nexport function trim_end(str: string) {\n\tlet i = str.length;\n\twhile (whitespace.test(str[i - 1])) i -= 1;\n\n\treturn str.slice(0, i);\n}\n","import read_context from '../read/context';\nimport read_expression from '../read/expression';\nimport { closing_tag_omitted } from '../utils/html';\nimport { whitespace } from '../../utils/patterns';\nimport { trim_start, trim_end } from '../../utils/trim';\nimport { Parser } from '../index';\nimport { TemplateNode } from '../../interfaces';\n\nfunction trim_whitespace(block: TemplateNode, trim_before: boolean, trim_after: boolean) {\n\tif (!block.children || block.children.length === 0) return; // AwaitBlock\n\n\tconst first_child = block.children[0];\n\tconst last_child = block.children[block.children.length - 1];\n\n\tif (first_child.type === 'Text' && trim_before) {\n\t\tfirst_child.data = trim_start(first_child.data);\n\t\tif (!first_child.data) block.children.shift();\n\t}\n\n\tif (last_child.type === 'Text' && trim_after) {\n\t\tlast_child.data = trim_end(last_child.data);\n\t\tif (!last_child.data) block.children.pop();\n\t}\n\n\tif (block.else) {\n\t\ttrim_whitespace(block.else, trim_before, trim_after);\n\t}\n\n\tif (first_child.elseif) {\n\t\ttrim_whitespace(first_child, trim_before, trim_after);\n\t}\n}\n\nexport default function mustache(parser: Parser) {\n\tconst start = parser.index;\n\tparser.index += 1;\n\n\tparser.allow_whitespace();\n\n\t// {/if}, {/each} or {/await}\n\tif (parser.eat('/')) {\n\t\tlet block = parser.current();\n\t\tlet expected;\n\n\t\tif (closing_tag_omitted(block.name)) {\n\t\t\tblock.end = start;\n\t\t\tparser.stack.pop();\n\t\t\tblock = parser.current();\n\t\t}\n\n\t\tif (block.type === 'ElseBlock' || block.type === 'PendingBlock' || block.type === 'ThenBlock' || block.type === 'CatchBlock') {\n\t\t\tblock.end = start;\n\t\t\tparser.stack.pop();\n\t\t\tblock = parser.current();\n\n\t\t\texpected = 'await';\n\t\t}\n\n\t\tif (block.type === 'IfBlock') {\n\t\t\texpected = 'if';\n\t\t} else if (block.type === 'EachBlock') {\n\t\t\texpected = 'each';\n\t\t} else if (block.type === 'AwaitBlock') {\n\t\t\texpected = 'await';\n\t\t} else {\n\t\t\tparser.error({\n\t\t\t\tcode: `unexpected-block-close`,\n\t\t\t\tmessage: `Unexpected block closing tag`\n\t\t\t});\n\t\t}\n\n\t\tparser.eat(expected, true);\n\t\tparser.allow_whitespace();\n\t\tparser.eat('}', true);\n\n\t\twhile (block.elseif) {\n\t\t\tblock.end = parser.index;\n\t\t\tparser.stack.pop();\n\t\t\tblock = parser.current();\n\n\t\t\tif (block.else) {\n\t\t\t\tblock.else.end = start;\n\t\t\t}\n\t\t}\n\n\t\t// strip leading/trailing whitespace as necessary\n\t\tconst char_before = parser.template[block.start - 1];\n\t\tconst char_after = parser.template[parser.index];\n\t\tconst trim_before = !char_before || whitespace.test(char_before);\n\t\tconst trim_after = !char_after || whitespace.test(char_after);\n\n\t\ttrim_whitespace(block, trim_before, trim_after);\n\n\t\tblock.end = parser.index;\n\t\tparser.stack.pop();\n\t} else if (parser.eat(':else')) {\n\t\tif (parser.eat('if')) {\n\t\t\tparser.error({\n\t\t\t\tcode: 'invalid-elseif',\n\t\t\t\tmessage: `'elseif' should be 'else if'`\n\t\t\t});\n\t\t}\n\n\t\tparser.allow_whitespace();\n\n\t\t// :else if\n\t\tif (parser.eat('if')) {\n\t\t\tconst block = parser.current();\n\t\t\tif (block.type !== 'IfBlock')\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-elseif-placement`,\n\t\t\t\t\tmessage: 'Cannot have an {:else if ...} block outside an {#if ...} block'\n\t\t\t\t});\n\n\t\t\tparser.require_whitespace();\n\n\t\t\tconst expression = read_expression(parser);\n\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\n\t\t\tblock.else = {\n\t\t\t\tstart: parser.index,\n\t\t\t\tend: null,\n\t\t\t\ttype: 'ElseBlock',\n\t\t\t\tchildren: [\n\t\t\t\t\t{\n\t\t\t\t\t\tstart: parser.index,\n\t\t\t\t\t\tend: null,\n\t\t\t\t\t\ttype: 'IfBlock',\n\t\t\t\t\t\telseif: true,\n\t\t\t\t\t\texpression,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\n\t\t\tparser.stack.push(block.else.children[0]);\n\t\t}\n\n\t\t// :else\n\t\telse {\n\t\t\tconst block = parser.current();\n\t\t\tif (block.type !== 'IfBlock' && block.type !== 'EachBlock') {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-else-placement`,\n\t\t\t\t\tmessage: 'Cannot have an {:else} block outside an {#if ...} or {#each ...} block'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\n\t\t\tblock.else = {\n\t\t\t\tstart: parser.index,\n\t\t\t\tend: null,\n\t\t\t\ttype: 'ElseBlock',\n\t\t\t\tchildren: [],\n\t\t\t};\n\n\t\t\tparser.stack.push(block.else);\n\t\t}\n\t} else if (parser.match(':then') || parser.match(':catch')) {\n\t\tconst block = parser.current();\n\t\tconst is_then = parser.eat(':then') || !parser.eat(':catch');\n\n\t\tif (is_then) {\n\t\t\tif (block.type !== 'PendingBlock') {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-then-placement`,\n\t\t\t\t\tmessage: 'Cannot have an {:then} block outside an {#await ...} block'\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif (block.type !== 'ThenBlock' && block.type !== 'PendingBlock') {\n\t\t\t\tparser.error({\n\t\t\t\t\tcode: `invalid-catch-placement`,\n\t\t\t\t\tmessage: 'Cannot have an {:catch} block outside an {#await ...} block'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tblock.end = start;\n\t\tparser.stack.pop();\n\t\tconst await_block = parser.current();\n\n\t\tif (!parser.eat('}')) {\n\t\t\tparser.require_whitespace();\n\t\t\tawait_block[is_then ? 'value': 'error'] = parser.read_identifier();\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\t\t}\n\n\t\tconst new_block: TemplateNode = {\n\t\t\tstart,\n\t\t\tend: null,\n\t\t\ttype: is_then ? 'ThenBlock': 'CatchBlock',\n\t\t\tchildren: [],\n\t\t\tskip: false\n\t\t};\n\n\t\tawait_block[is_then ? 'then' : 'catch'] = new_block;\n\t\tparser.stack.push(new_block);\n\t} else if (parser.eat('#')) {\n\t\t// {#if foo}, {#each foo} or {#await foo}\n\t\tlet type;\n\n\t\tif (parser.eat('if')) {\n\t\t\ttype = 'IfBlock';\n\t\t} else if (parser.eat('each')) {\n\t\t\ttype = 'EachBlock';\n\t\t} else if (parser.eat('await')) {\n\t\t\ttype = 'AwaitBlock';\n\t\t} else {\n\t\t\tparser.error({\n\t\t\t\tcode: `expected-block-type`,\n\t\t\t\tmessage: `Expected if, each or await`\n\t\t\t});\n\t\t}\n\n\t\tparser.require_whitespace();\n\n\t\tconst expression = read_expression(parser);\n\n\t\tconst block: TemplateNode = type === 'AwaitBlock' ?\n\t\t\t{\n\t\t\t\tstart,\n\t\t\t\tend: null,\n\t\t\t\ttype,\n\t\t\t\texpression,\n\t\t\t\tvalue: null,\n\t\t\t\terror: null,\n\t\t\t\tpending: {\n\t\t\t\t\tstart: null,\n\t\t\t\t\tend: null,\n\t\t\t\t\ttype: 'PendingBlock',\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tskip: true\n\t\t\t\t},\n\t\t\t\tthen: {\n\t\t\t\t\tstart: null,\n\t\t\t\t\tend: null,\n\t\t\t\t\ttype: 'ThenBlock',\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tskip: true\n\t\t\t\t},\n\t\t\t\tcatch: {\n\t\t\t\t\tstart: null,\n\t\t\t\t\tend: null,\n\t\t\t\t\ttype: 'CatchBlock',\n\t\t\t\t\tchildren: [],\n\t\t\t\t\tskip: true\n\t\t\t\t},\n\t\t\t} :\n\t\t\t{\n\t\t\t\tstart,\n\t\t\t\tend: null,\n\t\t\t\ttype,\n\t\t\t\texpression,\n\t\t\t\tchildren: [],\n\t\t\t};\n\n\t\tparser.allow_whitespace();\n\n\t\t// {#each} blocks must declare a context – {#each list as item}\n\t\tif (type === 'EachBlock') {\n\t\t\tparser.eat('as', true);\n\t\t\tparser.require_whitespace();\n\n\t\t\tblock.context = read_context(parser);\n\n\t\t\tparser.allow_whitespace();\n\n\t\t\tif (parser.eat(',')) {\n\t\t\t\tparser.allow_whitespace();\n\t\t\t\tblock.index = parser.read_identifier();\n\t\t\t\tif (!block.index) parser.error({\n\t\t\t\t\tcode: `expected-name`,\n\t\t\t\t\tmessage: `Expected name`\n\t\t\t\t});\n\n\t\t\t\tparser.allow_whitespace();\n\t\t\t}\n\n\t\t\tif (parser.eat('(')) {\n\t\t\t\tparser.allow_whitespace();\n\n\t\t\t\tblock.key = read_expression(parser);\n\t\t\t\tparser.allow_whitespace();\n\t\t\t\tparser.eat(')', true);\n\t\t\t\tparser.allow_whitespace();\n\t\t\t}\n\t\t}\n\n\t\tconst await_block_shorthand = type === 'AwaitBlock' && parser.eat('then');\n\t\tif (await_block_shorthand) {\n\t\t\tparser.require_whitespace();\n\t\t\tblock.value = parser.read_identifier();\n\t\t\tparser.allow_whitespace();\n\t\t}\n\n\t\tparser.eat('}', true);\n\n\t\tparser.current().children.push(block);\n\t\tparser.stack.push(block);\n\n\t\tif (type === 'AwaitBlock') {\n\t\t\tlet child_block;\n\t\t\tif (await_block_shorthand) {\n\t\t\t\tblock.then.skip = false;\n\t\t\t\tchild_block = block.then;\n\t\t\t} else {\n\t\t\t\tblock.pending.skip = false;\n\t\t\t\tchild_block = block.pending;\n\t\t\t}\n\n\t\t\tchild_block.start = parser.index;\n\t\t\tparser.stack.push(child_block);\n\t\t}\n\t} else if (parser.eat('@html')) {\n\t\t// {@html content} tag\n\t\tparser.require_whitespace();\n\n\t\tconst expression = read_expression(parser);\n\n\t\tparser.allow_whitespace();\n\t\tparser.eat('}', true);\n\n\t\tparser.current().children.push({\n\t\t\tstart,\n\t\t\tend: parser.index,\n\t\t\ttype: 'RawMustacheTag',\n\t\t\texpression,\n\t\t});\n\t} else if (parser.eat('@debug')) {\n\t\tlet identifiers;\n\n\t\t// Implies {@debug} which indicates \"debug all\"\n\t\tif (parser.read(/\\s*}/)) {\n\t\t\tidentifiers = [];\n\t\t} else {\n\t\t\tconst expression = read_expression(parser);\n\n\t\t\tidentifiers = expression.type === 'SequenceExpression'\n\t\t\t\t? expression.expressions\n\t\t\t\t: [expression];\n\n\t\t\tidentifiers.forEach(node => {\n\t\t\t\tif (node.type !== 'Identifier') {\n\t\t\t\t\tparser.error({\n\t\t\t\t\t\tcode: 'invalid-debug-args',\n\t\t\t\t\t\tmessage: '{@debug ...} arguments must be identifiers, not arbitrary expressions'\n\t\t\t\t\t}, node.start);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tparser.allow_whitespace();\n\t\t\tparser.eat('}', true);\n\t\t}\n\n\t\tparser.current().children.push({\n\t\t\tstart,\n\t\t\tend: parser.index,\n\t\t\ttype: 'DebugTag',\n\t\t\tidentifiers\n\t\t});\n\t} else {\n\t\tconst expression = read_expression(parser);\n\n\t\tparser.allow_whitespace();\n\t\tparser.eat('}', true);\n\n\t\tparser.current().children.push({\n\t\t\tstart,\n\t\t\tend: parser.index,\n\t\t\ttype: 'MustacheTag',\n\t\t\texpression,\n\t\t});\n\t}\n}\n","function getLocator(source, options) {\n if (options === void 0) { options = {}; }\n var offsetLine = options.offsetLine || 0;\n var offsetColumn = options.offsetColumn || 0;\n var originalLines = source.split('\\n');\n var start = 0;\n var lineRanges = originalLines.map(function (line, i) {\n var end = start + line.length + 1;\n var range = { start: start, end: end, line: i };\n start = end;\n return range;\n });\n var i = 0;\n function rangeContains(range, index) {\n return range.start <= index && index < range.end;\n }\n function getLocation(range, index) {\n return { line: offsetLine + range.line, column: offsetColumn + index - range.start, character: index };\n }\n function locate(search, startIndex) {\n if (typeof search === 'string') {\n search = source.indexOf(search, startIndex || 0);\n }\n var range = lineRanges[i];\n var d = search >= range.end ? 1 : -1;\n while (range) {\n if (rangeContains(range, search))\n return getLocation(range, search);\n i += d;\n range = lineRanges[i];\n }\n }\n ;\n return locate;\n}\nfunction locate(source, search, options) {\n if (typeof options === 'number') {\n throw new Error('locate takes a { startIndex, offsetLine, offsetColumn } object as the third argument');\n }\n return getLocator(source, options)(search, options && options.startIndex);\n}\n\nexport { getLocator, locate };","function tabs_to_spaces(str: string) {\n\treturn str.replace(/^\\t+/, match => match.split('\\t').join(' '));\n}\n\nexport default function get_code_frame(\n\tsource: string,\n\tline: number,\n\tcolumn: number\n) {\n\tconst lines = source.split('\\n');\n\n\tconst frame_start = Math.max(0, line - 2);\n\tconst frame_end = Math.min(line + 3, lines.length);\n\n\tconst digits = String(frame_end + 1).length;\n\n\treturn lines\n\t\t.slice(frame_start, frame_end)\n\t\t.map((str, i) => {\n\t\t\tconst isErrorLine = frame_start + i === line;\n\t\t\tconst line_num = String(i + frame_start + 1).padStart(digits, ' ');\n\n\t\t\tif (isErrorLine) {\n\t\t\t\tconst indicator = ' '.repeat(digits + 2 + tabs_to_spaces(str.slice(0, column)).length) + '^';\n\t\t\t\treturn `${line_num}: ${tabs_to_spaces(str)}\\n${indicator}`;\n\t\t\t}\n\n\t\t\treturn `${line_num}: ${tabs_to_spaces(str)}`;\n\t\t})\n\t\t.join('\\n');\n}\n","import { locate } from 'locate-character';\nimport get_code_frame from './get_code_frame';\n\nclass CompileError extends Error {\n\tcode: string;\n\tstart: { line: number; column: number };\n\tend: { line: number; column: number };\n\tpos: number;\n\tfilename: string;\n\tframe: string;\n\n\ttoString() {\n\t\treturn `${this.message} (${this.start.line}:${this.start.column})\\n${this.frame}`;\n\t}\n}\n\nexport default function error(message: string, props: {\n\tname: string;\n\tcode: string;\n\tsource: string;\n\tfilename: string;\n\tstart: number;\n\tend?: number;\n}) {\n\tconst error = new CompileError(message);\n\terror.name = props.name;\n\n\tconst start = locate(props.source, props.start, { offsetLine: 1 });\n\tconst end = locate(props.source, props.end || props.start, { offsetLine: 1 });\n\n\terror.code = props.code;\n\terror.start = start;\n\terror.end = end;\n\terror.pos = props.start;\n\terror.filename = props.filename;\n\n\terror.frame = get_code_frame(props.source, start.line - 1, start.column);\n\n\tthrow error;\n}","import { isIdentifierStart, isIdentifierChar } from 'acorn';\nimport fragment from './state/fragment';\nimport { whitespace } from '../utils/patterns';\nimport { reserved } from '../utils/names';\nimport full_char_code_at from '../utils/full_char_code_at';\nimport { TemplateNode, Ast, ParserOptions, Fragment, Style, Script } from '../interfaces';\nimport error from '../utils/error';\n\ntype ParserState = (parser: Parser) => (ParserState | void);\n\nexport class Parser {\n\treadonly template: string;\n\treadonly filename?: string;\n\treadonly customElement: boolean;\n\n\tindex = 0;\n\tstack: TemplateNode[] = [];\n\n\thtml: Fragment;\n\tcss: Style[] = [];\n\tjs: Script[] = [];\n\tmeta_tags = {};\n\n\tconstructor(template: string, options: ParserOptions) {\n\t\tif (typeof template !== 'string') {\n\t\t\tthrow new TypeError('Template must be a string');\n\t\t}\n\n\t\tthis.template = template.replace(/\\s+$/, '');\n\t\tthis.filename = options.filename;\n\t\tthis.customElement = options.customElement;\n\n\t\tthis.html = {\n\t\t\tstart: null,\n\t\t\tend: null,\n\t\t\ttype: 'Fragment',\n\t\t\tchildren: [],\n\t\t};\n\n\t\tthis.stack.push(this.html);\n\n\t\tlet state: ParserState = fragment;\n\n\t\twhile (this.index < this.template.length) {\n\t\t\tstate = state(this) || fragment;\n\t\t}\n\n\t\tif (this.stack.length > 1) {\n\t\t\tconst current = this.current();\n\n\t\t\tconst type = current.type === 'Element' ? `<${current.name}>` : 'Block';\n\t\t\tconst slug = current.type === 'Element' ? 'element' : 'block';\n\n\t\t\tthis.error({\n\t\t\t\tcode: `unclosed-${slug}`,\n\t\t\t\tmessage: `${type} was left open`\n\t\t\t}, current.start);\n\t\t}\n\n\t\tif (state !== fragment) {\n\t\t\tthis.error({\n\t\t\t\tcode: `unexpected-eof`,\n\t\t\t\tmessage: 'Unexpected end of input'\n\t\t\t});\n\t\t}\n\n\t\tif (this.html.children.length) {\n\t\t\tlet start = this.html.children[0].start;\n\t\t\twhile (whitespace.test(template[start])) start += 1;\n\n\t\t\tlet end = this.html.children[this.html.children.length - 1].end;\n\t\t\twhile (whitespace.test(template[end - 1])) end -= 1;\n\n\t\t\tthis.html.start = start;\n\t\t\tthis.html.end = end;\n\t\t} else {\n\t\t\tthis.html.start = this.html.end = null;\n\t\t}\n\t}\n\n\tcurrent() {\n\t\treturn this.stack[this.stack.length - 1];\n\t}\n\n\tacorn_error(err: any) {\n\t\tthis.error({\n\t\t\tcode: `parse-error`,\n\t\t\tmessage: err.message.replace(/ \\(\\d+:\\d+\\)$/, '')\n\t\t}, err.pos);\n\t}\n\n\terror({ code, message }: { code: string; message: string }, index = this.index) {\n\t\terror(message, {\n\t\t\tname: 'ParseError',\n\t\t\tcode,\n\t\t\tsource: this.template,\n\t\t\tstart: index,\n\t\t\tfilename: this.filename\n\t\t});\n\t}\n\n\teat(str: string, required?: boolean, message?: string) {\n\t\tif (this.match(str)) {\n\t\t\tthis.index += str.length;\n\t\t\treturn true;\n\t\t}\n\n\t\tif (required) {\n\t\t\tthis.error({\n\t\t\t\tcode: `unexpected-${this.index === this.template.length ? 'eof' : 'token'}`,\n\t\t\t\tmessage: message || `Expected ${str}`\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tmatch(str: string) {\n\t\treturn this.template.slice(this.index, this.index + str.length) === str;\n\t}\n\n\tmatch_regex(pattern: RegExp) {\n\t\tconst match = pattern.exec(this.template.slice(this.index));\n\t\tif (!match || match.index !== 0) return null;\n\n\t\treturn match[0];\n\t}\n\n\tallow_whitespace() {\n\t\twhile (\n\t\t\tthis.index < this.template.length &&\n\t\t\twhitespace.test(this.template[this.index])\n\t\t) {\n\t\t\tthis.index++;\n\t\t}\n\t}\n\n\tread(pattern: RegExp) {\n\t\tconst result = this.match_regex(pattern);\n\t\tif (result) this.index += result.length;\n\t\treturn result;\n\t}\n\n\tread_identifier() {\n\t\tconst start = this.index;\n\n\t\tlet i = this.index;\n\n\t\tconst code = full_char_code_at(this.template, i);\n\t\tif (!isIdentifierStart(code, true)) return null;\n\n\t\ti += code <= 0xffff ? 1 : 2;\n\n\t\twhile (i < this.template.length) {\n\t\t\tconst code = full_char_code_at(this.template, i);\n\n\t\t\tif (!isIdentifierChar(code, true)) break;\n\t\t\ti += code <= 0xffff ? 1 : 2;\n\t\t}\n\n\t\tconst identifier = this.template.slice(this.index, this.index = i);\n\n\t\tif (reserved.has(identifier)) {\n\t\t\tthis.error({\n\t\t\t\tcode: `unexpected-reserved-word`,\n\t\t\t\tmessage: `'${identifier}' is a reserved word in JavaScript and cannot be used here`\n\t\t\t}, start);\n\t\t}\n\n\t\treturn identifier;\n\t}\n\n\tread_until(pattern: RegExp) {\n\t\tif (this.index >= this.template.length)\n\t\t\tthis.error({\n\t\t\t\tcode: `unexpected-eof`,\n\t\t\t\tmessage: 'Unexpected end of input'\n\t\t\t});\n\n\t\tconst start = this.index;\n\t\tconst match = pattern.exec(this.template.slice(start));\n\n\t\tif (match) {\n\t\t\tthis.index = start + match.index;\n\t\t\treturn this.template.slice(start, this.index);\n\t\t}\n\n\t\tthis.index = this.template.length;\n\t\treturn this.template.slice(start);\n\t}\n\n\trequire_whitespace() {\n\t\tif (!whitespace.test(this.template[this.index])) {\n\t\t\tthis.error({\n\t\t\t\tcode: `missing-whitespace`,\n\t\t\t\tmessage: `Expected whitespace`\n\t\t\t});\n\t\t}\n\n\t\tthis.allow_whitespace();\n\t}\n}\n\nexport default function parse(\n\ttemplate: string,\n\toptions: ParserOptions = {}\n): Ast {\n\tconst parser = new Parser(template, options);\n\n\t// TODO we may want to allow multiple <style> tags —\n\t// one scoped, one global. for now, only allow one\n\tif (parser.css.length > 1) {\n\t\tparser.error({\n\t\t\tcode: 'duplicate-style',\n\t\t\tmessage: 'You can only have one top-level <style> tag per component'\n\t\t}, parser.css[1].start);\n\t}\n\n\tconst instance_scripts = parser.js.filter(script => script.context === 'default');\n\tconst module_scripts = parser.js.filter(script => script.context === 'module');\n\n\tif (instance_scripts.length > 1) {\n\t\tparser.error({\n\t\t\tcode: `invalid-script`,\n\t\t\tmessage: `A component can only have one instance-level <script> element`\n\t\t}, instance_scripts[1].start);\n\t}\n\n\tif (module_scripts.length > 1) {\n\t\tparser.error({\n\t\t\tcode: `invalid-script`,\n\t\t\tmessage: `A component can only have one <script context=\"module\"> element`\n\t\t}, module_scripts[1].start);\n\t}\n\n\treturn {\n\t\thtml: parser.html,\n\t\tcss: parser.css[0],\n\t\tinstance: instance_scripts[0],\n\t\tmodule: module_scripts[0]\n\t};\n}\n","import Wrapper from './shared/Wrapper';\nimport Renderer from '../Renderer';\nimport Block from '../Block';\nimport AwaitBlock from '../../nodes/AwaitBlock';\nimport create_debugging_comment from './shared/create_debugging_comment';\nimport { b, x } from 'code-red';\nimport FragmentWrapper from './Fragment';\nimport PendingBlock from '../../nodes/PendingBlock';\nimport ThenBlock from '../../nodes/ThenBlock';\nimport CatchBlock from '../../nodes/CatchBlock';\nimport { Identifier } from 'estree';\n\nclass AwaitBlockBranch extends Wrapper {\n\tnode: PendingBlock | ThenBlock | CatchBlock;\n\tblock: Block;\n\tfragment: FragmentWrapper;\n\tis_dynamic: boolean;\n\n\tvar = null;\n\n\tconstructor(\n\t\tstatus: string,\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: AwaitBlock,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tthis.block = block.child({\n\t\t\tcomment: create_debugging_comment(node, this.renderer.component),\n\t\t\tname: this.renderer.component.get_unique_name(`create_${status}_block`),\n\t\t\ttype: status\n\t\t});\n\n\t\tthis.fragment = new FragmentWrapper(\n\t\t\trenderer,\n\t\t\tthis.block,\n\t\t\tthis.node.children,\n\t\t\tparent,\n\t\t\tstrip_whitespace,\n\t\t\tnext_sibling\n\t\t);\n\n\t\tthis.is_dynamic = this.block.dependencies.size > 0;\n\t}\n}\n\nexport default class AwaitBlockWrapper extends Wrapper {\n\tnode: AwaitBlock;\n\n\tpending: AwaitBlockBranch;\n\tthen: AwaitBlockBranch;\n\tcatch: AwaitBlockBranch;\n\n\tvar: Identifier = { type: 'Identifier', name: 'await_block' };\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: AwaitBlock,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tthis.cannot_use_innerhtml();\n\t\tthis.not_static_content();\n\n\t\tblock.add_dependencies(this.node.expression.dependencies);\n\t\tif (this.node.value) block.renderer.add_to_context(this.node.value, true);\n\t\tif (this.node.error) block.renderer.add_to_context(this.node.error, true);\n\n\t\tlet is_dynamic = false;\n\t\tlet has_intros = false;\n\t\tlet has_outros = false;\n\n\t\t['pending', 'then', 'catch'].forEach(status => {\n\t\t\tconst child = this.node[status];\n\n\t\t\tconst branch = new AwaitBlockBranch(\n\t\t\t\tstatus,\n\t\t\t\trenderer,\n\t\t\t\tblock,\n\t\t\t\tthis,\n\t\t\t\tchild,\n\t\t\t\tstrip_whitespace,\n\t\t\t\tnext_sibling\n\t\t\t);\n\n\t\t\trenderer.blocks.push(branch.block);\n\n\t\t\tif (branch.is_dynamic) {\n\t\t\t\tis_dynamic = true;\n\t\t\t\t// TODO should blocks update their own parents?\n\t\t\t\tblock.add_dependencies(branch.block.dependencies);\n\t\t\t}\n\n\t\t\tif (branch.block.has_intros) has_intros = true;\n\t\t\tif (branch.block.has_outros) has_outros = true;\n\n\t\t\tthis[status] = branch;\n\t\t});\n\n\t\tthis.pending.block.has_update_method = is_dynamic;\n\t\tthis.then.block.has_update_method = is_dynamic;\n\t\tthis.catch.block.has_update_method = is_dynamic;\n\n\t\tthis.pending.block.has_intro_method = has_intros;\n\t\tthis.then.block.has_intro_method = has_intros;\n\t\tthis.catch.block.has_intro_method = has_intros;\n\n\t\tthis.pending.block.has_outro_method = has_outros;\n\t\tthis.then.block.has_outro_method = has_outros;\n\t\tthis.catch.block.has_outro_method = has_outros;\n\n\t\tif (has_outros) {\n\t\t\tblock.add_outro();\n\t\t}\n\t}\n\n\trender(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\tparent_nodes: Identifier\n\t) {\n\t\tconst anchor = this.get_or_create_anchor(block, parent_node, parent_nodes);\n\t\tconst update_mount_node = this.get_update_mount_node(anchor);\n\n\t\tconst snippet = this.node.expression.manipulate(block);\n\n\t\tconst info = block.get_unique_name(`info`);\n\t\tconst promise = block.get_unique_name(`promise`);\n\n\t\tblock.add_variable(promise);\n\n\t\tblock.maintain_context = true;\n\n\t\tconst value_index = this.node.value && block.renderer.context_lookup.get(this.node.value).index;\n\t\tconst error_index = this.node.error && block.renderer.context_lookup.get(this.node.error).index;\n\n\t\tconst info_props: any = x`{\n\t\t\tctx: #ctx,\n\t\t\tcurrent: null,\n\t\t\ttoken: null,\n\t\t\tpending: ${this.pending.block.name},\n\t\t\tthen: ${this.then.block.name},\n\t\t\tcatch: ${this.catch.block.name},\n\t\t\tvalue: ${value_index},\n\t\t\terror: ${error_index},\n\t\t\tblocks: ${this.pending.block.has_outro_method && x`[,,,]`}\n\t\t}`;\n\n\t\tblock.chunks.init.push(b`\n\t\t\tlet ${info} = ${info_props};\n\t\t`);\n\n\t\tblock.chunks.init.push(b`\n\t\t\t@handle_promise(${promise} = ${snippet}, ${info});\n\t\t`);\n\n\t\tblock.chunks.create.push(b`\n\t\t\t${info}.block.c();\n\t\t`);\n\n\t\tif (parent_nodes && this.renderer.options.hydratable) {\n\t\t\tblock.chunks.claim.push(b`\n\t\t\t\t${info}.block.l(${parent_nodes});\n\t\t\t`);\n\t\t}\n\n\t\tconst initial_mount_node = parent_node || '#target';\n\t\tconst anchor_node = parent_node ? 'null' : 'anchor';\n\n\t\tconst has_transitions = this.pending.block.has_intro_method || this.pending.block.has_outro_method;\n\n\t\tblock.chunks.mount.push(b`\n\t\t\t${info}.block.m(${initial_mount_node}, ${info}.anchor = ${anchor_node});\n\t\t\t${info}.mount = () => ${update_mount_node};\n\t\t\t${info}.anchor = ${anchor};\n\t\t`);\n\n\t\tif (has_transitions) {\n\t\t\tblock.chunks.intro.push(b`@transition_in(${info}.block);`);\n\t\t}\n\n\t\tconst dependencies = this.node.expression.dynamic_dependencies();\n\n\t\tif (dependencies.length > 0) {\n\t\t\tconst condition = x`\n\t\t\t\t${block.renderer.dirty(dependencies)} &&\n\t\t\t\t${promise} !== (${promise} = ${snippet}) &&\n\t\t\t\t@handle_promise(${promise}, ${info})`;\n\n\t\t\tblock.chunks.update.push(\n\t\t\t\tb`${info}.ctx = #ctx;`\n\t\t\t);\n\n\t\t\tif (this.pending.block.has_update_method) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${condition}) {\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst #child_ctx = #ctx.slice();\n\t\t\t\t\t\t${this.node.value && x`#child_ctx[${value_index}] = ${info}.resolved;`}\n\t\t\t\t\t\t${info}.block.p(#child_ctx, #dirty);\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\t${condition}\n\t\t\t\t`);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.pending.block.has_update_method) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\t{\n\t\t\t\t\t\tconst #child_ctx = #ctx.slice();\n\t\t\t\t\t\t${this.node.value && x`#child_ctx[${value_index}] = ${info}.resolved;`}\n\t\t\t\t\t\t${info}.block.p(#child_ctx, #dirty);\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\t\t}\n\n\t\tif (this.pending.block.has_outro_method) {\n\t\t\tblock.chunks.outro.push(b`\n\t\t\t\tfor (let #i = 0; #i < 3; #i += 1) {\n\t\t\t\t\tconst block = ${info}.blocks[#i];\n\t\t\t\t\t@transition_out(block);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tblock.chunks.destroy.push(b`\n\t\t\t${info}.block.d(${parent_node ? null : 'detaching'});\n\t\t\t${info}.token = null;\n\t\t\t${info} = null;\n\t\t`);\n\n\t\t[this.pending, this.then, this.catch].forEach(branch => {\n\t\t\tbranch.fragment.render(branch.block, null, x`#nodes` as Identifier);\n\t\t});\n\t}\n}\n","import EventHandler from '../../../nodes/EventHandler';\nimport Wrapper from '../shared/Wrapper';\nimport Block from '../../Block';\nimport { b, x, p } from 'code-red';\nimport { Expression } from 'estree';\n\nconst TRUE = x`true`;\nconst FALSE = x`false`;\n\nexport default class EventHandlerWrapper {\n\tnode: EventHandler;\n\tparent: Wrapper;\n\n\tconstructor(node: EventHandler, parent: Wrapper) {\n\t\tthis.node = node;\n\t\tthis.parent = parent;\n\n\t\tif (!node.expression) {\n\t\t\tthis.parent.renderer.add_to_context(node.handler_name.name);\n\n\t\t\tthis.parent.renderer.component.partly_hoisted.push(b`\n\t\t\t\tfunction ${node.handler_name.name}(event) {\n\t\t\t\t\t@bubble($$self, event);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\t}\n\n\tget_snippet(block) {\n\t\tconst snippet = this.node.expression ? this.node.expression.manipulate(block) : block.renderer.reference(this.node.handler_name);\n\n\t\tif (this.node.reassigned) {\n\t\t\tblock.maintain_context = true;\n\t\t\treturn x`function () { if (@is_function(${snippet})) ${snippet}.apply(this, arguments); }`;\n\t\t}\n\t\treturn snippet;\n\t}\n\n\trender(block: Block, target: string | Expression) {\n\t\tlet snippet = this.get_snippet(block);\n\n\t\tif (this.node.modifiers.has('preventDefault')) snippet = x`@prevent_default(${snippet})`;\n\t\tif (this.node.modifiers.has('stopPropagation')) snippet = x`@stop_propagation(${snippet})`;\n\t\tif (this.node.modifiers.has('self')) snippet = x`@self(${snippet})`;\n\n\t\tconst args = [];\n\n\t\tconst opts = ['passive', 'once', 'capture'].filter(mod => this.node.modifiers.has(mod));\n\t\tif (opts.length) {\n\t\t\targs.push((opts.length === 1 && opts[0] === 'capture')\n\t\t\t\t? TRUE\n\t\t\t\t: x`{ ${opts.map(opt => p`${opt}: true`)} }`);\n\t\t} else if (block.renderer.options.dev) {\n\t\t\targs.push(FALSE);\n\t\t}\n\n\t\tif (block.renderer.options.dev) {\n\t\t\targs.push(this.node.modifiers.has('preventDefault') ? TRUE : FALSE);\n\t\t\targs.push(this.node.modifiers.has('stopPropagation') ? TRUE : FALSE);\n\t\t}\n\n\t\tblock.event_listeners.push(\n\t\t\tx`@listen(${target}, \"${this.node.name}\", ${snippet}, ${args})`\n\t\t);\n\t}\n}\n","import Block from '../../Block';\nimport EventHandler from '../Element/EventHandler';\nimport { Expression } from 'estree';\n\nexport default function add_event_handlers(\n\tblock: Block,\n\ttarget: string | Expression,\n\thandlers: EventHandler[]\n) {\n\thandlers.forEach(handler => add_event_handler(block, target, handler));\n}\n\nexport function add_event_handler(\n\tblock: Block,\n\ttarget: string | Expression,\n\thandler: EventHandler\n) {\n\thandler.render(block, target);\n}\n","import Renderer from '../Renderer';\nimport Block from '../Block';\nimport Wrapper from './shared/Wrapper';\nimport create_debugging_comment from './shared/create_debugging_comment';\nimport EachBlock from '../../nodes/EachBlock';\nimport FragmentWrapper from './Fragment';\nimport { b, x } from 'code-red';\nimport ElseBlock from '../../nodes/ElseBlock';\nimport { Identifier, Node } from 'estree';\n\nexport class ElseBlockWrapper extends Wrapper {\n\tnode: ElseBlock;\n\tblock: Block;\n\tfragment: FragmentWrapper;\n\tis_dynamic: boolean;\n\n\tvar = null;\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: ElseBlock,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tthis.block = block.child({\n\t\t\tcomment: create_debugging_comment(node, this.renderer.component),\n\t\t\tname: this.renderer.component.get_unique_name(`create_else_block`),\n\t\t\ttype: 'else'\n\t\t});\n\n\t\tthis.fragment = new FragmentWrapper(\n\t\t\trenderer,\n\t\t\tthis.block,\n\t\t\tthis.node.children,\n\t\t\tparent,\n\t\t\tstrip_whitespace,\n\t\t\tnext_sibling\n\t\t);\n\n\t\tthis.is_dynamic = this.block.dependencies.size > 0;\n\t}\n}\n\nexport default class EachBlockWrapper extends Wrapper {\n\tblock: Block;\n\tnode: EachBlock;\n\tfragment: FragmentWrapper;\n\telse?: ElseBlockWrapper;\n\tvars: {\n\t\tcreate_each_block: Identifier;\n\t\teach_block_value: Identifier;\n\t\tget_each_context: Identifier;\n\t\titerations: Identifier;\n\t\tfixed_length: number;\n\t\tdata_length: string;\n\t\tview_length: string;\n\t}\n\n\tcontext_props: Array<Node | Node[]>;\n\tindex_name: Identifier;\n\n\tvar: Identifier = { type: 'Identifier', name: 'each' };\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: EachBlock,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\t\tthis.cannot_use_innerhtml();\n\t\tthis.not_static_content();\n\n\t\tconst { dependencies } = node.expression;\n\t\tblock.add_dependencies(dependencies);\n\n\t\tthis.node.contexts.forEach(context => {\n\t\t\trenderer.add_to_context(context.key.name, true);\n\t\t});\n\n\t\tthis.block = block.child({\n\t\t\tcomment: create_debugging_comment(this.node, this.renderer.component),\n\t\t\tname: renderer.component.get_unique_name('create_each_block'),\n\t\t\ttype: 'each',\n\t\t\t// @ts-ignore todo: probably error\n\t\t\tkey: node.key as string,\n\n\t\t\tbindings: new Map(block.bindings)\n\t\t});\n\n\t\t// TODO this seems messy\n\t\tthis.block.has_animation = this.node.has_animation;\n\n\t\tthis.index_name = this.node.index\n\t\t\t? { type: 'Identifier', name: this.node.index }\n\t\t\t: renderer.component.get_unique_name(`${this.node.context}_index`);\n\n\t\tconst fixed_length =\n\t\t\tnode.expression.node.type === 'ArrayExpression' &&\n\t\t\tnode.expression.node.elements.every(element => element.type !== 'SpreadElement')\n\t\t\t\t? node.expression.node.elements.length\n\t\t\t\t: null;\n\n\t\t// hack the sourcemap, so that if data is missing the bug\n\t\t// is easy to find\n\t\tlet c = this.node.start + 2;\n\t\twhile (renderer.component.source[c] !== 'e') c += 1;\n\t\tconst start = renderer.component.locate(c);\n\t\tconst end = { line: start.line, column: start.column + 4 };\n\t\tconst length = {\n\t\t\ttype: 'Identifier',\n\t\t\tname: 'length',\n\t\t\tloc: { start, end }\n\t\t};\n\n\t\tconst each_block_value = renderer.component.get_unique_name(`${this.var.name}_value`);\n\t\tconst iterations = block.get_unique_name(`${this.var.name}_blocks`);\n\n\t\trenderer.add_to_context(each_block_value.name, true);\n\t\trenderer.add_to_context(this.index_name.name, true);\n\n\t\tthis.vars = {\n\t\t\tcreate_each_block: this.block.name,\n\t\t\teach_block_value,\n\t\t\tget_each_context: renderer.component.get_unique_name(`get_${this.var.name}_context`),\n\t\t\titerations,\n\n\t\t\t// optimisation for array literal\n\t\t\tfixed_length,\n\t\t\tdata_length: fixed_length === null ? x`${each_block_value}.${length}` : fixed_length,\n\t\t\tview_length: fixed_length === null ? x`${iterations}.length` : fixed_length\n\t\t};\n\n\t\tconst store =\n\t\t\tnode.expression.node.type === 'Identifier' &&\n\t\t\tnode.expression.node.name[0] === '$'\n\t\t\t\t? node.expression.node.name.slice(1)\n\t\t\t\t: null;\n\n\t\tnode.contexts.forEach(prop => {\n\t\t\tthis.block.bindings.set(prop.key.name, {\n\t\t\t\tobject: this.vars.each_block_value,\n\t\t\t\tproperty: this.index_name,\n\t\t\t\tmodifier: prop.modifier,\n\t\t\t\tsnippet: prop.modifier(x`${this.vars.each_block_value}[${this.index_name}]` as Node),\n\t\t\t\tstore,\n\t\t\t\ttail: prop.modifier(x`[${this.index_name}]` as Node)\n\t\t\t});\n\t\t});\n\n\t\tif (this.node.index) {\n\t\t\tthis.block.get_unique_name(this.node.index); // this prevents name collisions (#1254)\n\t\t}\n\n\t\trenderer.blocks.push(this.block);\n\n\t\tthis.fragment = new FragmentWrapper(renderer, this.block, node.children, this, strip_whitespace, next_sibling);\n\n\t\tif (this.node.else) {\n\t\t\tthis.else = new ElseBlockWrapper(\n\t\t\t\trenderer,\n\t\t\t\tblock,\n\t\t\t\tthis,\n\t\t\t\tthis.node.else,\n\t\t\t\tstrip_whitespace,\n\t\t\t\tnext_sibling\n\t\t\t);\n\n\t\t\trenderer.blocks.push(this.else.block);\n\n\t\t\tif (this.else.is_dynamic) {\n\t\t\t\tthis.block.add_dependencies(this.else.block.dependencies);\n\t\t\t}\n\t\t}\n\n\t\tblock.add_dependencies(this.block.dependencies);\n\n\t\tif (this.block.has_outros || (this.else && this.else.block.has_outros)) {\n\t\t\tblock.add_outro();\n\t\t}\n\t}\n\n\trender(block: Block, parent_node: Identifier, parent_nodes: Identifier) {\n\t\tif (this.fragment.nodes.length === 0) return;\n\n\t\tconst { renderer } = this;\n\t\tconst { component } = renderer;\n\n\t\tconst needs_anchor = this.next\n\t\t\t? !this.next.is_dom_node() :\n\t\t\t!parent_node || !this.parent.is_dom_node();\n\n\t\tthis.context_props = this.node.contexts.map(prop => b`child_ctx[${renderer.context_lookup.get(prop.key.name).index}] = ${prop.modifier(x`list[i]`)};`);\n\n\t\tif (this.node.has_binding) this.context_props.push(b`child_ctx[${renderer.context_lookup.get(this.vars.each_block_value.name).index}] = list;`);\n\t\tif (this.node.has_binding || this.node.index) this.context_props.push(b`child_ctx[${renderer.context_lookup.get(this.index_name.name).index}] = i;`);\n\n\t\tconst snippet = this.node.expression.manipulate(block);\n\n\t\tblock.chunks.init.push(b`let ${this.vars.each_block_value} = ${snippet};`);\n\n\t\t// TODO which is better — Object.create(array) or array.slice()?\n\t\trenderer.blocks.push(b`\n\t\t\tfunction ${this.vars.get_each_context}(#ctx, list, i) {\n\t\t\t\tconst child_ctx = #ctx.slice();\n\t\t\t\t${this.context_props}\n\t\t\t\treturn child_ctx;\n\t\t\t}\n\t\t`);\n\n\t\tconst initial_anchor_node: Identifier = { type: 'Identifier', name: parent_node ? 'null' : 'anchor' };\n\t\tconst initial_mount_node: Identifier = parent_node || { type: 'Identifier', name: '#target' };\n\t\tconst update_anchor_node = needs_anchor\n\t\t\t? block.get_unique_name(`${this.var.name}_anchor`)\n\t\t\t: (this.next && this.next.var) || { type: 'Identifier', name: 'null' };\n\t\tconst update_mount_node: Identifier = this.get_update_mount_node((update_anchor_node as Identifier));\n\n\t\tconst args = {\n\t\t\tblock,\n\t\t\tparent_node,\n\t\t\tparent_nodes,\n\t\t\tsnippet,\n\t\t\tinitial_anchor_node,\n\t\t\tinitial_mount_node,\n\t\t\tupdate_anchor_node,\n\t\t\tupdate_mount_node\n\t\t};\n\n\t\tif (this.node.key) {\n\t\t\tthis.render_keyed(args);\n\t\t} else {\n\t\t\tthis.render_unkeyed(args);\n\t\t}\n\n\t\tif (this.block.has_intro_method || this.block.has_outro_method) {\n\t\t\tblock.chunks.intro.push(b`\n\t\t\t\tfor (let #i = 0; #i < ${this.vars.data_length}; #i += 1) {\n\t\t\t\t\t@transition_in(${this.vars.iterations}[#i]);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tif (needs_anchor) {\n\t\t\tblock.add_element(\n\t\t\t\tupdate_anchor_node as Identifier,\n\t\t\t\tx`@empty()`,\n\t\t\t\tparent_nodes && x`@claim_text(${parent_nodes}, '')`,\n\t\t\t\tparent_node\n\t\t\t);\n\t\t}\n\n\t\tif (this.else) {\n\t\t\tconst each_block_else = component.get_unique_name(`${this.var.name}_else`);\n\n\t\t\tblock.chunks.init.push(b`let ${each_block_else} = null;`);\n\n\t\t\t// TODO neaten this up... will end up with an empty line in the block\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\tif (!${this.vars.data_length}) {\n\t\t\t\t\t${each_block_else} = ${this.else.block.name}(#ctx);\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tblock.chunks.create.push(b`\n\t\t\t\tif (${each_block_else}) {\n\t\t\t\t\t${each_block_else}.c();\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tif (this.renderer.options.hydratable) {\n\t\t\t\tblock.chunks.claim.push(b`\n\t\t\t\t\tif (${each_block_else}) {\n\t\t\t\t\t\t${each_block_else}.l(${parent_nodes});\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\n\t\t\tblock.chunks.mount.push(b`\n\t\t\t\tif (${each_block_else}) {\n\t\t\t\t\t${each_block_else}.m(${initial_mount_node}, ${initial_anchor_node});\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tif (this.else.block.has_update_method) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (!${this.vars.data_length} && ${each_block_else}) {\n\t\t\t\t\t\t${each_block_else}.p(#ctx, #dirty);\n\t\t\t\t\t} else if (!${this.vars.data_length}) {\n\t\t\t\t\t\t${each_block_else} = ${this.else.block.name}(#ctx);\n\t\t\t\t\t\t${each_block_else}.c();\n\t\t\t\t\t\t${each_block_else}.m(${update_mount_node}, ${update_anchor_node});\n\t\t\t\t\t} else if (${each_block_else}) {\n\t\t\t\t\t\t${each_block_else}.d(1);\n\t\t\t\t\t\t${each_block_else} = null;\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${this.vars.data_length}) {\n\t\t\t\t\t\tif (${each_block_else}) {\n\t\t\t\t\t\t\t${each_block_else}.d(1);\n\t\t\t\t\t\t\t${each_block_else} = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!${each_block_else}) {\n\t\t\t\t\t\t${each_block_else} = ${this.else.block.name}(#ctx);\n\t\t\t\t\t\t${each_block_else}.c();\n\t\t\t\t\t\t${each_block_else}.m(${update_mount_node}, ${update_anchor_node});\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\n\t\t\tblock.chunks.destroy.push(b`\n\t\t\t\tif (${each_block_else}) ${each_block_else}.d(${parent_node ? '' : 'detaching'});\n\t\t\t`);\n\t\t}\n\n\t\tthis.fragment.render(this.block, null, x`#nodes` as Identifier);\n\n\t\tif (this.else) {\n\t\t\tthis.else.fragment.render(this.else.block, null, x`#nodes` as Identifier);\n\t\t}\n\t}\n\n\trender_keyed({\n\t\tblock,\n\t\tparent_node,\n\t\tparent_nodes,\n\t\tsnippet,\n\t\tinitial_anchor_node,\n\t\tinitial_mount_node,\n\t\tupdate_anchor_node,\n\t\tupdate_mount_node\n\t}: {\n\t\tblock: Block;\n\t\tparent_node: Identifier;\n\t\tparent_nodes: Identifier;\n\t\tsnippet: Node;\n\t\tinitial_anchor_node: Identifier;\n\t\tinitial_mount_node: Identifier;\n\t\tupdate_anchor_node: Identifier;\n\t\tupdate_mount_node: Identifier;\n\t}) {\n\t\tconst {\n\t\t\tcreate_each_block,\n\t\t\titerations,\n\t\t\tdata_length,\n\t\t\tview_length\n\t\t} = this.vars;\n\n\t\tconst get_key = block.get_unique_name('get_key');\n\t\tconst lookup = block.get_unique_name(`${this.var.name}_lookup`);\n\n\t\tblock.add_variable(iterations, x`[]`);\n\t\tblock.add_variable(lookup, x`new @_Map()`);\n\n\t\tif (this.fragment.nodes[0].is_dom_node()) {\n\t\t\tthis.block.first = this.fragment.nodes[0].var;\n\t\t} else {\n\t\t\tthis.block.first = this.block.get_unique_name('first');\n\t\t\tthis.block.add_element(\n\t\t\t\tthis.block.first,\n\t\t\t\tx`@empty()`,\n\t\t\t\tparent_nodes && x`@claim_text(#nodes, '')`,\n\t\t\t\tnull\n\t\t\t);\n\t\t}\n\n\t\tblock.chunks.init.push(b`\n\t\t\tconst ${get_key} = #ctx => ${this.node.key.manipulate(block)};\n\n\t\t\t${this.renderer.options.dev && b`@validate_each_keys(#ctx, ${this.vars.each_block_value}, ${this.vars.get_each_context}, ${get_key});`}\n\t\t\tfor (let #i = 0; #i < ${data_length}; #i += 1) {\n\t\t\t\tlet child_ctx = ${this.vars.get_each_context}(#ctx, ${this.vars.each_block_value}, #i);\n\t\t\t\tlet key = ${get_key}(child_ctx);\n\t\t\t\t${lookup}.set(key, ${iterations}[#i] = ${create_each_block}(key, child_ctx));\n\t\t\t}\n\t\t`);\n\n\t\tblock.chunks.create.push(b`\n\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t${iterations}[#i].c();\n\t\t\t}\n\t\t`);\n\n\t\tif (parent_nodes && this.renderer.options.hydratable) {\n\t\t\tblock.chunks.claim.push(b`\n\t\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t\t${iterations}[#i].l(${parent_nodes});\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tblock.chunks.mount.push(b`\n\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t${iterations}[#i].m(${initial_mount_node}, ${initial_anchor_node});\n\t\t\t}\n\t\t`);\n\n\t\tconst dynamic = this.block.has_update_method;\n\n\t\tconst destroy = this.node.has_animation\n\t\t\t? (this.block.has_outros\n\t\t\t\t? `@fix_and_outro_and_destroy_block`\n\t\t\t\t: `@fix_and_destroy_block`)\n\t\t\t: this.block.has_outros\n\t\t\t\t? `@outro_and_destroy_block`\n\t\t\t\t: `@destroy_block`;\n\n\t\tblock.chunks.update.push(b`\n\t\t\tconst ${this.vars.each_block_value} = ${snippet};\n\n\t\t\t${this.block.has_outros && b`@group_outros();`}\n\t\t\t${this.node.has_animation && b`for (let #i = 0; #i < ${view_length}; #i += 1) ${iterations}[#i].r();`}\n\t\t\t${this.renderer.options.dev && b`@validate_each_keys(#ctx, ${this.vars.each_block_value}, ${this.vars.get_each_context}, ${get_key});`}\n\t\t\t${iterations} = @update_keyed_each(${iterations}, #dirty, ${get_key}, ${dynamic ? 1 : 0}, #ctx, ${this.vars.each_block_value}, ${lookup}, ${update_mount_node}, ${destroy}, ${create_each_block}, ${update_anchor_node}, ${this.vars.get_each_context});\n\t\t\t${this.node.has_animation && b`for (let #i = 0; #i < ${view_length}; #i += 1) ${iterations}[#i].a();`}\n\t\t\t${this.block.has_outros && b`@check_outros();`}\n\t\t`);\n\n\t\tif (this.block.has_outros) {\n\t\t\tblock.chunks.outro.push(b`\n\t\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t\t@transition_out(${iterations}[#i]);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tblock.chunks.destroy.push(b`\n\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t${iterations}[#i].d(${parent_node ? null : 'detaching'});\n\t\t\t}\n\t\t`);\n\t}\n\n\trender_unkeyed({\n\t\tblock,\n\t\tparent_nodes,\n\t\tsnippet,\n\t\tinitial_anchor_node,\n\t\tinitial_mount_node,\n\t\tupdate_anchor_node,\n\t\tupdate_mount_node\n\t}: {\n\t\tblock: Block;\n\t\tparent_nodes: Identifier;\n\t\tsnippet: Node;\n\t\tinitial_anchor_node: Identifier;\n\t\tinitial_mount_node: Identifier;\n\t\tupdate_anchor_node: Identifier;\n\t\tupdate_mount_node: Identifier;\n\t}) {\n\t\tconst {\n\t\t\tcreate_each_block,\n\t\t\titerations,\n\t\t\tfixed_length,\n\t\t\tdata_length,\n\t\t\tview_length\n\t\t} = this.vars;\n\n\t\tblock.chunks.init.push(b`\n\t\t\tlet ${iterations} = [];\n\n\t\t\tfor (let #i = 0; #i < ${data_length}; #i += 1) {\n\t\t\t\t${iterations}[#i] = ${create_each_block}(${this.vars.get_each_context}(#ctx, ${this.vars.each_block_value}, #i));\n\t\t\t}\n\t\t`);\n\n\t\tblock.chunks.create.push(b`\n\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t${iterations}[#i].c();\n\t\t\t}\n\t\t`);\n\n\t\tif (parent_nodes && this.renderer.options.hydratable) {\n\t\t\tblock.chunks.claim.push(b`\n\t\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t\t${iterations}[#i].l(${parent_nodes});\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tblock.chunks.mount.push(b`\n\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t${iterations}[#i].m(${initial_mount_node}, ${initial_anchor_node});\n\t\t\t}\n\t\t`);\n\n\t\tconst all_dependencies = new Set(this.block.dependencies); // TODO should be dynamic deps only\n\t\tthis.node.expression.dynamic_dependencies().forEach((dependency: string) => {\n\t\t\tall_dependencies.add(dependency);\n\t\t});\n\n\t\tif (all_dependencies.size) {\n\t\t\tconst has_transitions = !!(this.block.has_intro_method || this.block.has_outro_method);\n\n\t\t\tconst for_loop_body = this.block.has_update_method\n\t\t\t\t? b`\n\t\t\t\t\tif (${iterations}[#i]) {\n\t\t\t\t\t\t${iterations}[#i].p(child_ctx, #dirty);\n\t\t\t\t\t\t${has_transitions && b`@transition_in(${this.vars.iterations}[#i], 1);`}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${iterations}[#i] = ${create_each_block}(child_ctx);\n\t\t\t\t\t\t${iterations}[#i].c();\n\t\t\t\t\t\t${has_transitions && b`@transition_in(${this.vars.iterations}[#i], 1);`}\n\t\t\t\t\t\t${iterations}[#i].m(${update_mount_node}, ${update_anchor_node});\n\t\t\t\t\t}\n\t\t\t\t`\n\t\t\t\t: has_transitions\n\t\t\t\t\t? b`\n\t\t\t\t\t\tif (${iterations}[#i]) {\n\t\t\t\t\t\t\t@transition_in(${this.vars.iterations}[#i], 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t${iterations}[#i] = ${create_each_block}(child_ctx);\n\t\t\t\t\t\t\t${iterations}[#i].c();\n\t\t\t\t\t\t\t@transition_in(${this.vars.iterations}[#i], 1);\n\t\t\t\t\t\t\t${iterations}[#i].m(${update_mount_node}, ${update_anchor_node});\n\t\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t: b`\n\t\t\t\t\t\tif (!${iterations}[#i]) {\n\t\t\t\t\t\t\t${iterations}[#i] = ${create_each_block}(child_ctx);\n\t\t\t\t\t\t\t${iterations}[#i].c();\n\t\t\t\t\t\t\t${iterations}[#i].m(${update_mount_node}, ${update_anchor_node});\n\t\t\t\t\t\t}\n\t\t\t\t\t`;\n\n\t\t\tconst start = this.block.has_update_method ? 0 : `#old_length`;\n\n\t\t\tlet remove_old_blocks;\n\n\t\t\tif (this.block.has_outros) {\n\t\t\t\tconst out = block.get_unique_name('out');\n\n\t\t\t\tblock.chunks.init.push(b`\n\t\t\t\t\tconst ${out} = i => @transition_out(${iterations}[i], 1, 1, () => {\n\t\t\t\t\t\t${iterations}[i] = null;\n\t\t\t\t\t});\n\t\t\t\t`);\n\t\t\t\tremove_old_blocks = b`\n\t\t\t\t\t@group_outros();\n\t\t\t\t\tfor (#i = ${data_length}; #i < ${view_length}; #i += 1) {\n\t\t\t\t\t\t${out}(#i);\n\t\t\t\t\t}\n\t\t\t\t\t@check_outros();\n\t\t\t\t`;\n\t\t\t} else {\n\t\t\t\tremove_old_blocks = b`\n\t\t\t\t\tfor (${this.block.has_update_method ? null : x`#i = ${data_length}`}; #i < ${this.block.has_update_method ? view_length : '#old_length'}; #i += 1) {\n\t\t\t\t\t\t${iterations}[#i].d(1);\n\t\t\t\t\t}\n\t\t\t\t\t${!fixed_length && b`${view_length} = ${data_length};`}\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\t// We declare `i` as block scoped here, as the `remove_old_blocks` code\n\t\t\t// may rely on continuing where this iteration stopped.\n\t\t\tconst update = b`\n\t\t\t\t${!this.block.has_update_method && b`const #old_length = ${this.vars.each_block_value}.length;`}\n\t\t\t\t${this.vars.each_block_value} = ${snippet};\n\n\t\t\t\tlet #i;\n\t\t\t\tfor (#i = ${start}; #i < ${data_length}; #i += 1) {\n\t\t\t\t\tconst child_ctx = ${this.vars.get_each_context}(#ctx, ${this.vars.each_block_value}, #i);\n\n\t\t\t\t\t${for_loop_body}\n\t\t\t\t}\n\n\t\t\t\t${remove_old_blocks}\n\t\t\t`;\n\n\t\t\tblock.chunks.update.push(b`\n\t\t\t\tif (${block.renderer.dirty(Array.from(all_dependencies))}) {\n\t\t\t\t\t${update}\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tif (this.block.has_outros) {\n\t\t\tblock.chunks.outro.push(b`\n\t\t\t\t${iterations} = ${iterations}.filter(@_Boolean);\n\t\t\t\tfor (let #i = 0; #i < ${view_length}; #i += 1) {\n\t\t\t\t\t@transition_out(${iterations}[#i]);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tblock.chunks.destroy.push(b`@destroy_each(${iterations}, detaching);`);\n\t}\n}\n","export function string_literal(data: string) {\n\treturn {\n\t\ttype: 'Literal',\n\t\tvalue: data\n\t};\n}\n\nexport function escape(data: string, { only_escape_at_symbol = false } = {}) {\n\treturn data.replace(only_escape_at_symbol ? /@+/g : /(@+|#+)/g, (match: string) => {\n\t\treturn match + match[0];\n\t});\n}\n\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n\t'&': '&',\n\t'<': '<',\n\t'>': '>',\n};\n\nexport function escape_html(html) {\n\treturn String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\n\nexport function escape_template(str) {\n\treturn str.replace(/(\\${|`|\\\\)/g, '\\\\$1');\n}\n","const svg_attributes = 'accent-height accumulate additive alignment-baseline allowReorder alphabetic amplitude arabic-form ascent attributeName attributeType autoReverse azimuth baseFrequency baseline-shift baseProfile bbox begin bias by calcMode cap-height class clip clipPathUnits clip-path clip-rule color color-interpolation color-interpolation-filters color-profile color-rendering contentScriptType contentStyleType cursor cx cy d decelerate descent diffuseConstant direction display divisor dominant-baseline dur dx dy edgeMode elevation enable-background end exponent externalResourcesRequired fill fill-opacity fill-rule filter filterRes filterUnits flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight format from fr fx fy g1 g2 glyph-name glyph-orientation-horizontal glyph-orientation-vertical glyphRef gradientTransform gradientUnits hanging height href horiz-adv-x horiz-origin-x id ideographic image-rendering in in2 intercept k k1 k2 k3 k4 kernelMatrix kernelUnitLength kerning keyPoints keySplines keyTimes lang lengthAdjust letter-spacing lighting-color limitingConeAngle local marker-end marker-mid marker-start markerHeight markerUnits markerWidth mask maskContentUnits maskUnits mathematical max media method min mode name numOctaves offset onabort onactivate onbegin onclick onend onerror onfocusin onfocusout onload onmousedown onmousemove onmouseout onmouseover onmouseup onrepeat onresize onscroll onunload opacity operator order orient orientation origin overflow overline-position overline-thickness panose-1 paint-order pathLength patternContentUnits patternTransform patternUnits pointer-events points pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits r radius refX refY rendering-intent repeatCount repeatDur requiredExtensions requiredFeatures restart result rotate rx ry scale seed shape-rendering slope spacing specularConstant specularExponent speed spreadMethod startOffset stdDeviation stemh stemv stitchTiles stop-color stop-opacity strikethrough-position strikethrough-thickness string stroke stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width style surfaceScale systemLanguage tabindex tableValues target targetX targetY text-anchor text-decoration text-rendering textLength to transform type u1 u2 underline-position underline-thickness unicode unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical values version vert-adv-y vert-origin-x vert-origin-y viewBox viewTarget visibility width widths word-spacing writing-mode x x-height x1 x2 xChannelSelector xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xml:lang xml:space y y1 y2 yChannelSelector z zoomAndPan'.split(' ');\n\nconst svg_attribute_lookup = new Map();\n\nsvg_attributes.forEach(name => {\n\tsvg_attribute_lookup.set(name.toLowerCase(), name);\n});\n\nexport default function fix_attribute_casing(name) {\n\tname = name.toLowerCase();\n\treturn svg_attribute_lookup.get(name) || name;\n}\n","export const html = 'http://www.w3.org/1999/xhtml';\nexport const mathml = 'http://www.w3.org/1998/Math/MathML';\nexport const svg = 'http://www.w3.org/2000/svg';\nexport const xlink = 'http://www.w3.org/1999/xlink';\nexport const xml = 'http://www.w3.org/XML/1998/namespace';\nexport const xmlns = 'http://www.w3.org/2000/xmlns';\n\nexport const valid_namespaces = [\n\t'html',\n\t'mathml',\n\t'svg',\n\t'xlink',\n\t'xml',\n\t'xmlns',\n\thtml,\n\tmathml,\n\tsvg,\n\txlink,\n\txml,\n\txmlns,\n];\n\nexport const namespaces: Record<string, string> = { html, mathml, svg, xlink, xml, xmlns };\n","import Attribute from '../../../nodes/Attribute';\nimport Block from '../../Block';\nimport fix_attribute_casing from './fix_attribute_casing';\nimport ElementWrapper from './index';\nimport { string_literal } from '../../../utils/stringify';\nimport { b, x } from 'code-red';\nimport Expression from '../../../nodes/shared/Expression';\nimport Text from '../../../nodes/Text';\n\nexport default class AttributeWrapper {\n\tnode: Attribute;\n\tparent: ElementWrapper;\n\n\tconstructor(parent: ElementWrapper, block: Block, node: Attribute) {\n\t\tthis.node = node;\n\t\tthis.parent = parent;\n\n\t\tif (node.dependencies.size > 0) {\n\t\t\tparent.cannot_use_innerhtml();\n\t\t\tparent.not_static_content();\n\n\t\t\tblock.add_dependencies(node.dependencies);\n\n\t\t\t// special case — <option value={foo}> — see below\n\t\t\tif (this.parent.node.name === 'option' && node.name === 'value') {\n\t\t\t\tlet select: ElementWrapper = this.parent;\n\t\t\t\twhile (select && (select.node.type !== 'Element' || select.node.name !== 'select'))\n\t\t\t\t\t// @ts-ignore todo: doublecheck this, but looks to be correct\n\t\t\t\t\tselect = select.parent;\n\n\t\t\t\tif (select && select.select_binding_dependencies) {\n\t\t\t\t\tselect.select_binding_dependencies.forEach(prop => {\n\t\t\t\t\t\tthis.node.dependencies.forEach((dependency: string) => {\n\t\t\t\t\t\t\tthis.parent.renderer.component.indirect_dependencies.get(prop).add(dependency);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\trender(block: Block) {\n\t\tconst element = this.parent;\n\t\tconst name = fix_attribute_casing(this.node.name);\n\n\t\tconst metadata = this.get_metadata();\n\n\t\tconst is_indirectly_bound_value =\n\t\t\tname === 'value' &&\n\t\t\t(element.node.name === 'option' || // TODO check it's actually bound\n\t\t\t\t(element.node.name === 'input' &&\n\t\t\t\t\telement.node.bindings.find(\n\t\t\t\t\t\t(binding) =>\n\t\t\t\t\t\t\t/checked|group/.test(binding.name)\n\t\t\t\t\t)));\n\n\t\tconst property_name = is_indirectly_bound_value\n\t\t\t? '__value'\n\t\t\t: metadata && metadata.property_name;\n\n\t\t// xlink is a special case... we could maybe extend this to generic\n\t\t// namespaced attributes but I'm not sure that's applicable in\n\t\t// HTML5?\n\t\tconst method = /-/.test(element.node.name)\n\t\t\t? '@set_custom_element_data'\n\t\t\t: name.slice(0, 6) === 'xlink:'\n\t\t\t\t? '@xlink_attr'\n\t\t\t\t: '@attr';\n\n\t\tconst is_legacy_input_type = element.renderer.component.compile_options.legacy && name === 'type' && this.parent.node.name === 'input';\n\n\t\tconst dependencies = this.node.get_dependencies();\n\t\tconst value = this.get_value(block);\n\n\t\tconst is_src = this.node.name === 'src'; // TODO retire this exception in favour of https://github.com/sveltejs/svelte/issues/3750\n\t\tconst is_select_value_attribute =\n\t\t\tname === 'value' && element.node.name === 'select';\n\n\t\tconst is_input_value = name === 'value' && element.node.name === 'input';\n\n\t\tconst should_cache = is_src || this.node.should_cache() || is_select_value_attribute; // TODO is this necessary?\n\n\t\tconst last = should_cache && block.get_unique_name(\n\t\t\t`${element.var.name}_${name.replace(/[^a-zA-Z_$]/g, '_')}_value`\n\t\t);\n\n\t\tif (should_cache) block.add_variable(last);\n\n\t\tlet updater;\n\t\tconst init = should_cache ? x`${last} = ${value}` : value;\n\n\t\tif (is_legacy_input_type) {\n\t\t\tblock.chunks.hydrate.push(\n\t\t\t\tb`@set_input_type(${element.var}, ${init});`\n\t\t\t);\n\t\t\tupdater = b`@set_input_type(${element.var}, ${should_cache ? last : value});`;\n\t\t} else if (is_select_value_attribute) {\n\t\t\t// annoying special case\n\t\t\tconst is_multiple_select = element.node.get_static_attribute_value('multiple');\n\t\t\tconst i = block.get_unique_name('i');\n\t\t\tconst option = block.get_unique_name('option');\n\n\t\t\tconst if_statement = is_multiple_select\n\t\t\t\t? b`\n\t\t\t\t\t${option}.selected = ~${last}.indexOf(${option}.__value);`\n\t\t\t\t: b`\n\t\t\t\t\tif (${option}.__value === ${last}) {\n\t\t\t\t\t\t${option}.selected = true;\n\t\t\t\t\t\t${{ type: 'BreakStatement' }};\n\t\t\t\t\t}`; // TODO the BreakStatement is gross, but it's unsyntactic otherwise...\n\n\t\t\tupdater = b`\n\t\t\t\tfor (var ${i} = 0; ${i} < ${element.var}.options.length; ${i} += 1) {\n\t\t\t\t\tvar ${option} = ${element.var}.options[${i}];\n\n\t\t\t\t\t${if_statement}\n\t\t\t\t}\n\t\t\t`;\n\n\t\t\tblock.chunks.mount.push(b`\n\t\t\t\t${last} = ${value};\n\t\t\t\t${updater}\n\t\t\t`);\n\t\t} else if (is_src) {\n\t\t\tblock.chunks.hydrate.push(\n\t\t\t\tb`if (${element.var}.src !== ${init}) ${method}(${element.var}, \"${name}\", ${last});`\n\t\t\t);\n\t\t\tupdater = b`${method}(${element.var}, \"${name}\", ${should_cache ? last : value});`;\n\t\t} else if (property_name) {\n\t\t\tblock.chunks.hydrate.push(\n\t\t\t\tb`${element.var}.${property_name} = ${init};`\n\t\t\t);\n\t\t\tupdater = block.renderer.options.dev\n\t\t\t\t? b`@prop_dev(${element.var}, \"${property_name}\", ${should_cache ? last : value});`\n\t\t\t\t: b`${element.var}.${property_name} = ${should_cache ? last : value};`;\n\t\t} else {\n\t\t\tblock.chunks.hydrate.push(\n\t\t\t\tb`${method}(${element.var}, \"${name}\", ${init});`\n\t\t\t);\n\t\t\tupdater = b`${method}(${element.var}, \"${name}\", ${should_cache ? last : value});`;\n\t\t}\n\n\t\tif (dependencies.length > 0) {\n\t\t\tlet condition = block.renderer.dirty(dependencies);\n\n\t\t\tif (should_cache) {\n\t\t\t\tcondition = is_src\n\t\t\t\t\t? x`${condition} && (${element.var}.src !== (${last} = ${value}))`\n\t\t\t\t\t: x`${condition} && (${last} !== (${last} = ${value}))`;\n\t\t\t}\n\n\t\t\tif (is_input_value) {\n\t\t\t\tconst type = element.node.get_static_attribute_value('type');\n\n\t\t\t\tif (type === null || type === \"\" || type === \"text\" || type === \"email\" || type === \"password\") {\n\t\t\t\t\tcondition = x`${condition} && ${element.var}.${property_name} !== ${should_cache ? last : value}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (block.has_outros) {\n\t\t\t\tcondition = x`!#current || ${condition}`;\n\t\t\t}\n\n\t\t\tblock.chunks.update.push(b`\n\t\t\t\tif (${condition}) {\n\t\t\t\t\t${updater}\n\t\t\t\t}`);\n\t\t}\n\n\t\t// special case – autofocus. has to be handled in a bit of a weird way\n\t\tif (this.node.is_true && name === 'autofocus') {\n\t\t\tblock.autofocus = element.var;\n\t\t}\n\n\t\tif (is_indirectly_bound_value) {\n\t\t\tconst update_value = b`${element.var}.value = ${element.var}.__value;`;\n\n\t\t\tblock.chunks.hydrate.push(update_value);\n\t\t\tif (this.node.get_dependencies().length > 0) block.chunks.update.push(update_value);\n\t\t}\n\t}\n\n\tget_metadata() {\n\t\tif (this.parent.node.namespace) return null;\n\t\tconst metadata = attribute_lookup[fix_attribute_casing(this.node.name)];\n\t\tif (metadata && metadata.applies_to && !metadata.applies_to.includes(this.parent.node.name)) return null;\n\t\treturn metadata;\n\t}\n\n\tget_value(block) {\n\t\tif (this.node.is_true) {\n\t\t\tconst metadata = this.get_metadata();\n\t\t\tif (metadata && boolean_attribute.has(metadata.property_name.toLowerCase())) {\n\t\t\t\treturn x`true`;\n\t\t\t}\n\t\t\treturn x`\"\"`;\n\t\t}\n\t\tif (this.node.chunks.length === 0) return x`\"\"`;\n\n\t\t// TODO some of this code is repeated in Tag.ts — would be good to\n\t\t// DRY it out if that's possible without introducing crazy indirection\n\t\tif (this.node.chunks.length === 1) {\n\t\t\treturn this.node.chunks[0].type === 'Text'\n\t\t\t\t? string_literal((this.node.chunks[0] as Text).data)\n\t\t\t\t: (this.node.chunks[0] as Expression).manipulate(block);\n\t\t}\n\n\t\tlet value = this.node.name === 'class'\n\t\t\t? this.get_class_name_text(block)\n\t\t\t: this.render_chunks(block).reduce((lhs, rhs) => x`${lhs} + ${rhs}`);\n\n\t\t// '{foo} {bar}' — treat as string concatenation\n\t\tif (this.node.chunks[0].type !== 'Text') {\n\t\t\tvalue = x`\"\" + ${value}`;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tget_class_name_text(block) {\n\t\tconst scoped_css = this.node.chunks.some((chunk: Text) => chunk.synthetic);\n\t\tconst rendered = this.render_chunks(block);\n\n\t\tif (scoped_css && rendered.length === 2) {\n\t\t\t// we have a situation like class={possiblyUndefined}\n\t\t\trendered[0] = x`@null_to_empty(${rendered[0]})`;\n\t\t}\n\n\t\treturn rendered.reduce((lhs, rhs) => x`${lhs} + ${rhs}`);\n\t}\n\n\trender_chunks(block: Block) {\n\t\treturn this.node.chunks.map((chunk) => {\n\t\t\tif (chunk.type === 'Text') {\n\t\t\t\treturn string_literal(chunk.data);\n\t\t\t}\n\n\t\t\treturn chunk.manipulate(block);\n\t\t});\n\t}\n\n\tstringify() {\n\t\tif (this.node.is_true) return '';\n\n\t\tconst value = this.node.chunks;\n\t\tif (value.length === 0) return `=\"\"`;\n\n\t\treturn `=\"${value.map(chunk => {\n\t\t\treturn chunk.type === 'Text'\n\t\t\t\t? chunk.data.replace(/\"/g, '\\\\\"')\n\t\t\t\t: `\\${${chunk.manipulate()}}`;\n\t\t}).join('')}\"`;\n\t}\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst attribute_lookup = {\n\tallowfullscreen: { property_name: 'allowFullscreen', applies_to: ['iframe'] },\n\tallowpaymentrequest: { property_name: 'allowPaymentRequest', applies_to: ['iframe'] },\n\tasync: { applies_to: ['script'] },\n\tautofocus: { applies_to: ['button', 'input', 'keygen', 'select', 'textarea'] },\n\tautoplay: { applies_to: ['audio', 'video'] },\n\tchecked: { applies_to: ['input'] },\n\tcontrols: { applies_to: ['audio', 'video'] },\n\tdefault: { applies_to: ['track'] },\n\tdefer: { applies_to: ['script'] },\n\tdisabled: {\n\t\tapplies_to: [\n\t\t\t'button',\n\t\t\t'fieldset',\n\t\t\t'input',\n\t\t\t'keygen',\n\t\t\t'optgroup',\n\t\t\t'option',\n\t\t\t'select',\n\t\t\t'textarea',\n\t\t],\n\t},\n\tformnovalidate: { property_name: 'formNoValidate', applies_to: ['button', 'input'] },\n\thidden: {},\n\tindeterminate: { applies_to: ['input'] },\n\tismap: { property_name: 'isMap', applies_to: ['img'] },\n\tloop: { applies_to: ['audio', 'bgsound', 'video'] },\n\tmultiple: { applies_to: ['input', 'select'] },\n\tmuted: { applies_to: ['audio', 'video'] },\n\tnomodule: { property_name: 'noModule', applies_to: ['script'] },\n\tnovalidate: { property_name: 'noValidate', applies_to: ['form'] },\n\topen: { applies_to: ['details', 'dialog'] },\n\tplaysinline: { property_name: 'playsInline', applies_to: ['video'] },\n\treadonly: { property_name: 'readOnly', applies_to: ['input', 'textarea'] },\n\trequired: { applies_to: ['input', 'select', 'textarea'] },\n\treversed: { applies_to: ['ol'] },\n\tselected: { applies_to: ['option'] },\n\tvalue: {\n\t\tapplies_to: [\n\t\t\t'button',\n\t\t\t'option',\n\t\t\t'input',\n\t\t\t'li',\n\t\t\t'meter',\n\t\t\t'progress',\n\t\t\t'param',\n\t\t\t'select',\n\t\t\t'textarea',\n\t\t],\n\t},\n};\n\nObject.keys(attribute_lookup).forEach(name => {\n\tconst metadata = attribute_lookup[name];\n\tif (!metadata.property_name) metadata.property_name = name;\n});\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attribute = new Set([\n\t'allowfullscreen',\n\t'allowpaymentrequest',\n\t'async',\n\t'autofocus',\n\t'autoplay',\n\t'checked',\n\t'controls',\n\t'default',\n\t'defer',\n\t'disabled',\n\t'formnovalidate',\n\t'hidden',\n\t'ismap',\n\t'itemscope',\n\t'loop',\n\t'multiple',\n\t'muted',\n\t'nomodule',\n\t'novalidate',\n\t'open',\n\t'playsinline',\n\t'readonly',\n\t'required',\n\t'reversed',\n\t'selected'\n]);","import { b, x } from 'code-red';\nimport Attribute from '../../../nodes/Attribute';\nimport Block from '../../Block';\nimport AttributeWrapper from './Attribute';\nimport ElementWrapper from '../Element';\nimport { string_literal } from '../../../utils/stringify';\nimport add_to_set from '../../../utils/add_to_set';\nimport Expression from '../../../nodes/shared/Expression';\nimport Text from '../../../nodes/Text';\n\nexport interface StyleProp {\n\tkey: string;\n\tvalue: Array<Text|Expression>;\n\timportant: boolean;\n}\n\nexport default class StyleAttributeWrapper extends AttributeWrapper {\n\tnode: Attribute;\n\tparent: ElementWrapper;\n\n\trender(block: Block) {\n\t\tconst style_props = optimize_style(this.node.chunks);\n\t\tif (!style_props) return super.render(block);\n\n\t\tstyle_props.forEach((prop: StyleProp) => {\n\t\t\tlet value;\n\n\t\t\tif (is_dynamic(prop.value)) {\n\t\t\t\tconst prop_dependencies: Set<string> = new Set();\n\n\t\t\t\tvalue = prop.value\n\t\t\t\t\t.map(chunk => {\n\t\t\t\t\t\tif (chunk.type === 'Text') {\n\t\t\t\t\t\t\treturn string_literal(chunk.data);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tadd_to_set(prop_dependencies, chunk.dynamic_dependencies());\n\t\t\t\t\t\t\treturn chunk.manipulate(block);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.reduce((lhs, rhs) => x`${lhs} + ${rhs}`);\n\n\t\t\t\t// TODO is this necessary? style.setProperty always treats value as string, no?\n\t\t\t\t// if (prop.value.length === 1 || prop.value[0].type !== 'Text') {\n\t\t\t\t// \tvalue = x`\"\" + ${value}`;\n\t\t\t\t// }\n\n\t\t\t\tif (prop_dependencies.size) {\n\t\t\t\t\tlet condition = block.renderer.dirty(Array.from(prop_dependencies));\n\n\t\t\t\t\tif (block.has_outros) {\n\t\t\t\t\t\tcondition = x`!#current || ${condition}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst update = b`\n\t\t\t\t\t\tif (${condition}) {\n\t\t\t\t\t\t\t@set_style(${this.parent.var}, \"${prop.key}\", ${value}, ${prop.important ? 1 : null});\n\t\t\t\t\t\t}`;\n\n\t\t\t\t\tblock.chunks.update.push(update);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue = string_literal((prop.value[0] as Text).data);\n\t\t\t}\n\n\t\t\tblock.chunks.hydrate.push(\n\t\t\t\tb`@set_style(${this.parent.var}, \"${prop.key}\", ${value}, ${prop.important ? 1 : null});`\n\t\t\t);\n\t\t});\n\t}\n}\n\nfunction optimize_style(value: Array<Text|Expression>) {\n\tconst props: StyleProp[] = [];\n\tlet chunks = value.slice();\n\n\twhile (chunks.length) {\n\t\tconst chunk = chunks[0];\n\n\t\tif (chunk.type !== 'Text') return null;\n\n\t\tconst key_match = /^\\s*([\\w-]+):\\s*/.exec(chunk.data);\n\t\tif (!key_match) return null;\n\n\t\tconst key = key_match[1];\n\n\t\tconst offset = key_match.index + key_match[0].length;\n\t\tconst remaining_data = chunk.data.slice(offset);\n\n\t\tif (remaining_data) {\n\t\t\tchunks[0] = {\n\t\t\t\tstart: chunk.start + offset,\n\t\t\t\tend: chunk.end,\n\t\t\t\ttype: 'Text',\n\t\t\t\tdata: remaining_data\n\t\t\t} as Text;\n\t\t} else {\n\t\t\tchunks.shift();\n\t\t}\n\n\t\tconst result = get_style_value(chunks);\n\n\t\tprops.push({ key, value: result.value, important: result.important });\n\t\tchunks = result.chunks;\n\t}\n\n\treturn props;\n}\n\nfunction get_style_value(chunks: Array<Text | Expression>) {\n\tconst value: Array<Text|Expression> = [];\n\n\tlet in_url = false;\n\tlet quote_mark = null;\n\tlet escaped = false;\n\tlet closed = false;\n\n\twhile (chunks.length && !closed) {\n\t\tconst chunk = chunks.shift();\n\n\t\tif (chunk.type === 'Text') {\n\t\t\tlet c = 0;\n\t\t\twhile (c < chunk.data.length) {\n\t\t\t\tconst char = chunk.data[c];\n\n\t\t\t\tif (escaped) {\n\t\t\t\t\tescaped = false;\n\t\t\t\t} else if (char === '\\\\') {\n\t\t\t\t\tescaped = true;\n\t\t\t\t} else if (char === quote_mark) {\n\t\t\t\t\tquote_mark = null;\n\t\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t\tquote_mark = char;\n\t\t\t\t} else if (char === ')' && in_url) {\n\t\t\t\t\tin_url = false;\n\t\t\t\t} else if (char === 'u' && chunk.data.slice(c, c + 4) === 'url(') {\n\t\t\t\t\tin_url = true;\n\t\t\t\t} else if (char === ';' && !in_url && !quote_mark) {\n\t\t\t\t\tclosed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tc += 1;\n\t\t\t}\n\n\t\t\tif (c > 0) {\n\t\t\t\tvalue.push({\n\t\t\t\t\ttype: 'Text',\n\t\t\t\t\tstart: chunk.start,\n\t\t\t\t\tend: chunk.start + c,\n\t\t\t\t\tdata: chunk.data.slice(0, c)\n\t\t\t\t} as Text);\n\t\t\t}\n\n\t\t\twhile (/[;\\s]/.test(chunk.data[c])) c += 1;\n\t\t\tconst remaining_data = chunk.data.slice(c);\n\n\t\t\tif (remaining_data) {\n\t\t\t\tchunks.unshift({\n\t\t\t\t\tstart: chunk.start + c,\n\t\t\t\t\tend: chunk.end,\n\t\t\t\t\ttype: 'Text',\n\t\t\t\t\tdata: remaining_data\n\t\t\t\t} as Text);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\tvalue.push(chunk);\n\t\t}\n\t}\n\n\tlet important = false;\n\n\tconst last_chunk = value[value.length - 1];\n\tif (last_chunk && last_chunk.type === 'Text' && /\\s*!important\\s*$/.test(last_chunk.data)) {\n\t\timportant = true;\n\t\tlast_chunk.data = last_chunk.data.replace(/\\s*!important\\s*$/, '');\n\t\tif (!last_chunk.data) value.pop();\n\t}\n\n\treturn {\n\t\tchunks,\n\t\tvalue,\n\t\timportant\n\t};\n}\n\nfunction is_dynamic(value: Array<Text|Expression>) {\n\treturn value.length > 1 || value[0].type !== 'Text';\n}\n","import { b, x } from 'code-red';\nimport Binding from '../../../nodes/Binding';\nimport ElementWrapper from '../Element';\nimport get_object from '../../../utils/get_object';\nimport Block from '../../Block';\nimport Renderer from '../../Renderer';\nimport flatten_reference from '../../../utils/flatten_reference';\nimport EachBlock from '../../../nodes/EachBlock';\nimport { Node, Identifier } from 'estree';\n\nexport default class BindingWrapper {\n\tnode: Binding;\n\tparent: ElementWrapper;\n\n\tobject: string;\n\thandler: {\n\t\tuses_context: boolean;\n\t\tmutation: (Node | Node[]);\n\t\tcontextual_dependencies: Set<string>;\n\t\tsnippet?: Node;\n\t};\n\tsnippet: Node;\n\tis_readonly: boolean;\n\tneeds_lock: boolean;\n\n\tconstructor(block: Block, node: Binding, parent: ElementWrapper) {\n\t\tthis.node = node;\n\t\tthis.parent = parent;\n\n\t\tconst { dependencies } = this.node.expression;\n\n\t\tblock.add_dependencies(dependencies);\n\n\t\t// TODO does this also apply to e.g. `<input type='checkbox' bind:group='foo'>`?\n\t\tif (parent.node.name === 'select') {\n\t\t\tparent.select_binding_dependencies = dependencies;\n\t\t\tdependencies.forEach((prop: string) => {\n\t\t\t\tparent.renderer.component.indirect_dependencies.set(prop, new Set());\n\t\t\t});\n\t\t}\n\n\t\tif (node.is_contextual) {\n\t\t\t// we need to ensure that the each block creates a context including\n\t\t\t// the list and the index, if they're not otherwise referenced\n\t\t\tconst { name } = get_object(this.node.expression.node);\n\t\t\tconst each_block = this.parent.node.scope.get_owner(name);\n\n\t\t\t(each_block as EachBlock).has_binding = true;\n\t\t}\n\n\t\tthis.object = get_object(this.node.expression.node).name;\n\n\t\t// view to model\n\t\tthis.handler = get_event_handler(this, parent.renderer, block, this.object, this.node.raw_expression);\n\n\t\tthis.snippet = this.node.expression.manipulate(block);\n\n\t\tthis.is_readonly = this.node.is_readonly;\n\n\t\tthis.needs_lock = this.node.name === 'currentTime' || (parent.node.name === 'input' && parent.node.get_static_attribute_value('type') === 'number'); // TODO others?\n\t}\n\n\tget_dependencies() {\n\t\tconst dependencies = new Set(this.node.expression.dependencies);\n\n\t\tthis.node.expression.dependencies.forEach((prop: string) => {\n\t\t\tconst indirect_dependencies = this.parent.renderer.component.indirect_dependencies.get(prop);\n\t\t\tif (indirect_dependencies) {\n\t\t\t\tindirect_dependencies.forEach(indirect_dependency => {\n\t\t\t\t\tdependencies.add(indirect_dependency);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn dependencies;\n\t}\n\n\tis_readonly_media_attribute() {\n\t\treturn this.node.is_readonly_media_attribute();\n\t}\n\n\trender(block: Block, lock: Identifier) {\n\t\tif (this.is_readonly) return;\n\n\t\tconst { parent } = this;\n\n\t\tconst update_conditions: any[] = this.needs_lock ? [x`!${lock}`] : [];\n\t\tconst mount_conditions: any[] = [];\n\n\t\tconst dependency_array = [...this.node.expression.dependencies];\n\n\t\tif (dependency_array.length > 0) {\n\t\t\tupdate_conditions.push(block.renderer.dirty(dependency_array));\n\t\t}\n\n\t\tif (parent.node.name === 'input') {\n\t\t\tconst type = parent.node.get_static_attribute_value('type');\n\n\t\t\tif (type === null || type === \"\" || type === \"text\" || type === \"email\" || type === \"password\") {\n\t\t\t\tupdate_conditions.push(x`(${parent.var}.${this.node.name} !== ${this.snippet})`);\n\t\t\t}\n\t\t}\n\n\t\t// model to view\n\t\tlet update_dom = get_dom_updater(parent, this);\n\t\tlet mount_dom = update_dom;\n\n\t\t// special cases\n\t\tswitch (this.node.name) {\n\t\t\tcase 'group':\n\t\t\t{\n\t\t\t\tconst binding_group = get_binding_group(parent.renderer, this.node.expression.node);\n\n\t\t\t\tblock.renderer.add_to_context(`$$binding_groups`);\n\t\t\t\tconst reference = block.renderer.reference(`$$binding_groups`);\n\n\t\t\t\tblock.chunks.hydrate.push(\n\t\t\t\t\tb`${reference}[${binding_group}].push(${parent.var});`\n\t\t\t\t);\n\n\t\t\t\tblock.chunks.destroy.push(\n\t\t\t\t\tb`${reference}[${binding_group}].splice(${reference}[${binding_group}].indexOf(${parent.var}), 1);`\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'textContent':\n\t\t\t\tupdate_conditions.push(x`${this.snippet} !== ${parent.var}.textContent`);\n\t\t\t\tmount_conditions.push(x`${this.snippet} !== void 0`);\n\t\t\t\tbreak;\n\n\t\t\tcase 'innerHTML':\n\t\t\t\tupdate_conditions.push(x`${this.snippet} !== ${parent.var}.innerHTML`);\n\t\t\t\tmount_conditions.push(x`${this.snippet} !== void 0`);\n\t\t\t\tbreak;\n\n\t\t\tcase 'currentTime':\n\t\t\t\tupdate_conditions.push(x`!@_isNaN(${this.snippet})`);\n\t\t\t\tmount_dom = null;\n\t\t\t\tbreak;\n\n\t\t\tcase 'playbackRate':\n\t\t\tcase 'volume':\n\t\t\t\tupdate_conditions.push(x`!@_isNaN(${this.snippet})`);\n\t\t\t\tmount_conditions.push(x`!@_isNaN(${this.snippet})`);\n\t\t\t\tbreak;\n\n\t\t\tcase 'paused':\n\t\t\t{\n\t\t\t\t// this is necessary to prevent audio restarting by itself\n\t\t\t\tconst last = block.get_unique_name(`${parent.var.name}_is_paused`);\n\t\t\t\tblock.add_variable(last, x`true`);\n\n\t\t\t\tupdate_conditions.push(x`${last} !== (${last} = ${this.snippet})`);\n\t\t\t\tupdate_dom = b`${parent.var}[${last} ? \"pause\" : \"play\"]();`;\n\t\t\t\tmount_dom = null;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'value':\n\t\t\t\tif (parent.node.get_static_attribute_value('type') === 'file') {\n\t\t\t\t\tupdate_dom = null;\n\t\t\t\t\tmount_dom = null;\n\t\t\t\t}\n\t\t}\n\n\t\tif (update_dom) {\n\t\t\tif (update_conditions.length > 0) {\n\t\t\t\tconst condition = update_conditions.reduce((lhs, rhs) => x`${lhs} && ${rhs}`);\n\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${condition}) {\n\t\t\t\t\t\t${update_dom}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.update.push(update_dom);\n\t\t\t}\n\t\t}\n\n\t\tif (mount_dom) {\n\t\t\tif (mount_conditions.length > 0) {\n\t\t\t\tconst condition = mount_conditions.reduce((lhs, rhs) => x`${lhs} && ${rhs}`);\n\n\t\t\t\tblock.chunks.mount.push(b`\n\t\t\t\t\tif (${condition}) {\n\t\t\t\t\t\t${mount_dom}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.mount.push(mount_dom);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction get_dom_updater(\n\telement: ElementWrapper,\n\tbinding: BindingWrapper\n) {\n\tconst { node } = element;\n\n\tif (binding.is_readonly_media_attribute()) {\n\t\treturn null;\n\t}\n\n\tif (binding.node.name === 'this') {\n\t\treturn null;\n\t}\n\n\tif (node.name === 'select') {\n\t\treturn node.get_static_attribute_value('multiple') === true ?\n\t\t\tb`@select_options(${element.var}, ${binding.snippet})` :\n\t\t\tb`@select_option(${element.var}, ${binding.snippet})`;\n\t}\n\n\tif (binding.node.name === 'group') {\n\t\tconst type = node.get_static_attribute_value('type');\n\n\t\tconst condition = type === 'checkbox'\n\t\t\t? x`~${binding.snippet}.indexOf(${element.var}.__value)`\n\t\t\t: x`${element.var}.__value === ${binding.snippet}`;\n\n\t\treturn b`${element.var}.checked = ${condition};`;\n\t}\n\n\tif (binding.node.name === 'value') {\n\t\treturn b`@set_input_value(${element.var}, ${binding.snippet});`;\n\t}\n\n\treturn b`${element.var}.${binding.node.name} = ${binding.snippet};`;\n}\n\nfunction get_binding_group(renderer: Renderer, value: Node) {\n\tconst { parts } = flatten_reference(value); // TODO handle cases involving computed member expressions\n\tconst keypath = parts.join('.');\n\n\t// TODO handle contextual bindings — `keypath` should include unique ID of\n\t// each block that provides context\n\tlet index = renderer.binding_groups.indexOf(keypath);\n\tif (index === -1) {\n\t\tindex = renderer.binding_groups.length;\n\t\trenderer.binding_groups.push(keypath);\n\t}\n\n\treturn index;\n}\n\nfunction get_event_handler(\n\tbinding: BindingWrapper,\n\trenderer: Renderer,\n\tblock: Block,\n\tname: string,\n\tlhs: Node\n): {\n\tuses_context: boolean;\n\tmutation: (Node | Node[]);\n\tcontextual_dependencies: Set<string>;\n\tlhs?: Node;\n} {\n\tconst value = get_value_from_dom(renderer, binding.parent, binding);\n\tconst contextual_dependencies = new Set(binding.node.expression.contextual_dependencies);\n\n\tconst context = block.bindings.get(name);\n\tlet set_store;\n\n\tif (context) {\n\t\tconst { object, property, modifier, store } = context;\n\n\t\tif (lhs.type === 'Identifier') {\n\t\t\tlhs = modifier(x`${object}[${property}]`);\n\n\t\t\tcontextual_dependencies.add(object.name);\n\t\t\tcontextual_dependencies.add(property.name);\n\t\t}\n\n\t\tif (store) {\n\t\t\tset_store = b`${store}.set(${`$${store}`});`;\n\t\t}\n\t} else {\n\t\tconst object = get_object(lhs);\n\t\tif (object.name[0] === '$') {\n\t\t\tconst store = object.name.slice(1);\n\t\t\tset_store = b`${store}.set(${object.name});`;\n\t\t}\n\t}\n\n\tconst mutation = b`\n\t\t${lhs} = ${value};\n\t\t${set_store}\n\t`;\n\n\treturn {\n\t\tuses_context: binding.node.is_contextual || binding.node.expression.uses_context, // TODO this is messy\n\t\tmutation,\n\t\tcontextual_dependencies\n\t};\n}\n\nfunction get_value_from_dom(\n\trenderer: Renderer,\n\telement: ElementWrapper,\n\tbinding: BindingWrapper\n) {\n\tconst { node } = element;\n\tconst { name } = binding.node;\n\n\tif (name === 'this') {\n\t\treturn x`$$node`;\n\t}\n\n\t// <select bind:value='selected>\n\tif (node.name === 'select') {\n\t\treturn node.get_static_attribute_value('multiple') === true ?\n\t\t\tx`@select_multiple_value(this)` :\n\t\t\tx`@select_value(this)`;\n\t}\n\n\tconst type = node.get_static_attribute_value('type');\n\n\t// <input type='checkbox' bind:group='foo'>\n\tif (name === 'group') {\n\t\tconst binding_group = get_binding_group(renderer, binding.node.expression.node);\n\t\tif (type === 'checkbox') {\n\t\t\treturn x`@get_binding_group_value($$binding_groups[${binding_group}])`;\n\t\t}\n\n\t\treturn x`this.__value`;\n\t}\n\n\t// <input type='range|number' bind:value>\n\tif (type === 'range' || type === 'number') {\n\t\treturn x`@to_number(this.${name})`;\n\t}\n\n\tif ((name === 'buffered' || name === 'seekable' || name === 'played')) {\n\t\treturn x`@time_ranges_to_array(this.${name})`;\n\t}\n\n\t// everything else\n\treturn x`this.${name}`;\n}\n","import { b, x } from 'code-red';\nimport Block from '../../Block';\nimport Action from '../../../nodes/Action';\n\nexport default function add_actions(\n\tblock: Block,\n\ttarget: string,\n\tactions: Action[]\n) {\n\tactions.forEach(action => add_action(block, target, action));\n}\n\nexport function add_action(block: Block, target: string, action: Action) {\n\tconst { expression } = action;\n\tlet snippet;\n\tlet dependencies;\n\n\tif (expression) {\n\t\tsnippet = expression.manipulate(block);\n\t\tdependencies = expression.dynamic_dependencies();\n\t}\n\n\tconst id = block.get_unique_name(\n\t\t`${action.name.replace(/[^a-zA-Z0-9_$]/g, '_')}_action`\n\t);\n\n\tblock.add_variable(id);\n\n\tconst fn = block.renderer.reference(action.name);\n\n\tblock.event_listeners.push(\n\t\tx`@action_destroyer(${id} = ${fn}.call(null, ${target}, ${snippet}))`\n\t);\n\n\tif (dependencies && dependencies.length > 0) {\n\t\tlet condition = x`${id} && @is_function(${id}.update)`;\n\n\t\tif (dependencies.length > 0) {\n\t\t\tcondition = x`${condition} && ${block.renderer.dirty(dependencies)}`;\n\t\t}\n\n\t\tblock.chunks.update.push(\n\t\t\tb`if (${condition}) ${id}.update.call(null, ${snippet});`\n\t\t);\n\t}\n}\n","import Component from '../../Component';\nimport { walk } from 'estree-walker';\nimport is_reference from 'is-reference';\nimport flatten_reference from '../../utils/flatten_reference';\nimport { create_scopes, Scope, extract_names } from '../../utils/scope';\nimport { sanitize } from '../../../utils/names';\nimport Wrapper from '../../render_dom/wrappers/shared/Wrapper';\nimport TemplateScope from './TemplateScope';\nimport get_object from '../../utils/get_object';\nimport Block from '../../render_dom/Block';\nimport is_dynamic from '../../render_dom/wrappers/shared/is_dynamic';\nimport { b } from 'code-red';\nimport { invalidate } from '../../render_dom/invalidate';\nimport { Node, FunctionExpression, Identifier } from 'estree';\nimport { TemplateNode } from '../../../interfaces';\n\ntype Owner = Wrapper | TemplateNode;\n\nexport default class Expression {\n\ttype: 'Expression' = 'Expression';\n\tcomponent: Component;\n\towner: Owner;\n\tnode: any;\n\treferences: Set<string>;\n\tdependencies: Set<string> = new Set();\n\tcontextual_dependencies: Set<string> = new Set();\n\n\ttemplate_scope: TemplateScope;\n\tscope: Scope;\n\tscope_map: WeakMap<Node, Scope>;\n\n\tdeclarations: Array<(Node | Node[])> = [];\n\tuses_context = false;\n\n\tmanipulated: Node;\n\n\t// todo: owner type\n\tconstructor(component: Component, owner: Owner, template_scope: TemplateScope, info, lazy?: boolean) {\n\t\t// TODO revert to direct property access in prod?\n\t\tObject.defineProperties(this, {\n\t\t\tcomponent: {\n\t\t\t\tvalue: component\n\t\t\t}\n\t\t});\n\n\t\tthis.node = info;\n\t\tthis.template_scope = template_scope;\n\t\tthis.owner = owner;\n\n\t\tconst { dependencies, contextual_dependencies } = this;\n\n\t\tlet { map, scope } = create_scopes(info);\n\t\tthis.scope = scope;\n\t\tthis.scope_map = map;\n\n\t\tconst expression = this;\n\t\tlet function_expression;\n\n\t\t// discover dependencies, but don't change the code yet\n\t\twalk(info, {\n\t\t\tenter(node: any, parent: any, key: string) {\n\t\t\t\t// don't manipulate shorthand props twice\n\t\t\t\tif (key === 'value' && parent.shorthand) return;\n\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = map.get(node);\n\t\t\t\t}\n\n\t\t\t\tif (!function_expression && /FunctionExpression/.test(node.type)) {\n\t\t\t\t\tfunction_expression = node;\n\t\t\t\t}\n\n\t\t\t\tif (is_reference(node, parent)) {\n\t\t\t\t\tconst { name, nodes } = flatten_reference(node);\n\n\t\t\t\t\tif (scope.has(name)) return;\n\n\t\t\t\t\tif (name[0] === '$' && template_scope.names.has(name.slice(1))) {\n\t\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\t\tcode: `contextual-store`,\n\t\t\t\t\t\t\tmessage: `Stores must be declared at the top level of the component (this may change in a future version of Svelte)`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (template_scope.is_let(name)) {\n\t\t\t\t\t\tif (!function_expression) { // TODO should this be `!lazy` ?\n\t\t\t\t\t\t\tcontextual_dependencies.add(name);\n\t\t\t\t\t\t\tdependencies.add(name);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (template_scope.names.has(name)) {\n\t\t\t\t\t\texpression.uses_context = true;\n\n\t\t\t\t\t\tcontextual_dependencies.add(name);\n\n\t\t\t\t\t\tconst owner = template_scope.get_owner(name);\n\t\t\t\t\t\tconst is_index = owner.type === 'EachBlock' && owner.key && name === owner.index;\n\n\t\t\t\t\t\tif (!lazy || is_index) {\n\t\t\t\t\t\t\ttemplate_scope.dependencies_for_name.get(name).forEach(name => dependencies.add(name));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!lazy) {\n\t\t\t\t\t\t\tdependencies.add(name);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcomponent.add_reference(name);\n\t\t\t\t\t\tcomponent.warn_if_undefined(name, nodes[0], template_scope);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.skip();\n\t\t\t\t}\n\n\t\t\t\t// track any assignments from template expressions as mutable\n\t\t\t\tlet names;\n\t\t\t\tlet deep = false;\n\n\t\t\t\tif (function_expression) {\n\t\t\t\t\tif (node.type === 'AssignmentExpression') {\n\t\t\t\t\t\tdeep = node.left.type === 'MemberExpression';\n\t\t\t\t\t\tnames = deep\n\t\t\t\t\t\t\t? [get_object(node.left).name]\n\t\t\t\t\t\t\t: extract_names(node.left);\n\t\t\t\t\t} else if (node.type === 'UpdateExpression') {\n\t\t\t\t\t\tconst { name } = get_object(node.argument);\n\t\t\t\t\t\tnames = [name];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (names) {\n\t\t\t\t\tnames.forEach(name => {\n\t\t\t\t\t\tif (template_scope.names.has(name)) {\n\t\t\t\t\t\t\ttemplate_scope.dependencies_for_name.get(name).forEach(name => {\n\t\t\t\t\t\t\t\tconst variable = component.var_lookup.get(name);\n\t\t\t\t\t\t\t\tif (variable) variable[deep ? 'mutated' : 'reassigned'] = true;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcomponent.add_reference(name);\n\n\t\t\t\t\t\t\tconst variable = component.var_lookup.get(name);\n\t\t\t\t\t\t\tif (variable) variable[deep ? 'mutated' : 'reassigned'] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tleave(node) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = scope.parent;\n\t\t\t\t}\n\n\t\t\t\tif (node === function_expression) {\n\t\t\t\t\tfunction_expression = null;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tdynamic_dependencies() {\n\t\treturn Array.from(this.dependencies).filter(name => {\n\t\t\tif (this.template_scope.is_let(name)) return true;\n\t\t\tif (name === '$$props') return true;\n\n\t\t\tconst variable = this.component.var_lookup.get(name);\n\t\t\treturn is_dynamic(variable);\n\t\t});\n\t}\n\n\t// TODO move this into a render-dom wrapper?\n\tmanipulate(block?: Block) {\n\t\t// TODO ideally we wouldn't end up calling this method\n\t\t// multiple times\n\t\tif (this.manipulated) return this.manipulated;\n\n\t\tconst {\n\t\t\tcomponent,\n\t\t\tdeclarations,\n\t\t\tscope_map: map,\n\t\t\ttemplate_scope,\n\t\t\towner\n\t\t} = this;\n\t\tlet scope = this.scope;\n\n\t\tlet function_expression;\n\n\t\tlet dependencies: Set<string>;\n\t\tlet contextual_dependencies: Set<string>;\n\n\t\tconst node = walk(this.node, {\n\t\t\tenter(node: any, parent: any) {\n\t\t\t\tif (node.type === 'Property' && node.shorthand) {\n\t\t\t\t\tnode.value = JSON.parse(JSON.stringify(node.value));\n\t\t\t\t\tnode.shorthand = false;\n\t\t\t\t}\n\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = map.get(node);\n\t\t\t\t}\n\n\t\t\t\tif (is_reference(node, parent)) {\n\t\t\t\t\tconst { name } = flatten_reference(node);\n\n\t\t\t\t\tif (scope.has(name)) return;\n\n\t\t\t\t\tif (function_expression) {\n\t\t\t\t\t\tif (template_scope.names.has(name)) {\n\t\t\t\t\t\t\tcontextual_dependencies.add(name);\n\n\t\t\t\t\t\t\ttemplate_scope.dependencies_for_name.get(name).forEach(dependency => {\n\t\t\t\t\t\t\t\tdependencies.add(dependency);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdependencies.add(name);\n\t\t\t\t\t\t\tcomponent.add_reference(name); // TODO is this redundant/misplaced?\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (is_contextual(component, template_scope, name)) {\n\t\t\t\t\t\tconst reference = block.renderer.reference(node);\n\t\t\t\t\t\tthis.replace(reference);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.skip();\n\t\t\t\t}\n\n\t\t\t\tif (!function_expression) {\n\t\t\t\t\tif (node.type === 'AssignmentExpression') {\n\t\t\t\t\t\t// TODO should this be a warning/error? `<p>{foo = 1}</p>`\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {\n\t\t\t\t\t\tfunction_expression = node;\n\t\t\t\t\t\tdependencies = new Set();\n\t\t\t\t\t\tcontextual_dependencies = new Set();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tleave(node: Node, parent: Node) {\n\t\t\t\tif (map.has(node)) scope = scope.parent;\n\n\t\t\t\tif (node === function_expression) {\n\t\t\t\t\tconst id = component.get_unique_name(\n\t\t\t\t\t\tsanitize(get_function_name(node, owner))\n\t\t\t\t\t);\n\n\t\t\t\t\tconst declaration = b`const ${id} = ${node}`;\n\n\t\t\t\t\tif (dependencies.size === 0 && contextual_dependencies.size === 0) {\n\t\t\t\t\t\t// we can hoist this out of the component completely\n\t\t\t\t\t\tcomponent.fully_hoisted.push(declaration);\n\n\t\t\t\t\t\tthis.replace(id as any);\n\n\t\t\t\t\t\tcomponent.add_var({\n\t\t\t\t\t\t\tname: id.name,\n\t\t\t\t\t\t\tinternal: true,\n\t\t\t\t\t\t\thoistable: true,\n\t\t\t\t\t\t\treferenced: true\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\telse if (contextual_dependencies.size === 0) {\n\t\t\t\t\t\t// function can be hoisted inside the component init\n\t\t\t\t\t\tcomponent.partly_hoisted.push(declaration);\n\n\t\t\t\t\t\tblock.renderer.add_to_context(id.name);\n\t\t\t\t\t\tthis.replace(block.renderer.reference(id));\n\t\t\t\t\t}\n\n\t\t\t\t\telse {\n\t\t\t\t\t\t// we need a combo block/init recipe\n\t\t\t\t\t\tconst deps = Array.from(contextual_dependencies);\n\n\t\t\t\t\t\t(node as FunctionExpression).params = [\n\t\t\t\t\t\t\t...deps.map(name => ({ type: 'Identifier', name } as Identifier)),\n\t\t\t\t\t\t\t...(node as FunctionExpression).params\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst context_args = deps.map(name => block.renderer.reference(name));\n\n\t\t\t\t\t\tcomponent.partly_hoisted.push(declaration);\n\n\t\t\t\t\t\tblock.renderer.add_to_context(id.name);\n\t\t\t\t\t\tconst callee = block.renderer.reference(id);\n\n\t\t\t\t\t\tthis.replace(id as any);\n\n\t\t\t\t\t\tif ((node as FunctionExpression).params.length > 0) {\n\t\t\t\t\t\t\tdeclarations.push(b`\n\t\t\t\t\t\t\t\tfunction ${id}(...args) {\n\t\t\t\t\t\t\t\t\treturn ${callee}(${context_args}, ...args);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdeclarations.push(b`\n\t\t\t\t\t\t\t\tfunction ${id}() {\n\t\t\t\t\t\t\t\t\treturn ${callee}(${context_args});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction_expression = null;\n\t\t\t\t\tdependencies = null;\n\t\t\t\t\tcontextual_dependencies = null;\n\n\t\t\t\t\tif (parent && parent.type === 'Property') {\n\t\t\t\t\t\tparent.method = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') {\n\t\t\t\t\tconst assignee = node.type === 'AssignmentExpression' ? node.left : node.argument;\n\n\t\t\t\t\t// normally (`a = 1`, `b.c = 2`), there'll be a single name\n\t\t\t\t\t// (a or b). In destructuring cases (`[d, e] = [e, d]`) there\n\t\t\t\t\t// may be more, in which case we need to tack the extra ones\n\t\t\t\t\t// onto the initial function call\n\t\t\t\t\tconst names = new Set(extract_names(assignee));\n\n\t\t\t\t\tconst traced: Set<string> = new Set();\n\t\t\t\t\tnames.forEach(name => {\n\t\t\t\t\t\tconst dependencies = template_scope.dependencies_for_name.get(name);\n\t\t\t\t\t\tif (dependencies) {\n\t\t\t\t\t\t\tdependencies.forEach(name => traced.add(name));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttraced.add(name);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.replace(invalidate(block.renderer, scope, node, traced));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (declarations.length > 0) {\n\t\t\tblock.maintain_context = true;\n\t\t\tdeclarations.forEach(declaration => {\n\t\t\t\tblock.chunks.init.push(declaration);\n\t\t\t});\n\t\t}\n\n\t\treturn (this.manipulated = node);\n\t}\n}\n\nfunction get_function_name(_node, parent) {\n\tif (parent.type === 'EventHandler') {\n\t\treturn `${parent.name}_handler`;\n\t}\n\n\tif (parent.type === 'Action') {\n\t\treturn `${parent.name}_function`;\n\t}\n\n\treturn 'func';\n}\n\nfunction is_contextual(component: Component, scope: TemplateScope, name: string) {\n\tif (name === '$$props') return true;\n\n\t// if it's a name below root scope, it's contextual\n\tif (!scope.is_top_level(name)) return true;\n\n\tconst variable = component.var_lookup.get(name);\n\n\t// hoistables, module declarations, and imports are non-contextual\n\tif (!variable || variable.hoistable) return false;\n\n\t// assume contextual\n\treturn true;\n}\n","import Renderer from '../../Renderer';\nimport Element from '../../../nodes/Element';\nimport Wrapper from '../shared/Wrapper';\nimport Block from '../../Block';\nimport { is_void, sanitize } from '../../../../utils/names';\nimport FragmentWrapper from '../Fragment';\nimport { escape_html, string_literal } from '../../../utils/stringify';\nimport TextWrapper from '../Text';\nimport TagWrapper from '../shared/Tag';\nimport fix_attribute_casing from './fix_attribute_casing';\nimport { b, x } from 'code-red';\nimport { namespaces } from '../../../../utils/namespaces';\nimport AttributeWrapper from './Attribute';\nimport StyleAttributeWrapper from './StyleAttribute';\nimport { dimensions } from '../../../../utils/patterns';\nimport Binding from './Binding';\nimport InlineComponentWrapper from '../InlineComponent';\nimport add_to_set from '../../../utils/add_to_set';\nimport { add_event_handler } from '../shared/add_event_handlers';\nimport { add_action } from '../shared/add_actions';\nimport create_debugging_comment from '../shared/create_debugging_comment';\nimport { get_slot_definition } from '../shared/get_slot_definition';\nimport bind_this from '../shared/bind_this';\nimport { is_head } from '../shared/is_head';\nimport { Identifier } from 'estree';\nimport EventHandler from './EventHandler';\nimport { extract_names } from 'periscopic';\nimport Action from '../../../nodes/Action';\n\nconst events = [\n\t{\n\t\tevent_names: ['input'],\n\t\tfilter: (node: Element, _name: string) =>\n\t\t\tnode.name === 'textarea' ||\n\t\t\tnode.name === 'input' && !/radio|checkbox|range|file/.test(node.get_static_attribute_value('type') as string)\n\t},\n\t{\n\t\tevent_names: ['input'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\t(name === 'textContent' || name === 'innerHTML') &&\n\t\t\tnode.attributes.some(attribute => attribute.name === 'contenteditable')\n\t},\n\t{\n\t\tevent_names: ['change'],\n\t\tfilter: (node: Element, _name: string) =>\n\t\t\tnode.name === 'select' ||\n\t\t\tnode.name === 'input' && /radio|checkbox|file/.test(node.get_static_attribute_value('type') as string)\n\t},\n\t{\n\t\tevent_names: ['change', 'input'],\n\t\tfilter: (node: Element, _name: string) =>\n\t\t\tnode.name === 'input' && node.get_static_attribute_value('type') === 'range'\n\t},\n\n\t{\n\t\tevent_names: ['elementresize'],\n\t\tfilter: (_node: Element, name: string) =>\n\t\t\tdimensions.test(name)\n\t},\n\n\t// media events\n\t{\n\t\tevent_names: ['timeupdate'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\t(name === 'currentTime' || name === 'played' || name === 'ended')\n\t},\n\t{\n\t\tevent_names: ['durationchange'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\tname === 'duration'\n\t},\n\t{\n\t\tevent_names: ['play', 'pause'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\tname === 'paused'\n\t},\n\t{\n\t\tevent_names: ['progress'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\tname === 'buffered'\n\t},\n\t{\n\t\tevent_names: ['loadedmetadata'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\t(name === 'buffered' || name === 'seekable')\n\t},\n\t{\n\t\tevent_names: ['volumechange'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\tname === 'volume'\n\t},\n\t{\n\t\tevent_names: ['ratechange'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\tname === 'playbackRate'\n\t},\n\t{\n\t\tevent_names: ['seeking', 'seeked'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\t(name === 'seeking')\n\t},\n\t{\n\t\tevent_names: ['ended'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\tname === 'ended'\n\t},\n\t{\n\t\tevent_names: ['resize'],\n\t\tfilter: (node: Element, name: string) =>\n\t\t\tnode.is_media_node() &&\n\t\t\t(name === 'videoHeight' || name === 'videoWidth')\n\t},\n\n\t// details event\n\t{\n\t\tevent_names: ['toggle'],\n\t\tfilter: (node: Element, _name: string) =>\n\t\t\tnode.name === 'details'\n\t},\n];\n\nexport default class ElementWrapper extends Wrapper {\n\tnode: Element;\n\tfragment: FragmentWrapper;\n\tattributes: AttributeWrapper[];\n\tbindings: Binding[];\n\tevent_handlers: EventHandler[];\n\tclass_dependencies: string[];\n\n\tslot_block: Block;\n\tselect_binding_dependencies?: Set<string>;\n\n\tvar: any;\n\tvoid: boolean;\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: Element,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\t\tthis.var = {\n\t\t\ttype: 'Identifier',\n\t\t\tname: node.name.replace(/[^a-zA-Z0-9_$]/g, '_')\n\t\t};\n\n\t\tthis.void = is_void(node.name);\n\n\t\tthis.class_dependencies = [];\n\n\t\tif (this.node.children.length) {\n\t\t\tthis.node.lets.forEach(l => {\n\t\t\t\textract_names(l.value || l.name).forEach(name => {\n\t\t\t\t\trenderer.add_to_context(name, true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.attributes = this.node.attributes.map(attribute => {\n\t\t\tif (attribute.name === 'slot') {\n\t\t\t\t// TODO make separate subclass for this?\n\t\t\t\tlet owner = this.parent;\n\t\t\t\twhile (owner) {\n\t\t\t\t\tif (owner.node.type === 'InlineComponent') {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (owner.node.type === 'Element' && /-/.test(owner.node.name)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\towner = owner.parent;\n\t\t\t\t}\n\n\t\t\t\tif (owner && owner.node.type === 'InlineComponent') {\n\t\t\t\t\tconst name = attribute.get_static_value() as string;\n\n\t\t\t\t\tif (!(owner as unknown as InlineComponentWrapper).slots.has(name)) {\n\t\t\t\t\t\tconst child_block = block.child({\n\t\t\t\t\t\t\tcomment: create_debugging_comment(node, this.renderer.component),\n\t\t\t\t\t\t\tname: this.renderer.component.get_unique_name(`create_${sanitize(name)}_slot`),\n\t\t\t\t\t\t\ttype: 'slot'\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst { scope, lets } = this.node;\n\t\t\t\t\t\tconst seen = new Set(lets.map(l => l.name.name));\n\n\t\t\t\t\t\t(owner as unknown as InlineComponentWrapper).node.lets.forEach(l => {\n\t\t\t\t\t\t\tif (!seen.has(l.name.name)) lets.push(l);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t(owner as unknown as InlineComponentWrapper).slots.set(\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tget_slot_definition(child_block, scope, lets)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.renderer.blocks.push(child_block);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.slot_block = (owner as unknown as InlineComponentWrapper).slots.get(name).block;\n\t\t\t\t\tblock = this.slot_block;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (attribute.name === 'style') {\n\t\t\t\treturn new StyleAttributeWrapper(this, block, attribute);\n\t\t\t}\n\t\t\treturn new AttributeWrapper(this, block, attribute);\n\t\t});\n\n\t\t// ordinarily, there'll only be one... but we need to handle\n\t\t// the rare case where an element can have multiple bindings,\n\t\t// e.g. <audio bind:paused bind:currentTime>\n\t\tthis.bindings = this.node.bindings.map(binding => new Binding(block, binding, this));\n\n\t\tthis.event_handlers = this.node.handlers.map(event_handler => new EventHandler(event_handler, this));\n\n\t\tif (node.intro || node.outro) {\n\t\t\tif (node.intro) block.add_intro(node.intro.is_local);\n\t\t\tif (node.outro) block.add_outro(node.outro.is_local);\n\t\t}\n\n\t\tif (node.animation) {\n\t\t\tblock.add_animation();\n\t\t}\n\n\t\t// add directive and handler dependencies\n\t\t[node.animation, node.outro, ...node.actions, ...node.classes].forEach(directive => {\n\t\t\tif (directive && directive.expression) {\n\t\t\t\tblock.add_dependencies(directive.expression.dependencies);\n\t\t\t}\n\t\t});\n\n\t\tnode.handlers.forEach(handler => {\n\t\t\tif (handler.expression) {\n\t\t\t\tblock.add_dependencies(handler.expression.dependencies);\n\t\t\t}\n\t\t});\n\n\t\tif (this.parent) {\n\t\t\tif (node.actions.length > 0 ||\n\t\t\t\tnode.animation ||\n\t\t\t\tnode.bindings.length > 0 ||\n\t\t\t\tnode.classes.length > 0 ||\n\t\t\t\tnode.intro || node.outro ||\n\t\t\t\tnode.handlers.length > 0 ||\n\t\t\t\tthis.node.name === 'option' ||\n\t\t\t\trenderer.options.dev\n\t\t\t) {\n\t\t\t\tthis.parent.cannot_use_innerhtml(); // need to use add_location\n\t\t\t\tthis.parent.not_static_content();\n\t\t\t}\n\t\t}\n\n\t\tthis.fragment = new FragmentWrapper(renderer, block, node.children, this, strip_whitespace, next_sibling);\n\n\t\tif (this.slot_block) {\n\t\t\tblock.parent.add_dependencies(block.dependencies);\n\n\t\t\t// appalling hack\n\t\t\tconst index = block.parent.wrappers.indexOf(this);\n\t\t\tblock.parent.wrappers.splice(index, 1);\n\t\t\tblock.wrappers.push(this);\n\t\t}\n\t}\n\n\trender(block: Block, parent_node: Identifier, parent_nodes: Identifier) {\n\t\tconst { renderer } = this;\n\n\t\tif (this.node.name === 'noscript') return;\n\n\t\tif (this.slot_block) {\n\t\t\tblock = this.slot_block;\n\t\t}\n\n\t\tconst node = this.var;\n\t\tconst nodes = parent_nodes && block.get_unique_name(`${this.var.name}_nodes`); // if we're in unclaimable territory, i.e. <head>, parent_nodes is null\n\t\tconst children = x`@children(${this.node.name === 'template' ? x`${node}.content` : node})`;\n\n\t\tblock.add_variable(node);\n\t\tconst render_statement = this.get_render_statement(block);\n\t\tblock.chunks.create.push(\n\t\t\tb`${node} = ${render_statement};`\n\t\t);\n\n\t\tif (renderer.options.hydratable) {\n\t\t\tif (parent_nodes) {\n\t\t\t\tblock.chunks.claim.push(b`\n\t\t\t\t\t${node} = ${this.get_claim_statement(parent_nodes)};\n\t\t\t\t`);\n\n\t\t\t\tif (!this.void && this.node.children.length > 0) {\n\t\t\t\t\tblock.chunks.claim.push(b`\n\t\t\t\t\t\tvar ${nodes} = ${children};\n\t\t\t\t\t`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tblock.chunks.claim.push(\n\t\t\t\t\tb`${node} = ${render_statement};`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (parent_node) {\n\t\t\tblock.chunks.mount.push(\n\t\t\t\tb`@append(${parent_node}, ${node});`\n\t\t\t);\n\n\t\t\tif (is_head(parent_node)) {\n\t\t\t\tblock.chunks.destroy.push(b`@detach(${node});`);\n\t\t\t}\n\t\t} else {\n\t\t\tblock.chunks.mount.push(b`@insert(#target, ${node}, anchor);`);\n\n\t\t\t// TODO we eventually need to consider what happens to elements\n\t\t\t// that belong to the same outgroup as an outroing element...\n\t\t\tblock.chunks.destroy.push(b`if (detaching) @detach(${node});`);\n\t\t}\n\n\t\t// insert static children with textContent or innerHTML\n\t\tconst can_use_textcontent = this.can_use_textcontent();\n\t\tif (!this.node.namespace && (this.can_use_innerhtml || can_use_textcontent) && this.fragment.nodes.length > 0) {\n\t\t\tif (this.fragment.nodes.length === 1 && this.fragment.nodes[0].node.type === 'Text') {\n\t\t\t\tblock.chunks.create.push(\n\t\t\t\t\t // @ts-ignore todo: should it be this.fragment.nodes[0].node.data instead?\n\t\t\t\t\tb`${node}.textContent = ${string_literal(this.fragment.nodes[0].data)};`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst state = {\n\t\t\t\t\tquasi: {\n\t\t\t\t\t\ttype: 'TemplateElement',\n\t\t\t\t\t\tvalue: { raw: '' }\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst literal = {\n\t\t\t\t\ttype: 'TemplateLiteral',\n\t\t\t\t\texpressions: [],\n\t\t\t\t\tquasis: []\n\t\t\t\t};\n\n\t\t\t\tconst can_use_raw_text = !this.can_use_innerhtml && can_use_textcontent;\n\t\t\t\tto_html((this.fragment.nodes as unknown as Array<ElementWrapper | TextWrapper>), block, literal, state, can_use_raw_text);\n\t\t\t\tliteral.quasis.push(state.quasi);\n\n\t\t\t\tblock.chunks.create.push(\n\t\t\t\t\tb`${node}.${this.can_use_innerhtml ? 'innerHTML': 'textContent'} = ${literal};`\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.fragment.nodes.forEach((child: Wrapper) => {\n\t\t\t\tchild.render(\n\t\t\t\t\tblock,\n\t\t\t\t\tthis.node.name === 'template' ? x`${node}.content` : node,\n\t\t\t\t\tnodes\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tconst event_handler_or_binding_uses_context = (\n\t\t\tthis.bindings.some(binding => binding.handler.uses_context) ||\n\t\t\tthis.node.handlers.some(handler => handler.uses_context) ||\n\t\t\tthis.node.actions.some(action => action.uses_context)\n\t\t);\n\n\t\tif (event_handler_or_binding_uses_context) {\n\t\t\tblock.maintain_context = true;\n\t\t}\n\n\t\tthis.add_attributes(block);\n\t\tthis.add_directives_in_order(block);\n\t\tthis.add_transitions(block);\n\t\tthis.add_animation(block);\n\t\tthis.add_classes(block);\n\t\tthis.add_manual_style_scoping(block);\n\n\t\tif (nodes && this.renderer.options.hydratable && !this.void) {\n\t\t\tblock.chunks.claim.push(\n\t\t\t\tb`${this.node.children.length > 0 ? nodes : children}.children.forEach(@detach);`\n\t\t\t);\n\t\t}\n\n\t\tif (renderer.options.dev) {\n\t\t\tconst loc = renderer.locate(this.node.start);\n\t\t\tblock.chunks.hydrate.push(\n\t\t\t\tb`@add_location(${this.var}, ${renderer.file_var}, ${loc.line - 1}, ${loc.column}, ${this.node.start});`\n\t\t\t);\n\t\t}\n\t}\n\n\tcan_use_textcontent() {\n\t\treturn this.is_static_content && this.fragment.nodes.every(node => node.node.type === 'Text' || node.node.type === 'MustacheTag');\n\t}\n\n\tget_render_statement(block: Block) {\n\t\tconst { name, namespace } = this.node;\n\n\t\tif (namespace === 'http://www.w3.org/2000/svg') {\n\t\t\treturn x`@svg_element(\"${name}\")`;\n\t\t}\n\n\t\tif (namespace) {\n\t\t\treturn x`@_document.createElementNS(\"${namespace}\", \"${name}\")`;\n\t\t}\n\n\t\tconst is = this.attributes.find(attr => attr.node.name === 'is');\n\t\tif (is) {\n\t\t\treturn x`@element_is(\"${name}\", ${is.render_chunks(block).reduce((lhs, rhs) => x`${lhs} + ${rhs}`)});`;\n\t\t}\n\n\t\treturn x`@element(\"${name}\")`;\n\t}\n\n\tget_claim_statement(nodes: Identifier) {\n\t\tconst name = this.node.namespace\n\t\t\t? this.node.name\n\t\t\t: this.node.name.toUpperCase();\n\n\t\tconst svg = this.node.namespace === namespaces.svg ? 1 : null;\n\n\t\treturn x`@claim_element(${nodes}, \"${name}\", null, ${svg})`;\n\t}\n\n\tadd_directives_in_order (block: Block) {\n\t\tinterface BindingGroup {\n\t\t\tevents: string[];\n\t\t\tbindings: Binding[];\n\t\t}\n\n\t\ttype OrderedAttribute = EventHandler | BindingGroup | Binding | Action;\n\n\t\tconst bindingGroups = events\n\t\t\t.map(event => ({\n\t\t\t\tevents: event.event_names,\n\t\t\t\tbindings: this.bindings\n\t\t\t\t\t.filter(binding => binding.node.name !== 'this')\n\t\t\t\t\t.filter(binding => event.filter(this.node, binding.node.name))\n\t\t\t}))\n\t\t\t.filter(group => group.bindings.length);\n\n\t\tconst this_binding = this.bindings.find(b => b.node.name === 'this');\n\n\t\tfunction getOrder (item: OrderedAttribute) {\n\t\t\tif (item instanceof EventHandler) {\n\t\t\t\treturn item.node.start;\n\t\t\t} else if (item instanceof Binding) {\n\t\t\t\treturn item.node.start;\n\t\t\t} else if (item instanceof Action) {\n\t\t\t\treturn item.start;\n\t\t\t} else {\n\t\t\t\treturn item.bindings[0].node.start;\n\t\t\t}\n\t\t}\n\n\t\t([\n\t\t\t...bindingGroups,\n\t\t\t...this.event_handlers,\n\t\t\tthis_binding,\n\t\t\t...this.node.actions\n\t\t] as OrderedAttribute[])\n\t\t\t.filter(Boolean)\n\t\t\t.sort((a, b) => getOrder(a) - getOrder(b))\n\t\t\t.forEach(item => {\n\t\t\t\tif (item instanceof EventHandler) {\n\t\t\t\t\tadd_event_handler(block, this.var, item);\n\t\t\t\t} else if (item instanceof Binding) {\n\t\t\t\t\tthis.add_this_binding(block, item);\n\t\t\t\t} else if (item instanceof Action) {\n\t\t\t\t\tadd_action(block, this.var, item);\n\t\t\t\t} else {\n\t\t\t\t\tthis.add_bindings(block, item);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tadd_bindings(block: Block, bindingGroup) {\n\t\tconst { renderer } = this;\n\n\t\tif (bindingGroup.bindings.length === 0) return;\n\n\t\trenderer.component.has_reactive_assignments = true;\n\n\t\tconst lock = bindingGroup.bindings.some(binding => binding.needs_lock) ?\n\t\t\tblock.get_unique_name(`${this.var.name}_updating`) :\n\t\t\tnull;\n\n\t\tif (lock) block.add_variable(lock, x`false`);\n\n\t\t[bindingGroup].forEach(group => {\n\t\t\tconst handler = renderer.component.get_unique_name(`${this.var.name}_${group.events.join('_')}_handler`);\n\t\t\trenderer.add_to_context(handler.name);\n\n\t\t\t// TODO figure out how to handle locks\n\t\t\tconst needs_lock = group.bindings.some(binding => binding.needs_lock);\n\n\t\t\tconst dependencies: Set<string> = new Set();\n\t\t\tconst contextual_dependencies: Set<string> = new Set();\n\n\t\t\tgroup.bindings.forEach(binding => {\n\t\t\t\t// TODO this is a mess\n\t\t\t\tadd_to_set(dependencies, binding.get_dependencies());\n\t\t\t\tadd_to_set(contextual_dependencies, binding.node.expression.contextual_dependencies);\n\t\t\t\tadd_to_set(contextual_dependencies, binding.handler.contextual_dependencies);\n\n\t\t\t\tbinding.render(block, lock);\n\t\t\t});\n\n\t\t\t// media bindings — awkward special case. The native timeupdate events\n\t\t\t// fire too infrequently, so we need to take matters into our\n\t\t\t// own hands\n\t\t\tlet animation_frame;\n\t\t\tif (group.events[0] === 'timeupdate') {\n\t\t\t\tanimation_frame = block.get_unique_name(`${this.var.name}_animationframe`);\n\t\t\t\tblock.add_variable(animation_frame);\n\t\t\t}\n\n\t\t\tconst has_local_function = contextual_dependencies.size > 0 || needs_lock || animation_frame;\n\n\t\t\tlet callee = renderer.reference(handler);\n\n\t\t\t// TODO dry this out — similar code for event handlers and component bindings\n\t\t\tif (has_local_function) {\n\t\t\t\tconst args = Array.from(contextual_dependencies).map(name => renderer.reference(name));\n\n\t\t\t\t// need to create a block-local function that calls an instance-level function\n\t\t\t\tif (animation_frame) {\n\t\t\t\t\tblock.chunks.init.push(b`\n\t\t\t\t\t\tfunction ${handler}() {\n\t\t\t\t\t\t\t@_cancelAnimationFrame(${animation_frame});\n\t\t\t\t\t\t\tif (!${this.var}.paused) {\n\t\t\t\t\t\t\t\t${animation_frame} = @raf(${handler});\n\t\t\t\t\t\t\t\t${needs_lock && b`${lock} = true;`}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t${callee}.call(${this.var}, ${args});\n\t\t\t\t\t\t}\n\t\t\t\t\t`);\n\t\t\t\t} else {\n\t\t\t\t\tblock.chunks.init.push(b`\n\t\t\t\t\t\tfunction ${handler}() {\n\t\t\t\t\t\t\t${needs_lock && b`${lock} = true;`}\n\t\t\t\t\t\t\t${callee}.call(${this.var}, ${args});\n\t\t\t\t\t\t}\n\t\t\t\t\t`);\n\t\t\t\t}\n\n\t\t\t\tcallee = handler;\n\t\t\t}\n\n\t\t\tconst params = Array.from(contextual_dependencies).map(name => ({\n\t\t\t\ttype: 'Identifier',\n\t\t\t\tname\n\t\t\t}));\n\n\t\t\tthis.renderer.component.partly_hoisted.push(b`\n\t\t\t\tfunction ${handler}(${params}) {\n\t\t\t\t\t${group.bindings.map(b => b.handler.mutation)}\n\t\t\t\t\t${Array.from(dependencies)\n\t\t\t\t\t\t.filter(dep => dep[0] !== '$')\n\t\t\t\t\t\t.filter(dep => !contextual_dependencies.has(dep))\n\t\t\t\t\t\t.map(dep => b`${this.renderer.invalidate(dep)};`)}\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tgroup.events.forEach(name => {\n\t\t\t\tif (name === 'elementresize') {\n\t\t\t\t\t// special case\n\t\t\t\t\tconst resize_listener = block.get_unique_name(`${this.var.name}_resize_listener`);\n\t\t\t\t\tblock.add_variable(resize_listener);\n\n\t\t\t\t\tblock.chunks.mount.push(\n\t\t\t\t\t\tb`${resize_listener} = @add_resize_listener(${this.var}, ${callee}.bind(${this.var}));`\n\t\t\t\t\t);\n\n\t\t\t\t\tblock.chunks.destroy.push(\n\t\t\t\t\t\tb`${resize_listener}.cancel();`\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tblock.event_listeners.push(\n\t\t\t\t\t\tx`@listen(${this.var}, \"${name}\", ${callee})`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst some_initial_state_is_undefined = group.bindings\n\t\t\t\t.map(binding => x`${binding.snippet} === void 0`)\n\t\t\t\t.reduce((lhs, rhs) => x`${lhs} || ${rhs}`);\n\n\t\t\tconst should_initialise = (\n\t\t\t\tthis.node.name === 'select' ||\n\t\t\t\tgroup.bindings.find(binding => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tbinding.node.name === 'indeterminate' ||\n\t\t\t\t\t\tbinding.node.name === 'textContent' ||\n\t\t\t\t\t\tbinding.node.name === 'innerHTML' ||\n\t\t\t\t\t\tbinding.is_readonly_media_attribute()\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tif (should_initialise) {\n\t\t\t\tconst callback = has_local_function ? handler : x`() => ${callee}.call(${this.var})`;\n\t\t\t\tblock.chunks.hydrate.push(\n\t\t\t\t\tb`if (${some_initial_state_is_undefined}) @add_render_callback(${callback});`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (group.events[0] === 'elementresize') {\n\t\t\t\tblock.chunks.hydrate.push(\n\t\t\t\t\tb`@add_render_callback(() => ${callee}.call(${this.var}));`\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tif (lock) {\n\t\t\tblock.chunks.update.push(b`${lock} = false;`);\n\t\t}\n\t}\n\n\tadd_this_binding(block: Block, this_binding: Binding) {\n\t\tconst { renderer } = this;\n\t\t\n\t\trenderer.component.has_reactive_assignments = true;\n\n\t\tconst binding_callback = bind_this(renderer.component, block, this_binding.node, this.var);\n\t\tblock.chunks.mount.push(binding_callback);\n\t}\n\n\tadd_attributes(block: Block) {\n\t\t// Get all the class dependencies first\n\t\tthis.attributes.forEach((attribute) => {\n\t\t\tif (attribute.node.name === 'class') {\n\t\t\t\tconst dependencies = attribute.node.get_dependencies();\n\t\t\t\tthis.class_dependencies.push(...dependencies);\n\t\t\t}\n\t\t});\n\n\t\tif (this.node.attributes.some(attr => attr.is_spread)) {\n\t\t\tthis.add_spread_attributes(block);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.attributes.forEach((attribute) => {\n\t\t\tattribute.render(block);\n\t\t});\n\t}\n\n\tadd_spread_attributes(block: Block) {\n\t\tconst levels = block.get_unique_name(`${this.var.name}_levels`);\n\t\tconst data = block.get_unique_name(`${this.var.name}_data`);\n\n\t\tconst initial_props = [];\n\t\tconst updates = [];\n\n\t\tthis.attributes\n\t\t\t.forEach(attr => {\n\t\t\t\tconst condition = attr.node.dependencies.size > 0\n\t\t\t\t\t? block.renderer.dirty(Array.from(attr.node.dependencies))\n\t\t\t\t\t: null;\n\n\t\t\t\tif (attr.node.is_spread) {\n\t\t\t\t\tconst snippet = attr.node.expression.manipulate(block);\n\n\t\t\t\t\tinitial_props.push(snippet);\n\n\t\t\t\t\tupdates.push(condition ? x`${condition} && ${snippet}` : snippet);\n\t\t\t\t} else {\n\t\t\t\t\tconst metadata = attr.get_metadata();\n\t\t\t\t\tconst snippet = x`{ ${\n\t\t\t\t\t\t(metadata && metadata.property_name) ||\n\t\t\t\t\t\tfix_attribute_casing(attr.node.name)\n\t\t\t\t\t}: ${attr.get_value(block)} }`;\n\t\t\t\t\tinitial_props.push(snippet);\n\n\t\t\t\t\tupdates.push(condition ? x`${condition} && ${snippet}` : snippet);\n\t\t\t\t}\n\t\t\t});\n\n\t\tblock.chunks.init.push(b`\n\t\t\tlet ${levels} = [${initial_props}];\n\n\t\t\tlet ${data} = {};\n\t\t\tfor (let #i = 0; #i < ${levels}.length; #i += 1) {\n\t\t\t\t${data} = @assign(${data}, ${levels}[#i]);\n\t\t\t}\n\t\t`);\n\n\t\tconst fn = this.node.namespace === namespaces.svg ? x`@set_svg_attributes` : x`@set_attributes`;\n\n\t\tblock.chunks.hydrate.push(\n\t\t\tb`${fn}(${this.var}, ${data});`\n\t\t);\n\n\t\tblock.chunks.update.push(b`\n\t\t\t${fn}(${this.var}, @get_spread_update(${levels}, [\n\t\t\t\t${updates}\n\t\t\t]));\n\t\t`);\n\t}\n\n\tadd_transitions(\n\t\tblock: Block\n\t) {\n\t\tconst { intro, outro } = this.node;\n\t\tif (!intro && !outro) return;\n\n\t\tif (intro === outro) {\n\t\t\t// bidirectional transition\n\t\t\tconst name = block.get_unique_name(`${this.var.name}_transition`);\n\t\t\tconst snippet = intro.expression\n\t\t\t\t? intro.expression.manipulate(block)\n\t\t\t\t: x`{}`;\n\n\t\t\tblock.add_variable(name);\n\n\t\t\tconst fn = this.renderer.reference(intro.name);\n\n\t\t\tconst intro_block = b`\n\t\t\t\t@add_render_callback(() => {\n\t\t\t\t\tif (!${name}) ${name} = @create_bidirectional_transition(${this.var}, ${fn}, ${snippet}, true);\n\t\t\t\t\t${name}.run(1);\n\t\t\t\t});\n\t\t\t`;\n\n\t\t\tconst outro_block = b`\n\t\t\t\tif (!${name}) ${name} = @create_bidirectional_transition(${this.var}, ${fn}, ${snippet}, false);\n\t\t\t\t${name}.run(0);\n\t\t\t`;\n\n\t\t\tif (intro.is_local) {\n\t\t\t\tblock.chunks.intro.push(b`\n\t\t\t\t\tif (#local) {\n\t\t\t\t\t\t${intro_block}\n\t\t\t\t\t}\n\t\t\t\t`);\n\n\t\t\t\tblock.chunks.outro.push(b`\n\t\t\t\t\tif (#local) {\n\t\t\t\t\t\t${outro_block}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.intro.push(intro_block);\n\t\t\t\tblock.chunks.outro.push(outro_block);\n\t\t\t}\n\n\t\t\tblock.chunks.destroy.push(b`if (detaching && ${name}) ${name}.end();`);\n\t\t}\n\n\t\telse {\n\t\t\tconst intro_name = intro && block.get_unique_name(`${this.var.name}_intro`);\n\t\t\tconst outro_name = outro && block.get_unique_name(`${this.var.name}_outro`);\n\n\t\t\tif (intro) {\n\t\t\t\tblock.add_variable(intro_name);\n\t\t\t\tconst snippet = intro.expression\n\t\t\t\t\t? intro.expression.manipulate(block)\n\t\t\t\t\t: x`{}`;\n\n\t\t\t\tconst fn = this.renderer.reference(intro.name);\n\n\t\t\t\tlet intro_block;\n\n\t\t\t\tif (outro) {\n\t\t\t\t\tintro_block = b`\n\t\t\t\t\t\t@add_render_callback(() => {\n\t\t\t\t\t\t\tif (${outro_name}) ${outro_name}.end(1);\n\t\t\t\t\t\t\tif (!${intro_name}) ${intro_name} = @create_in_transition(${this.var}, ${fn}, ${snippet});\n\t\t\t\t\t\t\t${intro_name}.start();\n\t\t\t\t\t\t});\n\t\t\t\t\t`;\n\n\t\t\t\t\tblock.chunks.outro.push(b`if (${intro_name}) ${intro_name}.invalidate();`);\n\t\t\t\t} else {\n\t\t\t\t\tintro_block = b`\n\t\t\t\t\t\tif (!${intro_name}) {\n\t\t\t\t\t\t\t@add_render_callback(() => {\n\t\t\t\t\t\t\t\t${intro_name} = @create_in_transition(${this.var}, ${fn}, ${snippet});\n\t\t\t\t\t\t\t\t${intro_name}.start();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t`;\n\t\t\t\t}\n\n\t\t\t\tif (intro.is_local) {\n\t\t\t\t\tintro_block = b`\n\t\t\t\t\t\tif (#local) {\n\t\t\t\t\t\t\t${intro_block}\n\t\t\t\t\t\t}\n\t\t\t\t\t`;\n\t\t\t\t}\n\n\t\t\t\tblock.chunks.intro.push(intro_block);\n\t\t\t}\n\n\t\t\tif (outro) {\n\t\t\t\tblock.add_variable(outro_name);\n\t\t\t\tconst snippet = outro.expression\n\t\t\t\t\t? outro.expression.manipulate(block)\n\t\t\t\t\t: x`{}`;\n\n\t\t\t\tconst fn = this.renderer.reference(outro.name);\n\n\t\t\t\tif (!intro) {\n\t\t\t\t\tblock.chunks.intro.push(b`\n\t\t\t\t\t\tif (${outro_name}) ${outro_name}.end(1);\n\t\t\t\t\t`);\n\t\t\t\t}\n\n\t\t\t\t// TODO hide elements that have outro'd (unless they belong to a still-outroing\n\t\t\t\t// group) prior to their removal from the DOM\n\t\t\t\tlet outro_block = b`\n\t\t\t\t\t${outro_name} = @create_out_transition(${this.var}, ${fn}, ${snippet});\n\t\t\t\t`;\n\n\t\t\t\tif (outro.is_local) {\n\t\t\t\t\toutro_block = b`\n\t\t\t\t\t\tif (#local) {\n\t\t\t\t\t\t\t${outro_block}\n\t\t\t\t\t\t}\n\t\t\t\t\t`;\n\t\t\t\t}\n\n\t\t\t\tblock.chunks.outro.push(outro_block);\n\n\t\t\t\tblock.chunks.destroy.push(b`if (detaching && ${outro_name}) ${outro_name}.end();`);\n\t\t\t}\n\t\t}\n\t}\n\n\tadd_animation(block: Block) {\n\t\tif (!this.node.animation) return;\n\n\t\tconst { outro } = this.node;\n\n\t\tconst rect = block.get_unique_name('rect');\n\t\tconst stop_animation = block.get_unique_name('stop_animation');\n\n\t\tblock.add_variable(rect);\n\t\tblock.add_variable(stop_animation, x`@noop`);\n\n\t\tblock.chunks.measure.push(b`\n\t\t\t${rect} = ${this.var}.getBoundingClientRect();\n\t\t`);\n\n\t\tblock.chunks.fix.push(b`\n\t\t\t@fix_position(${this.var});\n\t\t\t${stop_animation}();\n\t\t\t${outro && b`@add_transform(${this.var}, ${rect});`}\n\t\t`);\n\n\t\tconst params = this.node.animation.expression ? this.node.animation.expression.manipulate(block) : x`{}`;\n\n\t\tconst name = this.renderer.reference(this.node.animation.name);\n\n\t\tblock.chunks.animate.push(b`\n\t\t\t${stop_animation}();\n\t\t\t${stop_animation} = @create_animation(${this.var}, ${rect}, ${name}, ${params});\n\t\t`);\n\t}\n\n\tadd_classes(block: Block) {\n\t\tconst has_spread = this.node.attributes.some(attr => attr.is_spread);\n\t\tthis.node.classes.forEach(class_directive => {\n\t\t\tconst { expression, name } = class_directive;\n\t\t\tlet snippet;\n\t\t\tlet dependencies;\n\t\t\tif (expression) {\n\t\t\t\tsnippet = expression.manipulate(block);\n\t\t\t\tdependencies = expression.dependencies;\n\t\t\t} else {\n\t\t\t\tsnippet = name;\n\t\t\t\tdependencies = new Set([name]);\n\t\t\t}\n\t\t\tconst updater = b`@toggle_class(${this.var}, \"${name}\", ${snippet});`;\n\n\t\t\tblock.chunks.hydrate.push(updater);\n\n\t\t\tif (has_spread) {\n\t\t\t\tblock.chunks.update.push(updater);\n\t\t\t} else if ((dependencies && dependencies.size > 0) || this.class_dependencies.length) {\n\t\t\t\tconst all_dependencies = this.class_dependencies.concat(...dependencies);\n\t\t\t\tconst condition = block.renderer.dirty(all_dependencies);\n\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${condition}) {\n\t\t\t\t\t\t${updater}\n\t\t\t\t\t}`);\n\t\t\t}\n\t\t});\n\t}\n\n\tadd_manual_style_scoping(block) {\n\t\tif (this.node.needs_manual_style_scoping) {\n\t\t\tconst updater = b`@toggle_class(${this.var}, \"${this.node.component.stylesheet.id}\", true);`;\n\t\t\tblock.chunks.hydrate.push(updater);\n\t\t\tblock.chunks.update.push(updater);\n\t\t}\n\t}\n}\n\nfunction to_html(wrappers: Array<ElementWrapper | TextWrapper | TagWrapper>, block: Block, literal: any, state: any, can_use_raw_text?: boolean) {\n\twrappers.forEach(wrapper => {\n\t\tif (wrapper.node.type === 'Text') {\n\t\t\tif ((wrapper as TextWrapper).use_space()) state.quasi.value.raw += ' ';\n\n\t\t\tconst parent = wrapper.node.parent as Element;\n\n\t\t\tconst raw = parent && (\n\t\t\t\tparent.name === 'script' ||\n\t\t\t\tparent.name === 'style' ||\n\t\t\t\tcan_use_raw_text\n\t\t\t);\n\n\t\t\tstate.quasi.value.raw += (raw ? wrapper.node.data : escape_html(wrapper.node.data))\n\t\t\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t\t\t.replace(/`/g, '\\\\`')\n\t\t\t\t.replace(/\\$/g, '\\\\$');\n\t\t}\n\n\t\telse if (wrapper.node.type === 'MustacheTag' || wrapper.node.type === 'RawMustacheTag' ) {\n\t\t\tliteral.quasis.push(state.quasi);\n\t\t\tliteral.expressions.push(wrapper.node.expression.manipulate(block));\n\t\t\tstate.quasi = {\n\t\t\t\ttype: 'TemplateElement',\n\t\t\t\tvalue: { raw: '' }\n\t\t\t};\n\t\t}\n\n\t\telse if (wrapper.node.name === 'noscript') {\n\t\t\t// do nothing\n\t\t}\n\n\t\telse {\n\t\t\t// element\n\t\t\tstate.quasi.value.raw += `<${wrapper.node.name}`;\n\n\t\t\t(wrapper as ElementWrapper).attributes.forEach((attr: AttributeWrapper) => {\n\t\t\t\tstate.quasi.value.raw += ` ${fix_attribute_casing(attr.node.name)}=\"`;\n\n\t\t\t\tattr.node.chunks.forEach(chunk => {\n\t\t\t\t\tif (chunk.type === 'Text') {\n\t\t\t\t\t\tstate.quasi.value.raw += escape_html(chunk.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tliteral.quasis.push(state.quasi);\n\t\t\t\t\t\tliteral.expressions.push(chunk.manipulate(block));\n\n\t\t\t\t\t\tstate.quasi = {\n\t\t\t\t\t\t\ttype: 'TemplateElement',\n\t\t\t\t\t\t\tvalue: { raw: '' }\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tstate.quasi.value.raw += `\"`;\n\t\t\t});\n\n\t\t\tstate.quasi.value.raw += '>';\n\n\t\t\tif (!(wrapper as ElementWrapper).void) {\n\t\t\t\tto_html((wrapper as ElementWrapper).fragment.nodes as Array<ElementWrapper | TextWrapper>, block, literal, state);\n\n\t\t\t\tstate.quasi.value.raw += `</${wrapper.node.name}>`;\n\t\t\t}\n\t\t}\n\t});\n}\n","import Wrapper from './shared/Wrapper';\nimport Renderer from '../Renderer';\nimport Block from '../Block';\nimport EachBlock from '../../nodes/EachBlock';\nimport IfBlock from '../../nodes/IfBlock';\nimport create_debugging_comment from './shared/create_debugging_comment';\nimport ElseBlock from '../../nodes/ElseBlock';\nimport FragmentWrapper from './Fragment';\nimport { b, x } from 'code-red';\nimport { walk } from 'estree-walker';\nimport { is_head } from './shared/is_head';\nimport { Identifier, Node } from 'estree';\n\nfunction is_else_if(node: ElseBlock) {\n\treturn (\n\t\tnode && node.children.length === 1 && node.children[0].type === 'IfBlock'\n\t);\n}\n\nclass IfBlockBranch extends Wrapper {\n\tblock: Block;\n\tfragment: FragmentWrapper;\n\tdependencies?: string[];\n\tcondition?: any;\n\tsnippet?: Node;\n\tis_dynamic: boolean;\n\n\tvar = null;\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: IfBlockWrapper,\n\t\tnode: IfBlock | ElseBlock,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tconst { expression } = (node as IfBlock);\n\t\tconst is_else = !expression;\n\n\t\tif (expression) {\n\t\t\tthis.dependencies = expression.dynamic_dependencies();\n\n\t\t\t// TODO is this the right rule? or should any non-reference count?\n\t\t\t// const should_cache = !is_reference(expression.node, null) && dependencies.length > 0;\n\t\t\tlet should_cache = false;\n\t\t\twalk(expression.node, {\n\t\t\t\tenter(node) {\n\t\t\t\t\tif (node.type === 'CallExpression' || node.type === 'NewExpression') {\n\t\t\t\t\t\tshould_cache = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (should_cache) {\n\t\t\t\tthis.condition = block.get_unique_name(`show_if`);\n\t\t\t\tthis.snippet = (expression.manipulate(block) as Node);\n\t\t\t} else {\n\t\t\t\tthis.condition = expression.manipulate(block);\n\t\t\t}\n\t\t}\n\n\t\tthis.block = block.child({\n\t\t\tcomment: create_debugging_comment(node, parent.renderer.component),\n\t\t\tname: parent.renderer.component.get_unique_name(\n\t\t\t\tis_else ? `create_else_block` : `create_if_block`\n\t\t\t),\n\t\t\ttype: (node as IfBlock).expression ? 'if' : 'else'\n\t\t});\n\n\t\tthis.fragment = new FragmentWrapper(renderer, this.block, node.children, parent, strip_whitespace, next_sibling);\n\n\t\tthis.is_dynamic = this.block.dependencies.size > 0;\n\t}\n}\n\nexport default class IfBlockWrapper extends Wrapper {\n\tnode: IfBlock;\n\tbranches: IfBlockBranch[];\n\tneeds_update = false;\n\n\tvar: Identifier = { type: 'Identifier', name: 'if_block' };\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: EachBlock,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tthis.cannot_use_innerhtml();\n\t\tthis.not_static_content();\n\n\t\tthis.branches = [];\n\n\t\tconst blocks: Block[] = [];\n\t\tlet is_dynamic = false;\n\t\tlet has_intros = false;\n\t\tlet has_outros = false;\n\n\t\tconst create_branches = (node: IfBlock) => {\n\t\t\tconst branch = new IfBlockBranch(\n\t\t\t\trenderer,\n\t\t\t\tblock,\n\t\t\t\tthis,\n\t\t\t\tnode,\n\t\t\t\tstrip_whitespace,\n\t\t\t\tnext_sibling\n\t\t\t);\n\n\t\t\tthis.branches.push(branch);\n\n\t\t\tblocks.push(branch.block);\n\t\t\tblock.add_dependencies(node.expression.dependencies);\n\n\t\t\tif (branch.block.dependencies.size > 0) {\n\t\t\t\t// the condition, or its contents, is dynamic\n\t\t\t\tis_dynamic = true;\n\t\t\t\tblock.add_dependencies(branch.block.dependencies);\n\t\t\t}\n\n\t\t\tif (branch.dependencies && branch.dependencies.length > 0) {\n\t\t\t\t// the condition itself is dynamic\n\t\t\t\tthis.needs_update = true;\n\t\t\t}\n\n\t\t\tif (branch.block.has_intros) has_intros = true;\n\t\t\tif (branch.block.has_outros) has_outros = true;\n\n\t\t\tif (is_else_if(node.else)) {\n\t\t\t\tcreate_branches(node.else.children[0] as IfBlock);\n\t\t\t} else if (node.else) {\n\t\t\t\tconst branch = new IfBlockBranch(\n\t\t\t\t\trenderer,\n\t\t\t\t\tblock,\n\t\t\t\t\tthis,\n\t\t\t\t\tnode.else,\n\t\t\t\t\tstrip_whitespace,\n\t\t\t\t\tnext_sibling\n\t\t\t\t);\n\n\t\t\t\tthis.branches.push(branch);\n\n\t\t\t\tblocks.push(branch.block);\n\n\t\t\t\tif (branch.block.dependencies.size > 0) {\n\t\t\t\t\tis_dynamic = true;\n\t\t\t\t\tblock.add_dependencies(branch.block.dependencies);\n\t\t\t\t}\n\n\t\t\t\tif (branch.block.has_intros) has_intros = true;\n\t\t\t\tif (branch.block.has_outros) has_outros = true;\n\t\t\t}\n\t\t};\n\n\t\tcreate_branches(this.node);\n\n\t\tblocks.forEach(block => {\n\t\t\tblock.has_update_method = is_dynamic;\n\t\t\tblock.has_intro_method = has_intros;\n\t\t\tblock.has_outro_method = has_outros;\n\t\t});\n\n\t\trenderer.blocks.push(...blocks);\n\t}\n\n\trender(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\tparent_nodes: Identifier\n\t) {\n\t\tconst name = this.var;\n\n\t\tconst needs_anchor = this.next ? !this.next.is_dom_node() : !parent_node || !this.parent.is_dom_node();\n\t\tconst anchor = needs_anchor\n\t\t\t? block.get_unique_name(`${this.var.name}_anchor`)\n\t\t\t: (this.next && this.next.var) || 'null';\n\n\t\tconst has_else = !(this.branches[this.branches.length - 1].condition);\n\t\tconst if_exists_condition = has_else ? null : name;\n\n\t\tconst dynamic = this.branches[0].block.has_update_method; // can use [0] as proxy for all, since they necessarily have the same value\n\t\tconst has_intros = this.branches[0].block.has_intro_method;\n\t\tconst has_outros = this.branches[0].block.has_outro_method;\n\t\tconst has_transitions = has_intros || has_outros;\n\n\t\tconst vars = { name, anchor, if_exists_condition, has_else, has_transitions };\n\n\t\tconst detaching = parent_node && !is_head(parent_node) ? null : 'detaching';\n\n\t\tif (this.node.else) {\n\t\t\tthis.branches.forEach(branch => {\n\t\t\t\tif (branch.snippet) block.add_variable(branch.condition);\n\t\t\t});\n\n\t\t\tif (has_outros) {\n\t\t\t\tthis.render_compound_with_outros(block, parent_node, parent_nodes, dynamic, vars, detaching);\n\n\t\t\t\tblock.chunks.outro.push(b`@transition_out(${name});`);\n\t\t\t} else {\n\t\t\t\tthis.render_compound(block, parent_node, parent_nodes, dynamic, vars, detaching);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.render_simple(block, parent_node, parent_nodes, dynamic, vars, detaching);\n\n\t\t\tif (has_outros) {\n\t\t\t\tblock.chunks.outro.push(b`@transition_out(${name});`);\n\t\t\t}\n\t\t}\n\n\t\tif (if_exists_condition) {\n\t\t\tblock.chunks.create.push(b`if (${if_exists_condition}) ${name}.c();`);\n\t\t} else {\n\t\t\tblock.chunks.create.push(b`${name}.c();`);\n\t\t}\n\n\t\tif (parent_nodes && this.renderer.options.hydratable) {\n\t\t\tif (if_exists_condition) {\n\t\t\t\tblock.chunks.claim.push(\n\t\t\t\t\tb`if (${if_exists_condition}) ${name}.l(${parent_nodes});`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tblock.chunks.claim.push(\n\t\t\t\t\tb`${name}.l(${parent_nodes});`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (has_intros || has_outros) {\n\t\t\tblock.chunks.intro.push(b`@transition_in(${name});`);\n\t\t}\n\n\t\tif (needs_anchor) {\n\t\t\tblock.add_element(\n\t\t\t\tanchor as Identifier,\n\t\t\t\tx`@empty()`,\n\t\t\t\tparent_nodes && x`@claim_text(${parent_nodes}, '')/*IF242*/`,\n\t\t\t\tparent_node\n\t\t\t);\n\t\t}\n\n\t\tthis.branches.forEach(branch => {\n\t\t\tbranch.fragment.render(branch.block, null, x`#nodes` as unknown as Identifier);\n\t\t});\n\t}\n\n\trender_compound(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\t_parent_nodes: Identifier,\n\t\tdynamic,\n\t\t{ name, anchor, has_else, if_exists_condition, has_transitions },\n\t\tdetaching\n\t) {\n\t\tconst select_block_type = this.renderer.component.get_unique_name(`select_block_type`);\n\t\tconst current_block_type = block.get_unique_name(`current_block_type`);\n\t\tconst get_block = has_else\n\t\t\t? x`${current_block_type}(#ctx)`\n\t\t\t: x`${current_block_type} && ${current_block_type}(#ctx)`;\n\n\t\tif (this.needs_update) {\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\tfunction ${select_block_type}(#ctx, #dirty) {\n\t\t\t\t\t${this.branches.map(({ dependencies, condition, snippet, block }) => condition\n\t\t\t\t\t? b`\n\t\t\t\t\t${snippet && (\n\t\t\t\t\t\tdependencies.length > 0\n\t\t\t\t\t\t\t? b`if (${condition} == null || ${block.renderer.dirty(dependencies)}) ${condition} = !!${snippet}`\n\t\t\t\t\t\t\t: b`if (${condition} == null) ${condition} = !!${snippet}`\n\t\t\t\t\t)}\n\t\t\t\t\tif (${condition}) return ${block.name};`\n\t\t\t\t\t: b`return ${block.name};`)}\n\t\t\t\t}\n\t\t\t`);\n\t\t} else {\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\tfunction ${select_block_type}(#ctx, #dirty) {\n\t\t\t\t\t${this.branches.map(({ condition, snippet, block }) => condition\n\t\t\t\t\t? b`if (${snippet || condition}) return ${block.name};`\n\t\t\t\t\t: b`return ${block.name};`)}\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tblock.chunks.init.push(b`\n\t\t\tlet ${current_block_type} = ${select_block_type}(#ctx, -1);\n\t\t\tlet ${name} = ${get_block};\n\t\t`);\n\n\t\tconst initial_mount_node = parent_node || '#target';\n\t\tconst anchor_node = parent_node ? 'null' : 'anchor';\n\n\t\tif (if_exists_condition) {\n\t\t\tblock.chunks.mount.push(\n\t\t\t\tb`if (${if_exists_condition}) ${name}.m(${initial_mount_node}, ${anchor_node});`\n\t\t\t);\n\t\t} else {\n\t\t\tblock.chunks.mount.push(\n\t\t\t\tb`${name}.m(${initial_mount_node}, ${anchor_node});`\n\t\t\t);\n\t\t}\n\n\t\tif (this.needs_update) {\n\t\t\tconst update_mount_node = this.get_update_mount_node(anchor);\n\n\t\t\tconst change_block = b`\n\t\t\t\t${if_exists_condition ? b`if (${if_exists_condition}) ${name}.d(1)` : b`${name}.d(1)`};\n\t\t\t\t${name} = ${get_block};\n\t\t\t\tif (${name}) {\n\t\t\t\t\t${name}.c();\n\t\t\t\t\t${has_transitions && b`@transition_in(${name}, 1);`}\n\t\t\t\t\t${name}.m(${update_mount_node}, ${anchor});\n\t\t\t\t}\n\t\t\t`;\n\n\t\t\tif (dynamic) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${current_block_type} === (${current_block_type} = ${select_block_type}(#ctx, #dirty)) && ${name}) {\n\t\t\t\t\t\t${name}.p(#ctx, #dirty);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${change_block}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${current_block_type} !== (${current_block_type} = ${select_block_type}(#ctx, #dirty))) {\n\t\t\t\t\t\t${change_block}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\t\t} else if (dynamic) {\n\t\t\tblock.chunks.update.push(b`${name}.p(#ctx, #dirty);`);\n\t\t}\n\n\t\tif (if_exists_condition) {\n\t\t\tblock.chunks.destroy.push(b`\n\t\t\t\tif (${if_exists_condition}) {\n\t\t\t\t\t${name}.d(${detaching});\n\t\t\t\t}\n\t\t\t`);\n\t\t} else {\n\t\t\tblock.chunks.destroy.push(b`\n\t\t\t\t${name}.d(${detaching});\n\t\t\t`);\n\t\t}\n\t}\n\n\t// if any of the siblings have outros, we need to keep references to the blocks\n\t// (TODO does this only apply to bidi transitions?)\n\trender_compound_with_outros(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\t_parent_nodes: Identifier,\n\t\tdynamic,\n\t\t{ name, anchor, has_else, has_transitions },\n\t\tdetaching\n\t) {\n\t\tconst select_block_type = this.renderer.component.get_unique_name(`select_block_type`);\n\t\tconst current_block_type_index = block.get_unique_name(`current_block_type_index`);\n\t\tconst previous_block_index = block.get_unique_name(`previous_block_index`);\n\t\tconst if_block_creators = block.get_unique_name(`if_block_creators`);\n\t\tconst if_blocks = block.get_unique_name(`if_blocks`);\n\n\t\tconst if_current_block_type_index = has_else\n\t\t\t? nodes => nodes\n\t\t\t: nodes => b`if (~${current_block_type_index}) { ${nodes} }`;\n\n\t\tblock.add_variable(current_block_type_index);\n\t\tblock.add_variable(name);\n\n\t\tblock.chunks.init.push(b`\n\t\t\tconst ${if_block_creators} = [\n\t\t\t\t${this.branches.map(branch => branch.block.name)}\n\t\t\t];\n\n\t\t\tconst ${if_blocks} = [];\n\n\t\t\t${this.needs_update\n\t\t\t\t? b`\n\t\t\t\t\tfunction ${select_block_type}(#ctx, #dirty) {\n\t\t\t\t\t\t${this.branches.map(({ dependencies, condition, snippet }, i) => condition\n\t\t\t\t\t\t? b`\n\t\t\t\t\t\t${snippet && (\n\t\t\t\t\t\t\tdependencies.length > 0\n\t\t\t\t\t\t\t\t? b`if (${block.renderer.dirty(dependencies)}) ${condition} = !!${snippet}`\n\t\t\t\t\t\t\t\t: b`if (${condition} == -1) ${condition} = !!${snippet}`\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tif (${condition}) return ${i};`\n\t\t\t\t\t\t: b`return ${i};`)}\n\t\t\t\t\t\t${!has_else && b`return -1;`}\n\t\t\t\t\t}\n\t\t\t\t`\n\t\t\t\t: b`\n\t\t\t\t\tfunction ${select_block_type}(#ctx, #dirty) {\n\t\t\t\t\t\t${this.branches.map(({ condition, snippet }, i) => condition\n\t\t\t\t\t\t? b`if (${snippet || condition}) return ${i};`\n\t\t\t\t\t\t: b`return ${i};`)}\n\t\t\t\t\t\t${!has_else && b`return -1;`}\n\t\t\t\t\t}\n\t\t\t\t`}\n\t\t`);\n\n\t\tif (has_else) {\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\t${current_block_type_index} = ${select_block_type}(#ctx, -1);\n\t\t\t\t${name} = ${if_blocks}[${current_block_type_index}] = ${if_block_creators}[${current_block_type_index}](#ctx);\n\t\t\t`);\n\t\t} else {\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\tif (~(${current_block_type_index} = ${select_block_type}(#ctx, -1))) {\n\t\t\t\t\t${name} = ${if_blocks}[${current_block_type_index}] = ${if_block_creators}[${current_block_type_index}](#ctx);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\tconst initial_mount_node = parent_node || '#target';\n\t\tconst anchor_node = parent_node ? 'null' : 'anchor';\n\n\t\tblock.chunks.mount.push(\n\t\t\tif_current_block_type_index(\n\t\t\t\tb`${if_blocks}[${current_block_type_index}].m(${initial_mount_node}, ${anchor_node});`\n\t\t\t)\n\t\t);\n\n\t\tif (this.needs_update) {\n\t\t\tconst update_mount_node = this.get_update_mount_node(anchor);\n\n\t\t\tconst destroy_old_block = b`\n\t\t\t\t@group_outros();\n\t\t\t\t@transition_out(${if_blocks}[${previous_block_index}], 1, 1, () => {\n\t\t\t\t\t${if_blocks}[${previous_block_index}] = null;\n\t\t\t\t});\n\t\t\t\t@check_outros();\n\t\t\t`;\n\n\t\t\tconst create_new_block = b`\n\t\t\t\t${name} = ${if_blocks}[${current_block_type_index}];\n\t\t\t\tif (!${name}) {\n\t\t\t\t\t${name} = ${if_blocks}[${current_block_type_index}] = ${if_block_creators}[${current_block_type_index}](#ctx);\n\t\t\t\t\t${name}.c();\n\t\t\t\t}\n\t\t\t\t${has_transitions && b`@transition_in(${name}, 1);`}\n\t\t\t\t${name}.m(${update_mount_node}, ${anchor});\n\t\t\t`;\n\n\t\t\tconst change_block = has_else\n\t\t\t\t? b`\n\t\t\t\t\t${destroy_old_block}\n\n\t\t\t\t\t${create_new_block}\n\t\t\t\t`\n\t\t\t\t: b`\n\t\t\t\t\tif (${name}) {\n\t\t\t\t\t\t${destroy_old_block}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (~${current_block_type_index}) {\n\t\t\t\t\t\t${create_new_block}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${name} = null;\n\t\t\t\t\t}\n\t\t\t\t`;\n\n\t\t\tif (dynamic) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tlet ${previous_block_index} = ${current_block_type_index};\n\t\t\t\t\t${current_block_type_index} = ${select_block_type}(#ctx, #dirty);\n\t\t\t\t\tif (${current_block_type_index} === ${previous_block_index}) {\n\t\t\t\t\t\t${if_current_block_type_index(b`${if_blocks}[${current_block_type_index}].p(#ctx, #dirty);`)}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${change_block}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tlet ${previous_block_index} = ${current_block_type_index};\n\t\t\t\t\t${current_block_type_index} = ${select_block_type}(#ctx, #dirty);\n\t\t\t\t\tif (${current_block_type_index} !== ${previous_block_index}) {\n\t\t\t\t\t\t${change_block}\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\t\t} else if (dynamic) {\n\t\t\tblock.chunks.update.push(b`${name}.p(#ctx, #dirty);`);\n\t\t}\n\n\t\tblock.chunks.destroy.push(\n\t\t\tif_current_block_type_index(b`${if_blocks}[${current_block_type_index}].d(${detaching});`)\n\t\t);\n\t}\n\n\trender_simple(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\t_parent_nodes: Identifier,\n\t\tdynamic,\n\t\t{ name, anchor, if_exists_condition, has_transitions },\n\t\tdetaching\n\t) {\n\t\tconst branch = this.branches[0];\n\n\t\tif (branch.snippet) block.add_variable(branch.condition, branch.snippet);\n\n\t\tblock.chunks.init.push(b`\n\t\t\tlet ${name} = ${branch.condition} && ${branch.block.name}(#ctx);\n\t\t`);\n\n\t\tconst initial_mount_node = parent_node || '#target';\n\t\tconst anchor_node = parent_node ? 'null' : 'anchor';\n\n\t\tblock.chunks.mount.push(\n\t\t\tb`if (${name}) ${name}.m(${initial_mount_node}, ${anchor_node});`\n\t\t);\n\n\t\tif (branch.dependencies.length > 0) {\n\t\t\tconst update_mount_node = this.get_update_mount_node(anchor);\n\n\t\t\tconst enter = dynamic\n\t\t\t\t? b`\n\t\t\t\t\tif (${name}) {\n\t\t\t\t\t\t${name}.p(#ctx, #dirty);\n\t\t\t\t\t\t${has_transitions && b`@transition_in(${name}, 1);`}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${name} = ${branch.block.name}(#ctx);\n\t\t\t\t\t\t${name}.c();\n\t\t\t\t\t\t${has_transitions && b`@transition_in(${name}, 1);`}\n\t\t\t\t\t\t${name}.m(${update_mount_node}, ${anchor});\n\t\t\t\t\t}\n\t\t\t\t`\n\t\t\t\t: b`\n\t\t\t\t\tif (!${name}) {\n\t\t\t\t\t\t${name} = ${branch.block.name}(#ctx);\n\t\t\t\t\t\t${name}.c();\n\t\t\t\t\t\t${has_transitions && b`@transition_in(${name}, 1);`}\n\t\t\t\t\t\t${name}.m(${update_mount_node}, ${anchor});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${has_transitions && b`@transition_in(${name}, 1);`}\n\t\t\t\t\t}\n\t\t\t\t`;\n\n\t\t\tif (branch.snippet) {\n\t\t\t\tblock.chunks.update.push(b`if (${block.renderer.dirty(branch.dependencies)}) ${branch.condition} = ${branch.snippet}`);\n\t\t\t}\n\n\t\t\t// no `p()` here — we don't want to update outroing nodes,\n\t\t\t// as that will typically result in glitching\n\t\t\tif (branch.block.has_outro_method) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${branch.condition}) {\n\t\t\t\t\t\t${enter}\n\t\t\t\t\t} else if (${name}) {\n\t\t\t\t\t\t@group_outros();\n\t\t\t\t\t\t@transition_out(${name}, 1, 1, () => {\n\t\t\t\t\t\t\t${name} = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t@check_outros();\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\tif (${branch.condition}) {\n\t\t\t\t\t\t${enter}\n\t\t\t\t\t} else if (${name}) {\n\t\t\t\t\t\t${name}.d(1);\n\t\t\t\t\t\t${name} = null;\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\t\t} else if (dynamic) {\n\t\t\tblock.chunks.update.push(b`\n\t\t\t\tif (${branch.condition}) ${name}.p(#ctx, #dirty);\n\t\t\t`);\n\t\t}\n\n\t\tif (if_exists_condition) {\n\t\t\tblock.chunks.destroy.push(b`\n\t\t\t\tif (${if_exists_condition}) ${name}.d(${detaching});\n\t\t\t`);\n\t\t} else {\n\t\t\tblock.chunks.destroy.push(b`\n\t\t\t\t${name}.d(${detaching});\n\t\t\t`);\n\t\t}\n\t}\n}\n","import Wrapper from '../shared/Wrapper';\nimport Renderer from '../../Renderer';\nimport Block from '../../Block';\nimport InlineComponent from '../../../nodes/InlineComponent';\nimport FragmentWrapper from '../Fragment';\nimport { sanitize } from '../../../../utils/names';\nimport add_to_set from '../../../utils/add_to_set';\nimport { b, x, p } from 'code-red';\nimport Attribute from '../../../nodes/Attribute';\nimport get_object from '../../../utils/get_object';\nimport create_debugging_comment from '../shared/create_debugging_comment';\nimport { get_slot_definition } from '../shared/get_slot_definition';\nimport EachBlock from '../../../nodes/EachBlock';\nimport TemplateScope from '../../../nodes/shared/TemplateScope';\nimport is_dynamic from '../shared/is_dynamic';\nimport bind_this from '../shared/bind_this';\nimport { Node, Identifier, ObjectExpression } from 'estree';\nimport EventHandler from '../Element/EventHandler';\nimport { extract_names } from 'periscopic';\n\nexport default class InlineComponentWrapper extends Wrapper {\n\tvar: Identifier;\n\tslots: Map<string, { block: Block; scope: TemplateScope; get_context?: Node; get_changes?: Node }> = new Map();\n\tnode: InlineComponent;\n\tfragment: FragmentWrapper;\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: InlineComponent,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tthis.cannot_use_innerhtml();\n\t\tthis.not_static_content();\n\n\t\tif (this.node.expression) {\n\t\t\tblock.add_dependencies(this.node.expression.dependencies);\n\t\t}\n\n\t\tthis.node.attributes.forEach(attr => {\n\t\t\tblock.add_dependencies(attr.dependencies);\n\t\t});\n\n\t\tthis.node.bindings.forEach(binding => {\n\t\t\tif (binding.is_contextual) {\n\t\t\t\t// we need to ensure that the each block creates a context including\n\t\t\t\t// the list and the index, if they're not otherwise referenced\n\t\t\t\tconst { name } = get_object(binding.expression.node);\n\t\t\t\tconst each_block = this.node.scope.get_owner(name);\n\n\t\t\t\t(each_block as EachBlock).has_binding = true;\n\t\t\t}\n\n\t\t\tblock.add_dependencies(binding.expression.dependencies);\n\t\t});\n\n\t\tthis.node.handlers.forEach(handler => {\n\t\t\tif (handler.expression) {\n\t\t\t\tblock.add_dependencies(handler.expression.dependencies);\n\t\t\t}\n\t\t});\n\n\t\tthis.var = {\n\t\t\ttype: 'Identifier',\n\t\t\tname: (\n\t\t\t\tthis.node.name === 'svelte:self' ? renderer.component.name.name :\n\t\t\t\t\tthis.node.name === 'svelte:component' ? 'switch_instance' :\n\t\t\t\t\t\tsanitize(this.node.name)\n\t\t\t).toLowerCase()\n\t\t};\n\n\t\tif (this.node.children.length) {\n\t\t\tthis.node.lets.forEach(l => {\n\t\t\t\textract_names(l.value || l.name).forEach(name => {\n\t\t\t\t\trenderer.add_to_context(name, true);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst default_slot = block.child({\n\t\t\t\tcomment: create_debugging_comment(node, renderer.component),\n\t\t\t\tname: renderer.component.get_unique_name(`create_default_slot`),\n\t\t\t\ttype: 'slot'\n\t\t\t});\n\n\t\t\tthis.renderer.blocks.push(default_slot);\n\n\t\t\tthis.slots.set('default', get_slot_definition(default_slot, this.node.scope, this.node.lets));\n\t\t\tthis.fragment = new FragmentWrapper(renderer, default_slot, node.children, this, strip_whitespace, next_sibling);\n\n\t\t\tconst dependencies: Set<string> = new Set();\n\n\t\t\t// TODO is this filtering necessary? (I *think* so)\n\t\t\tdefault_slot.dependencies.forEach(name => {\n\t\t\t\tif (!this.node.scope.is_let(name)) {\n\t\t\t\t\tdependencies.add(name);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tblock.add_dependencies(dependencies);\n\t\t}\n\n\t\tblock.add_outro();\n\t}\n\n\trender(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\tparent_nodes: Identifier\n\t) {\n\t\tconst { renderer } = this;\n\t\tconst { component } = renderer;\n\n\t\tconst name = this.var;\n\n\t\tconst component_opts = x`{}` as ObjectExpression;\n\n\t\tconst statements: Array<Node | Node[]> = [];\n\t\tconst updates: Array<Node | Node[]> = [];\n\n\t\tlet props;\n\t\tconst name_changes = block.get_unique_name(`${name.name}_changes`);\n\n\t\tconst uses_spread = !!this.node.attributes.find(a => a.is_spread);\n\n\t\tconst initial_props = this.slots.size > 0\n\t\t\t? [\n\t\t\t\tp`$$slots: {\n\t\t\t\t\t${Array.from(this.slots).map(([name, slot]) => {\n\t\t\t\t\t\treturn p`${name}: [${slot.block.name}, ${slot.get_context || null}, ${slot.get_changes || null}]`;\n\t\t\t\t\t})}\n\t\t\t\t}`,\n\t\t\t\tp`$$scope: {\n\t\t\t\t\tctx: #ctx\n\t\t\t\t}`\n\t\t\t]\n\t\t\t: [];\n\n\t\tconst attribute_object = uses_spread\n\t\t\t? x`{ ${initial_props} }`\n\t\t\t: x`{\n\t\t\t\t${this.node.attributes.map(attr => p`${attr.name}: ${attr.get_value(block)}`)},\n\t\t\t\t${initial_props}\n\t\t\t}`;\n\n\t\tif (this.node.attributes.length || this.node.bindings.length || initial_props.length) {\n\t\t\tif (!uses_spread && this.node.bindings.length === 0) {\n\t\t\t\tcomponent_opts.properties.push(p`props: ${attribute_object}`);\n\t\t\t} else {\n\t\t\t\tprops = block.get_unique_name(`${name.name}_props`);\n\t\t\t\tcomponent_opts.properties.push(p`props: ${props}`);\n\t\t\t}\n\t\t}\n\n\t\tif (this.fragment) {\n\t\t\tthis.renderer.add_to_context('$$scope', true);\n\t\t\tconst default_slot = this.slots.get('default');\n\n\t\t\tthis.fragment.nodes.forEach((child) => {\n\t\t\t\tchild.render(default_slot.block, null, x`#nodes` as unknown as Identifier);\n\t\t\t});\n\t\t}\n\n\t\tif (component.compile_options.dev) {\n\t\t\t// TODO this is a terrible hack, but without it the component\n\t\t\t// will complain that options.target is missing. This would\n\t\t\t// work better if components had separate public and private\n\t\t\t// APIs\n\t\t\tcomponent_opts.properties.push(p`$$inline: true`);\n\t\t}\n\n\t\tconst fragment_dependencies = new Set(this.fragment ? ['$$scope'] : []);\n\t\tthis.slots.forEach(slot => {\n\t\t\tslot.block.dependencies.forEach(name => {\n\t\t\t\tconst is_let = slot.scope.is_let(name);\n\t\t\t\tconst variable = renderer.component.var_lookup.get(name);\n\n\t\t\t\tif (is_let || is_dynamic(variable)) fragment_dependencies.add(name);\n\t\t\t});\n\t\t});\n\n\t\tconst dynamic_attributes = this.node.attributes.filter(a => a.get_dependencies().length > 0);\n\n\t\tif (!uses_spread && (dynamic_attributes.length > 0 || this.node.bindings.length > 0 || fragment_dependencies.size > 0)) {\n\t\t\tupdates.push(b`const ${name_changes} = {};`);\n\t\t}\n\n\t\tif (this.node.attributes.length) {\n\t\t\tif (uses_spread) {\n\t\t\t\tconst levels = block.get_unique_name(`${this.var.name}_spread_levels`);\n\n\t\t\t\tconst initial_props = [];\n\t\t\t\tconst changes = [];\n\n\t\t\t\tconst all_dependencies: Set<string> = new Set();\n\n\t\t\t\tthis.node.attributes.forEach(attr => {\n\t\t\t\t\tadd_to_set(all_dependencies, attr.dependencies);\n\t\t\t\t});\n\n\t\t\t\tthis.node.attributes.forEach((attr, i) => {\n\t\t\t\t\tconst { name, dependencies } = attr;\n\n\t\t\t\t\tconst condition = dependencies.size > 0 && (dependencies.size !== all_dependencies.size)\n\t\t\t\t\t\t? renderer.dirty(Array.from(dependencies))\n\t\t\t\t\t\t: null;\n\n\t\t\t\t\tif (attr.is_spread) {\n\t\t\t\t\t\tconst value = attr.expression.manipulate(block);\n\t\t\t\t\t\tinitial_props.push(value);\n\n\t\t\t\t\t\tlet value_object = value;\n\t\t\t\t\t\tif (attr.expression.node.type !== 'ObjectExpression') {\n\t\t\t\t\t\t\tvalue_object = x`@get_spread_object(${value})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchanges.push(condition ? x`${condition} && ${value_object}` : value_object);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst obj = x`{ ${name}: ${attr.get_value(block)} }`;\n\t\t\t\t\t\tinitial_props.push(obj);\n\n\t\t\t\t\t\tchanges.push(condition ? x`${condition} && ${obj}` : x`${levels}[${i}]`);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tblock.chunks.init.push(b`\n\t\t\t\t\tconst ${levels} = [\n\t\t\t\t\t\t${initial_props}\n\t\t\t\t\t];\n\t\t\t\t`);\n\n\t\t\t\tstatements.push(b`\n\t\t\t\t\tfor (let #i = 0; #i < ${levels}.length; #i += 1) {\n\t\t\t\t\t\t${props} = @assign(${props}, ${levels}[#i]);\n\t\t\t\t\t}\n\t\t\t\t`);\n\n\t\t\t\tif (all_dependencies.size) {\n\t\t\t\t\tconst condition = renderer.dirty(Array.from(all_dependencies));\n\n\t\t\t\t\tupdates.push(b`\n\t\t\t\t\t\tconst ${name_changes} = ${condition} ? @get_spread_update(${levels}, [\n\t\t\t\t\t\t\t${changes}\n\t\t\t\t\t\t]) : {}\n\t\t\t\t\t`);\n\t\t\t\t} else {\n\t\t\t\t\tupdates.push(b`\n\t\t\t\t\t\tconst ${name_changes} = {};\n\t\t\t\t\t`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdynamic_attributes.forEach((attribute: Attribute) => {\n\t\t\t\t\tconst dependencies = attribute.get_dependencies();\n\t\t\t\t\tif (dependencies.length > 0) {\n\t\t\t\t\t\tconst condition = renderer.dirty(dependencies);\n\n\t\t\t\t\t\tupdates.push(b`\n\t\t\t\t\t\t\tif (${condition}) ${name_changes}.${attribute.name} = ${attribute.get_value(block)};\n\t\t\t\t\t\t`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (fragment_dependencies.size > 0) {\n\t\t\tupdates.push(b`\n\t\t\t\tif (${renderer.dirty(Array.from(fragment_dependencies))}) {\n\t\t\t\t\t${name_changes}.$$scope = { dirty: #dirty, ctx: #ctx };\n\t\t\t\t}`);\n\t\t}\n\n\t\tconst munged_bindings = this.node.bindings.map(binding => {\n\t\t\tcomponent.has_reactive_assignments = true;\n\n\t\t\tif (binding.name === 'this') {\n\t\t\t\treturn bind_this(component, block, binding, this.var);\n\t\t\t}\n\n\t\t\tconst id = component.get_unique_name(`${this.var.name}_${binding.name}_binding`);\n\t\t\trenderer.add_to_context(id.name);\n\t\t\tconst callee = renderer.reference(id);\n\n\t\t\tconst updating = block.get_unique_name(`updating_${binding.name}`);\n\t\t\tblock.add_variable(updating);\n\n\t\t\tconst snippet = binding.expression.manipulate(block);\n\n\t\t\tstatements.push(b`\n\t\t\t\tif (${snippet} !== void 0) {\n\t\t\t\t\t${props}.${binding.name} = ${snippet};\n\t\t\t\t}`\n\t\t\t);\n\n\t\t\tupdates.push(b`\n\t\t\t\tif (!${updating} && ${renderer.dirty(Array.from(binding.expression.dependencies))}) {\n\t\t\t\t\t${updating} = true;\n\t\t\t\t\t${name_changes}.${binding.name} = ${snippet};\n\t\t\t\t\t@add_flush_callback(() => ${updating} = false);\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tconst contextual_dependencies = Array.from(binding.expression.contextual_dependencies);\n\t\t\tconst dependencies = Array.from(binding.expression.dependencies);\n\n\t\t\tlet lhs = binding.raw_expression;\n\n\t\t\tif (binding.is_contextual && binding.expression.node.type === 'Identifier') {\n\t\t\t\t// bind:x={y} — we can't just do `y = x`, we need to\n\t\t\t\t// to `array[index] = x;\n\t\t\t\tconst { name } = binding.expression.node;\n\t\t\t\tconst { object, property, snippet } = block.bindings.get(name);\n\t\t\t\tlhs = snippet;\n\t\t\t\tcontextual_dependencies.push(object.name, property.name);\n\t\t\t}\n\n\t\t\tconst value = block.get_unique_name('value');\n\t\t\tconst params: any[] = [value];\n\t\t\tif (contextual_dependencies.length > 0) {\n\t\t\t\tconst args = [];\n\n\t\t\t\tcontextual_dependencies.forEach(name => {\n\t\t\t\t\tparams.push({\n\t\t\t\t\t\ttype: 'Identifier',\n\t\t\t\t\t\tname\n\t\t\t\t\t});\n\n\t\t\t\t\trenderer.add_to_context(name, true);\n\t\t\t\t\targs.push(renderer.reference(name));\n\t\t\t\t});\n\n\n\t\t\t\tblock.chunks.init.push(b`\n\t\t\t\t\tfunction ${id}(${value}) {\n\t\t\t\t\t\t${callee}.call(null, ${value}, ${args});\n\t\t\t\t\t}\n\t\t\t\t`);\n\n\t\t\t\tblock.maintain_context = true; // TODO put this somewhere more logical\n\t\t\t} else {\n\t\t\t\tblock.chunks.init.push(b`\n\t\t\t\t\tfunction ${id}(${value}) {\n\t\t\t\t\t\t${callee}.call(null, ${value});\n\t\t\t\t\t}\n\t\t\t\t`);\n\t\t\t}\n\n\t\t\tconst body = b`\n\t\t\t\tfunction ${id}(${params}) {\n\t\t\t\t\t${lhs} = ${value};\n\t\t\t\t\t${renderer.invalidate(dependencies[0])};\n\t\t\t\t}\n\t\t\t`;\n\n\t\t\tcomponent.partly_hoisted.push(body);\n\n\t\t\treturn b`@binding_callbacks.push(() => @bind(${this.var}, '${binding.name}', ${id}));`;\n\t\t});\n\n\t\tconst munged_handlers = this.node.handlers.map(handler => {\n\t\t\tconst event_handler = new EventHandler(handler, this);\n\t\t\tlet snippet = event_handler.get_snippet(block);\n\t\t\tif (handler.modifiers.has('once')) snippet = x`@once(${snippet})`;\n\n\t\t\treturn b`${name}.$on(\"${handler.name}\", ${snippet});`;\n\t\t});\n\n\t\tif (this.node.name === 'svelte:component') {\n\t\t\tconst switch_value = block.get_unique_name('switch_value');\n\t\t\tconst switch_props = block.get_unique_name('switch_props');\n\n\t\t\tconst snippet = this.node.expression.manipulate(block);\n\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\tvar ${switch_value} = ${snippet};\n\n\t\t\t\tfunction ${switch_props}(#ctx) {\n\t\t\t\t\t${(this.node.attributes.length > 0 || this.node.bindings.length > 0) && b`\n\t\t\t\t\t${props && b`let ${props} = ${attribute_object};`}`}\n\t\t\t\t\t${statements}\n\t\t\t\t\treturn ${component_opts};\n\t\t\t\t}\n\n\t\t\t\tif (${switch_value}) {\n\t\t\t\t\tvar ${name} = new ${switch_value}(${switch_props}(#ctx));\n\n\t\t\t\t\t${munged_bindings}\n\t\t\t\t\t${munged_handlers}\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tblock.chunks.create.push(\n\t\t\t\tb`if (${name}) @create_component(${name}.$$.fragment);`\n\t\t\t);\n\n\t\t\tif (parent_nodes && this.renderer.options.hydratable) {\n\t\t\t\tblock.chunks.claim.push(\n\t\t\t\t\tb`if (${name}) @claim_component(${name}.$$.fragment, ${parent_nodes});`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tblock.chunks.mount.push(b`\n\t\t\t\tif (${name}) {\n\t\t\t\t\t@mount_component(${name}, ${parent_node || '#target'}, ${parent_node ? 'null' : 'anchor'});\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tconst anchor = this.get_or_create_anchor(block, parent_node, parent_nodes);\n\t\t\tconst update_mount_node = this.get_update_mount_node(anchor);\n\n\t\t\tif (updates.length) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\t${updates}\n\t\t\t\t`);\n\t\t\t}\n\n\t\t\tblock.chunks.update.push(b`\n\t\t\t\tif (${switch_value} !== (${switch_value} = ${snippet})) {\n\t\t\t\t\tif (${name}) {\n\t\t\t\t\t\t@group_outros();\n\t\t\t\t\t\tconst old_component = ${name};\n\t\t\t\t\t\t@transition_out(old_component.$$.fragment, 1, 0, () => {\n\t\t\t\t\t\t\t@destroy_component(old_component, 1);\n\t\t\t\t\t\t});\n\t\t\t\t\t\t@check_outros();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (${switch_value}) {\n\t\t\t\t\t\t${name} = new ${switch_value}(${switch_props}(#ctx));\n\n\t\t\t\t\t\t${munged_bindings}\n\t\t\t\t\t\t${munged_handlers}\n\n\t\t\t\t\t\t@create_component(${name}.$$.fragment);\n\t\t\t\t\t\t@transition_in(${name}.$$.fragment, 1);\n\t\t\t\t\t\t@mount_component(${name}, ${update_mount_node}, ${anchor});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t${name} = null;\n\t\t\t\t\t}\n\t\t\t\t} else if (${switch_value}) {\n\t\t\t\t\t${updates.length && b`${name}.$set(${name_changes});`}\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tblock.chunks.intro.push(b`\n\t\t\t\tif (${name}) @transition_in(${name}.$$.fragment, #local);\n\t\t\t`);\n\n\t\t\tblock.chunks.outro.push(\n\t\t\t\tb`if (${name}) @transition_out(${name}.$$.fragment, #local);`\n\t\t\t);\n\n\t\t\tblock.chunks.destroy.push(b`if (${name}) @destroy_component(${name}, ${parent_node ? null : 'detaching'});`);\n\t\t} else {\n\t\t\tconst expression = this.node.name === 'svelte:self'\n\t\t\t\t? component.name\n\t\t\t\t: this.renderer.reference(this.node.name);\n\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\t${(this.node.attributes.length > 0 || this.node.bindings.length > 0) && b`\n\t\t\t\t${props && b`let ${props} = ${attribute_object};`}`}\n\t\t\t\t${statements}\n\t\t\t\tconst ${name} = new ${expression}(${component_opts});\n\n\t\t\t\t${munged_bindings}\n\t\t\t\t${munged_handlers}\n\t\t\t`);\n\n\t\t\tblock.chunks.create.push(b`@create_component(${name}.$$.fragment);`);\n\n\t\t\tif (parent_nodes && this.renderer.options.hydratable) {\n\t\t\t\tblock.chunks.claim.push(\n\t\t\t\t\tb`@claim_component(${name}.$$.fragment, ${parent_nodes});`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tblock.chunks.mount.push(\n\t\t\t\tb`@mount_component(${name}, ${parent_node || '#target'}, ${parent_node ? 'null' : 'anchor'});`\n\t\t\t);\n\n\t\t\tblock.chunks.intro.push(b`\n\t\t\t\t@transition_in(${name}.$$.fragment, #local);\n\t\t\t`);\n\n\t\t\tif (updates.length) {\n\t\t\t\tblock.chunks.update.push(b`\n\t\t\t\t\t${updates}\n\t\t\t\t\t${name}.$set(${name_changes});\n\t\t\t\t`);\n\t\t\t}\n\n\t\t\tblock.chunks.destroy.push(b`\n\t\t\t\t@destroy_component(${name}, ${parent_node ? null : 'detaching'});\n\t\t\t`);\n\n\t\t\tblock.chunks.outro.push(\n\t\t\t\tb`@transition_out(${name}.$$.fragment, #local);`\n\t\t\t);\n\t\t}\n\t}\n}\n","import Renderer from '../Renderer';\nimport Block from '../Block';\nimport Tag from './shared/Tag';\nimport Wrapper from './shared/Wrapper';\nimport MustacheTag from '../../nodes/MustacheTag';\nimport RawMustacheTag from '../../nodes/RawMustacheTag';\nimport { x } from 'code-red';\nimport { Identifier } from 'estree';\n\nexport default class MustacheTagWrapper extends Tag {\n\tvar: Identifier = { type: 'Identifier', name: 't' };\n\n\tconstructor(renderer: Renderer, block: Block, parent: Wrapper, node: MustacheTag | RawMustacheTag) {\n\t\tsuper(renderer, block, parent, node);\n\t}\n\n\trender(block: Block, parent_node: Identifier, parent_nodes: Identifier) {\n\t\tconst { init } = this.rename_this_method(\n\t\t\tblock,\n\t\t\tvalue => x`@set_data(${this.var}, ${value});`\n\t\t);\n\n\t\tblock.add_element(\n\t\t\tthis.var,\n\t\t\tx`@text(${init})`,\n\t\t\tparent_nodes && x`@claim_text(${parent_nodes}, ${init})`,\n\t\t\tparent_node\n\t\t);\n\t}\n}\n","import { b, x } from 'code-red';\nimport Renderer from '../Renderer';\nimport Block from '../Block';\nimport Tag from './shared/Tag';\nimport Wrapper from './shared/Wrapper';\nimport MustacheTag from '../../nodes/MustacheTag';\nimport RawMustacheTag from '../../nodes/RawMustacheTag';\nimport { is_head } from './shared/is_head';\nimport { Identifier } from 'estree';\n\nexport default class RawMustacheTagWrapper extends Tag {\n\tvar: Identifier = { type: 'Identifier', name: 'raw' };\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: MustacheTag | RawMustacheTag\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\t\tthis.cannot_use_innerhtml();\n\t\tthis.not_static_content();\n\t}\n\n\trender(block: Block, parent_node: Identifier, parent_nodes: Identifier) {\n\t\tconst in_head = is_head(parent_node);\n\n\t\tconst can_use_innerhtml = !in_head && parent_node && !this.prev && !this.next;\n\n\t\tif (can_use_innerhtml) {\n\t\t\tconst insert = content => b`${parent_node}.innerHTML = ${content};`[0];\n\n\t\t\tconst { init } = this.rename_this_method(\n\t\t\t\tblock,\n\t\t\t\tcontent => insert(content)\n\t\t\t);\n\n\t\t\tblock.chunks.mount.push(insert(init));\n\t\t}\n\n\t\telse {\n\t\t\tconst needs_anchor = in_head || (this.next && !this.next.is_dom_node());\n\n\t\t\tconst html_tag = block.get_unique_name('html_tag');\n\t\t\tconst html_anchor = needs_anchor && block.get_unique_name('html_anchor');\n\n\t\t\tblock.add_variable(html_tag);\n\n\t\t\tconst { init } = this.rename_this_method(\n\t\t\t\tblock,\n\t\t\t\tcontent => x`${html_tag}.p(${content});`\n\t\t\t);\n\n\t\t\tconst update_anchor = in_head ? 'null' : needs_anchor ? html_anchor : this.next ? this.next.var : 'null';\n\n\t\t\tblock.chunks.hydrate.push(b`${html_tag}.a = ${update_anchor};`);\n\t\t\tblock.chunks.mount.push(b`${html_tag}.m(${parent_node || '#target'}, ${parent_node ? null : 'anchor'});`);\n\n\n\t\t\tblock.chunks.create.push(b`${html_tag} = new @HtmlTag(${init});`);\n\t\t\tif (this.renderer.options.hydratable) {\n\t\t\t\tblock.chunks.claim.push(b`${html_tag} = new @HtmlTag(${init});`);\n\t\t\t\tblock.chunks.claim.push(\n\t\t\t\t\tb`${html_tag}.l(${parent_nodes});`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (needs_anchor) {\n\t\t\t\tblock.add_element(html_anchor, x`@empty()`, x`@claim_text(${parent_nodes}, '')`, parent_node);\n\t\t\t}\n\n\t\t\tif (!parent_node || in_head) {\n\t\t\t\tblock.chunks.destroy.push(b`if (detaching) ${html_tag}.d();`);\n\t\t\t}\n\t\t}\n\t}\n}\n","import Attribute from '../nodes/Attribute';\nimport { p, x } from 'code-red';\nimport { string_literal } from './stringify';\nimport Block from '../render_dom/Block';\n\nexport default function get_slot_data(values: Map<string, Attribute>, block: Block = null) {\n\treturn {\n\t\ttype: 'ObjectExpression',\n\t\tproperties: Array.from(values.values())\n\t\t\t.filter(attribute => attribute.name !== 'name')\n\t\t\t.map(attribute => {\n\t\t\t\tconst value = get_value(block, attribute);\n\t\t\t\treturn p`${attribute.name}: ${value}`;\n\t\t\t})\n\t};\n}\n\nfunction get_value(block: Block, attribute: Attribute) {\n\tif (attribute.is_true) return x`true`;\n\tif (attribute.chunks.length === 0) return x`\"\"`;\n\n\tlet value = attribute.chunks\n\t\t.map(chunk => chunk.type === 'Text' ? string_literal(chunk.data) : (block ? chunk.manipulate(block) : chunk.node))\n\t\t.reduce((lhs, rhs) => x`${lhs} + ${rhs}`);\n\n\tif (attribute.chunks.length > 1 && attribute.chunks[0].type !== 'Text') {\n\t\tvalue = x`\"\" + ${value}`;\n\t}\n\n\treturn value;\n}","import Wrapper from './shared/Wrapper';\nimport Renderer from '../Renderer';\nimport Block from '../Block';\nimport Slot from '../../nodes/Slot';\nimport FragmentWrapper from './Fragment';\nimport { b, p, x } from 'code-red';\nimport { sanitize } from '../../../utils/names';\nimport add_to_set from '../../utils/add_to_set';\nimport get_slot_data from '../../utils/get_slot_data';\nimport Expression from '../../nodes/shared/Expression';\nimport is_dynamic from './shared/is_dynamic';\nimport { Identifier, ObjectExpression } from 'estree';\n\nexport default class SlotWrapper extends Wrapper {\n\tnode: Slot;\n\tfragment: FragmentWrapper;\n\n\tvar: Identifier = { type: 'Identifier', name: 'slot' };\n\tdependencies: Set<string> = new Set(['$$scope']);\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: Slot,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\t\tthis.cannot_use_innerhtml();\n\t\tthis.not_static_content();\n\n\t\tthis.fragment = new FragmentWrapper(\n\t\t\trenderer,\n\t\t\tblock,\n\t\t\tnode.children,\n\t\t\tparent,\n\t\t\tstrip_whitespace,\n\t\t\tnext_sibling\n\t\t);\n\n\t\tthis.node.values.forEach(attribute => {\n\t\t\tadd_to_set(this.dependencies, attribute.dependencies);\n\t\t});\n\n\t\tblock.add_dependencies(this.dependencies);\n\n\t\t// we have to do this, just in case\n\t\tblock.add_intro();\n\t\tblock.add_outro();\n\t}\n\n\trender(\n\t\tblock: Block,\n\t\tparent_node: Identifier,\n\t\tparent_nodes: Identifier\n\t) {\n\t\tconst { renderer } = this;\n\n\t\tconst { slot_name } = this.node;\n\n\t\tlet get_slot_changes_fn;\n\t\tlet get_slot_context_fn;\n\n\t\tif (this.node.values.size > 0) {\n\t\t\tget_slot_changes_fn = renderer.component.get_unique_name(`get_${sanitize(slot_name)}_slot_changes`);\n\t\t\tget_slot_context_fn = renderer.component.get_unique_name(`get_${sanitize(slot_name)}_slot_context`);\n\n\t\t\tconst changes = x`{}` as ObjectExpression;\n\n\t\t\tconst dependencies = new Set();\n\n\t\t\tthis.node.values.forEach(attribute => {\n\t\t\t\tattribute.chunks.forEach(chunk => {\n\t\t\t\t\tif ((chunk as Expression).dependencies) {\n\t\t\t\t\t\tadd_to_set(dependencies, (chunk as Expression).contextual_dependencies);\n\n\t\t\t\t\t\t// add_to_set(dependencies, (chunk as Expression).dependencies);\n\t\t\t\t\t\t(chunk as Expression).dependencies.forEach(name => {\n\t\t\t\t\t\t\tconst variable = renderer.component.var_lookup.get(name);\n\t\t\t\t\t\t\tif (variable && !variable.hoistable) dependencies.add(name);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst dynamic_dependencies = Array.from(attribute.dependencies).filter(name => {\n\t\t\t\t\tif (this.node.scope.is_let(name)) return true;\n\t\t\t\t\tconst variable = renderer.component.var_lookup.get(name);\n\t\t\t\t\treturn is_dynamic(variable);\n\t\t\t\t});\n\n\t\t\t\tif (dynamic_dependencies.length > 0) {\n\t\t\t\t\tchanges.properties.push(p`${attribute.name}: ${renderer.dirty(dynamic_dependencies)}`);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\trenderer.blocks.push(b`\n\t\t\t\tconst ${get_slot_changes_fn} = #dirty => ${changes};\n\t\t\t\tconst ${get_slot_context_fn} = #ctx => ${get_slot_data(this.node.values, block)};\n\t\t\t`);\n\t\t} else {\n\t\t\tget_slot_changes_fn = 'null';\n\t\t\tget_slot_context_fn = 'null';\n\t\t}\n\n\t\tconst slot = block.get_unique_name(`${sanitize(slot_name)}_slot`);\n\t\tconst slot_definition = block.get_unique_name(`${sanitize(slot_name)}_slot_template`);\n\n\t\tblock.chunks.init.push(b`\n\t\t\tconst ${slot_definition} = ${renderer.reference('$$slots')}.${slot_name};\n\t\t\tconst ${slot} = @create_slot(${slot_definition}, #ctx, ${renderer.reference('$$scope')}, ${get_slot_context_fn});\n\t\t`);\n\n\t\t// TODO this is a dreadful hack! Should probably make this nicer\n\t\tconst { create, claim, hydrate, mount, update, destroy } = block.chunks;\n\n\t\tblock.chunks.create = [];\n\t\tblock.chunks.claim = [];\n\t\tblock.chunks.hydrate = [];\n\t\tblock.chunks.mount = [];\n\t\tblock.chunks.update = [];\n\t\tblock.chunks.destroy = [];\n\n\t\tconst listeners = block.event_listeners;\n\t\tblock.event_listeners = [];\n\t\tthis.fragment.render(block, parent_node, parent_nodes);\n\t\tblock.render_listeners(`_${slot.name}`);\n\t\tblock.event_listeners = listeners;\n\n\t\tif (block.chunks.create.length) create.push(b`if (!${slot}) { ${block.chunks.create} }`);\n\t\tif (block.chunks.claim.length) claim.push(b`if (!${slot}) { ${block.chunks.claim} }`);\n\t\tif (block.chunks.hydrate.length) hydrate.push(b`if (!${slot}) { ${block.chunks.hydrate} }`);\n\t\tif (block.chunks.mount.length) mount.push(b`if (!${slot}) { ${block.chunks.mount} }`);\n\t\tif (block.chunks.update.length) update.push(b`if (!${slot}) { ${block.chunks.update} }`);\n\t\tif (block.chunks.destroy.length) destroy.push(b`if (!${slot}) { ${block.chunks.destroy} }`);\n\n\t\tblock.chunks.create = create;\n\t\tblock.chunks.claim = claim;\n\t\tblock.chunks.hydrate = hydrate;\n\t\tblock.chunks.mount = mount;\n\t\tblock.chunks.update = update;\n\t\tblock.chunks.destroy = destroy;\n\n\t\tblock.chunks.create.push(\n\t\t\tb`if (${slot}) ${slot}.c();`\n\t\t);\n\n\t\tif (renderer.options.hydratable) {\n\t\t\tblock.chunks.claim.push(\n\t\t\t\tb`if (${slot}) ${slot}.l(${parent_nodes});`\n\t\t\t);\n\t\t}\n\n\t\tblock.chunks.mount.push(b`\n\t\t\tif (${slot}) {\n\t\t\t\t${slot}.m(${parent_node || '#target'}, ${parent_node ? 'null' : 'anchor'});\n\t\t\t}\n\t\t`);\n\n\t\tblock.chunks.intro.push(\n\t\t\tb`@transition_in(${slot}, #local);`\n\t\t);\n\n\t\tblock.chunks.outro.push(\n\t\t\tb`@transition_out(${slot}, #local);`\n\t\t);\n\n\t\tconst dynamic_dependencies = Array.from(this.dependencies).filter(name => {\n\t\t\tif (name === '$$scope') return true;\n\t\t\tif (this.node.scope.is_let(name)) return true;\n\t\t\tconst variable = renderer.component.var_lookup.get(name);\n\t\t\treturn is_dynamic(variable);\n\t\t});\n\n\t\tblock.chunks.update.push(b`\n\t\t\tif (${slot} && ${slot}.p && ${renderer.dirty(dynamic_dependencies)}) {\n\t\t\t\t${slot}.p(\n\t\t\t\t\t@get_slot_context(${slot_definition}, #ctx, ${renderer.reference('$$scope')}, ${get_slot_context_fn}),\n\t\t\t\t\t@get_slot_changes(${slot_definition}, ${renderer.reference('$$scope')}, #dirty, ${get_slot_changes_fn})\n\t\t\t\t);\n\t\t\t}\n\t\t`);\n\n\t\tblock.chunks.destroy.push(\n\t\t\tb`if (${slot}) ${slot}.d(detaching);`\n\t\t);\n\t}\n}\n","import Renderer from '../Renderer';\nimport Block from '../Block';\nimport Text from '../../nodes/Text';\nimport Wrapper from './shared/Wrapper';\nimport { x } from 'code-red';\nimport { Identifier } from 'estree';\n\n// Whitespace inside one of these elements will not result in\n// a whitespace node being created in any circumstances. (This\n// list is almost certainly very incomplete)\nconst elements_without_text = new Set([\n\t'audio',\n\t'datalist',\n\t'dl',\n\t'optgroup',\n\t'select',\n\t'video',\n]);\n\n// TODO this should probably be in Fragment\nfunction should_skip(node: Text) {\n\tif (/\\S/.test(node.data)) return false;\n\n\tconst parent_element = node.find_nearest(/(?:Element|InlineComponent|Head)/);\n\tif (!parent_element) return false;\n\n\tif (parent_element.type === 'Head') return true;\n\tif (parent_element.type === 'InlineComponent') return parent_element.children.length === 1 && node === parent_element.children[0];\n\n\t// svg namespace exclusions\n\tif (/svg$/.test(parent_element.namespace)) {\n\t\tif (node.prev && node.prev.type === \"Element\" && node.prev.name === \"tspan\") return false;\n\t}\n\n\treturn parent_element.namespace || elements_without_text.has(parent_element.name);\n}\n\nexport default class TextWrapper extends Wrapper {\n\tnode: Text;\n\tdata: string;\n\tskip: boolean;\n\tvar: Identifier;\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tparent: Wrapper,\n\t\tnode: Text,\n\t\tdata: string\n\t) {\n\t\tsuper(renderer, block, parent, node);\n\n\t\tthis.skip = should_skip(this.node);\n\t\tthis.data = data;\n\t\tthis.var = (this.skip ? null : x`t`) as unknown as Identifier;\n\t}\n\n\tuse_space() {\n\t\tif (this.renderer.component.component_options.preserveWhitespace) return false;\n\t\tif (/[\\S\\u00A0]/.test(this.data)) return false;\n\n\t\tlet node = this.parent && this.parent.node;\n\t\twhile (node) {\n\t\t\tif (node.type === 'Element' && node.name === 'pre') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tnode = node.parent;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\trender(block: Block, parent_node: Identifier, parent_nodes: Identifier) {\n\t\tif (this.skip) return;\n\t\tconst use_space = this.use_space();\n\n\t\tblock.add_element(\n\t\t\tthis.var,\n\t\t\tuse_space ? x`@space()` : x`@text(\"${this.data}\")`,\n\t\t\tparent_nodes && (use_space ? x`@claim_space(${parent_nodes})` : x`@claim_text(${parent_nodes}, \"${this.data}\")`),\n\t\t\tparent_node as Identifier\n\t\t);\n\t}\n}","import Renderer from '../Renderer';\nimport Block from '../Block';\nimport Wrapper from './shared/Wrapper';\nimport { b, x } from 'code-red';\nimport add_event_handlers from './shared/add_event_handlers';\nimport Window from '../../nodes/Window';\nimport add_actions from './shared/add_actions';\nimport { Identifier } from 'estree';\nimport { TemplateNode } from '../../../interfaces';\nimport EventHandler from './Element/EventHandler';\n\nconst associated_events = {\n\tinnerWidth: 'resize',\n\tinnerHeight: 'resize',\n\touterWidth: 'resize',\n\touterHeight: 'resize',\n\n\tscrollX: 'scroll',\n\tscrollY: 'scroll',\n};\n\nconst properties = {\n\tscrollX: 'pageXOffset',\n\tscrollY: 'pageYOffset'\n};\n\nconst readonly = new Set([\n\t'innerWidth',\n\t'innerHeight',\n\t'outerWidth',\n\t'outerHeight',\n\t'online',\n]);\n\nexport default class WindowWrapper extends Wrapper {\n\tnode: Window;\n\thandlers: EventHandler[];\n\n\tconstructor(renderer: Renderer, block: Block, parent: Wrapper, node: TemplateNode) {\n\t\tsuper(renderer, block, parent, node);\n\t\tthis.handlers = this.node.handlers.map(handler => new EventHandler(handler, this));\n\t}\n\n\trender(block: Block, _parent_node: Identifier, _parent_nodes: Identifier) {\n\t\tconst { renderer } = this;\n\t\tconst { component } = renderer;\n\n\t\tconst events = {};\n\t\tconst bindings: Record<string, string> = {};\n\n\t\tadd_actions(block, '@_window', this.node.actions);\n\t\tadd_event_handlers(block, '@_window', this.handlers);\n\n\t\tthis.node.bindings.forEach(binding => {\n\t\t\t// in dev mode, throw if read-only values are written to\n\t\t\tif (readonly.has(binding.name)) {\n\t\t\t\trenderer.readonly.add(binding.expression.node.name);\n\t\t\t}\n\n\t\t\tbindings[binding.name] = binding.expression.node.name;\n\n\t\t\t// bind:online is a special case, we need to listen for two separate events\n\t\t\tif (binding.name === 'online') return;\n\n\t\t\tconst associated_event = associated_events[binding.name];\n\t\t\tconst property = properties[binding.name] || binding.name;\n\n\t\t\tif (!events[associated_event]) events[associated_event] = [];\n\t\t\tevents[associated_event].push({\n\t\t\t\tname: binding.expression.node.name,\n\t\t\t\tvalue: property\n\t\t\t});\n\t\t});\n\n\t\tconst scrolling = block.get_unique_name(`scrolling`);\n\t\tconst clear_scrolling = block.get_unique_name(`clear_scrolling`);\n\t\tconst scrolling_timeout = block.get_unique_name(`scrolling_timeout`);\n\n\t\tObject.keys(events).forEach(event => {\n\t\t\tconst id = block.get_unique_name(`onwindow${event}`);\n\t\t\tconst props = events[event];\n\n\t\t\trenderer.add_to_context(id.name);\n\t\t\tconst fn = renderer.reference(id.name);\n\n\t\t\tif (event === 'scroll') {\n\t\t\t\t// TODO other bidirectional bindings...\n\t\t\t\tblock.add_variable(scrolling, x`false`);\n\t\t\t\tblock.add_variable(clear_scrolling, x`() => { ${scrolling} = false }`);\n\t\t\t\tblock.add_variable(scrolling_timeout);\n\n\t\t\t\tconst condition = bindings.scrollX && bindings.scrollY\n\t\t\t\t\t? x`\"${bindings.scrollX}\" in this._state || \"${bindings.scrollY}\" in this._state`\n\t\t\t\t\t: x`\"${bindings.scrollX || bindings.scrollY}\" in this._state`;\n\n\t\t\t\tconst scrollX = bindings.scrollX && x`this._state.${bindings.scrollX}`;\n\t\t\t\tconst scrollY = bindings.scrollY && x`this._state.${bindings.scrollY}`;\n\n\t\t\t\trenderer.meta_bindings.push(b`\n\t\t\t\t\tif (${condition}) {\n\t\t\t\t\t\t@_scrollTo(${scrollX || '@_window.pageXOffset'}, ${scrollY || '@_window.pageYOffset'});\n\t\t\t\t\t}\n\t\t\t\t\t${scrollX && `${scrollX} = @_window.pageXOffset;`}\n\t\t\t\t\t${scrollY && `${scrollY} = @_window.pageYOffset;`}\n\t\t\t\t`);\n\n\t\t\t\tblock.event_listeners.push(x`\n\t\t\t\t\t@listen(@_window, \"${event}\", () => {\n\t\t\t\t\t\t${scrolling} = true;\n\t\t\t\t\t\t@_clearTimeout(${scrolling_timeout});\n\t\t\t\t\t\t${scrolling_timeout} = @_setTimeout(${clear_scrolling}, 100);\n\t\t\t\t\t\t${fn}();\n\t\t\t\t\t})\n\t\t\t\t`);\n\t\t\t} else {\n\t\t\t\tprops.forEach(prop => {\n\t\t\t\t\trenderer.meta_bindings.push(\n\t\t\t\t\t\tb`this._state.${prop.name} = @_window.${prop.value};`\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tblock.event_listeners.push(x`\n\t\t\t\t\t@listen(@_window, \"${event}\", ${fn})\n\t\t\t\t`);\n\t\t\t}\n\n\t\t\tcomponent.partly_hoisted.push(b`\n\t\t\t\tfunction ${id}() {\n\t\t\t\t\t${props.map(prop => renderer.invalidate(prop.name, x`${prop.name} = @_window.${prop.value}`))}\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\t@add_render_callback(${fn});\n\t\t\t`);\n\n\t\t\tcomponent.has_reactive_assignments = true;\n\t\t});\n\n\t\t// special case... might need to abstract this out if we add more special cases\n\t\tif (bindings.scrollX || bindings.scrollY) {\n\t\t\tconst condition = renderer.dirty([bindings.scrollX, bindings.scrollY].filter(Boolean));\n\n\t\t\tconst scrollX = bindings.scrollX ? renderer.reference(bindings.scrollX) : x`@_window.pageXOffset`;\n\t\t\tconst scrollY = bindings.scrollY ? renderer.reference(bindings.scrollY) : x`@_window.pageYOffset`;\n\n\t\t\tblock.chunks.update.push(b`\n\t\t\t\tif (${condition} && !${scrolling}) {\n\t\t\t\t\t${scrolling} = true;\n\t\t\t\t\t@_clearTimeout(${scrolling_timeout});\n\t\t\t\t\t@_scrollTo(${scrollX}, ${scrollY});\n\t\t\t\t\t${scrolling_timeout} = @_setTimeout(${clear_scrolling}, 100);\n\t\t\t\t}\n\t\t\t`);\n\t\t}\n\n\t\t// another special case. (I'm starting to think these are all special cases.)\n\t\tif (bindings.online) {\n\t\t\tconst id = block.get_unique_name(`onlinestatuschanged`);\n\t\t\tconst name = bindings.online;\n\n\t\t\trenderer.add_to_context(id.name);\n\t\t\tconst reference = renderer.reference(id.name);\n\n\t\t\tcomponent.partly_hoisted.push(b`\n\t\t\t\tfunction ${id}() {\n\t\t\t\t\t${renderer.invalidate(name, x`${name} = @_navigator.onLine`)}\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\tblock.chunks.init.push(b`\n\t\t\t\t@add_render_callback(${reference});\n\t\t\t`);\n\n\t\t\tblock.event_listeners.push(\n\t\t\t\tx`@listen(@_window, \"online\", ${reference})`,\n\t\t\t\tx`@listen(@_window, \"offline\", ${reference})`\n\t\t\t);\n\n\t\t\tcomponent.has_reactive_assignments = true;\n\t\t}\n\t}\n}\n","import Wrapper from './shared/Wrapper';\nimport AwaitBlock from './AwaitBlock';\nimport Body from './Body';\nimport DebugTag from './DebugTag';\nimport EachBlock from './EachBlock';\nimport Element from './Element/index';\nimport Head from './Head';\nimport IfBlock from './IfBlock';\nimport InlineComponent from './InlineComponent/index';\nimport MustacheTag from './MustacheTag';\nimport RawMustacheTag from './RawMustacheTag';\nimport Slot from './Slot';\nimport Text from './Text';\nimport Title from './Title';\nimport Window from './Window';\nimport { INode } from '../../nodes/interfaces';\nimport Renderer from '../Renderer';\nimport Block from '../Block';\nimport { trim_start, trim_end } from '../../../utils/trim';\nimport { Identifier } from 'estree';\n\nconst wrappers = {\n\tAwaitBlock,\n\tBody,\n\tComment: null,\n\tDebugTag,\n\tEachBlock,\n\tElement,\n\tHead,\n\tIfBlock,\n\tInlineComponent,\n\tMustacheTag,\n\tOptions: null,\n\tRawMustacheTag,\n\tSlot,\n\tText,\n\tTitle,\n\tWindow\n};\n\nfunction link(next: Wrapper, prev: Wrapper) {\n\tprev.next = next;\n\tif (next) next.prev = prev;\n}\n\nfunction trimmable_at(child: INode, next_sibling: Wrapper): boolean {\n\t// Whitespace is trimmable if one of the following is true:\n\t// The child and its sibling share a common nearest each block (not at an each block boundary)\n\t// The next sibling's previous node is an each block\n\treturn (next_sibling.node.find_nearest(/EachBlock/) === child.find_nearest(/EachBlock/)) || next_sibling.node.prev.type === 'EachBlock';\n}\n\nexport default class FragmentWrapper {\n\tnodes: Wrapper[];\n\n\tconstructor(\n\t\trenderer: Renderer,\n\t\tblock: Block,\n\t\tnodes: INode[],\n\t\tparent: Wrapper,\n\t\tstrip_whitespace: boolean,\n\t\tnext_sibling: Wrapper\n\t) {\n\t\tthis.nodes = [];\n\n\t\tlet last_child: Wrapper;\n\t\tlet window_wrapper;\n\n\t\tlet i = nodes.length;\n\t\twhile (i--) {\n\t\t\tconst child = nodes[i];\n\n\t\t\tif (!child.type) {\n\t\t\t\tthrow new Error(`missing type`);\n\t\t\t}\n\n\t\t\tif (!(child.type in wrappers)) {\n\t\t\t\tthrow new Error(`TODO implement ${child.type}`);\n\t\t\t}\n\n\t\t\t// special case — this is an easy way to remove whitespace surrounding\n\t\t\t// <svelte:window/>. lil hacky but it works\n\t\t\tif (child.type === 'Window') {\n\t\t\t\twindow_wrapper = new Window(renderer, block, parent, child);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (child.type === 'Text') {\n\t\t\t\tlet { data } = child;\n\n\t\t\t\t// We want to remove trailing whitespace inside an element/component/block,\n\t\t\t\t// *unless* there is no whitespace between this node and its next sibling\n\t\t\t\tif (this.nodes.length === 0) {\n\t\t\t\t\tconst should_trim = (\n\t\t\t\t\t\tnext_sibling ? (next_sibling.node.type === 'Text' && /^\\s/.test(next_sibling.node.data) && trimmable_at(child, next_sibling)) : !child.has_ancestor('EachBlock')\n\t\t\t\t\t);\n\n\t\t\t\t\tif (should_trim) {\n\t\t\t\t\t\tdata = trim_end(data);\n\t\t\t\t\t\tif (!data) continue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// glue text nodes (which could e.g. be separated by comments) together\n\t\t\t\tif (last_child && last_child.node.type === 'Text') {\n\t\t\t\t\t(last_child as Text).data = data + (last_child as Text).data;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst wrapper = new Text(renderer, block, parent, child, data);\n\t\t\t\tif (wrapper.skip) continue;\n\n\t\t\t\tthis.nodes.unshift(wrapper);\n\n\t\t\t\tlink(last_child, last_child = wrapper);\n\t\t\t} else {\n\t\t\t\tconst Wrapper = wrappers[child.type];\n\t\t\t\tif (!Wrapper) continue;\n\n\t\t\t\tconst wrapper = new Wrapper(renderer, block, parent, child, strip_whitespace, last_child || next_sibling);\n\t\t\t\tthis.nodes.unshift(wrapper);\n\n\t\t\t\tlink(last_child, last_child = wrapper);\n\t\t\t}\n\t\t}\n\n\t\tif (strip_whitespace) {\n\t\t\tconst first = this.nodes[0] as Text;\n\n\t\t\tif (first && first.node.type === 'Text') {\n\t\t\t\tfirst.data = trim_start(first.data);\n\t\t\t\tif (!first.data) {\n\t\t\t\t\tfirst.var = null;\n\t\t\t\t\tthis.nodes.shift();\n\n\t\t\t\t\tif (this.nodes[0]) {\n\t\t\t\t\t\tthis.nodes[0].prev = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (window_wrapper) {\n\t\t\tthis.nodes.unshift(window_wrapper);\n\t\t\tlink(last_child, window_wrapper);\n\t\t}\n\t}\n\n\trender(block: Block, parent_node: Identifier, parent_nodes: Identifier) {\n\t\tfor (let i = 0; i < this.nodes.length; i += 1) {\n\t\t\tthis.nodes[i].render(block, parent_node, parent_nodes);\n\t\t}\n\t}\n}\n","import { b, x, p } from 'code-red';\nimport Component from '../Component';\nimport Renderer from './Renderer';\nimport { CompileOptions, CssResult } from '../../interfaces';\nimport { walk } from 'estree-walker';\nimport { extract_names, Scope } from '../utils/scope';\nimport { invalidate } from './invalidate';\nimport Block from './Block';\nimport { ClassDeclaration, FunctionExpression, Node, Statement, ObjectExpression, Expression } from 'estree';\n\nexport default function dom(\n\tcomponent: Component,\n\toptions: CompileOptions\n): { js: Node[]; css: CssResult } {\n\tconst { name } = component;\n\n\tconst renderer = new Renderer(component, options);\n\tconst { block } = renderer;\n\n\tblock.has_outro_method = true;\n\n\t// prevent fragment being created twice (#1063)\n\tif (options.customElement) block.chunks.create.push(b`this.c = @noop;`);\n\n\tconst body = [];\n\n\tif (renderer.file_var) {\n\t\tconst file = component.file ? x`\"${component.file}\"` : x`undefined`;\n\t\tbody.push(b`const ${renderer.file_var} = ${file};`);\n\t}\n\n\tconst css = component.stylesheet.render(options.filename, !options.customElement);\n\tconst styles = component.stylesheet.has_styles && options.dev\n\t\t? `${css.code}\\n/*# sourceMappingURL=${css.map.toUrl()} */`\n\t\t: css.code;\n\n\tconst add_css = component.get_unique_name('add_css');\n\n\tconst should_add_css = (\n\t\t!options.customElement &&\n\t\t!!styles &&\n\t\toptions.css !== false\n\t);\n\n\tif (should_add_css) {\n\t\tbody.push(b`\n\t\t\tfunction ${add_css}() {\n\t\t\t\tvar style = @element(\"style\");\n\t\t\t\tstyle.id = \"${component.stylesheet.id}-style\";\n\t\t\t\tstyle.textContent = \"${styles}\";\n\t\t\t\t@append(@_document.head, style);\n\t\t\t}\n\t\t`);\n\t}\n\n\t// fix order\n\t// TODO the deconflicted names of blocks are reversed... should set them here\n\tconst blocks = renderer.blocks.slice().reverse();\n\n\tbody.push(...blocks.map(block => {\n\t\t// TODO this is a horrible mess — renderer.blocks\n\t\t// contains a mixture of Blocks and Nodes\n\t\tif ((block as Block).render) return (block as Block).render();\n\t\treturn block;\n\t}));\n\n\tif (options.dev && !options.hydratable) {\n\t\tblock.chunks.claim.push(\n\t\t\tb`throw new @_Error(\"options.hydrate only works if the component was compiled with the \\`hydratable: true\\` option\");`\n\t\t);\n\t}\n\n\tconst uses_props = component.var_lookup.has('$$props');\n\tconst $$props = uses_props ? `$$new_props` : `$$props`;\n\tconst props = component.vars.filter(variable => !variable.module && variable.export_name);\n\tconst writable_props = props.filter(variable => variable.writable);\n\n\tconst set = (uses_props || writable_props.length > 0 || component.slots.size > 0)\n\t\t? x`\n\t\t\t${$$props} => {\n\t\t\t\t${uses_props && renderer.invalidate('$$props', x`$$props = @assign(@assign({}, $$props), @exclude_internal_props($$new_props))`)}\n\t\t\t\t${writable_props.map(prop =>\n\t\t\t\t\tb`if ('${prop.export_name}' in ${$$props}) ${renderer.invalidate(prop.name, x`${prop.name} = ${$$props}.${prop.export_name}`)};`\n\t\t\t\t)}\n\t\t\t\t${component.slots.size > 0 &&\n\t\t\t\tb`if ('$$scope' in ${$$props}) ${renderer.invalidate('$$scope', x`$$scope = ${$$props}.$$scope`)};`}\n\t\t\t}\n\t\t`\n\t\t: null;\n\n\tconst accessors = [];\n\n\tconst not_equal = component.component_options.immutable ? x`@not_equal` : x`@safe_not_equal`;\n\tlet dev_props_check; let inject_state; let capture_state;\n\n\tprops.forEach(prop => {\n\t\tconst variable = component.var_lookup.get(prop.name);\n\n\t\tif (!variable.writable || component.component_options.accessors) {\n\t\t\taccessors.push({\n\t\t\t\ttype: 'MethodDefinition',\n\t\t\t\tkind: 'get',\n\t\t\t\tkey: { type: 'Identifier', name: prop.export_name },\n\t\t\t\tvalue: x`function() {\n\t\t\t\t\treturn ${prop.hoistable ? prop.name : x`this.$$.ctx[${renderer.context_lookup.get(prop.name).index}]`}\n\t\t\t\t}`\n\t\t\t});\n\t\t} else if (component.compile_options.dev) {\n\t\t\taccessors.push({\n\t\t\t\ttype: 'MethodDefinition',\n\t\t\t\tkind: 'get',\n\t\t\t\tkey: { type: 'Identifier', name: prop.export_name },\n\t\t\t\tvalue: x`function() {\n\t\t\t\t\tthrow new @_Error(\"<${component.tag}>: Props cannot be read directly from the component instance unless compiling with 'accessors: true' or '<svelte:options accessors/>'\");\n\t\t\t\t}`\n\t\t\t});\n\t\t}\n\n\t\tif (component.component_options.accessors) {\n\t\t\tif (variable.writable && !renderer.readonly.has(prop.name)) {\n\t\t\t\taccessors.push({\n\t\t\t\t\ttype: 'MethodDefinition',\n\t\t\t\t\tkind: 'set',\n\t\t\t\t\tkey: { type: 'Identifier', name: prop.export_name },\n\t\t\t\t\tvalue: x`function(${prop.name}) {\n\t\t\t\t\t\tthis.$set({ ${prop.export_name}: ${prop.name} });\n\t\t\t\t\t\t@flush();\n\t\t\t\t\t}`\n\t\t\t\t});\n\t\t\t} else if (component.compile_options.dev) {\n\t\t\t\taccessors.push({\n\t\t\t\t\ttype: 'MethodDefinition',\n\t\t\t\t\tkind: 'set',\n\t\t\t\t\tkey: { type: 'Identifier', name: prop.export_name },\n\t\t\t\t\tvalue: x`function(value) {\n\t\t\t\t\t\tthrow new @_Error(\"<${component.tag}>: Cannot set read-only property '${prop.export_name}'\");\n\t\t\t\t\t}`\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (component.compile_options.dev) {\n\t\t\taccessors.push({\n\t\t\t\ttype: 'MethodDefinition',\n\t\t\t\tkind: 'set',\n\t\t\t\tkey: { type: 'Identifier', name: prop.export_name },\n\t\t\t\tvalue: x`function(value) {\n\t\t\t\t\tthrow new @_Error(\"<${component.tag}>: Props cannot be set directly on the component instance unless compiling with 'accessors: true' or '<svelte:options accessors/>'\");\n\t\t\t\t}`\n\t\t\t});\n\t\t}\n\t});\n\n\tif (component.compile_options.dev) {\n\t\t// checking that expected ones were passed\n\t\tconst expected = props.filter(prop => prop.writable && !prop.initialised);\n\n\t\tif (expected.length) {\n\t\t\tdev_props_check = b`\n\t\t\t\tconst { ctx: #ctx } = this.$$;\n\t\t\t\tconst props = ${options.customElement ? x`this.attributes` : x`options.props || {}`};\n\t\t\t\t${expected.map(prop => b`\n\t\t\t\tif (${renderer.reference(prop.name)} === undefined && !('${prop.export_name}' in props)) {\n\t\t\t\t\t@_console.warn(\"<${component.tag}> was created without expected prop '${prop.export_name}'\");\n\t\t\t\t}`)}\n\t\t\t`;\n\t\t}\n\n\t\tcapture_state = (uses_props || writable_props.length > 0) ? x`\n\t\t\t() => {\n\t\t\t\treturn { ${component.vars.filter(prop => prop.writable).map(prop => p`${prop.name}`)} };\n\t\t\t}\n\t\t` : x`\n\t\t\t() => {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t`;\n\n\t\tconst writable_vars = component.vars.filter(variable => !variable.module && variable.writable);\n\t\tinject_state = (uses_props || writable_vars.length > 0) ? x`\n\t\t\t${$$props} => {\n\t\t\t\t${uses_props && renderer.invalidate('$$props', x`$$props = @assign(@assign({}, $$props), $$new_props)`)}\n\t\t\t\t${writable_vars.map(prop => b`\n\t\t\t\t\tif ('${prop.name}' in $$props) ${renderer.invalidate(prop.name, x`${prop.name} = ${$$props}.${prop.name}`)};\n\t\t\t\t`)}\n\t\t\t}\n\t\t` : x`\n\t\t\t${$$props} => {}\n\t\t`;\n\t}\n\n\t// instrument assignments\n\tif (component.ast.instance) {\n\t\tlet scope = component.instance_scope;\n\t\tconst map = component.instance_scope_map;\n\t\tlet execution_context: Node | null = null;\n\n\t\twalk(component.ast.instance.content, {\n\t\t\tenter(node) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = map.get(node) as Scope;\n\n\t\t\t\t\tif (!execution_context && !scope.block) {\n\t\t\t\t\t\texecution_context = node;\n\t\t\t\t\t}\n\t\t\t\t} else if (!execution_context && node.type === 'LabeledStatement' && node.label.name === '$') {\n\t\t\t\t\texecution_context = node;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tleave(node) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = scope.parent;\n\t\t\t\t}\n\n\t\t\t\tif (execution_context === node) {\n\t\t\t\t\texecution_context = null;\n\t\t\t\t}\n\n\t\t\t\tif (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') {\n\t\t\t\t\tconst assignee = node.type === 'AssignmentExpression' ? node.left : node.argument;\n\n\t\t\t\t\t// normally (`a = 1`, `b.c = 2`), there'll be a single name\n\t\t\t\t\t// (a or b). In destructuring cases (`[d, e] = [e, d]`) there\n\t\t\t\t\t// may be more, in which case we need to tack the extra ones\n\t\t\t\t\t// onto the initial function call\n\t\t\t\t\tconst names = new Set(extract_names(assignee));\n\n\t\t\t\t\tthis.replace(invalidate(renderer, scope, node, names, execution_context === null));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tcomponent.rewrite_props(({ name, reassigned, export_name }) => {\n\t\t\tconst value = `$${name}`;\n\t\t\tconst i = renderer.context_lookup.get(`$${name}`).index;\n\n\t\t\tconst insert = (reassigned || export_name)\n\t\t\t\t? b`${`$$subscribe_${name}`}()`\n\t\t\t\t: b`@component_subscribe($$self, ${name}, #value => $$invalidate(${i}, ${value} = #value))`;\n\n\t\t\tif (component.compile_options.dev) {\n\t\t\t\treturn b`@validate_store(${name}, '${name}'); ${insert}`;\n\t\t\t}\n\n\t\t\treturn insert;\n\t\t});\n\t}\n\n\tconst args = [x`$$self`];\n\tif (props.length > 0 || component.has_reactive_assignments || component.slots.size > 0) {\n\t\targs.push(x`$$props`, x`$$invalidate`);\n\t}\n\n\tconst has_create_fragment = block.has_content();\n\tif (has_create_fragment) {\n\t\tbody.push(b`\n\t\t\tfunction create_fragment(#ctx) {\n\t\t\t\t${block.get_contents()}\n\t\t\t}\n\t\t`);\n\t}\n\n\tbody.push(b`\n\t\t${component.extract_javascript(component.ast.module)}\n\n\t\t${component.fully_hoisted}\n\t`);\n\n\tconst filtered_props = props.filter(prop => {\n\t\tconst variable = component.var_lookup.get(prop.name);\n\n\t\tif (variable.hoistable) return false;\n\t\tif (prop.name[0] === '$') return false;\n\t\treturn true;\n\t});\n\n\tconst reactive_stores = component.vars.filter(variable => variable.name[0] === '$' && variable.name[1] !== '$');\n\n\tconst instance_javascript = component.extract_javascript(component.ast.instance);\n\n\tlet i = renderer.context.length;\n\twhile (i--) {\n\t\tconst member = renderer.context[i];\n\t\tif (member.variable) {\n\t\t\tif (member.variable.referenced || member.variable.export_name) break;\n\t\t} else if (member.is_non_contextual) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst initial_context = renderer.context.slice(0, i + 1);\n\n\tconst has_definition = (\n\t\t(instance_javascript && instance_javascript.length > 0) ||\n\t\tfiltered_props.length > 0 ||\n\t\tuses_props ||\n\t\tcomponent.partly_hoisted.length > 0 ||\n\t\tinitial_context.length > 0 ||\n\t\tcomponent.reactive_declarations.length > 0\n\t);\n\n\tconst definition = has_definition\n\t\t? component.alias('instance')\n\t\t: { type: 'Literal', value: null };\n\n\tconst reactive_store_subscriptions = reactive_stores\n\t\t.filter(store => {\n\t\t\tconst variable = component.var_lookup.get(store.name.slice(1));\n\t\t\treturn !variable || variable.hoistable;\n\t\t})\n\t\t.map(({ name }) => b`\n\t\t\t${component.compile_options.dev && b`@validate_store(${name.slice(1)}, '${name.slice(1)}');`}\n\t\t\t@component_subscribe($$self, ${name.slice(1)}, $$value => $$invalidate(${renderer.context_lookup.get(name).index}, ${name} = $$value));\n\t\t`);\n\n\tconst resubscribable_reactive_store_unsubscribers = reactive_stores\n\t\t.filter(store => {\n\t\t\tconst variable = component.var_lookup.get(store.name.slice(1));\n\t\t\treturn variable && (variable.reassigned || variable.export_name);\n\t\t})\n\t\t.map(({ name }) => b`$$self.$$.on_destroy.push(() => ${`$$unsubscribe_${name.slice(1)}`}());`);\n\n\tif (has_definition) {\n\t\tconst reactive_declarations: (Node | Node[]) = [];\n\t\tconst fixed_reactive_declarations = []; // not really 'reactive' but whatever\n\n\t\tcomponent.reactive_declarations.forEach(d => {\n\t\t\tconst dependencies = Array.from(d.dependencies);\n\t\t\tconst uses_props = !!dependencies.find(n => n === '$$props');\n\n\t\t\tconst writable = dependencies.filter(n => {\n\t\t\t\tconst variable = component.var_lookup.get(n);\n\t\t\t\treturn variable && (variable.export_name || variable.mutated || variable.reassigned);\n\t\t\t});\n\n\t\t\tconst condition = !uses_props && writable.length > 0 && renderer.dirty(writable, true);\n\n\t\t\tlet statement = d.node; // TODO remove label (use d.node.body) if it's not referenced\n\n\t\t\tif (condition) statement = b`if (${condition}) { ${statement} }`[0] as Statement;\n\n\t\t\tif (condition || uses_props) {\n\t\t\t\treactive_declarations.push(statement);\n\t\t\t} else {\n\t\t\t\tfixed_reactive_declarations.push(statement);\n\t\t\t}\n\t\t});\n\n\t\tconst injected = Array.from(component.injected_reactive_declaration_vars).filter(name => {\n\t\t\tconst variable = component.var_lookup.get(name);\n\t\t\treturn variable.injected && variable.name[0] !== '$';\n\t\t});\n\n\t\tconst reactive_store_declarations = reactive_stores.map(variable => {\n\t\t\tconst $name = variable.name;\n\t\t\tconst name = $name.slice(1);\n\n\t\t\tconst store = component.var_lookup.get(name);\n\t\t\tif (store && (store.reassigned || store.export_name)) {\n\t\t\t\tconst unsubscribe = `$$unsubscribe_${name}`;\n\t\t\t\tconst subscribe = `$$subscribe_${name}`;\n\t\t\t\tconst i = renderer.context_lookup.get($name).index;\n\n\t\t\t\treturn b`let ${$name}, ${unsubscribe} = @noop, ${subscribe} = () => (${unsubscribe}(), ${unsubscribe} = @subscribe(${name}, $$value => $$invalidate(${i}, ${$name} = $$value)), ${name})`;\n\t\t\t}\n\n\t\t\treturn b`let ${$name};`;\n\t\t});\n\n\t\tlet unknown_props_check;\n\t\tif (component.compile_options.dev && !component.var_lookup.has('$$props') && writable_props.length) {\n\t\t\tunknown_props_check = b`\n\t\t\t\tconst writable_props = [${writable_props.map(prop => x`'${prop.export_name}'`)}];\n\t\t\t\t@_Object.keys($$props).forEach(key => {\n\t\t\t\t\tif (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$') @_console.warn(\\`<${component.tag}> was created with unknown prop '\\${key}'\\`);\n\t\t\t\t});\n\t\t\t`;\n\t\t}\n\n\t\tconst return_value = {\n\t\t\ttype: 'ArrayExpression',\n\t\t\telements: initial_context.map(member => ({\n\t\t\t\ttype: 'Identifier',\n\t\t\t\tname: member.name\n\t\t\t}) as Expression)\n\t\t};\n\n\t\tbody.push(b`\n\t\t\tfunction ${definition}(${args}) {\n\t\t\t\t${reactive_store_declarations}\n\n\t\t\t\t${reactive_store_subscriptions}\n\n\t\t\t\t${resubscribable_reactive_store_unsubscribers}\n\n\t\t\t\t${instance_javascript}\n\n\t\t\t\t${unknown_props_check}\n\n\t\t\t\t${component.slots.size ? b`let { $$slots = {}, $$scope } = $$props;` : null}\n\n\t\t\t\t${renderer.binding_groups.length > 0 && b`const $$binding_groups = [${renderer.binding_groups.map(_ => x`[]`)}];`}\n\n\t\t\t\t${component.partly_hoisted}\n\n\t\t\t\t${set && b`$$self.$set = ${set};`}\n\n\t\t\t\t${capture_state && x`$$self.$capture_state = ${capture_state};`}\n\n\t\t\t\t${inject_state && x`$$self.$inject_state = ${inject_state};`}\n\n\t\t\t\t${injected.map(name => b`let ${name};`)}\n\n\t\t\t\t${reactive_declarations.length > 0 && b`\n\t\t\t\t$$self.$$.update = () => {\n\t\t\t\t\t${reactive_declarations}\n\t\t\t\t};\n\t\t\t\t`}\n\n\t\t\t\t${fixed_reactive_declarations}\n\n\t\t\t\t${uses_props && b`$$props = @exclude_internal_props($$props);`}\n\n\t\t\t\treturn ${return_value};\n\t\t\t}\n\t\t`);\n\t}\n\n\tconst prop_indexes = x`{\n\t\t${props.filter(v => v.export_name && !v.module).map(v => p`${v.export_name}: ${renderer.context_lookup.get(v.name).index}`)}\n\t}` as ObjectExpression;\n\n\tlet dirty;\n\tif (renderer.context_overflow) {\n\t\tdirty = x`[]`;\n\t\tfor (let i = 0; i < renderer.context.length; i += 31) {\n\t\t\tdirty.elements.push(x`-1`);\n\t\t}\n\t}\n\n\tif (options.customElement) {\n\t\tconst declaration = b`\n\t\t\tclass ${name} extends @SvelteElement {\n\t\t\t\tconstructor(options) {\n\t\t\t\t\tsuper();\n\n\t\t\t\t\t${css.code && b`this.shadowRoot.innerHTML = \\`<style>${css.code.replace(/\\\\/g, '\\\\\\\\')}${options.dev ? `\\n/*# sourceMappingURL=${css.map.toUrl()} */` : ''}</style>\\`;`}\n\n\t\t\t\t\t@init(this, { target: this.shadowRoot }, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}, ${dirty});\n\n\t\t\t\t\t${dev_props_check}\n\n\t\t\t\t\tif (options) {\n\t\t\t\t\t\tif (options.target) {\n\t\t\t\t\t\t\t@insert(options.target, this, options.anchor);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t${(props.length > 0 || uses_props) && b`\n\t\t\t\t\t\tif (options.props) {\n\t\t\t\t\t\t\tthis.$set(options.props);\n\t\t\t\t\t\t\t@flush();\n\t\t\t\t\t\t}`}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t`[0] as ClassDeclaration;\n\n\t\tif (props.length > 0) {\n\t\t\tdeclaration.body.body.push({\n\t\t\t\ttype: 'MethodDefinition',\n\t\t\t\tkind: 'get',\n\t\t\t\tstatic: true,\n\t\t\t\tcomputed: false,\n\t\t\t\tkey: { type: 'Identifier', name: 'observedAttributes' },\n\t\t\t\tvalue: x`function() {\n\t\t\t\t\treturn [${props.map(prop => x`\"${prop.export_name}\"`)}];\n\t\t\t\t}` as FunctionExpression\n\t\t\t});\n\t\t}\n\n\t\tdeclaration.body.body.push(...accessors);\n\n\t\tbody.push(declaration);\n\n\t\tif (component.tag != null) {\n\t\t\tbody.push(b`\n\t\t\t\t@_customElements.define(\"${component.tag}\", ${name});\n\t\t\t`);\n\t\t}\n\t} else {\n\t\tconst superclass = {\n\t\t\ttype: 'Identifier',\n\t\t\tname: options.dev ? '@SvelteComponentDev' : '@SvelteComponent'\n\t\t};\n\n\t\tconst declaration = b`\n\t\t\tclass ${name} extends ${superclass} {\n\t\t\t\tconstructor(options) {\n\t\t\t\t\tsuper(${options.dev && `options`});\n\t\t\t\t\t${should_add_css && b`if (!@_document.getElementById(\"${component.stylesheet.id}-style\")) ${add_css}();`}\n\t\t\t\t\t@init(this, options, ${definition}, ${has_create_fragment ? 'create_fragment': 'null'}, ${not_equal}, ${prop_indexes}, ${dirty});\n\t\t\t\t\t${options.dev && b`@dispatch_dev(\"SvelteRegisterComponent\", { component: this, tagName: \"${name.name}\", options, id: create_fragment.name });`}\n\n\t\t\t\t\t${dev_props_check}\n\t\t\t\t}\n\t\t\t}\n\t\t`[0] as ClassDeclaration;\n\n\t\tdeclaration.body.body.push(...accessors);\n\n\t\tbody.push(declaration);\n\t}\n\n\treturn { js: flatten(body, []), css };\n}\n\nfunction flatten(nodes: any[], target: any[]) {\n\tfor (let i = 0; i < nodes.length; i += 1) {\n\t\tconst node = nodes[i];\n\t\tif (Array.isArray(node)) {\n\t\t\tflatten(node, target);\n\t\t} else {\n\t\t\ttarget.push(node);\n\t\t}\n\t}\n\n\treturn target;\n}\n","import Attribute from '../../../nodes/Attribute';\nimport { string_literal } from '../../../utils/stringify';\nimport Text from '../../../nodes/Text';\nimport { x } from 'code-red';\nimport Expression from '../../../nodes/shared/Expression';\nimport { Expression as ESTreeExpression } from 'estree';\n\nexport function get_class_attribute_value(attribute: Attribute): ESTreeExpression {\n\t// handle special case — `class={possiblyUndefined}` with scoped CSS\n\tif (attribute.chunks.length === 2 && (attribute.chunks[1] as Text).synthetic) {\n\t\tconst value = (attribute.chunks[0] as Expression).node;\n\t\treturn x`@escape(@null_to_empty(${value})) + \"${(attribute.chunks[1] as Text).data}\"`;\n\t}\n\n\treturn get_attribute_value(attribute);\n}\n\nexport function get_attribute_value(attribute: Attribute): ESTreeExpression {\n\tif (attribute.chunks.length === 0) return x`\"\"`;\n\n\treturn attribute.chunks\n\t\t.map((chunk) => {\n\t\t\treturn chunk.type === 'Text'\n\t\t\t\t? string_literal(chunk.data.replace(/\"/g, '"')) as ESTreeExpression\n\t\t\t\t: x`@escape(${chunk.node})`;\n\t\t})\n\t\t.reduce((lhs, rhs) => x`${lhs} + ${rhs}`);\n}\n","// source: https://html.spec.whatwg.org/multipage/indices.html\nexport const boolean_attributes = new Set([\n\t'allowfullscreen',\n\t'allowpaymentrequest',\n\t'async',\n\t'autofocus',\n\t'autoplay',\n\t'checked',\n\t'controls',\n\t'default',\n\t'defer',\n\t'disabled',\n\t'formnovalidate',\n\t'hidden',\n\t'ismap',\n\t'loop',\n\t'multiple',\n\t'muted',\n\t'nomodule',\n\t'novalidate',\n\t'open',\n\t'playsinline',\n\t'readonly',\n\t'required',\n\t'reversed',\n\t'selected'\n]);\n","import { string_literal } from '../../utils/stringify';\nimport Renderer, { RenderOptions } from '../Renderer';\nimport { get_slot_scope } from './shared/get_slot_scope';\nimport InlineComponent from '../../nodes/InlineComponent';\nimport { p, x } from 'code-red';\n\nfunction get_prop_value(attribute) {\n\tif (attribute.is_true) return x`true`;\n\tif (attribute.chunks.length === 0) return x`''`;\n\n\treturn attribute.chunks\n\t\t.map(chunk => {\n\t\t\tif (chunk.type === 'Text') return string_literal(chunk.data);\n\t\t\treturn chunk.node;\n\t\t})\n\t\t.reduce((lhs, rhs) => x`${lhs} + ${rhs}`);\n}\n\nexport default function(node: InlineComponent, renderer: Renderer, options: RenderOptions) {\n\tconst binding_props = [];\n\tconst binding_fns = [];\n\n\tnode.bindings.forEach(binding => {\n\t\trenderer.has_bindings = true;\n\n\t\t// TODO this probably won't work for contextual bindings\n\t\tconst snippet = binding.expression.node;\n\n\t\tbinding_props.push(p`${binding.name}: ${snippet}`);\n\t\tbinding_fns.push(p`${binding.name}: $$value => { ${snippet} = $$value; $$settled = false }`);\n\t});\n\n\tconst uses_spread = node.attributes.find(attr => attr.is_spread);\n\n\tlet props;\n\n\tif (uses_spread) {\n\t\tprops = x`@_Object.assign(${\n\t\t\tnode.attributes\n\t\t\t\t.map(attribute => {\n\t\t\t\t\tif (attribute.is_spread) {\n\t\t\t\t\t\treturn attribute.expression.node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn x`{ ${attribute.name}: ${get_prop_value(attribute)} }`;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.concat(binding_props.map(p => x`{ ${p} }`))\n\t\t})`;\n\t} else {\n\t\tprops = x`{\n\t\t\t${node.attributes.map(attribute => p`${attribute.name}: ${get_prop_value(attribute)}`)},\n\t\t\t${binding_props}\n\t\t}`;\n\t}\n\n\tconst bindings = x`{\n\t\t${binding_fns}\n\t}`;\n\n\tconst expression = (\n\t\tnode.name === 'svelte:self'\n\t\t\t? renderer.name\n\t\t\t: node.name === 'svelte:component'\n\t\t\t\t? x`(${node.expression.node}) || @missing_component`\n\t\t\t\t: node.name.split('.').reduce(((lhs, rhs) => x`${lhs}.${rhs}`) as any)\n\t);\n\n\tconst slot_fns = [];\n\n\tif (node.children.length) {\n\t\tconst slot_scopes = new Map();\n\n\t\trenderer.push();\n\n\t\trenderer.render(node.children, Object.assign({}, options, {\n\t\t\tslot_scopes\n\t\t}));\n\n\t\tslot_scopes.set('default', {\n\t\t\tinput: get_slot_scope(node.lets),\n\t\t\toutput: renderer.pop()\n\t\t});\n\n\t\tslot_scopes.forEach(({ input, output }, name) => {\n\t\t\tslot_fns.push(\n\t\t\t\tp`${name}: (${input}) => ${output}`\n\t\t\t);\n\t\t});\n\t}\n\n\tconst slots = x`{\n\t\t${slot_fns}\n\t}`;\n\n\trenderer.add_expression(x`@validate_component(${expression}, \"${node.name}\").$$render($$result, ${props}, ${bindings}, ${slots})`);\n}\n","import AwaitBlock from './handlers/AwaitBlock';\nimport Comment from './handlers/Comment';\nimport DebugTag from './handlers/DebugTag';\nimport EachBlock from './handlers/EachBlock';\nimport Element from './handlers/Element';\nimport Head from './handlers/Head';\nimport HtmlTag from './handlers/HtmlTag';\nimport IfBlock from './handlers/IfBlock';\nimport InlineComponent from './handlers/InlineComponent';\nimport Slot from './handlers/Slot';\nimport Tag from './handlers/Tag';\nimport Text from './handlers/Text';\nimport Title from './handlers/Title';\nimport { AppendTarget, CompileOptions } from '../../interfaces';\nimport { INode } from '../nodes/interfaces';\nimport { Expression, TemplateLiteral, Identifier } from 'estree';\nimport { escape_template } from '../utils/stringify';\n\ntype Handler = (node: any, renderer: Renderer, options: CompileOptions) => void;\n\nfunction noop() {}\n\nconst handlers: Record<string, Handler> = {\n\tAwaitBlock,\n\tBody: noop,\n\tComment,\n\tDebugTag,\n\tEachBlock,\n\tElement,\n\tHead,\n\tIfBlock,\n\tInlineComponent,\n\tMustacheTag: Tag, // TODO MustacheTag is an anachronism\n\tOptions: noop,\n\tRawMustacheTag: HtmlTag,\n\tSlot,\n\tText,\n\tTitle,\n\tWindow: noop\n};\n\nexport interface RenderOptions extends CompileOptions{\n\tlocate: (c: number) => { line: number; column: number };\n\thead_id?: string;\n}\n\nexport default class Renderer {\n\thas_bindings = false;\n\n\tname: Identifier;\n\n\tstack: Array<{ current: { value: string }; literal: TemplateLiteral }> = [];\n\tcurrent: { value: string }; // TODO can it just be `current: string`?\n\tliteral: TemplateLiteral;\n\n\ttargets: AppendTarget[] = [];\n\n\tconstructor({ name }) {\n\t\tthis.name = name;\n\t\tthis.push();\n\t}\n\n\tadd_string(str: string) {\n\t\tthis.current.value += escape_template(str);\n\t}\n\n\tadd_expression(node: Expression) {\n\t\tthis.literal.quasis.push({\n\t\t\ttype: 'TemplateElement',\n\t\t\tvalue: { raw: this.current.value, cooked: null },\n\t\t\ttail: false\n\t\t});\n\n\t\tthis.literal.expressions.push(node);\n\t\tthis.current.value = '';\n\t}\n\n\tpush() {\n\t\tconst current = this.current = { value: '' };\n\n\t\tconst literal = this.literal = {\n\t\t\ttype: 'TemplateLiteral',\n\t\t\texpressions: [],\n\t\t\tquasis: []\n\t\t};\n\n\t\tthis.stack.push({ current, literal });\n\t}\n\n\tpop() {\n\t\tthis.literal.quasis.push({\n\t\t\ttype: 'TemplateElement',\n\t\t\tvalue: { raw: this.current.value, cooked: null },\n\t\t\ttail: true\n\t\t});\n\n\t\tconst popped = this.stack.pop();\n\t\tconst last = this.stack[this.stack.length - 1];\n\n\t\tif (last) {\n\t\t\tthis.literal = last.literal;\n\t\t\tthis.current = last.current;\n\t\t}\n\n\t\treturn popped.literal;\n\t}\n\n\trender(nodes: INode[], options: RenderOptions) {\n\t\tnodes.forEach(node => {\n\t\t\tconst handler = handlers[node.type];\n\n\t\t\tif (!handler) {\n\t\t\t\tthrow new Error(`No handler for '${node.type}' nodes`);\n\t\t\t}\n\n\t\t\thandler(node, this, options);\n\t\t});\n\t}\n}\n","import { b } from 'code-red';\nimport Component from '../Component';\nimport { CompileOptions, CssResult } from '../../interfaces';\nimport { string_literal } from '../utils/stringify';\nimport Renderer from './Renderer';\nimport { INode as TemplateNode } from '../nodes/interfaces'; // TODO\nimport Text from '../nodes/Text';\nimport { extract_names } from '../utils/scope';\nimport { LabeledStatement, Statement, ExpressionStatement, AssignmentExpression, Node } from 'estree';\n\nexport default function ssr(\n\tcomponent: Component,\n\toptions: CompileOptions\n): {js: Node[]; css: CssResult} {\n\tconst renderer = new Renderer({\n\t\tname: component.name\n\t});\n\n\tconst { name } = component;\n\n\t// create $$render function\n\trenderer.render(trim(component.fragment.children), Object.assign({\n\t\tlocate: component.locate\n\t}, options));\n\n\t// TODO put this inside the Renderer class\n\tconst literal = renderer.pop();\n\n\t// TODO concatenate CSS maps\n\tconst css = options.customElement ?\n\t\t{ code: null, map: null } :\n\t\tcomponent.stylesheet.render(options.filename, true);\n\n\tconst reactive_stores = component.vars.filter(variable => variable.name[0] === '$' && variable.name[1] !== '$');\n\tconst reactive_store_values = reactive_stores\n\t\t.map(({ name }) => {\n\t\t\tconst store_name = name.slice(1);\n\t\t\tconst store = component.var_lookup.get(store_name);\n\t\t\tif (store && store.hoistable) return null;\n\n\t\t\tconst assignment = b`${name} = @get_store_value(${store_name});`;\n\n\t\t\treturn component.compile_options.dev\n\t\t\t\t? b`@validate_store(${store_name}, '${store_name}'); ${assignment}`\n\t\t\t\t: assignment;\n\t\t})\n\t\t.filter(Boolean);\n\n\tcomponent.rewrite_props(({ name }) => {\n\t\tconst value = `$${name}`;\n\n\t\tlet insert = b`${value} = @get_store_value(${name})`;\n\t\tif (component.compile_options.dev) {\n\t\t\tinsert = b`@validate_store(${name}, '${name}'); ${insert}`;\n\t\t}\n\n\t\treturn insert;\n\t});\n\n\tconst instance_javascript = component.extract_javascript(component.ast.instance);\n\n\t// TODO only do this for props with a default value\n\tconst parent_bindings = instance_javascript\n\t\t? component.vars\n\t\t\t.filter(variable => !variable.module && variable.export_name)\n\t\t\t.map(prop => {\n\t\t\t\treturn b`if ($$props.${prop.export_name} === void 0 && $$bindings.${prop.export_name} && ${prop.name} !== void 0) $$bindings.${prop.export_name}(${prop.name});`;\n\t\t\t})\n\t\t: [];\n\n\tconst reactive_declarations = component.reactive_declarations.map(d => {\n\t\tconst body: Statement = (d.node as LabeledStatement).body;\n\n\t\tlet statement = b`${body}`;\n\n\t\tif (d.declaration) {\n\t\t\tconst declared = extract_names(d.declaration);\n\t\t\tconst injected = declared.filter(name => {\n\t\t\t\treturn name[0] !== '$' && component.var_lookup.get(name).injected;\n\t\t\t});\n\n\t\t\tconst self_dependencies = injected.filter(name => d.dependencies.has(name));\n\n\t\t\tif (injected.length) {\n\t\t\t\t// in some cases we need to do `let foo; [expression]`, in\n\t\t\t\t// others we can do `let [expression]`\n\t\t\t\tconst separate = (\n\t\t\t\t\tself_dependencies.length > 0 ||\n\t\t\t\t\tdeclared.length > injected.length\n\t\t\t\t);\n\n\t\t\t\tconst { left, right } = (body as ExpressionStatement).expression as AssignmentExpression;\n\n\t\t\t\tstatement = separate\n\t\t\t\t\t? b`\n\t\t\t\t\t\t${injected.map(name => b`let ${name};`)}\n\t\t\t\t\t\t${statement}`\n\t\t\t\t\t: b`\n\t\t\t\t\t\tlet ${left} = ${right}`;\n\t\t\t}\n\t\t} else { // TODO do not add label if it's not referenced\n\t\t\tstatement = b`$: { ${statement} }`;\n\t\t}\n\n\t\treturn statement;\n\t});\n\n\tconst main = renderer.has_bindings\n\t\t? b`\n\t\t\tlet $$settled;\n\t\t\tlet $$rendered;\n\n\t\t\tdo {\n\t\t\t\t$$settled = true;\n\n\t\t\t\t${reactive_store_values}\n\n\t\t\t\t${reactive_declarations}\n\n\t\t\t\t$$rendered = ${literal};\n\t\t\t} while (!$$settled);\n\n\t\t\treturn $$rendered;\n\t\t`\n\t\t: b`\n\t\t\t${reactive_store_values}\n\n\t\t\t${reactive_declarations}\n\n\t\t\treturn ${literal};`;\n\n\tconst blocks = [\n\t\t...reactive_stores.map(({ name }) => {\n\t\t\tconst store_name = name.slice(1);\n\t\t\tconst store = component.var_lookup.get(store_name);\n\t\t\tif (store && store.hoistable) {\n\t\t\t\treturn b`let ${name} = @get_store_value(${store_name});`;\n\t\t\t}\n\t\t\treturn b`let ${name};`;\n\t\t}),\n\n\t\tinstance_javascript,\n\t\t...parent_bindings,\n\t\tcss.code && b`$$result.css.add(#css);`,\n\t\tmain\n\t].filter(Boolean);\n\n\tconst js = b`\n\t\t${css.code ? b`\n\t\tconst #css = {\n\t\t\tcode: \"${css.code}\",\n\t\t\tmap: ${css.map ? string_literal(css.map.toString()) : 'null'}\n\t\t};` : null}\n\n\t\t${component.extract_javascript(component.ast.module)}\n\n\t\t${component.fully_hoisted}\n\n\t\tconst ${name} = @create_ssr_component(($$result, $$props, $$bindings, $$slots) => {\n\t\t\t${blocks}\n\t\t});\n\t`;\n\n\treturn {js, css};\n}\n\nfunction trim(nodes: TemplateNode[]) {\n\tlet start = 0;\n\tfor (; start < nodes.length; start += 1) {\n\t\tconst node = nodes[start] as Text;\n\t\tif (node.type !== 'Text') break;\n\n\t\tnode.data = node.data.replace(/^\\s+/, '');\n\t\tif (node.data) break;\n\t}\n\n\tlet end = nodes.length;\n\tfor (; end > start; end -= 1) {\n\t\tconst node = nodes[end - 1] as Text;\n\t\tif (node.type !== 'Text') break;\n\n\t\tnode.data = node.data.replace(/\\s+$/, '');\n\t\tif (node.data) break;\n\t}\n\n\treturn nodes.slice(start, end);\n}\n","import list from '../utils/list';\nimport { ModuleFormat } from '../interfaces';\nimport { b, x } from 'code-red';\nimport { Identifier, ImportDeclaration } from 'estree';\n\nconst wrappers = { esm, cjs };\n\ninterface Export {\n\tname: string;\n\tas: string;\n}\n\nexport default function create_module(\n\tprogram: any,\n\tformat: ModuleFormat,\n\tname: Identifier,\n\tbanner: string,\n\tsveltePath = 'svelte',\n\thelpers: Array<{ name: string; alias: Identifier }>,\n\tglobals: Array<{ name: string; alias: Identifier }>,\n\timports: ImportDeclaration[],\n\tmodule_exports: Export[]\n) {\n\tconst internal_path = `${sveltePath}/internal`;\n\n\thelpers.sort((a, b) => (a.name < b.name) ? -1 : 1);\n\tglobals.sort((a, b) => (a.name < b.name) ? -1 : 1);\n\n\tif (format === 'esm') {\n\t\treturn esm(program, name, banner, sveltePath, internal_path, helpers, globals, imports, module_exports);\n\t}\n\n\tif (format === 'cjs') return cjs(program, name, banner, sveltePath, internal_path, helpers, globals, imports, module_exports);\n\n\tthrow new Error(`options.format is invalid (must be ${list(Object.keys(wrappers))})`);\n}\n\nfunction edit_source(source, sveltePath) {\n\treturn source === 'svelte' || source.startsWith('svelte/')\n\t\t? source.replace('svelte', sveltePath)\n\t\t: source;\n}\n\nfunction get_internal_globals(\n\tglobals: Array<{ name: string; alias: Identifier }>, \n\thelpers: Array<{ name: string; alias: Identifier }>\n) {\n\treturn globals.length > 0 && {\n\t\ttype: 'VariableDeclaration',\n\t\tkind: 'const',\n\t\tdeclarations: [{\n\t\t\ttype: 'VariableDeclarator',\n\t\t\tid: {\n\t\t\t\ttype: 'ObjectPattern',\n\t\t\t\tproperties: globals.map(g => ({\n\t\t\t\t\ttype: 'Property',\n\t\t\t\t\tmethod: false,\n\t\t\t\t\tshorthand: false,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tkey: { type: 'Identifier', name: g.name },\n\t\t\t\t\tvalue: g.alias,\n\t\t\t\t\tkind: 'init'\n\t\t\t\t}))\n\t\t\t},\n\t\t\tinit: helpers.find(({ name }) => name === 'globals').alias\n\t\t}]\n\t};\n} \n\nfunction esm(\n\tprogram: any,\n\tname: Identifier,\n\tbanner: string,\n\tsveltePath: string,\n\tinternal_path: string,\n\thelpers: Array<{ name: string; alias: Identifier }>,\n\tglobals: Array<{ name: string; alias: Identifier }>,\n\timports: ImportDeclaration[],\n\tmodule_exports: Export[]\n) {\n\tconst import_declaration = {\n\t\ttype: 'ImportDeclaration',\n\t\tspecifiers: helpers.map(h => ({\n\t\t\ttype: 'ImportSpecifier',\n\t\t\tlocal: h.alias,\n\t\t\timported: { type: 'Identifier', name: h.name }\n\t\t})),\n\t\tsource: { type: 'Literal', value: internal_path }\n\t};\n\n\tconst internal_globals = get_internal_globals(globals, helpers);\n\n\t// edit user imports\n\timports.forEach(node => {\n\t\tnode.source.value = edit_source(node.source.value, sveltePath);\n\t});\n\n\tconst exports = module_exports.length > 0 && {\n\t\ttype: 'ExportNamedDeclaration',\n\t\tspecifiers: module_exports.map(x => ({\n\t\t\ttype: 'Specifier',\n\t\t\tlocal: { type: 'Identifier', name: x.name },\n\t\t\texported: { type: 'Identifier', name: x.as }\n\t\t}))\n\t};\n\n\tprogram.body = b`\n\t\t/* ${banner} */\n\n\t\t${import_declaration}\n\t\t${internal_globals}\n\t\t${imports}\n\n\t\t${program.body}\n\n\t\texport default ${name};\n\t\t${exports}\n\t`;\n}\n\nfunction cjs(\n\tprogram: any,\n\tname: Identifier,\n\tbanner: string,\n\tsveltePath: string,\n\tinternal_path: string,\n\thelpers: Array<{ name: string; alias: Identifier }>,\n\tglobals: Array<{ name: string; alias: Identifier }>,\n\timports: ImportDeclaration[],\n\tmodule_exports: Export[]\n) {\n\tconst internal_requires = {\n\t\ttype: 'VariableDeclaration',\n\t\tkind: 'const',\n\t\tdeclarations: [{\n\t\t\ttype: 'VariableDeclarator',\n\t\t\tid: {\n\t\t\t\ttype: 'ObjectPattern',\n\t\t\t\tproperties: helpers.map(h => ({\n\t\t\t\t\ttype: 'Property',\n\t\t\t\t\tmethod: false,\n\t\t\t\t\tshorthand: false,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tkey: { type: 'Identifier', name: h.name },\n\t\t\t\t\tvalue: h.alias,\n\t\t\t\t\tkind: 'init'\n\t\t\t\t}))\n\t\t\t},\n\t\t\tinit: x`require(\"${internal_path}\")`\n\t\t}]\n\t};\n\n\tconst internal_globals = get_internal_globals(globals, helpers);\n\n\tconst user_requires = imports.map(node => {\n\t\tconst init = x`require(\"${edit_source(node.source.value, sveltePath)}\")`;\n\t\tif (node.specifiers.length === 0) {\n\t\t\treturn b`${init};`;\n\t\t}\n\t\treturn {\n\t\t\ttype: 'VariableDeclaration',\n\t\t\tkind: 'const',\n\t\t\tdeclarations: [{\n\t\t\t\ttype: 'VariableDeclarator',\n\t\t\t\tid: node.specifiers[0].type === 'ImportNamespaceSpecifier'\n\t\t\t\t\t? { type: 'Identifier', name: node.specifiers[0].local.name }\n\t\t\t\t\t: {\n\t\t\t\t\t\ttype: 'ObjectPattern',\n\t\t\t\t\t\tproperties: node.specifiers.map(s => ({\n\t\t\t\t\t\t\ttype: 'Property',\n\t\t\t\t\t\t\tmethod: false,\n\t\t\t\t\t\t\tshorthand: false,\n\t\t\t\t\t\t\tcomputed: false,\n\t\t\t\t\t\t\tkey: s.type === 'ImportSpecifier' ? s.imported : { type: 'Identifier', name: 'default' },\n\t\t\t\t\t\t\tvalue: s.local,\n\t\t\t\t\t\t\tkind: 'init'\n\t\t\t\t\t\t}))\n\t\t\t\t\t},\n\t\t\t\tinit\n\t\t\t}]\n\t\t};\n\t});\n\n\tconst exports = module_exports.map(x => b`exports.${{ type: 'Identifier', name: x.as }} = ${{ type: 'Identifier', name: x.name }};`);\n\n\tprogram.body = b`\n\t\t/* ${banner} */\n\n\t\t\"use strict\";\n\t\t${internal_requires}\n\t\t${internal_globals}\n\t\t${user_requires}\n\n\t\t${program.body}\n\n\t\texports.default = ${name};\n\t\t${exports}\n\t`;\n}\n","import { Node } from 'estree';\n\nexport const UNKNOWN = {};\n\nexport function gather_possible_values(node: Node, set: Set<string|{}>) {\n\tif (node.type === 'Literal') {\n\t\tset.add(node.value);\n\t}\n\n\telse if (node.type === 'ConditionalExpression') {\n\t\tgather_possible_values(node.consequent, set);\n\t\tgather_possible_values(node.alternate, set);\n\t}\n\n\telse {\n\t\tset.add(UNKNOWN);\n\t}\n}","import MagicString from 'magic-string';\nimport Stylesheet from './Stylesheet';\nimport { gather_possible_values, UNKNOWN } from './gather_possible_values';\nimport { CssNode } from './interfaces';\nimport Component from '../Component';\nimport Element from '../nodes/Element';\n\nenum BlockAppliesToNode {\n\tNotPossible,\n\tPossible,\n\tUnknownSelectorType\n}\n\nexport default class Selector {\n\tnode: CssNode;\n\tstylesheet: Stylesheet;\n\tblocks: Block[];\n\tlocal_blocks: Block[];\n\tused: boolean;\n\n\tconstructor(node: CssNode, stylesheet: Stylesheet) {\n\t\tthis.node = node;\n\t\tthis.stylesheet = stylesheet;\n\n\t\tthis.blocks = group_selectors(node);\n\n\t\t// take trailing :global(...) selectors out of consideration\n\t\tlet i = this.blocks.length;\n\t\twhile (i > 0) {\n\t\t\tif (!this.blocks[i - 1].global) break;\n\t\t\ti -= 1;\n\t\t}\n\n\t\tthis.local_blocks = this.blocks.slice(0, i);\n\t\tthis.used = this.blocks[0].global;\n\t}\n\n\tapply(node: Element, stack: Element[]) {\n\t\tconst to_encapsulate: any[] = [];\n\n\t\tapply_selector(this.local_blocks.slice(), node, stack.slice(), to_encapsulate);\n\n\t\tif (to_encapsulate.length > 0) {\n\t\t\tto_encapsulate.forEach(({ node, block }) => {\n\t\t\t\tthis.stylesheet.nodes_with_css_class.add(node);\n\t\t\t\tblock.should_encapsulate = true;\n\t\t\t});\n\n\t\t\tthis.used = true;\n\t\t}\n\t}\n\n\tminify(code: MagicString) {\n\t\tlet c: number = null;\n\t\tthis.blocks.forEach((block, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tif (block.start - c > 1) {\n\t\t\t\t\tcode.overwrite(c, block.start, block.combinator.name || ' ');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc = block.end;\n\t\t});\n\t}\n\n\ttransform(code: MagicString, attr: string, max_amount_class_specificity_increased: number) {\n\t\tconst amount_class_specificity_to_increase = max_amount_class_specificity_increased - this.blocks.filter(block => block.should_encapsulate).length;\n\t\tattr = attr.repeat(amount_class_specificity_to_increase + 1);\n\n\t\tfunction encapsulate_block(block: Block) {\n\t\t\tlet i = block.selectors.length;\n\n\t\t\twhile (i--) {\n\t\t\t\tconst selector = block.selectors[i];\n\t\t\t\tif (selector.type === 'PseudoElementSelector' || selector.type === 'PseudoClassSelector') {\n\t\t\t\t\tif (selector.name !== 'root') {\n\t\t\t\t\t\tif (i === 0) code.prependRight(selector.start, attr);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (selector.type === 'TypeSelector' && selector.name === '*') {\n\t\t\t\t\tcode.overwrite(selector.start, selector.end, attr);\n\t\t\t\t} else {\n\t\t\t\t\tcode.appendLeft(selector.end, attr);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.blocks.forEach((block) => {\n\t\t\tif (block.global) {\n\t\t\t\tconst selector = block.selectors[0];\n\t\t\t\tconst first = selector.children[0];\n\t\t\t\tconst last = selector.children[selector.children.length - 1];\n\t\t\t\tcode.remove(selector.start, first.start).remove(last.end, selector.end);\n\t\t\t}\n\n\t\t\tif (block.should_encapsulate) encapsulate_block(block);\n\t\t});\n\t}\n\n\tvalidate(component: Component) {\n\t\tthis.blocks.forEach((block) => {\n\t\t\tlet i = block.selectors.length;\n\t\t\twhile (i-- > 1) {\n\t\t\t\tconst selector = block.selectors[i];\n\t\t\t\tif (selector.type === 'PseudoClassSelector' && selector.name === 'global') {\n\t\t\t\t\tcomponent.error(selector, {\n\t\t\t\t\t\tcode: `css-invalid-global`,\n\t\t\t\t\t\tmessage: `:global(...) must be the first element in a compound selector`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tlet start = 0;\n\t\tlet end = this.blocks.length;\n\n\t\tfor (; start < end; start += 1) {\n\t\t\tif (!this.blocks[start].global) break;\n\t\t}\n\n\t\tfor (; end > start; end -= 1) {\n\t\t\tif (!this.blocks[end - 1].global) break;\n\t\t}\n\n\t\tfor (let i = start; i < end; i += 1) {\n\t\t\tif (this.blocks[i].global) {\n\t\t\t\tcomponent.error(this.blocks[i].selectors[0], {\n\t\t\t\t\tcode: `css-invalid-global`,\n\t\t\t\t\tmessage: `:global(...) can be at the start or end of a selector sequence, but not in the middle`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tget_amount_class_specificity_increased() {\n\t\tlet count = 0;\n\t\tfor (const block of this.blocks) {\n\t\t\tif (block.should_encapsulate) {\n\t\t\t\tcount ++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n}\n\nfunction apply_selector(blocks: Block[], node: Element, stack: Element[], to_encapsulate: any[]): boolean {\n\tconst block = blocks.pop();\n\tif (!block) return false;\n\n\tif (!node) {\n\t\treturn blocks.every(block => block.global);\n\t}\n\n\tswitch (block_might_apply_to_node(block, node)) {\n\t\tcase BlockAppliesToNode.NotPossible:\n\t\t\treturn false;\n\n\t\tcase BlockAppliesToNode.UnknownSelectorType:\n\t\t\t// bail. TODO figure out what these could be\n\t\t\tto_encapsulate.push({ node, block });\n\t\t\treturn true;\n\t}\n\n\tif (block.combinator) {\n\t\tif (block.combinator.type === 'WhiteSpace') {\n\t\t\tfor (const ancestor_block of blocks) {\n\t\t\t\tif (ancestor_block.global) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (const stack_node of stack) {\n\t\t\t\t\tif (block_might_apply_to_node(ancestor_block, stack_node) !== BlockAppliesToNode.NotPossible) {\n\t\t\t\t\t\tto_encapsulate.push({ node: stack_node, block: ancestor_block });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (to_encapsulate.length) {\n\t\t\t\t\tto_encapsulate.push({ node, block });\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (blocks.every(block => block.global)) {\n\t\t\t\tto_encapsulate.push({ node, block });\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} else if (block.combinator.name === '>') {\n\t\t\tif (apply_selector(blocks, stack.pop(), stack, to_encapsulate)) {\n\t\t\t\tto_encapsulate.push({ node, block });\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// TODO other combinators\n\t\tto_encapsulate.push({ node, block });\n\t\treturn true;\n\t}\n\n\tto_encapsulate.push({ node, block });\n\treturn true;\n}\n\nfunction block_might_apply_to_node(block, node): BlockAppliesToNode {\n\tlet i = block.selectors.length;\n\n\twhile (i--) {\n\t\tconst selector = block.selectors[i];\n\t\tconst name = typeof selector.name === 'string' && selector.name.replace(/\\\\(.)/g, '$1');\n\n\t\tif (selector.type === 'PseudoClassSelector' || selector.type === 'PseudoElementSelector') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (selector.type === 'PseudoClassSelector' && name === 'global') {\n\t\t\t// TODO shouldn't see this here... maybe we should enforce that :global(...)\n\t\t\t// cannot be sandwiched between non-global selectors?\n\t\t\treturn BlockAppliesToNode.NotPossible;\n\t\t}\n\n\t\tif (selector.type === 'ClassSelector') {\n\t\t\tif (!attribute_matches(node, 'class', name, '~=', false) && !node.classes.some(c => c.name === name)) return BlockAppliesToNode.NotPossible;\n\t\t}\n\n\t\telse if (selector.type === 'IdSelector') {\n\t\t\tif (!attribute_matches(node, 'id', name, '=', false)) return BlockAppliesToNode.NotPossible;\n\t\t}\n\n\t\telse if (selector.type === 'AttributeSelector') {\n\t\t\tif (!attribute_matches(node, selector.name.name, selector.value && unquote(selector.value), selector.matcher, selector.flags)) return BlockAppliesToNode.NotPossible;\n\t\t}\n\n\t\telse if (selector.type === 'TypeSelector') {\n\t\t\tif (node.name.toLowerCase() !== name.toLowerCase() && name !== '*') return BlockAppliesToNode.NotPossible;\n\t\t}\n\n\t\telse {\n\t\t\treturn BlockAppliesToNode.UnknownSelectorType;\n\t\t}\n\t}\n\n\treturn BlockAppliesToNode.Possible;\n}\n\nfunction test_attribute(operator, expected_value, case_insensitive, value) {\n\tif (case_insensitive) {\n\t\texpected_value = expected_value.toLowerCase();\n\t\tvalue = value.toLowerCase();\n\t}\n\tswitch (operator) {\n\t\tcase '=': return value === expected_value;\n\t\tcase '~=': return value.split(/\\s/).includes(expected_value);\n\t\tcase '|=': return `${value}-`.startsWith(`${expected_value}-`);\n\t\tcase '^=': return value.startsWith(expected_value);\n\t\tcase '$=': return value.endsWith(expected_value);\n\t\tcase '*=': return value.includes(expected_value);\n\t\tdefault: throw new Error(`this shouldn't happen`);\n\t}\n}\n\nfunction attribute_matches(node: CssNode, name: string, expected_value: string, operator: string, case_insensitive: boolean) {\n\tconst spread = node.attributes.find(attr => attr.type === 'Spread');\n\tif (spread) return true;\n\n\tif (node.bindings.some((binding: CssNode) => binding.name === name)) return true;\n\n\tconst attr = node.attributes.find((attr: CssNode) => attr.name === name);\n\tif (!attr) return false;\n\tif (attr.is_true) return operator === null;\n\tif (!expected_value) return true;\n\n\tif (attr.chunks.length === 1) {\n\t\tconst value = attr.chunks[0];\n\t\tif (!value) return false;\n\t\tif (value.type === 'Text') return test_attribute(operator, expected_value, case_insensitive, value.data);\n\t}\n\n\tconst possible_values = new Set();\n\n\tlet prev_values = [];\n\tfor (const chunk of attr.chunks) {\n\t\tconst current_possible_values = new Set();\n\t\tif (chunk.type === 'Text') {\n\t\t\tcurrent_possible_values.add(chunk.data);\n\t\t} else {\n\t\t\tgather_possible_values(chunk.node, current_possible_values);\n\t\t}\n\n\t\t// impossible to find out all combinations\n\t\tif (current_possible_values.has(UNKNOWN)) return true;\n\n\t\tif (prev_values.length > 0) {\n\t\t\tconst start_with_space = [];\n\t\t\tconst remaining = [];\n\t\t\tcurrent_possible_values.forEach((current_possible_value: string) => {\n\t\t\t\tif (/^\\s/.test(current_possible_value)) {\n\t\t\t\t\tstart_with_space.push(current_possible_value);\n\t\t\t\t} else {\n\t\t\t\t\tremaining.push(current_possible_value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (remaining.length > 0) {\n\t\t\t\tif (start_with_space.length > 0) {\n\t\t\t\t\tprev_values.forEach(prev_value => possible_values.add(prev_value));\n\t\t\t\t}\n\n\t\t\t\tconst combined = [];\n\t\t\t\tprev_values.forEach((prev_value: string) => {\n\t\t\t\t\tremaining.forEach((value: string) => {\n\t\t\t\t\t\tcombined.push(prev_value + value);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tprev_values = combined;\n\n\t\t\t\tstart_with_space.forEach((value: string) => {\n\t\t\t\t\tif (/\\s$/.test(value)) {\n\t\t\t\t\t\tpossible_values.add(value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprev_values.push(value);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tprev_values.forEach(prev_value => possible_values.add(prev_value));\n\t\t\t\tprev_values = [];\n\t\t\t}\n\t\t}\n\n\t\tcurrent_possible_values.forEach((current_possible_value: string) => {\n\t\t\tif (/\\s$/.test(current_possible_value)) {\n\t\t\t\tpossible_values.add(current_possible_value);\n\t\t\t} else {\n\t\t\t\tprev_values.push(current_possible_value);\n\t\t\t}\n\t\t});\n\t\tif (prev_values.length < current_possible_values.size) {\n\t\t\tprev_values.push(' ');\n\t\t}\n\n\t\tif (prev_values.length > 20) {\n\t\t\t// might grow exponentially, bail out\n\t\t\treturn true;\n\t\t}\n\t}\n\tprev_values.forEach(prev_value => possible_values.add(prev_value));\n\n\tif (possible_values.has(UNKNOWN)) return true;\n\n\tfor (const value of possible_values) {\n\t\tif (test_attribute(operator, expected_value, case_insensitive, value)) return true;\n\t}\n\n\treturn false;\n}\n\nfunction unquote(value: CssNode) {\n\tif (value.type === 'Identifier') return value.name;\n\tconst str = value.value;\n\tif (str[0] === str[str.length - 1] && str[0] === \"'\" || str[0] === '\"') {\n\t\treturn str.slice(1, str.length - 1);\n\t}\n\treturn str;\n}\n\nclass Block {\n\tglobal: boolean;\n\tcombinator: CssNode;\n\tselectors: CssNode[]\n\tstart: number;\n\tend: number;\n\tshould_encapsulate: boolean;\n\n\tconstructor(combinator: CssNode) {\n\t\tthis.combinator = combinator;\n\t\tthis.global = false;\n\t\tthis.selectors = [];\n\n\t\tthis.start = null;\n\t\tthis.end = null;\n\n\t\tthis.should_encapsulate = false;\n\t}\n\n\tadd(selector: CssNode) {\n\t\tif (this.selectors.length === 0) {\n\t\t\tthis.start = selector.start;\n\t\t\tthis.global = selector.type === 'PseudoClassSelector' && selector.name === 'global';\n\t\t}\n\n\t\tthis.selectors.push(selector);\n\t\tthis.end = selector.end;\n\t}\n}\n\nfunction group_selectors(selector: CssNode) {\n\tlet block: Block = new Block(null);\n\n\tconst blocks = [block];\n\n\tselector.children.forEach((child: CssNode) => {\n\t\tif (child.type === 'WhiteSpace' || child.type === 'Combinator') {\n\t\t\tblock = new Block(child);\n\t\t\tblocks.push(block);\n\t\t} else {\n\t\t\tblock.add(child);\n\t\t}\n\t});\n\n\treturn blocks;\n}\n","// https://github.com/darkskyapp/string-hash/blob/master/index.js\nexport default function hash(str: string): string {\n\tlet hash = 5381;\n\tlet i = str.length;\n\n\twhile (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n\treturn (hash >>> 0).toString(36);\n}","import MagicString from 'magic-string';\nimport { walk } from 'estree-walker';\nimport Selector from './Selector';\nimport Element from '../nodes/Element';\nimport { Ast, TemplateNode } from '../../interfaces';\nimport Component from '../Component';\nimport { CssNode } from './interfaces';\nimport hash from \"../utils/hash\";\n\nfunction remove_css_prefix(name: string): string {\n\treturn name.replace(/^-((webkit)|(moz)|(o)|(ms))-/, '');\n}\n\nconst is_keyframes_node = (node: CssNode) =>\n\tremove_css_prefix(node.name) === 'keyframes';\n\nconst at_rule_has_declaration = ({ block }: CssNode): true =>\n\tblock &&\n\tblock.children &&\n\tblock.children.find((node: CssNode) => node.type === 'Declaration');\n\nfunction minify_declarations(\n\tcode: MagicString,\n\tstart: number,\n\tdeclarations: Declaration[]\n): number {\n\tlet c = start;\n\n\tdeclarations.forEach((declaration, i) => {\n\t\tconst separator = i > 0 ? ';' : '';\n\t\tif ((declaration.node.start - c) > separator.length) {\n\t\t\tcode.overwrite(c, declaration.node.start, separator);\n\t\t}\n\t\tdeclaration.minify(code);\n\t\tc = declaration.node.end;\n\t});\n\n\treturn c;\n}\n\nclass Rule {\n\tselectors: Selector[];\n\tdeclarations: Declaration[];\n\tnode: CssNode;\n\tparent: Atrule;\n\n\tconstructor(node: CssNode, stylesheet, parent?: Atrule) {\n\t\tthis.node = node;\n\t\tthis.parent = parent;\n\t\tthis.selectors = node.selector.children.map((node: CssNode) => new Selector(node, stylesheet));\n\t\tthis.declarations = node.block.children.map((node: CssNode) => new Declaration(node));\n\t}\n\n\tapply(node: Element, stack: Element[]) {\n\t\tthis.selectors.forEach(selector => selector.apply(node, stack)); // TODO move the logic in here?\n\t}\n\n\tis_used(dev: boolean) {\n\t\tif (this.parent && this.parent.node.type === 'Atrule' && is_keyframes_node(this.parent.node)) return true;\n\t\tif (this.declarations.length === 0) return dev;\n\t\treturn this.selectors.some(s => s.used);\n\t}\n\n\tminify(code: MagicString, _dev: boolean) {\n\t\tlet c = this.node.start;\n\t\tlet started = false;\n\n\t\tthis.selectors.forEach((selector) => {\n\t\t\tif (selector.used) {\n\t\t\t\tconst separator = started ? ',' : '';\n\t\t\t\tif ((selector.node.start - c) > separator.length) {\n\t\t\t\t\tcode.overwrite(c, selector.node.start, separator);\n\t\t\t\t}\n\n\t\t\t\tselector.minify(code);\n\t\t\t\tc = selector.node.end;\n\n\t\t\t\tstarted = true;\n\t\t\t}\n\t\t});\n\n\t\tcode.remove(c, this.node.block.start);\n\n\t\tc = this.node.block.start + 1;\n\t\tc = minify_declarations(code, c, this.declarations);\n\n\t\tcode.remove(c, this.node.block.end - 1);\n\t}\n\n\ttransform(code: MagicString, id: string, keyframes: Map<string, string>, max_amount_class_specificity_increased: number) {\n\t\tif (this.parent && this.parent.node.type === 'Atrule' && is_keyframes_node(this.parent.node)) return true;\n\n\t\tconst attr = `.${id}`;\n\n\t\tthis.selectors.forEach(selector => selector.transform(code, attr, max_amount_class_specificity_increased));\n\t\tthis.declarations.forEach(declaration => declaration.transform(code, keyframes));\n\t}\n\n\tvalidate(component: Component) {\n\t\tthis.selectors.forEach(selector => {\n\t\t\tselector.validate(component);\n\t\t});\n\t}\n\n\twarn_on_unused_selector(handler: (selector: Selector) => void) {\n\t\tthis.selectors.forEach(selector => {\n\t\t\tif (!selector.used) handler(selector);\n\t\t});\n\t}\n\n\tget_max_amount_class_specificity_increased() {\n\t\treturn Math.max(...this.selectors.map(selector => selector.get_amount_class_specificity_increased()));\n\t}\n}\n\nclass Declaration {\n\tnode: CssNode;\n\n\tconstructor(node: CssNode) {\n\t\tthis.node = node;\n\t}\n\n\ttransform(code: MagicString, keyframes: Map<string, string>) {\n\t\tconst property = this.node.property && remove_css_prefix(this.node.property.toLowerCase());\n\t\tif (property === 'animation' || property === 'animation-name') {\n\t\t\tthis.node.value.children.forEach((block: CssNode) => {\n\t\t\t\tif (block.type === 'Identifier') {\n\t\t\t\t\tconst name = block.name;\n\t\t\t\t\tif (keyframes.has(name)) {\n\t\t\t\t\t\tcode.overwrite(block.start, block.end, keyframes.get(name));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tminify(code: MagicString) {\n\t\tif (!this.node.property) return; // @apply, and possibly other weird cases?\n\n\t\tconst c = this.node.start + this.node.property.length;\n\t\tconst first = this.node.value.children\n\t\t\t? this.node.value.children[0]\n\t\t\t: this.node.value;\n\n\t\tlet start = first.start;\n\t\twhile (/\\s/.test(code.original[start])) start += 1;\n\n\t\tif (start - c > 1) {\n\t\t\tcode.overwrite(c, start, ':');\n\t\t}\n\t}\n}\n\nclass Atrule {\n\tnode: CssNode;\n\tchildren: Array<Atrule|Rule>;\n\tdeclarations: Declaration[];\n\n\tconstructor(node: CssNode) {\n\t\tthis.node = node;\n\t\tthis.children = [];\n\t\tthis.declarations = [];\n\t}\n\n\tapply(node: Element, stack: Element[]) {\n\t\tif (this.node.name === 'media' || this.node.name === 'supports') {\n\t\t\tthis.children.forEach(child => {\n\t\t\t\tchild.apply(node, stack);\n\t\t\t});\n\t\t}\n\n\t\telse if (is_keyframes_node(this.node)) {\n\t\t\tthis.children.forEach((rule: Rule) => {\n\t\t\t\trule.selectors.forEach(selector => {\n\t\t\t\t\tselector.used = true;\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tis_used(_dev: boolean) {\n\t\treturn true; // TODO\n\t}\n\n\tminify(code: MagicString, dev: boolean) {\n\t\tif (this.node.name === 'media') {\n\t\t\tconst expression_char = code.original[this.node.expression.start];\n\t\t\tlet c = this.node.start + (expression_char === '(' ? 6 : 7);\n\t\t\tif (this.node.expression.start > c) code.remove(c, this.node.expression.start);\n\n\t\t\tthis.node.expression.children.forEach((query: CssNode) => {\n\t\t\t\t// TODO minify queries\n\t\t\t\tc = query.end;\n\t\t\t});\n\n\t\t\tcode.remove(c, this.node.block.start);\n\t\t} else if (this.node.name === 'supports') {\n\t\t\tlet c = this.node.start + 9;\n\t\t\tif (this.node.expression.start - c > 1) code.overwrite(c, this.node.expression.start, ' ');\n\t\t\tthis.node.expression.children.forEach((query: CssNode) => {\n\t\t\t\t// TODO minify queries\n\t\t\t\tc = query.end;\n\t\t\t});\n\t\t\tcode.remove(c, this.node.block.start);\n\t\t} else {\n\t\t\tlet c = this.node.start + this.node.name.length + 1;\n\t\t\tif (this.node.expression) {\n\t\t\t\tif (this.node.expression.start - c > 1) code.overwrite(c, this.node.expression.start, ' ');\n\t\t\t\tc = this.node.expression.end;\n\t\t\t}\n\t\t\tif (this.node.block && this.node.block.start - c > 0) {\n\t\t\t\tcode.remove(c, this.node.block.start);\n\t\t\t}\n\t\t}\n\n\t\t// TODO other atrules\n\n\t\tif (this.node.block) {\n\t\t\tlet c = this.node.block.start + 1;\n\t\t\tif (this.declarations.length) {\n\t\t\t\tc = minify_declarations(code, c, this.declarations);\n\t\t\t\t// if the atrule has children, leave the last declaration semicolon alone\n\t\t\t\tif (this.children.length) c++;\n\t\t\t}\n\n\t\t\tthis.children.forEach(child => {\n\t\t\t\tif (child.is_used(dev)) {\n\t\t\t\t\tcode.remove(c, child.node.start);\n\t\t\t\t\tchild.minify(code, dev);\n\t\t\t\t\tc = child.node.end;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcode.remove(c, this.node.block.end - 1);\n\t\t}\n\t}\n\n\ttransform(code: MagicString, id: string, keyframes: Map<string, string>, max_amount_class_specificity_increased: number) {\n\t\tif (is_keyframes_node(this.node)) {\n\t\t\tthis.node.expression.children.forEach(({ type, name, start, end }: CssNode) => {\n\t\t\t\tif (type === 'Identifier') {\n\t\t\t\t\tif (name.startsWith('-global-')) {\n\t\t\t\t\t\tcode.remove(start, start + 8);\n\t\t\t\t\t\tthis.children.forEach((rule: Rule) => {\n\t\t\t\t\t\t\trule.selectors.forEach(selector => {\n\t\t\t\t\t\t\t\tselector.used = true;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcode.overwrite(start, end, keyframes.get(name));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.children.forEach(child => {\n\t\t\tchild.transform(code, id, keyframes, max_amount_class_specificity_increased);\n\t\t});\n\t}\n\n\tvalidate(component: Component) {\n\t\tthis.children.forEach(child => {\n\t\t\tchild.validate(component);\n\t\t});\n\t}\n\n\twarn_on_unused_selector(handler: (selector: Selector) => void) {\n\t\tif (this.node.name !== 'media') return;\n\n\t\tthis.children.forEach(child => {\n\t\t\tchild.warn_on_unused_selector(handler);\n\t\t});\n\t}\n\n\tget_max_amount_class_specificity_increased() {\n\t\treturn Math.max(...this.children.map(rule => rule.get_max_amount_class_specificity_increased()));\n\t}\n}\n\nexport default class Stylesheet {\n\tsource: string;\n\tast: Ast;\n\tfilename: string;\n\tdev: boolean;\n\n\thas_styles: boolean;\n\tid: string;\n\n\tchildren: Array<Rule|Atrule> = [];\n\tkeyframes: Map<string, string> = new Map();\n\n\tnodes_with_css_class: Set<CssNode> = new Set();\n\n\tconstructor(source: string, ast: Ast, filename: string, dev: boolean) {\n\t\tthis.source = source;\n\t\tthis.ast = ast;\n\t\tthis.filename = filename;\n\t\tthis.dev = dev;\n\n\t\tif (ast.css && ast.css.children.length) {\n\t\t\tthis.id = `svelte-${hash(ast.css.content.styles)}`;\n\n\t\t\tthis.has_styles = true;\n\n\t\t\tconst stack: Atrule[] = [];\n\t\t\tlet depth = 0;\n\t\t\tlet current_atrule: Atrule = null;\n\n\t\t\twalk(ast.css as any, {\n\t\t\t\tenter: (node: any) => {\n\t\t\t\t\tif (node.type === 'Atrule') {\n\t\t\t\t\t\tconst atrule = new Atrule(node);\n\t\t\t\t\t\tstack.push(atrule);\n\n\t\t\t\t\t\tif (current_atrule) {\n\t\t\t\t\t\t\tcurrent_atrule.children.push(atrule);\n\t\t\t\t\t\t} else if (depth <= 1) {\n\t\t\t\t\t\t\tthis.children.push(atrule);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (is_keyframes_node(node)) {\n\t\t\t\t\t\t\tnode.expression.children.forEach((expression: CssNode) => {\n\t\t\t\t\t\t\t\tif (expression.type === 'Identifier' && !expression.name.startsWith('-global-')) {\n\t\t\t\t\t\t\t\t\tthis.keyframes.set(expression.name, `${this.id}-${expression.name}`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (at_rule_has_declaration(node)) {\n\t\t\t\t\t\t\tconst at_rule_declarations = node.block.children\n\t\t\t\t\t\t\t\t.filter(node => node.type === 'Declaration')\n\t\t\t\t\t\t\t\t.map(node => new Declaration(node));\n\t\t\t\t\t\t\tatrule.declarations.push(...at_rule_declarations);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrent_atrule = atrule;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node.type === 'Rule') {\n\t\t\t\t\t\tconst rule = new Rule(node, this, current_atrule);\n\n\t\t\t\t\t\tif (current_atrule) {\n\t\t\t\t\t\t\tcurrent_atrule.children.push(rule);\n\t\t\t\t\t\t} else if (depth <= 1) {\n\t\t\t\t\t\t\tthis.children.push(rule);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdepth += 1;\n\t\t\t\t},\n\n\t\t\t\tleave: (node: any) => {\n\t\t\t\t\tif (node.type === 'Atrule') {\n\t\t\t\t\t\tstack.pop();\n\t\t\t\t\t\tcurrent_atrule = stack[stack.length - 1];\n\t\t\t\t\t}\n\n\t\t\t\t\tdepth -= 1;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.has_styles = false;\n\t\t}\n\t}\n\n\tapply(node: Element) {\n\t\tif (!this.has_styles) return;\n\n\t\tconst stack: Element[] = [];\n\t\tlet parent: TemplateNode = node;\n\t\twhile (parent = parent.parent) {\n\t\t\tif (parent.type === 'Element') stack.unshift(parent as Element);\n\t\t}\n\n\t\tfor (let i = 0; i < this.children.length; i += 1) {\n\t\t\tconst child = this.children[i];\n\t\t\tchild.apply(node, stack);\n\t\t}\n\t}\n\n\treify() {\n\t\tthis.nodes_with_css_class.forEach((node: Element) => {\n\t\t\tnode.add_css_class();\n\t\t});\n\t}\n\n\trender(file: string, should_transform_selectors: boolean) {\n\t\tif (!this.has_styles) {\n\t\t\treturn { code: null, map: null };\n\t\t}\n\n\t\tconst code = new MagicString(this.source);\n\n\t\twalk(this.ast.css as any, {\n\t\t\tenter: (node: any) => {\n\t\t\t\tcode.addSourcemapLocation(node.start);\n\t\t\t\tcode.addSourcemapLocation(node.end);\n\t\t\t}\n\t\t});\n\n\t\tif (should_transform_selectors) {\n\t\t\tconst max = Math.max(...this.children.map(rule => rule.get_max_amount_class_specificity_increased()));\n\t\t\tthis.children.forEach((child: (Atrule|Rule)) => {\n\t\t\t\tchild.transform(code, this.id, this.keyframes, max);\n\t\t\t});\n\t\t}\n\n\t\tlet c = 0;\n\t\tthis.children.forEach(child => {\n\t\t\tif (child.is_used(this.dev)) {\n\t\t\t\tcode.remove(c, child.node.start);\n\t\t\t\tchild.minify(code, this.dev);\n\t\t\t\tc = child.node.end;\n\t\t\t}\n\t\t});\n\n\t\tcode.remove(c, this.source.length);\n\n\t\treturn {\n\t\t\tcode: code.toString(),\n\t\t\tmap: code.generateMap({\n\t\t\t\tincludeContent: true,\n\t\t\t\tsource: this.filename,\n\t\t\t\tfile\n\t\t\t})\n\t\t};\n\t}\n\n\tvalidate(component: Component) {\n\t\tthis.children.forEach(child => {\n\t\t\tchild.validate(component);\n\t\t});\n\t}\n\n\twarn_on_unused_selectors(component: Component) {\n\t\tthis.children.forEach(child => {\n\t\t\tchild.warn_on_unused_selector((selector: Selector) => {\n\t\t\t\tcomponent.warn(selector.node, {\n\t\t\t\t\tcode: `css-unused-selector`,\n\t\t\t\t\tmessage: `Unused CSS selector`\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n","import Node from './shared/Node';\nimport Expression from './shared/Expression';\nimport Component from '../Component';\nimport { sanitize } from '../../utils/names';\nimport { Identifier } from 'estree';\n\nexport default class EventHandler extends Node {\n\ttype: 'EventHandler';\n\tname: string;\n\tmodifiers: Set<string>;\n\texpression: Expression;\n\thandler_name: Identifier;\n\tuses_context = false;\n\tcan_make_passive = false;\n\n\tconstructor(component: Component, parent, template_scope, info) {\n\t\tsuper(component, parent, template_scope, info);\n\n\t\tthis.name = info.name;\n\t\tthis.modifiers = new Set(info.modifiers);\n\n\t\tif (info.expression) {\n\t\t\tthis.expression = new Expression(component, this, template_scope, info.expression);\n\t\t\tthis.uses_context = this.expression.uses_context;\n\n\t\t\tif (/FunctionExpression/.test(info.expression.type) && info.expression.params.length === 0) {\n\t\t\t\t// TODO make this detection more accurate — if `event.preventDefault` isn't called, and\n\t\t\t\t// `event` is passed to another function, we can make it passive\n\t\t\t\tthis.can_make_passive = true;\n\t\t\t} else if (info.expression.type === 'Identifier') {\n\t\t\t\tlet node = component.node_for_declaration.get(info.expression.name);\n\n\t\t\t\tif (node) {\n\t\t\t\t\tif (node.type === 'VariableDeclaration') {\n\t\t\t\t\t\t// for `const handleClick = () => {...}`, we want the [arrow] function expression node\n\t\t\t\t\t\tconst declarator = node.declarations.find(d => (d.id as Identifier).name === info.expression.name);\n\t\t\t\t\t\tnode = declarator && declarator.init;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node && (node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration' || node.type === 'ArrowFunctionExpression') && node.params.length === 0) {\n\t\t\t\t\t\tthis.can_make_passive = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.handler_name = component.get_unique_name(`${sanitize(this.name)}_handler`);\n\t\t}\n\t}\n\n\tget reassigned(): boolean {\n\t\tif (!this.expression) {\n\t\t\treturn false;\n\t\t}\n\t\tconst node = this.expression.node;\n\n\t\tif (node.type === 'Identifier') {\n\t\t\treturn (\n\t\t\t\tthis.component.node_for_declaration.get(node.name) &&\n\t\t\t\tthis.component.var_lookup.get(node.name).reassigned\n\t\t\t);\n\t\t}\n\n\t\tif (/FunctionExpression/.test(node.type)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.expression.dynamic_dependencies().length > 0;\n\t}\n}\n","import Node from './shared/Node';\n\nconst pattern = /^\\s*svelte-ignore\\s+([\\s\\S]+)\\s*$/m;\n\nexport default class Comment extends Node {\n\ttype: 'Comment';\n\tdata: string;\n\tignores: string[];\n\n\tconstructor(component, parent, scope, info) {\n\t\tsuper(component, parent, scope, info);\n\t\tthis.data = info.data;\n\n\t\tconst match = pattern.exec(this.data);\n\t\tthis.ignores = match ? match[1].split(/[^\\S]/).map(x => x.trim()).filter(Boolean) : [];\n\t}\n}","import ElseBlock from './ElseBlock';\nimport Expression from './shared/Expression';\nimport map_children from './shared/map_children';\nimport TemplateScope from './shared/TemplateScope';\nimport AbstractBlock from './shared/AbstractBlock';\nimport Element from './Element';\nimport { x } from 'code-red';\nimport { Node, Identifier, RestElement } from 'estree';\n\ninterface Context {\n\tkey: Identifier;\n\tname?: string;\n\tmodifier: (node: Node) => Node;\n}\n\nfunction unpack_destructuring(contexts: Context[], node: Node, modifier: (node: Node) => Node) {\n\tif (!node) return;\n\n\tif (node.type === 'Identifier' || (node as any).type === 'RestIdentifier') { // TODO is this right? not RestElement?\n\t\tcontexts.push({\n\t\t\tkey: node as Identifier,\n\t\t\tmodifier\n\t\t});\n\t} else if (node.type === 'ArrayPattern') {\n\t\tnode.elements.forEach((element, i) => {\n\t\t\tif (element && (element as any).type === 'RestIdentifier') {\n\t\t\t\tunpack_destructuring(contexts, element, node => x`${modifier(node)}.slice(${i})` as Node);\n\t\t\t} else {\n\t\t\t\tunpack_destructuring(contexts, element, node => x`${modifier(node)}[${i}]` as Node);\n\t\t\t}\n\t\t});\n\t} else if (node.type === 'ObjectPattern') {\n\t\tconst used_properties = [];\n\n\t\tnode.properties.forEach((property, i) => {\n\t\t\tif ((property as any).kind === 'rest') { // TODO is this right?\n\t\t\t\tconst replacement: RestElement = {\n\t\t\t\t\ttype: 'RestElement',\n\t\t\t\t\targument: property.key as Identifier\n\t\t\t\t};\n\n\t\t\t\tnode.properties[i] = replacement as any;\n\n\t\t\t\tunpack_destructuring(\n\t\t\t\t\tcontexts,\n\t\t\t\t\tproperty.value,\n\t\t\t\t\tnode => x`@object_without_properties(${modifier(node)}, [${used_properties}])` as Node\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tused_properties.push(x`\"${(property.key as Identifier).name}\"`);\n\n\t\t\t\tunpack_destructuring(contexts, property.value, node => x`${modifier(node)}.${(property.key as Identifier).name}` as Node);\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport default class EachBlock extends AbstractBlock {\n\ttype: 'EachBlock';\n\n\texpression: Expression;\n\tcontext_node: Node;\n\n\titerations: string;\n\tindex: string;\n\tcontext: string;\n\tkey: Expression;\n\tscope: TemplateScope;\n\tcontexts: Context[];\n\thas_animation: boolean;\n\thas_binding = false;\n\n\telse?: ElseBlock;\n\n\tconstructor(component, parent, scope, info) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tthis.expression = new Expression(component, this, scope, info.expression);\n\t\tthis.context = info.context.name || 'each'; // TODO this is used to facilitate binding; currently fails with destructuring\n\t\tthis.context_node = info.context;\n\t\tthis.index = info.index;\n\n\t\tthis.scope = scope.child();\n\n\t\tthis.contexts = [];\n\t\tunpack_destructuring(this.contexts, info.context, node => node);\n\n\t\tthis.contexts.forEach(context => {\n\t\t\tthis.scope.add(context.key.name, this.expression.dependencies, this);\n\t\t});\n\n\t\tif (this.index) {\n\t\t\t// index can only change if this is a keyed each block\n\t\t\tconst dependencies = info.key ? this.expression.dependencies : new Set([]);\n\t\t\tthis.scope.add(this.index, dependencies, this);\n\t\t}\n\n\t\tthis.key = info.key\n\t\t\t? new Expression(component, this, this.scope, info.key)\n\t\t\t: null;\n\n\t\tthis.has_animation = false;\n\n\t\tthis.children = map_children(component, this, this.scope, info.children);\n\n\t\tif (this.has_animation) {\n\t\t\tif (this.children.length !== 1) {\n\t\t\t\tconst child = this.children.find(child => !!(child as Element).animation);\n\t\t\t\tcomponent.error((child as Element).animation, {\n\t\t\t\t\tcode: `invalid-animation`,\n\t\t\t\t\tmessage: `An element that use the animate directive must be the sole child of a keyed each block`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.warn_if_empty_block();\n\n\t\tthis.else = info.else\n\t\t\t? new ElseBlock(component, this, this.scope, info.else)\n\t\t\t: null;\n\t}\n}\n","import Node from './shared/Node';\nimport get_object from '../utils/get_object';\nimport Expression from './shared/Expression';\nimport Component from '../Component';\nimport TemplateScope from './shared/TemplateScope';\nimport {dimensions} from \"../../utils/patterns\";\nimport { Node as ESTreeNode } from 'estree';\n\n// TODO this should live in a specific binding\nconst read_only_media_attributes = new Set([\n\t'duration',\n\t'buffered',\n\t'seekable',\n\t'played',\n\t'seeking',\n\t'ended',\n\t'videoHeight',\n\t'videoWidth'\n]);\n\nexport default class Binding extends Node {\n\ttype: 'Binding';\n\tname: string;\n\texpression: Expression;\n\traw_expression: ESTreeNode; // TODO exists only for bind:this — is there a more elegant solution?\n\tis_contextual: boolean;\n\tis_readonly: boolean;\n\n\tconstructor(component: Component, parent, scope: TemplateScope, info) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tif (info.expression.type !== 'Identifier' && info.expression.type !== 'MemberExpression') {\n\t\t\tcomponent.error(info, {\n\t\t\t\tcode: 'invalid-directive-value',\n\t\t\t\tmessage: 'Can only bind to an identifier (e.g. `foo`) or a member expression (e.g. `foo.bar` or `foo[baz]`)'\n\t\t\t});\n\t\t}\n\n\t\tthis.name = info.name;\n\t\tthis.expression = new Expression(component, this, scope, info.expression);\n\t\tthis.raw_expression = JSON.parse(JSON.stringify(info.expression));\n\n\t\tconst { name } = get_object(this.expression.node);\n\t\tthis.is_contextual = scope.names.has(name);\n\n\t\t// make sure we track this as a mutable ref\n\t\tif (scope.is_let(name)) {\n\t\t\tcomponent.error(this, {\n\t\t\t\tcode: 'invalid-binding',\n\t\t\t\tmessage: 'Cannot bind to a variable declared with the let: directive'\n\t\t\t});\n\t\t} else if (this.is_contextual) {\n\t\t\tif (scope.is_await(name)) {\n\t\t\t\tcomponent.error(this, {\n\t\t\t\t\tcode: 'invalid-binding',\n\t\t\t\t\tmessage: 'Cannot bind to a variable declared with {#await ... then} or {:catch} blocks'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tscope.dependencies_for_name.get(name).forEach(name => {\n\t\t\t\tconst variable = component.var_lookup.get(name);\n\t\t\t\tif (variable) {\n\t\t\t\t\tvariable[this.expression.node.type === 'MemberExpression' ? 'mutated' : 'reassigned'] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst variable = component.var_lookup.get(name);\n\n\t\t\tif (!variable || variable.global) component.error(this.expression.node, {\n\t\t\t\tcode: 'binding-undeclared',\n\t\t\t\tmessage: `${name} is not declared`\n\t\t\t});\n\n\t\t\tvariable[this.expression.node.type === 'MemberExpression' ? 'mutated' : 'reassigned'] = true;\n\t\t}\n\n\t\tconst type = parent.get_static_attribute_value('type');\n\n\t\tthis.is_readonly = (\n\t\t\tdimensions.test(this.name) ||\n\t\t\t(parent.is_media_node && parent.is_media_node() && read_only_media_attributes.has(this.name)) ||\n\t\t\t(parent.name === 'input' && type === 'file') // TODO others?\n\t\t);\n\t}\n\n\tis_readonly_media_attribute() {\n\t\treturn read_only_media_attributes.has(this.name);\n\t}\n}\n","import Node from './shared/Node';\nimport Expression from './shared/Expression';\nimport Component from '../Component';\n\nexport default class Transition extends Node {\n\ttype: 'Transition';\n\tname: string;\n\tdirective: string;\n\texpression: Expression;\n\tis_local: boolean;\n\n\tconstructor(component: Component, parent, scope, info) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tcomponent.warn_if_undefined(info.name, info, scope);\n\n\t\tthis.name = info.name;\n\t\tcomponent.add_reference(info.name.split('.')[0]);\n\n\t\tthis.directive = info.intro && info.outro ? 'transition' : info.intro ? 'in' : 'out';\n\t\tthis.is_local = info.modifiers.includes('local');\n\n\t\tif ((info.intro && parent.intro) || (info.outro && parent.outro)) {\n\t\t\tconst parent_transition = (parent.intro || parent.outro);\n\n\t\t\tconst message = this.directive === parent_transition.directive\n\t\t\t\t? `An element can only have one '${this.directive}' directive`\n\t\t\t\t: `An element cannot have both ${describe(parent_transition)} directive and ${describe(this)} directive`;\n\n\t\t\tcomponent.error(info, {\n\t\t\t\tcode: `duplicate-transition`,\n\t\t\t\tmessage\n\t\t\t});\n\t\t}\n\n\t\tthis.expression = info.expression\n\t\t\t? new Expression(component, this, scope, info.expression, true)\n\t\t\t: null;\n\t}\n}\n\nfunction describe(transition: Transition) {\n\treturn transition.directive === 'transition'\n\t\t? `a 'transition'`\n\t\t: `an '${transition.directive}'`;\n}","import Node from './shared/Node';\nimport Component from '../Component';\nimport { walk } from 'estree-walker';\nimport { Identifier } from 'estree';\n\nconst applicable = new Set(['Identifier', 'ObjectExpression', 'ArrayExpression', 'Property']);\n\nexport default class Let extends Node {\n\ttype: 'Let';\n\tname: Identifier;\n\tvalue: Identifier;\n\tnames: string[] = [];\n\n\tconstructor(component: Component, parent, scope, info) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tthis.name = { type: 'Identifier', name: info.name };\n\n\t\tconst { names } = this;\n\n\t\tif (info.expression) {\n\t\t\tthis.value = info.expression;\n\n\t\t\twalk(info.expression, {\n\t\t\t\tenter(node) {\n\t\t\t\t\tif (!applicable.has(node.type)) {\n\t\t\t\t\t\tcomponent.error(node as any, {\n\t\t\t\t\t\t\tcode: 'invalid-let',\n\t\t\t\t\t\t\tmessage: `let directive value must be an identifier or an object/array pattern`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node.type === 'Identifier') {\n\t\t\t\t\t\tnames.push(node.name);\n\t\t\t\t\t}\n\n\t\t\t\t\t// slightly unfortunate hack\n\t\t\t\t\tif (node.type === 'ArrayExpression') {\n\t\t\t\t\t\t(node as any).type = 'ArrayPattern';\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node.type === 'ObjectExpression') {\n\t\t\t\t\t\t(node as any).type = 'ObjectPattern';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tnames.push(this.name.name);\n\t\t}\n\t}\n}","import { is_void } from '../../utils/names';\nimport Node from './shared/Node';\nimport Attribute from './Attribute';\nimport Binding from './Binding';\nimport EventHandler from './EventHandler';\nimport Transition from './Transition';\nimport Animation from './Animation';\nimport Action from './Action';\nimport Class from './Class';\nimport Text from './Text';\nimport { namespaces } from '../../utils/namespaces';\nimport map_children from './shared/map_children';\nimport { dimensions } from '../../utils/patterns';\nimport fuzzymatch from '../../utils/fuzzymatch';\nimport list from '../../utils/list';\nimport Let from './Let';\nimport TemplateScope from './shared/TemplateScope';\nimport { INode } from './interfaces';\n\nconst svg = /^(?:altGlyph|altGlyphDef|altGlyphItem|animate|animateColor|animateMotion|animateTransform|circle|clipPath|color-profile|cursor|defs|desc|discard|ellipse|feBlend|feColorMatrix|feComponentTransfer|feComposite|feConvolveMatrix|feDiffuseLighting|feDisplacementMap|feDistantLight|feDropShadow|feFlood|feFuncA|feFuncB|feFuncG|feFuncR|feGaussianBlur|feImage|feMerge|feMergeNode|feMorphology|feOffset|fePointLight|feSpecularLighting|feSpotLight|feTile|feTurbulence|filter|font|font-face|font-face-format|font-face-name|font-face-src|font-face-uri|foreignObject|g|glyph|glyphRef|hatch|hatchpath|hkern|image|line|linearGradient|marker|mask|mesh|meshgradient|meshpatch|meshrow|metadata|missing-glyph|mpath|path|pattern|polygon|polyline|radialGradient|rect|set|solidcolor|stop|svg|switch|symbol|text|textPath|tref|tspan|unknown|use|view|vkern)$/;\n\nconst aria_attributes = 'activedescendant atomic autocomplete busy checked colindex controls current describedby details disabled dropeffect errormessage expanded flowto grabbed haspopup hidden invalid keyshortcuts label labelledby level live modal multiline multiselectable orientation owns placeholder posinset pressed readonly relevant required roledescription rowindex selected setsize sort valuemax valuemin valuenow valuetext'.split(' ');\nconst aria_attribute_set = new Set(aria_attributes);\n\nconst aria_roles = 'alert alertdialog application article banner button cell checkbox columnheader combobox command complementary composite contentinfo definition dialog directory document feed figure form grid gridcell group heading img input landmark link list listbox listitem log main marquee math menu menubar menuitem menuitemcheckbox menuitemradio navigation none note option presentation progressbar radio radiogroup range region roletype row rowgroup rowheader scrollbar search searchbox section sectionhead select separator slider spinbutton status structure switch tab table tablist tabpanel term textbox timer toolbar tooltip tree treegrid treeitem widget window'.split(' ');\nconst aria_role_set = new Set(aria_roles);\n\nconst a11y_required_attributes = {\n\ta: ['href'],\n\tarea: ['alt', 'aria-label', 'aria-labelledby'],\n\n\t// html-has-lang\n\thtml: ['lang'],\n\n\t// iframe-has-title\n\tiframe: ['title'],\n\timg: ['alt'],\n\tobject: ['title', 'aria-label', 'aria-labelledby']\n};\n\nconst a11y_distracting_elements = new Set([\n\t'blink',\n\t'marquee'\n]);\n\nconst a11y_required_content = new Set([\n\t// anchor-has-content\n\t'a',\n\n\t// heading-has-content\n\t'h1',\n\t'h2',\n\t'h3',\n\t'h4',\n\t'h5',\n\t'h6'\n]);\n\nconst invisible_elements = new Set(['meta', 'html', 'script', 'style']);\n\nconst valid_modifiers = new Set([\n\t'preventDefault',\n\t'stopPropagation',\n\t'capture',\n\t'once',\n\t'passive',\n\t'self'\n]);\n\nconst passive_events = new Set([\n\t'wheel',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n\t'touchcancel'\n]);\n\nfunction get_namespace(parent: Element, element: Element, explicit_namespace: string) {\n\tconst parent_element = parent.find_nearest(/^Element/);\n\n\tif (!parent_element) {\n\t\treturn explicit_namespace || (svg.test(element.name)\n\t\t\t? namespaces.svg\n\t\t\t: null);\n\t}\n\n\tif (svg.test(element.name.toLowerCase())) return namespaces.svg;\n\tif (parent_element.name.toLowerCase() === 'foreignobject') return null;\n\n\treturn parent_element.namespace;\n}\n\nexport default class Element extends Node {\n\ttype: 'Element';\n\tname: string;\n\tscope: TemplateScope;\n\tattributes: Attribute[] = [];\n\tactions: Action[] = [];\n\tbindings: Binding[] = [];\n\tclasses: Class[] = [];\n\thandlers: EventHandler[] = [];\n\tlets: Let[] = [];\n\tintro?: Transition = null;\n\toutro?: Transition = null;\n\tanimation?: Animation = null;\n\tchildren: INode[];\n\tnamespace: string;\n\tneeds_manual_style_scoping: boolean;\n\n\tconstructor(component, parent, scope, info: any) {\n\t\tsuper(component, parent, scope, info);\n\t\tthis.name = info.name;\n\n\t\tthis.namespace = get_namespace(parent, this, component.namespace);\n\n\t\tif (this.name === 'textarea') {\n\t\t\tif (info.children.length > 0) {\n\t\t\t\tconst value_attribute = info.attributes.find(node => node.name === 'value');\n\t\t\t\tif (value_attribute) {\n\t\t\t\t\tcomponent.error(value_attribute, {\n\t\t\t\t\t\tcode: `textarea-duplicate-value`,\n\t\t\t\t\t\tmessage: `A <textarea> can have either a value attribute or (equivalently) child content, but not both`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// this is an egregious hack, but it's the easiest way to get <textarea>\n\t\t\t\t// children treated the same way as a value attribute\n\t\t\t\tinfo.attributes.push({\n\t\t\t\t\ttype: 'Attribute',\n\t\t\t\t\tname: 'value',\n\t\t\t\t\tvalue: info.children\n\t\t\t\t});\n\n\t\t\t\tinfo.children = [];\n\t\t\t}\n\t\t}\n\n\t\tif (this.name === 'option') {\n\t\t\t// Special case — treat these the same way:\n\t\t\t// <option>{foo}</option>\n\t\t\t// <option value={foo}>{foo}</option>\n\t\t\tconst value_attribute = info.attributes.find(attribute => attribute.name === 'value');\n\n\t\t\tif (!value_attribute) {\n\t\t\t\tinfo.attributes.push({\n\t\t\t\t\ttype: 'Attribute',\n\t\t\t\t\tname: 'value',\n\t\t\t\t\tvalue: info.children,\n\t\t\t\t\tsynthetic: true\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst has_let = info.attributes.some(node => node.type === 'Let');\n\t\tif (has_let) {\n\t\t\tscope = scope.child();\n\t\t}\n\n\t\t// Binding relies on Attribute, defer its evaluation\n\t\tconst order = ['Binding']; // everything else is -1\n\t\tinfo.attributes.sort((a, b) => order.indexOf(a.type) - order.indexOf(b.type));\n\n\t\tinfo.attributes.forEach(node => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'Action':\n\t\t\t\t\tthis.actions.push(new Action(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Attribute':\n\t\t\t\tcase 'Spread':\n\t\t\t\t\t// special case\n\t\t\t\t\tif (node.name === 'xmlns') this.namespace = node.value[0].data;\n\n\t\t\t\t\tthis.attributes.push(new Attribute(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Binding':\n\t\t\t\t\tthis.bindings.push(new Binding(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Class':\n\t\t\t\t\tthis.classes.push(new Class(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EventHandler':\n\t\t\t\t\tthis.handlers.push(new EventHandler(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Let': {\n\t\t\t\t\tconst l = new Let(component, this, scope, node);\n\t\t\t\t\tthis.lets.push(l);\n\t\t\t\t\tconst dependencies = new Set([l.name.name]);\n\n\t\t\t\t\tl.names.forEach(name => {\n\t\t\t\t\t\tscope.add(name, dependencies, this);\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'Transition':\n\t\t\t\t{\n\t\t\t\t\tconst transition = new Transition(component, this, scope, node);\n\t\t\t\t\tif (node.intro) this.intro = transition;\n\t\t\t\t\tif (node.outro) this.outro = transition;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'Animation':\n\t\t\t\t\tthis.animation = new Animation(component, this, scope, node);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Not implemented: ${node.type}`);\n\t\t\t}\n\t\t});\n\n\t\tthis.scope = scope;\n\t\tthis.children = map_children(component, this, this.scope, info.children);\n\n\t\tthis.validate();\n\n\t\tcomponent.stylesheet.apply(this);\n\t}\n\n\tvalidate() {\n\t\tif (a11y_distracting_elements.has(this.name)) {\n\t\t\t// no-distracting-elements\n\t\t\tthis.component.warn(this, {\n\t\t\t\tcode: `a11y-distracting-elements`,\n\t\t\t\tmessage: `A11y: Avoid <${this.name}> elements`\n\t\t\t});\n\t\t}\n\n\t\tif (this.name === 'figcaption') {\n\t\t\tlet { parent } = this;\n\t\t\tlet is_figure_parent = false;\n\n\t\t\twhile (parent) {\n\t\t\t\tif ((parent as Element).name === 'figure') {\n\t\t\t\t\tis_figure_parent = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (parent.type === 'Element') {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tparent = parent.parent;\n\t\t\t}\n\n\t\t\tif (!is_figure_parent) {\n\t\t\t\tthis.component.warn(this, {\n\t\t\t\t\tcode: `a11y-structure`,\n\t\t\t\t\tmessage: `A11y: <figcaption> must be an immediate child of <figure>`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (this.name === 'figure') {\n\t\t\tconst children = this.children.filter(node => {\n\t\t\t\tif (node.type === 'Comment') return false;\n\t\t\t\tif (node.type === 'Text') return /\\S/.test(node.data);\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\t\tconst index = children.findIndex(child => (child as Element).name === 'figcaption');\n\n\t\t\tif (index !== -1 && (index !== 0 && index !== children.length - 1)) {\n\t\t\t\tthis.component.warn(children[index], {\n\t\t\t\t\tcode: `a11y-structure`,\n\t\t\t\t\tmessage: `A11y: <figcaption> must be first or last child of <figure>`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.validate_attributes();\n\t\tthis.validate_bindings();\n\t\tthis.validate_content();\n\t\tthis.validate_event_handlers();\n\t}\n\n\tvalidate_attributes() {\n\t\tconst { component } = this;\n\n\t\tconst attribute_map = new Map();\n\n\t\tthis.attributes.forEach(attribute => {\n\t\t\tif (attribute.is_spread) return;\n\n\t\t\tconst name = attribute.name.toLowerCase();\n\n\t\t\t// aria-props\n\t\t\tif (name.startsWith('aria-')) {\n\t\t\t\tif (invisible_elements.has(this.name)) {\n\t\t\t\t\t// aria-unsupported-elements\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-aria-attributes`,\n\t\t\t\t\t\tmessage: `A11y: <${this.name}> should not have aria-* attributes`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst type = name.slice(5);\n\t\t\t\tif (!aria_attribute_set.has(type)) {\n\t\t\t\t\tconst match = fuzzymatch(type, aria_attributes);\n\t\t\t\t\tlet message = `A11y: Unknown aria attribute 'aria-${type}'`;\n\t\t\t\t\tif (match) message += ` (did you mean '${match}'?)`;\n\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-unknown-aria-attribute`,\n\t\t\t\t\t\tmessage\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (name === 'aria-hidden' && /^h[1-6]$/.test(this.name)) {\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-hidden`,\n\t\t\t\t\t\tmessage: `A11y: <${this.name}> element should not be hidden`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// aria-role\n\t\t\tif (name === 'role') {\n\t\t\t\tif (invisible_elements.has(this.name)) {\n\t\t\t\t\t// aria-unsupported-elements\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-misplaced-role`,\n\t\t\t\t\t\tmessage: `A11y: <${this.name}> should not have role attribute`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst value = attribute.get_static_value();\n\t\t\t\t// @ts-ignore\n\t\t\t\tif (value && !aria_role_set.has(value)) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst match = fuzzymatch(value, aria_roles);\n\t\t\t\t\tlet message = `A11y: Unknown role '${value}'`;\n\t\t\t\t\tif (match) message += ` (did you mean '${match}'?)`;\n\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-unknown-role`,\n\t\t\t\t\t\tmessage\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// no-access-key\n\t\t\tif (name === 'accesskey') {\n\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\tcode: `a11y-accesskey`,\n\t\t\t\t\tmessage: `A11y: Avoid using accesskey`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// no-autofocus\n\t\t\tif (name === 'autofocus') {\n\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\tcode: `a11y-autofocus`,\n\t\t\t\t\tmessage: `A11y: Avoid using autofocus`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// scope\n\t\t\tif (name === 'scope' && this.name !== 'th') {\n\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\tcode: `a11y-misplaced-scope`,\n\t\t\t\t\tmessage: `A11y: The scope attribute should only be used with <th> elements`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// tabindex-no-positive\n\t\t\tif (name === 'tabindex') {\n\t\t\t\tconst value = attribute.get_static_value();\n\t\t\t\t// @ts-ignore todo is tabindex=true correct case?\n\t\t\t\tif (!isNaN(value) && +value > 0) {\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-positive-tabindex`,\n\t\t\t\t\t\tmessage: `A11y: avoid tabindex values above zero`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (name === 'slot') {\n\t\t\t\tif (!attribute.is_static) {\n\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\tcode: `invalid-slot-attribute`,\n\t\t\t\t\t\tmessage: `slot attribute cannot have a dynamic value`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (component.slot_outlets.has(name)) {\n\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\tcode: `duplicate-slot-attribute`,\n\t\t\t\t\t\tmessage: `Duplicate '${name}' slot`\n\t\t\t\t\t});\n\n\t\t\t\t\tcomponent.slot_outlets.add(name);\n\t\t\t\t}\n\n\t\t\t\tlet ancestor = this.parent;\n\t\t\t\tdo {\n\t\t\t\t\tif (ancestor.type === 'InlineComponent') break;\n\t\t\t\t\tif (ancestor.type === 'Element' && /-/.test(ancestor.name)) break;\n\n\t\t\t\t\tif (ancestor.type === 'IfBlock' || ancestor.type === 'EachBlock') {\n\t\t\t\t\t\tconst type = ancestor.type === 'IfBlock' ? 'if' : 'each';\n\t\t\t\t\t\tconst message = `Cannot place slotted elements inside an ${type}-block`;\n\n\t\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\t\tcode: `invalid-slotted-content`,\n\t\t\t\t\t\t\tmessage\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} while (ancestor = ancestor.parent);\n\n\t\t\t\tif (!ancestor) {\n\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\tcode: `invalid-slotted-content`,\n\t\t\t\t\t\tmessage: `Element with a slot='...' attribute must be a descendant of a component or custom element`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (name === 'is') {\n\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\tcode: 'avoid-is',\n\t\t\t\t\tmessage: `The 'is' attribute is not supported cross-browser and should be avoided`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tattribute_map.set(attribute.name, attribute);\n\t\t});\n\n\t\t// handle special cases\n\t\tif (this.name === 'a') {\n\t\t\tconst attribute = attribute_map.get('href') || attribute_map.get('xlink:href');\n\n\t\t\tif (attribute) {\n\t\t\t\tconst value = attribute.get_static_value();\n\n\t\t\t\tif (value === '' || value === '#') {\n\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\tcode: `a11y-invalid-attribute`,\n\t\t\t\t\t\tmessage: `A11y: '${value}' is not a valid ${attribute.name} attribute`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcomponent.warn(this, {\n\t\t\t\t\tcode: `a11y-missing-attribute`,\n\t\t\t\t\tmessage: `A11y: <a> element should have an href attribute`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\tconst required_attributes = a11y_required_attributes[this.name];\n\t\t\tif (required_attributes) {\n\t\t\t\tconst has_attribute = required_attributes.some(name => attribute_map.has(name));\n\n\t\t\t\tif (!has_attribute) {\n\t\t\t\t\tshould_have_attribute(this, required_attributes);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.name === 'input') {\n\t\t\t\tconst type = attribute_map.get('type');\n\t\t\t\tif (type && type.get_static_value() === 'image') {\n\t\t\t\t\tconst required_attributes = ['alt', 'aria-label', 'aria-labelledby'];\n\t\t\t\t\tconst has_attribute = required_attributes.some(name => attribute_map.has(name));\n\n\t\t\t\t\tif (!has_attribute) {\n\t\t\t\t\t\tshould_have_attribute(this, required_attributes, 'input type=\"image\"');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvalidate_bindings() {\n\t\tconst { component } = this;\n\n\t\tconst check_type_attribute = () => {\n\t\t\tconst attribute = this.attributes.find(\n\t\t\t\t(attribute: Attribute) => attribute.name === 'type'\n\t\t\t);\n\n\t\t\tif (!attribute) return null;\n\n\t\t\tif (!attribute.is_static) {\n\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\tcode: `invalid-type`,\n\t\t\t\t\tmessage: `'type' attribute cannot be dynamic if input uses two-way binding`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst value = attribute.get_static_value();\n\n\t\t\tif (value === true) {\n\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\tcode: `missing-type`,\n\t\t\t\t\tmessage: `'type' attribute must be specified`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn value;\n\t\t};\n\n\t\tthis.bindings.forEach(binding => {\n\t\t\tconst { name } = binding;\n\n\t\t\tif (name === 'value') {\n\t\t\t\tif (\n\t\t\t\t\tthis.name !== 'input' &&\n\t\t\t\t\tthis.name !== 'textarea' &&\n\t\t\t\t\tthis.name !== 'select'\n\t\t\t\t) {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'value' is not a valid binding on <${this.name}> elements`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this.name === 'select') {\n\t\t\t\t\tconst attribute = this.attributes.find(\n\t\t\t\t\t\t(attribute: Attribute) => attribute.name === 'multiple'\n\t\t\t\t\t);\n\n\t\t\t\t\tif (attribute && !attribute.is_static) {\n\t\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\t\tcode: `dynamic-multiple-attribute`,\n\t\t\t\t\t\t\tmessage: `'multiple' attribute cannot be dynamic if select uses two-way binding`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcheck_type_attribute();\n\t\t\t\t}\n\t\t\t} else if (name === 'checked' || name === 'indeterminate') {\n\t\t\t\tif (this.name !== 'input') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'${name}' is not a valid binding on <${this.name}> elements`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst type = check_type_attribute();\n\n\t\t\t\tif (type !== 'checkbox') {\n\t\t\t\t\tlet message = `'${name}' binding can only be used with <input type=\"checkbox\">`;\n\t\t\t\t\tif (type === 'radio') message += ` — for <input type=\"radio\">, use 'group' binding`;\n\t\t\t\t\tcomponent.error(binding, { code: `invalid-binding`, message });\n\t\t\t\t}\n\t\t\t} else if (name === 'group') {\n\t\t\t\tif (this.name !== 'input') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'group' is not a valid binding on <${this.name}> elements`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst type = check_type_attribute();\n\n\t\t\t\tif (type !== 'checkbox' && type !== 'radio') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'group' binding can only be used with <input type=\"checkbox\"> or <input type=\"radio\">`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (name === 'files') {\n\t\t\t\tif (this.name !== 'input') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'files' is not a valid binding on <${this.name}> elements`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst type = check_type_attribute();\n\n\t\t\t\tif (type !== 'file') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'files' binding can only be used with <input type=\"file\">`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t} else if (name === 'open') {\n\t\t\t\tif (this.name !== 'details') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'${name}' binding can only be used with <details>`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tname === 'currentTime' ||\n\t\t\t\tname === 'duration' ||\n\t\t\t\tname === 'paused' ||\n\t\t\t\tname === 'buffered' ||\n\t\t\t\tname === 'seekable' ||\n\t\t\t\tname === 'played' ||\n\t\t\t\tname === 'volume' ||\n\t\t\t\tname === 'playbackRate' ||\n\t\t\t\tname === 'seeking' ||\n\t\t\t\tname === 'ended'\n\t\t\t) {\n\t\t\t\tif (this.name !== 'audio' && this.name !== 'video') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'${name}' binding can only be used with <audio> or <video>`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tname === 'videoHeight' ||\n\t\t\t\tname === 'videoWidth'\n\t\t\t) {\n\t\t\t\tif (this.name !== 'video') {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `'${name}' binding can only be used with <video>`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (dimensions.test(name)) {\n\t\t\t\tif (this.name === 'svg' && (name === 'offsetWidth' || name === 'offsetHeight')) {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: 'invalid-binding',\n\t\t\t\t\t\tmessage: `'${binding.name}' is not a valid binding on <svg>. Use '${name.replace('offset', 'client')}' instead`\n\t\t\t\t\t});\n\t\t\t\t} else if (svg.test(this.name)) {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: 'invalid-binding',\n\t\t\t\t\t\tmessage: `'${binding.name}' is not a valid binding on SVG elements`\n\t\t\t\t\t});\n\t\t\t\t} else if (is_void(this.name)) {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: 'invalid-binding',\n\t\t\t\t\t\tmessage: `'${binding.name}' is not a valid binding on void elements like <${this.name}>. Use a wrapper element instead`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tname === 'textContent' ||\n\t\t\t\tname === 'innerHTML'\n\t\t\t) {\n\t\t\t\tconst contenteditable = this.attributes.find(\n\t\t\t\t\t(attribute: Attribute) => attribute.name === 'contenteditable'\n\t\t\t\t);\n\n\t\t\t\tif (!contenteditable) {\n\t\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\t\tcode: `missing-contenteditable-attribute`,\n\t\t\t\t\t\tmessage: `'contenteditable' attribute is required for textContent and innerHTML two-way bindings`\n\t\t\t\t\t});\n\t\t\t\t} else if (contenteditable && !contenteditable.is_static) {\n\t\t\t\t\tcomponent.error(contenteditable, {\n\t\t\t\t\t\tcode: `dynamic-contenteditable-attribute`,\n\t\t\t\t\t\tmessage: `'contenteditable' attribute cannot be dynamic if element uses two-way binding`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (name !== 'this') {\n\t\t\t\tcomponent.error(binding, {\n\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\tmessage: `'${binding.name}' is not a valid binding`\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tvalidate_content() {\n\t\tif (!a11y_required_content.has(this.name)) return;\n\n\t\tif (this.children.length === 0) {\n\t\t\tthis.component.warn(this, {\n\t\t\t\tcode: `a11y-missing-content`,\n\t\t\t\tmessage: `A11y: <${this.name}> element should have child content`\n\t\t\t});\n\t\t}\n\t}\n\n\tvalidate_event_handlers() {\n\t\tconst { component } = this;\n\n\t\tthis.handlers.forEach(handler => {\n\t\t\tif (handler.modifiers.has('passive') && handler.modifiers.has('preventDefault')) {\n\t\t\t\tcomponent.error(handler, {\n\t\t\t\t\tcode: 'invalid-event-modifier',\n\t\t\t\t\tmessage: `The 'passive' and 'preventDefault' modifiers cannot be used together`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thandler.modifiers.forEach(modifier => {\n\t\t\t\tif (!valid_modifiers.has(modifier)) {\n\t\t\t\t\tcomponent.error(handler, {\n\t\t\t\t\t\tcode: 'invalid-event-modifier',\n\t\t\t\t\t\tmessage: `Valid event modifiers are ${list(Array.from(valid_modifiers))}`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (modifier === 'passive') {\n\t\t\t\t\tif (passive_events.has(handler.name)) {\n\t\t\t\t\t\tif (handler.can_make_passive) {\n\t\t\t\t\t\t\tcomponent.warn(handler, {\n\t\t\t\t\t\t\t\tcode: 'redundant-event-modifier',\n\t\t\t\t\t\t\t\tmessage: `Touch event handlers that don't use the 'event' object are passive by default`\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomponent.warn(handler, {\n\t\t\t\t\t\t\tcode: 'redundant-event-modifier',\n\t\t\t\t\t\t\tmessage: `The passive modifier only works with wheel and touch events`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (component.compile_options.legacy && (modifier === 'once' || modifier === 'passive')) {\n\t\t\t\t\t// TODO this could be supported, but it would need a few changes to\n\t\t\t\t\t// how event listeners work\n\t\t\t\t\tcomponent.error(handler, {\n\t\t\t\t\t\tcode: 'invalid-event-modifier',\n\t\t\t\t\t\tmessage: `The '${modifier}' modifier cannot be used in legacy mode`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (passive_events.has(handler.name) && handler.can_make_passive && !handler.modifiers.has('preventDefault')) {\n\t\t\t\t// touch/wheel events should be passive by default\n\t\t\t\thandler.modifiers.add('passive');\n\t\t\t}\n\t\t});\n\t}\n\n\tis_media_node() {\n\t\treturn this.name === 'audio' || this.name === 'video';\n\t}\n\n\tadd_css_class() {\n\t\tif (this.attributes.some(attr => attr.is_spread)) {\n\t\t\tthis.needs_manual_style_scoping = true;\n\t\t\treturn;\n\t\t}\n\n\t\tconst { id } = this.component.stylesheet;\n\n\t\tconst class_attribute = this.attributes.find(a => a.name === 'class');\n\n\t\tif (class_attribute && !class_attribute.is_true) {\n\t\t\tif (class_attribute.chunks.length === 1 && class_attribute.chunks[0].type === 'Text') {\n\t\t\t\t(class_attribute.chunks[0] as Text).data += ` ${id}`;\n\t\t\t} else {\n\t\t\t\t(class_attribute.chunks as Node[]).push(\n\t\t\t\t\tnew Text(this.component, this, this.scope, {\n\t\t\t\t\t\ttype: 'Text',\n\t\t\t\t\t\tdata: ` ${id}`,\n\t\t\t\t\t\tsynthetic: true\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.attributes.push(\n\t\t\t\tnew Attribute(this.component, this, this.scope, {\n\t\t\t\t\ttype: 'Attribute',\n\t\t\t\t\tname: 'class',\n\t\t\t\t\tvalue: [{ type: 'Text', data: id, synthetic: true }]\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction should_have_attribute(\n\tnode,\n\tattributes: string[],\n\tname = node.name\n) {\n\tconst article = /^[aeiou]/.test(attributes[0]) ? 'an' : 'a';\n\tconst sequence = attributes.length > 1 ?\n\t\tattributes.slice(0, -1).join(', ') + ` or ${attributes[attributes.length - 1]}` :\n\t\tattributes[0];\n\n\tnode.component.warn(node, {\n\t\tcode: `a11y-missing-attribute`,\n\t\tmessage: `A11y: <${name}> element should have ${article} ${sequence} attribute`\n\t});\n}\n","import Node from './shared/Node';\nimport Attribute from './Attribute';\nimport map_children from './shared/map_children';\nimport Binding from './Binding';\nimport EventHandler from './EventHandler';\nimport Expression from './shared/Expression';\nimport Component from '../Component';\nimport Let from './Let';\nimport TemplateScope from './shared/TemplateScope';\nimport { INode } from './interfaces';\n\nexport default class InlineComponent extends Node {\n\ttype: 'InlineComponent';\n\tname: string;\n\texpression: Expression;\n\tattributes: Attribute[] = [];\n\tbindings: Binding[] = [];\n\thandlers: EventHandler[] = [];\n\tlets: Let[] = [];\n\tchildren: INode[];\n\tscope: TemplateScope;\n\n\tconstructor(component: Component, parent, scope, info) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tif (info.name !== 'svelte:component' && info.name !== 'svelte:self') {\n\t\t\tconst name = info.name.split('.')[0]; // accommodate namespaces\n\t\t\tcomponent.warn_if_undefined(name, info, scope);\n\t\t\tcomponent.add_reference(name);\n\t\t}\n\n\t\tthis.name = info.name;\n\n\t\tthis.expression = this.name === 'svelte:component'\n\t\t\t? new Expression(component, this, scope, info.expression)\n\t\t\t: null;\n\n\t\tinfo.attributes.forEach(node => {\n\t\t\t/* eslint-disable no-fallthrough */\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'Action':\n\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\tcode: `invalid-action`,\n\t\t\t\t\t\tmessage: `Actions can only be applied to DOM elements, not components`\n\t\t\t\t\t});\n\n\t\t\t\tcase 'Attribute':\n\t\t\t\t\tif (node.name === 'slot') {\n\t\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\t\tcode: `invalid-prop`,\n\t\t\t\t\t\t\tmessage: `'slot' is reserved for future use in named slots`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t// fallthrough\n\t\t\t\tcase 'Spread':\n\t\t\t\t\tthis.attributes.push(new Attribute(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Binding':\n\t\t\t\t\tthis.bindings.push(new Binding(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Class':\n\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\tcode: `invalid-class`,\n\t\t\t\t\t\tmessage: `Classes can only be applied to DOM elements, not components`\n\t\t\t\t\t});\n\n\t\t\t\tcase 'EventHandler':\n\t\t\t\t\tthis.handlers.push(new EventHandler(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Let':\n\t\t\t\t\tthis.lets.push(new Let(component, this, scope, node));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Transition':\n\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\tcode: `invalid-transition`,\n\t\t\t\t\t\tmessage: `Transitions can only be applied to DOM elements, not components`\n\t\t\t\t\t});\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Not implemented: ${node.type}`);\n\t\t\t}\n\t\t\t/* eslint-enable no-fallthrough */\n\t\t});\n\n\t\tif (this.lets.length > 0) {\n\t\t\tthis.scope = scope.child();\n\n\t\t\tthis.lets.forEach(l => {\n\t\t\t\tconst dependencies = new Set([l.name.name]);\n\n\t\t\t\tl.names.forEach(name => {\n\t\t\t\t\tthis.scope.add(name, dependencies, this);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tthis.scope = scope;\n\t\t}\n\n\t\tthis.handlers.forEach(handler => {\n\t\t\thandler.modifiers.forEach(modifier => {\n\t\t\t\tif (modifier !== 'once') {\n\t\t\t\t\tcomponent.error(handler, {\n\t\t\t\t\t\tcode: 'invalid-event-modifier',\n\t\t\t\t\t\tmessage: `Event modifiers other than 'once' can only be used on DOM elements`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tthis.children = map_children(component, this, this.scope, info.children);\n\t}\n}\n","import Element from './Element';\nimport Attribute from './Attribute';\nimport Component from '../Component';\nimport TemplateScope from './shared/TemplateScope';\nimport { INode } from './interfaces';\n\nexport default class Slot extends Element {\n\ttype: 'Element';\n\tname: string;\n\tchildren: INode[];\n\tslot_name: string;\n\tvalues: Map<string, Attribute> = new Map();\n\n\tconstructor(component: Component, parent: INode, scope: TemplateScope, info: any) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tinfo.attributes.forEach(attr => {\n\t\t\tif (attr.type !== 'Attribute') {\n\t\t\t\tcomponent.error(attr, {\n\t\t\t\t\tcode: `invalid-slot-directive`,\n\t\t\t\t\tmessage: `<slot> cannot have directives`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (attr.name === 'name') {\n\t\t\t\tif (attr.value.length !== 1 || attr.value[0].type !== 'Text') {\n\t\t\t\t\tcomponent.error(attr, {\n\t\t\t\t\t\tcode: `dynamic-slot-name`,\n\t\t\t\t\t\tmessage: `<slot> name cannot be dynamic`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.slot_name = attr.value[0].data;\n\t\t\t\tif (this.slot_name === 'default') {\n\t\t\t\t\tcomponent.error(attr, {\n\t\t\t\t\t\tcode: `invalid-slot-name`,\n\t\t\t\t\t\tmessage: `default is a reserved word — it cannot be used as a slot name`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.values.set(attr.name, new Attribute(component, this, scope, attr));\n\t\t});\n\n\t\tif (!this.slot_name) this.slot_name = 'default';\n\n\t\tif (this.slot_name === 'default') {\n\t\t\t// if this is the default slot, add our dependencies to any\n\t\t\t// other slots (which inherit our slot values) that were\n\t\t\t// previously encountered\n\t\t\tcomponent.slots.forEach((slot) => {\n\t\t\t\tthis.values.forEach((attribute, name) => {\n\t\t\t\t\tif (!slot.values.has(name)) {\n\t\t\t\t\t\tslot.values.set(name, attribute);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t} else if (component.slots.has('default')) {\n\t\t\t// otherwise, go the other way — inherit values from\n\t\t\t// a previously encountered default slot\n\t\t\tconst default_slot = component.slots.get('default');\n\t\t\tdefault_slot.values.forEach((attribute, name) => {\n\t\t\t\tif (!this.values.has(name)) {\n\t\t\t\t\tthis.values.set(name, attribute);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcomponent.slots.set(this.slot_name, this);\n\t}\n}\n","import Node from './shared/Node';\nimport Binding from './Binding';\nimport EventHandler from './EventHandler';\nimport flatten_reference from '../utils/flatten_reference';\nimport fuzzymatch from '../../utils/fuzzymatch';\nimport list from '../../utils/list';\nimport Action from './Action';\n\nconst valid_bindings = [\n\t'innerWidth',\n\t'innerHeight',\n\t'outerWidth',\n\t'outerHeight',\n\t'scrollX',\n\t'scrollY',\n\t'online'\n];\n\nexport default class Window extends Node {\n\ttype: 'Window';\n\thandlers: EventHandler[] = [];\n\tbindings: Binding[] = [];\n\tactions: Action[] = [];\n\n\tconstructor(component, parent, scope, info) {\n\t\tsuper(component, parent, scope, info);\n\n\t\tinfo.attributes.forEach(node => {\n\t\t\tif (node.type === 'EventHandler') {\n\t\t\t\tthis.handlers.push(new EventHandler(component, this, scope, node));\n\t\t\t}\n\n\t\t\telse if (node.type === 'Binding') {\n\t\t\t\tif (node.expression.type !== 'Identifier') {\n\t\t\t\t\tconst { parts } = flatten_reference(node.expression);\n\n\t\t\t\t\t// TODO is this constraint necessary?\n\t\t\t\t\tcomponent.error(node.expression, {\n\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\tmessage: `Bindings on <svelte:window> must be to top-level properties, e.g. '${parts[parts.length - 1]}' rather than '${parts.join('.')}'`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (!~valid_bindings.indexOf(node.name)) {\n\t\t\t\t\tconst match = (\n\t\t\t\t\t\tnode.name === 'width' ? 'innerWidth' :\n\t\t\t\t\t\t\tnode.name === 'height' ? 'innerHeight' :\n\t\t\t\t\t\t\t\tfuzzymatch(node.name, valid_bindings)\n\t\t\t\t\t);\n\n\t\t\t\t\tconst message = `'${node.name}' is not a valid binding on <svelte:window>`;\n\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\t\tmessage: `${message} (did you mean '${match}'?)`\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomponent.error(node, {\n\t\t\t\t\t\t\tcode: `invalid-binding`,\n\t\t\t\t\t\t\tmessage: `${message} — valid bindings are ${list(valid_bindings)}`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.bindings.push(new Binding(component, this, scope, node));\n\t\t\t}\n\n\t\t\telse if (node.type === 'Action') {\n\t\t\t\tthis.actions.push(new Action(component, this, scope, node));\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\t// TODO there shouldn't be anything else here...\n\t\t\t}\n\t\t});\n\t}\n}\n","import AwaitBlock from '../AwaitBlock';\nimport Body from '../Body';\nimport Comment from '../Comment';\nimport EachBlock from '../EachBlock';\nimport Element from '../Element';\nimport Head from '../Head';\nimport IfBlock from '../IfBlock';\nimport InlineComponent from '../InlineComponent';\nimport MustacheTag from '../MustacheTag';\nimport Options from '../Options';\nimport RawMustacheTag from '../RawMustacheTag';\nimport DebugTag from '../DebugTag';\nimport Slot from '../Slot';\nimport Text from '../Text';\nimport Title from '../Title';\nimport Window from '../Window';\nimport { TemplateNode } from '../../../interfaces';\n\nexport type Children = ReturnType<typeof map_children>;\n\nfunction get_constructor(type) {\n\tswitch (type) {\n\t\tcase 'AwaitBlock': return AwaitBlock;\n\t\tcase 'Body': return Body;\n\t\tcase 'Comment': return Comment;\n\t\tcase 'EachBlock': return EachBlock;\n\t\tcase 'Element': return Element;\n\t\tcase 'Head': return Head;\n\t\tcase 'IfBlock': return IfBlock;\n\t\tcase 'InlineComponent': return InlineComponent;\n\t\tcase 'MustacheTag': return MustacheTag;\n\t\tcase 'Options': return Options;\n\t\tcase 'RawMustacheTag': return RawMustacheTag;\n\t\tcase 'DebugTag': return DebugTag;\n\t\tcase 'Slot': return Slot;\n\t\tcase 'Text': return Text;\n\t\tcase 'Title': return Title;\n\t\tcase 'Window': return Window;\n\t\tdefault: throw new Error(`Not implemented: ${type}`);\n\t}\n}\n\nexport default function map_children(component, parent, scope, children: TemplateNode[]) {\n\tlet last = null;\n\tlet ignores = [];\n\n\treturn children.map(child => {\n\t\tconst constructor = get_constructor(child.type);\n\n\t\tconst use_ignores = child.type !== 'Text' && child.type !== 'Comment' && ignores.length;\n\n\t\tif (use_ignores) component.push_ignores(ignores);\n\t\tconst node = new constructor(component, parent, scope, child);\n\t\tif (use_ignores) component.pop_ignores(), ignores = [];\n\n\t\tif (node.type === 'Comment' && node.ignores.length) {\n\t\t\tignores.push(...node.ignores);\n\t\t}\n\n\t\tif (last) last.next = node;\n\t\tnode.prev = last;\n\t\tlast = node;\n\n\t\treturn node;\n\t});\n}\n","// This file is automatically generated\nexport default new Set([\"HtmlTag\",\"SvelteComponent\",\"SvelteComponentDev\",\"SvelteElement\",\"action_destroyer\",\"add_attribute\",\"add_classes\",\"add_flush_callback\",\"add_location\",\"add_render_callback\",\"add_resize_listener\",\"add_transform\",\"afterUpdate\",\"append\",\"append_dev\",\"assign\",\"attr\",\"attr_dev\",\"beforeUpdate\",\"bind\",\"binding_callbacks\",\"blank_object\",\"bubble\",\"check_outros\",\"children\",\"claim_component\",\"claim_element\",\"claim_space\",\"claim_text\",\"clear_loops\",\"component_subscribe\",\"createEventDispatcher\",\"create_animation\",\"create_bidirectional_transition\",\"create_component\",\"create_in_transition\",\"create_out_transition\",\"create_slot\",\"create_ssr_component\",\"current_component\",\"custom_event\",\"dataset_dev\",\"debug\",\"destroy_block\",\"destroy_component\",\"destroy_each\",\"detach\",\"detach_after_dev\",\"detach_before_dev\",\"detach_between_dev\",\"detach_dev\",\"dirty_components\",\"dispatch_dev\",\"each\",\"element\",\"element_is\",\"empty\",\"escape\",\"escaped\",\"exclude_internal_props\",\"fix_and_destroy_block\",\"fix_and_outro_and_destroy_block\",\"fix_position\",\"flush\",\"getContext\",\"get_binding_group_value\",\"get_current_component\",\"get_slot_changes\",\"get_slot_context\",\"get_spread_object\",\"get_spread_update\",\"get_store_value\",\"globals\",\"group_outros\",\"handle_promise\",\"has_prop\",\"identity\",\"init\",\"insert\",\"insert_dev\",\"intros\",\"invalid_attribute_name_character\",\"is_client\",\"is_function\",\"is_promise\",\"listen\",\"listen_dev\",\"loop\",\"loop_guard\",\"missing_component\",\"mount_component\",\"noop\",\"not_equal\",\"now\",\"null_to_empty\",\"object_without_properties\",\"onDestroy\",\"onMount\",\"once\",\"outro_and_destroy_block\",\"prevent_default\",\"prop_dev\",\"query_selector_all\",\"raf\",\"run\",\"run_all\",\"safe_not_equal\",\"schedule_update\",\"select_multiple_value\",\"select_option\",\"select_options\",\"select_value\",\"self\",\"setContext\",\"set_attributes\",\"set_current_component\",\"set_custom_element_data\",\"set_data\",\"set_data_dev\",\"set_input_type\",\"set_input_value\",\"set_now\",\"set_raf\",\"set_store_value\",\"set_style\",\"set_svg_attributes\",\"space\",\"spread\",\"stop_propagation\",\"subscribe\",\"svg_element\",\"text\",\"tick\",\"time_ranges_to_array\",\"to_number\",\"toggle_class\",\"transition_in\",\"transition_out\",\"update_hydrating\",\"update_keyed_each\",\"validate_component\",\"validate_each_keys\",\"validate_store\",\"xlink_attr\"]);","import { walk } from 'estree-walker';\nimport { getLocator } from 'locate-character';\nimport Stats from '../Stats';\nimport { globals, reserved, is_valid } from '../utils/names';\nimport { namespaces, valid_namespaces } from '../utils/namespaces';\nimport create_module from './create_module';\nimport {\n\tcreate_scopes,\n\textract_names,\n\tScope,\n\textract_identifiers,\n} from './utils/scope';\nimport Stylesheet from './css/Stylesheet';\nimport { test } from '../config';\nimport Fragment from './nodes/Fragment';\nimport internal_exports from './internal_exports';\nimport { Ast, CompileOptions, Var, Warning, CssResult } from '../interfaces';\nimport error from '../utils/error';\nimport get_code_frame from '../utils/get_code_frame';\nimport flatten_reference from './utils/flatten_reference';\nimport is_used_as_reference from './utils/is_used_as_reference';\nimport is_reference from 'is-reference';\nimport TemplateScope from './nodes/shared/TemplateScope';\nimport fuzzymatch from '../utils/fuzzymatch';\nimport get_object from './utils/get_object';\nimport Slot from './nodes/Slot';\nimport { Node, ImportDeclaration, Identifier, Program, ExpressionStatement, AssignmentExpression, Literal } from 'estree';\nimport add_to_set from './utils/add_to_set';\nimport check_graph_for_cycles from './utils/check_graph_for_cycles';\nimport { print, x, b } from 'code-red';\n\ninterface ComponentOptions {\n\tnamespace?: string;\n\ttag?: string;\n\timmutable?: boolean;\n\taccessors?: boolean;\n\tpreserveWhitespace?: boolean;\n}\n\nexport default class Component {\n\tstats: Stats;\n\twarnings: Warning[];\n\tignores: Set<string>;\n\tignore_stack: Array<Set<string>> = [];\n\n\tast: Ast;\n\toriginal_ast: Ast;\n\tsource: string;\n\tname: Identifier;\n\tcompile_options: CompileOptions;\n\tfragment: Fragment;\n\tmodule_scope: Scope;\n\tinstance_scope: Scope;\n\tinstance_scope_map: WeakMap<Node, Scope>;\n\n\tcomponent_options: ComponentOptions;\n\tnamespace: string;\n\ttag: string;\n\taccessors: boolean;\n\n\tvars: Var[] = [];\n\tvar_lookup: Map<string, Var> = new Map();\n\n\timports: ImportDeclaration[] = [];\n\n\thoistable_nodes: Set<Node> = new Set();\n\tnode_for_declaration: Map<string, Node> = new Map();\n\tpartly_hoisted: Array<(Node | Node[])> = [];\n\tfully_hoisted: Array<(Node | Node[])> = [];\n\treactive_declarations: Array<{\n\t\tassignees: Set<string>;\n\t\tdependencies: Set<string>;\n\t\tnode: Node;\n\t\tdeclaration: Node;\n\t}> = [];\n\treactive_declaration_nodes: Set<Node> = new Set();\n\thas_reactive_assignments = false;\n\tinjected_reactive_declaration_vars: Set<string> = new Set();\n\thelpers: Map<string, Identifier> = new Map();\n\tglobals: Map<string, Identifier> = new Map();\n\n\tindirect_dependencies: Map<string, Set<string>> = new Map();\n\n\tfile: string;\n\tlocate: (c: number) => { line: number; column: number };\n\n\tstylesheet: Stylesheet;\n\n\taliases: Map<string, Identifier> = new Map();\n\tused_names: Set<string> = new Set();\n\tglobally_used_names: Set<string> = new Set();\n\n\tslots: Map<string, Slot> = new Map();\n\tslot_outlets: Set<string> = new Set();\n\n\tconstructor(\n\t\tast: Ast,\n\t\tsource: string,\n\t\tname: string,\n\t\tcompile_options: CompileOptions,\n\t\tstats: Stats,\n\t\twarnings: Warning[]\n\t) {\n\t\tthis.name = { type: 'Identifier', name };\n\n\t\tthis.stats = stats;\n\t\tthis.warnings = warnings;\n\t\tthis.ast = ast;\n\t\tthis.source = source;\n\t\tthis.compile_options = compile_options;\n\n\t\t// the instance JS gets mutated, so we park\n\t\t// a copy here for later. TODO this feels gross\n\t\tthis.original_ast = {\n\t\t\thtml: ast.html,\n\t\t\tcss: ast.css,\n\t\t\tinstance: ast.instance && JSON.parse(JSON.stringify(ast.instance)),\n\t\t\tmodule: ast.module\n\t\t};\n\n\t\tthis.file =\n\t\t\tcompile_options.filename &&\n\t\t\t(typeof process !== 'undefined'\n\t\t\t\t? compile_options.filename\n\t\t\t\t\t.replace(process.cwd(), '')\n\t\t\t\t\t.replace(/^[/\\\\]/, '')\n\t\t\t\t: compile_options.filename);\n\t\tthis.locate = getLocator(this.source, { offsetLine: 1 });\n\n\t\t// styles\n\t\tthis.stylesheet = new Stylesheet(\n\t\t\tsource,\n\t\t\tast,\n\t\t\tcompile_options.filename,\n\t\t\tcompile_options.dev\n\t\t);\n\t\tthis.stylesheet.validate(this);\n\n\t\tthis.component_options = process_component_options(\n\t\t\tthis,\n\t\t\tthis.ast.html.children\n\t\t);\n\t\tthis.namespace =\n\t\t\tnamespaces[this.component_options.namespace] ||\n\t\t\tthis.component_options.namespace;\n\n\t\tif (compile_options.customElement) {\n\t\t\tif (\n\t\t\t\tthis.component_options.tag === undefined &&\n\t\t\t\tcompile_options.tag === undefined\n\t\t\t) {\n\t\t\t\tconst svelteOptions = ast.html.children.find(\n\t\t\t\t\tchild => child.name === 'svelte:options'\n\t\t\t\t) || { start: 0, end: 0 };\n\t\t\t\tthis.warn(svelteOptions, {\n\t\t\t\t\tcode: 'custom-element-no-tag',\n\t\t\t\t\tmessage: `No custom element 'tag' option was specified. To automatically register a custom element, specify a name with a hyphen in it, e.g. <svelte:options tag=\"my-thing\"/>. To hide this warning, use <svelte:options tag={null}/>`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.tag = this.component_options.tag || compile_options.tag;\n\t\t} else {\n\t\t\tthis.tag = this.name.name;\n\t\t}\n\n\t\tthis.walk_module_js();\n\t\tthis.walk_instance_js_pre_template();\n\n\t\tthis.fragment = new Fragment(this, ast.html);\n\t\tthis.name = this.get_unique_name(name);\n\n\t\tthis.walk_instance_js_post_template();\n\n\t\tif (!compile_options.customElement) this.stylesheet.reify();\n\n\t\tthis.stylesheet.warn_on_unused_selectors(this);\n\t}\n\n\tadd_var(variable: Var) {\n\t\tthis.vars.push(variable);\n\t\tthis.var_lookup.set(variable.name, variable);\n\t}\n\n\tadd_reference(name: string) {\n\t\tconst variable = this.var_lookup.get(name);\n\n\t\tif (variable) {\n\t\t\tvariable.referenced = true;\n\t\t} else if (name === '$$props') {\n\t\t\tthis.add_var({\n\t\t\t\tname,\n\t\t\t\tinjected: true,\n\t\t\t\treferenced: true,\n\t\t\t});\n\t\t} else if (name[0] === '$') {\n\t\t\tthis.add_var({\n\t\t\t\tname,\n\t\t\t\tinjected: true,\n\t\t\t\treferenced: true,\n\t\t\t\tmutated: true,\n\t\t\t\twritable: true,\n\t\t\t});\n\n\t\t\tconst subscribable_name = name.slice(1);\n\n\t\t\tconst variable = this.var_lookup.get(subscribable_name);\n\t\t\tif (variable) {\n\t\t\t\tvariable.referenced = true;\n\t\t\t\tvariable.subscribable = true;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.used_names.add(name);\n\t\t}\n\t}\n\n\talias(name: string) {\n\t\tif (!this.aliases.has(name)) {\n\t\t\tthis.aliases.set(name, this.get_unique_name(name));\n\t\t}\n\n\t\treturn this.aliases.get(name);\n\t}\n\n\tglobal(name: string) {\n\t\tconst alias = this.alias(name);\n\t\tthis.globals.set(name, alias);\n\t\treturn alias;\n\t}\n\n\tgenerate(result?: { js: Node[]; css: CssResult }) {\n\t\tlet js = null;\n\t\tlet css = null;\n\n\t\tif (result) {\n\t\t\tconst { compile_options, name } = this;\n\t\t\tconst { format = 'esm' } = compile_options;\n\n\t\t\tconst banner = `${this.file ? `${this.file} ` : ``}generated by Svelte v${'__VERSION__'}`;\n\n\t\t\tconst program: any = { type: 'Program', body: result.js };\n\n\t\t\twalk(program, {\n\t\t\t\tenter: (node, parent, key) => {\n\t\t\t\t\tif (node.type === 'Identifier') {\n\t\t\t\t\t\tif (node.name[0] === '@') {\n\t\t\t\t\t\t\tif (node.name[1] === '_') {\n\t\t\t\t\t\t\t\tconst alias = this.global(node.name.slice(2));\n\t\t\t\t\t\t\t\tnode.name = alias.name;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlet name = node.name.slice(1);\n\n\t\t\t\t\t\t\t\tif (compile_options.dev) {\n\t\t\t\t\t\t\t\t\tif (internal_exports.has(`${name}_dev`)) {\n\t\t\t\t\t\t\t\t\t\tname += '_dev';\n\t\t\t\t\t\t\t\t\t} else if (internal_exports.has(`${name}Dev`)) {\n\t\t\t\t\t\t\t\t\t\tname += 'Dev';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst alias = this.alias(name);\n\t\t\t\t\t\t\t\tthis.helpers.set(name, alias);\n\t\t\t\t\t\t\t\tnode.name = alias.name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telse if (node.name[0] !== '#' && !is_valid(node.name)) {\n\t\t\t\t\t\t\t// this hack allows x`foo.${bar}` where bar could be invalid\n\t\t\t\t\t\t\tconst literal: Literal = { type: 'Literal', value: node.name };\n\n\t\t\t\t\t\t\tif (parent.type === 'Property' && key === 'key') {\n\t\t\t\t\t\t\t\tparent.key = literal;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\telse if (parent.type === 'MemberExpression' && key === 'property') {\n\t\t\t\t\t\t\t\tparent.property = literal;\n\t\t\t\t\t\t\t\tparent.computed = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst referenced_globals = Array.from(\n\t\t\t\tthis.globals,\n\t\t\t\t([name, alias]) => name !== alias.name && { name, alias }\n\t\t\t).filter(Boolean);\n\t\t\tif (referenced_globals.length) {\n\t\t\t\tthis.helpers.set('globals', this.alias('globals'));\n\t\t\t}\n\t\t\tconst imported_helpers = Array.from(this.helpers, ([name, alias]) => ({\n\t\t\t\tname,\n\t\t\t\talias,\n\t\t\t}));\n\n\t\t\tcreate_module(\n\t\t\t\tprogram,\n\t\t\t\tformat,\n\t\t\t\tname,\n\t\t\t\tbanner,\n\t\t\t\tcompile_options.sveltePath,\n\t\t\t\timported_helpers,\n\t\t\t\treferenced_globals,\n\t\t\t\tthis.imports,\n\t\t\t\tthis.vars\n\t\t\t\t\t.filter(variable => variable.module && variable.export_name)\n\t\t\t\t\t.map(variable => ({\n\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\tas: variable.export_name,\n\t\t\t\t\t}))\n\t\t\t);\n\n\t\t\tcss = compile_options.customElement\n\t\t\t\t? { code: null, map: null }\n\t\t\t\t: result.css;\n\n\t\t\tjs = print(program, {\n\t\t\t\tsourceMapSource: compile_options.filename\n\t\t\t});\n\n\t\t\tjs.map.sources = [\n\t\t\t\tcompile_options.filename ? get_relative_path(compile_options.outputFilename || '', compile_options.filename) : null\n\t\t\t];\n\n\t\t\tjs.map.sourcesContent = [\n\t\t\t\tthis.source\n\t\t\t];\n\t\t}\n\n\t\treturn {\n\t\t\tjs,\n\t\t\tcss,\n\t\t\tast: this.original_ast,\n\t\t\twarnings: this.warnings,\n\t\t\tvars: this.vars\n\t\t\t\t.filter(v => !v.global && !v.internal)\n\t\t\t\t.map(v => ({\n\t\t\t\t\tname: v.name,\n\t\t\t\t\texport_name: v.export_name || null,\n\t\t\t\t\tinjected: v.injected || false,\n\t\t\t\t\tmodule: v.module || false,\n\t\t\t\t\tmutated: v.mutated || false,\n\t\t\t\t\treassigned: v.reassigned || false,\n\t\t\t\t\treferenced: v.referenced || false,\n\t\t\t\t\twritable: v.writable || false,\n\t\t\t\t\treferenced_from_script: v.referenced_from_script || false,\n\t\t\t\t})),\n\t\t\tstats: this.stats.render(),\n\t\t};\n\t}\n\n\tget_unique_name(name: string, scope?: Scope): Identifier {\n\t\tif (test) name = `${name}$`;\n\t\tlet alias = name;\n\t\tfor (\n\t\t\tlet i = 1;\n\t\t\treserved.has(alias) ||\n\t\t\tthis.var_lookup.has(alias) ||\n\t\t\tthis.used_names.has(alias) ||\n\t\t\tthis.globally_used_names.has(alias) ||\n\t\t\t(scope && scope.has(alias));\n\t\t\talias = `${name}_${i++}`\n\t\t);\n\t\tthis.used_names.add(alias);\n\t\treturn { type: 'Identifier', name: alias };\n\t}\n\n\tget_unique_name_maker() {\n\t\tconst local_used_names = new Set();\n\n\t\tfunction add(name: string) {\n\t\t\tlocal_used_names.add(name);\n\t\t}\n\n\t\treserved.forEach(add);\n\t\tinternal_exports.forEach(add);\n\t\tthis.var_lookup.forEach((_value, key) => add(key));\n\n\t\treturn (name: string): Identifier => {\n\t\t\tif (test) name = `${name}$`;\n\t\t\tlet alias = name;\n\t\t\tfor (\n\t\t\t\tlet i = 1;\n\t\t\t\tthis.used_names.has(alias) || local_used_names.has(alias);\n\t\t\t\talias = `${name}_${i++}`\n\t\t\t);\n\t\t\tlocal_used_names.add(alias);\n\t\t\tthis.globally_used_names.add(alias);\n\n\t\t\treturn {\n\t\t\t\ttype: 'Identifier',\n\t\t\t\tname: alias\n\t\t\t};\n\t\t};\n\t}\n\n\terror(\n\t\tpos: {\n\t\t\tstart: number;\n\t\t\tend: number;\n\t\t},\n\t\te: {\n\t\t\tcode: string;\n\t\t\tmessage: string;\n\t\t}\n\t) {\n\t\terror(e.message, {\n\t\t\tname: 'ValidationError',\n\t\t\tcode: e.code,\n\t\t\tsource: this.source,\n\t\t\tstart: pos.start,\n\t\t\tend: pos.end,\n\t\t\tfilename: this.compile_options.filename,\n\t\t});\n\t}\n\n\twarn(\n\t\tpos: {\n\t\t\tstart: number;\n\t\t\tend: number;\n\t\t},\n\t\twarning: {\n\t\t\tcode: string;\n\t\t\tmessage: string;\n\t\t}\n\t) {\n\t\tif (this.ignores && this.ignores.has(warning.code)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst start = this.locate(pos.start);\n\t\tconst end = this.locate(pos.end);\n\n\t\tconst frame = get_code_frame(this.source, start.line - 1, start.column);\n\n\t\tthis.warnings.push({\n\t\t\tcode: warning.code,\n\t\t\tmessage: warning.message,\n\t\t\tframe,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tpos: pos.start,\n\t\t\tfilename: this.compile_options.filename,\n\t\t\ttoString: () =>\n\t\t\t\t`${warning.message} (${start.line}:${start.column})\\n${frame}`,\n\t\t});\n\t}\n\n\textract_imports(node) {\n\t\tthis.imports.push(node);\n\t}\n\n\textract_exports(node) {\n\t\tif (node.type === 'ExportDefaultDeclaration') {\n\t\t\tthis.error(node, {\n\t\t\t\tcode: `default-export`,\n\t\t\t\tmessage: `A component cannot have a default export`,\n\t\t\t});\n\t\t}\n\n\t\tif (node.type === 'ExportNamedDeclaration') {\n\t\t\tif (node.source) {\n\t\t\t\tthis.error(node, {\n\t\t\t\t\tcode: `not-implemented`,\n\t\t\t\t\tmessage: `A component currently cannot have an export ... from`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (node.declaration) {\n\t\t\t\tif (node.declaration.type === 'VariableDeclaration') {\n\t\t\t\t\tnode.declaration.declarations.forEach(declarator => {\n\t\t\t\t\t\textract_names(declarator.id).forEach(name => {\n\t\t\t\t\t\t\tconst variable = this.var_lookup.get(name);\n\t\t\t\t\t\t\tvariable.export_name = name;\n\t\t\t\t\t\t\tif (variable.writable && !(variable.referenced || variable.referenced_from_script || variable.subscribable)) {\n\t\t\t\t\t\t\t\tthis.warn(declarator, {\n\t\t\t\t\t\t\t\t\tcode: `unused-export-let`,\n\t\t\t\t\t\t\t\t\tmessage: `${this.name.name} has unused export property '${name}'. If it is for external reference only, please consider using \\`export const ${name}\\``\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst { name } = node.declaration.id;\n\n\t\t\t\t\tconst variable = this.var_lookup.get(name);\n\t\t\t\t\tvariable.export_name = name;\n\t\t\t\t}\n\n\t\t\t\treturn node.declaration;\n\t\t\t} else {\n\t\t\t\tnode.specifiers.forEach(specifier => {\n\t\t\t\t\tconst variable = this.var_lookup.get(specifier.local.name);\n\n\t\t\t\t\tif (variable) {\n\t\t\t\t\t\tvariable.export_name = specifier.exported.name;\n\n\t\t\t\t\t\tif (variable.writable && !(variable.referenced || variable.referenced_from_script || variable.subscribable)) {\n\t\t\t\t\t\t\tthis.warn(specifier, {\n\t\t\t\t\t\t\t\tcode: `unused-export-let`,\n\t\t\t\t\t\t\t\tmessage: `${this.name.name} has unused export property '${specifier.exported.name}'. If it is for external reference only, please consider using \\`export const ${specifier.exported.name}\\``\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\n\textract_javascript(script) {\n\t\tif (!script) return null;\n\n\t\treturn script.content.body.filter(node => {\n\t\t\tif (!node) return false;\n\t\t\tif (this.hoistable_nodes.has(node)) return false;\n\t\t\tif (this.reactive_declaration_nodes.has(node)) return false;\n\t\t\tif (node.type === 'ImportDeclaration') return false;\n\t\t\tif (node.type === 'ExportDeclaration' && node.specifiers.length > 0)\n\t\t\t\treturn false;\n\t\t\treturn true;\n\t\t});\n\t}\n\n\twalk_module_js() {\n\t\tconst component = this;\n\t\tconst script = this.ast.module;\n\t\tif (!script) return;\n\n\t\twalk(script.content, {\n\t\t\tenter(node) {\n\t\t\t\tif (node.type === 'LabeledStatement' && node.label.name === '$') {\n\t\t\t\t\tcomponent.warn(node as any, {\n\t\t\t\t\t\tcode: 'module-script-reactive-declaration',\n\t\t\t\t\t\tmessage: '$: has no effect in a module script',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tconst { scope, globals } = create_scopes(script.content);\n\t\tthis.module_scope = scope;\n\n\t\tscope.declarations.forEach((node, name) => {\n\t\t\tif (name[0] === '$') {\n\t\t\t\tthis.error(node as any, {\n\t\t\t\t\tcode: 'illegal-declaration',\n\t\t\t\t\tmessage: `The $ prefix is reserved, and cannot be used for variable and import names`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst writable = node.type === 'VariableDeclaration' && (node.kind === 'var' || node.kind === 'let');\n\n\t\t\tthis.add_var({\n\t\t\t\tname,\n\t\t\t\tmodule: true,\n\t\t\t\thoistable: true,\n\t\t\t\twritable\n\t\t\t});\n\t\t});\n\n\t\tglobals.forEach((node, name) => {\n\t\t\tif (name[0] === '$') {\n\t\t\t\tthis.error(node as any, {\n\t\t\t\t\tcode: 'illegal-subscription',\n\t\t\t\t\tmessage: `Cannot reference store value inside <script context=\"module\">`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.add_var({\n\t\t\t\t\tname,\n\t\t\t\t\tglobal: true,\n\t\t\t\t\thoistable: true\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tconst { body } = script.content;\n\t\tlet i = body.length;\n\t\twhile (--i >= 0) {\n\t\t\tconst node = body[i];\n\t\t\tif (node.type === 'ImportDeclaration') {\n\t\t\t\tthis.extract_imports(node);\n\t\t\t\tbody.splice(i, 1);\n\t\t\t}\n\n\t\t\tif (/^Export/.test(node.type)) {\n\t\t\t\tconst replacement = this.extract_exports(node);\n\t\t\t\tif (replacement) {\n\t\t\t\t\tbody[i] = replacement;\n\t\t\t\t} else {\n\t\t\t\t\tbody.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\twalk_instance_js_pre_template() {\n\t\tconst script = this.ast.instance;\n\t\tif (!script) return;\n\n\t\t// inject vars for reactive declarations\n\t\tscript.content.body.forEach(node => {\n\t\t\tif (node.type !== 'LabeledStatement') return;\n\t\t\tif (node.body.type !== 'ExpressionStatement') return;\n\n\t\t\tconst { expression } = node.body;\n\t\t\tif (expression.type !== 'AssignmentExpression') return;\n\t\t\tif (expression.left.type === 'MemberExpression') return;\n\n\t\t\textract_names(expression.left).forEach(name => {\n\t\t\t\tif (!this.var_lookup.has(name) && name[0] !== '$') {\n\t\t\t\t\tthis.injected_reactive_declaration_vars.add(name);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tconst { scope: instance_scope, map, globals } = create_scopes(\n\t\t\tscript.content\n\t\t);\n\t\tthis.instance_scope = instance_scope;\n\t\tthis.instance_scope_map = map;\n\n\t\tinstance_scope.declarations.forEach((node, name) => {\n\t\t\tif (name[0] === '$') {\n\t\t\t\tthis.error(node as any, {\n\t\t\t\t\tcode: 'illegal-declaration',\n\t\t\t\t\tmessage: `The $ prefix is reserved, and cannot be used for variable and import names`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst writable = node.type === 'VariableDeclaration' && (node.kind === 'var' || node.kind === 'let');\n\n\t\t\tthis.add_var({\n\t\t\t\tname,\n\t\t\t\tinitialised: instance_scope.initialised_declarations.has(name),\n\t\t\t\thoistable: /^Import/.test(node.type),\n\t\t\t\twritable\n\t\t\t});\n\n\t\t\tthis.node_for_declaration.set(name, node);\n\t\t});\n\n\t\tglobals.forEach((node, name) => {\n\t\t\tif (this.var_lookup.has(name)) return;\n\n\t\t\tif (this.injected_reactive_declaration_vars.has(name)) {\n\t\t\t\tthis.add_var({\n\t\t\t\t\tname,\n\t\t\t\t\tinjected: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\treassigned: true,\n\t\t\t\t\tinitialised: true,\n\t\t\t\t});\n\t\t\t} else if (name === '$$props') {\n\t\t\t\tthis.add_var({\n\t\t\t\t\tname,\n\t\t\t\t\tinjected: true,\n\t\t\t\t});\n\t\t\t} else if (name[0] === '$') {\n\t\t\t\tif (name === '$' || name[1] === '$') {\n\t\t\t\t\tthis.error(node as any, {\n\t\t\t\t\t\tcode: 'illegal-global',\n\t\t\t\t\t\tmessage: `${name} is an illegal variable name`\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.add_var({\n\t\t\t\t\tname,\n\t\t\t\t\tinjected: true,\n\t\t\t\t\tmutated: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\n\t\t\t\tthis.add_reference(name.slice(1));\n\n\t\t\t\tconst variable = this.var_lookup.get(name.slice(1));\n\t\t\t\tif (variable) {\n\t\t\t\t\tvariable.subscribable = true;\n\t\t\t\t\tvariable.referenced_from_script = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.add_var({\n\t\t\t\t\tname,\n\t\t\t\t\tglobal: true,\n\t\t\t\t\thoistable: true\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.track_references_and_mutations();\n\t}\n\n\twalk_instance_js_post_template() {\n\t\tconst script = this.ast.instance;\n\t\tif (!script) return;\n\n\t\tthis.post_template_walk();\n\n\t\tthis.hoist_instance_declarations();\n\t\tthis.extract_reactive_declarations();\n\t}\n\n\tpost_template_walk() {\n\t\tconst script = this.ast.instance;\n\t\tif (!script) return;\n\n\t\tconst component = this;\n\t\tconst { content } = script;\n\t\tconst { instance_scope, instance_scope_map: map } = this;\n\n\t\tlet scope = instance_scope;\n\n\t\tconst to_remove = [];\n\t\tconst remove = (parent, prop, index) => {\n\t\t\tto_remove.unshift([parent, prop, index]);\n\t\t};\n\t\tlet scope_updated = false;\n\n\t\twalk(content, {\n\t\t\tenter(node, parent, prop, index) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = map.get(node);\n\t\t\t\t}\n\n\t\t\t\tif (node.type === 'ImportDeclaration') {\n\t\t\t\t\tcomponent.extract_imports(node);\n\t\t\t\t\t// TODO: to use actual remove\n\t\t\t\t\tremove(parent, prop, index);\n\t\t\t\t\treturn this.skip();\n\t\t\t\t}\n\n\t\t\t\tif (/^Export/.test(node.type)) {\n\t\t\t\t\tconst replacement = component.extract_exports(node);\n\t\t\t\t\tif (replacement) {\n\t\t\t\t\t\tthis.replace(replacement);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// TODO: to use actual remove\n\t\t\t\t\t\tremove(parent, prop, index);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.skip();\n\t\t\t\t}\n\n\t\t\t\tcomponent.warn_on_undefined_store_value_references(node, parent, scope);\n\t\t\t},\n\n\t\t\tleave(node) {\n\t\t\t\t// do it on leave, to prevent infinite loop\n\t\t\t\tif (component.compile_options.dev && component.compile_options.loopGuardTimeout > 0) {\n\t\t\t\t\tconst to_replace_for_loop_protect = component.loop_protect(node, scope, component.compile_options.loopGuardTimeout);\n\t\t\t\t\tif (to_replace_for_loop_protect) {\n\t\t\t\t\t\tthis.replace(to_replace_for_loop_protect);\n\t\t\t\t\t\tscope_updated = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = scope.parent;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tfor (const [parent, prop, index] of to_remove) {\n\t\t\tif (parent) {\n\t\t\t\tif (index !== null) {\n\t\t\t\t\tparent[prop].splice(index, 1);\n\t\t\t\t} else {\n\t\t\t\t\tdelete parent[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (scope_updated) {\n\t\t\tconst { scope, map } = create_scopes(script.content);\n\t\t\tthis.instance_scope = scope;\n\t\t\tthis.instance_scope_map = map;\n\t\t}\n\t}\n\n\ttrack_references_and_mutations() {\n\t\tconst script = this.ast.instance;\n\t\tif (!script) return;\n\n\t\tconst component = this;\n\t\tconst { content } = script;\n\t\tconst { instance_scope, instance_scope_map: map } = this;\n\n\t\tlet scope = instance_scope;\n\n\t\twalk(content, {\n\t\t\tenter(node, parent) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = map.get(node);\n\t\t\t\t}\n\n\t\t\t\tif (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') {\n\t\t\t\t\tconst assignee = node.type === 'AssignmentExpression' ? node.left : node.argument;\n\t\t\t\t\tconst names = extract_names(assignee);\n\n\t\t\t\t\tconst deep = assignee.type === 'MemberExpression';\n\n\t\t\t\t\tnames.forEach(name => {\n\t\t\t\t\t\tif (scope.find_owner(name) === instance_scope) {\n\t\t\t\t\t\t\tconst variable = component.var_lookup.get(name);\n\t\t\t\t\t\t\tvariable[deep ? 'mutated' : 'reassigned'] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (is_used_as_reference(node, parent)) {\n\t\t\t\t\tconst object = get_object(node);\n\t\t\t\t\tif (scope.find_owner(object.name) === instance_scope) {\n\t\t\t\t\t\tconst variable = component.var_lookup.get(object.name);\n\t\t\t\t\t\tvariable.referenced_from_script = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tleave(node) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = scope.parent;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\twarn_on_undefined_store_value_references(node, parent, scope) {\n\t\tif (\n\t\t\tnode.type === 'LabeledStatement' &&\n\t\t\tnode.label.name === '$' &&\n\t\t\tparent.type !== 'Program'\n\t\t) {\n\t\t\tthis.warn(node as any, {\n\t\t\t\tcode: 'non-top-level-reactive-declaration',\n\t\t\t\tmessage: '$: has no effect outside of the top-level',\n\t\t\t});\n\t\t}\n\n\t\tif (is_reference(node as Node, parent as Node)) {\n\t\t\tconst object = get_object(node);\n\t\t\tconst { name } = object;\n\n\t\t\tif (name[0] === '$' && !scope.has(name)) {\n\t\t\t\tthis.warn_if_undefined(name, object, null);\n\t\t\t}\n\t\t}\n\t}\n\n\tloop_protect(node, scope: Scope, timeout: number): Node | null {\n\t\tif (node.type === 'WhileStatement' ||\n\t\t\tnode.type === 'ForStatement' ||\n\t\t\tnode.type === 'DoWhileStatement') {\n\t\t\tconst guard = this.get_unique_name('guard', scope);\n\t\t\tthis.used_names.add(guard.name);\n\n\t\t\tconst before = b`const ${guard} = @loop_guard(${timeout})`;\n\t\t\tconst inside = b`${guard}();`;\n\n\t\t\t// wrap expression statement with BlockStatement\n\t\t\tif (node.body.type !== 'BlockStatement') {\n\t\t\t\tnode.body = {\n\t\t\t\t\ttype: 'BlockStatement',\n\t\t\t\t\tbody: [node.body],\n\t\t\t\t};\n\t\t\t}\n\t\t\tnode.body.body.push(inside[0]);\n\n\t\t\treturn {\n\t\t\t\ttype: 'BlockStatement',\n\t\t\t\tbody: [\n\t\t\t\t\tbefore[0],\n\t\t\t\t\tnode,\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\trewrite_props(get_insert: (variable: Var) => Node[]) {\n\t\tif (!this.ast.instance) return;\n\n\t\tconst component = this;\n\t\tconst { instance_scope, instance_scope_map: map } = this;\n\t\tlet scope = instance_scope;\n\n\t\twalk(this.ast.instance.content, {\n\t\t\tenter(node, parent, key, index) {\n\t\t\t\tif (/Function/.test(node.type)) {\n\t\t\t\t\treturn this.skip();\n\t\t\t\t}\n\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = map.get(node);\n\t\t\t\t}\n\n\t\t\t\tif (node.type === 'VariableDeclaration') {\n\t\t\t\t\tif (node.kind === 'var' || scope === instance_scope) {\n\t\t\t\t\t\tnode.declarations.forEach(declarator => {\n\t\t\t\t\t\t\tif (declarator.id.type !== 'Identifier') {\n\t\t\t\t\t\t\t\tconst inserts = [];\n\n\t\t\t\t\t\t\t\textract_names(declarator.id).forEach(name => {\n\t\t\t\t\t\t\t\t\tconst variable = component.var_lookup.get(name);\n\n\t\t\t\t\t\t\t\t\tif (variable.export_name) {\n\t\t\t\t\t\t\t\t\t\t// TODO is this still true post-#3539?\n\t\t\t\t\t\t\t\t\t\tcomponent.error(declarator as any, {\n\t\t\t\t\t\t\t\t\t\t\tcode: 'destructured-prop',\n\t\t\t\t\t\t\t\t\t\t\tmessage: `Cannot declare props in destructured declaration`,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (variable.subscribable) {\n\t\t\t\t\t\t\t\t\t\tinserts.push(get_insert(variable));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (inserts.length) {\n\t\t\t\t\t\t\t\t\tparent[key].splice(index + 1, 0, ...inserts);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst { name } = declarator.id;\n\t\t\t\t\t\t\tconst variable = component.var_lookup.get(name);\n\n\t\t\t\t\t\t\tif (variable.export_name && variable.writable) {\n\t\t\t\t\t\t\t\tconst insert = variable.subscribable\n\t\t\t\t\t\t\t\t\t? get_insert(variable)\n\t\t\t\t\t\t\t\t\t: null;\n\n\t\t\t\t\t\t\t\tparent[key].splice(index + 1, 0, insert);\n\n\t\t\t\t\t\t\t\tdeclarator.id = {\n\t\t\t\t\t\t\t\t\ttype: 'ObjectPattern',\n\t\t\t\t\t\t\t\t\tproperties: [{\n\t\t\t\t\t\t\t\t\t\ttype: 'Property',\n\t\t\t\t\t\t\t\t\t\tmethod: false,\n\t\t\t\t\t\t\t\t\t\tshorthand: false,\n\t\t\t\t\t\t\t\t\t\tcomputed: false,\n\t\t\t\t\t\t\t\t\t\tkind: 'init',\n\t\t\t\t\t\t\t\t\t\tkey: { type: 'Identifier', name: variable.export_name },\n\t\t\t\t\t\t\t\t\t\tvalue: declarator.init\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: 'AssignmentPattern',\n\t\t\t\t\t\t\t\t\t\t\t\tleft: declarator.id,\n\t\t\t\t\t\t\t\t\t\t\t\tright: declarator.init\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: declarator.id\n\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tdeclarator.init = x`$$props`;\n\t\t\t\t\t\t\t} else if (variable.subscribable) {\n\t\t\t\t\t\t\t\tconst insert = get_insert(variable);\n\t\t\t\t\t\t\t\tparent[key].splice(index + 1, 0, ...insert);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tleave(node, parent, _key, index) {\n\t\t\t\tif (map.has(node)) {\n\t\t\t\t\tscope = scope.parent;\n\t\t\t\t}\n\n\t\t\t\tif (node.type === 'ExportNamedDeclaration' && node.declaration) {\n\t\t\t\t\t(parent as Program).body[index] = node.declaration;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\thoist_instance_declarations() {\n\t\t// we can safely hoist variable declarations that are\n\t\t// initialised to literals, and functions that don't\n\t\t// reference instance variables other than other\n\t\t// hoistable functions. TODO others?\n\n\t\tconst {\n\t\t\thoistable_nodes,\n\t\t\tvar_lookup,\n\t\t\tinjected_reactive_declaration_vars,\n\t\t} = this;\n\n\t\tconst top_level_function_declarations = new Map();\n\n\t\tconst { body } = this.ast.instance.content;\n\n\t\tfor (let i = 0; i < body.length; i += 1) {\n\t\t\tconst node = body[i];\n\n\t\t\tif (node.type === 'VariableDeclaration') {\n\t\t\t\tconst all_hoistable = node.declarations.every(d => {\n\t\t\t\t\tif (!d.init) return false;\n\t\t\t\t\tif (d.init.type !== 'Literal') return false;\n\n\t\t\t\t\t// everything except const values can be changed by e.g. svelte devtools\n\t\t\t\t\t// which means we can't hoist it\n\t\t\t\t\tif (node.kind !== 'const' && this.compile_options.dev) return false;\n\n\t\t\t\t\tconst { name } = d.id as Identifier;\n\n\t\t\t\t\tconst v = this.var_lookup.get(name);\n\t\t\t\t\tif (v.reassigned) return false;\n\t\t\t\t\tif (v.export_name) return false;\n\n\t\t\t\t\tif (this.var_lookup.get(name).reassigned) return false;\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.vars.find(\n\t\t\t\t\t\t\tvariable => variable.name === name && variable.module\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\n\t\t\t\tif (all_hoistable) {\n\t\t\t\t\tnode.declarations.forEach(d => {\n\t\t\t\t\t\tconst variable = this.var_lookup.get((d.id as Identifier).name);\n\t\t\t\t\t\tvariable.hoistable = true;\n\t\t\t\t\t});\n\n\t\t\t\t\thoistable_nodes.add(node);\n\n\t\t\t\t\tbody.splice(i--, 1);\n\t\t\t\t\tthis.fully_hoisted.push(node);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnode.type === 'ExportNamedDeclaration' &&\n\t\t\t\tnode.declaration &&\n\t\t\t\tnode.declaration.type === 'FunctionDeclaration'\n\t\t\t) {\n\t\t\t\ttop_level_function_declarations.set(node.declaration.id.name, node);\n\t\t\t}\n\n\t\t\tif (node.type === 'FunctionDeclaration') {\n\t\t\t\ttop_level_function_declarations.set(node.id.name, node);\n\t\t\t}\n\t\t}\n\n\t\tconst checked = new Set();\n\t\tconst walking = new Set();\n\n\t\tconst is_hoistable = fn_declaration => {\n\t\t\tif (fn_declaration.type === 'ExportNamedDeclaration') {\n\t\t\t\tfn_declaration = fn_declaration.declaration;\n\t\t\t}\n\n\t\t\tconst instance_scope = this.instance_scope;\n\t\t\tlet scope = this.instance_scope;\n\t\t\tconst map = this.instance_scope_map;\n\n\t\t\tlet hoistable = true;\n\n\t\t\t// handle cycles\n\t\t\twalking.add(fn_declaration);\n\n\t\t\twalk(fn_declaration, {\n\t\t\t\tenter(node, parent) {\n\t\t\t\t\tif (!hoistable) return this.skip();\n\n\t\t\t\t\tif (map.has(node)) {\n\t\t\t\t\t\tscope = map.get(node);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is_reference(node as Node, parent as Node)) {\n\t\t\t\t\t\tconst { name } = flatten_reference(node);\n\t\t\t\t\t\tconst owner = scope.find_owner(name);\n\n\t\t\t\t\t\tif (injected_reactive_declaration_vars.has(name)) {\n\t\t\t\t\t\t\thoistable = false;\n\t\t\t\t\t\t} else if (name[0] === '$' && !owner) {\n\t\t\t\t\t\t\thoistable = false;\n\t\t\t\t\t\t} else if (owner === instance_scope) {\n\t\t\t\t\t\t\tconst variable = var_lookup.get(name);\n\n\t\t\t\t\t\t\tif (variable.reassigned || variable.mutated) hoistable = false;\n\n\t\t\t\t\t\t\tif (name === fn_declaration.id.name) return;\n\n\t\t\t\t\t\t\tif (variable.hoistable) return;\n\n\t\t\t\t\t\t\tif (top_level_function_declarations.has(name)) {\n\t\t\t\t\t\t\t\tconst other_declaration = top_level_function_declarations.get(\n\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (walking.has(other_declaration)) {\n\t\t\t\t\t\t\t\t\thoistable = false;\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tother_declaration.type === 'ExportNamedDeclaration' &&\n\t\t\t\t\t\t\t\t\twalking.has(other_declaration.declaration)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\thoistable = false;\n\t\t\t\t\t\t\t\t} else if (!is_hoistable(other_declaration)) {\n\t\t\t\t\t\t\t\t\thoistable = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thoistable = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.skip();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tleave(node) {\n\t\t\t\t\tif (map.has(node)) {\n\t\t\t\t\t\tscope = scope.parent;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tchecked.add(fn_declaration);\n\t\t\twalking.delete(fn_declaration);\n\n\t\t\treturn hoistable;\n\t\t};\n\n\t\tfor (const [name, node] of top_level_function_declarations) {\n\t\t\tif (is_hoistable(node)) {\n\t\t\t\tconst variable = this.var_lookup.get(name);\n\t\t\t\tvariable.hoistable = true;\n\t\t\t\thoistable_nodes.add(node);\n\n\t\t\t\tconst i = body.indexOf(node);\n\t\t\t\tbody.splice(i, 1);\n\t\t\t\tthis.fully_hoisted.push(node);\n\t\t\t}\n\t\t}\n\t}\n\n\textract_reactive_declarations() {\n\t\tconst component = this;\n\n\t\tconst unsorted_reactive_declarations = [];\n\n\t\tthis.ast.instance.content.body.forEach(node => {\n\t\t\tif (node.type === 'LabeledStatement' && node.label.name === '$') {\n\t\t\t\tthis.reactive_declaration_nodes.add(node);\n\n\t\t\t\tconst assignees = new Set();\n\t\t\t\tconst assignee_nodes = new Set();\n\t\t\t\tconst dependencies = new Set();\n\n\t\t\t\tlet scope = this.instance_scope;\n\t\t\t\tconst map = this.instance_scope_map;\n\n\t\t\t\twalk(node.body, {\n\t\t\t\t\tenter(node, parent) {\n\t\t\t\t\t\tif (map.has(node)) {\n\t\t\t\t\t\t\tscope = map.get(node);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (node.type === 'AssignmentExpression') {\n\t\t\t\t\t\t\tconst left = get_object(node.left);\n\n\t\t\t\t\t\t\textract_identifiers(left).forEach(node => {\n\t\t\t\t\t\t\t\tassignee_nodes.add(node);\n\t\t\t\t\t\t\t\tassignees.add(node.name);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (node.operator !== '=') {\n\t\t\t\t\t\t\t\tdependencies.add(left.name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (node.type === 'UpdateExpression') {\n\t\t\t\t\t\t\tconst identifier = get_object(node.argument);\n\t\t\t\t\t\t\tassignees.add(identifier.name);\n\t\t\t\t\t\t} else if (is_reference(node as Node, parent as Node)) {\n\t\t\t\t\t\t\tconst identifier = get_object(node);\n\t\t\t\t\t\t\tif (!assignee_nodes.has(identifier)) {\n\t\t\t\t\t\t\t\tconst { name } = identifier;\n\t\t\t\t\t\t\t\tconst owner = scope.find_owner(name);\n\t\t\t\t\t\t\t\tconst variable = component.var_lookup.get(name);\n\t\t\t\t\t\t\t\tif (variable) variable.is_reactive_dependency = true;\n\t\t\t\t\t\t\t\tconst is_writable_or_mutated =\n\t\t\t\t\t\t\t\t\tvariable && (variable.writable || variable.mutated);\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t(!owner || owner === component.instance_scope) &&\n\t\t\t\t\t\t\t\t\t(name[0] === '$' || is_writable_or_mutated)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tdependencies.add(name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.skip();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tleave(node) {\n\t\t\t\t\t\tif (map.has(node)) {\n\t\t\t\t\t\t\tscope = scope.parent;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst { expression } = node.body as ExpressionStatement;\n\t\t\t\tconst declaration = expression && (expression as AssignmentExpression).left;\n\n\t\t\t\tunsorted_reactive_declarations.push({\n\t\t\t\t\tassignees,\n\t\t\t\t\tdependencies,\n\t\t\t\t\tnode,\n\t\t\t\t\tdeclaration,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tconst lookup = new Map();\n\t\tlet seen;\n\n\t\tunsorted_reactive_declarations.forEach(declaration => {\n\t\t\tdeclaration.assignees.forEach(name => {\n\t\t\t\tif (!lookup.has(name)) {\n\t\t\t\t\tlookup.set(name, []);\n\t\t\t\t}\n\n\t\t\t\t// TODO warn or error if a name is assigned to in\n\t\t\t\t// multiple reactive declarations?\n\t\t\t\tlookup.get(name).push(declaration);\n\t\t\t});\n\t\t});\n\n\t\tconst cycle = check_graph_for_cycles(unsorted_reactive_declarations.reduce((acc, declaration) => {\n\t\t\tdeclaration.assignees.forEach(v => {\n\t\t\t\tdeclaration.dependencies.forEach(w => {\n\t\t\t\t\tif (!declaration.assignees.has(w)) {\n\t\t\t\t\t\tacc.push([v, w]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn acc;\n\t\t}, []));\n\n\t\tif (cycle && cycle.length) {\n\t\t\tconst declarationList = lookup.get(cycle[0]);\n\t\t\tconst declaration = declarationList[0];\n\t\t\tthis.error(declaration.node, {\n\t\t\t\tcode: 'cyclical-reactive-declaration',\n\t\t\t\tmessage: `Cyclical dependency detected: ${cycle.join(' → ')}`\n\t\t\t});\n\t\t}\n\n\t\tconst add_declaration = declaration => {\n\t\t\tif (this.reactive_declarations.indexOf(declaration) !== -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tseen.add(declaration);\n\n\t\t\tdeclaration.dependencies.forEach(name => {\n\t\t\t\tif (declaration.assignees.has(name)) return;\n\t\t\t\tconst earlier_declarations = lookup.get(name);\n\t\t\t\tif (earlier_declarations)\n\t\t\t\t\tearlier_declarations.forEach(declaration => {\n\t\t\t\t\t\tadd_declaration(declaration);\n\t\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.reactive_declarations.push(declaration);\n\t\t};\n\n\t\tunsorted_reactive_declarations.forEach(declaration => {\n\t\t\tseen = new Set();\n\t\t\tadd_declaration(declaration);\n\t\t});\n\t}\n\n\twarn_if_undefined(name: string, node, template_scope: TemplateScope) {\n\t\tif (name[0] === '$') {\n\t\t\tif (name === '$' || name[1] === '$' && name !== '$$props') {\n\t\t\t\tthis.error(node, {\n\t\t\t\t\tcode: 'illegal-global',\n\t\t\t\t\tmessage: `${name} is an illegal variable name`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.has_reactive_assignments = true; // TODO does this belong here?\n\n\t\t\tif (name === '$$props') return;\n\n\t\t\tname = name.slice(1);\n\t\t}\n\n\t\tif (this.var_lookup.has(name) && !this.var_lookup.get(name).global) return;\n\t\tif (template_scope && template_scope.names.has(name)) return;\n\t\tif (globals.has(name) && node.type !== 'InlineComponent') return;\n\n\t\tlet message = `'${name}' is not defined`;\n\t\tif (!this.ast.instance)\n\t\t\tmessage += `. Consider adding a <script> block with 'export let ${name}' to declare a prop`;\n\n\t\tthis.warn(node, {\n\t\t\tcode: 'missing-declaration',\n\t\t\tmessage,\n\t\t});\n\t}\n\n\tpush_ignores(ignores) {\n\t\tthis.ignores = new Set(this.ignores || []);\n\t\tadd_to_set(this.ignores, ignores);\n\t\tthis.ignore_stack.push(this.ignores);\n\t}\n\n\tpop_ignores() {\n\t\tthis.ignore_stack.pop();\n\t\tthis.ignores = this.ignore_stack[this.ignore_stack.length - 1];\n\t}\n}\n\nfunction process_component_options(component: Component, nodes) {\n\tconst component_options: ComponentOptions = {\n\t\timmutable: component.compile_options.immutable || false,\n\t\taccessors:\n\t\t\t'accessors' in component.compile_options\n\t\t\t\t? component.compile_options.accessors\n\t\t\t\t: !!component.compile_options.customElement,\n\t\tpreserveWhitespace: !!component.compile_options.preserveWhitespace,\n\t};\n\n\tconst node = nodes.find(node => node.name === 'svelte:options');\n\n\tfunction get_value(attribute, code, message) {\n\t\tconst { value } = attribute;\n\t\tconst chunk = value[0];\n\n\t\tif (!chunk) return true;\n\n\t\tif (value.length > 1) {\n\t\t\tcomponent.error(attribute, { code, message });\n\t\t}\n\n\t\tif (chunk.type === 'Text') return chunk.data;\n\n\t\tif (chunk.expression.type !== 'Literal') {\n\t\t\tcomponent.error(attribute, { code, message });\n\t\t}\n\n\t\treturn chunk.expression.value;\n\t}\n\n\tif (node) {\n\t\tnode.attributes.forEach(attribute => {\n\t\t\tif (attribute.type === 'Attribute') {\n\t\t\t\tconst { name } = attribute;\n\n\t\t\t\tswitch (name) {\n\t\t\t\t\tcase 'tag': {\n\t\t\t\t\t\tconst code = 'invalid-tag-attribute';\n\t\t\t\t\t\tconst message = `'tag' must be a string literal`;\n\t\t\t\t\t\tconst tag = get_value(attribute, code, message);\n\n\t\t\t\t\t\tif (typeof tag !== 'string' && tag !== null)\n\t\t\t\t\t\t\tcomponent.error(attribute, { code, message });\n\n\t\t\t\t\t\tif (tag && !/^[a-zA-Z][a-zA-Z0-9]*-[a-zA-Z0-9-]+$/.test(tag)) {\n\t\t\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\t\t\tcode: `invalid-tag-property`,\n\t\t\t\t\t\t\t\tmessage: `tag name must be two or more words joined by the '-' character`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tag && !component.compile_options.customElement) {\n\t\t\t\t\t\t\tcomponent.warn(attribute, {\n\t\t\t\t\t\t\t\tcode: 'missing-custom-element-compile-options',\n\t\t\t\t\t\t\t\tmessage: `The 'tag' option is used when generating a custom element. Did you forget the 'customElement: true' compile option?`\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcomponent_options.tag = tag;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'namespace': {\n\t\t\t\t\t\tconst code = 'invalid-namespace-attribute';\n\t\t\t\t\t\tconst message = `The 'namespace' attribute must be a string literal representing a valid namespace`;\n\t\t\t\t\t\tconst ns = get_value(attribute, code, message);\n\n\t\t\t\t\t\tif (typeof ns !== 'string')\n\t\t\t\t\t\t\tcomponent.error(attribute, { code, message });\n\n\t\t\t\t\t\tif (valid_namespaces.indexOf(ns) === -1) {\n\t\t\t\t\t\t\tconst match = fuzzymatch(ns, valid_namespaces);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\t\t\t\tcode: `invalid-namespace-property`,\n\t\t\t\t\t\t\t\t\tmessage: `Invalid namespace '${ns}' (did you mean '${match}'?)`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\t\t\t\tcode: `invalid-namespace-property`,\n\t\t\t\t\t\t\t\t\tmessage: `Invalid namespace '${ns}'`,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcomponent_options.namespace = ns;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'accessors':\n\t\t\t\t\tcase 'immutable':\n\t\t\t\t\tcase 'preserveWhitespace': {\n\t\t\t\t\t\tconst code = `invalid-${name}-value`;\n\t\t\t\t\t\tconst message = `${name} attribute must be true or false`;\n\t\t\t\t\t\tconst value = get_value(attribute, code, message);\n\n\t\t\t\t\t\tif (typeof value !== 'boolean')\n\t\t\t\t\t\t\tcomponent.error(attribute, { code, message });\n\n\t\t\t\t\t\tcomponent_options[name] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\t\t\tcode: `invalid-options-attribute`,\n\t\t\t\t\t\t\tmessage: `<svelte:options> unknown attribute`,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcomponent.error(attribute, {\n\t\t\t\t\tcode: `invalid-options-attribute`,\n\t\t\t\t\tmessage: `<svelte:options> can only have static 'tag', 'namespace', 'accessors', 'immutable' and 'preserveWhitespace' attributes`,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\treturn component_options;\n}\n\nfunction get_relative_path(from: string, to: string) {\n\tconst from_parts = from.split(/[/\\\\]/);\n\tconst to_parts = to.split(/[/\\\\]/);\n\n\tfrom_parts.pop(); // get dirname\n\n\twhile (from_parts[0] === to_parts[0]) {\n\t\tfrom_parts.shift();\n\t\tto_parts.shift();\n\t}\n\n\tif (from_parts.length) {\n\t\tlet i = from_parts.length;\n\t\twhile (i--) from_parts[i] = '..';\n\t}\n\n\treturn from_parts.concat(to_parts).join('/');\n}","import { assign } from '../../runtime/internal/utils';\nimport Stats from '../Stats';\nimport parse from '../parse/index';\nimport render_dom from './render_dom/index';\nimport render_ssr from './render_ssr/index';\nimport { CompileOptions, Warning } from '../interfaces';\nimport Component from './Component';\nimport fuzzymatch from '../utils/fuzzymatch';\nimport get_name_from_filename from './utils/get_name_from_filename';\n\nconst valid_options = [\n\t'format',\n\t'name',\n\t'filename',\n\t'generate',\n\t'outputFilename',\n\t'cssOutputFilename',\n\t'sveltePath',\n\t'dev',\n\t'accessors',\n\t'immutable',\n\t'hydratable',\n\t'legacy',\n\t'customElement',\n\t'tag',\n\t'css',\n\t'loopGuardTimeout',\n\t'preserveComments',\n\t'preserveWhitespace'\n];\n\nfunction validate_options(options: CompileOptions, warnings: Warning[]) {\n\tconst { name, filename, loopGuardTimeout, dev } = options;\n\n\tObject.keys(options).forEach(key => {\n\t\tif (!valid_options.includes(key)) {\n\t\t\tconst match = fuzzymatch(key, valid_options);\n\t\t\tlet message = `Unrecognized option '${key}'`;\n\t\t\tif (match) message += ` (did you mean '${match}'?)`;\n\n\t\t\tthrow new Error(message);\n\t\t}\n\t});\n\n\tif (name && !/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(name)) {\n\t\tthrow new Error(`options.name must be a valid identifier (got '${name}')`);\n\t}\n\n\tif (name && /^[a-z]/.test(name)) {\n\t\tconst message = `options.name should be capitalised`;\n\t\twarnings.push({\n\t\t\tcode: `options-lowercase-name`,\n\t\t\tmessage,\n\t\t\tfilename,\n\t\t\ttoString: () => message,\n\t\t});\n\t}\n\n\tif (loopGuardTimeout && !dev) {\n\t\tconst message = 'options.loopGuardTimeout is for options.dev = true only';\n\t\twarnings.push({\n\t\t\tcode: `options-loop-guard-timeout`,\n\t\t\tmessage,\n\t\t\tfilename,\n\t\t\ttoString: () => message,\n\t\t});\n\t}\n}\n\nexport default function compile(source: string, options: CompileOptions = {}) {\n\toptions = assign({ generate: 'dom', dev: false }, options);\n\n\tconst stats = new Stats();\n\tconst warnings = [];\n\n\tvalidate_options(options, warnings);\n\n\tstats.start('parse');\n\tconst ast = parse(source, options);\n\tstats.stop('parse');\n\n\tstats.start('create component');\n\tconst component = new Component(\n\t\tast,\n\t\tsource,\n\t\toptions.name || get_name_from_filename(options.filename) || 'Component',\n\t\toptions,\n\t\tstats,\n\t\twarnings\n\t);\n\tstats.stop('create component');\n\n\tconst result = options.generate === false\n\t\t? null\n\t\t: options.generate === 'ssr'\n\t\t\t? render_ssr(component, options)\n\t\t\t: render_dom(component, options);\n\n\treturn component.generate(result);\n}\n","export interface Processed {\n\tcode: string;\n\tmap?: object | string;\n\tdependencies?: string[];\n}\n\nexport interface PreprocessorGroup {\n\tmarkup?: (options: {\n\t\tcontent: string;\n\t\tfilename: string;\n\t}) => Processed | Promise<Processed>;\n\tstyle?: Preprocessor;\n\tscript?: Preprocessor;\n}\n\nexport type Preprocessor = (options: {\n\tcontent: string;\n\tattributes: Record<string, string | boolean>;\n\tfilename?: string;\n}) => Processed | Promise<Processed>;\n\nfunction parse_attributes(str: string) {\n\tconst attrs = {};\n\tstr.split(/\\s+/).filter(Boolean).forEach(attr => {\n\t\tconst p = attr.indexOf('=');\n\t\tif (p === -1) {\n\t\t\tattrs[attr] = true;\n\t\t} else {\n\t\t\tattrs[attr.slice(0, p)] = `'\"`.includes(attr[p + 1]) ?\n\t\t\t\tattr.slice(p + 2, -1) :\n\t\t\t\tattr.slice(p + 1);\n\t\t}\n\t});\n\treturn attrs;\n}\n\ninterface Replacement {\n\toffset: number;\n\tlength: number;\n\treplacement: string;\n}\n\nasync function replace_async(str: string, re: RegExp, func: (...any) => Promise<string>) {\n\tconst replacements: Array<Promise<Replacement>> = [];\n\tstr.replace(re, (...args) => {\n\t\treplacements.push(\n\t\t\tfunc(...args).then(\n\t\t\t\tres =>\n\t\t\t\t\t({\n\t\t\t\t\t\toffset: args[args.length - 2],\n\t\t\t\t\t\tlength: args[0].length,\n\t\t\t\t\t\treplacement: res,\n\t\t\t\t\t}) as Replacement\n\t\t\t)\n\t\t);\n\t\treturn '';\n\t});\n\tlet out = '';\n\tlet last_end = 0;\n\tfor (const { offset, length, replacement } of await Promise.all(\n\t\treplacements\n\t)) {\n\t\tout += str.slice(last_end, offset) + replacement;\n\t\tlast_end = offset + length;\n\t}\n\tout += str.slice(last_end);\n\treturn out;\n}\n\nexport default async function preprocess(\n\tsource: string,\n\tpreprocessor: PreprocessorGroup | PreprocessorGroup[],\n\toptions?: { filename?: string }\n) {\n\t// @ts-ignore todo: doublecheck\n\tconst filename = (options && options.filename) || preprocessor.filename; // legacy\n\tconst dependencies = [];\n\n\tconst preprocessors = Array.isArray(preprocessor) ? preprocessor : [preprocessor];\n\n\tconst markup = preprocessors.map(p => p.markup).filter(Boolean);\n\tconst script = preprocessors.map(p => p.script).filter(Boolean);\n\tconst style = preprocessors.map(p => p.style).filter(Boolean);\n\n\tfor (const fn of markup) {\n\t\tconst processed = await fn({\n\t\t\tcontent: source,\n\t\t\tfilename\n\t\t});\n\t\tif (processed && processed.dependencies) dependencies.push(...processed.dependencies);\n\t\tsource = processed ? processed.code : source;\n\t}\n\n\tfor (const fn of script) {\n\t\tsource = await replace_async(\n\t\t\tsource,\n\t\t\t/<!--[^]*?-->|<script(\\s[^]*?)?>([^]*?)<\\/script>/gi,\n\t\t\tasync (match, attributes = '', content) => {\n\t\t\t\tif (!attributes && !content) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tattributes = attributes || '';\n\t\t\t\tconst processed = await fn({\n\t\t\t\t\tcontent,\n\t\t\t\t\tattributes: parse_attributes(attributes),\n\t\t\t\t\tfilename\n\t\t\t\t});\n\t\t\t\tif (processed && processed.dependencies) dependencies.push(...processed.dependencies);\n\t\t\t\treturn processed ? `<script${attributes}>${processed.code}</script>` : match;\n\t\t\t}\n\t\t);\n\t}\n\n\tfor (const fn of style) {\n\t\tsource = await replace_async(\n\t\t\tsource,\n\t\t\t/<!--[^]*?-->|<style(\\s[^]*?)?>([^]*?)<\\/style>/gi,\n\t\t\tasync (match, attributes = '', content) => {\n\t\t\t\tif (!attributes && !content) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tconst processed: Processed = await fn({\n\t\t\t\t\tcontent,\n\t\t\t\t\tattributes: parse_attributes(attributes),\n\t\t\t\t\tfilename\n\t\t\t\t});\n\t\t\t\tif (processed && processed.dependencies) dependencies.push(...processed.dependencies);\n\t\t\t\treturn processed ? `<style${attributes}>${processed.code}</style>` : match;\n\t\t\t}\n\t\t);\n\t}\n\n\treturn {\n\t\t// TODO return separated output, in future version where svelte.compile supports it:\n\t\t// style: { code: styleCode, map: styleMap },\n\t\t// script { code: scriptCode, map: scriptMap },\n\t\t// markup { code: markupCode, map: markupMap },\n\n\t\tcode: source,\n\t\tdependencies: [...new Set(dependencies)],\n\n\t\ttoString() {\n\t\t\treturn source;\n\t\t}\n\t};\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;AAcA;;;;;;;;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBA;;;;AAIA;AACA;AACA;AACA;;;;;;AAMA;;;;;;;;;;AAUA;;;;;;;;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA;;;;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;AAIA;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnIA;AACA,AA8EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA;;;;;;;;;;;;;;AChHA;AACA;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA;;;;;;;;;;;;;;;;;;;;;;AAsBA;;;;;;;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA;;;;;;;;;;;;AAYA;;;;;;;AAOA;;;;;;;;AAQA;;AAEA;;;;;;;;;AASA;;;;;;;;;AASA;;;;;;;;;;;AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+hCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGA;;;;;AAKA;;;;;;;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA;;;;;;;;;;;;;;;;;AAiBA;;;;;;;;;;;;;;;;;AAiBA;;AAEA;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;AAgBA;;;;;;;;AAQA;;;;;;;;;;;;;;AC9rDA;;;;;;;ACPA;;ACGA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACmDA;;;;;;;;;;ACjFA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA;;;;;AAKA;;;;;;;;;;;;;;;;;;;;;AAqBA;;;;;;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;;;;;;;;;;AC9IA;;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA;;AAEA;;;;AAIA;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;;;;;ACvHA;AACA;;;AAGA;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA;;AAEA;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;AAgBA;;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnFA;AACA;;AAEA;;;;;;;AAOA;;AAEA;;;;;;;;;;;;;;;;;AAiBA;AACA;;AAEA;;;;;;;;;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoLA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsIA;;;;;;;;;;;AAWA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnaA;;;;;;;;;AASA;;;;;;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnCA;;;;;;;ACDA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,AACA;;AAEA;;;;;;;ACnCA;;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDA;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC2LA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/LA;;;;;;;;;;;;;;;;;oFAkBA;;;;;;;;;;;;;;;;;;;;AAoBA;;;;;;;;;;;;;;;;;sFAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9DA;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oFCeA;;;;;;;;;;;;;;;;;;;;AAoBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;qFA6BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtEA,AAMA;AACA;;;;;;;;AAQA;;;;AAIA;;;;ACzBA;;AAEA;;AAEA;;;;AAIA;;;;;;ACPA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0OA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnPA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/RA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC4UA;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4wBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACj4BA;;;;;;AAMA;;;;;;;;;;;;;;;;;;iFAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA;;;;;;;;;;;;;;;+HAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0FC3DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sFCrBA;;;;;;;;;;;;;;;;;;;;;;;;;;yFCMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wHCYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtBA;;;AAGA;;;;;;;;;;AAUA;;;;;;;;;;;;;;;;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1BA;;;;;;;;;;AAUA;;;;;AAKA;;;;;;;;AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACbA;;;;;;;;;;;;;;;;;;;AAmBA;;;;;AAKA;;;;;;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC8cA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjfA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjBA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACKA;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACEA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwHA;;;;;;;;;;;;;;;;;;;;;;ACjKA;;;;;;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpHA;;;;;;;;;;;;;;;ACGA;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGA;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA;;;;;;;;;;;;;;;;;AClZA;AACA;;;;;;;;ACQA;;;;AAIA;;;AAGA;;;;;AAKA;;;;;;;;;;;;;;;;;;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8HA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oICtQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;ACWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;;;;;;;;;;;;;;;gFAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpEA;AACA;;;;;;;;;;;AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpCA;;AAEA;;;;;;;wEAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACIA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;;AAaA;;;;;AAKA;;;;;;;;;;;;;AAaA;;AAEA;;;;;;;;;AASA;;;;;;;;AAQA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;sYAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4oBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mOCnuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2ECTA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACPA;;;;;;;;;;AAUA;;;;;;;mJAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;;;;;;;;;;;;;;;;;;;;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1CA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgyCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0HA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACj5CA;;;;;;;;;;;;;;;;;;;;;AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChDA;;;;;;;;;;;;;;;;;;;;;AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}