Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » GMF (Graphical Modeling Framework) » Searching for diagrams referring specific EObject
Searching for diagrams referring specific EObject [message #140037] Wed, 27 June 2007 14:32 Go to next message
Eclipse UserFriend
Originally posted by: jan.herriger.gmx.de

This is a multi-part message in MIME format.
--------------060504060508060900050509
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

i'm using non-synch diagrams with separate files. So, I need a method
which allows me to search the workspace for diagrams that refer to a
specific model element (EObject).

I couln't find one, so i wrote my own... attached class is in
quick'n'dirty state ;-)

You might find this usefull and/or want to commit improvements. Maybe i
missed some usefull API stuff?

regards
Jan

--------------060504060508060900050509
Content-Type: text/java;
name="DiagramUtil.java"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="DiagramUtil.java"

package org.memo.common.utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.gmf.runtime.emf.core.resources.GMFResource;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Node;

public class DiagramUtil {

/**
* Searches for a diagram, which refers to a specific EObject.
* Returns the first matching diagram.
* Returns null, if nothing is found.
* @param element The EObject to search for
* @param extension The extension of the diagram file (e.g. "xxx_diagram")
* @return GMFResource containing diagram.
* Can be opened with MyPrefixDiagramEditorUtil.openDiagram(diagram)
*/
public static GMFResource getDiagramResourceForEObject(EObject element, String extension)
{
ArrayList files = (ArrayList)getWorkspaceFiles(extension);

GMFResource diagram=null;

for (Iterator it2=files.iterator();it2.hasNext();)
{
diagram = new GMFResource((URI.createPlatformResourceURI(it2.next().toStri ng())));

try {
diagram.load(Collections.EMPTY_MAP);
} catch (IOException e1) {
e1.printStackTrace();
}
//get diagram
Diagram d = (Diagram)diagram.getContents().get(0);

for (Iterator it3 = d.getChildren().iterator();it3.hasNext();)
{
Object o = it3.next();
if (o instanceof Node == false)
break;
Node n = (Node)o;
if (n.getElement() instanceof EObject)
{
EObject foundElement = null;
if (((EObject)n.getElement()).eIsProxy())
{
foundElement = (EObject) EcoreUtil.resolve((EObject)n.getElement(), element.eResource());
}
else
{
foundElement = (EObject)n.getElement();
}
if (foundElement.equals(element))
{
return diagram;
}
}
}
}
//nothing found
return null;
}

/**
* Collects all files from workspace
* @param extension Only collect files with this extension, null for all file types
* @return Collection of full file paths
*/
private static Collection getWorkspaceFiles(String extension)
{
ArrayList files = new ArrayList();

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

IProject[] projects = root.getProjects();

for (int i=0;i<projects.length;i++)
{
try {
IResource[] resources = projects[i].members();
for (int j=0;j<resources.length;j++)
{
getChildren(resources[j], files, extension);
}
}
catch (CoreException ex)
{/*ignore*/}
}
return files;
}

/**
* Recursivly collects files inside a resource and containing folders
* @param res
* @param files
* @param extension
*/
private static void getChildren(IResource res, ArrayList files, String extension)
{
if (res instanceof IFile)
{
if (extension == null ||
( res.getFileExtension()!=null && res.getFileExtension().endsWith(extension) ))
files.add(res.getFullPath().toString());
}
if (res instanceof IFolder)
{
try {
IResource[] resources = ((IFolder)res).members();
for (int j=0;j<resources.length;j++)
{
getChildren(resources[j], files, extension);
}
}
catch (CoreException ex)
{/*ignore*/}
}
}
}
--------------060504060508060900050509--
Re: Searching for diagrams referring specific EObject [message #140061 is a reply to message #140037] Wed, 27 June 2007 15:14 Go to previous messageGo to next message
Max Feldman is currently offline Max FeldmanFriend
Messages: 3
Registered: July 2009
Junior Member
Hi,

EcoreUtil.UsageCrossReferencer ?

Regards,
Max


"Jan Herriger" <jan.herriger@gmx.de> wrote in message
news:f5tsdg$u9h$1@build.eclipse.org...
> Hi,
>
> i'm using non-synch diagrams with separate files. So, I need a method
> which allows me to search the workspace for diagrams that refer to a
> specific model element (EObject).
>
> I couln't find one, so i wrote my own... attached class is in
> quick'n'dirty state ;-)
>
> You might find this usefull and/or want to commit improvements. Maybe i
> missed some usefull API stuff?
>
> regards
> Jan
>


------------------------------------------------------------ --------------------


> package org.memo.common.utils;
>
> import java.io.IOException;
> import java.util.ArrayList;
> import java.util.Collection;
> import java.util.Collections;
> import java.util.Iterator;
>
> import org.eclipse.core.resources.IFile;
> import org.eclipse.core.resources.IFolder;
> import org.eclipse.core.resources.IProject;
> import org.eclipse.core.resources.IResource;
> import org.eclipse.core.resources.IWorkspaceRoot;
> import org.eclipse.core.resources.ResourcesPlugin;
> import org.eclipse.core.runtime.CoreException;
> import org.eclipse.emf.common.util.URI;
> import org.eclipse.emf.ecore.EObject;
> import org.eclipse.emf.ecore.util.EcoreUtil;
> import org.eclipse.gmf.runtime.emf.core.resources.GMFResource;
> import org.eclipse.gmf.runtime.notation.Diagram;
> import org.eclipse.gmf.runtime.notation.Node;
>
> public class DiagramUtil {
>
> /**
> * Searches for a diagram, which refers to a specific EObject.
> * Returns the first matching diagram.
> * Returns null, if nothing is found.
> * @param element The EObject to search for
> * @param extension The extension of the diagram file (e.g. "xxx_diagram")
> * @return GMFResource containing diagram.
> * Can be opened with MyPrefixDiagramEditorUtil.openDiagram(diagram)
> */
> public static GMFResource getDiagramResourceForEObject(EObject element,
> String extension)
> {
> ArrayList files = (ArrayList)getWorkspaceFiles(extension);
>
> GMFResource diagram=null;
>
> for (Iterator it2=files.iterator();it2.hasNext();)
> {
> diagram = new
> GMFResource((URI.createPlatformResourceURI(it2.next().toStri ng())));
>
> try {
> diagram.load(Collections.EMPTY_MAP);
> } catch (IOException e1) {
> e1.printStackTrace();
> }
> //get diagram
> Diagram d = (Diagram)diagram.getContents().get(0);
>
> for (Iterator it3 = d.getChildren().iterator();it3.hasNext();)
> {
> Object o = it3.next();
> if (o instanceof Node == false)
> break;
> Node n = (Node)o;
> if (n.getElement() instanceof EObject)
> {
> EObject foundElement = null;
> if (((EObject)n.getElement()).eIsProxy())
> {
> foundElement = (EObject) EcoreUtil.resolve((EObject)n.getElement(),
> element.eResource());
> }
> else
> {
> foundElement = (EObject)n.getElement();
> }
> if (foundElement.equals(element))
> {
> return diagram;
> }
> }
> }
> }
> //nothing found
> return null;
> }
>
> /**
> * Collects all files from workspace
> * @param extension Only collect files with this extension, null for all
> file types
> * @return Collection of full file paths
> */
> private static Collection getWorkspaceFiles(String extension)
> {
> ArrayList files = new ArrayList();
>
> IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
>
> IProject[] projects = root.getProjects();
>
> for (int i=0;i<projects.length;i++)
> {
> try {
> IResource[] resources = projects[i].members();
> for (int j=0;j<resources.length;j++)
> {
> getChildren(resources[j], files, extension);
> }
> }
> catch (CoreException ex)
> {/*ignore*/}
> }
> return files;
> }
>
> /**
> * Recursivly collects files inside a resource and containing folders
> * @param res
> * @param files
> * @param extension
> */
> private static void getChildren(IResource res, ArrayList files, String
> extension)
> {
> if (res instanceof IFile)
> {
> if (extension == null ||
> ( res.getFileExtension()!=null &&
> res.getFileExtension().endsWith(extension) ))
> files.add(res.getFullPath().toString());
> }
> if (res instanceof IFolder)
> {
> try {
> IResource[] resources = ((IFolder)res).members();
> for (int j=0;j<resources.length;j++)
> {
> getChildren(resources[j], files, extension);
> }
> }
> catch (CoreException ex)
> {/*ignore*/}
> }
> }
> }
Re: Searching for diagrams referring specific EObject [message #140114 is a reply to message #140061] Wed, 27 June 2007 18:13 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Max, Jan,

Or, because by default (I think) a GMF resource set always has an
ECrossReferenceAdapter installed, the ECrossReferenceAdapter API for
inverse references and non-navigable inverse references would be more
efficient ...

Cheers,

Christian


Max Feldman wrote:

> Hi,
>
> EcoreUtil.UsageCrossReferencer ?
>
> Regards,
> Max
>
>
> "Jan Herriger" <jan.herriger@gmx.de> wrote in message
> news:f5tsdg$u9h$1@build.eclipse.org...
>> Hi,
>>
>> i'm using non-synch diagrams with separate files. So, I need a method
>> which allows me to search the workspace for diagrams that refer to a
>> specific model element (EObject).
>>
>> I couln't find one, so i wrote my own... attached class is in
>> quick'n'dirty state ;-)
>>
>> You might find this usefull and/or want to commit improvements. Maybe i
>> missed some usefull API stuff?
>>
>> regards
>> Jan
>>
>

<snip>
Re: Searching for diagrams referring specific EObject [message #140128 is a reply to message #140061] Wed, 27 June 2007 18:39 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jan.herriger.gmx.de

Hello Max,

thanks for your answer.

CrossReferencer can give you an answer to the question: "Is element x
referenced in a particular EMF resource set?"

My question was: "Is there a node that represents element x in a diagram
somewhere in the workspace?"

So, the first thing you need, is a collection of all diagram files in
your workspace. Then, you have to create GMF resources out of them.

I tried to use UsageCrossReferencer to find the element inside such a
GMF resource. But it didn't work.

Maybe there is a more convenient way to find references to model
elements inside diagrams, but I did't find one.

Regards
Jan

Max Feldman schrieb:
> Hi,
>
> EcoreUtil.UsageCrossReferencer ?
>
> Regards,
> Max
>
>
> "Jan Herriger" <jan.herriger@gmx.de> wrote in message
> news:f5tsdg$u9h$1@build.eclipse.org...
Re: Searching for diagrams referring specific EObject [message #140194 is a reply to message #140114] Thu, 28 June 2007 14:34 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jan.herriger.gmx.de

Hi Christian,

of course, CrossReferenceAdapter should be used to resolve references
between model objects. But I want to find _diagram_ files containing
references to a specific model element. CrossReferenceAdapter doesn't
help here, does it?

Best regards
Jan

Christian W. Damus schrieb:
> Hi, Max, Jan,
>
> Or, because by default (I think) a GMF resource set always has an
> ECrossReferenceAdapter installed, the ECrossReferenceAdapter API for
> inverse references and non-navigable inverse references would be more
> efficient ...
>
> Cheers,
>
> Christian
Re: Searching for diagrams referring specific EObject [message #140198 is a reply to message #140194] Thu, 28 June 2007 15:39 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Jan,

It would only help for diagram files that are currently loaded in your
resource set. The CrossReferenceAdapter can provide all Views referencing
your element via the View::element reference, then you would use
EcoreUtil::getURI(EObject) to get the URIs of those objects and trim the
fragments off.

If you need to find diagram files that are *not* loaded, then that's a very
different story.

cW


Jan Herriger wrote:

> Hi Christian,
>
> of course, CrossReferenceAdapter should be used to resolve references
> between model objects. But I want to find _diagram_ files containing
> references to a specific model element. CrossReferenceAdapter doesn't
> help here, does it?
>
> Best regards
> Jan
>
> Christian W. Damus schrieb:
>> Hi, Max, Jan,
>>
>> Or, because by default (I think) a GMF resource set always has an
>> ECrossReferenceAdapter installed, the ECrossReferenceAdapter API for
>> inverse references and non-navigable inverse references would be more
>> efficient ...
>>
>> Cheers,
>>
>> Christian
Re: Searching for diagrams referring specific EObject [message #140468 is a reply to message #140198] Thu, 28 June 2007 18:06 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jan.herriger.gmx.de

This is a multi-part message in MIME format.
--------------090701020602010900070500
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

It works, when I use the editing domain of an edit part and load all
diagram resources into the resource set.

But it doesn't work, when I create a new editing domain. In the latter
case, the CrossReferenceAdapter does't seem to recognize diagram
elements. I have no idea why.


Christian W. Damus schrieb:
> Hi, Jan,
>
> It would only help for diagram files that are currently loaded in your
> resource set. The CrossReferenceAdapter can provide all Views referencing
> your element via the View::element reference, then you would use
> EcoreUtil::getURI(EObject) to get the URIs of those objects and trim the
> fragments off.
>
> If you need to find diagram files that are *not* loaded, then that's a very
> different story.
>
> cW

--------------090701020602010900070500
Content-Type: text/java;
name="DiagramUtil.java"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="DiagramUtil.java"

package org.memo.common.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.emf.core.resources.GMFResource;
import org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter;
import org.eclipse.gmf.runtime.notation.Node;

public class DiagramUtil {

/**
* Searches for a diagram, which refers to a specific EObject.
* Returns the first matching diagram.
* Returns null, if nothing is found.
* @param element The EObject to search for
* @param extension The extension of the diagram file (e.g. "xxx_diagram")
* @return GMFResource containing diagram.
* Can be opened with MyPrefixDiagramEditorUtil.openDiagram(diagram)
*/
public static GMFResource getDiagramResourceForEObject(EObject element, String extension, TransactionalEditingDomain editingDomain)
{
// doesn't work:
// TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
// .createEditingDomain();

ArrayList files = (ArrayList)getWorkspaceFiles(extension);

for (Iterator it2=files.iterator();it2.hasNext();)
{
editingDomain.getResourceSet().getResource(
(URI.createPlatformResourceURI(it2.next().toString(), true)), true);
}
CrossReferenceAdapter adapter = CrossReferenceAdapter.getCrossReferenceAdapter(editingDomain .getResourceSet());

Collection settings = adapter.getInverseReferencers(element, null, null);

Node node = null;

for (Iterator it=settings.iterator();it.hasNext();)
{
Object o = it.next();
if (o instanceof Node)
node = (Node)o;
}
if (node!=null && node.eResource() instanceof GMFResource)
return (GMFResource)node.eResource();
//nothing found
return null;
}

/**
* Collects all files from workspace
* @param extension Only collect files with this extension, null for all file types
* @return Collection of full file paths
*/
private static Collection getWorkspaceFiles(String extension)
{
ArrayList files = new ArrayList();

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

IProject[] projects = root.getProjects();

for (int i=0;i<projects.length;i++)
{
try {
IResource[] resources = projects[i].members();
for (int j=0;j<resources.length;j++)
{
getChildren(resources[j], files, extension);
}
}
catch (CoreException ex)
{/*ignore*/}
}
return files;
}

/**
* Recursivly collects files inside a resource and containing folders
* @param res
* @param files
* @param extension
*/
private static void getChildren(IResource res, ArrayList files, String extension)
{
if (res instanceof IFile)
{
if (extension == null ||
( res.getFileExtension()!=null && res.getFileExtension().endsWith(extension) ))
files.add(res.getFullPath().toString());
}
if (res instanceof IFolder)
{
try {
IResource[] resources = ((IFolder)res).members();
for (int j=0;j<resources.length;j++)
{
getChildren(resources[j], files, extension);
}
}
catch (CoreException ex)
{/*ignore*/}
}
}
}
--------------090701020602010900070500--
Re: Searching for diagrams referring specific EObject [message #140479 is a reply to message #140468] Thu, 28 June 2007 18:55 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Jan,

The CrossReferenceAdapter is bounded by the resource set (editing domain).
The adapter in one domain (resource set) will not know anything about the
contents of another domain (resource set).

In your new editing domain, with its consequent new resource set, you would
have to load all of the resources from the same files again. Do you need
to create a new editing domain? Note that editing domains are utterly
distinct universes; all data will be duplicated and independent.

Cheers,

Christian


Jan Herriger wrote:

> It works, when I use the editing domain of an edit part and load all
> diagram resources into the resource set.
>
> But it doesn't work, when I create a new editing domain. In the latter
> case, the CrossReferenceAdapter does't seem to recognize diagram
> elements. I have no idea why.
>
>
> Christian W. Damus schrieb:
>> Hi, Jan,
>>
>> It would only help for diagram files that are currently loaded in your
>> resource set. The CrossReferenceAdapter can provide all Views
>> referencing your element via the View::element reference, then you would
>> use EcoreUtil::getURI(EObject) to get the URIs of those objects and trim
>> the fragments off.
>>
>> If you need to find diagram files that are *not* loaded, then that's a
>> very different story.
>>
>> cW
Re: Searching for diagrams referring specific EObject [message #140544 is a reply to message #140479] Thu, 28 June 2007 22:42 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jan.herriger.gmx.de

Hello Christian,

> In your new editing domain, with its consequent new resource set, you
> would have to load all of the resources from the same files again.

this is exactly what I do. I load all the diagram files into the
resource set. Whether this is a new resource set/editing domain or not.
I have to do it, because I am searching in diagrams which never have
been loaded.

When I load the resources into the resource set of a newly created
domain, I am able to access all diagram nodes. But CrossReferenceAdapter
seems to recognize only contents from model resources.

When I use an editing domain, that was created by the editor plugin, it
works. Thats what I dont't understand, because the resource set contents
are the same. (The resource set of the domain, created by the editor
plugin, contains some more resources. But these resources don't contain
any references I am interested in.)

> Do you need to create a new editing domain? Note that editing domains are utterly
> distinct universes; all data will be duplicated and independent.

I don't need a new editing domain. But I need to load the resources,
regardless of existing domains. So, I'd like to have a class that
searches for dargams, without passing an existing editing domain.

On the other hand, i could do all this without
CrossReferenceAdapter/editing domain/resource sets (see first post of
mine). But this would't be that efficient, as you said.

Cheers
Jan

ps: i'm sure, there one nasty littly detail i have missed ;-)
Re: Searching for diagrams referring specific EObject [message #140649 is a reply to message #140544] Fri, 29 June 2007 14:27 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Jan,

<snip>

> ps: i'm sure, there one nasty littly detail i have missed ;-)

Yes, and probably it is in the initialization of the editing domain. I
don't know that part of the GMF-generated code, but probably comparing the
structure of a newly-created empty editing domain created by the GMF
diagram and one created by your utility (in the debugger's Variables view)
will show the difference (look in particular at the adapters-list of the
resource set). There must be some reason why the CrossReferenceAdapter is
attached to your model resources but not to the diagram resources.

Cheers,

Christian
Re: Searching for diagrams referring specific EObject [message #140759 is a reply to message #140649] Sun, 01 July 2007 19:05 Go to previous message
Eclipse UserFriend
Originally posted by: jan.herriger.gmx.de

This is a multi-part message in MIME format.
--------------020400020308060701010600
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

I didn't realize, that I used two different instances of the same model
element. I passed one instance to my util and created another by loading
the resources into the new resource set. No wonder, CrossRefencer
could't find it. Sorry for that stupid mistake...

Finally, I'm able to open a Dialog listing all Diagrams by right
clicking an element in the domain navigator. I attached the code in case
someone wants to use it.

Best regards
Jan

Christian W. Damus schrieb:
> Hi, Jan,
>
> <snip>
>
>> ps: i'm sure, there one nasty littly detail i have missed ;-)
>
> Yes, and probably it is in the initialization of the editing domain. I
> don't know that part of the GMF-generated code, but probably comparing the
> structure of a newly-created empty editing domain created by the GMF
> diagram and one created by your utility (in the debugger's Variables view)
> will show the difference (look in particular at the adapters-list of the
> resource set). There must be some reason why the CrossReferenceAdapter is
> attached to your model resources but not to the diagram resources.
>
> Cheers,
>
> Christian


--------------020400020308060701010600
Content-Type: application/x-zip-compressed;
name="diagram_util.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="diagram_util.zip"

UEsDBBQACAAIAE6m4TYAAAAAAAAAAAAAAAAaAAAAb3JnLm1lbW8uY29tbW9u Ly5jbGFzc3Bh
dGidkEFLAzEQhc8V+h+W3DtrBcHDrkVkhRZapV17lTQZtqPpJJ0kYv+91VoU oR68zRu+ee8x
1eht44pXlEieazWEc1UgG2+Ju1o9tneDKzW67p9VxukYg07rveh9K+Qku+KF 2NYqilHFx/Iw
lqdJ4/lIeukAjaMQEZ5tAqczm/U+HSbz5un2ftbejGfNvPzNEScU1g4srnIH mb4uUWCRNFst
djltdwHLycWiGQzh8h+FgkUwXhAEt5kE7YPLHXH8y8rnFHI6uq2IP+Gq/PnA d1BLBwhjc8zA
zgAAAHYBAABQSwMEFAAIAAgATqbhNgAAAAAAAAAAAAAAABgAAABvcmcubWVt by5jb21tb24v
LnByb2plY3S9ksFqAyEQhs8t9B3C3qPpLQezgbb0lhLY9gGsTjeGdRR1lzx+ 1LhtlhDIIfQ2
/z/z+w2DbH3Q3WwA55XBVfVMFtUMUBipsF1VX5/v82W1rp8emXVmDyK8gRdO 2RCno/vAkGuo
jWuJBm2IMFobZDS7qZ0MwFAzOlbJLW/5LOhEffeqk40FkVSRrzHKUWbnjAii U9YD2csQwS4W
fOA5AO5vhZjgru0T2xdNpwajF5SbuFYC2XBUP+DDy/9iG7EDze8CLc548sgL vYMyfRLXr33q
pwXy3LVMWnnb9a3Cj4vAWCfi71+Y/rIjUEsHCDb542ToAAAApAIAAFBLAwQU AAgACABOpuE2
AAAAAAAAAAAAAAAAJAAAAG9yZy5tZW1vLmNvbW1vbi9NRVRBLUlORi9NQU5J RkVTVC5NRm2Q
wUoEMQyG7wPzDvMANqweV7wIHndZFLzXTrYE06YmLejbW3fXUXFuge9L/iQ7 n+mIVt0zqpHk
7XQNm3G4b3lmdLsLXeDNgvY+4XYSjZAwCQRJSfJ04BYd5cV6+kgvwhRW7Vuj HBlrH3xXteHS
tcRt4LTNI741UnRnfJ6DgakYQkxH0JYrJYSZfFSfoBEUlYJaCe1qHH6CFS3x t7dCslRfe/QK
8swSTnC1vxdd6rEBzWDGfmIRo9/+ODy8F9HqDj68+vj/IV8iS/y78gW1Smzj 8AlQSwcIXLdL
x9MAAACwAQAAUEsDBBQACAAIAE6m4TYAAAAAAAAAAAAAAABKAAAAb3JnLm1l bW8uY29tbW9u
L2Jpbi9vcmcvbWVtby9jb21tb24vYWN0aW9ucy9TZWFyY2hEaWFncmFtRmls ZXNBY3Rpb24u
Y2xhc3OlV2l3E1UYfm6bdkoystSNKkqRAmm6DIKItohiF4gtiBSK1nWa3KYD k5k6M6HUfcF9
38V954tfPEeR6tGDX/zgj/L43JlJaJNARU9PZ7nzrs/73Pe++evvX34HcD1O aWgQ2Ox6BaMo
i66Rc4tF1zHMXGC5jm+MSdPLTQ9aZsEzi8OWLf1d4RcNCYGVR8xjpmGbTsG4 c/KIzAUamgU6
lC2Zs60ZXxoly8hG3yK9QWnLghlIgVXFuTG+5AKZH7JlUTqBwNrRhbqyOMVn 15PGUGSiX6C5
OLff9GpElZvDrnd0Ujq5aSVA0VTZAd0yw0XyR6bMnDSOWXJWer6RHQu8Ui4o eTJf0VC+dliO
FewUaEx3jgskBty8TKIRq3RcguUCK0YtR+4rFSeld9CctJlT66ibM+1x07PU e7yYCKYtX2DL
6MVizBAu8WUI3DEZZT2YrpNGZMfIxlpLANM5vgwCbTqWIckczRif65Y2LJAM TK8ggyiWlX4Z
q4FpUkDmBUYuNrzqOlTQj6Js16GhRcN1Ar0XV74U1qFDxwZsZAF86xEZVjGr ltM6OpFh+ZjJ
sOX5QYV+l6U7R6sp3a+hW2DTQu8hJb2SE1hFaey3zWDK9YrlDdArcM0FSZxE Fzbr3HlbiCdD
2JU3ZwLpCWxIL3A+YJu+318nnCRhuUHHNtwosMzyhxxFsnyY3UQKN6FPw80E bqky6OjHDgZA
flVMJNITiufL/HO7ZuO/q5bApX5tDQSEK9A5+i+xo5VGfgmBWJJFneMp9GBI xzB2M2R5QPpu
ycuxzF3pzvN0ES+WMcrC/SlkMaLhjqoCX0BFxyj2ctuwcIcOZAXW1/EWb+9S YNkGhUIvd+rY
j7sElkeKw55ZiDi3Nb1Ez1vIARLdcgrkwBgOaTjILriEbx3jOEyv5syMdPLn vG5L11pdOpEk
7sG9GiYE1lX3MiXjG3EPO8QXHffhfoE1zDdeLUM47HpxbjX9rJ7TeoGGS6HE mAyI74Po0PAQ
2+WiDy2YZEuOvbc7btA+5ZacfG8LSPamIc9zvSSmMK2hUEWAiHJ5y7Tdgm/s lb5vFuRg+KrD
whEyziWgoQmB4cVJ+LOBMWvlmThb+7S07Top1ElqXIMt0F0NbDmIOI2Badf1 pRfFkoKDGQ1u
Vcup6fk6Hgbj1BjSmKXO3g1VrK3RUGLENcAxDaW43BcU1jGL4wItyoXKmTpV PmphSeIoHlFn
6aNsaReBYXljjCsDj+t4ImzyqiBq4SkdT+MZgatUKPGAUcVAgb6q4AokXrkr RSRcsPl9Y/fe
4UrPSOIEntfwnMDtlVpRsmhH1122zRkg7FX5yKsxQ4xUAynacRxDeStwvWiX vIAXOaqo4OOP
5MD5WkJtA+ucSOJlvKrhFe6l/xfOfrtUsHguvIbXGRDByzp+YDoKrT0xWv/X eH8L3hS4/FB4
4LQHbrtKu12GEiqPt3W8g3fJInI73luZOo1qwcrBac+dVdbC/fN+1cFHpip+ ZjnFDR3PyZno
UGoseRbpuWTj4YbJl0uyoqrlMMaiXzgojwdb1NRXEyJP1lh30GZz6a2Z/S60 ramdUNoCN/1X
kgo0yOPVQ109OCh5xeKhdW6mPLhmFye9478Gs1PBMRb1fksZvuZ8E2+vcsgR jUXifxOvDWoA
5A+VBjWuhvcUdN6b+J1DOK8r+GbwLtRq5mes/CEUa+W1OVy8HJfyqkcCuIzv 4PMVuDJW3kPp
RiWd6f4Jq89pJ3kH1lKnPbTQHknFFtTTVbg6tNqMNaE0M8O1sdXfKN3E+0hG /IS13X9g3Uls
7z6Ldft65rGeFf4CaT5tEvgDXSexJno+i66+RKYt0dpzGsZZ9FC1izltncf2 BpwLbSPRANbT
QQfUkLuKK1djE//S2MLp9jZ04w7ORyrsG6IwKmGPVMIewS3YSYuriN+ttNNI 3eXU3YUEVzlh
xqlsi9FNZX7E2j/RlPi+8fsqjDcvwDhVwfh2DEQmxE6a1Lh2QpmYx6DAPPZw d5ffood9DTiN
A3u7xRncrWB6QOAjtLaafQnRmmtLnIE8hcFfcfQeiq+eR1FZ4S+rnp8x15do S5zGYx+hQ92f
7Gtqa/oTq9uazuDZw6ewoq/5DF5qfaOt+TTe+oExOTzaZvEeU1Y53EgqqTQ7 sB0Z3IytHI63
Ywfjvw0ThGOSeVgYpNZuau3BHMF9FvvCnA+E9DxRgfdEDG8HHsIH+JAoZWjj JBNppM0UPsYn
xGKCRfoUn/HJovzn+IJFmiOHvsRXRPTrGMtI85twM3wbIv7dP1BLBwhmLCpP qgYAALgPAABQ
SwMEFAAIAAgATqbhNgAAAAAAAAAAAAAAAF8AAABvcmcubWVtby5jb21tb24v YmluL29yZy9t
ZW1vL2NvbW1vbi9kaWFsb2dzL0RpYWdyYW1DaG9vc2VyRGlhbG9nJERpYWdy YW1MaXN0TGFi
ZWxQcm92aWRlci5jbGFzc61UXU8TQRQ9U2oX6ioFRahfoCC0FBlICDGp8QUE SZaPAPLg23Q7
LEP2g8xugb/iv8AHIfHB6Ks/ynhnu1HQElNjNpmde+fec869e2e/ff/0GcA8 5izkGF5H2uOB
DCLuRkEQhbyphB95MV9WwtMiWDqIoljq5dQ7kTkdFSeOaEh/S0fHqim1hTzD lIGSrq+OYskP
94Ur+bGSJ1LH/EowQyE5UPHEHMOs0w19nTJfqlAlrxjmK92lVvcY8ktRU/aB 4aaNGygU0YNb
NizcZuipmIB+R4VyoxU0pN4VDV8yDDqRK/w9oZWxM2feyGdY7UrBtb2jqno9 mawFwiPshYpz
KI4F90Xo8c3GoXSTetW53Nn4JOEEdHSg3JinWYRgSV8GMkyM4j/y6ZgIduUp HU92xP/l2km0
Cr26hfsMi5dpvWCf61aYqEBySXs30pJrGUct7cqYr66vbGdGEWU8tPEIj+l7 EfHb7TWG8crV
KtoQaddaifI5BdWLGMNTC08YRv8SamMcEwylJNryRbIf6aCtm2Go8q5DOdSB Zrv9DC+cfyuL
QE67HLr/NCDVvSINbdWMai9DcSeVs6LMKJY7Ic2a+hnstTCUeskXcSxjC7MM M93oYRi5ThF9
J7oy9BdhpZK5SbTLI2fkkb+PrAWycvQuTtc+0nIB+wNZOfTTWqAYYAUlWu10 X8QABg0a7uBu
hrBIb4OQY2e/Zb5JM++1T7NMsxsiH6NnGCMZhiCvUTlc+4ryewzUvqC8PnOO B/lzjJ5dAh4k
+YBDBWyQpC2C2k5JxtrpP0mGMxKb4J9hEjkKsjCV0U1mdIXp2gUqnQtui55O 1xpm0uKN6Ofg
yP0AUEsHCIkiOod7AgAAmwUAAFBLAwQUAAgACABOpuE2AAAAAAAAAAAAAAAA VgAAAG9yZy5t
ZW1vLmNvbW1vbi9iaW4vb3JnL21lbW8vY29tbW9uL2RpYWxvZ3MvRGlhZ3Jh bUNob29zZXJE
aWFsb2ckT2tCdXR0b25FbmFibGVyLmNsYXNznVVtcxNVFH5uknZputAYQa2l CrTQNEl7SRoR
aa1CmkAgBac4VSvobDe36a37krm7G0f/Sb/5F5hRET848NUf5XjuJtBO2umQ ftg9554959zn
PPfcs//+9/c/AEpYN5BgWPFVm7vC9bntu67v8Za0HL8d8DVptZXlVnd9PxBq LbbOPvrpThSG
vlfzrG1HKAMphsye1bW4Y3lt/mh7T9ihgVGGJZ1X2I7sBILv7Vi24F0pfhYq 4I3HwiE36XvV
XYoSraYMQuEJxTAa7spg9jrDYnMYXMsUuSI9Ga4ylHLDhc5vMqSqfkuMgeGs CQNn0khiwsQY
MgzJnHaYaEpPPIzcbaG+1pUzZJu+bTmblpJ63TemNHyG1aEQDJJKxWSCAYYY Kr2yjmd0kNBa
V3ghVZbGB/jQwCQDHzLYxBQuMphtEb75zpDLzZ+A4uBclw18RGd4kmuoIjuM lGi9CRrHNC6Z
uIwrRGQgfxUx+Q1tnjVxFdfoGAhOXaogrDnCJZQM5wnRYP/R7jmG8uHdhbvD RUuGvKP8rmwJ
xRvfKKvTEaoRCvervnEcc8ibKOitztBWm5YTCQMLDIUjyWxfCR6F0uF1YelC 1q3ObM0L1S/j
KCJvgJr4xuGoNkWpyAul28sQJ1Ai8CNli4DfXa9v9BdplFExsMRQHKaPTHyC GwTcsilffInK
Q16FLd0xZdw08RluHWQqMcghMzVPV3l8GUdENz7a0tANzzAWHDTr9RNb9Wj/ UfhEL5zyve6v
7NHuOuTWr53h5mkLZvBPQ+2pZ4s+YYaaHm5phvTjGEVd6uE1eVyCRV0+zYGG R/O56lhBIAID
9xmuvtWNoNOM7wRxNoAElwhHkp4RsExGT136KSWR0MDIOk6rCq0SJNP5wh8w 889x7hmtEniH
3qPkA2wiS28z1tN4F+dJMlzAe70MbIq8R8gWFf7E+68wvY+nWnuJ6fXiC3xM c+Y3PCBthuHh
wivM7ePswkvMvcB8z1DsGchjsWfg+5giA7+Vyv8OM/UXSlpOkvLpM60xUrRM 0pcDsFsECPiW
IH5HsLZwjmQW3+MinmAGT5HHD1jEj1giWYGFZWzjC9hYI1mDQBM72ECbInfJ KtGCCwceQvgx
AZVekX0CtLaMFaIgS1GfY5VQzOA2ZfySCN4g623cQSoDorrap/oa+SQ1rfnC c6wdT3Mifurx
+y7ukcySVkQDD0b1v7NMOBP/A1BLBwi6qA+NjgMAAF4IAABQSwMEFAAIAAgA TqbhNgAAAAAA
AAAAAAAAAEYAAABvcmcubWVtby5jb21tb24vYmluL29yZy9tZW1vL2NvbW1v bi9kaWFsb2dz
L0RpYWdyYW1DaG9vc2VyRGlhbG9nLmNsYXNztVZpVxNXGH5uQAbCqIRWK2KV CJUQIuPWioai
EETTBjcoiq1th+SSDM5CZyYg3ewm3ff1H/Rre05N2npOTz/1Q39Nf0FP3zsT Qgwmguf0cMh9
773v8rzr3L///f0PAIfxg4QAQ8yys4rBDUtJW4ZhmUpGU3Ur6yhjmpq1VSOR syyH22PeqYRG
hi4hwdO6tuBwZX5OTfNKGVoZZGM5pTnutMaXuM1wILVeZNG7c5Q1vjhDh7E8 yXWednmmZP4y
d6y8neYMg/coyRpzip03Xc3gCic6bdlcsUvMjnJ2YnxVktRKxnLSXMi7DO2p eXVRVXTVzCoX
ZufJEl03DWmm5g4zHIvcY8NZcpUlLZPlrqNM5riux9dL900zNCasDA+iAdtl tKKNYf+D9PRN
t4DAyGhBkGF7SjP5+bwxy+0pdVbnAqaVVvVp1dbEvnTY6OY0h2EgtZmMkXtb HGGTYd8DQBGn
5kdpN53WzMPJSN/DZkI4/bgMCc0MbWmbqy73UY4QzTBeO2wJy1iwHM3l8b46 PKZrW3pcZCIs
Yy/2SehmCD9QZ5BgPSHjAHoZmoXrfrzCkdq2/Ig1o49hmx+prowfqCD6cVBC jDytKyxjAAqV
psPdKX6Tgr4jUlFdk66tmVmqE4HtsIwjOMoQKodMGBKNQ621oZhRkTYtqDY3 SaJ7AwIMLenV
jYRBhp6NNHAQx3FStADJ924EV9Lvg6dlbEGThFNUo9VCurps5V3lrK1lxlRX DWIYI8LEKPVD
xJMfxpiMMxhnCOa4ls255zThJkuKq3MykuKqhYy7OXEjQD4rI4UJCj7h8cPY VSfXgoOK6gIu
SbjIsKcen4zLmGTYSllNecgF6KrclieHhOeonWtHdsS21WVR1ZS3i7a1qGVE jKdwRQTgKkND
RNTHcVyT8TxeoKlBVqvYGZRIneGbrGL3QL3IcGYzI6anoiBT6izX17Bex8sC K0XgZmRzY2tT
3DURxP0ApWVkQKOrzUtLxT31Vt3wjKoOv5/CrIycyHMzKfS+LEHMQ5dwgyFa qa5qFq4OQuei
ns9qpgwDJn0sqXquWPYNZ0EV87WvqhSrdCTLrPFWLMCW8ApNrw0JyHDg+lV/ 2bKIOrhRU4I9
LmGRYWhTeblwYzTvupZ5xhSfMCqIPG6KglhmsP7XgqgyXErbazJexxsMnWom 409tzTITOWpK
nhG1w01REoN1S6KWnDdkg3pF04fXTZSqYRb3W/ZerBkx2K75g/9dGe/hNk0v ypjPQ+Obpl7N
UeUz0bB6Hx9K+IBhb31OGR/hbYJNKMrWJb5KsWtU4WqaSsHpOcRwZJMZKznx hYy3hJFVTYcZ
tIfJ/UO8N7yUTHr0uCaeUB33Uz8gRjO1YdKkNCZ01XE4PbN21Zop9F6rqi6E yc0GelM3ICC+
ZEQFxCPHW+mFR6tEHK2Q6Xcr7S7RueBvjfYXsS0au4PQzx7zI/S7zbsKk6L9 JNqNR2nX5bNj
B3YCHvUYdpEyQXUQV4Do3egsqVdoFXdbor9gz09lxU3eYa+nUPYZSgobxWOp JJwuYesQ2Lr+
xP6JaAE97ZECotFYEYdiawrbSRD03GlBjOiDhGmgAm1HGW0HjuFJUt+CNjxF VID+6EFTMvgP
wRD8K9G7OD7TH2ptLOLEHQzdxfBMSGor4vRELMQoRgl/OUteDRXwTKyA84K8 i6mZIqYLmPF3
12eirIiXCpilfegvhMSxIAuY+xHtYvcrtN9gMdCJL5P3ZJYKeHUtD0coSOJ3 O6HfTajDhD1C
Q+QoBjGCE5TEOK5iCHP0zMjjFG7jdIX3K2XvVzyfRX50vIlbnvfUECXvR709 EIw2FPBOZwEr
awiC3k2C4jbmad7pc5Y1B/ExPgFra8an+Kyk70BJX1O0s4jP13T5yR/19NA9 yXyJr9bJ9N/B
nmqZzlUZ+v/a+/0G33rZD9D3neE7WvO0fo/Af1BLBwj9uNeXswUAAFsOAABQ SwMEFAAIAAgA
TqbhNgAAAAAAAAAAAAAAAFsAAABvcmcubWVtby5jb21tb24vYmluL29yZy9t ZW1vL2NvbW1v
bi91dGlscy9EaWFncmFtVXRpbCRSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxp c3RlbmVyLmNs
YXNznVRbTxNBFP6mLSyUBUq5Kspd2LbIcvEOkpACCUnFRJD36XYoS/ZCdrdE foo/wwcu+mDi
ixDUJ40/x3hmWy4KpNZsdmbndM53zvnOd3r668NHAFOYVxBhWHC9om4L29UN 17ZdRy8FpuXr
iyYvetx+TYeRV8J3S54h1kTwwi2Ym6bBA9N1cqYfCEd4CmIMaQkjDMvc8YUu 7E36dj0RgulL
Wdehm8FCge8EwmNI2HtlIFFYNq3QNJn7GyDwuONzQ0bSV93gPGzZY5ahPtgy /ZFJhuFc1Rrk
9TnTMYN5hlHtH+6nNhhiWbcgGsHQrEJBQxxRtKpoRIIhqqU24kiiQ0E7w0Rt uavoRBdDp+EJ
HoilXaJmfW9HnFExo62kamVD5tKj4hZuM0RcAslrtULUHFPBHYax6/vuVSSj n2lHJtinoh8D
DO3lwpdpKXnnZS9quW2+y3WLO0U9a3Hfn/0/HoZUDEseotwpyO7dU1GHeobW nOmI1ZKdF946
z1uCIZlzDW5tcM+U54oxJmXFkK0ukmqDQaJrdmSOe9ktKkoUGPSrbamgly/+ UROJsAn3oSuY
uGbAbvZTMYkphqaiCMpmSW+HlrrE78v8tjACauHMjaN7pYVUpRyBhyrSyDCo zqWQDOO1FMYQ
XwsxqW1EeeISqRMySUJfcYjBUAbCVzDHMFi1Hwz9VTqCAdJDlP79IvSQKIBE Qo52aGE02nFa
m+j0BjGyAEPpzD7U9CFa0rEjtNXRe4DuZG/9Ee4eYHAfI+9C31Fap6HS+o1w PxPSMWGdENYx
WnBKqjyhof+CbnxFD+29ZOuj38bIQ6WYFAkaUrQzyW4li9UwTyCZeY9xhk+Y fouGdOYQDy6i
toT1fCeUH2jDzxCxq+xVQZRfj/CYMCN4Evo9xTPaZa0Ms3iOyG9QSwcIxFuG 0KsCAAAUBgAA
UEsDBBQACAAIAE6m4TYAAAAAAAAAAAAAAAA7AAAAb3JnLm1lbW8uY29tbW9u L2Jpbi9vcmcv
bWVtby9jb21tb24vdXRpbHMvRGlhZ3JhbVV0aWwuY2xhc3O1WAl8HFUZ/7/N 7k42GXpBSpej
hbaUzdFuWzG0SQuNadLGbtLQ9KBFoNPdSTLNZifMTnqogGgBEVEQBYMoh5Ug ChbQNEsVW4+i
qHgrgifiDYgXigfwfzO7m2SzyS4F8/tl58173/e97/h/3/vePPrSQw8DWCKO U+ARON20usK9
eq8Zjpq9vWYi3G8b8WR4taF1WVrvJr4o8ApM26nt0sJxLdEVXr9jpx61Bfwr jIRhnyNQEqrc
LOBtNGN6GUoQUOGDX2BqxEjobf29O3Rro7YjrgvMiJhRLb5Zswz5np702t1G UmBepKAi9QKn
dOl2emaDnjT7rajebFpNGZVWhxwpejRu9CX1sN7bOVpYeNOGlvrIiCEdtmUk uuor3SmHokO3
uUugw+hKaHa/RfUuex1ErhgjoosirP6EbfRmxFl62EpbkwyvaW3OmFZ/Tr2C 4wWOH5HWYFna
3oiRtMswA4FyzMQsBScKnDBC0mjG4/SGYSZUBHES46PFYgIVoUhuDOsrt5WB TlUxBacKLA9F
8kkpymVlelzv1RM2/UFMFXQZfazvsfVEkvIlLsbtIFCalkhszMyvl1wYA6i9 fRlQLc/LsaKg
XudQ6E353VAM8/8TCWUIoUpBpcCqiWTE3Mxw5aTTpClm2FRktdmrGYlmLWqb 1l4V1agRKGcy
tSSStpaI0mX1ocpxFu42rZ5knxbVw1syo3zyqNsiLFYQFjj7GEWoWIKlRHrU 0jV7LIVAXR7V
bEtLJDUnMuGNI2MtPoa3vhxnoVbBGwVqj02CirOxTGAKfZUJBuMosCiPTvqY AIZH0dNDdVih
gPCqL4gAF3iWmUxu0Dt1S2d4GmJan61bKlaCBXcWlcm7LtAzvlxNolVlYThO rEy9rB2rVDTg
TQLTqVI2wM1GXGfaVoUmz4dRqSyr2WoVTWhm4hsUrhEUzO/QaPqW9DyDuhZv VsBKM2P8qop1
iPBYSbDAsC5mJIwue/KUalOxHu3czTZd1XJp0wqXYQM2KugQmFMg/1VsAs/B oAvh9rhmd5pW
9phyCmNtHo9sG4+j3MIidThfxVZsE1DJ1dtsaV2yNvLYzAPDXPZyvAUXKbiQ ESkeGyouxna3
RmRmBVoLH4Z5zJlgE0evHSqi4Ok0xfXayFaRwlu9mp060a2AMT6zSBYVBnZK LCYjphbTY06X
s01BnFAfwdxaLdndqvWVIYE+BabAymMr79kieAmI+grZ5OidWn/clpuv75Mp wnyaPiYbuC+B
0QNbtlv9TIVQzmLlZmn2bhV75LI3TlFy4q0q3ibbM39/wp1ai0tVXCatVbq1 ZBvTRrYVq2V0
rlDxTryLpzs1yjZZja8BBGkh9QFciasVXCWweCKPJUxbc2pzW3rQrkV7tC5G 5t24RvYPLW0d
GxvaGpsElk5YxiYSQkRciWtVvBfXsVGldZsNfffFTW7HITB/wuLelK2CTkl/ v4rrcQM7Hopo
MxNt2i6jS3YgLYldupXUs8QWw9c3UWnOOKXwlhNRNMa1ZHJcVybDeKOKD+JD jDZ7wIY40Ruc
oMmT4L55HLgppgw3IaDgFoEzivByTC/HAG5V8VF8TAZpJKGriz8w2fXennNg F59L5bhT9sQf
FzhujDsUfEIgVNCEdNtUjv24VcHdmebbMMMt65v2RHUnGVkXR/pdhnaKPrpl YB+z7Fj7FSah
ljnLV76m01nA1+mewxWRPPcHrpcYNlU9Id8Jy8onmds1u5tDKxvE4kNIQ8xM 4ZqaU5kEhJ5V
a6xn5c5J3ZYeIaNfermFCSlYW+cUSB9yphvgnC3dG4rHsMfeNLJs3gRhy6Oh mCoScyxL78MD
tTBPGlBka3kd7wKP4OsKvpZzoufwZBiS7fH+LtnJPopvsIEY3akxojlpmSOj JUvKcvItfFvB
YzmFYEIGFd/Bd+ks2UGYJp2/sNitJDm3+z5+qOAHVLFoJhU/wo/dpqXdMmV4 CYVQqPKCSfdN
k3LHn+BJBU+wqyqCXMVP8TOa16vLLxxJx5OT75MNoGycf6Hil/iVq2tjtxGP MXkF2kPFScib
0Xm67c0Kfi2wYLzMNNIa+TKqqnktJ1DVryJMzLq+rKsXFOdo5rPBfzbEgewq 869I75Fzp4Ln
BE6bjFzeQcrxPP6q4C880IuRrOJv8kYwjRGR3E2ZDxRl+Af+qeCFMV/BXA+r +BdelN8qErHk
FkMWy4p8l55tUpP/qPgv/udGvLk/HneL69y8SZEOT4ukIS5fRptCszF7ckp5 i5qliBJKndQ1
ZjymW+XCgyd5CFjS9wuKdX1Zh9uwGvIry7RRH+cWSatZXVoSCd1y+hE9qYhy gYaC3/Xmj7p2
tJoxo9OIOqVTglpPyJNwTgEKnE7nlED++Tjywc9fhW9hSLdxtuogSu/nwIMy /vqdyXko56/q
EvB5HJ8BTMFUUk1zaKc7QhIcSeEzD2HG1oM4obWmKoUKD7bUVA/j5ANcKXGk TnGowijFYvIv
caSf5nJiNuY46s3kjFS2lNRzqYEH89M6uDNncEbqcGpWhwVShxLZ5HMPsWcY Zw5hYWtNCm8Q
GMbyNupw7mHMqPMGvUNorPMNIh70pbBGYAitdX6XMOj3DuO8IWwpSeGCEtQp QeURBHPWUtA8
zlIKDO4tmH8IPVuH0XsQybrSoBIsTWGXB4NQ5VsKe8nKjd5O0pevT7umzkfX XC5Q5x/E0ox4
R5nD2OBN4R3O3r6FQeUB7EvhPYzOEN6XwgfoTUnoCHv0EG6isA/X+aV8KU0Z RL/cknK4d+kR
DAxgSbD0MAbqAsHAUZwfDKTwEYEjuG0A64L+9Oth3JbCHRQ9iFrJtX8AiyTX fpdrriS7K81V
4XLdNYpL7ugodHXQf4ARiuMK7KP9brTvRIi/5/JtFfF0LqPUQLw04iQ0M6Zr iYF1qEWEq+uw
Bq0ctfEavx4X8LkD51FaB/qwEUk+92ALJZ+Pq3jHv478N2M7boeGT/Fy/GXE 8ATHT6Mbz/JW
+iJ6mLlxwUunmM475zxcIpbBFquwS6zBbrGVgemBIfpxqYPAIRYF4gafJNrg jFwEKuIS3MMd
iHLRhU/jXlpykrgI9+Ez8JJiFw7gfqJuMS7EA3z304pmPIjP0tI9ROznKLmU Gis4SByWUt/H
keIePtyNFXiIvH7qfiIO4fOkeRbX4gt4mHMv4HJ8kasKrTC4ehiltONMRuFL CNCC+eT6CnNg
vpMtnrTuZ/DNlfFVygjIj07pFP8T9ZbPTWkIRoZxNIVvCsgc+Z5AW0mtdxBL FlZ4l6bwOAHk
K6klOqcFfRX+pdVVw/j5Pr+oINQevuPl5wbhq/Pt84oK70K+PlYtwz4bq2n6 U+nSschx6tU0
+BqG+1rMYsBm8xJYiRuY+jdiOZ9reGVq4XwHr0KSeq2roON4kLPVcTIvW5T8 NH5DybOwEr/F
72jKyViG3+MPDEEl5f6R5vlQw/VnOOenBmwa0oY/RWofn9urjuDZASysOYog s+/PAkdxmjuo
GcLfB3B8Nd/+LRidl1gUhNhSdUR4BlBVdVh4UsKbcdFU6aLqGumQjAOeH4S3 7X7ut4ywvSjH
B/upxV0cDdKqu1nu7iHVvQzLfbT3AAF+HzkexMWEiaQ+y9VV+ITfKYTb0z6Q I+kXDzlPcewt
QRMD/4zjA4+QlnpEqQjwyb5JyH8VnlcAUEsHCPqSkae3CgAAxhoAAFBLAwQU AAgACABOpuE2
AAAAAAAAAAAAAAAAGgAAAG9yZy5tZW1vLmNvbW1vbi9wbHVnaW4ueG1shZJN T8MwDIbvSPyH
KndSBhcO7SbENGkHPsTHD3BTrxglcZWk0/j3dKSsaUHCpySv/eR14mJ1MDrb o/PEthQLeSky
tIprsk0p3l43FzditTw/K1aoNLUex9xreRWlVncN2X6VZVmBh4D2mPC9jdEy 2VAKdo0cKLIj
2XLbtfdoOy+GWq4+UIU7tsFR1YUpBGpoA1QaS7ED7VEkGtWRbtCwVGwMG7lm A2QfYE8NBHbb
gCYlp+XDvRq8n7pU7FC6zgYyKJ80hB078/idPXg+2gY1s9qHGmGjKStjqpcv CE69rwkaB2ZD
Gv2tmrvqA+2xYb9h13/NTPvd8//4xbaeUTRUqEsRC7KhIuktj8jxYE+eKtIU PpcJqbAcllNy
kbzqVIlhweBfr42eO6fQy+3zsBRzcp6gJy7y1EaRz72eCpM5+FFOc9sf9DOd n4b6C1BLBwie
izYfSwEAACIDAABQSwMEFAAIAAgATqbhNgAAAAAAAAAAAAAAAEkAAABvcmcu bWVtby5jb21t
b24vc3JjL29yZy9tZW1vL2NvbW1vbi9hY3Rpb25zL1NlYXJjaERpYWdyYW1G aWxlc0FjdGlv
bi5qYXZhpVZNb9s4ED0zQP4DYxSFBLjsttfWCwSJvTB2mwRxg55paSwzpUSB pNy0i/z3HX5I
ZmylCbAXWRRn3sy8eRy65cV3XgFVumI11IoVqq5Vw3hhhWrMp9OT0xNRt0pb es93nHVWSLYC
m244XyikaA2guwamu8aKGtiN5HajdH29vofCuYw4QL3pY3rsu9vl84bg4ee/ w6vQrI8fsF1C
YFSnCzDsry+L27gY97/f8AJi+Wx57n9/Z1kKLlVl2KX/fY3lFzAGKX/ZYSfg B2jDliuQ8GIi
e2uru8J2GsoX/DrBloHKUOYlmlfcPkOMs/6m9Pc1NMX2hutn+Eczt7lshJ0/ FNAeh09llrBX
aV5fbJUyoMeoSb2cUAafO1x4NZ6etN1aioIWkhtDV8B1sY1GCyHBhCopgkqo obGGjpZP/3VY
pNVi51ZRbbT+GeiEch7cMShJ7J6Sg+aRo9RkpDUDbuCJBIdQyE6Jkhrw+e3A 4WVRkTQIdHoY
1XJdgXWvuSuDkJAGnSU7LsrjSJiYxMWWNxWUx5H2KQ+2Q5ADajBe00nXFkLE hmaDAxWNsbwp
QG1G2YiAZJQpM/JtRrNxHJOSGrM4tmNG/IIsp7MZ/eDtCHn7diwQQ/IWQhsb K0SfpJSng64v
gjz9TBV16R7YvipWqGGU5yzqM1fO7bzkrQXdf2T+KET3R/f0jzjdUFnzhq8l NluY/i3Poz5S
ba+VksCxe3uzUKMGTL05Phv0bK+AHisRGw7oA33l8dQRghcA7bSgjqwjXAb9 9M5yVy8a4wtv
W2jKheaVp+s1Xs8bewJ8JnjNfU7uiz9pGYYJJpbMHgcYl73lQunYgAwrmXom YhMGMUasKMDZ
7I/cb0XloKRFU9HaVF/hwX7EiJMYgzbK0o3qmpJNoiyeXChMIRdzrZXOXNgp nfjFZDqApXIg
IA2kgccGcV/3pazcwYYfdMwqC6PG0bESNjK92oKUWT7tIXolJwwgqs/ZkRBL uP47kNEnRZIu
eCRMI/F2cWIPDxqBJ4f0pA8xz2a+HxHa6p/9cSVkuGjwD0Mtw/NcSlVwf2D6 nrWuzlu3GePN
S2GVdmrokYivKW77sH3pyDxFvGKLo+DwoqTwkO+z+Z/p3MiuEs0AhikhUcs4 tLA9yHTQyeTO
H2pqFXVJU/DuqBjM5hN9//7N1fXVu6t/Vu8+vBlKCC+Pg5L8hfL4H1BLBwhy 6AzlggMAAE4K
AABQSwMEFAAIAAgATqbhNgAAAAAAAAAAAAAAAEUAAABvcmcubWVtby5jb21t b24vc3JjL29y
Zy9tZW1vL2NvbW1vbi9kaWFsb2dzL0RpYWdyYW1DaG9vc2VyRGlhbG9nLmph dmG1V01v4zYQ
PStA/gO7JwlYEFv0GPiwsZ3EqLcO7DQ5BrREy9xIokBSTtNu/nuHH5Iomfam hwKOTZHvDd8M
Z4ZKTdIXklPERY5LWnKc8rLkFc4YKXgury4vLi9YWXOhDISmBaslBZSgWFDJ G5FSidft6L5o
clZdBTm03MFYExvFCnxDiWoE/UbqM/CMKVwLfmAZFXjxJEhdU7FQtLx3k2Fu DlzRVIqV1s5I
7u23m1ZxmP99R1LaxgDPzO9HkAsLnfJKKlIpeY5zYPSVCom/CkHegKFopc57 NeQtNrSgqWK8
mu5JldNsySTY+ChZiSbV8c86Mx/hLcmWFv9FpRb1aMYfQY9dmh8gKGGifFV4 8/RwejGHZNmz
FHwtIcFP4wryxhuFbwXLZkSR08BXluVUSTzlsC6ZOmOzh1ZK8OLnwM2eFoUp tsuLutkWLEVp
QaREkFDgSDndcy6psOmF6F9w0JlZ1I//XF5E8KkFOxBFUR9yVL4N4u+jvBoA mA08zdx2XnX4
nNX2O6AAvqjqRrWLVm5IaGzcQlJ/f27ZTHMTIGrZkWygoGODSLTByBlHEwvU c++DjXzhELsT
yuNuB0EhzSuk9kzis4622wiuDAS500OpgFZFrUtfYRx3GYBqIiBDE3MEUT+d dqMJ6tEJMt7i
I3vOivFfu6SjESdYUvUARx1/sqJRZjV/ssDOip7Txxx3u1qAczz10rX30R7o gbMMHRsKOOJc
9BMKfKvoq5duvYDPCEoTbxZ/3C7n6Id5uHveTNer5VJbiSI79+jmHOR6tZ7N 11Z8W47IlqcZ
2v3albgd4JvFcvl8vXq4s9SegfeU5Xt1xyqdT799+TJeh/JT+9Gy7yKG0zAR MYex7IhxbyM5
JgF01M9jLTzU6OMkzB/0WcP2zme46CzoP7ZDsctzU0S/TKoG6sqEfLyDAQzQ 1g4tJD1DGN30
OkBPXLzImuia049rzlXQLZJlp64s4+Hq5bpRilfzimyLzrFQxoKaITiLt5wX lFSI2meXriDH
wuLxzYxXvz8vZuZYWxMtNbDroBcfHUHXj4ezRoFrWuYO0u3KDGLXCiEaZd8+ 2oLVZ2ai965v
g84E3NisyrUN0xTCJnQGuCnon9rVlPKd3zNtNlh05PdS1110x/LhztqVJdhv J9Qx9KH/uV7A
6St+XxC146K0YmN4yXDNyETUZhcK+BkO+CgjEFyiVo1EJ99+BmF32TJExsG3 DEQP4zjqCdxd
MYCPEz+ooXeolh+FFnslOshhutnUmoii0ebuDLS2zhKW7G8oPDSZoF+7zSOX HNJddnOXEZNe
gTZ9w4RUbq2z7pnvib7XgZfwfuPoeMs4DlNGyKS1YN1+JEVDe1HvHxPX/0+B 53B3v/1E2DH8
/xDlV1Ovxy+9ljwLl+BY1VXv01Ef9CrO9PAT7ztdKnQrHcdW58jHd6+Gzxnt ajqkbUeg+hO/
5OHzL1BLBwiLlyUpQwQAAIEOAABQSwMEFAAIAAgATqbhNgAAAAAAAAAAAAAA ADoAAABvcmcu
bWVtby5jb21tb24vc3JjL29yZy9tZW1vL2NvbW1vbi91dGlscy9EaWFncmFt VXRpbC5qYXZh
7Vndb9s2EH92gf4P7AYMcmYo3R62h9TDssTZjDV24CTrgKIIWIm2mcmiQFL5 wJb/fXf8EmXL
rrP1ZcCAxLHE+77fHY9MRbM/6IIRIRfpiq1EmonVSpRprXmhjl6+ePmCryoh NbmldzTlIh1P
Rw8ZqzQX5VF7EVnSYynp41uudNfiiSgKlm1j/YWq5Tmtti1dsk6ZY80k1UJ2 rW2RZiWFBXSd
ZQWvFAPvJUslU6KWGVPp+IwX7Gg/SlHkTO5HeyHFLcRhP+KZ+7of9Tsh/1AV zdhMiP0UePnq
oqgXvNzFU5earxikUbIOEMT0bDX3SCqF5vPHdIJ/eEb34jFpup6NtxMyY9Fo +nF7IBsy72y6
O5Y7GFrg6+YxNo9ORKlZqY9zWultcEAeLWmpqKmFVmgAcHvzXTXfaTHKuebl 4lSs6LYkLoDf
5zDndCHpyib21D60RJyBYCEfPy3Jpq0FqZ/Pz3ZHen/+55thO40USs3YnElW ZmxnNmIhgFWT
BR+RZ3BMRL6HsxG5/XJh+6/pR1X9seAZyQqqFHEWXIM35M+XL3rwc3hwAJ/k gFwyKrMlU2Qu
JKHE5VINyP2SZ0si0W+iBSypimWILeIqJbUCZkzXslRIwDS553pJaFGQFdXZ EhDgJZKQEpJE
OekPiNBLJu+5YoSWhK0q/QhGeek/VhSZWcFWUArkasm8ejRKGePR9Db1A9SN gogY+uZJzAno
ChbNoSGDNRDVlHzx8PBw4xa+6Kc+NpqUNTgDqniZFXXOjG+G0Rsojf9I+yby 6weSQfUC9jEE
rXhERColRsghfLqEKUxltiltwbTLYkCzkC4SCXQ3HyH4OiCXWqKm4Hgf5GPe e82m+QYIf/BM
igxJye5J2HDNatI/Qh5Pk9I8TxotdtE5v9M6L2AQGYTMT/8Qies4VJ8HiFbI s+CoyDFpQorw
8tiEAKn/ARogsAV3GKUdaN2+JxEWP30L8N2x7aRg2rgEu6F7Jyi810szyahm LWoH985uT6j7
OySd66iicyFpG4p00RiQ9K1O/A2157I+JEl41Qe2MIzhGKmSdikZCYeHhaB5 k39ABMDCox2L
AqmwuBI/6BKuvx1asHD3CsIAL9MlVRPQAU8mYiYfPZcpZLigUF5D5E9LQ5dq YZddHI1JYJNi
DLBRonCWn4qsxsTD0HrHYcT9sjMPhtOHqXFgSD4RzPhFYoT0etgbXbYvCqrB +4BPWEm8KwOi
Zc364IXkqzNJF2hlApvTnBaKOY/4nCSNNUNTeX1iQ9N7hpnWnHVL/6Wpzsan YOmrMHhy9RaA
wXIg8tZq+ei/9uBkQ4SZv/0+4E5Pyebs5G3toVenbE7rQqPwqeUPZmDmyY+Y +2++/+b1d69J
89apSqtaJ93T78OKp7+fv/Wq0+nF1Xg6uZmNTqaz05vrya+T6bvJzdno+Op6 NhqQn4QoGIUR
dnY9CuqD81gTidPpV59Ihs0O6qA5gBIWgtMw16VhD3xRiPHjqSk9BQC3jT5s XGRJ77BcSpjm
lN2+oDPgmwqGMpaH/au9M2OhInw2NmVnRruAsZOONYKuaalxLdv17nL2m5XY r7R8M0ec9p1c
W/sOkjZK3nycF46LIqFNi5yIcgIxWdCPBRuXd0wqFhqmVIkYkLVRNmXjyeXV 8eRkhOy/cXZ/
M7J+olJTf1ZrlAkg7Nz3TZg3tq2QrAb56zSdced6GBxttc7uUEeR5j5qTVPB zdvuTzAA4PBv
W6CDI74wIMI9wawKh0fkxYVXQzMEfPWVIUub1tKPBa8NO42Cng+CGfFaQ9G6 vK5KYNAhyYYb
bkNueeLehfkG/PFksUtuufHKHzA/o2MdIjt8e7KgchOUl9Y1vLr6VdH2O5di Re79tr1l/puW
xSNMYobZ8ZnJVS+5asgs1u1g7OQT/Vgx1R7x2rPovPakFWwbassgF/FsThlb R7PNaaWrVeFv
+xaJSPwYkrWLojRW7TZyIIzFuHuu9x9IZb+hUpSGxG5RRQymXGECInz4+oi/ 8UxpwcqFXh7x
r7+OyjPaDsMdGWhqTgrDoPU9/4CXmx+xYXnEBF23oOv2TXP54JTdOmUNMHFe XPIih9YXRgr1
/vbDwMZz/ai0VnFu92rdnQGHq7XDA74oYeng0GE4grCR3oXfGctqqfhdg0YV pkjF8VjRDGK0
zOPDw9zcVqoWwCVrPxtR3SXQ4FLyO5h9PDDvBM9JHKeQGZQ+IGsQ3HGOcHNb 3DLMZWwEACRp
itLNduSvv/zckqBORBryjTxh0m96VPd6yspcvYOCjgZ20ndgsIM3tibPDLJw xGtN09EG1+mI
if7zsJwkng3e9v9jcG7A6wFjL7mieeVc5OESFBGCxw9rQq7I2rUqxsoMDqYS DEDDccW+QGwG
XZv3q2T1aPWxPFy4flLgPhptm/6EW4mfWtetgDRv2urPvXfg/xXsH/atP4HE 9Onl6Kqfis41
y9UcBbqFtqRdT1BeP4XWsV2iE3QGH7X0YsIpwGR5ELSG97PR5fR6djK6uRlf 3pxPT8dn49Fp
UzX7R9o0HPsfhpMlLRdwYIpttEvuwUfdTmCRo2bKxWeTmqhQozyGg4aqK/C6 rbKlJTrTWVfg
8+lvUEsHCKOwjmqbBwAAZxsAAFBLAQIUABQACAAIAE6m4TZjc8zAzgAAAHYB AAAaAAAAAAAA
AAAAAAAAAAAAAABvcmcubWVtby5jb21tb24vLmNsYXNzcGF0aFBLAQIUABQA CAAIAE6m4TY2
+eNk6AAAAKQCAAAYAAAAAAAAAAAAAAAAABYBAABvcmcubWVtby5jb21tb24v LnByb2plY3RQ
SwECFAAUAAgACABOpuE2XLdLx9MAAACwAQAAJAAAAAAAAAAAAAAAAABEAgAA b3JnLm1lbW8u
Y29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GUEsBAhQAFAAIAAgATqbhNmYs Kk+qBgAAuA8A
AEoAAAAAAAAAAAAAAAAAaQMAAG9yZy5tZW1vLmNvbW1vbi9iaW4vb3JnL21l bW8vY29tbW9u
L2FjdGlvbnMvU2VhcmNoRGlhZ3JhbUZpbGVzQWN0aW9uLmNsYXNzUEsBAhQA FAAIAAgATqbh
NokiOod7AgAAmwUAAF8AAAAAAAAAAAAAAAAAiwoAAG9yZy5tZW1vLmNvbW1v bi9iaW4vb3Jn
L21lbW8vY29tbW9uL2RpYWxvZ3MvRGlhZ3JhbUNob29zZXJEaWFsb2ckRGlh Z3JhbUxpc3RM
YWJlbFByb3ZpZGVyLmNsYXNzUEsBAhQAFAAIAAgATqbhNrqoD42OAwAAXggA AFYAAAAAAAAA
AAAAAAAAkw0AAG9yZy5tZW1vLmNvbW1vbi9iaW4vb3JnL21lbW8vY29tbW9u L2RpYWxvZ3Mv
RGlhZ3JhbUNob29zZXJEaWFsb2ckT2tCdXR0b25FbmFibGVyLmNsYXNzUEsB AhQAFAAIAAgA
TqbhNv2415ezBQAAWw4AAEYAAAAAAAAAAAAAAAAApREAAG9yZy5tZW1vLmNv bW1vbi9iaW4v
b3JnL21lbW8vY29tbW9uL2RpYWxvZ3MvRGlhZ3JhbUNob29zZXJEaWFsb2cu Y2xhc3NQSwEC
FAAUAAgACABOpuE2xFuG0KsCAAAUBgAAWwAAAAAAAAAAAAAAAADMFwAAb3Jn Lm1lbW8uY29t
bW9uL2Jpbi9vcmcvbWVtby9jb21tb24vdXRpbHMvRGlhZ3JhbVV0aWwkUmVz b3VyY2VTZXRN
b2RpZmljYXRpb25MaXN0ZW5lci5jbGFzc1BLAQIUABQACAAIAE6m4Tb6kpGn twoAAMYaAAA7
AAAAAAAAAAAAAAAAAAAbAABvcmcubWVtby5jb21tb24vYmluL29yZy9tZW1v L2NvbW1vbi91
dGlscy9EaWFncmFtVXRpbC5jbGFzc1BLAQIUABQACAAIAE6m4TaeizYfSwEA ACIDAAAaAAAA
AAAAAAAAAAAAACAmAABvcmcubWVtby5jb21tb24vcGx1Z2luLnhtbFBLAQIU ABQACAAIAE6m
4TZy6AzlggMAAE4KAABJAAAAAAAAAAAAAAAAALMnAABvcmcubWVtby5jb21t b24vc3JjL29y
Zy9tZW1vL2NvbW1vbi9hY3Rpb25zL1NlYXJjaERpYWdyYW1GaWxlc0FjdGlv bi5qYXZhUEsB
AhQAFAAIAAgATqbhNouXJSlDBAAAgQ4AAEUAAAAAAAAAAAAAAAAArCsAAG9y Zy5tZW1vLmNv
bW1vbi9zcmMvb3JnL21lbW8vY29tbW9uL2RpYWxvZ3MvRGlhZ3JhbUNob29z ZXJEaWFsb2cu
amF2YVBLAQIUABQACAAIAE6m4TajsI5qmwcAAGcbAAA6AAAAAAAAAAAAAAAA AGIwAABvcmcu
bWVtby5jb21tb24vc3JjL29yZy9tZW1vL2NvbW1vbi91dGlscy9EaWFncmFt VXRpbC5qYXZh
UEsFBgAAAAANAA0AaQUAAGU4AAAAAA==
--------------020400020308060701010600--
Previous Topic:Article about combining EMF and GMF editors - anybody interested?
Next Topic:Question about Connection Creation Assistant
Goto Forum:
  


Current Time: Fri Apr 26 13:17:04 GMT 2024

Powered by FUDForum. Page generated in 0.04047 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top