From: <bh...@us...> - 2006-09-18 21:16:04
|
Revision: 198 http://svn.sourceforge.net/cishell/?rev=198&view=rev Author: bh2 Date: 2006-09-18 14:15:52 -0700 (Mon, 18 Sep 2006) Log Message: ----------- fixed a bug with the java-based templates that didn't generate parameter descriptions that were entered Modified Paths: -------------- trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/pages/ParameterListBuilderPage.java Modified: trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF =================================================================== --- trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF 2006-09-15 15:42:51 UTC (rev 197) +++ trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF 2006-09-18 21:15:52 UTC (rev 198) @@ -2,7 +2,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: CIShell Integration Wizards Bundle-SymbolicName: org.cishell.templates.wizards;singleton:=true -Bundle-Version: 0.0.1 +Bundle-Version: 0.0.1.qualifier Bundle-Activator: org.cishell.templates.wizards.Activator Bundle-Localization: plugin Require-Bundle: org.eclipse.ui;bundle-version="3.2.0", Modified: trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/pages/ParameterListBuilderPage.java =================================================================== --- trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/pages/ParameterListBuilderPage.java 2006-09-15 15:42:51 UTC (rev 197) +++ trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/pages/ParameterListBuilderPage.java 2006-09-18 21:15:52 UTC (rev 198) @@ -57,6 +57,7 @@ output += "\t\t<AD name=\""+attrs[i].getName()+"\" "+ "id=\""+attrs[i].getID()+"\" "+ "type=\""+getTypeString(attrs[i])+"\" "+ + "description=\""+attrs[i].getDescription()+"\" "+ "default=\""+attrs[i].getDefaultValue()[0]+"\"/>\n"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mwl...@us...> - 2007-07-18 15:47:12
|
Revision: 423 http://svn.sourceforge.net/cishell/?rev=423&view=rev Author: mwlinnem Date: 2007-07-18 08:20:54 -0700 (Wed, 18 Jul 2007) Log Message: ----------- Initial commit. Rough template/wizard for creating jython algorithms. About as easy to use as the static executable one, which is to say not very user friendly but works if you are familiar with the project. Will need to spend some more time on this if/when we wish to expose it to outside users. Modified Paths: -------------- trunk/templates/org.cishell.templates.wizards/plugin.xml Added Paths: ----------- trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/ trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmTemplate.java trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmWizard.java trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/META-INF/ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/META-INF/MANIFEST.MF trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/algorithm.properties trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/component.xml trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/l10n/ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/l10n/bundle_en.properties trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/metatype/ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/metatype/METADATA.XML trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/README.txt trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/build.properties trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/samplealgorithm.py Modified: trunk/templates/org.cishell.templates.wizards/plugin.xml =================================================================== --- trunk/templates/org.cishell.templates.wizards/plugin.xml 2007-07-13 21:18:01 UTC (rev 422) +++ trunk/templates/org.cishell.templates.wizards/plugin.xml 2007-07-18 15:20:54 UTC (rev 423) @@ -30,6 +30,16 @@ <wizard canFinishEarly="false" category="cishell" + class="org.cishell.templates.wizards.jython.NewJythonAlgorithmWizard" + hasPages="true" + icon="icons/cishell.ico" + id="org.cishell.templates.wizards.jython.NewJythonAlgorithmWizard" + name="Jython-based algorithm" + preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective" + project="true"/> + <wizard + canFinishEarly="false" + category="cishell" class="org.cishell.templates.wizards.dataset.NewDatasetWizard" hasPages="true" icon="icons/cishell.ico" Added: trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmTemplate.java =================================================================== --- trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmTemplate.java (rev 0) +++ trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmTemplate.java 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,59 @@ +/* **************************************************************************** + * CIShell: Cyberinfrastructure Shell, An Algorithm Integration Framework. + * + * All rights reserved. This program and the accompanying materials are made + * available under the terms of the Apache License v2.0 which accompanies + * this distribution, and is available at: + * http://www.apache.org/licenses/LICENSE-2.0.html + * + * Created on Aug 10, 2006 at Indiana University. + * + * Contributors: + * Indiana University - + * ***************************************************************************/ +package org.cishell.templates.wizards.jython; + +import org.cishell.templates.wizards.BasicTemplate; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.pde.ui.templates.TemplateOption; +import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; + +/** + * + * @author Bruce Herr (bh...@bh...) + */ +public class NewJythonAlgorithmTemplate extends BasicTemplate { + WizardNewProjectCreationPage projectPage; + + public NewJythonAlgorithmTemplate() { + super("jython_algorithm"); + + setPageCount(1); + } + + public void addPages(Wizard wizard) { + WizardPage page = new WizardNewProjectCreationPage("projectPage"); + page.setTitle("Project Properties"); + page.setDescription("Enter the project name and location"); + wizard.addPage(page); + projectPage = (WizardNewProjectCreationPage) page; + + markPagesAdded(); + } + + protected void updateModel(IProgressMonitor monitor) throws CoreException { + + } + + public void validateOptions(TemplateOption changed) { + + } + + public IProject getProjectHandle() { + return projectPage.getProjectHandle(); + } +} Added: trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmWizard.java =================================================================== --- trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmWizard.java (rev 0) +++ trunk/templates/org.cishell.templates.wizards/src/org/cishell/templates/wizards/jython/NewJythonAlgorithmWizard.java 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,123 @@ +/* **************************************************************************** + * CIShell: Cyberinfrastructure Shell, An Algorithm Integration Framework. + * + * All rights reserved. This program and the accompanying materials are made + * available under the terms of the Apache License v2.0 which accompanies + * this distribution, and is available at: + * http://www.apache.org/licenses/LICENSE-2.0.html + * + * Created on Aug 10, 2006 at Indiana University. + * + * Contributors: + * Indiana University - + * ***************************************************************************/ +package org.cishell.templates.wizards.jython; + +import java.lang.reflect.InvocationTargetException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.pde.core.plugin.IPluginBase; +import org.eclipse.pde.core.plugin.IPluginModelBase; +import org.eclipse.pde.internal.core.bundle.BundlePluginBase; +import org.eclipse.pde.internal.core.bundle.BundlePluginModelBase; +import org.eclipse.pde.ui.templates.ITemplateSection; +import org.eclipse.pde.ui.templates.NewPluginTemplateWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWizard; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.actions.WorkspaceModifyOperation; +import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.part.ISetSelectionTarget; + +/** + * + * @author Bruce Herr (bh...@bh...) + */ +public class NewJythonAlgorithmWizard extends NewPluginTemplateWizard + implements IWorkbenchWizard { + NewJythonAlgorithmTemplate template; + + /** + * @see org.eclipse.pde.ui.templates.NewPluginTemplateWizard#createTemplateSections() + */ + public ITemplateSection[] createTemplateSections() { + template = new NewJythonAlgorithmTemplate(); + return new ITemplateSection[]{template}; + } + + public boolean performFinish() { + final IProject project = template.getProjectHandle(); + final IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(project.getName()); + + WorkspaceModifyOperation op = new WorkspaceModifyOperation() { + protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { + monitor.beginTask("", 2500); + project.create(description, monitor); + project.open(monitor); + + IPluginModelBase model = new BundlePluginModelBase(){ + private static final long serialVersionUID = 1L; + + public IPluginBase createPluginBase() { + return new BundlePluginBase(); + } + + public boolean isFragmentModel() { + return false; + }}; + + performFinish(project, model, monitor); + + monitor.done(); + } + }; + + try { + getContainer().run(true, true, op); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + final IFile file = template.getProjectHandle().getFile("README.txt"); + final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + final IWorkbenchPage page = ww.getActivePage(); + if (page != null) { + final IWorkbenchPart focusPart = page.getActivePart(); + ww.getShell().getDisplay().asyncExec(new Runnable() { + public void run() { + if (focusPart instanceof ISetSelectionTarget) { + ISelection selection = new StructuredSelection(file); + ((ISetSelectionTarget) focusPart).selectReveal(selection); + } + try { + IDE.openEditor(page, file, true); + } catch (PartInitException e) { + } + } + }); + } + + return true; + } + + /** + * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection) + */ + public void init(IWorkbench workbench, IStructuredSelection selection) { + + } +} Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/META-INF/MANIFEST.MF =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/META-INF/MANIFEST.MF (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/META-INF/MANIFEST.MF 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,18 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Sample Jython Algorithm +Bundle-SymbolicName: org.cishell.templates.wizards.samplejythonalgorithm +Bundle-Version: 0.0.1 +Bundle-ClassPath: . +Bundle-Localization: plugin +Import-Package: org.cishell.templates.jythonrunner, + org.cishell.framework, + org.cishell.framework.algorithm, + org.cishell.framework.data, + org.osgi.framework;version="1.3.0", + org.osgi.service.component;version="1.0.0", + org.osgi.service.log;version="1.3.0", + org.osgi.service.metatype;version="1.1.0", + org.osgi.service.prefs;version="1.1.0" +X-AutoStart: true +Service-Component: OSGI-INF/component.xml Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/algorithm.properties =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/algorithm.properties (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/algorithm.properties 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,14 @@ +menu_path=Visualization/SubMenu/additions +label=Sample Jython Algorithm +description=Prints the provided attribute, and returns the original graph +in_data=prefuse.data.Graph +out_data=prefuse.data.Graph, file:text/plain +service.pid=org.cishell.templates.wizards.samplejythonalgorithm +remoteable=false +script_path=/samplealgorithm.py +result0.label=Exact same network that was passed in +result0.type=Network +result0.parent=arg0 +result1.label=Number of edges in provided network +result1.type=Text +result1.parent=arg0 Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/component.xml =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/component.xml (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/component.xml 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<component name="org.cishell.templates.wizards.samplejythonalgorithm" immediate="false"> + <implementation class="org.cishell.templates.jythonrunner.JythonAlgorithmFactory"/> + <properties entry="OSGI-INF/algorithm.properties"/> + <reference name="LOG" interface="org.osgi.service.log.LogService"/> + <reference name="MTS" interface="org.osgi.service.metatype.MetaTypeService"/> + + <service> + <provide interface= + "org.cishell.framework.algorithm.AlgorithmFactory"/> + </service> +</component> \ No newline at end of file Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/l10n/bundle_en.properties =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/l10n/bundle_en.properties (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/l10n/bundle_en.properties 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,7 @@ +#Localization variables for OSGI-INF/metatatype/METADATA.XML +# +#Samples: +#input=Input +#desc=Enter an integer (that will be converted to a string) +#name=Input->String +#name_desc=Converts inputted integer to string Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/metatype/METADATA.XML =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/metatype/METADATA.XML (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/OSGI-INF/metatype/METADATA.XML 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0"> + <OCD name="Sample Jython Algorithm" id="org.cishell.templates.wizards.samplejythonalgorithm.OCD" + description="A sample jython algorithm"> + <AD name="Sample Attribute" id="sample_attr" type="Integer" description="Enter a positive integer" default="1" min="1" /> + </OCD> + <Designate pid="org.cishell.templates.wizards.samplejythonalgorithm"> + <Object ocdref="org.cishell.templates.wizards.samplejythonalgorithm.OCD" /> + </Designate> +</metatype:MetaData> Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/README.txt =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/README.txt (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/README.txt 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,40 @@ +Here is the minimum you need to know to integrate a jython script with +CIShell, working from what is already provided by default in this project. + +Arguments passed in from the Network Workbench Data Manager are passed +into your script by default as variables with the prefix "arg" and a +numeric suffix. The first argument is arg0, the next is arg1, and so on. +You may specify how many, and what type of data you want these to be by +editing the in_data property in the algorithm.properties file. + +Arguments passed in from the user at the time the algorithm is run (The +kind where a dialog box pops up and the user fills things in) can have +any valid python variable name. You can define what data you need, the +type of data, and the variable names of that data by editing the +METADATA.XML file. The id provided will be the name of the variable in +the python environment. + +To return results, assign values to variables with the prefix "result". +The first result is result0, the second is result1, and so on. You +must specify the format of the data you are returning by editing the +out_data property in the algorithm.properties file. You must also +define values for the metadata of each result you return. Look at the +algorithm.properties file to see how this is done. Each result must +specify a label and type, but parent part is optional. Label can be +any text, type must be one of the pre-define types ("Network", "Text", +"Matrix", or "Other" currently), and parent must be the variable +name of one of the provided data arguments (arg0, arg1, etc...). + +Change the menu path to something sensible too. + +NOTE: There are other things that should probably be changed if you +are doing anything more than playing around with the jython algorithm +capabilities in CIShell. The plugin name, symbolic-name, all references +to the package, the service.pid, the algorithm description, and +probably a few other things should be unique for each project. This +template is currently in a rough state. It should probably have +a wizard that asks the user to specify all the stuff that +should change between projects. This should do for now though, +especially for internal use. + + \ No newline at end of file Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/build.properties =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/build.properties (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/build.properties 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,4 @@ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/,\ + samplealgorithm.py Added: trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/samplealgorithm.py =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/samplealgorithm.py (rev 0) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/jython_algorithm/samplealgorithm.py 2007-07-18 15:20:54 UTC (rev 423) @@ -0,0 +1,29 @@ +# To see the output printed to the console in Network Workbench, use the +# switch "-console" when opening Network Workbench from the command line. +from java import io + +print "Here is the value you gave me when you ran the algorithm..." +print sample_attr + +print "Here is what I got from CIShell (the graph you highlighted)" +print arg0 +graph = arg0 +edge_count = graph.getEdgeCount() + +print "Here is the number of edges in the graph you provided..." +print edge_count + +aFile = io.File("whatever.txt") +writer = io.BufferedWriter(io.FileWriter(aFile)) +writer.write(str(edge_count)) +writer.close() + +print "I will now return the original graph, and the edge count in a file" + +aFile = io.File("whatever.txt") +writer = io.BufferedWriter(io.FileWriter(aFile)) +writer.write(str(edge_count)) +writer.close() + +result0 = arg0 +result1 = aFile \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bh...@us...> - 2008-03-25 19:40:25
|
Revision: 709 http://cishell.svn.sourceforge.net/cishell/?rev=709&view=rev Author: bh2 Date: 2008-03-25 12:38:29 -0700 (Tue, 25 Mar 2008) Log Message: ----------- made template algorithm's member variables private and tidied up the manifest Modified Paths: -------------- trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF trunk/templates/org.cishell.templates.wizards/templates_3.0/java_algorithm/java/$algClass$.java Modified: trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF =================================================================== --- trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF 2008-03-25 19:32:53 UTC (rev 708) +++ trunk/templates/org.cishell.templates.wizards/META-INF/MANIFEST.MF 2008-03-25 19:38:29 UTC (rev 709) @@ -2,9 +2,8 @@ Bundle-ManifestVersion: 2 Bundle-Name: CIShell Integration Wizards Bundle-SymbolicName: org.cishell.templates.wizards;singleton:=true -Bundle-Version: 0.9.5 +Bundle-Version: 1.0.0 Bundle-Activator: org.cishell.templates.wizards.Activator -Bundle-Localization: plugin Require-Bundle: org.eclipse.ui;bundle-version="3.2.0", org.eclipse.ui.ide;bundle-version="3.2.0", org.eclipse.core.resources;bundle-version="3.2.0", @@ -17,5 +16,5 @@ org.eclipse.jdt.ui;bundle-version="3.2.0", org.eclipse.jdt.core;bundle-version="3.2.0", org.eclipse.jdt.launching;bundle-version="3.2.0" -Eclipse-LazyStart: true +Bundle-ActivationPolicy: lazy Import-Package: org.osgi.service.metatype;version="1.1.0" Modified: trunk/templates/org.cishell.templates.wizards/templates_3.0/java_algorithm/java/$algClass$.java =================================================================== --- trunk/templates/org.cishell.templates.wizards/templates_3.0/java_algorithm/java/$algClass$.java 2008-03-25 19:32:53 UTC (rev 708) +++ trunk/templates/org.cishell.templates.wizards/templates_3.0/java_algorithm/java/$algClass$.java 2008-03-25 19:38:29 UTC (rev 709) @@ -8,9 +8,9 @@ import org.cishell.framework.data.Data; public class $algClass$ implements Algorithm { - Data[] data; - Dictionary parameters; - CIShellContext context; + private Data[] data; + private Dictionary parameters; + private CIShellContext context; public $algClass$(Data[] data, Dictionary parameters, CIShellContext context) { this.data = data; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |