From e305d98118eebbeed239a27fddf773f08cfcc5f6 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 31 Mar 2017 11:59:12 +0300 Subject: [PATCH 01/14] build scripts: ruby_tests.gant rewritten to use new testing scripts Code from cucumber-tests.gant was migrated to UltimateProjectTestingTasks.groovy. --- build/scripts/common_tests.gant | 1 - build/scripts/cucumber-tests.gant | 60 ------------------------------- 2 files changed, 61 deletions(-) delete mode 100644 build/scripts/cucumber-tests.gant diff --git a/build/scripts/common_tests.gant b/build/scripts/common_tests.gant index 42a5e6b76ac7..b1910c35de89 100644 --- a/build/scripts/common_tests.gant +++ b/build/scripts/common_tests.gant @@ -16,7 +16,6 @@ import static org.jetbrains.jps.idea.IdeaProjectLoader.guessHome includeTargets << new File("${guessHome(this)}/build/scripts/utils.gant") -includeTargets << new File("${guessHome(this)}/build/scripts/cucumber-tests.gant") requireProperty("out", "$home/out") diff --git a/build/scripts/cucumber-tests.gant b/build/scripts/cucumber-tests.gant deleted file mode 100644 index 7eb4e4bf40b8..000000000000 --- a/build/scripts/cucumber-tests.gant +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed 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. - */ -target('run_cucumber_tests': "Run cucumber tests") { - if (!isDefined("cucumber_test_dirs")) { - return - } - - cucumber_test_dirs.each { - def m = findModule(it[0]) - def platformPrefix = it[1] - def testsDir = it[2] - def stepDefsPackage = it[3] - - - ant.java(failonerror: "true", classname: "com.intellij.cucumber.CucumberMain", fork: "true", dir: testsDir) { - jvmarg(line: "-Xmx512m") - jvmarg(line: "-XX:MaxPermSize=350m") - jvmarg(line: "-XX:+HeapDumpOnOutOfMemoryError") - jvmarg(line: "-ea") - jvmarg(line: "-Didea.platform.prefix=$platformPrefix") - - System.getProperties().entrySet().each { - if (it.key.startsWith("pass.")) { - def trimmed = it.key.substring("pass.".length()); - jvmarg(value: "-D${trimmed}=${it.value}"); - }; - } - - arg(value: "--format") - arg(value: "org.jetbrains.plugins.cucumber.java.run.CucumberJvmSMFormatter") - arg(value: "--glue") - arg(value: stepDefsPackage) - arg(value: ".") - - classpath() { - projectBuilder.moduleRuntimeClasspath(findModule("cucumber-test-runner"), false).each { - pathelement(location: it) - } - projectBuilder.moduleRuntimeClasspath(m, true).each { - pathelement(location: it) - } - } - } - - } - -} From 993f405f097d32417bde4624c5d24258a4c04274 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 31 Mar 2017 12:37:17 +0300 Subject: [PATCH 02/14] IDEA-168375 Emulate method breakpoints: make the progress non modal - allow early termination --- .../ui/breakpoints/MethodBreakpoint.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java index 1a7da7eda2fe..da776d39b2bf 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java @@ -48,7 +48,9 @@ import com.intellij.psi.*; import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; +import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.breakpoints.XBreakpoint; +import com.intellij.xdebugger.breakpoints.XBreakpointListener; import com.sun.jdi.*; import com.sun.jdi.event.LocatableEvent; import com.sun.jdi.event.MethodEntryEvent; @@ -69,6 +71,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes; import javax.swing.*; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.stream.Stream; @@ -132,7 +135,7 @@ public class MethodBreakpoint extends BreakpointWithHighlighter indicatorRef = new AtomicReference<>(); + AtomicReference indicatorRef = new AtomicReference<>(); ApplicationManager.getApplication().invokeAndWait( () -> { ProgressWindowWithNotification progress = @@ -140,13 +143,35 @@ public class MethodBreakpoint extends BreakpointWithHighlighter> listener = new XBreakpointListener>() { + void changed(@NotNull XBreakpoint b) { + if (b == breakpoint.getXBreakpoint()) { + changed.set(true); + indicator.cancel(); + } + } + + @Override + public void breakpointRemoved(@NotNull XBreakpoint b) { + changed(b); + } + + @Override + public void breakpointChanged(@NotNull XBreakpoint b) { + changed(b); + } + }; + + XDebuggerManager.getInstance(debugProcess.getProject()).getBreakpointManager().addBreakpointListener(listener, indicator); ProgressManager.getInstance().executeProcessUnderProgress( () -> processPreparedSubTypes(baseType, subType -> createRequestForPreparedClassEmulated(breakpoint, debugProcess, subType, false), indicator), indicator); - if (indicator.isCanceled()) { + if (indicator.isCanceled() && !changed.get()) { breakpoint.disableEmulation(); } } From aa9a2c64b14be9e055aba3d3fbc716658c8b4edb Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 31 Mar 2017 12:54:12 +0300 Subject: [PATCH 03/14] build scripts: removed reference to obsolete cucumber tests for old gant scripts --- build/scripts/common_tests.gant | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/common_tests.gant b/build/scripts/common_tests.gant index b1910c35de89..898b8938f613 100644 --- a/build/scripts/common_tests.gant +++ b/build/scripts/common_tests.gant @@ -107,5 +107,5 @@ target('run_tests': 'Run java tests') { } target('default' : "Run all tests") { - depends([compile, run_tests, run_cucumber_tests]) + depends([compile, run_tests]) } \ No newline at end of file From 6877760adfd017f7a600eab709cef3aa6e150ca3 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 31 Mar 2017 13:29:32 +0300 Subject: [PATCH 04/14] IDEA-160885 "Quick evaluate expression" responds quite slowly --- .../xdebugger/impl/evaluate/quick/XValueHint.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java index 1ed74cb299be..ba61acf15859 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/XValueHint.java @@ -68,6 +68,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; /** * @author nik @@ -162,8 +163,9 @@ public class XValueHint extends AbstractValueHint { @Override protected void evaluateAndShowHint() { + AtomicBoolean showEvaluating = new AtomicBoolean(true); EdtExecutorService.getScheduledExecutorInstance().schedule(() -> { - if (myCurrentHint == null) { + if (myCurrentHint == null && showEvaluating.get()) { SimpleColoredComponent component = HintUtil.createInformationComponent(); component.append(XDebuggerUIConstants.EVALUATING_EXPRESSION_MESSAGE); showHint(component); @@ -181,6 +183,7 @@ public class XValueHint extends AbstractValueHint { public void applyPresentation(@Nullable Icon icon, @NotNull XValuePresentation valuePresenter, boolean hasChildren) { + showEvaluating.set(false); if (isHintHidden()) { return; } @@ -230,6 +233,10 @@ public class XValueHint extends AbstractValueHint { @Override public void errorOccurred(@NotNull final String errorMessage) { + showEvaluating.set(false); + if (myCurrentHint != null) { + myCurrentHint.hide(); + } if (getType() == ValueHintType.MOUSE_CLICK_HINT) { ApplicationManager.getApplication().invokeLater(() -> showHint(HintUtil.createErrorLabel(errorMessage))); } From 5068a62d2e26f58dcbd73aef53455cb0bf61e68d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 31 Mar 2017 12:30:55 +0200 Subject: [PATCH 05/14] fixing compilation --- .idea/modules.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 7e7c54b009a4..430c128405c2 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -12,7 +12,7 @@ - + From 8bc76bd48dae889f606d4b4decf9ef1c7869df7d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 31 Mar 2017 12:40:39 +0200 Subject: [PATCH 06/14] delete outdated code --- .../aether-dependency-resolver.iml | 30 ---- .../aether/ArtifactRepositoryManager.java | 143 ------------------ .../idea/maven/aether/ProgressConsumer.java | 14 -- 3 files changed, 187 deletions(-) delete mode 100644 plugins/maven/aether-dependency-resolver/aether-dependency-resolver.iml delete mode 100644 plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java delete mode 100644 plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ProgressConsumer.java diff --git a/plugins/maven/aether-dependency-resolver/aether-dependency-resolver.iml b/plugins/maven/aether-dependency-resolver/aether-dependency-resolver.iml deleted file mode 100644 index 5757c5ed71f9..000000000000 --- a/plugins/maven/aether-dependency-resolver/aether-dependency-resolver.iml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java b/plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java deleted file mode 100644 index 5b3491ae9458..000000000000 --- a/plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ArtifactRepositoryManager.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.jetbrains.idea.maven.aether; - -import org.apache.maven.repository.internal.MavenRepositorySystemUtils; -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.impl.DefaultServiceLocator; -import org.eclipse.aether.repository.LocalRepository; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.resolution.DependencyRequest; -import org.eclipse.aether.resolution.DependencyResult; -import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; -import org.eclipse.aether.spi.connector.transport.TransporterFactory; -import org.eclipse.aether.transfer.TransferEvent; -import org.eclipse.aether.transfer.TransferListener; -import org.eclipse.aether.transport.file.FileTransporterFactory; -import org.eclipse.aether.transport.http.HttpTransporterFactory; -import org.eclipse.aether.util.artifact.JavaScopes; -import org.eclipse.aether.util.filter.DependencyFilterUtils; -import org.eclipse.aether.util.version.GenericVersionScheme; -import org.eclipse.aether.version.InvalidVersionSpecificationException; -import org.eclipse.aether.version.Version; -import org.eclipse.aether.version.VersionScheme; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * @author Eugene Zhuravlev - * Date: 20-Jun-16 - * - * Aether-based repository manager and dependency resolver using maven implementation of this functionality. - * - * instance of this component should be managed by the code which requires dependency resolution functionality - * all necessary params like path to local repo should be passed in constructor - * - */ -public class ArtifactRepositoryManager { - private static final String ARTIFACT_EXTENSION = "jar"; - private final VersionScheme myVersioning = new GenericVersionScheme(); - private final DefaultRepositorySystemSession mySession; - - // todo: more remotes? make remote repos configurable? - public static final List REMOTE_REPOSITORIES = Collections.singletonList( - new RemoteRepository.Builder("central", "default", "http://central.maven.org/maven2/").build() - ); - private static final RepositorySystem ourSystem; - static { - final DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); - locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); - locator.addService(TransporterFactory.class, FileTransporterFactory.class); - locator.addService(TransporterFactory.class, HttpTransporterFactory.class); - locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() { - public void serviceCreationFailed(Class type, Class impl, Throwable exception) { - if (exception != null) { - throw new RuntimeException(exception); - } - } - }); - ourSystem = locator.getService(RepositorySystem.class); - } - - public ArtifactRepositoryManager(@NotNull File localRepositoryPath) { - this(localRepositoryPath, ProgressConsumer.DEAF); - } - - public ArtifactRepositoryManager(@NotNull File localRepositoryPath, @NotNull final ProgressConsumer progressConsumer) { - final DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); - if (progressConsumer != ProgressConsumer.DEAF) { - session.setTransferListener((TransferListener)Proxy - .newProxyInstance(session.getClass().getClassLoader(), new Class[]{TransferListener.class}, new InvocationHandler() { - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - final Object event = args[0]; - if (event instanceof TransferEvent) { - progressConsumer.consume(event.toString()); - //if (((TransferEvent)event).getType() != TransferEvent.EventType.PROGRESSED) { - // progressConsumer.consume(event.toString()); - //} - } - return null; - } - })); - } - // setup session here - - session.setLocalRepositoryManager(ourSystem.newLocalRepositoryManager(session, new LocalRepository(localRepositoryPath))); - session.setReadOnly(); - mySession = session; - } - - public Collection resolveDependency(String groupId, String artifactId, String version) throws Exception { - final DependencyRequest dependencyRequest = new DependencyRequest( - createCollectRequest(groupId, artifactId, toVersion(version)), - DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE) - ); - - final DependencyResult result = ourSystem.resolveDependencies(mySession, dependencyRequest); - final List files = new ArrayList<>(); - for (ArtifactResult artifactResult : result.getArtifactResults()) { - files.add(artifactResult.getArtifact().getFile()); - } - return files; - } - - private static CollectRequest createCollectRequest(String groupId, String artifactId, Version version) { - return createCollectRequest(groupId, artifactId, Collections.singleton(version)); - } - private static CollectRequest createCollectRequest(String groupId, String artifactId, Collection versions) { - CollectRequest request = new CollectRequest(); - for (Artifact artifact : toArtifacts(groupId, artifactId, versions)) { - request.addDependency(new Dependency(artifact, JavaScopes.COMPILE)); - } - return request.setRepositories(REMOTE_REPOSITORIES); - } - - private Version toVersion(String version) throws InvalidVersionSpecificationException { - return myVersioning.parseVersion(version); - } - - private static List toArtifacts(String groupId, String artifactId, Collection versions) { - if (versions.isEmpty()) { - return Collections.emptyList(); - } - final List result = new ArrayList<>(versions.size()); - for (Version version : versions) { - result.add(new DefaultArtifact(groupId, artifactId, ARTIFACT_EXTENSION, version.toString())); - } - return result; - } - -} diff --git a/plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ProgressConsumer.java b/plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ProgressConsumer.java deleted file mode 100644 index c59606bcee2a..000000000000 --- a/plugins/maven/aether-dependency-resolver/src/org/jetbrains/idea/maven/aether/ProgressConsumer.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.idea.maven.aether; - -/** - * @author Eugene Zhuravlev - * Date: 12-Aug-16 - */ -public interface ProgressConsumer { - ProgressConsumer DEAF = new ProgressConsumer() { - public void consume(String message) { - } - }; - - void consume(String message); -} From 6fe5a981d880eb73774d2150cb87a39f4f260067 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 31 Mar 2017 11:43:00 +0100 Subject: [PATCH 07/14] Bounce the app icon when a password is requested --- .../src/com/intellij/credentialStore/credentialPromt.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt index daf18871d55d..4c9809f088dc 100644 --- a/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt +++ b/platform/platform-impl/src/com/intellij/credentialStore/credentialPromt.kt @@ -21,6 +21,7 @@ import com.intellij.ide.passwordSafe.PasswordSafe import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.invokeAndWaitIfNeed import com.intellij.openapi.project.Project +import com.intellij.ui.AppIcon import com.intellij.ui.components.CheckBox import com.intellij.ui.components.dialog import com.intellij.ui.layout.* @@ -83,6 +84,7 @@ fun askCredentials(project: Project?, } } + AppIcon.getInstance().requestAttention(project, true) if (dialog(dialogTitle, project = project, panel = panel, focusedComponent = passwordField, errorText = error).showAndGet()) { val isMemoryOnly = store.isMemoryOnly || !rememberCheckBox!!.isSelected val credentials = Credentials(attributes.userName, passwordField.password.nullize()) From 66160b3b2bbda37254a36f1c9e1469e0ca9bb2e1 Mon Sep 17 00:00:00 2001 From: Konstantin Aleev Date: Fri, 31 Mar 2017 14:14:59 +0300 Subject: [PATCH 08/14] FinderRecursivePanel: provide a method to set a tool tip text --- .../com/intellij/ui/FinderRecursivePanel.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java b/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java index a6997b918a5a..49bedf73067a 100644 --- a/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java +++ b/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java @@ -190,7 +190,7 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement ScrollPaneFactory.createScrollPane(myList, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - return ListWithFilter.wrap(myList, pane, (Function)o -> getItemText(o)); + return ListWithFilter.wrap(myList, pane, o -> getItemText(o)); } protected JBList createList() { @@ -298,13 +298,8 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement } private void installSpeedSearch(JBList list) { - final ListSpeedSearch search = new ListSpeedSearch(list, new Function() { - @Override - public String fun(Object o) { - //noinspection unchecked - return getItemText((T)o); - } - }); + //noinspection unchecked + final ListSpeedSearch search = new ListSpeedSearch(list, (Function)o -> getItemText((T)o)); search.setComparator(new SpeedSearchComparator(false)); } @@ -346,6 +341,7 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement try { setIcon(getItemIcon(t)); append(getItemText(t)); + this.setToolTipText(getItemTooltipText(t)); } catch (IndexNotReadyException e) { append("loading..."); @@ -379,6 +375,7 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement : AllIcons.Icons.Ide.NextStepGrayed); result.add(this, BorderLayout.CENTER); result.add(childrenLabel, BorderLayout.EAST); + result.setToolTipText(this.getToolTipText()); return result; } return this; @@ -393,6 +390,20 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement protected void doCustomizeCellRenderer(SimpleColoredComponent comp, JList list, T value, int index, boolean selected, boolean hasFocus) { } + /** + * This method is invoked by panel's list cell render in order to set a tool tip text for the list cell render component. + * It is invoked before {@link #doCustomizeCellRenderer(SimpleColoredComponent, JList, Object, int, boolean, boolean)}, + * thus the tool tip may still be reset in {@link #doCustomizeCellRenderer(SimpleColoredComponent, JList, Object, int, boolean, boolean)}. + * + * @param t the list item + * @return the text to display in a tool tip for the given list item + * @since 2017.2 + */ + @Nullable + protected String getItemTooltipText(T t) { + return null; + } + @Nullable @Override public Object getData(@NonNls String dataId) { From 54adc9a4b045b7a812dda1a7894cce4cbb52b394 Mon Sep 17 00:00:00 2001 From: Kirill Kirichenko Date: Fri, 31 Mar 2017 15:01:36 +0300 Subject: [PATCH 09/14] IDEA-168273 retina thin lines and combobox fixed --- .../com/intellij/ide/ui/laf/darcula/ui/DarculaSpinnerUI.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaSpinnerUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaSpinnerUI.java index 2902e47a24f1..d41200bd0164 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaSpinnerUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaSpinnerUI.java @@ -137,10 +137,8 @@ public class DarculaSpinnerUI extends BasicSpinnerUI { } protected void layoutEditor(@NotNull JComponent editor) { - if (editor != null) { - final Rectangle bounds = editor.getBounds(); + Rectangle bounds = editor.getBounds(); editor.setBounds(bounds.x, bounds.y, bounds.width - 6, bounds.height); - } } protected void paintArrowButton(Graphics g, From 59f83176ed8374f0c68d7c0216907fe687a944a9 Mon Sep 17 00:00:00 2001 From: Kirill Kirichenko Date: Fri, 31 Mar 2017 15:02:30 +0300 Subject: [PATCH 10/14] IDEA-168273 retina thin lines and combobox fixed --- .../ide/ui/laf/darcula/DarculaUIUtil.java | 55 ++++++++++----- .../ui/laf/intellij/MacComboBoxBorder.java | 69 ++++++++++++------- .../laf/intellij/MacIntelliJComboBoxUI.java | 5 +- .../ui/laf/intellij/MacIntelliJSpinnerUI.java | 28 +++++--- .../laf/intellij/MacIntelliJTextBorder.java | 26 ++++--- .../laf/intellij/MacIntelliJTextFieldUI.java | 65 +++++++++++++---- 6 files changed, 179 insertions(+), 69 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java index 317bddc5741a..fb8092c8812d 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java @@ -28,7 +28,6 @@ import javax.swing.text.Position; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.geom.Path2D; -import java.awt.geom.RoundRectangle2D; import static javax.swing.SwingConstants.EAST; import static javax.swing.SwingConstants.WEST; @@ -116,28 +115,52 @@ public class DarculaUIUtil { } public static void paintErrorBorder(Graphics2D g, int width, int height, int arc, boolean hasFocus) { - int lw = JBUI.scale(UIUtil.isUnderDefaultMacTheme() ? 4 : 3); - - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); g.setPaint(hasFocus ? ACTIVE_ERROR_COLOR : INACTIVE_ERROR_COLOR); - - Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); - path.append(new RoundRectangle2D.Double(0, 0, width, height, arc + lw * 2, arc + lw * 2), false); - path.append(new RoundRectangle2D.Double(lw, lw, width - lw * 2, height - lw * 2, arc, arc), false); - - g.fill(path); + doPaint(g, width, height, arc); } - public static void paintFocusBorder(Graphics2D g, int width, int height, int lw, int arc) { + public static void paintFocusBorder(Graphics2D g, int width, int height, int arc) { + g.setPaint(IntelliJLaf.isGraphite() ? MAC_GRAPHITE_COLOR : MAC_REGULAR_COLOR); + doPaint(g, width, height, arc); + } + + @SuppressWarnings("SuspiciousNameCombination") + private static void doPaint(Graphics2D g, int width, int height, int arc) { + double bw = UIUtil.isRetina(g) ? 0.5 : 1.0; + double lw = JBUI.scale(UIUtil.isUnderDefaultMacTheme() ? 3 : 2); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); - g.setPaint(IntelliJLaf.isGraphite() ? MAC_GRAPHITE_COLOR : MAC_REGULAR_COLOR); + + double outerArc = arc > 0 ? arc + lw - JBUI.scale(2) : lw; + double rightOuterArc = JBUI.scale(6); + Path2D outerRect = new Path2D.Double(Path2D.WIND_EVEN_ODD); + outerRect.moveTo(width - rightOuterArc, 0); + outerRect.quadTo(width, 0, width, rightOuterArc); + outerRect.lineTo(width, height - rightOuterArc); + outerRect.quadTo(width, height, width - rightOuterArc, height); + outerRect.lineTo(outerArc, height); + outerRect.quadTo(0, height, 0, height - outerArc); + outerRect.lineTo(0, outerArc); + outerRect.quadTo(0, 0, outerArc, 0); + outerRect.closePath(); + + lw += bw; + double rightInnerArc = JBUI.scale(7); + Path2D innerRect = new Path2D.Double(Path2D.WIND_EVEN_ODD); + innerRect.moveTo(width - rightInnerArc, lw); + innerRect.quadTo(width - lw, lw , width - lw, rightInnerArc); + innerRect.lineTo(width - lw, height - rightInnerArc); + innerRect.quadTo(width - lw, height - lw, width - rightInnerArc, height - lw); + innerRect.lineTo(outerArc, height - lw); + innerRect.quadTo(lw, height - lw, lw, height - outerArc); + innerRect.lineTo(lw, outerArc); + innerRect.quadTo(lw, lw, outerArc, lw); + innerRect.closePath(); Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); - path.append(new RoundRectangle2D.Double(0, 0, width, height, arc + lw * 2, arc + lw * 2), false); - path.append(new RoundRectangle2D.Double(lw, lw, width - lw * 2, height - lw * 2, arc, arc), false); - + path.append(outerRect, false); + path.append(innerRect, false); g.fill(path); } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacComboBoxBorder.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacComboBoxBorder.java index af450b4ea0a7..3e3944643617 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacComboBoxBorder.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacComboBoxBorder.java @@ -16,9 +16,10 @@ package com.intellij.ide.ui.laf.intellij; import com.intellij.ui.Gray; -import com.intellij.ui.paint.RectanglePainter; import com.intellij.util.ui.JBInsets; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.MacUIUtil; +import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; @@ -27,6 +28,8 @@ import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; +import static com.intellij.ide.ui.laf.intellij.MacIntelliJComboBoxUI.VALUE_OFFSET; + /** * @author Konstantin Bulenkov */ @@ -34,11 +37,13 @@ public class MacComboBoxBorder extends MacIntelliJTextBorder { @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - Graphics2D g2 = (Graphics2D)g.create(); + if (!(c instanceof JComponent)) return; + Graphics2D g2 = (Graphics2D)g.create(); try { g2.translate(x, y); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); Shape clip = g2.getClip(); Area area = new Area(new Rectangle2D.Double(0, 0, width, height)); @@ -46,26 +51,43 @@ public class MacComboBoxBorder extends MacIntelliJTextBorder { area.intersect(new Area(clip)); g2.setClip(area); - int arc = isRound(c) ? JBUI.scale(8) : 0; + int arc = isRound(c) ? JBUI.scale(6) : 0; + Insets i = ((JComponent)c).getInsets(); if (c instanceof JComboBox) { JComboBox comboBox = (JComboBox)c; g2.setColor(UIManager.getColor(comboBox.isEnabled() ? "ComboBox.background" : "ComboBox.disabledBackground")); - Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); - path.moveTo(JBUI.scale(8), JBUI.scale(3)); - path.lineTo(JBUI.scale(8), c.getHeight() - JBUI.scale(3)); - path.lineTo(JBUI.scale(3) + arc, c.getHeight() - JBUI.scale(3)); - path.quadTo(JBUI.scale(3), c.getHeight() - JBUI.scale(3), JBUI.scale(3), c.getHeight() - JBUI.scale(3) - arc); - path.lineTo(JBUI.scale(3), JBUI.scale(3) + arc); - path.quadTo(JBUI.scale(3), JBUI.scale(3), JBUI.scale(3) + arc, JBUI.scale(3)); - path.lineTo(JBUI.scale(8), JBUI.scale(3)); - g2.fill(path); + if (comboBox.isEditable()) { + Shape shape = new Rectangle2D.Double(i.left, i.top, + width - (i.left + i.right), + height - (i.top + i.bottom)); + g2.fill(shape); + } else { + Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); + path.moveTo(i.left + VALUE_OFFSET, i.top); + path.lineTo(i.left + VALUE_OFFSET, c.getHeight() - i.bottom); + path.lineTo(i.left + arc, c.getHeight() - i.bottom); + path.quadTo(i.left, c.getHeight() - i.bottom, i.left, c.getHeight() - arc - i.bottom); + path.lineTo(i.left, arc + i.top); + path.quadTo(i.left, i.top, arc + i.left, i.top); + path.closePath(); + g2.fill(path); + } } - RectanglePainter.paint(g2, JBUI.scale(3), JBUI.scale(3), - c.getWidth() - JBUI.scale(6), - c.getHeight() - JBUI.scale(6), - arc, null, Gray.xBC); + Path2D border = new Path2D.Double(Path2D.WIND_EVEN_ODD); + double lw = UIUtil.isRetina(g2) ? 0.5 : 1.0; + border.append(new RoundRectangle2D.Double(JBUI.scale(3), JBUI.scale(3), + c.getWidth() - JBUI.scale(6), + c.getHeight() - JBUI.scale(6), + arc, arc), false); + double innerArc = arc > 0 ? arc - lw : 0.0; + border.append(new RoundRectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + c.getWidth() - JBUI.scale(6) - lw * 2, + c.getHeight() - JBUI.scale(6) - lw * 2, + innerArc, innerArc), false); + g2.setColor(Gray.xBC); + g2.fill(border); g2.setClip(clip); // Reset clip paint(c, g2, width, height, arc); @@ -109,14 +131,15 @@ public class MacComboBoxBorder extends MacIntelliJTextBorder { @Override void clipForBorder(Component c, Graphics2D g2, int width, int height) { Area area = new Area(new Rectangle2D.Double(0, 0, width, height)); + double lw = UIUtil.isRetina(g2) ? 0.5 : 1.0; Shape innerShape = isRound(c) ? - new RoundRectangle2D.Double(JBUI.scale(4), JBUI.scale(4), - width - JBUI.scale(8), - height - JBUI.scale(8), - JBUI.scale(10), JBUI.scale(10)) : - new Rectangle2D.Double(JBUI.scale(4), JBUI.scale(4), - width - JBUI.scale(8), - height - JBUI.scale(8)); + new RoundRectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + width - JBUI.scale(6) - lw * 2, + height - JBUI.scale(6) - lw * 2, + JBUI.scale(3) + lw, JBUI.scale(3) + lw) : + new Rectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + width - JBUI.scale(6) - lw * 2, + height - JBUI.scale(6) - lw * 2); area.subtract(new Area(innerShape)); area.add(getButtonBounds(c)); diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJComboBoxUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJComboBoxUI.java index 9a595f2eb977..5233d70ccfaf 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJComboBoxUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJComboBoxUI.java @@ -40,6 +40,7 @@ import java.beans.PropertyChangeListener; public class MacIntelliJComboBoxUI extends BasicComboBoxUI { private static final Border ourDefaultEditorBorder = JBUI.Borders.empty(1, 0); + static final int VALUE_OFFSET = JBUI.scale(5); private Icon DEFAULT_ICON; private PropertyChangeListener myEditorChangeListener; @@ -243,8 +244,8 @@ public class MacIntelliJComboBoxUI extends BasicComboBoxUI { @Override protected Rectangle rectangleForCurrentValue() { Rectangle rect = super.rectangleForCurrentValue(); - rect.x += JBUI.scale(5); - rect.width -= JBUI.scale(5); + rect.x += VALUE_OFFSET; + rect.width -= VALUE_OFFSET; return rect; } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJSpinnerUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJSpinnerUI.java index f19d6760765b..7d3f4c612ca8 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJSpinnerUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJSpinnerUI.java @@ -25,6 +25,8 @@ import javax.swing.*; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicArrowButton; import java.awt.*; +import java.awt.geom.Path2D; + /** * @author Konstantin Bulenkov @@ -42,21 +44,31 @@ public class MacIntelliJSpinnerUI extends DarculaSpinnerUI { Container parent = c.getParent(); if (c.isOpaque() && parent != null) { g.setColor(parent.getBackground()); - g.fillRect(0,0,c.getWidth(),c.getHeight()); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); } Insets i = c.getInsets(); - int x = c.getWidth() - DEFAULT_ICON.getIconWidth() - i.right; - Icon icon = MacIntelliJIconCache.getIcon("spinnerRight", false, false, c.isEnabled()); - icon.paintIcon(c, g, x, i.top); if (c instanceof JSpinner) { - JComponent editor = ((JSpinner)c).getEditor(); - Rectangle editorBounds = editor.getBounds(); - g.setColor(UIManager.getColor("FormattedTextField.background")); - g.fillRect(i.left + JBUI.scale(1), i.top + JBUI.scale(1), x - JBUI.scale(1) - i.left, editorBounds.height + JBUI.scale(2)); + Graphics2D g2 = (Graphics2D)g; + g2.setColor(UIManager.getColor("FormattedTextField.background")); + + double arc = JBUI.scale(6); + Path2D rect = new Path2D.Double(Path2D.WIND_EVEN_ODD); + rect.moveTo(x, i.top); + rect.lineTo(x, c.getHeight() - i.bottom); + rect.lineTo(i.left + arc, c.getHeight() - i.bottom); + rect.quadTo(i.left, c.getHeight() - i.bottom, i.left, c.getHeight() - i.bottom - arc); + rect.lineTo(i.left, i.top + arc); + rect.quadTo(i.left, i.top, i.left + arc, i.top); + rect.closePath(); + + g2.fill(rect); } + + Icon icon = MacIntelliJIconCache.getIcon("spinnerRight", false, false, c.isEnabled()); + icon.paintIcon(c, g, x, i.top); } @Override protected void paintArrowButton(Graphics g, BasicArrowButton button, int direction) {} diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextBorder.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextBorder.java index 0facdf1c9621..198afeaf25f0 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextBorder.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextBorder.java @@ -20,12 +20,13 @@ import com.intellij.ide.ui.laf.darcula.ui.DarculaTextBorder; import com.intellij.ide.ui.laf.darcula.ui.TextFieldWithPopupHandlerUI; import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.Gray; -import com.intellij.ui.paint.RectanglePainter; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; import java.awt.geom.Area; +import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; /** @@ -51,9 +52,17 @@ public class MacIntelliJTextBorder extends DarculaTextBorder { Graphics2D g2 = (Graphics2D)g.create(); try { g2.translate(x, y); - RectanglePainter.paint(g2, JBUI.scale(3), JBUI.scale(3), - c.getWidth() - JBUI.scale(6), - c.getHeight() - JBUI.scale(6), 0, null, Gray.xBC); + + Path2D border = new Path2D.Double(Path2D.WIND_EVEN_ODD); + double lw = UIUtil.isRetina(g2) ? 0.5 : 1.0; + border.append(new Rectangle2D.Double(JBUI.scale(3), JBUI.scale(3), + c.getWidth() - JBUI.scale(6), + c.getHeight() - JBUI.scale(6)), false); + border.append(new Rectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + c.getWidth() - JBUI.scale(6) - lw * 2, + c.getHeight() - JBUI.scale(6) - lw * 2), false); + g2.setColor(Gray.xBC); + g2.fill(border); if (c.getParent() instanceof JComboBox) return; @@ -70,7 +79,7 @@ public class MacIntelliJTextBorder extends DarculaTextBorder { if (Registry.is("ide.inplace.errors.outline") && Boolean.parseBoolean(String.valueOf(eop))) { DarculaUIUtil.paintErrorBorder(g2, width, height, arc, isFocused(c)); } else if (isFocused(c)) { - DarculaUIUtil.paintFocusBorder(g2, width, height, JBUI.scale(4), arc); + DarculaUIUtil.paintFocusBorder(g2, width, height, arc); } } @@ -80,9 +89,10 @@ public class MacIntelliJTextBorder extends DarculaTextBorder { void clipForBorder(Component c, Graphics2D g2, int width, int height) { Area area = new Area(new Rectangle2D.Double(0, 0, width, height)); - area.subtract(new Area(new Rectangle2D.Double(JBUI.scale(4), JBUI.scale(4), - width - JBUI.scale(8), - height - JBUI.scale(8)))); + double lw = UIUtil.isRetina(g2) ? 0.5 : 1.0; + area.subtract(new Area(new Rectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + width - JBUI.scale(6) - lw * 2, + height - JBUI.scale(6) - lw * 2))); area.intersect(new Area(g2.getClip())); g2.setClip(area); } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextFieldUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextFieldUI.java index 1dad871bd85d..4b1c6205f67d 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextFieldUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJTextFieldUI.java @@ -19,8 +19,9 @@ import com.intellij.ide.ui.laf.darcula.DarculaUIUtil; import com.intellij.ide.ui.laf.darcula.ui.TextFieldWithPopupHandlerUI; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.Gray; -import com.intellij.ui.paint.RectanglePainter; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.MacUIUtil; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -28,7 +29,9 @@ import javax.swing.plaf.ComponentUI; import javax.swing.text.JTextComponent; import java.awt.*; import java.awt.geom.Area; +import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; /** * @author Konstantin Bulenkov @@ -160,16 +163,35 @@ public class MacIntelliJTextFieldUI extends TextFieldWithPopupHandlerUI { protected void paintSearchField(Graphics2D g, JTextComponent c, Rectangle r) { Graphics2D g2 = (Graphics2D)g.create(); try { - RectanglePainter.paint(g2, r.x + JBUI.scale(3), r.y + JBUI.scale(3), - r.width - JBUI.scale(6), r.height - JBUI.scale(6), - JBUI.scale(8), c.getBackground(), Gray.xBC); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); + g2.translate(r.x, r.y); + + int arc = JBUI.scale(6); + double lw = UIUtil.isRetina(g2) ? 0.5 : 1.0; + Shape outerShape = new RoundRectangle2D.Double(JBUI.scale(3), JBUI.scale(3), + r.width - JBUI.scale(6), + r.height - JBUI.scale(6), + arc, arc); + g2.setColor(c.getBackground()); + g2.fill(outerShape); + + Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); + path.append(outerShape, false); + path.append(new RoundRectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + r.width - JBUI.scale(6) - lw*2, + r.height - JBUI.scale(6) - lw*2, + arc-lw, arc-lw), false); + + g2.setColor(Gray.xBC); + g2.fill(path); if (c.hasFocus() && c.getClientProperty("JTextField.Search.noBorderRing") != Boolean.TRUE) { - g2.translate(r.x, r.y); - DarculaUIUtil.paintFocusBorder(g2, r.width, r.height, JBUI.scale(4), JBUI.scale(6)); - g2.translate(-r.x, -r.y); + DarculaUIUtil.paintFocusBorder(g2, r.width, r.height, arc); } + g2.translate(-r.x, -r.y); + boolean withHistoryPopup = isSearchFieldWithHistoryPopup(c); Icon label = getSearchIcon(c); boolean isEmpty = !hasText(); @@ -234,12 +256,31 @@ public class MacIntelliJTextFieldUI extends TextFieldWithPopupHandlerUI { public static void paintAquaSearchFocusRing(Graphics2D g, Rectangle r, Component c) { Graphics2D g2 = (Graphics2D)g.create(); try { - RectanglePainter.paint(g, r.x + JBUI.scale(3), r.y + JBUI.scale(3), - r.width - JBUI.scale(6), r.height - JBUI.scale(6), - JBUI.scale(8), c.getBackground(), Gray.xBC); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); + g2.translate(r.x, r.y); + + int arc = JBUI.scale(6); + double lw = UIUtil.isRetina(g2) ? 0.5 : 1.0; + Shape outerShape = new RoundRectangle2D.Double(JBUI.scale(3), JBUI.scale(3), + r.width - JBUI.scale(6), + r.height - JBUI.scale(6), + arc, arc); + g2.setColor(c.getBackground()); + g2.fill(outerShape); + + Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); + path.append(outerShape, false); + path.append(new RoundRectangle2D.Double(JBUI.scale(3) + lw, JBUI.scale(3) + lw, + r.width - JBUI.scale(6) - lw*2, + r.height - JBUI.scale(6) - lw*2, + arc-lw, arc-lw), false); + + g2.setColor(Gray.xBC); + g2.fill(path); + if (c.hasFocus()) { - g.translate(r.x, r.y); - DarculaUIUtil.paintFocusBorder(g, r.width, r.height, JBUI.scale(4), JBUI.scale(6)); + DarculaUIUtil.paintFocusBorder(g2, r.width, r.height, arc); } } finally { From a4e4356f7cb3bba4d4f99e6e8b305b41e6bc1ac0 Mon Sep 17 00:00:00 2001 From: Konstantin Aleev Date: Fri, 31 Mar 2017 15:22:22 +0300 Subject: [PATCH 11/14] FinderRecursivePanel: reorder methods --- .../com/intellij/ui/FinderRecursivePanel.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java b/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java index 49bedf73067a..a775244f5f4f 100644 --- a/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java +++ b/platform/platform-impl/src/com/intellij/ui/FinderRecursivePanel.java @@ -156,6 +156,22 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement return null; } + /** + * Returns tooltip text for the given list item or null if no tooltip is available. + * + *

This method is invoked by panel's list cell render in order to set a tooltip text for the list cell render component. + * It is invoked before {@link #doCustomizeCellRenderer(SimpleColoredComponent, JList, Object, int, boolean, boolean)}, + * thus the tooltip may still be reset in {@code doCustomizeCellRenderer}. + * + * @param t the list item + * @return the text to display in a tooltip for the given list item + * @since 2017.2 + */ + @Nullable + protected String getItemTooltipText(T t) { + return null; + } + protected abstract boolean hasChildren(T t); /** @@ -341,7 +357,7 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement try { setIcon(getItemIcon(t)); append(getItemText(t)); - this.setToolTipText(getItemTooltipText(t)); + setToolTipText(getItemTooltipText(t)); } catch (IndexNotReadyException e) { append("loading..."); @@ -375,7 +391,7 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement : AllIcons.Icons.Ide.NextStepGrayed); result.add(this, BorderLayout.CENTER); result.add(childrenLabel, BorderLayout.EAST); - result.setToolTipText(this.getToolTipText()); + result.setToolTipText(getToolTipText()); return result; } return this; @@ -390,20 +406,6 @@ public abstract class FinderRecursivePanel extends OnePixelSplitter implement protected void doCustomizeCellRenderer(SimpleColoredComponent comp, JList list, T value, int index, boolean selected, boolean hasFocus) { } - /** - * This method is invoked by panel's list cell render in order to set a tool tip text for the list cell render component. - * It is invoked before {@link #doCustomizeCellRenderer(SimpleColoredComponent, JList, Object, int, boolean, boolean)}, - * thus the tool tip may still be reset in {@link #doCustomizeCellRenderer(SimpleColoredComponent, JList, Object, int, boolean, boolean)}. - * - * @param t the list item - * @return the text to display in a tool tip for the given list item - * @since 2017.2 - */ - @Nullable - protected String getItemTooltipText(T t) { - return null; - } - @Nullable @Override public Object getData(@NonNls String dataId) { From 9d74ed70a6bc36120bf71223eebccd2a17db60c9 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Fri, 31 Mar 2017 15:36:51 +0300 Subject: [PATCH 12/14] [groovy] lexer: separate state for when division is expected (IDEA-170650) On document change lexer was started with initial state where '/' is matched as a beginning of the regex literal. --- .../groovy/lang/lexer/_GroovyLexer.java | 2111 +++++++++-------- .../groovy/lang/lexer/GroovyLexerBase.java | 15 +- .../plugins/groovy/lang/lexer/groovy.flex | 49 +- .../lang/parser/CommentsParsingTest.groovy | 5 +- .../lang/parser/ExpressionsParsingTest.groovy | 4 + .../groovy/comments/afterIdentifier.test | 13 + .../groovy/expressions/arithmetic/mul4.test | 11 + .../expressions/regex/afterNewLine.test | 12 + 8 files changed, 1155 insertions(+), 1065 deletions(-) create mode 100644 plugins/groovy/testdata/parsing/groovy/comments/afterIdentifier.test create mode 100644 plugins/groovy/testdata/parsing/groovy/expressions/arithmetic/mul4.test create mode 100644 plugins/groovy/testdata/parsing/groovy/expressions/regex/afterNewLine.test diff --git a/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java b/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java index d9d715a47fd9..a88afb3e2a58 100644 --- a/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java +++ b/plugins/groovy/groovy-psi/gen/org/jetbrains/plugins/groovy/lang/lexer/_GroovyLexer.java @@ -42,16 +42,17 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { /** lexical states */ public static final int YYINITIAL = 0; public static final int IN_INNER_BLOCK = 2; - public static final int IN_SINGLE_GSTRING = 4; - public static final int IN_TRIPLE_GSTRING = 6; - public static final int IN_SLASHY_STRING = 8; - public static final int IN_DOLLAR_SLASH_STRING = 10; - public static final int IN_GSTRING_DOLLAR = 12; - public static final int IN_GSTRING_DOT = 14; - public static final int IN_GSTRING_DOT_IDENT = 16; - public static final int NLS_AFTER_COMMENT = 18; - public static final int NLS_AFTER_LBRACE = 20; - public static final int NLS_AFTER_NLS = 22; + public static final int DIVISION_EXPECTED = 4; + public static final int IN_SINGLE_GSTRING = 6; + public static final int IN_TRIPLE_GSTRING = 8; + public static final int IN_SLASHY_STRING = 10; + public static final int IN_DOLLAR_SLASH_STRING = 12; + public static final int IN_GSTRING_DOLLAR = 14; + public static final int IN_GSTRING_DOT = 16; + public static final int IN_GSTRING_DOT_IDENT = 18; + public static final int NLS_AFTER_COMMENT = 20; + public static final int NLS_AFTER_LBRACE = 22; + public static final int NLS_AFTER_NLS = 24; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l @@ -61,7 +62,7 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { */ private static final int ZZ_LEXSTATE[] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, - 8, 8, 9, 9, 10, 10, 11, 11 + 8, 8, 9, 9, 10, 10, 11, 11, 12, 12 }; /** @@ -139,7 +140,7 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { static final char ZZ_CMAP_A[] = zzUnpackCMap( "\11\0\1\4\1\2\1\1\1\5\1\3\22\0\1\4\1\12\1\46\1\11\1\44\1\104\1\107\1\45\1"+ "\73\1\74\1\10\1\31\1\100\1\32\1\42\1\7\1\34\1\37\10\14\1\77\1\110\1\101\1"+ - "\72\1\102\1\71\1\111\1\13\1\36\1\13\1\26\1\30\1\20\1\16\1\43\1\24\2\43\1\22"+ + "\71\1\102\1\72\1\111\1\13\1\36\1\13\1\26\1\30\1\20\1\16\1\43\1\24\2\43\1\22"+ "\13\43\1\41\2\43\1\75\1\6\1\76\1\105\1\33\1\0\1\51\1\35\1\52\1\25\1\27\1\17"+ "\1\15\1\65\1\23\1\43\1\53\1\21\1\57\1\61\1\60\1\50\1\43\1\56\1\54\1\55\1\62"+ "\1\63\1\67\1\40\1\64\1\66\1\70\1\106\1\47\1\103\6\0\1\1\24\0\1\43\12\0\1\43"+ @@ -191,55 +192,55 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\14\0\1\1\1\2\2\3\1\1\1\4\1\5\1\1"+ + "\15\0\1\1\1\2\2\3\1\1\1\4\1\5\1\1"+ "\1\6\1\7\1\10\5\7\1\11\1\12\1\10\1\7"+ "\1\13\1\7\1\14\1\15\1\16\11\7\1\17\1\20"+ "\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30"+ "\1\31\1\32\1\33\1\34\1\35\1\36\1\37\1\40"+ - "\1\41\2\42\1\43\1\42\1\44\1\45\2\42\2\46"+ - "\1\47\1\44\2\50\1\44\1\51\20\52\1\53\2\54"+ - "\1\55\1\56\1\3\2\56\2\57\2\60\1\0\1\3"+ - "\1\61\1\62\1\63\1\64\1\65\1\66\1\67\1\70"+ - "\1\71\1\72\1\73\1\10\1\74\3\0\5\7\1\75"+ - "\1\7\1\76\1\7\1\77\3\7\1\100\1\101\1\102"+ - "\1\103\1\104\2\0\3\7\1\105\1\106\1\107\1\14"+ - "\1\0\1\14\2\0\1\110\4\7\1\111\21\7\1\112"+ - "\1\113\1\114\1\115\1\116\1\0\1\117\1\0\1\120"+ - "\1\121\1\122\1\123\1\124\1\125\1\0\2\42\1\46"+ - "\1\126\1\127\1\130\1\50\5\52\1\75\1\52\1\76"+ - "\1\52\1\77\12\52\1\111\21\52\1\131\1\0\1\132"+ - "\1\133\1\62\1\134\1\135\1\70\1\136\1\0\1\136"+ - "\3\7\1\137\3\7\1\140\1\141\4\7\2\10\3\7"+ - "\1\142\1\143\4\14\1\110\2\0\1\144\23\7\1\145"+ - "\3\7\1\146\5\7\1\114\1\147\1\150\1\151\1\152"+ - "\1\0\1\153\3\52\1\137\3\52\1\140\1\141\32\52"+ - "\1\145\3\52\1\146\5\52\1\133\1\154\1\62\2\134"+ - "\1\136\1\0\3\7\1\155\6\7\1\156\1\7\1\157"+ - "\2\0\2\7\1\160\3\0\2\14\6\0\7\7\1\161"+ - "\2\7\1\162\10\7\1\163\1\164\3\7\1\165\1\7"+ - "\1\166\1\7\1\167\3\52\1\155\6\52\1\156\1\52"+ - "\1\157\2\52\1\160\7\52\1\161\2\52\1\162\10\52"+ - "\1\163\1\164\3\52\1\165\1\52\1\166\1\52\1\133"+ - "\2\154\1\62\1\0\1\134\1\170\1\171\1\172\7\7"+ - "\1\173\1\7\1\14\1\0\1\14\3\0\6\7\1\174"+ - "\1\175\3\7\1\176\1\7\1\177\1\7\1\200\1\7"+ - "\1\201\3\7\1\202\1\170\1\171\1\172\7\52\1\173"+ - "\7\52\1\174\1\175\3\52\1\176\1\52\1\177\1\52"+ - "\1\200\1\52\1\201\3\52\1\202\1\133\1\0\1\154"+ - "\1\0\2\7\1\203\3\7\1\204\5\7\1\205\1\7"+ - "\1\206\1\7\1\207\2\7\1\210\1\7\1\211\1\212"+ - "\1\213\1\7\2\52\1\203\3\52\1\204\5\52\1\205"+ - "\1\52\1\206\1\52\1\207\2\52\1\210\1\52\1\211"+ - "\1\212\1\213\1\52\1\0\1\214\3\7\1\215\1\216"+ - "\1\217\1\220\1\221\7\7\1\214\3\52\1\215\1\216"+ - "\1\217\1\220\1\221\7\52\4\7\1\222\1\223\1\224"+ - "\2\7\1\225\4\52\1\222\1\223\1\224\2\52\1\225"+ - "\2\7\1\226\1\227\1\7\1\230\2\52\1\226\1\227"+ - "\1\52\1\230\1\231\1\232\1\7\1\231\1\232\1\52"+ - "\1\7\1\52\2\233"; + "\1\41\4\42\2\43\1\44\1\43\1\45\1\46\2\43"+ + "\2\47\1\50\1\45\2\51\1\45\1\52\20\53\1\54"+ + "\2\55\1\56\1\57\1\3\2\57\2\60\2\61\1\0"+ + "\1\3\1\62\1\63\1\64\1\65\1\66\1\67\1\70"+ + "\1\71\1\72\1\73\1\74\1\10\1\75\3\0\5\7"+ + "\1\76\1\7\1\77\1\7\1\100\3\7\1\101\1\102"+ + "\1\103\1\104\1\105\2\0\3\7\1\106\1\107\1\110"+ + "\1\14\1\0\1\14\2\0\1\111\4\7\1\112\21\7"+ + "\1\113\1\114\1\115\1\116\1\117\1\0\1\120\1\0"+ + "\1\121\1\122\1\123\1\124\1\125\1\126\1\127\1\130"+ + "\1\0\2\43\1\47\1\131\1\132\1\133\1\51\5\53"+ + "\1\76\1\53\1\77\1\53\1\100\12\53\1\112\21\53"+ + "\1\134\1\0\1\135\1\136\1\63\1\137\1\140\1\71"+ + "\1\141\1\0\1\141\3\7\1\142\3\7\1\143\1\144"+ + "\4\7\2\10\3\7\1\145\1\146\4\14\1\111\2\0"+ + "\1\147\23\7\1\150\3\7\1\151\5\7\1\113\1\152"+ + "\1\153\1\154\1\155\1\0\1\156\3\53\1\142\3\53"+ + "\1\143\1\144\32\53\1\150\3\53\1\151\5\53\1\136"+ + "\1\157\1\63\2\137\1\141\1\0\3\7\1\160\6\7"+ + "\1\161\1\7\1\162\2\0\2\7\1\163\3\0\2\14"+ + "\6\0\7\7\1\164\2\7\1\165\10\7\1\166\1\167"+ + "\3\7\1\170\1\7\1\171\1\7\1\172\3\53\1\160"+ + "\6\53\1\161\1\53\1\162\2\53\1\163\7\53\1\164"+ + "\2\53\1\165\10\53\1\166\1\167\3\53\1\170\1\53"+ + "\1\171\1\53\1\136\2\157\1\63\1\0\1\137\1\173"+ + "\1\174\1\175\7\7\1\176\1\7\1\14\1\0\1\14"+ + "\3\0\6\7\1\177\1\200\3\7\1\201\1\7\1\202"+ + "\1\7\1\203\1\7\1\204\3\7\1\205\1\173\1\174"+ + "\1\175\7\53\1\176\7\53\1\177\1\200\3\53\1\201"+ + "\1\53\1\202\1\53\1\203\1\53\1\204\3\53\1\205"+ + "\1\136\1\0\1\157\1\0\2\7\1\206\3\7\1\207"+ + "\5\7\1\210\1\7\1\211\1\7\1\212\2\7\1\213"+ + "\1\7\1\214\1\215\1\216\1\7\2\53\1\206\3\53"+ + "\1\207\5\53\1\210\1\53\1\211\1\53\1\212\2\53"+ + "\1\213\1\53\1\214\1\215\1\216\1\53\1\0\1\217"+ + "\3\7\1\220\1\221\1\222\1\223\1\224\7\7\1\217"+ + "\3\53\1\220\1\221\1\222\1\223\1\224\7\53\4\7"+ + "\1\225\1\226\1\227\2\7\1\230\4\53\1\225\1\226"+ + "\1\227\2\53\1\230\2\7\1\231\1\232\1\7\1\233"+ + "\2\53\1\231\1\232\1\53\1\233\1\234\1\235\1\7"+ + "\1\234\1\235\1\53\1\7\1\53\2\236"; private static int [] zzUnpackAction() { - int [] result = new int[679]; + int [] result = new int[686]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -265,93 +266,94 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\112\0\224\0\336\0\u0128\0\u0172\0\u01bc\0\u0206"+ - "\0\u0250\0\u029a\0\u02e4\0\u032e\0\u0378\0\u03c2\0\u0378\0\u03c2"+ + "\0\u0250\0\u029a\0\u02e4\0\u032e\0\u0378\0\u03c2\0\u040c\0\u03c2"+ "\0\u040c\0\u0456\0\u04a0\0\u04ea\0\u0534\0\u057e\0\u05c8\0\u0612"+ "\0\u065c\0\u06a6\0\u06f0\0\u073a\0\u0784\0\u07ce\0\u0818\0\u0862"+ - "\0\u08ac\0\u08f6\0\u0940\0\u098a\0\u0378\0\u09d4\0\u0a1e\0\u0a68"+ - "\0\u0ab2\0\u0afc\0\u0b46\0\u0b90\0\u0bda\0\u0c24\0\u0378\0\u0c6e"+ - "\0\u0cb8\0\u0378\0\u0378\0\u0378\0\u0378\0\u0378\0\u0378\0\u0d02"+ - "\0\u0d4c\0\u0378\0\u0d96\0\u0de0\0\u0e2a\0\u0e74\0\u0378\0\u0378"+ - "\0\u0378\0\u0ebe\0\u0f08\0\u0f52\0\u0f9c\0\u0378\0\u0378\0\u0fe6"+ - "\0\u1030\0\u107a\0\u10c4\0\u0378\0\u110e\0\u1158\0\u11a2\0\u11ec"+ - "\0\u0378\0\u1236\0\u1280\0\u12ca\0\u1314\0\u135e\0\u13a8\0\u13f2"+ - "\0\u143c\0\u1486\0\u14d0\0\u151a\0\u1564\0\u15ae\0\u15f8\0\u1642"+ - "\0\u168c\0\u0378\0\u0378\0\u16d6\0\u0378\0\u0378\0\u1720\0\u176a"+ - "\0\u17b4\0\u0378\0\u176a\0\u0378\0\u176a\0\u17fe\0\u1848\0\u1892"+ - "\0\u18dc\0\u0378\0\u1926\0\u0378\0\u0378\0\u1970\0\u19ba\0\u0378"+ - "\0\u0378\0\u0378\0\u0378\0\u0378\0\u1a04\0\u1a4e\0\u1a98\0\u1ae2"+ - "\0\u1b2c\0\u1b76\0\u1bc0\0\u1c0a\0\u057e\0\u1c54\0\u1c9e\0\u1ce8"+ - "\0\u1d32\0\u1d7c\0\u1dc6\0\u1e10\0\u0378\0\u0378\0\u0378\0\u0378"+ - "\0\u0378\0\u1e5a\0\u1ea4\0\u1eee\0\u1f38\0\u1f82\0\u1fcc\0\u0378"+ - "\0\u0378\0\u2016\0\u2060\0\u20aa\0\u20f4\0\u213e\0\u2188\0\u21d2"+ - "\0\u221c\0\u2266\0\u22b0\0\u22fa\0\u2344\0\u238e\0\u23d8\0\u2422"+ - "\0\u246c\0\u24b6\0\u2500\0\u254a\0\u2594\0\u25de\0\u2628\0\u2672"+ - "\0\u26bc\0\u2706\0\u2750\0\u279a\0\u27e4\0\u0378\0\u0378\0\u282e"+ - "\0\u0378\0\u2878\0\u28c2\0\u0378\0\u290c\0\u0378\0\u0378\0\u0378"+ - "\0\u0378\0\u0378\0\u0378\0\u2956\0\u0378\0\u29a0\0\u0378\0\u0378"+ - "\0\u0378\0\u0378\0\u0378\0\u29ea\0\u2a34\0\u2a7e\0\u2ac8\0\u2b12"+ - "\0\u1236\0\u2b5c\0\u2ba6\0\u2bf0\0\u2c3a\0\u2c84\0\u2cce\0\u2d18"+ - "\0\u2d62\0\u2dac\0\u2df6\0\u2e40\0\u2e8a\0\u2ed4\0\u2f1e\0\u2f68"+ - "\0\u2fb2\0\u2ffc\0\u3046\0\u3090\0\u30da\0\u3124\0\u316e\0\u31b8"+ - "\0\u3202\0\u324c\0\u3296\0\u32e0\0\u332a\0\u3374\0\u33be\0\u3408"+ - "\0\u3452\0\u349c\0\u176a\0\u34e6\0\u3530\0\u357a\0\u35c4\0\u0378"+ - "\0\u0378\0\u360e\0\u3658\0\u36a2\0\u36ec\0\u3736\0\u3780\0\u057e"+ - "\0\u37ca\0\u3814\0\u385e\0\u38a8\0\u38f2\0\u393c\0\u3986\0\u39d0"+ - "\0\u3a1a\0\u3a64\0\u3aae\0\u3af8\0\u3b42\0\u3b8c\0\u0378\0\u0378"+ - "\0\u0378\0\u3bd6\0\u3c20\0\u3c6a\0\u0378\0\u3cb4\0\u3cfe\0\u3d48"+ - "\0\u3d92\0\u3ddc\0\u3e26\0\u3e70\0\u3eba\0\u3f04\0\u3f4e\0\u3f98"+ - "\0\u3fe2\0\u402c\0\u4076\0\u40c0\0\u410a\0\u4154\0\u419e\0\u41e8"+ - "\0\u4232\0\u427c\0\u42c6\0\u057e\0\u4310\0\u435a\0\u43a4\0\u057e"+ - "\0\u43ee\0\u4438\0\u4482\0\u44cc\0\u4516\0\u0378\0\u0378\0\u0378"+ - "\0\u0378\0\u0378\0\u4560\0\u0378\0\u45aa\0\u45f4\0\u463e\0\u1236"+ - "\0\u4688\0\u46d2\0\u471c\0\u4766\0\u47b0\0\u47fa\0\u4844\0\u488e"+ - "\0\u48d8\0\u4922\0\u496c\0\u49b6\0\u4a00\0\u4a4a\0\u4a94\0\u4ade"+ - "\0\u4b28\0\u4b72\0\u4bbc\0\u4c06\0\u4c50\0\u4c9a\0\u4ce4\0\u4d2e"+ - "\0\u4d78\0\u4dc2\0\u4e0c\0\u4e56\0\u4ea0\0\u4eea\0\u4f34\0\u1236"+ - "\0\u4f7e\0\u4fc8\0\u5012\0\u1236\0\u505c\0\u50a6\0\u50f0\0\u513a"+ - "\0\u5184\0\u51ce\0\u5218\0\u5262\0\u52ac\0\u0378\0\u0378\0\u52f6"+ - "\0\u5340\0\u538a\0\u53d4\0\u057e\0\u541e\0\u5468\0\u54b2\0\u54fc"+ - "\0\u5546\0\u5590\0\u057e\0\u55da\0\u057e\0\u5624\0\u566e\0\u56b8"+ - "\0\u5702\0\u057e\0\u574c\0\u5796\0\u57e0\0\u582a\0\u5874\0\u58be"+ - "\0\u5908\0\u5952\0\u3d48\0\u599c\0\u59e6\0\u5a30\0\u5a7a\0\u5ac4"+ - "\0\u5b0e\0\u5b58\0\u5ba2\0\u5bec\0\u057e\0\u5c36\0\u5c80\0\u057e"+ - "\0\u5cca\0\u5d14\0\u5d5e\0\u5da8\0\u5df2\0\u5e3c\0\u5e86\0\u5ed0"+ - "\0\u057e\0\u057e\0\u5f1a\0\u5f64\0\u5fae\0\u057e\0\u5ff8\0\u057e"+ - "\0\u6042\0\u0378\0\u608c\0\u60d6\0\u6120\0\u1236\0\u616a\0\u61b4"+ - "\0\u61fe\0\u6248\0\u6292\0\u62dc\0\u1236\0\u6326\0\u1236\0\u6370"+ - "\0\u63ba\0\u1236\0\u6404\0\u644e\0\u6498\0\u64e2\0\u652c\0\u6576"+ - "\0\u65c0\0\u1236\0\u660a\0\u6654\0\u1236\0\u669e\0\u66e8\0\u6732"+ - "\0\u677c\0\u67c6\0\u6810\0\u685a\0\u68a4\0\u1236\0\u1236\0\u68ee"+ - "\0\u6938\0\u6982\0\u1236\0\u69cc\0\u1236\0\u6a16\0\u6a60\0\u6aaa"+ - "\0\u0378\0\u0378\0\u5262\0\u6af4\0\u057e\0\u6b3e\0\u057e\0\u6b88"+ - "\0\u6bd2\0\u6c1c\0\u6c66\0\u6cb0\0\u6cfa\0\u6d44\0\u057e\0\u6d8e"+ - "\0\u6dd8\0\u6e22\0\u6e6c\0\u6eb6\0\u6f00\0\u6f4a\0\u6f94\0\u6fde"+ - "\0\u7028\0\u7072\0\u70bc\0\u7106\0\u057e\0\u057e\0\u7150\0\u719a"+ - "\0\u71e4\0\u057e\0\u722e\0\u057e\0\u7278\0\u057e\0\u72c2\0\u730c"+ - "\0\u7356\0\u73a0\0\u73ea\0\u057e\0\u1236\0\u7434\0\u1236\0\u747e"+ - "\0\u74c8\0\u7512\0\u755c\0\u75a6\0\u75f0\0\u763a\0\u1236\0\u7684"+ - "\0\u76ce\0\u7718\0\u7762\0\u77ac\0\u77f6\0\u7840\0\u1236\0\u1236"+ - "\0\u788a\0\u78d4\0\u791e\0\u1236\0\u7968\0\u1236\0\u79b2\0\u1236"+ - "\0\u79fc\0\u7a46\0\u7a90\0\u7ada\0\u7b24\0\u1236\0\u0378\0\u6a60"+ - "\0\u7b6e\0\u6af4\0\u7bb8\0\u7c02\0\u057e\0\u7c4c\0\u7c96\0\u7ce0"+ - "\0\u057e\0\u7d2a\0\u7d74\0\u7dbe\0\u7e08\0\u7e52\0\u057e\0\u7e9c"+ - "\0\u057e\0\u7ee6\0\u057e\0\u7f30\0\u7f7a\0\u057e\0\u7fc4\0\u057e"+ - "\0\u057e\0\u057e\0\u800e\0\u8058\0\u80a2\0\u1236\0\u80ec\0\u8136"+ - "\0\u8180\0\u1236\0\u81ca\0\u8214\0\u825e\0\u82a8\0\u82f2\0\u1236"+ - "\0\u833c\0\u1236\0\u8386\0\u1236\0\u83d0\0\u841a\0\u1236\0\u8464"+ - "\0\u1236\0\u1236\0\u1236\0\u84ae\0\u7b6e\0\u057e\0\u84f8\0\u8542"+ - "\0\u858c\0\u057e\0\u057e\0\u057e\0\u057e\0\u057e\0\u85d6\0\u8620"+ - "\0\u866a\0\u86b4\0\u86fe\0\u8748\0\u8792\0\u1236\0\u87dc\0\u8826"+ - "\0\u8870\0\u1236\0\u1236\0\u1236\0\u1236\0\u1236\0\u88ba\0\u8904"+ - "\0\u894e\0\u8998\0\u89e2\0\u8a2c\0\u8a76\0\u8ac0\0\u8b0a\0\u8b54"+ - "\0\u8b9e\0\u057e\0\u057e\0\u057e\0\u8be8\0\u8c32\0\u057e\0\u8c7c"+ - "\0\u8cc6\0\u8d10\0\u8d5a\0\u1236\0\u1236\0\u1236\0\u8da4\0\u8dee"+ - "\0\u1236\0\u8e38\0\u8e82\0\u057e\0\u057e\0\u8ecc\0\u057e\0\u8f16"+ - "\0\u8f60\0\u1236\0\u1236\0\u8faa\0\u1236\0\u057e\0\u057e\0\u8ff4"+ - "\0\u1236\0\u1236\0\u903e\0\u9088\0\u90d2\0\u057e\0\u1236"; + "\0\u08ac\0\u08f6\0\u0940\0\u098a\0\u09d4\0\u03c2\0\u0a1e\0\u0a68"+ + "\0\u0ab2\0\u0afc\0\u0b46\0\u0b90\0\u0bda\0\u0c24\0\u0c6e\0\u03c2"+ + "\0\u0cb8\0\u0d02\0\u03c2\0\u03c2\0\u03c2\0\u03c2\0\u03c2\0\u03c2"+ + "\0\u0d4c\0\u0d96\0\u03c2\0\u0de0\0\u0e2a\0\u0e74\0\u0ebe\0\u03c2"+ + "\0\u03c2\0\u03c2\0\u03c2\0\u0456\0\u0f08\0\u0f52\0\u0f9c\0\u0fe6"+ + "\0\u1030\0\u107a\0\u03c2\0\u03c2\0\u10c4\0\u110e\0\u1158\0\u11a2"+ + "\0\u03c2\0\u11ec\0\u1236\0\u1280\0\u12ca\0\u03c2\0\u1314\0\u135e"+ + "\0\u13a8\0\u13f2\0\u143c\0\u1486\0\u14d0\0\u151a\0\u1564\0\u15ae"+ + "\0\u15f8\0\u1642\0\u168c\0\u16d6\0\u1720\0\u176a\0\u03c2\0\u03c2"+ + "\0\u17b4\0\u03c2\0\u03c2\0\u17fe\0\u1848\0\u1892\0\u03c2\0\u1848"+ + "\0\u03c2\0\u1848\0\u18dc\0\u1926\0\u1970\0\u19ba\0\u03c2\0\u1a04"+ + "\0\u03c2\0\u03c2\0\u1a4e\0\u1a98\0\u03c2\0\u03c2\0\u03c2\0\u03c2"+ + "\0\u03c2\0\u1ae2\0\u1b2c\0\u1b76\0\u1bc0\0\u1c0a\0\u1c54\0\u1c9e"+ + "\0\u1ce8\0\u05c8\0\u1d32\0\u1d7c\0\u1dc6\0\u1e10\0\u1e5a\0\u1ea4"+ + "\0\u1eee\0\u03c2\0\u03c2\0\u03c2\0\u03c2\0\u03c2\0\u1f38\0\u1f82"+ + "\0\u1fcc\0\u2016\0\u2060\0\u20aa\0\u03c2\0\u03c2\0\u20f4\0\u213e"+ + "\0\u2188\0\u21d2\0\u221c\0\u2266\0\u22b0\0\u22fa\0\u2344\0\u238e"+ + "\0\u23d8\0\u2422\0\u246c\0\u24b6\0\u2500\0\u254a\0\u2594\0\u25de"+ + "\0\u2628\0\u2672\0\u26bc\0\u2706\0\u2750\0\u279a\0\u27e4\0\u282e"+ + "\0\u2878\0\u28c2\0\u290c\0\u03c2\0\u03c2\0\u03c2\0\u2956\0\u29a0"+ + "\0\u03c2\0\u29ea\0\u03c2\0\u03c2\0\u03c2\0\u03c2\0\u03c2\0\u03c2"+ + "\0\u03c2\0\u03c2\0\u2a34\0\u03c2\0\u2a7e\0\u03c2\0\u03c2\0\u03c2"+ + "\0\u03c2\0\u03c2\0\u2ac8\0\u2b12\0\u2b5c\0\u2ba6\0\u2bf0\0\u1314"+ + "\0\u2c3a\0\u2c84\0\u2cce\0\u2d18\0\u2d62\0\u2dac\0\u2df6\0\u2e40"+ + "\0\u2e8a\0\u2ed4\0\u2f1e\0\u2f68\0\u2fb2\0\u2ffc\0\u3046\0\u3090"+ + "\0\u30da\0\u3124\0\u316e\0\u31b8\0\u3202\0\u324c\0\u3296\0\u32e0"+ + "\0\u332a\0\u3374\0\u33be\0\u3408\0\u3452\0\u349c\0\u34e6\0\u3530"+ + "\0\u357a\0\u1848\0\u35c4\0\u360e\0\u3658\0\u36a2\0\u03c2\0\u03c2"+ + "\0\u36ec\0\u3736\0\u3780\0\u37ca\0\u3814\0\u385e\0\u05c8\0\u38a8"+ + "\0\u38f2\0\u393c\0\u3986\0\u39d0\0\u3a1a\0\u3a64\0\u3aae\0\u3af8"+ + "\0\u3b42\0\u3b8c\0\u3bd6\0\u3c20\0\u3c6a\0\u03c2\0\u03c2\0\u03c2"+ + "\0\u3cb4\0\u3cfe\0\u3d48\0\u03c2\0\u3d92\0\u3ddc\0\u3e26\0\u3e70"+ + "\0\u3eba\0\u3f04\0\u3f4e\0\u3f98\0\u3fe2\0\u402c\0\u4076\0\u40c0"+ + "\0\u410a\0\u4154\0\u419e\0\u41e8\0\u4232\0\u427c\0\u42c6\0\u4310"+ + "\0\u435a\0\u43a4\0\u05c8\0\u43ee\0\u4438\0\u4482\0\u05c8\0\u44cc"+ + "\0\u4516\0\u4560\0\u45aa\0\u45f4\0\u03c2\0\u03c2\0\u03c2\0\u03c2"+ + "\0\u03c2\0\u463e\0\u03c2\0\u4688\0\u46d2\0\u471c\0\u1314\0\u4766"+ + "\0\u47b0\0\u47fa\0\u4844\0\u488e\0\u48d8\0\u4922\0\u496c\0\u49b6"+ + "\0\u4a00\0\u4a4a\0\u4a94\0\u4ade\0\u4b28\0\u4b72\0\u4bbc\0\u4c06"+ + "\0\u4c50\0\u4c9a\0\u4ce4\0\u4d2e\0\u4d78\0\u4dc2\0\u4e0c\0\u4e56"+ + "\0\u4ea0\0\u4eea\0\u4f34\0\u4f7e\0\u4fc8\0\u5012\0\u1314\0\u505c"+ + "\0\u50a6\0\u50f0\0\u1314\0\u513a\0\u5184\0\u51ce\0\u5218\0\u5262"+ + "\0\u52ac\0\u52f6\0\u5340\0\u538a\0\u03c2\0\u03c2\0\u53d4\0\u541e"+ + "\0\u5468\0\u54b2\0\u05c8\0\u54fc\0\u5546\0\u5590\0\u55da\0\u5624"+ + "\0\u566e\0\u05c8\0\u56b8\0\u05c8\0\u5702\0\u574c\0\u5796\0\u57e0"+ + "\0\u05c8\0\u582a\0\u5874\0\u58be\0\u5908\0\u5952\0\u599c\0\u59e6"+ + "\0\u5a30\0\u3e26\0\u5a7a\0\u5ac4\0\u5b0e\0\u5b58\0\u5ba2\0\u5bec"+ + "\0\u5c36\0\u5c80\0\u5cca\0\u05c8\0\u5d14\0\u5d5e\0\u05c8\0\u5da8"+ + "\0\u5df2\0\u5e3c\0\u5e86\0\u5ed0\0\u5f1a\0\u5f64\0\u5fae\0\u05c8"+ + "\0\u05c8\0\u5ff8\0\u6042\0\u608c\0\u05c8\0\u60d6\0\u05c8\0\u6120"+ + "\0\u03c2\0\u616a\0\u61b4\0\u61fe\0\u1314\0\u6248\0\u6292\0\u62dc"+ + "\0\u6326\0\u6370\0\u63ba\0\u1314\0\u6404\0\u1314\0\u644e\0\u6498"+ + "\0\u1314\0\u64e2\0\u652c\0\u6576\0\u65c0\0\u660a\0\u6654\0\u669e"+ + "\0\u1314\0\u66e8\0\u6732\0\u1314\0\u677c\0\u67c6\0\u6810\0\u685a"+ + "\0\u68a4\0\u68ee\0\u6938\0\u6982\0\u1314\0\u1314\0\u69cc\0\u6a16"+ + "\0\u6a60\0\u1314\0\u6aaa\0\u1314\0\u6af4\0\u6b3e\0\u6b88\0\u03c2"+ + "\0\u03c2\0\u5340\0\u6bd2\0\u05c8\0\u6c1c\0\u05c8\0\u6c66\0\u6cb0"+ + "\0\u6cfa\0\u6d44\0\u6d8e\0\u6dd8\0\u6e22\0\u05c8\0\u6e6c\0\u6eb6"+ + "\0\u6f00\0\u6f4a\0\u6f94\0\u6fde\0\u7028\0\u7072\0\u70bc\0\u7106"+ + "\0\u7150\0\u719a\0\u71e4\0\u05c8\0\u05c8\0\u722e\0\u7278\0\u72c2"+ + "\0\u05c8\0\u730c\0\u05c8\0\u7356\0\u05c8\0\u73a0\0\u73ea\0\u7434"+ + "\0\u747e\0\u74c8\0\u05c8\0\u1314\0\u7512\0\u1314\0\u755c\0\u75a6"+ + "\0\u75f0\0\u763a\0\u7684\0\u76ce\0\u7718\0\u1314\0\u7762\0\u77ac"+ + "\0\u77f6\0\u7840\0\u788a\0\u78d4\0\u791e\0\u1314\0\u1314\0\u7968"+ + "\0\u79b2\0\u79fc\0\u1314\0\u7a46\0\u1314\0\u7a90\0\u1314\0\u7ada"+ + "\0\u7b24\0\u7b6e\0\u7bb8\0\u7c02\0\u1314\0\u03c2\0\u6b3e\0\u7c4c"+ + "\0\u6bd2\0\u7c96\0\u7ce0\0\u05c8\0\u7d2a\0\u7d74\0\u7dbe\0\u05c8"+ + "\0\u7e08\0\u7e52\0\u7e9c\0\u7ee6\0\u7f30\0\u05c8\0\u7f7a\0\u05c8"+ + "\0\u7fc4\0\u05c8\0\u800e\0\u8058\0\u05c8\0\u80a2\0\u05c8\0\u05c8"+ + "\0\u05c8\0\u80ec\0\u8136\0\u8180\0\u1314\0\u81ca\0\u8214\0\u825e"+ + "\0\u1314\0\u82a8\0\u82f2\0\u833c\0\u8386\0\u83d0\0\u1314\0\u841a"+ + "\0\u1314\0\u8464\0\u1314\0\u84ae\0\u84f8\0\u1314\0\u8542\0\u1314"+ + "\0\u1314\0\u1314\0\u858c\0\u7c4c\0\u05c8\0\u85d6\0\u8620\0\u866a"+ + "\0\u05c8\0\u05c8\0\u05c8\0\u05c8\0\u05c8\0\u86b4\0\u86fe\0\u8748"+ + "\0\u8792\0\u87dc\0\u8826\0\u8870\0\u1314\0\u88ba\0\u8904\0\u894e"+ + "\0\u1314\0\u1314\0\u1314\0\u1314\0\u1314\0\u8998\0\u89e2\0\u8a2c"+ + "\0\u8a76\0\u8ac0\0\u8b0a\0\u8b54\0\u8b9e\0\u8be8\0\u8c32\0\u8c7c"+ + "\0\u05c8\0\u05c8\0\u05c8\0\u8cc6\0\u8d10\0\u05c8\0\u8d5a\0\u8da4"+ + "\0\u8dee\0\u8e38\0\u1314\0\u1314\0\u1314\0\u8e82\0\u8ecc\0\u1314"+ + "\0\u8f16\0\u8f60\0\u05c8\0\u05c8\0\u8faa\0\u05c8\0\u8ff4\0\u903e"+ + "\0\u1314\0\u1314\0\u9088\0\u1314\0\u05c8\0\u05c8\0\u90d2\0\u1314"+ + "\0\u1314\0\u911c\0\u9166\0\u91b0\0\u05c8\0\u1314"; private static int [] zzUnpackRowMap() { - int [] result = new int[679]; + int [] result = new int[686]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -374,605 +376,607 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\15\3\16\1\17\1\20\1\21\1\22\1\23\1\24"+ - "\1\25\1\26\1\27\2\26\1\30\1\26\1\31\1\26"+ - "\1\32\1\26\1\33\1\26\1\34\1\26\1\35\1\36"+ - "\1\26\1\37\1\40\1\26\1\27\2\26\1\41\1\26"+ - "\1\42\1\43\1\44\1\45\1\46\1\47\1\50\1\26"+ - "\1\51\1\52\1\53\2\26\1\54\1\26\1\55\3\26"+ - "\1\56\1\57\1\60\1\61\1\62\1\63\1\64\1\65"+ - "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ - "\1\76\1\77\1\100\1\15\3\16\1\17\1\20\1\21"+ - "\1\22\1\23\1\24\1\25\1\26\1\27\2\26\1\30"+ - "\1\26\1\31\1\26\1\32\1\26\1\33\1\26\1\34"+ - "\1\26\1\35\1\36\1\26\1\37\1\40\1\26\1\27"+ - "\2\26\1\41\1\26\1\42\1\43\1\44\1\101\1\46"+ - "\1\47\1\50\1\26\1\51\1\52\1\53\2\26\1\54"+ - "\1\26\1\55\3\26\1\56\1\57\1\60\1\61\1\62"+ - "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\72"+ - "\1\73\1\74\1\75\1\76\1\77\1\100\1\102\1\103"+ - "\2\104\1\102\1\103\1\105\35\102\1\106\1\102\1\107"+ - "\43\102\6\110\1\105\35\110\1\106\1\110\1\111\43\110"+ - "\6\112\1\113\1\114\34\112\1\115\45\112\7\116\1\117"+ - "\34\116\1\120\45\116\13\121\1\122\1\121\2\122\1\123"+ - "\1\122\1\124\1\122\1\125\1\122\1\126\1\122\1\127"+ - "\1\122\2\121\1\122\1\121\1\130\1\122\1\121\2\122"+ - "\1\121\1\122\4\121\1\131\1\132\1\133\1\122\1\134"+ - "\1\135\1\136\2\122\1\137\1\122\1\140\3\122\1\141"+ - "\1\142\21\121\42\143\1\144\47\143\13\145\1\122\1\145"+ - "\14\122\2\145\1\122\1\145\2\122\1\145\2\122\1\145"+ - "\1\122\4\145\20\122\22\145\1\146\5\147\1\150\1\151"+ - "\102\146\1\152\5\147\1\153\103\152\1\154\5\147\1\155"+ - "\103\154\113\0\5\16\1\156\104\0\2\17\1\157\1\0"+ - "\1\17\113\0\1\160\1\161\61\0\1\162\27\0\1\163"+ - "\31\0\1\164\27\0\1\165\31\0\1\166\171\0\1\167"+ - "\32\0\16\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\36\0\1\27\2\170\2\171\2\172\2\173\2\174\2\175"+ - "\2\0\1\176\1\27\2\0\1\27\2\0\1\177\62\0"+ - "\6\26\1\200\1\26\1\201\5\26\2\0\7\26\1\0"+ - "\2\26\3\0\1\26\1\202\6\26\1\203\7\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\10\26\1\204"+ - "\7\26\35\0\4\26\1\205\11\26\2\0\7\26\1\0"+ - "\2\26\3\0\7\26\1\206\1\26\1\207\6\26\35\0"+ - "\14\26\1\210\1\26\2\0\7\26\1\0\2\26\3\0"+ - "\10\26\1\211\7\26\35\0\6\26\1\212\7\26\2\0"+ - "\5\26\1\213\1\26\1\0\2\26\3\0\11\26\1\214"+ - "\6\26\53\0\1\215\40\0\1\216\51\0\1\217\37\0"+ - "\1\220\7\0\1\221\23\0\1\27\2\170\2\171\2\172"+ - "\2\173\2\174\2\175\2\0\1\176\1\27\2\222\1\27"+ - "\2\223\1\177\62\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\6\26\1\224\1\26\1\225\3\26\1\226\3\26"+ - "\64\0\1\227\44\0\1\230\11\0\1\231\3\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\20\26\22\0\2\232"+ - "\2\0\2\232\1\233\36\232\1\234\44\232\2\235\2\0"+ - "\2\235\1\236\35\235\1\0\1\235\1\237\43\235\13\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\1\26\1\240"+ - "\4\26\1\241\3\26\1\242\5\26\35\0\16\26\2\0"+ - "\2\26\1\243\4\26\1\0\2\26\3\0\4\26\1\244"+ - "\13\26\35\0\6\26\1\245\7\26\2\0\7\26\1\0"+ - "\2\26\3\0\1\26\1\246\6\26\1\247\4\26\1\250"+ - "\2\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\5\26\1\251\4\26\1\252\1\26\1\253\1\254\1\26"+ - "\1\255\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\6\26\1\256\6\26\1\257\2\26\35\0\14\26\1\260"+ - "\1\26\2\0\7\26\1\0\2\26\3\0\20\26\35\0"+ - "\14\26\1\261\1\26\2\0\7\26\1\0\2\26\3\0"+ - "\1\26\1\262\10\26\1\263\5\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\10\26\1\264\7\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\15\26\1\265"+ - "\2\26\64\0\1\266\34\0\1\267\104\0\1\270\10\0"+ - "\1\271\100\0\1\272\6\0\1\273\102\0\1\274\7\0"+ - "\1\275\101\0\1\276\111\0\1\277\111\0\1\300\13\0"+ - "\1\301\75\0\1\302\14\0\1\303\2\0\2\102\2\0"+ - "\2\102\1\0\35\102\1\0\1\102\1\0\44\102\1\103"+ - "\2\104\2\103\1\304\35\102\1\0\1\102\1\0\43\102"+ - "\1\0\5\104\1\304\103\0\1\305\3\0\1\305\1\0"+ - "\104\305\6\110\1\0\35\110\1\0\1\110\1\0\43\110"+ - "\46\0\1\306\43\0\6\112\2\0\34\112\1\0\45\112"+ - "\7\0\1\307\102\0\13\310\1\0\1\310\14\0\2\310"+ - "\1\0\1\310\2\0\1\310\2\0\1\310\1\0\4\310"+ - "\21\0\21\310\7\116\1\0\34\116\1\0\45\116\44\0"+ - "\1\311\45\0\7\312\1\313\3\312\1\0\1\312\14\0"+ - "\2\312\1\0\1\312\2\0\1\312\2\0\1\312\1\0"+ - "\1\313\3\312\21\0\21\312\13\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\6\122\1\314\1\122"+ - "\1\315\5\122\2\0\7\122\1\0\1\122\4\0\1\122"+ - "\1\316\6\122\1\317\7\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\10\122\1\320\7\122\35\0\4\122"+ - "\1\321\11\122\2\0\7\122\1\0\1\122\4\0\7\122"+ - "\1\322\1\122\1\323\6\122\35\0\14\122\1\324\1\122"+ - "\2\0\7\122\1\0\1\122\4\0\10\122\1\325\7\122"+ - "\35\0\6\122\1\326\7\122\2\0\5\122\1\327\1\122"+ - "\1\0\1\122\4\0\11\122\1\330\6\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\6\122\1\331\1\122"+ - "\1\332\3\122\1\333\3\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\1\122\1\334\4\122\1\335\3\122"+ - "\1\336\5\122\35\0\16\122\2\0\2\122\1\337\4\122"+ - "\1\0\1\122\4\0\4\122\1\340\13\122\35\0\6\122"+ - "\1\341\7\122\2\0\7\122\1\0\1\122\4\0\1\122"+ - "\1\342\6\122\1\343\4\122\1\344\2\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\5\122\1\345\4\122"+ - "\1\346\1\122\1\347\1\350\1\122\1\351\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\6\122\1\352\6\122"+ - "\1\353\2\122\35\0\14\122\1\354\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\14\122\1\355\1\122"+ - "\2\0\7\122\1\0\1\122\4\0\1\122\1\356\10\122"+ - "\1\357\5\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\10\122\1\360\7\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\15\122\1\361\2\122\35\0\1\362"+ - "\1\0\14\362\2\0\1\362\1\0\2\362\1\0\2\362"+ - "\1\0\1\362\4\0\20\362\23\0\5\147\1\363\104\0"+ - "\3\147\1\0\1\147\113\0\1\364\1\365\102\0\3\16"+ - "\1\0\1\16\106\0\1\17\107\0\2\160\2\0\106\160"+ - "\10\366\1\367\101\366\72\0\1\370\17\0\2\166\2\0"+ - "\106\166\72\0\1\371\33\0\1\372\14\0\2\373\1\0"+ - "\1\372\2\0\1\372\66\0\1\27\16\0\1\176\1\27"+ - "\2\0\1\27\66\0\1\374\17\0\1\374\2\0\1\374"+ - "\65\0\16\26\2\0\7\26\1\0\2\26\3\0\10\26"+ - "\1\375\7\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\11\26\1\376\6\26\35\0\6\26\1\377\7\26"+ - "\2\0\7\26\1\0\2\26\3\0\20\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\6\26\1\u0100\11\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\11\26"+ - "\1\u0101\6\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\1\u0102\17\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\4\26\1\u0103\1\u0104\12\26\35\0\4\26"+ - "\1\u0105\11\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\12\26"+ - "\1\u0106\5\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\4\26\1\u0107\13\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\5\26\1\u0108\12\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\12\26\1\u0109\5\26"+ - "\56\0\1\u010a\2\0\1\u010a\65\0\2\u010b\2\0\2\u010b"+ - "\4\0\4\u010b\3\0\4\u010b\11\0\2\u010b\52\0\14\26"+ - "\1\u010c\1\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\10\26"+ - "\1\u010d\7\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\5\26\1\u010e\12\26\64\0\1\u010f\36\0\1\u0110"+ - "\10\0\2\232\2\0\2\232\1\233\36\232\1\u0111\50\232"+ - "\2\u0112\1\u0113\103\232\45\0\1\u0114\44\0\2\235\2\0"+ - "\2\235\1\236\35\235\1\0\1\235\1\u0115\47\235\2\u0116"+ - "\1\u0117\103\235\46\0\1\u0118\56\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\2\26\1\u0119\15\26\35\0\10\26"+ - "\1\u011a\5\26\2\0\7\26\1\0\2\26\3\0\10\26"+ - "\1\u011b\7\26\35\0\16\26\2\0\2\26\1\u011c\4\26"+ - "\1\0\2\26\3\0\20\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\4\26\1\u011d\13\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\4\26\1\u011e\13\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\1\26"+ - "\1\u011f\16\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\4\26\1\u0120\1\u0121\12\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\11\26\1\u0122\6\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\1\26\1\u0123"+ - "\16\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\1\26\1\u0124\4\26\1\u0125\11\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\1\u0126\17\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\11\26\1\u0127\6\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\10\26"+ - "\1\u0128\7\26\35\0\10\26\1\u0129\5\26\2\0\7\26"+ - "\1\0\2\26\3\0\20\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\1\26\1\u012a\10\26\1\u012b\1\26"+ - "\1\u012c\3\26\35\0\10\26\1\u012d\5\26\2\0\7\26"+ - "\1\0\2\26\3\0\6\26\1\u012e\11\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\5\26\1\u012f\12\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\17\26"+ - "\1\u0130\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\5\26\1\u0131\12\26\35\0\6\26\1\u0132\7\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\6\26\1\u0133"+ - "\1\26\1\u0134\5\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\10\26\1\u0135\5\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\114\0\1\u0136\10\0\1\u0137\110\0"+ - "\1\u0138\101\0\1\u0139\111\0\1\u013a\7\0\1\u013b\10\0"+ - "\3\104\1\0\1\104\152\0\1\u013c\56\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\10\122\1\u013d\7\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\11\122\1\u013e"+ - "\6\122\35\0\6\122\1\u013f\7\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\6\122\1\u0140\11\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\11\122\1\u0141\6\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\1\u0142\17\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\4\122"+ - "\1\u0143\1\u0144\12\122\35\0\4\122\1\u0145\11\122\2\0"+ - "\7\122\1\0\1\122\4\0\20\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\12\122\1\u0146\5\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\4\122\1\u0147"+ - "\13\122\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\5\122\1\u0148\12\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\12\122\1\u0149\5\122\35\0\14\122\1\u014a"+ - "\1\122\2\0\7\122\1\0\1\122\4\0\20\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\10\122\1\u014b"+ - "\7\122\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\5\122\1\u014c\12\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\2\122\1\u014d\15\122\35\0\10\122\1\u014e"+ - "\5\122\2\0\7\122\1\0\1\122\4\0\10\122\1\u014f"+ - "\7\122\35\0\16\122\2\0\2\122\1\u0150\4\122\1\0"+ - "\1\122\4\0\20\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\4\122\1\u0151\13\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\4\122\1\u0152\13\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\1\122\1\u0153"+ - "\16\122\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\4\122\1\u0154\1\u0155\12\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\11\122\1\u0156\6\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\1\122\1\u0157\16\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\1\122"+ - "\1\u0158\4\122\1\u0159\11\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\1\u015a\17\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\11\122\1\u015b\6\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\10\122\1\u015c"+ - "\7\122\35\0\10\122\1\u015d\5\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\1\122\1\u015e\10\122\1\u015f\1\122\1\u0160"+ - "\3\122\35\0\10\122\1\u0161\5\122\2\0\7\122\1\0"+ - "\1\122\4\0\6\122\1\u0162\11\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\5\122\1\u0163\12\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\17\122\1\u0164"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\5\122"+ - "\1\u0165\12\122\35\0\6\122\1\u0166\7\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\6\122\1\u0167\1\122"+ - "\1\u0168\5\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\10\122\1\u0169\5\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\16\362\2\0\7\362\1\0\1\362"+ - "\4\0\20\362\22\0\2\364\2\0\106\364\10\u016a\1\u016b"+ - "\101\u016a\10\366\1\u016c\101\366\7\u016d\1\u016e\1\367\101\u016d"+ - "\14\0\1\372\2\u016f\2\171\4\0\2\174\4\0\1\373"+ - "\1\372\2\0\1\372\66\0\1\372\17\0\1\372\2\0"+ - "\1\372\66\0\1\374\2\u016f\2\171\4\0\2\174\2\175"+ - "\2\0\1\u0170\1\374\2\0\1\374\65\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\1\26\1\u0171\16\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\1\26\1\u0172"+ - "\16\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\4\26\1\u0173\13\26\35\0\2\26\1\u0174\13\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\6\26\1\u0175"+ - "\7\26\2\0\7\26\1\0\2\26\3\0\10\26\1\u0176"+ - "\7\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\5\26\1\u0177\12\26\35\0\14\26\1\u0178\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\1\26\1\u0179\16\26\35\0"+ - "\16\26\2\0\2\26\1\u017a\4\26\1\0\2\26\3\0"+ - "\20\26\35\0\14\26\1\u017b\1\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\35\0\14\26\1\u017c\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\7\26\1\u017d\10\26\37\0"+ - "\2\170\2\0\2\172\2\173\6\0\1\u017e\1\u010a\2\0"+ - "\1\u010a\65\0\2\u010b\2\170\2\u010b\2\172\2\173\4\u010b"+ - "\2\0\1\u017f\4\u010b\11\0\2\u010b\52\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\1\26\1\u0180\16\26\35\0"+ - "\6\26\1\u0181\7\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\14\26\1\u0182\1\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\22\0\4\232\2\u0112\1\u0183\36\232"+ - "\1\u0111\45\232\1\u0112\1\u0184\1\u0185\1\232\1\u0112\1\233"+ - "\36\232\1\u0111\44\232\6\u0114\1\u0186\36\u0114\1\u0187\44\u0114"+ - "\4\235\2\u0116\1\u0188\35\235\1\0\1\235\1\u0115\44\235"+ - "\1\u0116\1\u0189\1\u018a\1\235\1\u0116\1\236\35\235\1\0"+ - "\1\235\1\u0115\43\235\6\u018b\1\u018c\35\u018b\1\0\1\u018b"+ - "\1\u018d\43\u018b\13\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\3\26\1\u018e\14\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\13\26\1\u018f\4\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\5\26\1\u0190\12\26"+ - "\35\0\6\26\1\u0191\7\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\5\26\1\u0192\12\26\35\0\14\26\1\u0193\1\26"+ - "\2\0\7\26\1\0\2\26\3\0\20\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\4\26\1\u0194\13\26"+ - "\35\0\14\26\1\u0195\1\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\2\26\1\u0196\15\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\5\26\1\u0197\12\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\6\26\1\u0198\11\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\5\26"+ - "\1\u0199\12\26\35\0\10\26\1\u019a\5\26\2\0\7\26"+ - "\1\0\2\26\3\0\20\26\35\0\14\26\1\u019b\1\26"+ - "\2\0\7\26\1\0\2\26\3\0\20\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\2\26\1\u019c\15\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\6\26"+ - "\1\u019d\11\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\5\26\1\u019e\12\26\35\0\10\26\1\u019f\5\26"+ - "\2\0\7\26\1\0\2\26\3\0\11\26\1\u01a0\6\26"+ - "\35\0\14\26\1\u01a1\1\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\4\26\1\u01a2\13\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\10\26\1\u01a3\7\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\12\26\1\u01a4\5\26"+ - "\35\0\10\26\1\u01a5\5\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\6\26\1\u01a6\7\26\2\0\7\26"+ - "\1\0\2\26\3\0\20\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\1\26\1\u01a7\16\26\35\0\12\26"+ - "\1\u01a8\3\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\35\0\6\26\1\u01a9\7\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\114\0\1\u01aa\32\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\1\122\1\u01ab\16\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\1\122\1\u01ac\16\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\4\122"+ - "\1\u01ad\13\122\35\0\2\122\1\u01ae\13\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\6\122\1\u01af\7\122"+ - "\2\0\7\122\1\0\1\122\4\0\10\122\1\u01b0\7\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\5\122"+ - "\1\u01b1\12\122\35\0\14\122\1\u01b2\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\1\122\1\u01b3\16\122\35\0\16\122"+ - "\2\0\2\122\1\u01b4\4\122\1\0\1\122\4\0\20\122"+ - "\35\0\14\122\1\u01b5\1\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\14\122\1\u01b6\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\7\122\1\u01b7\10\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\1\122\1\u01b8\16\122"+ - "\35\0\6\122\1\u01b9\7\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\14\122\1\u01ba\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\3\122\1\u01bb\14\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\13\122\1\u01bc\4\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\5\122"+ - "\1\u01bd\12\122\35\0\6\122\1\u01be\7\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\5\122\1\u01bf\12\122\35\0\14\122"+ - "\1\u01c0\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\4\122"+ - "\1\u01c1\13\122\35\0\14\122\1\u01c2\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\2\122\1\u01c3\15\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\5\122\1\u01c4\12\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\6\122"+ - "\1\u01c5\11\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\5\122\1\u01c6\12\122\35\0\10\122\1\u01c7\5\122"+ - "\2\0\7\122\1\0\1\122\4\0\20\122\35\0\14\122"+ - "\1\u01c8\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\2\122"+ - "\1\u01c9\15\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\6\122\1\u01ca\11\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\5\122\1\u01cb\12\122\35\0\10\122"+ - "\1\u01cc\5\122\2\0\7\122\1\0\1\122\4\0\11\122"+ - "\1\u01cd\6\122\35\0\14\122\1\u01ce\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\4\122\1\u01cf\13\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\10\122\1\u01d0\7\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\12\122"+ - "\1\u01d1\5\122\35\0\10\122\1\u01d2\5\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\6\122\1\u01d3\7\122"+ - "\2\0\7\122\1\0\1\122\4\0\20\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\1\122\1\u01d4\16\122"+ - "\35\0\12\122\1\u01d5\3\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\6\122\1\u01d6\7\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\22\0\10\u016a\1\u01d7\101\u016a"+ - "\7\u01d8\1\u01d9\1\u016b\101\u01d8\7\366\1\u01da\1\u01db\101\366"+ - "\10\u016d\1\u01dc\101\u016d\14\0\1\374\16\0\1\u0170\1\374"+ - "\2\0\1\374\65\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\5\26\1\u01dd\12\26\35\0\6\26\1\u01de\7\26"+ - "\2\0\7\26\1\0\2\26\3\0\20\26\35\0\14\26"+ - "\1\u01df\1\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\35\0\14\26\1\u01e0\1\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\6\26\1\u01e1\11\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\1\26\1\u01e2\16\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\6\26\1\u01e3\11\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\12\26"+ - "\1\u01e4\5\26\35\0\6\26\1\u01e5\7\26\2\0\7\26"+ - "\1\0\2\26\3\0\20\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\11\26\1\u01e6\6\26\55\0\1\u017e"+ - "\1\u010a\2\0\1\u010a\65\0\2\u010b\2\0\2\u010b\4\0"+ - "\4\u010b\2\0\1\u017f\4\u010b\11\0\2\u010b\52\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\3\26\1\u01e7\14\26"+ - "\35\0\14\26\1\u01e8\1\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\22\0\1\232\2\u0112\1\u01e9\2\u0112\1\u0113"+ - "\103\232\2\0\2\232\2\u0184\1\u01ea\105\0\1\u0112\1\232"+ - "\2\u0184\1\u01ea\103\0\157\u0114\1\u01eb\44\u0114\1\235\2\u0116"+ - "\1\u01ec\2\u0116\1\u0117\103\235\2\0\2\235\2\u0189\1\u01ed"+ - "\105\0\1\u0116\1\235\2\u0189\1\u01ed\103\0\120\u018b\1\0"+ - "\35\u018b\1\0\1\u018b\1\u01ee\43\u018b\13\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\1\26\1\u01ef\16\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\1\26\1\u01f0"+ - "\16\26\35\0\14\26\1\u01f1\1\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\35\0\10\26\1\u01f2\5\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\6\26\1\u01f3\11\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\6\26\1\u01f4"+ - "\11\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\4\26\1\u01f5\13\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\15\26\1\u01f6\2\26\35\0\10\26\1\u01f7"+ - "\5\26\2\0\7\26\1\0\2\26\3\0\20\26\35\0"+ - "\10\26\1\u01f8\5\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\2\26\1\u01f9\15\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\6\26\1\u01fa\11\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\15\26\1\u01fb\2\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\5\26\1\u01fc"+ - "\12\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\2\26\1\u01fd\15\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\5\26\1\u01fe\12\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\4\26\1\u01ff\13\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\17\26\1\u0200"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\6\26"+ - "\1\u0201\11\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\13\26\1\u0202\4\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\5\26\1\u0203\12\26\35\0\14\26"+ - "\1\u0204\1\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\5\122"+ - "\1\u0205\12\122\35\0\6\122\1\u0206\7\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\14\122\1\u0207\1\122"+ - "\2\0\7\122\1\0\1\122\4\0\20\122\35\0\14\122"+ - "\1\u0208\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\6\122"+ - "\1\u0209\11\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\1\122\1\u020a\16\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\6\122\1\u020b\11\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\12\122\1\u020c\5\122"+ - "\35\0\6\122\1\u020d\7\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\11\122\1\u020e\6\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\3\122\1\u020f\14\122\35\0\14\122"+ - "\1\u0210\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\1\122"+ - "\1\u0211\16\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\1\122\1\u0212\16\122\35\0\14\122\1\u0213\1\122"+ - "\2\0\7\122\1\0\1\122\4\0\20\122\35\0\10\122"+ - "\1\u0214\5\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\6\122"+ - "\1\u0215\11\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\6\122\1\u0216\11\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\4\122\1\u0217\13\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\15\122\1\u0218\2\122"+ - "\35\0\10\122\1\u0219\5\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\10\122\1\u021a\5\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\2\122\1\u021b\15\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\6\122\1\u021c\11\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\15\122"+ - "\1\u021d\2\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\5\122\1\u021e\12\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\2\122\1\u021f\15\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\5\122\1\u0220\12\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\4\122"+ - "\1\u0221\13\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\17\122\1\u0222\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\6\122\1\u0223\11\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\13\122\1\u0224\4\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\5\122\1\u0225"+ - "\12\122\35\0\14\122\1\u0226\1\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\22\0\7\u016a\1\u0227\1\u0228\101\u016a"+ - "\10\u01d8\1\u0229\101\u01d8\7\u016d\1\u016e\1\u022a\101\u016d\13\0"+ - "\6\26\1\u022b\7\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\7\26\1\u022c\10\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\5\26\1\u022d\12\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\11\26\1\u022e\6\26\35\0"+ - "\4\26\1\u022f\11\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\6\26\1\u0230\7\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\35\0\14\26\1\u0231\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\12\26\1\u0232"+ - "\3\26\2\0\7\26\1\0\2\26\3\0\20\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\1\26\1\u0233"+ - "\16\26\22\0\2\232\1\u0112\1\232\2\u0112\1\u0183\36\232"+ - "\1\u0111\44\232\1\0\2\u0184\1\u0185\1\0\1\u0184\104\0"+ - "\45\u0114\1\u0111\44\u0114\2\235\1\u0116\1\235\2\u0116\1\u0188"+ - "\35\235\1\0\1\235\1\u0115\43\235\1\0\2\u0189\1\u018a"+ - "\1\0\1\u0189\104\0\6\u018b\1\0\35\u018b\1\0\1\u018b"+ - "\1\u0115\43\u018b\13\0\2\26\1\u0234\13\26\2\0\7\26"+ - "\1\0\2\26\3\0\20\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\5\26\1\u0235\12\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\2\26\1\u0236\15\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\2\26"+ - "\1\u0237\15\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\1\26\1\u0238\16\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\5\26\1\u0239\12\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\11\26\1\u023a\6\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\2\26"+ - "\1\u023b\15\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\5\26\1\u023c\12\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\6\26\1\u023d\11\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\15\26\1\u023e\2\26"+ - "\35\0\10\26\1\u023f\5\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\16\26\2\0\7\26\1\0\2\26"+ - "\3\0\4\26\1\u0240\13\26\35\0\16\26\2\0\7\26"+ - "\1\0\2\26\3\0\11\26\1\u0241\6\26\35\0\14\26"+ - "\1\u0242\1\26\2\0\7\26\1\0\2\26\3\0\20\26"+ - "\35\0\10\26\1\u0243\5\26\2\0\7\26\1\0\2\26"+ - "\3\0\20\26\35\0\6\122\1\u0244\7\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\7\122\1\u0245\10\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\5\122\1\u0246\12\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\11\122"+ - "\1\u0247\6\122\35\0\4\122\1\u0248\11\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\6\122\1\u0249\7\122"+ - "\2\0\7\122\1\0\1\122\4\0\20\122\35\0\14\122"+ - "\1\u024a\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\12\122\1\u024b\3\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\1\122\1\u024c\16\122\35\0\2\122\1\u024d\13\122"+ - "\2\0\7\122\1\0\1\122\4\0\20\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\5\122\1\u024e\12\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\2\122"+ - "\1\u024f\15\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\2\122\1\u0250\15\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\1\122\1\u0251\16\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\5\122\1\u0252\12\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\11\122"+ - "\1\u0253\6\122\35\0\16\122\2\0\7\122\1\0\1\122"+ - "\4\0\2\122\1\u0254\15\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\5\122\1\u0255\12\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\6\122\1\u0256\11\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\15\122"+ - "\1\u0257\2\122\35\0\10\122\1\u0258\5\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\4\122\1\u0259\13\122\35\0\16\122"+ - "\2\0\7\122\1\0\1\122\4\0\11\122\1\u025a\6\122"+ - "\35\0\14\122\1\u025b\1\122\2\0\7\122\1\0\1\122"+ - "\4\0\20\122\35\0\10\122\1\u025c\5\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\22\0\7\u01d8\1\u01d9\1\u025d"+ - "\101\u01d8\13\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\14\26\1\u025e\3\26\35\0\14\26\1\u025f\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\2\26\1\u0260\15\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\1\26\1\u0261"+ - "\16\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\5\26\1\u0262\12\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\4\26\1\u0263\13\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\11\26\1\u0264\6\26\35\0"+ - "\14\26\1\u0265\1\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\14\26\1\u0266\1\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\5\26\1\u0267\12\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\2\26\1\u0268\15\26\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\12\26\1\u0269"+ - "\5\26\35\0\4\26\1\u026a\11\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\10\26\1\u026b\7\26\35\0\14\26\1\u026c"+ - "\1\26\2\0\7\26\1\0\2\26\3\0\20\26\35\0"+ - "\6\26\1\u026d\7\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\14\122\1\u026e\3\122\35\0\14\122\1\u026f\1\122\2\0"+ - "\7\122\1\0\1\122\4\0\20\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\2\122\1\u0270\15\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\1\122\1\u0271"+ - "\16\122\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\5\122\1\u0272\12\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\4\122\1\u0273\13\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\11\122\1\u0274\6\122\35\0"+ - "\14\122\1\u0275\1\122\2\0\7\122\1\0\1\122\4\0"+ - "\20\122\35\0\14\122\1\u0276\1\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\5\122\1\u0277\12\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\2\122\1\u0278\15\122\35\0"+ - "\16\122\2\0\7\122\1\0\1\122\4\0\12\122\1\u0279"+ - "\5\122\35\0\4\122\1\u027a\11\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\10\122\1\u027b\7\122\35\0\14\122\1\u027c"+ - "\1\122\2\0\7\122\1\0\1\122\4\0\20\122\35\0"+ - "\6\122\1\u027d\7\122\2\0\7\122\1\0\1\122\4\0"+ - "\20\122\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\11\26\1\u027e\6\26\35\0\14\26\1\u027f\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\2\26\1\u0280\15\26\35\0"+ - "\14\26\1\u0281\1\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\5\26\1\u0282\12\26\35\0\14\26\1\u0283\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\16\26\2\0"+ - "\7\26\1\0\2\26\3\0\1\u0284\17\26\35\0\16\26"+ - "\2\0\7\26\1\0\2\26\3\0\11\26\1\u0285\6\26"+ - "\35\0\16\26\2\0\7\26\1\0\2\26\3\0\11\26"+ - "\1\u0286\6\26\35\0\14\26\1\u0287\1\26\2\0\7\26"+ - "\1\0\2\26\3\0\20\26\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\11\122\1\u0288\6\122\35\0\14\122"+ - "\1\u0289\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\2\122"+ - "\1\u028a\15\122\35\0\14\122\1\u028b\1\122\2\0\7\122"+ - "\1\0\1\122\4\0\20\122\35\0\16\122\2\0\7\122"+ - "\1\0\1\122\4\0\5\122\1\u028c\12\122\35\0\14\122"+ - "\1\u028d\1\122\2\0\7\122\1\0\1\122\4\0\20\122"+ - "\35\0\16\122\2\0\7\122\1\0\1\122\4\0\1\u028e"+ - "\17\122\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\11\122\1\u028f\6\122\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\11\122\1\u0290\6\122\35\0\14\122\1\u0291"+ - "\1\122\2\0\7\122\1\0\1\122\4\0\20\122\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\5\26\1\u0292"+ - "\12\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\10\26\1\u0293\7\26\35\0\14\26\1\u0294\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\12\26\1\u0295"+ - "\3\26\2\0\7\26\1\0\2\26\3\0\20\26\35\0"+ - "\10\26\1\u0296\5\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\16\26\2\0\7\26\1\0\2\26\3\0"+ - "\5\26\1\u0297\12\26\35\0\16\122\2\0\7\122\1\0"+ - "\1\122\4\0\5\122\1\u0298\12\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\10\122\1\u0299\7\122\35\0"+ - "\14\122\1\u029a\1\122\2\0\7\122\1\0\1\122\4\0"+ - "\20\122\35\0\12\122\1\u029b\3\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\35\0\10\122\1\u029c\5\122\2\0"+ - "\7\122\1\0\1\122\4\0\20\122\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\5\122\1\u029d\12\122\35\0"+ - "\16\26\2\0\7\26\1\0\2\26\3\0\4\26\1\u029e"+ - "\13\26\35\0\4\26\1\u029f\11\26\2\0\7\26\1\0"+ - "\2\26\3\0\20\26\35\0\16\26\2\0\7\26\1\0"+ - "\2\26\3\0\16\26\1\u02a0\1\26\35\0\16\122\2\0"+ - "\7\122\1\0\1\122\4\0\4\122\1\u02a1\13\122\35\0"+ - "\4\122\1\u02a2\11\122\2\0\7\122\1\0\1\122\4\0"+ - "\20\122\35\0\16\122\2\0\7\122\1\0\1\122\4\0"+ - "\16\122\1\u02a3\1\122\35\0\14\26\1\u02a4\1\26\2\0"+ - "\7\26\1\0\2\26\3\0\20\26\35\0\14\122\1\u02a5"+ - "\1\122\2\0\7\122\1\0\1\122\4\0\20\122\35\0"+ - "\12\26\1\u02a6\3\26\2\0\7\26\1\0\2\26\3\0"+ - "\20\26\35\0\12\122\1\u02a7\3\122\2\0\7\122\1\0"+ - "\1\122\4\0\20\122\22\0"; + "\1\16\3\17\1\20\1\21\1\22\1\23\1\24\1\25"+ + "\1\26\1\27\1\30\2\27\1\31\1\27\1\32\1\27"+ + "\1\33\1\27\1\34\1\27\1\35\1\27\1\36\1\37"+ + "\1\27\1\40\1\41\1\27\1\30\2\27\1\42\1\27"+ + "\1\43\1\44\1\45\1\46\1\47\1\50\1\51\1\27"+ + "\1\52\1\53\1\54\2\27\1\55\1\27\1\56\3\27"+ + "\1\57\1\60\1\61\1\62\1\63\1\64\1\65\1\66"+ + "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\1\76"+ + "\1\77\1\100\1\101\1\16\3\17\1\20\1\21\1\22"+ + "\1\23\1\24\1\25\1\26\1\27\1\30\2\27\1\31"+ + "\1\27\1\32\1\27\1\33\1\27\1\34\1\27\1\35"+ + "\1\27\1\36\1\37\1\27\1\40\1\41\1\27\1\30"+ + "\2\27\1\42\1\27\1\43\1\44\1\45\1\102\1\47"+ + "\1\50\1\51\1\27\1\52\1\53\1\54\2\27\1\55"+ + "\1\27\1\56\3\27\1\57\1\60\1\61\1\62\1\63"+ + "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\73"+ + "\1\74\1\75\1\76\1\77\1\100\1\101\4\103\2\20"+ + "\1\104\1\105\34\103\1\106\45\103\1\107\1\110\2\111"+ + "\1\107\1\110\1\112\35\107\1\113\1\107\1\114\43\107"+ + "\6\115\1\112\35\115\1\113\1\115\1\116\43\115\6\117"+ + "\1\120\1\121\34\117\1\122\45\117\7\123\1\124\34\123"+ + "\1\125\45\123\13\126\1\127\1\126\2\127\1\130\1\127"+ + "\1\131\1\127\1\132\1\127\1\133\1\127\1\134\1\127"+ + "\2\126\1\127\1\126\1\135\1\127\1\126\2\127\1\126"+ + "\1\127\4\126\1\136\1\137\1\140\1\127\1\141\1\142"+ + "\1\143\2\127\1\144\1\127\1\145\3\127\1\146\1\147"+ + "\21\126\42\150\1\151\47\150\13\152\1\127\1\152\14\127"+ + "\2\152\1\127\1\152\2\127\1\152\2\127\1\152\1\127"+ + "\4\152\20\127\22\152\1\153\5\154\1\155\1\156\102\153"+ + "\1\157\5\154\1\160\103\157\1\161\5\154\1\162\103\161"+ + "\113\0\5\17\1\163\104\0\2\20\1\164\1\0\1\20"+ + "\113\0\1\165\1\166\60\0\1\167\30\0\1\170\31\0"+ + "\1\171\26\0\1\172\32\0\1\173\170\0\1\174\33\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\20\27\36\0"+ + "\1\30\2\175\2\176\2\177\2\200\2\201\2\202\2\0"+ + "\1\203\1\30\2\0\1\30\2\0\1\204\62\0\6\27"+ + "\1\205\1\27\1\206\5\27\2\0\7\27\1\0\2\27"+ + "\3\0\1\27\1\207\6\27\1\210\7\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\10\27\1\211\7\27"+ + "\35\0\4\27\1\212\11\27\2\0\7\27\1\0\2\27"+ + "\3\0\7\27\1\213\1\27\1\214\6\27\35\0\14\27"+ + "\1\215\1\27\2\0\7\27\1\0\2\27\3\0\10\27"+ + "\1\216\7\27\35\0\6\27\1\217\7\27\2\0\5\27"+ + "\1\220\1\27\1\0\2\27\3\0\11\27\1\221\6\27"+ + "\53\0\1\222\37\0\1\223\52\0\1\224\36\0\1\225"+ + "\10\0\1\226\23\0\1\30\2\175\2\176\2\177\2\200"+ + "\2\201\2\202\2\0\1\203\1\30\2\227\1\30\2\230"+ + "\1\204\62\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\6\27\1\231\1\27\1\232\3\27\1\233\3\27\64\0"+ + "\1\234\44\0\1\235\11\0\1\236\3\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\20\27\22\0\2\237\2\0"+ + "\2\237\1\240\36\237\1\241\44\237\2\242\2\0\2\242"+ + "\1\243\35\242\1\0\1\242\1\244\43\242\13\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\1\27\1\245\4\27"+ + "\1\246\3\27\1\247\5\27\35\0\16\27\2\0\2\27"+ + "\1\250\4\27\1\0\2\27\3\0\4\27\1\251\13\27"+ + "\35\0\6\27\1\252\7\27\2\0\7\27\1\0\2\27"+ + "\3\0\1\27\1\253\6\27\1\254\4\27\1\255\2\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\5\27"+ + "\1\256\4\27\1\257\1\27\1\260\1\261\1\27\1\262"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\6\27"+ + "\1\263\6\27\1\264\2\27\35\0\14\27\1\265\1\27"+ + "\2\0\7\27\1\0\2\27\3\0\20\27\35\0\14\27"+ + "\1\266\1\27\2\0\7\27\1\0\2\27\3\0\1\27"+ + "\1\267\10\27\1\270\5\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\10\27\1\271\7\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\15\27\1\272\2\27"+ + "\113\0\1\273\11\0\1\274\50\0\1\275\34\0\1\276"+ + "\103\0\1\277\7\0\1\300\101\0\1\301\10\0\1\302"+ + "\100\0\1\303\111\0\1\304\111\0\1\305\14\0\1\306"+ + "\74\0\1\307\15\0\1\310\2\0\7\311\2\0\60\311"+ + "\1\0\20\311\7\0\1\312\102\0\2\107\2\0\2\107"+ + "\1\0\35\107\1\0\1\107\1\0\44\107\1\110\2\111"+ + "\2\110\1\313\35\107\1\0\1\107\1\0\43\107\1\0"+ + "\5\111\1\313\103\0\1\314\3\0\1\314\1\0\104\314"+ + "\6\115\1\0\35\115\1\0\1\115\1\0\43\115\46\0"+ + "\1\315\43\0\6\117\2\0\34\117\1\0\45\117\7\0"+ + "\1\316\102\0\13\317\1\0\1\317\14\0\2\317\1\0"+ + "\1\317\2\0\1\317\2\0\1\317\1\0\4\317\21\0"+ + "\21\317\7\123\1\0\34\123\1\0\45\123\44\0\1\320"+ + "\45\0\7\321\1\322\3\321\1\0\1\321\14\0\2\321"+ + "\1\0\1\321\2\0\1\321\2\0\1\321\1\0\1\322"+ + "\3\321\21\0\21\321\13\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\6\127\1\323\1\127\1\324"+ + "\5\127\2\0\7\127\1\0\1\127\4\0\1\127\1\325"+ + "\6\127\1\326\7\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\10\127\1\327\7\127\35\0\4\127\1\330"+ + "\11\127\2\0\7\127\1\0\1\127\4\0\7\127\1\331"+ + "\1\127\1\332\6\127\35\0\14\127\1\333\1\127\2\0"+ + "\7\127\1\0\1\127\4\0\10\127\1\334\7\127\35\0"+ + "\6\127\1\335\7\127\2\0\5\127\1\336\1\127\1\0"+ + "\1\127\4\0\11\127\1\337\6\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\6\127\1\340\1\127\1\341"+ + "\3\127\1\342\3\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\1\127\1\343\4\127\1\344\3\127\1\345"+ + "\5\127\35\0\16\127\2\0\2\127\1\346\4\127\1\0"+ + "\1\127\4\0\4\127\1\347\13\127\35\0\6\127\1\350"+ + "\7\127\2\0\7\127\1\0\1\127\4\0\1\127\1\351"+ + "\6\127\1\352\4\127\1\353\2\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\5\127\1\354\4\127\1\355"+ + "\1\127\1\356\1\357\1\127\1\360\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\6\127\1\361\6\127\1\362"+ + "\2\127\35\0\14\127\1\363\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\14\127\1\364\1\127\2\0"+ + "\7\127\1\0\1\127\4\0\1\127\1\365\10\127\1\366"+ + "\5\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\10\127\1\367\7\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\15\127\1\370\2\127\35\0\1\371\1\0"+ + "\14\371\2\0\1\371\1\0\2\371\1\0\2\371\1\0"+ + "\1\371\4\0\20\371\23\0\5\154\1\372\104\0\3\154"+ + "\1\0\1\154\113\0\1\373\1\374\102\0\3\17\1\0"+ + "\1\17\106\0\1\20\107\0\2\165\2\0\106\165\10\375"+ + "\1\376\101\375\71\0\1\377\20\0\2\173\2\0\106\173"+ + "\71\0\1\u0100\34\0\1\u0101\14\0\2\u0102\1\0\1\u0101"+ + "\2\0\1\u0101\66\0\1\30\16\0\1\203\1\30\2\0"+ + "\1\30\66\0\1\u0103\17\0\1\u0103\2\0\1\u0103\65\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\10\27\1\u0104"+ + "\7\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\11\27\1\u0105\6\27\35\0\6\27\1\u0106\7\27\2\0"+ + "\7\27\1\0\2\27\3\0\20\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\6\27\1\u0107\11\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\11\27\1\u0108"+ + "\6\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\1\u0109\17\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\4\27\1\u010a\1\u010b\12\27\35\0\4\27\1\u010c"+ + "\11\27\2\0\7\27\1\0\2\27\3\0\20\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\12\27\1\u010d"+ + "\5\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\4\27\1\u010e\13\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\5\27\1\u010f\12\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\12\27\1\u0110\5\27\56\0"+ + "\1\u0111\2\0\1\u0111\65\0\2\u0112\2\0\2\u0112\4\0"+ + "\4\u0112\3\0\4\u0112\11\0\2\u0112\52\0\14\27\1\u0113"+ + "\1\27\2\0\7\27\1\0\2\27\3\0\20\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\10\27\1\u0114"+ + "\7\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\5\27\1\u0115\12\27\64\0\1\u0116\36\0\1\u0117\10\0"+ + "\2\237\2\0\2\237\1\240\36\237\1\u0118\50\237\2\u0119"+ + "\1\u011a\103\237\45\0\1\u011b\44\0\2\242\2\0\2\242"+ + "\1\243\35\242\1\0\1\242\1\u011c\47\242\2\u011d\1\u011e"+ + "\103\242\46\0\1\u011f\56\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\2\27\1\u0120\15\27\35\0\10\27\1\u0121"+ + "\5\27\2\0\7\27\1\0\2\27\3\0\10\27\1\u0122"+ + "\7\27\35\0\16\27\2\0\2\27\1\u0123\4\27\1\0"+ + "\2\27\3\0\20\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\4\27\1\u0124\13\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\4\27\1\u0125\13\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\1\27\1\u0126"+ + "\16\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\4\27\1\u0127\1\u0128\12\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\11\27\1\u0129\6\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\1\27\1\u012a\16\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\1\27"+ + "\1\u012b\4\27\1\u012c\11\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\1\u012d\17\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\11\27\1\u012e\6\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\10\27\1\u012f"+ + "\7\27\35\0\10\27\1\u0130\5\27\2\0\7\27\1\0"+ + "\2\27\3\0\20\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\1\27\1\u0131\10\27\1\u0132\1\27\1\u0133"+ + "\3\27\35\0\10\27\1\u0134\5\27\2\0\7\27\1\0"+ + "\2\27\3\0\6\27\1\u0135\11\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\5\27\1\u0136\12\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\17\27\1\u0137"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\5\27"+ + "\1\u0138\12\27\35\0\6\27\1\u0139\7\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\6\27\1\u013a\1\27"+ + "\1\u013b\5\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\10\27\1\u013c\5\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\113\0\1\u013d\11\0\1\u013e\110\0\1\u013f"+ + "\100\0\1\u0140\111\0\1\u0141\10\0\1\u0142\10\0\3\111"+ + "\1\0\1\111\152\0\1\u0143\56\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\10\127\1\u0144\7\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\11\127\1\u0145\6\127"+ + "\35\0\6\127\1\u0146\7\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\6\127\1\u0147\11\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\11\127\1\u0148\6\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\1\u0149\17\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\4\127\1\u014a"+ + "\1\u014b\12\127\35\0\4\127\1\u014c\11\127\2\0\7\127"+ + "\1\0\1\127\4\0\20\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\12\127\1\u014d\5\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\4\127\1\u014e\13\127"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\5\127"+ + "\1\u014f\12\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\12\127\1\u0150\5\127\35\0\14\127\1\u0151\1\127"+ + "\2\0\7\127\1\0\1\127\4\0\20\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\10\127\1\u0152\7\127"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\5\127"+ + "\1\u0153\12\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\2\127\1\u0154\15\127\35\0\10\127\1\u0155\5\127"+ + "\2\0\7\127\1\0\1\127\4\0\10\127\1\u0156\7\127"+ + "\35\0\16\127\2\0\2\127\1\u0157\4\127\1\0\1\127"+ + "\4\0\20\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\4\127\1\u0158\13\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\4\127\1\u0159\13\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\1\127\1\u015a\16\127"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\4\127"+ + "\1\u015b\1\u015c\12\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\11\127\1\u015d\6\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\1\127\1\u015e\16\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\1\127\1\u015f"+ + "\4\127\1\u0160\11\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\1\u0161\17\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\11\127\1\u0162\6\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\10\127\1\u0163\7\127"+ + "\35\0\10\127\1\u0164\5\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\1\127\1\u0165\10\127\1\u0166\1\127\1\u0167\3\127"+ + "\35\0\10\127\1\u0168\5\127\2\0\7\127\1\0\1\127"+ + "\4\0\6\127\1\u0169\11\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\5\127\1\u016a\12\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\17\127\1\u016b\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\5\127\1\u016c"+ + "\12\127\35\0\6\127\1\u016d\7\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\6\127\1\u016e\1\127\1\u016f"+ + "\5\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\10\127\1\u0170\5\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\16\371\2\0\7\371\1\0\1\371\4\0"+ + "\20\371\22\0\2\373\2\0\106\373\10\u0171\1\u0172\101\u0171"+ + "\10\375\1\u0173\101\375\7\u0174\1\u0175\1\376\101\u0174\14\0"+ + "\1\u0101\2\u0176\2\176\4\0\2\201\4\0\1\u0102\1\u0101"+ + "\2\0\1\u0101\66\0\1\u0101\17\0\1\u0101\2\0\1\u0101"+ + "\66\0\1\u0103\2\u0176\2\176\4\0\2\201\2\202\2\0"+ + "\1\u0177\1\u0103\2\0\1\u0103\65\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\1\27\1\u0178\16\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\1\27\1\u0179\16\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\4\27"+ + "\1\u017a\13\27\35\0\2\27\1\u017b\13\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\6\27\1\u017c\7\27"+ + "\2\0\7\27\1\0\2\27\3\0\10\27\1\u017d\7\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\5\27"+ + "\1\u017e\12\27\35\0\14\27\1\u017f\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\1\27\1\u0180\16\27\35\0\16\27"+ + "\2\0\2\27\1\u0181\4\27\1\0\2\27\3\0\20\27"+ + "\35\0\14\27\1\u0182\1\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\35\0\14\27\1\u0183\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\7\27\1\u0184\10\27\37\0\2\175"+ + "\2\0\2\177\2\200\6\0\1\u0185\1\u0111\2\0\1\u0111"+ + "\65\0\2\u0112\2\175\2\u0112\2\177\2\200\4\u0112\2\0"+ + "\1\u0186\4\u0112\11\0\2\u0112\52\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\1\27\1\u0187\16\27\35\0\6\27"+ + "\1\u0188\7\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\14\27\1\u0189\1\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\22\0\4\237\2\u0119\1\u018a\36\237\1\u0118"+ + "\45\237\1\u0119\1\u018b\1\u018c\1\237\1\u0119\1\240\36\237"+ + "\1\u0118\44\237\6\u011b\1\u018d\36\u011b\1\u018e\44\u011b\4\242"+ + "\2\u011d\1\u018f\35\242\1\0\1\242\1\u011c\44\242\1\u011d"+ + "\1\u0190\1\u0191\1\242\1\u011d\1\243\35\242\1\0\1\242"+ + "\1\u011c\43\242\6\u0192\1\u0193\35\u0192\1\0\1\u0192\1\u0194"+ + "\43\u0192\13\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\3\27\1\u0195\14\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\13\27\1\u0196\4\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\5\27\1\u0197\12\27\35\0"+ + "\6\27\1\u0198\7\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\5\27\1\u0199\12\27\35\0\14\27\1\u019a\1\27\2\0"+ + "\7\27\1\0\2\27\3\0\20\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\4\27\1\u019b\13\27\35\0"+ + "\14\27\1\u019c\1\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\2\27\1\u019d\15\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\5\27\1\u019e\12\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\6\27\1\u019f\11\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\5\27\1\u01a0"+ + "\12\27\35\0\10\27\1\u01a1\5\27\2\0\7\27\1\0"+ + "\2\27\3\0\20\27\35\0\14\27\1\u01a2\1\27\2\0"+ + "\7\27\1\0\2\27\3\0\20\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\2\27\1\u01a3\15\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\6\27\1\u01a4"+ + "\11\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\5\27\1\u01a5\12\27\35\0\10\27\1\u01a6\5\27\2\0"+ + "\7\27\1\0\2\27\3\0\11\27\1\u01a7\6\27\35\0"+ + "\14\27\1\u01a8\1\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\4\27\1\u01a9\13\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\10\27\1\u01aa\7\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\12\27\1\u01ab\5\27\35\0"+ + "\10\27\1\u01ac\5\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\6\27\1\u01ad\7\27\2\0\7\27\1\0"+ + "\2\27\3\0\20\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\1\27\1\u01ae\16\27\35\0\12\27\1\u01af"+ + "\3\27\2\0\7\27\1\0\2\27\3\0\20\27\35\0"+ + "\6\27\1\u01b0\7\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\113\0\1\u01b1\33\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\1\127\1\u01b2\16\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\1\127\1\u01b3\16\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\4\127\1\u01b4"+ + "\13\127\35\0\2\127\1\u01b5\13\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\6\127\1\u01b6\7\127\2\0"+ + "\7\127\1\0\1\127\4\0\10\127\1\u01b7\7\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\5\127\1\u01b8"+ + "\12\127\35\0\14\127\1\u01b9\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\1\127\1\u01ba\16\127\35\0\16\127\2\0"+ + "\2\127\1\u01bb\4\127\1\0\1\127\4\0\20\127\35\0"+ + "\14\127\1\u01bc\1\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\14\127\1\u01bd\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\7\127\1\u01be\10\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\1\127\1\u01bf\16\127\35\0"+ + "\6\127\1\u01c0\7\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\14\127\1\u01c1\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\3\127\1\u01c2\14\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\13\127\1\u01c3\4\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\5\127\1\u01c4"+ + "\12\127\35\0\6\127\1\u01c5\7\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\5\127\1\u01c6\12\127\35\0\14\127\1\u01c7"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\4\127\1\u01c8"+ + "\13\127\35\0\14\127\1\u01c9\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\2\127\1\u01ca\15\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\5\127\1\u01cb\12\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\6\127\1\u01cc"+ + "\11\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\5\127\1\u01cd\12\127\35\0\10\127\1\u01ce\5\127\2\0"+ + "\7\127\1\0\1\127\4\0\20\127\35\0\14\127\1\u01cf"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\2\127\1\u01d0"+ + "\15\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\6\127\1\u01d1\11\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\5\127\1\u01d2\12\127\35\0\10\127\1\u01d3"+ + "\5\127\2\0\7\127\1\0\1\127\4\0\11\127\1\u01d4"+ + "\6\127\35\0\14\127\1\u01d5\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\4\127\1\u01d6\13\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\10\127\1\u01d7\7\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\12\127\1\u01d8"+ + "\5\127\35\0\10\127\1\u01d9\5\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\6\127\1\u01da\7\127\2\0"+ + "\7\127\1\0\1\127\4\0\20\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\1\127\1\u01db\16\127\35\0"+ + "\12\127\1\u01dc\3\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\6\127\1\u01dd\7\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\22\0\10\u0171\1\u01de\101\u0171\7\u01df"+ + "\1\u01e0\1\u0172\101\u01df\7\375\1\u01e1\1\u01e2\101\375\10\u0174"+ + "\1\u01e3\101\u0174\14\0\1\u0103\16\0\1\u0177\1\u0103\2\0"+ + "\1\u0103\65\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\5\27\1\u01e4\12\27\35\0\6\27\1\u01e5\7\27\2\0"+ + "\7\27\1\0\2\27\3\0\20\27\35\0\14\27\1\u01e6"+ + "\1\27\2\0\7\27\1\0\2\27\3\0\20\27\35\0"+ + "\14\27\1\u01e7\1\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\6\27\1\u01e8\11\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\1\27\1\u01e9\16\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\6\27\1\u01ea\11\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\12\27\1\u01eb"+ + "\5\27\35\0\6\27\1\u01ec\7\27\2\0\7\27\1\0"+ + "\2\27\3\0\20\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\11\27\1\u01ed\6\27\55\0\1\u0185\1\u0111"+ + "\2\0\1\u0111\65\0\2\u0112\2\0\2\u0112\4\0\4\u0112"+ + "\2\0\1\u0186\4\u0112\11\0\2\u0112\52\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\3\27\1\u01ee\14\27\35\0"+ + "\14\27\1\u01ef\1\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\22\0\1\237\2\u0119\1\u01f0\2\u0119\1\u011a\103\237"+ + "\2\0\2\237\2\u018b\1\u01f1\105\0\1\u0119\1\237\2\u018b"+ + "\1\u01f1\103\0\157\u011b\1\u01f2\44\u011b\1\242\2\u011d\1\u01f3"+ + "\2\u011d\1\u011e\103\242\2\0\2\242\2\u0190\1\u01f4\105\0"+ + "\1\u011d\1\242\2\u0190\1\u01f4\103\0\120\u0192\1\0\35\u0192"+ + "\1\0\1\u0192\1\u01f5\43\u0192\13\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\1\27\1\u01f6\16\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\1\27\1\u01f7\16\27"+ + "\35\0\14\27\1\u01f8\1\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\35\0\10\27\1\u01f9\5\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\6\27\1\u01fa\11\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\6\27\1\u01fb\11\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\4\27"+ + "\1\u01fc\13\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\15\27\1\u01fd\2\27\35\0\10\27\1\u01fe\5\27"+ + "\2\0\7\27\1\0\2\27\3\0\20\27\35\0\10\27"+ + "\1\u01ff\5\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\2\27"+ + "\1\u0200\15\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\6\27\1\u0201\11\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\15\27\1\u0202\2\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\5\27\1\u0203\12\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\2\27"+ + "\1\u0204\15\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\5\27\1\u0205\12\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\4\27\1\u0206\13\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\17\27\1\u0207\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\6\27\1\u0208"+ + "\11\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\13\27\1\u0209\4\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\5\27\1\u020a\12\27\35\0\14\27\1\u020b"+ + "\1\27\2\0\7\27\1\0\2\27\3\0\20\27\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\5\127\1\u020c"+ + "\12\127\35\0\6\127\1\u020d\7\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\14\127\1\u020e\1\127\2\0"+ + "\7\127\1\0\1\127\4\0\20\127\35\0\14\127\1\u020f"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\6\127\1\u0210"+ + "\11\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\1\127\1\u0211\16\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\6\127\1\u0212\11\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\12\127\1\u0213\5\127\35\0"+ + "\6\127\1\u0214\7\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\11\127\1\u0215\6\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\3\127\1\u0216\14\127\35\0\14\127\1\u0217"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\1\127\1\u0218"+ + "\16\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\1\127\1\u0219\16\127\35\0\14\127\1\u021a\1\127\2\0"+ + "\7\127\1\0\1\127\4\0\20\127\35\0\10\127\1\u021b"+ + "\5\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\6\127\1\u021c"+ + "\11\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\6\127\1\u021d\11\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\4\127\1\u021e\13\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\15\127\1\u021f\2\127\35\0"+ + "\10\127\1\u0220\5\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\10\127\1\u0221\5\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\2\127\1\u0222\15\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\6\127\1\u0223\11\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\15\127\1\u0224"+ + "\2\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\5\127\1\u0225\12\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\2\127\1\u0226\15\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\5\127\1\u0227\12\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\4\127\1\u0228"+ + "\13\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\17\127\1\u0229\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\6\127\1\u022a\11\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\13\127\1\u022b\4\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\5\127\1\u022c\12\127"+ + "\35\0\14\127\1\u022d\1\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\22\0\7\u0171\1\u022e\1\u022f\101\u0171\10\u01df"+ + "\1\u0230\101\u01df\7\u0174\1\u0175\1\u0231\101\u0174\13\0\6\27"+ + "\1\u0232\7\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\7\27"+ + "\1\u0233\10\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\5\27\1\u0234\12\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\11\27\1\u0235\6\27\35\0\4\27"+ + "\1\u0236\11\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\6\27\1\u0237\7\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\35\0\14\27\1\u0238\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\12\27\1\u0239\3\27"+ + "\2\0\7\27\1\0\2\27\3\0\20\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\1\27\1\u023a\16\27"+ + "\22\0\2\237\1\u0119\1\237\2\u0119\1\u018a\36\237\1\u0118"+ + "\44\237\1\0\2\u018b\1\u018c\1\0\1\u018b\104\0\45\u011b"+ + "\1\u0118\44\u011b\2\242\1\u011d\1\242\2\u011d\1\u018f\35\242"+ + "\1\0\1\242\1\u011c\43\242\1\0\2\u0190\1\u0191\1\0"+ + "\1\u0190\104\0\6\u0192\1\0\35\u0192\1\0\1\u0192\1\u011c"+ + "\43\u0192\13\0\2\27\1\u023b\13\27\2\0\7\27\1\0"+ + "\2\27\3\0\20\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\5\27\1\u023c\12\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\2\27\1\u023d\15\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\2\27\1\u023e"+ + "\15\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\1\27\1\u023f\16\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\5\27\1\u0240\12\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\11\27\1\u0241\6\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\2\27\1\u0242"+ + "\15\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\5\27\1\u0243\12\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\6\27\1\u0244\11\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\15\27\1\u0245\2\27\35\0"+ + "\10\27\1\u0246\5\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\16\27\2\0\7\27\1\0\2\27\3\0"+ + "\4\27\1\u0247\13\27\35\0\16\27\2\0\7\27\1\0"+ + "\2\27\3\0\11\27\1\u0248\6\27\35\0\14\27\1\u0249"+ + "\1\27\2\0\7\27\1\0\2\27\3\0\20\27\35\0"+ + "\10\27\1\u024a\5\27\2\0\7\27\1\0\2\27\3\0"+ + "\20\27\35\0\6\127\1\u024b\7\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\7\127\1\u024c\10\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\5\127\1\u024d\12\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\11\127\1\u024e"+ + "\6\127\35\0\4\127\1\u024f\11\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\6\127\1\u0250\7\127\2\0"+ + "\7\127\1\0\1\127\4\0\20\127\35\0\14\127\1\u0251"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\12\127\1\u0252\3\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\1\127\1\u0253\16\127\35\0\2\127\1\u0254\13\127\2\0"+ + "\7\127\1\0\1\127\4\0\20\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\5\127\1\u0255\12\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\2\127\1\u0256"+ + "\15\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\2\127\1\u0257\15\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\1\127\1\u0258\16\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\5\127\1\u0259\12\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\11\127\1\u025a"+ + "\6\127\35\0\16\127\2\0\7\127\1\0\1\127\4\0"+ + "\2\127\1\u025b\15\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\5\127\1\u025c\12\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\6\127\1\u025d\11\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\15\127\1\u025e"+ + "\2\127\35\0\10\127\1\u025f\5\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\4\127\1\u0260\13\127\35\0\16\127\2\0"+ + "\7\127\1\0\1\127\4\0\11\127\1\u0261\6\127\35\0"+ + "\14\127\1\u0262\1\127\2\0\7\127\1\0\1\127\4\0"+ + "\20\127\35\0\10\127\1\u0263\5\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\22\0\7\u01df\1\u01e0\1\u0264\101\u01df"+ + "\13\0\16\27\2\0\7\27\1\0\2\27\3\0\14\27"+ + "\1\u0265\3\27\35\0\14\27\1\u0266\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\2\27\1\u0267\15\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\1\27\1\u0268\16\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\5\27"+ + "\1\u0269\12\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\4\27\1\u026a\13\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\11\27\1\u026b\6\27\35\0\14\27"+ + "\1\u026c\1\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\14\27\1\u026d\1\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\5\27\1\u026e\12\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\2\27\1\u026f\15\27\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\12\27\1\u0270\5\27"+ + "\35\0\4\27\1\u0271\11\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\10\27\1\u0272\7\27\35\0\14\27\1\u0273\1\27"+ + "\2\0\7\27\1\0\2\27\3\0\20\27\35\0\6\27"+ + "\1\u0274\7\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\14\127"+ + "\1\u0275\3\127\35\0\14\127\1\u0276\1\127\2\0\7\127"+ + "\1\0\1\127\4\0\20\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\2\127\1\u0277\15\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\1\127\1\u0278\16\127"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\5\127"+ + "\1\u0279\12\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\4\127\1\u027a\13\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\11\127\1\u027b\6\127\35\0\14\127"+ + "\1\u027c\1\127\2\0\7\127\1\0\1\127\4\0\20\127"+ + "\35\0\14\127\1\u027d\1\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\5\127\1\u027e\12\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\2\127\1\u027f\15\127\35\0\16\127"+ + "\2\0\7\127\1\0\1\127\4\0\12\127\1\u0280\5\127"+ + "\35\0\4\127\1\u0281\11\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\10\127\1\u0282\7\127\35\0\14\127\1\u0283\1\127"+ + "\2\0\7\127\1\0\1\127\4\0\20\127\35\0\6\127"+ + "\1\u0284\7\127\2\0\7\127\1\0\1\127\4\0\20\127"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\11\27"+ + "\1\u0285\6\27\35\0\14\27\1\u0286\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\2\27\1\u0287\15\27\35\0\14\27"+ + "\1\u0288\1\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\5\27"+ + "\1\u0289\12\27\35\0\14\27\1\u028a\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\16\27\2\0\7\27"+ + "\1\0\2\27\3\0\1\u028b\17\27\35\0\16\27\2\0"+ + "\7\27\1\0\2\27\3\0\11\27\1\u028c\6\27\35\0"+ + "\16\27\2\0\7\27\1\0\2\27\3\0\11\27\1\u028d"+ + "\6\27\35\0\14\27\1\u028e\1\27\2\0\7\27\1\0"+ + "\2\27\3\0\20\27\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\11\127\1\u028f\6\127\35\0\14\127\1\u0290"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\2\127\1\u0291"+ + "\15\127\35\0\14\127\1\u0292\1\127\2\0\7\127\1\0"+ + "\1\127\4\0\20\127\35\0\16\127\2\0\7\127\1\0"+ + "\1\127\4\0\5\127\1\u0293\12\127\35\0\14\127\1\u0294"+ + "\1\127\2\0\7\127\1\0\1\127\4\0\20\127\35\0"+ + "\16\127\2\0\7\127\1\0\1\127\4\0\1\u0295\17\127"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\11\127"+ + "\1\u0296\6\127\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\11\127\1\u0297\6\127\35\0\14\127\1\u0298\1\127"+ + "\2\0\7\127\1\0\1\127\4\0\20\127\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\5\27\1\u0299\12\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\10\27"+ + "\1\u029a\7\27\35\0\14\27\1\u029b\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\12\27\1\u029c\3\27"+ + "\2\0\7\27\1\0\2\27\3\0\20\27\35\0\10\27"+ + "\1\u029d\5\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\16\27\2\0\7\27\1\0\2\27\3\0\5\27"+ + "\1\u029e\12\27\35\0\16\127\2\0\7\127\1\0\1\127"+ + "\4\0\5\127\1\u029f\12\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\10\127\1\u02a0\7\127\35\0\14\127"+ + "\1\u02a1\1\127\2\0\7\127\1\0\1\127\4\0\20\127"+ + "\35\0\12\127\1\u02a2\3\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\35\0\10\127\1\u02a3\5\127\2\0\7\127"+ + "\1\0\1\127\4\0\20\127\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\5\127\1\u02a4\12\127\35\0\16\27"+ + "\2\0\7\27\1\0\2\27\3\0\4\27\1\u02a5\13\27"+ + "\35\0\4\27\1\u02a6\11\27\2\0\7\27\1\0\2\27"+ + "\3\0\20\27\35\0\16\27\2\0\7\27\1\0\2\27"+ + "\3\0\16\27\1\u02a7\1\27\35\0\16\127\2\0\7\127"+ + "\1\0\1\127\4\0\4\127\1\u02a8\13\127\35\0\4\127"+ + "\1\u02a9\11\127\2\0\7\127\1\0\1\127\4\0\20\127"+ + "\35\0\16\127\2\0\7\127\1\0\1\127\4\0\16\127"+ + "\1\u02aa\1\127\35\0\14\27\1\u02ab\1\27\2\0\7\27"+ + "\1\0\2\27\3\0\20\27\35\0\14\127\1\u02ac\1\127"+ + "\2\0\7\127\1\0\1\127\4\0\20\127\35\0\12\27"+ + "\1\u02ad\3\27\2\0\7\27\1\0\2\27\3\0\20\27"+ + "\35\0\12\127\1\u02ae\3\127\2\0\7\127\1\0\1\127"+ + "\4\0\20\127\22\0"; private static int [] zzUnpackTrans() { - int [] result = new int[37148]; + int [] result = new int[37370]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -1010,22 +1014,22 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\14\0\1\11\1\1\1\11\25\1\1\11\11\1\1\11"+ - "\2\1\6\11\2\1\1\11\4\1\3\11\4\1\2\11"+ + "\15\0\1\11\1\1\1\11\25\1\1\11\11\1\1\11"+ + "\2\1\6\11\2\1\1\11\4\1\4\11\7\1\2\11"+ "\4\1\1\11\4\1\1\11\20\1\2\11\1\1\2\11"+ "\3\1\1\11\1\1\1\11\1\1\1\0\3\1\1\11"+ "\1\1\2\11\2\1\5\11\3\0\15\1\5\11\2\0"+ - "\4\1\2\11\1\1\1\0\1\1\2\0\27\1\2\11"+ - "\1\1\1\11\1\1\1\0\1\11\1\0\6\11\1\0"+ - "\1\11\1\1\5\11\47\1\1\0\4\1\2\11\1\1"+ - "\1\0\23\1\3\11\3\1\1\11\2\0\36\1\5\11"+ - "\1\0\1\11\61\1\2\11\1\0\15\1\2\0\3\1"+ - "\3\0\2\1\6\0\34\1\1\11\56\1\2\11\1\0"+ - "\16\1\1\0\1\1\3\0\70\1\1\11\1\0\1\1"+ - "\1\0\62\1\1\0\112\1"; + "\4\1\2\11\1\1\1\0\1\1\2\0\30\1\3\11"+ + "\1\1\1\0\1\11\1\0\10\11\1\0\1\11\1\1"+ + "\5\11\47\1\1\0\4\1\2\11\1\1\1\0\23\1"+ + "\3\11\3\1\1\11\2\0\36\1\5\11\1\0\1\11"+ + "\61\1\2\11\1\0\15\1\2\0\3\1\3\0\2\1"+ + "\6\0\34\1\1\11\56\1\2\11\1\0\16\1\1\0"+ + "\1\1\3\0\70\1\1\11\1\0\1\1\1\0\62\1"+ + "\1\0\112\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[679]; + int [] result = new int[686]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1081,10 +1085,21 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { private boolean zzEOFDone; /* user code: */ + @Override protected int getInitialState() { return YYINITIAL; } + @Override + protected int getDivisionExpectedState() { + return DIVISION_EXPECTED; + } + + @Override + protected int[] getDivisionStates() { + return new int[] {YYINITIAL, IN_INNER_BLOCK}; + } + /** * Creates a new scanner @@ -1334,666 +1349,676 @@ public class _GroovyLexer extends GroovyLexerBase implements FlexLexer { case 1: { return mWRONG; } - case 156: break; + case 159: break; case 2: { yybeginstate(NLS_AFTER_NLS); return isWithinBraces() ? TokenType.WHITE_SPACE : storeToken(mNLS); } - case 157: break; + case 160: break; case 3: { return TokenType.WHITE_SPACE; } - case 158: break; + case 161: break; case 4: - { if (isRegexExpected()) { - yybeginstate(IN_SLASHY_STRING); - return storeToken(mREGEX_BEGIN); - } else { - return storeToken(mDIV); - } + { yybeginstate(IN_SLASHY_STRING); + return storeToken(mREGEX_BEGIN); } - case 159: break; + case 162: break; case 5: { return storeToken(mSTAR); } - case 160: break; + case 163: break; case 6: { return storeToken(mLNOT); } - case 161: break; + case 164: break; case 7: { return storeToken(mIDENT); } - case 162: break; + case 165: break; case 8: { return storeToken(mNUM_INT); } - case 163: break; + case 166: break; case 9: { return storeToken(mPLUS); } - case 164: break; + case 167: break; case 10: { return storeToken(mMINUS); } - case 165: break; + case 168: break; case 11: { return storeToken(mDOT); } - case 166: break; + case 169: break; case 12: { return storeToken(mSTRING_LITERAL); } - case 167: break; + case 170: break; case 13: { yybeginstate(IN_SINGLE_GSTRING); return storeToken(mGSTRING_BEGIN); } - case 168: break; + case 171: break; case 14: { yyendstate(YYINITIAL); return storeToken(mRCURLY); } - case 169: break; + case 172: break; case 15: { yybeginstate(YYINITIAL, NLS_AFTER_LBRACE); return storeToken(mLCURLY); } - case 170: break; + case 173: break; case 16: - { return storeToken(mQUESTION); - } - case 171: break; - case 17: { return storeToken(mASSIGN); } - case 172: break; + case 174: break; + case 17: + { return storeToken(mQUESTION); + } + case 175: break; case 18: { return storeToken(mLPAREN); } - case 173: break; + case 176: break; case 19: { return storeToken(mRPAREN); } - case 174: break; + case 177: break; case 20: { return storeToken(mLBRACK); } - case 175: break; + case 178: break; case 21: { return storeToken(mRBRACK); } - case 176: break; + case 179: break; case 22: { return storeToken(mCOLON); } - case 177: break; + case 180: break; case 23: { return storeToken(mCOMMA); } - case 178: break; + case 181: break; case 24: { return storeToken(mLT); } - case 179: break; + case 182: break; case 25: { return storeToken(mGT); } - case 180: break; + case 183: break; case 26: { return storeToken(mBNOT); } - case 181: break; + case 184: break; case 27: { return storeToken(mMOD); } - case 182: break; + case 185: break; case 28: { return storeToken(mBXOR); } - case 183: break; + case 186: break; case 29: { return storeToken(mBOR); } - case 184: break; + case 187: break; case 30: { return storeToken(mBAND); } - case 185: break; + case 188: break; case 31: { return storeToken(mSEMI); } - case 186: break; + case 189: break; case 32: { return storeToken(mAT); } - case 187: break; + case 190: break; case 33: { yyendstate(IN_INNER_BLOCK, IN_GSTRING_DOLLAR); return storeToken(mRCURLY); } - case 188: break; + case 191: break; case 34: + { yypushback(1); + yyendstate(DIVISION_EXPECTED); + } + case 192: break; + case 35: { return storeToken(mGSTRING_CONTENT); } - case 189: break; - case 35: + case 193: break; + case 36: { resetState(); yybeginstate(NLS_AFTER_NLS); return storeToken(mNLS); } - case 190: break; - case 36: + case 194: break; + case 37: { yybeginstate(IN_GSTRING_DOLLAR); return storeToken(mDOLLAR); } - case 191: break; - case 37: + case 195: break; + case 38: { yyendstate(IN_SINGLE_GSTRING); return storeToken(mGSTRING_END); } - case 192: break; - case 38: + case 196: break; + case 39: { return storeToken(mREGEX_CONTENT); } - case 193: break; - case 39: + case 197: break; + case 40: { yyendstate(IN_SLASHY_STRING); return storeToken(mREGEX_END); } - case 194: break; - case 40: + case 198: break; + case 41: { return storeToken(mDOLLAR_SLASH_REGEX_CONTENT); } - case 195: break; - case 41: + case 199: break; + case 42: { yypushback(1); yyendstate(IN_GSTRING_DOLLAR); } - case 196: break; - case 42: + case 200: break; + case 43: { yybeginstate(IN_GSTRING_DOT); return storeToken(mIDENT); } - case 197: break; - case 43: + case 201: break; + case 44: { yybeginstate(IN_INNER_BLOCK, NLS_AFTER_LBRACE); return storeToken(mLCURLY); } - case 198: break; - case 44: + case 202: break; + case 45: { yypushback(1); yyendstate(IN_GSTRING_DOT); } - case 199: break; - case 45: + case 203: break; + case 46: { yypushback(1); yyendstate(IN_GSTRING_DOT_IDENT); } - case 200: break; - case 46: + case 204: break; + case 47: { yypushback(1); yyendstate(NLS_AFTER_COMMENT); } - case 201: break; - case 47: + case 205: break; + case 48: { yypushback(1); yyendstate(NLS_AFTER_LBRACE); } - case 202: break; - case 48: + case 206: break; + case 49: { yypushback(1); yyendstate(NLS_AFTER_NLS); yybeginstate(NLS_AFTER_COMMENT); } - case 203: break; - case 49: + case 207: break; + case 50: { return storeToken(mSL_COMMENT); } - case 204: break; - case 50: + case 208: break; + case 51: { return storeToken(mML_COMMENT); } - case 205: break; - case 51: + case 209: break; + case 52: { return storeToken(mDIV_ASSIGN); } - case 206: break; - case 52: + case 210: break; + case 53: { return storeToken(mSTAR_STAR); } - case 207: break; - case 53: + case 211: break; + case 54: { return storeToken(mSPREAD_DOT); } - case 208: break; - case 54: + case 212: break; + case 55: { return storeToken(mSTAR_ASSIGN); } - case 209: break; - case 55: + case 213: break; + case 56: { return storeToken(mSH_COMMENT); } - case 210: break; - case 56: + case 214: break; + case 57: { return storeToken(mNOT_EQUAL); } - case 211: break; - case 57: + case 215: break; + case 58: { return storeToken(mNUM_BIG_INT); } - case 212: break; - case 58: + case 216: break; + case 59: { return storeToken(mNUM_FLOAT); } - case 213: break; - case 59: + case 217: break; + case 60: { return storeToken(mNUM_LONG); } - case 214: break; - case 60: + case 218: break; + case 61: { return storeToken(mNUM_DOUBLE); } - case 215: break; - case 61: + case 219: break; + case 62: { return storeToken(kIF); } - case 216: break; - case 62: + case 220: break; + case 63: { return storeToken(kIN); } - case 217: break; - case 63: + case 221: break; + case 64: { return storeToken(kDO); } - case 218: break; - case 64: + case 222: break; + case 65: { return storeToken(mINC); } - case 219: break; - case 65: + case 223: break; + case 66: { return storeToken(mPLUS_ASSIGN); } - case 220: break; - case 66: + case 224: break; + case 67: { return storeToken(mDEC); } - case 221: break; - case 67: + case 225: break; + case 68: { return storeToken(mMINUS_ASSIGN); } - case 222: break; - case 68: + case 226: break; + case 69: { return storeToken(mCLOSABLE_BLOCK_OP); } - case 223: break; - case 69: + case 227: break; + case 70: { return storeToken(mRANGE_INCLUSIVE); } - case 224: break; - case 70: + case 228: break; + case 71: { return storeToken(mMEMBER_POINTER); } - case 225: break; - case 71: - { if (isRegexExpected()) { - yybeginstate(IN_DOLLAR_SLASH_STRING); - return storeToken(mDOLLAR_SLASH_REGEX_BEGIN); - } else { - yypushback(1); - return storeToken(mDOLLAR); - } - } - case 226: break; - case 72: - { return storeToken(mGSTRING_LITERAL); - } - case 227: break; - case 73: - { return storeToken(kAS); - } - case 228: break; - case 74: - { return storeToken(mOPTIONAL_DOT); - } case 229: break; - case 75: - { return storeToken(mELVIS); + case 72: + { yybeginstate(IN_DOLLAR_SLASH_STRING); + return storeToken(mDOLLAR_SLASH_REGEX_BEGIN); } case 230: break; - case 76: - { return storeToken(mEQUAL); + case 73: + { return storeToken(mGSTRING_LITERAL); } case 231: break; - case 77: - { return storeToken(mREGEX_FIND); + case 74: + { return storeToken(kAS); } case 232: break; - case 78: - { return storeToken(mLE); + case 75: + { return storeToken(mEQUAL); } case 233: break; - case 79: - { return storeToken(mGE); + case 76: + { return storeToken(mREGEX_FIND); } case 234: break; - case 80: - { return storeToken(mMOD_ASSIGN); + case 77: + { return storeToken(mOPTIONAL_DOT); } case 235: break; - case 81: - { return storeToken(mBXOR_ASSIGN); + case 78: + { return storeToken(mELVIS); } case 236: break; - case 82: - { return storeToken(mBOR_ASSIGN); + case 79: + { return storeToken(mLE); } case 237: break; - case 83: - { return storeToken(mLOR); + case 80: + { return storeToken(mGE); } case 238: break; - case 84: - { return storeToken(mBAND_ASSIGN); + case 81: + { return storeToken(mMOD_ASSIGN); } case 239: break; - case 85: - { return storeToken(mLAND); + case 82: + { return storeToken(mBXOR_ASSIGN); } case 240: break; + case 83: + { return storeToken(mBOR_ASSIGN); + } + case 241: break; + case 84: + { return storeToken(mLOR); + } + case 242: break; + case 85: + { return storeToken(mBAND_ASSIGN); + } + case 243: break; case 86: + { return storeToken(mLAND); + } + case 244: break; + case 87: + // lookahead expression with fixed base length + zzMarkedPos = Character.offsetByCodePoints + (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); + { yyendstate(DIVISION_EXPECTED); + return storeToken(mDIV); + } + case 245: break; + case 88: + { yypushback(1); + yyendstate(DIVISION_EXPECTED); + return storeToken(mDOLLAR); + } + case 246: break; + case 89: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); { return storeToken(mREGEX_CONTENT); } - case 241: break; - case 87: + case 247: break; + case 90: { yyendstate(IN_DOLLAR_SLASH_STRING); return storeToken(mDOLLAR_SLASH_REGEX_END); } - case 242: break; - case 88: + case 248: break; + case 91: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); { return storeToken(mDOLLAR_SLASH_REGEX_CONTENT); } - case 243: break; - case 89: + case 249: break; + case 92: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); { yybeginstate(IN_GSTRING_DOT_IDENT); return storeToken(mDOT); } - case 244: break; - case 90: + case 250: break; + case 93: { return mSL_COMMENT; } - case 245: break; - case 91: + case 251: break; + case 94: { return mML_COMMENT; } - case 246: break; - case 92: + case 252: break; + case 95: { return storeToken(GROOVY_DOC_COMMENT); } - case 247: break; - case 93: + case 253: break; + case 96: { return storeToken(mSTAR_STAR_ASSIGN); } - case 248: break; - case 94: + case 254: break; + case 97: { return storeToken(mNUM_BIG_DECIMAL); } - case 249: break; - case 95: + case 255: break; + case 98: { return storeToken(kFOR); } - case 250: break; - case 96: + case 256: break; + case 99: { return storeToken(kINT); } - case 251: break; - case 97: + case 257: break; + case 100: { return storeToken(kDEF); } - case 252: break; - case 98: + case 258: break; + case 101: { return storeToken(mTRIPLE_DOT); } - case 253: break; - case 99: + case 259: break; + case 102: { return storeToken(mRANGE_EXCLUSIVE); } - case 254: break; - case 100: + case 260: break; + case 103: { yybeginstate(IN_TRIPLE_GSTRING); return storeToken(mGSTRING_BEGIN); } - case 255: break; - case 101: + case 261: break; + case 104: { return storeToken(kTRY); } - case 256: break; - case 102: + case 262: break; + case 105: { return storeToken(kNEW); } - case 257: break; - case 103: + case 263: break; + case 106: { return storeToken(mREGEX_MATCH); } - case 258: break; - case 104: + case 264: break; + case 107: { return storeToken(mCOMPARE_TO); } - case 259: break; - case 105: + case 265: break; + case 108: { return storeToken(mSL_ASSIGN); } - case 260: break; - case 106: + case 266: break; + case 109: { return storeToken(mSR_ASSIGN); } - case 261: break; - case 107: + case 267: break; + case 110: { yyendstate(IN_TRIPLE_GSTRING); return storeToken(mGSTRING_END); } - case 262: break; - case 108: + case 268: break; + case 111: { return GROOVY_DOC_COMMENT; } - case 263: break; - case 109: + case 269: break; + case 112: { return storeToken(kLONG); } - case 264: break; - case 110: + case 270: break; + case 113: { return storeToken(kELSE); } - case 265: break; - case 111: + case 271: break; + case 114: { return storeToken(kENUM); } - case 266: break; - case 112: + case 272: break; + case 115: { return storeToken(kBYTE); } - case 267: break; - case 113: + case 273: break; + case 116: { return storeToken(kCASE); } - case 268: break; - case 114: + case 274: break; + case 117: { return storeToken(kCHAR); } - case 269: break; - case 115: + case 275: break; + case 118: { return storeToken(kTRUE); } - case 270: break; - case 116: + case 276: break; + case 119: { return storeToken(kTHIS); } - case 271: break; - case 117: + case 277: break; + case 120: { return storeToken(kNULL); } - case 272: break; - case 118: + case 278: break; + case 121: { return storeToken(kVOID); } - case 273: break; - case 119: + case 279: break; + case 122: { return storeToken(mBSR_ASSIGN); } - case 274: break; - case 120: + case 280: break; + case 123: { return storeToken(kFLOAT); } - case 275: break; - case 121: + case 281: break; + case 124: { return storeToken(kFINAL); } - case 276: break; - case 122: + case 282: break; + case 125: { return storeToken(kFALSE); } - case 277: break; - case 123: + case 283: break; + case 126: { return storeToken(kBREAK); } - case 278: break; - case 124: + case 284: break; + case 127: { return storeToken(kCLASS); } - case 279: break; - case 125: + case 285: break; + case 128: { return storeToken(kCATCH); } - case 280: break; - case 126: + case 286: break; + case 129: { return storeToken(kSUPER); } - case 281: break; - case 127: + case 287: break; + case 130: { return storeToken(kSHORT); } - case 282: break; - case 128: + case 288: break; + case 131: { return storeToken(kTRAIT); } - case 283: break; - case 129: + case 289: break; + case 132: { return storeToken(kTHROW); } - case 284: break; - case 130: + case 290: break; + case 133: { return storeToken(kWHILE); } - case 285: break; - case 131: + case 291: break; + case 134: { return storeToken(kIMPORT); } - case 286: break; - case 132: + case 292: break; + case 135: { return storeToken(kDOUBLE); } - case 287: break; - case 133: + case 293: break; + case 136: { return storeToken(kPUBLIC); } - case 288: break; - case 134: + case 294: break; + case 137: { return storeToken(kASSERT); } - case 289: break; - case 135: + case 295: break; + case 138: { return storeToken(kSTATIC); } - case 290: break; - case 136: + case 296: break; + case 139: { return storeToken(kSWITCH); } - case 291: break; - case 137: + case 297: break; + case 140: { return storeToken(kTHROWS); } - case 292: break; - case 138: + case 298: break; + case 141: { return storeToken(kRETURN); } - case 293: break; - case 139: + case 299: break; + case 142: { return storeToken(kNATIVE); } - case 294: break; - case 140: + case 300: break; + case 143: { return storeToken(kFINALLY); } - case 295: break; - case 141: + case 301: break; + case 144: { return storeToken(kDEFAULT); } - case 296: break; - case 142: + case 302: break; + case 145: { return storeToken(kEXTENDS); } - case 297: break; - case 143: + case 303: break; + case 146: { return storeToken(kBOOLEAN); } - case 298: break; - case 144: + case 304: break; + case 147: { return storeToken(kPACKAGE); } - case 299: break; - case 145: + case 305: break; + case 148: { return storeToken(kPRIVATE); } - case 300: break; - case 146: + case 306: break; + case 149: { return storeToken(kABSTRACT); } - case 301: break; - case 147: + case 307: break; + case 150: { return storeToken(kCONTINUE); } - case 302: break; - case 148: + case 308: break; + case 151: { return storeToken(kSTRICTFP); } - case 303: break; - case 149: + case 309: break; + case 152: { return storeToken(kVOLATILE); } - case 304: break; - case 150: + case 310: break; + case 153: { return storeToken(kINTERFACE); } - case 305: break; - case 151: + case 311: break; + case 154: { return storeToken(kPROTECTED); } - case 306: break; - case 152: + case 312: break; + case 155: { return storeToken(kTRANSIENT); } - case 307: break; - case 153: + case 313: break; + case 156: { return storeToken(kIMPLEMENTS); } - case 308: break; - case 154: + case 314: break; + case 157: { return storeToken(kINSTANCEOF); } - case 309: break; - case 155: + case 315: break; + case 158: { return storeToken(kSYNCHRONIZED); } - case 310: break; + case 316: break; default: zzScanError(ZZ_NO_MATCH); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexerBase.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexerBase.java index 1e62fda0437e..5524e152982a 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexerBase.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyLexerBase.java @@ -20,6 +20,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.util.containers.Stack; +import static com.intellij.util.ArrayUtil.indexOf; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.KEYWORDS; import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.LEFT_BRACES; @@ -38,7 +39,6 @@ public abstract class GroovyLexerBase implements FlexLexer { public final Stack stateStack = new Stack<>(); private final Stack bracesStack = new Stack<>(); - private IElementType lastToken = null; protected void yybeginstate(int... states) { for (int state : states) { @@ -60,7 +60,6 @@ public abstract class GroovyLexerBase implements FlexLexer { protected void resetState() { stateStack.clear(); bracesStack.clear(); - lastToken = null; } protected IElementType storeToken(IElementType tokenType) { @@ -81,17 +80,19 @@ public abstract class GroovyLexerBase implements FlexLexer { bracesStack.pop(); } } - lastToken = tokenType; + if (indexOf(getDivisionStates(), yystate()) != -1 && DIVISION_IS_EXPECTED_AFTER.contains(tokenType)) { + yybeginstate(getDivisionExpectedState()); + } return tokenType; } - protected boolean isRegexExpected() { - return !DIVISION_IS_EXPECTED_AFTER.contains(lastToken); - } - protected boolean isWithinBraces() { return !bracesStack.empty() && bracesStack.peek() != mLCURLY; } protected abstract int getInitialState(); + + protected abstract int[] getDivisionStates(); + + protected abstract int getDivisionExpectedState(); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex index 2716b02c736b..26e5de54d281 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/lexer/groovy.flex @@ -34,13 +34,26 @@ import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; %type IElementType %{ + @Override protected int getInitialState() { return YYINITIAL; } + + @Override + protected int getDivisionExpectedState() { + return DIVISION_EXPECTED; + } + + @Override + protected int[] getDivisionStates() { + return new int[] {YYINITIAL, IN_INNER_BLOCK}; + } %} %state IN_INNER_BLOCK +%xstate DIVISION_EXPECTED + %xstate IN_SINGLE_GSTRING %xstate IN_TRIPLE_GSTRING %xstate IN_SLASHY_STRING @@ -407,22 +420,32 @@ mGSTRING_LITERAL = {mDOUBLE_QUOTED_LITERAL} | {mTRIPLE_DOUBLE_QUOTED_LITERAL} ///////////////////////// Reserved shorthands ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + { + {WHITE_SPACE} { + return TokenType.WHITE_SPACE; + } + "/"/[^/*=] { + yyendstate(DIVISION_EXPECTED); + return storeToken(mDIV); + } + "$/" { + yypushback(1); + yyendstate(DIVISION_EXPECTED); + return storeToken(mDOLLAR); + } + [^] { + yypushback(1); + yyendstate(DIVISION_EXPECTED); + } +} + "/" { - if (isRegexExpected()) { - yybeginstate(IN_SLASHY_STRING); - return storeToken(mREGEX_BEGIN); - } else { - return storeToken(mDIV); - } + yybeginstate(IN_SLASHY_STRING); + return storeToken(mREGEX_BEGIN); } "$/" { - if (isRegexExpected()) { - yybeginstate(IN_DOLLAR_SLASH_STRING); - return storeToken(mDOLLAR_SLASH_REGEX_BEGIN); - } else { - yypushback(1); - return storeToken(mDOLLAR); - } + yybeginstate(IN_DOLLAR_SLASH_STRING); + return storeToken(mDOLLAR_SLASH_REGEX_BEGIN); } "{" { yybeginstate(YYINITIAL, NLS_AFTER_LBRACE); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/CommentsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/CommentsParsingTest.groovy index ffc3c83465a1..0ce92387ac1d 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/CommentsParsingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/CommentsParsingTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,5 +35,6 @@ class CommentsParsingTest extends GroovyParsingTestCase { void testNls2() throws Throwable { doTest() } void testRocher3() throws Throwable { doTest() } - + + void testAfterIdentifier() throws Throwable { doTest() } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy index e7cd4fb70d8d..02d33e4a5be7 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy @@ -50,6 +50,8 @@ class ExpressionsParsingTest extends GroovyParsingTestCase { void testarithmetic$mul3() throws Throwable { doTest() } + void testarithmetic$mul4() throws Throwable { doTest() } + void testarithmetic$post1() throws Throwable { doTest() } void testarithmetic$sh1() throws Throwable { doTest() } @@ -408,6 +410,8 @@ class ExpressionsParsingTest extends GroovyParsingTestCase { void testregex$dollarSlashyUltimate() { doTest() } + void testregex$afterNewLine() { doTest() } + void testrelational$eq1() throws Throwable { doTest() } void testrelational$inst0() throws Throwable { doTest() } diff --git a/plugins/groovy/testdata/parsing/groovy/comments/afterIdentifier.test b/plugins/groovy/testdata/parsing/groovy/comments/afterIdentifier.test new file mode 100644 index 000000000000..6c0314a39e73 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/comments/afterIdentifier.test @@ -0,0 +1,13 @@ +a // +a /* */ +----- +Groovy script + Reference expression + PsiElement(identifier)('a') + PsiWhiteSpace(' ') + PsiComment(line comment)('//') + PsiElement(new line)('\n') + Reference expression + PsiElement(identifier)('a') + PsiWhiteSpace(' ') + PsiComment(block comment)('/* */') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/arithmetic/mul4.test b/plugins/groovy/testdata/parsing/groovy/expressions/arithmetic/mul4.test new file mode 100644 index 000000000000..233ee4978c2b --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/arithmetic/mul4.test @@ -0,0 +1,11 @@ +a /= b +----- +Groovy script + Assignment expression + Reference expression + PsiElement(identifier)('a') + PsiWhiteSpace(' ') + PsiElement(/=)('/=') + PsiWhiteSpace(' ') + Reference expression + PsiElement(identifier)('b') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/regex/afterNewLine.test b/plugins/groovy/testdata/parsing/groovy/expressions/regex/afterNewLine.test new file mode 100644 index 000000000000..66b4fbe5d62b --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/regex/afterNewLine.test @@ -0,0 +1,12 @@ +a +/foo/ +----- +Groovy script + Reference expression + PsiElement(identifier)('a') + PsiElement(new line)('\n') + Literal + GroovyASTPsiElementImpl(regex literal) + PsiElement(regex begin)('/') + PsiElement(regex content)('foo') + PsiElement(regex end)('/') \ No newline at end of file From 79bbbbf8ffa17accfcc73ab658f04ae7757eab65 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Thu, 30 Mar 2017 18:17:34 +0300 Subject: [PATCH 13/14] Java: Quick fix for merging duplicate statements in module-info (IDEA-169211) --- .../impl/analysis/ModuleHighlightUtil.java | 1 + .../quickfix/MergeModuleStatementsFix.java | 103 ++++++++++++++ ...ergePackageAccessibilityStatementsFix.java | 128 ++++++++++++++++++ .../quickfix/MergeProvidesStatementsFix.java | 112 +++++++++++++++ .../mergeModuleStatementsFix/Exports1.java | 4 + .../Exports1_after.java | 3 + .../mergeModuleStatementsFix/Exports2.java | 5 + .../Exports2_after.java | 4 + .../mergeModuleStatementsFix/Opens1.java | 4 + .../Opens1_after.java | 3 + .../mergeModuleStatementsFix/Opens2.java | 5 + .../Opens2_after.java | 4 + .../mergeModuleStatementsFix/Provides1.java | 4 + .../Provides1_after.java | 3 + .../mergeModuleStatementsFix/Provides2.java | 8 ++ .../Provides2_after.java | 7 + .../mergeModuleStatementsFix/Provides3.java | 8 ++ .../Provides3_after.java | 7 + .../quickFix/MergeModuleStatementsFixTest.kt | 72 ++++++++++ .../src/messages/QuickFixBundle.properties | 3 + 20 files changed, 488 insertions(+) create mode 100644 java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java create mode 100644 java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java create mode 100644 java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1_after.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2_after.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1_after.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2_after.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1_after.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2_after.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3_after.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/MergeModuleStatementsFixTest.kt diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java index 85badb241cb9..26ff9d8148ce 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java @@ -197,6 +197,7 @@ public class ModuleHighlightUtil { String message = JavaErrorMessages.message(key, refText); HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); QuickFixAction.registerQuickFixAction(info, factory().createDeleteFix(statement)); + QuickFixAction.registerQuickFixAction(info, MergeModuleStatementsFix.createFix(statement)); results.add(info); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java new file mode 100644 index 000000000000..aab24b6ded6d --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java @@ -0,0 +1,103 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed 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 com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.util.PsiUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Iterator; +import java.util.List; +import java.util.StringJoiner; + +/** + * @author Pavel.Dolgov + */ +public abstract class MergeModuleStatementsFix extends LocalQuickFixAndIntentionActionOnPsiElement { + protected final SmartPsiElementPointer myOtherStatement; + + protected MergeModuleStatementsFix(@NotNull T thisStatement, @NotNull T otherStatement) { + super(thisStatement); + final PsiFile file = otherStatement.getContainingFile(); + myOtherStatement = SmartPointerManager.getInstance(otherStatement.getProject()).createSmartPsiElementPointer(otherStatement, file); + } + + @Override + public boolean isAvailable(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + final T otherStatement = myOtherStatement.getElement(); + return otherStatement != null && otherStatement.isValid() && PsiUtil.isLanguageLevel9OrHigher(file); + } + + @Override + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @Nullable Editor editor, + @NotNull PsiElement thisStatement, + @NotNull PsiElement endElement) { + final T otherStatement = myOtherStatement.getElement(); + + if (otherStatement != null) { + final PsiElement parent = otherStatement.getParent(); + if (parent instanceof PsiJavaModule) { + final String moduleName = ((PsiJavaModule)parent).getName(); + final String moduleText = PsiKeyword.MODULE + " " + moduleName + " {" + getReplacementText(otherStatement) + "}"; + final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); + final PsiJavaModule tempModule = factory.createModuleFromText(moduleText); + + final Iterator statementIterator = getStatements(tempModule).iterator(); + LOG.assertTrue(statementIterator.hasNext()); + final T replacement = statementIterator.next(); + + final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); + codeStyleManager.reformat(otherStatement.replace(replacement)); + thisStatement.delete(); + } + } + } + + @NotNull + protected abstract String getReplacementText(@NotNull T otherStatement); + + @NotNull + protected abstract Iterable getStatements(@NotNull PsiJavaModule javaModule); + + @NotNull + protected static String joinNames(@NotNull List oldNames, @NotNull List newNames) { + final StringJoiner joiner = new StringJoiner(","); + oldNames.forEach(joiner::add); + newNames.stream().filter(name -> !oldNames.contains(name)).forEach(joiner::add); + return joiner.toString(); + } + + @Nullable + public static MergeModuleStatementsFix createFix(@Nullable PsiElement statement) { + if (statement instanceof PsiPackageAccessibilityStatement) { + return MergePackageAccessibilityStatementsFix.createFix((PsiPackageAccessibilityStatement)statement); + } + else if (statement instanceof PsiProvidesStatement) { + return MergeProvidesStatementsFix.createFix((PsiProvidesStatement)statement); + } + return null; + } +} diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java new file mode 100644 index 000000000000..0f771dce97b2 --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java @@ -0,0 +1,128 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed 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 com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiJavaModule; +import com.intellij.psi.PsiKeyword; +import com.intellij.psi.PsiPackageAccessibilityStatement; +import com.intellij.psi.PsiPackageAccessibilityStatement.Role; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * @author Pavel.Dolgov + */ +public class MergePackageAccessibilityStatementsFix + extends MergeModuleStatementsFix { + + private static final Logger LOG = Logger.getInstance(MergePackageAccessibilityStatementsFix.class); + private final String myPackageName; + private final List myModuleNames; + private final Role myRole; + + protected MergePackageAccessibilityStatementsFix(@NotNull PsiPackageAccessibilityStatement thisStatement, + @NotNull String packageName, + @NotNull List moduleNames, + @NotNull PsiPackageAccessibilityStatement otherStatement) { + super(thisStatement, otherStatement); + myPackageName = packageName; + myModuleNames = moduleNames; + myRole = thisStatement.getRole(); + } + + @Nls + @NotNull + @Override + public String getText() { + return QuickFixBundle.message("java.9.merge.module.statements.fix.name", getKeyword(), myPackageName); + } + + @Nls + @NotNull + @Override + public String getFamilyName() { + return QuickFixBundle.message("java.9.merge.module.statements.fix.family.name", getKeyword()); + } + + @NotNull + @Override + protected String getReplacementText(@NotNull PsiPackageAccessibilityStatement otherStatement) { + return getKeyword() + " " + myPackageName + " " + PsiKeyword.TO + " " + + joinNames(otherStatement.getModuleNames(), myModuleNames) + ";"; + } + + @NotNull + @Override + protected Iterable getStatements(@NotNull PsiJavaModule javaModule) { + return getStatements(javaModule, myRole); + } + + @Nullable + public static MergeModuleStatementsFix createFix(@Nullable PsiPackageAccessibilityStatement statement) { + if (statement != null) { + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiJavaModule) { + final PsiJavaModule javaModule = (PsiJavaModule)parent; + + final String packageName = statement.getPackageName(); + if (packageName != null) { + final List moduleNames = statement.getModuleNames(); + if (!moduleNames.isEmpty()) { + for (PsiPackageAccessibilityStatement candidate : getStatements(javaModule, statement.getRole())) { + if (candidate != statement && + packageName.equals(candidate.getPackageName()) && + candidate.getModuleNames().iterator().hasNext()) { + return new MergePackageAccessibilityStatementsFix(statement, packageName, moduleNames, candidate); + } + } + } + } + } + } + return null; + } + + @NotNull + private static Iterable getStatements(@NotNull PsiJavaModule javaModule, @NotNull Role role) { + switch (role) { + case OPENS: + return javaModule.getOpens(); + case EXPORTS: + return javaModule.getExports(); + } + LOG.error("Unexpected role " + role); + return Collections.emptyList(); + } + + @NotNull + private String getKeyword() { + switch (myRole) { + case OPENS: + return PsiKeyword.OPENS; + case EXPORTS: + return PsiKeyword.EXPORTS; + } + LOG.error("Unexpected role " + myRole); + return ""; + } +} diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java new file mode 100644 index 000000000000..d5ef41fbde47 --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java @@ -0,0 +1,112 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed 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 com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.psi.*; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author Pavel.Dolgov + */ +public class MergeProvidesStatementsFix extends MergeModuleStatementsFix { + private final String myInterfaceName; + private final List myImplementationNames; + + MergeProvidesStatementsFix(@NotNull PsiProvidesStatement thisStatement, + @NotNull String interfaceName, + @NotNull List implementationNames, + @NotNull PsiProvidesStatement otherStatement) { + super(thisStatement, otherStatement); + myInterfaceName = interfaceName; + myImplementationNames = implementationNames; + } + + @NotNull + @Override + public String getText() { + return QuickFixBundle.message("java.9.merge.module.statements.fix.name", PsiKeyword.PROVIDES, myInterfaceName); + } + + @Nls + @NotNull + @Override + public String getFamilyName() { + return QuickFixBundle.message("java.9.merge.module.statements.fix.family.name", PsiKeyword.PROVIDES); + } + + @NotNull + @Override + protected String getReplacementText(@NotNull PsiProvidesStatement otherStatement) { + return PsiKeyword.PROVIDES + " " + myInterfaceName + " " + PsiKeyword.WITH + " " + + joinNames(getImplementationNames(otherStatement), myImplementationNames) + ";"; + } + + @NotNull + @Override + protected Iterable getStatements(@NotNull PsiJavaModule javaModule) { + return javaModule.getProvides(); + } + + @NotNull + private static List getImplementationNames(@Nullable PsiProvidesStatement statement) { + if (statement != null) { + final PsiReferenceList implementationList = statement.getImplementationList(); + if (implementationList != null) { + return Arrays.stream(implementationList.getReferenceElements()) + .map(PsiJavaCodeReferenceElement::getQualifiedName) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + } + return Collections.emptyList(); + } + + @Nullable + public static MergeModuleStatementsFix createFix(@Nullable PsiProvidesStatement statement) { + if (statement != null) { + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiJavaModule) { + final PsiJavaModule javaModule = (PsiJavaModule)parent; + + final PsiJavaCodeReferenceElement interfaceReference = statement.getInterfaceReference(); + if (interfaceReference != null) { + final String interfaceName = interfaceReference.getQualifiedName(); + if (interfaceName != null) { + final List implementationNames = getImplementationNames(statement); + if (!implementationNames.isEmpty()) { + for (PsiProvidesStatement candidate : javaModule.getProvides()) { + final PsiJavaCodeReferenceElement candidateInterfaceReference = candidate.getInterfaceReference(); + if (candidateInterfaceReference != null && interfaceName.equals(candidateInterfaceReference.getQualifiedName())) { + return new MergeProvidesStatementsFix(statement, interfaceName, implementationNames, candidate); + } + } + } + } + } + } + } + return null; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1.java new file mode 100644 index 000000000000..f6177533a7db --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1.java @@ -0,0 +1,4 @@ +module M { + exports my.api to M4; + exports my.api to M6; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1_after.java new file mode 100644 index 000000000000..7429e15dd796 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports1_after.java @@ -0,0 +1,3 @@ +module M { + exports my.api to M4, M6; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2.java new file mode 100644 index 000000000000..fe9b8f588763 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2.java @@ -0,0 +1,5 @@ +module M { + exports my.api; + exports my.api to M2, M4; + exports my.api to M6; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2_after.java new file mode 100644 index 000000000000..a773247df415 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Exports2_after.java @@ -0,0 +1,4 @@ +module M { + exports my.api; + exports my.api to M6, M2, M4; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1.java new file mode 100644 index 000000000000..748f667a110d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1.java @@ -0,0 +1,4 @@ +module M { + opens my.api to M4; + opens my.api to M6; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1_after.java new file mode 100644 index 000000000000..d0ebef07939e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens1_after.java @@ -0,0 +1,3 @@ +module M { + opens my.api to M4, M6; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2.java new file mode 100644 index 000000000000..8ef463a4e2ee --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2.java @@ -0,0 +1,5 @@ +module M { + opens my.api; + opens my.api to M2, M4; + opens my.api to M6; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2_after.java new file mode 100644 index 000000000000..321668b41336 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Opens2_after.java @@ -0,0 +1,4 @@ +module M { + opens my.api; + opens my.api to M6, M2, M4; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1.java new file mode 100644 index 000000000000..85f06ee632b0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1.java @@ -0,0 +1,4 @@ +module M { + provides my.api.MyService with my.impl.MyServiceImpl; + provides my.api.MyService with my.impl.MyServiceImpl1; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1_after.java new file mode 100644 index 000000000000..910b1b3a4d33 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides1_after.java @@ -0,0 +1,3 @@ +module M { + provides my.api.MyService with my.impl.MyServiceImpl,my.impl.MyServiceImpl1; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2.java new file mode 100644 index 000000000000..1f239ec09995 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2.java @@ -0,0 +1,8 @@ +import my.impl.MyServiceImpl; +import my.impl.MyServiceImpl1; +import my.impl.MyServiceImpl2; + +module M { + provides my.api.MyService with MyServiceImpl, MyServiceImpl2; + provides my.api.MyService with MyServiceImpl1; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2_after.java new file mode 100644 index 000000000000..939d69b108c2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides2_after.java @@ -0,0 +1,7 @@ +import my.impl.MyServiceImpl; +import my.impl.MyServiceImpl1; +import my.impl.MyServiceImpl2; + +module M { + provides my.api.MyService with MyServiceImpl,MyServiceImpl2,MyServiceImpl1; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3.java new file mode 100644 index 000000000000..2ee7ea1d1383 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3.java @@ -0,0 +1,8 @@ +import my.impl.MyServiceImpl; +import my.impl.MyServiceImpl1; +import my.impl.MyServiceImpl2; + +module M { + provides my.api.MyService with MyServiceImpl; + provides my.api.MyService with MyServiceImpl1, MyServiceImpl2; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3_after.java new file mode 100644 index 000000000000..f7ad4557f838 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix/Provides3_after.java @@ -0,0 +1,7 @@ +import my.impl.MyServiceImpl; +import my.impl.MyServiceImpl1; +import my.impl.MyServiceImpl2; + +module M { + provides my.api.MyService with MyServiceImpl,MyServiceImpl1,MyServiceImpl2; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/MergeModuleStatementsFixTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/MergeModuleStatementsFixTest.kt new file mode 100644 index 000000000000..6bc714d33279 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/MergeModuleStatementsFixTest.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed 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 com.intellij.codeInsight.daemon.quickFix + +import com.intellij.JavaTestUtil.getRelativeJavaTestDataPath +import com.intellij.codeInsight.daemon.QuickFixBundle +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.testFramework.fixtures.LightJava9ModulesCodeInsightFixtureTestCase +import com.intellij.testFramework.fixtures.MultiModuleJava9ProjectDescriptor.ModuleDescriptor.* + +/** + * @author Pavel.Dolgov + */ +class MergeModuleStatementsFixTest : LightJava9ModulesCodeInsightFixtureTestCase() { + + override fun getBasePath() = getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/quickFix/mergeModuleStatementsFix" + + fun testExports1() = doTest("exports", "my.api") + fun testExports2() = doTest("exports", "my.api") + + fun testProvides1() = doTest("provides", "my.api.MyService") + fun testProvides2() = doTest("provides", "my.api.MyService") + fun testProvides3() = doTest("provides", "my.api.MyService") + + fun testOpens1() = doTest("opens", "my.api") + fun testOpens2() = doTest("opens", "my.api") + + + override fun setUp() { + super.setUp() + addFile("module-info.java", "module M2 { }", M2) + addFile("module-info.java", "module M4 { }", M4) + addFile("module-info.java", "module M6 { }", M6) + + addFile("my/api/MyService.java", "package my.api; public class MyService {}") + addFile("my/impl/MyServiceImpl.java", "package my.impl; public class MyServiceImpl extends my.api.MyService {}") + addFile("my/impl/MyServiceImpl1.java", "package my.impl; public class MyServiceImpl1 extends my.api.MyService {}") + addFile("my/impl/MyServiceImpl2.java", "package my.impl; public class MyServiceImpl2 extends my.api.MyService {}") + } + + private fun doTest(type: String, name: String) { + val testName = getTestName(false) + val virtualFile = myFixture.copyFileToProject("${testName}.java", "module-info.java") + myFixture.configureFromExistingVirtualFile(virtualFile) + + val action = findActionWithText(QuickFixBundle.message("java.9.merge.module.statements.fix.name", type, name)) + myFixture.launchAction(action) + myFixture.checkResultByFile("${testName}_after.java") + } + + private fun findActionWithText(actionText: String): IntentionAction { + myFixture.doHighlighting() + + val actions = LightQuickFixTestCase.getAvailableActions(editor, file) + val action = LightQuickFixTestCase.findActionWithText(actions, actionText) + assertNotNull("No action [$actionText] in ${actions.map { it.text }}", action) + return action + } +} \ No newline at end of file diff --git a/resources-en/src/messages/QuickFixBundle.properties b/resources-en/src/messages/QuickFixBundle.properties index b99e387599a3..98b940ec633c 100644 --- a/resources-en/src/messages/QuickFixBundle.properties +++ b/resources-en/src/messages/QuickFixBundle.properties @@ -310,3 +310,6 @@ insert.sam.method.call.fix.family.name=Insert single abstract method call wrap.with.java.io.file.text=Wrap using 'new File()' wrap.with.java.io.file.parameter.single.text=Wrap parameter using 'new File()' wrap.with.java.io.file.parameter.multiple.text=Wrap {0, choice, 1#1st|2#2nd|3#3rd|4#{0,number}th} parameter using ''new File()'' + +java.9.merge.module.statements.fix.family.name=Merge with other ''{0}'' statement +java.9.merge.module.statements.fix.name=Merge with other ''{0} {1}'' statement \ No newline at end of file From 9003bab81d8f4d76f5d8b855212d8be5a53115d0 Mon Sep 17 00:00:00 2001 From: "vadim.lomshakov" Date: Fri, 31 Mar 2017 16:14:48 +0300 Subject: [PATCH 14/14] [rider]: allow to inherit AbstractPopup for now (IDEA-CR-19701) --- .../src/com/intellij/ui/popup/AbstractPopup.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index a2c7ae5efc61..3932fd6638b9 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -188,9 +188,9 @@ public class AbstractPopup implements JBPopup { } } - AbstractPopup() { } + protected AbstractPopup() { } - AbstractPopup init(Project project, + protected AbstractPopup init(Project project, @NotNull JComponent component, @Nullable JComponent preferredFocusedComponent, boolean requestFocus,