From c5348aaa289a0c126c70e3a232c7c6003fcec250 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Wed, 21 Nov 2012 20:53:41 +0100 Subject: [PATCH 001/169] support JLS8 --- org.eclipse.jdt.astview/META-INF/MANIFEST.MF | 8 ++-- .../eclipse/jdt/astview/views/ASTView.java | 43 +++++++++++++------ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/org.eclipse.jdt.astview/META-INF/MANIFEST.MF b/org.eclipse.jdt.astview/META-INF/MANIFEST.MF index c7f9b6a700..a7b7cab165 100644 --- a/org.eclipse.jdt.astview/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.astview/META-INF/MANIFEST.MF @@ -2,16 +2,16 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.astview; singleton:=true -Bundle-Version: 1.1.8.qualifier -Eclipse-SourceReferences: scm:git:git://git.eclipse.org/gitroot/jdt/eclipse.jdt.ui.git;path="org.eclipse.jdt.astview";tag=R1_1_8 +Bundle-Version: 1.1.9.qualifier +Eclipse-SourceReferences: scm:git:git://git.eclipse.org/gitroot/jdt/eclipse.jdt.ui.git;path="org.eclipse.jdt.astview";tag=R1_1_9 Bundle-Activator: org.eclipse.jdt.astview.ASTViewPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: org.eclipse.jdt.astview;x-internal:=true, org.eclipse.jdt.astview.views;x-internal:=true Require-Bundle: org.eclipse.core.runtime, - org.eclipse.jdt.core;bundle-version="[3.7.1,4.0.0)", - org.eclipse.jdt.ui;bundle-version="[3.7.1,4.0.0)", + org.eclipse.jdt.core;bundle-version="[3.9.0,4.0.0)", + org.eclipse.jdt.ui;bundle-version="[3.9.0,4.0.0)", org.eclipse.ui.ide, org.eclipse.ui.views, org.eclipse.jface.text, diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java index 8a141c08a3..c4bcd99035 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -74,6 +78,7 @@ import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchCommandConstants; @@ -84,6 +89,7 @@ import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.DrillDownAdapter; import org.eclipse.ui.part.IShowInSource; +import org.eclipse.ui.part.IShowInTarget; import org.eclipse.ui.part.ShowInContext; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.ITextEditor; @@ -114,18 +120,22 @@ import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.SharedASTProvider; -import org.eclipse.jdt.ui.actions.ShowInPackageViewAction; public class ASTView extends ViewPart implements IShowInSource { + private static final int JLS8= AST.JLS8; + + /** + * @deprecated to get rid of deprecation warnings in code + */ private static final int JLS4= AST.JLS4; - /** (Used to get rid of deprecation warnings in code) - * @deprecated + /** + * @deprecated to get rid of deprecation warnings in code */ private static final int JLS3= AST.JLS3; - /** (Used to get rid of deprecation warnings in code) - * @deprecated + /** + * @deprecated to get rid of deprecation warnings in code */ private static final int JLS2= AST.JLS2; @@ -458,13 +468,14 @@ public ASTView() { fStatementsRecovery= !fDialogSettings.getBoolean(SETTINGS_NO_STATEMENTS_RECOVERY); // inverse so that default is use recovery fBindingsRecovery= !fDialogSettings.getBoolean(SETTINGS_NO_BINDINGS_RECOVERY); // inverse so that default is use recovery fIgnoreMethodBodies= fDialogSettings.getBoolean(SETTINGS_IGNORE_METHOD_BODIES); - fCurrentASTLevel= JLS4; + fCurrentASTLevel= JLS8; try { int level= fDialogSettings.getInt(SETTINGS_JLS); switch (level) { case JLS2: case JLS3: case JLS4: + case JLS8: fCurrentASTLevel= level; } } catch (NumberFormatException e) { @@ -1043,9 +1054,10 @@ public void run() { ASTViewImages.setImageDescriptors(fLinkWithEditor, ASTViewImages.LINK_WITH_EDITOR); fASTVersionToggleActions= new ASTLevelToggle[] { - new ASTLevelToggle("AST Level &2.0", JLS2), //$NON-NLS-1$ - new ASTLevelToggle("AST Level &3.0", JLS3), //$NON-NLS-1$ - new ASTLevelToggle("AST Level &4.0", JLS4), //$NON-NLS-1$ + new ASTLevelToggle("AST Level &2 (1.2)", JLS2), //$NON-NLS-1$ + new ASTLevelToggle("AST Level &3 (1.5)", JLS3), //$NON-NLS-1$ + new ASTLevelToggle("AST Level &4 (1.7)", JLS4), //$NON-NLS-1$ + new ASTLevelToggle("AST Level &8 (1.8)", JLS8), //$NON-NLS-1$ }; fAddToTrayAction= new Action() { @@ -1466,8 +1478,15 @@ protected void performDoubleClick() { } else if (obj instanceof JavaElement) { IJavaElement javaElement= ((JavaElement) obj).getJavaElement(); if (javaElement instanceof IPackageFragment) { - ShowInPackageViewAction showInPackageViewAction= new ShowInPackageViewAction(getViewSite()); - showInPackageViewAction.run(javaElement); + try { + IViewPart packageExplorer= getSite().getPage().showView(JavaUI.ID_PACKAGES); + if (packageExplorer instanceof IShowInTarget) { + IShowInTarget showInTarget= (IShowInTarget) packageExplorer; + showInTarget.show(getShowInContext()); + } + } catch (PartInitException e) { + showAndLogError("Could not open Package Explorer.", e); //$NON-NLS-1$ + } } else { try { IEditorPart editorPart= JavaUI.openInEditor(javaElement); From d35d2542c55a173048ede7a729328eb249d7dde2 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Mon, 18 Feb 2013 15:16:53 +0100 Subject: [PATCH 002/169] support 1.8 compiler compliance --- .../internal/corext/util/JavaModelUtil.java | 18 +++++++---- .../JavadocSpecificsWizardPage.java | 8 +++-- .../ComplianceConfigurationBlock.java | 30 +++++++++++++++++-- .../ui/preferences/PreferencesMessages.java | 5 ++++ .../PreferencesMessages.properties | 5 ++++ 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java index 6399e3e71d..1cb81ea6ee 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Matt Chapman, mpchapman@gmail.com - 89977 Make JDT .java agnostic @@ -69,7 +73,7 @@ public final class JavaModelUtil { */ public static final String VERSION_LATEST; static { - VERSION_LATEST= JavaCore.VERSION_1_7; // make sure it is not inlined + VERSION_LATEST= JavaCore.VERSION_1_8; // make sure it is not inlined } /** @@ -809,15 +813,15 @@ public static boolean is50OrHigherJRE(IJavaProject project) throws CoreException String compliance= getCompilerCompliance((IVMInstall2) vmInstall, null); if (compliance == null) return true; // assume 1.5 - return compliance.startsWith(JavaCore.VERSION_1_5) - || compliance.startsWith(JavaCore.VERSION_1_6) - || compliance.startsWith(JavaCore.VERSION_1_7); + return is50OrHigher(compliance); } public static String getCompilerCompliance(IVMInstall2 vMInstall, String defaultCompliance) { String version= vMInstall.getJavaVersion(); if (version == null) { return defaultCompliance; + } else if (version.startsWith(JavaCore.VERSION_1_8)) { + return JavaCore.VERSION_1_8; } else if (version.startsWith(JavaCore.VERSION_1_7)) { return JavaCore.VERSION_1_7; } else if (version.startsWith(JavaCore.VERSION_1_6)) { @@ -846,7 +850,9 @@ public static String getExecutionEnvironmentCompliance(IExecutionEnvironment exe // fallback: String desc= executionEnvironment.getId(); - if (desc.indexOf(JavaCore.VERSION_1_7) != -1) { + if (desc.indexOf(JavaCore.VERSION_1_8) != -1) { + return JavaCore.VERSION_1_8; + } else if (desc.indexOf(JavaCore.VERSION_1_7) != -1) { return JavaCore.VERSION_1_7; } else if (desc.indexOf(JavaCore.VERSION_1_6) != -1) { return JavaCore.VERSION_1_6; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javadocexport/JavadocSpecificsWizardPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javadocexport/JavadocSpecificsWizardPage.java index e2345629b2..ae84b8ea09 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javadocexport/JavadocSpecificsWizardPage.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javadocexport/JavadocSpecificsWizardPage.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -144,7 +148,7 @@ private void createExtraOptionsGroup(Composite composite) { fSourceCombo= createCombo(inner, SWT.NONE, fStore.getSource(), createGridData(1)); String[] versions= { "-", //$NON-NLS-1$ - JavaCore.VERSION_1_3, JavaCore.VERSION_1_4, JavaCore.VERSION_1_5, JavaCore.VERSION_1_6, JavaCore.VERSION_1_7 }; + JavaCore.VERSION_1_3, JavaCore.VERSION_1_4, JavaCore.VERSION_1_5, JavaCore.VERSION_1_6, JavaCore.VERSION_1_7, JavaCore.VERSION_1_8 }; fSourceCombo.setItems(versions); fSourceCombo.setText(fStore.getSource()); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java index 4302e5d98b..dc0cec257b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -119,6 +123,7 @@ public class ComplianceConfigurationBlock extends OptionsConfigurationBlock { private static final String VERSION_1_5= JavaCore.VERSION_1_5; private static final String VERSION_1_6= JavaCore.VERSION_1_6; private static final String VERSION_1_7= JavaCore.VERSION_1_7; + private static final String VERSION_1_8= JavaCore.VERSION_1_8; private static final String VERSION_JSR14= "jsr14"; //$NON-NLS-1$ private static final String ERROR= JavaCore.ERROR; @@ -254,13 +259,14 @@ public void enablePreferenceContent(boolean enable) { private Composite createComplianceTabContent(Composite folder) { - String[] values3456= new String[] { VERSION_1_3, VERSION_1_4, VERSION_1_5, VERSION_1_6, VERSION_1_7 }; + String[] values3456= new String[] { VERSION_1_3, VERSION_1_4, VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8 }; String[] values3456Labels= new String[] { PreferencesMessages.ComplianceConfigurationBlock_version13, PreferencesMessages.ComplianceConfigurationBlock_version14, PreferencesMessages.ComplianceConfigurationBlock_version15, PreferencesMessages.ComplianceConfigurationBlock_version16, - PreferencesMessages.ComplianceConfigurationBlock_version17 + PreferencesMessages.ComplianceConfigurationBlock_version17, + PreferencesMessages.ComplianceConfigurationBlock_version18, }; final ScrolledPageContent sc1 = new ScrolledPageContent(folder); @@ -591,6 +597,14 @@ private void validateComplianceStatus() { isVisible= true; } } + + //TODO: Remove once Java SE 8 has been shipped: + String source= getValue(PREF_SOURCE_COMPATIBILITY); + if (VERSION_1_8.equals(source)) { + fJRE50InfoText.setText("This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and is made available for testing and evaluation purposes only. The code is not compatible with any specification of the JCP."); //$NON-NLS-1$ + isVisible= true; + } + fJRE50InfoText.setVisible(isVisible); fJRE50InfoImage.setImage(isVisible ? JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING) : null); fJRE50InfoImage.getParent().layout(); @@ -817,6 +831,11 @@ private void updateComplianceDefaultSettings(boolean rememberOld, String oldComp enumAsId= ERROR; source= VERSION_1_7; target= VERSION_1_7; + } else if (VERSION_1_8.equals(complianceLevel)) { + assertAsId= ERROR; + enumAsId= ERROR; + source= VERSION_1_8; + target= VERSION_1_8; } else { assertAsId= IGNORE; enumAsId= IGNORE; @@ -877,7 +896,12 @@ private String getCurrentCompliance() { && ERROR.equals(getValue(PREF_PB_ASSERT_AS_IDENTIFIER)) && ERROR.equals(getValue(PREF_PB_ENUM_AS_IDENTIFIER)) && VERSION_1_7.equals(getValue(PREF_SOURCE_COMPATIBILITY)) - && VERSION_1_7.equals(getValue(PREF_CODEGEN_TARGET_PLATFORM)))) { + && VERSION_1_7.equals(getValue(PREF_CODEGEN_TARGET_PLATFORM))) + || (VERSION_1_8.equals(complianceLevel) + && ERROR.equals(getValue(PREF_PB_ASSERT_AS_IDENTIFIER)) + && ERROR.equals(getValue(PREF_PB_ENUM_AS_IDENTIFIER)) + && VERSION_1_8.equals(getValue(PREF_SOURCE_COMPATIBILITY)) + && VERSION_1_8.equals(getValue(PREF_CODEGEN_TARGET_PLATFORM)))) { return DEFAULT_CONF; } return USER_CONF; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java index 4b64667058..94402329bf 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class @@ -787,6 +791,7 @@ private PreferencesMessages() { public static String CodeAssistConfigurationBlock_matchCamelCase_label; public static String ComplianceConfigurationBlock_version16; public static String ComplianceConfigurationBlock_version17; + public static String ComplianceConfigurationBlock_version18; public static String ComplianceConfigurationBlock_versionCLDC11; public static String ComplianceConfigurationBlock_src_greater_compliance; public static String ComplianceConfigurationBlock_classfile_greater_compliance; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties index f80d31085a..a79bde3160 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties @@ -5,6 +5,10 @@ # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation # John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class @@ -541,6 +545,7 @@ ComplianceConfigurationBlock_version14=1.4 ComplianceConfigurationBlock_version15=1.5 ComplianceConfigurationBlock_version16=1.6 ComplianceConfigurationBlock_version17=1.7 +ComplianceConfigurationBlock_version18=1.8 (BETA) ComplianceConfigurationBlock_versionCLDC11=CLDC 1.1 ComplianceConfigurationBlock_needsbuild_title=Compiler Settings Changed From 8a0943b847c77dead1c48a075425263de8d703e4 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Thu, 7 Mar 2013 16:16:11 +0100 Subject: [PATCH 003/169] updated version in pom --- org.eclipse.jdt.astview/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jdt.astview/pom.xml b/org.eclipse.jdt.astview/pom.xml index 9ff4790b8d..1209ea9444 100644 --- a/org.eclipse.jdt.astview/pom.xml +++ b/org.eclipse.jdt.astview/pom.xml @@ -20,6 +20,6 @@ org.eclipse.jdt org.eclipse.jdt.astview - 1.1.8-SNAPSHOT + 1.1.9-SNAPSHOT eclipse-plugin From 71b6ab3c4d81d215e847d3d6bfaff39c02aef753 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Thu, 7 Mar 2013 16:23:56 +0100 Subject: [PATCH 004/169] added LambdaExpression#resolveMethodBinding() --- .../jdt/astview/views/ASTViewContentProvider.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java index a3d0e3031f..92752a5825 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -34,6 +38,7 @@ import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.ImportDeclaration; +import org.eclipse.jdt.core.dom.LambdaExpression; import org.eclipse.jdt.core.dom.MemberRef; import org.eclipse.jdt.core.dom.MemberValuePair; import org.eclipse.jdt.core.dom.MethodDeclaration; @@ -139,6 +144,9 @@ private Object[] getNodeChildren(ASTNode node) { } else if (expression instanceof Annotation) { IAnnotationBinding binding= ((Annotation) expression).resolveAnnotationBinding(); res.add(createBinding(expression, binding)); + } else if (expression instanceof LambdaExpression) { + IMethodBinding binding= ((LambdaExpression) expression).resolveMethodBinding(); + res.add(createBinding(expression, binding)); } // Expression attributes: res.add(new GeneralAttribute(expression, "Boxing: " + expression.resolveBoxing() + "; Unboxing: " + expression.resolveUnboxing())); //$NON-NLS-1$ //$NON-NLS-2$ From e22f118178ef366019ebbb07d469d6a8a346515f Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Thu, 21 Mar 2013 17:50:46 +0100 Subject: [PATCH 005/169] Bug 401666: UI for Java 8 code formatter options --- .../preferences/formatter/BracesTabPage.java | 9 +++++++++ .../formatter/FormatterMessages.java | 11 +++++++++- .../formatter/FormatterMessages.properties | 15 +++++++++++--- .../formatter/WhiteSpaceOptions.java | 20 ++++++++++++++++++- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java index 39092ec0e1..4a30492cfd 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java @@ -4,6 +4,10 @@ * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. * * Contributors: * IBM Corporation - initial API and implementation @@ -42,6 +46,9 @@ public class BracesTabPage extends FormatterTabPage { " int [] myArray= {1,2,3,4,5,6};" + //$NON-NLS-1$ " int [] emptyArray= new int[] {};" + //$NON-NLS-1$ " Example() {" + //$NON-NLS-1$ + " Runnable r = () -> {"+ //$NON-NLS-1$ + " fField.set(20);"+ //$NON-NLS-1$ + " };"+ //$NON-NLS-1$ " }" + //$NON-NLS-1$ " void bar(int p) {" + //$NON-NLS-1$ " for (int i= 0; i<10; i++) {" + //$NON-NLS-1$ @@ -125,6 +132,8 @@ public void update(Observable o, Object arg) { } }); updateOptionEnablement(arrayInitOption, arrayInitCheckBox); + + createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_lambda_body, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_LAMBDA_BODY); } protected final void updateOptionEnablement(ComboPreference arrayInitOption, CheckboxPreference arrayInitCheckBox) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java index ca0d05a689..1eeb0ac022 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * istvan@benedek-home.de - 103706 [formatter] indent empty lines @@ -162,6 +166,8 @@ private FormatterMessages() { public static String WhiteSpaceOptions_after; public static String WhiteSpaceOptions_operator; public static String WhiteSpaceOptions_assignment_operator; + public static String WhiteSpaceOptions_lambda_after_arrow_operator; + public static String WhiteSpaceOptions_lambda_before_arrow_operator; public static String WhiteSpaceOptions_binary_operator; public static String WhiteSpaceOptions_unary_operator; public static String WhiteSpaceOptions_prefix_operator; @@ -205,6 +211,7 @@ private FormatterMessages() { public static String WhiteSpaceOptions_array_element_access; public static String WhiteSpaceOptions_array_alloc; public static String WhiteSpaceOptions_array_init; + public static String WhiteSpaceOptions_arrow_operator; public static String WhiteSpaceOptions_arguments; public static String WhiteSpaceOptions_initialization; public static String WhiteSpaceOptions_incrementation; @@ -220,6 +227,7 @@ private FormatterMessages() { public static String WhiteSpaceOptions_conditional; public static String WhiteSpaceOptions_wildcard; public static String WhiteSpaceOptions_label; + public static String WhiteSpaceOptions_lambda; public static String WhiteSpaceOptions_comma; public static String WhiteSpaceOptions_semicolon; public static String WhiteSpaceOptions_question_mark; @@ -355,6 +363,7 @@ private FormatterMessages() { public static String BracesTabPage_option_enum_declaration; public static String BracesTabPage_option_enumconst_declaration; public static String BracesTabPage_option_annotation_type_declaration; + public static String BracesTabPage_option_lambda_body; public static String CodingStyleConfigurationBlock_preview_title; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties index 3c2ed08a93..79b0c3ac41 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/FormatterMessages.properties @@ -1,10 +1,14 @@ ############################################################################### -# Copyright (c) 2000, 2011 IBM Corporation and others. +# Copyright (c) 2000, 2013 IBM Corporation and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation # istvan@benedek-home.de - 103706 [formatter] indent empty lines @@ -174,6 +178,8 @@ WhiteSpaceOptions_after=After WhiteSpaceOptions_operator=Operator WhiteSpaceOptions_assignment_operator=Assignment operator +WhiteSpaceOptions_lambda_after_arrow_operator=after arrow operator +WhiteSpaceOptions_lambda_before_arrow_operator=before arrow operator WhiteSpaceOptions_binary_operator=Binary operator WhiteSpaceOptions_unary_operator=Unary operator WhiteSpaceOptions_prefix_operator=Prefix operator @@ -223,6 +229,7 @@ WhiteSpaceOptions_array_decl=Array declaration WhiteSpaceOptions_array_element_access=Array element access WhiteSpaceOptions_array_alloc=Array allocation WhiteSpaceOptions_array_init=Array initializer +WhiteSpaceOptions_arrow_operator=Arrow operator WhiteSpaceOptions_arguments=Arguments WhiteSpaceOptions_initialization=Initialization @@ -242,6 +249,7 @@ WhiteSpaceOptions_colon=Colon WhiteSpaceOptions_conditional=Conditional WhiteSpaceOptions_wildcard=Wildcard type WhiteSpaceOptions_label=Label +WhiteSpaceOptions_lambda=Lambda WhiteSpaceOptions_comma=Comma WhiteSpaceOptions_semicolon=Semicolon @@ -383,7 +391,7 @@ BracesTabPage_position_next_line_indented=Next line indented BracesTabPage_position_next_line_on_wrap=Next line on wrap BracesTabPage_group_brace_positions_title=Brace positions -BracesTabPage_option_class_declaration=&Class or interface declaration: +BracesTabPage_option_class_declaration=Class or inter&face declaration: BracesTabPage_option_anonymous_class_declaration=Anon&ymous class declaration: BracesTabPage_option_method_declaration=Met&hod declaration: BracesTabPage_option_constructor_declaration=Constr&uctor declaration: @@ -393,8 +401,9 @@ BracesTabPage_option_switch_case='&switch' statement: BracesTabPage_option_array_initializer=Array initiali&zer: BracesTabPage_option_keep_empty_array_initializer_on_one_line=Keep empty array &initializer on one line BracesTabPage_option_enum_declaration=&Enum declaration: -BracesTabPage_option_enumconst_declaration=Enum c&onstant body: +BracesTabPage_option_enumconst_declaration=Enum &constant body: BracesTabPage_option_annotation_type_declaration=&Annotation type declaration: +BracesTabPage_option_lambda_body=Lambda b&ody: CodingStyleConfigurationBlock_preview_title=A sample source file for the code formatter preview CommentsTabPage_group1_title=General settings diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/WhiteSpaceOptions.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/WhiteSpaceOptions.java index 73ce3e974f..dffe754870 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/WhiteSpaceOptions.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/WhiteSpaceOptions.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -322,6 +326,10 @@ public void getCheckedLeafs(List list) { CodeFormatter.K_CLASS_BODY_DECLARATIONS, "Map, Y> t;" //$NON-NLS-1$ ); + + private final PreviewSnippet LAMBDA_EXPR_PREVIEW= new PreviewSnippet( + CodeFormatter.K_STATEMENTS, + "Runnable r = ()->process();"); //$NON-NLS-1$ /** * Create the tree, in this order: syntax element - position - abstract element @@ -539,6 +547,7 @@ public ArrayList createTreeByJavaElement(Map workingValues createAnnotationTree(workingValues, declarations); createEnumTree(workingValues, declarations); createAnnotationTypeTree(workingValues, declarations); + createLambdaTree(workingValues, declarations); final InnerNode statements= new InnerNode(null, workingValues, FormatterMessages.WhiteSpaceTabPage_statements); createOption(statements, workingValues, FormatterMessages.WhiteSpaceOptions_before_semicolon, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_SEMICOLON, SEMICOLON_PREVIEW); @@ -583,6 +592,13 @@ public ArrayList createTreeByJavaElement(Map workingValues return roots; } + private InnerNode createLambdaTree(Map workingValues, InnerNode parent) { + final InnerNode root= new InnerNode(parent, workingValues, FormatterMessages.WhiteSpaceOptions_lambda); + createOption(root, workingValues, FormatterMessages.WhiteSpaceOptions_lambda_before_arrow_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_ARROW, LAMBDA_EXPR_PREVIEW); + createOption(root, workingValues, FormatterMessages.WhiteSpaceOptions_lambda_after_arrow_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_LAMBDA_ARROW, LAMBDA_EXPR_PREVIEW); + return root; + } + private void createBeforeQuestionTree(Map workingValues, final InnerNode parent) { createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_conditional, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_QUESTION_IN_CONDITIONAL, CONDITIONAL_PREVIEW); createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_wildcard, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_QUESTION_IN_WILDCARD, WILDCARD_PREVIEW); @@ -656,6 +672,7 @@ private void createBeforeOperatorTree(Map workingValues, final I createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_binary_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR, OPERATOR_PREVIEW); createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_prefix_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_PREFIX_OPERATOR, OPERATOR_PREVIEW); createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_postfix_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_POSTFIX_OPERATOR, OPERATOR_PREVIEW); + createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_arrow_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_ARROW, LAMBDA_EXPR_PREVIEW); } private void createBeforeClosingBracketTree(Map workingValues, final InnerNode parent) { @@ -832,6 +849,7 @@ private void createAfterOperatorTree(Map workingValues, final In createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_binary_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_BINARY_OPERATOR, OPERATOR_PREVIEW); createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_prefix_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_PREFIX_OPERATOR, OPERATOR_PREVIEW); createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_postfix_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_POSTFIX_OPERATOR, OPERATOR_PREVIEW); + createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_arrow_operator, DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_LAMBDA_ARROW, LAMBDA_EXPR_PREVIEW); } private void createAfterOpenBracketTree(Map workingValues, final InnerNode parent) { From ecfdffb1302e2d91b6fc290a006f78834918da60 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Sat, 23 Mar 2013 22:14:16 +0100 Subject: [PATCH 006/169] UI for bug 404052: [formatter] NEXT_LINE_ON_WRAP not implemented for various formatter options --- .../preferences/formatter/BracesTabPage.java | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java index 4a30492cfd..8b3550d14c 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/BracesTabPage.java @@ -72,12 +72,6 @@ public class BracesTabPage extends FormatterTabPage { private final String [] fBracePositions= { - DefaultCodeFormatterConstants.END_OF_LINE, - DefaultCodeFormatterConstants.NEXT_LINE, - DefaultCodeFormatterConstants.NEXT_LINE_SHIFTED - }; - - private final String [] fExtendedBracePositions= { DefaultCodeFormatterConstants.END_OF_LINE, DefaultCodeFormatterConstants.NEXT_LINE, DefaultCodeFormatterConstants.NEXT_LINE_SHIFTED, @@ -85,12 +79,6 @@ public class BracesTabPage extends FormatterTabPage { }; private final String [] fBracePositionNames= { - FormatterMessages.BracesTabPage_position_same_line, - FormatterMessages.BracesTabPage_position_next_line, - FormatterMessages.BracesTabPage_position_next_line_indented - }; - - private final String [] fExtendedBracePositionNames= { FormatterMessages.BracesTabPage_position_same_line, FormatterMessages.BracesTabPage_position_next_line, FormatterMessages.BracesTabPage_position_next_line_indented, @@ -112,15 +100,15 @@ public BracesTabPage(ModifyDialog modifyDialog, Map workingValue protected void doCreatePreferences(Composite composite, int numColumns) { final Group group= createGroup(numColumns, composite, FormatterMessages.BracesTabPage_group_brace_positions_title); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_class_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_TYPE_DECLARATION); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_anonymous_class_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ANONYMOUS_TYPE_DECLARATION); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_constructor_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_CONSTRUCTOR_DECLARATION); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_method_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_METHOD_DECLARATION); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_enum_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ENUM_DECLARATION); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_enumconst_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ENUM_CONSTANT); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_annotation_type_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ANNOTATION_TYPE_DECLARATION); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_blocks, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_BLOCK); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_blocks_in_case, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_BLOCK_IN_CASE); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_class_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_TYPE_DECLARATION); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_anonymous_class_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ANONYMOUS_TYPE_DECLARATION); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_constructor_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_CONSTRUCTOR_DECLARATION); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_method_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_METHOD_DECLARATION); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_enum_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ENUM_DECLARATION); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_enumconst_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ENUM_CONSTANT); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_annotation_type_declaration, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ANNOTATION_TYPE_DECLARATION); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_blocks, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_BLOCK); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_blocks_in_case, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_BLOCK_IN_CASE); createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_switch_case, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_SWITCH); ComboPreference arrayInitOption= createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_array_initializer, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_ARRAY_INITIALIZER); @@ -133,7 +121,7 @@ public void update(Observable o, Object arg) { }); updateOptionEnablement(arrayInitOption, arrayInitCheckBox); - createExtendedBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_lambda_body, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_LAMBDA_BODY); + createBracesCombo(group, numColumns, FormatterMessages.BracesTabPage_option_lambda_body, DefaultCodeFormatterConstants.FORMATTER_BRACE_POSITION_FOR_LAMBDA_BODY); } protected final void updateOptionEnablement(ComboPreference arrayInitOption, CheckboxPreference arrayInitCheckBox) { @@ -155,10 +143,6 @@ private ComboPreference createBracesCombo(Composite composite, int numColumns, S return createComboPref(composite, numColumns, message, key, fBracePositions, fBracePositionNames); } - private ComboPreference createExtendedBracesCombo(Composite composite, int numColumns, String message, String key) { - return createComboPref(composite, numColumns, message, key, fExtendedBracePositions, fExtendedBracePositionNames); - } - private CheckboxPreference createIndentedCheckboxPref(Composite composite, int numColumns, String message, String key, String [] values) { CheckboxPreference pref= createCheckboxPref(composite, numColumns, message, key, values); GridData data= (GridData) pref.getControl().getLayoutData(); From f64f0d31921fdd5c14e6d31bbd6a6ab245268377 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Mon, 15 Apr 2013 16:59:54 +0200 Subject: [PATCH 007/169] initial rtstubs18 --- .../testresources/rtstubs18.jar | Bin 0 -> 553638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 org.eclipse.jdt.ui.tests/testresources/rtstubs18.jar diff --git a/org.eclipse.jdt.ui.tests/testresources/rtstubs18.jar b/org.eclipse.jdt.ui.tests/testresources/rtstubs18.jar new file mode 100644 index 0000000000000000000000000000000000000000..26a6c5e404070034ed719c1e7bba933c6a86204e GIT binary patch literal 553638 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

- */ - public static ASTNode perform(ASTNode root, int start, int length) { - NodeFinder finder= new NodeFinder(start, length); - root.accept(finder); - ASTNode result= finder.getCoveredNode(); - if (result == null || result.getStartPosition() != start || result.getLength() != length) { - return finder.getCoveringNode(); - } - return result; - } - - private int fStart; - private int fEnd; - - private ASTNode fCoveringNode; - private ASTNode fCoveredNode; - - public NodeFinder(int offset, int length) { - super(true); // include Javadoc tags - fStart= offset; - fEnd= offset + length; - } - - protected boolean visitNode(ASTNode node) { - int nodeStart= node.getStartPosition(); - int nodeEnd= nodeStart + node.getLength(); - if (nodeEnd < fStart || fEnd < nodeStart) { - return false; - } - if (nodeStart <= fStart && fEnd <= nodeEnd) { - fCoveringNode= node; - } - if (fStart <= nodeStart && nodeEnd <= fEnd) { - if (fCoveringNode == node) { // nodeStart == fStart && nodeEnd == fEnd - fCoveredNode= node; - return true; // look further for node with same length as parent - } else if (fCoveredNode == null) { // no better found - fCoveredNode= node; - } - return false; - } - return true; - } - - /** - * Returns the covered node. If more than one nodes are covered by the selection, the - * returned node is first covered node found in a top-down traversal of the AST - * @return ASTNode - */ - public ASTNode getCoveredNode() { - return fCoveredNode; - } - - /** - * Returns the covering node. If more than one nodes are covering the selection, the - * returned node is last covering node found in a top-down traversal of the AST - * @return ASTNode - */ - public ASTNode getCoveringNode() { - return fCoveringNode; - } - -} diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java index 828b21e8a9..800d64dbba 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -11,6 +11,7 @@ package org.eclipse.jdt.astview; import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.CompilationUnit; /** @@ -18,13 +19,12 @@ */ public class TreeInfoCollector { - public static class NodeCounter extends GenericVisitor { + public static class NodeCounter extends ASTVisitor { public int numberOfNodes= 0; - protected boolean visitNode(ASTNode node) { + public void preVisit(ASTNode node) { numberOfNodes++; - return true; } } diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java index c4bcd99035..1da815f5f3 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java @@ -18,6 +18,7 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -97,7 +98,6 @@ import org.eclipse.jdt.astview.ASTViewImages; import org.eclipse.jdt.astview.ASTViewPlugin; import org.eclipse.jdt.astview.EditorUtility; -import org.eclipse.jdt.astview.NodeFinder; import org.eclipse.jdt.astview.TreeInfoCollector; import org.eclipse.jdt.core.IClassFile; @@ -117,6 +117,7 @@ import org.eclipse.jdt.core.dom.ASTRequestor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IBinding; +import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.SharedASTProvider; @@ -1213,9 +1214,7 @@ private void doLinkWithEditor(ISelection selection) { int offset= textSelection.getOffset(); int length= textSelection.getLength(); - NodeFinder finder= new NodeFinder(offset, length); - fRoot.accept(finder); - ASTNode covering= finder.getCoveringNode(); + ASTNode covering= NodeFinder.perform(fRoot, offset, length); if (covering != null) { fViewer.reveal(covering); fViewer.setSelection(new StructuredSelection(covering)); @@ -1449,7 +1448,7 @@ protected void performDoubleClick() { } } - ASTNode node= null; + ASTNode node= null, nodeEnd= null; if (obj instanceof ASTNode) { node= (ASTNode) obj; @@ -1457,6 +1456,14 @@ protected void performDoubleClick() { Object val= ((NodeProperty) obj).getNode(); if (val instanceof ASTNode) { node= (ASTNode) val; + } else if (val instanceof List) { + List list= (List) val; + if (list.size() > 0) { + node= (ASTNode) list.get(0); + nodeEnd= (ASTNode) list.get(list.size() - 1); + } else { + fViewer.getTree().getDisplay().beep(); + } } } else if (obj instanceof Binding) { @@ -1503,8 +1510,14 @@ protected void performDoubleClick() { if (node != null) { int offset= isTripleClick ? fRoot.getExtendedStartPosition(node) : node.getStartPosition(); - int length= isTripleClick ? fRoot.getExtendedLength(node) : node.getLength(); - + int length; + if (nodeEnd == null) { + length= isTripleClick ? fRoot.getExtendedLength(node) : node.getLength(); + } else { + length= isTripleClick + ? fRoot.getExtendedStartPosition(nodeEnd) + fRoot.getExtendedLength(nodeEnd) - fRoot.getExtendedStartPosition(node) + : nodeEnd.getStartPosition() + nodeEnd.getLength() - node.getStartPosition(); + } EditorUtility.selectInEditor(fEditor, offset, length); } } From 449a3453b969f43104f75fec7c5c1f039a339dc7 Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Mon, 29 Apr 2013 11:34:53 +0530 Subject: [PATCH 010/169] Fixed bug 405704 -[1.8][render] Adornment for default methods and annotation type elements with default. --- .../icons/full/ovr16/default_co.gif | Bin 0 -> 102 bytes .../jdt/internal/ui/JavaPluginImages.java | 8 +++++- .../ui/viewsupport/BindingLabelProvider.java | 11 +++++++- .../viewsupport/JavaElementImageProvider.java | 10 ++++++- .../jdt/ui/JavaElementImageDescriptor.java | 26 +++++++++++++++++- .../java/CompletionProposalLabelProvider.java | 16 +++++++++-- 6 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 org.eclipse.jdt.ui/icons/full/ovr16/default_co.gif diff --git a/org.eclipse.jdt.ui/icons/full/ovr16/default_co.gif b/org.eclipse.jdt.ui/icons/full/ovr16/default_co.gif new file mode 100644 index 0000000000000000000000000000000000000000..7228f024017a39b1ebc9ccb3481c7d8c1fa816a9 GIT binary patch literal 102 zcmZ?wbhEHbWM^P!*v!E2|Nno@ Date: Tue, 4 Jun 2013 16:12:13 +0530 Subject: [PATCH 011/169] Fixed Bug 409275: [1.8] Change 'default' access modifier in dialogs --- .../corext/refactoring/refactoring.properties | 22 +++++++++++-------- .../ui/refactoring/refactoringui.properties | 14 +++++++----- .../ui/actions/ActionMessages.properties | 8 +++++-- .../PreferencesMessages.properties | 4 ++-- .../correction/CorrectionMessages.properties | 8 +++++-- .../ui/wizards/NewWizardMessages.properties | 10 ++++++--- 6 files changed, 43 insertions(+), 23 deletions(-) diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/refactoring.properties b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/refactoring.properties index ca77d2b84d..044df0ddbe 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/refactoring.properties +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/refactoring.properties @@ -5,6 +5,10 @@ # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation # Benjamin Muskalla - [extract method] Extract method and continue https://bugs.eclipse.org/bugs/show_bug.cgi?id=48056 @@ -150,7 +154,7 @@ ExtractMethodRefactoring_error_vararg_ordering=The variable arity parameter ''{0 ExtractMethodRefactoring_descriptor_description=Extract method ''{0}'' from ''{1}'' to ''{2}'' ExtractMethodRefactoring_descriptor_description_short=Extract method ''{0}'' ExtractMethodRefactoring_destination_pattern=Destination type: ''{0}'' -ExtractMethodRefactoring_default_visibility=(default) +ExtractMethodRefactoring_default_visibility=(package) ExtractMethodRefactoring_declare_thrown_exceptions=Declare thrown runtime exceptions #-- Inline Method ------------------------------------------------------ @@ -233,7 +237,7 @@ SelfEncapsulateField_getter_pattern=Getter method name: ''{0}'' SelfEncapsulateField_setter_pattern=Setter method name: ''{0}'' SelfEncapsulateField_change_visibility=Change visibility to private SelfEncapsulateField_original_pattern=Original element: ''{0}'' -SelfEncapsulateField_default_visibility=(default) +SelfEncapsulateField_default_visibility=(package) SelfEncapsulateField_visibility_pattern=Field visibility: ''{0}'' SelfEncapsulateField_generate_comments=Generate method comments SelfEncapsulateField_add_setter=Add Setter method @@ -330,7 +334,7 @@ ExtractConstantRefactoring_visibility_pattern=Declared visibility: ''{0}'' ExtractConstantRefactoring_replace_occurrences=Replace occurrences of expression with constant ExtractConstantRefactoring_qualify_references=Qualify references to constant ExtractConstantRefactoring_declare_constant=Add constant declaration -ExtractConstantRefactoring_default_visibility=(default) +ExtractConstantRefactoring_default_visibility=(package) ExtractConstantRefactoring_replace=Replace expression with constant reference ExtractConstantRefactoring_another_variable=A variable with name ''{0}'' is already defined in the visible scope. ExtractConstantRefactoring_no_void=Cannot extract an expression of type \'void\'. @@ -611,7 +615,7 @@ PullUpRefactoring_field_not_accessible=Field ''{0}'' referenced in one of the mo PullUpRefactoring_method_not_accessible=Method ''{0}'' referenced in one of the moved elements is not accessible from type ''{1}'' PullUpRefactoring_different_method_return_type=Method ''{0}'' declared in type''{1}'' has a different return type than its moved counterpart, which will result in compile errors if you proceed PullUpRefactoring_different_field_type=Field ''{0}'' declared in type ''{1}'' has a different type than its moved counterpart -PullUpRefactoring_lower_default_visibility=Method ''{0}'' declared in type ''{1}'' has visibility lower than ''default'', which will result in compile errors if you proceed +PullUpRefactoring_lower_default_visibility=Method ''{0}'' declared in type ''{1}'' has visibility lower than ''package'', which will result in compile errors if you proceed PullUpRefactoring_lower_protected_visibility=Method ''{0}'' declared in type ''{1}'' has visibility lower than ''protected'', which will result in compile errors if you proceed PullUpRefactoring_checking=Checking preconditions... PullUpRefactoring_add_method_stub=Add method stub @@ -782,7 +786,7 @@ ChangeSignatureRefactoring_duplicate_name=Duplicate parameter name: ''{0}''. ChangeSignatureRefactoring_return_type_contains_type_variable=The return type ''{0}'' contains the type variable ''{1}'', which may not be available in related methods. ChangeSignatureRefactoring_method_name_not_empty=The method name cannot be empty. ChangeSignatureRefactoring_default_value=Enter the default value for parameter ''{0}''. -ChangeSignatureRefactoring_default_visibility=(default) +ChangeSignatureRefactoring_default_visibility=(package) ChangeSignatureRefactoring_invalid_expression=''{0}'' is not a valid expression. ChangeSignatureRefactoring_parameter_type_contains_type_variable=The type ''{0}'' of parameter ''{1}'' contains the type variable ''{2}'', which may not be available in related methods. ChangeSignatureRefactoring_old_and_new_signatures_not_sufficiently_different=The old and new method signatures do not differ sufficiently for creating a delegate method. Delegate will introduce compile errors. @@ -838,7 +842,7 @@ MoveInnerToTopRefactoring_descriptor_description_short=Move type ''{0}'' to new MoveInnerToTopRefactoring_update_constructor_reference=Update constructor occurrence MoveInnerToTopRefactoring_move_to_Top=Move Type to New File MoveInnerToTopRefactoring_parameter_pattern=Parameter name: ''{0}'' -MoveInnerToTopRefactoring_change_visibility_type_warning=The visibility of type ''{0}'' will be changed to default. +MoveInnerToTopRefactoring_change_visibility_type_warning=The visibility of type ''{0}'' will be changed to package. MoveInnerToTopRefactoring_change_qualifier=Qualify class name MoveInnerToTopRefactoring_type_exists=Type named ''{0}'' already exists in package ''{1}'' @@ -923,7 +927,7 @@ MemberVisibilityAdjustor_change_visibility_type_warning=The visibility of type ' MemberVisibilityAdjustor_change_visibility_method_warning=The visibility of method ''{0}'' will be changed to {1}. MemberVisibilityAdjustor_change_visibility_field_warning=The visibility of field ''{0}'' will be changed to {1}. #End - Do not remove -MemberVisibilityAdjustor_change_visibility_default=default +MemberVisibilityAdjustor_change_visibility_default=package MemberVisibilityAdjustor_change_visibility_public=public MemberVisibilityAdjustor_change_visibility_protected=protected MemberVisibilityAdjustor_change_visibility_private=private @@ -965,7 +969,7 @@ MovePackageFragmentRootChange_move=Move Package Fragment Root ''{0}'' to ''{1}'' PromoteTempToFieldRefactoring_name=Convert Local Variable to Field PromoteTempToFieldRefactoring_select_declaration=Select a declaration or a reference to a local variable. -PromoteTempToFieldRefactoring_default_visibility=(default) +PromoteTempToFieldRefactoring_default_visibility=(package) PromoteTempToFieldRefactoring_visibility_pattern=Declared visibility: ''{0}'' PromoteTempToFieldRefactoring_only_declared_in_methods=Only local variables declared in methods can be converted to fields. PromoteTempToFieldRefactoring_method_parameters=Cannot convert method parameters to fields. @@ -1001,7 +1005,7 @@ ConvertAnonymousToNestedRefactoring_declare_final_static=Declare class \'final\' ConvertAnonymousToNestedRefactoring_extends_local_class=Cannot convert this anonymous class to a nested class since it extends a local class. ConvertAnonymousToNestedRefactoring_class_name_pattern=Class name: ''{0}'' ConvertAnonymousToNestedRefactoring_visibility_pattern=Declared visibility: ''{0}'' -ConvertAnonymousToNestedRefactoring_default_visibility=(default) +ConvertAnonymousToNestedRefactoring_default_visibility=(package) ConvertAnonymousToNestedRefactoring_original_pattern=Original element: ''{0}'' InlineConstantRefactoring_Inline=Inline Constant diff --git a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties index 81aad03dc0..056b5a9bde 100644 --- a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties +++ b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/refactoringui.properties @@ -1,10 +1,14 @@ ############################################################################### -# Copyright (c) 2000, 2012 IBM Corporation and others. +# Copyright (c) 2000, 2013 IBM Corporation and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation ############################################################################### @@ -57,7 +61,7 @@ ExtractMethodWizard_extract_method=Extract Method ExtractMethodInputPage_access_Modifiers=&Access modifier: ExtractMethodInputPage_public=public -ExtractMethodInputPage_default=default +ExtractMethodInputPage_default=package ExtractMethodInputPage_protected=protected ExtractMethodInputPage_private=private ExtractMethodInputPage_signature_preview=Method signature preview: @@ -92,7 +96,7 @@ SelfEncapsulateFieldInputPage_first_method=As first method SelfEncapsulateFieldInputPage_access_Modifiers=Access modifier: SelfEncapsulateFieldInputPage_configure_link=Configure naming conventions... SelfEncapsulateFieldInputPage_public=&public -SelfEncapsulateFieldInputPage_default=defa&ult +SelfEncapsulateFieldInputPage_default=p&ackage SelfEncapsulateFieldInputPage_protected=pro&tected SelfEncapsulateFieldInputPage_private=pri&vate SelfEncapsulateFieldInputPage_generateJavadocComment=Generate method &comments @@ -198,7 +202,7 @@ PullUpInputPage_see_log=An unexpected exception occurred. See the error log for ##Change Signature ChangeSignatureInputPage_change=Change the signature of the selected method and all its overriding methods. ChangeSignatureInputPage_access_modifier=A&ccess modifier: -ChangeSignatureInputPage_default=default +ChangeSignatureInputPage_default=package ChangeSignatureInputPage_return_type=Return &type: ChangeSignatureInputPage_method_name=Method &name: ChangeSignatureInputPage_parameters=Pa&rameters @@ -340,7 +344,7 @@ UseSupertypeInputPage_updates_possible_in_files={0} - updates possible in {1} fi UseSupertypeWizard_Use_Super_Type_Where_Possible=Use Super Type Where Possible VisibilityControlUtil_Access_modifier=Access modifier -VisibilityControlUtil_defa_ult_4=d&efault +VisibilityControlUtil_defa_ult_4=packag&e PullUpWizard_defaultPageTitle=Pull Up PullUpWizard_select_all_label=Select &All diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties index 5b96a9f8f5..a1e6223081 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/ActionMessages.properties @@ -1,10 +1,14 @@ ############################################################################### -# Copyright (c) 2000, 2011 IBM Corporation and others. +# Copyright (c) 2000, 2013 IBM Corporation and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation # Sebastian Davids - Bug 114276 @@ -127,7 +131,7 @@ SourceActionDialog_enterAt_label=&Insertion point: SourceActionDialog_modifier_group=Access modifier SourceActionDialog_modifier_public=&public SourceActionDialog_modifier_protected=protec&ted -SourceActionDialog_modifier_default=d&efault +SourceActionDialog_modifier_default=packag&e SourceActionDialog_modifier_private=pri&vate SourceActionDialog_modifier_synchronized=s&ynchronized SourceActionDialog_modifier_final=&final diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties index a79bde3160..759f016f3e 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties @@ -499,7 +499,7 @@ JavadocProblemsPreferencePage_title=Javadoc Comments JavadocProblemsConfigurationBlock_allStandardTags=Validate all standard tags JavadocProblemsConfigurationBlock_public=Public JavadocProblemsConfigurationBlock_protected=Protected -JavadocProblemsConfigurationBlock_default=Default +JavadocProblemsConfigurationBlock_default=Package JavadocProblemsConfigurationBlock_private=Private JavadocProblemsConfigurationBlock_error=Error @@ -638,7 +638,7 @@ MembersOrderPreferencePage_types_label=Types MembersOrderPreferencePage_public_label=Public MembersOrderPreferencePage_private_label=Private MembersOrderPreferencePage_protected_label=Protected -MembersOrderPreferencePage_default_label=Default +MembersOrderPreferencePage_default_label=Package MembersOrderPreferencePage_usevisibilitysort_label=&Sort members in same category by visibility CodeTemplateBlock_templates_comment_node=Comments CodeTemplateBlock_templates_code_node=Code diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties index b7c7ac6e3b..6e9dbe5c12 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties @@ -5,6 +5,10 @@ # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation # Benjamin Muskalla - [quick fix] Quick fix for missing synchronized modifier - https://bugs.eclipse.org/bugs/show_bug.cgi?id=245250 @@ -152,12 +156,12 @@ ModifierCorrectionSubProcessor_removeabstract_description=Remove 'abstract' modi ModifierCorrectionSubProcessor_removevolatile_description=Remove 'volatile' modifier ModifierCorrectionSubProcessor_removebody_description=Remove method body ModifierCorrectionSubProcessor_remove_override=Remove '@Override' annotation -ModifierCorrectionSubProcessor_default=default +ModifierCorrectionSubProcessor_default=package ModifierCorrectionSubProcessor_addabstract_description=Make type ''{0}'' abstract SuppressWarningsSubProcessor_suppress_warnings_label=Add @SuppressWarnings ''{0}'' to ''{1}'' ModifierCorrectionSubProcessor_removenative_description=Remove 'native' modifier ModifierCorrectionSubProcessor_removefinal_description=Remove 'final' modifier -ModifierCorrectionSubProcessor_default_visibility_label=(default) +ModifierCorrectionSubProcessor_default_visibility_label=(package) ModifierCorrectionSubProcessor_addmissingbody_description=Add body ModifierCorrectionSubProcessor_setmethodabstract_description=Add 'abstract' modifier GetterSetterCorrectionSubProcessor_additional_info=Starts the 'Encapsulate field' refactoring to create getter and setters diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties index aaf428525c..0fe567c7ad 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties @@ -1,10 +1,14 @@ ############################################################################### -# Copyright (c) 2000, 2012 IBM Corporation and others. +# Copyright (c) 2000, 2013 IBM Corporation and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # +# This is an implementation of an early-draft specification developed under the Java +# Community Process (JCP) and is made available for testing and evaluation purposes +# only. The code is not compatible with any specification of the JCP. +# # Contributors: # IBM Corporation - initial API and implementation # Philippe Marschall - [type wizards] Allow the creation of a compilation unit called package-info.java - https://bugs.eclipse.org/86168 @@ -112,7 +116,7 @@ NewTypeWizardPage_modifiers_acc_label=Modifiers: NewTypeWizardPage_modifiers_public=&public NewTypeWizardPage_modifiers_private=pri&vate NewTypeWizardPage_modifiers_protected=pro&tected -NewTypeWizardPage_modifiers_default=defa&ult +NewTypeWizardPage_modifiers_default=pa&ckage NewTypeWizardPage_modifiers_abstract=abs&tract NewTypeWizardPage_modifiers_final=fina&l NewTypeWizardPage_modifiers_static=stati&c @@ -163,7 +167,7 @@ NewClassWizardPage_description=Create a new Java class. NewClassWizardPage_methods_label=Which method stubs would you like to create? NewClassWizardPage_methods_main=public static &void main(String[] args) -NewClassWizardPage_methods_constructors=&Constructors from superclass +NewClassWizardPage_methods_constructors=Constr&uctors from superclass NewClassWizardPage_methods_inherited=In&herited abstract methods From 73a81a90b73ed308fb0320ae936432fea9c1e158 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Mon, 10 Jun 2013 20:29:18 +0200 Subject: [PATCH 012/169] Bug 399794: [1.8][dom ast] Add a new node type for the compiler node ReferenceExpression --- .../org/eclipse/jdt/astview/views/ASTViewContentProvider.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java index 92752a5825..5eda698c4e 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTViewContentProvider.java @@ -44,6 +44,7 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.MethodRef; +import org.eclipse.jdt.core.dom.MethodReference; import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor; @@ -147,6 +148,9 @@ private Object[] getNodeChildren(ASTNode node) { } else if (expression instanceof LambdaExpression) { IMethodBinding binding= ((LambdaExpression) expression).resolveMethodBinding(); res.add(createBinding(expression, binding)); + } else if (expression instanceof MethodReference) { + IMethodBinding binding= ((MethodReference) expression).resolveMethodBinding(); + res.add(createBinding(expression, binding)); } // Expression attributes: res.add(new GeneralAttribute(expression, "Boxing: " + expression.resolveBoxing() + "; Unboxing: " + expression.resolveUnboxing())); //$NON-NLS-1$ //$NON-NLS-2$ From 35ccae0f97548983cd7bc772078bfea47d50ec47 Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Thu, 13 Jun 2013 13:58:08 +0200 Subject: [PATCH 013/169] Fixed bug 404821: [1.8][typing] "Correct Indentation" doesn't indent default methods --- .../text/tests/JavaHeuristicScannerTest.java | 268 ++++++++++-------- .../ui/text/JavaHeuristicScanner.java | 8 +- .../jdt/internal/ui/text/JavaIndenter.java | 14 +- 3 files changed, 173 insertions(+), 117 deletions(-) diff --git a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JavaHeuristicScannerTest.java b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JavaHeuristicScannerTest.java index 3019af2a5a..cb83623abd 100644 --- a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JavaHeuristicScannerTest.java +++ b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JavaHeuristicScannerTest.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -12,7 +16,6 @@ import java.util.Hashtable; -import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -99,7 +102,7 @@ public void testPrevIndentationUnit1() { ""); int pos= fScanner.findReferencePosition(18); - Assert.assertEquals(9, pos); + assertEquals(9, pos); } public void testPrevIndentationUnit2() { @@ -108,7 +111,7 @@ public void testPrevIndentationUnit2() { "\t\treturn a"); int pos= fScanner.findReferencePosition(28); - Assert.assertEquals(21, pos); + assertEquals(21, pos); } @@ -119,7 +122,7 @@ public void testPrevIndentationUnit5() { ""); int pos= fScanner.findReferencePosition(30); - Assert.assertEquals(9, pos); + assertEquals(9, pos); } public void testPrevIndentationUnit6() { @@ -127,7 +130,7 @@ public void testPrevIndentationUnit6() { fDocument.set("\tvoid proc (int par1, int par2\n"); int pos= fScanner.findReferencePosition(30); - Assert.assertEquals(12, pos); + assertEquals(12, pos); } public void testPrevIndentationUnit7() { @@ -138,7 +141,7 @@ public void testPrevIndentationUnit7() { ""); int pos= fScanner.findReferencePosition(fDocument.getLength()); - Assert.assertEquals(39, pos); + assertEquals(39, pos); } public void testPrevIndentationUnit8() { @@ -147,7 +150,7 @@ public void testPrevIndentationUnit8() { int pos= fScanner.findReferencePosition(fDocument.getLength()); // Assert.assertEquals(1, pos); - Assert.assertEquals(15, pos); + assertEquals(15, pos); } public void testPrevIndentationUnit9() { @@ -160,7 +163,7 @@ public void testPrevIndentationUnit9() { "\t\tint i;\n"); int pos= fScanner.findReferencePosition(fDocument.getLength()); - Assert.assertEquals(fDocument.getLength() - 7, pos); + assertEquals(fDocument.getLength() - 7, pos); } public void testPrevIndentationUnit10() { @@ -175,7 +178,7 @@ public void testPrevIndentationUnit10() { ""); int pos= fScanner.findReferencePosition(fDocument.getLength()); - Assert.assertEquals(39, pos); + assertEquals(39, pos); } public void testPrevIndentationUnit11() { @@ -190,7 +193,7 @@ public void testPrevIndentationUnit11() { ""); int pos= fScanner.findReferencePosition(fDocument.getLength()); - Assert.assertEquals(83, pos); + assertEquals(83, pos); } public void testPrevIndentation1() { @@ -199,7 +202,7 @@ public void testPrevIndentation1() { ""); String indent= fScanner.getReferenceIndentation(18).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testPrevIndentation2() { @@ -208,7 +211,7 @@ public void testPrevIndentation2() { "\t\treturn a"); String indent= fScanner.getReferenceIndentation(28).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testPrevIndentation3() { @@ -217,7 +220,7 @@ public void testPrevIndentation3() { "\t\treturn a;"); String indent= fScanner.getReferenceIndentation(29).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testPrevIndentation4() { @@ -227,7 +230,7 @@ public void testPrevIndentation4() { ""); String indent= fScanner.getReferenceIndentation(29).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testPrevIndentation5() { @@ -237,14 +240,14 @@ public void testPrevIndentation5() { ""); String indent= fScanner.getReferenceIndentation(30).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testPrevIndentation6() { fDocument.set("\tvoid proc (int par1, int par2\n"); String indent= fScanner.getReferenceIndentation(30).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testPrevIndentation7() { @@ -255,14 +258,14 @@ public void testPrevIndentation7() { ""); String indent= fScanner.getReferenceIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testPrevIndentation8() { fDocument.set("\t/* package */ void proc (int par1, int par2) {\n"); String indent= fScanner.getReferenceIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testPrevIndentation9() { @@ -275,7 +278,7 @@ public void testPrevIndentation9() { "\t\tint i;\n"); String indent= fScanner.getReferenceIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testPrevIndentation10() { @@ -290,7 +293,7 @@ public void testPrevIndentation10() { ""); String indent= fScanner.getReferenceIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testPrevIndentation11() { @@ -305,7 +308,7 @@ public void testPrevIndentation11() { ""); String indent= fScanner.getReferenceIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentation1() { @@ -314,7 +317,7 @@ public void testIndentation1() { ""); String indent= fScanner.computeIndentation(18).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation5() { @@ -324,7 +327,7 @@ public void testIndentation5() { ""); String indent= fScanner.computeIndentation(30).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation6() { @@ -332,7 +335,7 @@ public void testIndentation6() { fDocument.set("\tvoid proc (int par1, int par2\n"); String indent= fScanner.computeIndentation(30).toString(); - Assert.assertEquals("\t ", indent); + assertEquals("\t ", indent); } public void testIndentation6a() { @@ -340,7 +343,7 @@ public void testIndentation6a() { fDocument.set("\tvoid proc ( int par1, int par2\n"); String indent= fScanner.computeIndentation(30).toString(); - Assert.assertEquals("\t ", indent); + assertEquals("\t ", indent); } public void testIndentation7() { @@ -351,7 +354,7 @@ public void testIndentation7() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentation8() { @@ -359,7 +362,7 @@ public void testIndentation8() { fDocument.set("\t/* package */ void proc (int par1, int par2) {\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation9() { @@ -372,7 +375,7 @@ public void testIndentation9() { "\t\tint i;\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation10() { @@ -387,7 +390,7 @@ public void testIndentation10() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation11() { @@ -402,7 +405,7 @@ public void testIndentation11() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentation12() { @@ -413,7 +416,7 @@ public void testIndentation12() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentation13() { @@ -424,7 +427,7 @@ public void testIndentation13() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentation14() { @@ -435,7 +438,7 @@ public void testIndentation14() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testIndentation15() { @@ -445,7 +448,7 @@ public void testIndentation15() { "\t}\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation16() { @@ -454,7 +457,7 @@ public void testIndentation16() { "\t\t;"); String indent= fScanner.computeIndentation(fDocument.getLength() - 1).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation17() { @@ -463,7 +466,7 @@ public void testIndentation17() { ";"); String indent= fScanner.computeIndentation(fDocument.getLength() - 1).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation18() { @@ -472,7 +475,7 @@ public void testIndentation18() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation19() { @@ -481,7 +484,7 @@ public void testIndentation19() { "\t\t}"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation20() { @@ -490,7 +493,7 @@ public void testIndentation20() { "\t\t}"); String indent= fScanner.computeIndentation(fDocument.getLength() - 1).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation21() { @@ -500,7 +503,7 @@ public void testIndentation21() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentation22() { @@ -512,7 +515,7 @@ public void testIndentation22() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); // because of possible dangling else + assertEquals("\t", indent); // because of possible dangling else } public void testIndentation22a() { @@ -524,7 +527,7 @@ public void testIndentation22a() { ""); String indent= fScanner.computeIndentation(fDocument.getLength() - 2).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation22b() { @@ -536,7 +539,7 @@ public void testIndentation22b() { "a"); String indent= fScanner.computeIndentation(fDocument.getLength() - 1).toString(); - Assert.assertEquals("\t", indent); // no dangling else possible + assertEquals("\t", indent); // no dangling else possible } public void testIndentation23() { @@ -545,7 +548,7 @@ public void testIndentation23() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation24() { @@ -556,7 +559,7 @@ public void testIndentation24() { "\t\tnoStuff"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation25() { @@ -567,7 +570,7 @@ public void testIndentation25() { "\t\tnoStuff;\r\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation26() { @@ -578,7 +581,7 @@ public void testIndentation26() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation27() { @@ -589,9 +592,9 @@ public void testIndentation27() { ""); int i= fScanner.findReferencePosition(8); - Assert.assertEquals(1, i); + assertEquals(1, i); String indent= fScanner.computeIndentation(8).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation28() { @@ -602,9 +605,9 @@ public void testIndentation28() { ""); int i= fScanner.findReferencePosition(fDocument.getLength()); - Assert.assertEquals(1, i); + assertEquals(1, i); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation29() { @@ -613,9 +616,9 @@ public void testIndentation29() { "\t\t\t\tfoo();\n"); int i= fScanner.findReferencePosition(fDocument.getLength()); - Assert.assertEquals(2, i); + assertEquals(2, i); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation30() { @@ -624,7 +627,7 @@ public void testIndentation30() { "\t{"); String indent= fScanner.computeIndentation(fDocument.getLength() - 1).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentation31() { @@ -636,7 +639,7 @@ public void testIndentation31() { "\t\tnoStuff"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testIndentation32() { @@ -645,7 +648,7 @@ public void testIndentation32() { "\t\tcase one:\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testAnonymousIndentation1() { @@ -655,7 +658,7 @@ public void testAnonymousIndentation1() { ); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testAnonymousIndentation2() { @@ -671,7 +674,7 @@ public void testAnonymousIndentation2() { // this is bogus, since this is really just an unfinished call argument list - how could we know String indent= fScanner.computeIndentation(fDocument.getLength() - 2).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testExceptionIndentation1() { @@ -684,7 +687,7 @@ public void testExceptionIndentation1() { " new Bla(new CoreExeption(new Status(IStatus.ERROR, JavaPlugin.getPluginId()"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testExceptionIndentation2() { @@ -697,7 +700,7 @@ public void testExceptionIndentation2() { " new Bla(new CoreExeption(new Status(IStatus.ERROR, JavaPlugin.getPluginId(),"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testExceptionIndentation3() { @@ -710,7 +713,7 @@ public void testExceptionIndentation3() { " new char[] { new CoreExeption(new Status(IStatus.ERROR, JavaPlugin.getPluginId(),"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testListAlignmentMethodDeclaration() { @@ -719,7 +722,7 @@ public void testListAlignmentMethodDeclaration() { " int par3, int par4,\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testListAlignmentMethodCall() { @@ -728,7 +731,7 @@ public void testListAlignmentMethodCall() { " par3, par4,\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testListAlignmentArray() { @@ -737,7 +740,7 @@ public void testListAlignmentArray() { " three, four,\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testListAlignmentArray2() { @@ -745,7 +748,7 @@ public void testListAlignmentArray2() { fDocument.set( "\tint[]= new int[] { 1, two,\n"); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals("\t ", indent); + assertEquals("\t ", indent); } @@ -758,7 +761,7 @@ public void testBraceAlignmentOfMultilineDeclaration() { " }"); String indent= fScanner.computeIndentation(fDocument.getLength() - 1).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testBlocksInCaseStatements() { @@ -769,7 +772,7 @@ public void testBlocksInCaseStatements() { ""); String indent= fScanner.computeIndentation(fDocument.getLength()).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testAnonymousTypeBraceNextLine() throws Exception { @@ -780,7 +783,7 @@ public void testAnonymousTypeBraceNextLine() throws Exception { ); String indent= fScanner.computeIndentation(fDocument.getLength() - 2).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } @@ -820,7 +823,7 @@ public void testConditional1() throws Exception { ); String indent= fScanner.computeIndentation(fDocument.getLength() - 8).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } public void testConditional2() throws Exception { @@ -834,7 +837,7 @@ public void testConditional2() throws Exception { ); String indent= fScanner.computeIndentation(fDocument.getLength() - 8).toString(); - Assert.assertEquals(" ", indent); + assertEquals(" ", indent); } @@ -844,19 +847,19 @@ public void testContinuationIndentationOfForStatement() throws Exception { "\t}"); String indent= fScanner.computeIndentation(22).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(27).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(39).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(40).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(5).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); indent= fScanner.computeIndentation(45).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); indent= fScanner.computeIndentation(60).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testContinuationIndentationOfForEachStatement() throws Exception { @@ -867,7 +870,7 @@ public void testContinuationIndentationOfForEachStatement() throws Exception { "\t}"); String indent= fScanner.computeIndentation(44).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentationOfForEachStatement2() throws Exception { @@ -878,7 +881,7 @@ public void testContinuationIndentationOfForEachStatement2() throws Exception { "\t}"); String indent= fScanner.computeIndentation(44).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testContinuationIndentationOfBooleanExpression() throws Exception { @@ -886,55 +889,55 @@ public void testContinuationIndentationOfBooleanExpression() throws Exception { "\tboolean b = a || false;\n"); String indent= fScanner.computeIndentation(20).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(40).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentationOfReturnStatement() throws Exception { fDocument.set("\t\treturn \"I'm such a long string that you have to split me to see the whole line without scrolling around\"\n"); String indent= fScanner.computeIndentation(8).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); indent= fScanner.computeIndentation(21).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); indent= fScanner.computeIndentation(38).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentationOfAssignmentStatement() throws Exception { fDocument.set("\tint i= 5+"); String indent= fScanner.computeIndentation(7).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(10).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentationOfThrowsClause() throws Exception { fDocument.set("\tprivate void thrower() throws java.sql.SQLException, java.io.IOException {"); String indent= fScanner.computeIndentation(23).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(24).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentationOfParentheses() throws Exception { fDocument.set("\tint foo() {\n\treturn \"\".length(\n\t\t);\n\t}"); String indent= fScanner.computeIndentation(34).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentationOfAnnotation() throws Exception { fDocument.set("\t@MyAnnotation(\n\t\tvalue=\"hello\")\n\t\tpublic class ArrayAnnotationBug {\n\t\t}"); String indent= fScanner.computeIndentation(33).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); fDocument.set("\t@org.eclipse.jdt.MyAnnotation(\n\t\tvalue=\"hello\")\n\t\tpublic class ArrayAnnotationBug {\n\t\t}"); indent= fScanner.computeIndentation(49).toString(); - Assert.assertEquals("\t", indent); + assertEquals("\t", indent); } public void testIndentationAfterIfTryCatch() throws Exception { @@ -948,7 +951,7 @@ public void testIndentationAfterIfTryCatch() throws Exception { "\t\t}\n" + "\t}"); String indent= fScanner.computeIndentation(117).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); fDocument.set("\tpublic class Bug237081 {\n" + "\t\tpublic void foo() {\n" + @@ -962,28 +965,28 @@ public void testIndentationAfterIfTryCatch() throws Exception { "\t\t}\n" + "\t}"); indent= fScanner.computeIndentation(167).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentationOfBrackets() throws Exception { fDocument.set("\tprivate void helper2(boolean[] booleans) {\n\t}"); String indent= fScanner.computeIndentation(31).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(30).toString(); - Assert.assertEquals("\t ", indent); + assertEquals("\t ", indent); fDocument.set("\tif (booleans[0]) {\n\t\tString[] aString= new String[]{\"a\", \"b\"};\n\t\tbooleans[5]= true;\n\t}"); indent= fScanner.computeIndentation(16).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(14).toString(); - Assert.assertEquals("\t ", indent); + assertEquals("\t ", indent); indent= fScanner.computeIndentation(30).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); indent= fScanner.computeIndentation(52).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); indent= fScanner.computeIndentation(77).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentationOfStrings1() throws Exception { @@ -995,9 +998,9 @@ public void testContinuationIndentationOfStrings1() throws Exception { " + \" public \"};");//82- String indent= fScanner.computeIndentation(73).toString(); // at the beginning of 4th line - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); indent= fScanner.computeIndentation(84).toString(); // at the beginning of 5th line - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); fDocument.set( " String[] i = new String[] {\n" +//0-28 @@ -1007,7 +1010,7 @@ public void testContinuationIndentationOfStrings1() throws Exception { " \" public\"\n};"); indent= fScanner.computeIndentation(75).toString(); //at the beginning of 4th line - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentationOfStrings2() throws Exception { @@ -1018,7 +1021,7 @@ public void testContinuationIndentationOfStrings2() throws Exception { " + \"string:\\n\" + definedType.toString());\n"); //44- String indent= fScanner.computeIndentation(59).toString(); //before the last + - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentationOfStrings3() throws Exception { @@ -1028,7 +1031,7 @@ public void testContinuationIndentationOfStrings3() throws Exception { " + \"this is the 1st string\";\n");//42- String indent= fScanner.computeIndentation(44).toString();//at the beginning of 3rd line - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentation1() throws Exception { @@ -1036,9 +1039,9 @@ public void testContinuationIndentation1() throws Exception { "\t\t|| thisIsAVeryLongName == 2;"); String indent= fScanner.computeIndentation(68).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); indent= fScanner.computeIndentation(88).toString(); - Assert.assertEquals("\t\t", indent); + assertEquals("\t\t", indent); } public void testContinuationIndentation2() { @@ -1048,7 +1051,7 @@ public void testContinuationIndentation2() { ""); int pos= fScanner.findReferencePosition(29); - Assert.assertEquals(21, pos); + assertEquals(21, pos); } public void testContinuationIndentation3() { @@ -1057,7 +1060,7 @@ public void testContinuationIndentation3() { "\t\treturn a"); String indent= fScanner.computeIndentation(28).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentation4() { @@ -1066,7 +1069,7 @@ public void testContinuationIndentation4() { "\t\treturn a;"); String indent= fScanner.computeIndentation(29).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testContinuationIndentation5() { @@ -1076,7 +1079,7 @@ public void testContinuationIndentation5() { ""); String indent= fScanner.computeIndentation(29).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); } public void testIndentationTryWithResources() throws Exception { @@ -1098,10 +1101,47 @@ public void testIndentationTryWithResources() throws Exception { int offset= s.indexOf("FileReader reader2"); String indent= fScanner.computeIndentation(offset).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); offset= s.indexOf("FileReader reader5"); indent= fScanner.computeIndentation(offset).toString(); - Assert.assertEquals("\t\t\t", indent); + assertEquals("\t\t\t", indent); + } + + public void testDefaultMethod1() { + StringBuffer buf= new StringBuffer(); + buf.append("interface I {\n"); + buf.append(" default void foo (int a) {\n"); + buf.append(" switch(a) {\n"); + buf.append(" case 0: \n"); + buf.append(" break;\n"); + buf.append(" default : \n"); + buf.append(" System.out.println(\"default\");\n"); + buf.append(" }\n"); + buf.append(" }\n"); + buf.append("}\n"); + fDocument.set(buf.toString()); + + int offset= buf.indexOf("default void"); + String indent= fScanner.computeIndentation(offset).toString(); + assertEquals("\t", indent); + + offset= buf.indexOf("default :"); + indent= fScanner.computeIndentation(offset).toString(); + assertEquals("\t\t", indent); + } + + public void testDefaultMethod2() { + StringBuffer buf= new StringBuffer(); + buf.append("interface I {\n"); + buf.append(" default String name() {\n"); + buf.append(" return \"unnamed\";\n"); + buf.append(" }\n"); + buf.append("}\n"); + fDocument.set(buf.toString()); + + int offset= buf.indexOf("default String"); + String indent= fScanner.computeIndentation(offset).toString(); + assertEquals("\t", indent); } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java index f4084a7f84..e1ae0267c0 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -333,6 +337,8 @@ public int nextToken(int start, int bound) { return TokenRPAREN; case SEMICOLON: return TokenSEMICOLON; + case COLON: + return TokenCOLON; case COMMA: return TokenCOMMA; case QUESTIONMARK: diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java index c61741731a..12929a8d4b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -765,8 +769,14 @@ public int findReferencePosition(int offset, int nextToken) { case Symbols.TokenELSE: danglingElse= true; break; - case Symbols.TokenCASE: case Symbols.TokenDEFAULT: + fScanner.nextToken(offset, lineOffset + line.getLength()); + int next= fScanner.nextToken(fScanner.getPosition(), JavaHeuristicScanner.UNBOUND); + if (next != Symbols.TokenCOLON) { + break; + } + //$FALL-THROUGH$ + case Symbols.TokenCASE: if (isFirstTokenOnLine) matchCase= true; break; From 68906597e0b2e7bab42767bb4d21b85794e3634c Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Wed, 26 Jun 2013 11:42:17 +0530 Subject: [PATCH 014/169] Fixed bug 410173: [1.8][quick assist] 'Assign parameter to new field' on parameters of static and default interface methods --- .../jdt/testplugin/JavaProjectHelper.java | 33 +++++ .../ui/tests/core/Java18ProjectTestSetup.java | 62 ++++++++++ .../tests/quickfix/AssistQuickFixTest18.java | 113 ++++++++++++++++++ .../jdt/ui/tests/quickfix/QuickFixTest.java | 7 +- .../text/correction/QuickAssistProcessor.java | 7 ++ 5 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/Java18ProjectTestSetup.java create mode 100644 org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java index 1a7dc739b7..bbbfe93ba0 100644 --- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java +++ b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java @@ -4,6 +4,10 @@ * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. * * Contributors: * IBM Corporation - initial API and implementation @@ -88,6 +92,7 @@ public class JavaProjectHelper { public static final IPath RT_STUBS_15= new Path("testresources/rtstubs15.jar"); public static final IPath RT_STUBS_16= new Path("testresources/rtstubs16.jar"); public static final IPath RT_STUBS_17= new Path("testresources/rtstubs17.jar"); + public static final IPath RT_STUBS_18= new Path("testresources/rtstubs18.jar"); public static final IPath JUNIT_SRC_381= new Path("testresources/junit381-noUI-src.zip"); public static final String JUNIT_SRC_ENCODING= "ISO-8859-1"; @@ -188,6 +193,18 @@ public static IJavaProject createJavaProjectWithJUnitSource(String projectName, return project; } + /** + * Sets the compiler options to 1.8 for the given project. + * + * @param project the java project + * @since 3.9 BETA_JAVA8 + */ + public static void set18CompilerOptions(IJavaProject project) { + Map options= project.getOptions(false); + set18CompilerOptions(options); + project.setOptions(options); + } + /** * Sets the compiler options to 1.7 for the given project. * @param project the java project @@ -228,6 +245,16 @@ public static void set14CompilerOptions(IJavaProject project) { project.setOptions(options); } + /** + * Sets the compiler options to 1.8 + * + * @param options the compiler options to configure + * @since 3.9 BETA_JAVA8 + */ + public static void set18CompilerOptions(Map options) { + JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options); + } + /** * Sets the compiler options to 1.7 * @param options The compiler options to configure @@ -690,6 +717,12 @@ public static IPackageFragmentRoot addRTJar17(IJavaProject jproject) throws Core return addLibrary(jproject, rtJarPath[0], rtJarPath[1], rtJarPath[2]); } + public static IPackageFragmentRoot addRTJar18(IJavaProject jproject) throws CoreException { + IPath[] rtJarPath= findRtJar(RT_STUBS_18); + set18CompilerOptions(jproject); + return addLibrary(jproject, rtJarPath[0], rtJarPath[1], rtJarPath[2]); + } + /** * Adds a variable entry with source attachment to a IJavaProject. * Can return null if variable can not be resolved. diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/Java18ProjectTestSetup.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/Java18ProjectTestSetup.java new file mode 100644 index 0000000000..b22752cdd8 --- /dev/null +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/Java18ProjectTestSetup.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ui.tests.core; + +import junit.framework.Test; + +import org.eclipse.jdt.testplugin.JavaProjectHelper; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; + +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; + +public class Java18ProjectTestSetup extends ProjectTestSetup { + + public static final String PROJECT_NAME18= "TestSetupProject18"; + + public static IJavaProject getProject() { + IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME18); + return JavaCore.create(project); + } + + public static IClasspathEntry[] getDefaultClasspath() throws CoreException { + IPath[] rtJarPath= JavaProjectHelper.findRtJar(JavaProjectHelper.RT_STUBS_18); + return new IClasspathEntry[] { JavaCore.newLibraryEntry(rtJarPath[0], rtJarPath[1], rtJarPath[2], true) }; + } + + public Java18ProjectTestSetup(Test test) { + super(test); + } + + @Override + protected boolean projectExists() { + return getProject().exists(); + } + + @Override + protected IJavaProject createAndInitializeProject() throws CoreException { + IJavaProject javaProject= JavaProjectHelper.createJavaProject(PROJECT_NAME18, "bin"); + javaProject.setRawClasspath(getDefaultClasspath(), null); + JavaProjectHelper.set18CompilerOptions(javaProject); + return javaProject; + } + +} diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java new file mode 100644 index 0000000000..c2c54133cd --- /dev/null +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ui.tests.quickfix; + +import java.util.Hashtable; +import java.util.List; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.jdt.testplugin.JavaProjectHelper; +import org.eclipse.jdt.testplugin.TestOptions; + +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; + +import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility; +import org.eclipse.jdt.internal.corext.template.java.CodeTemplateContextType; + +import org.eclipse.jdt.ui.tests.core.Java18ProjectTestSetup; + +import org.eclipse.jdt.internal.ui.text.correction.AssistContext; + +public class AssistQuickFixTest18 extends QuickFixTest { + + private static final Class THIS= AssistQuickFixTest18.class; + + private IJavaProject fJProject1; + + private IPackageFragmentRoot fSourceFolder; + + public AssistQuickFixTest18(String name) { + super(name); + } + + public static Test suite() { + return setUpTest(new TestSuite(THIS)); + } + + public static Test setUpTest(Test test) { + return new Java18ProjectTestSetup(test); + } + + protected void setUp() throws Exception { + Hashtable options= TestOptions.getDefaultOptions(); + options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE); + options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, "4"); + JavaCore.setOptions(options); + + StubUtility.setCodeTemplate(CodeTemplateContextType.METHODSTUB_ID, "//TODO\n${body_statement}", null); + + fJProject1= Java18ProjectTestSetup.getProject(); + fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); + } + + protected void tearDown() throws Exception { + JavaProjectHelper.clear(fJProject1, Java18ProjectTestSetup.getDefaultClasspath()); + } + + public void testAssignParamToField1() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public interface I {\n"); + buf.append(" default void foo(int x) {\n"); + buf.append(" System.out.println(x);\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("I.java", buf.toString(), false, null); + + int offset= buf.toString().indexOf("x"); + AssistContext context= getCorrectionContext(cu, offset, 0); + assertNoErrors(context); + List proposals= collectAssists(context, false); + + assertNumberOfProposals(proposals, 0); + } + + public void testAssignParamToField2() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public interface I {\n"); + buf.append(" static void bar(int x) {\n"); + buf.append(" System.out.println(x);\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("I.java", buf.toString(), false, null); + + int offset= buf.toString().indexOf("x"); + AssistContext context= getCorrectionContext(cu, offset, 0); + assertNoErrors(context); + List proposals= collectAssists(context, false); + + assertNumberOfProposals(proposals, 0); + } +} diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java index a951c5f505..bb8b3b430e 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -86,6 +90,7 @@ public static Test suite() { suite.addTest(GetterSetterQuickFixTest.suite()); suite.addTest(AssistQuickFixTest.suite()); suite.addTest(AssistQuickFixTest17.suite()); + suite.addTest(AssistQuickFixTest18.suite()); suite.addTest(ChangeNonStaticToStaticTest.suite()); suite.addTest(MarkerResolutionTest.suite()); suite.addTest(JavadocQuickFixTest.suite()); @@ -271,7 +276,7 @@ public IProblemRequestor getProblemRequestor(ICompilationUnit workingCopy) { IProblem[] problems= (IProblem[]) problemsList.toArray(new IProblem[problemsList.size()]); assertNumberOfProblems(nProblems, problems); - + return collectCorrections(cu, problems[0], null); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java index 346512a382..d1ea360088 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Sebastian Davids - Bug 37432 getInvertEqualsProposal @@ -1179,6 +1183,9 @@ private static boolean getAssignParamToFieldProposals(IInvocationContext context ITypeBinding parentType= Bindings.getBindingOfParentType(node); if (parentType != null) { + if (parentType.isInterface()) { + return false; + } // assign to existing fields CompilationUnit root= context.getASTRoot(); IVariableBinding[] declaredFields= parentType.getDeclaredFields(); From 7428ce1386aac016bd3f1c0ec50b2828b32d04f0 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Wed, 26 Jun 2013 17:00:02 +0200 Subject: [PATCH 015/169] Bug 410077: [hovering] Javadoc extracted from generated html is rendered with bullets --- org.eclipse.jdt.ui/JavadocHoverStyleSheet.css | 8 ++++++++ org.eclipse.jdt.ui/JavadocViewStyleSheet.css | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/org.eclipse.jdt.ui/JavadocHoverStyleSheet.css b/org.eclipse.jdt.ui/JavadocHoverStyleSheet.css index 9cea29cefa..95022ae30f 100644 --- a/org.eclipse.jdt.ui/JavadocHoverStyleSheet.css +++ b/org.eclipse.jdt.ui/JavadocHoverStyleSheet.css @@ -32,3 +32,11 @@ strong { font-weight: bold; } em { font-style: italic; } var { font-style: italic; } th { font-weight: bold; } + +/* Workarounds for new Javadoc stylesheet (1.7) */ +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; +} diff --git a/org.eclipse.jdt.ui/JavadocViewStyleSheet.css b/org.eclipse.jdt.ui/JavadocViewStyleSheet.css index fdee9a8d38..154bc920af 100644 --- a/org.eclipse.jdt.ui/JavadocViewStyleSheet.css +++ b/org.eclipse.jdt.ui/JavadocViewStyleSheet.css @@ -35,3 +35,11 @@ strong { font-weight: bold; } em { font-style: italic; } var { font-style: italic; } th { font-weight: bold; } + +/* Workarounds for new Javadoc stylesheet (1.7) */ +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; +} From 06ed563f56d2bec90aed4a3c4087737350a0eb0b Mon Sep 17 00:00:00 2001 From: Dani Megert Date: Wed, 24 Jul 2013 14:19:31 +0200 Subject: [PATCH 016/169] Increased bundle version for Kepler SR1 fixes --- org.eclipse.jdt.ui/META-INF/MANIFEST.MF | 2 +- org.eclipse.jdt.ui/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF index 7cf7ea275a..5ce832e318 100644 --- a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.ui; singleton:=true -Bundle-Version: 3.9.0.qualifier +Bundle-Version: 3.9.1.qualifier Bundle-Activator: org.eclipse.jdt.internal.ui.JavaPlugin Bundle-ActivationPolicy: lazy Bundle-Vendor: %providerName diff --git a/org.eclipse.jdt.ui/pom.xml b/org.eclipse.jdt.ui/pom.xml index 082582463d..9437a665ae 100644 --- a/org.eclipse.jdt.ui/pom.xml +++ b/org.eclipse.jdt.ui/pom.xml @@ -18,6 +18,6 @@ org.eclipse.jdt org.eclipse.jdt.ui - 3.9.0-SNAPSHOT + 3.9.1-SNAPSHOT eclipse-plugin From 98840432b7dc09315cd0db1bfa67b184698b24a3 Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Wed, 24 Jul 2013 15:32:05 +0200 Subject: [PATCH 017/169] Fixed bug 409520: [1.8][quick fix] "Add unimplemented methods" should not create stubs for default methods --- .../jdt/internal/corext/codemanipulation/StubUtility2.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java index 5b2be40713..0f0f334eb6 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java @@ -547,8 +547,10 @@ private static void findUnimplementedInterfaceMethods(ITypeBinding typeBinding, if (impl == null || !Bindings.isVisibleInHierarchy(impl, currPack)) { if (impl != null) allMethods.remove(impl); - toImplement.add(curr); - allMethods.add(curr); + if (Modifier.isAbstract(curr.getModifiers())) { + toImplement.add(curr); + allMethods.add(curr); + } } } ITypeBinding[] superInterfaces= typeBinding.getInterfaces(); From 74903cbca471e4ba0e503ada3a029c76046b5fcf Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Wed, 24 Jul 2013 15:52:11 +0200 Subject: [PATCH 018/169] Fixed bug 409520: [1.8][quick fix] "Add unimplemented methods" should not create stubs for default methods --- .../jdt/ui/tests/quickfix/QuickFixTest18.java | 198 ++++++++++++++++++ .../corext/codemanipulation/StubUtility2.java | 10 +- 2 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java new file mode 100644 index 0000000000..384630cd48 --- /dev/null +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ui.tests.quickfix; + +import java.util.ArrayList; +import java.util.Hashtable; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.jdt.testplugin.JavaProjectHelper; +import org.eclipse.jdt.testplugin.TestOptions; + +import org.eclipse.jface.preference.IPreferenceStore; + +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; + +import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility; +import org.eclipse.jdt.internal.corext.template.java.CodeTemplateContextType; + +import org.eclipse.jdt.ui.PreferenceConstants; +import org.eclipse.jdt.ui.tests.core.Java18ProjectTestSetup; +import org.eclipse.jdt.ui.text.java.correction.CUCorrectionProposal; + +import org.eclipse.jdt.internal.ui.JavaPlugin; + + +public class QuickFixTest18 extends QuickFixTest { + + private static final Class THIS= QuickFixTest18.class; + + private IJavaProject fJProject1; + + private IPackageFragmentRoot fSourceFolder; + + public QuickFixTest18(String name) { + super(name); + } + + public static Test suite() { + return new Java18ProjectTestSetup(new TestSuite(THIS)); + } + + public static Test setUpTest(Test test) { + return new Java18ProjectTestSetup(test); + } + + @Override + protected void setUp() throws Exception { + Hashtable options= TestOptions.getDefaultOptions(); + options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE); + options.put(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, "4"); + options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_NEW_LINE_AFTER_ANNOTATION_ON_LOCAL_VARIABLE, JavaCore.DO_NOT_INSERT); + + + JavaCore.setOptions(options); + + IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore(); + store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false); + + fJProject1= Java18ProjectTestSetup.getProject(); + + StubUtility.setCodeTemplate(CodeTemplateContextType.METHODSTUB_ID, "", null); + StubUtility.setCodeTemplate(CodeTemplateContextType.CONSTRUCTORSTUB_ID, "", null); + + fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); + } + + + @Override + protected void tearDown() throws Exception { + JavaProjectHelper.clear(fJProject1, Java18ProjectTestSetup.getDefaultClasspath()); + } + + public void testUnimplementedMethods() throws Exception { + IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test2;\n"); + buf.append("import java.io.IOException;\n"); + buf.append("public interface Inter {\n"); + buf.append(" int getCount(Object[] o) throws IOException;\n"); + buf.append(" static int staticMethod(Object[] o) throws IOException{return 10;}\n"); + buf.append(" default int defaultMethod(Object[] o) throws IOException{return 20;}\n"); + buf.append("}\n"); + pack2.createCompilationUnit("Inter.java", buf.toString(), false, null); + + + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("import test2.Inter;\n"); + buf.append("public class E implements Inter{\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null); + + CompilationUnit astRoot= getASTRoot(cu); + ArrayList proposals= collectCorrections(cu, astRoot); + assertNumberOfProposals(proposals, 2); + assertCorrectLabels(proposals); + + CUCorrectionProposal proposal= (CUCorrectionProposal)proposals.get(1); + String preview1= getPreviewContent(proposal); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("import test2.Inter;\n"); + buf.append("public abstract class E implements Inter{\n"); + buf.append("}\n"); + String expected1= buf.toString(); + + proposal= (CUCorrectionProposal)proposals.get(0); + String preview2= getPreviewContent(proposal); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("import java.io.IOException;\n"); + buf.append("\n"); + buf.append("import test2.Inter;\n"); + buf.append("public class E implements Inter{\n"); + buf.append("\n"); + buf.append(" @Override\n"); + buf.append(" public int getCount(Object[] o) throws IOException {\n"); + buf.append(" return 0;\n"); + buf.append(" }\n"); + buf.append("}\n"); + String expected2= buf.toString(); + + assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 }); + + } + + public void testUnimplementedMethods2() throws Exception { + StringBuffer buf= new StringBuffer(); + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class MyString implements CharSequence{\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("MyString.java", buf.toString(), false, null); + + CompilationUnit astRoot= getASTRoot(cu); + ArrayList proposals= collectCorrections(cu, astRoot, 3); + assertNumberOfProposals(proposals, 2); + assertCorrectLabels(proposals); + + CUCorrectionProposal proposal= (CUCorrectionProposal)proposals.get(1); + String preview1= getPreviewContent(proposal); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public abstract class MyString implements CharSequence{\n"); + buf.append("}\n"); + String expected1= buf.toString(); + + proposal= (CUCorrectionProposal)proposals.get(0); + String preview2= getPreviewContent(proposal); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class MyString implements CharSequence{\n"); + buf.append("\n"); + buf.append(" @Override\n"); + buf.append(" public char charAt(int arg0) {\n"); + buf.append(" return 0;\n"); + buf.append(" }\n\n"); + buf.append(" @Override\n"); + buf.append(" public int length() {\n"); + buf.append(" return 0;\n"); + buf.append(" }\n\n"); + buf.append(" @Override\n"); + buf.append(" public CharSequence subSequence(int arg0, int arg1) {\n"); + buf.append(" return null;\n"); + buf.append(" }\n"); + buf.append("}\n"); + String expected2= buf.toString(); + + assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 }); + + } +} diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java index 5b2be40713..16efc180fb 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -547,8 +551,10 @@ private static void findUnimplementedInterfaceMethods(ITypeBinding typeBinding, if (impl == null || !Bindings.isVisibleInHierarchy(impl, currPack)) { if (impl != null) allMethods.remove(impl); - toImplement.add(curr); - allMethods.add(curr); + if (Modifier.isAbstract(curr.getModifiers())) { + toImplement.add(curr); + allMethods.add(curr); + } } } ITypeBinding[] superInterfaces= typeBinding.getInterfaces(); From 8b4554a3f35411f7a47be5249688a7b8612c5c66 Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Tue, 30 Jul 2013 14:03:22 +0530 Subject: [PATCH 019/169] Adding JavaModelUtil.is18OrHigher(..) methods --- .../internal/corext/util/JavaModelUtil.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java index 8b850ee089..b46ead9d0f 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java @@ -771,6 +771,10 @@ public static boolean is17OrHigher(String compliance) { return !isVersionLessThan(compliance, JavaCore.VERSION_1_7); } + public static boolean is18OrHigher(String compliance) { + return !isVersionLessThan(compliance, JavaCore.VERSION_1_8); + } + /** * Checks if the given project or workspace has source compliance 1.5 or greater. * @@ -778,8 +782,7 @@ public static boolean is17OrHigher(String compliance) { * @return true if the given project or workspace has source compliance 1.5 or greater. */ public static boolean is50OrHigher(IJavaProject project) { - String source= project != null ? project.getOption(JavaCore.COMPILER_SOURCE, true) : JavaCore.getOption(JavaCore.COMPILER_SOURCE); - return is50OrHigher(source); + return is50OrHigher(getSourceCompliance(project)); } /** @@ -789,8 +792,22 @@ public static boolean is50OrHigher(IJavaProject project) { * @return true if the given project or workspace has source compliance 1.7 or greater. */ public static boolean is17OrHigher(IJavaProject project) { - String source= project != null ? project.getOption(JavaCore.COMPILER_SOURCE, true) : JavaCore.getOption(JavaCore.COMPILER_SOURCE); - return is17OrHigher(source); + return is17OrHigher(getSourceCompliance(project)); + } + + /** + * Checks if the given project or workspace has source compliance 1.8 or greater. + * + * @param project the project to test or null to test the workspace settings + * @return true if the given project or workspace has source compliance 1.8 or + * greater. + */ + public static boolean is18OrHigher(IJavaProject project) { + return is18OrHigher(getSourceCompliance(project)); + } + + private static String getSourceCompliance(IJavaProject project) { + return project != null ? project.getOption(JavaCore.COMPILER_SOURCE, true) : JavaCore.getOption(JavaCore.COMPILER_SOURCE); } /** From 6bbecbb4d316ee5dd3c4e51c1a88a1c2bb22cebe Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Tue, 30 Jul 2013 14:18:47 +0530 Subject: [PATCH 020/169] Refactoring test setup for Java 1.8 --- .../jdt/ui/tests/refactoring/Java18Setup.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/Java18Setup.java diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/Java18Setup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/Java18Setup.java new file mode 100644 index 0000000000..e79d40243d --- /dev/null +++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/Java18Setup.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ui.tests.refactoring; + +import junit.framework.Test; + +import org.eclipse.jdt.testplugin.JavaProjectHelper; + +import org.eclipse.core.runtime.CoreException; + +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragmentRoot; + +public class Java18Setup extends RefactoringTestSetup { + + public Java18Setup(Test test) { + super(test); + } + + /* + * @see org.eclipse.jdt.ui.tests.refactoring.RefactoringTestSetup#addRTJar(org.eclipse.jdt.core.IJavaProject) + */ + @Override + protected IPackageFragmentRoot addRTJar(IJavaProject project) throws CoreException { + return JavaProjectHelper.addRTJar18(project); + } +} From b157000155d6dcf6837f3c283b135bf4c943ba46 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Tue, 30 Jul 2013 15:56:44 +0200 Subject: [PATCH 021/169] identify the different 'default' flags --- .../eclipse/jdt/jeview/properties/JavaElementProperties.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java b/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java index f71da99768..34176dafe6 100644 --- a/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java +++ b/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java @@ -631,7 +631,7 @@ static String getFlagsString(int flags, Class clazz) { rest&= ~ appendFlag(sb, flags, Flags.AccSynchronized, "synchronized "); rest&= ~ appendFlag(sb, flags, Flags.AccBridge, "bridge "); rest&= ~ appendFlag(sb, flags, Flags.AccVarargs, "varargs "); - rest&= ~ appendFlag(sb, flags, Flags.AccDefaultMethod, "default "); + rest&= ~ appendFlag(sb, flags, Flags.AccDefaultMethod, "default(method) "); } else { rest&= ~ appendFlag(sb, flags, Flags.AccSuper, "super "); rest&= ~ appendFlag(sb, flags, Flags.AccVolatile, "volatile "); @@ -646,7 +646,7 @@ static String getFlagsString(int flags, Class clazz) { rest&= ~ appendFlag(sb, flags, Flags.AccEnum, "enum "); rest&= ~ appendFlag(sb, flags, Flags.AccDeprecated, "deprecated "); if (isMethod) { - rest&= ~ appendFlag(sb, flags, Flags.AccAnnotationDefault, "default "); + rest&= ~ appendFlag(sb, flags, Flags.AccAnnotationDefault, "default(annotation) "); } if (rest != 0) From bcbe518c3e39935c3ae38983f2a2a5eec3f3879a Mon Sep 17 00:00:00 2001 From: Dani Megert Date: Wed, 26 Jun 2013 11:26:10 +0200 Subject: [PATCH 022/169] Fixed bug 411641: [content assist] Unnecessary content assist popup after decimal --- .../internal/corext/template/java/JavaContext.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/template/java/JavaContext.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/template/java/JavaContext.java index 53048b68a8..02ca245853 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/template/java/JavaContext.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/template/java/JavaContext.java @@ -217,7 +217,17 @@ public boolean canEvaluate(Template template) { return true; String key= getKey(); - return template.getName().toLowerCase().startsWith(key.toLowerCase()); + return (key.length() > 0 || !isAfterDot()) && template.getName().toLowerCase().startsWith(key.toLowerCase()); + } + + private boolean isAfterDot() { + try { + IDocument document= getDocument(); + int offset= getCompletionOffset(); + return document.get(offset - 1, 1).charAt(0) == '.'; + } catch (BadLocationException e) { + return false; + } } private boolean hasCompatibleContextType(Template template) { From 8a062652c70042ba7882c47a2ce0c3affe2584dc Mon Sep 17 00:00:00 2001 From: Dani Megert Date: Thu, 20 Jun 2013 09:22:46 +0200 Subject: [PATCH 023/169] Fixed bug 410570: ignore eclipse.platform.releng.aggregator from chkpii --- .../chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt b/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt index ab3e758346..ce1806e64a 100644 --- a/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt +++ b/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt @@ -58,6 +58,7 @@ org.eclipse.releng.basebuilder/plugins/org.eclipse.pde.build_3.8.0.v20120523-155 org.eclipse.releng.tools/* eclipse.platform.releng.eclipsebuilder/* eclipse.platform.releng.basebuilder/* +eclipse.platform.releng.aggregator/* org.eclipse.e4.releng/* eclipse.platform.news/* org.eclipse.sdk.tests-feature/* From bd795f54464e4a706b682152caf7cf38bc9d4781 Mon Sep 17 00:00:00 2001 From: Dani Megert Date: Thu, 20 Jun 2013 09:23:47 +0200 Subject: [PATCH 024/169] Fixed bug 410569: Remove 'org.eclipse.releng.tools' from the list of not loaded plug-ins --- .../src/org/eclipse/jdt/text/tests/PluginsNotLoadedTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/PluginsNotLoadedTest.java b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/PluginsNotLoadedTest.java index ee9fc0d172..3dd1a85da1 100644 --- a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/PluginsNotLoadedTest.java +++ b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/PluginsNotLoadedTest.java @@ -51,7 +51,6 @@ public class PluginsNotLoadedTest extends TestCase { "org.eclipse.jdt.astview", "org.eclipse.jdt.jeview", "org.eclipse.reftracker", - "org.eclipse.releng.tools", "org.eclipse.swt.sleak", "org.eclipse.swt.spy", "com.jcraft.jsch", From 25426ba1d7e32e71845b678edfe790d305244d4e Mon Sep 17 00:00:00 2001 From: Dani Megert Date: Fri, 2 Aug 2013 13:39:04 +0200 Subject: [PATCH 025/169] Increased bundle version for Kepler SR1 fixes --- org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF | 2 +- org.eclipse.jdt.ui.tests/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF index 34a724e94e..221450a3b0 100644 --- a/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name Bundle-SymbolicName: org.eclipse.jdt.ui.tests; singleton:=true -Bundle-Version: 3.9.0.qualifier +Bundle-Version: 3.9.1.qualifier Bundle-ClassPath: javauitests.jar Bundle-Activator: org.eclipse.jdt.testplugin.JavaTestPlugin Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.jdt.ui.tests/pom.xml b/org.eclipse.jdt.ui.tests/pom.xml index 70e4938661..2b740082a2 100644 --- a/org.eclipse.jdt.ui.tests/pom.xml +++ b/org.eclipse.jdt.ui.tests/pom.xml @@ -18,7 +18,7 @@ org.eclipse.jdt org.eclipse.jdt.ui.tests - 3.9.0-SNAPSHOT + 3.9.1-SNAPSHOT eclipse-test-plugin From 90928fd72108fbe903e8e236108a88a1b748c694 Mon Sep 17 00:00:00 2001 From: Dani Megert Date: Fri, 2 Aug 2013 13:50:57 +0200 Subject: [PATCH 026/169] Increased bundle version for Kepler SR1 fixes --- org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF | 2 +- org.eclipse.jdt.text.tests/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF index 4c7003a8ef..9dcae77b44 100644 --- a/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name Bundle-SymbolicName: org.eclipse.jdt.text.tests -Bundle-Version: 3.9.0.qualifier +Bundle-Version: 3.9.1.qualifier Bundle-ClassPath: jdttexttests.jar Bundle-Activator: org.eclipse.jdt.text.tests.JdtTextTestPlugin Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.jdt.text.tests/pom.xml b/org.eclipse.jdt.text.tests/pom.xml index 6a6c2c6cd4..21dccc3d61 100644 --- a/org.eclipse.jdt.text.tests/pom.xml +++ b/org.eclipse.jdt.text.tests/pom.xml @@ -18,6 +18,6 @@ org.eclipse.jdt org.eclipse.jdt.text.tests - 3.9.0-SNAPSHOT + 3.9.1-SNAPSHOT eclipse-test-plugin From 9b6dd388609e3db2651daf863440f6280055d31c Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Tue, 20 Aug 2013 18:15:18 +0530 Subject: [PATCH 027/169] Bug 406274: Updated JDTFlags as per Java 1.8 specification --- .../testresources/JDTFlagsTest18.zip | Bin 0 -> 571 bytes .../eclipse/jdt/ui/tests/core/CoreTests.java | 5 + .../jdt/ui/tests/core/JDTFlagsTest18.java | 353 ++++++++++++++++++ .../jdt/internal/corext/util/JdtFlags.java | 75 ++-- 4 files changed, 408 insertions(+), 25 deletions(-) create mode 100644 org.eclipse.jdt.ui.tests/testresources/JDTFlagsTest18.zip create mode 100644 org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java diff --git a/org.eclipse.jdt.ui.tests/testresources/JDTFlagsTest18.zip b/org.eclipse.jdt.ui.tests/testresources/JDTFlagsTest18.zip new file mode 100644 index 0000000000000000000000000000000000000000..29a7d72df2c612d1d7deff4449a039a45f3c2c97 GIT binary patch literal 571 zcmWIWW@Zs#0D<((zfNEVlwbqW1&PVohWY_eH5?4#KsD8Xx^AEnX%508Xc`N6KXwkU>1^LrHoJ-G7iVBZ; zA%9X#W%b$rpA7V7d7WrA>fDoeZ)0bo@dW8-5d|ArXJ@sqa&{{I_4uK%BR_Lhu5-}j zY>8balDFqR?6|Pv?}6%n$pz8P-!+rjmACxwy(`AtyyWfHbtl;aycwD78E}QP3N*|G zpfn`hxfm3{d`1Qd2A6fm|LgUfV}#KvPPcP(fP93x*kT7}ZUfL95F27HN?ajZ!Z7*V bdt^&YGhvpnf>Hwm6A - [quick fix] Fix several visibility issues - https://bugs.eclipse.org/394692 @@ -14,6 +18,7 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; @@ -54,18 +59,42 @@ private JdtFlags(){ public static final int VISIBILITY_CODE_INVALID= -1; + public static boolean isDefaultMethod(IMethodBinding member) { + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=405517#c7 + return !Modifier.isAbstract(member.getModifiers()) && !Modifier.isStatic(member.getModifiers()); + } + + public static boolean isDefaultMethod(IMember member) throws JavaModelException { + return Flags.isDefaultMethod(member.getFlags()); + } + public static boolean isAbstract(IMember member) throws JavaModelException{ - if (isInterfaceOrAnnotationMethod(member)) - return true; - return Flags.isAbstract(member.getFlags()); + int flags= member.getFlags(); + if (!member.isBinary() && isInterfaceOrAnnotationMethod(member)) { + return !Flags.isStatic(flags) && !Flags.isDefaultMethod(flags); + } + return Flags.isAbstract(flags); } public static boolean isAbstract(IMethodBinding member) { - if (isInterfaceOrAnnotationMember(member)) - return true; return Modifier.isAbstract(member.getModifiers()); } + public static boolean isStatic(IMember member) throws JavaModelException { + if (isNestedInterfaceOrAnnotation(member)) + return true; + if (member.getElementType() != IJavaElement.METHOD + && isInterfaceOrAnnotationMember(member)) + return true; + if (isEnum(member) && (member.getElementType() == IJavaElement.FIELD || member.getDeclaringType() != null)) + return true; + return Flags.isStatic(member.getFlags()); + } + + public static boolean isStatic(IMethodBinding methodBinding){ + return Modifier.isStatic(methodBinding.getModifiers()); + } + public static boolean isDeprecated(IMember member) throws JavaModelException{ return Flags.isDeprecated(member.getFlags()); } @@ -75,11 +104,25 @@ public static boolean isFinal(IMember member) throws JavaModelException{ return true; if (isAnonymousType(member)) return true; - if (isEnumConstant(member)) + if (isEnumConstant(member) || isEnumTypeFinal(member)) return true; return Flags.isFinal(member.getFlags()); } + private static boolean isEnumTypeFinal(IMember member) throws JavaModelException { + if (!isEnum(member) && member.getElementType() != IJavaElement.TYPE) + return false; + + // An enum type is implicitly final unless it contains at least one enum constant that has a class body. + IJavaElement[] children= member.getChildren(); + for (IJavaElement child : children) { + if (isEnumConstant((IMember) child) && ((IField) child).getChildren().length != 0) { + return false; + } + } + return true; + } + public static boolean isNative(IMember member) throws JavaModelException{ return Flags.isNative(member.getFlags()); } @@ -141,30 +184,12 @@ public static boolean isPublic(BodyDeclaration bodyDeclaration) { return Modifier.isPublic(bodyDeclaration.getModifiers()); } - public static boolean isStatic(IMember member) throws JavaModelException{ - if (isNestedInterfaceOrAnnotation(member)) - return true; - if (member.getElementType() != IJavaElement.METHOD && isInterfaceOrAnnotationMember(member)) - return true; - if (isEnumConstant(member)) - return true; - return Flags.isStatic(member.getFlags()); - } - - public static boolean isStatic(IMethodBinding methodBinding){ - return Modifier.isStatic(methodBinding.getModifiers()); - } - public static boolean isStatic(IVariableBinding variableBinding){ if (isInterfaceOrAnnotationMember(variableBinding)) return true; return Modifier.isStatic(variableBinding.getModifiers()); } - public static boolean isStrictfp(IMember member) throws JavaModelException{ - return Flags.isStrictfp(member.getFlags()); - } - public static boolean isSynchronized(IMember member) throws JavaModelException{ return Flags.isSynchronized(member.getFlags()); } From d33e8a3bc1db30290261aeb8ff9a7d3bea4282a8 Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Tue, 20 Aug 2013 16:27:14 +0200 Subject: [PATCH 028/169] Bug 411636: Save is very slow (burns cycles in the Package and Project Explorer) --- .../packageview/ContentProviderTests6.java | 22 +++++++++++++++++++ .../PackageExplorerContentProvider.java | 8 ++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests6.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests6.java index 61cbb5ce33..cddd78914b 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests6.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests6.java @@ -29,8 +29,11 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.jdt.core.ElementChangedEvent; +import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IElementChangedListener; +import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; @@ -156,6 +159,25 @@ public void testRemoveFolderFromClassFolder() throws Exception { assertions(); } + public void testChangeClassInProject() throws Exception { + IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src"); + IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null); + ICompilationUnit cu= pack1.createCompilationUnit("A.java", "hello", false, null); + + //send a delta indicating file changed + JavaElementDelta delta= new JavaElementDelta(sourceFolder.getJavaModel()); + delta.changed(cu, IJavaElementDelta.F_CHILDREN); + IElementChangedListener listener= (IElementChangedListener)fProvider; + listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); + + //force events from display + while (fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch()) { + } + + assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$ + assertTrue("Project not refreshed", !fMyPart.wasObjectRefreshed(fJProject)); //$NON-NLS-1$ + } + private void assertions() { assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$ assertTrue("LibraryContainer Refreshed", fMyPart.wasObjectRefreshed(new LibraryContainer(fJProject))); //$NON-NLS-1$ diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java index 6873e3b195..1a121652f5 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java @@ -725,10 +725,12 @@ private boolean processDelta(IJavaElementDelta delta, Collection runna } // http://bugs.eclipse.org/bugs/show_bug.cgi?id=357450 int result= flags & (IJavaElementDelta.F_CONTENT | IJavaElementDelta.F_CHILDREN); - if (result == IJavaElementDelta.F_CONTENT || result == IJavaElementDelta.F_CHILDREN) { - Object parent= internalGetParent(element); + Object parent= internalGetParent(element); + boolean isParentLibrayContainer= parent instanceof LibraryContainer; + if (result == IJavaElementDelta.F_CONTENT || + (result == IJavaElementDelta.F_CHILDREN && isParentLibrayContainer)) { postRefresh(parent, PARENT, element, runnables); - if (parent instanceof LibraryContainer) { + if (isParentLibrayContainer) { IResource resource= element.getResource(); if (resource != null && ((LibraryContainer) parent).getJavaProject().getResource().equals(resource.getProject())) postRefresh(resource, ORIGINAL, element, runnables); From 9f7bf1712cbc2d04a595b924f1ddb319a292361b Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Tue, 20 Aug 2013 21:41:34 +0530 Subject: [PATCH 029/169] Bug 406274: Updated JDTFlags as per Java 1.8 specification - Added isStatic(BodyDeclaration) --- .../jdt/ui/tests/core/JDTFlagsTest18.java | 44 +++++++++++++++++-- .../jdt/internal/corext/util/JdtFlags.java | 40 +++++++++++++++-- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java index 9aacf876ab..31b138e070 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java @@ -15,6 +15,7 @@ package org.eclipse.jdt.ui.tests.core; import java.io.File; +import java.util.Hashtable; import junit.framework.Test; import junit.framework.TestCase; @@ -32,15 +33,24 @@ import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.EnumConstantDeclaration; +import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil; import org.eclipse.jdt.internal.corext.util.JdtFlags; import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider; @@ -77,6 +87,15 @@ protected void tearDown() throws Exception { JavaProjectHelper.clear(fJProject1, Java18ProjectTestSetup.getDefaultClasspath()); } + protected CompilationUnit getCompilationUnitNode(String source) { + ASTParser parser = ASTParser.newParser(AST.JLS8); + parser.setSource(source.toCharArray()); + Hashtable options= JavaCore.getOptions(); + JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options); + parser.setCompilerOptions(options); + CompilationUnit cuNode = (CompilationUnit) parser.createAST(null); + return cuNode; + } public void testIsStaticInSrcFile() throws Exception { IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); @@ -103,6 +122,9 @@ public void testIsStaticInSrcFile() throws Exception { Assert.assertFalse(JdtFlags.isDefaultMethod(binding)); } catch (OperationCanceledException e) { } + + MethodDeclaration methodNode= ASTNodeSearchUtil.getMethodDeclarationNode(method, getCompilationUnitNode(buf.toString())); + Assert.assertTrue(JdtFlags.isStatic(methodNode)); } public void testNestedEnumInInterface() throws Exception { @@ -131,11 +153,15 @@ public void testNestedEnumInInterface() throws Exception { buf.append("}\n"); ICompilationUnit cUnit= pack1.createCompilationUnit("Snippet.java", buf.toString(), false, null); int offset= cUnit.getSource().indexOf("enum CoffeeSize"); - IMember type= (IMember)cUnit.getElementAt(offset); + IJavaElement elem= cUnit.getElementAt(offset); + IMember type= (IMember)elem; Assert.assertTrue(JdtFlags.isStatic(type)); Assert.assertFalse(JdtFlags.isAbstract(type)); Assert.assertFalse(JdtFlags.isDefaultMethod(type)); + EnumDeclaration enumNode= ASTNodeSearchUtil.getEnumDeclarationNode((IType)elem, getCompilationUnitNode(buf.toString())); + Assert.assertTrue(JdtFlags.isStatic(enumNode)); + // testcase for isF an enum Assert.assertFalse(JdtFlags.isFinal(type)); offset= cUnit.getSource().indexOf("enum Colors"); @@ -165,18 +191,27 @@ public void testNestedEnumInClass() throws Exception { ICompilationUnit cUnit= pack1.createCompilationUnit("Snippet.java", buf.toString(), false, null); // testing nested enum int offset= cUnit.getSource().indexOf("enum"); - IMember element= (IMember)cUnit.getElementAt(offset); + CompilationUnit cuNode= getCompilationUnitNode(buf.toString()); + IJavaElement javaElem= cUnit.getElementAt(offset); + IMember element= (IMember)javaElem; Assert.assertTrue(JdtFlags.isStatic(element)); Assert.assertFalse(JdtFlags.isAbstract(element)); Assert.assertFalse(JdtFlags.isDefaultMethod(element)); + EnumDeclaration enumNode= ASTNodeSearchUtil.getEnumDeclarationNode((IType)javaElem, cuNode); + Assert.assertTrue(JdtFlags.isStatic(enumNode)); + // testing enum constant offset= cUnit.getSource().indexOf("RED"); - element= (IMember)cUnit.getElementAt(offset); + javaElem= cUnit.getElementAt(offset); + element= (IMember)javaElem; Assert.assertTrue(JdtFlags.isStatic(element)); Assert.assertFalse(JdtFlags.isAbstract(element)); Assert.assertFalse(JdtFlags.isDefaultMethod(element)); + EnumConstantDeclaration enumConst= ASTNodeSearchUtil.getEnumConstantDeclaration((IField)javaElem, cuNode); + Assert.assertTrue(JdtFlags.isStatic(enumConst)); + // testing enum constant offset= cUnit.getSource().indexOf("Runnable r"); element= (IMember)cUnit.getElementAt(offset); @@ -277,6 +312,9 @@ public void testImplicitAbstractInSrcFile() throws Exception { Assert.assertFalse(JdtFlags.isDefaultMethod(method)); Assert.assertTrue(JdtFlags.isAbstract(method)); + MethodDeclaration methodNode= ASTNodeSearchUtil.getMethodDeclarationNode(method, getCompilationUnitNode(buf.toString())); + Assert.assertFalse(JdtFlags.isStatic(methodNode)); + ASTParser p= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL); p.setProject(pack1.getJavaProject()); p.setBindingsRecovery(true); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java index 0ae3a93319..dd8758d97b 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java @@ -24,8 +24,11 @@ import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.BodyDeclaration; +import org.eclipse.jdt.core.dom.EnumConstantDeclaration; +import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; @@ -80,6 +83,21 @@ public static boolean isAbstract(IMethodBinding member) { return Modifier.isAbstract(member.getModifiers()); } + public static boolean isStatic(BodyDeclaration bodyDeclaration) { + if (isNestedInterfaceOrAnnotation(bodyDeclaration)) + return true; + if (bodyDeclaration.getNodeType() != ASTNode.METHOD_DECLARATION && isInterfaceOrAnnotationMember(bodyDeclaration)) + return true; + if (bodyDeclaration instanceof EnumConstantDeclaration) + return true; + if (bodyDeclaration instanceof EnumDeclaration && + bodyDeclaration.getParent() != null && + (bodyDeclaration.getParent().getNodeType() == ASTNode.TYPE_DECLARATION || + bodyDeclaration.getParent().getNodeType() == ASTNode.ANNOTATION_TYPE_DECLARATION)) + return true; + return Modifier.isStatic(bodyDeclaration.getModifiers()); + } + public static boolean isStatic(IMember member) throws JavaModelException { if (isNestedInterfaceOrAnnotation(member)) return true; @@ -243,12 +261,26 @@ private static boolean isInterfaceOrAnnotationMember(IBinding binding) { } private static boolean isInterfaceOrAnnotationMember(BodyDeclaration bodyDeclaration) { - boolean isInterface= (bodyDeclaration.getParent() instanceof TypeDeclaration) && - ((TypeDeclaration)bodyDeclaration.getParent()).isInterface(); - boolean isAnnotation= bodyDeclaration.getParent() instanceof AnnotationTypeDeclaration; - return isInterface || isAnnotation; + ASTNode parent= bodyDeclaration.getParent(); + if (parent != null && parent instanceof BodyDeclaration) { + return isInterfaceOrAnnotation((BodyDeclaration) parent); + } + return false; + } + + private static boolean isInterfaceOrAnnotation(BodyDeclaration bodyDeclaration) { + boolean isInterface= (bodyDeclaration instanceof TypeDeclaration) && ((TypeDeclaration) bodyDeclaration).isInterface(); + boolean isAnnotation= bodyDeclaration instanceof AnnotationTypeDeclaration; + return isInterface || isAnnotation; } + private static boolean isNestedInterfaceOrAnnotation(BodyDeclaration bodyDeclaration) { + ASTNode parent= bodyDeclaration.getParent(); + return parent != null && + (parent.getNodeType() == ASTNode.TYPE_DECLARATION || parent.getNodeType() == ASTNode.ANNOTATION_TYPE_DECLARATION) && + isInterfaceOrAnnotation(bodyDeclaration); + } + private static boolean isNestedInterfaceOrAnnotation(IMember member) throws JavaModelException{ return member.getElementType() == IJavaElement.TYPE && member.getDeclaringType() != null && From 38330b7ef90447fa12ba22332c94c02d0ef62306 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Tue, 20 Aug 2013 21:01:26 +0200 Subject: [PATCH 030/169] Bug 405704: [1.8][render] Adornment for default methods and annotation type elements with default made default brown to better distinguish from abstract --- .../icons/full/ovr16/default_co.gif | Bin 102 -> 102 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/org.eclipse.jdt.ui/icons/full/ovr16/default_co.gif b/org.eclipse.jdt.ui/icons/full/ovr16/default_co.gif index 7228f024017a39b1ebc9ccb3481c7d8c1fa816a9..1f919652084b6ac6a9a71470f310f90bba24bd5a 100644 GIT binary patch literal 102 zcmZ?wbhEHbWM^P!*v!Dt=_5ZO-n`|1%Zg^-P1ADz69S4qSr{1@m>6^zfB<9$1B-Bg Zh(q^;1rrj|Ki-($y1=|3Le+)A8URmnH0A&R literal 102 zcmZ?wbhEHbWM^P!*v!E2|Nno@ Date: Tue, 20 Aug 2013 21:34:17 +0200 Subject: [PATCH 031/169] added BETA blurb --- .../src/org/eclipse/jdt/astview/TreeInfoCollector.java | 4 ++++ .../eclipse/jdt/jeview/properties/JavaElementProperties.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java index 800d64dbba..a8a4754d47 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/TreeInfoCollector.java @@ -4,6 +4,10 @@ * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. * * Contributors: * IBM Corporation - initial API and implementation diff --git a/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java b/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java index 34176dafe6..5a30784609 100644 --- a/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java +++ b/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ From 8347634ab8f8c99021cfbd82ba6b5b149d7df22b Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Wed, 21 Aug 2013 11:06:34 +0530 Subject: [PATCH 032/169] Bug 406274: Updated JDTFlags and testcases with review comments --- .../jdt/ui/tests/core/JDTFlagsTest18.java | 53 +++++++++++++++++-- .../jdt/internal/corext/util/JdtFlags.java | 16 +++--- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java index 31b138e070..e47c75fc59 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java @@ -157,7 +157,6 @@ public void testNestedEnumInInterface() throws Exception { IMember type= (IMember)elem; Assert.assertTrue(JdtFlags.isStatic(type)); Assert.assertFalse(JdtFlags.isAbstract(type)); - Assert.assertFalse(JdtFlags.isDefaultMethod(type)); EnumDeclaration enumNode= ASTNodeSearchUtil.getEnumDeclarationNode((IType)elem, getCompilationUnitNode(buf.toString())); Assert.assertTrue(JdtFlags.isStatic(enumNode)); @@ -196,7 +195,6 @@ public void testNestedEnumInClass() throws Exception { IMember element= (IMember)javaElem; Assert.assertTrue(JdtFlags.isStatic(element)); Assert.assertFalse(JdtFlags.isAbstract(element)); - Assert.assertFalse(JdtFlags.isDefaultMethod(element)); EnumDeclaration enumNode= ASTNodeSearchUtil.getEnumDeclarationNode((IType)javaElem, cuNode); Assert.assertTrue(JdtFlags.isStatic(enumNode)); @@ -207,7 +205,6 @@ public void testNestedEnumInClass() throws Exception { element= (IMember)javaElem; Assert.assertTrue(JdtFlags.isStatic(element)); Assert.assertFalse(JdtFlags.isAbstract(element)); - Assert.assertFalse(JdtFlags.isDefaultMethod(element)); EnumConstantDeclaration enumConst= ASTNodeSearchUtil.getEnumConstantDeclaration((IField)javaElem, cuNode); Assert.assertTrue(JdtFlags.isStatic(enumConst)); @@ -252,7 +249,7 @@ public void testIsStaticInBinaryFile() throws Exception { Assert.assertFalse(JdtFlags.isDefaultMethod(method)); } - public void testIsDefaultInSrcFile() throws Exception { + public void testIsDefaultInInterface() throws Exception { IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); StringBuffer buf= new StringBuffer(); buf.append("package test1;\n"); @@ -297,6 +294,54 @@ public void testIsDefaultInBinaryFile() throws Exception { Assert.assertFalse(JdtFlags.isAbstract(method)); } + public void testIsDefaultInClass() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("class Snippet {\n"); + buf.append(" public String notDefaultMethod(){\n"); + buf.append(" return \"not default\";\n"); + buf.append(" }\n"); + buf.append(" public @interface A_test109 {\n"); + buf.append(" public String notDefaultIntMet() default \"not default\";\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cUnit= pack1.createCompilationUnit("Snippet.java", buf.toString(), false, null); + int offset= cUnit.getSource().indexOf("public String notDefaultMethod"); + IMethod method= (IMethod)cUnit.getElementAt(offset); + Assert.assertFalse(JdtFlags.isStatic(method)); + Assert.assertFalse(JdtFlags.isAbstract(method)); + Assert.assertFalse(JdtFlags.isDefaultMethod(method)); + + ASTParser p= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL); + p.setProject(pack1.getJavaProject()); + p.setBindingsRecovery(true); + try { + IMethodBinding binding= (IMethodBinding)p.createBindings(new IJavaElement[] { method }, null)[0]; + Assert.assertFalse(JdtFlags.isStatic(binding)); + Assert.assertFalse(JdtFlags.isAbstract(binding)); + Assert.assertFalse(JdtFlags.isDefaultMethod(binding)); + } catch (OperationCanceledException e) { + } + + offset= cUnit.getSource().indexOf("public String notDefaultIntMet"); + method= (IMethod)cUnit.getElementAt(offset); + Assert.assertFalse(JdtFlags.isStatic(method)); + Assert.assertTrue(JdtFlags.isAbstract(method)); + Assert.assertFalse(JdtFlags.isDefaultMethod(method)); + + p= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL); + p.setProject(pack1.getJavaProject()); + p.setBindingsRecovery(true); + try { + IMethodBinding binding= (IMethodBinding)p.createBindings(new IJavaElement[] { method }, null)[0]; + Assert.assertFalse(JdtFlags.isStatic(binding)); + Assert.assertTrue(JdtFlags.isAbstract(binding)); + Assert.assertFalse(JdtFlags.isDefaultMethod(binding)); + } catch (OperationCanceledException e) { + } + } + public void testImplicitAbstractInSrcFile() throws Exception { IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); StringBuffer buf= new StringBuffer(); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java index dd8758d97b..396f61d22c 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java @@ -62,13 +62,18 @@ private JdtFlags(){ public static final int VISIBILITY_CODE_INVALID= -1; - public static boolean isDefaultMethod(IMethodBinding member) { + public static boolean isDefaultMethod(IMethodBinding method) { + int modifiers= method.getModifiers(); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=405517#c7 - return !Modifier.isAbstract(member.getModifiers()) && !Modifier.isStatic(member.getModifiers()); + ITypeBinding declaringClass= method.getDeclaringClass(); + if (declaringClass != null && declaringClass.isInterface()) { + return !Modifier.isAbstract(modifiers) && !Modifier.isStatic(modifiers); + } + return false; } - public static boolean isDefaultMethod(IMember member) throws JavaModelException { - return Flags.isDefaultMethod(member.getFlags()); + public static boolean isDefaultMethod(IMethod method) throws JavaModelException { + return Flags.isDefaultMethod(method.getFlags()); } public static boolean isAbstract(IMember member) throws JavaModelException{ @@ -128,9 +133,8 @@ public static boolean isFinal(IMember member) throws JavaModelException{ } private static boolean isEnumTypeFinal(IMember member) throws JavaModelException { - if (!isEnum(member) && member.getElementType() != IJavaElement.TYPE) + if (!(isEnum(member) && member.getElementType() == IJavaElement.TYPE)) return false; - // An enum type is implicitly final unless it contains at least one enum constant that has a class body. IJavaElement[] children= member.getChildren(); for (IJavaElement child : children) { From c0dc4450f150c455b7b6f4c71630e39df0816a3f Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Wed, 21 Aug 2013 12:14:16 +0200 Subject: [PATCH 033/169] removed unnessary null check --- .../org/eclipse/jdt/internal/corext/util/JdtFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java index 396f61d22c..f8d613dfe9 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java @@ -66,7 +66,7 @@ public static boolean isDefaultMethod(IMethodBinding method) { int modifiers= method.getModifiers(); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=405517#c7 ITypeBinding declaringClass= method.getDeclaringClass(); - if (declaringClass != null && declaringClass.isInterface()) { + if (declaringClass.isInterface()) { return !Modifier.isAbstract(modifiers) && !Modifier.isStatic(modifiers); } return false; From 5806dfa2c156de6f156f69d1feb051ca43f3f2e1 Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Wed, 21 Aug 2013 16:03:53 +0530 Subject: [PATCH 034/169] Bug 406274: Updated JdtFlags#isStatic(BodyDeclaration) and tests after review --- .../jdt/ui/tests/core/JDTFlagsTest18.java | 44 +++++++++++++++++++ .../jdt/internal/corext/util/JdtFlags.java | 27 +++++------- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java index e47c75fc59..35670416c0 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java @@ -44,9 +44,11 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.EnumConstantDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; +import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; @@ -127,6 +129,24 @@ public void testIsStaticInSrcFile() throws Exception { Assert.assertTrue(JdtFlags.isStatic(methodNode)); } + public void testNestedEnumInEnum() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("\n"); + buf.append("enum Snippet {\n"); + buf.append(" A;\n"); + buf.append(" enum E {\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cUnit= pack1.createCompilationUnit("Snippet.java", buf.toString(), false, null); + int offset= cUnit.getSource().indexOf("enum E"); + IJavaElement elem= cUnit.getElementAt(offset); + EnumDeclaration enumNode= ASTNodeSearchUtil.getEnumDeclarationNode((IType)elem, getCompilationUnitNode(buf.toString())); + Assert.assertTrue(JdtFlags.isStatic(enumNode)); + Assert.assertTrue(JdtFlags.isStatic((IType)elem)); + } + public void testNestedEnumInInterface() throws Exception { IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); StringBuffer buf= new StringBuffer(); @@ -433,4 +453,28 @@ public void testImplicitAbstractInBinaryFile() throws Exception { Assert.assertTrue(JdtFlags.isAbstract(method)); } + public void testIsStaticAnnotationType() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("\n"); + buf.append("public @interface Snippet {\n"); + buf.append(" int i= 0;\n"); + buf.append(" public String name();\n"); + buf.append("}\n"); + ICompilationUnit cUnit= pack1.createCompilationUnit("Snippet.java", buf.toString(), false, null); + CompilationUnit cuNode= getCompilationUnitNode(buf.toString()); + + int offset= cUnit.getSource().indexOf("i="); + IJavaElement elem= cUnit.getElementAt(offset); + FieldDeclaration field= ASTNodeSearchUtil.getFieldDeclarationNode((IField)elem, cuNode); + Assert.assertTrue(JdtFlags.isStatic(field)); + Assert.assertTrue(JdtFlags.isStatic((IField)elem)); + + offset= cUnit.getSource().indexOf("name"); + elem= cUnit.getElementAt(offset); + AnnotationTypeMemberDeclaration annotationMember= ASTNodeSearchUtil.getAnnotationTypeMemberDeclarationNode((IMethod)elem, cuNode); + Assert.assertFalse(JdtFlags.isStatic(annotationMember)); + Assert.assertFalse(JdtFlags.isStatic((IMethod)elem)); + } } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java index f8d613dfe9..19d9c285b9 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JdtFlags.java @@ -25,6 +25,7 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.EnumConstantDeclaration; @@ -91,14 +92,13 @@ public static boolean isAbstract(IMethodBinding member) { public static boolean isStatic(BodyDeclaration bodyDeclaration) { if (isNestedInterfaceOrAnnotation(bodyDeclaration)) return true; - if (bodyDeclaration.getNodeType() != ASTNode.METHOD_DECLARATION && isInterfaceOrAnnotationMember(bodyDeclaration)) + int nodeType= bodyDeclaration.getNodeType(); + if (!(nodeType == ASTNode.METHOD_DECLARATION || nodeType == ASTNode.ANNOTATION_TYPE_MEMBER_DECLARATION) && + isInterfaceOrAnnotationMember(bodyDeclaration)) return true; if (bodyDeclaration instanceof EnumConstantDeclaration) return true; - if (bodyDeclaration instanceof EnumDeclaration && - bodyDeclaration.getParent() != null && - (bodyDeclaration.getParent().getNodeType() == ASTNode.TYPE_DECLARATION || - bodyDeclaration.getParent().getNodeType() == ASTNode.ANNOTATION_TYPE_DECLARATION)) + if (bodyDeclaration instanceof EnumDeclaration && bodyDeclaration.getParent() instanceof AbstractTypeDeclaration) return true; return Modifier.isStatic(bodyDeclaration.getModifiers()); } @@ -265,24 +265,17 @@ private static boolean isInterfaceOrAnnotationMember(IBinding binding) { } private static boolean isInterfaceOrAnnotationMember(BodyDeclaration bodyDeclaration) { - ASTNode parent= bodyDeclaration.getParent(); - if (parent != null && parent instanceof BodyDeclaration) { - return isInterfaceOrAnnotation((BodyDeclaration) parent); - } - return false; + return isInterfaceOrAnnotation(bodyDeclaration.getParent()); } - private static boolean isInterfaceOrAnnotation(BodyDeclaration bodyDeclaration) { - boolean isInterface= (bodyDeclaration instanceof TypeDeclaration) && ((TypeDeclaration) bodyDeclaration).isInterface(); - boolean isAnnotation= bodyDeclaration instanceof AnnotationTypeDeclaration; + private static boolean isInterfaceOrAnnotation(ASTNode node) { + boolean isInterface= (node instanceof TypeDeclaration) && ((TypeDeclaration) node).isInterface(); + boolean isAnnotation= node instanceof AnnotationTypeDeclaration; return isInterface || isAnnotation; } private static boolean isNestedInterfaceOrAnnotation(BodyDeclaration bodyDeclaration) { - ASTNode parent= bodyDeclaration.getParent(); - return parent != null && - (parent.getNodeType() == ASTNode.TYPE_DECLARATION || parent.getNodeType() == ASTNode.ANNOTATION_TYPE_DECLARATION) && - isInterfaceOrAnnotation(bodyDeclaration); + return bodyDeclaration.getParent() instanceof AbstractTypeDeclaration && isInterfaceOrAnnotation(bodyDeclaration); } private static boolean isNestedInterfaceOrAnnotation(IMember member) throws JavaModelException{ From 8d44c89b323bc2537b01957eaddf25d53426a154 Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Thu, 29 Aug 2013 09:03:55 +0530 Subject: [PATCH 035/169] Fixed bug 416016: [1.8][preferences] Add support for target 1.8 in the compiler preference page --- .../ComplianceConfigurationBlock.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java index dc0cec257b..1042fc78c6 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java @@ -331,16 +331,17 @@ public void widgetSelected(SelectionEvent e) { int indent= LayoutUtil.getIndent(); - String[] versions= new String[] { VERSION_CLDC_1_1, VERSION_1_1, VERSION_1_2, VERSION_1_3, VERSION_1_4, VERSION_1_5, VERSION_1_6, VERSION_1_7 }; + String[] versions= new String[] { VERSION_CLDC_1_1, VERSION_1_1, VERSION_1_2, VERSION_1_3, VERSION_1_4, VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8 }; String[] versionsLabels= new String[] { - PreferencesMessages.ComplianceConfigurationBlock_versionCLDC11, - PreferencesMessages.ComplianceConfigurationBlock_version11, - PreferencesMessages.ComplianceConfigurationBlock_version12, - PreferencesMessages.ComplianceConfigurationBlock_version13, - PreferencesMessages.ComplianceConfigurationBlock_version14, - PreferencesMessages.ComplianceConfigurationBlock_version15, - PreferencesMessages.ComplianceConfigurationBlock_version16, - PreferencesMessages.ComplianceConfigurationBlock_version17 + PreferencesMessages.ComplianceConfigurationBlock_versionCLDC11, + PreferencesMessages.ComplianceConfigurationBlock_version11, + PreferencesMessages.ComplianceConfigurationBlock_version12, + PreferencesMessages.ComplianceConfigurationBlock_version13, + PreferencesMessages.ComplianceConfigurationBlock_version14, + PreferencesMessages.ComplianceConfigurationBlock_version15, + PreferencesMessages.ComplianceConfigurationBlock_version16, + PreferencesMessages.ComplianceConfigurationBlock_version17, + PreferencesMessages.ComplianceConfigurationBlock_version18 }; boolean showJsr14= ComplianceConfigurationBlock.VERSION_JSR14.equals(getValue(PREF_CODEGEN_TARGET_PLATFORM)); From fc4e5a3a5f47e2101346d78315f2fd9d3e75841c Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Tue, 3 Sep 2013 15:36:04 +0200 Subject: [PATCH 036/169] documented selection markers --- .../tests/refactoring/AbstractSelectionTestCase.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java index 53957f0269..d28f053a65 100644 --- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java +++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -39,6 +43,11 @@ import org.eclipse.jdt.ui.tests.refactoring.infra.AbstractCUTestCase; import org.eclipse.jdt.ui.tests.refactoring.infra.RefactoringTestPlugin; +/** + * Selection in the file read by {@link #getFileContents(InputStream)} is marked with + * /*]*/ and /*[*/ (excluding the marker comments) or + * /*[*/ and /*]*/ (including comments). + */ public abstract class AbstractSelectionTestCase extends AbstractCUTestCase { public static final String SQUARE_BRACKET_OPEN= "/*[*/"; From a0083303847a64448c6ac4ab2067aca0fedd69de Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Tue, 10 Sep 2013 20:45:44 +0530 Subject: [PATCH 037/169] Fixed bug: [preferences] Incorrect enablement of 'Inline finally blocks' preference option --- .../preferences/ComplianceConfigurationBlock.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java index 1042fc78c6..1f8ec81d53 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java @@ -568,6 +568,7 @@ public void refreshComplianceSettings() { updateControls(); updateComplianceEnableState(); validateComplianceStatus(); + updateInlineJSREnableState(); } } } @@ -747,21 +748,25 @@ private void updateInlineJSREnableState() { boolean enabled= JavaModelUtil.isVersionLessThan(target, VERSION_1_5); Button checkBox= getCheckBox(PREF_CODEGEN_INLINE_JSR_BYTECODE); + boolean wasCheckBoxEnabled= checkBox.isEnabled(); checkBox.setEnabled(enabled); if (!enabled) { String val= getValue(PREF_CODEGEN_INLINE_JSR_BYTECODE); - fRememberedUserCompliance[IDX_INLINE_JSR_BYTECODE]= val; + if (wasCheckBoxEnabled) + fRememberedUserCompliance[IDX_INLINE_JSR_BYTECODE]= val; if (!ENABLED.equals(val)) { setValue(PREF_CODEGEN_INLINE_JSR_BYTECODE, ENABLED); updateCheckBox(checkBox); } } else { - String val= fRememberedUserCompliance[IDX_INLINE_JSR_BYTECODE]; - if (!ENABLED.equals(val)) { - setValue(PREF_CODEGEN_INLINE_JSR_BYTECODE, val); - updateCheckBox(checkBox); + if (!wasCheckBoxEnabled) { + String val= fRememberedUserCompliance[IDX_INLINE_JSR_BYTECODE]; + if (!ENABLED.equals(val)) { + setValue(PREF_CODEGEN_INLINE_JSR_BYTECODE, val); + updateCheckBox(checkBox); + } } } } From 09d493bb3e41114936f7d7348794820e78a073a1 Mon Sep 17 00:00:00 2001 From: Manju Mathew Date: Fri, 13 Sep 2013 15:16:31 +0200 Subject: [PATCH 038/169] Fixed bug 415846: [1.8] UI option to control generation of MethodParameters attribute in class files --- .../ComplianceConfigurationBlock.java | 50 +++++++++++++++++-- .../ui/preferences/PreferencesMessages.java | 1 + .../PreferencesMessages.properties | 1 + 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java index 1f8ec81d53..4fd5429a60 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java @@ -106,6 +106,7 @@ public class ComplianceConfigurationBlock extends OptionsConfigurationBlock { private static final Key PREF_LINE_NUMBER_ATTR= getJDTCoreKey(JavaCore.COMPILER_LINE_NUMBER_ATTR); private static final Key PREF_SOURCE_FILE_ATTR= getJDTCoreKey(JavaCore.COMPILER_SOURCE_FILE_ATTR); private static final Key PREF_CODEGEN_UNUSED_LOCAL= getJDTCoreKey(JavaCore.COMPILER_CODEGEN_UNUSED_LOCAL); + private static final Key PREF_CODEGEN_METHOD_PARAMETERS_ATTR= getJDTCoreKey(JavaCore.COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR); // values private static final String GENERATE= JavaCore.GENERATE; @@ -142,14 +143,16 @@ public class ComplianceConfigurationBlock extends OptionsConfigurationBlock { private PixelConverter fPixelConverter; /** - * Remembered user compliance (stored when {@link #INTR_DEFAULT_COMPLIANCE} is switched to {@link #DEFAULT_CONF}). - * Elements are identified by IDX_* constants. + * Remembered user compliance (stored when {@link #INTR_DEFAULT_COMPLIANCE} is switched to + * {@link #DEFAULT_CONF}). Elements are identified by IDX_* constants. + * * @see #IDX_ASSERT_AS_IDENTIFIER * @see #IDX_ENUM_AS_IDENTIFIER * @see #IDX_SOURCE_COMPATIBILITY * @see #IDX_CODEGEN_TARGET_PLATFORM * @see #IDX_COMPLIANCE * @see #IDX_INLINE_JSR_BYTECODE + * @see #IDX_METHOD_PARAMETERS_ATTR */ private String[] fRememberedUserCompliance; @@ -162,6 +165,7 @@ public class ComplianceConfigurationBlock extends OptionsConfigurationBlock { * @see #IDX_CODEGEN_TARGET_PLATFORM * @see #IDX_COMPLIANCE * @see #IDX_INLINE_JSR_BYTECODE + * @see #IDX_METHOD_PARAMETERS_ATTR */ private String[] fOriginalStoredCompliance; @@ -171,6 +175,7 @@ public class ComplianceConfigurationBlock extends OptionsConfigurationBlock { private static final int IDX_CODEGEN_TARGET_PLATFORM= 3; private static final int IDX_COMPLIANCE= 4; private static final int IDX_INLINE_JSR_BYTECODE= 5; + private static final int IDX_METHOD_PARAMETERS_ATTR= 6; private IStatus fComplianceStatus; @@ -197,6 +202,7 @@ public ComplianceConfigurationBlock(IStatusChangeListener context, IProject proj getValue(PREF_CODEGEN_TARGET_PLATFORM), getValue(PREF_COMPLIANCE), getValue(PREF_CODEGEN_INLINE_JSR_BYTECODE), + getValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR) }; } @@ -204,7 +210,7 @@ private static Key[] getKeys(boolean projectSpecific) { Key[] keys= new Key[] { PREF_LOCAL_VARIABLE_ATTR, PREF_LINE_NUMBER_ATTR, PREF_SOURCE_FILE_ATTR, PREF_CODEGEN_UNUSED_LOCAL, PREF_CODEGEN_INLINE_JSR_BYTECODE, INTR_DEFAULT_COMPLIANCE, PREF_COMPLIANCE, PREF_SOURCE_COMPATIBILITY, - PREF_CODEGEN_TARGET_PLATFORM, PREF_PB_ASSERT_AS_IDENTIFIER, PREF_PB_ENUM_AS_IDENTIFIER + PREF_CODEGEN_TARGET_PLATFORM, PREF_PB_ASSERT_AS_IDENTIFIER, PREF_PB_ENUM_AS_IDENTIFIER, PREF_CODEGEN_METHOD_PARAMETERS_ATTR }; if (projectSpecific) { @@ -402,6 +408,9 @@ public void widgetSelected(SelectionEvent e) { label= PreferencesMessages.ComplianceConfigurationBlock_codegen_inline_jsr_bytecode_label; addCheckBox(group, label, PREF_CODEGEN_INLINE_JSR_BYTECODE, enableDisableValues, 0); + label= PreferencesMessages.ComplianceConfigurationBlock_codegen_method_parameters_attr; + addCheckBox(group, label, PREF_CODEGEN_METHOD_PARAMETERS_ATTR, generateValues, 0); + Composite infoComposite= new Composite(fControlsComposite, SWT.NONE); infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); infoComposite.setLayout(new GridLayout(2, false)); @@ -509,6 +518,7 @@ protected void validateSettings(Key changedKey, String oldValue, String newValue } updateControls(); updateInlineJSREnableState(); + updatePreserveMethodParamNamesEnableState(); updateAssertEnumAsIdentifierEnableState(); fComplianceStatus= validateCompliance(); } else if (PREF_PB_ENUM_AS_IDENTIFIER.equals(changedKey) || @@ -523,6 +533,7 @@ protected void validateSettings(Key changedKey, String oldValue, String newValue updateComplianceEnableState(); updateAssertEnumAsIdentifierEnableState(); updateInlineJSREnableState(); + updatePreserveMethodParamNamesEnableState(); fComplianceStatus= validateCompliance(); validateComplianceStatus(); } @@ -539,6 +550,7 @@ public void refreshComplianceSettings() { getOriginalStoredValue(PREF_CODEGEN_TARGET_PLATFORM), getOriginalStoredValue(PREF_COMPLIANCE), getOriginalStoredValue(PREF_CODEGEN_INLINE_JSR_BYTECODE), + getOriginalStoredValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR) }; } else { @@ -549,6 +561,7 @@ public void refreshComplianceSettings() { getOriginalStoredValue(PREF_CODEGEN_TARGET_PLATFORM), getOriginalStoredValue(PREF_COMPLIANCE), getOriginalStoredValue(PREF_CODEGEN_INLINE_JSR_BYTECODE), + getOriginalStoredValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR) }; if (!Arrays.equals(fOriginalStoredCompliance, storedCompliance)) { // compliance changed on disk -> override user modifications @@ -561,6 +574,7 @@ public void refreshComplianceSettings() { setValue(PREF_CODEGEN_TARGET_PLATFORM, storedCompliance[IDX_CODEGEN_TARGET_PLATFORM]); setValue(PREF_COMPLIANCE, storedCompliance[IDX_COMPLIANCE]); setValue(PREF_CODEGEN_INLINE_JSR_BYTECODE, storedCompliance[IDX_INLINE_JSR_BYTECODE]); + setValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR, storedCompliance[IDX_METHOD_PARAMETERS_ATTR]); } @@ -569,6 +583,7 @@ public void refreshComplianceSettings() { updateComplianceEnableState(); validateComplianceStatus(); updateInlineJSREnableState(); + updatePreserveMethodParamNamesEnableState(); } } } @@ -771,6 +786,33 @@ private void updateInlineJSREnableState() { } } + private void updatePreserveMethodParamNamesEnableState() { + String target= getValue(PREF_CODEGEN_TARGET_PLATFORM); + boolean enabled= JavaModelUtil.is18OrHigher(target); + Button checkBox= getCheckBox(PREF_CODEGEN_METHOD_PARAMETERS_ATTR); + boolean wasCheckBoxEnabled= checkBox.isEnabled(); + checkBox.setEnabled(enabled); + + if (enabled) { + if (!wasCheckBoxEnabled) { + String val= fRememberedUserCompliance[IDX_METHOD_PARAMETERS_ATTR]; + if (GENERATE.equals(val)) { + setValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR, val); + updateCheckBox(checkBox); + } + } + } else { + String val= getValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR); + if (wasCheckBoxEnabled) + fRememberedUserCompliance[IDX_METHOD_PARAMETERS_ATTR]= val; + + if (GENERATE.equals(val)) { + setValue(PREF_CODEGEN_METHOD_PARAMETERS_ATTR, DO_NOT_GENERATE); + updateCheckBox(checkBox); + } + } + } + /** * Sets the default compliance values derived from the chosen level or restores the user * compliance settings. @@ -858,6 +900,7 @@ private void updateComplianceDefaultSettings(boolean rememberOld, String oldComp } else { updateInlineJSREnableState(); updateAssertEnumAsIdentifierEnableState(); + updatePreserveMethodParamNamesEnableState(); return; } } @@ -868,6 +911,7 @@ private void updateComplianceDefaultSettings(boolean rememberOld, String oldComp updateControls(); updateInlineJSREnableState(); updateAssertEnumAsIdentifierEnableState(); + updatePreserveMethodParamNamesEnableState(); } /** diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java index 94402329bf..01c70cded9 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java @@ -496,6 +496,7 @@ private PreferencesMessages() { public static String ComplianceConfigurationBlock_codegen_unused_local_label; public static String ComplianceConfigurationBlock_cldc11_requires_source13_compliance_se14; public static String ComplianceConfigurationBlock_codegen_inline_jsr_bytecode_label; + public static String ComplianceConfigurationBlock_codegen_method_parameters_attr; public static String ComplianceConfigurationBlock_compiler_compliance_label; public static String ComplianceConfigurationBlock_default_settings_label; public static String ComplianceConfigurationBlock_source_compatibility_label; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties index 759f016f3e..6a4e844545 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties @@ -558,6 +558,7 @@ ComplianceConfigurationBlock_source_file_attr_label=Add source &file name to gen ComplianceConfigurationBlock_src_greater_compliance=Source compatibility must be equal or less than compliance level. ComplianceConfigurationBlock_codegen_unused_local_label=Pr&eserve unused (never read) local variables ComplianceConfigurationBlock_codegen_inline_jsr_bytecode_label=Inline finally blo&cks (larger class files, but improved performance) +ComplianceConfigurationBlock_codegen_method_parameters_attr=&Preserve method parameter names ComplianceConfigurationBlock_compiler_compliance_label=Comp&iler compliance level: ComplianceConfigurationBlock_default_settings_label=Use defaul&t compliance settings ComplianceConfigurationBlock_source_compatibility_label=Source co&mpatibility: From 1879086c44e8179e125d1c613b6aeb74a0b9acae Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Tue, 22 Oct 2013 18:14:26 +0200 Subject: [PATCH 039/169] [1.8] Switch ASTs to JLS8 --- .../eclipse/jdt/astview/views/ASTView.java | 4 +- .../eclipse/jdt/astview/views/Binding.java | 12 +- .../jdt/text/tests/MarkOccurrenceTest18.java | 209 +++++++++ .../core/HierarchicalASTVisitorTest.java | 37 +- .../ImportReferencesCollector.java | 35 +- .../corext/codemanipulation/StubUtility.java | 34 +- .../corext/codemanipulation/StubUtility2.java | 55 +-- .../jdt/internal/corext/dom/ASTFlattener.java | 396 ++++++++++++------ .../jdt/internal/corext/dom/ASTNodes.java | 65 ++- .../jdt/internal/corext/dom/Bindings.java | 18 + .../corext/dom/HierarchicalASTVisitor.java | 229 +++++----- .../refactoring/TypeContextChecker.java | 10 +- .../internal/ui/javaeditor/ASTProvider.java | 8 +- .../ui/search/ExceptionOccurrencesFinder.java | 187 +++++---- .../internal/ui/search/MethodExitsFinder.java | 69 ++- .../ui/text/correction/ASTResolving.java | 40 +- .../org/eclipse/jdt/ui/SharedASTProvider.java | 8 +- 17 files changed, 979 insertions(+), 437 deletions(-) create mode 100644 org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java index 1da815f5f3..27b163e349 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java @@ -125,6 +125,8 @@ public class ASTView extends ViewPart implements IShowInSource { + static final int JLS_LATEST= AST.JLS8; + private static final int JLS8= AST.JLS8; /** @@ -469,7 +471,7 @@ public ASTView() { fStatementsRecovery= !fDialogSettings.getBoolean(SETTINGS_NO_STATEMENTS_RECOVERY); // inverse so that default is use recovery fBindingsRecovery= !fDialogSettings.getBoolean(SETTINGS_NO_BINDINGS_RECOVERY); // inverse so that default is use recovery fIgnoreMethodBodies= fDialogSettings.getBoolean(SETTINGS_IGNORE_METHOD_BODIES); - fCurrentASTLevel= JLS8; + fCurrentASTLevel= JLS_LATEST; try { int level= fDialogSettings.getInt(SETTINGS_JLS); switch (level) { diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/Binding.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/Binding.java index aacab5d2bc..5e4a827cbe 100644 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/Binding.java +++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/Binding.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -125,6 +129,7 @@ public Object[] getChildren() { if (typeBinding.isAnnotation()) kinds.append(" isAnnotation"); //$NON-NLS-1$ if (typeBinding.isClass()) kinds.append(" isClass"); //$NON-NLS-1$ if (typeBinding.isInterface()) kinds.append(" isInterface"); //$NON-NLS-1$ + if (typeBinding.isFunctionalInterface()) kinds.append(" isFunctionalInterface"); //$NON-NLS-1$ if (typeBinding.isEnum()) kinds.append(" isEnum"); //$NON-NLS-1$ res.add(new BindingProperty(this, kinds, true)); //$NON-NLS-1$ @@ -189,6 +194,7 @@ public Object[] getChildren() { res.add(new BindingProperty(this, "DECLARED METHODS", typeBinding.getDeclaredMethods(), isRefType)); //$NON-NLS-1$ res.add(new BindingProperty(this, "IS SYNTHETIC", fBinding.isSynthetic(), isNonPrimitive)); //$NON-NLS-1$ res.add(new BindingProperty(this, "IS DEPRECATED", fBinding.isDeprecated(), isRefType)); //$NON-NLS-1$ + res.add(new BindingProperty(this, "TYPE ANNOTATIONS", typeBinding.getTypeAnnotations(), true)); //$NON-NLS-1$ break; case IBinding.METHOD: @@ -460,13 +466,13 @@ public static ASTAttribute createValueAttribute(ASTAttribute parent, String name } public static String getEscapedStringLiteral(String stringValue) { - StringLiteral stringLiteral= AST.newAST(AST.JLS4).newStringLiteral(); + StringLiteral stringLiteral= AST.newAST(ASTView.JLS_LATEST).newStringLiteral(); stringLiteral.setLiteralValue(stringValue); return stringLiteral.getEscapedValue(); } public static String getEscapedCharLiteral(char charValue) { - CharacterLiteral charLiteral= AST.newAST(AST.JLS4).newCharacterLiteral(); + CharacterLiteral charLiteral= AST.newAST(ASTView.JLS_LATEST).newCharacterLiteral(); charLiteral.setCharValue(charValue); return charLiteral.getEscapedValue(); } diff --git a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java new file mode 100644 index 0000000000..ac7ba61e9c --- /dev/null +++ b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java @@ -0,0 +1,209 @@ +/******************************************************************************* + * Copyright (c) 2011, 2013 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.text.tests; + +import java.util.Arrays; +import java.util.Comparator; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.eclipse.jdt.testplugin.JavaProjectHelper; + +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.CompilationUnit; + +import org.eclipse.jdt.ui.PreferenceConstants; +import org.eclipse.jdt.ui.tests.core.Java18ProjectTestSetup; + +import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider; +import org.eclipse.jdt.internal.ui.search.ExceptionOccurrencesFinder; +import org.eclipse.jdt.internal.ui.search.IOccurrencesFinder; +import org.eclipse.jdt.internal.ui.search.IOccurrencesFinder.OccurrenceLocation; + +public class MarkOccurrenceTest18 extends TestCase { + private static final Class THIS= MarkOccurrenceTest18.class; + + public static Test suite() { + return new Java18ProjectTestSetup(new TestSuite(THIS)); + } + + public static Test setUpTest(Test test) { + return new Java18ProjectTestSetup(test); + } + + private ASTParser fParser; + + private IOccurrencesFinder fFinder; + + private IJavaProject fJProject1; + + private IPackageFragmentRoot fSourceFolder; + + /* + * @see junit.framework.TestCase#setUp() + */ + protected void setUp() throws Exception { + fParser= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL); + + fJProject1= Java18ProjectTestSetup.getProject(); + fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); + JavaPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.EDITOR_MARK_OCCURRENCES, true); + } + + /* (non-Javadoc) + * @see junit.framework.TestCase#tearDown() + */ + protected void tearDown() throws Exception { + JavaProjectHelper.clear(fJProject1, Java18ProjectTestSetup.getDefaultClasspath()); + } + + private OccurrenceLocation[] getHighlights(StringBuffer source, int offset, int length) throws Exception { + CompilationUnit root= createCompilationUnit(source); + String errorString= fFinder.initialize(root, offset, length); + assertNull(errorString, errorString); + return fFinder.getOccurrences(); + } + + private CompilationUnit createCompilationUnit(StringBuffer source) throws JavaModelException { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + ICompilationUnit cu= pack1.createCompilationUnit("E.java", source.toString(), true, null); + fParser.setSource(cu); + fParser.setResolveBindings(true); + return (CompilationUnit)fParser.createAST(null); + } + + private void checkSelection(StringBuffer s, int offset, int length, OccurrenceLocation[] expected) throws Exception { + OccurrenceLocation[] selectedNodes= getHighlights(s, offset, length); + assertEquals("number of selections", expected.length, selectedNodes.length); + sortByStartIndex(selectedNodes); + sortByStartIndex(expected); + for (int i= 0; i < selectedNodes.length; i++) { + assertEquals(expected[i].getOffset(), selectedNodes[i].getOffset()); + assertEquals(expected[i].getLength(), selectedNodes[i].getLength()); + } + } + + private void sortByStartIndex(OccurrenceLocation[] OccurrenceLocations) { + Arrays.sort(OccurrenceLocations, new Comparator() { + public int compare(Object arg0, Object arg1) { + OccurrenceLocation node0= (OccurrenceLocation)arg0; + OccurrenceLocation node1= (OccurrenceLocation)arg1; + return node0.getOffset() - node1.getOffset(); + } + }); + } + + //pattern must be found - otherwise it's assumed to be an error + private OccurrenceLocation find(StringBuffer s, String pattern, int ithOccurrence) { + if (ithOccurrence < 1) + throw new IllegalStateException("ithOccurrence = " + ithOccurrence); + return find(s, pattern, ithOccurrence, 0); + } + + private OccurrenceLocation find(StringBuffer s, String pattern, int ithOccurrence, int startIdx) { + if (startIdx < 0 || startIdx > s.length()) + throw new IllegalStateException("startIdx = " + startIdx); + int idx= s.indexOf(pattern, startIdx); + if (idx == -1) + throw new IllegalStateException("not found \"" + pattern + "\" in \"" + s.substring(startIdx)); + if (ithOccurrence == 1) + return new OccurrenceLocation(idx, pattern.length(), 0, ""); + return find(s, pattern, ithOccurrence - 1, idx + 1); + } + + public void testThrowingAnnotatedException1() throws Exception { + StringBuffer s= new StringBuffer(); + s.append("package test1;\n"); + s.append("import java.lang.annotation.Documented;\n"); + s.append("import java.lang.annotation.ElementType;\n"); + s.append("import java.lang.annotation.Retention;\n"); + s.append("import java.lang.annotation.RetentionPolicy;\n"); + s.append("import java.lang.annotation.Target;\n"); + s.append("\n"); + s.append("public class E {\n"); + s.append(" @Target(ElementType.TYPE_USE)\n"); + s.append(" @Retention(RetentionPolicy.RUNTIME)\n"); + s.append(" @Documented\n"); + s.append(" static @interface Critical {\n"); + s.append(" String msg() default \"We're all going to die!\";\n"); + s.append(" }\n"); + s.append("\n"); + s.append(" class InnerException extends Exception {\n"); + s.append(" private static final long serialVersionUID = 1L;\n"); + s.append(" }\n"); + s.append("\n"); + s.append(" /**\n"); + s.append(" * @throws E.InnerException\n"); + s.append(" */\n"); + s.append(" void foo() throws @Critical() E.@Critical() InnerException, IllegalArgumentException {\n"); + s.append(" if (Boolean.TRUE)\n"); + s.append(" throw new @Critical() InnerException();\n"); + s.append(" else\n"); + s.append(" throw new @Critical() E.@Critical() InnerException();\n"); + s.append(" }\n"); + s.append("\n"); + s.append(" void tryCatch() {\n"); + s.append(" try {\n"); + s.append(" foo();\n"); + s.append(" } catch (@Critical() E.@Critical() InnerException e) {\n"); + s.append(" } catch (RuntimeException e) {\n"); + s.append(" }\n"); + s.append(" try {\n"); + s.append(" foo();\n"); + s.append(" } catch (RuntimeException | @Critical(msg=\"He\"+\"llo\") E.@Critical() InnerException e) {\n"); + s.append(" }\n"); + s.append(" }\n"); + s.append("}\n"); + + fFinder= new ExceptionOccurrencesFinder(); + int offset= 8 + s.indexOf("@throws E.InnerException"); // in Javadoc + int length= 0; + OccurrenceLocation[] ranges= { find(s, "E.InnerException", 1), find(s, "@Critical() E.@Critical() InnerException", 1), + find(s, "throw", 3), find(s, "throw", 4) }; + checkSelection(s, offset, length, ranges); + + fFinder= new ExceptionOccurrencesFinder(); + offset= 1 + s.indexOf("@Critical() E.@Critical() InnerException"); // in annotation + length= 0; + checkSelection(s, offset, length, ranges); + + fFinder= new ExceptionOccurrencesFinder(); + offset= s.indexOf("E.@Critical() InnerException"); // in annotated type qualifier + length= 1; + checkSelection(s, offset, length, ranges); + + fFinder= new ExceptionOccurrencesFinder(); + offset= 1 + s.indexOf("InnerException e)"); // in annotated catch type (does NOT include modifier "@Critical() "!) + length= 0; + ranges= new OccurrenceLocation[] { find(s, "foo", 2), find(s, "E.@Critical() InnerException", 3)}; + checkSelection(s, offset, length, ranges); + + fFinder= new ExceptionOccurrencesFinder(); + offset= s.indexOf("RuntimeException |"); // in annotated union type + length= 0; + ranges= new OccurrenceLocation[] { find(s, "foo", 3), find(s, "RuntimeException", 2)}; + checkSelection(s, offset, length, ranges); + + fFinder= new ExceptionOccurrencesFinder(); + offset= s.indexOf("He"); // in annotation expression + length= 0; + ranges= new OccurrenceLocation[] { find(s, "foo", 3), find(s, "@Critical(msg=\"He\"+\"llo\") E.@Critical() InnerException", 1)}; + checkSelection(s, offset, length, ranges); + } +} diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java index f743669e1e..b48ee2fd58 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -25,10 +25,12 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; +import org.eclipse.jdt.core.dom.AnnotatableType; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.Comment; import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.MethodReference; import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.Statement; import org.eclipse.jdt.core.dom.Type; @@ -36,6 +38,7 @@ import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor; +@SuppressWarnings("javadoc") public class HierarchicalASTVisitorTest extends TestCase { private static class TestHierarchicalASTVisitor extends HierarchicalASTVisitor { @@ -93,6 +96,20 @@ public void superEndVisit(Expression node) { super.visit(node); } + public boolean visit(AnnotatableType node) { + registerCall(AnnotatableType.class); + return false; + } + public void superVisit(AnnotatableType node) { + super.visit(node); + } + public void endVisit(AnnotatableType node) { + registerCall(AnnotatableType.class); + } + public void superEndVisit(AnnotatableType node) { + super.visit(node); + } + public boolean visit(Annotation node) { registerCall(Annotation.class); return false; @@ -107,6 +124,20 @@ public void superEndVisit(Annotation node) { super.visit(node); } + public boolean visit(MethodReference node) { + registerCall(MethodReference.class); + return false; + } + public void superVisit(MethodReference node) { + super.visit(node); + } + public void endVisit(MethodReference node) { + registerCall(MethodReference.class); + } + public void superEndVisit(MethodReference node) { + super.visit(node); + } + public boolean visit(Name node) { registerCall(Name.class); return false; @@ -323,6 +354,10 @@ private void callSuperVisitToAvoidUnusedMethodsWarning() { superEndVisit((Expression) null); superVisit((Annotation) null); superEndVisit((Annotation) null); + superVisit((AnnotatableType) null); + superEndVisit((AnnotatableType) null); + superVisit((MethodReference) null); + superEndVisit((MethodReference) null); superVisit((Name) null); superEndVisit((Name) null); superVisit((BodyDeclaration) null); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java index 312120453b..234ce1f603 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java @@ -5,20 +5,22 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.corext.codemanipulation; import java.util.Collection; -import java.util.Iterator; import java.util.List; import org.eclipse.jface.text.Region; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.ArrayType; import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Expression; @@ -38,6 +40,7 @@ import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.NormalAnnotation; import org.eclipse.jdt.core.dom.PackageDeclaration; +import org.eclipse.jdt.core.dom.PackageQualifiedType; import org.eclipse.jdt.core.dom.QualifiedName; import org.eclipse.jdt.core.dom.QualifiedType; import org.eclipse.jdt.core.dom.SimpleName; @@ -192,20 +195,22 @@ protected boolean visitNode(ASTNode node) { } /* - * @see ASTVisitor#visit(ArrayType) + * @see ASTVisitor#visit(SimpleType) */ @Override - public boolean visit(ArrayType node) { - doVisitNode(node.getElementType()); + public boolean visit(SimpleType node) { + typeRefFound(node.getName()); + doVisitChildren(node.annotations()); return false; } - + /* - * @see ASTVisitor#visit(SimpleType) + * @see ASTVisitor#visit(PackageQualifiedType) */ @Override - public boolean visit(SimpleType node) { + public boolean visit(PackageQualifiedType node) { typeRefFound(node.getName()); + doVisitChildren(node.annotations()); return false; } @@ -214,8 +219,9 @@ public boolean visit(SimpleType node) { */ @Override public boolean visit(QualifiedType node) { - // nothing to do here, let the qualifier be visited - return true; + doVisitNode(node.getQualifier()); + doVisitChildren(node.annotations()); + return false; } /* @@ -385,11 +391,12 @@ public boolean visit(MethodDeclaration node) { if (!node.isConstructor()) { doVisitNode(node.getReturnType2()); } + // name not visited + // receiverType and receiverQualifier not visited: + // These type names cannot be shadowed by an import (qualification is always redundant except for type annotations). doVisitChildren(node.parameters()); - Iterator iter=node.thrownExceptions().iterator(); - while (iter.hasNext()) { - typeRefFound(iter.next()); - } + doVisitChildren(node.extraDimensions()); + doVisitChildren(node.thrownExceptionTypes()); if (!fSkipMethodBodies) { doVisitNode(node.getBody()); } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility.java index bebbeb6cac..08b7ff4d40 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class @@ -607,6 +611,7 @@ private static String evaluateTemplate(CodeTemplateContext context, Template tem /* * Don't use this method directly, use CodeGeneration. + * This method should work with all AST levels. * @see org.eclipse.jdt.ui.CodeGeneration#getMethodComment(ICompilationUnit, String, MethodDeclaration, boolean, String, String[], String) */ public static String getMethodComment(ICompilationUnit cu, String typeName, MethodDeclaration decl, boolean isDeprecated, String targetName, String targetMethodDeclaringTypeName, @@ -671,11 +676,7 @@ public static String getMethodComment(ICompilationUnit cu, String typeName, Meth SingleVariableDeclaration elem= params.get(i); paramNames[i]= elem.getName().getIdentifier(); } - List exceptions= decl.thrownExceptions(); - String[] exceptionNames= new String[exceptions.size()]; - for (int i= 0; i < exceptionNames.length; i++) { - exceptionNames[i]= ASTNodes.getSimpleNameIdentifier(exceptions.get(i)); - } + String[] exceptionNames= getExceptionNames(decl); String returnType= null; if (!decl.isConstructor()) { @@ -692,6 +693,29 @@ public static String getMethodComment(ICompilationUnit cu, String typeName, Meth return textBuffer.get(); } + /** + * @param decl the method declaration + * @return the exception names + * @deprecated to avoid deprecation warnings + */ + private static String[] getExceptionNames(MethodDeclaration decl) { + String[] exceptionNames; + if (decl.getAST().apiLevel() >= AST.JLS8) { + List exceptions= decl.thrownExceptionTypes(); + exceptionNames= new String[exceptions.size()]; + for (int i= 0; i < exceptionNames.length; i++) { + exceptionNames[i]= ASTNodes.getTypeName(exceptions.get(i)); + } + } else { + List exceptions= decl.thrownExceptions(); + exceptionNames= new String[exceptions.size()]; + for (int i= 0; i < exceptionNames.length; i++) { + exceptionNames[i]= ASTNodes.getSimpleNameIdentifier(exceptions.get(i)); + } + } + return exceptionNames; + } + public static boolean shouldGenerateMethodTypeParameterTags(IJavaProject project) { return JavaCore.ENABLED.equals(project.getOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS_METHOD_TYPE_PARAMETERS, true)); } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java index 16efc180fb..a296997b2b 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java @@ -102,6 +102,7 @@ public static void addOverrideAnnotation(IJavaProject project, ASTRewrite rewrit rewrite.getListRewrite(decl, MethodDeclaration.MODIFIERS2_PROPERTY).insertFirst(marker, null); } + /* This method should work with all AST levels. */ public static MethodDeclaration createConstructorStub(ICompilationUnit unit, ASTRewrite rewrite, ImportRewrite imports, ImportRewriteContext context, IMethodBinding binding, String type, int modifiers, boolean omitSuperForDefConst, boolean todo, CodeGenerationSettings settings) throws CoreException { AST ast= rewrite.getAST(); MethodDeclaration decl= ast.newMethodDeclaration(); @@ -127,12 +128,7 @@ public static MethodDeclaration createConstructorStub(ICompilationUnit unit, AST List parameters= createParameters(unit.getJavaProject(), imports, context, ast, binding, decl); - List thrownExceptions= decl.thrownExceptions(); - ITypeBinding[] excTypes= binding.getExceptionTypes(); - for (int i= 0; i < excTypes.length; i++) { - String excTypeName= imports.addImport(excTypes[i], context); - thrownExceptions.add(ASTNodeFactory.newName(ast, excTypeName)); - } + createThrownExceptions(decl, binding, imports, context, ast); Block body= ast.newBlock(); decl.setBody(body); @@ -198,12 +194,7 @@ public static MethodDeclaration createConstructorStub(ICompilationUnit unit, AST createParameters(unit.getJavaProject(), imports, context, ast, superConstructor, decl); - List thrownExceptions= decl.thrownExceptions(); - ITypeBinding[] excTypes= superConstructor.getExceptionTypes(); - for (int i= 0; i < excTypes.length; i++) { - String excTypeName= imports.addImport(excTypes[i], context); - thrownExceptions.add(ASTNodeFactory.newName(ast, excTypeName)); - } + createThrownExceptions(decl, superConstructor, imports, context, ast); } Block body= ast.newBlock(); @@ -322,12 +313,7 @@ public static MethodDeclaration createDelegationStub(ICompilationUnit unit, ASTR parameters.add(varDecl); } - List thrownExceptions= decl.thrownExceptions(); - ITypeBinding[] excTypes= delegate.getExceptionTypes(); - for (int i= 0; i < excTypes.length; i++) { - String excTypeName= imports.addImport(excTypes[i], context); - thrownExceptions.add(ASTNodeFactory.newName(ast, excTypeName)); - } + createThrownExceptions(decl, delegate, imports, context, ast); Block body= ast.newBlock(); decl.setBody(body); @@ -427,12 +413,7 @@ public static MethodDeclaration createImplementationStub(ICompilationUnit unit, List parameters= createParameters(unit.getJavaProject(), imports, context, ast, binding, decl); - List thrownExceptions= decl.thrownExceptions(); - ITypeBinding[] excTypes= binding.getExceptionTypes(); - for (int i= 0; i < excTypes.length; i++) { - String excTypeName= imports.addImport(excTypes[i], context); - thrownExceptions.add(ASTNodeFactory.newName(ast, excTypeName)); - } + createThrownExceptions(decl, binding, imports, context, ast); String delimiter= unit.findRecommendedLineSeparator(); if (!inInterface) { @@ -523,6 +504,32 @@ private static List createParameters(IJavaProject pro return parameters; } + private static void createThrownExceptions(MethodDeclaration decl, IMethodBinding method, ImportRewrite imports, ImportRewriteContext context, AST ast) { + ITypeBinding[] excTypes= method.getExceptionTypes(); + if (ast.apiLevel() >= AST.JLS8) { + List thrownExceptions= decl.thrownExceptionTypes(); + for (int i= 0; i < excTypes.length; i++) { + Type excType= imports.addImport(excTypes[i], ast, context); + thrownExceptions.add(excType); + } + } else { + List thrownExceptions= getThrownExceptions(decl); + for (int i= 0; i < excTypes.length; i++) { + String excTypeName= imports.addImport(excTypes[i], context); + thrownExceptions.add(ASTNodeFactory.newName(ast, excTypeName)); + } + } + } + + /** + * @param decl method declaration + * @return thrown exception names + * @deprecated to avoid deprecation warnings + */ + private static List getThrownExceptions(MethodDeclaration decl) { + return decl.thrownExceptions(); + } + private static IMethodBinding findMethodBinding(IMethodBinding method, List allMethods) { for (int i= 0; i < allMethods.size(); i++) { IMethodBinding curr= allMethods.get(i); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java index 1f1fbe70c4..2c426e3f0b 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -15,100 +19,7 @@ import org.eclipse.core.runtime.Assert; -import org.eclipse.jdt.core.dom.AST; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; -import org.eclipse.jdt.core.dom.Annotation; -import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; -import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; -import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; -import org.eclipse.jdt.core.dom.ArrayAccess; -import org.eclipse.jdt.core.dom.ArrayCreation; -import org.eclipse.jdt.core.dom.ArrayInitializer; -import org.eclipse.jdt.core.dom.ArrayType; -import org.eclipse.jdt.core.dom.AssertStatement; -import org.eclipse.jdt.core.dom.Assignment; -import org.eclipse.jdt.core.dom.Block; -import org.eclipse.jdt.core.dom.BlockComment; -import org.eclipse.jdt.core.dom.BodyDeclaration; -import org.eclipse.jdt.core.dom.BooleanLiteral; -import org.eclipse.jdt.core.dom.BreakStatement; -import org.eclipse.jdt.core.dom.CastExpression; -import org.eclipse.jdt.core.dom.CatchClause; -import org.eclipse.jdt.core.dom.CharacterLiteral; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ConditionalExpression; -import org.eclipse.jdt.core.dom.ConstructorInvocation; -import org.eclipse.jdt.core.dom.ContinueStatement; -import org.eclipse.jdt.core.dom.DoStatement; -import org.eclipse.jdt.core.dom.EmptyStatement; -import org.eclipse.jdt.core.dom.EnhancedForStatement; -import org.eclipse.jdt.core.dom.EnumConstantDeclaration; -import org.eclipse.jdt.core.dom.EnumDeclaration; -import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ExpressionStatement; -import org.eclipse.jdt.core.dom.FieldAccess; -import org.eclipse.jdt.core.dom.FieldDeclaration; -import org.eclipse.jdt.core.dom.ForStatement; -import org.eclipse.jdt.core.dom.IExtendedModifier; -import org.eclipse.jdt.core.dom.IfStatement; -import org.eclipse.jdt.core.dom.ImportDeclaration; -import org.eclipse.jdt.core.dom.InfixExpression; -import org.eclipse.jdt.core.dom.Initializer; -import org.eclipse.jdt.core.dom.InstanceofExpression; -import org.eclipse.jdt.core.dom.Javadoc; -import org.eclipse.jdt.core.dom.LabeledStatement; -import org.eclipse.jdt.core.dom.LineComment; -import org.eclipse.jdt.core.dom.MarkerAnnotation; -import org.eclipse.jdt.core.dom.MemberRef; -import org.eclipse.jdt.core.dom.MemberValuePair; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.MethodRef; -import org.eclipse.jdt.core.dom.MethodRefParameter; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; -import org.eclipse.jdt.core.dom.NormalAnnotation; -import org.eclipse.jdt.core.dom.NullLiteral; -import org.eclipse.jdt.core.dom.NumberLiteral; -import org.eclipse.jdt.core.dom.PackageDeclaration; -import org.eclipse.jdt.core.dom.ParameterizedType; -import org.eclipse.jdt.core.dom.ParenthesizedExpression; -import org.eclipse.jdt.core.dom.PostfixExpression; -import org.eclipse.jdt.core.dom.PrefixExpression; -import org.eclipse.jdt.core.dom.PrimitiveType; -import org.eclipse.jdt.core.dom.QualifiedName; -import org.eclipse.jdt.core.dom.QualifiedType; -import org.eclipse.jdt.core.dom.ReturnStatement; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.SimpleType; -import org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.eclipse.jdt.core.dom.SingleVariableDeclaration; -import org.eclipse.jdt.core.dom.Statement; -import org.eclipse.jdt.core.dom.StringLiteral; -import org.eclipse.jdt.core.dom.SuperConstructorInvocation; -import org.eclipse.jdt.core.dom.SuperFieldAccess; -import org.eclipse.jdt.core.dom.SuperMethodInvocation; -import org.eclipse.jdt.core.dom.SwitchCase; -import org.eclipse.jdt.core.dom.SwitchStatement; -import org.eclipse.jdt.core.dom.SynchronizedStatement; -import org.eclipse.jdt.core.dom.TagElement; -import org.eclipse.jdt.core.dom.TextElement; -import org.eclipse.jdt.core.dom.ThisExpression; -import org.eclipse.jdt.core.dom.ThrowStatement; -import org.eclipse.jdt.core.dom.TryStatement; -import org.eclipse.jdt.core.dom.Type; -import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.TypeDeclarationStatement; -import org.eclipse.jdt.core.dom.TypeLiteral; -import org.eclipse.jdt.core.dom.TypeParameter; -import org.eclipse.jdt.core.dom.UnionType; -import org.eclipse.jdt.core.dom.VariableDeclarationExpression; -import org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import org.eclipse.jdt.core.dom.VariableDeclarationStatement; -import org.eclipse.jdt.core.dom.WhileStatement; -import org.eclipse.jdt.core.dom.WildcardType; +import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider; @@ -119,6 +30,10 @@ public class ASTFlattener extends GenericVisitor { * @deprecated to avoid deprecation warnings */ private static final int JLS3= AST.JLS3; + /** + * @deprecated to avoid deprecation warnings + */ + private static final int JLS4= AST.JLS4; /** * The string buffer into which the serialized representation of the AST is @@ -179,6 +94,53 @@ private void printModifiers(List ext) { } } + private void printReferenceTypeArguments(List typeArguments) { + this.fBuffer.append("::");//$NON-NLS-1$ + if (!typeArguments.isEmpty()) { + this.fBuffer.append('<'); + for (Iterator it = typeArguments.iterator(); it.hasNext(); ) { + Type t = it.next(); + t.accept(this); + if (it.hasNext()) { + this.fBuffer.append(','); + } + } + this.fBuffer.append('>'); + } + } + + void printTypeAnnotations(AnnotatableType node) { + if (node.getAST().apiLevel() >= AST.JLS8) { + printAnnotationsList(node.annotations()); + } + } + + void printAnnotationsList(List annotations) { + for (Iterator it = annotations.iterator(); it.hasNext(); ) { + Annotation annotation = it.next(); + annotation.accept(this); + this.fBuffer.append(' '); + } + } + + /** + * @param node node + * @return component type + * @deprecated to avoid deprecation warning + */ + private static Type getComponentType(ArrayType node) { + return node.getComponentType(); + } + + /** + * @param node node + * @return thrown exception names + * @deprecated to avoid deprecation warning + */ + private static List getThrownExceptions(MethodDeclaration node) { + return node.thrownExceptions(); + } + /* * @see ASTVisitor#visit(AnnotationTypeDeclaration) * @since 3.0 @@ -298,8 +260,17 @@ public boolean visit(ArrayInitializer node) { */ @Override public boolean visit(ArrayType node) { - node.getComponentType().accept(this); - this.fBuffer.append("[]");//$NON-NLS-1$ + if (node.getAST().apiLevel() < AST.JLS8) { + getComponentType(node).accept(this); + this.fBuffer.append("[]");//$NON-NLS-1$ + } else { + node.getElementType().accept(this); + List dimensions = node.dimensions(); + for (int i = 0; i < dimensions.size() ; i++) { + Dimension dimension = dimensions.get(i); + dimension.accept(this); + } + } return false; } @@ -528,6 +499,28 @@ public boolean visit(ContinueStatement node) { return false; } + /* + * @see ASTVisitor#visit(CreationReference) + */ + @Override + public boolean visit(CreationReference node) { + node.getType().accept(this); + printReferenceTypeArguments(node.typeArguments()); + this.fBuffer.append("new");//$NON-NLS-1$ + return false; + } + + /* + * @see ASTVisitor#visit(Dimension) + */ + @Override + public boolean visit(Dimension node) { + this.fBuffer.append(" ");//$NON-NLS-1$ + printAnnotationsList(node.annotations()); + this.fBuffer.append("[]"); //$NON-NLS-1$ + return false; + } + /* * @see ASTVisitor#visit(DoStatement) */ @@ -639,6 +632,17 @@ public boolean visit(EnumDeclaration node) { return false; } + /* + * @see ASTVisitor#visit(ExpressionMethodReference) + */ + @Override + public boolean visit(ExpressionMethodReference node) { + node.getExpression().accept(this); + printReferenceTypeArguments(node.typeArguments()); + node.getName().accept(this); + return false; + } + /* * @see ASTVisitor#visit(ExpressionStatement) */ @@ -765,6 +769,21 @@ public boolean visit(InfixExpression node) { return false; } + /* + * @see ASTVisitor#visit(Initializer) + */ + @Override + public boolean visit(Initializer node) { + if (node.getJavadoc() != null) { + node.getJavadoc().accept(this); + } + if (node.getAST().apiLevel() >= JLS3) { + printModifiers(node.modifiers()); + } + node.getBody().accept(this); + return false; + } + /* * @see ASTVisitor#visit(InstanceofExpression) */ @@ -777,17 +796,17 @@ public boolean visit(InstanceofExpression node) { } /* - * @see ASTVisitor#visit(Initializer) + * @see ASTVisitor#visit(IntersectionType) */ @Override - public boolean visit(Initializer node) { - if (node.getJavadoc() != null) { - node.getJavadoc().accept(this); - } - if (node.getAST().apiLevel() >= JLS3) { - printModifiers(node.modifiers()); + public boolean visit(IntersectionType node) { + for (Iterator it = node.types().iterator(); it.hasNext(); ) { + Type t = it.next(); + t.accept(this); + if (it.hasNext()) { + this.fBuffer.append(" & "); //$NON-NLS-1$ + } } - node.getBody().accept(this); return false; } @@ -816,6 +835,28 @@ public boolean visit(LabeledStatement node) { return false; } + /* + * @see ASTVisitor#visit(LambdaExpression) + */ + @Override + public boolean visit(LambdaExpression node) { + boolean hasParentheses= node.hasParentheses(); + if (hasParentheses) + this.fBuffer.append('('); + for (Iterator it= node.parameters().iterator(); it.hasNext(); ) { + VariableDeclaration v= it.next(); + v.accept(this); + if (it.hasNext()) { + this.fBuffer.append(",");//$NON-NLS-1$ + } + } + if (hasParentheses) + this.fBuffer.append(')'); + this.fBuffer.append(" -> "); //$NON-NLS-1$ + node.getBody().accept(this); + return false; + } + /* * @see ASTVisitor#visit(LineComment) * @since 3.0 @@ -938,6 +979,22 @@ public boolean visit(MethodDeclaration node) { } node.getName().accept(this); this.fBuffer.append("(");//$NON-NLS-1$ + if (node.getAST().apiLevel() >= AST.JLS8) { + Type receiverType= node.getReceiverType(); + if (receiverType != null) { + receiverType.accept(this); + this.fBuffer.append(' '); + SimpleName qualifier= node.getReceiverQualifier(); + if (qualifier != null) { + qualifier.accept(this); + this.fBuffer.append('.'); + } + this.fBuffer.append("this"); //$NON-NLS-1$ + if (node.parameters().size() > 0) { + this.fBuffer.append(','); + } + } + } for (Iterator it= node.parameters().iterator(); it.hasNext();) { SingleVariableDeclaration v= it.next(); v.accept(this); @@ -946,13 +1003,22 @@ public boolean visit(MethodDeclaration node) { } } this.fBuffer.append(")");//$NON-NLS-1$ - for (int i= 0; i < node.getExtraDimensions(); i++) { - this.fBuffer.append("[]"); //$NON-NLS-1$ + if (node.getAST().apiLevel() >= AST.JLS8) { + List dimensions = node.extraDimensions(); + for (Iterator it= dimensions.iterator(); it.hasNext(); ) { + Dimension e= it.next(); + e.accept(this); + } + } else { + for (int i= 0; i < node.getExtraDimensions(); i++) { + this.fBuffer.append("[]"); //$NON-NLS-1$ + } } - if (!node.thrownExceptions().isEmpty()) { + List thrownExceptions= node.getAST().apiLevel() >= AST.JLS8 ? node.thrownExceptionTypes() : getThrownExceptions(node); + if (!thrownExceptions.isEmpty()) { this.fBuffer.append(" throws ");//$NON-NLS-1$ - for (Iterator it= node.thrownExceptions().iterator(); it.hasNext();) { - Name n= it.next(); + for (Iterator it= thrownExceptions.iterator(); it.hasNext();) { + ASTNode n = it.next(); n.accept(this); if (it.hasNext()) { this.fBuffer.append(", ");//$NON-NLS-1$ @@ -1072,6 +1138,18 @@ public boolean visit(PackageDeclaration node) { return false; } + /* + * @see ASTVisitor#visit(PackageQualifiedType) + */ + @Override + public boolean visit(PackageQualifiedType node) { + node.getQualifier().accept(this); + this.fBuffer.append('.'); + printTypeAnnotations(node); + node.getName().accept(this); + return false; + } + /* * @see ASTVisitor#visit(ParameterizedType) * @since 3.0 @@ -1127,6 +1205,7 @@ public boolean visit(PrefixExpression node) { */ @Override public boolean visit(PrimitiveType node) { + printTypeAnnotations(node); this.fBuffer.append(node.getPrimitiveTypeCode().toString()); return false; } @@ -1150,6 +1229,7 @@ public boolean visit(QualifiedName node) { public boolean visit(QualifiedType node) { node.getQualifier().accept(this); this.fBuffer.append(".");//$NON-NLS-1$ + printTypeAnnotations(node); node.getName().accept(this); return false; } @@ -1182,7 +1262,18 @@ public boolean visit(SimpleName node) { */ @Override public boolean visit(SimpleType node) { - return true; + Name name = node.getName(); + if (name.isQualifiedName()) { + QualifiedName qualifiedName = (QualifiedName) name; + qualifiedName.getQualifier().accept(this); + this.fBuffer.append(".");//$NON-NLS-1$ + printTypeAnnotations(node); + qualifiedName.getName().accept(this); + } else { + printTypeAnnotations(node); + node.getName().accept(this); + } + return false; } /* @@ -1210,13 +1301,26 @@ public boolean visit(SingleVariableDeclaration node) { node.getType().accept(this); if (node.getAST().apiLevel() >= JLS3) { if (node.isVarargs()) { + if (node.getAST().apiLevel() >= AST.JLS8) { + this.fBuffer.append(' '); + List annotations= node.varargsAnnotations(); + printAnnotationsList(annotations); + } this.fBuffer.append("...");//$NON-NLS-1$ } } this.fBuffer.append(" ");//$NON-NLS-1$ node.getName().accept(this); - for (int i= 0; i < node.getExtraDimensions(); i++) { - this.fBuffer.append("[]"); //$NON-NLS-1$ + if (node.getAST().apiLevel() >= AST.JLS8) { + List dimensions = node.extraDimensions(); + for (Iterator it= dimensions.iterator(); it.hasNext(); ) { + Dimension e= it.next(); + e.accept(this); + } + } else { + for (int i= 0; i < node.getExtraDimensions(); i++) { + this.fBuffer.append("[]"); //$NON-NLS-1$ + } } if (node.getInitializer() != null) { this.fBuffer.append("=");//$NON-NLS-1$ @@ -1318,6 +1422,21 @@ public boolean visit(SuperMethodInvocation node) { return false; } + /* + * @see ASTVisitor#visit(SuperMethodReference) + */ + @Override + public boolean visit(SuperMethodReference node) { + if (node.getQualifier() != null) { + node.getQualifier().accept(this); + this.fBuffer.append('.'); + } + this.fBuffer.append("super");//$NON-NLS-1$ + printReferenceTypeArguments(node.typeArguments()); + node.getName().accept(this); + return false; + } + /* * @see ASTVisitor#visit(SwitchCase) */ @@ -1443,7 +1562,7 @@ public boolean visit(ThrowStatement node) { @Override public boolean visit(TryStatement node) { this.fBuffer.append("try ");//$NON-NLS-1$ - if (node.getAST().apiLevel() >= AST.JLS4) { + if (node.getAST().apiLevel() >= JLS4) { if (!node.resources().isEmpty()) { this.fBuffer.append("(");//$NON-NLS-1$ for (Iterator it= node.resources().iterator(); it.hasNext();) { @@ -1557,12 +1676,24 @@ public boolean visit(TypeLiteral node) { return false; } + /* + * @see ASTVisitor#visit(TypeMethodReference) + */ + @Override + public boolean visit(TypeMethodReference node) { + node.getType().accept(this); + printReferenceTypeArguments(node.typeArguments()); + node.getName().accept(this); + return false; + } + /* * @see ASTVisitor#visit(TypeParameter) * @since 3.0 */ @Override public boolean visit(TypeParameter node) { + printAnnotationsList(node.annotations()); node.getName().accept(this); if (!node.typeBounds().isEmpty()) { this.fBuffer.append(" extends ");//$NON-NLS-1$ @@ -1618,8 +1749,16 @@ public boolean visit(VariableDeclarationExpression node) { @Override public boolean visit(VariableDeclarationFragment node) { node.getName().accept(this); - for (int i= 0; i < node.getExtraDimensions(); i++) { - this.fBuffer.append("[]");//$NON-NLS-1$ + if (node.getAST().apiLevel() >= AST.JLS8) { + List dimensions = node.extraDimensions(); + for (Iterator it= dimensions.iterator(); it.hasNext(); ) { + Dimension e= it.next(); + e.accept(this); + } + } else { + for (int i= 0; i < node.getExtraDimensions(); i++) { + this.fBuffer.append("[]"); //$NON-NLS-1$ + } } if (node.getInitializer() != null) { this.fBuffer.append("=");//$NON-NLS-1$ @@ -1649,12 +1788,25 @@ public boolean visit(VariableDeclarationStatement node) { return false; } + /* + * @see ASTVisitor#visit(WhileStatement) + */ + @Override + public boolean visit(WhileStatement node) { + this.fBuffer.append("while (");//$NON-NLS-1$ + node.getExpression().accept(this); + this.fBuffer.append(") ");//$NON-NLS-1$ + node.getBody().accept(this); + return false; + } + /* * @see ASTVisitor#visit(WildcardType) * @since 3.0 */ @Override public boolean visit(WildcardType node) { + printTypeAnnotations(node); this.fBuffer.append("?");//$NON-NLS-1$ Type bound= node.getBound(); if (bound != null) { @@ -1668,16 +1820,4 @@ public boolean visit(WildcardType node) { return false; } - /* - * @see ASTVisitor#visit(WhileStatement) - */ - @Override - public boolean visit(WhileStatement node) { - this.fBuffer.append("while (");//$NON-NLS-1$ - node.getExpression().accept(this); - this.fBuffer.append(") ");//$NON-NLS-1$ - node.getBody().accept(this); - return false; - } - } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java index e26d81c88a..7d757434f2 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java @@ -4,6 +4,10 @@ * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and + * is made available for testing and evaluation purposes only. + * The code is not compatible with any specification of the JCP. * * Contributors: * IBM Corporation - initial API and implementation @@ -42,6 +46,7 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; +import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; import org.eclipse.jdt.core.dom.ArrayType; import org.eclipse.jdt.core.dom.Assignment; @@ -64,12 +69,14 @@ import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.IfStatement; import org.eclipse.jdt.core.dom.InfixExpression; +import org.eclipse.jdt.core.dom.MemberValuePair; import org.eclipse.jdt.core.dom.Message; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.NodeFinder; +import org.eclipse.jdt.core.dom.PackageQualifiedType; import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.ParenthesizedExpression; import org.eclipse.jdt.core.dom.PrimitiveType; @@ -81,6 +88,7 @@ import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor; import org.eclipse.jdt.core.dom.Type; +import org.eclipse.jdt.core.dom.UnionType; import org.eclipse.jdt.core.dom.VariableDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationExpression; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; @@ -370,6 +378,15 @@ public static ChildListPropertyDescriptor getBodyDeclarationsProperty(ASTNode no return null; } + /** + * Returns the simple name of the type, followed by array dimensions. + * Skips qualifiers, type arguments, and type annotations. + * + * @param type a type + * @return the simple name + * @see #getSimpleNameIdentifier(Name) + * @since 3.9 BETA_JAVA8 + */ public static String getTypeName(Type type) { final StringBuffer buffer= new StringBuffer(); ASTVisitor visitor= new ASTVisitor() { @@ -389,8 +406,20 @@ public boolean visit(QualifiedName node) { return false; } @Override + public boolean visit(QualifiedType node) { + buffer.append(node.getName().getIdentifier()); + return false; + } + @Override + public boolean visit(PackageQualifiedType node) { + buffer.append(node.getName().getIdentifier()); + return false; + } + @Override public void endVisit(ArrayType node) { - buffer.append("[]"); //$NON-NLS-1$ + for (int i= 0; i < node.dimensions().size(); i++) { + buffer.append("[]"); //$NON-NLS-1$ + } } }; type.accept(visitor); @@ -871,6 +900,14 @@ public boolean visit(QualifiedType qualifiedType) { return result[0]; } + /** + * Returns the topmost ancestor of name that is still a {@link Name}. + *

+ * Note: The returned node may resolve to a different binding than the given name! + * + * @param name a name node + * @return the topmost name + */ public static Name getTopMostName(Name name) { Name result= name; while(result.getParent() instanceof Name) { @@ -879,12 +916,28 @@ public static Name getTopMostName(Name name) { return result; } - public static Type getTopMostType(Type type) { - Type result= type; - while(result.getParent() instanceof Type) { - result= (Type)result.getParent(); + /** + * Returns the topmost ancestor of node that is a {@link Type} (but not a {@link UnionType}). + *

+ * Note: The returned node often resolves to a different binding than the given node! + * + * @param node the starting node, can be null + * @return the topmost type or null if the node is not a descendant of a type node + */ + public static Type getTopMostType(ASTNode node) { + ASTNode result= null; + while (node instanceof Type && !(node instanceof UnionType) + || node instanceof Name + || node instanceof Annotation || node instanceof MemberValuePair + || node instanceof Expression) { // Expression could maybe be reduced to expression node types that can appear in an annotation + result= node; + node= node.getParent(); } - return result; + + if (result instanceof Type) + return (Type) result; + + return null; } public static int changeVisibility(int modifiers, int visibility) { diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java index 0bd27b1ff2..5bf2dd154b 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/Bindings.java @@ -1472,4 +1472,22 @@ public static boolean isNullAnnotation(ITypeBinding annotationType, IJavaProject || qualifiedName.equals(project.getOption(JavaCore.COMPILER_NULLABLE_ANNOTATION_NAME, true)); } + /** + * Returns the n-th component type of the given type, or null if + * the type binding is not an array type or has not that many dimensions. + * + * @param arrayType an array type binding + * @param n number of dimensions to cut + * @return arrayType with n dimensions removed, or null + * @since 3.9 BETA_JAVA8 + */ + public static ITypeBinding getComponentType(ITypeBinding arrayType, int n) { + ITypeBinding type= arrayType; + while (n > 0 && type != null) { + type= type.getComponentType(); + n--; + } + return type; + } + } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/HierarchicalASTVisitor.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/HierarchicalASTVisitor.java index 0287a380cd..66f2aa91a4 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/HierarchicalASTVisitor.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/HierarchicalASTVisitor.java @@ -10,101 +10,7 @@ *******************************************************************************/ package org.eclipse.jdt.internal.corext.dom; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; -import org.eclipse.jdt.core.dom.Annotation; -import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; -import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; -import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; -import org.eclipse.jdt.core.dom.ArrayAccess; -import org.eclipse.jdt.core.dom.ArrayCreation; -import org.eclipse.jdt.core.dom.ArrayInitializer; -import org.eclipse.jdt.core.dom.ArrayType; -import org.eclipse.jdt.core.dom.AssertStatement; -import org.eclipse.jdt.core.dom.Assignment; -import org.eclipse.jdt.core.dom.Block; -import org.eclipse.jdt.core.dom.BlockComment; -import org.eclipse.jdt.core.dom.BodyDeclaration; -import org.eclipse.jdt.core.dom.BooleanLiteral; -import org.eclipse.jdt.core.dom.BreakStatement; -import org.eclipse.jdt.core.dom.CastExpression; -import org.eclipse.jdt.core.dom.CatchClause; -import org.eclipse.jdt.core.dom.CharacterLiteral; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.Comment; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ConditionalExpression; -import org.eclipse.jdt.core.dom.ConstructorInvocation; -import org.eclipse.jdt.core.dom.ContinueStatement; -import org.eclipse.jdt.core.dom.DoStatement; -import org.eclipse.jdt.core.dom.EmptyStatement; -import org.eclipse.jdt.core.dom.EnhancedForStatement; -import org.eclipse.jdt.core.dom.EnumConstantDeclaration; -import org.eclipse.jdt.core.dom.EnumDeclaration; -import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ExpressionStatement; -import org.eclipse.jdt.core.dom.FieldAccess; -import org.eclipse.jdt.core.dom.FieldDeclaration; -import org.eclipse.jdt.core.dom.ForStatement; -import org.eclipse.jdt.core.dom.IfStatement; -import org.eclipse.jdt.core.dom.ImportDeclaration; -import org.eclipse.jdt.core.dom.InfixExpression; -import org.eclipse.jdt.core.dom.Initializer; -import org.eclipse.jdt.core.dom.InstanceofExpression; -import org.eclipse.jdt.core.dom.Javadoc; -import org.eclipse.jdt.core.dom.LabeledStatement; -import org.eclipse.jdt.core.dom.LineComment; -import org.eclipse.jdt.core.dom.MarkerAnnotation; -import org.eclipse.jdt.core.dom.MemberRef; -import org.eclipse.jdt.core.dom.MemberValuePair; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.MethodRef; -import org.eclipse.jdt.core.dom.MethodRefParameter; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; -import org.eclipse.jdt.core.dom.NormalAnnotation; -import org.eclipse.jdt.core.dom.NullLiteral; -import org.eclipse.jdt.core.dom.NumberLiteral; -import org.eclipse.jdt.core.dom.PackageDeclaration; -import org.eclipse.jdt.core.dom.ParameterizedType; -import org.eclipse.jdt.core.dom.ParenthesizedExpression; -import org.eclipse.jdt.core.dom.PostfixExpression; -import org.eclipse.jdt.core.dom.PrefixExpression; -import org.eclipse.jdt.core.dom.PrimitiveType; -import org.eclipse.jdt.core.dom.QualifiedName; -import org.eclipse.jdt.core.dom.QualifiedType; -import org.eclipse.jdt.core.dom.ReturnStatement; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.SimpleType; -import org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.eclipse.jdt.core.dom.SingleVariableDeclaration; -import org.eclipse.jdt.core.dom.Statement; -import org.eclipse.jdt.core.dom.StringLiteral; -import org.eclipse.jdt.core.dom.SuperConstructorInvocation; -import org.eclipse.jdt.core.dom.SuperFieldAccess; -import org.eclipse.jdt.core.dom.SuperMethodInvocation; -import org.eclipse.jdt.core.dom.SwitchCase; -import org.eclipse.jdt.core.dom.SwitchStatement; -import org.eclipse.jdt.core.dom.SynchronizedStatement; -import org.eclipse.jdt.core.dom.TagElement; -import org.eclipse.jdt.core.dom.TextElement; -import org.eclipse.jdt.core.dom.ThisExpression; -import org.eclipse.jdt.core.dom.ThrowStatement; -import org.eclipse.jdt.core.dom.TryStatement; -import org.eclipse.jdt.core.dom.Type; -import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.TypeDeclarationStatement; -import org.eclipse.jdt.core.dom.TypeLiteral; -import org.eclipse.jdt.core.dom.TypeParameter; -import org.eclipse.jdt.core.dom.UnionType; -import org.eclipse.jdt.core.dom.VariableDeclaration; -import org.eclipse.jdt.core.dom.VariableDeclarationExpression; -import org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import org.eclipse.jdt.core.dom.VariableDeclarationStatement; -import org.eclipse.jdt.core.dom.WhileStatement; -import org.eclipse.jdt.core.dom.WildcardType; +import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.internal.corext.util.JDTUIHelperClasses; @@ -362,6 +268,16 @@ public void endVisit(CompilationUnit node) { endVisit((ASTNode)node); } + @Override + public boolean visit(Dimension node) { + return visit((ASTNode)node); + } + + @Override + public void endVisit(Dimension node) { + endVisit((ASTNode)node); + } + //---- Begin Expression Hierarchy ---------------------------------- public boolean visit(Expression node) { return visit((ASTNode)node); @@ -532,6 +448,16 @@ public void endVisit(InstanceofExpression node) { endVisit((Expression)node); } + @Override + public boolean visit(LambdaExpression node) { + return visit((Expression)node); + } + + @Override + public void endVisit(LambdaExpression node) { + endVisit((Expression)node); + } + @Override public boolean visit(MethodInvocation node) { return visit((Expression)node); @@ -542,6 +468,57 @@ public void endVisit(MethodInvocation node) { endVisit((Expression)node); } + //---- Begin MethodReference Hierarchy ---------------------------------- + public boolean visit(MethodReference node) { + return visit((Expression)node); + } + + public void endVisit(MethodReference node) { + endVisit((Expression)node); + } + + @Override + public boolean visit(CreationReference node) { + return visit((MethodReference)node); + } + + @Override + public void endVisit(CreationReference node) { + endVisit((MethodReference)node); + } + + @Override + public boolean visit(ExpressionMethodReference node) { + return visit((MethodReference)node); + } + + @Override + public void endVisit(ExpressionMethodReference node) { + endVisit((MethodReference)node); + } + + @Override + public boolean visit(SuperMethodReference node) { + return visit((MethodReference)node); + } + + @Override + public void endVisit(SuperMethodReference node) { + endVisit((MethodReference)node); + } + + @Override + public boolean visit(TypeMethodReference node) { + return visit((MethodReference)node); + } + + @Override + public void endVisit(TypeMethodReference node) { + endVisit((MethodReference)node); + } + + //---- End MethodReference Hierarchy ------------------------------------ + //---- Begin Name Hierarchy ---------------------------------- public boolean visit(Name node) { return visit((Expression)node); @@ -1017,63 +994,93 @@ public void endVisit(Type node) { endVisit((ASTNode)node); } - @Override - public boolean visit(ArrayType node) { +//---- Begin Annotatable Type Hierarchy -------------------------------------- + public boolean visit(AnnotatableType node) { return visit((Type)node); } - - @Override - public void endVisit(ArrayType node) { + + public void endVisit(AnnotatableType node) { endVisit((Type)node); } @Override - public boolean visit(ParameterizedType node) { - return visit((Type)node); + public boolean visit(PackageQualifiedType node) { + return visit((AnnotatableType)node); } @Override - public void endVisit(ParameterizedType node) { - endVisit((Type)node); + public void endVisit(PackageQualifiedType node) { + endVisit((AnnotatableType)node); } @Override public boolean visit(PrimitiveType node) { - return visit((Type)node); + return visit((AnnotatableType)node); } @Override public void endVisit(PrimitiveType node) { - endVisit((Type)node); + endVisit((AnnotatableType)node); } @Override public boolean visit(QualifiedType node) { - return visit((Type)node); + return visit((AnnotatableType)node); } @Override public void endVisit(QualifiedType node) { - endVisit((Type)node); + endVisit((AnnotatableType)node); } @Override public boolean visit(SimpleType node) { - return visit((Type)node); + return visit((AnnotatableType)node); } @Override public void endVisit(SimpleType node) { - endVisit((Type)node); + endVisit((AnnotatableType)node); } @Override public boolean visit(WildcardType node) { - return visit((Type)node); + return visit((AnnotatableType)node); } @Override public void endVisit(WildcardType node) { + endVisit((AnnotatableType)node); + } +//---- End Annotatable Type Hierarchy -------------------------------------- + + @Override + public boolean visit(ArrayType node) { + return visit((Type)node); + } + + @Override + public void endVisit(ArrayType node) { + endVisit((Type)node); + } + + @Override + public boolean visit(IntersectionType node) { + return visit((Type)node); + } + + @Override + public void endVisit(IntersectionType node) { + endVisit((Type)node); + } + + @Override + public boolean visit(ParameterizedType node) { + return visit((Type)node); + } + + @Override + public void endVisit(ParameterizedType node) { endVisit((Type)node); } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/TypeContextChecker.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/TypeContextChecker.java index 36195fc2b4..581bb586ac 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/TypeContextChecker.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/TypeContextChecker.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -404,9 +408,9 @@ private static boolean isVoidArrayType(Type type){ return false; ArrayType arrayType= (ArrayType)type; - if (! arrayType.getComponentType().isPrimitiveType()) + if (! arrayType.getElementType().isPrimitiveType()) return false; - PrimitiveType primitiveType= (PrimitiveType)arrayType.getComponentType(); + PrimitiveType primitiveType= (PrimitiveType) arrayType.getElementType(); return (primitiveType.getPrimitiveTypeCode() == PrimitiveType.VOID); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ASTProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ASTProvider.java index a405ae2805..ccc56e78be 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ASTProvider.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ASTProvider.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -202,7 +206,7 @@ private boolean isJavaEditor(IWorkbenchPartReference ref) { } } - public static final int SHARED_AST_LEVEL= AST.JLS4; + public static final int SHARED_AST_LEVEL= AST.JLS8; public static final boolean SHARED_AST_STATEMENT_RECOVERY= true; public static final boolean SHARED_BINDING_RECOVERY= true; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java index b989651a60..6b8a04ee0c 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -14,8 +18,6 @@ import java.util.Iterator; import java.util.List; -import org.eclipse.jdt.core.dom.AST; -import org.eclipse.jdt.core.dom.ASTMatcher; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; @@ -36,6 +38,7 @@ import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.SuperConstructorInvocation; import org.eclipse.jdt.core.dom.SuperMethodInvocation; +import org.eclipse.jdt.core.dom.TagElement; import org.eclipse.jdt.core.dom.ThrowStatement; import org.eclipse.jdt.core.dom.TryStatement; import org.eclipse.jdt.core.dom.Type; @@ -48,6 +51,7 @@ import org.eclipse.jdt.internal.corext.dom.Bindings; import org.eclipse.jdt.internal.corext.util.Messages; +import org.eclipse.jdt.internal.ui.text.correction.ASTResolving; import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; public class ExceptionOccurrencesFinder extends ASTVisitor implements IOccurrencesFinder { @@ -57,7 +61,7 @@ public class ExceptionOccurrencesFinder extends ASTVisitor implements IOccurrenc public static final String IS_EXCEPTION= "isException"; //$NON-NLS-1$ private CompilationUnit fASTRoot; - private Name fSelectedName; + private ASTNode fSelectedNode; private ITypeBinding fException; private ASTNode fStart; @@ -76,27 +80,55 @@ public String initialize(CompilationUnit root, int offset, int length) { public String initialize(CompilationUnit root, ASTNode node) { fASTRoot= root; - if (!(node instanceof Name)) { + if (node == null) return SearchMessages.ExceptionOccurrencesFinder_no_exception; + + MethodDeclaration method= ASTResolving.findParentMethodDeclaration(node); + if (method == null) + return SearchMessages.ExceptionOccurrencesFinder_no_exception; + + // The ExceptionOccurrencesFinder selects the whole type, no matter what part of it was selected. MethodExitsFinder behaves similar. + + if (node instanceof Name) { + node= ASTNodes.getTopMostName((Name) node); } - fSelectedName= ASTNodes.getTopMostName((Name)node); - ASTNode parent= fSelectedName.getParent(); - MethodDeclaration decl= resolveMethodDeclaration(parent); - if (decl != null && methodThrowsException(decl, fSelectedName)) { - fException= fSelectedName.resolveTypeBinding(); - fStart= decl.getBody(); - } else if (parent instanceof Type) { - parent= parent.getParent(); - if (parent instanceof UnionType) { - parent= parent.getParent(); + ASTNode parent= node.getParent(); + if (node.getLocationInParent() == TagElement.FRAGMENTS_PROPERTY) { + // in Javadoc tag: + TagElement tagElement= (TagElement) parent; + String tagName= tagElement.getTagName(); + if (node instanceof Name + && node == tagElement.fragments().get(0) + && (TagElement.TAG_EXCEPTION.equals(tagName) || TagElement.TAG_THROWS.equals(tagName))) { + fSelectedNode= node; + fException= ((Name) node).resolveTypeBinding(); + fStart= method; } - if (parent instanceof SingleVariableDeclaration && parent.getParent() instanceof CatchClause) { - CatchClause catchClause= (CatchClause)parent.getParent(); - fTryStatement= (TryStatement)catchClause.getParent(); - if (fTryStatement != null) { - fException= fSelectedName.resolveTypeBinding(); - fStart= fTryStatement.getBody(); - } + + } else { + Type type= ASTNodes.getTopMostType(node); + if (type == null) { + return SearchMessages.ExceptionOccurrencesFinder_no_exception; + } + + // in method's "throws" list: + if (type.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { + fSelectedNode= type; + fException= type.resolveBinding(); + fStart= method; + } + + // in catch clause: + Type topType= type; + if (type.getLocationInParent() == UnionType.TYPES_PROPERTY) { + topType= (Type) type.getParent(); + } + if (topType.getLocationInParent() == SingleVariableDeclaration.TYPE_PROPERTY + && topType.getParent().getLocationInParent() == CatchClause.EXCEPTION_PROPERTY) { + fSelectedNode= type; + fException= type.resolveBinding(); + fTryStatement= (TryStatement) topType.getParent().getParent().getParent(); + fStart= fTryStatement.getBody(); } } if (fException == null || fStart == null) @@ -105,67 +137,44 @@ public String initialize(CompilationUnit root, ASTNode node) { return null; } - private MethodDeclaration resolveMethodDeclaration(ASTNode node) { - if (node instanceof MethodDeclaration) - return (MethodDeclaration)node; - Javadoc doc= (Javadoc) ASTNodes.getParent(node, ASTNode.JAVADOC); - if (doc == null) - return null; - if (doc.getParent() instanceof MethodDeclaration) - return (MethodDeclaration) doc.getParent(); - return null; - } - - private boolean methodThrowsException(MethodDeclaration method, Name exception) { - ASTMatcher matcher = new ASTMatcher(); - for (Iterator iter = method.thrownExceptions().iterator(); iter.hasNext();) { - Name thrown = iter.next(); - if (exception.subtreeMatch(matcher, thrown)) - return true; - } - return false; - } - private void performSearch() { fCaughtExceptions= new ArrayList(); fStart.accept(this); if (fTryStatement != null) { handleResourceDeclarations(fTryStatement); } - if (fSelectedName != null) { - fResult.add(new OccurrenceLocation(fSelectedName.getStartPosition(), fSelectedName.getLength(), F_EXCEPTION_DECLARATION, fDescription)); + if (fSelectedNode != null) { + fResult.add(new OccurrenceLocation(fSelectedNode.getStartPosition(), fSelectedNode.getLength(), F_EXCEPTION_DECLARATION, fDescription)); } } private void handleResourceDeclarations(TryStatement tryStatement) { - if (tryStatement.getAST().apiLevel() >= AST.JLS4) { - List resources= tryStatement.resources(); - for (Iterator iterator= resources.iterator(); iterator.hasNext();) { - iterator.next().accept(this); - } + List resources= tryStatement.resources(); + for (Iterator iterator= resources.iterator(); iterator.hasNext();) { + iterator.next().accept(this); + } - //check if the exception is thrown as a result of resource#close() - boolean exitMarked= false; - for (VariableDeclarationExpression variable : resources) { - Type type= variable.getType(); - IMethodBinding methodBinding= Bindings.findMethodInHierarchy(type.resolveBinding(), "close", new ITypeBinding[0]); //$NON-NLS-1$ - if (methodBinding != null) { - ITypeBinding[] exceptionTypes= methodBinding.getExceptionTypes(); - for (int j= 0; j < exceptionTypes.length; j++) { - if (matches(exceptionTypes[j])) { // a close() throws the caught exception - // mark name of resource - for (VariableDeclarationFragment fragment : (List) variable.fragments()) { - SimpleName name= fragment.getName(); - fResult.add(new OccurrenceLocation(name.getStartPosition(), name.getLength(), 0, fDescription)); - } - if (!exitMarked) { - // mark exit position - exitMarked= true; - Block body= tryStatement.getBody(); - int offset= body.getStartPosition() + body.getLength() - 1; // closing bracket of try block - fResult.add(new OccurrenceLocation(offset, 1, 0, Messages.format(SearchMessages.ExceptionOccurrencesFinder_occurrence_implicit_close_description, - BasicElementLabels.getJavaElementName(fException.getName())))); - } + //check if the exception is thrown as a result of resource#close() + boolean exitMarked= false; + for (VariableDeclarationExpression variable : resources) { + Type type= variable.getType(); + IMethodBinding methodBinding= Bindings.findMethodInHierarchy(type.resolveBinding(), "close", new ITypeBinding[0]); //$NON-NLS-1$ + if (methodBinding != null) { + ITypeBinding[] exceptionTypes= methodBinding.getExceptionTypes(); + for (int j= 0; j < exceptionTypes.length; j++) { + if (matches(exceptionTypes[j])) { // a close() throws the caught exception + // mark name of resource + for (VariableDeclarationFragment fragment : (List) variable.fragments()) { + SimpleName name= fragment.getName(); + fResult.add(new OccurrenceLocation(name.getStartPosition(), name.getLength(), 0, fDescription)); + } + if (!exitMarked) { + // mark exit position + exitMarked= true; + Block body= tryStatement.getBody(); + int offset= body.getStartPosition() + body.getLength() - 1; // closing bracket of try block + fResult.add(new OccurrenceLocation(offset, 1, 0, Messages.format(SearchMessages.ExceptionOccurrencesFinder_occurrence_implicit_close_description, + BasicElementLabels.getJavaElementName(fException.getName())))); } } } @@ -195,8 +204,8 @@ public String getJobLabel() { } public String getElementName() { - if (fSelectedName != null) { - return ASTNodes.asString(fSelectedName); + if (fSelectedNode != null) { + return ASTNodes.asString(fSelectedNode); } return null; } @@ -241,6 +250,34 @@ public boolean visit(ConstructorInvocation node) { return super.visit(node); } + @Override + public boolean visit(MethodDeclaration node) { + Javadoc javadoc= node.getJavadoc(); + if (javadoc != null) { + List tags= javadoc.tags(); + for (TagElement tag : tags) { + String tagName= tag.getTagName(); + if (TagElement.TAG_EXCEPTION.equals(tagName) || TagElement.TAG_THROWS.equals(tagName)) { + ASTNode name= (ASTNode) tag.fragments().get(0); + if (name instanceof Name) { + if (name != fSelectedNode && Bindings.equals(fException, ((Name) name).resolveBinding())) { + fResult.add(new OccurrenceLocation(name.getStartPosition(), name.getLength(), 0, fDescription)); + } + } + } + } + } + List thrownExceptionTypes= node.thrownExceptionTypes(); + for (Iterator iter= thrownExceptionTypes.iterator(); iter.hasNext(); ) { + Type type = iter.next(); + if (type != fSelectedNode && Bindings.equals(fException, type.resolveBinding())) { + fResult.add(new OccurrenceLocation(type.getStartPosition(), type.getLength(), 0, fDescription)); + } + } + node.getBody().accept(this); + return false; + } + @Override public boolean visit(MethodInvocation node) { if (matches(node.resolveMethodBinding())) { @@ -249,7 +286,7 @@ public boolean visit(MethodInvocation node) { } return super.visit(node); } - + @Override public boolean visit(SuperConstructorInvocation node) { if (matches(node.resolveConstructorBinding())) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MethodExitsFinder.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MethodExitsFinder.java index 9208804968..3f2d922a5e 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MethodExitsFinder.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MethodExitsFinder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -14,7 +14,6 @@ import java.util.Iterator; import java.util.List; -import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; @@ -29,7 +28,6 @@ import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.SimpleName; @@ -85,19 +83,10 @@ public String initialize(CompilationUnit root, ASTNode node) { } - Type type= null; - if (node instanceof Type) { - type= (Type)node; - } else if (node instanceof Name) { - Name name= ASTNodes.getTopMostName((Name)node); - if (name.getParent() instanceof Type) { - type= (Type)name.getParent(); - } - } + Type type= ASTNodes.getTopMostType(node); if (type == null) return SearchMessages.MethodExitsFinder_no_return_type_selected; - type= ASTNodes.getTopMostType(type); - if (!(type.getParent() instanceof MethodDeclaration)) + if (type.getLocationInParent() != MethodDeclaration.RETURN_TYPE2_PROPERTY) return SearchMessages.MethodExitsFinder_no_return_type_selected; fMethodDeclaration= (MethodDeclaration)type.getParent(); @@ -203,34 +192,32 @@ public boolean visit(TryStatement node) { } node.getBody().accept(this); - if (node.getAST().apiLevel() >= AST.JLS4) { - List resources= node.resources(); - for (Iterator iterator= resources.iterator(); iterator.hasNext();) { - iterator.next().accept(this); - } + List resources= node.resources(); + for (Iterator iterator= resources.iterator(); iterator.hasNext();) { + iterator.next().accept(this); + } - //check if the method could exit as a result of resource#close() - boolean exitMarked= false; - for (VariableDeclarationExpression variable : resources) { - Type type= variable.getType(); - IMethodBinding methodBinding= Bindings.findMethodInHierarchy(type.resolveBinding(), "close", new ITypeBinding[0]); //$NON-NLS-1$ - if (methodBinding != null) { - ITypeBinding[] exceptionTypes= methodBinding.getExceptionTypes(); - for (int j= 0; j < exceptionTypes.length; j++) { - if (isExitPoint(exceptionTypes[j])) { // a close() throws an uncaught exception - // mark name of resource - for (VariableDeclarationFragment fragment : (List) variable.fragments()) { - SimpleName name= fragment.getName(); - fResult.add(new OccurrenceLocation(name.getStartPosition(), name.getLength(), 0, fExitDescription)); - } - if (!exitMarked) { - // mark exit position - exitMarked= true; - Block body= node.getBody(); - int offset= body.getStartPosition() + body.getLength() - 1; // closing bracket of try block - fResult.add(new OccurrenceLocation(offset, 1, 0, Messages.format(SearchMessages.MethodExitsFinder_occurrence_exit_impclict_close_description, - BasicElementLabels.getJavaElementName(fMethodDeclaration.getName().toString())))); - } + //check if the method could exit as a result of resource#close() + boolean exitMarked= false; + for (VariableDeclarationExpression variable : resources) { + Type type= variable.getType(); + IMethodBinding methodBinding= Bindings.findMethodInHierarchy(type.resolveBinding(), "close", new ITypeBinding[0]); //$NON-NLS-1$ + if (methodBinding != null) { + ITypeBinding[] exceptionTypes= methodBinding.getExceptionTypes(); + for (int j= 0; j < exceptionTypes.length; j++) { + if (isExitPoint(exceptionTypes[j])) { // a close() throws an uncaught exception + // mark name of resource + for (VariableDeclarationFragment fragment : (List) variable.fragments()) { + SimpleName name= fragment.getName(); + fResult.add(new OccurrenceLocation(name.getStartPosition(), name.getLength(), 0, fExitDescription)); + } + if (!exitMarked) { + // mark exit position + exitMarked= true; + Block body= node.getBody(); + int offset= body.getStartPosition() + body.getLength() - 1; // closing bracket of try block + fResult.add(new OccurrenceLocation(offset, 1, 0, Messages.format(SearchMessages.MethodExitsFinder_occurrence_exit_impclict_close_description, + BasicElementLabels.getJavaElementName(fMethodDeclaration.getName().toString())))); } } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ASTResolving.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ASTResolving.java index db17f5869c..d0c15f6e8b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ASTResolving.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ASTResolving.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -49,6 +53,7 @@ import org.eclipse.jdt.core.dom.InfixExpression; import org.eclipse.jdt.core.dom.Initializer; import org.eclipse.jdt.core.dom.InstanceofExpression; +import org.eclipse.jdt.core.dom.LambdaExpression; import org.eclipse.jdt.core.dom.MemberValuePair; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; @@ -229,12 +234,11 @@ private static ITypeBinding getPossibleReferenceBinding(ASTNode node) { return getReducedDimensionBinding(annotMember.getReturnType(), dim); } } - if (creationType != null) { - while ((creationType instanceof ArrayType) && dim > 0) { - creationType= ((ArrayType) creationType).getComponentType(); - dim--; + if (creationType instanceof ArrayType) { + ITypeBinding creationTypeBinding= ((ArrayType) creationType).resolveBinding(); + if (creationTypeBinding != null) { + return Bindings.getComponentType(creationTypeBinding, dim); } - return creationType.resolveBinding(); } break; case ASTNode.CONDITIONAL_EXPRESSION: @@ -419,11 +423,7 @@ private static ITypeBinding getPossibleTypeBinding(ASTNode node) { ASTNode parent= node.getParent(); switch (parent.getNodeType()) { case ASTNode.ARRAY_TYPE: { - int dim= 1; - while (parent.getParent() instanceof ArrayType) { - parent= parent.getParent(); - dim++; - } + int dim= ((ArrayType) parent).getDimensions(); ITypeBinding parentBinding= getPossibleTypeBinding(parent); if (parentBinding != null && parentBinding.getDimensions() == dim) { return parentBinding.getElementType(); @@ -497,9 +497,9 @@ private static ITypeBinding getPossibleTypeBinding(ASTNode node) { if (TagElement.TAG_THROWS.equals(tagElement.getTagName()) || TagElement.TAG_EXCEPTION.equals(tagElement.getTagName())) { ASTNode methNode= tagElement.getParent().getParent(); if (methNode instanceof MethodDeclaration) { - List thrownExceptions= ((MethodDeclaration) methNode).thrownExceptions(); + List thrownExceptions= ((MethodDeclaration) methNode).thrownExceptionTypes(); if (thrownExceptions.size() == 1) { - return thrownExceptions.get(0).resolveTypeBinding(); + return thrownExceptions.get(0).resolveBinding(); } } } @@ -680,19 +680,17 @@ public static ASTNode findParentType(ASTNode node) { } /** - * Returns the method binding of the node's parent method declaration or null if - * the node is not inside a method. + * The node's enclosing method declaration or null if + * the node is not inside a method and is not a method declaration itself. * - * @param node the ast node - * @return the method binding of the node's parent method declaration or null if - * the node + * @param node a node + * @return the enclosing method declaration or null */ public static MethodDeclaration findParentMethodDeclaration(ASTNode node) { while (node != null) { - if (node.getNodeType() == ASTNode.METHOD_DECLARATION) { + if (node instanceof MethodDeclaration) { return (MethodDeclaration) node; - } - if (node instanceof AbstractTypeDeclaration || node instanceof AnonymousClassDeclaration) { + } else if (node instanceof BodyDeclaration || node instanceof AnonymousClassDeclaration || node instanceof LambdaExpression) { return null; } node= node.getParent(); @@ -854,7 +852,7 @@ private static int internalGetPossibleTypeKinds(ASTNode node) { kind= SimilarElementsRequestor.INTERFACES; break; case ASTNode.METHOD_DECLARATION: - if (node.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY) { + if (node.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { kind= SimilarElementsRequestor.CLASSES; } else if (node.getLocationInParent() == MethodDeclaration.RETURN_TYPE2_PROPERTY) { kind= SimilarElementsRequestor.ALL_TYPES | SimilarElementsRequestor.VOIDTYPE; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java index 6ac4a42cfb..95fbaa6f91 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2007, 2011 IBM Corporation and others. + * Copyright (c) 2007, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -31,7 +35,7 @@ *

Clients can make the following assumptions about the AST: *

*
  • the AST has a {@link ITypeRoot} as source: {@link CompilationUnit#getTypeRoot()} is not null.
  • - *
  • the {@link AST#apiLevel() AST API level} is {@link AST#JLS4 API level 4} or higher
  • + *
  • the {@link AST#apiLevel() AST API level} is {@link AST#JLS8 API level 8} or higher
  • *
  • the AST has bindings resolved ({@link AST#hasResolvedBindings()})
  • *
  • {@link AST#hasStatementsRecovery() statement} and {@link AST#hasBindingsRecovery() bindings} * recovery are enabled From c11b26a1362f47a11287b295af6e00b350648613 Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Thu, 24 Oct 2013 16:57:46 +0200 Subject: [PATCH 040/169] Fixed bug 403924: [1.8] Replace usages of MethodDeclaration#thrownExceptions() in the AST --- .../ImportReferencesCollector.java | 5 ++- .../corext/codemanipulation/StubUtility2.java | 8 ++-- .../ConvertAnonymousToNestedRefactoring.java | 12 ++++-- .../code/ExtractMethodRefactoring.java | 11 ++++-- .../code/IntroduceFactoryRefactoring.java | 12 +++--- .../code/IntroduceIndirectionRefactoring.java | 10 +++-- .../refactoring/code/flow/FlowAnalyzer.java | 8 +++- .../structure/ChangeSignatureProcessor.java | 34 +++++++++-------- .../structure/ChangeTypeRefactoring.java | 8 +++- .../structure/HierarchyProcessor.java | 11 ++++-- .../structure/ReferenceFinderUtil.java | 11 ++++-- .../SuperTypeConstraintsCreator.java | 10 +++-- .../surround/ExceptionAnalyzer.java | 14 ++++--- .../correction/JavadocTagsSubProcessor.java | 22 ++++++----- .../LocalCorrectionsSubProcessor.java | 12 ++++-- .../text/correction/QuickAssistProcessor.java | 15 ++++---- .../AbstractMethodCorrectionProposal.java | 11 ++++-- .../ChangeMethodSignatureProposal.java | 37 ++++++++++--------- .../ConstructorFromSuperclassProposal.java | 13 +++++-- .../proposals/NewCUUsingWizardProposal.java | 8 +++- .../proposals/NewDefiningMethodProposal.java | 17 +++++---- .../NewMethodCorrectionProposal.java | 8 +++- 22 files changed, 182 insertions(+), 115 deletions(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java index 234ce1f603..f2e78fc57d 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ImportReferencesCollector.java @@ -392,8 +392,9 @@ public boolean visit(MethodDeclaration node) { doVisitNode(node.getReturnType2()); } // name not visited - // receiverType and receiverQualifier not visited: - // These type names cannot be shadowed by an import (qualification is always redundant except for type annotations). + doVisitNode(node.getReceiverType()); + // receiverQualifier not visited: + // Enclosing class names cannot be shadowed by an import (qualification is always redundant). doVisitChildren(node.parameters()); doVisitChildren(node.extraDimensions()); doVisitChildren(node.thrownExceptionTypes()); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java index a296997b2b..56a5b4ccb4 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2.java @@ -5,10 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * - * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and - * is made available for testing and evaluation purposes only. - * The code is not compatible with any specification of the JCP. - * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java index 525f3bfe1f..d579e40e08 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * N.Metchev@teamphone.com - contributed fixes for @@ -926,7 +930,7 @@ private MethodDeclaration createNewConstructor(CompilationUnitRewrite rewrite, I } } - addExceptionsToNewConstructor(newConstructor); + addExceptionsToNewConstructor(newConstructor, importRewrite); if (doAddComments()) { try { @@ -1027,14 +1031,14 @@ private static boolean parameterTypesMatch(IMethodBinding m1, IMethodBinding m2) return true; } - private void addExceptionsToNewConstructor(MethodDeclaration newConstructor) { + private void addExceptionsToNewConstructor(MethodDeclaration newConstructor, ImportRewrite importRewrite) { IMethodBinding constructorBinding= getSuperConstructorBinding(); if (constructorBinding == null) return; ITypeBinding[] exceptions= constructorBinding.getExceptionTypes(); for (int i= 0; i < exceptions.length; i++) { - Name exceptionTypeName= fAnonymousInnerClassNode.getAST().newName(Bindings.getNameComponents(exceptions[i])); - newConstructor.thrownExceptions().add(exceptionTypeName); + Type exceptionType= importRewrite.addImport(exceptions[i], fAnonymousInnerClassNode.getAST()); + newConstructor.thrownExceptionTypes().add(exceptionType); } } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java index 0279d0bf92..c9470fc270 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Benjamin Muskalla - [extract method] Does not replace similar code in parent class of anonymous class - https://bugs.eclipse.org/bugs/show_bug.cgi?id=160853 @@ -75,7 +79,6 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.ParenthesizedExpression; import org.eclipse.jdt.core.dom.QualifiedName; import org.eclipse.jdt.core.dom.ReturnStatement; @@ -1018,11 +1021,11 @@ private MethodDeclaration createNewMethodDeclaration() { parameters.add(parameter); } - List exceptions= result.thrownExceptions(); + List exceptions= result.thrownExceptionTypes(); ITypeBinding[] exceptionTypes= fAnalyzer.getExceptions(fThrowRuntimeExceptions); for (int i= 0; i < exceptionTypes.length; i++) { ITypeBinding exceptionType= exceptionTypes[i]; - exceptions.add(ASTNodeFactory.newName(fAST, fImportRewriter.addImport(exceptionType, context))); + exceptions.add(fImportRewriter.addImport(exceptionType, fAST, context)); } return result; } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceFactoryRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceFactoryRefactoring.java index 83a45b2754..551a2892b9 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceFactoryRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceFactoryRefactoring.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -708,12 +712,10 @@ private void createFactoryMethodSignature(AST ast, MethodDeclaration newMethod) } ITypeBinding[] ctorExcepts= fCtorBinding.getExceptionTypes(); - List exceptions= newMethod.thrownExceptions(); + List exceptions= newMethod.thrownExceptionTypes(); for(int i=0; i < ctorExcepts.length; i++) { - String excName= fImportRewriter.addImport(ctorExcepts[i]); - - exceptions.add(ASTNodeFactory.newName(ast, excName)); + exceptions.add(fImportRewriter.addImport(ctorExcepts[i], ast)); } copyTypeParameters(ast, newMethod); diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceIndirectionRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceIndirectionRefactoring.java index 8dabab01ad..884c25554e 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceIndirectionRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceIndirectionRefactoring.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -946,8 +950,8 @@ private void copyTypeParameters(MethodDeclaration intermediary, CompilationUnitR private void copyExceptions(MethodDeclaration intermediary, CompilationUnitRewrite imRewrite) { ITypeBinding[] exceptionTypes= fTargetMethodBinding.getExceptionTypes(); for (int i= 0; i < exceptionTypes.length; i++) { - final String qualifiedName= imRewrite.getImportRewrite().addImport(exceptionTypes[i]); - intermediary.thrownExceptions().add(ASTNodeFactory.newName(imRewrite.getAST(), qualifiedName)); + Type exceptionType= imRewrite.getImportRewrite().addImport(exceptionTypes[i], imRewrite.getAST()); + intermediary.thrownExceptionTypes().add(exceptionType); } } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java index 06b797bd98..a2a2fcc90e 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -711,7 +715,7 @@ public void endVisit(MethodDeclaration node) { return; GenericSequentialFlowInfo info= processSequential(node, node.getReturnType2()); process(info, node.parameters()); - process(info, node.thrownExceptions()); + process(info, node.thrownExceptionTypes()); process(info, node.getBody()); } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java index 42b05b38b9..cd2fa425ef 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -780,11 +784,11 @@ private RefactoringStatus createExceptionInfoList() { if (nameNode == null || !(nameNode instanceof Name) || !(nameNode.getParent() instanceof MethodDeclaration)) return null; MethodDeclaration methodDeclaration= (MethodDeclaration) nameNode.getParent(); - List exceptions= methodDeclaration.thrownExceptions(); + List exceptions= methodDeclaration.thrownExceptionTypes(); List result= new ArrayList(exceptions.size()); for (int i= 0; i < exceptions.size(); i++) { - Name name= exceptions.get(i); - ITypeBinding typeBinding= name.resolveTypeBinding(); + Type type= exceptions.get(i); + ITypeBinding typeBinding= type.resolveBinding(); if (typeBinding == null) return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.ChangeSignatureRefactoring_no_exception_binding); IJavaElement element= typeBinding.getJavaElement(); @@ -2121,17 +2125,17 @@ private void changeExceptions() { if (info.isOld()) continue; if (info.isDeleted()) - removeExceptionFromNodeList(info, fMethDecl.thrownExceptions()); + removeExceptionFromNodeList(info, fMethDecl.thrownExceptionTypes()); else - addExceptionToNodeList(info, getASTRewrite().getListRewrite(fMethDecl, MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY)); + addExceptionToNodeList(info, getASTRewrite().getListRewrite(fMethDecl, MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY)); } } - private void removeExceptionFromNodeList(ExceptionInfo toRemove, List list) { + private void removeExceptionFromNodeList(ExceptionInfo toRemove, List list) { ITypeBinding typeToRemove= toRemove.getTypeBinding(); - for (Iterator iter= list.iterator(); iter.hasNext(); ) { - Name currentName= iter.next(); - ITypeBinding currentType= currentName.resolveTypeBinding(); + for (Iterator iter= list.iterator(); iter.hasNext();) { + Type currentExcType= iter.next(); + ITypeBinding currentType= currentExcType.resolveBinding(); /* Maybe remove all subclasses of typeToRemove too. * Problem: * - B extends A; @@ -2143,8 +2147,8 @@ private void removeExceptionFromNodeList(ExceptionInfo toRemove, List list if (currentType == null) continue; // newly added or unresolvable type if (Bindings.equals(currentType, typeToRemove) || toRemove.getElement().getElementName().equals(currentType.getName())) { - getASTRewrite().remove(currentName, fDescription); - registerImportRemoveNode(currentName); + getASTRewrite().remove(currentExcType, fDescription); + registerImportRemoveNode(currentExcType); } } } @@ -2152,9 +2156,9 @@ private void removeExceptionFromNodeList(ExceptionInfo toRemove, List list private void addExceptionToNodeList(ExceptionInfo exceptionInfo, ListRewrite exceptionListRewrite) { String fullyQualified= exceptionInfo.getFullyQualifiedName(); for (Iterator iter= exceptionListRewrite.getOriginalList().iterator(); iter.hasNext(); ) { - Name exName= (Name) iter.next(); + Type exType= (Type) iter.next(); //XXX: existing superclasses of the added exception are redundant and could be removed - ITypeBinding typeBinding= exName.resolveTypeBinding(); + ITypeBinding typeBinding= exType.resolveBinding(); if (typeBinding == null) continue; // newly added or unresolvable type if (typeBinding.getQualifiedName().equals(fullyQualified)) @@ -2162,7 +2166,7 @@ private void addExceptionToNodeList(ExceptionInfo exceptionInfo, ListRewrite exc } String importedType= getImportRewrite().addImport(exceptionInfo.getFullyQualifiedName()); getImportRemover().registerAddedImport(importedType); - ASTNode exNode= getASTRewrite().createStringPlaceholder(importedType, ASTNode.SIMPLE_NAME); + ASTNode exNode= getASTRewrite().createStringPlaceholder(importedType, ASTNode.SIMPLE_TYPE); exceptionListRewrite.insertLast(exNode, fDescription); } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeTypeRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeTypeRefactoring.java index ee16c42219..306d7956b8 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeTypeRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeTypeRefactoring.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -926,7 +930,7 @@ private String simpleNameSelected(SimpleName simpleName) { } else if (parent.getNodeType() == ASTNode.METHOD_DECLARATION && grandParent.getNodeType() == ASTNode.TYPE_DECLARATION) { MethodDeclaration methodDeclaration= (MethodDeclaration)parent; - if (methodDeclaration.getName().equals(simpleName) || methodDeclaration.thrownExceptions().contains(simpleName)){ + if (methodDeclaration.getName().equals(simpleName)) { return RefactoringCoreMessages.ChangeTypeRefactoring_notSupportedOnNodeType; } fMethodBinding= ((MethodDeclaration)parent).resolveBinding(); diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java index 726fd5f071..64275c2c1f 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2006, 2012 IBM Corporation and others. + * Copyright (c) 2006, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -64,7 +68,6 @@ import org.eclipse.jdt.core.dom.Javadoc; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.Type; @@ -242,8 +245,8 @@ protected static void copyJavadocNode(final ASTRewrite rewrite, final BodyDeclar protected static void copyThrownExceptions(final MethodDeclaration oldMethod, final MethodDeclaration newMethod) { final AST ast= newMethod.getAST(); - for (int index= 0, n= oldMethod.thrownExceptions().size(); index < n; index++) - newMethod.thrownExceptions().add(ASTNode.copySubtree(ast, (Name) oldMethod.thrownExceptions().get(index))); + for (int index= 0, n= oldMethod.thrownExceptionTypes().size(); index < n; index++) + newMethod.thrownExceptionTypes().add(ASTNode.copySubtree(ast, (Type) oldMethod.thrownExceptionTypes().get(index))); } protected static void copyTypeParameters(final MethodDeclaration oldMethod, final MethodDeclaration newMethod) { diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceFinderUtil.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceFinderUtil.java index 43059e54dc..a10a74e702 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceFinderUtil.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceFinderUtil.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -27,7 +31,6 @@ import org.eclipse.jdt.core.WorkingCopyOwner; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.search.SearchEngine; @@ -162,8 +165,8 @@ public static Set getTypesUsedInDeclaration(MethodDeclaration meth result.add(binding); } - for (Iterator iter= methodDeclaration.thrownExceptions().iterator(); iter.hasNext();) { - binding = iter.next().resolveTypeBinding(); + for (Iterator iter= methodDeclaration.thrownExceptionTypes().iterator(); iter.hasNext();) { + binding= iter.next().resolveBinding(); if (binding != null) result.add(binding); } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/constraints/SuperTypeConstraintsCreator.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/constraints/SuperTypeConstraintsCreator.java index 823027acf0..b08023a0fb 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/constraints/SuperTypeConstraintsCreator.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/constraints/SuperTypeConstraintsCreator.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -503,13 +507,13 @@ public final void endVisit(final MethodDeclaration node) { } } } - final List exceptions= node.thrownExceptions(); + final List exceptions= node.thrownExceptionTypes(); if (!exceptions.isEmpty()) { final ITypeBinding throwable= node.getAST().resolveWellKnownType("java.lang.Throwable"); //$NON-NLS-1$ if (throwable != null) { ancestor= fModel.createImmutableTypeVariable(throwable); if (ancestor != null) { - Name exception= null; + Type exception= null; for (int index= 0; index < exceptions.size(); index++) { exception= exceptions.get(index); descendant= (ConstraintVariable2) exception.getProperty(PROPERTY_CONSTRAINT_VARIABLE); diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/surround/ExceptionAnalyzer.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/surround/ExceptionAnalyzer.java index 47942a1b65..b9c05dfefb 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/surround/ExceptionAnalyzer.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/surround/ExceptionAnalyzer.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -25,10 +29,10 @@ import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.SuperConstructorInvocation; import org.eclipse.jdt.core.dom.SuperMethodInvocation; import org.eclipse.jdt.core.dom.ThrowStatement; +import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.VariableDeclarationExpression; import org.eclipse.jdt.internal.corext.dom.Bindings; @@ -69,9 +73,9 @@ public static ITypeBinding[] perform(BodyDeclaration enclosingNode, Selection se enclosingNode.accept(analyzer); List exceptions= analyzer.getCurrentExceptions(); if (enclosingNode.getNodeType() == ASTNode.METHOD_DECLARATION) { - List thrownExceptions= ((MethodDeclaration)enclosingNode).thrownExceptions(); - for (Iterator thrown= thrownExceptions.iterator(); thrown.hasNext();) { - ITypeBinding thrownException= thrown.next().resolveTypeBinding(); + List thrownExceptions= ((MethodDeclaration) enclosingNode).thrownExceptionTypes(); + for (Iterator thrown= thrownExceptions.iterator(); thrown.hasNext();) { + ITypeBinding thrownException= thrown.next().resolveBinding(); if (thrownException != null) { for (Iterator excep= exceptions.iterator(); excep.hasNext();) { ITypeBinding exception= excep.next(); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java index 77c70e8ad0..ef38f1f0c1 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -193,13 +197,13 @@ private void insertMissingJavadocTag(ASTRewrite rewrite, ASTNode missingNode, Bo newTag= ast.newTagElement(); newTag.setTagName(TagElement.TAG_RETURN); insertTag(tagsRewriter, newTag, null); - } else if (location == MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY) { + } else if (location == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { newTag= ast.newTagElement(); newTag.setTagName(TagElement.TAG_THROWS); TextElement excNode= ast.newTextElement(); excNode.setText(ASTNodes.asString(missingNode)); newTag.fragments().add(excNode); - List exceptions= ((MethodDeclaration) bodyDecl).thrownExceptions(); + List exceptions= ((MethodDeclaration) bodyDecl).thrownExceptionTypes(); insertTag(tagsRewriter, newTag, getPreviousExceptionNames(exceptions, missingNode)); } else { Assert.isTrue(false, "AddMissingJavadocTagProposal: unexpected node location"); //$NON-NLS-1$ @@ -291,10 +295,10 @@ private void insertAllMissingMethodTags(ASTRewrite rewriter, MethodDeclaration m } } } - List thrownExceptions= methodDecl.thrownExceptions(); + List thrownExceptions= methodDecl.thrownExceptionTypes(); for (int i= thrownExceptions.size() - 1; i >= 0 ; i--) { - Name exception= thrownExceptions.get(i); - ITypeBinding binding= exception.resolveTypeBinding(); + Type exception= thrownExceptions.get(i); + ITypeBinding binding= exception.resolveBinding(); if (binding != null) { String name= binding.getName(); if (findThrowsTag(javadoc, name) == null) { @@ -371,7 +375,7 @@ public static void getMissingJavadocTagProposals(IInvocationContext context, IPr } } else if (location == MethodDeclaration.RETURN_TYPE2_PROPERTY) { label= CorrectionMessages.JavadocTagsSubProcessor_addjavadoc_returntag_description; - } else if (location == MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY) { + } else if (location == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { label= CorrectionMessages.JavadocTagsSubProcessor_addjavadoc_throwstag_description; } else { return; @@ -514,11 +518,11 @@ private static Set getPreviousParamNames(List return previousNames; } - private static Set getPreviousExceptionNames(List list, ASTNode missingNode) { + private static Set getPreviousExceptionNames(List list, ASTNode missingNode) { Set previousNames= new HashSet(); for (int i= 0; i < list.size() && missingNode != list.get(i); i++) { - Name curr= list.get(i); - previousNames.add(ASTNodes.getSimpleNameIdentifier(curr)); + Type curr= list.get(i); + previousNames.add(ASTNodes.getTypeName(curr)); } return previousNames; } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java index 2cf0228d77..776561b352 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Renaud Waldura <renaud+eclipse@waldura.com> - Access to static proposal @@ -406,12 +410,12 @@ public static void addUncaughtExceptionProposals(IInvocationContext context, IPr } uncaughtExceptions= unhandledExceptions.toArray(new ITypeBinding[unhandledExceptions.size()]); - List exceptions= methodDecl.thrownExceptions(); + List exceptions= methodDecl.thrownExceptionTypes(); int nExistingExceptions= exceptions.size(); ChangeDescription[] desc= new ChangeDescription[nExistingExceptions + uncaughtExceptions.length]; for (int i= 0; i < exceptions.size(); i++) { - Name elem= exceptions.get(i); - if (isSubtype(elem.resolveTypeBinding(), uncaughtExceptions)) { + Type elem= exceptions.get(i); + if (isSubtype(elem.resolveBinding(), uncaughtExceptions)) { desc[i]= new RemoveDescription(); } } @@ -751,7 +755,7 @@ public static void addUnnecessaryThrownExceptionProposal(IInvocationContext cont MethodDeclaration decl= (MethodDeclaration) selectedNode.getParent(); IMethodBinding binding= decl.resolveBinding(); if (binding != null) { - List thrownExceptions= decl.thrownExceptions(); + List thrownExceptions= decl.thrownExceptionTypes(); int index= thrownExceptions.indexOf(selectedNode); if (index == -1) { return; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java index d1ea360088..2622fd31ae 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java @@ -1359,12 +1359,11 @@ private static void removeException(ASTRewrite rewrite, UnionType unionType, Typ private static void addExceptionToThrows(AST ast, MethodDeclaration methodDeclaration, ASTRewrite rewrite, SimpleType type2) { ITypeBinding binding= type2.resolveBinding(); - if (binding == null || isNotYetThrown(binding, methodDeclaration.thrownExceptions())) { - Name name= type2.getName(); - Name newName= (Name) ASTNode.copySubtree(ast, name); + if (binding == null || isNotYetThrown(binding, methodDeclaration.thrownExceptionTypes())) { + Type newType= (Type) ASTNode.copySubtree(ast, type2); - ListRewrite listRewriter= rewrite.getListRewrite(methodDeclaration, MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY); - listRewriter.insertLast(newName, null); + ListRewrite listRewriter= rewrite.getListRewrite(methodDeclaration, MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY); + listRewriter.insertLast(newType, null); } } @@ -1396,10 +1395,10 @@ private static void removeCatchBlock(ASTRewrite rewrite, CatchClause catchClause } } - private static boolean isNotYetThrown(ITypeBinding binding, List thrownExceptions) { + private static boolean isNotYetThrown(ITypeBinding binding, List thrownExceptions) { for (int i= 0; i < thrownExceptions.size(); i++) { - Name name= thrownExceptions.get(i); - ITypeBinding elem= (ITypeBinding) name.resolveBinding(); + Type name= thrownExceptions.get(i); + ITypeBinding elem= name.resolveBinding(); if (elem != null) { if (Bindings.isSuperType(elem, binding)) { // existing exception is base class of new return false; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AbstractMethodCorrectionProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AbstractMethodCorrectionProposal.java index eebd5f4666..c0736034dd 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AbstractMethodCorrectionProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AbstractMethodCorrectionProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Benjamin Muskalla - [quick fix] Create Method in void context should 'box' void. - https://bugs.eclipse.org/bugs/show_bug.cgi?id=107985 @@ -32,7 +36,6 @@ import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.Javadoc; import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.PrimitiveType; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.SimpleName; @@ -151,7 +154,7 @@ private MethodDeclaration getStub(ASTRewrite rewrite, ASTNode targetTypeDecl) th } addNewParameters(rewrite, takenNames, decl.parameters()); - addNewExceptions(rewrite, decl.thrownExceptions()); + addNewExceptions(rewrite, decl.thrownExceptionTypes()); Block body= null; if (!fSenderBinding.isInterface()) { @@ -206,7 +209,7 @@ private int findConstructorInsertIndex(List decls) { protected abstract void addNewModifiers(ASTRewrite rewrite, ASTNode targetTypeDecl, List exceptions); protected abstract void addNewTypeParameters(ASTRewrite rewrite, List takenNames, List params) throws CoreException; protected abstract void addNewParameters(ASTRewrite rewrite, List takenNames, List params) throws CoreException; - protected abstract void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException; + protected abstract void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException; protected abstract SimpleName getNewName(ASTRewrite rewrite); protected abstract Type getNewMethodType(ASTRewrite rewrite) throws CoreException; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java index b43f5fb55a..35e21b3016 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -30,7 +34,6 @@ import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.Javadoc; import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.TagElement; @@ -364,9 +367,9 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) ImportRewrite imports= getImportRewrite(); ImportRewriteContext context= new ContextSensitiveImportRewriteContext(methodDecl, imports); - ListRewrite listRewrite= rewrite.getListRewrite(methodDecl, MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY); + ListRewrite listRewrite= rewrite.getListRewrite(methodDecl, MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY); - List exceptions= methodDecl.thrownExceptions(); // old exceptions + List exceptions= methodDecl.thrownExceptionTypes(); // old exceptions int k= 0; // index over the old exceptions for (int i= 0; i < fExceptionChanges.length; i++) { @@ -377,7 +380,7 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) } else if (curr instanceof InsertDescription) { InsertDescription desc= (InsertDescription) curr; String type= imports.addImport(desc.type, context); - ASTNode newNode= ASTNodeFactory.newName(ast, type); + ASTNode newNode= ASTNodeFactory.newType(ast, type); listRewrite.insertAt(newNode, i, null); @@ -388,7 +391,7 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) if (javadoc != null && JavadocTagsSubProcessor.findThrowsTag(javadoc, type) == null) { TagElement newTagElement= ast.newTagElement(); newTagElement.setTagName(TagElement.TAG_THROWS); - ASTNode newRef= ASTNodeFactory.newName(ast, type); + ASTNode newRef= ASTNodeFactory.newType(ast, type); newTagElement.fragments().add(newRef); insertTabStop(rewrite, newTagElement.fragments(), "throws_tagcomment" + i); //$NON-NLS-1$ insertThrowsTag(rewrite.getListRewrite(javadoc, Javadoc.TAGS_PROPERTY), exceptions, k, newTagElement); @@ -397,7 +400,7 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) } } else if (curr instanceof RemoveDescription) { - Name node= exceptions.get(k); + Type node= exceptions.get(k); listRewrite.remove(node, null); k++; @@ -409,10 +412,10 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) } else if (curr instanceof EditDescription) { EditDescription desc= (EditDescription) curr; - Name oldNode= exceptions.get(k); + Type oldNode= exceptions.get(k); String type= imports.addImport(desc.type, context); - ASTNode newNode= ASTNodeFactory.newName(ast, type); + ASTNode newNode= ASTNodeFactory.newType(ast, type); listRewrite.replace(oldNode, newNode, null); String key= getExceptionTypeGroupId(i); @@ -422,14 +425,14 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) TagElement tagNode= findThrowsTag(methodDecl, oldNode); if (tagNode != null) { - ASTNode newRef= ASTNodeFactory.newName(ast, type); + ASTNode newRef= ASTNodeFactory.newType(ast, type); rewrite.replace((ASTNode) tagNode.fragments().get(0), newRef, null); addLinkedPosition(rewrite.track(newRef), false, key); } } else if (curr instanceof SwapDescription) { - Name decl1= exceptions.get(k); - Name decl2= exceptions.get(((SwapDescription) curr).index); + Type decl1= exceptions.get(k); + Type decl2= exceptions.get(((SwapDescription) curr).index); rewrite.replace(decl1, rewrite.createCopyTarget(decl2), null); rewrite.replace(decl2, rewrite.createCopyTarget(decl1), null); @@ -453,20 +456,20 @@ private void insertTabStop(ASTRewrite rewriter, List fragments, String addLinkedPosition(rewriter.track(textElement), false, linkedName); } - private TagElement findThrowsTag(MethodDeclaration decl, Name exception) { + private TagElement findThrowsTag(MethodDeclaration decl, Type exception) { Javadoc javadoc= decl.getJavadoc(); if (javadoc != null) { - String name= ASTNodes.getSimpleNameIdentifier(exception); + String name= ASTNodes.getTypeName(exception); return JavadocTagsSubProcessor.findThrowsTag(javadoc, name); } return null; } - private TagElement insertThrowsTag(ListRewrite tagRewriter, List exceptions, int currentIndex, TagElement newTagElement) { + private TagElement insertThrowsTag(ListRewrite tagRewriter, List exceptions, int currentIndex, TagElement newTagElement) { HashSet previousNames= new HashSet(); for (int n = 0; n < currentIndex; n++) { - Name curr= exceptions.get(n); - previousNames.add(ASTNodes.getSimpleNameIdentifier(curr)); + Type curr= exceptions.get(n); + previousNames.add(ASTNodes.getTypeName(curr)); } JavadocTagsSubProcessor.insertTag(tagRewriter, newTagElement, previousNames); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ConstructorFromSuperclassProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ConstructorFromSuperclassProposal.java index eb19bbe15e..ee4dd0dd97 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ConstructorFromSuperclassProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ConstructorFromSuperclassProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -31,6 +35,7 @@ import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.SuperConstructorInvocation; +import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; @@ -161,11 +166,11 @@ private MethodDeclaration createNewMethodDeclaration(AST ast, IMethodBinding bin parameters.add(var); } - List thrownExceptions= decl.thrownExceptions(); + List thrownExceptions= decl.thrownExceptionTypes(); ITypeBinding[] excTypes= binding.getExceptionTypes(); for (int i= 0; i < excTypes.length; i++) { - String excTypeName= getImportRewrite().addImport(excTypes[i], importRewriteContext); - thrownExceptions.add(ASTNodeFactory.newName(ast, excTypeName)); + Type excType= getImportRewrite().addImport(excTypes[i], ast, importRewriteContext); + thrownExceptions.add(excType); } if (invocation == null) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewCUUsingWizardProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewCUUsingWizardProposal.java index f899f41199..952c6a41c3 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewCUUsingWizardProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewCUUsingWizardProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * Renaud Waldura <renaud+eclipse@waldura.com> * IBM Corporation - updates @@ -354,7 +358,7 @@ private ITypeBinding getPossibleSuperTypeBinding(ASTNode node) { ASTNode parent= node.getParent(); switch (parent.getNodeType()) { case ASTNode.METHOD_DECLARATION: - if (node.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTIONS_PROPERTY) { + if (node.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { return ast.resolveWellKnownType("java.lang.Exception"); //$NON-NLS-1$ } break; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java index e04108bd23..4c0e511166 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -24,7 +28,6 @@ import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.Type; @@ -33,7 +36,6 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility; -import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; @@ -135,16 +137,15 @@ protected Type getNewMethodType(ASTRewrite rewrite) throws CoreException { * @see org.eclipse.jdt.internal.ui.text.correction.proposals.AbstractMethodCorrectionProposal#addNewExceptions(org.eclipse.jdt.core.dom.rewrite.ASTRewrite, java.util.List) */ @Override - protected void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException { + protected void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException { AST ast= rewrite.getAST(); ImportRewrite importRewrite= getImportRewrite(); ITypeBinding[] bindings= fMethod.getExceptionTypes(); for (int i= 0; i < bindings.length; i++) { - String typeName= importRewrite.addImport(bindings[i]); - Name newNode= ASTNodeFactory.newName(ast, typeName); - exceptions.add(newNode); + Type newType= importRewrite.addImport(bindings[i], ast); + exceptions.add(newType); - addLinkedPosition(rewrite.track(newNode), false, "exc_type_" + i); //$NON-NLS-1$ + addLinkedPosition(rewrite.track(newType), false, "exc_type_" + i); //$NON-NLS-1$ } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewMethodCorrectionProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewMethodCorrectionProposal.java index 324f9a9948..cca977680e 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewMethodCorrectionProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewMethodCorrectionProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Benjamin Muskalla - [quick fix] Create Method in void context should 'box' void. - https://bugs.eclipse.org/bugs/show_bug.cgi?id=107985 @@ -277,7 +281,7 @@ private String evaluateParameterName(List takenNames, Expression argNode * @see org.eclipse.jdt.internal.ui.text.correction.proposals.AbstractMethodCorrectionProposal#addNewExceptions(org.eclipse.jdt.core.dom.rewrite.ASTRewrite, java.util.List) */ @Override - protected void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException { + protected void addNewExceptions(ASTRewrite rewrite, List exceptions) throws CoreException { } /* (non-Javadoc) From 99777851e7af91870ef9b5daec72dcb4467a2f47 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Thu, 24 Oct 2013 21:27:39 +0200 Subject: [PATCH 041/169] fixed NPE --- .../jdt/internal/ui/search/ExceptionOccurrencesFinder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java index 6b8a04ee0c..449bb8e2d4 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java @@ -274,7 +274,10 @@ public boolean visit(MethodDeclaration node) { fResult.add(new OccurrenceLocation(type.getStartPosition(), type.getLength(), 0, fDescription)); } } - node.getBody().accept(this); + Block body= node.getBody(); + if (body != null) { + node.getBody().accept(this); + } return false; } From 83079ba6f0bba9525f7776d99c306db57c54d2c0 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Thu, 24 Oct 2013 22:02:49 +0200 Subject: [PATCH 042/169] Bug 403924: [1.8] Replace usages of MethodDeclaration#thrownExceptions() in the AST --- .../jdt/internal/corext/dom/ASTNodes.java | 66 ++++++++++++++++--- .../correction/JavadocTagsSubProcessor.java | 5 +- .../LocalCorrectionsSubProcessor.java | 3 +- .../ChangeMethodSignatureProposal.java | 2 +- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java index 7d757434f2..bb0950f3f6 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java @@ -5,9 +5,9 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * - * This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and - * is made available for testing and evaluation purposes only. - * The code is not compatible with any specification of the JCP. + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. * * Contributors: * IBM Corporation - initial API and implementation @@ -381,9 +381,11 @@ public static ChildListPropertyDescriptor getBodyDeclarationsProperty(ASTNode no /** * Returns the simple name of the type, followed by array dimensions. * Skips qualifiers, type arguments, and type annotations. + *

    + * Does not work for WildcardTypes, etc.! * - * @param type a type - * @return the simple name + * @param type a type that has a simple name + * @return the simple name, followed by array dimensions * @see #getSimpleNameIdentifier(Name) * @since 3.9 BETA_JAVA8 */ @@ -396,26 +398,72 @@ public boolean visit(PrimitiveType node) { return false; } @Override - public boolean visit(SimpleName node) { - buffer.append(node.getIdentifier()); + public boolean visit(SimpleType node) { + buffer.append(getSimpleNameIdentifier(node.getName())); return false; } @Override - public boolean visit(QualifiedName node) { + public boolean visit(QualifiedType node) { buffer.append(node.getName().getIdentifier()); return false; } @Override + public boolean visit(PackageQualifiedType node) { + buffer.append(node.getName().getIdentifier()); + return false; + } + @Override + public boolean visit(ParameterizedType node) { + node.getType().accept(this); + return false; + } + @Override + public void endVisit(ArrayType node) { + for (int i= 0; i < node.dimensions().size(); i++) { + buffer.append("[]"); //$NON-NLS-1$ + } + } + }; + type.accept(visitor); + return buffer.toString(); + } + + /** + * Returns the (potentially qualified) name of a type, followed by array dimensions. + * Skips type arguments and type annotations. + * + * @param type a type that has a name + * @return the name, followed by array dimensions + * @since 3.9 BETA_JAVA8 + */ + public static String getQualifiedTypeName(Type type) { + final StringBuffer buffer= new StringBuffer(); + ASTVisitor visitor= new ASTVisitor() { + @Override + public boolean visit(SimpleType node) { + buffer.append(node.getName().getFullyQualifiedName()); + return false; + } + @Override public boolean visit(QualifiedType node) { + node.getQualifier().accept(this); + buffer.append('.'); buffer.append(node.getName().getIdentifier()); return false; } @Override public boolean visit(PackageQualifiedType node) { + buffer.append(node.getQualifier().getFullyQualifiedName()); + buffer.append('.'); buffer.append(node.getName().getIdentifier()); return false; } @Override + public boolean visit(ParameterizedType node) { + node.getType().accept(this); + return false; + } + @Override public void endVisit(ArrayType node) { for (int i= 0; i < node.dimensions().size(); i++) { buffer.append("[]"); //$NON-NLS-1$ @@ -425,7 +473,7 @@ public void endVisit(ArrayType node) { type.accept(visitor); return buffer.toString(); } - + public static InfixExpression.Operator convertToInfixOperator(Assignment.Operator operator) { if (operator.equals(Assignment.Operator.PLUS_ASSIGN)) return InfixExpression.Operator.PLUS; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java index ef38f1f0c1..128a543c1a 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java @@ -201,7 +201,7 @@ private void insertMissingJavadocTag(ASTRewrite rewrite, ASTNode missingNode, Bo newTag= ast.newTagElement(); newTag.setTagName(TagElement.TAG_THROWS); TextElement excNode= ast.newTextElement(); - excNode.setText(ASTNodes.asString(missingNode)); + excNode.setText(ASTNodes.getQualifiedTypeName((Type) missingNode)); newTag.fragments().add(excNode); List exceptions= ((MethodDeclaration) bodyDecl).thrownExceptionTypes(); insertTag(tagsRewriter, newTag, getPreviousExceptionNames(exceptions, missingNode)); @@ -305,7 +305,7 @@ private void insertAllMissingMethodTags(ASTRewrite rewriter, MethodDeclaration m TagElement newTag= ast.newTagElement(); newTag.setTagName(TagElement.TAG_THROWS); TextElement excNode= ast.newTextElement(); - excNode.setText(ASTNodes.asString(exception)); + excNode.setText(ASTNodes.getQualifiedTypeName(exception)); newTag.fragments().add(excNode); insertTabStop(rewriter, newTag.fragments(), "exception" + i); //$NON-NLS-1$ insertTag(tagsRewriter, newTag, getPreviousExceptionNames(thrownExceptions, exception)); @@ -421,6 +421,7 @@ public static void getUnusedAndUndocumentedParameterOrExceptionProposals(IInvoca } else if (isUnusedParam) { label= CorrectionMessages.JavadocTagsSubProcessor_document_parameter_description; } else { + node= ASTNodes.getNormalizedNode(node); label= CorrectionMessages.JavadocTagsSubProcessor_document_exception_description; } ASTRewriteCorrectionProposal proposal= new AddMissingJavadocTagProposal(label, context.getCompilationUnit(), bodyDecl, node, IProposalRelevance.DOCUMENT_UNUSED_ITEM); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java index 776561b352..cd9e66ec2d 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java @@ -749,7 +749,8 @@ public static void addUnnecessaryInstanceofProposal(IInvocationContext context, public static void addUnnecessaryThrownExceptionProposal(IInvocationContext context, IProblemLocation problem, Collection proposals) { ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot()); - if (selectedNode == null || !(selectedNode.getParent() instanceof MethodDeclaration)) { + selectedNode= ASTNodes.getNormalizedNode(selectedNode); + if (selectedNode == null || selectedNode.getLocationInParent() != MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { return; } MethodDeclaration decl= (MethodDeclaration) selectedNode.getParent(); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java index 35e21b3016..bb12a89af1 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java @@ -391,7 +391,7 @@ private void modifyExceptions(ASTRewrite rewrite, MethodDeclaration methodDecl) if (javadoc != null && JavadocTagsSubProcessor.findThrowsTag(javadoc, type) == null) { TagElement newTagElement= ast.newTagElement(); newTagElement.setTagName(TagElement.TAG_THROWS); - ASTNode newRef= ASTNodeFactory.newType(ast, type); + ASTNode newRef= ASTNodeFactory.newName(ast, type); newTagElement.fragments().add(newRef); insertTabStop(rewrite, newTagElement.fragments(), "throws_tagcomment" + i); //$NON-NLS-1$ insertThrowsTag(rewrite.getListRewrite(javadoc, Javadoc.TAGS_PROPERTY), exceptions, k, newTagElement); From fdd2ffe88c2522551bfdf7a6bcc17555761eb2bd Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Fri, 25 Oct 2013 11:27:54 +0200 Subject: [PATCH 043/169] more CHKPII ignores --- .../chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt b/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt index ce1806e64a..04f843053c 100644 --- a/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt +++ b/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ignoreFiles.txt @@ -182,3 +182,6 @@ platform-text/* tk.eclipse.plugin.htmleditor/* bug/ zz*/* +config/* +org.eclipse.osgi.tests/* +org.eclipse.e4.sdk/* From 51bb48b17cab7e2d4ece79e1fc1dcf6ca38e219b Mon Sep 17 00:00:00 2001 From: Noopur Gupta Date: Thu, 5 Sep 2013 17:27:24 +0530 Subject: [PATCH 044/169] Fixed bug 403923: [1.8] Handle annotations on extra dimensions in the AST --- .../ConvertAnonymousToNestedRefactoring.java | 2 -- .../code/PromoteTempToFieldRefactoring.java | 9 +++-- .../sef/SelfEncapsulateFieldRefactoring.java | 9 +++-- .../structure/ChangeSignatureProcessor.java | 13 +++++--- .../structure/HierarchyProcessor.java | 16 ++++++++- .../structure/PullUpRefactoringProcessor.java | 12 ++++--- .../PushDownRefactoringProcessor.java | 8 +++-- .../text/correction/QuickAssistProcessor.java | 13 ++++++-- .../ChangeMethodSignatureProposal.java | 6 +++- .../TypeChangeCorrectionProposal.java | 33 +++++++++++++++---- 10 files changed, 93 insertions(+), 28 deletions(-) diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java index d579e40e08..74fcfe0481 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ConvertAnonymousToNestedRefactoring.java @@ -780,7 +780,6 @@ private void createFieldsForAccessedLocals(CompilationUnitRewrite rewrite, IVari for (int i= 0; i < varBindings.length; i++) { VariableDeclarationFragment fragment= ast.newVariableDeclarationFragment(); - fragment.setExtraDimensions(0); fragment.setInitializer(null); fragment.setName(ast.newSimpleName(fieldNames[i])); FieldDeclaration field= ast.newFieldDeclaration(fragment); @@ -859,7 +858,6 @@ private MethodDeclaration createNewConstructor(CompilationUnitRewrite rewrite, I MethodDeclaration newConstructor= ast.newMethodDeclaration(); newConstructor.setConstructor(true); - newConstructor.setExtraDimensions(0); newConstructor.setJavadoc(null); newConstructor.modifiers().addAll(ASTNodeFactory.newModifiers(ast, fVisibility)); newConstructor.setName(ast.newSimpleName(fClassName)); diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/PromoteTempToFieldRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/PromoteTempToFieldRefactoring.java index e5b6c8d89f..5bb80981e2 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/PromoteTempToFieldRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/PromoteTempToFieldRefactoring.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -89,6 +93,7 @@ import org.eclipse.jdt.internal.corext.refactoring.changes.TextChangeCompatibility; import org.eclipse.jdt.internal.corext.refactoring.rename.TempDeclarationFinder; import org.eclipse.jdt.internal.corext.refactoring.rename.TempOccurrenceAnalyzer; +import org.eclipse.jdt.internal.corext.refactoring.structure.HierarchyProcessor; import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser; import org.eclipse.jdt.internal.corext.refactoring.util.ResourceUtil; import org.eclipse.jdt.internal.corext.util.JdtFlags; @@ -842,7 +847,7 @@ private FieldDeclaration createNewFieldDeclaration(ASTRewrite rewrite) { SimpleName variableName= ast.newSimpleName(fFieldName); fragment.setName(variableName); addLinkedName(rewrite, variableName, false); - fragment.setExtraDimensions(fTempDeclarationNode.getExtraDimensions()); + HierarchyProcessor.copyExtraDimensions(fTempDeclarationNode, fragment); if (fInitializeIn == INITIALIZE_IN_FIELD && tempHasInitializer()){ Expression initializer= (Expression)rewrite.createCopyTarget(getTempInitializer()); fragment.setInitializer(initializer); diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/sef/SelfEncapsulateFieldRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/sef/SelfEncapsulateFieldRefactoring.java index f75eb357eb..0942ee464b 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/sef/SelfEncapsulateFieldRefactoring.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/sef/SelfEncapsulateFieldRefactoring.java @@ -1,9 +1,13 @@ /******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. * * Contributors: * IBM Corporation - initial API and implementation @@ -99,6 +103,7 @@ import org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine; import org.eclipse.jdt.internal.corext.refactoring.base.JavaStatusContext; import org.eclipse.jdt.internal.corext.refactoring.changes.DynamicValidationRefactoringChange; +import org.eclipse.jdt.internal.corext.refactoring.structure.HierarchyProcessor; import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser; import org.eclipse.jdt.internal.corext.refactoring.util.ResourceUtil; import org.eclipse.jdt.internal.corext.refactoring.util.TextChangeManager; @@ -626,7 +631,7 @@ private MethodDeclaration createSetterMethod(AST ast, ASTRewrite rewriter, Strin result.parameters().add(param); param.setName(ast.newSimpleName(fArgName)); param.setType((Type)rewriter.createCopyTarget(type)); - param.setExtraDimensions(fFieldDeclaration.getExtraDimensions()); + HierarchyProcessor.copyExtraDimensions(fFieldDeclaration, param); Block block= ast.newBlock(); result.setBody(block); diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java index cd2fa425ef..8cadcb69c5 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java @@ -69,6 +69,7 @@ import org.eclipse.jdt.core.dom.EnumConstantDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.ImportDeclaration; @@ -1515,7 +1516,6 @@ private void addNewConstructorToSubclass(AbstractTypeDeclaration subclass, Compi MethodDeclaration newConstructor= ast.newMethodDeclaration(); newConstructor.setName(ast.newSimpleName(subclass.getName().getIdentifier())); newConstructor.setConstructor(true); - newConstructor.setExtraDimensions(0); newConstructor.setJavadoc(null); newConstructor.modifiers().addAll(ASTNodeFactory.newModifiers(ast, getAccessModifier(subclass))); newConstructor.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID)); @@ -2083,8 +2083,9 @@ protected void changeParamgumentType(ParameterInfo info) { } private void removeExtraDimensions(SingleVariableDeclaration oldParam) { - if (oldParam.getExtraDimensions() != 0) { - getASTRewrite().set(oldParam, SingleVariableDeclaration.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), fDescription); + ListRewrite listRewrite= getASTRewrite().getListRewrite(oldParam, SingleVariableDeclaration.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) oldParam.extraDimensions()) { + listRewrite.remove(dimension, fDescription); } } @@ -2098,8 +2099,10 @@ private void changeReturnType() { } private void removeExtraDimensions(MethodDeclaration methDecl) { - if (methDecl.getExtraDimensions() != 0) - getASTRewrite().set(methDecl, MethodDeclaration.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), fDescription); + ListRewrite listRewrite= getASTRewrite().getListRewrite(methDecl, MethodDeclaration.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) methDecl.extraDimensions()) { + listRewrite.remove(dimension, fDescription); + } } private boolean needsVisibilityUpdate() throws JavaModelException { diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java index 64275c2c1f..78e1e8a24e 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java @@ -61,6 +61,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IExtendedModifier; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -73,6 +74,7 @@ import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.TypeParameter; +import org.eclipse.jdt.core.dom.VariableDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ITrackedNodePosition; @@ -213,6 +215,18 @@ protected static RefactoringStatus checkProjectCompliance(CompilationUnitRewrite return status; } + public static void copyExtraDimensions(final VariableDeclaration oldVarDeclaration, final VariableDeclaration newVarDeclaration) { + final AST ast= newVarDeclaration.getAST(); + for (int index= 0, n= oldVarDeclaration.extraDimensions().size(); index < n; index++) + newVarDeclaration.extraDimensions().add(ASTNode.copySubtree(ast, (ExtraDimension) oldVarDeclaration.extraDimensions().get(index))); + } + + protected static void copyExtraDimensions(final MethodDeclaration oldMethod, final MethodDeclaration newMethod) { + final AST ast= newMethod.getAST(); + for (int index= 0, n= oldMethod.extraDimensions().size(); index < n; index++) + newMethod.extraDimensions().add(ASTNode.copySubtree(ast, (ExtraDimension) oldMethod.extraDimensions().get(index))); + } + protected static void copyAnnotations(final FieldDeclaration oldField, final FieldDeclaration newField) { final AST ast= newField.getAST(); for (int index= 0, n= oldField.modifiers().size(); index < n; index++) { @@ -270,7 +284,7 @@ else if (member instanceof IInitializer) protected static FieldDeclaration createNewFieldDeclarationNode(final ASTRewrite rewrite, final CompilationUnit unit, final IField field, final VariableDeclarationFragment oldFieldFragment, final TypeVariableMaplet[] mapping, final IProgressMonitor monitor, final RefactoringStatus status, final int modifiers) throws JavaModelException { final VariableDeclarationFragment newFragment= rewrite.getAST().newVariableDeclarationFragment(); - newFragment.setExtraDimensions(oldFieldFragment.getExtraDimensions()); + copyExtraDimensions(oldFieldFragment, newFragment); if (oldFieldFragment.getInitializer() != null) { Expression newInitializer= null; if (mapping.length > 0) diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java index e542cebc92..5c82112d6e 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2006, 2011 IBM Corporation and others. + * Copyright (c) 2006, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation * Benjamin Muskalla - 228950: [pull up] exception if target calls super with multiple parameters @@ -503,7 +507,7 @@ private void addMethodStubForAbstractMethod(final IMethod sourceMethod, final Co final MethodDeclaration newMethod= ast.newMethodDeclaration(); newMethod.setBody(createMethodStub(methodToCreateStubFor, ast)); newMethod.setConstructor(false); - newMethod.setExtraDimensions(methodToCreateStubFor.getExtraDimensions()); + copyExtraDimensions(methodToCreateStubFor, newMethod); newMethod.modifiers().addAll(ASTNodeFactory.newModifiers(ast, getModifiersWithUpdatedVisibility(sourceMethod, JdtFlags.clearFlag(Modifier.NATIVE | Modifier.ABSTRACT, methodToCreateStubFor.getModifiers()), adjustments, new SubProgressMonitor(monitor, 1), false, status))); newMethod.setName(((SimpleName) ASTNode.copySubtree(ast, methodToCreateStubFor.getName()))); final TypeVariableMaplet[] mapping= TypeVariableUtil.composeMappings(TypeVariableUtil.subTypeToSuperType(getDeclaringType(), getDestinationType()), TypeVariableUtil.superTypeToInheritedType(getDestinationType(), ((IType) typeToCreateStubIn.resolveBinding().getJavaElement()))); @@ -1023,7 +1027,7 @@ private void createAbstractMethod(final IMethod sourceMethod, final CompilationU final MethodDeclaration newMethod= targetRewrite.getAST().newMethodDeclaration(); newMethod.setBody(null); newMethod.setConstructor(false); - newMethod.setExtraDimensions(oldMethod.getExtraDimensions()); + copyExtraDimensions(oldMethod, newMethod); newMethod.setJavadoc(null); int modifiers= getModifiersWithUpdatedVisibility(sourceMethod, Modifier.ABSTRACT | JdtFlags.clearFlag(Modifier.NATIVE | Modifier.FINAL, sourceMethod.getFlags()), adjustments, monitor, false, status); if (oldMethod.isVarargs()) @@ -1323,7 +1327,7 @@ private MethodDeclaration createNewMethodDeclarationNode(final CompilationUnitRe if (!getDestinationType().isInterface()) copyBodyOfPulledUpMethod(sourceRewrite, targetRewrite, sourceMethod, oldMethod, newMethod, mapping, monitor); newMethod.setConstructor(oldMethod.isConstructor()); - newMethod.setExtraDimensions(oldMethod.getExtraDimensions()); + copyExtraDimensions(oldMethod, newMethod); copyJavadocNode(rewrite, oldMethod, newMethod); int modifiers= getModifiersWithUpdatedVisibility(sourceMethod, sourceMethod.getFlags(), adjustments, monitor, true, status); if (fDeletedMethods.length == 0 || getDestinationType().isInterface()) { diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PushDownRefactoringProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PushDownRefactoringProcessor.java index 5bdbb5e6ce..c4c4bce12a 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PushDownRefactoringProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PushDownRefactoringProcessor.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -791,7 +795,7 @@ private FieldDeclaration createNewFieldDeclarationNode(MemberActionInfo info, Co IField field= (IField) info.getMember(); AST ast= rewrite.getAST(); VariableDeclarationFragment newFragment= ast.newVariableDeclarationFragment(); - newFragment.setExtraDimensions(oldFieldFragment.getExtraDimensions()); + copyExtraDimensions(oldFieldFragment, newFragment); Expression initializer= oldFieldFragment.getInitializer(); if (initializer != null) { Expression newInitializer= null; @@ -827,7 +831,7 @@ private MethodDeclaration createNewMethodDeclarationNode(MemberActionInfo info, MethodDeclaration newMethod= ast.newMethodDeclaration(); copyBodyOfPushedDownMethod(rewrite, method, oldMethod, newMethod, mapping); newMethod.setConstructor(oldMethod.isConstructor()); - newMethod.setExtraDimensions(oldMethod.getExtraDimensions()); + copyExtraDimensions(oldMethod, newMethod); if (info.copyJavadocToCopiesInSubclasses()) copyJavadocNode(rewrite, oldMethod, newMethod); final IJavaProject project= rewriter.getCu().getJavaProject(); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java index 2622fd31ae..247bd54f0b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java @@ -68,6 +68,7 @@ import org.eclipse.jdt.core.dom.EnhancedForStatement; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.ExpressionStatement; +import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.ForStatement; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -751,7 +752,7 @@ private static boolean getSplitVariableProposals(IInvocationContext context, AST rewrite.replace(fragment.getParent(), assignment, null); VariableDeclarationFragment newFrag= ast.newVariableDeclarationFragment(); newFrag.setName(ast.newSimpleName(fragment.getName().getIdentifier())); - newFrag.setExtraDimensions(fragment.getExtraDimensions()); + copyExtraDimensions(fragment, newFrag); VariableDeclarationExpression oldVarDecl= (VariableDeclarationExpression) fragParent; @@ -768,6 +769,12 @@ private static boolean getSplitVariableProposals(IInvocationContext context, AST return true; } + private static void copyExtraDimensions(final VariableDeclaration oldVarDeclaration, final VariableDeclaration newVarDeclaration) { + final AST ast= newVarDeclaration.getAST(); + for (int index= 0, n= oldVarDeclaration.extraDimensions().size(); index < n; index++) + newVarDeclaration.extraDimensions().add(ASTNode.copySubtree(ast, (ExtraDimension) oldVarDeclaration.extraDimensions().get(index))); + } + private static boolean getConvertStringConcatenationProposals(IInvocationContext context, Collection resultingCollections) { ASTNode node= context.getCoveringNode(); BodyDeclaration parentDecl= ASTResolving.findParentBodyDeclaration(node); @@ -2319,7 +2326,7 @@ private static boolean getConvertEnhancedForLoopProposal(IInvocationContext cont // create 'for' body element variable VariableDeclarationFragment elementFragment= ast.newVariableDeclarationFragment(); - elementFragment.setExtraDimensions(parameter.getExtraDimensions()); + copyExtraDimensions(parameter, elementFragment); elementFragment.setName((SimpleName) rewrite.createCopyTarget(parameter.getName())); SimpleName elementIterName= ast.newSimpleName(iterName); @@ -2459,7 +2466,7 @@ private static boolean getConvertEnhancedForLoopProposal(IInvocationContext cont // create 'for' body element variable VariableDeclarationFragment elementFragment= ast.newVariableDeclarationFragment(); - elementFragment.setExtraDimensions(parameter.getExtraDimensions()); + copyExtraDimensions(parameter, elementFragment); elementFragment.setName((SimpleName) rewrite.createCopyTarget(parameter.getName())); SimpleName elementVarName= ast.newSimpleName(varName); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java index bb12a89af1..e3424bdb3d 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java @@ -28,6 +28,7 @@ import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; @@ -215,7 +216,10 @@ private void modifyParameters(ASTRewrite rewrite, MethodDeclaration methodDecl) Type newType= imports.addImport(newTypeBinding, ast, context); rewrite.replace(decl.getType(), newType, null); - rewrite.set(decl, SingleVariableDeclaration.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), null); + ListRewrite listRewrite1= rewrite.getListRewrite(decl, SingleVariableDeclaration.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) decl.extraDimensions()) { + listRewrite1.remove(dimension, null); + } IBinding binding= decl.getName().resolveBinding(); if (binding != null) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java index cfab9a9af2..1923f1229b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java @@ -1,10 +1,14 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -13,6 +17,7 @@ import java.util.Arrays; import java.util.Comparator; +import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; @@ -24,6 +29,7 @@ import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -121,7 +127,10 @@ protected ASTRewrite getRewrite() throws CoreException { MethodDeclaration methodDecl= (MethodDeclaration) declNode; Type origReturnType= methodDecl.getReturnType2(); rewrite.set(methodDecl, MethodDeclaration.RETURN_TYPE2_PROPERTY, type, null); - rewrite.set(methodDecl, MethodDeclaration.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), null); + ListRewrite listRewrite= rewrite.getListRewrite(methodDecl, MethodDeclaration.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) methodDecl.extraDimensions()) { + listRewrite.remove(dimension, null); + } // add javadoc tag Javadoc javadoc= methodDecl.getJavadoc(); if (javadoc != null && origReturnType != null && origReturnType.isPrimitiveType() @@ -161,7 +170,10 @@ protected ASTRewrite getRewrite() throws CoreException { } } else { rewrite.set(fieldDecl, FieldDeclaration.TYPE_PROPERTY, type, null); - rewrite.set(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), null); + ListRewrite listRewrite= rewrite.getListRewrite(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { + listRewrite.remove(dimension, null); + } } } else if (parent instanceof VariableDeclarationStatement) { VariableDeclarationStatement varDecl= (VariableDeclarationStatement) parent; @@ -178,18 +190,27 @@ protected ASTRewrite getRewrite() throws CoreException { } } else { rewrite.set(varDecl, VariableDeclarationStatement.TYPE_PROPERTY, type, null); - rewrite.set(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), null); + ListRewrite listRewrite= rewrite.getListRewrite(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { + listRewrite.remove(dimension, null); + } } } else if (parent instanceof VariableDeclarationExpression) { VariableDeclarationExpression varDecl= (VariableDeclarationExpression) parent; rewrite.set(varDecl, VariableDeclarationExpression.TYPE_PROPERTY, type, null); - rewrite.set(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), null); + ListRewrite listRewrite= rewrite.getListRewrite(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { + listRewrite.remove(dimension, null); + } } } else if (declNode instanceof SingleVariableDeclaration) { SingleVariableDeclaration variableDeclaration= (SingleVariableDeclaration) declNode; rewrite.set(variableDeclaration, SingleVariableDeclaration.TYPE_PROPERTY, type, null); - rewrite.set(variableDeclaration, SingleVariableDeclaration.EXTRA_DIMENSIONS_PROPERTY, new Integer(0), null); + ListRewrite listRewrite= rewrite.getListRewrite(declNode, SingleVariableDeclaration.EXTRA_DIMENSIONS2_PROPERTY); + for (ExtraDimension dimension : (List) ((SingleVariableDeclaration) declNode).extraDimensions()) { + listRewrite.remove(dimension, null); + } } // set up linked mode From 648dec69c99d32d54aa618487aca9492d19f6acc Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Fri, 25 Oct 2013 16:20:47 +0200 Subject: [PATCH 045/169] Bug 403923: [1.8] Handle annotations on extra dimensions in the AST ExtraDimensions -> Dimensions --- .../structure/ChangeSignatureProcessor.java | 6 +++--- .../refactoring/structure/HierarchyProcessor.java | 6 +++--- .../ui/text/correction/QuickAssistProcessor.java | 4 ++-- .../proposals/ChangeMethodSignatureProposal.java | 4 ++-- .../proposals/TypeChangeCorrectionProposal.java | 12 ++++++------ 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java index 8cadcb69c5..388f908453 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ChangeSignatureProcessor.java @@ -66,10 +66,10 @@ import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ConstructorInvocation; +import org.eclipse.jdt.core.dom.Dimension; import org.eclipse.jdt.core.dom.EnumConstantDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.ImportDeclaration; @@ -2084,7 +2084,7 @@ protected void changeParamgumentType(ParameterInfo info) { private void removeExtraDimensions(SingleVariableDeclaration oldParam) { ListRewrite listRewrite= getASTRewrite().getListRewrite(oldParam, SingleVariableDeclaration.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) oldParam.extraDimensions()) { + for (Dimension dimension : (List) oldParam.extraDimensions()) { listRewrite.remove(dimension, fDescription); } } @@ -2100,7 +2100,7 @@ private void changeReturnType() { private void removeExtraDimensions(MethodDeclaration methDecl) { ListRewrite listRewrite= getASTRewrite().getListRewrite(methDecl, MethodDeclaration.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) methDecl.extraDimensions()) { + for (Dimension dimension : (List) methDecl.extraDimensions()) { listRewrite.remove(dimension, fDescription); } } diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java index 78e1e8a24e..5ceb8a9925 100644 --- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java +++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/HierarchyProcessor.java @@ -59,9 +59,9 @@ import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.Dimension; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IExtendedModifier; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -218,13 +218,13 @@ protected static RefactoringStatus checkProjectCompliance(CompilationUnitRewrite public static void copyExtraDimensions(final VariableDeclaration oldVarDeclaration, final VariableDeclaration newVarDeclaration) { final AST ast= newVarDeclaration.getAST(); for (int index= 0, n= oldVarDeclaration.extraDimensions().size(); index < n; index++) - newVarDeclaration.extraDimensions().add(ASTNode.copySubtree(ast, (ExtraDimension) oldVarDeclaration.extraDimensions().get(index))); + newVarDeclaration.extraDimensions().add(ASTNode.copySubtree(ast, (Dimension) oldVarDeclaration.extraDimensions().get(index))); } protected static void copyExtraDimensions(final MethodDeclaration oldMethod, final MethodDeclaration newMethod) { final AST ast= newMethod.getAST(); for (int index= 0, n= oldMethod.extraDimensions().size(); index < n; index++) - newMethod.extraDimensions().add(ASTNode.copySubtree(ast, (ExtraDimension) oldMethod.extraDimensions().get(index))); + newMethod.extraDimensions().add(ASTNode.copySubtree(ast, (Dimension) oldMethod.extraDimensions().get(index))); } protected static void copyAnnotations(final FieldDeclaration oldField, final FieldDeclaration newField) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java index 247bd54f0b..f0956a801a 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java @@ -64,11 +64,11 @@ import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ConditionalExpression; +import org.eclipse.jdt.core.dom.Dimension; import org.eclipse.jdt.core.dom.DoStatement; import org.eclipse.jdt.core.dom.EnhancedForStatement; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.ExpressionStatement; -import org.eclipse.jdt.core.dom.ExtraDimension; import org.eclipse.jdt.core.dom.ForStatement; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -772,7 +772,7 @@ private static boolean getSplitVariableProposals(IInvocationContext context, AST private static void copyExtraDimensions(final VariableDeclaration oldVarDeclaration, final VariableDeclaration newVarDeclaration) { final AST ast= newVarDeclaration.getAST(); for (int index= 0, n= oldVarDeclaration.extraDimensions().size(); index < n; index++) - newVarDeclaration.extraDimensions().add(ASTNode.copySubtree(ast, (ExtraDimension) oldVarDeclaration.extraDimensions().get(index))); + newVarDeclaration.extraDimensions().add(ASTNode.copySubtree(ast, (Dimension) oldVarDeclaration.extraDimensions().get(index))); } private static boolean getConvertStringConcatenationProposals(IInvocationContext context, Collection resultingCollections) { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java index e3424bdb3d..f9104f6a86 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/ChangeMethodSignatureProposal.java @@ -28,7 +28,7 @@ import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ExtraDimension; +import org.eclipse.jdt.core.dom.Dimension; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; @@ -217,7 +217,7 @@ private void modifyParameters(ASTRewrite rewrite, MethodDeclaration methodDecl) Type newType= imports.addImport(newTypeBinding, ast, context); rewrite.replace(decl.getType(), newType, null); ListRewrite listRewrite1= rewrite.getListRewrite(decl, SingleVariableDeclaration.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) decl.extraDimensions()) { + for (Dimension dimension : (List) decl.extraDimensions()) { listRewrite1.remove(dimension, null); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java index 1923f1229b..16884f2c06 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/TypeChangeCorrectionProposal.java @@ -29,7 +29,7 @@ import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ExtraDimension; +import org.eclipse.jdt.core.dom.Dimension; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -128,7 +128,7 @@ protected ASTRewrite getRewrite() throws CoreException { Type origReturnType= methodDecl.getReturnType2(); rewrite.set(methodDecl, MethodDeclaration.RETURN_TYPE2_PROPERTY, type, null); ListRewrite listRewrite= rewrite.getListRewrite(methodDecl, MethodDeclaration.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) methodDecl.extraDimensions()) { + for (Dimension dimension : (List) methodDecl.extraDimensions()) { listRewrite.remove(dimension, null); } // add javadoc tag @@ -171,7 +171,7 @@ protected ASTRewrite getRewrite() throws CoreException { } else { rewrite.set(fieldDecl, FieldDeclaration.TYPE_PROPERTY, type, null); ListRewrite listRewrite= rewrite.getListRewrite(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { + for (Dimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { listRewrite.remove(dimension, null); } } @@ -191,7 +191,7 @@ protected ASTRewrite getRewrite() throws CoreException { } else { rewrite.set(varDecl, VariableDeclarationStatement.TYPE_PROPERTY, type, null); ListRewrite listRewrite= rewrite.getListRewrite(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { + for (Dimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { listRewrite.remove(dimension, null); } } @@ -200,7 +200,7 @@ protected ASTRewrite getRewrite() throws CoreException { rewrite.set(varDecl, VariableDeclarationExpression.TYPE_PROPERTY, type, null); ListRewrite listRewrite= rewrite.getListRewrite(declNode, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { + for (Dimension dimension : (List) ((VariableDeclarationFragment) declNode).extraDimensions()) { listRewrite.remove(dimension, null); } } @@ -208,7 +208,7 @@ protected ASTRewrite getRewrite() throws CoreException { SingleVariableDeclaration variableDeclaration= (SingleVariableDeclaration) declNode; rewrite.set(variableDeclaration, SingleVariableDeclaration.TYPE_PROPERTY, type, null); ListRewrite listRewrite= rewrite.getListRewrite(declNode, SingleVariableDeclaration.EXTRA_DIMENSIONS2_PROPERTY); - for (ExtraDimension dimension : (List) ((SingleVariableDeclaration) declNode).extraDimensions()) { + for (Dimension dimension : (List) ((SingleVariableDeclaration) declNode).extraDimensions()) { listRewrite.remove(dimension, null); } } From 6fc1828cf96f851f50cf86a34854d6b3ad91a2b9 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Mon, 28 Oct 2013 00:47:36 +0100 Subject: [PATCH 046/169] Bug 403927 comment 4: [1.8] Switch ASTs to JLS8 --- .../SefWorkSpace/SefTests/.classpath | 6 ++ .../.settings/org.eclipse.jdt.core.prefs | 7 ++ .../object_in/TestArrayAnnotations.java | 18 ++++ .../object_out/TestArrayAnnotations.java | 26 +++++ .../jdt/ui/tests/refactoring/SefTests.java | 6 +- .../jdt/internal/corext/dom/ASTFlattener.java | 13 +-- .../internal/corext/dom/ASTNodeFactory.java | 42 +++++++- .../internal/corext/dom/DimensionRewrite.java | 102 ++++++++++++++++++ .../corext/util/JDTUIHelperClasses.java | 2 + .../refactoring/TypeContextChecker.java | 8 +- .../code/PromoteTempToFieldRefactoring.java | 6 +- .../sef/SelfEncapsulateFieldRefactoring.java | 21 +--- .../structure/ChangeSignatureProcessor.java | 4 +- .../structure/ExtractClassRefactoring.java | 9 +- .../structure/HierarchyProcessor.java | 2 +- .../util/AbstractExceptionAnalyzer.java | 13 +-- .../internal/ui/search/MethodExitsFinder.java | 3 +- .../ui/text/correction/ASTResolving.java | 2 +- .../text/correction/QuickAssistProcessor.java | 24 ++--- .../ChangeMethodSignatureProposal.java | 7 +- .../TypeChangeCorrectionProposal.java | 28 ++--- 21 files changed, 256 insertions(+), 93 deletions(-) create mode 100644 org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.classpath create mode 100644 org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.settings/org.eclipse.jdt.core.prefs create mode 100644 org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayAnnotations.java create mode 100644 org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayAnnotations.java create mode 100644 org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/DimensionRewrite.java diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.classpath b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.classpath new file mode 100644 index 0000000000..fc8ee0f7b6 --- /dev/null +++ b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..295926d964 --- /dev/null +++ b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayAnnotations.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayAnnotations.java new file mode 100644 index 0000000000..c30ea2ebe5 --- /dev/null +++ b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayAnnotations.java @@ -0,0 +1,18 @@ +package object_in; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) @interface A {} +@Target(ElementType.TYPE_USE) @interface B {} +@Target(ElementType.TYPE_USE) @interface C {} +@Target(ElementType.TYPE_USE) @interface D {} +@Target(ElementType.TYPE_USE) @interface E {} + +public class TestArrayAnnotations { + boolean @D[]@E[] field@A[]@B []@C[]; + + public TestArrayAnnotations() { + field= new boolean[0][][][][]; + } +} diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayAnnotations.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayAnnotations.java new file mode 100644 index 0000000000..ea3e431d5a --- /dev/null +++ b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayAnnotations.java @@ -0,0 +1,26 @@ +package object_out; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) @interface A {} +@Target(ElementType.TYPE_USE) @interface B {} +@Target(ElementType.TYPE_USE) @interface C {} +@Target(ElementType.TYPE_USE) @interface D {} +@Target(ElementType.TYPE_USE) @interface E {} + +public class TestArrayAnnotations { + private boolean @D[]@E[] field@A[]@B []@C[]; + + public TestArrayAnnotations() { + setField(new boolean[0][][][][]); + } + + boolean@A[]@B []@C[]@D[]@E[] getField() { + return field; + } + + void setField(boolean @D[]@E[] field@A[]@B []@C[]) { + this.field = field; + } +} diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java index c11a73f62d..ffaeb59515 100644 --- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java +++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -258,6 +258,10 @@ public void testGenericReadWrite() throws Exception { objectTest("field"); } + public void testArrayAnnotations() throws Exception { + objectTest("field"); + } + //===================================================================================== // static import tests //===================================================================================== diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java index 2c426e3f0b..1b3c73ba0e 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java @@ -1262,17 +1262,8 @@ public boolean visit(SimpleName node) { */ @Override public boolean visit(SimpleType node) { - Name name = node.getName(); - if (name.isQualifiedName()) { - QualifiedName qualifiedName = (QualifiedName) name; - qualifiedName.getQualifier().accept(this); - this.fBuffer.append(".");//$NON-NLS-1$ - printTypeAnnotations(node); - qualifiedName.getName().accept(this); - } else { - printTypeAnnotations(node); - node.getName().accept(this); - } + printTypeAnnotations(node); + node.getName().accept(this); return false; } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java index a9a0871fa0..ebea7ee8ee 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java @@ -5,6 +5,10 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -19,8 +23,10 @@ import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.ArrayInitializer; +import org.eclipse.jdt.core.dom.ArrayType; import org.eclipse.jdt.core.dom.CharacterLiteral; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.Dimension; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.IAnnotationBinding; @@ -136,6 +142,26 @@ public static Type newType(AST ast, String content) { return (Type)result; } + /** + * Returns an {@link ArrayType} that adds one dimension to the given type node. + * If the given node is already an ArrayType, then a new {@link Dimension} + * without annotations is inserted at the first position. + * + * @param type the type to be wrapped + * @return the array type + * @since 3.9 BETA_JAVA8 + */ + public static ArrayType newArrayType(Type type) { + if (type instanceof ArrayType) { + Dimension dimension= type.getAST().newDimension(); + ArrayType arrayType= (ArrayType) type; + arrayType.dimensions().add(0, dimension); // first dimension is outermost + return arrayType; + } else { + return type.getAST().newArrayType(type); + } + } + /** * Returns the new type node corresponding to the type of the given declaration * including the extra dimensions. @@ -184,10 +210,19 @@ public static Type newType(AST ast, VariableDeclaration declaration, ImportRewri return type; } } - int extraDim= declaration.getExtraDimensions(); + type= (Type) ASTNode.copySubtree(ast, type); - for (int i= 0; i < extraDim; i++) { - type= ast.newArrayType(type); + + List extraDimensions= declaration.extraDimensions(); + if (!extraDimensions.isEmpty()) { + ArrayType arrayType; + if (type instanceof ArrayType) { + arrayType= (ArrayType) type; + } else { + arrayType= ast.newArrayType(type, 0); + type= arrayType; + } + arrayType.dimensions().addAll(ASTNode.copySubtrees(ast, extraDimensions)); } return type; } @@ -380,5 +415,4 @@ public static Expression newAnnotationValue(AST ast, Object value, ImportRewrite return null; } } - } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/DimensionRewrite.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/DimensionRewrite.java new file mode 100644 index 0000000000..530d90ac91 --- /dev/null +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/DimensionRewrite.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2013 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.corext.dom; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.text.edits.TextEditGroup; + +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.ArrayType; +import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor; +import org.eclipse.jdt.core.dom.Dimension; +import org.eclipse.jdt.core.dom.Type; +import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; +import org.eclipse.jdt.core.dom.rewrite.ListRewrite; + +import org.eclipse.jdt.internal.corext.util.JDTUIHelperClasses; + +/** + * Rewrite helper for {@link Dimension} node lists and {@link ArrayType}s. + * + * @see JDTUIHelperClasses + * @since 3.9 BETA_JAVA8 + */ +public class DimensionRewrite { + + /** + * Creates a {@link ASTRewrite#createCopyTarget(ASTNode) copy} of type + * and adds extraDimensions to it. + * + * @param type the type to copy + * @param extraDimensions the dimensions to add + * @param rewrite the ASTRewrite with which to create new nodes + * @return the copy target with added dimensions + */ + public static Type copyTypeAndAddDimensions(Type type, List extraDimensions, ASTRewrite rewrite) { + AST ast= rewrite.getAST(); + if (extraDimensions.isEmpty()) { + return (Type) rewrite.createCopyTarget(type); + } + + ArrayType result; + if (type instanceof ArrayType) { + ArrayType arrayType= (ArrayType) type; + Type varElementType= (Type) rewrite.createCopyTarget(arrayType.getElementType()); + result= ast.newArrayType(varElementType, 0); + result.dimensions().addAll(copyDimensions(extraDimensions, rewrite)); + result.dimensions().addAll(copyDimensions(arrayType.dimensions(), rewrite)); + } else { + Type elementType= (Type) rewrite.createCopyTarget(type); + result= ast.newArrayType(elementType, 0); + result.dimensions().addAll(copyDimensions(extraDimensions, rewrite)); + } + return result; + } + + /** + * Returns {@link ASTRewrite#createCopyTarget(ASTNode) copies} of the given dimensions. + * + * @param dimensions the dimensions to copy + * @param rewrite the ASTRewrite with which to create new nodes + * + * @return list of copy targets + */ + public static List copyDimensions(List dimensions, ASTRewrite rewrite) { + ArrayList result= new ArrayList(); + for (int i= 0; i < dimensions.size(); i++) { + result.add((Dimension) rewrite.createCopyTarget(dimensions.get(i))); + } + return result; + } + + /** + * Removes all children in node's childListProperty. + * + * @param node ASTNode + * @param childListProperty child list property + * @param rewrite rewrite that removes the nodes + * @param editGroup the edit group in which to collect the corresponding text edits, or null if ungrouped + */ + public static void removeAllChildren(ASTNode node, ChildListPropertyDescriptor childListProperty, ASTRewrite rewrite, TextEditGroup editGroup) { + ListRewrite listRewrite= rewrite.getListRewrite(node, childListProperty); + for (ASTNode child : (List) node.getStructuralProperty(childListProperty)) { + listRewrite.remove(child, editGroup); + } + } + +} diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JDTUIHelperClasses.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JDTUIHelperClasses.java index c55f69ebda..b5a998e78c 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JDTUIHelperClasses.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/util/JDTUIHelperClasses.java @@ -21,6 +21,7 @@ import org.eclipse.jdt.internal.corext.dom.ASTNodes; import org.eclipse.jdt.internal.corext.dom.Bindings; import org.eclipse.jdt.internal.corext.dom.BodyDeclarationRewrite; +import org.eclipse.jdt.internal.corext.dom.DimensionRewrite; import org.eclipse.jdt.internal.corext.dom.GenericVisitor; import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor; import org.eclipse.jdt.internal.corext.dom.ModifierRewrite; @@ -104,6 +105,7 @@ *

  • pR#ZR z9Kn9{SM$#=gg}dr`-eO9p{3AhP-5d`p_r7#K*xy(jmUtdYue|>9n`j|0t5?0_|YsT z+lSSpx6-5#H2A65AwX;}^w*!-NWy9D&3cIj}>g17+N*cew``bhV|2wEKfM=f&P8JNk^oVda-P4#;p zN9a&gWQ4~JjHd1dh)U`?GML}U`QI8Cex{iG%7t=q-S7o;1o_; zM2gx<>$WQUvJhRMgHO~oCen;>Bm7L{KKlE4Bw-Hfvq5?`26=`(5OBQ?QU%lnKXBn+@mf zKYN-vLJf^c^8$a6f#0T@f9{B%eiSKDVI>)TZQK92aZL20x=8lMmv+Xl zxZV#Nw>(_CL25lOBvb+TUG5WcD%%G6PewW>QE|xA*433*Y~eI0SPOswbQWZ)7Zp*I z0UUDXlu`1EMfP2lQ11-n(>+VNSuTnw62T4 zdOu0cIyE97Dv;XigW9Y$F9H$%c8nGFd$6`j%boav?}tSz@}h?pBI0Jg`HpYB0;B-i z5RSw?nEV(EF$mft-CAnA*r0)J?;(-A$-Q4eN<+{?d`8lNnZx9Y9tlO@bR{MT4F!Om zkI4x-+>GQS21}48yfy-pJQnMe^}4Ql!B*lt)aRqOz5l%#`g6IC=67!9 zXY!}ayQTxv4ml_8)jZohgm3ea)hlE^42CU$2e!Od~xmw=jNNdOQ#D{_S>z{@3YHO54upC;i?p^WYDh#lgSkLBw#S$Q8MS_^3#g^}i-Szk;^c z%(PYH^kf)){)PH_TAzCd`l-r+^T4SQ7~sFwLz2Q9I$8$H>)KjC1!z5l$>ZnPF^{zI zFaI;aC-o-}yHuhGYzK8Bw{}48B@K{Gn!idt zdy`Vb`2o)a&j!Yg2+r#$dZA}7rB1GVgGj_BJG;!pOs{f+6eBfjP6Zbeo`&yscvN*j z3d1P#AiV8_(-y)Jg<2jHPDFlPTFdA<>RgdrtTmT~w9uV!-+k7Q<+D8wZWp0ke(lb~ zTO-e;2p>^gc9~0~0$F{zvqj3FPjcbQHV|9f)+FA^l4|$wL!LM;m*#`@+JQ#;tBUmB z=ae-6M-NR#-`3vjCtmcw1=o*iGvwcW=)bQFC0a!-LAL#;%tG=XG7B&$`oK5zE`Vce zeJh)kbR&y_!74X5wpC0=FMN9ByiGTTnF!RBL5P;f8z4p!$vpK|6*$@Uj6>aaAWajU z!DPdDOS7uC3=;Hne2G&;rxFAFoX5NJU%!}N6iJVjC7+DgpW1NypNw1RBNT+!yeE){ zt>Wt2?OJLd)Z-Au@#)_w>c&T7QO&`yH# zsEGkx(AGrzLiP6}ijLKkeEO+omWLCGuw+sz$-XGseF61^$NQOQ&^r{+nLcB0iie6L zdDgE$+P6zyUYmr4Qz?c*=DUdcJF$INWg~*I7m%0P5Zv{g z;6Qi-j7D*8U$G=-uln1r2m@c`j5a&OyWI&>iFB zyeX~*-LXfa3CB2Nbxun0K?Rtr;8NO-083kJL=Q6GL(hy8A}|D5Qo`MR+yR(ka644G zUi1--FKv|9o2|}!cjj3g7{9f$^~Z2+!hZhX)h0lNsn#82t=csw$?8HEbqx2ICCYc- z>pBA?pT}=&tAE0r|9Ihl$`U`9nZVK4yc7_f0Y*kc0GkD-l1BXoiJbal**3^4Kt8Pc z2ZRv7?)O!-Na*g+{lvURd1ZN>Hqc|K0PA%n2P^yn^psm5IHOMR?AXZ>ei?g8Tn~W# zDTB74xzZ(Nj8$ILrCw!AlW%({ETuwqj8Pk56C#N^$>C!9CL74rT9b>DeFbS4vo|g?Llj=b=JK1ONhWy#5SZ^wDeqTBH$YFlNe2c>iQt%b?!)IvZBS50Dum5J}E=%{+ zdy5?(JTL<|TR?xzXr)k?lopeXw-jE*i3MQx>}}$Rn>8s`JMy%Q=x}P@sO-*_*`Pr& zLbYZOQNNfQ;XW}kTyk@nJf(~9gvh`);hT%M8UPv>hw+V9lxJ=E`wg*x4=#c#ik_OP z!*?Q;$TrMH-u~!qtgzmO>^-hgjwGQFJ^RxhPPW(}jO6&M(MNqZu}RJLEguLZtU@L1%&@1* zVZMP1uNmkQMSsER{2vCi$9nr`)$sRqVu<9AGc6)ZF#gWzzA{P+lMGG(BoaDoT)14w zyl{LpeKvDPbn6cyx2G#DkPJfNfz{?A_N$beCzUzRHI!d{3t*-W&T=-)3cDmvb&9I$Y^nVy}>=iek0`Dfps5 zp-K0PMhNanp8oQ9FHFa*X2eEVEt#wMFl^otJlZF82ESlx_0&BnNWXa!6)F#VHC^c=({2kJ z^-GA&g|~V`Wf^+{S1*wm3()vfUQ{cLIb!y`vp48kYc?IqVU~L<$4|=x6e!=7ndr(F zB@&%PtB%N2%b?I9m7JwKrIi)WA|Kn_Vt#fROEy zsRz!wGPr!}mEY5FF6~xI(vNgfC`kg@C@4JPi7((u z5#XDg@FSdf;KhS=5}b~!tHUa?jC(7XPfZ`$!TYZ3!7_BLXd5gYz78}lh7H#^K11JT zBZo{9+xU3CiL$8@?~5ME@|9dvuC}(H(58%Xq%4|0r`+*@D|-Y`OCKLG5q)}7Ip45I zVe?8#_q$a_WPmCdM`7qfUgsICu`$CS6RVUpg?Nc@+5?%f)%UPz)PA{{g9HNu!m{y$ z8xVU4JpGIe66v%iq#9Z9cZE!w-3s)v*<9;lFDb`tJvYOMpJN)px$Dk*6?fg)CC&Qy zjt=exFGa@2qm+*V>8=gFWHc0P@?A=$i|zYJ>ObdBQ-brD!RsUE9^&z}{xphIpf+7* zc>+3d;2zNZt-1GNw5Gnx9=peP{iz%X;C=1$sH(~ETigF4J3eN{-xGuUZ3q7}bK1gx z`PcOqvz);HL#XD)16`pOV6C7Jw92pRh5sSP@EPgrn*Imd`(CmEuAL5si!Z&gYXBh1 znMPw43?L;A59cWJW%}^EN*+t2rMvaTv2;N6^YRZbRJYEO4|>iVUeLYm7w{Ze42%LW zkc1@+GKY&KYUz!u#T^(Gu4@>h!=>M+a0WOb4=8Ywz_zW#ovl*ehf85=W{JR(S#M^D zY(LP$b$JqLBi)Z8a3qN%y+`A4Dcx}T%$8%E5fTIt7}i7*VK4-|w*1zSG)?6z&G&{1 zxd_G?<=}=Sn%aTd#;kZo0@i*#jCte^2=;hPzy64@pSysjA^5Fneltb?Q~Ld5>f|dW zF4_TH`;V6zshR=_EAXP_;7^vR35^gC!9=0IPU{I(=Lie4q+^MC%G+**aNO?0ti zpmFxfz;J2$s)y`@?Y?RrVrWi*oWziOgz?$xbrNPz6rBudJ&hfX6-&G+G?33iAVeOC z171@05;omF9od`)(%$u2$jHgK)qJ9SQ2?2m*FQ>%tPzVpZsrPG13O=AaKz3~z)X$z)?npqVVkL!`W%q^U^)#2{l0xxvrS#5KbgM~flM)9C~$rypWU?yJf?Vau=trzA#uluu=gVvDu4CS+E2 z;@Wb1h=0&CxVu^cf|WH^M&5>MZ}shP8hlw4g0k1GSEKkW46h0viA_#t1_KyAY1r(s zR9ujU$wpp*w(lFUtlZo=NGT)zV2gP!;NQ>2O>Rp0>h6%3U1N74Vu)E$&2I|04&`Os zK889aFHH}C;%iRt*i$d5m9 zPRvv`WJNcu)y@!YK6-(RDm-+2QN5Si_ywtZP&rp`bOg3Wbz*yO7P?CH<87totHH7v z3)rIK$STG+a-m0K569W%oqogM)S&Q~8lgmn?n@{9TgB6`M()nZa-!9}tt=fYwYz*; zf`|HqBIfxuKKI5O?S6QYxYg-ZqX)w5QKFoQ&56)=^k!XGW*PV$*1F9sRoBPI?)5vP zJ2N=FW9l$rBVSNDF69n7>G)zs9Pio#8+nBHy_z9MTA-lL1Ib4h(v(BG2}8QpG?i}H zpP49iVYNAKH@)4VVA-Y?w5HCJA;Has6LB!dzlHeh;yX{rRiAyTP!@C6Z zc=NnOf+A7!Ex|WIz(A}AZI7REJ=by2<>7hz{_Ixufs>JQ?f&%sp6uDQ)Tq@5?Oo+# zhA&t1#mO3mWr>zmuHKF6l+$xO9u0*ALv#f=syvR2M|O@Wj9I(#<%csCz4oz~IsFeG zrPA(ALzgO>`dkJJYumMj=BF&Vv|~gpW~*4#O6MvSi+6*9O#{Bw%OVd|_yivS=$V|d za|Bd|qXGS&v=V z&%8&_C8XLi9c5E+(WllyF^$_scV^TAO8T+5SfYkeNiSf~5F5tY^;VcO5D^qckUeyT zO#I;i;>Z!=0V^Y z0Cn`LBc|n?u0d0sz7~gsORKiov7rg|{MOf_`}SsOJk5S|b|1n!StC(uTMN*XaIx5v4Q=EP(L%Lx^Nr}K(qq>4COl|YS^J9*wzk3SJo-f~R9RuHw_HXBv zzZj$ZnDRSV0#zn}3#-4>3dvDF!?bXepPy7Di&|fkluRyFa4nTcApo&HfZQY+AQu>8 z{bHH~OYkJitHuiz3HnhPJ_%D(D2bj`^m1nFZtHe=t5z~wZYZve zBg5r};QWTJ@s)-h{Oui+74FW94BLUlD>t=w5$W-nha;lH5k2Lx+Sb$P&1Q^LO2yMK zT@qHEluE5Ks3cSj6TCF=9NrqK{+Vxa@+0f3N_V_OZ{=GWGIveBCKVY}8Q8;wP>EG_ zlwpDz&cAkZ^H2qbX70f-)5LdEq##Vlg-ghJ7qy;E@R1+Gr>OLlLKex!Ue4XRlUI$8 zwO;uUk?9T{(-qDz*JTeRSCdXOIhV#{jcOXez;AkatQ%gDtYdNeI`0JAp-VFG5OFj} zS*BFMHWY~OG7eIp`yH6=mx^OhnBWn`Qw^gSwq_>J^n-<1tqIQrw4S)jHNMK7H72L@ z+nSwuV55&-(8k{`H72f2C*rzYK7e$L5v`&GyRYFR%etV-?9zJ3gvOoQ&aQ>ysF6}c z6|mRXX%N%22i{(07t^wxDMK55XT#1N9#xkrCzj8aidG4wgx;4;QtiHJtVm#C_*ASF z(+R6?)28N*_(`UB17`rMBrBoNV1QXol7!WUj@6oSvM7hXDb4*Y9ryelf}XSMMU0{1bg&vaBW$xPbH85nM%S5dlSizyq1A z%(!cS>82_ZR1mE{Anj z3%6@qpP-*{lAkIOhQnP1($wY9J5X6tVCJj|-@5iCRv7CZ(erWf zf>C~#Aofs!r*{sDW05!P7q)aQ~ZE{vKo6t=}w(xgxn0|_iQZcUdd|i)?4&k z?Yel_6YEKt`Frt#gcVM_=pv3d?@fY3bHRL_mx>+zb5>%aDY;*nfjccJ?SXo_b=jRw zm-P|Q>L7!ADV_yYr61O3d%&Hz5&^HNrdp?(%5{+@zMFhPcc>Ia73iuK@2SzM=OXr6 zc<3A1r}3o_z@iWg6VHn@*a59PnDJ}2B^j_5ui1zT#fauyUa0eenqFlgKkc>EQ zI|zrD;jYELJ6R$A_ww^ePlv}s*U0iGYjDVaIH-)Ha*CO&j11Z4P{Aafjr!b1N^v5khxdTZbExyy zvTx(M^dZ)?8%AFFgWe{jIgiG%N(*Fyus*qBQIe}G@Nq5l*#`eW4jbD04gYuWyDm+{|e z{g0hk)4xvZe_}(h!j4dL68tvm5#&Mj0}3O5wchOp{HovMcmJu8 z^W&>5&CGs?B=P~FYybLv_TfCD9dsx?52dQp<`(wjuYxohg=$1!JI&8zEApf-zn+p} zFac4fxGp{iVmv^v(>p62II3yFxxU^$e0?Cf`S$%9%qm0|9&W{?Ek(I@UAV;884|ff z93!7?@5aK=N;rx!?(+qYO`Xcsw^=BJ#fb=tPe=E2QAP9>gIB zp)N45L_Lu?(_n>(x&Gn>777-XFLqJa#S+%fT}c|$Z%;}>@aC*W%HzFhF3oV}3S{%5 z9M8W>6@i=`)I}Q0e(hNv)>qPT_hmm$eA?x%N{!1^@wMmeo}FO9f#?$U z$_XTcC9gh4)I`TItOO0|r=YcSh|W zC#o;A7$c+w)9XzcBWk*z0rK-uKvgZ%6~l)6r{QZHGS)YfjwK_c4eJyN@FDBOQ`goE z2gvmv$N*Tw7BMz(#dNplna}K<0M2L5ruaG&+UqfQH{$ED_Cz|{HewbMzZcuxfhDakC_h2oCz@#864U=->bc$)oVgUhDm z9@j_yT`M1IbmsOIIchmM8wT3Sx{pXSVkn}c(;U)%S02mHht=48m??$jSpsR^$w~x& zBqb=5O%~*%sT8?r!pasi!rK!|L~eJOd6f&vJVWg#1(-)(%OrJfdE(D{nk%;Z^J>o3%rL;E*OemoDucCVYLm zWG?gm1i|35fjo-pK%Oj-mXUJs1;2vwE;BTSh|m~cFm95)_g}F~8DF!@8H(>XYF-6c>=%`b_o?@`y?{=Mg zTF!^Wy=)10g!@k;mRJem?!5RAwYAGIb#d5lDEUs`R;#b5sbuO&!f+8$!LroA+t9y~ zko8WGACBVbLe(aB7By?XynwHZ{Wg37$(Z@J1njFYH}c(vI6;qV>ef7U^Pu&BRnp8i z-*(KjbmIYHJDfmWKX;Q*E9}p&Xkra2-XK}PInwNY!|~{Jl-ASZZnkRd`2xx%h7g7A z>LWm<3tpI@jNOB8FjZ$TfHIRiT(lcB?p9%qZYbOaYe5*ANWPbWR*hu5&^k`pJwG+o zXy&HTdiOM3qH4Y2d5oYXzbzbpwN!Y_Tl$Yl>_3&`e~XnL(1L$kDj4D;CM85A0F!d( z&rBTsGZTZO7#cpJa{huSDBC2BB{rmEAUC~UrsH6wW@IlXo>XCk%HzPyii+Uj=No^q zh-8|E3uJD7I{;-zhdhG24}$}Pe`UpB^;`hssXSJ+b1{tqMy!6|-~YNodu-AkAK2qW z{0Y3P4gB0c<0*XqBa7n6i-^c04WDu>$2Rj3sEV?pM>j`KK$;>l8y%S=UacD0{3K8a zyj8KLK)^OzBVBAsw)`GHd-$Zu2A#A`jyQyVImSY?(m5s@xC6)+GqpQoT1W3!I14;* zWmNS&<>4ueY_$A2*Vm82T8zJ<)!?LL7)mK3n3jXS$i*PwpWx^H9 zi%@@)GhpWPZg)1ApY2}vCi#<;^&Q=Ed$PE~COTtD{;{+$tyK-9!szq*WzbXEmD}Qq z-Mo|L4o!1~kg72czI)W2)w8s^?tCQEK#eK0m&LqO-8=-G{JG({E43e1o*>l}Bb_C* zz(^PK+vNSLXeT4~d#|hemlAmkKXrK`38*Q3NBHwtE#W7Am@18p6BL`sn~ryao$L)Q zGw^UbCc=}MwVasUJAy~0<3&U7RD$$d`CfdWj}c-eaBusmf({z!X+h{Hq;bZ7xctm$ zMfYK$t+y2%Mf=geUI1$2g&snHzV=x0{@UMuv6y-Svivu9{s`zXa`Q64fPMf;Pw5$; zwvhqI3r{NxNYl}Y2E&t)i6{VUY#7gov3Mt{FC>e%Y3@YHb3f8v>JRIEo<*S9=unWn zN;-UFS``Wo8ShHl_gNxTa^* zzQPD`4Ovr%`C8RIxQTBGd(3H0!M=^f^MRaX$m$DkdwcSXXoa^rxk#dx=b7)KuGq{E zh-mfYF|O?qR5_uFA`2a+VD0m3iA#FVgDI5e)VR8|t1G}pF<}stx!X(3BBsVkwZNPK zf+4`(w^6@;p&g_##!qakiY2WQ*oxpsF|aW~aT`Lki4-Shs8R<@vFqZQNTNy?Ri_LB z3ZQXL8D2WHn5T(aWzNWmliWi<*-^m))@4@oF#KR-cK3e zsyPQam%Z?Qcg$}(V|KUKbFk$`EQ5G(n7m@#YbXWfCNvq>X`-_wG$VJjq^}^^$kFk# zmaGD+NQ0AGsCRE_;U!|@j4abMC0nYwHHB0dwg8Umii`#H1p6Z5XY-Zk+R9(`DjYTR z4CD?nbd>>o5K877k;Mzn4E@d*SNUbBO)bJq)-t9}r7UAxWW#SNYCUlWE`zhi*X5JG z4x~ez3Zb4AcP5FD2D{AJI)NM}ohLtQ7Ypt%@@ zw>|POQ_(r97!e6N>#k{A`Rjq@_D&8wQ{4i}wO{XO&uyJN8<3Lu??j!z*}qVlLA7uP zN*{nO3=TA>c8#1izA1D8W0HGE#`As#(Sv>g~d>W0hQpr z*)OsQbr50C@fBP&$FoCxLWrgJy2wt`$lAOgWgzC6VrFL2bl^TS-rgEG7<{%oqAh*4 zt0WtaKhvDWDrXySeGvCG*?_KRJfS^FrgSMib~ZcZ00$PvVI!VJF`RhjTY}91n{D1C z+^QtCXQQFb_&ixS#Uvb0g|VYD1kwbKOgLmvOsr;KMq_T(>z?(dZYd?Gqtq+h+gJ^y z0l_LunVcX=cM6LxHD11#vGotBGS*Bk^NEJR^(mm*hFJN{oZCd;JK(DZwsUDoHfvzO+Gf z)?&C99Cs2SD9FD zANIUIldd<*{{yv_wTXuGj8~kl@O8E~L!XX%%;Zy%@jZno$r2dt5q?`_ya5KwUo1!e z{r4p1)wVU({quS&J9VIGmC+IIO8D`FwzgEaRh= z@%#*HWT^7eXY50s3X3@l22omUzuRULChSDN`HBsAd)sOA%A#KR4&w>YoRvx{L~bu` z?j~a;RpHsWdBhd6xE8f95=>qxK?UYtlsB>ow*WFX4-!-Y_+ z;v0FDsd^_@Ib0bOq-|}KX;4w*hbCvNSY#D~OvEV-`%pvDG^KB{5^{?2?ed6`VGK@9 zyCP-W<@5AE7AVl@&zL1N7AZhQO=v{y44fxY>c144PJ}I7p+N?eJH@nqGB;0n9zcM= zPqNS|4&pKQnP2zj4K0uDfnQaO%<3fm1)L}XA^`u(a;y)&H-h&(5-*Gk5Q;z2@m9x5 z(yKG=6OS4%tv5FWBhohnEk}4_H9j`5=h6vZnnxEHalJN_?kH~IR_M|A2atV+54KvZ z2XP@KkE8L8W~!~FED!Jyh=-2quN~%#8eVO95%^9@uD?QCLPVh@SGW@qh87Z5;!n_8 zaoaZ=w@R9LgU-oGe{TPxsykM{*0oyr_@uOFhjP8zZI;n)>O-WCa?W6l76%~%*ym3{ z{KFk}{6-(`EEG14jsWLNA+3D~rs5w=M#jT)U#EzqT)NElFmVm2gt@o6MSnv~AB7-) zpEKZ|+U&UoheOIH7KD?-wg7JxU@hds*}PMBom?@} z9iDSLhcS76$kNTcxYX^F^U++)*d;9_F2{doq|(7>mX@oK#zC)1?1d3HSb>g?%Q;4G zC_#XK+!+jVCD#CgxvqjHI#RAn0<|i_JBeeX&5<)&o!&D+V<%o_6oNoxuG{A}+tlBZ zG(VkqnfNp)l!-vkiZk!Qe}7U=hva1aFb|B2P`{0f9RKTg^yeoO6C(b2Z|y_&ovFIs zY6WpYgr$kcdPPLq>OtjY0+NhyMxLPU%5$#hxG7{dy3f~I*I!e&px=g;^Go8F?uhi+ z+FNrh$am4?5f1sa8%w@>NzP>9TzHLRr@N&}x}+57*;?s}RUueKV_M?HPe`|yXE70) z9QyDg#t)p7(sUNpuhEb;0*dN85;XA}dpW?luD=lx{+fZ&4nR55{Ygw_!AEl;1^A6i zzb&r*$umfQVB)Onv zWARu!{oZy1qRrx6;q5ly@or~GHJ)BE`c)Yt=h6csQbm#Bpu`HLZ5-!=2d-?5cn{wYk%GLtS@oWODQY_c1}sSfCF7=fGw{R z6sxL<{VOH>D1X zNr@X8K8sehHrBja6IG)bUm(4+l`06snhWSJ-#R$8*WYiGego_`X={QyrA}(4255{p zzq17-&Zv+l2(eTfRcpOBduabbb*qE1Y61!j*y6t}&;RF%wv4`mrK$ekuN~iqKf*OJ ze21eG@zc~6_C&0-Sr0{KmS+nq8PB~}F5^qqpUIX^Ti(|lg~(8!su1m%}^cdz3yzh$0qQ3_SU4A>da!(6@< zJZ1}NS;%-{X}!s=y#WhvG6=d8k-}M`uG1G3IBTkQjCzwGxjkyn{unsFc=a-3 zKN<-A(AOW^wP1Q4@{2F-!6)u(v+Z|Qb82g$yn?({i|bCE1Sv11k5w1Ny}Vzx!rR9w z@Qi?+ik?ael{{=gf55|Hf#Ee=d+BD`)5b0RZ5uqv$dU5QL(Y)o8F(-b5 z;Bl64e8YBjng(`}4Wengq@M6HoKa{Hr6&B-Tx`KBCLe_>pLR`_5q``Ve>LRDk+dbV zPg1DV`mh(3wom(gwQcT>$BThS8~wW3`qd!#Px0Wd+kKgS5l|k4qR_y?6U>m4;yiNc z@Fu4S*g7gG9ex7*Rr7^lYr9$4s6e3fL)3B`P_4T&g`~U2D>o&7_po4RCwI$V@ELZT zV>n?^(nrx17X6X2zJ*%PiSE}ki|nU2R`>()9;DvT`M6n-9l{pm8TAbwHZ-7XX^Cam z;{LRguYE>qOx^?&y^`P+-loYHif2eKtaT9*y0sQJ81?mZKPT+}kj;(~MxDG^52x3W z$7aHTK~VIN@t&Ml9+`A18LK_o#G>b$$hOL=n81Ze;b=frL{(=SeY(`A98e2&Y)s~2 z90EnPVqzQWOx_xb5W(%@0vBR2(KFH5H)q*>^B)V}eU4MyOc2w`hD_}0gFl?ihw_Q| z+Th@h)16R97fZt?Uprf^;{kpdNwm!9NXYv!c;n4ayo_~F(_oW)J~LCj(Bqetl0RQR;6-J zA8>L+9Vawf^OxS{FJIM*vo$`o)hd<^*Wtil8Sb|X4gaJ|d5Zl17~%YQ7s-!T1yAb1 zVlV_*Szu7nr$klc#Xe&KieLotp5RCs(lYvQ*!Xm?_Kmm#`&6q6MW~!UaHFhpu*I4q z>87lu$*CxAaH9$Ba*(zVwS6JE>@A*F-i7-O?NdPt>NTt==0%G z!i##pVpsTvrZhVnvW{rJ{DMARon10>9BZZuY)0zv%b^fzQP_s6%B)1qWt}+Pu7%)c zL>KRK+b_r!s2kewN>l(6WAt?LgvjZzIC#k=XN=zX z+>AzXXokC-I1{^unX~vHvC4>UWOIqgx^y%f@GT+3jS>5FCtSb1#*$>W?al>AVpk*A zg%ZwN6PAK~x_9PWUW;{3e#}ti=X=dFZ_W3iTcpDx zIIy9%n%}j*TRx-8_y7~@WOnRe4TI*)kHdIQmK6(1(Nq3K2AL*mSs|xDARnnu306e} zcv}E_WN=ulOElI+TFpy?y~0w4JN{No_eBHa`3c~0=+X>ZtJw|oj=A4<8ULjA`olYZ zE-U`lFWQH^hHra|(esd-t?|OU(*hh${VMmD6 ztvKJ_r?}z`&*Q#*$qdczHROkv_gVM5hK;?08)?kiZmZ%#ZcvCM_dEq2Bs3|{t!fHg z8!>E?8+@n)!e0FI6z`AZk}2Pim1`l)1kKb{lVt)klGe3ns+{|E{eLIi?>eZNlI8P((n z&zgzeKY@auy%9;8KsZKP=on~@2ZDkPTAJT*KUZ6BsJ2@2qA750~CV&_fXq1~17NO4Zgh5m>G0<5I&)$aZfxz`Z+Tk@5V~$f{lj zGK~m*o81v*3QS=nsQyF}bt2Wi{7GN4e-gDWHqu?9eJ6C`IPuvCVbZ;zx(Qb$yNdxI+o8gc)G_ZCph9&$mxgsVUrAC* zkSowKsabcAdbt0^%}j)r?1zt74&`Kd-uJv?6vWIfizuB>t#6rS(mWQ>;4r^U-oF5! zJ%+5GPWh9~U4hkdD@7bddK6_;lAx z&-GRxvr{m0Q3s*XD)IQF`o*sN#opm?=@tAlOk(D13>o>e-U;jl6As=gyN{eAv?KV3 zzWNmI1}c3HDjW492wDM^qs+1j=Y{hWH7Ffw5<=;xFyH0A`4LE!9XVmR`=B9q;_xN) z2Zi4yi5?=P`zNk2=~qJf7Hjso$i~EU4EC7K#eJ2FB~Wv#c2b8_WnrRX#E}@@&cxJN zyH`ux^&~j!F<7A5T{p8ypqC2b;#Dv}+ELHQL1JD+fMsSRl0!o^F391NiGBCkw&%0l zz%W(W;<(5~l7R87V`U-)WW0#0hz5nC#C&>DW}xRnEuphzVEG;oi9`;baALF8w22-3 zj#1$LH`?nZKqmt3PN^P@#I7Q1ww@mIJ|i*di`T5S_C+YdRwwYP8EB`oZ;{U5t+*2; zjLv6CXUa!Y5n*$=bleqU=lbJygRrA7g3pqCQ$+9_UbB|{WV}hVr%P+DgN~XUa2l4T z(98I?xK6t0p|#Ev!r-OCGFSEe=f_V9KC-G< z%8%+j*uMoQ68?K}_ctO9fzWaZVDrLn*j65efRDr!ar)fB9#)-0Do99(CR~Pi(pp&= zoqg+zM&|l7Igl|6s+W(*D^nY|c5{v86x06PT>mUvNf(u5d-{pI z5CUS(Yw0#Yohc#jf7yq3i zXIt4cVt12W|&tKaRy>pC;*ku58r! zJ;dYzL0{UQnIIg0;n59{e^nOTSwVFeJ6MaU23(913w-T`ZmQ^m1_GQa_T$Y~4dMf( zz!MJ+kB(AOQXpF%?(V>!sUFXLzymqUHCP+~n<%&mW@SLTaL#d(x>jO(e->=B`vT$| zF)my?bZ0KUhAekt6#@o9Nv4(kPL|1eBlVf5C+;Rgvmky1ceGFlBbjW5o9hOs=gM83 zKw*+I&1OBXR+DVi@|3uL%;(U971xa->V<9qOibKCLgS_^h-x_wr+*N|(rwiTL-oSd zn|arYpynjSoQ@G_WFoCrV$ZLYbi+Bi*U!zPYqw;5V1y9kWE+UOLgu3dPqp8Wj#HL% zBg_QP(@3+Lys$n1GoaL}iQhqa?XMi1VJ%EV!&=$-esfNS29bPO-=2?Cd9+YEtLw5K z0zWR;%b&`~;>uv5K+Q;%YyywIf1?_YLKKc*Wb5PHPTQI&Z!2jT9>V`u^C0=b|AuggOb}9G_Yfs#y)H zf^cbTQ61Wy0(R771N0Z)jpLT*Dy1-8#I(;@ zPB@^xyNsr>Jg8aGP~S6Gg+u@zwHv&=Hvhbfj)0B21Y;cjQ({MA^ew3^dx=9jNil}e z?(*S^xEF}0f|j($gi0fM`jQRTr|wTZop^dKvR;hf-(<&9K+oUi#-VF6jFNW}WX39L!hW@MHA~Ml`t;!8s$%hUX^0 z3@_Kwbg=9jLC^cX#=Qj5Fe#^M9Mfi>nbvVOCpmuVLJh&Hzc2#pZZ@djRS*BeLDApe z;(yo05>M1WzhE-}UZMjzAN~g4O8CEkZxQ?zzI7e9%jpV?Esr`OzpjY>=P`$Xla;Z} zKgJyY{kR{y@ZSRWc2%Uqm7^2>M(89V1TXi$1nxbOYyK|@o$}piiL-$wIQp#_{>g{> z6k`9gt^DgoHby~N5jco%mL-=5)00MXRHIv#xe5uY24@bED$ZDy73$IEA~+$Ig#&U< zpZD6j9lyBFIR>K6Xlf~O=2IYRBR{QOiO+~hn9dV_xQ zT*lqWVTiwdqp^(lZhM93h^W>K5mrKPUm>=pbraZou%Vo|9&yNX`P$wt5KlaPhmg0H zizcJ)+nz+AQeJ#uemE3r(BFOc64JnEDEl$l!7H7or=^+9WfD!hMO;n2b;|Nv9Ym26 zH?Rx~UXf>3_izWBO<967a~^%+AYCJwBf(;jS}CoaeCL@#4_(uZ{wSJc=0Bal<1 zn&QoeEL|q>Xc4+N2{=xoF)yk$Wg+BOcjas-M74Hv6l#vcd~Kh^Z>nB?=S)xKh*Afe zXt~Dd0+|;jJ@d}BW0`|j-aG$e^AR!svRp-zYaIGI0BhymRZw@L&~8!PUY+^?U{Y;F z$t$>K%#wdRzpy?q!9V}5UCc{r=kS}Cp&iJ5%al*EGIKEgMgf6BCH3y|7xFyc$-yf*}ofz@Fc1wm5crDg0h!)r@ZQ<9;H zN;j6F1$(EI7hABVD7>sB6gC}d>4#BOO?gM1c(2x>P-fJB*%;i34*DG|D#%|yz&|_C zkZFKHCM;FB#vx9P^A&<;lzMS!r}vn)^-e9d(iN^frC}D4pdtqt4av03q!))4rb^qV z{d&m=5&a4x2{B4A;LWaG{EdpE@7OSX|xOcCEC5fC!oT!KHy}qX|y8~cawVuJR)-0F! zjv(N~@N{e!Ji`^B90W-up@G-R2ep`73vW@m^ai66T#0iLuFh;px+858S?rN=uxq zyTljyCkiQ8mK*seEZ?`z$6rF(DdN8Y*{4~E(z#mkL~#X#)q^;G-elyGvvGC;9w+(x z!t6tG#pq1J6vakZ{?b+tTg&43g4z2J+Fo-z1mkKzAVISGHS)n zKdNE3G2IM!pvkm6(x&!9#L`suSbqk$UV| zet~8EDab9JAW^&%HdpURWXw8SD+?vV>YL&D;TFR`T!xXZ3C)cR-GQX`__-UobtFU) zDQ;XH;}z!?45Q}K%hYEybSPzjHG#^|yO`iq`#xHCD(2g>#62w&76M9YZy`a+$ZQQr zCcr&!OK?SJi>uO?IPe6YvxMjbFy1qYL75Z;iKZJ%nJ*lJk^QsVDI;+Og0p@heCQxF zZI`E)W$#k2I0M(EcB>|8Hj&y}vE_ZiwDmm4)H(+N5{+`o0?qFuB5IV(i`l%(<96cS zAm>0;4!CGZ2!cOPI^mqdUMK2F#x;{KZ}8rEbC{vHY7t27LaE$RcBg%5+8b(JG0i%Y z82Ch|egS}e4*(Xlk7s?qPCNwvZskV{KepmO=2!1!#3ko}H@Q(h7+$K}Sme~%Z~Ohl z;hUq85nm9(MG#h*6yVK`uTu3A>b`ItM{`H^zm&`O|Nh}S`GhhV9D%TIZ%Q&NqvcZY z*3lyHQuJ$kRX9J@JdH45OPF)x05?A75u@3%SL2q_6^ zRA*RBO2j;DYcwI=@(kYWFi1*?`{t5#UDWE(1xX)XW|Kao)3_S#Hqv!mP*v*uHyVy{ z>HD>7F<^n7d<-?JZ%6IRC)s>N#))NZ7 zi@xIEwt0hWFi&WVeUZP31lpIQ#iinQ#b4G~;9 zHbR-Xbl2;wXG(IvbOTP25esx9kCta&70xb4}){y=0_mxl=uf`V&R^~$s&8?LuGPwj4yQdB zBpV~1@o_X7c`ZX2Kvj5V^u<>p-(4;<8gfuK+1QqM2JZHaJ)i8h*;oVjfd*m{+sn`X z94g#u*FG*vqs3m6PObVWLmR31`NF|}E(Ac}TRyBr-aMpC$qt7ZIE$KE&iN6KQ=Swtw`0&d^0j1rW6@V_ zq>1yc!|}F<$?=PCJUs3p%7UuE2w|df8+&0TJ;C%0V=`(_vhl=*P7QUzaKPe_Fq6(@>9{`-kGj7O%ChakM`7u1knRrY?(XiE z?rs!N;0C0-OOOUB>FzE8=?+0cLIf$<7x=u7PwDUb_WonfcIFx#xo5bq<6P@ld9Fn~ zUZVeAB<-6{#Xm;rzq(at{QB0`5JBsm2M&V zi;iBMDh}cN=g(k{Vt60l<+B5c`KEr;S&LFwiLK7_VwSS68|iYM3-+;nuU5Jb!#L?> zlvwhLCi3}wQYTv(zVL2;qR;-^?N~v!;OCrdT$4%Ulswz2{rD{Fy=$}}Aqwi7WY3q? zB13&>IWL5LVsFJy!LOw1aNwK?$uY^_ACYo~T^r!+8=W=ck_$*8Cn(GBqo5K6Ct@}h zp1{VZ^vS;*`6~80mciSGLWVbaKz@x|UP;~484XV`-@?r&ct<3oUljEzh$X~l!VNjR z6{3nbrw`pw^)RvAIMrpd50zg1{m85rMo+!5{s;H92L?&jaw-M^mL}o1Ii_FO^#56# z|LlDI8RGni-`@U5<0a7Udmq2ukE@N-j(hs|Sz_6L266u}ORSPAaPE(e%Y`!krawl9 z;Yq$81R8vWA434@2?JZ}lkoNhpp379=hy1`yH?A8c9RChkKf;s?`t2;Zh}+5ORKA? z!K9g>${8S7dx&4cbIAX$#>cXXgnK4cL{i3#!s0UbAGemgAPIsvkDCIk2aF ziZtgQh~d4xOs#JQB_CL0pzG}1_NTZA6@QF7N|e*0+caAot8C@UuQ(sAq-hMO+d z(JMhjxgu1<{2lPaBsg#vZ51%AukzEF<)(?q7EaJL=P#@Xxi(6^$8uKZD=dw~)m3Iv zE_Wdl%110~N^^V`kMa#q)+8tH22E z8>oA6+fL*}!Uc4R@3*={`7i5W4eV=nu`o6@cV$vl69E>;{4fze70BZu0rHQ2`H_~m z>D-#0t!b0n*G5vn;+X$jgi{WTHeS6+n9P_2W*fuZ&o+)*>WM@2EgW%Edd>2wSYpO5 z0ugABM za;=Ziq765DEQI`}pe`-CsADf5r%3hNdS}P7@Qrq!c%zjNHb+l_ZMAb+Sv6MnJ@m>j{S2GsdpN^CvaO-I;#{SAG! zr-sy8XK9>z`!(T51M}=v{zJvsiUCGEWePfDp$cuJq zOZyG%h6WU>DvZJ9!SdbW1GNhgb{XNXic2b>3us}44$iK7yD7Y8Szjwbmf_h2 zl{VH?;&!RfHnB8bdQ}8M)}m4udfFCp&1iXk8ji(HL?3@blH-r~WXt1gRiMG*^WdRM zlxp3O-S2TP9=KPI3_D{4KneG^uF}8j@qa-H5FmFGJ8RRw%Flff17w*=93m{*M590l zUsRs+1`#txS_Y#~Fq?Bmr_gnak9_+B&Hd)Zswf(#ZqDZ3k@_D2A`y#REb3?3+j0$~ zscFuv#ILdYZ#W62hizuJ#?m;l)z0AFg-=>PEwVSP4y6qSdC%VUvyw5~`G-rU_}i8m z^to3iuC@ze>_#%{Xb6fQnid#zL);+eJayuSz4&fCB@u#=&go1kltuA4Cj=5A&*h0z zP}PC02t@;!Oe(E|-o``GZ%Pw6sRO_T>9@H2R?6tYBV`wF6>j8z~JN1u;3O1XQ?8?+|cPN941YIM$`+?)zglOMDX=(p(YgX zBJ($9td^!4B|_H*;7G9B(dv5CwdunYoBR$EMZE{*Q7ayqHZxHZUbaz;xsIQba^GyU zUG&)Le&-iO20MklJ&SxbKEA(5 zkN5+XDjQq7{8$6{=RG8Vg^&yD+i(;hf-WNlnk&;rtFKdgH&o#STEUdl9 zBB0@|^n@@eQ(<|xr$OrgfT6ESFgxir&SEJUCT@}*;imsD&s34f6?Ymzu>gsGA zZ+saXP?kWZ1CLz2(e6E8;tZD%pt|^=O@B$i;r6t1JK@?x zX)v5=K=WRTIR1vuKRJjA_{874rvHM^PYx1uar;xnB4gSWyO~k@gs>Ns#dCt73?IFx zMZm`ZAwyAszxrJ64p*)UGoKvRh6jPtAx6rW7>k2b>2{T=nB9K;N=VK<}l@0d`a0_ zy{*2GxW$Bd^>%5Ia=ZOB#A@oJ5aT6rZBe}WyR@(_JbDQoMPs>KdglO0zOJ^BnNG%M zE-?a#6GRq5rz9>oJYoEHa6S*6VnT6sm|p?B{QidMKj%;W`_|E45S0-76UKkq?tk1m z`f0m;wJd*{?*H97`mw`q>})#jVa*+2xj6vKt*#b^pc?Og)d{ca4-E}*`B%%G@Y8am z6!7zU0xuE`Jik_*-x3UF6kmmh$9!-++-(qHj>hu39(Z z@JLqs#(uNK1QIKVLC74y=tBQ1etkj8hKgcCbYR#WPa z`#`D5Ch_ezoHw$&iKw-?t$K_!MxKMfvcgY zv4q)dVHb>TTElY?EBbg)588SE?X8)g%pGk3-BZv~#-Xj1coB&xl5@kA)f&rz1+$cu ze-|;K+Y247duGAq5|8Qwp!vJ?{^vRWJ0|$cIp4!$>|$*Hi$MeVe-Cv2a@NU4{XY)$ z4_B?}Z(Ayofb#~{55M9&F=f3e;)ilIe`cG>F+o}0T=~s4LB$E=6`r7e`N<> z<>7mFAi$QT$(=ZjS%Xo2J_P0<@Vx+kN&2}3c8jjvgKp0)WExsYQ#!8WVF;=;6c zRoZ{Fh?x0|d4~?6e~JeV!zg5ZLx_jT1na;{M)%Z5v?(FzS*Rn<9HAH=ow{`cD@K;q zG)M?>IYM4l!IjowH7SV99B1s=txBt7=O_cg5JTNQ>m)>Q(wkZ0yAMLoaA)s|C|r4j` zIR38Sf>S4v7ysGZ$=p}3trHw-#x%$K6Y!%qn#KqCW8$|Q^4kF5ht>N3GXU^S{&fKG zPZsg%6Q0(22aK#>WoCQ%hnZX)C7>_ zXtWGCh*jMUO?@^`PU5vc2^uYYu0dIE#&$-2GeoG?n>8>mnuPEmkky<;eafZ9xtkyX zSW6BDIa!NEi|IDSyzb$JEIyORXec+wcOpNXR#T?z>Sz^8H(C2JDvd81RH4x-)Mua3 zWNibFUFe$vAU=eC$YAQ>HAu-GOc7QSwN=O2ng0g0qgTAn3bLW|!+mwzSqA!Ey;_8l zsVM41cP^k#rjD8u%&l+04-iM8QPc!vkko?Lcgx#{9y$8?oPb^c8ie1TE(!37zw4K) zlesAqU>VeazyEo#nh%j(@!uI^BVgLh_h@>^h-CD~CFrDanGw0!3#B1h1xDjP7MT86 z9dp*6Z6FE!Mn&NHsq_D2vwt7i!*>D>3viA8th@jGe!k=Ph^a4HpJuR2hD1c=su&TVg!BEKagB8HgnSJtu{S53%`8_40$Z}`v?RU?Mdr$MqYEKz%Phhcoom`T*~lVWQp1Kd=tcJs!;iM&**(f0|zVb}#4MH3#Xq9mazEzoH~qd$6y zd(i}}B!yX3?{xJoT+Yxt@3cd3nO*I3vKKW-aRVo2kE!3IQoVBYDeJ)^-Y9aN4emm= z5@^bC8O6GRs14xa!LSTsLU*3x~H`iG5gGWlS%MfeE#iGJP6r+*89KV0d_Yk zBL?5q)Yh&DpFr`#zLg_%L+#DU4R;8D&6E{L2-7T<>a3rXak{Vfu{_2W!5BEaj_1GM z#K1`hjVWr1MF8Q+)Fp;D9N)YeI$_|ZyR3rlkZi((R)`yoXa%_+a;7IaaqWyg3`S~s zoyA6NCH4`jh*@qxgc_5KR7g+WzW)N2YP@gJ4MSRV*`r|ojeCsvXZZqW^sh$#-})BS z%fF#Y1vcYhdI&pCVqMA=tP#`rc?GdKYwl)L(aF->8UN^=tyu8bxrgVT`G2j0|MtZn z-~qgFKx+P54eevbfx9q3veDZAw2-Wb#OsS>>of#cC>$P#I7TSNl3Zp&++q>v|Ww7nr&&@ zaN6w|%fRXXsjznDnhlZ*!EfhTrB+69Ezl+Ez_SPAf_gsEj zg)~7x^RyxVu7}oFxJb^XAq}$a`ANeoQDm%~4^^B~PBf$LRs8HV@zz^xi-QasuGPsZ zXde=aNCkB$pLHkAo!jEciXE6ye#L~|ie9O@rstX%*(&)4%K0>&S{FU@BGOP5N$6fs zQBYjLp8%&Y|J#%Jch2E|C-KvC{p3P-B?Tqm5PZ95ZJ;0(`_e;0Hq4n;C@5^WQAzM* zS}M#{lh=}J^uX`nm8gjBQ!|@&pQ_}6P0dH9aXjB|i5@MzAy+0{V*DUE2nuAM@t}_9 zfH}4Q{ta(GvYLN=d5Hy_LzLRHJOOTdxIYepeu6|lc`F< zeNG#h$B)MH`Ute(T4RKwq0de_L7{#daV}c-&MLNi66CafF^q!xY)tEhd7+%VyKe*f zbJ%{pInNh6Qeisl&_&R91R@g4VTa}{MqRsrp>kmZ$iqPUmYk&kB{T8=h zNU(^VrK5|ro0a{47?Pi1&<{g5`X7d_KjX}Ygo&Jsq>6@xtCpgc28ZT?91CUZZsN{fggy z^+D03=2&vj4v;@#xT}7Ql+u^aIP>=&(`oM3+4V#w$KVN&^`OXeUOW37Jc2=m81T`B z+~0Y`lo7aoon*TzZA~pmFVZiIOEm=9ls}{}d}zUfh6S;c0OP=*-68n|3TgPz@}ok zO$q&+V2YWtNN4$ys^&m1pzCD;#8<8Zu{Qa!mIHg0lF$JCa2Kt_5}8rrmN#e69GHfg zomWp=&WR1B%)>sgkZDXkEhxJ}S?u`8PhO!`7qpBv=Z_lKjllz`+|V% z*aFG#UmwT6W2y(e`%9MZr`Gw#wBFw|4I0<5y(xZC8u&U;J(`uG}o+Y216$tNEVx>m{(>SW2nWXGSLfDHfIrpl-H%^DKY38o$)%@L~26YYf&%cKErzTbG5d;-6wSfRiC22MAN@XvYXFiyj{sq#`AgM zL@1%pK{7#t2_Y0UHwK&eI@wXFh$pCC4))@%dicT#Vdtp&pe-R+_``>^{e>*BAr!vp zdg;K49(Tz?X=H@6bZ0KB%yp-S0c02#_J-R4b|JsT?%zZ89v21IT<0GreVtm(JxsE9>b0u$Bt3L{-eyPs}wj;1%Pr4 zJik^y65yx*$%e{~KyKrIRQP8f7W-R{ne3|&e9zEyyQO?sT}<#v4;Arc>4+%`%7O)X zsMW!s4N<3ch;Pap@@Wz@AN-9!FC8uM?TlTF?_j?av(v~y^^p1=e`LmxqGdD8Q$X>Sg1jc|LN>nXyq1~xQitO9<41u5gvF9?LS0d3jJb3XJ{UF|b##i2 z?9ZfbpP*pzsKCkjdmQ_3<5Kx+$!cfzkMcjM(ov^B)2*z1F~`d(D<3QGORJ5L{>2^Y z$3|k~!G29fKp07XOMSn@{=pLcGbsE~?)$HxP|LD@WI6-$kMxnxy~wn^P}Q_?fg^`d zdS(NsE#hRMK}QbpF1UaipBy5l^AUK2utFK49SPNg-6W;EFf#(=z!rFZEh)dCp8MGT ze`SZC)bmqgNFQR^?f=l2`@Gj=UdD*oeNg-Q(Swpa(l-9f*MAtYg!%YT*&qVZjx*Ie zmC_>u@jafPk$Yn(CGM4C>ZdGk%HsQSWkR@3FbiuX_fBD+3kx%w(--DSwqqcfVf!*@ zN==Ro7ng#ay~;MI2==A2Kk87XNGwjo9t~W5jTNftdgQEyTDf8dw(q#O_x){aV8Q-I4Y{(Elt+`~+=O zr3$!ljhTTRpApJ}XKx49*<*pvCo$12TEmSrm%TIGX!5zs0%PPU?c;zT;x(yI$8Pw? z&YfdV&PT^a@Nv#JzZ?>F2y&9C!!}=hV%IPoqmo=q#f#=v)4JX4*|oOe;XKc<^d%)% zhvO4@=ZU@-(ll}Y>Ugp>#Su~Md7+}4pQiTMJi*P=I!}e7zU?PmRUk9*D{eXjMh4^3MZFebEAHm^Vv2ria>Sd*p0d?1zX)EIG;DPWTk1;N1?Ktl z#lFVdbCEh-aBC%KmO2aD-f0Y~3`pXtF^?O87x1>{cwGyzpewA0VwL%nf8;xVH ztd7?s6iQDjO6PqbJ%5p*c5%|O492d4$qf57kze+CMTXegr})-Y+WyZM&_me+!VU?V zoe8x5+&P#svy+~OCqDTEPhu#vUw}8+dJZqTe8Ccxt`k_DA{6~V;MY~ad+bwhJ_>uX z;*rDpiZne?I0}_bOt(Qcn){V9%iE{aHb#`50mN)LP^$b>Es3~Ded3#8BT&X@r!+0& zq^efAu5R53_ragH;{MP801(k{CGX#t!5$>O$Z@m>f z<~Jr6bxS{c)1lC0%FbV6lIg9&jM=i%^k2w+8Ku%qwA#CXe~_wYhTe3Mx^nHiV{B z!y_oU2*p~q5YR3NCst}L74+)L6kUi@Y@w|$<9#GlQ;N#OKtm=QB&A-y3tvGDe_}Ym zLValgt%B-#Xe(Mvyjm5C#jaP>Nx}WXB|UN%#IStkL3T40qC?LY@Ho`Sv9U4-p%PdF!H*;HI$PCVSdx_4zsK zXOf$=$*7v|Cj;t+@?3(5IO;XKYULWfqC30+?I$>;4+*n`DBTMz%LrC14Ir$tzir;7 z`tQS#u(PuURsoobxx0A$u`=y#Oe;{F!3>K2qC}ey1uqX<2cksKLqm@gE_uX4!ZJad zr@27~ifc&pqJ~b1!MX2{aL$A-F0rEK|2B8QC)jrWu!M>HU~U5EJY=2X41p-pl{EX- zq=)>DL7`VVj0R^1!=c;ADyf`(#N_VEZ-9Kzh%j7!03#UT;xU31bck=K7!)W!e>Jc7cSn~;A4pb^BQW}$;!MdcfPuxdT-grMz$ZW|`0!M+Nj}?DtWMyiV%&DU(;|h!`Hj z2L!Bj>MaE?C%C^|RU4?JSgFNz2W3_1BWS2~qOfp)D=xyL0gDurQ@Nu#p(RbX?gv6eii#*6Lz@wn3VD z-uLhP+{B8Ii29nKi1)!D!2^hSd8KQfn3j)M8-bkEQ42bgu!B&POi-& zWLQ{Qy#iBE(Zp2AW!^u3lCG*6X03&B7Y`E&gMsq>(TfCUJvvR)ZmQ;YeB;e*@7@t- zJ03lXs-h~RFz=Ezi#m}HzXd{ET7?%wujOsc+Q zn)3DLv#F}S4R)Mcc+nU=%fpX}GvowTa%OKaSdpfx4AQevDe^rOq_d)~84$W`h*()c zZsc1$(lpyD!ch}yHQB1}pXbXpo^I(B96u|>D9{vDtHN=dfBfZAU7?7s_7V}4J7Jhn zZ`w84!xnjj5!H6Ys1fef2%CeCJey*BA~KgUMximzW*6dZpU&fZ5K1LuQqZ%6{EYHD zKm81YOV>LxMRVi8*j((b>~4FqT_Z%8fa!JmFbsL{WK(W|XnK~6lwR8+$p%y?r3tm3 znLA_rIsJjUo_&jyGn}f-AjGHlyiF+RuB8hc7W8j<`xggx9~9j84wwTipFhoJqVh0M zaKjYfQb@0xX@Wm7b~f;xkC z1~q(LVKs8h1A4qb-%KkVK-5~+GDd88p@s55z-;^s%SV9N|30+(b`o8j@Z1H-`y zCH9cAE5D;G<*$=yT*f&cf+IOQU8;8^2Y8RD8k`^>VK$;)PebGf$roFy6L%OmwTYS&6$c+r<;gX**Xv=DQa~W)h##yDY#t;{Z z_3X(UC$FszHlOW0_fz}P>T3IW2Sl5>y6jppWSiY*rU zaTn@QriTsU;_}^@9Sa3*yP>1i`=#)n&uwkiGkb`|b$n<2ZTv>eC7Ri31d8S2c!*HQ z7_|8xxhG@kT+PU8J7Oc%g96DVlI#!F%01e%7vlYe&UH0~ARtN!!Y|P%{Vy zlS-OC**^n!j^M8P5|KE5j5p)1-ALDt^BmUn+k-6cF|Hfm*BwxQE6dFP?T7r44gRBM z|I0k^kHtFwxV-Yvq46URjQP;0FOwZ$jFWx>g^cm80_vCx?e9-vJSyXN6o@yAk>gY!^X6Xm#2&n z&K)N$Eve$?ZKA43r(FetMy7?9fPOs+wCaPKf!RaG9SCQU#8^O1mgz3ya&rb?z07Nj z$xCIND(rgRqZakOz{NsV(eXX8oj|!;O zkE>er!>kfX816}K8eybOz;eL(JhnUh-&60#xK_afCk*uAu; z-BVRMO(L65EnN&*JsA^`dvn^8m!V!stNTqsM8i%jA(6Xw5q-ym;0hNL_hruDBXHnS z6f>qj1s{<9%)|9(FP-s#j*2vbBC%$qu%?o?cA&7fkhdnHuzoCWZFm#>Wt}U7xP2X5 zda|r&67fNbv{<)V?w$UU-zwYV|3K`AQ)(V9fE*x<8npVV>6K8`gcnqi)q!0tGbvtR z&QoVGl2@?dLR#;R9}x{Tq!krS$**u7jhdC$e}U>iB@Bko!9NkG|6*X*j9@uJX<5`} zH4@*ERYA5cCrXW~s*_ZxKJrZx^;yBTk6rml7X=Pl#Nd1EV#Ioxu?dp1VVD&*@L|ZO z^y174g$Jor)}&H*rB9+?6IUyTS=t;=u^lQ7hr$xburg#}QcwArpH0N{5Tl z(Gie>3q-p(xGM4$*yiB>uy>&UR9o5@b-IrVp;e4mw~tc zeMI;-;m~q1c5?dPZf$#|VfX-L%nZ{4frBcVs{oQk=?S_w3e&Q$q+u79Ma9uLDl}JT za#42Q=0RVFE1#-N$L{d_Y0B#f4Wn!J+wll_w99 z5@B3aWEZ83i4O&5r@-NMPeIh)nTOkXPl8knXdM)iNw5974*MZ;CzxRrJ%l-JAwGAu zEQY(*-qm8y1cN=gy@crvXyQ`MQEC@UAh^r85EYhki#)V{SeZlwE1BUK-i9Zt$%vi( zJF~(X+&vQLgwbI4-9Re8m6V?;Hh^paVvzx^fLQ`v6y9Qv4z6x4#y~|*)7sJQVX^4{ zfpEJ2N;u=drLeQykvQ3%o0g5Z+#aC$xN_tsqbF|UhX0<3z)=Gq3>2D9`cpqcX%!Pg zXA2ucIDK4lh;#)DLyJ(t`{I!W4mm`)tDh_#HUt|4H3|g%{R)htV3fIp`-bJ)wYY~t zGBKj=3>$MAHmLcN7PUxVGZySaU0INC5yKEWCd?jzA(J5B zg#D_ZS-{Q}$Ie#3juOX?P{7XQ*L``6KNh{}1V&-4sc!vat=g((T5d0nL~nwJd_* zy$3SK`~Qv1(f;2j^K!>AsXYM2y5FLR4SeE9BKUt&>g4`EMvGr`nFNyKcLuhfI_oCh z>5gl5s+G;C1-ik{;S%)Fu0_1jYG$8w6IG2j+J4(|-UZCVCYW83p)eSLGJbKF?Y*Fa8L!lazu5as~*kZ za+jjMR-r{QSzN1pGcs1s9b!5YI$U_KgcOVN5yOAm#`(b6!EGLL~PeBZ&r&^j8nOw4y}ZCz+YG?_DPtR z5y(9C5FIXr)2pVgjG40^w~FgL9ptSjYZmFR!&tN#Dq!M3A4rc(^UN2L9(g7{_$0e^ z?p4~!R{9J!d<uH`_vIWUG#%kI?VskSyPXCg*Yvk6oNI z+8Tpx4Cg0@S~A@dBw{{AjmBX)PKh0jJcVxAeaz0 zJM;@}EdFr?9rk&ETo~(@$+z=3xGyEyUOvK@AO(uT zy}3O}z&D=)o?ll;e~#?_(;HVXb}+X5pTP|JbHVgvFlY&0VZo&x>mVQjsaaj3=rC86 zj#0$;kc!;4#EhU17^7qYMo;nh{!T47n}yNc!iv zem3x0J|50{p4S7VRhV_=Q$9q)Qd7oxlDF#X=`kjiX6*Y^ItK+OEQ-&Jh7j7+Py#Ix zZ>Dlg`Ag$xnD3U9>{^I=QH%A8;uF3Vpy}8Na%O$-`b_z;o}&2SZeiIlCh);yDoJ}o z2!)!}aK(?h@&o)S&iPO%&zV8V3m!l^|Xgt@tz}PiVkkh~?I)*r zuuq>oE9dSm<#!OmI)5pjt}+~SLs7t=GR2;lff27X^%TphNihyL2jA5(Eh~0+X{G2{ zk7Zai|7d^0_x{G|Eo&N4XU=uUe8d`s@ba0B;D%C)I7*m?@5f9PL_hUB0 zsL>*q-TVreBTq%HSr0j_%xlUIZ+jw%9~Zq2ORrk0B-_otA+qI|HhrsDp)%i9X6#$P z+brHCx$(Mk>$U%4s=9N~!bsj6`UlA!-J#ycb!yYHr;HxuA#@Fa&5+A%E6zfN!YIeg z6~fVW_(>ySt0sqVS*mbZ^UI8_1tR0tqi$#5ii{a!1HFbGl0P=&cy4HfVgt(K`CH|| z{HyY)dpnu`ahu6tQpXX41@+OI^E;`uH#OTd+YUU>oIr1)VF#bHJD)7{?kmtTy$46L z!ODLPN#XZcNtz#6E~@hCBng`3x{@usA~W`4_J~*r%m~IqG{v;iN#Bo_FJ9?Q)a{is zH(aM_rFLZG&`C&?-*bK+E_3B@kU20F(Zh!|OMdvI=4q55imew=SbnP;a{1bx|NU^Ow#^h|z;GK#wCm06gaMr^)hPYR_q11s03UV*6R-GW?&I%+l_ zG6&@vdNZ@IaD%0(xCWn=%f&+9j>>>dgf zWc^Y4cv~}=j3I;628fIj&pEx9_0)hT709HY!3WptMBdfL{M3&0xp>9(iYv7KRek6Yh7gIL z^v$jin@_V)OeY3`PS*hQ)#B>LP}N8=lh{xhW#xO@{m~LL}KXuj8xV!+PCV@ z;1m|(zpvg*eH!t(^YH`gU^$SBA)D};$g2H*Hn>-s9RL1C^MzS~sT>JF^C%my_i6&AVS=r=!efSoKgPJJN}7J-H{0}trh?yhA$ z9*`8LnAH=x-OJ)-YLUkN8W(?uLR6+9Q+Dgts@Zde5Ip9@KsSZs(NONzZ2`^-9ZBO( z<5;lR#p2HzhJBTBixefiSYLsR@0w7Ua~y?^F^Vvp=JRIKQuU^?RwGvbI?RhSEuSu7FjA!Z4 z{@%s>8|+8%vQIVpxNiik&_OZbu%f@OdDwe6vb5p!}Ol3K+GFS=&bzVOtB^gS> z|M?Acet`ysHo--b9E`-X7^d(6p{rTV!J<=!cal{uEu9%yf#^Le3P&P?AJQT{-n2`R zP{wJ1KW%f}qdT@Gf&B!#2_{0aBSRM2wVG<(zGyZ3&Z4@6)m}V=7z~OvBn3G&u*+B{ zq)TM`SUO}#WV5nBOzdR^r`w3=ED34PkOB9o|04M->NqvM*_fV!2uu;DvV7x;qdK>| zlMG?^CId_DeIEk!ygvMT!HniwznP3R)=RX3+%|W~m@H;TmuFJwb?$cSl%1cy_4!PF z`dY2Vwk$y6K}csmy{PzN!d++lF35EX{>c2IejZo$U>^G1^ak&dh50yLmWDv7Grs-? z%$UbF?Hi(xbKkEco<&@0-65NV1WaOmWU3-DdQVM4XEew}!nkHE+!6M&zxt)dHVnBn z2+HPK@|EhMkZ8t&KbmIIljurWrmF86nCa^kBeoy* zR7(^@IXEz_;7!n+)8wZ*2jx>zAGxn`L3&E``aT^$DJ8yvxOv0h#^q=cw{&emRd}9J zle&7leDS&YV%hv^y#2*3(xc|}Xd><0j=pz$-W-P+Y?C}6n5T8b=o?E)Kd?_7`ZGdl zdb@~mlzt+AXIaZC)~r_>wV-QITPs_X-=V8lx))VCFNOD6<%6az-gS9LwR#S-kEs84 z2xC%hQ>k9T6vQlTC8K_+TN%y}=B|a0QqE4mo;)X_n16opIxf^zNt&LE{c;)Wwz_e{ z9J@*fZXMjF*^}W3^*U8-a+X%2s3#3+kE-F%PJ=!^S;UeKJsgY)_#}i4l6}8{?`$Mm z6oH?#r`8w5;a%EEK>fM}{MLuOHEnk2nS!~6;}$ix=8U?h;Btbq+!x*DnW2&ASWuku z9P(Nf*3@oNmh@4n1-&;z2KgOVNv@pktX))ojQw9uj*H7G`6^D|AcK%Mh(2mdzABvO z)E;4>GF%TQ)Oz~?3x|S0DF)3FyFNf%v?JmjDVFbfj=IPzymE&;l+v#eZlP^)h8!C8 z#%zJ%+UB6(cBnzzlFbM^;?anqZ!@N*+R;D_ppiLET zT5|mDfP#532(6O7#$>6EWYUuGY^(B+d%ZRw`1VidFcvi(h zzJSeHxV9`BRMyYpm03?&%`%+FKDnkzh)WK+sp1? zAKUv~oztnLh*K;UA!L?E8TBi*VQ2GFkmcp|Ah{EDp?)p!f zO-3{LMx{?7cuZwa5jAR8}LIFO4kbx+tLpX9H7`8 zakw@4y&G^mP3|%ys(K(*?CIXxFD_F9YsxoI0FosssTO7*pLO#&xYV_V(2&uK$mXaP zN!YM9W;U-?!sAwqY9m!Bm9VwVOl=*aWYTSxEI?8ANhpbySNhV`@7Mn!DDTh(ZP8uX zOYdB0;=T5ihd}}MURsJqlZ$2$Qp7cOW3bm-+5xCQR)3)y8H!UCo@Z9wixNr!W_P=r zRJhY`UxLfcTjD-qaH~p#Xgw&77I3d>9~Ll!61`e~1}Xz-!0I4D!0JHQqE#c$kei`8 z2oFHdy^6tKrvfb@){|^$HbiF9iLZIA38l{!rVBVie-|nxoeQX`>*56E8R3vF8pDWs zbP<|e@WD|d$>|<6hWqM)d$J8OHo!Q0b`yb?5T2t|qnu+bqM$Ca^_-)jF9t&5QV#e+ zHWHJX#z;sbpThEpYZ8UPpq`RoqOyXakmgCx@F2#+@_nt2tqJmy>S%D zw$M^U257x7NekCmKpFo1Xu0TSkB1aM{7%8q20`^zz@@m*~=o+1igcY!j3?{c0UoF&^XN zn>6>Gpz7A!a1 z5)yN<4gvCkB}Usa1?f{7?9es7%kC(IyhJ3Oh26nh*Y_U}ZN1Ak-@MBqPEy)xA* z7DsYo zeB6inPQc|d&jDbttA3jj{F_Ptv#70L?q+;n8~dZu6E~;|R6By7Ln4t3kkM@Tbz@*V z61|7eV9<3gKAiy-t1~N_SZtiy5CONhhN>YXM5#iGNABG3*j~(TT^wD*JYrm5dWi&` z$HZ=DpYjzmnleQAx`}$ij|CwEE%foc-$81rc?sv`#L5)S z1WGvh?{R9KH25-M_P8t~gy}V1)-+TQz}pLli_jBIx8V12?75nu3#<}~uLO`Q^gs5g zqZmgVdM^N0PteGWC7t$IGHKyiz%^60vYM3Xf+{$#O$vWNF}T#6R*xE61I>1|kh=>z zivYHQlr07#_iK&UzOgID5VCpo90oIP5>tF>L69Nkz6ThC}clL4M~z3*!BCO^n|s0w+4JKpv>R^tY!z&;r|Dz z|92YvKGO|U7g~UI+5adiAeY)S{C_6}?irL7_z{rz->1O;F7GbpPR776|9`l!k%_jh zQ<9j$JS52rO20mh=tOXZY#X+5b3hQ`SzN}&?st6Jjw z%fi9$=;c(#7TCNbO%GjH1e&iu&wsc^xod}b*?i0kLyoAqdfe{Kay3lGAEjI0JysT>q|YvLkRA%t7oOxr7A;nh%V7~uN^4S`1#f>Vwix3A?H+dX3p`iE|QqP90}KzL^on32b3EeNw{ggMRWsJ_G1s^}I$+#WyZ&)dtv>6kgQtNVsTp{pzVV zg=P4J!uNbvYayg4u0l(8gS+}tc@Q%h+5){W>Fxx0E!RWE191$y^j1KuMW7V#;n}u^Gy2ln`-t$83h` z4#2Zdg@xObdV;pJkuy3!`1do0zG=6WgzFv6a&y-H47a+Tqu64BImNvFwiAm(J}R9f z?u_u7(_f=GRl{xkN{6 zsas#&5JEC@4$oArrn8QwS;fwn#6Y~AryUzJz4fdV^>xD;Rb4?M^J5Xso|9P4_R*Th zc5DMLbg@5}mcJ;m;kUD__-ub;w}v3NbMnO%Md%4n!^^kMc99!*ka038WM+64u&F_E zppi~~QiMwBfw zD$cbK(!u}AH)I^A&N1-H2s_fybM3jP-%Da7m*kl2HA_)HmeaEC3eZv@Iw`(Wb_~pM zOpH{ej5ID?aEL~CcmMxI-CG9LwQXCY!QI_mgS!WJcXxMp2ohWuk_2}T1b5eky9S2< z!6A4cyp?3%eRlS}XP@s?y{}%~RLv?X>(}ga^wG7o79OD|`Sd6WJTpeCMN)z->p>>- zFngEN%S47`jsLPJ9myK6qtp`RCT@+F#Wr-04&QtYs2^k{$t=6D)l#D>ON?vY2b|@p z0BeZGVM!v3xZ?^-Xhm6i-I|hm@L71;TJs8~olSgJ8uxob>~n?2Iogk&*r$|!g)Y!l z`UU=%IT z`9j``Z^jPDApg7%g8o;Nsajb6$`JmZTV?-gqTD%-Kjt#hzs+S{``SjSnY!3YTZoh! znL5%_ghqxJqlg;(0?cy$4}+T3E6@T?Ga&^8&6M!_tr2|GWLY^jx2pgQgbx6Pa9Z&6 zF}%#Q?04F#x{&p&1PT#I#cGM-nQrJYF%I>|A5N+>Vh^$2gbl#bMB5sdPa&H9;@x=x zhHczj!&VJ;e@sf8xc4I3nbnz{g-jgRJBWcA+OQgtBwaTU8q6FG`q#KRjz%x=N0cf3 z$8`YKzgh{@Y*ln}{5i4ye-)}v{xl-!#s9iw^gl;yw0F?|i?)x-U#rD_0a>a2AG6cn zCxX8>n&RFrs}e|IhAV~In+OMWH=ZX25Yz&e;)yaS;|1!g`$>CZ`^lNq$4lk#7Fi0$ zwu3f?HEt@IA7A*Cs!uS8raRK*(PCwOd=^^UKbwvF{(XPV?}hh^69IWN?Z6(xT90QX zzcpCxZlxBCT{0oKU4n==lQ%mzm);pg^a4H zL$7J8xi~%WfEH898?^VD3pX`m#3-IiIs@CDi`9lygc>oOKsQ;=be0VHskJVD#7BTJ z6vSc1heD7NPZ=AR^%q#m;HZ#a$;+PKO|?-?z)eqR`5m>NHUpjsIn)jj#h?0 zvD@AE<>GFXhZnS#1Z2<% zxlKjJ1b^X5-5K%hpt;GHL?G>Y_l-J9W6omOp_wAF?L1gm=uHCTWliC|_>4b%4&1Jr z%>vHM2j-$Df2e5T1cknXp$TAuyI!Uq*7pp`h3V! zO-nIbi>@<^CMRPlGIJ5%gAvx_&rJY@FBvatL4mpH9|JS#U++(4HwzDQCov~`4+lpL zH_*uZSIh}WnpRp-#vJUj3vSdV%HI|zoM=IsilY96(J!5DNwHAt3^scl?6HIraKHSm9gjeS7cr)&MWiDFgGrB5 zX>9!qSPa$e5|U?lUq9Xu^~b(KtwL+-jYf$|M6nb45D_5#kQjYeP50fHGPXu^dC!chZD=ibmU~*OWuim3!$M9NRSN?$ZLyFWPDtvT!$YP>kvQ$GRHhujft7 z-pTaW5pw{@DfRx)i>6f-7T%4UbkOnGnMfsLT1iBun!Z*ZVk>N1QjF^w4|~;3V$rTl zJU+K9f9f@{%Imeae|tpGjZ}q1$TElh7^-*C<`nnnY?<3VrA?6olg*jN_@)9kx)WA_ z(~5^90$J?y_gO4Csy;YI-c7u5NgZyqo*@W95Wx;)3MT zM9z#WgF3a__v0zcgJ+th8`<(9U10E+V>Lze)VSr?=d_Mg!E-{H2I9`bd`jmQbVMjN zf$1B3xSH=+^ee?XyV)Or!hD()lCS;Vkk3PFK&{A$)AKAyV{yjKx#R<&72OKU0N5+M zGt<&If^k=@Q$V~4PS@a3{k;kXu$CI_Ofdd z(@e*-jnf%y+!w;QCCC`M=Z?@1wbBX7esdpBveNm7kDEh34AVNfGZe-_BQUZp!9ry4 z$^hf5X)m^Qo>NE|?y+m=vA;0D1Y)Ya5|ZtBQ~72qN`k8#J2}{1?U+hY^i^-P>n4?l zkw@3GvU<=p1y`ytNe48xb9a#Is;0hTp;X4T`L>UW3E7K-%przaJXX#fMLqXY(9&70 zEx$5kxydA9%r-^O3}OX$NMg8xwraTOq10Ub+Kb~>Rc#9u^%tcj!=%~q+S`yU6_^&T z&*TU`c4lob2-sqiH1x&lM(H0>P z(x%5(`_ND93B+mnb9rM`yCy0+6)sPhPBRfiY{&0t^S2f7tS@1qXXFjC( zm`Y`=f7{p9H&GIS&|}}4-f;6>eZ*k(CpVc7yiW11`w|RZhRs+0LdPRz&=5WW)LJMB zcDji-C!wL~O8zdE;W*cryj^tx)aXraW&rqw)SBb+8=Sb>jFl{t22D=;&N&5YRX0Ll z1YJLSE3M0<`k;ncaNF53WD9~bev7z?-4AYskJw+l>DzJ+=umQFcl1< zJ^V=2i#5YKAt`k@NEGABJkf0lC@XUGkly$*N}GdtX^z0nCW%A!g~o{B7ZgWS`VvYsO5}?;OW)L{<1=6Qn&I_&&!Vt|JoV7+YlSX0%g|3t-@~Y zR%K6ic({U|LajKaA+pckdv<8d`B?W6YKa(pTzuaTt$OF}@~~l^hc(sX z!i7p&vb|4}R=(7S9rj=Dy)Gf^R~$K4jxtw0oFKT{baTejMA4vslyn;9FwJ#+;WJb~ zuG!sh(%HuT6v>Y=48_$Jm*)zc{wzs5>kUc9>aNX$*yQC_tT_CEc_k({rwsXx$P6uR zi8#B^qB2sQNjfAL&-va}t4nv_Ay zb?$1?2HZv^jfZm^1X<;x&%_)uy?LvtU8f#vsQdnbY{TG;c|+~lw#qByj2(M`54oAc zOWT)1Ag*Fm*e79?SI}Rv{H+FkVssA%$5mbjKX6s_<;AOfx_%LSTM-&!j!z7)-znLE zyq;0Dl;q^S76vinAt0@J0;O5P&LW0Kso@ETG@51W*Jds);&MzG@mZR1DE|P)4YwU4 z;b{&rie{`LpsA$1;XpaV+|X8RKX)!rBT?y#wvObHGFrjtaw!D%@ZuTC+z!{6P6~I0gKif~{FU z5)neLd;z|OPo~#pt=Ow3^HXLvtxuT?RuD81(Fs z1u!8D-96*#jqSSf^L3p(<=G+n+j*LCJr(1w=#nD1smCmlxublmXybW_1Ay+Yd!+%g z{QQm-hiZXxaq*t(=_>0u%;wYwm(@po5cY(QHqsp~dyA%}Ib1SClgi6RP7DQ1BNs&E9qX?k5!-5F|b$##3;d$H<9wVyH0;BO#Sm`E7anNp=r`#zWWgzGC>I;y`@-t&NUvF$u=vrXT~B8^ zQzyqr?V~*7JB@tO7`7++3mnz8cx>$kbQvIdMY#AE=Q4UEW4B9fl}jS_Vyp<h<)>>uv0>$dF!Ti^dke7F;fgzc2GDb{~%LUPqPi!g*IInuT zNwu;*lUfNJ>l&uPmsA7it$3HB*ohsoWDg%7kQ!=qbM}wjHwF-`(vgJZ)+1JOgs4i} zlNUDgqmWxFP)41Ee3qR6!*%-ZpS?4dzizsyKXYLY%R=peU+Z8HW4&m--=TPZNJ6I# zacdH!`PLgiu~BF27GZVR9qZPk`D^y#FeTpDZF%x+lI z1@_bv{W5F&o>KeLqM@7QL~0F~y212fbOgdg`Z5-$6Mr4^{7hOUCQuc$H3@pweKF=I zVe4xLk_#7A46LU#D&0y=Pg&wl!rT?Hzig5SN?PXEZ9HJ4a_Mc*IcmLSHL-b!8^`+A z(Ap)7qXR*ICrUS<7Q>D-;FUG(^})BmoSE7%6bQIBy?7CW!a{Ng??KaFL2A=IstFy+ zL{-8XOOR6g(MRPaGcT?;a+ci2O97Fl#nLWR%+4N6j<7Rk0em8SJSLnIEXF0zQ71%l zFS&@*Yw(O$N~&HjVd5k~y*LDvF)5?K+B`vhK!( zui60v!dIPu5a9yWzzjs6Ix;8L-O6zPDzY3a;3vd;f3eQ)#3q7EWU5&oGn?4D6Y!R0cNFP9JKUdHth0&i9iq=t;%K;lDX<`1z!C@pe~DDV;F_o&L4i1oEvq-cNM=sEmLMH`qvmtjyB1aM44UQCm1;9{TqKXqo1N%^0umKSim$2f*QNRLJ9}e;ak=>d|0pzT2 zJ7_-OO=Lq^Ul zx;qfr4heWie#s_o7!Q1j>O)2TQFM1cvK>0#2GEWTSR}jj6|WN8^%Y+a0urFLfC0G4 zE-gVrM4%p;4*|K8)Gm?r>-8x6^)O&uWIF-imh{q4+)=ckE1`XZlth?|M0{5)(jOO) zkeGnKYqq-seGl2POqxTP!v-utyGJC?kq~^1445pq_Yd};CN&b}GLqbV8R?G&_z3t& zuuEV)u|c`P25g$v@rU``d`6yeMs^t>9vB2fLAysIe=M~+ihM){Y!uYpL6E-|@4TR?kA79q_7z9`do*wZ^`4*nS$H?c8tYkfcVidZ zUG2LXB{r)b7~3%XEJ|hS-goVav8NhMirV5O_L>jKM}*$&w5Au_;y9@9v2|*0e0!gD z7Wk|qDj94VF8NF(zW=QAClyXza}hwQ74-kqfd36Z2I`ak*jxU4N15s8zJKsvnxQ#~ zBO&UbuJU{9-&)FkpqBDqTFFAckhkf8V2n~y22N(Gu1J6g?gTX67p?S+6nIdJe)=Fy zD=9r&*L?h6LJSo;KZF<*jU#3V5i?2Yeikma1@+mHpbD`G^!%T1BB)xJIe{>@KUU=a z!$9G;O@!RJ-N#xG*CYu2`TI~o#azRg?mq#Na)m(P(ux0w>f!}b{NG$XxROA<_<J3>ixmY$(k+EYLl6t4$htqaGq!X0(bqQ{iHFhzCnT`kp{9MH7^X5lfoG zQSZ4>5tXs1N0qeuB!aKiR)yF16n;Z) z$%>1L{mWAV7H*9&yaZe zRyuCiPZp8ej=vYZRwsG#7xEuiFeMS#^q6crGwAec;eY!2@oeHnGve#Jnx4?!&@U8U z)(867JKA8xAcj-L@Lu^7?~Wd(U9GA+c{}V@f@{B?_TD z4ofp&MNQuX@o$S4)E<;{Z5eF6fmzN2GU=o?u;Y7`c8V`W%{=tnS<~Vd=haLDoXOdQ z)4xl?0ccZtL&voiZGHdfh{$8iR)MOTP%k5aWh2|CAM zqK-eOftd@x2xT~$Cc-u;%7>91vDuBJ_(3ASq`f-_+)hjg@bjl_69 zR+e<>F$=>DR@?&9AB%rAP&34)I;qPO?CH3=y^6=oG#%axC=`q=&aTjSZ zS)=h5=`q=5ak*(zSY+{R!c-;k%(_JJ3Nl%XlqX7!3DrxD)!8hu=Eco^1fO>47y_G~q4D|Z${^#fyfHba#Ib9Yultpihc_I1?*%PW?3jRO;V zbN}3GKuy#|O)oX1_ZPJ=Lw(FQI2m8Eb4C~jX6mluX}=sio>hvXkR#!aj-BKf<>CNW z*fwHnJ}(F0>FPavB%*MWODh`#@6wJhw0g^a0pX7!$+y_?uFe8To^YUl=7_S*|F}7H zYh`3xp{A#!KQeXujbdWzY6bz}OX~2w*h^yfr>}+yXZ-Ke^bcb`)Y11UDSYEY8T3uw zJ-UkN)w-Jx9er+@?3VX+sW}UQ(eb1C%IRKGvNt0)ir}8sl-bnsI%{%u0Y~teXuWC2 z^x?4mDkChODD`m{e2(x_u0vI2?RedI6Jzy!V_2g^<3J--V^O0;#_>kR#>z&A#*;>(#;itz#T((L4izzRPLP2 zQ0-6W(|q2{55(E((-!Ma&i8coSXcLuPazIEAt&H8dZ_4#4^SpORYAtm)p{S}39#c1 z=7U+M=Y2hPi2)UEAQj#B$kBrmbXhM~UbZT}oW9P7%c5yjsaM*Mp_afiAmt-%m9d+y zKd>~QO-CF5LO$JoP|bwR82Q#c%38-gh6#%ZYpr}#d`P_M$aUIfI;&OG{oMhv0bQ$> zdsh{@AgQmkRtzz=V7Z+*jd;S5?zGHwa;xH1$^o7MvoDBF+Yz;c)K`W(+7P>=JVX3r z)cVwTKDUI^5%x5H{;hk(LBMoGtHKq)@fmQ;xpY|U5B=mwKWf~TF~SAgLf0j-qyU8& zzM4|3(TAyvQ!q6mm_iszNoCEVILx^urvkmGc8Ta%xJw|f3Xh1aT;Ib{G-VvFYR;lW z$EBT{g3F*LixjUqf*7wdf)uYtk9eA|j=w5b#^xQQ>Tu3dG`I;_w6IB8G_gr1+tE{( z0v(D&8wbs-mX2sxz(LS1W5enlF=Kl!R5ZRxaf>N*ACiM_zxnL)K}hE6=6nWa^X#zr z<9XdY7_omm^Kp=Wd4$)czhhI{^Rg$rk)g33az|oU=Vqgm^NOQg{vwr9B-1oanTgY4 zn)<8PaTM!^vv-aAt2KeOJEI5gciKJVN{cp+kL(M3ml>IdXRm+819gJ0!=oUi*E>-1 z^zW06-v*{pnEujUbm7b7VN<3kbn4|Zmm9zuYw(_bx2aKOpM*^zIR%jtTHG`b>pUL(dKx#ay-O)KczY%yeu2YD_T)*6ggl*hSZZPZT>Qzy zSW<2S@^tKB1>brF$<~uc_EnRiIFiq4E~a<4-1AeUEmazxl!Y>~MYP9oqS<})r{(Ei zu>$DwhSj-@2$3Gpi*ic_j7x~1CP;8IHI4fYzOd=Ja;#eO>qj2Jt!fG+Aw6JPGrDQD z6cl4xzbaa3DX)4t#XFgqZ)P(n5Kja|w6sIU_QrL{rM5}uQ*+73#>`vuoOnw_Evy=h zEHoWr!yAH$Wi6J(+U_ZdIGnzU3bSJheD7GEZ7%2WlyOiCAqw9+l*uwPanSI|}$D031z02FK*!`Z13``pzR)!?rpZgdFP85a6) z!_qbNyDtj0y>vh8ogfkR6OAobA28+NwPdg#uOE2q2ue{+n*#P2-g<`UaS(b;WFPXI+w~w9G zUm!eTz_}gXkKFsw;2GvX)>{> z-p%(G2yY1XI0};3t`EtfL7UC%Q1hyz$aRl?ZB+he2=bLI2tx)lQvt#DL&A@7OGK}r zu)OR%lg87q31%4xxYvu8qj>c#G(T5*j^B7^SR%}E61?>)=X5#BG-ho5wChr1ob77H z+8K}Ru^{Pnem7&nN<=Xy^Zn&uVRE|8fY_S7*?V(EAF@i5O!Tcx7^&EujD4F$Nh8C# zDhu-OZ_*v>bq!6)*Np=iv>0RXK3fRjjS6tKsH64NArRp8S-$M4tUin zK_QKT%TaPaA^?y^gH0y%ggYpLE0j>=hw@O9c$sk8utjb_N{E7Vs|r2Cs>lt0Sc24V z6Ytj!HCGaUFpI3Pv)>zNr01n$8*}a|{z-Vxo2}j$K+|{^8tRRn6sfO5;}Qz@&c0lx z-M_|QAvkwu-ap zF^CzFa?xT8{HSuvK#wE7UQ~LF=a!Lv$L!w0$H{Hqg0_IbxP2Q<(7n3Bt!+PHdK2>L zfUZI^?F-bahpoExdh2X+Dt5JuGO5HA0!FBngSQhr#(;~dd82nl0jHKsXJqO`3MA>u z@A5IstW+|%)k|zm+<_xvlK7`WVNnCb%K^@J##eKWgC=gcY=`Aa;)YM@bK^QKfuF~Y z6eZkC#JNAd!+2Z76!Deo%!>^EW{_Cl%u9dGef4=iIR;rY>lKQgI?yjeCiNZ~BL9?S5+MF#E!L<0<*P9+SS+R*^D&Ejz@fq8!K3n7t6aNi5Tv(@|I?Ts4od zY%@aC2)X3gf9H|CmFaAswWYsVI~Z=qcN(YfEFM~0SjO$2_Kj!^aIAr$<0W%Va+8QG z#Y`u=uT`^dAFzewn?H!Bi+=er5PaXk<@O~`^i!wYqKZiT$0h;iFqeVjyJz*J=EF*N z#yF)`!zKz#s&?i>HH#14S_Ue|d!+|g?)TDPUVMi6at=_9D&cu-Q)zd!WWq9YB%{>yv7m(ZKv&fg>SY$hQTdVS9N}r6YwrSZq0ao;iJdF=VA+RU-|1QZnA1AyayV@XPHo ziPvGA(gWIh)~H<3^cetho2pUAA)}ORFGA6mk^CrKQJPD{PocyPZiBiz?r(3MNgi$b zZa#NEpKW$JhjG|4uPTv$+x(8ci~>W+hDd?#^CHP|0VPR=e=E2@0)<>i9+iYT3Pr6y z!e+ZqWxJ1cyAS4LUqnPC3VVOVPJe_JI*DZzO5M?Uo`5a5EBbKqCqLYH>B1KhQ7Ohr ziF8qfRDqrF@n~!c?Y^0b5z@Q1mz~72KtwVW3UMmG9I8TjNex&N78-!hWh)NsG*EzM za|?ZXcq~TT3^h&$h)%YMdW22JMTT5s7?zCA3spi@i?}Gei*_y@B>+#%2sqkgMfYJ4 zP$W-?ppo8&_plvOQvQ+aw>0bO|*u{C*nM6FinSJb;S==XGwv57fyyEx}^qJdNZqdq6t`$};~Dv$HZ!t%B_b+{$~ z{g&q)5m^@v;4=zkEzmq{%nkaxwB)dP*b<+drI4ItCAwaPc{XRh4n_K>Eu}Y)X~)~l z<~VFRWM4CbyOLBue>6@crA;QORP-;e(mM=9c}un(q`J0k%!>( z;70333D)bBqu}SQeEtQB2c^Q&BE>>scC<&F9~-IuNBBlba3CUms(;Gsej{!B*HZtl zo>sXUIIwm;6mugUMQ zcK(|%=LO!lGBq9R8t1ctz?w5c{yKL4ir3$tj+|b2LnofZ0GH{;vB%WFl$KL`IuH& zN5(HT2c)lHKSa-jt8kBE)nSdo=~wd>pxKGvRg6AHc3U`fu#LF_69WH)K_RjU8NfV;v>C@4e~cVB1B;Vm8DW z1Vl=hyR4{Smf) zv6q0oa?A9RtEJFb|G|_xU5k7bO}~DcIf2s}`V%xDis_kDm6kZ>tx}&yb=U*p(VhBR zr&4}+@mp(L$JI3khqp7nNZh&$g#p`cfyEsqUzfbm)?T5sBRjNZ6PUba;6v9Ij)N97 z?daAxyA3kSU3uPMRcXkzxZug8ny6kP!{E~IbIs8_i%2WVP(L5m)WPb?vA8C#ytYjO zWLsQKKsYmHjq$u%5e=mtCc~$*FN4=B>-8@;E@FBsfppYA)H{5)QQ7`sJ5wKU$|9;h z(n8j$=14uJi{@p})Q&F;4$Bhn#8EzGo8`lSoIFa*0==l6a&N9%##D*nm zpi*ndu{f77A&at!ZU3s-Q+o5_O>N<1yY}0Db)KTgTL=3CnzLithS&&Mf1HyI9h{9I z9jmKnL~O6Lp<=%z0>Eu;K|BX1IX_2sWN2yH)zpbBUpsl z)1^*P)mA17;L2)l(CGwxJP^=|EK4MzyrfX4RE3fw=Uf5+ndYcwf{MiryR(IFFfNnD zb!A^SZKjF`h8s~{z9f|1>QYgDUprNbSg_|)*3Rcx>vDMvLcv;5#8Uk1+$u|g|AOEtBXXbDLwv$=|< zrCyNRm^S+;1ljA;XD5X)vcSW&C`8luSrXtn;qQy!hbq}Us36GZjm;Z|u&FWuuQnBp z^c!&*UaEi7eQ5ktl``>sDlx7)LqN^4TRCHdXQ7;daOxX;s#YM(0@u&jQAg(+aGKa< z|Fl@-KB^3x;J)mQs!+CLDON9#<0*aq7E?&9^@~UADh{`yId8g&jW~6en3USBK(m$+ zN?Wc?UN&znI?J$}?JJ3)LhbZZ#4M;<4F;F<=ro+Hd`Mp31eas(?2JtYqOfJ$al0^4 zUR-l9$p@J_4(u8Z6MNv&SLt_BWJy>xj~N5RQua_4c`C8zw07Dk!?7f_oc7|i<8-Z+ zboK=NYD}1=}az7*OIcM!GXOj6vf;Wq^D2w(i z%Aw|2+L6WmNRT9py^5sI_Jo!lHUhYynE={H$dX13)T?YR)|cYxUq`xmd%T%zy^(J@ z!P!lEKf!CtK=Gev0V%5S-@58L;^doO#TlFOo4icitD20_J%(rJHQLo^O`bUcBH*6^ zh=?l%?8iunLFHAgvd-~c5?LY#QOYs zkT2L?)a~JtVlsDhH8G94fKCP_AWYvlH&ITTh)o@cRmE>!m`D(dL{ztVjrw0gz)`|bw+#<-W)}|#!Smi z1b=AlonqPcz8*sK)n^_XpVL$yTeF-G&#DUVy*02b9@JY{F_X()`!zRDc^^#@!4+|Z zsfx9RQ-NDNc$1nbYoCt4YQ~Os3XlV75!Pj}0oc|SiWuNuc0QqOh+emced(03U*)-6 z<+`EmA%fItz^zU&rt!X2L#YNoZVOwNt|9tnxtwWS!k~wyXLf|b;(7+rv5!g1GI9f7 z$XooThBe-T2OG|8hcE;8jRo)99c_--&%9i`urHnMqs?kqxW;SJM3xwa_IR*SOutrl z*GQ0zwl`^scnLv#{NXn_G+jE;ppPpJ^H0&_?^{y7sD^%z>@U1Uh06 zXy$VihO#N9a|15#CW;01biG(I`9+BR_4Ctrh)uZlV%EV#-mO>7i}%Fd*H4FrT8(XN zahQGiTVN;&?Hz+r*0SMgvrF&tnao~+)$U%OyE#cp2?1(+CrR=Z5$8Mtgi`@~>;E zbdp8M3GW!mtxezD=S>0H=Pk9#-u6h2<2SgEnXRXgYeq18$C$Kqbtkl^Z$^-FUFHLt z_!TxtA}gY_;pW5i9FL2>tGp37MRNDE3}piH+LRG!KwXNuQgL1=K)GN-Wj@4+%;8oV zVMx(tp~*s+ECm{5NiHb#vFy7x?!3QEf|!mMQOqZ?o2Q&smR15|clhS&HMPgJSv5Y2 z)XXnGM&EEy@5)n-ySvwE^z@h~>&iVQopFj`k$H3--+-9qbwGhkLJR=4H!(j^Z|G{_yW-55Lu@pyQ}z;_7JQ zX!ZBK4V9mJ8(V)#4|C4@^V`ST-G2fCRm|c3^y0s4H6VfZ7n1(iUm(www3A0u`tKy# zOh34_6RY`DsDsp_O;zB~-w9)*4AYJ)$*!=cxBCf6`KEK|rC}~`=SD3Kh3XRSPoSrl=3$e!g%K*U}@i-Vv zO5L3RDmyjRmyIz1t*@IPaniw8122}VqTo8}`M(~Svn~HrYA)g7NHnHJyeDYt)tcl( z02g9SG^dqF9|{;ce1$w9%!WxsHt9oqN<-n&mjflXZ10Yf$q2FNm5#VPdK-)@b31^7 zWR6S!)&E-~|1GYoTri@YWkFveHKT1_@uaTu1Atd;Xy*C@F$rgb`k*IK&Zvv<@Ztzb zrS})A&%HY)OMEumpB{G0eded}J=nghRpRVuzDy|@J{9M=DP-KO-(cn>@~@J5x;jy> zYTDMfHFRKoZ%g#dnEbSYeC>+OoX5nx-*~hwgMYH7h`^1-{s37( z{v&}L5$H?(34HzmvQT&Ra5VeLPW|hn1jGv}^|7FaZ`h^t)aMns8=D%xWYAd>W~dfF ze8B-u_en$^mOkFOFXB#tL0%dWq@aztO-TPHQ5Pj}a?;J~a)0p~OppO0mhPK4g1}90 zPwu#c=DoS~47sY&5!!mVJ|kXUyqr4DB0AWfK%0?=Ak_FI2DzjYcF}LuBOWlsn&fu} zsO^Bhj8{ZEmXj$8XeEn{zPmAH>uy2}?pg2kUvWafk)b<}y>;@abbw$FLH91_rExEE zea=joOrLtEWxG69Rqp|*mx$I}PE^0kgZE+^X^L#B~_*#t&~Tymg2CK}uZ*vgE%%(WHO1;-5p<-?1tdNu#c_AfW|6 z^w3zB>?Pq|b~w135dzN-v>9O)u@EYx8pkWLQfVy2QE4jO{`d$&K?(WRGCjT7VGJ9y zO?pk74^R91%rCs5)?R2r9vg0P-W+Sq^OI%J;UxJU!=T|8Yb?gjdNiYR{ zdbVEouw+pfhSiQiPgS_)!LyRp0W$@D$gw_BZc{2{)BQXY5_C;K@yR(~TG$WGf6mDL zQlXBOdXZW7iE>u4+qPs>jKHZ&Dur*j0AgwT#^>#MpS2-IHQ7nV7?l_iUb^bK(Gg-> zPK+oCV_0FO`(-)?M-dX7g1Zj1Z8aHtxI4#7aV*Z9ZnVSWcQwUsV3j_=;QF#&9opAZ z&&yIgWCL_9Zt5MQQ+Q=Ni;vNJgRF{Wb0+RGY78F9*M4Gv`T^DJ{Mf@{*YqL!xB-m& zIdyccH%AmDUf|6OTVwVgr&koIv#7LtS1_E46%hVu>VfZi-=!81D`+ z%<+1JILuB&!DjD*u=smtu!=0;o>OZh81Zp(o(f`bJ>%Hwrr*s@@^1JAuDZQ``tAv} ziRB4OUd)v~uvZ)hc#e2j8Mk#F5~Cn(Tn-T@!1k!3dNMQ_X|7(-d2pnr=h>|_dggv{ z;tcWMnLxw}8B_4NEiEIV8-FX42v3ovTTtn)5vO~NB=Qj6Hg9ittt*!oEFob>;t1^+ zntSf(sFSzi27TJSL9rQKge+1h^k|I`IVe)iKo*4+qRp977!&u}4F9|J=FLmnG78lb z2so8~$a6$u*-boH#7lHYX!1}gbn*VBjn+3j*gKom@-H)WCYElj+qKgdoe7mLGKbhh z`sFDwCYzL~FjdG=E2n|!SK&F-keBvt4-pt``&x5)`t$^uD7sS#a3f9fI_aM_@)sClukb}=z$3{lIW7v zlh;KNwz-tYDtEo{yIMsrx=mSLd_Xp(K6As7&ZNK+=0g{z4zlM6(ti=A{i5O#MRpaF zt}j*|z&dt-$=esJP-B~Ec4C+46D(Lzy#jxd>M=U17lt6vi529_V{X#b(?Tl+Ju0Wlu@A;&W`lN9@yKUV%j@}PY) zWX}9Y)(DOo@rUd|%>Po^1N=Y>y<3pgI)AJD!v5A`{9S-VMP6G${#SesoBF8@8oo7& zYO5QlD+-}6%4T6=2Ej@SrJ-C_oo*abv5oyn;`0J-^9v^UYf6nCHV8w8u0Z$juh&l( zaGRJ?gan9dHQpF40a?3!8Qb4mHzRR<6*6HBK8HrsFc67dnHQQb$=9KY?YpXsq^YSn z@U9?6z1rPR2-lj)ddWEUZ3>Uh5I27IgLQTKo|Z3{S49GQEmu8FHqlsCf*HR51w$-t z7Ka^)-*?SuDH~gxXMmSvi)5n>HCWNh@bCB>{Mz&BOGZhBuO+x_S*MbeNfcvNMPt@8 z4bj#-Vd6pPAJ9ua#Ka~lcMLneerPmP6Fcc!ITd=FHq4mB&kS>!nf^T+J&NtA`LkkI$uaBtTdM_@mUG_FpAt>YXb`$iW|Lb z-U@g0#j!Ru9d|ngrb@NiNU??VgriR*2k&!VH=wgIi-^=nIWLS@dVQ$$A;PgR6j)_v zekgF@xkaFy;S^lNcrt~pdVaNuarB|<3+Cb;w*cpj%1VB^jUT2WzTp?7z(gVD{-yT4 zwCxp*Rv+O_j1-#lkFBBIW``=1Lk5#qH5(?#EC(zRxcLvs)Wkc59FIRsyqS+!2#+B1 z4gF@mzqjWo|K`tsl9&7k2X6U`1OF1)_`xprXPx&);m7&EXA9J}pM1c4~n;^j&vWQv8?^ko^(uKVH@AgtLAt1EH*jJLh3p$+f z8NoSLXliH$v1a|5LDFT$W2`|hm=gy^x}hnTg9Sub5`u#@?D!#uB&)#_Ux1`vK%y@o z=@*ay4093(MllCY5(h;w2T9=CZb&tBitzFyqlAaA0! zA+sT-^1nXjo;RDa|CY{QjrVq2vruBj3`hh=cg0FoweJ&0ELJm4BH6BV7?c-?CBt~? zqeSb1agISJc4CJnJD_~jZyC%SG5$q9rbh?~rX3dHGh1ybi*^-jyoW|pg@lQS3Y@;@bXW0{388{M|CXtWp|1RZ}SGj5&?Vkbgk_q zBVbrQsrii=3{{poskKWG%RT;7Beg)4&;1_Rit)Zs(Gq+WDW5RwU_R1z^he@p=RY^u zKfQgY)*?CtWB|ZxN72NZqe`;&Wz(41Y3EdE)Ue)0(K!ez9IS|5?TKDtAG+DpIa;ugvZtu~inHNlehMU$)~ldXQG*N6;! zOW7db{t9~jm0m~v)7kqm2mJMVsfmA{J#g@K)Pd1n(BW%!iC|@|E$ew-O6I~l5@~j* z{zZ73|4&Z+Y#X%pH~n0^f>wLa-`TD9o_4O0x{f4pU zZ-W=Nby;>ji;{d3;1_S7BqQ>c(7gg&WNhE%1+popj}hSw#|R(4#ImijC?yZq<#)t( zp8ranO&uD5>M4PSElXvtVp**}yX1+Y;7Xo1E})L&!-6^l68$)BGAwCj*7&$={fwLQ zu;=mK8d0O^Vo`+1Pc#Q%Jt5(0SmdZc`HNjENh;&_M3&*TaY{Icwu||%)41H}dDU>X z&|gzaN64jK(ira3xz=mt>KDE*St-t33+x$li^UZS`)*Wwt(Q$SY5`ACCr)q7 z8tWP^7-x^5oms9?!{O1->L3_@piA$|i`9`7U1jD$??6n$?n4;fz;XTnI)*<}fdH36 zzaIjgV*hvy$^PqdcDL|$XZ~?FNIJPXn7FI?IG8%w|55*hC67DK{$To`R9L&BDWp`; zgHI6!YkS0{^dv2$4^pR#lm$eqYbLv=H1jl8mtcKP)9!|kf%f>BbvCq16bCkQ#S^3zE>GWvaYw>K#cD^>%O(@0=-@Hn&d9gd6DjLS*(tKBN^s*p-R;5#HqiS`mgiJGg)Nf@DB}+J4@Qud3bhcL$D_y24LqcTUH6vQ` z^#$2GRY*gxF$nOLVX+Zx$B3{m=JJ;Vc4C~i_qMY>MYafL#PRb$iLYM5JG4SsF5E^e z6M92SU{oq1NYEWG3F-^ziq5E3DrZKlD^H%fFTF|=Y6&o%d4 zb6K+yqTL+%M9#|qRVBMuCJrj%{)k|yTIX#_~Kd zg>0-Gv`y0I@;qTZGq2HEoin(z*NaT6c3#BAHLnSEPrNJBGdgEDNmP^Y_&uu#xJzaS z9B|#w{=bpnZ&4*;>+I+uZ(!m0`{>)mjKlTFBLq*HmzzJ6wF9v>R1>ipeiM!rr#_*j zEtQvWLX9yYsR0Z}l#B`qt8O`1z3OpZ+gKXUj$$qpBco;n5D z0#Om%4??&(}sVv36M|N4uij`UCS zPYCr-@{a`Y)xgAKDcPFan#zfKyE)0KnVLXox5o0u?-()oKSB-}n&<<+%~(~={5MJw z1+xXiEn&t3OkK4w)CEp9`knXfp8BWD0N=C>`2Fu+{m&crTL>t+Sepm}tZIw_MpeJ( z`~fD>{tgG1Xh5;Xj}T;LGf2vZ0TB=qfRr(S;w&o8jtT?`i2$lB<|v7ciMN;%){YFS zEKYItjvK}B6A}IU#^#PTJ6F?<^9?G$0fvwoT`W6 zne5dN85?<&M6+#2XS&8$iinNvGhHURe$v&PWn_?z-WcJ;WY%MI;o^@yOQ-U#F5mT# zlfek_5;bS2z%n#NkZEFSrR_iO-LoOCVE0>8z(aDWWI$(qwcvYt-qB;xH>?CjKMnp) z2YTBbM_xA2^ud}J$G2q__AKQ7M#4jE_SFQInJUV+8Z8+elP8}Voyuw6bkGpqD@C{F zL2(=YSJ@^nOpf;s5JZiC4Wxf~>9-{nbTl!rk^l@=H*mK5*U9oxl=(Hy$Y;W~RmOZ- za2kv}7R|h^G{|uaEl3zRR2-291r<{EYyehEmG#OK_=ybeCaB*ZuRBICDhpNu|D@-` z<9Iup-pl>*BmBD<2b9nKQ|-G(>kQiohuBs<8+V_kR>^U?%@&;}f<_e%cApf5NxPwh zd_r!KNI?1IKmuQ%cK4vc=FLieBuc}k>_?HMU65m8sAl&wvdUq$SNn)=@vxw%xG$>r zu~aZ55|w|Qf>;UcnsFWWK|G#iXEnJ%w#Dl#XdMpnfv)nMGQ=*YHYw3AAy&XM;>hFb ziNk31Vv&teAq~~`%br@N2T>?$h%G>l3i8-P(V8J#)%QGa-baKr<-{%{6ECjO+S2YQ z7FEitI<;q`POK)tO1x;8?(4)-6J9%~Ce~eqAn{3*G9{Je1V+6Sc8=Vxe8EpPEZV>~ zRvpD_mc5`D=by4d^kLn1Fl6JFNLlt>v3sTI+sMc9avpKECFrJHg0krhqD;RyjfX5n zbj+eA(&Bvx`9US!Iam}}>BZxgvZ!{PXXg&=VusbS*6V6Zc5Z5Gr@30Vkv&7HL31vZ zeZcCP{21m(w$KvkMcWv>#@)F8f#8G^-o_w?7Ik$nkb`4v#I-YYREu!K_q|=$M>qLy zF7izrvEfTEbE3xg=w6FODplBLcZF6gx83Oul7{ zEvRRj>QKtNuiL>24|6w0S*;=fn2LnF8!52N%M^y^?CzLmcKV!6a4RzLJb}(AQTJKe zrI{@1ie4!VqR558nu?BIbdP^?tL8-NiMZL8U;*X02#brLK12MGV!BpK%93J1H}M92 zG!AvU&EX4~GxroSMZ2vMC{p1SRs%IOm{x)jZ%O|9h4w(foau1|3$Rb_4C_skBH+bU zV+3|_-VKA~t;q}?v{B7)Ab|^!Qp+$Z!{R%^>H>4S;=VrV&Ef4!K~1ZDUV6&4Ya;N zz%}vohT+mMZ7Xs+G?g=;8_p~bJMF78Rv-lX&1K$`!P-3l;>hx^H~XJyUDys_t`6`B z7qu|4HkP+@viRk({;yj;`d>4&Q~OyMIuYs->#M_9SzRM!gb}DKPS9(=O0EVQBl?X> zR$l-=kvpLFfXgzZ0LExLbY#)J8!)Fwfmoy2xQ;^vXG*s+G0YARMzN@!Z(&xX0!x|l z71ATkWlxe!$Lt9Q!wSGU76!53481@=;QV%Eq-w@x`!I=`uonoQA{kCC>yaIqnJZ}i zJcwx-^zcROBAeE;8gCOZD4;{Te#CmNUZ-{>WH(cuvop4K+<8KK4dmS1QM}J}GkXH*^ne=3^^!oQB4f4g>y@gmPAoYmiaRFf< zhVOwa(xtK0s&GyqCGq^-4Br2HexWPUpra`ob=Ypy;Ku#r{XrDZ8-CWud*q;Iu*SWf zY^VLIKCcJ0aZu#GT!A8V?f(>JUXa$+=Evx^*3`wgyi9H;I@(=*wK)zS`gTBeB% zN}NDX7z{Kd5s`acB}gtis=#Dn#WrPyP&)Q5I8*vS1kG^FV=P2L3&xQAYHN!3)Se>v zAXc#Tn@>SlhCzwq)-dC9-wg01b{2$KV`er6lXBGEsWFovS#V330aZFVQvEFCRa^*m zswcQfeo-|)*jTE+wO{(-&X`?uzna)!9u*dJBro=l$6l-c8O`1^7wwJsrdoh+Rc_b zUu8O7!6rQfQE)1b=q%xba53JxZ>9qr3!pzye<=`@U2NI!lS{4U_N zl(L?P4;aG&M72TY7MoI!~ohROrNa|8UK@NLb73eqxU3($z=WH#aR>h1$k%?3&)wx4k8r&_12=Mndg>g z?@%dV$vhe&O?Gnx2!e{Wb_mh&G;za{y7gXACesSX({kD}I)c8&v~Pe?OORqUHwws) z6f#NFY1rO{Ey-w{4z2CF#(PTlGa)o;uRz`r%v# zu6*R$Lw#4s20q68iBf4?Mgy|wfgxdBG(16nyJPL0q(U>49Hi9nz``3an05ZMR9*Rp z?NMu{)JO&cCWT~-uaz*K(#qUzvvzqAHYo9Q_Rk={HexscG>#pRHE#c!ImrLmh<|Xg zi1pjJus?xaaNNJx5(|M6$IB{rlB#alZ_PqFVbtRCNXoZFFzSj$#+(@5WNiOt>gx4B z_8TS)k7b_cIK4PMypi)TOBgUA`Lurfpfn+^@{Ty6Rx3#+VmCpvs5B@GRS^We)!5&$ zX}N-zjntS~0$m>EE9Z|E_Besd>4~MPZkSVAd$RoLOCd1OCTuK@r9x)3UE;T8skB@p z<|Hm3x)Ie@kt^e%)ljctL&S$|!bMWWN%aZ7>hC{Yh}a&P9EMY^6MyOQeU-yf=|!Fu z5RNAmm%IfCSh8*0HW`Q?M$R05C@Rt9iYJ%<3`itPud*H=I4`j)D?gQ3%v)`6^-}gH zR-QVN7PR2pxG?ZoJebb6VCpCL#baOkX(aygc=8l-4VyVtF|NOjDO|(v6=e&yEk12) z5JxEGtciJ?H+U}IZg8U^9%}S(C;rKSv3ce}gi0NUNN<~{&l{(%K|Z;MlT~nuv{7)$ zmHZlOBdyj#dSx}s$jNRXf}!u$0U_BDFVv6d>8r3A!o2@7@$ZG4`x2Rf1V`a8NMFfLH;OHkuHuHk#Z8k5wHPerWV%Cbq=*& zF&ezVXn-I}v~KD<%E8^W3oC%Jc!g(*4yynMOMDiDKAX^BEGhCr!Nop;#Ho%(2`}z(U2^i4)5ZoM8pO;huo^$SVeg>$_ zc96R{z!14Z5;*+!Tacwvkz<32_z1o0*fCXEmH{6qLxL`olRvaW`R|6w3Ugdpedvl|?Ic#lxiA`Oog3 z;7V0XTyCSEQO{oZJgSMR)$Ftw>;iF4Q@KR_GHMpmx89m=%FEY1UjavB?XT(aAM>lX zV)wrhm5ZVbpnC+tr!N#$SojjS%g7MMeQO&wUm*`NJe>4{9d2^%X8dyesbN@`q#P;k z)B6|loqE8a=+IN=4X;Olvn?<0#`=3~{T0Cg`R@^83M`KLWe3^52m^vgSS~>;rMj$b z)27Z5)fjmr<+@UpLHXIjGjV7|kYDwD)-JU%5rRsE_9&f%#gnO;f|S>+hNJo)#~AJaV0+kd3v2orPZkN7Z_H zbSDVCBEGgs5>*V@@EQq|kcn|?dHcy)2HW%?EqkgH8h0Ko4&;`}p==jrBG>^tE z0@YYHto0Ifls7bqpau0fyo~sYzPKQ4eLvKe#LjZATEn_6?APq_0#;~yu`Ia%W?>eS2xJ`q*g@96roew*IsR)G{~Km} zijk257Jv!KxiK27ELRmc7X)1y)orH;phkgO2RYB@noV*+GtK|m#Et5C0sb?;-+}^_ zI}JhbinzU9Z(~$$GeAg4jNPNrj#cfh>b@S5PE~AXWUermY`5z~ltmf-%hAa8FxX=W z?U5gtzg;+yTS@%`t@$Qw8Vm>k5< zA{#F1SIy5=&1sNX6gfR=3=lanwIEooZE+8-B#<8rTM{XorHp6-zllmUL>P*&yHvfV zpSvKHE~#*4jr6;bfmmUH$4}9~!wbb#K)BpzMu3t%UxjE-xZy!~<*EnYw;whe(SBz~ z$G^e8%c+>;q9a5-l~fLPB-6SSIXRk$<()UnXp{4y8iOjwtB`3?7r5r zK1S3Zj>9(2pcC!n-8fP{&isfaSJZl}7FJe(3x_7Q)dAl3{rI1tzi^f0kG%wVz@mQt z>%tQJaq9}18#o#m0oL|UK&2Ba^GoOuyird9N#id#D)$w1T7~sw5wSHa=zDZW1{{IP zF8*MtCo3BEMQt`fDL5*3g9m@w`(>!Y#9@b<}Qg)v`n2g96EnWxoM*TqD$Bk+~3g zs*g`_Gd*_VzTQ7Rf^}2PN>xKd9&Fc{li!Q5Jkdj_kV&gRg7yZyj|&SN*jj2iacE$- zWmBP(G^CgylpycoV(0w<$Jg;H{uwQIo5Z0^xFTAZIgxeLKjWbmT{rAIKVqgXV-yG4 zqb3uHIvK9nmp*o7JBUUtKEU|T0y;ATBL}!^^(mz|l!a9?S~`=}1Gt5mPka27e3&1o zxQ~z}wGW9M^siX4wx4V;eiDHPsWh!K=s6P1es+*b=Z=-M89RNTd2ZZsUEy@hwSf}x zU_n9D(skvUp|YHB3rh1B2VZVQw8LC!r|6wlXXfj9ro8`LC1i7JJ6N*ZFQuD3J}B_s zirheyEV~kCcrV|fyc+=Fw`vwVKPuxcBzr2{$3gr}>Wl=`COFX{vGd1HwS*ubKRxHk-Fl_+762n|J=C zB=sv2vR!ax(~B$;8n<96VwMXL;8qn?A~Nwc3S1=w3wqz%^ievPSckEp{ul2&Rwa|L z4B5-OcswZVP6aE{0Kev^Y+Nq|6}H~*l1V#!RG&3mD6HK!z&w3^l-#WTOv$8#V= zJDA#ECS0~(6n^Fp*d`#QELY?Uzy{vqm!RPN3{d-5H92^9|hVJVyy*YSb+m*F z6MVgAbkH+f@42-VY5c{i+nO~s{8dh00f4_Ul~ZUKl1zUTIzqv@;-5INHN5WqA&?w1XTDkQtMJsy4`?VoST{9^7G}U z4UH9rMPsWD1m8$twlw!o;3tKFrGSs#)(MBk2WfX%S+|b|*U;}KKHCaJ@OOxT*HbLX zv)UCxG;f?K3h)dEMGBY@Q;Q>$liCpM`CjkW402ltgz(!?>c%1tWrB0ZqJxY~{7~ji zpSD~@7H`Uj8x45h!mS=lrq5octucK@DX#;z3ZlV~;N}hww6BD3nC9N#AS^!DBYJWL zhh_NH0kyil6CsL7>RQ;051JJs&sX~MCX>hT)5jPR^F5>?gC7xY11u{!?52xSIU$#; z+4+;RmfZSwDFZqURO=JaMA0p~%xGR)DE1g3;d~`wOF&o~R_@FFnZ4H8-u$;Xv-$Q0 zU|5mvK42Nw?nZ{X-SYdp@Tkbaf+POq*6qPw7%X`lx8;cEC zU{^u|len-goyF|ACx^6pH{W#MABvs)EdhDN>92X@PuwHxVq<9H_}}QhQdL841&~X| z1;l|M-I_h89N80DJHE)1@A3<5Arx}Ut0YMz>+dekf(N|LhTfJc;ynOAhlxg`4$gS4$N&W#sPt-G)1a%i&S!6_uEIQ`K@gwX z1Rg>d$}@`;AEuO7oFD1Zh^^nObY!Qjc7Es-J8L>U=}w(jJtU81{&dI4ve}hPD7fs0 z&YCi{$ikHdVj%yOG^_Lx1hRTkD|bg(+t`BI+;~)XiSkMGz-dP3ZJBcW@Q!lfct&F6 z)zOofPA08jp$8tQ-k|Vdp6Fz1EGEE!WM`qbULQy(Vps-sJP+3L#QccFu0#l^kF=q+ zCd_%Lm1gO)YA~Ax>?A9NN%@OS%o25r#Y%GCewn9?ss(Si4?+@-l9peX*p5d1r#^G) z#SnppWs~A#S{6&?I!>L12@{c|80Dh^{aW7<-y_*i{O94;+0_gERQ~5Rp}q|!NldMe zNlBENN-nT#V#FIEvK0FvxhrPw26!@>WU&L&u9}RgTgl$J%%??OQ+d{hYFxFR;x*SoVV&cz4Lyoyv(A*_hcbrmRG2?~099d?iTF}1tiRl)Vs;PG-F9GQ z3?{~$F-ws8k^E+pcEGKpImYb-9lsZhS@U6vF^sB*rS&KBgWpG{;~DzRUJ7lZDDh4w zYXm+aTU?~>%b7y5-7u@yQ{6c2J^3z_t();gnuN@ z|2}>HU6uJHtN`9D06qLN)9j(+xw$kTlDYDdisV}`DpUpfnL~<(VzQbIYDpOtlxkIh zNXS2G__gsJdVnwF!)n~5fYBEpe)!!^j8&N}@cH??zTYHqWhTZ@om@>@f%q!2Sk0T2 z6DDEB&EeMfDVgjkE(E1-M5X@;BhXY67@+WlvC4W?Suz=_&n)7lw~3r$KUqpPfW<)L z!)RTyagBZy{c^|*&YC3oW1Lk)WjVTIgQ@cNN&S%VN3-9okDZ%2Bv0SB9Zk%q=JYRl@`Kw)V^4Ly_s&*DCRLWBXYL z(Qp}d$$D`(3^{Mj0t`x3bEK-}Ci>|M&i11sbAMuZ?&z0oaoC7q?|i~CrFZhNBL;p2 z0ZdYa=oh|QJ5-h*p$fU`${4Hu9NoRr72W-GYna7LDG^E$V>!!{XF1!p$TU(n;xuwS z(sC7Wm3I|?<#-}dRu={}?(`|!btvB|!{;lKMX+KpwHh7~19UB_0BGiI(Ts;$Fdig_7Wy zYwaT-k*oeSk^d=ckuh;JGx>+a{$0X;l6_;Xd1iouuMkiY`|-$a?YH2J3?U*(KS)Sx zH)9&%wzVXT_wg#y-E%B ze&o|9q6jYw%6`ty%boSTJF=}1C6;H0b>=q%qB$@O*Hywc?^41-hOhDmcc9nK*;Q>tu zq1R15xJ+p&mHc+Fl%?ZDhS1=6v{{YPH-4q3#Xbi0fZe3#(foJ7XmT9c5!EeL_Gb3u zcpZ69@rt09i(7pDR@$IyLfmxK4^XBR2A^nJ2hi5eLiFc?;y!QW-o6M~=KWyuzfUxH zWdBL@zVnS#zD{|Gr2;Iw1pos5@4A{l?@u9fI}4*f-Wx09CuITm=YZL1Dl=)p6wsa= zG$<`=igq)ozcO_}9t0tQ1Aej0BA{v7u6hAt9kO&!IUE>%Dzq%M;Zqy?Fs#;X)g9Zl zPaD(AWd9O$?dXE-qH?h)@i zsjZn`Q?^o>Udu=bX)mZ6xy6fInYgS?gq4u7a>Fyc7@hC5U>xLs($2&6#Hr zXzZQK_|8}WrgzGv6&xNg-c>5U^GC@LOLnB-;q#~^k7b}}%JJoA;JO%&DvL$x?HCT# zq9R+)9AjzLXONuYS`qc>R2BVEr6qLrZ>gm%BY4Eg%pcy6bP4N@`c|RH0ZgZ;`~+9O;}xASm#eMNt*wv-zbv5qJu~y4QV#MYIY#pLoa;Xz3(Tp z%CwT}t%~fi56#tyzWbrfR|}B8MD)vwnS=K3qMHSkoWmY_vl-|ryd>7Dm(S7qy9UmD-HbyoVSDsURUG}M3~Uovw;5u*>P$L& z8nr~MLrs@q!SG86$xl9*RM>UintNW0yI16m@=+w~ZwdoFA!n*&zz#3}HP8N!1OI>O z=j4ACIVhQfYI{QDQ0CjiT9M$i>-fa=WJbvFEZW>O%@&fD3(U}Que$F)H|&k6%g z{DOq;i=7K>0JppI#{#qA5kC-Ecs@w!qN7qntTDNfsJ6&<<9pnxxD z8ZBi>O|y=PCWga8gB{lpg#wuap5o?QZE9-{pdQRtB|BlUZmXAg>zr_1ML?pK)%M+x zz3h^~*=8q)r}2S4E#R-9IJeLT6_-XS;oO$zE)gYju6Nsj!D^rBdi$?Wd9tE_afzanb^W^ChSD!)a@Mw&~?5Am`pRL|I(rOxvpcjpHD6vtt(`Ldr zN|dD;7FoeG4RXX*k1PmOj+aYnxpaB2%XS(23$#fPO=L~mGFnaY4)kG_^f9p9y7l`W zM+b-}75fb`Wz(97ADQ}aVqSv7GC~@m;jYLo%n&MBXU=HlVN+Pqjec%;hbX`U>xWwhB#=%b)Ms``#1<(;9Id>j1<^@YkjK z^Udr3A_ek^{q0ipDv?o?BCK^Pvf>GhUYcRMsscg-^-C>A*q>m|5~I3CW^+yPqj+v_J{Qc)g#ICoYlt zzA}cRD_e9EjhqUy2VK5$smgjT+$Gvs+EN{L#S=A$i_MvUY{WM$f7Esi-apn9p8!)q-H>|y;1Y}hZ{ z-9~_&qWWt(`S3>tAYf~22WWKuk80}^4;0{SEqG&h&^*fTGkCR>_4Fb|z#jGx5CY{FKC3Fg+dOZ!(O*2-(1ArbV>EGS^;{qmu%6%RtODSe1WGqWM?5gG=78!7oS!(xh8!&I3j==GqVxH?j5@tF{&e&;$wB89hWjcyvbDDY65` zq4xD1j+0Pd{pfozO(s`EKe=Mjx$V$ZagcL%7+$^0xjUVysW1+Ki4l>GkL$}ya)D83Y}W3EE2 z^2zYF%+%|Z(ff@LhR+#T`DO3m`PY^FrwQ`+(}0PQg^hvr|E+gKSxX6-0fkpf652)} zHbY%R;46*pyi`ZP7`+INDHP)jCf)@_MNJUoQmX{!k=>O*PUd9~-e!y=_tIMLG;1!r z%$3i2kh7^>DhhNR=hTh?D+&r3Lg1#se?RG7V`u>@p#NfqeBw~l3_C^?Y)=@>9FvW+6?22b|?;$;BJ}&co zuc2=`<|PQH-(`oK<(t|LF?^UgRxLwMHib!%eX3TZ>rDb#M7;A#_lRp7Trm{4+_rV` zNgr#1ON4dU6sQq`?m&m2fg(z!;l^BLM4JjC$yg_Q_g4iJmd!O*dd>307Z1;kG?vwU z{MNJUW6{eFUSK|k`aENMJtB2!Q?rY8HA1HF&`5kA!PSibCWOB^j-vg6Mhzs358M|! z2tUYJbWwtXFaioMZ?1@)$BDzv3`4c9qBstl6_>e^$|CBU%9KI%4$IGS`5DYPY; zx)at_239l7vvlJs5mkm!RceuSCUlRD_)~w56`{y6rcvA;qx=&{ZkFLPG`q>M^=z#O zZv)yZl6J-s-9F2R(adsV*maDupx0l?a#70dV*;SiGKBaW3c&v(UHnHc{Rdg1q$P)} zfbarWNJ9fo4jSPugwpU;O5hSIuVHOOvMF-U@S;%TFpgTIsb~$sHxd2=p0xL`r|hUY zuaE!`o2$LYA|@x(iLoWUF25&`>ab754nYVMmQdxPsD$+Ah zi_xn@4*!^WA_(pLOI8>0RF_fW2Ox*hD!VGEAxVp33$+Zf{j!cZ2%875EjuS&e1o(f zl`?_-AqtJhsQv<@6?0?RUqd@sq8f~((6RZptkQqz_6(hgz~ZExM5k2jw~Ao1)^jSvHWz%^l_Tr>e$~3^aIBGUU$H3d@$G zhD#8Gh%V!eL<7b*&ukUS9*pQ4gJa>@PRcDF9poSxvt0J2P z1rd#&lx`{;q!&s^osbvL$*(oKeKrrj?+y2UeC}L^EeWi5XfEdkwOu(URmisxW3X*A ze*lj@Xmr-63v0A}=sZf~DPB=YG@KbW(}}wspUln{-M^_Dgn^|M#gj!-+RB!Y3D$~s z|H$z*(-hY@c}!@mZ;WURb6;Vf`WoY!{Tjq6+JkYMeU48I&1cNm1~HUR$-574bkJiEc#v2SSrAEY-Is3;6x@T*v<%YNXotvpgnE3Hk0g(^ z-y;VSQ;|0m=39VN+BvhZ9>-eB=_w9e3P9&4D)99$mw;Rn6<35Jlu74y}th_vpCuZ zPG4R_e))&4luAA6`#hvnD;Vv`CT+h3M^WZL5+MI2p2BrF6_GV&PA!6T zn|Urth~&mG+cvXC&+&)#0p^{oDfMZUd@QbH*TfJDW})Vi^7JA{R%bJXY^o8a^<-*0 zno^}tx@F6S-6I~I+^gouM2Q+&(?j6LnX?gw4keXN zk3ed%NQBuRT#3*!GZRmoQH7zzn)?|9*GIU1_W@Czy~uZvH`mfW?}2?^ zr6o^>>yVswv@G^fQx$p664>>{N{~fr6vknBFPubYEWIK^X4|$KW#A|Ezf@Kk8hvUhHgYpV{|mZ<9d-A_2S^| zGw){2%J+++CQF^2;fnDvew2-M7s+mAak{fvxWxn8ay26W&O&;EvN`E5JDxV^tKp8> z_VO5m4-mLkH=qmM9QFy?Y@Oz?}(A4Vo&_7f%LML={ZF7!I>(<#p=uo3`xhTV>70H-g?@4T$pq&&v1NtbIkAOB;f;E5Kw6Q% z2VFn5qhttkAGx;slfwbIvmd?ao-#KroF&Y-kG@&Bq zS+{5aaP%W>4`TGAuDlK=Us^u{+hkaahv-fw;YM1PL1PmD;k*BJ0@6S3N^j^) z(8Ac_U$XA_e|Pd)tUWdQPb)$t`ej-Z61xhBhiCMPhlrOB2TJVo>@V(QXT=jZ=dj5gcEj0^k3_(eDlE^~Lm++}E6#|$eppu-` z?5zG9PS!;Y@gh$_NA%v**<@}k=KN{lA0IEX2DLjQroTa1v!JSda+wE(K(t)?Q)#Nn)s5{_G>c|`ef`m!%EK? z5>dKI*VhwQs1+##w`xC{wv6qzlz{$EZ;qkp|sSpL96|FDh5|Hu0~@jw6j9d}8JI&w4m zD83V{-&LU)K~eeSQS7ga2rg~=jWNfq86yk=q3wp+PRCUhHEs0JdhND>c7nsvU*7p8 zUf$Sb8Gp!^nedXGxX%1S_I&$1s`l=SJd-^BVzD8iH3?nfnldHeon8`7%Lp;jKfY#^ zR2juimI0Wgx0V)4n7tPMq1f>=%owt&^L)%nRg@3n&y+koalw|En`N=_Mxn*Sr-OR1 z9(Lz+ud0Rpm#Vwl61Up(n|17yEa$A-&Yd64uV?rdLV6vfC{{m=1WQq2O+bUR&|ng0 zN-T5ZMck-U$&vTnuG8l<4;EN-vazB+{4hcmS*@!EiY&eAYk`Qzv~+dPe~D(ph&0ZG zo5O0(lvkJ!PpO*oJD*hhRB+XgsYcze2m^0|1d7ZdHED(*ePD>cLB$7!3_J;W%vb2z z2T8><7N&&M#9h1c3n=vU>PSX`Pn4|HvEm7)=>H?E{pBynm$_sQzE0VJH*Mj(F7<58wyu%zBKAuN=omU5|Q{Ix4VIsBKoXd&GIaZ_;u+-J3K6m3-$Y$LR<%C2S z1>`lS|d;(lA4K#W2Z= zV>%k^$D4*aH>IhvHgu8gb0_QfCV47i$(4cVrocQhA=pWE_I!;_8ABC&g4-dGQy z@v`t=ttQfc-H<;SI^qAW)&GSDleCloO=^Ra)5%tdk*kO(7x8(DbeokBj)-93)kaC+ zrrwKYu96Nz{-SB(v@kO!BOW%RBa-}BDpC*@h4y+#@CnxpZRYR=k zObO`Uq-IZL>YEWZ4Ue>oHqi7{D0~Bz03t%S->6DTT`~sYOlg_;3gsUZ&x0SkN>5pV zjx?1Jg5r#Xq3WtrD(b?bhC;e9*S^z?Vz7~P@_Df&31-~UB}+_qTkhrEx#VC4^;K@{ z@$EN6rf2^q_8CghzU=@kPhKh|ghdrrI=0o7Q5d#$>OOFzd`THiw6WD5K1!Gbe%?Gr z4ZV04{~F0g{iIk7qT-|3dJO-$pJ1riUxu<+4}gh2l}QW#i0iJ1e^&dVU^~3)H1aAf z2{yyV=H3fM%C&6<5|U^y!=N$%)y8?{Q#Ac?Jfix38l{GZrYm+Fee!(4_E@ZoM+>>V z%E7et&Jw&*bt+xiHIoVMv&Rba31{|B{#Qykc4vRj_YqIf(529YQ~Gs#jjS& z6gKK#%N)wu(%>Pb_38p1?h!GZp{8u5lURhzPGv5@Q0!PAt(A&9`V_7s zxeluo%a7XiAZ{S?`9a}m_VG{#suYSoWS2VHO3!%eSY`6TwZ#~)nGM{2$NaL?fTKg7 zl$N2r*Lwxgx!h}fB3QS#iktcR&N5;-&Iyw^P1%A}C0ioN^hl`QAcJ&f6xQ3JDZ&Q2 zYERRZ+AU|#4NE1jT{Gckz4`~##CW#WQ@E;lyZu~d&R&KQnsbh_@%j>Q>ibM4dtT_D zcrS*VZs@!w_9V?k`+od)ZVNp<9lWcE13tW&5Zf>Xxf^|I_A=Yc0-YYy^;T9j%2-&j zwdJ;DXvYxM0?qqI;qR~l4Dg8FvjXMg9=n}HSGx2vV5E$YPDCQd%M1)vjhZMi)LOKh zh(?_hX|n>?o!0iN#fM<#kyWOR;!6Dos6X@6k)nfu~%bcp~ z*ccB8h7%PSt#E_#3r)>R7WEVxz-wJ$ zEn77zP2k%@f)KFoAOqms#r_qE{rQj}`^#L#+QQSsk@y!^_HR)3kG(GhhBUL!>feI!n?+hgj!yjBJ!u2%x$&E&UPK(Zd`2>4L7*SJ@EDHI>T?jO&O=e0=%6 zP^*KLrh+*oOs?ta#U?2NjcNv&*wXy*fW(~fP z&IdFWarGiNGgrG^7z@6X95eMkWbTB^L;_9|WA2-*&S>l_n6guk+h(4h%%=23r?_2w zF3Y|(ygN!+c-m-a(R_?3rkRX<3yDECIAGaKCo%`Bp11bu?G1|?8Z+3+bt?`we!Cnn zE3Y;w`#0;w+8t-D(PZfyLYQALw(F408@UVHh4}RHyfA6W?uXt*I3gtBmvM_Kc?%Z6 zd~?HbBex6xj>F)$?hRgN=vF8tOoxCT3jwK)8Vdt04ml(YQZdXIRsgwOgqp5DSKo_V zAWg;ClkVaF<4fKZP?xJf6YAB-+Q@+EK2nS=2qo(UJA(BTK{Gx>Ppb<#=7MVY9eez= z+K_D)xF>LiKd-rYw>3|+&f%-?8?KCb&74uHl6|C-kS ztnvR7TK~FM<#+(C6$m~~DZ7rB%;Ad#P2$#Y0@kv`_MahoP~Jngv0!e8I0br@i~A;s zQ~;s<0$c2E{qVwA;K^)EcI#T}$1B&+AAzmGFCe&>T)r3%!qf8RtY9S_g08$n6)ZPq zG%32gupBTFE5WhIUt{Pwzomspa^~Fv^A18RD?t>zHV|Mxh3kZwwlWd(_8K%D8{TZ9 zbCWBO@!Vi0GHXa94H7@daYOFi>WZTKdN793Xi;>PdHs$?@IcN#i0a*AY&H2vs9I1W zM{FsLc)(l->XF=@Ko}V7{7v#_vhUv<$3+&OhVNrY#A^M`A!R&HeGhPcF?(a5X^fkdB80CN1ll-G=j{9Z44e&iekwip5d9UzfM1q0LN-NDwOH3U`{6PjFVHpj| zNkm)e+5C@7)w&=kHHiVM(}C|nc8lBoF9B&c#F?< zBJvnQm8J}$5JWhLas^|MWR(zYcgtA-Fg(Z|cPq~_(liO2P?2)>U2cs818pv@Wyp6( zrTN0@!JRBHnYjzTes2;?HM6$z#+GrH0OX!{+H~6=536V}q3(z_#q2e0TQu{<>`we@}Iv^ zNEeeEqEspsOjY6f;J-v)D#pQ}guFnbA{CK$bcY()B)U4pyY44fv&9tFF!Z6|jZ*82 z7{_H8*osMhpEJrBqPtn`z3tV7TD)BF$cAZKyk78tdCRprt|*-$fDQe-(ds`3!o}Ib znoi!)&fdh)+2Y^NI$4Q202g13!5m;vRt%+q{@m+eiUjl|EIMg^q_Q%rQ;KhPdsWiy7r;MrqvT?Aw9Fv~pv@nj{3fk(X5M((kLXh)`~lr(Bv~`bL@nzd zH20%4;+eRBKlmGdZqL6plb~}J)i>(pRS-*I^;hJZXp+HS+X@(^^#_R0MESjpWYy8) zV^;!TtP#i;ws~~e&6p0;I+5HD<2X@g=EXI&rB@WBc#J=2YuDEF6Ed$AAfNO`c8||f z0_zb}qyN0^AB#(kRuBT6vgRDLUsvi@7@W7Y9fV;+(xuR?U1T)T~zt*fPB64VVdQp;Fgr zbjdSuohx(HqOJJ*2o6DlTLJ`q z2Qqi&X1+U9@4YHcQkDE+_v!B4ySvv~D@YCJt@P6C(r(4B0()7m1(YO~2aWk4?h+SP z{%nFUGw$l$Uc5!OT?c%~?Ik!H#9rWeQ*hQHJN*SZ0ld~;myMWwfFfcUzBvK`ynRt& zMNws)e6?GhzrGED#2!`(>%P%*xla$r#-#mS-)BZ|$kV~MI)PG0c`(QK4aFC&pf}r< zUN!tFuzb-W^^7V3K~t=#`4+9qh3JVC=U5dIgcZFxw{V*JmI^oNgD@q~@*Q~ZDKgKk zlfQH9T?xD-9y*|24;?_#w*FUy=CM&?JjNFLXhq?S8#Io1>0rLm*cV=p3jC=NNfd zb}4J#EFsEs1-TbT;&cf|6sky7l+jDY?@*pGPbgZ@b=0+Z_fuyLlqm00z$pI*7ija< zBbkjI;VpHLivT0(L7OC8D_ehJ?PS)QWw?X*Em7biK=)HE-;ej}SRIblj_kBv zq#%Js&Ox+zUNJgz!X0zA5-Yl2hdf8LyBgq=HX^ zbV5+=0-N*8Iaj~OT(tx6#lhhNHX6qR*Y*sd&Rg$V)UMSY^s)+G^-AwW-)!80@z=En zfx%0y06?-K`PbX`Pi)j{vUy=PbW|~Lvif!Tip6#y04oA^Lyj4ao;jwErmPFmV$4}l zkV8&ez4{z=q1(3esZ>xxAkP&HU7^!uO!vGg6R*722!UG5T5F(wG;qSafdM^{4f?Pw zKVa~+mskZQFGSPx>wwnhDX|QN`^v;&tlFu__)~BSsC%%s`5fe|o(XlXrD4oXlDTj&CF3}y90G^4E$u$?!;aE`S?2HbF3L(Kz9n%aSuU zq_c@EUY?4_!cmDt5texJ{oqd`w7tX#9+%_v(RBo2H||d&*DbzT{g#4L%h}*UZZkG2 z!J!oqC^Gf8-xKrl1Lz!OAe13I_Ie31{nDEKP;Lox<}@SNRyy(>2b$JjQY0}&SN<^I z%#VQ2KYJ1JZ&nepv#|$YH~~fh#F#QbAM00y{hc56;FU9PCSeTEXa8X}u)mo>@@#vYrzcs zVN|dyY%Gn2MizT(Fk1bWlR!ebstGbj0eAPg8QMx-&atD6-ePla&}u}YRs#}!e6(dJWwFm14n>v zkHra(*=EfVJE%%Gn(cdy83Ee!KViFJ>#fnCv@y4p>QTubuPcq6F|LD*oe!yTrGv+5 z>10tO@v$Z5$?>=;A+E*j*H3?v#ID_>M`JX{GzHI;^CAXIk;I)_%guVsy0tm=%GFub zOLy3ROExfQ2sA;1rd9HIuVBz0!xNKO`4l_bF1@4+6%AW!LMPxvnKH{svBZ2D$6qGD z_YivmX^H^n+s*^`xn61ovF+De3ac(qFej$7>nvws!;0B8HNXk?;PhHC869kBSwavd#gp23;=NY=`(jtp2fXZOIcV8wBL z@S+TJy1{v5cP+VF!<%>)>hvbe=^29mo?{blQ)u}pgX@Y%^Pra`KV9qXoGWG zRrb4!sfADZm%A9sjV&4LL5Oj`7oR~!o05JZYA^WLo;&q#(eNq_eL|qxXMDhbjF3 z4GeZbNaVqRLNS6cNd&(Sz#m2do6$%9Z~}*i+XI938V^{L;K(6>-#q1CB_n2vK*K{`dZ zl#Fa1J$r*VW2{7PPutPc^<ZI=*!h1=(*y z=%J6NA3vyH6S61Xe%J+u#=Fq{3eCeSia8|XQUZfBM#L z^+pR}DA+_COf1Y(h%CX+OM|W>>Maf?+r5bAh0#sL&?s~1GIFPU`>R9Vz8!u*&7zB; zLf=02Yc;pTCh=sLaHBi%B`=4HeLGS9DoV|@sED#shPtc`o(bh55J`%UH1@QaqaTwf z{v|jf2*a8+Ep@U*0o&~)tXMU|eQSL}O=lLD7YRrDJw2?t=61$r(IvI!=zFE$s}Ys! z6*(oGY>WEvkO^hiYv0A6eR)aiw~3XHr$V z!)^mU|7=)_-wZ2fr|e>6{s&Rh-|Csa0`M1YcgSA>*!8eEvjex7HMjbISpTVODqf=R zF>j_lVQf{UnfEXLZqT~W|4G;lp!F8^`o(b%VDt_m0abtm1SGJgV6tGs%M~>fEtv5i zBG>pAa(UDW06gp^?bJlfOXLC$^irPu^O323JMtf;96-j&&c)H_pZRNjU$ai}Ux(g! zp($_wo;SDsFjKJeHzr%^n%2LLtrPrTrw%Fx98cF?5_yW#%21TG4+~o(>q=Rv1uG4k z(*sKbyBTmBvkCV48skKep(H3K>E)y)CBig@Q39mwxF~Czm)DTKWF9}G~X8&1?RJSm8HvdP5`DMHLzic-NNYvl^@tPhA zR{Imq$C47@ewRN0$CKKsz`|a#X1-#UJ_eYGm6xs0Kgr2giUt#u1(XsIlos@t&OsU} zAG#s1Mt9=-09dNcOf8+Pw49M)qJsPb&_)_crZ>93l*{F9pyGiS3^| z$bW?p!K*h-|7DTI_L)NEkSo%NqP4fgPj#N}iGJ!oTXBTw=2fLa#tIVBwGU4H%hL2^}4|I9#Lxui2)T z#`??h`x8;iXAr*-Pyl}hpd+Oi{w3z?U~No>#Je*uyY;c-*wWF)EQW5D7 zWAMMPyhBQBsFN#nU9e(JW<9y2E#X}Ob3V<{iEfu}cn+T=zJfZwN2mxxd~{+z$C;-R z)n}0lPlrN-Xxvq_ZNU%SOXkd$;lMF!U1U0jho!<=!llTf7%y0>MY`Rtf%OX1HH8RN zgsiqulZ%VIKpV>Jp=C0(snc6BQO^;pKtE*e5 zf!)n0x*((pAwqr&iWl-p75nrOR(UWs`3ivQom7RJmu_e9knH+B@!WHsUS#~qfyN4d zK8D=8dgR(jQ`btPd7E+QbfHg4z&blo09M!4bB_t?pHC8Hp&vG=i1iI=W>u&nAUMO! zT6jH%9dA4;Yq+c4-AAt;fFr?B`5rUV)^a;PxEFU35WHM>grf!JU4TIRcaru$StVXW zRp^h>2@tMizqpeB3sC2hAPrzB0JJPz!tq7i1z^65`3EXvd~sGSkbtTcw3ru*$6S;B zMg_-=&_J2|&F-*3m$>#D;EWidlO?__ibH3{CNl6B&-Yrh|@S0 z==HI8wXyvzPjnyMybce!<0;3-D7GD;n=Ky z7#E4=`9}H@LAz>)NV!4Xua_EbZWYaZhqjf67tR+)PHkJ)yg47^xSP8;&&+xYe&y1v zL8Q_y`c6LR%8D6%rC9CWp9PV#-iXMH$VGkK9`c=&qfl_gqH&Ib(FA6XL@c?$`)!$J zT8nDdk9*`NX^z^ygb_p(RVnCxCfCCKn39Vni^>?^Yf4Gc5h5$`E3>$)-2~)9f0AqM zw_H&jFWdrgmuqtB=hXV*gfep@h~kYd^)NIkd-g!Fw9q!nr;U#f-CNSJc0cwCqa*08 z;Kb?3T)BseV;rXKo)sAQAKq(^JqlftEg6Q=o204sr_?4GR6=ALB_}XF%B43@jzyWJ zxmX*InGR}j?UBE`;MrI8Enc^3_t;jP@QV6SkZQ_5vDD4(mwFpl6Xdq)jqY`Bee=3G z@uXE#*9*9&&i=K@$M{LAAy&S(%^2uns}x3aoP=t`K6z>kXPZWJGTVlR5Hv#!=yoXqylx;FfP@CvrN4VSuh zINH;xuvz2oYa?%4?gpzHy&T=q!zb+1sMZntQx(LT5K6H2;0Vv{rykb3(Dp|H#%peq z3M!S`2WyPsxGb+l$vlY8oN&=hSDSRJgfzws+K7`x!8;>1UUhA{}7q4&PMpxL4@dj$h+WktQ^tje3DkVe5>LcwQ zgY7;6nmujN9=S|vu|NG)J@?y3Cg-&K?pWe>+u^L(Zp6werTYOWUeatyW2)T&n>? zcm|08%9nTQd~+p9?%RTi+gi3wRo7=oALdsK4D&j63jGv4b@132-+qqQ{utaV21XxI z4Acm2)a)S(6U0I*q|Zptvz>gyX;Co2Ku!dsX(c3X$gF@Iz6fh36bpOxLAE7^B8=A<7 ztp?eFosIIte(;Y*KMqIA4~srie5-Mvnjmz;X?VN)!V@FDP7xlH&KMAzWtzr`Hz(pd z;P4E?8yOHv?py>X5VVlUzJX_UT6-cver7(&+siyJz&4I8r_O=+}cky#u&D&X-n zm#);@Fp_Y)%N0eYj!sqV1rw>*qn{+3TI40NgFeAENvoKDCTBtmuYF@(S^8*b%*L`Q zA{JV6hrpWkd793Ze`0;;O;XJ+E`;km{tBa#wEa+}!ruZfqpmkKH2H zqcFJLk4c704$Vr!yXV`M1tj-VKrzR`syNwb@bLkf#_`2;`(_>^QKTLLPtsJgZqaH4 z3anJ7?;Ztry%>YY{eHs84Q+*`!EM5b?aiBPfLO!K5}WE6CRg*Tb;A)%FMsVeNm&0n z7Lr9tJcPA1W<3Y3sk^3btMl(8}>*d#|w z7A(?AK>K8dW#YF-4kKYt+qUm|5FH;jxqQzN&*LuL_12}C6UU<82RTlhoOQNs+?;x0 zKRq1X2mtAGJfH<2L3WfTUyYc5S@=F(l&Q1h+@8)hgfDlaE=Y? zNss2G+$s9`rHb_p{-|U*omw9-B?{(jjrBmyK3Ydr=mnU6(0m=Wri{GA)#rLDGF|@c zuO7NAtX={OEWFHNT%uP=IAW#91O-T>tB<@@d8sv`H z4zDA4YM^*jf>iy~RMv8{W97(TiQ{_Wu z&q3Y&6jd7~Z8ch~NL>blpM5cR4&wR_lGM~5+Vn9e;!SK=J_}Qq?x+X+FzgiXs8)=X z8^Hz)z!Qi-V}u+>#psNNtspwItS?J#T$d@>diWZ~4-a`jUP;}yPDZRki|6LqW*=5_E;eBcob2@XU;$h3D0&RFZh&sx` zmD;ic&Np~?P7Q^cjaSQ&B_9hRPvx#m)_FA}{5#}~3~zek8Sz#v;rQ0^idw6&MbRNA zSv=};S3VU7@&?)0lny-c-L*aBUN0IxGI_?k8&tJ*eLWT5LU3!pFlkv?*^AvUM8fN4CCAlPs%E1oEw;4gfXX+6AzN+jX8;&)^fK?8&p@!IQ#CQB32d9S`LbGq#utJgQ zMZg5;P4cb?jU}G>K4J2M{M&i$z3AJmK&Ah8PstNFWl~h%X0xN1CxM z5|6(oIuXGUUygGIIv|<>n<1MqC?b`REJB-sQ`%#ndN$e7PbrQjZ6t2AyNBO9JTyXZ zY1Z^v%|~dNSL6hyOmEHnfx7Kmevsq*jWf&^EGMuu{bOYU#DS|U+nGYhVFeX0Xrx^u z`0)Lq+|NT!-Y~IT8ZIiZZz&+oTK=c3Sr&64ex}@O4VkuGb^4sn#Hka(BvKQqjg>oJ z?YOM12{W0qZpJT;1@4BngatQ7J6oxAg7>{2bHuxl+Woz8Kfe23>)8Tc$*BWVc7~#J zeex*fzk#mT#i;{--iEX3M&Es=<-hR*sOt#$u>+*~?ydu(`hMaF_uSM-rX;Et-o29j zjoqSk??sJv@v&j2CxtxUEVQiUk-q!q~@|NtmcgOQ)w{EC% zU-pOnBJ3X2!#D6Gy6OARkh;VlkWu_zw*s&a*noEd{RVS@!suUZu)kjv|FfcaYhevw zTFK7>7POwjY>z?$IrSZ#9MfCjjRX6n8{_E}BwR4-Z2Jc>izZs5 zlMEYUjW=M1V8h>TTL~mxWEl+*f4eJ?_uKy|(Bvf7^?d6MOcaAj5(-rSxlo&Y=q^jC z%2}Zui@##QowH`y8nZp^r7h~OpJatMYE#78wwETp_Pu81jv zA|VqpX8a&*OvIF?Ow1IIy{b&iqJTwLp@3wl$AsRefDQ#U>o}A$Te|`#ebL{Ij7C;N zMjfbh3 z1=xy4tyZpPI#++RcKKvXfaTpg7Ej(!)7H%?ixywNj{I8cf^e3KpjFmfPB5y?o5XnU zJ7j$n!ARA&9j(3#g58A$JI)@<09%S}NOdOrR5J3g_sPY*1uOFdD`b7bC}uagX6^J( z+hW>+Ym#UByd~$~hZdGj6sC#bCW2Rhwj&NpfWGG1oRN zWv4GXwH{&q0d#{@8rkHV!nA^VN+B^l880bv4Aa_?@@klYF)52$Yg^GN{sM5Cp6u_R?gTT<6dl|Q+T+g@CJ z_-?%Y%E^rYOGCwKfS7IJ$MT%+y8rd+1iu@&k**&rMf)Kqbw$f_H^a_J-a5Cjct5;b zIM9H-fI!{$=cg|yjizawNm7TTq3#x?J@I9Cu@c0w<*W&5`e`sBr!-8*$(DY*v^>wT zowRCL%-O~j3ws}%_fD&Y=Y(}3m0C#WV~8fV zoU;iWk{pfxNpWcsHaKbNSTJ-oUQ|jVmzF%RVyI6c7=yiYzvxY5&mnp@zq#7fPv)KJ z=qbx-+gLi%%vGO(9ceT{0fy(nh9aqgWaX-KOx?6Wx2YQ$yRJbYTPU ztv~0bbJUoi-C^PC(?T>xZc8-2wW8tH9io8IdwIjCVdHf814>iufBi21T)O}7?@|OH zZfa)d_=oJEkCLL@j6Oi%1{|i!b{H=)Ad`f~B(q;sFPILgKUkw*Lwx2|r8a>H46t(V+n{X7emAu;>ovi5bAS5y^XLfNzjP_FR&e*!44R%Mak25Q$LRSk8qB$y5#zO@c@c|^n2 z6CO{{NGzMcX@k*gX;tPGc|s%(kwqgBj#xnsUWLOQq%HR}U=>}L`kUn+Y=>84PqocASm{36_=?wIE!>y6Pc%br1iSNi0{VE>sAW{u?CG%pUe0Bx>aedd){&#vL*O-mQJB9i7qxo%0h5MW>#^DuGvv3>2OX21qGEfCZ*qSn52D*3bH}_s21q}@``no zu^cz^6@pPGfzl^%xBDqoN)UyVpFBt=Qgl)AwV8&kyYny2cDR+Zqf3|rvSZb|*xi+j zY^9bAHGZrm-n6P(v1PUzT#!P>1es=bi|k-Gf=+ZRD5snU8mxNplPO413()j-$ml~i zVRfS2xO#_G@HO4Z*@Y)ml71}hJs9zwa#CEnY3OEWCUa$r!Mz^XpR07dk-eBu6b@m? z70>(f1x2kamQffhK(u<5?1N$WtY@?uF3XH6&sCS`0XN;@@VVbUKHDN7$!MW(_>2B5( z7S9wPw6}GOxXUR{8l<%b_{?rHnqcLE?}s^M8WHPGFB6aYtl_>b1pzDPMeW|M!(C?6 zpk9T~4b_Lo0}!PgbwfTOrMmXelRN=?l9+hvuIn7@@`sPr+Lvm zsA+oXb$3}vec{6z;EGIy{O>~U?@G3R;s{^Us)D11ouh@bhoXy#%O4e7Oroy*3L{!* z9I8}4C_B~$<8tjA$U)D#O16q%B+P6Y8)aIC!Q@OFV+_NcR*CaW*IHfK;>^Z5Yz)hwo`rx%jqv;zMql>VfY~jC4>K&zuF%baW4;!1uO3ZXQ!n0 ziQjzO&MvyLjP!i?z?WFgxHJNqDs@_*$DmV(LW^_w4C3B+NUh;v^Lg*_jixUv79?K- z-n+r>s>J+YoqI2JYo zN6zQKQ)N3|VCqBSIEzTV5vzJTium`YBsfS^Rvu+&Z4s1La#x?I$D#KN*}Cp+dDn|d z*BDGUK}#_*G7Cv+xV1hw>@LS)-=P=sMi55>g-u}O_m2G)pf_}uYe z8~Heyn(#z?zAiAaBH5OAbGEQBVf6&T3$8=IPX5rBV&5M-v`^bRB5PGO>Xur2Fi^%Ex+um5`O;*U zK8-b+7?$E)(i`OH<158?u?STP(-)gqsa;gPy*f3$qQ8R6(cTji%1%8$eC9fSn9F%; z|2gPooa+{6bJo*o@(z>H?Xc(d2A3PhlOO`P+Wf!HDSxlVe$C)scC5ARZ2#~zpM=+4 z$sw~VUry@!16skAbLSCKA_rLE$OM9DkYqz;Q3mrBTYU9c_zUjvvwmQJROu~{H&uTX zp>y`;t^Ub_pWkGa+1^cVZWj9<4dQGOVE zs_$juE9+MhVPSKmhb{z$X~FRYjUzHj4HJAI*;XgUg^HR<7{!O74Mpb`h(F04l>&J{ z2BYOB=WLA6`10qECt&?(KH#V+-4V&Pt5l4jJ8>1jHz|8VzqRb~OWtMJ2Q~fXrEj)$I>ux9zq`kuSD>oIBdjmMy zGO^T+9rj1iN)P09EZ%HO^<;~^k1WlXK}m+PMut#5f)aKE33~S4<$zk-Lh`m4&cUcU z{^X9q`=c3Uaqt`b2UXjeEq&RqatJ*F2dXTK-OCVrJ6b(ede-=BBTjsvN9xSI5MB3K zb)O&Ez1*5ld!Jr+5;t0>t5E<|l_$Wme?9*HerNn1$iJ*gCT42{c=i8BwOWBs9smKz za>L6aBDoEyr@#nfdM9Gdh#^hKz?46w;XWS;%M}RQvNC&{OIOca`%0d5c8kP1jKO1P zw%)#$Jz0H&2n0WerxC2B$1m}QX{#HRS&cF#$Y~9Gy?i)8mMU&OV2-caXGI-fWH>vN zo7D_#r~^7!uZv=do*gY-s56`nCOA5ChKntyKLj`2lSoOLsQEi|afB;dJF8-uSFq)> z6H}LMF9)>vY4H5k6sr8&h@ur$#k$TUa=bTodQx`>(#Jy*v3vZd=9H#MSib%VH+5c5 zGr-tJz3dhsV*wt@GXzND;O`kJbLQedAc-k?spxc&2o?f>Xv+*+*USy`U z{=a_(02YA%{tDV&G}yBmveVL#PzVArB6@|0IFMzLLPU(9BS0cZ%42s>xR_Ii5s{un zfzeUG3A@FK7gDZ}932Nv*2a#H*B%~xeL&5>4hO&G%n3K!BC93j{20Dta{v7;LWu}= z1|!suX!u|p9=AADu5jpGTD_kaZ287Fo*y6sr%hVG@snw!YM@%Pdv^`?`XJlR8t)kL zEjAcVPQOm6f0cWiR;3>!&N)dwlFNN+MYm?mnqW|>8jivcxjR5$ZPy-b*qGG|B0rvx zwm~v5>pdcnr0^pt!GHrvk&F~I>`FsT_^ZH9?G{)T(9FP3Ml! zB%=Rn^8dBi{MTzj>2(jcBWOkm3|y!ml3yY56JxWz2`+no2=Lc}&_^Ir3@hnnYUr-L z*CpIk5D^PvrUPToy)3R9rknknBV3@*_xgvavusdZg;m3I} z>wFyhC;@hlb<9}_)@V=eu!NpvhOHEiCJHS)w_&Kb z<4XgdFY-r2W;XlgGxf4Fpj7Hy+4jNrG{Q9Hf+>OS=BlFWDelS5 zoUZ2qn>-gl@)Eq~z_$wFnz@Vi24LG9vn(0x-tJ5s4 zV-W#&C06JIKU;dSaw!N*fErEs60iPFLwvWJYGSZA^Q zSYVk=9H3eii!boN-8b{2d9Gir19Xz9iU}k23uSJGt)-6thA*cnsa>jDg`n9%#j7gI*v>G zdQq|>Lsbjof-g~CQK6IyLy@8DnbTM8R>G)8|61a|OJ@tM@p-$^e^j%bVRM8Rq8}IJqv?g| zbX(J=N-%DKW*V#_sxB{Te)2F=gm>IX<5pF-dpen4)DjnGuC^O6!`{M4ckw`Lux==A zZ<-@FML?xJJ>jmJE+m^*6k~LohT0y&Ynn|A8QFOB^iFaz!>kdA{T2PkbLk z-aCk%L4X=*vs+#!!s&PivCxa#(5e-j@0G(P31<5hKHs_IZBF>MAW9B{`Es?Ft(nl0 zt!uPv`4OTCHijCl#@qKb1ti$v!-!Csa)o}X8y23YD6SvDDc)u=tK>GLj9O%&SfgJL zo)yNKKBvqgdcQ##frb8IUH)c6cUWkL0!K>Vt5?-G*AL3W%Ora8C#KVPT% z52^R5OMr|g@>}cl@AcZBI&ZIU{NGg*|Juyvf8ET^|7$aQGT~(}`+?*SFp>LjYuR3a zwQN00@c4nMeC&bY?gYraaC7s!JlaN6<4w2;nMr9nYI-RXWBvIlI0x{^TJ++*z0~4B zcqk*|sTzld-Z{%K>i)rDpt(LEkTJogTIL!i|JC7%ZeX;1ut;Vmd*Gj|aJ+)-GQpUD zIusI$wJEo=0Fbv20iS=aOMk~<%UIZ2nHc}2Z5WfJt^S(Qz3c)=)WKCE!;A73VAsvX ztbjkLRfZ7|Zc-OX!v_~pP>cV>@r5V+{@Ka4sm| zGf+2))C zIbW2(-nKQ$mPi1erNJgDq7ABLR2fnOKH&I$wh*7xmh!pZrpTv<2^Nr5ergdSqS+BZ z2?y|Ijtimzm>>zDYnLhr8WwxG6`+>bN5*H)eQqf6! z0Up%}`Le+_=f|T+a1_|KFo6Y#B$*WnXqdBSRknh7O6{|?x|B6L{(X`?KTakSu|6le z1j$hunJk-_CL4%Kn+Avof3X^0#qHZ-TqqxC9#Fizjw&jj!#bWC3W+h8d3_It?t|$e z@{maGk_dDo+KRgcwgA`48pR-kQQOs=7~=-Xt~o>y%cxyE zr5ae()W`;EK4EOtZ%n6drc)ZSUzdA;2UJa}s%LlVe;BzjjR(i_4Gez7-d&A0TEVk& zi$iOjW9iknJD>$Olf``3KsY*e{ zvQrW%uvAvlUMrgoRNsT<+&{86GPt_%H+q!$P<6Deu6F&9qelqdGjtrcCl&MK>Kfjl zdRh>?6Uv*`<|lE35N3MzO*%+6i)fUi(8j&zO~nSmCuy7e_xsPw|VoMXjEV=_>t>|iXA zsa#G2hHtBw?pBkk5#H_*@6S;j(Q%_Zp59_?W(brG9~y5S{a!-x`K(n|1W;hz{i`U|?+@=^ z2*+QQRdR}j+lnY!sCaB0J3YNL2TWOr60NRqK3zL*~g$(>pG$Dq&ik3XW)K)B10N|r{0iMkp$K5w&>B{Z%M z;k|8NS+PZmfCp)eELq~!$3>=xWrv-fF-S!EfMbnNFz=l4$)wwqNXuo3DzA9ALudU7 zsAYgn0Ln9`?mnl^>wo`=T5GC2m{Ia2iK#E1=~Sd`U!?6!#Os;Ap0GdcLW4H@!`e@_ zBGZx-RFx$Q%iV@szmV~r>(q5*5RS-^pP;K_`1;V;&IeDvwEOr5EKJzGDduvrIlLK0 zpPi(fWIXsSQ0KEdddoZ^`f$~{iZaxS zUx|Bng0aX^|6SCheJmgX7#5Tp!V=5eFfSIE6f=tygDdkhY#kMBw;W5e=cn5Ze6{fE ztaC3kU;Kblkjbs`uBD}1UV|*z8c-C%;4Um$AJ%kX5lv?#b^Kmc#I1_H=0m8Do>=O9 zft3UUs&QKth0TXpAGu>I;Cx@GFjKeX~y_tR&s1Cr={qAp&zUmS? zzd>nDO(6Hh&OW1+oKQ7hXQ_&g73iY@^GeoN4eWSZV+EE;t`VcpJp$*7f3E_sCZE4W z=gAiWqv=c<5~*ptT>O$ z8JS*BnKwqPe0LXAT`X{_oeR#^G4?R+S#B0u=uR(i! z$(H27+Qe&ep|4>_e8sTu313og)A&*>2cX}X0x0PIxeEGyqVuZ?dcmpvi5Yf@2XuxQ zu|nczi}E?l&4HPS8-YYHC{RoyBFoSs^267P)f|{&Rg@ssBcUS#AUE@o{NPBafweDp zz4x1Z9-c1lAU4t380bPf!2Nc5Xi{k;iaSy3V4v)HkXv8@V6LsWRpW2TpWd@$LA+Jc znG6y&(K;_jVOWL}0X2R*QM@C?j~<+lElGcs)^jnmFTM!pnlLVk3vcZ*EtH$Th5LmN zbG9=##f>6eX`3Q79RYSBW4LASr={c&!NW-uKz75xdi7@d8y!8N7ng24dGxH-%y3eX zm15O8r@$v{9UEPQJg>L*Td>+K29U;My*$)%t2fD=I8` z4Ix|4rQX=C{IA`Em_8FmR6s2a|F2!3-=X^|c6PD`wjM78vHv%y)nCQ+FXZrF z(EZ2w2k(vkcB$O4?S#2@0Al}l7^p$bFX(420!ZovtRx9x;eySc6{Qp{rADnr?^H8H zUw=XqZ~7@DbBj!hwzKiE%meoO`O9310sT=Wjx==I$?@Fy*m`Y*M!6XCLtu^sg;I84 z2^5)(PGifax#?h+O69xBsuT*}11ii_MR>J1?!M)qoJGqk##DlRBs&Y}Hv90SD^=bh=V%Jd9%90v zfqVqX>-1UXW}K`7WMO=o!R*OA$i7}DM1)H;DMFe^l@k@UYH^zevAlDDMq12LCHunE zUXGK9!V1*c(w9K}Q+byMzA-$7kk3pYVC>z#jpv7U!f;2NYRIK>-R!5($ATz4v%WAh z%_Ti*hO(V_YyrB%%~^b@sG8fyZCRjtatpgV-dte}`@^Y;Zd~B<6L@@~s5&Qa1i*ha z5H9p4iBbU$P5G}QlHXS(eoGWSfTkt@6~|{p$)wO**gnF-yF4-_#$I(ug%TMUj#ds! zgK@f9QbZDE*jEm}*+EHz95QHW_K8g7|EvX=R0QH==(n--VfTiRio zTO%Y&S<}^jUe}$f!tHrJ2TD?_(3A!H;%I|~tR~%EpZYZNI6Ks2XNbNVo(rK#!IUiCHb&V@ zKjI^ln`Txk%=;UaB5lK36Zz@yYXDy3|^@h-33`kKSd?Euq z7FBJ~tFyPBkT*)D!FZMGG*=fVRharC)+l4a2V<#E0lGe<7Tx%VujlI8K}WrxpuPR% z=EX&fTflfh@>D^)!_C$+4}fN?wCd+n+|F;P=)W<7-^ZQ)AzSn-YyUfvdHj2T``0Xc zJV={I?JuO@_W^E6d@Xq?0g87GAt)hpGvv04ii)EwToTX{&=#P9Y)Jf`At1B~_;Z<$ z7)|YM0t!YxzXhcFe*w6^!x_JKkfYRee~x86LMM|a%Id;j>QtqCoIxNa1CQ2a;@D)M_^`~w7syex9fQ0f;Jb^jcnwCeDMDp;5RRq48Jf_J z-rmQ@(*}^4f3j_SjW}X5aQvp4#EJXWrpwFtLNG*$diRrLJ7GPqpu7M>LeOE7c;X;rx z7?I{+RzMnLP+7}>^DO-Mwqm`axN0x7MPbOIU9f@|6G9*v5MiJ~yC15hYe6WD0z|vE z|5$XT1@BK6$E$Ezbi~PvIo(=A@S3AUnlcu=16NNNTKlYW>VZ18z*pcy%|yCIvfunb zy+U%F{NWGaohRq{MU%|JOt+zkw*( z)!3Uc@a;!T^;HA>;@S+dmvsRvI*A?z4g{~sM#7AmrH@29&XbSUs<)RZ+TPbk-Zzwf zE_7@^qQ5#>BU$K14M9!rqTn-#m_4C%3$pVILR37pJ54QivA)iHl-wx#)om`5^paBr zlRn7qH^WJ@v5UO{5yv9*!uZ5_Q?NYh_wkiVO{= z;n8pm($4GdUU-iahHn`Cy}%3-haHOtIr7rbjVEKhbG$!w%Ta^)iT5ZkT3{WgVo6!< z6jrBX?dOe()H9~AeA$uSK_a__;>;7x&k4{c1YnUG(k5h-t5k`BTd5_V{tj$`9Z{4;Zq3QKm7vPR zcVWhUrSX6*w4SrTe9vJ?A}8ERA;YjL83(e1S<2|6$;m>rus!l^>+DDF9VMk|?Izib z$B{uPX#{x^xA%%_iA`cgrN(L14yg)B4yJE9cJozH=2j;|beXEr2JY4LE$s!G#r472 zmEDd}0q>Maw?#?kW98S~u?m)C)`CRNc%@0t=W2;GFlOO|f683E93ZRaF}*CaGk!Q~l6Y>JZ7`z+0(7={@XrX#X|Q#4D*JSZTYB zT4j=#)vHn4;N1@U2WwW3*G8E;5X1VU{gp8@R}K+-ocn{O5t@y<^myw`cWG$tRxU@3 z^)Cf2B$i>#T7;1-QW*s~k2S1B2_$SqsnZXa-Ld!hSE^5mxbgQ8k&R1FvrN;QsjgBV zS(Pq}N#OF%62ITb(TcA+IVSKT*>JsvL+GEu_9xB!+A)mlF;^>>>7hqv?FU0wqqUHA zTvp_GeS7ehn+`IO^9&-erc?&8(rU=M2BBgf?TtC3NvR@GyOV0}#_&CG7pa_EeDk(+ z!1wbA=C=@_>icliEkW-uo|z4h3Xw3K_*F394zF6E_}>sW({_*RT-wx_^PAX_tzmj; z%G9i+V>u-r%Q-sr-=k0C8?edSXr5@flqQ7WJTh>%J5Qg$bK6M)yOpI_;JlDG9MPv@ zdzrzZ+WS2j{kBgXFl!)d1{a@ zpSs8(zCCT|cB0Is68SPI@P+jilV}bs`({PI98h{tE@VU20$xGdLZ>S;x@+XZ?IrW0 z4Fx1kg(ZFw$%}|}I)nPa4;~Dxw zkDsQCx+58U-dDTg{#le^`F7&Zfu7bPq(3Fmrmfds1m?eA zS>xwdHtlaPe*ObUVdy{ALO}jQgv?)$ZNxt`zC55o@2WH5-G2pS0wip2)|AYu@cIUT zc$sP0DOxHziSRQ8Xz1YBX3k@Z(px4*7HeC^MwV-)W=3-_;9N^e$QMbg^1`RhB%n2r zsC_s8Tm_L6%3~UMDQeGVN_sIU1clhe6*vKP* zTkLk}mHC)xBBTA;pL4MrJ1TPgQMvDpZ9$I_+uelgr|e_Do!9(3{o~BdFAPi#`_ReW zj4^3BA832j@wmZ^oXc^akL{79^4kLKvgAWd70t|oU@HWcEEGO1IQ2mUn#?rzP1eoL z>;<*^Y1W||Z{;e_>u~<4ENiyy58CRRlxCPN+oeHzr}Ro+j6vsUG1=4`D==}?9X9Xo z#HoQsgO#pNe^+-zH(AMwfiJ+D0V#c|_k&A{U6&BS_kJ0oaK;3+Ge zvk)v|M$wD~GjxGPfiPZ_8)Rexs=jPzBY=p0FOe|TdGmy?C(}VsL)tNi*E<&D4A!m! z*7>@No--gVkP&Of<}gXPakawJ%o7WZa)(r>4WY-A9z)|9bXI~j`y*~y5pUbT-^EFk)CNTrh-yNRmW;cG739jt1jGhlzOJTK3$&SX9?pt#IH z?dI|T7fA>4)HgA8S48RjmlzRNk{ev#t#k|rY0|h%F8{GvwU@y(Ko8f`5K4%|(d7uJ>d`+X=Wf^v}s%KaBKlGkC4CfiWg8^^F-k&5l zGp>U?uN5P$h&=Io`OO4Ab zH9);XU=(OSEW#vHR&fmp;28^nqlDvO1U!^|rzT{aw1dR9qy917I7wN#R{I*-$pGYu zW(NKyV)aoO9*Llh?w*7Mywo-EYs(X}7O$KBUNa#(EN#;|6PUhmWk=n;W0^UMT#2b) zmpLXZQ#?IlTYxMQ-oU$%k}tfSqoQc02si4{ECCN=D73yX&Tu#I0x75bp-$d%Bl?u+ z&NouLX7~niYa<-(>ByS#^6)q5Q-vayjMUgpFE_votqc@%>195#+TLZ2Ri1b zpR%&Xi?Rz8aKrjeCTps0Bc|;+?d6Y9KV#wYQ~azo=)RJ|{wX&94ho4`KkHo^|7Q>< z>OV4%C-Y|of%#$h7~I7zAj#u}kf;wVu`Ls|PMXdl(AH#!iIA&9N#Q@0hS;*_Aj5N= zv0ZoCb~Z<{M(+Ff2?A6Jai!qYLXT$bC3K?FQ_5>*7d+pk0p1JoC`(ieS{baOm>VK& z5^gc9piAjSWeaVaJdh$tQ5cF~^Kgk=Qes@n0F{iFGQMkn2FVR?y~HfljXJu{vKKrv zTkE_20)9)td7@7Qg~;sPY*+Sfb0-j2#SIaj~N+Q!xqRyaYA zq7~=>{`bT9d#(QbFe;kZfHcQ{g$wr>9^}s~sNzpSR6(3}Fu4dE*58FV!jQws(L2Bx z*doyBaN%u`AwiTsm^Gy^xS){Ushc;C1pdR#_gnC}F~xB2CJZ98oSJo@j?8F8`E@I| zR5Aw84`|@UzPCAYD_ZgEW3^_#PlBB>cnK~&;FxdUzA0*Y=WP#kD-|h{e8@bHYI7Cw zAgnS&!&4ioRiZM>>}h&i*1^%T<>oJri075uovAwZNLKkkH1qbF>~kt zOfvW;41ySuh#^Ex4F|Hr8dscPg$A#{_TXaa)kR=?0J>80a6yHX7|4A1FvJ0&A`ja5 z5s|OdHjYW2nk;#Lx|NgWi}FsCDHeoF?$4G>3^`YnJfPPpK;X+$=i7Q$?e(ruEXkDQ z8J4A>NmeR%*>H_#k*eV*MTKw>WpLwT)nq1HmeC5`#X9>Yhw;8eVrW9TzrH4X(A;R+ z5LJ@Uk9Dii6oQpTU^5Mkikkgu^mRHE?Z94v#R)gAKre{?*q()>+lX6QpE}l8G zRlSYVL<9x)hD$-~Zg-mTdZQheI*qtrI)MW}ETe#+?O`N40?I8ch4yVg#bNX0>=nN` zj{z*d+t+V4A=;rww8$^F3fAm)P6qu|$K43q&UX6XstZF_cBwe(@vawk~!%`9nqEJY)^RSJdlzx+~2OJWU_mGd$wmQ{MB9Lms=k z5+D8=KL+0zf64=$@8chz%ilrE{~;p%i_p^b-=y%z@6ypu|40Y_M%mv*OEjQ-Y-mLJ zO!$}PG>8H7EF?X)HgeJ46F-%&CIM|8^*t8#z{cJUz~*5@^m6Q$u1pVc1aX-Uu@aH* zJ>m#HsWDOpDuZ0)AxkhWCT@Tau24W60L}`MAl3}#EEV?^?khk8sap0=HP3m8Qjsul zgXd)7EY$v6E9m}`{_%$Yu3)9^VC&%M>F_IO5Os9$0QDh2!i)cEMYu-^+JXzC_O32_ z8}K~^#9q|Bwy%~hDU5>+)DXU>VjAB2$l$r36O*I{!1N1vOFL-Q1KUNn-H~=puzi2h z2y+r7@jhT8Ei!6g&LG3i1ZU3v5V$3~em~}5W?*G$=;7$Hwb(<8M*MV>$EpH%K5R%U z(ppk=H69e|=9V8-OaJDwwW)k58(qeiI{{8a%_aZrcxhPw+WT+;POxR=W*FzSg>}$#!vogn_ zkQ#^_9IEP?!+wuk{^k-MV3F7aTd3KKJp2y2pT>xgn#HKHqQzmxhSPj=exY+zXW=U{ zpmm;K_Kd%&mnhnfA(@IYNlyzIuz0r~7@A5CsLVebaLL~NB2EErC6%F@RUQ%3n230= zN;`Xh4ZhgGJvs|J$qTNO(QN|DnzPGto2gossxx*!;YBYvB%d`=r@!?I{gz_+lv+T;zTt_dT;i`qbaRKWg z0s>5tj!)3@=r%nAXqm{rX8Ec-j-szi%J`S53dmuV<{iseB-UHx%|&^I?mhgPvB! z^Y+`eixd7>Pdrwv zOk>87?^VV4=hnDcN)`DvK0RFJL(hEQvkK;KyS?fal7r-c!dtPKlmsP1X)#|;xXVVd znRyI#0%?3Ys(dDzJOe2)UkbQO`4+4(=ch{b&$gAsjPPwpp5z-jydNG{&|2Tz2=X(9 z`mdR|#yG)9z5m*OLb*+k?iJDMf260SFR#{d^Hjpt8n~BztB ztIB#b_LhZ^AfA)Vh+RBb4p&qM=oHvV-y9*nuAR8R$@Ih4^i#f>9q+KF)1w^wp88Aj zkSZ(7gHKt#u6JzN(^mB`0`-rrSfzfrWq#;YAFnJ-oa}pi(yP`b& z^?8l>ZIo@TBDGD85n(KKuJHpWdvGgL5A!4f^0)ic1AgcvcpzC_nLiL2*P#cb?sUTWFRZClNCblxA zHKJPZOXLtZsj@YTq%Fm_Qltfiwlbt44N~%t@DDDh$PIPd$yms;S>v2TrP&|wnG**D z+CrzXRd;=*cm09k+(cPV(10QGte98=Hh7gE6i6V?t=tKFoEMM3!sS%A#(v`Wv;g) zFytSl+4`}YW|G{Ja64b799hsM&NX;`Cn*Z=L!o|_t76L*pnYR8y-*nAI)2>#=D226 z&<`94ZP!mKX0#QSJ@q!l*2lo2X|Yl5>Z5Igdy@_ql0%vgq6O?oTcSdgf&nj|2|Z10 zxy)Hc{M45+HCab-D7@3cHcsm&xh! z;MRuA2}K-PYRqNy^@lGag*$W3Jfb9s%uz0JcXm|L(`uvv;N18g3X=+{CJ|rglH0iS=ba+Q z@ZUGur|oLt0ydtOicjUscaTrC){AMlz7MWOf5iDb9hzYYMtzH4XL;uf$JuR^tP9TqSn{KNi)MNloVWjc&N?|=3&q@LafO~E-An`J1r`3>-Gwv%La_|`UfTYjrUZUT zzW@4OetjoJ>c6H0GFp(N6B>fC(}i+{1T#f45SlfxP|1SuLHbLiUDo@RDme8Lwghxf z;r~^x)?Sj&n)483F=z*R2z?xa$4Lwh zx?3fTR}cAhjpA6)7W;_*wv5yljyKwQ_nYpZ7N4LQZTev|qQpE=7<`0QX?~C`;#S_t zedmX*SmWUX{lf6~_lFhKA$PC7r>VT{sm;Q^C1X_Ed3|i8(>cJ5yw{5D3E3U7sBl4` z-55#pu%Q*3oK_WvEj%q=gZO5Vvk<{26FqkK)1-S*jUG+TnYDoVvME#VprG=I)=t}# z6#AVT(UCWQ3QEwBCGqHIK2uGsVKhDWR(F|=36A=ql2&cLE#B>|UdR-y_~@PiQ!Bam zTL^e>(If7g7%uIu4)Zqsa%sC9l2^Obp^)i3y7Gxz82M$oYty-^j(0U5mEYe5!s}$` z(qJgt88n#}mP;HG^{UNks=#B}khY@}vsWr&q(g>#_W4f4iS`o^@uYV19Xd>8M-%!a z@7kwnNbE0)p83q2c4K$w0(PBhEgXFV#N^ zRPbBEb@7bxb%&)&>Lifo;gb@`lP^DV*HN7STTA&3yyQY=53 zKOq0eA`TiAEL?%+V%9W#z(;5ew*Mg3X%UipSSEn@`l52;F6>A@@d^AVUSuMBA;$^2 zfG~f&fWJc)KYR8rYE~}h#%8~6-`|aof9u2lEZS!BW8de`^kDvzULYWr7zY@oW@oPN ziH;K%>4uRuHF5SZvbM1<2YDw@Kt%pulKHKr95KQGumPhNVAP}*=0*@_i-4EHq)6D4 zU&erSXqBKEEdzi+KZ>vo!73I3_FQGy{Akoo0X;W8pnv}xlKGvJAnNYoV(wu2Us;-8 z9v!M*14(aQh&RJKgoVF;A0C&=LDpjR&9Bsy-ONfpEq#r1W}vDNJnci@}_LH zKd0yoT7K0GB=aTHFJs0lk2}!#*Lr<+OZ%6ehbb<%R-4ymgyP9wGy{o zE$@xba4>rGguL`=3ijBCOOssTqa?pAU9n$#vei%k(S-c;0!OE0VA_ZBQ|pME`3d_k(mA4be4cC}>;4$5b)sEh>KmltK$ zNQ`R=d={$l0NyMk`^+se?Tfsacc*I+b>7i#z-Ei`CyasSoI8%m?3!XO7w{y=1IlQj zyU!#_#B`YO14g2x>g>Hq;;T%9U{K1#Q|~y=nWa6CLTBc|`&qf;hupndN|q&lWN_@@ zgEz_ErCX>1e&`^IG22!+$pJWqS(5g>tK)eQZ=y>4okv$GboF#onfpb3dNPtyhO|vK zzn3(9z(Vd?ec{SRXdW93l~K=OX*=Mmwmrc1ILI((NInzL`vjn}JF`D9vD5v=b2YSJ zQe?tmNAv!sudwdjO3?Wdn4z-I;Yzm7ufxiZWe z9krfL{K`Cm4PMm3h{^;dgAu4iOKyXPQg#Mh;;Nit%y6&cPWqy_rt1|zLrMIT3COy? zP@T09taa+MlgY!Lop$-mssduSbC8M~-KAzvxhOg-`^jceh@(KUlZqN`gL{oGMd-$V zv4q})#bl24yyyvNuOTlzNZkJ%Us=PpSK(B#Y{pd*m}46xR6Rtc$qBAqe`?VoPO920 z@IhIsJBgJR2nlG|O&<+0C?5GCH4?!U&EYMnGFz|gXdR%m!naUiN8CWqnUd~&!{f?H z0Eu{X;GsB^*7g*zM&q%Ks>Lxcir@BO-kfW;MxU%UK1iKa4hhbiS}R3*OK-^jvejOe zeu&D&vZG<;bB7?Gg}wSD9hR?5WCSs_!O8U-xsny*2%t{pacwy8Eg_m~7t_K4?3?Ha z8h*9qXtGDk_krQTLZd>>wpn{z1xE~IwWIc3rH9q8h+bh^RLU7>%bU9{;+b7k>ELI~ z&eRCv(XpqaW)d{$H%QXA9bX%TVPs{_>dRMM8J2AO>?pY7)aoOkt$w6}w0(o|A@jwp z{CM3sKfMw~4MTNk7BFS+>zEUk4r|jFzhz^@c*4{lr93{g{2M?(4`e^S3R@df=>|)G z08SjUs1nXWZkq_4lg-IcAQ;6Bk2cU3tnb92XQeO_+>F}~c;h)Ch@=>@Hp9Y)7C6Yl z7c4M+lNp#snS?&_IkSZAsH||xkl*g>C>ybEPzB(jkv8=0`72qnF&A)4sOnIYLJ?Nj zWvLz+FDg^+bq!Qc&Y{z97Hb|#9r*+ZPkz#KYYJ-)&_}ycU-q96l>?*lkTF+wluAc8 zUmkt#==ugTbe)$Oue@sk%hX>WwrNw?-df)hA2Mkus5dR&ntk{qSdD?4Rfb_?( z*oC5UvA|e#C;;XVxW>_pyuJmWd0!diI3&8AkO@HRTq$fr8a%;`_v?bdYU@M4z^A8& z8@M&rCdN(N^8Sa!W*Qxz!;X$eRRpLI9lP@u{AR-g5(G_MTGkoU3dAoIXfj8GF>hBf zur;<_wQ>W~QxRa?t$j2Z zCL48-(zT{m8+@PG%`tFESs2JX&Wkb)oyRUm5SV2S)<(paFXO$b6eRB2B0)n?d>4Gv z_Z=BicUAcozFrEMiQ35-ZK<@^;$1~UMv|!^$SZ{at`A#_D9RQ02M5Fwc38#eoiVTXx*Jgv9db`xf06Uk86rHkYrx9gxF}Ech{Q8gE1ny54h!;aW5| z`2&2ryS=@pA#*QrekQaDWUMq-posbIk2AHuBWXXme*c}Xh)P~m0U^sFiZo`%s@mpg z`ME4$rl_9iXzztpgMHA3BA4B%<*jT|rRAYtdQ&rB4AC=#Y*2^J+-P>?jCk=%2dADq zA6@S*z@MD~UMS`z2EYQsRegl(cZi!mNHUq4Z&MkC0p&csK7F~+v++@hz(_rm$@vad zGhIFlFN>ZUpDupr(`3ZMg`op30V^j9c)iHx%F}pLqy*b@zP$aF2_U|~0=%NI-<&dp zMNIKtDgN3TNw&nx=C3wF@3fueI-lawZMPh>et6WV2dFv8PO9z?L4&1_p0=XkC zk&ZJS47%u2qYsrGxScET<~8L>m31oCky$4c-bS?@jI;`Mr&_Z{Z1pLxHdhMlE8(>u ze{S|RNSa*JPKKKm|!{!yA?CqSm@6L6wF-*WW)g@ z2B4`X<4%?SS!`Wd-cVWu9FjT92=d zvT*Oq9ft1rws(UUeKcEgh2jSbE@F*v3C;*HC`aWO27+iF-AK!BFjXS)-_DI0GU%!$ z!BcL(DFBPMGE$H4?A=R`hwj^Fpq7c-U2eD6h}X!vS8*wgaGxj(Pw;|S!+@{+B7h*{ z>thTl@e}^0Qv`<}kf)+OL=iPaX?iIoiNkJ!DR{x7SKST_b_y}0-GQI6sXPkwb%P$P z*gZibpS6{#i6N~F8S@3=pPC!7v}SFt*8z%=7gn~V?q}7uxCM%Db*cti9-qXv581k#0+-jYI|6XWGi>co*eKKE|DU~PHPKpD8^ zAIC<2rxhrgxSG3o{IrSv6_ed#>Og}_s3A|XUm&Mq8zw#zhUe9~8AH^$iHMk(8o4IC zD+V>Uof%FQUdl-!`o18BcSf?7jDK`10a*q^7;${=D3j*UAm@A54u7 zeNM4)gU1_$S~10X+L#uwxK~;@m|~4csj1^zCT2-7R8%a{b>H8~8GIY+`B}i=J>kKF z!*QiOrX6RvvK?NJ@8AT89=xu_9TN2$|DjA6^az#W>%LFQnMala@zlRxX^12UYFfyBX~by(21Tf(5-VAh{-SO)vRn zWDlIzvW|l($Bgbb&!m~pKf326K}X^A$D{bY`uVNK{8zX3Z#;zQnb{cp-zK*2KOF?o zf1eto`eiwpO5dM<0W#I&3*!BUCG!7m`U>K5{@L_3qWsHc2nhNp`Xl_o4EpKcoC{FF zZ2F9VxPgSgtu3rgpPc~z=MoK`mpJdLRL4?=Uhs2SFk9Dup2l8>>D60 zUw=12tf!Kgmg0bPr<-KjI9uLgH~?}I{p7$U;R#H{pG76t*R(y z>}LEcwEg?Q|3PKVdD!g9R2w()Pw9yl`wIg5CzbVY?!y1=EBX!`LMi0g>l#S@9`WDn z0^uG%m$7zCKJgZ`jEFxTGsSPm{416So0^)tx~jUH{H?U%9xHDPa+nKQWi30c@WZ6L zP@?5uG;rA+3(JS$#N)~973(VCIfMMAs3oM~I= z|NjDk1hg^|Ni7*qxcBZ|7nOLL_wHP}@lShIBG4BBX$GbaF6}|8i2BncRO2sGXrU=R zsVTYADa7XsM20SeoCjL;mp@)0kf*>u;>3S5X7|6;(+Y&j!UDh}a@R~*zXwJ!kWmKJ zl9D+KZ-{76$mN<@x%0-Zm9(BfJkV|&p0Fw59A0GdxQ@4G-Tyehg?fSFWD6t)+@y|b znU~us@4A=^g$b#s2J&w^IR?pV!WP=klcAm+pePvSBricCF4@X|ozdIC z0iW#Lr?q%Z3_v`zOR2I6uWB(HN`m~*u)LVskn%PuV6ib2SyeS$;#Np`)JA>3lp}E| zHh$FilZ)eg+>0VGx7r4^dScI8-a~EdY#>h4AT$IxTEvwfJK7-45u$3JMih4tX>37O zZca%IX5h7r=cTwf#{_4@)Au9yoz9uW<>nb1S2QvI(EC94vYJgigtKcp3@@@tv~vl0 z&j9O;Mh&HcHZ>>6tQRzpj3;m#PE<}2h+%<(^3;UiIiW*+qPo$_(M!L)qx^fIgI7`cFcw&1(vbV13?r*{Zp%uQF!%}!`CAID}td~M8et!lY_e!ol_5?y^k z*Olat80qgI{@;_pe;JimCCR%^3E}qV6ct&=HZ?TrtX63R&m~71kh;X~$-&UWSTpgC zy>uHc>_e)D%Np!DE~K&K18I6FMGptsmU^Qr@la}CaX;-eGcUe#F3svRhHPq; zrvUv}I}vq$Bvmf7zv9!T&Xf5dY!DUvaRY#pKMIZD3tl}7gjtLw^Qc5q;W|4;J9PZC z27qP6n{Eo7rV5_RhvssJu{$`iL?gKVkU%XsOSS~JwE*{4Y)Ih~cmdv>E=mDLIo^#R z^_5_1sy@`~cF8sChR?eJo)G;TTPYhbZ;wOj-dy7v_Lw$?N%zj!HdO#O?G3`Ctlxz4 zN#Xb>JWlmWMk@l$8tLPwFT9vn4iDuVCP&IPv&n>Ez6w<&w+GAf+Z6@9&+?-(|&u zK1$*;Cbm*ErRV4530K)qNCJI;rj`CZ7N%k^kTI6T1ou&cl>Onwa1)ts#hJn;f7>|} zwjcvAh)^$H$w0u;NZNQ9KHmOJnteE3dlE6t2wruwQX-WzNIQll1p>)7nS&zto5Q*`h*AojDWB zo1rFxh!kvL*@}m95XaH-T%oW=U_55SrzV77lGe@c`rLGST8A6+JNyE5F;9>8=O9Ar zT0NL5WU}LTqACy57)}3)*W*Rb-8LUam-;5yy?ko_<53I?eG(X#tz$(!!i`7?85&yWX_y z(x};jh;U02Eqn*(wbaOu@^vc-iKcBbY3WKc1}?dpgI*%e5}}h{8TqA#`N-rK{cIvq zee?>QR8-`Spcloz*Jn`9qzmoIboTSgT@vn>b95U@Hr8w;r_j0fYhRlC;B?*!ASj-O zNWNstR0=$uiX5kxf`>7MCs5-lX@N%)nVVlTuq znEc4zyf*3h{L1I)YW;;jqZ;x$#M_~?r)QuLvDqXT26UlbLjNg+`*-jInSei&-v1N) z(sn(kB~XEq&ZN%Y3gIM4FTUAjMLHE>9ze$%>0pGu@KA+qP^;S#>q>ra29b9yE_*C; zd@rzjd6##5Df$%fsO-C@qF0|L4o#zL3Po~#TD-b4tPp?}W=K{7T%uKF4Z$DNguZkWo&_&kl2QDmN; z5+Vkpb&RCcr>!Pz*Sz>~9L&1@foqHp$^nF=*iz|3XLPF^Gmv!T~5VA>OO4CUrXkbAw6JqyNHOZC*%t5X??Wu3%~SMmx^64 zNA481J*)7@eL^S1Tp$fo%r@V>Q#hr)j?y;KDy20Pfg70^cERi2!gstdlC0ijf~4#v90DLf8>HX z)Z$ATeH$No9p&*dZ>&(^(S3Bg>ljYYddTTvE%i>8VeV3;x~9Bz+AawV{OWk$>SOfx zv)m8>!XGWO8trp=xJiOkk~1j0g=$M#DpnPcWiN`=PFv=QEpdDxjjBFqIMz4QzRAI$ z#xF;409)=&{d~JvhkKJ(Fn*~Y$bKpvy_e>*o!d2#KDZ!c(Pxf!BurG8)uzzHHpbg} zSkWlM@`;b3EbP_1nq;%RQ%q~2IS!(}Dl-F*M>ACE`q2+%%j4Q~sS{$vCf2vt!J=07 zhHiC-8fMYl@zBAn{XG zF5_EIW+V-Mcok$-6X&`{1?@NVo|`cHhtmiZ;Y-h;B*iZe@=d7ipWUmdtdvCYaA&=i zB+wgQuk`lJ3osOo&ooCLq!=|RW7_AHn>XsalYIJeqdS4)zMD^J$Q4=zkND&@{Xf{q=Uc~X$o zVHB^5jEEm+>dL;7r#9Yu>!x$+g$gDLmUWmZut+ertGmuWDdZK&ZL*-&cpIqFC#%KZ z$fFQU+>C-y3>Xi5JMO7Ol9-=f2QkC;4ePoEx>1 z&1rM4zH$AiQvgIKI}E4C=WE;^X~j_}^ikybTHeKV(-1P|#eD)GC$YVrwz}wNZ&4mY z<%WZJNQldvmb46`E`I4l;y(Ud&XV-VkL5|dvZPw6+ViTMiUcJPF}id+E}JH{O1Wno z{R`Ur3W7KBy7SH@hYVF;F|evCv6Jv-)h2J>%1xil55MV3)2c*yV_5Ra zw}zpw8jCW|eKN0|vi|sZP9aST=ONzb-jO?yeiPoV&!uW(&>X|At8E?XROzJ19J+TO ziFg%K=&R5*S_?-B3znt2GQhq@0=GBVHH3)Pd#q~3mD<^AK+2o4gs2ezRf)PKWT*;Dx zmPi-jrmc@-%b>+@VadR=Z91u1#D`pzh-9m@b5%nAVPBL>6_SMgx z-+ie}I$=-;9>Dwx+5FKLJRtmvN0{}Xe?iZAX~q~SpeA5H`JdkR-xJ1vVjKTPXnqYF z*Zmi-`jOkyp7@~GzqvW{&EzkDM(-cPCBM%akEh*5h=Gz*nLifFzspRif?#lKQ*#im zW?^mV?(z#xb8-2P2Gif*(J%JY*57~H+D!h3kxexaqSi2SF$I!y9eLoJ&(Hr$)Yb1V znWN2!my(iD z_VYGTQJ|kd{0W{hf#h7kKWO1C1W>+?rGYI>3*e}j^MHU@g*RS4W7so%Df@n$|!hb*%_B>q;Bfen`NIwUV*mDcAr9YBa0iMB~_A%F6|g4 zsgBPz7_qKui!^)@8xYiszQlP*xZ4g4u^xt`Z^|MNza)SYtI*lZ4zW~AS%-?g-}^-dJeH_`Mq#(hRz_f#->SgjqpH~NHlnce_cW^D6Vp8XyU3h z3x98$7aG*f+nxSyS2d*_(2qw_w-h|4R#ichfV0YQRSYh{mqVFiz0#0k19lHFNJRUgnYQ|CAN&i$mHY5*lmU_s3O!*sO>2E}Aro6O#zEiP46*N=2K`7Ms783J zxF+UUx!vWoj}|?v-pI0NL|9MK;3XFy#o9>^GZoIU>Dy&#J{f8^wE2b~M<0O{Wzrg! zzV9}?j-1^;X=^D-yH7VpDB=f-jvipM6Oas^#7pd@*BVz9RDng74qavNFdcB3J)ojt7oTW23Elv z5rm2$8%HlZ3-y|&j$G2=iSD&%{y@*@L(!a=IfgoxIgNjG8xvhXvuj-veAK)a{x-?XRgv-s z1A+8w{H@kgU(jUWwj;!9iJAdR(}-k;s_RA}Pk~*e*IzGD%VuG&%YS`|rDwJNi~SeAv#g zifmvy(Wj1C|3Av!F)R=M{U2Yp-Ku3Q+g`T0Y`d0iuUcN#@^UTPw(VuCRllottNZ`C z_dWi{QIG1ub-i)EPrN{NzP&^G7P~@87Dn(iCuIDRt)ulrI0xR6t$O~(kGCyW)xCZ^ ziix`pCc>%xGkae%-7vW1K|cD)o2U1b52x66Fw+FMq}aCVeNA#BbJ}bC2NmbU2SyF?&sy zQbBCuI7+A&H_vE$70^K8CxoNsZ_mcdY0sZ$J!m>>Ecy;UA>&g$}wX(lsBKR4LfUb#dx#AgACudLg9|g)^;C?9#nt z${SBr(PKKSplF;h(KqNbk1r$SLrli8Ve>6M9PuJT*RByGb4W3eeJ?fUBa8X!GAufD zUTf&zw8QvuRh-0_VLUuM4i$>BUR8ubz+P>{q2YsH1@ApOhGx0x0v$O2ce6&D#>W{K z;Ot|slo8sN@3R=f_K6e^F{6y=*FbIW)Ns7`UfRy zjbsg8y)}9TWP~3U?*k`V3G%_0FBwYotC^+o>MW#kYj5jND@gn{$apwka>xfb#YhaQ zK*F9nAgZ2UV?7C8rNco$q#_0^)_*V5ONf9nps)33W*MQh-~fr>J+!GJ<^gJxcPRRsY4oL=_jM+Dhob(Pv8M!g7X93ha1+u(vbe;v7uc+Vo6JCn z98on%C&p4Y^fB5M#A~vWiW4@hTy!HRidQ)H0cbyc{!tXSuy-QpG?lA3br3f*Hzgvzk3h#M&NOi} ztK?T#KKz+0h%10-Nj5CT8njO_!C)X?8MfO;uKDJJb)(4dQ|!w79D-4mw%*XSQ%&6^ zTKUVUhhPJ|LIi_7Kyq&Gy}EtsUFR0d-rVmf=FPX?*h6OqzrMZWieNG~jcxITRAQ1VKC zpd$|z&H??45)R>GNSd8`SMn@B#~>jt>?V4@JdVvhW-M(&KH++&@OSE&qu${yYR`AF z5a$~Fe4o$Cm9~)R;_P#Cj+tDqjgF)?3T6Zm+*cvtEEVJ6ZqM^{-x7WS{sjARhjc%! zOP#oHJs34>)1^>p>|Nnd9bICT6o`cy!w1z^_I#vl?TOUZC8H{KGbH+9wn9^IyTnokGp$8vk6>E1^~xM}J>YlMy}eRl_K4lHcIRel6|V4lxXP=z7TCI7Bi3FeNdat` z2Vw`;Ma6FUBXwV%##wW-#`W-3si2@dkF1EPnYp$P!X?NRQl1EtY4z#`yQ;?9hB6B4 z9UST#P@eeIkvt6wcGA2A8=jf)89(-Hl{=2YhzTQ#jGzw_yjb?P)>;*~X>25KgieugMHqty@RV7}EFJi898&m0=}{ z=!gyT5p@LW_hFeG7eR90KGQA2?NU5w0ncO9Z}re#h8zJ?hredQ0kIMaDEx>$ZcgXk zP2s*be0~MH;BQWSMpTuP;(}!3aOAguqy-to0@a;2j{OPUNfGQS`~BXuA{fqb(+?mg zG6xM_JuqE;~(!>@qmxWY8!( z=zhSaQlVK><8+7+<8J~KYR?qePW$TG55D+#LWD=hul3LhGEcMQjflyF;CHIPV`(}K zqYFsi!Xq?{cl1nQ)Xy;A=zUC(!NnW*0>|aORqa^x4gyhsWkDP#QiZ#I5ZqW1SK&B8 zVXItcQ1@Q?vKT~I(NhC#{9wdYa+0GMSQ!XChae25B@o>T_hDzOA(*U#@!JCkbPpeI zdoE^;v_8x!7-M=+WdhWv2e8`N>)`j|IxtWcW34t8T~f=2i%6u=TGB<(2|DyWN~o zX4QckKeZnFG2U4qeQ9rq;r0&dPK-j<;|WYQ9hDi}EyUtx%-(@=v>-0WI2oT^pmed+ zJZC+bZv7?S$q&6!Ckx0GKz<7ar+kspzmU}sw$L^HZ*gy)=Uidx@2<;e(_z!kGp=W4 zT;$r+&WnG^dxQDQ|B+4v%fHANoM;V&+HrOhrJ?6~lCz*?kShV$hc-)!**C_c7#I5j?d<6Iom+`LKrD zet0mc&;8Ne6Ue1C9?CD1XU%>&-L!DN6mr{+9OrY?I~~FS8yqmS>+YkSws)}AAzXrn z5m(iaH+)cm?)a!sSPVncl!7%oQ36#&+=Y#>tWw4$`xHEB^C^6qGw@SjDv{i!#z47s z66Bn;rAtzuFk;%|poCOm6JX)Ycy$VxHHI5z9)N4Hur)wzk<5sXi>|#MrTgDe%$0BO zaHKF+H@Z0`D(jfuvg}>bDhzAoIVsZyfgHFg48Q!soCW70{63l0?YKb6K)R z`=@TMcPZH-sB>|!&s%(4CZ%eCxlqaLXg`lUp*Nw0-=z^+*$TEp4)IyMgn-w_F5zjD zP$$X4MaDK_nAPZ{SVf&e+p*}PXJM;G%TJHpaVHB}1O5~i8C#(`_X~GuI;U1<3fQmt z-{Ll29&7;0$llb-_?KRcim8Fazwt(n;eT4ACg*fx7wk6E_*VgFZ4^tv0&T^>4S4f= zE(1&yedIjK0Ath(Ab0Y;BLpXc<*roDYj^h*UTyPNtfGW2{s&2}Dsw6NDO-z7n#nyy z>6F*)DAzwu=%-?a6yBiJR7(_zdpLE)XVJQGJKChGyb3rMS#vSBb6QAjn?UXbW;fixfQWF6MsSM z*G4w~1(%OaXh)VTmUwUMY&7kDLHD_^2N7lsngks1mwGY(rl`Gn5d{<+>;P+}Xl-t2 zW$OB;yXjx@W|ltvpS^uUOBYRSJGyauyUXd?>RRh`RBV0y=%o7NFhBPN{6S8$&0~@` zrDsW6Uc5`QH{!Sls7bxD2?c=x&*X91mY(?JK7J?>6*g9V*9z*TmmYwciL)9)Bs}zG zf&R5P43>bU={~eqKbMG|3L=9gP2C})MPn@!jh)76UxuxqXj-E)6$HvHFcm6fUP({S zqxfjQy0835*!A$?_@(Lz|5toxzFz1nazCU@GuCzGb~$;S*mBh4(X?_36#1i=nLXXc zUqWjbc^!1lIf4ku7a7E_9ooJ=<>i*rWAWM8>tT3G^VV12Kc zT!Y(vzfz@^YjD`>B00n*3Vpy%*OD?Fgi6ItU~HDq0ndg3Hh-kaluA@R)#*SIu%Wo* zw~?PpKgSxFsF)0ra8Mde?3rPrU=T0Y+E(n4%(@-AQOyGzNFv31ms(WDVm4pEll^!p zSASnNc6CGGmeZGn-yY1?ub+%Gd)-Bq+aFD2A;5+IiA<{<$+m%TKQtwHVcC^`Lybgq zakBjMb=gA%H(UyDMU--gM+J4EQb7rUJ(45SCRJ8xpat&b{ukFvrF&~F?#psN?A6E^A!W?K+=Jz6~kKa#p3n?1YQ98v`+$CJ;LR{!r)fmcm+&vo*=!FgXS4_ zO*-_b?A>rW?7v15YiP5k1Av?V`$G98S?upogd;$8eu55_2Tx;SoStPC+7g0thW)iH z%|>$3xZ)*&d=9tlX={2Di$hWqD6+HOPbR!4E33|m6c@`4uBxl+wC{_DD3ABo09kLG zRuPy4$l|mLnCbLj@7izpNa$23swz0fYjqwDcH0Os)JU^U@>hhzG4NT@t#-&i&!9B3 zYb08sV;^pvZ3|CSfVXr}q0#-Je5m)S10Cat5j_Xrp`sMXEi{U+=QRmtoUvmDNlNNT zPBMjZ_%%-m<&tD|uo-<~`0SB7BI+#{fM4pu68;8V~@XW)94w6gtXh3sMfD=>4CjT)^>jH2eOvwoq52DiM#g= zb<@Pnw`GqTgePz?u&N!)lW)1*|Buqxe6D%r9X;9E#CAsw_kgIJ_2j}XfiWNmF zTWTnx*PD&O{y5jqM5xVR(2&f+1vftK;W&9Mi4}?je}*-6K@3Z>_cmFEQ+c4m@oP^x zt|2{O#Eu%6J+}nj(5slKzXYq4g3WU~5%YTGYw2B5k^Y?LhMvUtq@oR1E%9m(t~8C0 z^Ogb1IUWy9jYeKxOVQDFnv zgXV2_vRoI(iX3N{rIi|nNta%Wr5ucp*U{(I6=N9Nuoq}9!3&L)CNwH~;9CTC&|$}! z5bH)Nru{g;@=amFP~Zwre>brUGhijY;BM4A^8QEb)Y6YGS;g!;Qtp@msiSo!RVA3Q z{i9ZqQ^ui)BNZdj>Ks&~j@1MbDzrvea{|^Z@b_UJqoXEWyCP!IN)>$HLDLv$fb>MZ zi#E4?z)4MS7e~y`qk~x|302Gc<{ST5X^>a>Zs+vvG*{E65M>NTR0+|6%537LZdtm_ zaErk__e63|Bw>^kuRCQ`C+(83k45Y*{E!uG`pq-&Pl~pypcGE_mw)8?pWpL9*|d{&)Ucrj?REWqHyyi|I;lmO=lI( zr@&^Wai9$XSj;iN?|+w%F9`sDU5yC&K51Zn)MBS3Af!cSTkSxXRzCh zoTlnopD`zJV}dc6^Hqo&x$YTmQPl2EF;ZHkvWDdYaWD7gZy;QV#hV1tj-8oSPbD{!(VhTtD!%^=AmeEIksa&SYt6rjlk7!fGhDY`Z_YZ zH0LPJSu6Psh<>OB#d^j6Y>UMmRCy|G?X0Q0!X$PPrm& zEsU&80tN1j`%|oLjqyFMYT>Ak>KptcA_jKCph~MK*4))*>9FWiaxJs{eMaTA9{Mbk z)pdO1j|ys*<4T2KumdfqXfopJi>I37n~x@Qt|)$$MT0 z?*vQC<4H}FSrj5<7}MG=HT!5_<;~{@l1|JbmfoC1?+IpZ?DWtISIfn6AJ+( z+5V8jv5bCVaiR)+r|c9HhY6@T0fA&!KqoCweH-`|A6yok1w?ti9~zM}{)ag%fEOL` zBQ^`#q)By$XXS45?(+T=Y88i!N8SHHlUh-;At}UqYGKduI5aovy+9crX1wv~(u5{2 zr*ChS#6>J!^w`kjDG5Q-XTy3s!%V33a6IH`;H#YeI9_>mF(;z5zN6IcUA{_3ON<}i z6uXfFrM5*pIhC9^JU!Na;$lfbX3N=C+%s8@mL@wnlYS@-tB{*EJJ1*1eV~Z&Ql24& zY(knkt>Z)RoijEg(1G`|P5FS32Irh~ZR_3Of-^nuYUj_hVyQR>f)i%*%(Iw=k^x8n zy?WL9+eCK0XhDuJ|i`s)BR&*UAQ*64$8MNIO9E(FIZbZ zBW93;c=F`nyS=B!WVIdQB(t**F`@<_v2A>OJN#{D73l{HZ2K^qJLJ8O?#uF75@pz5Tn>qseIL@tIa|K`j!?35v0z|uu|y}tt7bSjA2XU(f=QmZ9{IAGX3NV3 z|IE8-pl?~{Sy1f^4e`xIMVUpqJWBJS$IRyDs*ky2Z!86mk|%cS$7@FKL^_@i>l&@k zJ|1AD$$wk?yj<<4`2N52XaJnHr;%;oir7TA=PY)M?8!R67+7DIh6DoosSZEgYHoh@ z`}Kr69|NMBvJ2wpw5wB0y}H^7fwS>D7w7r0`*V=$hy)3L)uL`*$&qiMckg`vwV9qD+n|U28Ua82;JLhNhJ_8Gu=x6q14j#h5>4~ zpEdN%JyO7Z!;1ksRP=TiDjIS{!$x-%Eb^~enhvUiI<|P{f>!wnv<-Pqy zxj%HxO90gsWb#O`va91zyVBSl;v5t+*~68*3Eakf{aSM)W$tHGg{6fqC$Gozv+815 z(f-s#ME>ovzodFUI|Tnjs~cd}tpKn*=ozWuo3{({#mCQ3Qjk3Wv#wIEK+R{w{gAQY z#}(jE*cRPsFaY_v55i*%>&?$sp5#4WQzU4s3>T6NuDv{WDvh1bpV1TLVBb-Lkwib6 z7^|1|!7|ovG|b=9+>hr#!y>6#eZ~1OIOU*RDfMxGu$&qUpqNk-+)B-_qa2)P#B4`0 zQB&Y#kVSxI#BjI>L{pqlYo5N?R7CP9ek3iFI`TNT zcr{!Hzx&OpQp&|rr{y)i!-kd*sy!U*H*dhfVsCW&R&i))czSGEBCLJCuSICnor2s% zrR2{KRt#*Lq8i)a_{}}2Vs8^#Xz6U|h1Vd~J26+j3PZAcpGf9wP;pc1trn}3pi81> z^$u3sHQXH`Q3=XO%2(}^j+Hnaz|Ail)Lz54-jAEu!`0c@TPl9nL)mvOy1-V!x1OwR z@skdorU#QfvMyeGcFlB5BnfXInTMsu2~+5OvCQEP@?aQ{MlF5o6~hmK@URaHm9+#b z@15eTUPH@?m2n7)zM4YF+|Z7_pLkBz{#fE$fKNVqX6;hdf*%azqObk z#V!Xb6?Ho7aO~^*3f5IA;QDl4X!6g(cpL=hqg@#+NU;(VYAVDjiSYY+)VS~!3-73F zj0fcw4GF)qr-oD(m@o=w)FAei9r}l7_9OV^UHU7`M^}}Nm6600k9-S0qeH$dA(;=^ znAPH@*Ofp31`8x|jFWf|CpCU7UrE6^ANT%dX?CgclD%qivoZC{1xzc2uS;b{7-#2K zpL~W=(3y)V2!j<8K70g?XkXxC1=%=NsB8*bQfqnzU(2pTa$ybK{_-!0+Ea#Yas4EHwEcm#dtqfaD;5aA3dWgLvr(vzRwSfN*^5jl_EdyWKucZ*B zLn-%~9v`MQSlux^ zP7I0@+F0MGlRD#;b}I3H5IPcqhJ-uh_+9}r}O3rX<;_KuEmZ?&*Q*Neq@^A}w zI}dz6Ia)qX`~!`vd1__19Q)ZU|pYFb^g23pnj1=y>qm&c+w#-{5AIY zU-LZ22*B7w7BOIicqodV8uDnlRC3W^L)tbQ4$?`<#>Z z+dRPVViLvEfw<;CK19$|eIucY?MY|JlAY_GZjhbXL(#QUIW_>rAfxAc2g~9}KQXl04YKxkbHcB|GnO(m0 zX;3dWtd(dio1IVNS}$qW*gW^nCG@C9P5|o{`P*~$k{76AsB8WtpZ9lVtMKgI#Jxf6 zbpAGn#L@@dgrdvTyIjX77_BfgGlfUr;{MrHMScgIVdfxl+G=>kpmVf502w>XZ{ zY%6CMq1(@2GPZ*j^x!_%#REH(em1G}mnZk2!Dqa8=Q%HEp-T3kNh; zkQZ~4M*8<`&EI)m%4>cGEm6KuH&EXsOsf9ynO{uZ=YcKw3X=u!cVc8SP(Uqhmpey@y@8kX?3K$wN3$xvxt#ZpnOkFz(P&k z4wOs>V<2EeWl}Y+_u3)+VtcoxPD;50+2g$GizsOC(Iej)r!SfJ0FtU$doJW)>)lY%PT`2tWW$oazDZIOsHmfD9#U zMZ8Kj!MxpQi?@y+3!#HQev1eBVV4)pN}nvw6X&x4`L{4K0%L2S9n*IrGFyYA*jIh% zkY6TnKa_6&QqScqpVxQ|IA8C6+YY9B5zGF+1>wJ8#{tpYGEYKD+GM5^2{rDHx;nai z6cU&^;#0YL2eO68AStHOy}e>@d-&hBgaDBegL}T>g|>|ZrczYp`0VlB{>@d-&H|@5 zOt^pxaQ^ife|NkRhgPDVRJRqn0fSOPQLk~pbXBE0G!kU$q=nd*e)7hU$L)FG>|_O@ zCgSWI<)|~|k9=-fc82-Do=nZ?kVZn{+&8m(MDKz+7^J`=vu|ryLL^|6YNkW`y?S5! zz?=4y*M{Q>ZQOnrEIWHkM6}ct!slFgY-dW@L8N81LAszJg_7!*Z)|?r1AchR-sF5+ zGon>)o%Sv38n_np2PV^*_mF*swQ2B@Fm|PL><%yUJf6zAjch*716^qYS-Ls6_S1u0 z_BIge$>DwJw*ism#bW>Cz4%)P_CJI=93#J(0lHWLBaY7RzmEO%RwY{k2!G~;<){&Y z>XFPMaD=0fe$_Q59)@skyqkYj*C7-RzIG)<_3rAp zx-U@Z_U+G6$gQ(>8iPFtU6FbE)ZsUu6mGY%Iw7G{L=O5e3;o%9d8q~LGfJ)y{Iz~) zRs*b7Uf;=UIDWn+^QWUVV&M1w$U;c$kH55$5F11Sxm5KyL*h_pyI6i^C(!OdoQ5L4 zjxAZiOVC2dbQ^i=taiR@6fteAgrA!AzQ>p=#MqB#zgVF{Tdln4>$w;AFN8cCYBKC5 zV3iDiyN)jh>0$;?>8Znqe+9<{D`bAm2V-^%_9+1gg!!T=^-o#y)uh5K#BipBncXnh zG_I_pP-z@XT}uJ}&Aw&p0a{5eYalnW-Cp3cmF3X_m5k?JEAEfB4-a?u5U(Ov)8Mgv zN+{>^bJKf-3Z2@hqTKwVCcpiB*U0e>YSVfRpd!Iubwoifjc*S_F@fyEY`E@J*oGqw z){;rx<{*l!suY}|oUe#h(?!gOZ)F$eh6aq3JxYvNGLJz8g;e(`5H)8^XEKM|I2GJI zK9_!M6*tV48^Wql)qTy#C1sO9ihqFv+<1$~`$mxPEp3i-ZZ|I5r zL1^_iJKgDbIz-{Y>5w_|HCu94^^Sq-w{&<71L0~?Z(SJ*tPqx35Oi1QGvWZ67Oy(+ z*U6o!K&^0`EU(A-i>WakM_Ze(3T&XL-s^c8=As3DYi-8L96zPC7>%Cli?mhJ0mw@8 zSTfQ_hBi%oO3KV0dX;Sk<5Rg<6aAGDfB;APfwzp2V>#vtU8zMGr30F{%aLyc>3}Q()pap!$WPvY z;3D71+Pif3c(1^wSJokG>O-{X+>-Tv_E#a*u|yxvq7QO|Q{I`F#^;q+!($&KToIY& zuo&!O(H;2I^4&hCN!T--4ME3ky&1i(~2n9F0AjHo< zn1>6_J1@V1A@OL)R(rVcMBE<3lHU;E4z8iD1&n-P4>~s!$VctR$__fgo*~w=wyBF; z4|#mL^2xXdomznS3jJGd|H~HtUt$q|VG<)g%E+|Sp|)zv&B`Kyz5_x7dkptmTNi_* zCryk-=J%R$7#x zk`MWAL6fzBy9N_T$<0!6fNk`gR1$?-Jj%8WE{)Hi_0lIhvN=V7%hud~YdpD(saT4- z=;M5rbY8!uk=%l5A8N}!FgB!^b)3t8)p-4uS>MU5yw1;MmmP&K8xGJw(%l?3avL81fwEbsG z0y1NT+nPu%H^r*#H`^tUF!Q7f`X#n4`(GfA+GTvL16t7|>6&ZVn#sTvbI9c(ouZw& zn|9U`gRTi^*nQkr*NAh7^J5SQh;AWoXHiB3r0wu-L8VDP6JT(q2H5vuSb56X^$lt3 z+&cd9x`CzMb_)Z<9=qSNFvwrTadBN6T`NO-LorJmLpwm3EU0T?Xl0;l_XnCp{tt=c zT+@$rrXZH}wW!ceb^Z$)MdAcGlS%@_$Y>O_CSuBklq=;k!4D`1Cx8LZn^qA5Biu$? zNekw2(j@!g!_=fXUN5hEaBr29%2!yxjm8%+C2pD%2R)N{r1nW>vx8#=%UK+ZJ(CoC zk$jGMFt)&3Ge;fEcUL`D8r;fIh+Ogm4DY3-JOv!13@eZkdm(&t`4x`dTq3r9N00)I zoHuKsPV^X>ya56dIv#ur$K(e`{gIhawFg`GKG048f2Oj#7*b7@)(=z(SWT_9T0)B+ zb-myJv^=w|eh5-CKE6;ne>-P+C(=k7dpFwSs^A!THk!!c`vlhO(?AB|a(D41g|*&m zA8x}vm++GQqWu&{s`uA|Eyr)CJ+kX-q(@fdKFsmN zq$K;fAz++nK7M`lx`)h4PL)cWU~BynW>OR;!NdiU60bxL^d?(7Ulq--7Ct+*o-xxT zx1)gbV+p}Hj&15?06B0#(NEEy-0n|k7JhtCjO{}xvvKi4w7`Z|iZ#_IOTmU>L<8mA z!|=>`QMQY@_~?YQZ4fleAMi>y)Y=QY<-il@wL-eOR5e4pw(4C#yhv1qa(o}BJ20enQf`(rA4zNL$eaa}2%+%LWx?^RC^l zcGZa?KG6}PhN#QVp454jMt$KD!j6_7kQX7p{t(^HExERdDlN8VMzKibl3Eu|cES|% zrQ>VwF2mQctyOkKBGeFh+F0@%h^Ghy29uDa0*FAszl}gI4=aGHVgxV|HZ=I96!)Ld zn_s}w+`oXQPvU@8KeHAmQGbcX{ZkQ47@VTK;Tc+*G2RqAsOiu3H|O_%3&#;XQ-R(7 z0N99TVxrs1M1xwpnuVCl$$7>YYl)kI&1%X3sK5ArK%lDLR2gl50B-G}5J zl9?`6NoCaX(T*l)q$MDW*H3363cLc)F~@>~u1r5Bno#zX9$E_B!Tf~&`vQB+aYV2( z$?LfdC)pbr_oV!~!96+!(egS!qEn;K=(CmU_Zv2=__^~0gnjg2O+E~gSfcBwfkE%6 zBECM_@FI5V*;87uoH$p+43nhNa~@zGsE``3ltd#%O*{qKkGq!qgdCP``_9KAU_S1M zJbEmAoUCawHIg0NG%?kiOOhgb+QmiMJT+w+XMkZLoTFyAViE6X-XFJ-yf$v|OEK%g zkH`@`eVQZYG;Y_x3tv;WL=_^D9H}{qc{fiSDL632{V6vQuJDmN=9`WD1`s zhmP8ABArGp^uQlhIT}efw1oAT)x!1P#BAHn7a0+&l96mPft7B-P{#KOBOmMG)sAn0 z_DWVxU^U;XLibeneg6RKPi>N)=pa7T;n(mrxgr(Zb@h#gYU61yM*k$Cz|4)3mlLmu z!ckBY1tkQV;q(T_o8)T=-_DcZM42G=lCM$Psm14>$~UCqz2t)7-`k7pRXlyjXcx>z5i-}hX$iW}GZZkwck4rhE_ zT?1NSYej|EhBS zGtS^W1Kdmg5oekzJ5vYa06z4-lUcEYlX}0P?l0qwZuyTvcMln_I?%r(jh}xYf-3(r zaPLp`fdBSuQAJe~d5%6Dvg}XzJ|F zVmb!x8ue|YkC+A#Rc)fA{I2^OAx2Dl#5$;a6p-roWEX6x3`W2R2j9*}nu|t&d_+!s zZ=A~h8q^9^BW4zlxdFJWijX4ZYS;EQb1j3oteA(CPT^|<6O35mh#)vLXsnQJ6R{F< zZ)KDYq?9L<-F&1}gbz&ormQ5C4CeRx&92}@fDWG1d7WSsj?t+u_AqiCs_~(!bO-jS zRWE^!p@87=UP4@#?ZV#ct7wj`0VLq(JC z@Ft|-RFIR*?Q6(q-lFv!mRAhwx)@J=##KLue}DEvtj|unFw%q*nBAz0LHliK4KYa} zVy{DCA2{qnL~DRIiK!6q?O60Q(b;8IgQbRopZ^tQ<-Tar*SsnE&c#$Ln1ZeJ&_w#! z1Q|67X~xYWiiO=ueP_>P&}~`$5l%K0i?>wZffIWubyS4|HQradHU=EMsrFQ~*{Xx5 zTu?c8-8MmZoTZN*IOfMzMwT4qTCzgl@xK=}m~Ft*m>q*SmfnANj2PJZ>7o&??_kfR zX@r3Fou$534K;;qaF5Y*rE-ooYsTPuG497`RrI2c(G3bGq3ntN7xe@&IESPS{l-__ zy8N%3mOOYtzJt9NC0XnOdUCTZP&= z1X}~oobqgnj+*FXt1M;)pYA)#{&cSgYb93=zc?->9&wK==BsH~k&0F__yj+^PVnPT zM4%EbJQi1`RCy8F>MV4FqMTfb<5x(|?c|=&LbL-rrtVBlwN|y=~Guma@Wta>Ts^A7~N1 zFkzaI{7@!NeDSmLz~ZQHR}uj4~UFOxa!}{}uEN z`4Nx5`A4TdZI45axOgYl#p8s#MzGrWS#0;53uh7i>xza+^OHV$C^45PPF2ZEebj#MXK7XuSUG*Y+B|-Y#}x0R zf$atOLCDCha(lHP-iRB~0{D496nxY!n7c$2(ISHF>8rxNDJ?(es?(pA3I@R_CX|W?`?(Ogz~+Gh5b_(`Val&s60qAf51mhe(~s}{mY9O|HYU3vjim;a5S~} zi$4Y6KLUUzfF|OF?xCQiM~meb0S8^7MG6`Vq_hm&4QAMecEL3mphs|V8$E}w{Kd7k7bl-h_CkXn}=@`~nD%%da2 zvVZ2(eE%tm#`;}{KIUw^xT_nit=mx?ft)F`5VmbjrKp}a!4Y&>o@Nv!GVNTD`Q`08)VwcS7^L+=c1xc#MV(V7)#N|-a@sm5ZOOor zSkixB*kngpubCi0S+rS}cbJFn8Kq9i8kL&~h|NN|tmo$uIJ3Il+)Hn;0)K!1#{IB5 zw}ItyvT#}h4!Ffhdx0YP@YV`^T|6qrf+BD;w;T53m6s8&lN7~RDchoBfVpmx?nPPT zgU%?p&}bqbFVTgtg4h?Ke6FMLtIZ#;!L>br0)iz0Y)6goZ$HZ|g1cO2qqXlwt|cw) zW16{y1*yh5x_?xjB1&A9hwwCuNeX!mFc}ffQEd~>aiJ5==^4;4Wt0139_R|GPk2`Q zqvbR|BU}t_rL-~t$M>Z~$iH{{U!HI;8xAUa_5fnN*K2LtNKz};XghRu8+m-30CXJa zP--%9LrPUU0r^()n)M>3%}D?ww$yIr+Cy7g7reO@_6;V_xd?sJ`@YDg3a+&9uXk=O z*UQZwK~#@-E81QltpH~uAP~^2^a|s^-sC>Eq_qx>JlVyc8H=od z*Fmr73+EE$BJv6~whcX&7?9~ib@W7d&6zDahyv$H@y2Es$5Y}65RoK+fe4W>hgd9n zrYxP+YSo27^+ABgl;p^fg3;o#YWQ>vgivKv;@rDXqG~c_MC^S@vy`P(;Y5QxcIT>) zn7ayq3kcB`Na-_W)!t@wfaOYB?g~uFrtmf4qYYf7*1a`~*Mq|6P6~q#iXFK+ za2qy5Qisfy!79wSa6lW7@6c(Ba4G+8x6svXb}c%#!}okvsyTODLR5%ljlM16JrGOT4;@NI~U z&UG!zO5H)4TWRp<;bJmriRPqKDRnQw+=OZ@o2UN{O)P^pYHlGuAoW;&!+#==Y@AC1 zg?&3k!l|u_YC?CaO)s3ii7Qzv2Rw$O#E^+vN|y{arN*4eaw$2#Jy`IuXFT>D+D2XF z5dMEC%Jsx{4rvtio=-v2C0csN} zRZeZR7?@n8r#B`Q9=`bNkk_mq0by0R69P9?vez}Hv&C=bkZwTtgHM26vQf>phVnMHFDwo9yXc0qi<>oALR`Vzc`WzQ#c}(L zpm|gfc1R_ItaiByOG-+FCz#Ea(F$DR9ofFQXh8K$?u?E^_RHP{Pv;?ANZ@7cpG$#A zrQyP<+s=)q;a1zuYbaq1EXY9z&#SZ9Qxz`Vud%*LSg~~ZhCEI%j@ZoN&Ivryb`CnY z1Z`KQ@@ZAaK}(~-KTRcJPV4?1r~A7~%j~3ThaUP=(4V5KqgF#i_S6$aW290yjk~(x ztiE3KqI}5Gt;Db$kp04^U?#7w@bNZI*n$*rmIv0L;JiGf?pPCpf3tp4 zjnf?2F=KxN4!_d7mcr(q*uiRlgAV^@?L-cKrGIUKEp__@H7K9mJ-nmV{sta?rEd)j zex+-zk=-33==;`*E&NK)+8w*QZwDFs&sRZjHf;hszT$WWcjUAEw84mMC&FLlfwqq} zG>3mzv#pz60%O4)!s%`-I4}X=KLe%)6JEYQIqz-TcJ;g?9VWzNb^7wJ=`^@L|D0aK zgR}A95cgnXZiNG_qZrLtylXN+O*kb5fXFBV?=Xu4Q)7IY**5I8hEIaxoJoMAI#6)G z0*z4Jei`A0iuYC{Hn~FGb)SsU#;iq{7GwujD!6n?66lAN9kVhc;_GTGboCYoE&Q6M z9##3Zk^HN(fc&iBjzBgqg0goQxSga9ip8WAowEkFW0nm8RTeQ*+g@TLw?;T03{7BM zV(Wwr1=FEr-Qa>_o$-%Z?uDQZ>xpH}xKI4 zvY@1IK-Pg;S0&|@C@zgMk;_o5ZnaT!ZXSdmTB4R9bp7~NJLnh(uSD3K9PVeec~56# z_CgyzUt$f6+}UWie#&&bd0R}>19li)=3&L_n#1#PqUQnV48nb*-m3P_`GmXlg8B&J z=TFeSU+Tu}HJxQffZk&$^6xUxm;E(GU3>F?WTAhn;`~ao*8WPe?xQ=`4_n74#})t3 zJ$&~M-NV1D{{P)y{L`4i2lF|vGJpa$Ef4-fFz}bDfMx~!nIj-)3Ve}O{hP7-vUmEc zmEmA$Cum`9Z)os;cT#_@Polm|8bAE%o&Mpzk_t#GV-@QN|1VdC zCso8}dldpv{}`VqPU1NhrfPK!qm2b9rOwlSKtNiq>PDvF$Nd+;0OsUZU@m>WW<5*OU z(0~U}9AFU!2WSic#2i7f2l`vV^?;v0Cy!n;t{&hs2K@GOz6JdC@3dY2FC!RQc|(9D zjJ>IoA^)>#_8$J53y@yRsakJ*w;&j7!MlHbqvMd--HVj8HEX_X{wR{W;WR= z%#$3!uC3GW^e~7)+ML!qB;|1Uu$i?b>2T&6kn1YoV9ny=M5QI^i-=1D#DNycA^r0Y zn^&pg7{?srFStQCG9U8K#}PSj*7-RMXm(59KNz2z4$$UkpI)%!?D<3Af;%ns8sVB7b3MUN> zK9rmT$NQ@{=qNMCn-7K;)^GQbnZX?1k3&I-HFi8}uY^R6flC7NQc*xZ@V{GM^#8R- z0(MV4cL7~HJ5xiu|GYR>&xh>juS0gf`SVY^9*_L2pNErN`JGu=gOh|WZ;)GoKV~#6~^hYWq_Md zU{nbzR)Ji|JF7pkN#mnXB-QV5+JC=c12{nb1Y0E-#zDorD!oZ`78Zu*Ah=D%&Pny1To(TM&`%?(XjHZt3opPU-IM zE39D>QB@urAYpGqMVj*}sRg@nw6upg~PAFHmV-bfCjZPmq=kmK}IHa4EWZ zYj5tcnOg4mi9wgj^{Vj0K?#93TP^QXubk%%7m|_?jf-7|zHheF9-6+10q2*e{cpaV zu)O|LquGK?!t+VJ+QdNe}+6AEY#MccWi5l~Yt918t#@bR99 zb5jiz<|*NfrIzB1+2bah7b}adeH&!k@87joMVh*z=s%>dE7XY@*Cg|NmaQ)f)4`=* z@MGXU&Vk^RZ!`0cCcXdk9{)MxU@5PRpEke2>jre;yp*`70gvG+!gjePqi?{tJvxed zJ#~@+txM)3#Sxc^njZXEO9sYbeKq}9yR`wh1T2+&L)~lxx3jX@T2I!vs?NpQ1d6V# z<%0}}`9}6`z$1o>o_;9CV($!#;pd{0_i|6mDSGq{Xj z11=HUZz);-Zm9nw&;eLNf0$n>TAJH^A5#5ABS=b8S6vms3hAn;3D!=CZy?4s7eM*Q zm&tL6fs477p4d+uQ8!!8pPeoqyd%M4eJ|Z%W_!TZad7DDt0dEfEx8RIg=}Y}>5=2! zWsLEByLs*lv_bHs#~03b$g`HetJ8g2yZc&Y>M9jA@%YH}m~!3Pf!D02+m9N=6!K}M zkctYiEZQ4gO-Ct=yCL7#_^7y9&bMD=$TAym= zOT|6LM;g=6?Uv$JyxLW?mGY+$QR$ap)o>+~XLr>~%R<(%7Y#i>wB7}|?8b%;;gATh zLwftRJ`>C#2Aa|_!-Cml4CK>=s_+GOuNlH0s774v1AI#;9RvM(o(FAS-AS+8BBzR^ z_&E#>Ef^EXs1cd3*lfRNnvwZr!qa$s#;gvJPoQz(Hxf3W%o)ESa);;Gj72Mioo&JT z*+3?PI}3g{$(Z-HB+7mF0eH#Evp1lppTQhMs+3|k^7N&5`qo4%EtF7SyVjuH?j)v> z)`5j?(0UxDZgn#YUq9v8puqX;9{7xsb&<;OM!N`nr66Ej(}Me*vsUD1Ij}0T0z1U8 z@rS%(tHX@1o~xW+!Bh;(K83rpS@C+=<$k4?|CZeBB**4Eh>&lM?ZU-y5`?uhA@tHL zV11|?@nuQIRI3}8BsX=5RDj`7RXp>Qoz;JTTrX|RfFTtXZ@_$hqzELeY!>>J5E2o)(cDmkTRoXaz7M)Od7X@3S$m$_6*c0O@Pa3zYnI zv|NPat)(`Qir&}$&lcN0qOuPN?Ist-8 z1iIdLT!F5XUotjai>@&_nokaZo+yekJs!P z(Ou*XD0@*9c4A^%z*71y6O&(f=Bv8fRoZAW(9KJcPjM{dKON(k==a{?mhG}$5_~8r z$gq=C&q$9ChfbXhx`?PQ7-Y0eU6oTA&yp7zxT6EUatGP70ofz)%1dQrXZKC=yT|F2 zANPh=6yH#k?ylgIX8ue=!P;BVn{GfrMZwcMkILl6MqQMre{m;2E-0OI44rzeFUTCT zWs#%ZS4sVFg=JeLXC9r!2w9EoPkTY9RpNMQ*2^QW@r0Spxaka3302-#j)V&NZkUp? z2Gk9o7$C-Mo#@WHU-=VRpY!$wjsdv+AK-qMZGRmo^lc1{t*rjb8&5g10|tPLg7z=V zX9jyUPU6{?mZ>><1gc?|3HOm@k|Tm5?le>aept$-o#W#Srs` z*KJfT^c!0nt+I`(=|GX9$5pp-WJD+xPxeD$nefQ=DtSp3(C`xA2$Ar*U-6_h%O}HQY)oAu_YfQCdGN+ylc-1(qr6R)NTp77* znb$B}Z*T#f?l=%1DAHNPC#co= zaHRebV&{}EELlyss@A2FL{1kt4vY{7y`YX6=hp-zq681oyliei7~*c_KFTG4hrapk zgZ~l}3%db8F+gkc4;8JSn0P?>JM2KprY4t}1u5Jm)S$91MMdE9qtVQCHa@4=M0P{d@drih79<`VwAb2NDU}=O(U|gL{XE`Ock}Y}6~Kyo6H)}> z2$c~!*=k)oA=1*eNaq%3ELHOYhKu2N@; z>R%(aeKa6M!f-dM%bf~~I!ypGJ+R}tvCG-wxYnjs4VZX5$=aBG=XR78Hx~UqQZA4d z$}#~%2WBLI4`1G&4Jr?%OeaS&s4-i%YuiodlRGJ)ZxzXN!BM_BZ^O&FM}FjDz4c0h zz!@(w6h4owV6kK}`$JLn%=U?rN6|XLu1SjX<<7Ob2`i22w!wz4$8?T_?(pJ-A@h%B&7W)($10>LR5NB#ed6 z=%MPjZD5MHr+x4^mx7R{?LF(7IBllF*FWxO(;bN{nDNDC8JJn)_ciyJoU^VMyN!TQ zes`9JGe6SCx8Abs3(PS1B016umIAFy;g!9JeyJ5~X+HRMxifC%mEog`#b=5~go;_s z(O4o&W`|dhEuzD(Kgq_zRMJ+*>1i_G5cQN5Q1v#V)&pPQelHe-UfGag1HirAZ-wkA z0mtz_i!eZKY$*W{^Z8!i|2%D3Dr*3NSEQH4aNlD`Ryjsm8kj>%-duSPn ztRit#?#)bxKoVO;@^B-gQfW8P^Cz|!MJJFnAl@~96M@j2(4YbjztmgL;&?IRI zq%buLbI+7Ss5I=kZd|tsrglqjY(x{^2oEx$x8P#Pn>K%01c>stY`cNB%7W2sp&r4T z^Qc5OpFvBVv_>42wY%|b$J)+;y&`i|>?e`7p_#bZg4V`5?;-3tym%>pX`c*Ipv)XQ zRQ-f!HTzMHvh>8RM*GQG&>#-w>!-#ExMQL2;g1#i1F~jk+WT&+FfOy;EKP^@F}K3| zjn-2R&mzZ6TI9-0ju1t!-UK5>)faYr+!CBZ+hQW7$*i4{!?yFOo{ag#uDK-DV|4d$(o3I2iPlC!k<^ghm2oISAwt%25QNjSp-LAUln8@eplrOjXzMne~O zTA83<(|xS2BKI@v>6g84yAZd&G=-8Bw2DlhMayX?t;M~kNk*?fpq`ZPCOUsEO8P=r zJ1_;uG~sqNSsL}4;uB#8Hw$lZjDpmIE@%($S^9}%Zr*qx4l);-TmfUkD%p%G(6dZ} zQXXZ#Y2FRwXcy?q4BaI1)0>WcF_h|$NXdp>!Ktv#So#cwdV7Ng5^j(wq~qv>tlM3n zbWr=40a{T+=ORcq7$g;15kyOc*;wm+Q5UlUly7z}yF%hRV-O8qCr?l05_<3m}%zWXxC8$D%nxeoQ9Dp+og=g4Gmqt<CuQA)EV4{OFbVnpm7V3v3RW9GC!iK*i@HF zk=@b5$Bp~EPYv1;JpomhbdB8SL@LE-3lBy^_MqJQVt{#M47`d5)g(AL?; zNyygKM(Vqv>CaeW9sNhQCoy>z1}ax z@4`i(cX^R>g}wY7AHD0YeA3*1(5Rzp_IpY2WD<(WXzDYC&5LG9rh;c@h-eevj$zQq zIC-4+QaHhJO3stDHfMw@p&n5xhiji%<+&j|j zX_y?%2xnAxWpgTN?6@;88MFs*YBGht8f=S4+)7uy?b8fMc?l+GqY%hAF}Zz*`?_tu zMF~}a5o-JEpm9?SC{y_5e2c^Q@#Tjxi<;M>gl6rye%0VP8PZkOFAZ?ZEC`?3>z@%V z9F6NV8dAcKE~r-CSKEFE<{JMqn z@8!mSV5uL>NC7KbLrZ{c;XhiqQHg)3>Ru87c7fl3p+Uh|@kNr{5tS+t4-l)A(b3L; zW`<0};;6YOCa6o?NfGQAB|-A~5sucH)}^(Z5ObZ3yL@~2+`*G||9B4YtXTHff-wMF zoH`(%c!=j#Uv;$Bh1wfE=|s9d%HRID|EbdZOWKq|ED_Uc$gM1nf}Cc^BryoBNFhO- zK8PalP={3-v<$wFv@D*89@UgK11uPd3iB0w3h0MX5n_aGLnaVZu&rbk%F3-c4NN=w z237*M=sv3vo>#@~q{cdqrPtsv#reZeCc8|kP zN*M*N9;0Ae&blHSR2&|6YbMS~d2s>YAQ9GO2ND!Px+xW9dC6}@&T!CplOnwnbHC z5W-Xq4`b@;iuHB&$}-o+KB{PuGMeiCa8bR<@Ko8SN%A_zu7yl7vOUuG5u+_$mTrD< zj+tyUJapzo%JzPkf}S$Zp;FOaL;|^Sylf4HX!ek7edCm$ouQoqc$)YSX8rPkn8gHO z7)!CeaQ)@I*87^owG5jnUitJa!k zC(+??xbE>@!wP+bTWGHg#6wD89)gp&)|miV_>1?+GA`nbJ+(49i*WMiJEp@GL~|do zgc*BSL7%ne!WcZ9{hlnV2?#=N4j(Ety|At5!^{o`={u#}X39$~KL*ijpO2lnO&Dz| z8$BI&FTUoSb+=o+5Rp6=N^FF0OLs3%bHltsShw606vCE1U-$hUipbO^@4o97HvSg$ z{JPHit0D7Klk1-<6A3?5Cj6!_Bvu?y>8Ju6tA?^vBAbs@2%-onq5aNa+aGY>hw~(1u_^3gGq9umv6LFxB?!t!AZd=R)tQINn({H z&h~HByGzFy597w5BGFoggu}XHvmOQX+*Uu-z`^z0VHFSy>P=SF=QmuTk!7y$JI92Z z_}OE4Iu3k2lF2JLK&xDMdqso>W@4~hsKe9c>J(5RAYxTes7I`shca;t0^^%iy zTWIU6R;3CX?WL5HJ_~f7i(qSq9uOKYDW27pqB4h9i=?cd=j4KK_6)7uIc^o%P+Pehukj|lTZBP@0GjkIi*4iep zdt_Evh;eVwJ%8Xjvu-+UrZI@|aNw(Hy^t8V)FFr#75G$2h)C=19h;YdMY!Gy!{Y+k zFZYAjparIwhRxKzTW@$uNO)sw>a+w%)3(D4N^3^B+E=vOuA1?@F4Wx6_rChG|& zMfc-_0wbSBXVtNfjUEc~_^)8R!9=)hN=)dLX$Z~G6GfmR>oeJgvHVMuPx38PD*Lnw z-*d^JK|n<|weP@>&Cl273G2V>22(vyv5>5DUYM3m3*jTn&uGmcM^cH;fx6zUEaL#u z$HEQJ$0BB`MAMwPOxD*kXf-av#``>LS#-2$ea%WZZmiM>dq`JYoVd32k={XA>7(#F zQP*q5sA2*63hv-O(%Yb}bEJ3r$lA)U@IewJ{EG2S3{)CE6!JjxtD|H&jOJ6Pg6hKK zlx-_a$@>N?Baao6ansL?H@IP{_ZxM;KvDUxA_$?Tokq#HV~o{BVcZ24mY6d{2!qyz z<>EE@r}kBo2SWrQutd@(HstD;tCWwUqn=cUgL7?K=T9^WTb)k79wdQ(PrWvlgpcRs zb%m468p#kC#Joq=SC_eaWeel~#3bZXI}P%aWVIDjd!)HQoy!O-)f#+#Hw7EI(Gf64!-WNz7lf z$|dO|1xQi0iHVw{igS`bhQz4HZ%pz0Yz^<~^x#d-_<_A$k` z=Rj7Eu&5J?7;DHGiUJJdsGkCygM5ggXV;`U&ZJuI&QtLfJgdSQ-T1vz9>*Gb^NR2* z##sp{icf=dPBpp*JwC`)SrZvgW=Biz)5nzihFJ(U_C zf`s@JXY@0uJqFW|FJn(gAG|Gj3hEXMm2W-74Druk_xyw0mqD*eAorN9peX3|S+>03 zu3UAwIJ}8#QLd!jNK%XAp+|dI4-Q5sA=pQV_*%b?Cm#m47WSP1s>nG{x~xM;2l z=H+`6cs2>c6S&<8OlnrjUH$0o5hh;(3!15h2eH-^tf$cBcGNG0a$@-hif_23*K2mj z$*iD;jjF>Bk_BoS^8LA0VZE#+Cqab=-ccM0L{%H@?wC<9w4E$OG( z&?;e;c0Gi#DeQS5%#s;_auDC+(=Wf**<1Aav0o-k^~6mF2#`jAyj2rZNP8vg5!vY zut%l>qR2%G%8FD6 z!iogTL|M&h2jrf~M}P{7nK}i(e+6{k4(Da}mX~Uu2teZak)PsoysL2luRa2B0e=1J zf7$o`u4b-mWB!N2N^rtwg;f!>!7kxO@>LjnXn&AA;@AR?*w<(Wylr3xnIuELEKqYZ zI}$a@B!gm+?Ixp|*T4@jS>hAmX)fu9&V*$Nb(Y|$A8ef>BCC)=c1Zf@|s-xt}PCb8j?Acu|l><@3}mj2^}5#4g}Yg%dhxd zsB#$FFOA+b#$}(MKDyi|t(A1VcEWk1isG3{^|E3Y-E!<{jqbkU-#Ky7j0%=zc*e#k zMOc>XwbZ8IeD1ulJfX8-*0#$z)FBULNa<2e+L|eA8j|G*vg%g!emJ(($*0)*4Dav` zntR?KAMD1wkN0iiM3)Ib|C?N}K5vx6qKm0Q$B~Og5LZ!dQ9rl0+UNdRV9ch;F^A6W zOUw*6Od|Q-xOCm0)LA+^SZdWYM&5m9N+eo|I^*Feu?V@F@lSkKT1Y2kwZ0QRS;8wB-yFG(~RO1ylcZgy&7 z0*ne>p1)u?e;lwGD=1Vo5b?AKQO*wm`@i;ROF#g|FJ$HvO6DTDKUQgr*br^jev;%a zS43vo0pVTawU_UYl=uudt}7NM5+=J) z)R*{XT4Mo-u|zmU#`B%Qq%hd;Le&Ho;B56H*W=^26PfqCUF*C+cm{Jq;rhkr`H@)l{;3MKpBHr54AHbl%{Vv z+Z~rqi;lo{9!ZWW2?xnq$EIXAWt?gJeW38xdg6^8`NLCs{6cwjm~u#m5G~Z#`Cu;Q zr$cn(mVCN!L@r}$`SH5y&wEG7wa_02IEH%;#%9L(l3yq)N56E|d<*$xNfvqWgeLPm z$W*eFCgXo6Vfo*j z!179AOc%h>O9Fg;odAD1|NIMkh&VerI~f0WahmjB*YR)2(KH)B`~FY%>FEC=4eW{s zZ3RaZT1CZWY)&lff|@cvtnuM)?98<66exYu09d+t+Km`BK7_BnCsl*(G-`xtjbl#cmaUJVU-Ux0eU28D z5g;Tq+H8Wy0cq;D!V%w{J>hk%`%S|Vf!Ejj8}J5nI1UP2%uQ6Z{AGc0ij-(-_OS!8 zo;4eAr8iicumBYf6ZMkoM|9@(R8p`I+I6R6T1+|P&b+~aERxA88Vzr^KnQfWF{ zWjLruA3(#u&TXq$WWSH|?X2A7=yS+%Cnj^%J{P;x1~+f+tLE5)pcLtWTTM7V!<{FT znM1IEs)WO3R<;p}V5<~-3CVsXuRU!CP#wYDb92ZoI8#q#n{fi{NDnto#1iuEY@CNI z+=xCMN`)}Ri{^MGJuDqwB}iLWS4@2~M*61U;sAb~oNpVx-l(o|_$<dxVrDCo3}kQ-^Cu(+sW6Znf{d`iohx62-`BsH4rNsuR1oLUum04N-jgk& zS=J{|8OA~bhwu6l#pq18V3UZ`!F&73xFIILt_zx))pZRd=^fibS}+w`;4N^1(% zx|21z4wDeHCCBFL2wX0!=PeU^9NX_L<*rQ0qd~xH`0kzc>uXH*s~4qcY^`r+X8UKz zic*la1yDA!oHIG$#l>Cy7qZudi`^**d|!n(P)>k)h0nJMGsV@JR~yNYIZKqedMl` z;&^kL)9X&yR`5b(EtBIIZ)kJzzhY{>SvVn3G*_kstqh7hh`f>*OEYP^Kr(x)VcaUZ zipEni>lyK~f`%WyTg;n#gFkM#F^Hn25t<=aoL+u?I;%T|f{T%tlu(5nW*t(ci3nk# zz!t0c@OsGRDc@S{492optzA6dnq|Kty_{izyL``vA_{mn!>+b*#6lB0n~xE&c8NT`q`xYhrQt6gzM+n@lW$lv;SkRq+dPz z|AA`F%hZUF1-K!zfX}a=n(bG2=+6`=Xlrd}W$XlqHvghQRVHeFm)shX9Wn}kcl#J@ z7RgVzGeAk4`VNboLZqcVW+v9)aM&!2P%=l#>&K|r6x7tON6Kkz@#cEz+c%@)weK2+ zK$(2AKvCWHeJ82rR4Nlor(H-0p23x0F~k(Msp^G1&Pinf5C;i%N>m z%it}8IH1>$jHo4jy8`@ z7)NS`K|W}WRz4&FgW;k6(2OVn#pu7<6A)UI2tCiAplh5bd4)U{Cl&m$A4V3#x}~k$ zy8E?%7U7&Fap`tRasfLbNj0y|tZc5aqs#`KGpbaIT0*itYN$_WL>IN!zT%{cOlU+b zE<)5YRA6XzIc%HX5Ofao6EW5@4pZ1UHQt0_xjwi3HB1er9iyuUL?HBuCDXBC9KRJp z-{<9kP;w6o9QT_v;T-kLG%>wxq_H=Aq`mLMi8_nZ;kW(wmR+~ z-08D>(cW6XOP490Qz~SL_`T}8{e9%7D-J3~0$2R~ zEVYcpoIXt1SVNt@ugcJ{B1~VXf^n4KjyCc<#jY;^}~M}~?ZXBb=MMd5J3kFndsaxb&H!+U}^>Kef38`ao^5#XGDI5|N5p2X%R zRd>GQP@LaZ62GKqC^*~Le5YOh^QHe?O8l&acmET7|5+RS3w!teFZL!5qLM=728ARI zWK%ID9%N==!c5u&7Kfi;0+bpX+JZ?)-%9#0F@aKb3F327HBYAhNXMx!@q)*)X!n-J;;S(59K|`W%r_3=zU!K zIKk3uddZ)Y`K1SOBh=xI`08}Bl{ukH!jmu8zOPK7`EZksXtU>T{ilqb}GAJpvN1AZKHIJ9= z8R|M={<6MZTaGL6+fPiOh*0CYis-7>3RH>cDMK7VvL(w~a`o^_OtU(1*zDQ_9L$XphbEqLA^5`|FJ=}| z(KgvCsV$cnwjxTGzjKnMBgm!fjVeS9%U~V+ z49C3kRBV4vB_oiB4kBywO9{q!TEmux_=sTCI~urXV<~o-`^YSPo9JSh;7|?UnEahJCs2Oynr%EyxNYalGjf@B$yFIVS zF65iHSM&y51i)b6dW8||8TyiPm)qLmy=EuuEt3w$5OwBSs68IJo`5x$qG5r?1sO#< zG_O+iczp8Jj;pk6{)(OnTf%{!iT)(gm$)KhF6hgA@u|K5f1P=!vWV=t`)v}29)~(^ zjk$G#z63Sv!qCPtL?fw*Rh&CCO#uT9{jbvw)kTu-7=3Tf1J%z1-DgBsFE12WKNzGg zT@1&9apzvW8&a%B1^ zK~xn$6g77E*=zV&mPbW1OZM|21%D=M5i)#V%+ZJ;VURE=(;|W-LkEUfxisb=vQ0;a z`&CrkElF<^@j^5#!x^zgPD^cl(#v*z@^R=G*U#IE0t(>M+Kj1en%YD0wfNAdVodFG5FcA;IQosEtnn5nmSqn=J}8 zsps(xac}%z`rnm**W%G<_pF_gt;6+r2%-4N# zKh5%FbK<3!yNH6q?ULU75q7ts)%_s=VQ2ccp@-pDIqrX_(tm9SMFH&LaGB9UVklF@ zn-$N3lP$-8Jm{U}F-7j3Dc4DIw)nhUX{ z-fmb`W1Gf|oF=ub-bV?o2k9bC^rw(UaMD;rw|?hfzCl`V%Gk;ggp2?Y03aarwyXV&Cg z==QIXOoHuyn!%S^3%HMb1Bx)dwc_7`<)~wDwKz8HD2PdUi2bZEkwmw{MB z5JJHSh(CoB-jTo|MmrZtnPQ1v^faY1IGd->8})I%u>D{)4Ap&C zj%*7he0q-Z^V`j`)iN(37c8M_;Q+}SInpR zw3n2Pzh3MFiGG{CbJ7WgWHmk>U7?Co*Y0?p*e0d!CE_Rq9CdMKnNfX08e>w(0R7v=5vjOU;!p0)?;|VojJ;#i@CzS|qRWYi)FDVGG#Zdubj5WziuF(FTX{NY!)$uKaFPs*KbHyF@_M@59~&2z~Syl<%?& z2tL6!K&r^LQc4UdCKv}M{Cg^8I>{~4t}raL!=LCUDrPnK_Xt>SC0UPCWuLt{YOnZh z)+g}RX|f#ZoRTr{>Y#I0xvY|8>a~wnC(YlCZ>n%i<)3&-$6>1bK#aLIXtwr3K|?qQmyj>-}FW8H;&6-vkKPCch2nzib8p#z|)SHl}~B4F~^e zOg*Qixw_(^3B!=sFU_I-aW;yI3LJCs#PIce;%jPqlDEl!7*l8WW6cZUrKUOFPd=GW zu0D>@`T@Jpu|c&(Y`nctK&S6uO4d&&6QDWYA#R7>(IUfe5@0k<#=Bss!X!}wb3_{v zi-JzyegJ#s%nrj~V_Rj?L$Q)?=i{`a=sFIyVHYy1DN`$@N_NF))veqePg5chpG`uk zLm^>f%x{5HO0Nz-m3qz_%dpcRb$eU-ywBE(uKE<$8bW7Or*(>#Poh#g7)bDVR=Nv%_8< zbca6t8JUNA`5R3V>vuiACQZCQ@Owub5ey07ee?XbcKPL|y5L`&&cDRE|8m?YOq`Gb zERYSE%9rLs`Q&Y>Zj}xSGEz{WF(1{GgpxqoNPbK-sKYT6_X5os`C)ogjH?cVHX$)f z@tBi!KV|#s)XS&C7pR*H&pejIZm|&5BFKLqcaqh$S10C6cXQI1=j#itmCKL#-ZOe} zeEev4iEV>|yjDVAS^T%C7|*1L)(|xfzLYFcaHmcLO`A*me^x;w+v57-&Ck~?km$glaZZ2dM z>@uQ+NTDh}EILzSl0UXR9taUSw0J}%EJ8!SOw5-LQz&c81ZL1vt{ze;d%~?j^VW#wL+ApzOe1S<2*9ykc_7E+$N#K&mdl?V&@(9;2|^<3hxpr1EfB~i=@6zEPhPv2 zqG!mFr32m62GE|VXS#E_^1!h?uB)L%6Cqd&jrzIS>l{7mVt#D)%+nrhgRNy9=%uKg za^>tPW!l!cB(-xFQ4fxJtqa5N&W|SnJeyJqFgU&XA zqUFR9kfv6lC~$dc>;k*S?Uiy)!rAsGn}!2IC;oom2;BO^VqS!t#GIF)?1xMR5L4RR zD?0zHOr5*TQ?SV~pnYY!;?T|_{K&Jb_TT7QWjCe9d9pCF#eeBLFItYoVbhCuvB8>~&% zdm`D%yA8+-L9XnALxI(T=};rrZ(Tf|HXmPp_{>-Im=LglB}X4(vxAJ__uXi5BL%d~ z-qAHvHoy6{;dTSR6)5`WBynRE5T;&&~;~ zkAIT;wE>7dZ!Gnl59&~l2grr}E9M4tpV3Z($@hjBf}l;nb#Ea8m8T=JAoH3$kWY!o z51}b)eD~WXo|rB?2nbM9J5~%@;-Qi6;+4^b^rX9HLJJHrZPpj<#!OGZ)@qfxprzPI z&Cj8nUI~YL0-Y}0gGXpgk}%ONQx8x$S+33(bNB$OVQO7XA{`1Bla)DxxF1?W^H23z zU?9f#9wx14qnVZPOhqY^T`Kzz(&(g6)X!!x+33?g;l;aZ=BXXD@(4HpRy`=>mry~( z5vuf5I9@M}J@6L>a9{X;aXg6J`&mZF3)(MoM?NpKpr83mtTPW~i7|7zN~ z`V@wyhqPP84{nDjCS?a~@?x)NA3qa*J7a^p=^7S-f%qx-a+;lMj{5V!fG6i9(R6>k z%t>c2L4hV<2_!g5cv&vexSo)i)d$uDgaVxvojGs@t3lG(M1vSHDNQRP4LenNJky{T z&3Je!m6|ADUjw+7Go#Bt+n*BpI^caB{q+|8q%TaXK{)j|3f&O9QhN9obxdn;MQH_v zr}hYw?g*ER(Ug=68fDD^-%}I1W9mlL%?5*YDiKTl^|EAw$i1aen{Ms~@BFV&yCTq1 z1MRZ*4SC5wiKGZox-zSPi(?J-yN2E`OQFAW$zM1iN`9;gSRSe3=5;n^mtNq46`dAo zJT5Ii-Mip5X0D(}W-h>5Nn11FM!t||6t1AbjJRrHS?ioP=gSMQSuPzCsnVhYV`X=R z*4Rf6ncRlU$OZV-ylZfjpjqL4z!GiLp5-o3z02wX_@Bi$K}Z5`U2k_`ncrlBka+m~4;Wp4lbetvZa!c$dR)B0>4R z5n6+Rm%Rl5uP46+ufGg9f4{e%%Q629IPpKGnjxQ^<6G&;3$G&-atXcW5g>Irk!cms zcIBv11fn?WF*!yWR~EmjWH=Yzyt4O0MS=Y8CB^JA0il3<)aT*4mzL%#a<#qRbPlwh zyVdxhYyE%=}gTZ>QFtW86o#)By+*?@@zQ`p94qcPxoC6 zIAHPhi_$g?m+5I{X+IWcRIkqqJey~&lu)?v1%?LVXlY!$?l6lxXczrJ{=oXMgri$? z0e+a$dK|MDgFnM*eF-aCtK7& zM?%H|nHv4KvnAfa~xqwSaB0BDoC!9tjb}kMbj;Bsw7+aBI2&pI?s;e#zYZb9VW^jHREC_O}M{ zKloSQ354Id(SJ&@{m>x(i+XjVR2`rs0$~q$949$*9i1O)Y$jN^q@VysGC=wYWCB1% z0%iWuG&-NmmbC|ZGtl)DeWudF#FtOy3Y^xU4I+9J^rx_gHU4?_p^C30(iy)mns(PvQir>jVh1x4it7{`6BhbFn~ z;Y}5J3LvG;i?x>)F`PF<>%qvE4Mo5fqCKIE6Rio3G4Imv+CBlvxhqKH*kKN!{Fa{^ zFNs_y8^l0TqTY}QjdW7HE20CnSU5*3pdE9A&JSNid)(u+Ry|K7x$JDs0c|ZBHJJIP z=xpY?F>~QmM0CYItZ$@6D!yM=F$b)Nc~dG{Qsj`C;v1r{l~v2(!~C|%8H0W2diyoG2tA|9_9QvL(U z3KkoOS(ew9(yt|4n0joQPD1OhZ=RURc^8tEEMG;@3}Yc_XXp)ophU!`8dio#)>B`X zWX>-44NhVV$C?RGZ!9uTQ%|QJGsKeazI3f+(2w1fWVI0fN>>vX@5Q`PTa<`yOh1`4 z;-ip>qNFG2$iYtOFp)dOYzkY|AI4U6YumSgl~K#s(=agY+#DyDDdlv9Xv0lCyFU9& zTgE_URUSbE*0dR|(#g$xZ3A=VNzHkSSyBa?TO7XE_ESJM zk8m!UqyC!rcEHa0eJT?(XG6|N=!1ai!}OseuTt?ogaa`Wh6xcRS6AKM)br!{k}c43 z03wJRRM6B8Etfj$f`q~hd!Y%I5^I8IJ&CSw*$fVPx2Rqo_--_#w4lm(kz-JInPtdY zcvWWkO6dSH)<{XZg$cA<;W9C>t`6fIklSW76i6frlmuiYn|p^sUU=z|MtYB7&Vr&e zhb6=wbem(EP-*O>M!hOS3bfE_%Vduk7ye^7k2qF8T$hi706bjf;yAGY;;9^)1L%gg ztE+fNuC5)i$~}Ct71p%sfIqZQf!eqCoN;J2wwp?2#G^1;z--%W)7ltR=x;d#G{fRj7G}#tI*@G%l%7kVZo)EXX@z7{WUmsy|MH zph)t(j~K^3#I+&zDHJe98%*S9tR_x$)TtT`x6m<+DavMr!>;6_c5#|sIT+ez9S=$n zj~_F1Ws9dSY|Sw(%vXRWy?`VSTcObTB=& zd$HQKqr(XZ>J6qoaxa)kAwf4S1Xx-U1~C{v$SQ*(+zTRv>? z_K^x6)}km2|PFdhq9{*t8(4ef|Ks*4}IHrRSWBdEp~B-}{g8jvm8(I4lp6g;8dURz)hH{Mcz{7_=RTiZ@7Z8 zd#p%IE^;OWy|=lVY|80T!G9XB95RMa=?vajtixgpWY?)fM6g>lXbjJLyk_2C?` zjfbT%kP0U=L>8kZtjw?t`QuxGOK#+wh3yHrgEOQ9#^@+cQze(-70LO=#tuD)JhPC1 zECcWj7q$hc?&jC#Muqo3w^a2I57p8GyXM_~+Y|W9a@9|_@SoyQV1o{d5Kt3ugh8mn z9g!3%DO+F+l_HwiNvCgei{3I-^7qWu;HBq|*|KDj{V10I*{IVzcEhf7*nd8rxp|lK zl%008>D&GELJ)qVm{7cjGarNXM9S8TZmE`+D3zoh?VMHXaoV+#+zmU2Z@(55ct*wf zC@`T3bw1v}KC-7x-BQpvv&Xu}fkVe6Kqce#3`zzPCXIdQm^Y|H|ARE4lJki*@=k1a z095J#SpI1>19p;aR-V=Bc>J2nCm-v)Q5^WBY{6DFK8@w7q)+!CS?1R?=!rBasYs`p zc_76~1$34U9&h84DWJxKh1p%OR}?7BN>Bklf-be=7tn$T z%=IkKT@^J3K`7=P=sfN*aBf&j1imQW?tuTK%}-GsOnP zp{g*e5`<=JnkvP04o=#d!L{UX`lIX_rsp~HkedtS2+7u85*-#kiS5@`g&CM9e>N{t zyl3p_vcp}nO!Y^grCTpUbw>x+nbZ2LW3&>vgI;tDO1HR%bWn%ujqb*6hV-^D?6i(x zJW>`R)*+fAS{j3H;x!NarDIEUc1okaFmR869_7&o<+m+YS*(vkU-a%?*>6oA7{Fa7 z3&F<6_B|DFWp1mz2L_uHTfktm^)pP7Pr%c4{~X`;vi(0Z=1TmMyr3xKzv<) zEL#}pF-3mXCqwo~-S>gMLtR#$>5AVJVS{qtCMZh&X8lJ=y#JF_b0N?I`TsU0!~ZJ_ z^s@-AXlG~rr`JacJlp{EYk}nuCq+Bp?8F~!_)&_z(l411y^orr^mJ?>o$zEK$g#V4G3h`!gV>^3 zDv_i%vn=abT#h(Ac>0AXmU@3#8+c&K|s_EDDm5#S76OLls z(hXpf-_Kg#eS3+vi5KOjvIlKTHQmKJIZ!Le%-f1$zTfo@70R_eb{PpXNUp4B!Tw9} zL{+A?HugkQrm5nyW(XxO(x zV_HfklWE#ndm$p3xyqeNsR22Ri8?5?%jsaq1@a&qrD0?ezYuNdy2#w|X%gcSN)fC> zaZrTcFDCC0PpUkrQcIK?L%`j&O~EavE9&u9z_;^-pH&U8$It(I>X4oeJiJ{@!d;$_ z>{`{~y41MgyCS5UNepl|6f+#U|6uOcr>1IB7gYppBgYh;$esb@+ZJtd#m4f5g~shT z_XIw1Rg0EyMKqZQYgW9_nmy7m3XsN@9otH1lCYQS|YkqB%xn+dnecc zHU0snHr8rQgADWwNG=fxsMh%s@lwm44&c+;rg7cKRcmhm;_&B-3i)?}tBK{1MAPRD zkFUiL9!)jA;4VVbJ+NjH+vh2i9#fHK=3r z2TSevyKw2s(*oHoO$ANY^{%z|wFOl)AADY;H@WaBn&+{JpeA>s4dsX#-X7uGflu%U zuM8m?EN^*6HjdJ7n&f806_u^7d52sVjf9=5JG4y8GkEqf!ggr^lEp!>-E4&Gik8_f zxXy>&X=33-Wr^B-9Ez^gT~Wz3k^GCf$#nC>Zj4HFIrry%HwN{KnI`hzfTq)>Y#$CZ zBuLLE&fj|%q$Cy1#SyPQu&?$GRo&nh2Xh|Dx62eAP)oSk=aS3~=H9`#p_~nKmm5yW zRULcCs_P!#!)`{ofNDrQY@W$_=tx$?jNz?)EnTLA177foJT3|lnIxV4;@Jg#FJ|E` z`;N7&UuVs&q@udrWxYFks$ZnQ;%i9H=cl8l14aS+P!&HCknJh12kcNNNg-@Is?;FZ z>`+DQjrR->P%E2kj6r)O%g%rdUdW8M`oW~jxsdEQz0CIpq1%!gnM;a^pH(G@FjV4N zjxlj#GQ0DM<|yHas6OdnT+??fvBfwWbvwH_LABkYI1}_hMSdmn0rpm57JQA0_xGEH7W$@2!y z85*x>S%LdX%PeCNQ#xL)w|<})E^aoW*vz2Mh0e}~_(jIasaslKM}B%;c3N#qofeHb zc2qjxoPCWcG8oJ)7hA@lA}0W>+U#T=jl@9utM%i zbELh(wE$PpEf(drG;1Lv^v>Hh^DT+LvAY+=G_I!{7P7TloS}?9;&&A=`j7;H3y-}_ zT}^6o9C+1v{&k!K%E(Gu8EO?EyR#R-oK~+u!uOEaH@FYNiGSxkfZqg<45)Sa6n+Z! z*}(V4XOu6xz~`Rs%zjcmQ*Yn3>qpL{nH)*!1(4dCe@pK?|9`mu3uqx&pb^z;cWwNP z0O+M2es!ZtC9DJVFU2|(%mU@HO!Zwg{z7_OT?`cgjxYxS{VwU&^;=IHwfAyHs&F|Wm(`6?BzbOgp7x$?{n%i<3s$}y z=eOqV%oBu6-zJugESeM@_@FPP4n?>~dA+@Gxm;hkD8g!1#3JE@1s)2KC&B9p&VV3m zYvNBX>Y8YtI5T8^WNa#>gsfiVhI2;Myq!Sdf?%=Q1kSjf=M@xMj+4}@+0Kp6i< zok|)B6*`%C!_4g`!vB(GAi_upc#`;OyMG~k21IxUh;Re+hl196k3GKC*jJk#>Vs=s zPTzYx&@wmq#xfC{%$&bt=1XB#go&@L-cai};u|(Vg+4Xu*z5HSnz5Xn2G<1}D46G% zm-h!DMt!k^oG7K?6biCMU}A?9c}kJy#GCMGz({JOX5r1QY#nY{Jkrx1^RZOba>Ozc zT-HgDKm6VXa3#!-XxuG;6T;H=lE}*?gldA%j^oYs$&2`|(Z+zj;JaBWcQq1TPqsGs zqXp)cX)pI15WeEy0{qJ|!#~AADl!Vdc7trSns9_me><_OI7dd^8{(kApqC*7m@|RR zje1hKwi#_~-wM?WCP(;Yl>niy%Pf4wCa<+1HxpM&G~K;me(rDna9niG=0pDLP`(X7OFoP@Ic;;MlGPy%MZbzUaItDLl)HSF@^)L5Dvhb=Xg5!X zuIANyz;jgu7L*w`4)}>HfPwF?^Si(4O!&u{ltSenBMEDC7Q$oY9aZ*1l$nm(qGk4e z#DYn&=11#L>U%q!N|qX4I1oU$Q`lM$j(-^xNjSjYC%U&*#+#`ua89Jz9;t0 zp1$4Zc0T#g;5mh)a6PDiw=B&0)%Hz3>lAZ><#)|+#OP$5WRO`==^&@uCT%`cCSS!o zAB2=Ar>~=q+kH?AvUb#jD^35yu%$MIz(u zOkZDKs8YJgOl*eftwyrlyEi#l zcs3rsUteSRiFDNHGg@c2zFu>s4y-v7>y!DI3bW#qFv_|w!ok(7XrMW(co^<*|9FIT zTM&%hZ(HgT3%#8k;uRl|y9g&r=n2d7#i2C!A|#jDITNY>Ayl7s?XA-jyoej;@l8Yd zY>d~d(6_$?fVL}NZCJ(M$@;Z zP?LvZl{JarvEY8V7?t3F<-d-(;o>Hn&{{S$UpJ3X)+(8AYY#Xt*g3&Udz(H|rpJGu zo;A@brI|ad9Y^33o?m^(#q=@J51j8cly8sAHzBth$0k8L*V2ybqd*=m-DU8Fymo2d zG;%Q*Cq_mEJMd$3McpE`K*P^l5a}9#qg}rE&4m0-+=iuwet_?E zlH)qV&Xxap$3donrLX~~)?mi6m1wf3loqL++Lf?7QE|y6yBF4y6$*C$sls_(#iE9Z zdIM(QwwV|?DENW{3HVuF$AL%*rslK(W2)5M@cqWEpnL% zO;$9bwvY5AqgqrL1`nv8+D5=ezNKVxxAUJ__vf14L460V7tGfQ>4}+iyVJkAu;p(B zbFu+<6!vruH>YTmQ$~5CmBHuTztL1_g&ne7Tp%Xg8y3rCQMhEY+G3@$T+Z6);Mbp> zCTU7)gh13k0)M~e(ciR2{@f|#^fQvLOwzMM z7D5e~nnsW={4mQPrlTWpOrMSzwE;=Qp0TK3!Y+)%z@t~>oIYY*e@gtQ@y28)7`ScG zBvVg+4Ae}kbj{jz(sScFGp)Y=LO{S5q{qrVE(qX10rMfxV`-b%PJ7nbCPRv%d&#uu zMAMZ8Y7T(z9rdm*?#cO0uWYEGcwO~<$HZ}?Q^w4`6-ULBF<`*+2J?<{KNs6Y6cXsgSDvrYA9G_nb5e+E?P zdk-@(?Gl~2)aGZ@NPMmGXz8@~C8(YjiLvMDnyHn*v};j@nsV=NJSx?H2?|OOcZTI0 z?%l$(9e|1Lk5a(=VZ588TiMKP9!=gH1&x?pe0xHjV5)FJN4G}&A_!RTO@QA1EV1R? zjPS($^;G(Z4ud*S0}x{89HrW-n#4isqN~%Y9?{s`k6#$qXxZqnFGfaH3T-F8A45T- z5U+vTTixN>{z}e8o87JIQ)n;wMLK-5F>E%&N8a$(*&ufU`;*S55qiGcNT(3|sU657xFA2j?k=YHYA4?GO3D_21`_0VY1h8kIMJ%SZ-J3<|Iu?uSOV7m| z7(izi3%$f^5~B0J)d@x&@2PmBP}aP9EH%#})ODxCz`leb6J$u0dJ)kpc#3|U7CkH@ zu}k;WD*qaN3qHLWQU<9O_QNJ~#XFDknvkKzZTe9U2IA!4`|vIQW^f!x6?FEO6CwpZ z=uMy#>}4LP=J+J(6ql^ir-bQdMr=^NJKTH>E=DY^1hMz$q1!*mVtCsJ!vvV}llkpd zGLc`o(SJ_CJSY7~|NO_lkHq|9{l?Eh-PM2UeD(%j7qhN@81L|Vc)&%&q`;LdM*mr> zZXqL2*~L(+W2s?ehV+XXmKv8?x>XpJmZLW?-Wr#o3#BwRhMc}6G7oJe_hB1W*I{A4 zbl=}AMCUpnMaL*cuV=AmW~M}L2#6EHj*(c##KOc%#S-*GIwVsEXGe_i$CGqq^4sOa zY+2^~Q9d4k@*XY+zMS{BD$V|X!bZ-(*1*if_=i{gXC*mUeoP)z2(eX#|FT!aT_YFdv#A`1vaFBL}6y z1Ba#fG_QGie(wD+>OuG$ZirFTQNdf9GcfJXkRPqTf<2R<)%3c?BoGgh-y%lwe?jag z4|Zzkr~p@e@xu%a4UqvghV%5HW}o%0$vn-&Dpt zGMve>q~)@BAMUmal+D%0cO=)4jS;Ds))YK;Ijz?pNIpH>FKxcC$7ulEAf+y&APjPi zB_?r6sgTJmm0C{HS$_LoM_z7~UPMYL4(uzgY_UmgqfCPlP#R%o>lFShqLl}zS~`q2 zr!rNUB7ar-YJH(pQ%4j;&R1${TUujPg$UXa0Dc`$TwbR|IL%<3jS`mBfGr2=pUVm> zm?_9>_mS!_l*K}_pU^RgIp0$FF7XSVgP7`x6Fg&Mu5_N-=Af74O-~}5i{yHS~|yB zR*ubyuB#4a=ehGEq+Ntc7hX;}p5Haf#Vn+8!GcXuGElT4Wu$TURBe`*-h#E%L2-#p zqOO~%36)Fh;iOM-=lP5jk_w<#-_5BND!eK+?@%pN%am`rLHB3UHO`32TDf{xphfMP zbR8KfB~Z|{N3^2ZY-}l+$OlJKYN)K_prqO=tB`b9Pjj_}1gQwn5e@h{RoMRvj>%k$0tBDv0@C z&boMT;tWo;P33s{+(Xlw6&gs!%ci$)AZ;S<wD9 z<|W2|TQ}m6{2*n}>hw;nRfywqkNkZZ)!^8oWDm8!6`k2=nUu>qx8O;p=vIYIsh09- z7Tr3cTCKd*bvXGMO3R$d*X3gS1(E=XL7#rbBcw6DPmmSaRo)zAnLhrlURUziEw63r zgBiN^^sSv757uLbCh<3qE$lhZ3orM+p0MirOM$`^<5oov0lWf(J(a^&?xI)H2&d_8 zs=$3n?b%dc);CR5c>B5Ns;iZypw2K-;)7S5%I=!x_yIEoq0w@zn))$4fhtinnd(I5 zp!S(wvnNsm)^r znC1yiBm1zcw_%+-iDOl7*$<(0_hy$sY4sZ&CPV!*p(a}=xgIGv6Ea!Q-W`Ci?PkV+ za)KK3Vv+FEMy%omP4t{fRXlOHVeo%3*y@EG2OBjQ>?`(PHY0Lu7Oq((;=brPz&&xQ z*}b55jaCH&fMSDc`zNECD6nV;azMW8Q!@T2_$7@d%VX7hpjD1h?jiy(z_uFwe6eOP>VNxek|`Ams{4%Yt38b^4tbUA!c2IPL- zb@17Ey3ANv)di+}ur%Xge~~5HoM-6!;Wo+809GAf@v$8CtS%-xY>xWei4Gnki~dY( zbdUP;$F`uKPTY`{l>2>V z0$slzsd|-qS556Hvn}-yS2WQ_E|t@&02^h`b%%Kt^6&FP({NPMeq5MYUyo{-p={*ZASD3dWtue{`la1Se-;Oz-HOfHhH~17?;(05k*G z#M4z|L>tNL4m>sEkcw5|=9w-poH%IWSLJwl99y@>dZub3Pd?oGi z@!){rMQX@{uz$OB}W{8iOkTnH5om06nQOIqs^GzhDqIvbtqcFkMe)wd$B zz2+s=nTv<4l#wg{asdPbSo?umzc70u7M7 zdY$+n%;xU<5&iL9(fnT>8g&1}2vN0+_IaR&f_j-u}V-io> z-g6DM-C924giH^;A0N~Ts{wFQW4t2Y*M=B(X;Hf6-Eum8rOyV&5&V!GE0MlS)k2rb z6Hg}D8>TN#=71_WW*ynP{tYpOh#&V+o1mQ{C8{}gJ!OoU&KQMpg-|4_4uX-)G1E3V z0+*mKQXfB<`SM5mH|3aaISWuNBY%7G=YKJ^|FqCMaTC}m2As$Ad>m8&^OshlG{1s2 zd<3zyo*Q8GrnE4GRYTcGb}f}zZQr+zf%Hv4_-4El=CSvzxzn&Wc64hnaQ&6>)P1I}^eJM88U6F6c`k0PG4_?xfT)>$y>+oBig zr}va;wM#2D@!%~Yt~Eg;XLIk+ML$|COv*fO##qTatQCpuLjMgwfSHo`@Ra$jL=Rp(S z4{G9oIW*6ny@hd!b#RY(U3wqv*juTNMX~F$H=IY`Z5-Y+Uy6=GBD(U0mN(xa)aA?x zkgzQ1@9hXhyT#K$D(l(MYeL?v>A}Gtq)fNf_Jsx>bL#W`8$8_B8n9*HzB8mSAy5HI zD&1|q!6z(Tx~+sQmZobMQ{R9GsaxJ1x9R8}y(ls9S}@J|Wxn7EDjaVSW2j`dy1ZBq zFPsFckL{+)>8;gi!*Hf9pyYfY^&w<9moLsJtMEfGa)x%^ZxdqS#9rlcu+g>S5($9c zp!0spC9vY=7B*{Wco(L%yf~il;!cZ^EnzOwA#lZCZ-N(YxRFDMZ;DWW)96F76EDIQ z@bHFzmj+Rnw@cll3qjD=SD^!^G+x&~>=DNjCv6rmTNLrz2C-iji+-9RSvw;GYh~cX zgPqOKAU`U$6S%($H8>`r$U;VE^l54+Af8@tS&&v#xRe{jkRu9AXfW{hnMYfwWN+fev}^SDee7xm(&YsIj8r zYcq8v@yHP9EkQfGS2}1E1>U-3WU4hsK-!gH3aGDv&*($s&3z1}Hp z!nAgN9}Waw5aQCZcSl0;Ou12y(e_fjJfl;J5g7vibio%Jk>q<-bP33X^R#P$W>_U&O}7A|j%R(uQl6L50;W> zhNC0b*u*y7I7o%m)SM2j!$Eu3AmkJs+yr|kWY1ynd9NcZ%<&|wkJ#49utQReOs;Kq zI+^VYxP94t`u+{)g>8Se(jgIJCk>wDQ92dPQG8LdWt+SjOBPDZAYZF?ES!^CnK+TG ze!&QXEmjeI5_S=!e;R!5V!_K+VjHSNo*N|2F+5bM$^xhGB4yJE;mjUJj$!RKNf#~U zT@q6w#F5c5YkEXTG8G&^A6KR9N5lXXsKZczf30zDny~z8wRD@Y<(rV++B{t)vic&U zOei~gp7!i1TKjL22|dmp2ktUvuHbiRpW((1I_7leofDF6rlb^97WX!E3}pnj#F^C~ zyC|?go%FbBgzi!S-{RQFwAen~AaX2@#@W4}tJKqG1|EvmJ%MI}(*0c57-PQwwWJX}DDb5&k?~k}*JDU2Vf_HUtmPglgs_ z=bMfEP%-ven5qR7WHFr(sKKe!J!K+$=|-Mw^`2o6nST8@lC8!?l$>x{Dl;c}F;rG( zvIOU88<1`vg4t)=Rz9S-z&KgHZH>q>MS>We2j2UpEk^@D7Vtz2dFV3rWu5cla^qM= z)1klRua<(QR~862^uVEkYC~y3m&I*~QOZ(BD-F8$Vu+1#OAIQcB&W6>lF37Fu*)eS z2hiW8R)7ZFH`ASjjKnP1&#H`dj-b|YB8b)Xgek4==v!xnZ4A>tM8+GURLB!1DN&3N`YPG1~4ajG`J9; zdjPK&9-s&c_HBA)`n}Y&%gFT8vt!7Wbs7C(ee}RS}({z^6k6o zY13JZUTK4>>nHVC7td`b*G%#X7%P~9X7^Bga_cK}T$q3=GoE>3tO|9>^w71)Z8cl_ zbn*Ga#dLv5aK2wHQyh9LubyiXm$rUv?O`OgN0zLXbj&rMBjgbCYK5WGwp4uEY(96) zPXoZwOFGFL^wfzMjM>#PWq`Bkdgb{-r}!#m%kJVPhw&>!jeseB06r^-PY#l%0*|Y@ ze*b#|5>TFlnA~gt`%tYAO*8(d4~FzTI_evN>S5W_7s)ob^w3W-w&GtEdQ5s{p~-g* zs{mowUzj{(dwJk-99F9O*k0=>pN_n+`}qD9Hfpn^#gLgr6@Q=Z34%;DG~9nW?(3`2HY_Y1n7Y49y5Fd10}{7uTc*ghVD2iO}~NJ2tQ@B|JDvO|Lxb1(iK@~D}xg@tx$}nJ9OMPsWI3zHq}?RmoFot z_6fErzLFu||1gZ`{LREHz~qbIZ<8-Xe@lFuy4V^$FY{yoPL?{k*!)=)Fp=kh26oAK zf26q5Sk?>+wyBuaEQKV73?MX@?4~cT787>{#V2yhA|wYd797sLz%B zHH_>k^thrkGO*+`hXVYMDUj(`EmP47?N~&W}kJX`r#kG>j)~Zby%29lv zxsis$3)Ov2Yi<=m>8l)N`P;VJto}cSY`4f@tlEIjME-3B;P0Cj{{lkQPS(!WOxQyF z4`hD22mhLf#Q$-1;NLbaHq3VH#*aVnKE`_GJajl0%W{;w_+tXn;O7LSvbv=s6v<0B zLm?sgLL(+gHj==$5QH{lD_JBthCj9|4m|HgC)6P!9pENKrL{FeF$^vxL5)boD?%g* zGzJbCN}1YPYMMHjD$AD{y?W&%MLhgC7zz7H5?g;mdi-jfMv6{aMpnMj^j`y%W?ERw zeqOGGF>n1}h7r-qgVPhj#c!MHKbva^$e9n15YJ^2$=`zX_hs;Zfuvw)DQf2e+(!8y zVx!RhEH;^+r61EKl-w#vU( zkp6<^CoU>3_V(5mf2xyM)XxL)W{*;+I65@7bH~^`<${O+A;lVjellH74x*LoZCYT@ zf^C!Y%=d>#=!IPtdxP9bo|6OW6|hsNNHJq9%;T-yO-=3$^8FW3dG<8#*xzZMmxR|md5$R9k z1rHMCO%lOl2Md61Jj((uQC4s!@WJiC->+Rc65#*-YwGW>2Mb<?lLxltu7#P7nXK$-eS{ya>;M{l#KjF zC##;ZNf{o(0e5gjEoWlKf+y}Fe_|DRdvC681|sQL`vSUApFYZ5dp_t&Pye%yJSu^; zY7$f_ag3n5Aj|F>{vS*dNYTtOFS5Blg!SS_kbN&l13C)4^uuy?_P007*V4ExdGmbfvo%O%?9o@Cj)fRdKe zN&5crnkC@GhJIL6aCi@49tl^PQf>VNCo8pqSyAeZg-2|AMs_m?jn53joGP085G~O3OJjXAj_qcoY z%EiMFyZLz)N~H1NErzBp*VE@qx9=(ZJYk6eK{JaT=>=C!vg}dD8{AUL6oXEKtrL+4 zka~Uk2h>rhBXe)Y(kPtymgokrufnI9;!#W;-c;B!^V`lWmX4(%LSuXrYKc$?2dkP@ z+t9|P$G-X!oYK^E5>FtS$zfAMzE*VaWZJD)213&KThRXATlbf8J%jeo zTypRrC2MA7Qog|Es%`-wBcxo;F+icu%!oa`vq$ImLm=CDyM@Z51G{=8( zYI0O7&eVnZ^5vO#{hAYn)v0%^dv zKJRDyHIe*6Uw}qM%GUYsWMcAni&7h*hE0Pe1Q0?5z#UC}OiXBr+ntQ5zkK;Xd6kEr z2QxM~dD?UO=+Fs*nYWiOdPp!R7PNRsx~7vX4lFggy(i1~mphV07Jv|3_LE6m-=S3a zEL=Gvq8#gZ>l;`XLHZzy*|DdJ=KJ>F9Jp9^7p2!zrO!} z0U{Q~1Or^O9&}+L=j`M%qgG67D^CmwCS-q@9ipl{t6_oSoB4e5maK@_y?-6enAG1#!`4 zTPpCS4Zr>Rzj&#z#eb56lAKIG(2k(Y&41JChJS_Hu?$Uyp+JsWK?oU;R|;Xb>WtGg z09Sx>W#;i^>v@H3LPL^ek~0Dii`_)|Bs8L2%^pVfQ$kRISZrp@0vjSF!kwQNXeZI)%h+!pwYV<_2FsM^?+<*jSI7I&% zKkY4SmUmr^P^~3S2rwb`iMVZYcW76gB;c{Guken$S!u{O8G!3kG6G?sC@e^WQ;+{7 z(y`lo0bzEHu>APaYDy&Nv0WDDGbzEmGsR7iaUb@h%N>zS?gF|tD3LD1QA>?z=U~_B(}}OEqoIkj8#X!^X|ES zLZ+7v8tN|qd;gtS7T70cQoDMDlDm@Ta5tMvv>lLu$LqrhOfXO8r0msO z%~4>pL4{0^Z0F)l!r!SevV{87-0c&CGVBKzNNYs)d--}i(lK-dUT2FXD%uXDw>m4t8v5hZlcutE;^=Ts6%sNi(n1YXZQs0pDAm9) zA(m>oMtoWZcCuDxT4KU+YD&uMct}ShCXztjcyNxAITR<}YiZ?(S>yzj%9Ve0)`0*! z>z*&P85wT9FocXq@Q0BMG;aChC}cS;D%|sF8Jyo@^9vdI4|Vy&Rz;CtsV#>GXPGAr zjRJbb5dlQt_bi!?j@d-5kl)jPMn43EL%}9)W~M1wKZHbhELiODeC4f2EBfr}KK0^G zNykdNgA!Ro4(Q1Iq>k+u-bFwL*;`(eZ-IjhM+jqxxn0OSgU;EG!ZwIv-x;CdZ~-$d zv%;-5;DB__hVS%fdFwv9qZT4#CJ>r(H5DkFqsEc?NJ{4{+; zcw)D_Jm0{wm(~BrAOJD4IY|!?4$j}g@f!yDyPW)Ktr)ab)^)RVT}F5INdw-Y0w8W# zJCYM`#6AoV9Q>f}QpgQ^xBkxC&W#ufKR8n^anLdGXKTg%Y^~m?2Oqq-XpNzB;bQi` zbK7NII@V=34)B{Fnx;##cF}$fhMqFq+vMEXNr!iq>OI}x%+D15^tcT%b3W|fCXMq! z8pNLo{Hq5>B0&tkt!vQ*a~F}BMKe+@lbzYg9x`ZX^quYwrs2GnwNf5? zE4k+^VFPvDPf&NCWzmlDUapE|Lo~=whyprAL{v`%mlv7~l>gZo>F#sD%?7@=^S5vQ zMQQ}-jHvy0NFyfqoGU`jEM`)o(V>CCscfpPmnH!O`MrCTSso7gOh$@Bq)~tQ0$+M9 zYzvh|W&Gf?4=>0mV+12{g-lodab|7VA*ovta#9!%42QS&Nr>KpC?sTr-E^I1E^l|74o3HQWP`WZ-&|lT6htv(V+{;HQe7h;JaCxx+*gQoH`Mpf|$T# zeKQGhafzpLm#8j(1oW%za;-W4>#P4h>i!o2{tW2ADK=Y_B%#qJ-`oT`0zmj8Oz?Q>iY^eZtDlgTzYzsMi8T#~zurfX{E zShT8yoUm6KPfRW%i3hD5Xx6t5Sg4P#Arv8-{fIF7O+T{&W^#|66fxvb43AB4nL>0OmWSY_-Sbz+JnW??1ipXpw_p7i zahs|g@Voz==}cm}fe(ir>i$~Xc)Ycs)GEZvIw;|iUU?-(f#+%{$CnQ1oWb)h z2C?&G?XnHSN*}h5`SuZn0?bH|2c3QP0b@~lj)#+Z7HByd5<$J(8rryb>c)l?9`97k zw6>{9V141cOw(9hzj{m=p6dXF@x)?1a-qh|S4*(9$v3kCn@R_ZUUvLYe}JXDQ7;gX z-!uO&VwHc&eu>Hb^br)S$}-9mfE#NEC!}Zt2qEFujU>s)9*J#s`nkTo;7?2q--2`F zSeyE(`SC`An)An1#;}Vc)OGNS^|W3cob}ghgF_8m%zZaFPT|#`oJ*tN0l5wA&Bk>m zwbW4cPP_UzDjz0`z9p|fEL^w*-Cb>NKG`Pn*fZJ`HmpE`8ie5|Zipjxiezh&;=TM4 zm?>(-R6o1szYolQk?ni7|Np4?ozMY_n0&9((CI4W=-}Aa3oA#+BmqPvk1|z`dta#D zz;J*tEXAPLNpTwH{@#19zbbV1x3@@_lt>0?MR~*>TQt zD7)qNXB>KQ%s_Do5&F)o`%l$B!&7?91wQ;a0{b<||Kj05!T(3S|MNrJl*?Di)5CL{ zI5?FBA|gV=pTCx&redPApuSnaeNN}eid}}Z|oD3wcd8I32ylQ zj;@{GD$(e5I{>9`Cxg|xns|&x&Al%(W9Y^L2Rg`{WKSJA`C#&mw+hDk@mk6JhY!~^ ztH|obPs3Mk@5$$rXj&ETQw1@NUIdRpUTwt!q66jqfB1YZ7*Qqf{?~W^A{GO_`iv$)zTM{mHIj{B_9G4u12m^*8SZB+-CqG}`iX~vYHV-xXc&gd zM%$HTPgKu$ciJbh&yB_*$LxkIHOf_H?5TnZOh-ZxNoAWYeK)Oz(aCog~>8K;r9Rk|uz9?xJ>&7{2s z3magEBDNY9G5w(jf}0 zbd&%q9mH0082_qs5WmA_kBUXCc^4uVhF0XrBTFO>J_6hd84o;;S2MmN`%Wy{!{d(Z zEnz4c3-d6Egsi{=DSi@Pr{XoLDV> ztdb!a{vbd2y@HiW;Mw32{nnNJg?slCng7g4DDo))XJx#d`m#nt8`R0s_e-j3^NEpB zprC^K`fOWqhU1;sTUSZG(^^6M_z8@1O2`I*uk3V=bj6GV^Odd;TS%RdAlp7R?Bt~# z6A30{rOop3apmY-Q_z#vmb?G)@k-|iT`sxU5n~0wUvqc!=TgjE{tGCS;50*0JRk>l;MbSw??IWA{*}ki?--)v$ z3Z*;{ksH82TO4DsA{~o{*_XN(I%#kz!XG+a5bNfneSDu!)&2w?OHXVH;U~QsqYekBooE*B43{$yqCD{;eC67%%wdy-^|0*aRF+qf}`d zxtScxS5z}bVD2fAun}T*xQ(ve>5xSzuh-?XASdiUWOvhUD+0EW& zJpP$M8MY+hFeF1@RyVBpym;9$?LU17+2QH9CmrEEio$dW8ASYvXsHW!%3-q>l-f3j zQgC5iw-m(f*>Pm8HxhbI_@n+-5`LjWKOD#ZETr1}nb1YcM{iOOh^mz~G7+5?2G+t9 zegw&{26O?w6MYDm`2!IMh#&jvSnBI*oZ4Sky=W`p8b;FQ@!9b)EcnFn7CtJnVJhz} zI|-MM69ky>4;wd2NXAK%L0j~@>P`u`!GrilAUgb? zeR4k6VT=iUAf!RUz81x4#h}3&YeW{QB6uZ-+$xOsxPb%|H3~ zxz>#MN3Gf7Z?)#X7?|&8t(o|_*8DdPrk4kD@JXy4M!`|8UoMyMZ(4l6?%}R zwU!#B4WjJH5%39)R!!GAC@h5J?Z6c8ub-{SPk^5TCel;R&XX0+GAmBGuvm`gYkQX4Yh z-9W@6mOK}i!c4^0A1rbOVpvymdO8k2cK%!vIDB_ZC}M7Xm)0H^H>xMW&FWaa9*67u zE)X~O3$~K3-P(#Jjj+h@b-$1vx>zjC49w{VgnAVv!Q3;`v2Fz>Ct;RIFr2paU zJHV-Y|F{d;A$uh=D_gQRA$yhW;8@vPw(RVXy;o9EWJ^XwHX+Fh85v1N)O#Q5f1K*4 z_kEx1dM@WG=i|HX@4A;~)>eEpb?~M}wZz*ewHK`D+)bEOoC;c1mm8)x0vIJX+t(Y? z9)$DFRL|$EW1>hBJH{T!Qk@wWde)U~xf!LvG!Eu4rZ8aROThto^c9ed>4}p0j~e7? zr2?XKpfQKiky+c3^CsdW);1w|z^ly?7?q74i26iOhbgY+?PI#>MTYODNCirU*rb4s$rvJ3Qgf@T->YMIWZswiSbA3&?`#?cJ5 zO=tJs<+Z?Iv){Ob?d2@#`p|^}Q~ zRf+h5MraqRBzs3YX0@fAKH{Ove31AW%1!ye-~ndwsJE-ukWKd$*QvvLU3F^5x*3S& zKN4m9Qx{AIr>@z2rQeW?G{n7fxv&B9*yw2PBx z;NWROAHdu=mxXUyuT$;akt!2jp*b4x^iZy zxX=A(iWdjfjYYB1p7vteV)W+pc-lzMdxRWv$9*S>rJ7@MyCPUqb6de;Cu0cK6l&f&DUbj0+wplBYf63f!l4 zKIzS6n|-TE1djKIW`GcE*sNn-&1?iBAvsYb|Iwuc#m(<|oeGy7Y#Q3NNg0WzLX*%+ zaV{j91xZFyk~TLxTWICXd8aq=KG7b;mu0A8ugd7q(Py82l&mwc66xmqS}UQS}s8XIqKiwHtTuBbagp3nCd|+v?HDx30DOh6z;Rf3ut&^ei9OJ-Q|}} z(R|8pl#+}lDq*VHP|NqYWh5MLN^L`aA?ZocO8;t^jEC&3Vjk8*&$ewRnVZaeosXNu zU=oYE+d?)8BzE#)kF?-7{*u!DF0Nk_bK|XhI%2o*P#Vw|C7d?Qq{LBjsF`$yJ;pDN zmoeB;kA;bKJw@~L2j{D`$_|;#Qn{JGuTQ!1^xN0(pE0LUM9_#Kek@eM*GUsS?n;Kr z7QC(NG0T^P#6HI@o7&->02g+_q;4f*R;GNYJ0R&M&&W&`$y!w)pCZ$DosdVb1n zV)~`V~FgX^w=(vrpt654G8oWXXuw5*d&C!Ysy&1K+n&R>+2j zeMpSZ+hPl94G%t?m!}JmB-VM2Pi*3%{7_XC$zy1hnvlbLDY$iJ!FYPr=Ui@7iS?tcBWBrO;XRIB10L|BYS3T2NLy}#uzW1t=Zg~Qb27+ zZ7WSlvc3sHJ)Je(!*6Jt{#-=6qr9bd^(?kt{7l4DVtYzSJ>xDUJ3^`P6h@=(%FuhH zN8HIFT^GL1J{NxcH6<4Z}5}yZd{tjhOqAN5$m;)yT7r;r6_-!wr|%axKkW- zxN4}$&0B?VC@yGjN zX!e!&WY)DeXhoR%sW7SP*=mE?_%IfwOYG<5*Qb!beKHw4J<5|smPmud!zn{=%(}vh2&0$Aq`qs_}&Cd1RyWxG3lzCA>ePd;vQIQPq zQv`6i*^Mx+PE>3J)H0AVQl~5_Un}7Qhqg29#y`W8cctb~MiJR->hZG8Q2d@~D79+x zn1-N6c>sUZjo3?S7M6RNvvfa%k&65)_E=2=~Qj+bHnv z8rDOEE%}GCsT75$tdLoC0nMzT4+mq8FpIgm^K*I0)0f6UQu#05tapBf^amLGTNl9U2|rxsJ&+@HTrmX z{Lbyy)=H8Ai;3x}NqjE`?I~gihewl4y1eA(Hloen&0}q$D}P#jy}3k{Gdf2=XK^0m z>ISw{&Np`4Y?tS|3qKsuXLeiKrz7v3y2H~n|5)n-KkH_A8`pTY`-e$diq0*~6rFgP zgq`zm?ofv3$vk$nMNYeBkfcSH=vT~UQ^X>qnQ~8VZ1jcQ44-x`vhQKyZWp9HCk}K` ze4-bl{F@h(v2$_ydD3!lY&qxoWA56u{SI$Gnb(l zIvr20wiXR^w!&t|B3l$t=sy}b2|b;>;%B!#yZPyS6PGoOQ&2`Ur9zy*1krh`w%`i3 z*%c;f-)ND=#_E2bUi25?d~Y-Gt+%eNxfICDjO*AA$a*VvT=Cj22_q^^R23H=%?QJS z7-r=?eLig^ptbtiamQeO$iM7*jNhWhTWUhRnD8Z`37*?{6hS5Kt}5w92Y8afQfZxn z2iXLRrnt)+pWIi)8B&Jr=<$hLBik1HJ)&_(-rQG9YX3^oURWQ1jAzucgHg@0W8X1B z?6m)R^<0C=RvU$>;eP1jAFr-4ZQ8ZEX4XYqp?efILMftBs+3vCP#W=x0ow=`q3IIJ z4PjR-3Z5uy>c7g`!xZWOTgCnRTIHh?ZtlZRxG8O=^?BS%I}-6>C=j-0*$tJLaJS?& z(n0ZSq-tS0H__FGF76Mf%AYkp-9*D?BHj8xXWnPiEsS1hIC~l%mo!M zkd}*b4x+W+JL7K2iK2+avyOI)YVk(pfhs3N40lU|yX&qi}jw`iwvn8;Q`GLptMaWfj1zLkvc zaoFX`#~AO`&q!6bqhT+fC3*fj){^CXRGL%9g+NV6M2`{G3WNaN`To*dDI2V>FI&eSTBy{1vDJ!yt?nHF_Nx4&Ifya-6;=0 z;>DP!w~MCdN-c!rE?6}!Wu4g(%Z;Ji97@*~eu+iS!|NsgX_qCb>E?`9?9O4V+VhWc z^#^0s0PQ4O{xitKZJAyfV*4}G^U*lG2U_G>z`zqi-M5lj(u9?5F?#`7GQ5S%rG-{S z80WVb2sn|U)?`-e*LSmLZ}W)4mQP1t86&b$6LP-QlUY~e?z}zU-fKU3x-^%n9lfQw zar*`9g)@uqPRy2!L5zqqZj3Lw-O4b| zpwYfmNhZ5>yUG^{dx8HYCsoNNrQ>~e2Sqv8I69hP?yKr0tdw`vi3F-OSt&Kt4Ho3& zUGJLemgrIPs83AGU90Sji(3+HFV(~qc%m*c-yvW5GVY#rhAGahOUlh9B`29pv)4A{ z8Sm{1hLmYT7ARHJvLAl`M)!F9!dn)`C+fGPe8x8SydbQ(jp*Eg$SL8vI+rqfRAw1( ziTqGqyLHew88gc;@$q?K@>|LtuB4A&xc2 zl}vF+bGYXav+lnhrb;8cOIcv*Le{Gp&buLZ!()!MViIy*i%9wYy4*@$1X=OHIaB2F zvo<*Gql`oZU$P?Kk#NQxosLy%o7Q3u%(msk-1N`FL=|Fslbe(C=PGtpB^B5bf2nI# zSX!9P-K3YPbU7GW(_VrDKIxrae2btMd|O)haIfl%S#!XJsTgiWtattmuhV=kJbmi- z;|_yA1vUzKkVJ{7))%#lIteAhsU^G1mi&Ze7`{r-&U$HFmHV0ZP!`y^`U8pQdm|SS4 z2$XTpPBT6ZXu_CYaS(nnA^8odp1#C1M~$t$Vd_y=Vm04mzv=Hofp}~cSH3tZ1^Ruh zdxTFF{nerMig?VdP-I=Snc_zwr^6$~&Jm<>t$?VM_y3re{uCNL?B}n&Ac>kc53hW` zqiSi8Id^|Y8^x$?8(I2VU4Y!%A^L3JrJyIbU&Ol&4E1Nt?Q|bqlq>H>gtBjJq1-!` z_VkLoz1?Tn1%1+A{GaXJ5A9#c{L#*oJDxhE z+WiDuu1_Q8EZf-ALUdSe6&gJBGMAYmuFPF7nYcX5CY&}LRdP_M%W*5y^pV}I^$*vy zP4)=Xdg>vV54?E=4bQ!=^|>Uh{iJKg(jj|(^k%e!fo#Jo8gco{k$d_(Wh(^HrnBM= znNPz7_abxW0(oAg=u=u6*YsmIQyW5DtbHL^FV$~eH4pC>Q1(fXA3CFapkOe=n+?ug z)G2u6*vaggF=$ml%7Nxu=6D|s z;TK^PWICs6E}bc2E{I4kWNu*^iPp6xYYSN6OieW^!;x*bl_`IBf5%pMyOd%j#P?kk z{XoWwuBa$SI~{As@c2tgZr${%?^J`=ea%pm?z^9P7&s9%K0zu}@cem#i!h_;Wiufh zT}V-uA%w+ONaQv1SyR|4C^Y=SOT*~od9H@1tR8O^WQ zwaj#$(T%P56PdZxLMT_dz%STbfpTH%m1j};_kYOwO1UC&+nlaua*yeU7RD7Rhx?1} zg7`j7mdfcnjizqH6fy0QDQ(*{Dm<_9CA;aJQ$PF9m(Hip52n`4OLR-6hF*@bq#713 z6nN~ZzZos2aq|uWdO(u9-u-9Y@Cw-q~g|!=LA>d9Ebc%%&?KSchf3VlX_*^xb z@F}X(D*hHt++|4h`|)P2MfQmbaz-z6Ls8zKK7=%6>Z7Dtnaw(&lobb}Y7geFROriI zc2Hk2P7Mz$xY86n^25|^JuC0S>6(g^S4Ve?jd%r&dHR;T(`@vqGb@~Dx=bH2*qE#I1d}4YveNMSx=z>? zD$vlxbhHUAES5mJHp?Sam60MM=Ii@SS-N-8D$XgAk8wX}ygaT^Wcuyu=jnEfsFz>k zFmo^r@)=}Vts;AeM^~{gnpl#uoflNT*Iy#!?kRii^80|tlR{45EO4a}WZiGdeh1B2~lS;63orxOP;3Hkl&Wg)- zI#b*xaxsZWwIt66Nm4M=lHPQ67fmFwq?5Jx4D0F4q-3=-VIytOr>yky&D~5A8DeQ& zj38|&hMwjw!__3EXhj#DaQvaaLh(qbJf-fgBWq7l4tf-}re=O!@_L2x!ca>w*W<~g z#+`f3TB78xPouo;e8gv)6XVV)SjysB%%KK8=rE*Abgkl$WDBA6l4vt5jZBX)C3_XX zk*aVeq$q<&SL|uFCysVSP8%=(IltvrLDiVu?L%j5KXL z^I{x{_0oN;q=$QX!XIC?!gf|b)88NkM<_jeDzw&JpOSH~_k9P&A%czowZ%GA%&BX5 z;F;jN@)G@5Lj5BbXRz;xnmZ3avEGWdjCBuzcz$3TGhpzTAjamgP?z`V!RsQiBb_O* z)5ynb(I>xXPWEP#NKD!7A?vX7R;3%tbB3@{f=mhTO;Q=Zpl0J*Jz+JI5BDGXSF?J&|lpgQ`fJF>)DzYJq$GYwwA7j2#^2{1Wip)vdDi{S)?V}byGP#V$eE?=`t13U(5R^%qKIVk>ZD#exa-mx4>cobUz2Ni z@lBZjEHc^K_C;PXdUCZH6DAdu9usE&1!S_@4XC5sPK0GMyJdpGPeZm;>$yT~vGqE3 zEOe2_lx$==dv_#h2EJYpk(Cn~&A3GU72nuvG|R>=?EI92!tBwh6W^~doPk}p(0-!Q zIsPaiwZQgf2M2Ju0@O^^$=)3FSY=MGn!6FI=7T=4iajuJKR13T!9RDu;&r;_@giCl zmAUM5dTYJQ!Qna<{hxa)a8y@a!UW9Xmt5Dy}#JAE? zcbDcYzUpYooyN#b*4R|{S6`IbEjSa2O-r6CiXQcXK_@l7Olu6X5WYfaPJ^v!FV z3gGNp{}3+!Q$l^Wzyf_#RL*XkLV;{=9HuO=LSMo8wiQ*ZF!E8~pr!4VWiDW6{zQh) z{};o*QZFCP!z!y`TvhT~+cUyAB--NSnX5!4qEq}Df}De7lw_UjP2+Fv#*O6$x?gTw z-OYww$_{oG3B30{rIa?&V>U41+*`Bo&gS#>{;MvH4{<`sst%f&sHd&=J5)WHZ`{(Qz z-ltuX>H0XM8Fv{q(O-T#m>qX}NHcey?{mro^jkpms;tcD`(k+_^mpf!n|ovxwr-r} z{@mEE{HTp+m0mD1Pd14sCfvooO3N#RH%DQdAmNTfrfqsrKaL&wQ!n(h)w6XdEF-p3 zbJ0_UBI5J-Zwf!zQw-MK58hRMKDWd7b>y++HN%e|kTSk>H%S?zUl-_dY@~h=p4b+* zhVIs>f5&Z%2&;o(sn$}U+@0TcwrOpft76D-$^UcQSF+1&NOkJ{i$Pren8KfjD^zpv zIHDC-&n%FQr{GXUx#mr1k0r-o3iS_m$~mQJME>fx^xx#y(l>%X}&P0H%AuKsK! z5=$$MJL2-E)jkY@)^u(KCEFeh#?Ek>kV5o_#shKoP9azxXLp!3I%gJ)u{gX%91~mo z80rb?E!=%2zB5XToyRmSOA6X(yB$nw7&b=sneOGPq*_E`wr~g(f0R};zh34>{O8pd zpXpV;`QDz$`Y>V4iupbw@OrS;{a%(*c^_?vL4=5^$C!Vpx{XG-tvru#{AZ_i{%M|+ zH4K{=h%S;BW(cp5Qk>7#0Fm1Z1HK%DJYM&kmLgIbFemT2aMWSG&kP(qv%5+i z`}^SvDkEw?FIbf|a$E`o({(Ksw|FbUJ zxb5B2w}LKjg}1;)^Y_ni6+?5LtW_$71_~yY)%(X- zahBAXf=AyfB#$+E`HY~fYeY?2wbn;Z3il_1pSmjU)m7gcRuTwNdY3g_A<(O2Lp1bY z<}?-Y7oA*!cbQH%HF`hyxC?*hE8IA2GVL47avp$aSM~o;tsi-M2@NTE`QQ7&?1w(S z|92nXZfv2V^3%I(A}k|1xgUJ{G_q<4Y#}BoeRD?>ju{4$Raw{@H`M4T<1^TY4PS}b ziw^Fpb0{B zA9lCweP>F!KbvJF%nC_*b7eV(pzHb2cc81ipUO15o=P^t#)N^4%U+YJOGHI6H@lS> z^m?ILtTB}05ep63xAg~o>8``9mZ%ih+%EXubJ+33}X@)!Jf%3a_2 zZ=JPszdinKWEu-LKaiVzU1I}?F$I{ze+PZUZ1 z8o*~Ea_Ga#%z*w+W6(!120beY1rvD|Ff9;LWDaHr>SQbKGA6ghW$NN5C2L?Nn7--z zVq#{@rog7mc6zfJ7T>W^@r+NCzwT^$*>tLK>;*3xGGp?*$rLK{(GuNDRlchcfTz3@ z&4U{JFML%3j3-?y2iQI{7l@t9&lv%OzA@!yW4tp{%nDpA5p`3Iv$|CzP3nYfwn#+s zYb7+OlCeQE!7=l}xKmPOMH$4ii^IE}komPA2b;Sx(jzX3xj~XO&$d^ske?6ti|UGW z+ircSvYXtl^%axJ!-O_Z3K?!|Jddvp?GzZ%pIWakD3H2&WRt%$bO`tCRFBux2BDAZE58SlFoyErP~YGRwg;*( zRwi=qZIY%tQw;0e{8&8!*P9+pU0xUTK(5Dlk7R$_y{T?WWL5Fh2bgeGy{A`=_%0oYfAFlUHe0B@FH@=%Wopj`pWx zbr}p^<-LfR9GgvVqW`fZAXHdGcR)1#dm<|V$@f!!2^;F-G?F*IoL%rh|`Z>M}rB}OFn5@zsKe2t^=~j^U_Pmx>W|=N(bI=NtI^NlF^=67W7s)*%&G+D1 z0fA1&kHgEITIJ%|_%vLcc9-htczZi+;(z zpyII22+4ss+lUXT=jVKU6gqczZA{%h3gL^-Uulb*-YY8JAdx_4CJp=S8Dc>p8M*e9 zZksgA)4IN=Jl>40wXRWRE!j_MEvB`c|HI86`}9eBzO-^sTVpnG&uXRMm~P9hK0&;B zy<5T+0o~h}kRMhL5+5)Xdyu%QjcO9OlahGITg&OkR`+Qo(vUG%Ft?Fr$&;{0 zhGSi53gymZz9%j|bTPxZaN*mJ9)Zo>t?#F&PSpt#hP=!0u}}LX&Oe{G{+hthdBy*m z_TWvl#HIx|snC~YlqSuWdxLoN%~c=Nzl>#zac9AI7`!N6!_K96A)*jH8vRPANZ0A7 zCg0;FgxnqoV-kh)(}u}5aZP$Q3T3PE@n&B)zWCHt-;f+}szC3QA}$x2NP*;k9{g zXyui;j8>mlPpj&i=)FKKYQJ$xfIL89q==f1QBp^?=e9{C3oo0lX@wr0WKJ?m*_BqT z6(aeXd_(FB@;$h*OVZpT;?@Km*u-Hs^7Zp3)QjbVh;DiHacj$F(?jvqhl)fi1(OCs ziZ7SO+$a*WGkGvRZ^;(=$&T$@v~PAs#-!KFE3o*%rJt!40#xgCqH1aX z=4=1ZYH(aH&?>l#i7gltiDd`v9PYaaE-MqTwnC0S0Z$~^qfdj4_0gMxoI4U(@&x}| zTcL?`+9d7MO3(i1?knSKS-l*mLPsxWb7`)oUu`F6n%3!Uu3`_izvh?Sqm?Cui|P`x z#0%-7=vAv13oan-~oYKj%aS1&dVi64vR?|*s`WvLPiwV{7`9UK2fPjeG~ z%L{L}goFfF`wZWv#9`7lIfn7Mr373pjgs#KHQYBpk(sJJ?1{C)F<51l5ItMUMcDqS z=Ot0D{$rB$8yt`jrGZwA-kPr-3FWVZb(T3v=ZC{>uZB+26vi<@MINoxL@B1 zEM$6Ftfq+h`5mCHlRtK`#9m%_W6@QQ7k$%Ez;v^f%w71L{!$0e5M58D@VKy`(1K4+ zUPoDqYK1okVG^U{d4`b0l#;nUs;VCS9@Ukv(W0(zv2C()1l1_@R?qbIJ2t6WyT8BC zxcn-8hN9iMRWIc7tb_JLR;2c)?rH7VyGdeGL?0Y{$S#+1e!#}CZ(9ssmZqJUpUJzN z+fqv2ZDyc=Uh`3ao5r3}kq|R`4~->fS>Lg(xL881>p~PVRfsp9DFmNY;nGJ9<93OZ zSX_PVg8-Xq4vM5tWYTO_nhXj{-sb|^R5_Km&D39IN_ysb*0!sv9mu{Ts3>3HyQVzq zhV-Ndmpw0@F`uNdmOEIAm9kSueXEi8rXyeHwt>xE2?0wcf5WqUs?194^X)$oWnqua@K0cl*<3sgke z`QmJiommDGO8433pAA5(xXr3~s)ZIA)(SPYxmoOHzo#pv-4khQX^Z>N`0^c{u<~7z zfH=Wd^Fz%+HjFL)MIK4F;upwjNyx5nZg9(l`oVkwX{lt*9{mMl z-a9&4XM&hZ!j_aQ>?i#1;0MH9@>gMTyEFv%1|J8Hk(dBoc`<*b^dy<2-pvp$?lS+# zX%l1fsSgli=oH8*-}GUdavGoFCKdOO3&3FNLCpvIz9cxa0s?+5H96XA5OG11KMpvt z`{4b5Nt5O6jw0C4rf}Rfm2q*9p77(~(BNj*>%JWjCkasEGticsW2m8^*9<^;VC5~3 zmLhM4OSGQW8K_mjzH@q?X-FuV3l*aGWbO4qPmQz9q}YBP^7@%95q=~ri_cXn2Bbt^ z9}O2TEDx%ZM+jFV4PsywP<{F8m#H?1uIR0$o1%2O%B$YD1L{SpdY(v;PgTYsd!X`@ zuHws)JaAn9#9g+@s&1CYHn!aF)O_+nbY-t2MV(GT7Q82{gBy?0C~iP-#!>LLUOUpK z{6zOR%3}mSa{Xh}WD3X31)w_wr!v^ZfouXrQA3;=-;}cund_)ytg5Gc+>7 zA@{^WWJ4OMLMLju2`|KA$D2)_DWoF$#%KFY&54lNv;!w9Y%*my|F)wwS;z0Oo>Cr-&M|e@6oa0^lk*}GmJfZ2r)ZIAd0HHH-O z_!GsL(_Yxncxg1xD~t*g^Ea8qs~R(F)Np978EOgiYIZSVH%T-Pz2T@dqXwf1=s`nRp#mcTlrG6KvO*=gKW$i@sPWJz7qJScdU( z(i3Sp8yRd(YMGLu)8WC))+!Etd}>RlX6_qHnoOPcUG8gc1SBd*rw7p7J>u4$ydl zKNzsR`u6qHC9#U9grC#;9`Wz}KW~U?2bO1`wAy{47?E zt-sdjvU>}H^ETp12hUX=dozv4JNpH^#m zJ+by9+Lyc%Lke_U5(a?Q&CrHAr$$^z7qx$UjJ7~vwd4?@6vQl1I(H<9St%W{2F2Z*lw*7Z58)>-z&J3~6EFN>jvEz6*6ND+oFVz*sJWt3FJ{wXOqL+5PF;+hK9mXwU+ zHv(MAoDAI`Damf;yifV_1htI0>iW*rzS;80;cby^Q@(C`gEsns%ew0aUz2B1F3-8r zxUVJXTyKyg&~oq_Qckros-wC_jd6!wxkg0@64x#s5euo~HXPK7<3OT{xwo^+Gp440 z^)!_7_3U}Ag)#n%7(5BrX+1Y8JjdMX6M2JT)E#3^tqd%Ybx>pNQI$mrV{UK{D43Ti zIy%y__tyjw2|gZ(l2;>Jc3~N0mg-%3uVS+=?w5D1TI8-}ez-eotNsimXMQ3j)jZW> zt*~uvGIHk>?xI-8EOVI$?aH@PUJ0)q!=M+-+CAb~V$DSivcF^Zh9A&+q9qDYQg{vS zzN|W}-KO0s!6or=#J;!n`w#h}#a}+^X%@twzbkU$R5l$jK*YwyRb6@2KeB1t7zuFD z8DY@EWvjgM`)_q^&)_x`7$Pk_q_vEFlFfuEFmyY}C0I^TvX*G$isuHs2W%x{>pfY8 zn_f5EJT^boj~(XHS4S_a(yoZ?^)~WoLq61p+#kFUcJo}3sp|voMKQ8Ij0{idR@}J9 zW_-87S)5qt-FG~P8XR$PZ>@BiNoSva@tWkFQRdg+E@X+acl1=uV%nJ(q6%Jiix*Rd zIu(RKPNgun%8<@k zj1V99i_-VH5^pn+$*xI(w z@{9cVcl(qzy;(_Ut6?j~Hd*Se|Y#HJA~OHW45eDxi1LZpUT?8PIb}xdSXu;&8R~0I6i22KnQGwa%$D+48^Zaw(XRHigoZ@B>UvwwMyed31 zlbi!_ckXqp`uhINZ8v^r|ql-i?? zyee8y28CvdV(&|@^OKVm^JqFtRc#OFq);nf9U;7uU9J9cTZ+9y`YDe}%c{G+`e=?c zi%(c!Dz;q7#o2y?e4OAS=YSF=TEbdZwy#JJ+A_J6%Qz8hiE9vFvfJ>T5tK8?7_#5Or4I5)wDMzE}f%NiI_5Px}klX=0_Ly-RZu*h)xzw zOFSFuckk(0(%MzZK8hs6%P+k8KkQ-Nyz?~aqF!lO9z+zZW@dvP$QUllkv55-F-YDe<@pm`W4OxFl!)7-Ca_d5nxJpc0J~UE&WHMuk{pR69CbD`c~UI$erQk~-xW9_v(gKaS$M z<3PzAE%z2*^^^3@F-?Um4EActnLxCu9K2a6eGAqF+OdO$G(U5^m~ z%m?daagN_Ndb_a2C*rCo+dyfCp@}q~yju3iPb7~q(tjw4=wbieag;EH>>=_RQ}f!D zCYOu6w_O9oYw~b)_ul(n=fl=o!|S*L&AY<+6*{Sn(MtK)q+ix(Ha9-kTBK&#E27Rv zX6&X5>aD9n&G=8f^G4cqL?Lp`nGtWUxRs|l4q3HHF5Y~rc*&>CAkBxK`pwYnCuF3t zHyyd29Zk2+m6S=!pe0_SFH9G#jZ&@g2ptz5GX&Xw3mT&v`BI32S$uYW zdg5$Rj#eJY&QV}M!{)2epqx5 z`UP4ujLNY>p*}By zo!NVJ?&B%Rd9PNg_E6R{f)KAKP0!A#5M1gix4^jQu;LjQ?p%sGe*eIYxQt|-+g!3E z$xnJ^7-@3(OyjM+%6fSz9gnn-DKVH^LCr6|4BLWYbz)|NxJVC{IKwiVKO<^X>`%v? zZ}sTqo07^vOi6=+36vp&wqP}SYE8o0;s<#48w$2kxAJE6YVh@8TaNj|HT4vmCQ?%D zd-lB#&v0!D@s}8_!J8s(51LfGOXB3-Pg`H{9TEx3NlIRke z`RRFk7IfAI#wVBYN~JEV?}e4kc@tQ#^n7*S*N!pH5)I}auog~5zjSU%V`%NWCVJtO z#yCEO8;``ZWk)ZqE3#GHnco_;?&s4f-zQ~d!)UG%{rdEv^t2II&75h5Hm*|H)b-D@ zOf4qRa^f5Q0W#5w(Kebl9y(rRc*xg~yN6_EfW%sppCa|fNuDlL|6t_HMT=#>4r}7_ z-XXj5QTk!NG~S1M+)1uFPQ&&utDP7l|Ey3X%xs`eJlscP-8Du;rG*nO#HdJqBB}6# zcX%ROnKTj~9{!?cQ0trESG*(f_ya7JtS|hQVAmGmPFYfU)}_Ic$_Z@#NX z*L?hhc5nnK@uL~_)OI2BWz`qT1o)Td&68M^6muJGWBa8B+;y5#hVwr57#Nxj@_P;^ zB=?7PUK>##NUspLRlJq$BxU!SE&2t<)h46(QsMAz!RrRvFUZq_JeI%H(KC*5A@=;8n9H$E{Ap-+NjfbYYIo2e)a zGf~I4crpa3ia%0(f4IEueY}l(s%SJ39i^6_VW_0y;`Lth!Y64fA8ybRT6)DUo0L9U zyU1IHuNBbX_tlGB_)_Q9fTbGd$OgP(`cR($&NQ6+0hrHHV~e>sETnA1JU=U}f-Zv^8sEA_~R zC?6NRlM9L_amk%!B3w;8dxtZRYjFf8e~*Pgaj_D;;MS8tV&o_spZD^wq0kOKAv-yjcvC(8^0`tkFZ@e-mBRFrI z9=Q1>EDo)e^-cSp3y%cHm&KR34PlO=8GQyAcT*{+Bl*ea4PsK2^Gi827gY>-l9jS+ zpHifJbGOFX6f3UR-dV)4hd?-`Z?q14yRajAjjU^rShO>;_X)Q)s@LpU*w_fOj8hH< zTJ=4#KSuk<*Z>*g|7O?ucz^Ga9jzfrLCBkqdcE~vDPVoP2@k=~K3N39LP5T?*Y&UQ zg=A69&vtXlq7sANuqHdIIjS-hDs1`R8PsfSu#1qJGeCxvY!tM1sk_nhbt<3nIM|@D z8pEpZkgKW3M_|$1xYBO+FS^SE4CUvYi(m<*1I2k`*AQ8A7 z4aQg%39lZEsp1nE`?Hk&mH7P`cr)UE&bu;8v7#4Gomr3nSW;_MzrxAB9v>T9#_34& z0MnLKgE>dzawBYp9b6ay6+VBPPglM2jk3Q**V-~EJ zqH#S@rW|=%z_S|UMA+#p;I=}6oSySYcv{b*`P)k}Zl88&@w2;6$?5fj=`ANN-u7h* zk)+~UN&6&kF8q*-t-!U$=S5S@LF3)4sBK72Ok6{StKTtbuWRO zD7k?GYq77s(3-{X)}*tn`c6wz6Q&eYeQe1aAGKwLPp@;tKyc1joYB6dB69&P!TgID zdG`4ctlOvgBrp$f$oZf2Erz!=VLv=WEAU}a^qM`C`$@%;&$`-F zc(W-ehRV|gq$9rTn8a4@@=9%GrLS{SlRn;%V1vZd!!V}QTF3K9cYo&|p(;NxK!GXWt^ z9aC0srqve!Jq0f;IKUqQAem#Bh*ThEMcYpLD321vjKf`xf(_+tRB zFZ=a?yufvY+=AL8JHfT@*zM8zo1ls4Y{0TL+;}D^)Z34 z`oN1Qtmq4H7)e)ib11m*=j2faGbYOZi8fq-H3D8l2lbH}jt5hrD%8o=%Gnv5bs%ML zV*`fF|4u#lT>+ez3~yoqylC(u8rU^J@-J3ln9@*ZQzt8j|J~8_JCZ^skLOpQzh!^~ z*gN)Q)4`EctsMSuSiKuXMgi++0mpv|eEZll3!MEgvX0!rkxEY(h%oDTmEz+8J131D zsFmgz+^JJt3~)dVsG}>?&J=p0vB6YP>BY;90^sNY9HQ8+05|`OzF(?6$w-Wqu#&$6 zf}R01M28g&GMQgU|2B>Tj%xgDfYSwDM2fnY;W#iw+JXJ_Cynueyse88fEok98>01B zvcQo}6cJ3~Q@UOx0s!VLfB_;t_K1L$%)b~r^2A4i`X}Tk{h_if05k$#!~yUMoJxNT z5*!O8W$)zV>HzjJonRO+O|B?XqM8FTw*Z-lVX&SZj(KRdC(;MQdM38I4%__P54<(v z5U>L&>@WI`TdkB0#QEpi+~3C&G=$J!1AyfM!Vq1fAvYWhWHnBQuJ$C~U%1w3v;}1L z0l-m%pYUg&2M%>)6aTifcV{TSzXcGmfR7kS#4aPCLH~;;n0ef7<95pcDE;6CW_9c_ z;)A0c+m9w=XKHT-qV_-ZSt5O&Bp;ytX(O6f;JC{6E*elLD~OHNEeN=u@gJB*J7coK zfZIDj6(q+f1!r~g!!iFCrT!kuyX422xc~?(bRrJWZUHz5Y=FYO_urAA-eSg@0I3fk zfw6t;krRR=9nY1HTqM1!tBb4^)W+=Zuy|Seb4K_4a18C0p0CFCH7croW zO2ToDWOhi7Hn0sd$bSb;=g>f+WdODUh(jC&g;H=pm^x4L{&t33v@l|{KwT;%NSZ~mRGKpjsEST#ccXhXFA zLKQd`j4t39W$j(<{-w`t3ScDWPqoK(0KiCK zV~Ay~nkF3ZB-1Lblq@9#2y$RdB6L6f1befyU5?px?cSZcnie* z-OKyyz<~}crK1@1cLrS~Sw6c0F|7h98aOfFQ;j|x=2tp>%!U042h*Dh;V0K3@MT!T z9?`UX4B>Fc6M%n(TpRSQb=XQKS6~T<8gMg$BO+vWh&!)-7o6`Fd)OtwF%*Cz#z`@iZc4qdr5~ik5XJ?oe|Fn9T`}3|~2uK2)J_9eJ)i2t^ zvE=RCV42O4ss6)FOt|0#*8*0ZfYl?i+V22IJZ|+Tq?i6>%n|niX~W<}Orl4f;9#;g zpqB+p$^Xt{o6A}@EG>BfUPP;U=?n*vQIS1?GniGJ!#gd$2ryj!u!?jSIL@J6N|+oT zhj9WRO!$-&)4Z7g5LV70it3Fk91zSzK)|6A{~C#rF$1EafU?)X#1NzF3pY3ztPKrr z*ZaGm6pH5pV3M}@gF#6TIK)q5IIKed!Qj<=e^;1geE~0``Yb)+fKoR0&d~o>Uow$# zg(skh7MMI@O>24!4gwR;i6aLl@ZsbSq`w4C4QPTtjNWi4kj_Ye?w8xYD!f|Bs{zRX z;x%{?n-v5g2m4jI!?H;rbvLLJthM$JfrYo{yMG37ZvnrE1}KgUIUn$0x1OI$RWNB$2nG+os>u{_QndR1NP_vAQK=A{!oUV z07icmdQxS4x{G`O2cRkfp&_cWH4Kh=sLKD67|dkbN%!mw0Zajap@UNfK9NPhVc^By ziOPg|G40m{g;U_`$pG{s0$>NI8V+s4226T!9FFh*i_9K|`INE)xdLFpDm79B%>BsY zm@r2FKG0z(AGX-H8^E{m0cC^;C|{$FqiEY({iPcLL(rNuy#zbxcLuzOo_-4i061^b zPzNWdDcDu}A2`I#q;{~DOCLy(5dD@>>~S1*S34K0Uk8o;oeSDvgfK^Z_x0CXW*cvs?a#DBnu?nLdvoH90m;Q&A3Pcz6& z;7U8{*T~zMK|Me|sbVe(D>0J+aPx#SnAZLWv!53`g&za3SOAKcRqUr7 z2R)%?Pdo5e^aifA^$%aYntmKY18V9DCRaVd8FCPdzs<72n3Q7zYls0ou<0ju1SYGp zkAwZ3N&J7Zl?;?OR)DF)bc`ASyE5lE_M!DDL2d1wJWpV|An@fXNTE*!gBNksW&#G_ zW};!~>SAW^{_|L(-<=3e-nmCGuL_%OAV#1`BkwrMQK#?k{=*!D+yNN-U%KW2`NuIp z9tK*5pvnE~G`D})MhXh`#Y%t+8(WtUXmcnyjth1J9!@8^K~)@phk~_7|AGAezP#N3 zsq8GkqdK-Y9=v#QhXjI_Hnc0ObiFF)>lL}$NqnSsm`0nwr4g=B||J<|2LmprBG44QKGZJ=-&|EMmE+JN4xdI-G zf7}Lfz6FfOLC29u(nNCjO5emTDRJ&S$lD4-s?nsPAE=+OF45fsQ9Zqb)L=ug%(aE^XP!WtQx)eMIUc=)C3J)Kzz;-l=QjNrxe{i;~T()cv z{KL{AT`)PP-h$6=7nwFi1zY7Cf=FEnL*gsFLPNd)tTY7Fo)Wu7kfSR!j_+wnw8oPW z%LU8*G@|NJbgL!V^>JX-UXe#@5XvFTYJGBe9webQtfWbVUx~kokWd65H0!htT@l!5 z;zn!3y1l5E2`xGtmF3}bmxCg=aeV3xRrMAnc0ke6!vJ4!_q?YVG-GylJ_dEK3k@UR|NP)cY_{5o<}#QLTrTMhCF zWF*yAH7m6k|L_kKZX~~ACNEg9{T3{XeZW$$Nj%RoG*e}?!}LsgBUuCIuJQb=NW7R7 z<9zgz;3=4**ghlAow(;I5z-nB(b*{MsM2K6?E5g;g)mue75_32eVkct^n1h8olAx& zV^O%OJ>kc-`mjM$j(XIy%s&*`Uq;~(!gYpnIExS~9KSU&EkXF&cFP+tfYLw9qIVg; zUl4_~+iR0VYf6G##N8!4yH0_4up-^GXxAkXBrG$!>6hguc=$9!3;YC6%iaEB=t0w8 zV5}AQL`2hO4t>WgQ9RdY7g4)*s2xZ6VEU#ZBDx~YC`ar(b3T%0pJPz?$kFU3L)dmT z;_4Bs*~m%Frsdt)0F)*ue43Z#mPoRNkLvknoNunDgRAa7#D&B%!Cgup+PB*y@bN+FzV=>r6C-iNu!>L%G(;C#-r{tK4UlpCw=2H)kp77S( zVZVGM#dtep^NY1cOO|=b9Zspaa0x|x4PbADSbY~^AEG9jW6YEb)^Nu3^{wIm?jY3R z*5-$4y#}$*;q941IjQ2_M)My+j0A|pqqLpTedA-0&UR%>xH5{J&K7idwM9uoZQtKW6&qR{cv~mLNEwd zR%78;OmT*@?ND*MQct=&e&)qxS_jw!Lxq_MPb4;JYHe!I`pTQqb4}9`8^PF&n2Gnp z{G~(&h7D^kwJ%$Av*N}X5P%kL$_RpB&oz>Cnke>A4nvx|ST1N)`#(nkL@mIr{vQTJ zPAOh3*3$z!=F9?tW<^}-`;ZmY#In0pOJa0Ntcfx%2JLt5bl0`?wh*wS?k%{|Ue@Eln)j5R1(+2I4F;9iP<~sM#po0XD86qFBFfg_L1u z?1oY#dn>*w+luD&H(Z$caF?nmp6ymtM?A>S`Rlvp^1Cyi(`t!V7JU?!xsu4FeI;_G zjcBuYSU*TaK_TytIX@Q(!knn7ITra9Iqp$G@3GaO|DF&EW03It&Twwy`_c_&?|6xS zz80{e0>;B5+{Z;O?1xKH)bGWSlYT>CSd((;ZFOQ5k>eYcluWsqG&t8D>306`14KfU z<>ARhi>@Ie#SFJPsu&-6^x9~+37V90%Wqjzq}eql*ZQg6?^Dh|lCPjFA10A!Jy!+> z>u6I-m#$h)wkg)|m1ErYUz(o`M{|A#A^DiwqP_%fi>l>fezG=yJ#uH5An0a9kG~X2 zcE4dt(gc+A3e{{kFb~@H0IZ*@?le}YwH~F~SVG>u&eA=BG>5E!8kS_LE9WONe3O!J zP>WKE>ZZ(FyvDun!Pt+&9Z-md?l*1T9Hiv}}>BV+GoLe#kSxkBjE9#(RQ3|B0K;gYe9rX@PNxpAynos@Yt zx=#6_zPV=Y+ZgKebd*lDw)qAAAo8T}3U+c_xZ88xwmNOjr>MU2>^ z))Naxt&$W@?)aSp9*Y1YkHqJ{eqkb1NG{s?7-spl%>rtZzIJo(zAd2A3Nv@ZUw$o; zDNIIgTe>%fy4jA%a;xMqWCJXTYv#hLUBz)lg1&P!NhpAWqUdAj`&@_b8O$-2@Jq2p z%HHAT7z>tT74xz5LoyZ53(M)7S?>tWA)wGCb%PF8Y zEuG29IeqiDLImlN0d!vVb66hHq_n#{VbG?XCaGVS)$8->-co~aqLD`dTn2x&r)fJ8 z8kiDqqnKiCAyjAdAi0#$@rA~22W1X`o*E6m`eF*GN$FU+bkna3ml!{Vy31LV(u_8& zy-35z6WyJ%@SS6=y$sy+h~Z1~Aam~lAET=-?SRmvYi&tPPBF!XV23H9Is@R2`rXgH z1@I(*eE5y)C;}-%N*kl-()%>8jIRFfRi^2HBde*?<^E10+}75P368oy4}3b}-9nIV zqI`y;JktCOz(y`vi-M( zC|Wq-LL3t<65-U~e3Lp`%rUeaX3$QvAKiMg88n(8a2b2Vh(u&ilPMZZa6A39Y^wNZ z5Qwg0L?5$AM61VOt;vd6M?``-8jDW;rX*!1?0l8`@0Njj6@~Z5P^`~t2AUePx)pPE z)*a?a@EAogyW+W*#$7}peWnk~iSka}q|Uij3M67q0(h7wL}L zm}l^Fb{Bch$cxM{B`Lt>!?Av$7+~MMtG?qJ>Y6{BeoAzkVbx1dWBwcdIhnGn;bpLj zf`wXbeGdC3?WYpdRh`*BBw{9ruJiaOjOdG5a@RO>vL)J0-}tlWj+{LJ9EHM%DY1-j7RHnT~OI zK>s|>+?=Sug_{$wBS{@NbS^V|3ps1dV?3&8;^9~EWChaKDXd#}_~Y0T{`Wv$j7Xvq zqgO~#(8F=01-r4V@nKekeSPG8CFA33xo?1n-sMq`aXa@?a5brE^bfHl;pV&Ou5Rog z`+yZ4?t(uJ@8KS8H7=OfJcZDHjzu6mu8i~3W`BPZ$muS~n?n@H0Bf{u zJB7*sZZ&FIX*iJNuXvXzfS6k|084yNTvXs=AA9Tx1iNcc_~oo#7thk3@&B-3$W8Tc zcU%Q=`B(qe&WVm&AFC)lmdTAs)=<(U?_f;PRBLtfKHp*6zKHybPSljK5->KZLlaHt zP83VDyq#+14o{DnwnuGE>B+vjHObLpQMW`&tZD09s)d9dwL*X5_ z*JKGU#MH$S9c-(T8UYCo{K;`g<0;U6cV#-$mq zbbs9?i3X6 z2!>(4=+bTNy(^#(ZiZ0xuJL!qt#}RE5|?IcF;_y2=w-pkYMX?}B`ov#mqS;9M*~+W z6z!QgPr|cHn5ghluTzdKKM2A~2*(4M$xy9Jb?ur<(?Jeup@s8vZ;*TIO$#J+vE?b8 zwnQtW9&&qjw!M%VGcDbecFIBtHxk>My4c~=yW9+fy%uCD)fy&MJ-5Esu3aR7V+$-! zm#cH7kp(vQggJW5Mla)ux>n01xHR^udhajv9taK4+?%`90C-xLb`v$L_E*{F&1!ZT zKPD=< z^&&LU+}S76Y{Io!bO95t{gKyu{=gyDOc@&CNSx$i}^~m}4;Ce-snEbpphrvG;Qn?Wwg(#&e1oi6notDbYaGA@4lW zQSxdu8mflI#jldPWoTN@kH*dgR6li_hMR%yXomp@#({Scg@^gy?vcI0DSQ~#PU0|^ zOhorIsKLdiG5Nm)yBP{!ifyu2##c96zbw{c<)DW@(R6&wJRv1HB{f_!+tz=_ouQEJ z6bg?+o9&m$=cL*;u&AZYyeHrZg^a(UaHH@(V8|sT4l`NQ`K7Wytp4j2ux+6XzW)10 zina$Ma%a51UqC6u^&WW<+i;gx@1RUfioF#Rx;2f`N5Fx5tOts>PqD)?l>PiY?PWCD zmQ?KB`R)bK;*T)wdZE(V<9$>{b(*ETzO$F!O?(ZUDXU(0qmRpQ_83Xd8uPAK)^G%H z6OkU^x;u7C#!?*Sr3-1Uz|8vE`(2O`ZT&^A$OGM;zoDVycNE?SPhwB* z>Bdhytl#484(JX)ooy$baS?|d#_l?fYSitUUqmzZOm z{U_C}yBR+omw5a0CFpqkC;G7X(lyzOY$2!pvR`?l{gbCh&wG$|6%Mu&>6Q%J?^Y=^sdp7S&kzHR6$ob63H@ zIoU3~MCD%O)pK_KrQ^VTSmI2IvpR3L<#~;CoJSVORE){<_JzoyB{`V1{CXSm?C&bK zX-H|KJt&14=-ew2gd2AvEN0az)qkbl=D^tQu^gU^x7*5p9F%x-vJZ~-rOg*LVGUkrtES04h&z7I{A=gvOSGD4r&1}Ea|y__YH(roEx+c5gcuZc z8L#Gf1e|l1l5b25ZIYDhveJ;wdEz0{1QhNqmm~AzY!15khjNf1CdCP_E}PyjS&BOL z#o)~&*!KAZ4zHtJq-Xi>yr3;5hfsKr4Jjy~{49odA(F=&Gh)}(bkNdJl+vJSPvt@a z$#y3K(u}xEFWj7zfIUizkt+T4#FeGMdW^y)8&Fu_*=9Boxc-sWtmJjv->>V$yr5i0 z;UoRMA_B?Y3$zH$=+1DeaN$)Gzf1vg30i_DLt7LRutDfyH5_K4PS@T(ohJ|NJUfC? zMpGSr`p{#%j3J8@O|9_vRyWIlnnSl8oZ?*j8#eWYgHS}GVN3Q#u z4D=`px2KgA1&(t3RvZ?#n1z`Mx!XwDyp9?sFowI*mO5SNcszoQ0DQ`8TD z@_Mff8XOl3k;oZTV4}6bfm%v7f}63|N~29bfp|Qdyxm_QlET~uANQ)nE*lR{33LU{s@Pay*(}&z zOLZWV?Z&-2Q&G#MD0~1-hjR+fnx?^ON1wjknYM<}h{Id*sz`#);t~A0aqCC7jvPoE zJLv*_F95Y?PmqgP;^n^b_KbggIt$4~`Fw7!&6*21N0@7yh08&Mz7MW95;FY@3*)0i zhhPB&FXT3K8L+j$JzrFD3UFNWJ_rDunoo_o71vo)WLv3W;e8`BLQ&cE-e+5wK%ya) z1hY4Qa;UlVt7m8AC_Ju%$lGxuCTdQ(K(eP641>_c2ktF@0HyB%khkO6NCpeSrTodJ z-fqmIX6X9EaX=M@pXHXHt&M;qYfW-z`By`)F2WutkB+D(Z_0hhJvi%`>KJJUylO9N z;_c(t2cwqMk@#4;^jiU?>)eL^;+qZkddvgvI7&Gb?djcKKsqKE-MgCr4Z)?&NKz&_Vh(vjpUwU4CiTcs$Dehzo#fv1{gwtq`{QaqI3oiiZ1qv6brBwihn%%C? zgly}u&>!MNL0R6K>hbGK{dQ=w0EE^s>FDkzk}B2W z0_y|GuTp}U&;FYY5SXN+B$z{zs%{m}pB@wd&N6U#4|+OK$1x|{XT^$X z;+d@f?Vt{Q7^KpusrC#&n%QXxLGkwMNZn?W7S!#Wd>*WL#I9UxMTQDImOj@^Lf#V1 zK5bEvmJ43P^7&ZeH$q_AdpTvh; zYqoLo7y(9pB6WhK4$>=iY-Mf$*zc$$Z_b|hxRGMbv?yAd7i)|HEOjFmusu(6NNxDQ9&b9=(1sShNz&^FNCh2`o(} z-z2d!C~DiZN26lc80JwM(+RG@**_?#T01M4Me_U*M>D9OP&jidR?nQR5{|p-Tg1oq zvG)o$EuFp6%zi^4Cw(rOceDi<8=XvQ6-_?5A`5ypI1-8m-iM%@M}FN`2q;l`a!{8a zY7UtPnOuEv`jrAmY!TZ{jrIyF`iM2l{L(n~DlwUts{|-jRDj6^tbc0ihq_>W>SBHy zSL;|>w@{e!%BDVFlm+V-XpT2(-L(QstgPno6o%5*t8^?ShbRlcJ=Xel0#jF4g@ESE zkJ8IW#JU>ke_>lhPwm|_tA3Hlh4{5nhc4GxJcA!uYl58Lyn1j zv@V4f)s~Ps!&tPZ;BPuii$vw3<}j|oU>Rwqi{9NClp z&TtiNkN_I@EYFV%B<%FS_rTq?ZPxQUb5mVO;F?v<;#2jnMsnvj z_mn`T$_jo;;ryH|Q8UstFbT^p@A#8ffH-s0v3l{`Nlu7>_jJMKPX zFGzSJdjV}6b&$OgQm9V>?6DrLg8TRr-$U0zDu}?BU5o&hSz82IDQEBMbd@owk>|%KM8)2F=Syr}lW7 zQpF-jgPf#fd@aOXO6XkjvRss3I*-EJZhbo08&WNUoVTM5<*E+<<;!sDI(twmqiD}h z>1AMyoMzkC)f>7x1C?yn<7OI z%P2$pn{W;tAFzvQZg#g}@Aj>t8*TwjXBc@@Y|SJ?I~OqxwfwGWBhLaLW`w!%DZui~ zGAe!bQr=#_#CCl_`#?#)N=&Pnk*#$G6i!nkl6QnP1sA>;O6Zkoz{kvBu14YY?wnQ4 z#kGZo)PiL;cAE<+_o47;ac?#m)eu%P`p!&(ZAPh$qCG3|wP)9=3zx<^239(_;>NVz z_RsG}R=W~~@55V_L-rEew{&7s-GdwWvmxVO$h*WG+y~`a1KTHT)8^2k-)?9`8y3CbS@cM++=2`_2S1@U;YKk=mdC0P38D?2?;n?ndw4Z+%5)B+|=lD?%(^Y-b$+2 zjl$)9kVl3U;|)W3PtCo*q7h`JGg~~jbvCaI>{xI%WDbt0KYR-W%?B=blAZI*m`!jV z3`gRzhUCuurraBGdpgLgQL3S6Pp<+p^8Y)|wa;~RGO2kx3g>q(DCN_qrja^ux_LJi zT{tBC;6$*OqVTw=eIXg&$)%U1ZQJgpQhBCP6*i#o;4TyyR#yXb1b2=GO-tl;KXk@0 zdF16+MD_+mUXD?^LwHi+EWKNY`Ip!A-iJD`{NhQGkyu02L_X} z8VbMO6qC{HC;yYWS`sk)$w!qErpuu;pwij~KQ%T6cU8LzNT>D_u)QTMq1L7sdAd)9 zxKZek+=28gDP!Axsi0iB$iX#CXX)e<^-FHq9kHM)5m}h9*qpW-%Pu*&RNaqYSB94P zKoIQZj_z;ja zvp~c@_wZ!If#qey)Yw~YV7Dx<$_xdCl8?Mkm@CR?_DI0db=??O(txc+CWGtRO#YQ* zY;reg>usjF^FN`UOtZ);DBAP+XEL(GTc$C9d2q4m#IZoSy8GglW%N`HJKa8-&y8vx z4Le?sRDKSHca5x{%U+S{iQU@UiZR2JQwMQAAMyA?29Ch_X}Z`Z4WsxsTc-E_8Ghog z%zBTU*GG!Bomw#rIqJlH-+>Y)Kcnz`Ox|iTq+|A!){IHZX@%;HhQ!T2(R;Uy)unjB zdkT30dCxiDhp+SGCNN{4IN%6)0xGTk5+g>2)L3TT+!{EPqNs z!;9-7^g9&ZxZ8bIWUhXrabnG*{9)@McW#7ZJZL@Ymo~cF=w#=KgXu3q_%HApK6u;+ z;IBx;hZcRD=NxT!BDnF8&o&M$dIjw2VDm&_{y+)4ReT&$O%93eU-5SHg1NETbM3?n za^eL%vUUG!PtwVvop^fgr;a&N|$OvT{G)|?KQ;Yr*9Ber*h{eKB;rXp-I5v%zhYa+c=r0rS>2!i^&d8%+di+# ztNR76x>8lw@LX+)o}aa*ITp?0xI_KBr3^{crC#Cqa*M&oG43S|Z$^6*=nfj5xw_Fx zPNwuQee=NR(=vTNIa72$WOeNWjnHB)DiCr_sf};E3jIY~uAlCK-x^Z$JYMuS5qU&ENUZgJ0tDvLth;+I&(b9cjK-6VC4pjFB|V_r)NddrT^q) zs{ibz+sBSO{7po-B3_I0n6APb@k2ex)O5f*?u~P4`2%WJoc-phpg%zg!PWyxR zb5ESdKm8mPPHKC7D-EM^rtacYt(QO8vTE+0I zFXqo&Pd2F>N2}yoZM3|+sJ+$SR1Dof-4gB8nh-j?b+@Q>R7 z$vte5ZhBm5hj%mZyfZ!+m#v-2^QDtl6+M*z3Dj`^8JRw zC+8dE^)UL#8x+_D>(>U~>N+;EUS?YUIFLziKNGEbqHk;$tL=+2&RfzH<8r+kS)-Oi zMCvlUx$pPTL+#%POoK8rjhy87*Nm%Wss2k*c+a_?s0TYfawqixNolUz9HDSUprva&7P=skPgPwkR?IWOz;Cs2>4H}~dqwe@_l+l6VfGbaF zmFXuGzVGb2adMcvwrdx@*^!8zas;I`iuODkujd3<<8W>h>vmD{)0i?$wpItq{_ zC_EHgKS9q6ONqhPybJ+jfT1NRPZaGLK2eXNyJu28w!ESp?tZ_8TtX-m z=B1(VtKB3$tw{=QeKW_XylZ6$H-C%&fVud`hf#PvM`Js+-VIpdqb&)l%OeL?xcqP% zFdZNnkMONi^e8CHe)|)B)z!dLQD2+8b;y*H;PwQ!7XE6_kg0mEK*cXPw4G#A6ZQ=J{{ovBBowH(J}m6DFDaefw^p!)(izUb9umL8`m zFo{02X--s+sYBidcBDfVHGt)Q_Qh;HHUt+3;+u#8mM*xoQz_`@>wHgLg>kxcGVRIigc_F7gu$=caIm}s z`r%WQ(VF(;z|GkY?4}LN*a)aI2Ei$}qqAQo92SLBRUdY~4_IlHjY zJY!jnGFy)W>zY`Z^RpgpzkD8RCdrA0m%bK*Mxz$B^0pwn$(>stgza9f=c1!1ZY(6y zKV5$)HWTggHE28)mb5`d^42C9jUlaM8K20<|J*yD(&izc^LRdHlad^a`wMN-8W;h= zmsR+A{t&>|pzxf05{?S;o|&ouh;2>AbxH`M+|Xktjj2YXC532QDdAg`bek%?4QB2n zci#JfhbRqS0S3$izs|oX$+%ZE(VUEG7-)Of!F^v`g2=Iem&RZ1d9qarHsC#eSFs%} zr<{T(<<7m}b|ug8jd0g~OI7!@Ug_5ZL`nwotuv>0D2Xi-Q<9R+G5+SnWZZ*~MNqSW z%++!?SWIu|jW^WP6o6k#b}HXs4>;3mcmFgS_Ud;4o8dJ)-s!zt`3m}$Q53F3a_m9V z%uueV?sK;Xlj?D{L)URO>`}fW%yB`Y5uCi|o$MP6H3a-8!1+YD&ptieK3W^zj7|P? z<;)llYBxKluL;d$c%Vf;F|1JAXPqb%JoI$12ExVFQ*38x$ ze!D^L401XA)tkdM2C9xr#`*!$aQ9?*tsJ z;g?~!hDY?cu;%^|RjV2J90G2+U$i+b?i9pm&b#u{qk144gkn`Iy4yl7$D!`2=~cjs~29V%0GFRZ9pf{F*nyK^6eQt zR6CiY$tt&?K?xOC4}_?zQ20T;{pa*l+cZ>;DLv-d0aD)6RPpl zZKnTdt@tiXhx?xg7xYkjBfGsEaOClRyYHZ?xH>|o#Q2MPq|;9z&Pu|^=`HcHRaO#o zZ$i6WbWuw_Q28`s#U(wJ_Kqeco8lyQniHz;ox5H40ktTjKK?CsMUN5f-4|MNw->&{RCk`Z>gVyCVLmumCs?`coUH5Nu z&-)#m59rf84W9mq3&){4S1Tk#`699WZd!}li6-UgtujybB-BrNCmKoBxy(1|X_5Rk z3h&1_tgjpKWaEj^5KXf7I~TKo20>aWjn3*PmwA zx6A7nda}`dh*hR$+|&~i&O+hi%ZPvE9B-!|lZ^bN)E9?a`78nM5em-_g#N2XGB@Gg z8hy6&t+2LyZH7!K-e z6rSS#>U|jZ@77gs1e!1^&VEVeW(J$|1T-zZJ*RD>Lk1f(?CuK}aU`*g6*WnK` z6e=$V6|8fG+1aAZ@_nAWup>^T??48qt`E`v^m{ zp*xz_yT0&9pF!*^sFt*DgMTRvG`UV@y zlT!MwJ!TEcj_^K*xX@3w+C;5)ow>g!s5LBbu+ep1--J=1~ zeIWWE7t?s0OUfp5^QTXtNK>VRyt2J=$(=y1LNLMS(_223B6Te(x8X_uWa~kBj@uBF zE8!@k!)8(t!d z4aIA`HQnM@S#RkpY^i5o+$$pc_7)KrEgP1y7ymv5RG!dYTvkdX`*Qd(^sglMZmiY6 zcYf=SH@F5%zm-$IfiIsZV%o43zgH^^xywQuJdZuMyqs*sl?Ar76RJg;-Vt}|o7ewA z`XBHf9_kgYD1C=LuKyZem4TMbi9zw5t#W5EeB*(f1wmbk!VeuJRFaYf&3g;KvHeB< zg37z!_>yW?!ydV@-2cqo3*^MeiWz>3!PjfT2kW;Ojd0g{rHb2Xf=B7Fm#va!rNSM_Rxo0mLB!^v@< zys@g3Xd67Wek0e!fAh=CwL%jZEOqwqqK1^}q6IfYN!I$c2Va5M*&uc!t?BSUx`cq2#q$MBAS%m?~9NCXf3q_}o7xH<0pK&+KXKZg|xadEjp!G~7oa9=(MpVbV2}zd?3Q7LnRox4)*F z7IR@{#(kAnBPmJLh2hY)Gv_ZIe*^h4Y?Dt*v-?WPF19JR`QFc$XQJqal36?}QPE$? zO^u?B1E;mtxmSt;n*$BU(Ln)9G;=D-ASa?-(KeK1F6I(M>};$=JES(+=0t7yS?0a# zPeUVg{-!kRH`kg-*>2{5T{3PyR2}wEC!2o7=VMbTk8HwS;QadgNA>$bI7++n@NrbI z6q;%d?!Z6x_wil|=u;Hl+uDUF!A^Tfuq3+eZEK^iFTu_Yk19F!8K$UE=^IjgxABnh z>XV!U=n^4{efd_7_;4vUIKVfIw34PEHQIA7LP}57x4hT&&op}- z-JLWGg?9})jA1aRu!SAeN0c$g%*ccvheHR`(KS3ZG4U%QQi^uWE9HW2>OcMGLHM@| zQMgw9+Dd7u^-fb@aQC}fIg3En`jC|mBJ$;*f9wT^d;;%oZ95ns8~bZpoaErmg1ICow@4H##Z<0Lad>LCL^>vXOdG)tQ#>Vm92IlCHApNN0pPMja^3|)yBQ&Zz8 z=4c-nLj?Z1%1I{n_nNw<$3Tp8kuzPal!i)U@yt2ktI6N{$IT;CEAB!LjFXaSzfc|f zNpQM;P)%NQx#xW%lVxyc(K%j9CI_DuaPHhm=|2bb5(@9kBdk)e-MgnvAKqhr^tb`3 zI|0sJXYL*1jR~w4C%3mUfoIHg-2>fo#r?#nWT~{m(4iJH-@kDk?t(fBRKC8rDMdxKyI(^? zYujSjp>@DML*a?2zk5ot`lA#iv76bu>F~kUwCUCh8ur9{v?p_K={ukhD+X=3dc7+B z8`BAh?kJup+B39|f@W(kIqh_(5V=<5kQ{+-%i%GHm;YLWYdK0a~?=#mhbyPU@Zr0B-}Y4Zxj zEv=@W1eiiKzH=|fAUW9f(RyPCS@l?fDYQKdH*V-|&Z#n33RMr7YL(on71OmMUNRZl zE{7Uu&#yzIFKHYbYe~R&Ed5jP)n>WDeK`GF4(iAKz~z=vZJI4MIQeId@L>h+7>J2JieF~vm z`&-H=DVF*hg->S8H`Fb4GH`m)(vbFZv=sNb+eb^Wa53(wKKIl0rYv9wkhu=3kCjrX zx24Vk)WSac;--m4oKGPvHv!8yDK?}@VAV8;>pi}+&tZs5Uj(UwzuNP0yp*f$lO>P-?b5nl(>RrPLU zsxocd@vVT+7as~TSnOn1n7l(ysrKmLRs37(kOdgSGDT!0C#FOzhNQeDCZ(fj?Q0h? z#!M9uk%{yz7R9>e^)6F4y#r$}^irFNF>RW_fL?+y_3nZj5&CF*Xj@yXu_iiL<3?Yr zttXm10(>)G!q*UAOy@6YnP`enGT9cK!m;#3$0yvd%XM3mpZ3FC$)rC#Sa$|z+fFpd z8{_PO#rtPKz_Td)I+u&zix5*!bAmcV=yj{r7&?~M3!?D6^u}2N#crzhv$l#>2?#6S z?;2Wl4zkDjS*sM7E0E|eY03PKW*-ekXIwN4gfSrSJx4X?3k0;Q8~x^M(X0ubAjL*P zU8T}36hPtDUO_Rzmd?0!IZiPIeSc>6#>SaFJOUt(C#zJS#R7?r&CqUJ+=`WKrnAWM zCL8+ZYTZ9U!RO3$gJg~$1sW*4B>Mf`$x>me>xz&xNSEla|*##*dX46aB;AepymS|2e zA;s%Pmy0gM)qlOf3paO` zYwo8(5#t}?|Gfk9@GVY@Hwgb8^57ce|6h3_59fHShw`>SdAzqj+9=|U4KRz>$Rs)m zv)9E~Zv7%q!jjA>G59t_Y)V{wD>@7a8im83AHnGL0}R+}YI1`+8t;-J@bo zeVB9Qia^mEgk0(ADds1epTpNc=p{90H~XPEICtZcY~VI zDEV#DyQMDy!bcZ%fyu&q92safCFAHBwx>p1q0(+dv>3* z?FV(_4eHsg|2Ep%Uk zz+{Ioo*DgZ6pd;&hoznTBzFj{*kHep9Rp?IQXe^zEz$J z1kEmKKu%GFZbb*0+x-hsb^^$^IZb^jz+mT&i4@&XgS*Q5+7#wyN;LxgdH3{rm;S*E z9zlbA>hb6mf5A5)l8>Pc1LDk@0@>dKanJ=(=3fC}cf@jo`tM+;>g3DmekyPL)t;!= z0)oaEniNovcGKe?PHi@;Dg?TTRw$$4@N3E&f#^rqM7BzZp;P7R;ieaAx$K{hYv_zd zVF2?nV7_+(5EiQ#19Mcacahd@UZC(9!SeS40ChAvKrsfQ4Ct|>ALRr5T|}9Lvq<)Y zA*R9PgXQYZuq)(t7O46h+>sZn%NHLV06Kr>LzM}%CdQePBl^TeSz{GO8g}D)mEVA& zZ>n;?G(24+Sbbqw4+&N$jmDe>sn}~GW{9?BexpaqzW|~q5lKq3iJ7TGvN|d)jy8Kj? zcAty~EDF}o^K2_}i9lzIHjcGT9gUl0Rzk_!w3qag%=#u7`>9BE9<;|iitgf5GD!2@a2XZB}9t$RoXPvaQC``*J}V6hM6jF#08~9XlP1YlsVDJ9Q=;; zT>lQ@wFa%Upm*4685POMC|=C`Z!+z_v_Ns(ad#~%@ow@y3nV@@53I~crdWK<$du^VWGk;?&NU5oM+5X3s>t0;kIzL|8a#gG z4qHZShFryfE6Qx5l#ht=jgPk?UR919xflF)g#!D&;CL}ki7Fx|+|Q}2mXzUBgccW@ z_ZmD6W)<~`J}~T3Rm9=0cT1cpHVwgwZ{)0?SP)OROc#P{FrqW|F*5yG^Gus@ACyOL zWDU65GS`;V`I^(4C+87WcGj z1gE*jxOi5ho2w{nNq_vOF*KA1;}v{)c4(tCzCvDm{|p@tRt0o2w8-r^pRWjJtt>}X znX>y$E+`UL`RMxBqyP~WN?~oRrLQ^Bn~X*dJ2oM#5v2qcqtd)}9|g)`a!&i6`FD;4 zgQkRDtW%V0DsptusA_nr?6J2G?Wm7Mtir{5hjGi+)G5i9SRY5y%cAOBjedLHb_m3x zTbnp%L9oc7o@&oT%d1!L>gMaTEJwKsKK6DE6*)8^No;9K>MqBGm53j54wxFi@Rgzd zEksNR-GhrS)!HT|zKLCMMWx&6pjWwFizweg5r-#=_N)pM*>$|GM3KDWdGeoXPV;Z9eCS4(x#1$N8Af(1UCF7; z92P#ADbEOqF$0CK7N2S#_KU$B@xQ_R zo}Al-xWw7F!J`lH@M%SpHX_queMl$SF6MMY?LBM716mKK?Rnf~4sI(_9p9|6n_r|Q zCb_E{aHXkt=Pd;IE(+J>;&vi9^#)hvfW0oD#x^<-c@+^a&wG#iRs_*a*7)kS+=5FT zUHs!NNJ1F^Ud@snMF^{=t%JF#=6`M1ZrBSbu0hd7(zQB?;8c@=gx>a9vq3bs>emMO z4+EMG{f%!@2#GR=2F1mt*qnm_eR!6Tq+w8K19)fNGRZLtx~o!GBF)o%&&EM?zs!FS z(;Ldwp0B!yAbhSH!J>DtDZWbz)|7A~nrvZ-h(#XOOm`RU+!YBdK9{suT#0h2s%L%D zoBROwt?HzjYIS8Gc8bNk4enb0xptDOb&;aK4n{q3#90@p*GZHRl@T$qu9Wxlqq%7U z?1hKd8IvU}e*}5>w1Xl^?HhUF=c}mdG-N?|*Qnc5gi#+;c8$>E#hZEpavpl;u}!-^ zA_RM@=o=G#zD_ZxDAIOQ9{-)AJWxA;;xn4x`iUre2cXfmtu&!j=F3~&41U`6t;+daRF$YP4e zZUx(%O|Gr?GvCd;2&r&1Pp7S7qeNV|xl2l{DbaA8ud!vp&czVq5ei>VYBWY<8Rtws zKHU~VIpnv2iJ0wp%z!A|mex-YIrgYSuAK?{%vC6X znG*`<-Q@FWBEv2V4Mxf^!_p>qx;an`WxRM0G;X?xYH77%<4qr`ml<~|CAk@j{_c3v zb0#D#kD79A4fsyPI)Xl&tCrWa{M{8l(~x!_n&)2S+nFNAu#PzLl=RId+WSqbfjrvF{j&&Z z72iGH+AH4PgxFhwEu?fglz~@RjQ*2t*oGZPq4E!CJ-%MtV6{kBuM75l+2uCHi{-Iz zgjX_Xok%bo5VD#tm-z#b?HH^0j401W5t2G>@xx_mh#65$x@ul-QBlob2G;~L3z&R( z_uZmq%30k$Y-%?Xjj$huTh-pJB8%KiV#}^rLX&(@jjZax%5n8+$pBv^)A_5#+e8qy zzbBgGqZO{fXT_NWn$R9|v59B|S6T*z%~#T76C`84h$SBaK&D$dd1D;@RivkGO5%+o zSK#+&`;FQFUNI$O*ka>0U1n zlpl$pft%~J{UV_yT)lFL&U<0OH*{vNHfqG3)x(1#q(xMcIk6`tP~^hw{jl#s6L1p1 z;gLs!!y?CiOSGIZ_NU9QM#3zYqVU!_ctm6{TQKknWC0mYTrIH=JW9^<(_)LT$4s*? zm=rFthM^|gze{M}=i&x_<7w$r{Q)0~!pF5e$3(b&UKkY70=`GFEp^h`78lRmM7tW|{KML{~moS})S@3nEENy(&aHIqU7%04Tc|3SXIuxh8_d7L@mcLj{Wl zt^(x^3J;r~Gm_&Yb1>b`mM$sS-p45ss)`PM%D@V>bfXkY6eGbTR+$7 z^oGuiVoSHq^Q7DoNrna*nQ>$wdHrtzf$oK8+8q&+Dvs6w^6K5Gx@axkgHO99cxPO5 zPsTHt-ZyX5>d#{kh)$Alr%~&Hh+>WiySk$-ZsHX3NaGXd48WC89+MEEb5Ggvp$Kn{ zM8B#jeY0KvB@Fe<0K?^sGfzZ@pCwt@7sFp$a#1B+GliX>i3}Evr6p5nxzuKj1)8Jf zUfvMn{uaRw^QEtSsLsJ;2&_GdQp*%E@@!_K7b1!+M5HBY8=e2}ZN7khfD(CjD)yxa zw(kpQiR+KzX@yE|d115adz1m}7r=OY{q~gzvxQW0#LWU1Ek~sm*Xdso!7PqGN@Y76 z>t>ir|4m{o%2pwVrwcVkzZT)@4*#G_;g)o#m+MUV@3$hsJ_}Je$Pk}ZnZHKl8rMjpZ4{gNV|OG}@O+Jy z+YJa02iK;{ECd(;An&HUb@ZmskVhqfpl=bC22OjPrWY}(k*d+oMDjAd=C$BE}Mi9B0o$zUSc>c`4K{UKL9=$nTnIkGZN6nzmQ z8tw~oQhYPn6sxw*JXL$&pnHHQFTnfXAGjkuJI_0BAZrfvY3{nx7Z<6vKCSM43oSXLHbA)NC_Js>S4zaB zUKU|L0EE2|_U3mZWRJ5A%Qi)`yv(hSH6uJldPKAdr}Pvf^sAev@>3FeH1x+k#0_r| zVh|HfTJ}l#;XuqrDTAUtFUpFD#&HSwzB_pugNn^VzAENTNQZ@xhk|HNjfP)`%89^K z%kWk%w-K%G=KX6r!{)}~WFOBSZ>}Jt$-|Iu*X4Si0trTm42qg zL|m}zrt&Yp=y~iV#I6Ca@1@C%Utu*A_^_^6F;sMjr;YXv!}rEK*5uIl*=e;DICyAB zh9si9C4t<5(g{xZX??bp5bZV!_Xs=cspzKoXtQJEzZ+HbUOBMU3XuOn;XUy{eI?y~ zdRg9d!)wQT(*=47m`!n$*omzJTKph1UE|)c2~5u%a~L^y+RpFS7eMb0!%VL{gw-CO zMhY%^ME7Pm%dXy=HGk8Que@LgH2>zwfm!|vs6Rf~ksN@GdNAd9#g;He7+tfe!Y;~;i*rUJjO71W66uI3n=xPi}2gCTEk zQK4i>z<PQJMo{nY!}9L2^5@2ddP3muPV|3*QzubmivlI6+dnqd@A(8N#Y zc<|u?X{U2GTwn^Fe3eT(d1@|?hNyp51a|xq$hB=1+|(>vn(SfM+~$vdgWQzmsfoYZ z6WU(E4>xy1J}cGU+&5$YbQ#*e2Oc*a=r%X?>Y#WdM~n>};XrcsMC2W^k)mi* zFZPC$(TX=1nMd;@SsN||rUa0D2x(we;KEbl<0*}9gw4Gze#b6Icn(7dS8yFfrgCfU zgHJjnTH~!LNe2GycGfmSGDB9n6_cl9!z>DL>NpyS@zi)3v-0`ME42 zD(Zz%wk)L8o|{7yU|ZyApxu4XgSODkEJI+){NP2@2nEvKVrj58pEivKe1MGWU>glJ zS@A1+w1RC9VZyA|*i;pJBO8G)QNy1ksXqKjL0G9`EAG+EXC{(1Jia?NCe81XH|Lge zdA{~Q6=*}-Dt(^3Kzs~4I z|5m-b=q+Bb951TNUX*)E+F#@wg}kxRYjUKoR(uLxu?mLEeNMtu#cR@FThY08{6VV? z6+z`5IC8pzn#R!Qmrl3p{0H(SSQGDL7r#@G?Jjd>*Qq=Y zwlmJf?T=fjc!yp7G$aRlt`C1i_boR8pLfmSs}*d!*tR7EqwQJ+8*V9G9ZmTanvw?^ zIo2x3TKJNhLsW(_H_B%3z6}OKM8&O^yLp($hMmT z$LBoDHcN3Wt-;p#E`F9k2VdTD7l;0}Y#*>RmEtq_qg$j{tdIv-aVsoN-y4Zr+-u&5 zx!`U`;oaokFH)`@O1EI)mMw)2-i3UY{t$p)LfA6+t3AJOl|ub2#!_yIUQ>hGi0+W* zQa;rQy z3Liyk{HkOcE3?kEw|(fK9VOm)-92|ok!X2b)@rQK(#x)I`ySAZD0~p9u}cbdOKf%P zUSl7KNV6DDEV)}s^s~6pWwCPit5NQbR@}KR7wnM|seO!lQNPjw&9(xW6G$)o)t=RR zrAXtZSy?%MPD)SF4GMgK-@H$XL(`CuZrUbq*D||7rE~XO$TRz;RO32(?y#&QliY;D z)p+xO6z5*TU3+^JpAX!xD7@asf0H8p5GI&S@y6P`vOQ$$0tc0Q&OHaERM=!I_uahk zgFWS!0($_3PZ72pl49*1&d=f=ov~YJ^d4ZT{kaF(a#)IPX@$(j%@x*W(i-ZSG3#Huk$D~|TKP`$qvgU|qs?Bm| z^3!n@*Vwqe&u}VnF(jqt;*<05PDqKQfwYLasz${|WLjRZ0dBREPfEcpt@ai(HiNVM zn>@Y)?61J`F18B!1ue(fIW;P=L*2O4JUioSF9DSz2_B=}J8eKsgC*415baANG+hY6 zTkOsmDcNmDi2paR4FwT_E*f}tR!X#WE_ZQM`QCreKM5+W%yT=)bzVVD^#{fc)+`~z z#lrwc1I%NdS{I~XcanzPc-?I;fE4j@M-cYA6lf15jitO+{ljh=0Luc(Jyw^CQfL~Q z{#mvr^LK(-$VJfPOHyW9?0>?veMPPVN=YO>YK^)qg~FcP82{NbbE?pEd^RGK(m-p^ z)+W*G6xOkdZ567}`KS)iTeEj#qsTvdmrk7Vc5l0tx6R+==Xj@e*XuO;dqnIZvTCx z0C^KoH9PzL+WUf(>Drw^@2bE2OT}vypI|`zFYRfs5 zruA+whtjU1@D;eB&-J8MnAbY)V#dzV&gfol_VesJaJcJYfbXGrp=i&@7a|;o`^~+5 zLTC>Qb}XmFD)tt1^c>WWEarDuUkQzcU%g%`aH=MG-zl)l2Pkk0jE|!#{OgKx+_WgS z7T??D5_&;~(J0*P65hC?d?WmWg5;pZ-$zFL4ah9W#bbpkZ(TtSnH(QmFz&XMw+#G? zmUezX;pWosok;F$N$|0KWf|!fxr|+|H(XAqmg#7ZCurK!;=P{K){;Q;u4Geuvcd(F zXrF7qG|*bYjLT>!{CfXELUZqjtA0Db)kpvn0pvsYjgNX@fVnenqor@yB&6UYw`%8J zXwt|Uy#dV%XlW+p_Hlnf^c>IcafbJqh=`+Y~3akZ~{O-5LyerlRl@%@aP+ zliJ$VuKX@Vy6g9Ez5{0~B;(E5Caa!h|2lY#dm9-LKBr4TcoE##r|YjjX46B_oa!i| zQ=hH{t3$F(fN|^nB&QzKq-{``Tf;at`1ZNR0Nw$RPeI1#(gRZ)!F_$3&u#mjZUlRX z!Xwb~pX#X&CAyWg?7%BtGtn>yQ9Mz!XIvgV6FPJ=OjP&JaFr&X6r=EFPROgL(K%Zz zf8b238))VwD{4~sWI;1?i|&xm1?q4Ga*Hn1q{mGPwZ8_ Date: Mon, 15 Apr 2013 17:00:42 +0200 Subject: [PATCH 008/169] render method default flags in JEView --- .../jdt/jeview/properties/JavaElementProperties.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java b/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java index 0acd38966a..f71da99768 100644 --- a/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java +++ b/org.eclipse.jdt.jeview/src/org/eclipse/jdt/jeview/properties/JavaElementProperties.java @@ -626,10 +626,12 @@ static String getFlagsString(int flags, Class clazz) { rest&= ~ appendFlag(sb, flags, Flags.AccProtected, "protected "); rest&= ~ appendFlag(sb, flags, Flags.AccStatic, "static "); rest&= ~ appendFlag(sb, flags, Flags.AccFinal, "final "); - if (IMethod.class.isAssignableFrom(clazz)) { + boolean isMethod = IMethod.class.isAssignableFrom(clazz); + if (isMethod) { rest&= ~ appendFlag(sb, flags, Flags.AccSynchronized, "synchronized "); rest&= ~ appendFlag(sb, flags, Flags.AccBridge, "bridge "); rest&= ~ appendFlag(sb, flags, Flags.AccVarargs, "varargs "); + rest&= ~ appendFlag(sb, flags, Flags.AccDefaultMethod, "default "); } else { rest&= ~ appendFlag(sb, flags, Flags.AccSuper, "super "); rest&= ~ appendFlag(sb, flags, Flags.AccVolatile, "volatile "); @@ -643,6 +645,9 @@ static String getFlagsString(int flags, Class clazz) { rest&= ~ appendFlag(sb, flags, Flags.AccAnnotation, "annotation "); rest&= ~ appendFlag(sb, flags, Flags.AccEnum, "enum "); rest&= ~ appendFlag(sb, flags, Flags.AccDeprecated, "deprecated "); + if (isMethod) { + rest&= ~ appendFlag(sb, flags, Flags.AccAnnotationDefault, "default "); + } if (rest != 0) sb.append("unknown:0x").append(Integer.toHexString(rest)).append(" "); From 1272c9f6f907eed518cb0c118654349add1f93d8 Mon Sep 17 00:00:00 2001 From: Markus Keller Date: Mon, 22 Apr 2013 17:38:12 +0200 Subject: [PATCH 009/169] - removed copies of GenericVisitor and NodeFinder to make IntersectionType work - ASTView also handles double-click on list-valued properties now --- .../eclipse/jdt/astview/GenericVisitor.java | 765 ------------------ .../org/eclipse/jdt/astview/NodeFinder.java | 93 --- .../jdt/astview/TreeInfoCollector.java | 8 +- .../eclipse/jdt/astview/views/ASTView.java | 27 +- 4 files changed, 24 insertions(+), 869 deletions(-) delete mode 100644 org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/GenericVisitor.java delete mode 100644 org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/NodeFinder.java diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/GenericVisitor.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/GenericVisitor.java deleted file mode 100644 index 38ee08f48b..0000000000 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/GenericVisitor.java +++ /dev/null @@ -1,765 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.astview; - -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; -import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; -import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; -import org.eclipse.jdt.core.dom.ArrayAccess; -import org.eclipse.jdt.core.dom.ArrayCreation; -import org.eclipse.jdt.core.dom.ArrayInitializer; -import org.eclipse.jdt.core.dom.ArrayType; -import org.eclipse.jdt.core.dom.AssertStatement; -import org.eclipse.jdt.core.dom.Assignment; -import org.eclipse.jdt.core.dom.Block; -import org.eclipse.jdt.core.dom.BlockComment; -import org.eclipse.jdt.core.dom.BooleanLiteral; -import org.eclipse.jdt.core.dom.BreakStatement; -import org.eclipse.jdt.core.dom.CastExpression; -import org.eclipse.jdt.core.dom.CatchClause; -import org.eclipse.jdt.core.dom.CharacterLiteral; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ConditionalExpression; -import org.eclipse.jdt.core.dom.ConstructorInvocation; -import org.eclipse.jdt.core.dom.ContinueStatement; -import org.eclipse.jdt.core.dom.DoStatement; -import org.eclipse.jdt.core.dom.EmptyStatement; -import org.eclipse.jdt.core.dom.EnhancedForStatement; -import org.eclipse.jdt.core.dom.EnumConstantDeclaration; -import org.eclipse.jdt.core.dom.EnumDeclaration; -import org.eclipse.jdt.core.dom.ExpressionStatement; -import org.eclipse.jdt.core.dom.FieldAccess; -import org.eclipse.jdt.core.dom.FieldDeclaration; -import org.eclipse.jdt.core.dom.ForStatement; -import org.eclipse.jdt.core.dom.IfStatement; -import org.eclipse.jdt.core.dom.ImportDeclaration; -import org.eclipse.jdt.core.dom.InfixExpression; -import org.eclipse.jdt.core.dom.Initializer; -import org.eclipse.jdt.core.dom.InstanceofExpression; -import org.eclipse.jdt.core.dom.Javadoc; -import org.eclipse.jdt.core.dom.LabeledStatement; -import org.eclipse.jdt.core.dom.LineComment; -import org.eclipse.jdt.core.dom.MarkerAnnotation; -import org.eclipse.jdt.core.dom.MemberRef; -import org.eclipse.jdt.core.dom.MemberValuePair; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.MethodRef; -import org.eclipse.jdt.core.dom.MethodRefParameter; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.NormalAnnotation; -import org.eclipse.jdt.core.dom.NullLiteral; -import org.eclipse.jdt.core.dom.NumberLiteral; -import org.eclipse.jdt.core.dom.PackageDeclaration; -import org.eclipse.jdt.core.dom.ParameterizedType; -import org.eclipse.jdt.core.dom.ParenthesizedExpression; -import org.eclipse.jdt.core.dom.PostfixExpression; -import org.eclipse.jdt.core.dom.PrefixExpression; -import org.eclipse.jdt.core.dom.PrimitiveType; -import org.eclipse.jdt.core.dom.QualifiedName; -import org.eclipse.jdt.core.dom.QualifiedType; -import org.eclipse.jdt.core.dom.ReturnStatement; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.SimpleType; -import org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.eclipse.jdt.core.dom.SingleVariableDeclaration; -import org.eclipse.jdt.core.dom.StringLiteral; -import org.eclipse.jdt.core.dom.SuperConstructorInvocation; -import org.eclipse.jdt.core.dom.SuperFieldAccess; -import org.eclipse.jdt.core.dom.SuperMethodInvocation; -import org.eclipse.jdt.core.dom.SwitchCase; -import org.eclipse.jdt.core.dom.SwitchStatement; -import org.eclipse.jdt.core.dom.SynchronizedStatement; -import org.eclipse.jdt.core.dom.TagElement; -import org.eclipse.jdt.core.dom.TextElement; -import org.eclipse.jdt.core.dom.ThisExpression; -import org.eclipse.jdt.core.dom.ThrowStatement; -import org.eclipse.jdt.core.dom.TryStatement; -import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.TypeDeclarationStatement; -import org.eclipse.jdt.core.dom.TypeLiteral; -import org.eclipse.jdt.core.dom.TypeParameter; -import org.eclipse.jdt.core.dom.UnionType; -import org.eclipse.jdt.core.dom.VariableDeclarationExpression; -import org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import org.eclipse.jdt.core.dom.VariableDeclarationStatement; -import org.eclipse.jdt.core.dom.WhileStatement; -import org.eclipse.jdt.core.dom.WildcardType; - -public class GenericVisitor extends ASTVisitor { - - public GenericVisitor() { - super(); - } - - /** - * @param visitJavadocTags true if doc comment tags are - * to be visited by default, and false otherwise - * @see Javadoc#tags() - * @see #visit(Javadoc) - * @since 3.0 - */ - public GenericVisitor(boolean visitJavadocTags) { - super(visitJavadocTags); - } - - //---- Hooks for subclasses ------------------------------------------------- - - protected boolean visitNode(ASTNode node) { - return true; - } - - protected void endVisitNode(ASTNode node) { - // do nothing - } - - public boolean visit(AnonymousClassDeclaration node) { - return visitNode(node); - } - public boolean visit(ArrayAccess node) { - return visitNode(node); - } - public boolean visit(ArrayCreation node) { - return visitNode(node); - } - public boolean visit(ArrayInitializer node) { - return visitNode(node); - } - public boolean visit(ArrayType node) { - return visitNode(node); - } - public boolean visit(AssertStatement node) { - return visitNode(node); - } - public boolean visit(Assignment node) { - return visitNode(node); - } - public boolean visit(Block node) { - return visitNode(node); - } - public boolean visit(BooleanLiteral node) { - return visitNode(node); - } - public boolean visit(BreakStatement node) { - return visitNode(node); - } - public boolean visit(CastExpression node) { - return visitNode(node); - } - public boolean visit(CatchClause node) { - return visitNode(node); - } - public boolean visit(CharacterLiteral node) { - return visitNode(node); - } - public boolean visit(ClassInstanceCreation node) { - return visitNode(node); - } - public boolean visit(CompilationUnit node) { - return visitNode(node); - } - public boolean visit(ConditionalExpression node) { - return visitNode(node); - } - public boolean visit(ConstructorInvocation node) { - return visitNode(node); - } - public boolean visit(ContinueStatement node) { - return visitNode(node); - } - public boolean visit(DoStatement node) { - return visitNode(node); - } - public boolean visit(EmptyStatement node) { - return visitNode(node); - } - public boolean visit(ExpressionStatement node) { - return visitNode(node); - } - public boolean visit(FieldAccess node) { - return visitNode(node); - } - public boolean visit(FieldDeclaration node) { - return visitNode(node); - } - public boolean visit(ForStatement node) { - return visitNode(node); - } - public boolean visit(IfStatement node) { - return visitNode(node); - } - public boolean visit(ImportDeclaration node) { - return visitNode(node); - } - public boolean visit(InfixExpression node) { - return visitNode(node); - } - public boolean visit(InstanceofExpression node) { - return visitNode(node); - } - public boolean visit(Initializer node) { - return visitNode(node); - } - public boolean visit(Javadoc node) { - if (super.visit(node)) - return visitNode(node); - else - return false; - } - public boolean visit(LabeledStatement node) { - return visitNode(node); - } - public boolean visit(MethodDeclaration node) { - return visitNode(node); - } - public boolean visit(MethodInvocation node) { - return visitNode(node); - } - public boolean visit(NullLiteral node) { - return visitNode(node); - } - public boolean visit(NumberLiteral node) { - return visitNode(node); - } - public boolean visit(PackageDeclaration node) { - return visitNode(node); - } - public boolean visit(ParenthesizedExpression node) { - return visitNode(node); - } - public boolean visit(PostfixExpression node) { - return visitNode(node); - } - public boolean visit(PrefixExpression node) { - return visitNode(node); - } - public boolean visit(PrimitiveType node) { - return visitNode(node); - } - public boolean visit(QualifiedName node) { - return visitNode(node); - } - public boolean visit(ReturnStatement node) { - return visitNode(node); - } - public boolean visit(SimpleName node) { - return visitNode(node); - } - public boolean visit(SimpleType node) { - return visitNode(node); - } - public boolean visit(StringLiteral node) { - return visitNode(node); - } - public boolean visit(SuperConstructorInvocation node) { - return visitNode(node); - } - public boolean visit(SuperFieldAccess node) { - return visitNode(node); - } - public boolean visit(SuperMethodInvocation node) { - return visitNode(node); - } - public boolean visit(SwitchCase node) { - return visitNode(node); - } - public boolean visit(SwitchStatement node) { - return visitNode(node); - } - public boolean visit(SynchronizedStatement node) { - return visitNode(node); - } - public boolean visit(ThisExpression node) { - return visitNode(node); - } - public boolean visit(ThrowStatement node) { - return visitNode(node); - } - public boolean visit(TryStatement node) { - return visitNode(node); - } - public boolean visit(TypeDeclaration node) { - return visitNode(node); - } - public boolean visit(TypeDeclarationStatement node) { - return visitNode(node); - } - public boolean visit(TypeLiteral node) { - return visitNode(node); - } - public boolean visit(UnionType node) { - return visitNode(node); - } - public boolean visit(SingleVariableDeclaration node) { - return visitNode(node); - } - public boolean visit(VariableDeclarationExpression node) { - return visitNode(node); - } - public boolean visit(VariableDeclarationStatement node) { - return visitNode(node); - } - public boolean visit(VariableDeclarationFragment node) { - return visitNode(node); - } - public boolean visit(WhileStatement node) { - return visitNode(node); - } - - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.AnnotationTypeDeclaration) - */ - public boolean visit(AnnotationTypeDeclaration node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration) - */ - public boolean visit(AnnotationTypeMemberDeclaration node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.BlockComment) - */ - public boolean visit(BlockComment node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.EnhancedForStatement) - */ - public boolean visit(EnhancedForStatement node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.EnumConstantDeclaration) - */ - public boolean visit(EnumConstantDeclaration node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.EnumDeclaration) - */ - public boolean visit(EnumDeclaration node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.LineComment) - */ - public boolean visit(LineComment node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MarkerAnnotation) - */ - public boolean visit(MarkerAnnotation node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MemberRef) - */ - public boolean visit(MemberRef node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MemberValuePair) - */ - public boolean visit(MemberValuePair node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodRef) - */ - public boolean visit(MethodRef node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodRefParameter) - */ - public boolean visit(MethodRefParameter node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Modifier) - */ - public boolean visit(Modifier node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.NormalAnnotation) - */ - public boolean visit(NormalAnnotation node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ParameterizedType) - */ - public boolean visit(ParameterizedType node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.QualifiedType) - */ - public boolean visit(QualifiedType node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SingleMemberAnnotation) - */ - public boolean visit(SingleMemberAnnotation node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TagElement) - */ - public boolean visit(TagElement node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TextElement) - */ - public boolean visit(TextElement node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TypeParameter) - */ - public boolean visit(TypeParameter node) { - return visitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.WildcardType) - */ - public boolean visit(WildcardType node) { - return visitNode(node); - } - - public void endVisit(AnonymousClassDeclaration node) { - endVisitNode(node); - } - public void endVisit(ArrayAccess node) { - endVisitNode(node); - } - public void endVisit(ArrayCreation node) { - endVisitNode(node); - } - public void endVisit(ArrayInitializer node) { - endVisitNode(node); - } - public void endVisit(ArrayType node) { - endVisitNode(node); - } - public void endVisit(AssertStatement node) { - endVisitNode(node); - } - public void endVisit(Assignment node) { - endVisitNode(node); - } - public void endVisit(Block node) { - endVisitNode(node); - } - public void endVisit(BooleanLiteral node) { - endVisitNode(node); - } - public void endVisit(BreakStatement node) { - endVisitNode(node); - } - public void endVisit(CastExpression node) { - endVisitNode(node); - } - public void endVisit(CatchClause node) { - endVisitNode(node); - } - public void endVisit(CharacterLiteral node) { - endVisitNode(node); - } - public void endVisit(ClassInstanceCreation node) { - endVisitNode(node); - } - public void endVisit(CompilationUnit node) { - endVisitNode(node); - } - public void endVisit(ConditionalExpression node) { - endVisitNode(node); - } - public void endVisit(ConstructorInvocation node) { - endVisitNode(node); - } - public void endVisit(ContinueStatement node) { - endVisitNode(node); - } - public void endVisit(DoStatement node) { - endVisitNode(node); - } - public void endVisit(EmptyStatement node) { - endVisitNode(node); - } - public void endVisit(ExpressionStatement node) { - endVisitNode(node); - } - public void endVisit(FieldAccess node) { - endVisitNode(node); - } - public void endVisit(FieldDeclaration node) { - endVisitNode(node); - } - public void endVisit(ForStatement node) { - endVisitNode(node); - } - public void endVisit(IfStatement node) { - endVisitNode(node); - } - public void endVisit(ImportDeclaration node) { - endVisitNode(node); - } - public void endVisit(InfixExpression node) { - endVisitNode(node); - } - public void endVisit(InstanceofExpression node) { - endVisitNode(node); - } - public void endVisit(Initializer node) { - endVisitNode(node); - } - public void endVisit(Javadoc node) { - endVisitNode(node); - } - public void endVisit(LabeledStatement node) { - endVisitNode(node); - } - public void endVisit(MethodDeclaration node) { - endVisitNode(node); - } - public void endVisit(MethodInvocation node) { - endVisitNode(node); - } - public void endVisit(NullLiteral node) { - endVisitNode(node); - } - public void endVisit(NumberLiteral node) { - endVisitNode(node); - } - public void endVisit(PackageDeclaration node) { - endVisitNode(node); - } - public void endVisit(ParenthesizedExpression node) { - endVisitNode(node); - } - public void endVisit(PostfixExpression node) { - endVisitNode(node); - } - public void endVisit(PrefixExpression node) { - endVisitNode(node); - } - public void endVisit(PrimitiveType node) { - endVisitNode(node); - } - public void endVisit(QualifiedName node) { - endVisitNode(node); - } - public void endVisit(ReturnStatement node) { - endVisitNode(node); - } - public void endVisit(SimpleName node) { - endVisitNode(node); - } - public void endVisit(SimpleType node) { - endVisitNode(node); - } - public void endVisit(StringLiteral node) { - endVisitNode(node); - } - public void endVisit(SuperConstructorInvocation node) { - endVisitNode(node); - } - public void endVisit(SuperFieldAccess node) { - endVisitNode(node); - } - public void endVisit(SuperMethodInvocation node) { - endVisitNode(node); - } - public void endVisit(SwitchCase node) { - endVisitNode(node); - } - public void endVisit(SwitchStatement node) { - endVisitNode(node); - } - public void endVisit(SynchronizedStatement node) { - endVisitNode(node); - } - public void endVisit(ThisExpression node) { - endVisitNode(node); - } - public void endVisit(ThrowStatement node) { - endVisitNode(node); - } - public void endVisit(TryStatement node) { - endVisitNode(node); - } - public void endVisit(TypeDeclaration node) { - endVisitNode(node); - } - public void endVisit(TypeDeclarationStatement node) { - endVisitNode(node); - } - public void endVisit(TypeLiteral node) { - endVisitNode(node); - } - public void endVisit(UnionType node) { - endVisitNode(node); - } - public void endVisit(SingleVariableDeclaration node) { - endVisitNode(node); - } - public void endVisit(VariableDeclarationExpression node) { - endVisitNode(node); - } - public void endVisit(VariableDeclarationStatement node) { - endVisitNode(node); - } - public void endVisit(VariableDeclarationFragment node) { - endVisitNode(node); - } - public void endVisit(WhileStatement node) { - endVisitNode(node); - } - - - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.AnnotationTypeDeclaration) - */ - public void endVisit(AnnotationTypeDeclaration node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration) - */ - public void endVisit(AnnotationTypeMemberDeclaration node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.BlockComment) - */ - public void endVisit(BlockComment node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.EnhancedForStatement) - */ - public void endVisit(EnhancedForStatement node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.EnumConstantDeclaration) - */ - public void endVisit(EnumConstantDeclaration node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.EnumDeclaration) - */ - public void endVisit(EnumDeclaration node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.LineComment) - */ - public void endVisit(LineComment node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.MarkerAnnotation) - */ - public void endVisit(MarkerAnnotation node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.MemberRef) - */ - public void endVisit(MemberRef node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.MemberValuePair) - */ - public void endVisit(MemberValuePair node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.MethodRef) - */ - public void endVisit(MethodRef node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.MethodRefParameter) - */ - public void endVisit(MethodRefParameter node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.Modifier) - */ - public void endVisit(Modifier node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.NormalAnnotation) - */ - public void endVisit(NormalAnnotation node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.ParameterizedType) - */ - public void endVisit(ParameterizedType node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.QualifiedType) - */ - public void endVisit(QualifiedType node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.SingleMemberAnnotation) - */ - public void endVisit(SingleMemberAnnotation node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.TagElement) - */ - public void endVisit(TagElement node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.TextElement) - */ - public void endVisit(TextElement node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.TypeParameter) - */ - public void endVisit(TypeParameter node) { - endVisitNode(node); - } - /* (non-Javadoc) - * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.WildcardType) - */ - public void endVisit(WildcardType node) { - endVisitNode(node); - } - -} diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/NodeFinder.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/NodeFinder.java deleted file mode 100644 index a659f0774c..0000000000 --- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/NodeFinder.java +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.astview; - -import org.eclipse.jdt.core.dom.ASTNode; - -/** - * For a give range finds the node covered and the node covering. - */ -public class NodeFinder extends GenericVisitor { - - /** - * A visitor that maps a selection to a given ASTNode. The result node is - * determined as follows: - *