From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#74807: 30.0.90; Eglot: Non-Markdown strings rendered as Markdown Date: Sat, 28 Dec 2024 13:02:40 +0200 Message-ID: <86y100t6i7.fsf@gnu.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="27931"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 74807@debbugs.gnu.org, felician.nemeth@gmail.com To: joaotavora@gmail.com, Troy Brown Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Dec 28 12:04:11 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1tRUc6-000766-8K for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 28 Dec 2024 12:04:10 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tRUc0-0004Bg-MD; Sat, 28 Dec 2024 06:04:04 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tRUbz-0004A4-21 for bug-gnu-emacs@gnu.org; Sat, 28 Dec 2024 06:04:03 -0500 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tRUby-0004rZ-ND for bug-gnu-emacs@gnu.org; Sat, 28 Dec 2024 06:04:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:References:In-Reply-To:From:Date:To:Subject; bh=3whfdOBwwivB3+/TLmW1jSl94d9OWcmLVMfWiUaCZxY=; b=vCfAMSClQ71+Z7EM/tvYHwjIkzHQIWmD1QSQDn0HBb5u0zhMR371Ek/vU0gDvKWVRd71p3VMf0TJc9M/iljnidiU9rcvsYbaUQwAuYjP+l9rY8adq8644xsix/2/SaxiH3eTZLBWmTDqbsR2DELUQZa5g5VWxjxmqrPVkVVsjd38jRitW60X2p23PgymXTcxmd6tgjow8Igp1cYXTb9wEHj6AXR+0UHSqtf6tLLdXNpckYbdDUvqx//PkRwXdsSLAUwRy7Gj6Z3Lgk+t2noX3mEA1TWCrjuUI8NiQ8MCnz37j9Vd7VmFbKnM2CvE2rjMSCZaM8ZCCNw1wKWu5v5jlw==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tRUby-0006BQ-IO for bug-gnu-emacs@gnu.org; Sat, 28 Dec 2024 06:04:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 28 Dec 2024 11:04:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 74807 X-GNU-PR-Package: emacs Original-Received: via spool by 74807-submit@debbugs.gnu.org id=B74807.173538381423726 (code B ref 74807); Sat, 28 Dec 2024 11:04:02 +0000 Original-Received: (at 74807) by debbugs.gnu.org; 28 Dec 2024 11:03:34 +0000 Original-Received: from localhost ([127.0.0.1]:48930 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tRUbV-0006Ab-Ot for submit@debbugs.gnu.org; Sat, 28 Dec 2024 06:03:34 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:57982) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tRUbS-0006AL-Nt for 74807@debbugs.gnu.org; Sat, 28 Dec 2024 06:03:31 -0500 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tRUbM-0003wB-KN; Sat, 28 Dec 2024 06:03:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:References:Subject:In-Reply-To:To:From: Date; bh=3whfdOBwwivB3+/TLmW1jSl94d9OWcmLVMfWiUaCZxY=; b=F8qI3OeSwzVN+pKNHTcX Igc8AkgFqs+vNg6a1mblk1P6Jy0Xmy6T0+pO1H2ykbZT89VST63AD0G/kpw+j2smrwBmNfVah+qLB 2I21t3QJpVB7YHmOnzhwkh2EGvZlxhg9zg+iw/G435OHlZuX2kxopwQpkur2RDyDWyiCV9tpqsfoB mCgzfBtVlLJLQrTBQjLD1yumzYrMnEJfYx/VP8EYQplfGUYs97ygkDX3ovDKyrvSn7OH2UwCxa9jD pBSgr8tSHTcSBCXOFkEGXGOzlt5AesCmPmIqivzLkV5WdNOuz7EC5f2nACcJZVbw58T7QZnsaKEhN kJ4oAhZRebOadA==; In-Reply-To: (message from Troy Brown on Thu, 12 Dec 2024 08:32:37 -0500) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:297870 Archived-At: Ping! Can we make some progress here, please? > Cc: 74807@debbugs.gnu.org, felician.nemeth@gmail.com > From: Troy Brown > Date: Thu, 12 Dec 2024 08:32:37 -0500 >=20 > On Thu, Dec 12, 2024 at 3:30=E2=80=AFAM Jo=C3=A3o T=C3=A1vora wrote: > > > > Please provide more of the eglot events log. > > >=20 > I wasn't sure how much more of the log you wanted, so I re-ran the > scenario and provided the entire log. >=20 > [jsonrpc] D[08:22:58.272] Running language server: ada_language_server > --language-gpr > [jsonrpc] e[08:22:58.272] --> initialize[1] > {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"processId":22623= 52,"clientInfo":{"name":"Eglot","version":"1.17.30"},"rootPath":"/home/troy= /","rootUri":"file:///home/troy","initializationOptions":{},"capabilities":= {"workspace":{"applyEdit":true,"executeCommand":{"dynamicRegistration":fals= e},"workspaceEdit":{"documentChanges":true},"didChangeWatchedFiles":{"dynam= icRegistration":true},"symbol":{"dynamicRegistration":false},"configuration= ":true,"workspaceFolders":true},"textDocument":{"synchronization":{"dynamic= Registration":false,"willSave":true,"willSaveWaitUntil":true,"didSave":true= },"completion":{"dynamicRegistration":false,"completionItem":{"snippetSuppo= rt":true,"deprecatedSupport":true,"resolveSupport":{"properties":["document= ation","details","additionalTextEdits"]},"tagSupport":{"valueSet":[1]}},"co= ntextSupport":true},"hover":{"dynamicRegistration":false,"contentFormat":["= markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":false,"signa= tureInformation":{"parameterInformation":{"labelOffsetSupport":true},"docum= entationFormat":["markdown","plaintext"],"activeParameterSupport":true}},"r= eferences":{"dynamicRegistration":false},"definition":{"dynamicRegistration= ":false,"linkSupport":true},"declaration":{"dynamicRegistration":false,"lin= kSupport":true},"implementation":{"dynamicRegistration":false,"linkSupport"= :true},"typeDefinition":{"dynamicRegistration":false,"linkSupport":true},"d= ocumentSymbol":{"dynamicRegistration":false,"hierarchicalDocumentSymbolSupp= ort":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,= 17,18,19,20,21,22,23,24,25,26]}},"documentHighlight":{"dynamicRegistration"= :false},"codeAction":{"dynamicRegistration":false,"resolveSupport":{"proper= ties":["edit","command"]},"dataSupport":true,"codeActionLiteralSupport":{"c= odeActionKind":{"valueSet":["quickfix","refactor","refactor.extract","refac= tor.inline","refactor.rewrite","source","source.organizeImports"]}},"isPref= erredSupport":true},"formatting":{"dynamicRegistration":false},"rangeFormat= ting":{"dynamicRegistration":false},"rename":{"dynamicRegistration":false},= "inlayHint":{"dynamicRegistration":false},"publishDiagnostics":{"relatedInf= ormation":false,"codeDescriptionSupport":false,"tagSupport":{"valueSet":[1,= 2]}}},"window":{"showDocument":{"support":true},"workDoneProgress":true},"g= eneral":{"positionEncodings":["utf-32","utf-8","utf-16"]},"experimental":{}= },"workspaceFolders":[{"uri":"file:///home/troy","name":"~/"}]}} > [jsonrpc] e[08:22:58.336] <-- initialize[1] > {"jsonrpc":"2.0","id":1,"result":{"capabilities":{"textDocumentSync":{"op= enClose":true,"change":1},"completionProvider":{"triggerCharacters":[" > ",".","'"],"resolveProvider":true},"hoverProvider":true,"declarationProvi= der":true,"definitionProvider":true,"documentSymbolProvider":{}}}} > [jsonrpc] e[08:22:58.336] --> initialized > {"jsonrpc":"2.0","method":"initialized","params":{}} > [jsonrpc] e[08:22:58.338] --> textDocument/didOpen > {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument"= :{"uri":"file:///home/troy/junk/hello_world.gpr","version":0,"languageId":"= gpr","text":"project > Hello_World is\n\n package Format is\n end Format;\n\nend > Hello_World;\n"}}} > [jsonrpc] e[08:22:58.338] --> workspace/didChangeConfiguration > {"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"s= ettings":{}}} > [jsonrpc] e[08:22:58.845] --> textDocument/hover[2] > {"jsonrpc":"2.0","id":2,"method":"textDocument/hover","params":{"textDocu= ment":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":3= ,"character":0}}} > [jsonrpc] e[08:22:59.336] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[]}} > [jsonrpc] e[08:23:00.291] <-- textDocument/hover[2] > {"jsonrpc":"2.0","id":2,"result":null} > [jsonrpc] e[08:23:00.839] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":1},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n end Format;\n\nend > Hello_World;\n"}]}} > [jsonrpc] e[08:23:00.839] --> textDocument/hover[3] > {"jsonrpc":"2.0","id":3,"method":"textDocument/hover","params":{"textDocu= ment":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":4= ,"character":3}}} > [jsonrpc] e[08:23:01.822] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[]}} > [jsonrpc] e[08:23:01.823] <-- textDocument/hover[3] > {"jsonrpc":"2.0","id":3,"result":null} > [jsonrpc] e[08:23:01.839] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":2},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n\n end Format;\n\nend > Hello_World;\n"}]}} > [jsonrpc] e[08:23:01.839] --> textDocument/hover[4] > {"jsonrpc":"2.0","id":4,"method":"textDocument/hover","params":{"textDocu= ment":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":4= ,"character":0}}} > [jsonrpc] e[08:23:02.830] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[]}} > [jsonrpc] e[08:23:02.861] <-- textDocument/hover[4] > {"jsonrpc":"2.0","id":4,"result":null} > [jsonrpc] e[08:23:03.358] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":3},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n \n \n end > Format;\n\nend Hello_World;\n"}]}} > [jsonrpc] e[08:23:03.358] --> textDocument/hover[5] > {"jsonrpc":"2.0","id":5,"method":"textDocument/hover","params":{"textDocu= ment":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":4= ,"character":6}}} > [jsonrpc] e[08:23:04.098] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":4},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n for \n \n end > Format;\n\nend Hello_World;\n"}]}} > [jsonrpc] e[08:23:04.098] --> textDocument/completion[6] > {"jsonrpc":"2.0","id":6,"method":"textDocument/completion","params":{"tex= tDocument":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"li= ne":4,"character":10},"context":{"triggerKind":2,"triggerCharacter":" > "}}} > [jsonrpc] e[08:23:04.303] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[]}} > [jsonrpc] e[08:23:04.305] <-- textDocument/hover[5] > {"jsonrpc":"2.0","id":5,"result":null} > [jsonrpc] i[08:23:04.305] anxious continuation to 5 can't run, held up by= (6) > [jsonrpc] e[08:23:04.401] --> textDocument/hover[7] > {"jsonrpc":"2.0","id":7,"method":"textDocument/hover","params":{"textDocu= ment":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":4= ,"character":10}}} > [jsonrpc] e[08:23:04.568] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[{"range":{"start= ":{"line":6,"character":3},"end":{"line":6,"character":3}},"severity":1,"so= urce":"project","message":"Expected > Identifier, got 'end'"}]}} > [jsonrpc] e[08:23:04.573] <-- textDocument/completion[6] > {"jsonrpc":"2.0","id":6,"result":{"isIncomplete":false,"items":[{"label":= "Width","documentation":"Max > line width","data":["Format","Width"]},{"label":"Indentation","documentat= ion":"Indentation > size","data":["Format","Indentation"]},{"label":"Indentation_Kind","docum= entation":"Indentation > kind: spaces | tabs","data":["Format","Indentation_Kind"]},{"label":"Inde= ntation_Continuation","documentation":"Continuation > Line Indentation > size","data":["Format","Indentation_Continuation"]},{"label":"End_Of_Line= ","documentation":"End > of line sequence: lf | > crlf","data":["Format","End_Of_Line"]},{"label":"Charset","documentation"= :"Charset > to use for source decoding","data":["Format","Charset"]}]}} > [jsonrpc] i[08:23:04.573] anxious continuation to 5 running now > [jsonrpc] e[08:23:04.573] <-- textDocument/hover[7] > {"jsonrpc":"2.0","id":7,"result":null} > [jsonrpc] e[08:23:04.585] --> completionItem/resolve[8] > {"jsonrpc":"2.0","id":8,"method":"completionItem/resolve","params":{"labe= l":"Charset","documentation":"Charset > to use for source decoding","data":["Format","Charset"]}} > [jsonrpc] e[08:23:04.590] <-- completionItem/resolve[8] > {"jsonrpc":"2.0","id":8,"result":{"label":"Charset","documentation":"Char= set > to use for source decoding","data":["Format","Charset"]}} > [jsonrpc] e[08:23:06.553] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":5},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n for en\n \n end > Format;\n\nend Hello_World;\n"}]}} > [jsonrpc] e[08:23:06.553] --> completionItem/resolve[9] > {"jsonrpc":"2.0","id":9,"method":"completionItem/resolve","params":{"labe= l":"End_Of_Line","documentation":"End > of line sequence: lf | crlf","data":["Format","End_Of_Line"]}} > [jsonrpc] e[08:23:06.743] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":6},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n for end\n \n > end Format;\n\nend Hello_World;\n"}]}} > [jsonrpc] e[08:23:06.743] --> completionItem/resolve[10] > {"jsonrpc":"2.0","id":10,"method":"completionItem/resolve","params":{"lab= el":"End_Of_Line","documentation":"End > of line sequence: lf | crlf","data":["Format","End_Of_Line"]}} > [jsonrpc] e[08:23:06.823] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[{"range":{"start= ":{"line":6,"character":3},"end":{"line":6,"character":3}},"severity":1,"so= urce":"project","message":"Expected > 'use', got 'end'"}]}} > [jsonrpc] e[08:23:06.830] <-- [9] > {"jsonrpc":"2.0","id":9,"result":{"label":"End_Of_Line","documentation":"= End > of line sequence: lf | crlf","data":["Format","End_Of_Line"]}} > [jsonrpc] i[08:23:06.830] [9] Response to request 9 which has been cancel= ed > [jsonrpc] e[08:23:07.076] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[{"range":{"start= ":{"line":4,"character":10},"end":{"line":4,"character":10}},"severity":1,"= source":"project","message":"Expected > Identifier, got 'end'"}]}} > [jsonrpc] e[08:23:07.105] <-- completionItem/resolve[10] > {"jsonrpc":"2.0","id":10,"result":{"label":"End_Of_Line","documentation":= "End > of line sequence: lf | crlf","data":["Format","End_Of_Line"]}} > [jsonrpc] e[08:23:07.245] --> textDocument/hover[11] > {"jsonrpc":"2.0","id":11,"method":"textDocument/hover","params":{"textDoc= ument":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":= 4,"character":13}}} > [jsonrpc] e[08:23:07.257] <-- textDocument/hover[11] > {"jsonrpc":"2.0","id":11,"result":null} > [jsonrpc] e[08:23:08.466] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":7},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n for end_of\n \n > end Format;\n\nend Hello_World;\n"}]}} > [jsonrpc] e[08:23:08.466] --> textDocument/hover[12] > {"jsonrpc":"2.0","id":12,"method":"textDocument/hover","params":{"textDoc= ument":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":= 4,"character":16}}} > [jsonrpc] e[08:23:08.725] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[{"range":{"start= ":{"line":6,"character":3},"end":{"line":6,"character":3}},"severity":1,"so= urce":"project","message":"Expected > 'use', got 'end'"}]}} > [jsonrpc] e[08:23:08.727] <-- textDocument/hover[12] > {"jsonrpc":"2.0","id":12,"result":null} > [jsonrpc] e[08:23:09.013] --> textDocument/didChange > {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocumen= t":{"uri":"file:///home/troy/junk/hello_world.gpr","version":8},"contentCha= nges":[{"text":"project > Hello_World is\n\n package Format is\n\n for End_Of_Line\n > \n end Format;\n\nend Hello_World;\n"}]}} > [jsonrpc] e[08:23:09.281] <-- textDocument/publishDiagnostics > {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"ur= i":"file:///home/troy/junk/hello_world.gpr","diagnostics":[{"range":{"start= ":{"line":6,"character":3},"end":{"line":6,"character":3}},"severity":1,"so= urce":"project","message":"Expected > 'use', got 'end'"}]}} > [jsonrpc] e[08:23:09.518] --> textDocument/hover[13] > {"jsonrpc":"2.0","id":13,"method":"textDocument/hover","params":{"textDoc= ument":{"uri":"file:///home/troy/junk/hello_world.gpr"},"position":{"line":= 4,"character":21}}} > [jsonrpc] e[08:23:09.531] <-- textDocument/hover[13] > {"jsonrpc":"2.0","id":13,"result":null} >=20 >=20 >=20 >=20