This is an automated email from the ASF dual-hosted git repository.

jlahoda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new d2ae8ba  Semantic highlight support for both the LSP client and Java 
LSP server.
d2ae8ba is described below

commit d2ae8ba167c659458deca4a8cea3177af8450947
Author: Jan Lahoda <jlah...@netbeans.org>
AuthorDate: Fri Jan 14 07:22:39 2022 +0100

    Semantic highlight support for both the LSP client and Java LSP server.
---
 ide/lsp.client/external/binaries-list              |    6 +-
 ...-0.9.0-license.txt => lsp4j-0.12.0-license.txt} |    4 +-
 ide/lsp.client/nbproject/project.properties        |    6 +-
 ide/lsp.client/nbproject/project.xml               |   12 +-
 .../netbeans/modules/lsp/client/LSPBindings.java   |   23 +-
 .../src/org/netbeans/modules/lsp/client/Utils.java |    4 +
 .../lsp/client/bindings/BreadcrumbsImpl.java       |    2 +-
 .../client/bindings/CompletionProviderImpl.java    |    8 +-
 .../modules/lsp/client/bindings/Formatter.java     |    8 +-
 .../lsp/client/bindings/LanguageClientImpl.java    |   57 +
 .../lsp/client/bindings/MarkOccurrences.java       |    3 +-
 .../lsp/client/bindings/SemanticHighlight.java     |  207 ++++
 .../TextDocumentSyncServerCapabilityHandler.java   |    5 +
 .../refactoring/RefactoringActionsProvider.java    |    3 +-
 .../textmate/lexer/resources/fontsColors.xml       |   36 +
 .../modules/java/lsp/server/protocol/Server.java   |   23 +-
 .../server/protocol/TextDocumentServiceImpl.java   |  150 +++
 .../java/lsp/server/protocol/ServerTest.java       |   95 ++
 java/java.lsp.server/vscode/package-lock.json      | 1160 +++++++++++++++++++-
 .../org/netbeans/nbbuild/extlibs/ignored-overlaps  |    6 +-
 20 files changed, 1785 insertions(+), 33 deletions(-)

diff --git a/ide/lsp.client/external/binaries-list 
b/ide/lsp.client/external/binaries-list
index a8dc71e..c89b3b0 100644
--- a/ide/lsp.client/external/binaries-list
+++ b/ide/lsp.client/external/binaries-list
@@ -15,9 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 
-4FF29B93C50F6768C9A73040AE818E96EB2E68DB 
org.eclipse.lsp4j:org.eclipse.lsp4j:0.9.0
-DA453B2A6C9BBD9369DE41365C59E88574EC1F0B 
org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.9.0
-1CF7FCE1E2F4DFA76C3B91E4C2D72EA0C6899945 
org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.9.0
+419B5181A4B2D054BF8FF764FCEB67DF09D87E7D 
org.eclipse.lsp4j:org.eclipse.lsp4j:0.12.0
+80607078CEB77F92C6BFEC3CDEC050D3222EFDFF 
org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.12.0
+8A80D1368F19A2F6E328E41B9BC68E53C628C68B 
org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.12.0
 751B324BED8C077BF6B7B8C2055595EB8C28509D 
org.eclipse.xtend:org.eclipse.xtend.lib:2.19.0
 F3626A047A3ABFA47CF62D76BDEF1D246F7985F6 
org.eclipse.xtend:org.eclipse.xtend.lib.macro:2.19.0
 997BA9935D0069B3F1CD2F93B56B91D24E9C60A0 
org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.19.0
diff --git a/ide/lsp.client/external/lsp4j-0.9.0-license.txt 
b/ide/lsp.client/external/lsp4j-0.12.0-license.txt
similarity index 99%
rename from ide/lsp.client/external/lsp4j-0.9.0-license.txt
rename to ide/lsp.client/external/lsp4j-0.12.0-license.txt
index 208dfb7..7151ac5 100644
--- a/ide/lsp.client/external/lsp4j-0.9.0-license.txt
+++ b/ide/lsp.client/external/lsp4j-0.12.0-license.txt
@@ -1,10 +1,10 @@
 Name: Eclipse Language Server Protocol Library
 Origin: Eclipse
-Version: 0.9.0
+Version: 0.12.0
 License: EPL-v20
 URL: http://www.eclipse.org/
 Description: Eclipse Language Server Protocol Library
-Files: org.eclipse.lsp4j-0.9.0.jar org.eclipse.lsp4j.generator-0.9.0.jar 
org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+Files: org.eclipse.lsp4j-0.12.0.jar org.eclipse.lsp4j.generator-0.12.0.jar 
org.eclipse.lsp4j.jsonrpc-0.12.0.jar
 
 Eclipse Public License - v 2.0
 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC 
LICENSE (“AGREEMENT”). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM 
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
diff --git a/ide/lsp.client/nbproject/project.properties 
b/ide/lsp.client/nbproject/project.properties
index f6a201b..f2bd513 100644
--- a/ide/lsp.client/nbproject/project.properties
+++ b/ide/lsp.client/nbproject/project.properties
@@ -18,9 +18,9 @@
 javac.source=1.8
 javac.compilerargs=-Xlint -Xlint:-serial
 javadoc.arch=${basedir}/arch.xml
-release.external/org.eclipse.lsp4j-0.9.0.jar=modules/ext/org.eclipse.lsp4j-0.9.0.jar
-release.external/org.eclipse.lsp4j.generator-0.9.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.9.0.jar
-release.external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+release.external/org.eclipse.lsp4j-0.12.0.jar=modules/ext/org.eclipse.lsp4j-0.12.0.jar
+release.external/org.eclipse.lsp4j.generator-0.12.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.12.0.jar
+release.external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar
 
release.external/org.eclipse.xtend.lib-2.19.0.jar=modules/ext/org.eclipse.xtend.lib-2.19.0.jar
 
release.external/org.eclipse.xtend.lib.macro-2.19.0.jar=modules/ext/org.eclipse.xtend.lib.macro-2.19.0.jar
 
release.external/org.eclipse.xtext.xbase.lib-2.19.0.jar=modules/ext/org.eclipse.xtext.xbase.lib-2.19.0.jar
diff --git a/ide/lsp.client/nbproject/project.xml 
b/ide/lsp.client/nbproject/project.xml
index 031be98..ffd8417 100644
--- a/ide/lsp.client/nbproject/project.xml
+++ b/ide/lsp.client/nbproject/project.xml
@@ -414,16 +414,16 @@
                 <package>org.netbeans.modules.lsp.client.spi</package>
             </public-packages>
             <class-path-extension>
-                
<runtime-relative-path>ext/org.eclipse.lsp4j-0.9.0.jar</runtime-relative-path>
-                
<binary-origin>external/org.eclipse.lsp4j-0.9.0.jar</binary-origin>
+                
<runtime-relative-path>ext/org.eclipse.lsp4j-0.12.0.jar</runtime-relative-path>
+                
<binary-origin>external/org.eclipse.lsp4j-0.12.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 
<runtime-relative-path>ext/org.eclipse.xtend.lib.macro-2.19.0.jar</runtime-relative-path>
                 
<binary-origin>external/org.eclipse.xtend.lib.macro-2.19.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                
<runtime-relative-path>ext/org.eclipse.lsp4j.generator-0.9.0.jar</runtime-relative-path>
-                
<binary-origin>external/org.eclipse.lsp4j.generator-0.9.0.jar</binary-origin>
+                
<runtime-relative-path>ext/org.eclipse.lsp4j.generator-0.12.0.jar</runtime-relative-path>
+                
<binary-origin>external/org.eclipse.lsp4j.generator-0.12.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 
<runtime-relative-path>ext/org.eclipse.xtend.lib-2.19.0.jar</runtime-relative-path>
@@ -434,8 +434,8 @@
                 
<binary-origin>external/org.eclipse.xtext.xbase.lib-2.19.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                
<runtime-relative-path>ext/org.eclipse.lsp4j.jsonrpc-0.9.0.jar</runtime-relative-path>
-                
<binary-origin>external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar</binary-origin>
+                
<runtime-relative-path>ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar</runtime-relative-path>
+                
<binary-origin>external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
index 88f8500..4b196db 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
@@ -18,6 +18,7 @@
  */
 package org.netbeans.modules.lsp.client;
 
+import com.google.gson.InstanceCreator;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -25,6 +26,7 @@ import java.io.OutputStream;
 import java.lang.ref.Reference;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
+import java.lang.reflect.Type;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.net.URI;
@@ -48,10 +50,13 @@ import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import javax.swing.event.ChangeListener;
 import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.CompletionCapabilities;
 import org.eclipse.lsp4j.DocumentSymbolCapabilities;
 import org.eclipse.lsp4j.InitializeParams;
 import org.eclipse.lsp4j.InitializeResult;
 import org.eclipse.lsp4j.ResourceOperationKind;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensLegend;
 import org.eclipse.lsp4j.ServerCapabilities;
 import org.eclipse.lsp4j.SymbolCapabilities;
 import org.eclipse.lsp4j.SymbolKind;
@@ -268,7 +273,23 @@ public class LSPBindings {
                     InputStream in = 
LanguageServerProviderAccessor.getINSTANCE().getInputStream(desc);
                     OutputStream out = 
LanguageServerProviderAccessor.getINSTANCE().getOutputStream(desc);
                     Process p = 
LanguageServerProviderAccessor.getINSTANCE().getProcess(desc);
-                    Launcher<LanguageServer> launcher = 
LSPLauncher.createClientLauncher(lci, in, out);
+                    Launcher<LanguageServer> launcher = new 
LSPLauncher.Builder<LanguageServer>()
+                                                                       
.setLocalService(lci)
+                                                                       
.setRemoteInterface(LanguageServer.class)
+                                                                       
.setInput(in)
+                                                                       
.setOutput(out)
+                                                                       
.configureGson(gson -> {
+                       gson.registerTypeAdapter(SemanticTokensLegend.class, 
new InstanceCreator<SemanticTokensLegend>() {
+                           @Override public SemanticTokensLegend 
createInstance(Type type) {
+                               return new 
SemanticTokensLegend(Collections.emptyList(), Collections.emptyList());
+                           }
+                       });
+                       gson.registerTypeAdapter(SemanticTokens.class, new 
InstanceCreator<SemanticTokens>() {
+                           @Override public SemanticTokens createInstance(Type 
type) {
+                               return new 
SemanticTokens(Collections.emptyList());
+                           }
+                       });
+                    }).create();
                     launcher.startListening();
                     LanguageServer server = launcher.getRemoteProxy();
                     InitializeResult result = initServer(p, server, dir); 
//XXX: what if a different root is expected????
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
index 746eff4..9301f0a 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
@@ -301,4 +301,8 @@ public class Utils {
     public static boolean isTrue(Boolean b) {
         return b != null && b;
     }
+    public static boolean isEnabled(Either<Boolean, ?> settings) {
+        return settings != null && (settings.isLeft() ? 
isTrue(settings.getLeft())
+                                                       : settings.getRight() 
!= null);
+    }
 }
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
index 8e6cf96..90f8453 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
@@ -337,7 +337,7 @@ public class BreadcrumbsImpl implements BackgroundTask {
                 LSPBindings bindings = file != null ? 
LSPBindings.getBindings(file) : null;
                 Runnable r;
 
-                if (bindings != null && 
Utils.isTrue(bindings.getInitResult().getCapabilities().getDocumentSymbolProvider()))
 {
+                if (bindings != null && 
Utils.isEnabled(bindings.getInitResult().getCapabilities().getDocumentSymbolProvider()))
 {
                     r = () -> {
                         setPreferredSize(sidebar.getPreferredSize());
                         setMaximumSize(sidebar.getMaximumSize());
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
index 92fcd22..0fba1fc 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
@@ -189,7 +189,13 @@ public class CompletionProviderImpl implements 
CompletionProvider {
                                 commit("");
                             }
                             private void commit(String appendText) {
-                                TextEdit te = i.getTextEdit();
+                                if (i.getTextEdit().isRight()) {
+                                    //TODO: the NetBeans client does not 
current support InsertReplaceEdits, should not happen
+                                    Completion.get().hideDocumentation();
+                                    Completion.get().hideCompletion();
+                                    return ;
+                                }
+                                TextEdit te = i.getTextEdit().getLeft();
                                 NbDocument.runAtomic((StyledDocument) doc, () 
-> {
                                     try {
                                         int endPos;
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java
index 045e490..f56b085 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java
@@ -73,11 +73,11 @@ public class Formatter implements ReformatTask {
         if (file != null) {
             LSPBindings bindings = LSPBindings.getBindings(file);
             if (bindings != null) {
-                Boolean documentFormatting = 
bindings.getInitResult().getCapabilities().getDocumentFormattingProvider();
-                Boolean rangeFormatting = 
bindings.getInitResult().getCapabilities().getDocumentRangeFormattingProvider();
-                if (rangeFormatting != null && rangeFormatting) {
+                boolean documentFormatting = 
Utils.isEnabled(bindings.getInitResult().getCapabilities().getDocumentFormattingProvider());
+                boolean rangeFormatting = 
Utils.isEnabled(bindings.getInitResult().getCapabilities().getDocumentRangeFormattingProvider());
+                if (rangeFormatting) {
                     rangeFormat(file, bindings);
-                } else if (documentFormatting != null && documentFormatting) {
+                } else if (documentFormatting) {
                     documentFormat(file, bindings);
                 }
             }
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
index f655fa0..0fada4a 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
@@ -27,6 +27,7 @@ import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumMap;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -35,6 +36,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
+import javax.swing.SwingUtilities;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
 import javax.swing.text.StyledDocument;
@@ -52,14 +54,21 @@ import org.eclipse.lsp4j.DiagnosticSeverity;
 import org.eclipse.lsp4j.ExecuteCommandParams;
 import org.eclipse.lsp4j.MessageActionItem;
 import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.lsp4j.ProgressParams;
 import org.eclipse.lsp4j.PublishDiagnosticsParams;
 import org.eclipse.lsp4j.ServerCapabilities;
 import org.eclipse.lsp4j.ShowMessageRequestParams;
 import org.eclipse.lsp4j.TextDocumentIdentifier;
 import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.WorkDoneProgressBegin;
+import org.eclipse.lsp4j.WorkDoneProgressCreateParams;
+import org.eclipse.lsp4j.WorkDoneProgressEnd;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.WorkDoneProgressReport;
 import org.eclipse.lsp4j.WorkspaceEdit;
 import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.eclipse.lsp4j.services.LanguageClient;
+import org.netbeans.api.progress.*;
 import org.netbeans.modules.lsp.client.LSPBindings;
 import org.netbeans.modules.lsp.client.Utils;
 import org.netbeans.spi.editor.hints.ChangeInfo;
@@ -74,6 +83,7 @@ import org.openide.filesystems.FileObject;
 import org.openide.filesystems.URLMapper;
 import org.openide.text.NbDocument;
 import org.openide.util.Exceptions;
+import org.openide.util.NbBundle.Messages;
 import org.openide.util.RequestProcessor;
 
 /**
@@ -101,6 +111,53 @@ public class LanguageClientImpl implements LanguageClient {
     }
 
     @Override
+    public CompletableFuture<Void> createProgress(WorkDoneProgressCreateParams 
params) {
+        return CompletableFuture.completedFuture(null);
+    }
+
+    private final Map<Object, ProgressHandle> key2Progress = new HashMap<>();
+
+    public void notifyProgress(ProgressParams params) {
+        Either<WorkDoneProgressNotification, Object> value = params.getValue();
+        if (value.isRight()) {
+            return ;
+        }
+        WorkDoneProgressNotification n = value.getLeft();
+        SwingUtilities.invokeLater(() -> {
+            switch (n.getKind()) {
+                case begin: {
+                    WorkDoneProgressBegin progress = (WorkDoneProgressBegin) n;
+                    ProgressHandle handle = 
ProgressHandle.createHandle(progress.getTitle());
+                    key2Progress.put(params.getToken().get(), handle);
+                    handle.start();
+                    handle.progress(progress.getMessage());
+                    break;
+                }
+                case report: {
+                    WorkDoneProgressReport progress = (WorkDoneProgressReport) 
n;
+                    ProgressHandle handle = 
key2Progress.get(params.getToken().get());
+                    if (progress.getPercentage() != null) {
+                        handle.switchToDeterminate(100);
+                        handle.progress(progress.getPercentage());
+                    } else {
+                        handle.switchToIndeterminate();
+                    }
+                    if (progress.getMessage() != null) {
+                        handle.progress(progress.getMessage());
+                    }
+                    break;
+                }
+                case end: {
+                    WorkDoneProgressEnd progress = (WorkDoneProgressEnd) n;
+                    ProgressHandle handle = 
key2Progress.get(params.getToken().get());
+                    handle.finish();
+                    break;
+                }
+            }
+        });
+    }
+
+    @Override
     public void publishDiagnostics(PublishDiagnosticsParams pdp) {
         try {
             FileObject file = URLMapper.findFileObject(new 
URI(pdp.getUri()).toURL());
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java
index 751b932..ec62836 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java
@@ -93,8 +93,7 @@ public class MarkOccurrences implements BackgroundTask, 
CaretListener, PropertyC
         if (server == null) {
             return result;
         }
-        Boolean hasDocumentHighlight = 
server.getInitResult().getCapabilities().getDocumentHighlightProvider();
-        if (hasDocumentHighlight == null || !hasDocumentHighlight) {
+        if 
(!Utils.isEnabled(server.getInitResult().getCapabilities().getDocumentHighlightProvider()))
 {
             return result;
         }
         String uri = Utils.toURI(file);
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java
new file mode 100644
index 0000000..e40323a
--- /dev/null
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.lsp.client.bindings;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensLegend;
+import org.eclipse.lsp4j.SemanticTokensParams;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.generator.JsonRpcData;
+import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
+import org.netbeans.api.editor.mimelookup.MimeLookup;
+import org.netbeans.api.editor.mimelookup.MimePath;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.api.editor.settings.AttributesUtilities;
+import org.netbeans.api.editor.settings.FontColorSettings;
+import org.netbeans.modules.lsp.client.LSPBindings;
+import org.netbeans.modules.lsp.client.LSPBindings.BackgroundTask;
+import org.netbeans.modules.lsp.client.Utils;
+import org.netbeans.spi.editor.highlighting.HighlightsLayer;
+import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory;
+import org.netbeans.spi.editor.highlighting.ZOrder;
+import org.netbeans.spi.editor.highlighting.support.OffsetsBag;
+import org.openide.filesystems.FileObject;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author lahvac
+ */
+public class SemanticHighlight implements BackgroundTask {
+
+    private final Document doc;
+
+    public SemanticHighlight(JTextComponent c) {
+        this.doc = c.getDocument();
+    }
+
+    @Override
+    public void run(LSPBindings bindings, FileObject file) {
+        try {
+            OffsetsBag target = new OffsetsBag(doc);
+            SemanticTokensParams params = new SemanticTokensParams(new 
TextDocumentIdentifier(Utils.toURI(file)));
+            SemanticTokens tokens = 
bindings.getTextDocumentService().semanticTokensFull(params).get();
+            List<Integer> data = tokens.getData();
+            int lastLine = 0;
+            int lastColumn = 0;
+            int offset = 0;
+            for (int i = 0; i < data.size(); i += 5) {
+                int deltaLine = data.get(i).intValue();
+                int deltaColumn = data.get(i + 1).intValue();
+                if (deltaLine == 0) {
+                    lastColumn += deltaColumn;
+                    offset += deltaColumn;
+                } else {
+                    lastLine += deltaLine;
+                    lastColumn = deltaColumn;
+                    offset = Utils.getOffset(doc, new Position(lastLine, 
lastColumn));
+                }
+                if (data.get(i + 2).intValue() <= 0) {
+                    continue; //XXX!
+                }
+                AttributeSet tokenHighlight = tokenHighlight(bindings, 
data.get(i + 3).intValue(), data.get(i + 4).intValue());
+                target.addHighlight(offset, offset + data.get(i + 
2).intValue(), tokenHighlight);
+            }
+            getBag(doc).setHighlights(target);
+        } catch (InterruptedException | ExecutionException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
+
+    private final Map<Integer, Map<Integer, AttributeSet>> tokenId2Highlight = 
new HashMap<>();
+
+    private AttributeSet tokenHighlight(LSPBindings bindings, int tokenId, int 
modifiers) {
+        return tokenId2Highlight.computeIfAbsent(tokenId, s -> new HashMap<>())
+                                .computeIfAbsent(modifiers, mods -> {
+            SemanticTokensLegend legend = 
bindings.getInitResult().getCapabilities().getSemanticTokensProvider().getLegend();
+            List<String> tokenTypes = legend.getTokenTypes();
+            if (tokenId >= tokenTypes.size()) {
+                //invalid token id
+                return EMPTY;
+            }
+            String tokenName = tokenTypes.get(tokenId);
+            boolean isStatic = false;
+            boolean isDeclaration = false;
+            while (mods != 0) {
+                int mod = Integer.highestOneBit(mods);
+                switch 
(legend.getTokenModifiers().get(Integer.numberOfTrailingZeros(mod))) {
+                    case "static": isStatic = true; break;
+                    case "definition":
+                    case "declaration": isDeclaration = true; break;
+                }
+                mods &= ~mod;
+            }
+            FontColorSettings fcs = 
MimeLookup.getLookup("text/textmate").lookup(FontColorSettings.class);
+
+            if (fcs == null) {
+                return EMPTY;
+            }
+
+            assert fcs != null;
+
+            AttributeSet colors = fcs.getTokenFontColors("mod-" + tokenName + 
(isDeclaration ? "-declaration" : ""));
+            AttributeSet statik = isStatic ? 
fcs.getTokenFontColors("mod-static") : null;
+
+            if (colors != null && statik != null) {
+                return AttributesUtilities.createComposite(colors, statik);
+            } else if (colors != null) {
+                return colors;
+            } else if (statik != null) {
+                return statik;
+            }
+
+            return EMPTY;
+        });
+    }
+
+    private static final AttributeSet EMPTY = 
AttributesUtilities.createImmutable();
+
+    private static OffsetsBag getBag(Document doc) {
+        OffsetsBag bag = (OffsetsBag) doc.getProperty(SemanticHighlight.class);
+
+        if (bag == null) {
+            doc.putProperty(SemanticHighlight.class, bag = new 
OffsetsBag(doc));
+        }
+
+        return bag;
+    }
+
+    @MimeRegistration(mimeType="", service=HighlightsLayerFactory.class)
+    public static final class HighlightsLayerFactoryImpl implements 
HighlightsLayerFactory {
+
+        @Override
+        public HighlightsLayer[] createLayers(Context context) {
+            return new HighlightsLayer[] {
+                HighlightsLayer.create(SemanticHighlight.class.getName(), 
ZOrder.SYNTAX_RACK.forPosition(1000), true, getBag(context.getDocument()))
+            };
+        }
+        
+    }
+    
+//    @JsonRpcData
+//    public static class SemanticTokensParams {
+//
+//        private TextDocumentIdentifier textDocument;
+//
+//        public SemanticTokensParams() {
+//        }
+//
+//        public SemanticTokensParams(TextDocumentIdentifier textDocument) {
+//            this.textDocument = textDocument;
+//        }
+//
+//        public TextDocumentIdentifier getTextDocument() {
+//            return textDocument;
+//        }
+//
+//        public void setTextDocument(TextDocumentIdentifier textDocument) {
+//            this.textDocument = textDocument;
+//        }
+// 
+//    }
+//
+//    @JsonRpcData
+//    public static class SemanticTokens {
+//        private List<Number> data;
+//
+//        public List<Number> getData() {
+//            return data;
+//        }
+//
+//        public void setData(List<Number> data) {
+//            this.data = data;
+//        }
+//
+//    }
+//    public interface SemanticService {
+//        @JsonRequest("textDocument/semanticTokens/full")
+//        public CompletableFuture<SemanticTokens> 
semanticTokensFull(SemanticTokensParams params);
+//    }
+}
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
index e7936bd..2659afd 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
@@ -336,6 +336,11 @@ public class TextDocumentSyncServerCapabilityHandler {
                     LSPBindings.addBackgroundTask(file, bi);
                     c.putClientProperty(BreadcrumbsImpl.class, bi);
                 }
+                if (c.getClientProperty(SemanticHighlight.class) == null) {
+                    SemanticHighlight sh = new SemanticHighlight(c);
+                    LSPBindings.addBackgroundTask(file, sh);
+                    c.putClientProperty(SemanticHighlight.class, sh);
+                }
             });
         });
     }
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java
index 5eff44b..cf5d455 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java
@@ -161,8 +161,7 @@ public class RefactoringActionsProvider extends 
ActionsImplementationProvider{
         if (bindings == null) {
             return false;
         }
-        Boolean hasReferences = 
bindings.getInitResult().getCapabilities().getReferencesProvider();
-        return Utils.isTrue(hasReferences);
+        return 
Utils.isEnabled(bindings.getInitResult().getCapabilities().getReferencesProvider());
     }
 
     @Override
diff --git 
a/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml
 
b/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml
index be6e632..27acc9b 100644
--- 
a/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml
+++ 
b/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml
@@ -53,4 +53,40 @@
     <fontcolor name="support.constant" default="keyword" />
     <fontcolor name="variable.language" default="keyword" />
 
+    <fontcolor name="mod-namespace" default="identifier" />
+    <fontcolor name="mod-package" default="identifier" />
+    <fontcolor name="mod-function" default="method" />
+    <fontcolor name="mod-method" default="method" />
+    <fontcolor name="mod-macro" default="mod-function" />
+    <fontcolor name="mod-parameter" default="parameter"/>
+    <fontcolor name="mod-variable" default="identifier"/>
+    <fontcolor name="mod-struct" default="identifier"/>
+    <fontcolor name="mod-enum" default="identifier"/>
+    <fontcolor name="mod-class" default="identifier"/>
+    <fontcolor name="mod-typeAlias" default="identifier"/>
+    <fontcolor name="mod-typeParameter" default="identifier"/>
+    <fontcolor name="mod-field" default="field"/>
+    <fontcolor name="mod-enumMember" default="field"/>
+
+    <fontcolor name="mod-namespace-declaration" default="identifier"/>
+    <fontcolor name="mod-package-declaration" default="identifier"/>
+    <fontcolor name="mod-function-declaration" default="method"/>
+    <fontcolor name="mod-method-declaration" default="method"/>
+    <fontcolor name="mod-macro-declaration" default="mod-function"/>
+    <fontcolor name="mod-parameter-declaration" default="parameter"/>
+    <fontcolor name="mod-variable-declaration" default="identifier"/>
+    <fontcolor name="mod-struct-declaration" default="identifier"/>
+    <fontcolor name="mod-enum-declaration" default="identifier"/>
+    <fontcolor name="mod-class-declaration" default="identifier"/>
+    <fontcolor name="mod-typeAlias-declaration" default="identifier"/>
+    <fontcolor name="mod-typeParameter-declaration" default="identifier"/>
+    <fontcolor name="mod-field-declaration" default="field"/>
+    <fontcolor name="mod-enumMember-declaration" default="field"/>
+
+    <fontcolor name="mod-static" >
+        <font style="italic" />
+    </fontcolor>
+
+    <fontcolor name="mod-deprecated" strikeThrough="black"/>
+
 </fontscolors>
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
index b6c1e05..fbf379f 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
@@ -18,10 +18,12 @@
  */
 package org.netbeans.modules.java.lsp.server.protocol;
 
+import com.google.gson.InstanceCreator;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -60,8 +62,10 @@ import org.eclipse.lsp4j.MessageType;
 import org.eclipse.lsp4j.PublishDiagnosticsParams;
 import org.eclipse.lsp4j.RenameOptions;
 import org.eclipse.lsp4j.SemanticTokensCapabilities;
+import org.eclipse.lsp4j.SemanticTokensParams;
 import org.eclipse.lsp4j.ServerCapabilities;
 import org.eclipse.lsp4j.ShowMessageRequestParams;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
 import org.eclipse.lsp4j.TextDocumentSyncKind;
 import org.eclipse.lsp4j.TextDocumentSyncOptions;
 import org.eclipse.lsp4j.WorkDoneProgressCancelParams;
@@ -148,13 +152,23 @@ public final class Server {
     private static Launcher<NbCodeLanguageClient> 
createLauncher(LanguageServerImpl server, Pair<InputStream, OutputStream> io,
             Function<MessageConsumer, MessageConsumer> processor) {
         return new LSPLauncher.Builder<NbCodeLanguageClient>()
-            .configureGson(gb -> 
gb.registerTypeAdapter(SemanticTokensCapabilities.class, 
(InstanceCreator<SemanticTokensCapabilities>) type -> new 
SemanticTokensCapabilities(false)))
             .setLocalService(server)
             .setRemoteInterface(NbCodeLanguageClient.class)
             .setInput(io.first())
             .setOutput(io.second())
             .wrapMessages(processor)
-//                .traceMessages(new java.io.PrintWriter(System.err))
+            .configureGson(gb -> {
+                gb.registerTypeAdapter(SemanticTokensCapabilities.class, new 
InstanceCreator<SemanticTokensCapabilities>() {
+                    @Override public SemanticTokensCapabilities 
createInstance(Type type) {
+                        return new SemanticTokensCapabilities(null);
+                    }
+                });
+                gb.registerTypeAdapter(SemanticTokensParams.class, new 
InstanceCreator<SemanticTokensParams>() {
+                    @Override public SemanticTokensParams createInstance(Type 
type) {
+                        return new SemanticTokensParams(new 
TextDocumentIdentifier(""));
+                    }
+                });
+            })
             .create();
     }
 
@@ -673,7 +687,7 @@ public final class Server {
             }
         }
 
-        private InitializeResult constructInitResponse(JavaSource src) {
+        private InitializeResult constructInitResponse(InitializeParams init, 
JavaSource src) {
             ServerCapabilities capabilities = new ServerCapabilities();
             if (src != null) {
                 TextDocumentSyncOptions textDocumentSyncOptions = new 
TextDocumentSyncOptions();
@@ -725,6 +739,7 @@ public final class Server {
                 capabilities.setRenameProvider(renOpt);
                 FoldingRangeProviderOptions foldingOptions = new 
FoldingRangeProviderOptions();
                 capabilities.setFoldingRangeProvider(foldingOptions);
+                textDocumentService.init(init.getCapabilities(), capabilities);
             }
             return new InitializeResult(capabilities);
         }
@@ -769,7 +784,7 @@ public final class Server {
             // but complete the InitializationRequest independently of the 
project initialization.
             return CompletableFuture.completedFuture(
                     finishInitialization(
-                        constructInitResponse(checkJavaSupport())
+                        constructInitResponse(init, checkJavaSupport())
                     )
             );
         }
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index 377c24c..8a52631 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -43,16 +43,22 @@ import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.EnumSet;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.Callable;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -76,6 +82,7 @@ import javax.swing.event.DocumentListener;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
 import javax.swing.text.StyledDocument;
+import org.eclipse.lsp4j.ClientCapabilities;
 import org.eclipse.lsp4j.CodeAction;
 import org.eclipse.lsp4j.CodeActionKind;
 import org.eclipse.lsp4j.CodeActionParams;
@@ -125,6 +132,13 @@ import org.eclipse.lsp4j.ReferenceParams;
 import org.eclipse.lsp4j.RenameFile;
 import org.eclipse.lsp4j.RenameParams;
 import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensCapabilities;
+import org.eclipse.lsp4j.SemanticTokensLegend;
+import org.eclipse.lsp4j.SemanticTokensParams;
+import org.eclipse.lsp4j.SemanticTokensServerFull;
+import org.eclipse.lsp4j.SemanticTokensWithRegistrationOptions;
+import org.eclipse.lsp4j.ServerCapabilities;
 import org.eclipse.lsp4j.SignatureHelp;
 import org.eclipse.lsp4j.SignatureHelpParams;
 import org.eclipse.lsp4j.SymbolInformation;
@@ -159,6 +173,7 @@ import org.netbeans.api.java.source.TreePathHandle;
 import org.netbeans.api.java.source.TreeUtilities;
 import org.netbeans.api.java.source.WorkingCopy;
 import org.netbeans.api.java.source.ui.ElementOpen;
+import org.netbeans.api.lexer.Token;
 import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.api.lsp.Completion;
 import org.netbeans.api.lsp.HyperlinkLocation;
@@ -173,8 +188,11 @@ import org.netbeans.modules.editor.java.GoToSupport;
 import org.netbeans.modules.editor.java.GoToSupport.GoToTarget;
 import org.netbeans.modules.java.editor.base.fold.JavaElementFoldVisitor;
 import 
org.netbeans.modules.java.editor.base.fold.JavaElementFoldVisitor.FoldCreator;
+import org.netbeans.modules.java.editor.base.semantic.ColoringAttributes;
 import 
org.netbeans.modules.java.editor.base.semantic.MarkOccurrencesHighlighterBase;
 import org.netbeans.modules.java.editor.codegen.GeneratorUtils;
+import org.netbeans.modules.java.editor.base.semantic.SemanticHighlighterBase;
+import 
org.netbeans.modules.java.editor.base.semantic.SemanticHighlighterBase.ErrorDescriptionSetter;
 import org.netbeans.modules.java.editor.options.MarkOccurencesSettings;
 import org.netbeans.modules.java.editor.overridden.ComputeOverriding;
 import org.netbeans.modules.java.editor.overridden.ElementDescription;
@@ -415,6 +433,47 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
         this.client = (NbCodeLanguageClient)client;
     }
 
+    private int[] coloring2TokenType;
+    private int[] coloring2TokenModifier;
+
+    {
+        coloring2TokenType = new int[ColoringAttributes.values().length];
+        Arrays.fill(coloring2TokenType, -1);
+        coloring2TokenModifier = new int[ColoringAttributes.values().length];
+        Arrays.fill(coloring2TokenModifier, -1);
+    }
+
+    public void init(ClientCapabilities clientCapabilities, ServerCapabilities 
severCapabilities) {
+        SemanticTokensCapabilities semanticTokens = clientCapabilities != null 
&& clientCapabilities.getTextDocument() != null ? 
clientCapabilities.getTextDocument().getSemanticTokens() : null;
+        if (semanticTokens != null) {
+            SemanticTokensWithRegistrationOptions cap = new 
SemanticTokensWithRegistrationOptions();
+            cap.setFull(new SemanticTokensServerFull(false));
+            Set<String> knownTokenTypes = semanticTokens.getTokenTypes() != 
null ? new HashSet<>(semanticTokens.getTokenTypes()) : Collections.emptySet();
+            Map<String, Integer> tokenLegend = new LinkedHashMap<>();
+            for (Entry<ColoringAttributes, List<String>> e : 
COLORING_TO_TOKEN_TYPE_CANDIDATES.entrySet()) {
+                for (String candidate : e.getValue()) {
+                    if (knownTokenTypes.contains(candidate)) {
+                        coloring2TokenType[e.getKey().ordinal()] = 
tokenLegend.computeIfAbsent(candidate, c -> tokenLegend.size());
+                        break;
+                    }
+                }
+            }
+            Set<String> knownTokenModifiers = 
semanticTokens.getTokenModifiers() != null ? new 
HashSet<>(semanticTokens.getTokenModifiers()) : Collections.emptySet();
+            Map<String, Integer> modifiersLegend = new LinkedHashMap<>();
+            for (Entry<ColoringAttributes, List<String>> e : 
COLORING_TO_TOKEN_MODIFIERS_CANDIDATES.entrySet()) {
+                for (String candidate : e.getValue()) {
+                    if (knownTokenModifiers.contains(candidate)) {
+                        coloring2TokenModifier[e.getKey().ordinal()] = 
modifiersLegend.computeIfAbsent(candidate, c -> 1 << modifiersLegend.size());
+                        break;
+                    }
+                }
+            }
+            SemanticTokensLegend legend = new SemanticTokensLegend(new 
ArrayList<>(tokenLegend.keySet()), new ArrayList<>(modifiersLegend.keySet()));
+            cap.setLegend(legend);
+            severCapabilities.setSemanticTokensProvider(cap);
+        }
+    }
+
     @Override
     public CompletableFuture<CompletionItem> 
resolveCompletionItem(CompletionItem ci) {
         JsonObject rawData = (JsonObject) ci.getData();
@@ -1886,4 +1945,95 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
      * this hook, if defined, with the method name and parameter.
      */
     static BiConsumer<String, Object> HOOK_NOTIFICATION = null;
+
+    private static final Map<ColoringAttributes, List<String>> 
COLORING_TO_TOKEN_TYPE_CANDIDATES = new HashMap<ColoringAttributes, 
List<String>>() {{
+        put(ColoringAttributes.FIELD, Arrays.asList("member"));
+        put(ColoringAttributes.RECORD_COMPONENT, Arrays.asList("member"));
+        put(ColoringAttributes.LOCAL_VARIABLE, Arrays.asList("variable"));
+        put(ColoringAttributes.PARAMETER, Arrays.asList("parameter"));
+        put(ColoringAttributes.METHOD, Arrays.asList("method", "function"));
+        put(ColoringAttributes.CONSTRUCTOR, Arrays.asList("method", 
"function"));
+        put(ColoringAttributes.CLASS, Arrays.asList("class"));
+        put(ColoringAttributes.RECORD, Arrays.asList("class"));
+        put(ColoringAttributes.INTERFACE, Arrays.asList("interface"));
+        put(ColoringAttributes.ANNOTATION_TYPE, Arrays.asList("interface"));
+        put(ColoringAttributes.ENUM, Arrays.asList("enum"));
+        put(ColoringAttributes.TYPE_PARAMETER_DECLARATION, 
Arrays.asList("typeParameter"));
+    }};
+
+    private static final Map<ColoringAttributes, List<String>> 
COLORING_TO_TOKEN_MODIFIERS_CANDIDATES = new HashMap<ColoringAttributes, 
List<String>>() {{
+        put(ColoringAttributes.ABSTRACT, Arrays.asList("abstract"));
+        put(ColoringAttributes.DECLARATION, Arrays.asList("declaration"));
+        put(ColoringAttributes.DEPRECATED, Arrays.asList("deprecated"));
+        put(ColoringAttributes.STATIC, Arrays.asList("static"));
+    }};
+
+    @Override
+    public CompletableFuture<SemanticTokens> 
semanticTokensFull(SemanticTokensParams params) {
+        JavaSource js = getJavaSource(params.getTextDocument().getUri());
+        List<Integer> result = new ArrayList<>();
+        if (js != null) {
+            try {
+                js.runUserActionTask(cc -> {
+                    cc.toPhase(JavaSource.Phase.RESOLVED);
+                    Document doc = 
cc.getSnapshot().getSource().getDocument(true);
+                    new SemanticHighlighterBase() {
+                        @Override
+                        protected boolean process(CompilationInfo info, 
Document doc) {
+                            process(info, doc, new ErrorDescriptionSetter() {
+                                @Override
+                                public void setHighlights(Document doc, 
Collection<Pair<int[], ColoringAttributes.Coloring>> highlights, Map<int[], 
String> preText) {
+                                    //...nothing
+                                }
+
+                                @Override
+                                public void setColorings(Document doc, 
Map<Token, ColoringAttributes.Coloring> colorings) {
+                                    int line = 0;
+                                    long column = 0;
+                                    int lastLine = 0;
+                                    long currentLineStart = 0;
+                                    long nextLineStart = 
info.getCompilationUnit().getLineMap().getStartPosition(line + 2);
+                                    Map<Token, ColoringAttributes.Coloring> 
ordered = new TreeMap<>((t1, t2) -> t1.offset(null) - t2.offset(null));
+                                    ordered.putAll(colorings);
+                                    for (Entry<Token, 
ColoringAttributes.Coloring> e : ordered.entrySet()) {
+                                        int currentOffset = 
e.getKey().offset(null);
+                                        while (nextLineStart < currentOffset) {
+                                            line++;
+                                            currentLineStart = nextLineStart;
+                                            nextLineStart = 
info.getCompilationUnit().getLineMap().getStartPosition(line + 2);
+                                            column = 0;
+                                        }
+                                        Optional<Integer> tokenType = 
e.getValue().stream().map(c -> 
coloring2TokenType[c.ordinal()]).collect(Collectors.maxBy((v1, v2) -> 
v1.intValue() - v2.intValue()));
+                                        int modifiers = 0;
+                                        for (ColoringAttributes c : 
e.getValue()) {
+                                            int mod = 
coloring2TokenModifier[c.ordinal()];
+                                            if (mod != (-1)) {
+                                                modifiers |= mod;
+                                            }
+                                        }
+                                        if (tokenType.isPresent()) {
+                                            result.add(line - lastLine);
+                                            result.add((int) (currentOffset - 
currentLineStart - column));
+                                            result.add(e.getKey().length());
+                                            result.add(tokenType.get());
+                                            result.add(modifiers);
+                                            lastLine = line;
+                                            column = currentOffset - 
currentLineStart;
+                                        }
+                                    }
+                                }
+                            });
+                            return true;
+                        }
+                    }.process(cc, doc);
+                }, true);
+            } catch (IOException ex) {
+                //TODO: include stack trace:
+                client.logMessage(new MessageParams(MessageType.Error, 
ex.getMessage()));
+            }
+        }
+        SemanticTokens tokens = new SemanticTokens(result);
+        return CompletableFuture.completedFuture(tokens);
+    }
+
 }
diff --git 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
index da916c3..ad652e7 100644
--- 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
+++ 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
@@ -46,6 +46,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executors;
@@ -107,9 +108,14 @@ import org.eclipse.lsp4j.ReferenceParams;
 import org.eclipse.lsp4j.RenameFile;
 import org.eclipse.lsp4j.RenameParams;
 import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensCapabilities;
+import org.eclipse.lsp4j.SemanticTokensLegend;
+import org.eclipse.lsp4j.SemanticTokensParams;
 import org.eclipse.lsp4j.ResourceOperationKind;
 import org.eclipse.lsp4j.ShowMessageRequestParams;
 import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.TextDocumentClientCapabilities;
 import org.eclipse.lsp4j.TextDocumentContentChangeEvent;
 import org.eclipse.lsp4j.TextDocumentEdit;
 import org.eclipse.lsp4j.TextDocumentIdentifier;
@@ -4644,6 +4650,95 @@ public class ServerTest extends NbTestCase {
         return toString(edit.getRange()) + "=>" + edit.getNewText();
     }
 
+    public void testSemanticHighlighting() throws Exception {
+        File src = new File(getWorkDir(), "Test.java");
+        src.getParentFile().mkdirs();
+        String code = "public class Test {\n" +
+                      "    private static final int C = 0;\n" +
+                      "    public int method(int p) {\n" +
+                      "        int l = p + method(0);\n" +
+                      "    }\n" +
+                      "}\n";
+        try (Writer w = new FileWriter(src)) {
+            w.write(code);
+        }
+        FileUtil.refreshFor(getWorkDir());
+        Launcher<LanguageServer> serverLauncher = 
LSPLauncher.createClientLauncher(new LanguageClient() {
+            @Override
+            public void telemetryEvent(Object arg0) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            @Override
+            public void publishDiagnostics(PublishDiagnosticsParams params) {
+            }
+
+            @Override
+            public void showMessage(MessageParams arg0) {
+            }
+
+            @Override
+            public CompletableFuture<MessageActionItem> 
showMessageRequest(ShowMessageRequestParams arg0) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+
+            @Override
+            public void logMessage(MessageParams arg0) {
+                throw new UnsupportedOperationException("Not supported yet.");
+            }
+        }, client.getInputStream(), client.getOutputStream());
+        serverLauncher.startListening();
+        LanguageServer server = serverLauncher.getRemoteProxy();
+        ClientCapabilities clientCaps = new ClientCapabilities();
+        TextDocumentClientCapabilities textCaps = new 
TextDocumentClientCapabilities();
+        clientCaps.setTextDocument(textCaps);
+        SemanticTokensCapabilities sematicTokensCapabilities = new 
SemanticTokensCapabilities(true);
+        sematicTokensCapabilities.setTokenTypes(Arrays.asList("member", 
"variable", "parameter", "method", "function", "class", "interface", 
"enum","typeParameter"));
+        
sematicTokensCapabilities.setTokenModifiers(Arrays.asList("declaration", 
"static"));
+        textCaps.setSemanticTokens(sematicTokensCapabilities);
+        InitializeParams initParams = new InitializeParams();
+        initParams.setCapabilities(clientCaps);
+        InitializeResult result = server.initialize(initParams).get();
+        assertNotNull(result.getCapabilities().getSemanticTokensProvider());
+        SemanticTokensLegend legend = 
result.getCapabilities().getSemanticTokensProvider().getLegend();
+        server.getTextDocumentService().didOpen(new 
DidOpenTextDocumentParams(new TextDocumentItem(toURI(src), "java", 0, code)));
+        assertColoring(legend,
+                       server.getTextDocumentService().semanticTokensFull(new 
SemanticTokensParams(new TextDocumentIdentifier(toURI(src)))).get(),
+                       "0:13-17:class:[declaration]",
+                       "1:29-30:member:[declaration, static]",
+                       "2:15-21:method:[declaration]",
+                       "2:26-27:parameter:[declaration]",
+                       "3:12-13:variable:[declaration]",
+                       "3:16-17:parameter:[]",
+                       "3:20-26:method:[]");
+    }
+
+    private void assertColoring(SemanticTokensLegend legend, SemanticTokens 
tokens, String... expected) {
+        List<String> coloring = new ArrayList<>();
+        int line = 0;
+        int column = 0;
+
+        for (int i = 0; i < tokens.getData().size(); i += 5) {
+            line += tokens.getData().get(i);
+            if (tokens.getData().get(i) != 0) {
+                column = 0;
+            }
+            column += tokens.getData().get(i + 1);
+            int endColumn = column + tokens.getData().get(i + 2);
+            String tokenType = 
legend.getTokenTypes().get(tokens.getData().get(i + 3));
+            Set<String> modifiers = new TreeSet<>();
+            int mods = tokens.getData().get(i + 4);
+            int pos;
+            while ((pos = Integer.highestOneBit(mods)) != 0) {
+                mods &= ~pos;
+                
modifiers.add(legend.getTokenModifiers().get(Integer.numberOfTrailingZeros(pos)));
+            }
+            coloring.add("" + line + ":" + column + "-" + endColumn + ":" + 
tokenType + ":" + modifiers);
+        }
+
+        assertEquals(Arrays.asList(expected), coloring);
+    }
+
     private String toString(Location location) {
         String path = location.getUri();
         String simpleName = path.substring(path.lastIndexOf('/') + 1);
diff --git a/java/java.lsp.server/vscode/package-lock.json 
b/java/java.lsp.server/vscode/package-lock.json
index 0ce5eb8..e0a778f 100644
--- a/java/java.lsp.server/vscode/package-lock.json
+++ b/java/java.lsp.server/vscode/package-lock.json
@@ -1,8 +1,1166 @@
 {
        "name": "apache-netbeans-java",
        "version": "0.1.0",
-       "lockfileVersion": 1,
+       "lockfileVersion": 2,
        "requires": true,
+       "packages": {
+               "": {
+                       "name": "apache-netbeans-java",
+                       "version": "0.1.0",
+                       "license": "Apache 2.0",
+                       "dependencies": {
+                               "jsonc-parser": "3.0.0",
+                               "vscode-debugadapter": "1.42.1",
+                               "vscode-languageclient": "7.0.0"
+                       },
+                       "devDependencies": {
+                               "@types/glob": "^7.1.1",
+                               "@types/mocha": "^9.0.0",
+                               "@types/node": "^13.11.0",
+                               "@types/ps-node": "^0.1.0",
+                               "@types/vscode": "^1.60.0",
+                               "glob": "^7.1.6",
+                               "mocha": "^9.1.2",
+                               "ps-node": "^0.1.6",
+                               "typescript": "^3.8.3",
+                               "vscode-test": "^1.3.0"
+                       },
+                       "engines": {
+                               "vscode": "^1.60.0"
+                       }
+               },
+               "node_modules/@types/glob": {
+                       "version": "7.1.3",
+                       "resolved": 
"https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz";,
+                       "integrity": 
"sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/minimatch": "*",
+                               "@types/node": "*"
+                       }
+               },
+               "node_modules/@types/minimatch": {
+                       "version": "3.0.3",
+                       "resolved": 
"https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz";,
+                       "integrity": 
"sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+                       "dev": true
+               },
+               "node_modules/@types/mocha": {
+                       "version": "9.0.0",
+                       "resolved": 
"https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz";,
+                       "integrity": 
"sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==",
+                       "dev": true
+               },
+               "node_modules/@types/node": {
+                       "version": "13.13.15",
+                       "resolved": 
"https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz";,
+                       "integrity": 
"sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==",
+                       "dev": true
+               },
+               "node_modules/@types/ps-node": {
+                       "version": "0.1.0",
+                       "resolved": 
"https://registry.npmjs.org/@types/ps-node/-/ps-node-0.1.0.tgz";,
+                       "integrity": 
"sha512-HI5l+f38o93x81mbOWZ1IEzj87rGCHfN4A4QyCU1MuViT5Slvlo5F+YVvmBFHfZsEGi0Lo8TghWU2Ew6vBILNA==",
+                       "dev": true
+               },
+               "node_modules/@types/vscode": {
+                       "version": "1.60.0",
+                       "resolved": 
"https://registry.npmjs.org/@types/vscode/-/vscode-1.60.0.tgz";,
+                       "integrity": 
"sha512-wZt3VTmzYrgZ0l/3QmEbCq4KAJ71K3/hmMQ/nfpv84oH8e81KKwPEoQ5v8dNCxfHFVJ1JabHKmCvqdYOoVm1Ow==",
+                       "dev": true
+               },
+               "node_modules/@ungap/promise-all-settled": {
+                       "version": "1.1.2",
+                       "resolved": 
"https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz";,
+                       "integrity": 
"sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+                       "dev": true
+               },
+               "node_modules/agent-base": {
+                       "version": "4.3.0",
+                       "resolved": 
"https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz";,
+                       "integrity": 
"sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+                       "dev": true,
+                       "dependencies": {
+                               "es6-promisify": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 4.0.0"
+                       }
+               },
+               "node_modules/ansi-colors": {
+                       "version": "4.1.1",
+                       "resolved": 
"https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz";,
+                       "integrity": 
"sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz";,
+                       "integrity": 
"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/ansi-styles": {
+                       "version": "4.3.0",
+                       "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz";,
+                       "integrity": 
"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                       "dev": true,
+                       "dependencies": {
+                               "color-convert": "^2.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/anymatch": {
+                       "version": "3.1.2",
+                       "resolved": 
"https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz";,
+                       "integrity": 
"sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+                       "dev": true,
+                       "dependencies": {
+                               "normalize-path": "^3.0.0",
+                               "picomatch": "^2.0.4"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/argparse": {
+                       "version": "2.0.1",
+                       "resolved": 
"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz";,
+                       "integrity": 
"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+                       "dev": true
+               },
+               "node_modules/balanced-match": {
+                       "version": "1.0.0",
+                       "resolved": 
"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";,
+                       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+               },
+               "node_modules/binary-extensions": {
+                       "version": "2.2.0",
+                       "resolved": 
"https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz";,
+                       "integrity": 
"sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/brace-expansion": {
+                       "version": "1.1.11",
+                       "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";,
+                       "integrity": 
"sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+                       "dependencies": {
+                               "balanced-match": "^1.0.0",
+                               "concat-map": "0.0.1"
+                       }
+               },
+               "node_modules/braces": {
+                       "version": "3.0.2",
+                       "resolved": 
"https://registry.npmjs.org/braces/-/braces-3.0.2.tgz";,
+                       "integrity": 
"sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+                       "dev": true,
+                       "dependencies": {
+                               "fill-range": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/browser-stdout": {
+                       "version": "1.3.1",
+                       "resolved": 
"https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz";,
+                       "integrity": 
"sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+                       "dev": true
+               },
+               "node_modules/camelcase": {
+                       "version": "6.2.0",
+                       "resolved": 
"https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz";,
+                       "integrity": 
"sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/chalk": {
+                       "version": "4.1.2",
+                       "resolved": 
"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz";,
+                       "integrity": 
"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-styles": "^4.1.0",
+                               "supports-color": "^7.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/chalk/node_modules/supports-color": {
+                       "version": "7.2.0",
+                       "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz";,
+                       "integrity": 
"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                       "dev": true,
+                       "dependencies": {
+                               "has-flag": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/chokidar": {
+                       "version": "3.5.2",
+                       "resolved": 
"https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz";,
+                       "integrity": 
"sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "anymatch": "~3.1.2",
+                               "braces": "~3.0.2",
+                               "fsevents": "~2.3.2",
+                               "glob-parent": "~5.1.2",
+                               "is-binary-path": "~2.1.0",
+                               "is-glob": "~4.0.1",
+                               "normalize-path": "~3.0.0",
+                               "readdirp": "~3.6.0"
+                       },
+                       "engines": {
+                               "node": ">= 8.10.0"
+                       },
+                       "optionalDependencies": {
+                               "fsevents": "~2.3.2"
+                       }
+               },
+               "node_modules/cliui": {
+                       "version": "7.0.4",
+                       "resolved": 
"https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz";,
+                       "integrity": 
"sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "string-width": "^4.2.0",
+                               "strip-ansi": "^6.0.0",
+                               "wrap-ansi": "^7.0.0"
+                       }
+               },
+               "node_modules/color-convert": {
+                       "version": "2.0.1",
+                       "resolved": 
"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz";,
+                       "integrity": 
"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "color-name": "~1.1.4"
+                       },
+                       "engines": {
+                               "node": ">=7.0.0"
+                       }
+               },
+               "node_modules/color-name": {
+                       "version": "1.1.4",
+                       "resolved": 
"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz";,
+                       "integrity": 
"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+                       "dev": true
+               },
+               "node_modules/concat-map": {
+                       "version": "0.0.1",
+                       "resolved": 
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";,
+                       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+               },
+               "node_modules/connected-domain": {
+                       "version": "1.0.0",
+                       "resolved": 
"https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz";,
+                       "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=",
+                       "dev": true
+               },
+               "node_modules/debug": {
+                       "version": "4.3.2",
+                       "resolved": 
"https://registry.npmjs.org/debug/-/debug-4.3.2.tgz";,
+                       "integrity": 
"sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+                       "dev": true,
+                       "dependencies": {
+                               "ms": "2.1.2"
+                       },
+                       "engines": {
+                               "node": ">=6.0"
+                       }
+               },
+               "node_modules/decamelize": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz";,
+                       "integrity": 
"sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/diff": {
+                       "version": "5.0.0",
+                       "resolved": 
"https://registry.npmjs.org/diff/-/diff-5.0.0.tgz";,
+                       "integrity": 
"sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.3.1"
+                       }
+               },
+               "node_modules/emoji-regex": {
+                       "version": "8.0.0",
+                       "resolved": 
"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz";,
+                       "integrity": 
"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+                       "dev": true
+               },
+               "node_modules/es6-promise": {
+                       "version": "4.2.8",
+                       "resolved": 
"https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz";,
+                       "integrity": 
"sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+                       "dev": true
+               },
+               "node_modules/es6-promisify": {
+                       "version": "5.0.0",
+                       "resolved": 
"https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz";,
+                       "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+                       "dev": true,
+                       "dependencies": {
+                               "es6-promise": "^4.0.3"
+                       }
+               },
+               "node_modules/escalade": {
+                       "version": "3.1.1",
+                       "resolved": 
"https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz";,
+                       "integrity": 
"sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/escape-string-regexp": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz";,
+                       "integrity": 
"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/fill-range": {
+                       "version": "7.0.1",
+                       "resolved": 
"https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz";,
+                       "integrity": 
"sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "to-regex-range": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/find-up": {
+                       "version": "5.0.0",
+                       "resolved": 
"https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz";,
+                       "integrity": 
"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+                       "dev": true,
+                       "dependencies": {
+                               "locate-path": "^6.0.0",
+                               "path-exists": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/flat": {
+                       "version": "5.0.2",
+                       "resolved": 
"https://registry.npmjs.org/flat/-/flat-5.0.2.tgz";,
+                       "integrity": 
"sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+                       "dev": true,
+                       "bin": {
+                               "flat": "cli.js"
+                       }
+               },
+               "node_modules/fs.realpath": {
+                       "version": "1.0.0",
+                       "resolved": 
"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";,
+                       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+                       "dev": true
+               },
+               "node_modules/fsevents": {
+                       "version": "2.3.2",
+                       "resolved": 
"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz";,
+                       "integrity": 
"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+                       "dev": true,
+                       "optional": true,
+                       "os": [
+                               "darwin"
+                       ],
+                       "engines": {
+                               "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+                       }
+               },
+               "node_modules/get-caller-file": {
+                       "version": "2.0.5",
+                       "resolved": 
"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz";,
+                       "integrity": 
"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+                       "dev": true,
+                       "engines": {
+                               "node": "6.* || 8.* || >= 10.*"
+                       }
+               },
+               "node_modules/glob": {
+                       "version": "7.1.6",
+                       "resolved": 
"https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";,
+                       "integrity": 
"sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+                       "dev": true,
+                       "dependencies": {
+                               "fs.realpath": "^1.0.0",
+                               "inflight": "^1.0.4",
+                               "inherits": "2",
+                               "minimatch": "^3.0.4",
+                               "once": "^1.3.0",
+                               "path-is-absolute": "^1.0.0"
+                       },
+                       "engines": {
+                               "node": "*"
+                       }
+               },
+               "node_modules/glob-parent": {
+                       "version": "5.1.2",
+                       "resolved": 
"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz";,
+                       "integrity": 
"sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-glob": "^4.0.1"
+                       },
+                       "engines": {
+                               "node": ">= 6"
+                       }
+               },
+               "node_modules/growl": {
+                       "version": "1.10.5",
+                       "resolved": 
"https://registry.npmjs.org/growl/-/growl-1.10.5.tgz";,
+                       "integrity": 
"sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=4.x"
+                       }
+               },
+               "node_modules/has-flag": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz";,
+                       "integrity": 
"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/he": {
+                       "version": "1.2.0",
+                       "resolved": 
"https://registry.npmjs.org/he/-/he-1.2.0.tgz";,
+                       "integrity": 
"sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+                       "dev": true,
+                       "bin": {
+                               "he": "bin/he"
+                       }
+               },
+               "node_modules/http-proxy-agent": {
+                       "version": "2.1.0",
+                       "resolved": 
"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz";,
+                       "integrity": 
"sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
+                       "dev": true,
+                       "dependencies": {
+                               "agent-base": "4",
+                               "debug": "3.1.0"
+                       },
+                       "engines": {
+                               "node": ">= 4.5.0"
+                       }
+               },
+               "node_modules/http-proxy-agent/node_modules/debug": {
+                       "version": "3.1.0",
+                       "resolved": 
"https://registry.npmjs.org/debug/-/debug-3.1.0.tgz";,
+                       "integrity": 
"sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+                       "dev": true,
+                       "dependencies": {
+                               "ms": "2.0.0"
+                       }
+               },
+               "node_modules/http-proxy-agent/node_modules/ms": {
+                       "version": "2.0.0",
+                       "resolved": 
"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";,
+                       "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+                       "dev": true
+               },
+               "node_modules/https-proxy-agent": {
+                       "version": "2.2.4",
+                       "resolved": 
"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz";,
+                       "integrity": 
"sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+                       "dev": true,
+                       "dependencies": {
+                               "agent-base": "^4.3.0",
+                               "debug": "^3.1.0"
+                       },
+                       "engines": {
+                               "node": ">= 4.5.0"
+                       }
+               },
+               "node_modules/https-proxy-agent/node_modules/debug": {
+                       "version": "3.2.6",
+                       "resolved": 
"https://registry.npmjs.org/debug/-/debug-3.2.6.tgz";,
+                       "integrity": 
"sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ms": "^2.1.1"
+                       }
+               },
+               "node_modules/inflight": {
+                       "version": "1.0.6",
+                       "resolved": 
"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";,
+                       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+                       "dev": true,
+                       "dependencies": {
+                               "once": "^1.3.0",
+                               "wrappy": "1"
+                       }
+               },
+               "node_modules/inherits": {
+                       "version": "2.0.4",
+                       "resolved": 
"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";,
+                       "integrity": 
"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+                       "dev": true
+               },
+               "node_modules/is-binary-path": {
+                       "version": "2.1.0",
+                       "resolved": 
"https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz";,
+                       "integrity": 
"sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+                       "dev": true,
+                       "dependencies": {
+                               "binary-extensions": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/is-extglob": {
+                       "version": "2.1.1",
+                       "resolved": 
"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";,
+                       "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/is-fullwidth-code-point": {
+                       "version": "3.0.0",
+                       "resolved": 
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz";,
+                       "integrity": 
"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/is-glob": {
+                       "version": "4.0.3",
+                       "resolved": 
"https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz";,
+                       "integrity": 
"sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-extglob": "^2.1.1"
+                       },
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/is-number": {
+                       "version": "7.0.0",
+                       "resolved": 
"https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz";,
+                       "integrity": 
"sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.12.0"
+                       }
+               },
+               "node_modules/is-plain-obj": {
+                       "version": "2.1.0",
+                       "resolved": 
"https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz";,
+                       "integrity": 
"sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/is-unicode-supported": {
+                       "version": "0.1.0",
+                       "resolved": 
"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz";,
+                       "integrity": 
"sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/isexe": {
+                       "version": "2.0.0",
+                       "resolved": 
"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";,
+                       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+                       "dev": true
+               },
+               "node_modules/js-yaml": {
+                       "version": "4.1.0",
+                       "resolved": 
"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz";,
+                       "integrity": 
"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+                       "dev": true,
+                       "dependencies": {
+                               "argparse": "^2.0.1"
+                       },
+                       "bin": {
+                               "js-yaml": "bin/js-yaml.js"
+                       }
+               },
+               "node_modules/jsonc-parser": {
+                       "version": "3.0.0",
+                       "resolved": 
"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz";,
+                       "integrity": 
"sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA=="
+               },
+               "node_modules/locate-path": {
+                       "version": "6.0.0",
+                       "resolved": 
"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz";,
+                       "integrity": 
"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-locate": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/log-symbols": {
+                       "version": "4.1.0",
+                       "resolved": 
"https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz";,
+                       "integrity": 
"sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+                       "dev": true,
+                       "dependencies": {
+                               "chalk": "^4.1.0",
+                               "is-unicode-supported": "^0.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/lru-cache": {
+                       "version": "6.0.0",
+                       "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz";,
+                       "integrity": 
"sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/minimatch": {
+                       "version": "3.0.4",
+                       "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";,
+                       "integrity": 
"sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+                       "dependencies": {
+                               "brace-expansion": "^1.1.7"
+                       },
+                       "engines": {
+                               "node": "*"
+                       }
+               },
+               "node_modules/minimist": {
+                       "version": "1.2.5",
+                       "resolved": 
"https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";,
+                       "integrity": 
"sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+               },
+               "node_modules/mkdirp": {
+                       "version": "0.5.5",
+                       "resolved": 
"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";,
+                       "integrity": 
"sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+                       "dependencies": {
+                               "minimist": "^1.2.5"
+                       },
+                       "bin": {
+                               "mkdirp": "bin/cmd.js"
+                       }
+               },
+               "node_modules/mocha": {
+                       "version": "9.1.2",
+                       "resolved": 
"https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz";,
+                       "integrity": 
"sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==",
+                       "dev": true,
+                       "dependencies": {
+                               "@ungap/promise-all-settled": "1.1.2",
+                               "ansi-colors": "4.1.1",
+                               "browser-stdout": "1.3.1",
+                               "chokidar": "3.5.2",
+                               "debug": "4.3.2",
+                               "diff": "5.0.0",
+                               "escape-string-regexp": "4.0.0",
+                               "find-up": "5.0.0",
+                               "glob": "7.1.7",
+                               "growl": "1.10.5",
+                               "he": "1.2.0",
+                               "js-yaml": "4.1.0",
+                               "log-symbols": "4.1.0",
+                               "minimatch": "3.0.4",
+                               "ms": "2.1.3",
+                               "nanoid": "3.1.25",
+                               "serialize-javascript": "6.0.0",
+                               "strip-json-comments": "3.1.1",
+                               "supports-color": "8.1.1",
+                               "which": "2.0.2",
+                               "workerpool": "6.1.5",
+                               "yargs": "16.2.0",
+                               "yargs-parser": "20.2.4",
+                               "yargs-unparser": "2.0.0"
+                       },
+                       "bin": {
+                               "_mocha": "bin/_mocha",
+                               "mocha": "bin/mocha"
+                       },
+                       "engines": {
+                               "node": ">= 12.0.0"
+                       }
+               },
+               "node_modules/mocha/node_modules/glob": {
+                       "version": "7.1.7",
+                       "resolved": 
"https://registry.npmjs.org/glob/-/glob-7.1.7.tgz";,
+                       "integrity": 
"sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "fs.realpath": "^1.0.0",
+                               "inflight": "^1.0.4",
+                               "inherits": "2",
+                               "minimatch": "^3.0.4",
+                               "once": "^1.3.0",
+                               "path-is-absolute": "^1.0.0"
+                       },
+                       "engines": {
+                               "node": "*"
+                       }
+               },
+               "node_modules/mocha/node_modules/ms": {
+                       "version": "2.1.3",
+                       "resolved": 
"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz";,
+                       "integrity": 
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+                       "dev": true
+               },
+               "node_modules/ms": {
+                       "version": "2.1.2",
+                       "resolved": 
"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";,
+                       "integrity": 
"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+                       "dev": true
+               },
+               "node_modules/nanoid": {
+                       "version": "3.1.25",
+                       "resolved": 
"https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz";,
+                       "integrity": 
"sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+                       "dev": true,
+                       "bin": {
+                               "nanoid": "bin/nanoid.cjs"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+                       }
+               },
+               "node_modules/normalize-path": {
+                       "version": "3.0.0",
+                       "resolved": 
"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz";,
+                       "integrity": 
"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/once": {
+                       "version": "1.4.0",
+                       "resolved": 
"https://registry.npmjs.org/once/-/once-1.4.0.tgz";,
+                       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+                       "dev": true,
+                       "dependencies": {
+                               "wrappy": "1"
+                       }
+               },
+               "node_modules/p-limit": {
+                       "version": "3.1.0",
+                       "resolved": 
"https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz";,
+                       "integrity": 
"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "yocto-queue": "^0.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/p-locate": {
+                       "version": "5.0.0",
+                       "resolved": 
"https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz";,
+                       "integrity": 
"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-limit": "^3.0.2"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/path-exists": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz";,
+                       "integrity": 
"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/path-is-absolute": {
+                       "version": "1.0.1",
+                       "resolved": 
"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";,
+                       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/picomatch": {
+                       "version": "2.3.0",
+                       "resolved": 
"https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz";,
+                       "integrity": 
"sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8.6"
+                       }
+               },
+               "node_modules/ps-node": {
+                       "version": "0.1.6",
+                       "resolved": 
"https://registry.npmjs.org/ps-node/-/ps-node-0.1.6.tgz";,
+                       "integrity": "sha1-mvZ6mdex0BMuUaUDCZ04qNKs4sM=",
+                       "dev": true,
+                       "dependencies": {
+                               "table-parser": "^0.1.3"
+                       }
+               },
+               "node_modules/randombytes": {
+                       "version": "2.1.0",
+                       "resolved": 
"https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz";,
+                       "integrity": 
"sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "safe-buffer": "^5.1.0"
+                       }
+               },
+               "node_modules/readdirp": {
+                       "version": "3.6.0",
+                       "resolved": 
"https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz";,
+                       "integrity": 
"sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+                       "dev": true,
+                       "dependencies": {
+                               "picomatch": "^2.2.1"
+                       },
+                       "engines": {
+                               "node": ">=8.10.0"
+                       }
+               },
+               "node_modules/require-directory": {
+                       "version": "2.1.1",
+                       "resolved": 
"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";,
+                       "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/rimraf": {
+                       "version": "2.6.3",
+                       "resolved": 
"https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
+                       "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+                       "dev": true,
+                       "dependencies": {
+                               "glob": "^7.1.3"
+                       },
+                       "bin": {
+                               "rimraf": "bin.js"
+                       }
+               },
+               "node_modules/safe-buffer": {
+                       "version": "5.2.1",
+                       "resolved": 
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz";,
+                       "integrity": 
"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+                       "dev": true
+               },
+               "node_modules/semver": {
+                       "version": "7.3.5",
+                       "resolved": 
"https://registry.npmjs.org/semver/-/semver-7.3.5.tgz";,
+                       "integrity": 
"sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+                       "dependencies": {
+                               "lru-cache": "^6.0.0"
+                       },
+                       "bin": {
+                               "semver": "bin/semver.js"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/serialize-javascript": {
+                       "version": "6.0.0",
+                       "resolved": 
"https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz";,
+                       "integrity": 
"sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+                       "dev": true,
+                       "dependencies": {
+                               "randombytes": "^2.1.0"
+                       }
+               },
+               "node_modules/string-width": {
+                       "version": "4.2.3",
+                       "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz";,
+                       "integrity": 
"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+                       "dev": true,
+                       "dependencies": {
+                               "emoji-regex": "^8.0.0",
+                               "is-fullwidth-code-point": "^3.0.0",
+                               "strip-ansi": "^6.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/strip-ansi": {
+                       "version": "6.0.1",
+                       "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz";,
+                       "integrity": 
"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/strip-json-comments": {
+                       "version": "3.1.1",
+                       "resolved": 
"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz";,
+                       "integrity": 
"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/supports-color": {
+                       "version": "8.1.1",
+                       "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz";,
+                       "integrity": 
"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "has-flag": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/table-parser": {
+                       "version": "0.1.3",
+                       "resolved": 
"https://registry.npmjs.org/table-parser/-/table-parser-0.1.3.tgz";,
+                       "integrity": "sha1-BEHPzhallIFoTCfRtaZ/8VpDx7A=",
+                       "dev": true,
+                       "dependencies": {
+                               "connected-domain": "^1.0.0"
+                       }
+               },
+               "node_modules/to-regex-range": {
+                       "version": "5.0.1",
+                       "resolved": 
"https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz";,
+                       "integrity": 
"sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-number": "^7.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8.0"
+                       }
+               },
+               "node_modules/typescript": {
+                       "version": "3.9.7",
+                       "resolved": 
"https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz";,
+                       "integrity": 
"sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
+                       "dev": true,
+                       "bin": {
+                               "tsc": "bin/tsc",
+                               "tsserver": "bin/tsserver"
+                       },
+                       "engines": {
+                               "node": ">=4.2.0"
+                       }
+               },
+               "node_modules/vscode-debugadapter": {
+                       "version": "1.42.1",
+                       "resolved": 
"https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.42.1.tgz";,
+                       "integrity": 
"sha512-bICDB8mxReU2kGL13ftjNqeInYtVN3zpRdZKjRZHCpXC/mofrdaj9KRlJsALwcUNivMA9S/LwTZ2n+ros3X0jg==",
+                       "dependencies": {
+                               "mkdirp": "^0.5.5",
+                               "vscode-debugprotocol": "1.42.0"
+                       }
+               },
+               "node_modules/vscode-debugprotocol": {
+                       "version": "1.42.0",
+                       "resolved": 
"https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.42.0.tgz";,
+                       "integrity": 
"sha512-nVsfVCat9FZlOso5SYB1LQQiFGifTyOALpkpJdudDlRXGTpI3mSFiDYXWaoFm7UcfqTOzn1SC7Hqw4d89btT0w=="
+               },
+               "node_modules/vscode-jsonrpc": {
+                       "version": "6.0.0",
+                       "resolved": 
"https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz";,
+                       "integrity": 
"sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==",
+                       "engines": {
+                               "node": ">=8.0.0 || >=10.0.0"
+                       }
+               },
+               "node_modules/vscode-languageclient": {
+                       "version": "7.0.0",
+                       "resolved": 
"https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz";,
+                       "integrity": 
"sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==",
+                       "dependencies": {
+                               "minimatch": "^3.0.4",
+                               "semver": "^7.3.4",
+                               "vscode-languageserver-protocol": "3.16.0"
+                       },
+                       "engines": {
+                               "vscode": "^1.52.0"
+                       }
+               },
+               "node_modules/vscode-languageserver-protocol": {
+                       "version": "3.16.0",
+                       "resolved": 
"https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz";,
+                       "integrity": 
"sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==",
+                       "dependencies": {
+                               "vscode-jsonrpc": "6.0.0",
+                               "vscode-languageserver-types": "3.16.0"
+                       }
+               },
+               "node_modules/vscode-languageserver-types": {
+                       "version": "3.16.0",
+                       "resolved": 
"https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz";,
+                       "integrity": 
"sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA=="
+               },
+               "node_modules/vscode-test": {
+                       "version": "1.4.0",
+                       "resolved": 
"https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz";,
+                       "integrity": 
"sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==",
+                       "dev": true,
+                       "dependencies": {
+                               "http-proxy-agent": "^2.1.0",
+                               "https-proxy-agent": "^2.2.4",
+                               "rimraf": "^2.6.3"
+                       },
+                       "engines": {
+                               "node": ">=8.9.3"
+                       }
+               },
+               "node_modules/which": {
+                       "version": "2.0.2",
+                       "resolved": 
"https://registry.npmjs.org/which/-/which-2.0.2.tgz";,
+                       "integrity": 
"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+                       "dev": true,
+                       "dependencies": {
+                               "isexe": "^2.0.0"
+                       },
+                       "bin": {
+                               "node-which": "bin/node-which"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/workerpool": {
+                       "version": "6.1.5",
+                       "resolved": 
"https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz";,
+                       "integrity": 
"sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+                       "dev": true
+               },
+               "node_modules/wrap-ansi": {
+                       "version": "7.0.0",
+                       "resolved": 
"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz";,
+                       "integrity": 
"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-styles": "^4.0.0",
+                               "string-width": "^4.1.0",
+                               "strip-ansi": "^6.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/wrappy": {
+                       "version": "1.0.2",
+                       "resolved": 
"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";,
+                       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+                       "dev": true
+               },
+               "node_modules/y18n": {
+                       "version": "5.0.8",
+                       "resolved": 
"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz";,
+                       "integrity": 
"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/yallist": {
+                       "version": "4.0.0",
+                       "resolved": 
"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz";,
+                       "integrity": 
"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+               },
+               "node_modules/yargs": {
+                       "version": "16.2.0",
+                       "resolved": 
"https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz";,
+                       "integrity": 
"sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+                       "dev": true,
+                       "dependencies": {
+                               "cliui": "^7.0.2",
+                               "escalade": "^3.1.1",
+                               "get-caller-file": "^2.0.5",
+                               "require-directory": "^2.1.1",
+                               "string-width": "^4.2.0",
+                               "y18n": "^5.0.5",
+                               "yargs-parser": "^20.2.2"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/yargs-parser": {
+                       "version": "20.2.4",
+                       "resolved": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz";,
+                       "integrity": 
"sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/yargs-unparser": {
+                       "version": "2.0.0",
+                       "resolved": 
"https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz";,
+                       "integrity": 
"sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+                       "dev": true,
+                       "dependencies": {
+                               "camelcase": "^6.0.0",
+                               "decamelize": "^4.0.0",
+                               "flat": "^5.0.2",
+                               "is-plain-obj": "^2.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/yocto-queue": {
+                       "version": "0.1.0",
+                       "resolved": 
"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz";,
+                       "integrity": 
"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               }
+       },
        "dependencies": {
                "@types/glob": {
                        "version": "7.1.3",
diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps 
b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
index 4b775fc..b620f30 100644
--- a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
+++ b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
@@ -93,9 +93,9 @@ enterprise/javaee7.api/external/jaxws-api-2.2.8.jar 
java/websvc.jaxws21api/exter
 enterprise/javaee7.api/external/jsr181-api-1.0-MR1.jar 
java/websvc.jaxws21api/external/jaxws-2.2.6-api.zip
 
 # ide/lsp.client and java/java.lsp.server both use LSP libraries, but are 
independent:
-ide/lsp.client/external/org.eclipse.lsp4j-0.9.0.jar 
java/java.lsp.server/external/org.eclipse.lsp4j-0.9.0.jar
-ide/lsp.client/external/org.eclipse.lsp4j.generator-0.9.0.jar 
java/java.lsp.server/external/org.eclipse.lsp4j.generator-0.9.0.jar
-ide/lsp.client/external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar 
java/java.lsp.server/external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+ide/lsp.client/external/org.eclipse.lsp4j-0.12.0.jar 
java/java.lsp.server/external/org.eclipse.lsp4j-0.12.0.jar
+ide/lsp.client/external/org.eclipse.lsp4j.generator-0.12.0.jar 
java/java.lsp.server/external/org.eclipse.lsp4j.generator-0.12.0.jar
+ide/lsp.client/external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar 
java/java.lsp.server/external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar
 ide/lsp.client/external/org.eclipse.xtend.lib-2.19.0.jar 
java/java.lsp.server/external/org.eclipse.xtend.lib-2.19.0.jar
 ide/lsp.client/external/org.eclipse.xtend.lib.macro-2.19.0.jar 
java/java.lsp.server/external/org.eclipse.xtend.lib.macro-2.19.0.jar
 ide/lsp.client/external/org.eclipse.xtext.xbase.lib-2.19.0.jar 
java/java.lsp.server/external/org.eclipse.xtext.xbase.lib-2.19.0.jar

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to