{ "version": "0.9.90-dev", "description": "New test cases in _hyperscript dev branch vs master (0.9.90 additions)", "extracted": "2026-04-08", "stats": { "total_new_tests": 485, "from_new_files": 293, "from_common_files": 192, "new_test_files": [ "test/commands/askAnswer.js", "test/commands/dialog.js", "test/commands/empty.js", "test/commands/focus.js", "test/commands/go.js", "test/commands/halt.js", "test/commands/morph.js", "test/commands/reset.js", "test/commands/scroll.js", "test/commands/select.js", "test/commands/swap.js", "test/core/asyncError.js", "test/core/dom-scope.js", "test/core/evalStatically.js", "test/core/liveTemplate.js", "test/expressions/assignableElements.js", "test/expressions/collectionExpressions.js", "test/expressions/dom-scope.js", "test/expressions/splitJoin.js", "test/ext/component.js", "test/features/bind.js", "test/features/live.js", "test/features/reactive-properties.js", "test/features/resize.js", "test/features/when.js" ], "common_files_with_additions": [ "test/commands/add.js", "test/commands/append.js", "test/commands/default.js", "test/commands/fetch.js", "test/commands/hide.js", "test/commands/increment.js", "test/commands/js.js", "test/commands/measure.js", "test/commands/pick.js", "test/commands/put.js", "test/commands/remove.js", "test/commands/repeat.js", "test/commands/settle.js", "test/commands/show.js", "test/commands/toggle.js", "test/commands/transition.js", "test/core/bootstrap.js", "test/core/parser.js", "test/core/scoping.js", "test/expressions/asExpression.js", "test/expressions/attributeRef.js", "test/expressions/closest.js", "test/expressions/comparisonOperator.js", "test/expressions/cookies.js", "test/expressions/in.js", "test/expressions/logicalOperator.js", "test/expressions/mathOperator.js", "test/expressions/no.js", "test/expressions/objectLiteral.js", "test/expressions/queryRef.js", "test/expressions/relativePositionalExpression.js", "test/features/def.js", "test/features/on.js", "test/features/socket.js" ], "complexity_breakdown": { "simple": 178, "evaluate": 125, "run-eval": 83, "promise": 54, "eval-only": 38, "dialog": 5, "script-tag": 2 }, "category_breakdown": { "features/bind": 44, "features/when": 41, "expressions/comparisonOperator": 40, "features/live": 23, "expressions/collectionExpressions": 22, "expressions/dom-scope": 20, "ext/component": 19, "expressions/asExpression": 17, "core/bootstrap": 14, "commands/empty": 13, "commands/toggle": 11, "commands/dialog": 10, "commands/morph": 10, "core/liveTemplate": 10, "commands/repeat": 10, "commands/default": 9, "commands/reset": 8, "commands/scroll": 8, "core/evalStatically": 8, "expressions/assignableElements": 8, "commands/transition": 8, "commands/halt": 7, "expressions/splitJoin": 7, "commands/pick": 7, "core/parser": 7, "commands/fetch": 6, "commands/askAnswer": 5, "commands/go": 5, "core/dom-scope": 5, "commands/add": 5, "commands/increment": 5, "commands/remove": 5, "features/on": 5, "expressions/mathOperator": 5, "expressions/no": 5, "commands/select": 4, "commands/swap": 4, "features/reactive-properties": 4, "features/socket": 4, "expressions/relativePositionalExpression": 4, "commands/focus": 3, "features/resize": 3, "commands/put": 3, "expressions/closest": 3, "expressions/logicalOperator": 3, "core/asyncError": 2, "commands/measure": 2, "commands/show": 2, "features/def": 2, "commands/append": 1, "commands/hide": 1, "commands/js": 1, "commands/settle": 1, "core/scoping": 1, "expressions/attributeRef": 1, "expressions/cookies": 1, "expressions/in": 1, "expressions/objectLiteral": 1, "expressions/queryRef": 1 } }, "tests": [ { "category": "commands/askAnswer", "name": "prompts and puts result in it", "html": "
", "action": "find('button').click()", "check": "toHaveText(\"Alice\")", "async": true, "complexity": "dialog", "source": "new_file", "file": "test/commands/askAnswer.js", "body": "page.on('dialog', async dialog => {\n\t\t\texpect(dialog.type()).toBe('prompt');\n\t\t\texpect(dialog.message()).toBe('What is your name?');\n\t\t\tawait dialog.accept('Alice');\n\t\t});\n\t\tawait html(\"\");\n\t\tawait find('button').click();\n\t\tawait expect(find('#out')).toHaveText(\"Alice\");" }, { "category": "commands/askAnswer", "name": "returns null on cancel", "html": "", "action": "find('button').click()", "check": "toHaveText(\"null\")", "async": true, "complexity": "dialog", "source": "new_file", "file": "test/commands/askAnswer.js", "body": "page.on('dialog', async dialog => {\n\t\t\tawait dialog.dismiss();\n\t\t});\n\t\tawait html(\"\");\n\t\tawait find('button').click();\n\t\tawait expect(find('#out')).toHaveText(\"null\");" }, { "category": "commands/askAnswer", "name": "shows an alert", "html": "", "action": "find('button').click()", "check": "toHaveText(\"done\"); toBe(\"Hello!\")", "async": true, "complexity": "dialog", "source": "new_file", "file": "test/commands/askAnswer.js", "body": "var alertMessage = null;\n\t\tpage.on('dialog', async dialog => {\n\t\t\talertMessage = dialog.message();\n\t\t\tawait dialog.accept();\n\t\t});\n\t\tawait html(\"\");\n\t\tawait find('button').click();\n\t\tawait expect(find('#out')).toHaveText(\"done\");\n\t\texpect(alertMessage).toBe(\"Hello!\");" }, { "category": "commands/askAnswer", "name": "confirm returns first choice on OK", "html": "", "action": "find('button').click()", "check": "toHaveText(\"Yes\")", "async": true, "complexity": "dialog", "source": "new_file", "file": "test/commands/askAnswer.js", "body": "page.on('dialog', async dialog => {\n\t\t\texpect(dialog.type()).toBe('confirm');\n\t\t\tawait dialog.accept();\n\t\t});\n\t\tawait html(\"\");\n\t\tawait find('button').click();\n\t\tawait expect(find('#out')).toHaveText(\"Yes\");" }, { "category": "commands/askAnswer", "name": "confirm returns second choice on cancel", "html": "", "action": "find('button').click()", "check": "toHaveText(\"No\")", "async": true, "complexity": "dialog", "source": "new_file", "file": "test/commands/askAnswer.js", "body": "page.on('dialog', async dialog => {\n\t\t\tawait dialog.dismiss();\n\t\t});\n\t\tawait html(\"\");\n\t\tawait find('button').click();\n\t\tawait expect(find('#out')).toHaveText(\"No\");" }, { "category": "commands/dialog", "name": "show opens a dialog as modal", "html": "", "action": "find('button').click()", "check": "toHaveAttribute('open'); toHaveAttribute('open')", "async": true, "complexity": "simple", "source": "new_file", "file": "test/commands/dialog.js", "body": "await html(\n\t\t\t\"\" +\n\t\t\t\"\"\n\t\t);\n\t\tawait expect(find('#d')).not.toHaveAttribute('open');\n\t\tawait find('button').click();\n\t\tawait expect(find('#d')).toHaveAttribute('open');" }, { "category": "commands/dialog", "name": "hide closes a dialog", "html": "", "action": "find('#close').click()", "check": "toHaveAttribute('open'); toHaveAttribute('open')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/commands/dialog.js", "body": "await html(\n\t\t\t\"\"\n\t\t);\n\t\tawait evaluate(() => document.getElementById('d').showModal());\n\t\tawait expect(find('#d')).toHaveAttribute('open');\n\t\tawait find('#close').click();\n\t\tawait expect(find('#d')).not.toHaveAttribute('open');" }, { "category": "commands/dialog", "name": "show on already-open dialog is a no-op", "html": "", "action": "find('button').click()", "check": "toHaveAttribute('open'); toHaveAttribute('open')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/commands/dialog.js", "body": "await html(\n\t\t\t\"\"\n\t\t);\n\t\tawait evaluate(() => document.getElementById('d').showModal());\n\t\tawait expect(find('#d')).toHaveAttribute('open');\n\t\tawait find('button').click();\n\t\tawait expect(find('#d')).toHaveAttribute('open');" }, { "category": "commands/dialog", "name": "open opens a dialog", "html": "", "action": "find('button').click()", "check": "toHaveAttribute('open'); toHaveAttribute('open')", "async": true, "complexity": "simple", "source": "new_file", "file": "test/commands/dialog.js", "body": "await html(\n\t\t\t\"\" +\n\t\t\t\"\"\n\t\t);\n\t\tawait expect(find('#d')).not.toHaveAttribute('open');\n\t\tawait find('button').click();\n\t\tawait expect(find('#d')).toHaveAttribute('open');" }, { "category": "commands/dialog", "name": "close closes a dialog", "html": "", "action": "find('#close').click()", "check": "toHaveAttribute('open'); toHaveAttribute('open')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/commands/dialog.js", "body": "await html(\n\t\t\t\"\"\n\t\t);\n\t\tawait evaluate(() => document.getElementById('d').showModal());\n\t\tawait expect(find('#d')).toHaveAttribute('open');\n\t\tawait find('#close').click();\n\t\tawait expect(find('#d')).not.toHaveAttribute('open');" }, { "category": "commands/dialog", "name": "open opens a details element", "html": "Content
Content
Content
Content
Popover content
Popover content
Popover content
Popover content
hello
world
hello
world
a
b
a
b
content
content
old
old
Hello World
", "action": "find('button').click()", "check": "toHaveText(\"Hello\")", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/commands/select.js", "body": "await html(\n\t\t\t\"Hello World
\" +\n\t\t\t\"\" +\n\t\t\t\"\"\n\t\t);\n\t\t// Programmatically select \"Hello\"\n\t\tawait evaluate(() => {\n\t\t\tvar range = document.createRange();\n\t\t\tvar textNode = document.getElementById('text').firstChild;\n\t\t\trange.setStart(textNode, 0);\n\t\t\trange.setEnd(textNode, 5);\n\t\t\twindow.getSelection().removeAllRanges();\n\t\t\twindow.getSelection().addRange(range);\n\t\t});\n\t\tawait find('button').click();\n\t\tawait expect(find('#out')).toHaveText(\"Hello\");" }, { "category": "commands/swap", "name": "can swap two variables", "html": "", "action": "find('#d1').dispatchEvent('click')", "check": "toHaveText(\"ba\")", "async": true, "complexity": "simple", "source": "new_file", "file": "test/commands/swap.js", "body": "await html(``);\n\t\tawait find('#d1').dispatchEvent('click');\n\t\tawait expect(find('#d1')).toHaveText(\"ba\");" }, { "category": "commands/swap", "name": "can swap two properties", "html": "\n\t\t\txy", "action": "find('#d1').dispatchEvent('click')", "check": "toHaveText(\"world\"); toHaveText(\"hello\")", "async": true, "complexity": "simple", "source": "new_file", "file": "test/commands/swap.js", "body": "await html(`\n\t\t\txy`);\n\t\tawait find('#d1').dispatchEvent('click');\n\t\tawait expect(find('#a')).toHaveText(\"world\");\n\t\tawait expect(find('#b')).toHaveText(\"hello\");" }, { "category": "commands/swap", "name": "can swap array elements", "html": "", "action": "find('#d1').dispatchEvent('click')", "check": "toHaveText(\"3,2,1\")", "async": true, "complexity": "simple", "source": "new_file", "file": "test/commands/swap.js", "body": "await html(``);\n\t\tawait find('#d1').dispatchEvent('click');\n\t\tawait expect(find('#d1')).toHaveText(\"3,2,1\");" }, { "category": "commands/swap", "name": "can swap a variable with a property", "html": "\n\t\t\t", "action": "find('#d1').dispatchEvent('click')", "check": "toHaveText(\"new\"); toHaveAttribute('data-val', 'old')", "async": true, "complexity": "simple", "source": "new_file", "file": "test/commands/swap.js", "body": "await html(`\n\t\t\t`);\n\t\tawait find('#d1').dispatchEvent('click');\n\t\tawait expect(find('#d1')).toHaveText(\"new\");\n\t\tawait expect(find('#target')).toHaveAttribute('data-val', 'old');" }, { "category": "features/bind", "name": "syncs variable and input value in both directions", "html": "", "action": "evaluate({...}); await run(\"set $name to '", "check": "toHaveText('Alice'); toHaveText('Bob')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await html(\n\t\t\t`` +\n\t\t\t``\n\t\t)\n\t\tawait expect(find('span')).toHaveText('Alice')\n\n\t\t// User types -> variable updates\n\t\tawait evaluate(() => {\n\t\t\tvar input = document.getElementById('name-input')\n\t\t\tinput.value = 'Bob'\n\t\t\tinput.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t})\n\t\tawait expect(find('span')).toHaveText('Bob')\n\n\t\t// Variable changes -> input updates\n\t\tawait run(\"set $name to 'Charlie'\")\n\t\tawait expect.poll(() => evaluate(() => document.getElementById('name-input').value)).toBe('Charlie')\n\t\tawait evaluate(() => { delete window.$name })" }, { "category": "features/bind", "name": "syncs variable and attribute in both directions", "html": "", "action": "await run(\"set $theme to '; await run(\"set $theme to '", "check": "toHaveAttribute('data-theme', 'light'); toHaveAttribute('data-theme', 'dark')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await run(\"set $theme to 'light'\")\n\t\tawait html(``)\n\t\tawait expect(find('div')).toHaveAttribute('data-theme', 'light')\n\n\t\tawait run(\"set $theme to 'dark'\")\n\t\tawait expect(find('div')).toHaveAttribute('data-theme', 'dark')\n\n\t\tawait evaluate(() => document.querySelector('#work-area div').setAttribute('data-theme', 'auto'))\n\t\tawait expect.poll(() => evaluate(() => window.$theme), { timeout: 5000 }).toBe('auto')\n\t\tawait evaluate(() => { delete window.$theme })" }, { "category": "features/bind", "name": "dedup prevents infinite loop in two-way bind", "html": "", "action": "await run(\"set $color to '; await run(\"set $color to '", "check": "toHaveAttribute('data-color', 'red'); toHaveAttribute('data-color', 'blue')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await run(\"set $color to 'red'\")\n\t\tawait html(``)\n\t\tawait expect(find('div')).toHaveAttribute('data-color', 'red')\n\n\t\tawait run(\"set $color to 'blue'\")\n\t\tawait expect(find('div')).toHaveAttribute('data-color', 'blue')\n\t\tawait expect.poll(() => evaluate(() => window.$color)).toBe('blue')\n\t\tawait evaluate(() => { delete window.$color })" }, { "category": "features/bind", "name": "\"with\" is a synonym for \"and\"", "html": "", "action": "await run(\"set $city to '", "check": "toHaveText('Paris')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await html(\n\t\t\t`` +\n\t\t\t``\n\t\t)\n\t\tawait expect(find('span')).toHaveText('Paris')\n\n\t\tawait run(\"set $city to 'London'\")\n\t\tawait expect.poll(() => evaluate(() => document.getElementById('city-input').value)).toBe('London')\n\t\tawait evaluate(() => { delete window.$city })" }, { "category": "features/bind", "name": "shorthand on text input binds to value", "html": "\">", "action": "find('input').fill('goodbye'); await run(\"set $greeting to '", "check": "", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await html(\n\t\t\t`\">` +\n\t\t\t``\n\t\t)\n\t\tawait expect.poll(() => find('span').textContent()).toBe('hello')\n\n\t\tawait find('input').fill('goodbye')\n\t\tawait expect.poll(() => find('span').textContent()).toBe('goodbye')\n\n\t\tawait run(\"set $greeting to 'hey'\")\n\t\tawait expect.poll(() => evaluate(() => document.querySelector('#work-area input').value)).toBe('hey')\n\t\tawait evaluate(() => { delete window.$greeting })" }, { "category": "features/bind", "name": "shorthand on checkbox binds to checked", "html": "", "action": "await run(\"set $isDarkMode to false\"; await run(\"set $isDarkMode to false\"", "check": "", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await run(\"set $isDarkMode to false\")\n\t\tawait html(\n\t\t\t`` +\n\t\t\t``\n\t\t)\n\t\tawait expect.poll(() => find('span').textContent()).toBe('false')\n\n\t\tawait find('input').check()\n\t\tawait expect.poll(() => find('span').textContent()).toBe('true')\n\n\t\tawait run(\"set $isDarkMode to false\")\n\t\tawait expect.poll(() => evaluate(() => document.querySelector('#work-area input').checked)).toBe(false)\n\t\tawait evaluate(() => { delete window.$isDarkMode })" }, { "category": "features/bind", "name": "shorthand on textarea binds to value", "html": "", "action": "find('textarea').fill('New bio')", "check": "", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await html(\n\t\t\t`` +\n\t\t\t``\n\t\t)\n\t\tawait expect.poll(() => find('span').textContent()).toBe('Hello world')\n\n\t\tawait find('textarea').fill('New bio')\n\t\tawait expect.poll(() => find('span').textContent()).toBe('New bio')\n\t\tawait evaluate(() => { delete window.$bio })" }, { "category": "features/bind", "name": "shorthand on select binds to value", "html": "", "action": "", "check": "", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/features/bind.js", "body": "await html(\n\t\t\t`` +\n\t\t\t``\n\t\t)\n\t\tawait expect.poll(() => find('span').textContent()).toBe('us')\n\n\t\tawait find('select').selectOption('uk')\n\t\tawait expect.poll(() => find('span').textContent()).toBe('uk')\n\t\tawait evaluate(() => { delete window.$country })" }, { "category": "features/bind", "name": "unsupported element: bind to plain div errors", "html": "", "action": "", "check": "", "async": true, "complexity": "promise", "source": "new_file", "file": "test/features/bind.js", "body": "const error = await evaluate(() => {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tvar origError = console.error\n\t\t\t\tconsole.error = function(msg) {\n\t\t\t\t\tif (typeof msg === 'string' && msg.includes('bind cannot auto-detect')) {\n\t\t\t\t\t\tresolve(msg)\n\t\t\t\t\t}\n\t\t\t\t\torigError.apply(console, arguments)\n\t\t\t\t}\n\t\t\t\tvar wa = document.getElementById('work-area')\n\t\t\t\twa.innerHTML = ''\n\t\t\t\t_hyperscript.processNode(wa)\n\t\t\t\tsetTimeout(() => { console.error = origError; resolve(null) }, 500)\n\t\t\t})\n\t\t})\n\t\texpect(await evaluate(() => window.$nope)).toBeUndefined()" }, { "category": "features/bind", "name": "shorthand on type=number preserves number type", "html": "", "action": "await run(\"set $price to 42\"", "check": "toHaveText('42')", "async": true, "complexity": "promise", "source": "new_file", "file": "test/features/bind.js", "body": "await run(\"set $price to 42\")\n\t\tawait html(\n\t\t\t`` +\n\t\t\t``\n\t\t)\n\t\tawait new Promise(r => setTimeout(r, 200))\n\t\texpect(await evaluate(() => typeof window.$price)).toBe('number')\n\t\tawait expect(find('span')).toHaveText('42')\n\t\tawait evaluate(() => { delete window.$price })" }, { "category": "features/bind", "name": "boolean bind to attribute uses presence/absence", "html": "", "action": "await run(\"set $isEnabled to true\"; await run(\"set $isEnabled to false\"", "check": "toHaveAttribute('data-active', '')", "async": true, "complexity": "promise", "source": "new_file", "file": "test/features/bind.js", "body": "await run(\"set $isEnabled to true\")\n\t\tawait html(``)\n\t\tawait new Promise(r => setTimeout(r, 100))\n\t\tawait expect(find('div')).toHaveAttribute('data-active', '')\n\n\t\tawait run(\"set $isEnabled to false\")\n\t\tawait new Promise(r => setTimeout(r, 100))\n\t\texpect(await evaluate(() =>\n\t\t\tdocument.querySelector('#work-area div').hasAttribute('data-active')\n\t\t)).toBe(false)\n\t\tawait evaluate(() => { delete window.$isEnabled })" }, { "category": "features/bind", "name": "boolean bind to aria-* attribute uses \"true\"/\"false\" strings", "html": "", "action": "await run(\"set $isHidden to true\"; await run(\"set $isHidden to false\"", "check": "toHaveAttribute('aria-hidden', 'true'); toHaveAttribute('aria-hidden', 'false')", "async": true, "complexity": "promise", "source": "new_file", "file": "test/features/bind.js", "body": "await run(\"set $isHidden to true\")\n\t\tawait html(``)\n\t\tawait new Promise(r => setTimeout(r, 100))\n\t\tawait expect(find('div')).toHaveAttribute('aria-hidden', 'true')\n\n\t\tawait run(\"set $isHidden to false\")\n\t\tawait new Promise(r => setTimeout(r, 100))\n\t\tawait expect(find('div')).toHaveAttribute('aria-hidden', 'false')\n\t\tawait evaluate(() => { delete window.$isHidden })" }, { "category": "features/bind", "name": "style bind is one-way: variable drives style, not vice versa", "html": "Hello, ${\"\\x24\"}{$ltGlobal}!
\n\t\t\t\n\t\t", "action": "await run(\"set $ltGlobal to '; await run(\"set $ltGlobal to '", "check": "", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/core/liveTemplate.js", "body": "await run(\"set $ltGlobal to 'World'\")\n\t\tawait html(`\n\t\t\t\n\t\t\t\tHello, ${\"\\x24\"}{$ltGlobal}!
\n\t\t\t\n\t\t`)\n\t\tawait expect.poll(() => find('[data-live-template] p').textContent()).toBe('Hello, World!')\n\t\tawait run(\"set $ltGlobal to 'Carson'\")\n\t\tawait expect.poll(() => find('[data-live-template] p').textContent()).toBe('Hello, Carson!')\n\t\tawait evaluate(() => { delete window.$ltGlobal })" }, { "category": "core/liveTemplate", "name": "wrapper has display:contents", "html": "\n\t\t\t\n\t\t\t\ttest\n\t\t\t\n\t\t", "action": "", "check": "toBe('contents')", "async": true, "complexity": "evaluate", "source": "new_file", "file": "test/core/liveTemplate.js", "body": "await html(`\n\t\t\t\n\t\t\t\ttest\n\t\t\t\n\t\t`)\n\t\tawait expect.poll(() => find('[data-live-template] span').textContent()).toBe('test')\n\t\tvar display = await evaluate(() =>\n\t\t\tdocument.querySelector('[data-live-template]').style.display\n\t\t)\n\t\texpect(display).toBe('contents')" }, { "category": "core/liveTemplate", "name": "multiple live templates are independent", "html": "\n\t\t\t\n\t\t\t\t${\"\\x24\"}{^x}\n\t\t\t\n\t\t\t\n\t\t\t\t${\"\\x24\"}{^x}\n\t\t\t\n\t\t", "action": "", "check": "", "async": true, "complexity": "simple", "source": "new_file", "file": "test/core/liveTemplate.js", "body": "await html(`\n\t\t\t\n\t\t\t\t${\"\\x24\"}{^x}\n\t\t\t\n\t\t\t\n\t\t\t\t${\"\\x24\"}{^x}\n\t\t\t\n\t\t`)\n\t\tawait expect.poll(() => find('[data-live-template] .a').textContent()).toBe('first')\n\t\tawait expect.poll(() => find('[data-live-template] .b').textContent()).toBe('second')" }, { "category": "expressions/assignableElements", "name": "set #id replaces element with HTML string", "html": "one
two
one
\" +\n\t\t\t\"two
\" +\n\t\t\t\"| in the closest |
| in the closest |
| in the closest |
| in the closest |
| in the closest |
| \" +\n\t\t\t\"\" +\n\t\t\t\"\" +\n\t\t\t\" in the closest |