Home » Archived » M2M (model-to-model transformation) » QVT XSD
QVT XSD [message #83849] |
Fri, 06 June 2008 21:41 |
Eclipse User |
|
|
|
Originally posted by: min.kong.morganstanley.com
Hi,
1. QVT -
Executing the following .qvto :
modeltype INTEROP uses "http://ms.com/interop";
modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
transformation interop2xsd(in interop: INTEROP , out XSD);
main(in interopModel: INTEROP::InteropSchema, out xsd: XSD::XSDSchema)
{
xsd:= interopModel.map interop2Xsd();
}
mapping INTEROP::InteropSchema::interop2Xsd() : XSD::XSDSchema {
targetNamespace := 'DUMMY';
}
with OUT target file specifies as <something>.xsd, produces:
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="DUMMY"/>
which does not look like a valid xsd schema root element.
2. Java-
On the other hand, running the following Java code:
class Schema {
private XSDFactory _xsdFactory;
private XSDSchema _schema;
private ByteArrayOutputStream _outputStream = new ByteArrayOutputStream();
private Schema() {
_xsdFactory = XSDFactory.eINSTANCE;
initSchema();
}
private void initSchema() {
_schema = _xsdFactory.createXSDSchema();
_schema.setTargetNamespace("DUMMY");
_schema.setSchemaForSchemaQNamePrefix("xsd");
Map<String, String> qNamePrefixToNamespaceMap
=_schema.getQNamePrefixToNamespaceMap();
qNamePrefixToNamespaceMap.put("tns", _schema.getTargetNamespace());
qNamePrefixToNamespaceMap.put(_schema.getSchemaForSchemaQNam ePrefix(),
XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
_schema.updateElement();
}
private String serialize() {
XSDResourceImpl.serialize(_outputStream, _schema.getDocument());
return _outputStream.toString();
}
public static void main(String [ ] args) {
Schema schema = new Schema();
System.out.println(schema.serialize());
}
}
produces, in stdout:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:tns="DUMMY"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="DUMMY"/>
which looks like a valid xsd schema document root.
3. Question: how would one achieve the equivalence of 2. above,
with a QVT transform? I.e., how would one re-write the .qvto in 1. to get
the output produced in 2. ?
Thanks.
-Min
|
|
|
Re: QVT XSD [message #83879 is a reply to message #83849] |
Sat, 07 June 2008 14:42 |
Sergey Boyko Messages: 171 Registered: July 2009 |
Senior Member |
|
|
Hi Min,
I'm not quite familiar with XSDResourceImpl but seems that your case
somehow depends on ones behavior. Namely on
XSDResourceImpl.serialize(..) impl.
For your case just try to specify output URI with file extension differ
from ".xsd" (for example ".xsde"). That way I've got the following output:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:XSDSchema xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsd="http://www.eclipse.org/xsd/2002/XSD" argetNamespace="DUMMY"/>
Regards,
Sergey.
Min wrote:
> Hi,
>
> 1. QVT -
>
> Executing the following .qvto :
>
> modeltype INTEROP uses "http://ms.com/interop";
> modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
>
> transformation interop2xsd(in interop: INTEROP , out XSD);
>
> main(in interopModel: INTEROP::InteropSchema, out xsd: XSD::XSDSchema) {
> xsd:= interopModel.map interop2Xsd();
> }
>
> mapping INTEROP::InteropSchema::interop2Xsd() : XSD::XSDSchema {
> targetNamespace := 'DUMMY';
> }
>
> with OUT target file specifies as <something>.xsd, produces:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <schema targetNamespace="DUMMY"/>
>
> which does not look like a valid xsd schema root element.
>
> 2. Java-
> On the other hand, running the following Java code:
>
> class Schema {
>
> private XSDFactory _xsdFactory;
> private XSDSchema _schema;
> private ByteArrayOutputStream _outputStream = new
> ByteArrayOutputStream();
>
> private Schema() {
> _xsdFactory = XSDFactory.eINSTANCE;
> initSchema();
> }
> private void initSchema() {
> _schema = _xsdFactory.createXSDSchema();
> _schema.setTargetNamespace("DUMMY");
>
> _schema.setSchemaForSchemaQNamePrefix("xsd");
> Map<String, String> qNamePrefixToNamespaceMap
> =_schema.getQNamePrefixToNamespaceMap();
> qNamePrefixToNamespaceMap.put("tns", _schema.getTargetNamespace());
>
> qNamePrefixToNamespaceMap.put(_schema.getSchemaForSchemaQNam ePrefix(),
> XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
>
> _schema.updateElement();
>
> }
> private String serialize() {
> XSDResourceImpl.serialize(_outputStream, _schema.getDocument());
> return _outputStream.toString();
> }
>
> public static void main(String [ ] args) {
> Schema schema = new Schema();
> System.out.println(schema.serialize());
> }
> }
>
> produces, in stdout:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsd:schema xmlns:tns="DUMMY"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="DUMMY"/>
>
> which looks like a valid xsd schema document root.
>
>
> 3. Question: how would one achieve the equivalence of 2. above,
> with a QVT transform? I.e., how would one re-write the .qvto in 1. to
> get the output produced in 2. ?
>
>
> Thanks.
>
> -Min
>
>
>
>
>
|
|
|
Re: QVT XSD [message #83894 is a reply to message #83879] |
Sat, 07 June 2008 16:30 |
Eclipse User |
|
|
|
Originally posted by: merks.ca.ibm.com
This is a multi-part message in MIME format.
--------------090508080701070908050103
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Sergey,
Just note that XSD wasn't designed to serialize as XMI:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=166638
It's there some way to accomplish what's done like this with the Java
APIs can be expressed in QVT?
http://download.eclipse.org/modeling/emf/emf/javadoc/xsd/2.4 .0/org/eclipse/xsd/util/XSDPrototypicalSchema.html#initializ ePrototypeSchema()
< http://download.eclipse.org/modeling/emf/emf/javadoc/xsd/2.4 .0/org/eclipse/xsd/util/XSDPrototypicalSchema.html#initializ ePrototypeSchema%28%29>
Sergey Boyko wrote:
> Hi Min,
>
> I'm not quite familiar with XSDResourceImpl but seems that your case
> somehow depends on ones behavior. Namely on
> XSDResourceImpl.serialize(..) impl.
>
> For your case just try to specify output URI with file extension
> differ from ".xsd" (for example ".xsde"). That way I've got the
> following output:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsd:XSDSchema xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
> xmlns:xsd="http://www.eclipse.org/xsd/2002/XSD" argetNamespace="DUMMY"/>
>
>
> Regards,
> Sergey.
>
> Min wrote:
>> Hi,
>>
>> 1. QVT -
>>
>> Executing the following .qvto :
>>
>> modeltype INTEROP uses "http://ms.com/interop";
>> modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
>>
>> transformation interop2xsd(in interop: INTEROP , out XSD);
>> main(in interopModel: INTEROP::InteropSchema, out xsd:
>> XSD::XSDSchema) {
>> xsd:= interopModel.map interop2Xsd();
>> }
>>
>> mapping INTEROP::InteropSchema::interop2Xsd() : XSD::XSDSchema {
>> targetNamespace := 'DUMMY';
>> }
>>
>> with OUT target file specifies as <something>.xsd, produces:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <schema targetNamespace="DUMMY"/>
>>
>> which does not look like a valid xsd schema root element.
>>
>> 2. Java-
>> On the other hand, running the following Java code:
>>
>> class Schema {
>>
>> private XSDFactory _xsdFactory;
>> private XSDSchema _schema;
>> private ByteArrayOutputStream _outputStream = new
>> ByteArrayOutputStream();
>> private Schema() {
>> _xsdFactory = XSDFactory.eINSTANCE;
>> initSchema(); }
>> private void initSchema() {
>> _schema = _xsdFactory.createXSDSchema();
>> _schema.setTargetNamespace("DUMMY");
>> _schema.setSchemaForSchemaQNamePrefix("xsd");
>> Map<String, String> qNamePrefixToNamespaceMap
>> =_schema.getQNamePrefixToNamespaceMap();
>> qNamePrefixToNamespaceMap.put("tns",
>> _schema.getTargetNamespace());
>>
>> qNamePrefixToNamespaceMap.put(_schema.getSchemaForSchemaQNam ePrefix(),
>> XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
>> _schema.updateElement();
>> }
>> private String serialize() {
>> XSDResourceImpl.serialize(_outputStream, _schema.getDocument());
>> return _outputStream.toString();
>> }
>> public static void main(String [ ] args) {
>> Schema schema = new Schema();
>> System.out.println(schema.serialize());
>> }
>> }
>>
>> produces, in stdout:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xsd:schema xmlns:tns="DUMMY"
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="DUMMY"/>
>>
>> which looks like a valid xsd schema document root.
>>
>>
>> 3. Question: how would one achieve the equivalence of 2. above,
>> with a QVT transform? I.e., how would one re-write the .qvto in 1. to
>> get the output produced in 2. ?
>>
>>
>> Thanks.
>>
>> -Min
>>
>>
>>
>>
>>
--------------090508080701070908050103
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-15"
http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Sergey,<br>
<br>
Just note that XSD wasn't designed to serialize as XMI:<br>
<blockquote>
|
|
|
Re: QVT XSD [message #83926 is a reply to message #83894] |
Mon, 09 June 2008 08:12 |
Sergey Boyko Messages: 171 Registered: July 2009 |
Senior Member |
|
|
This is a multi-part message in MIME format.
--------------040602030304050707040008
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Hello,
Ed, thank you for pointing about XSD serialization issues.
So for XSDSchema initialization QVT script intends to use custom
library. Short howto about these libraries was answered in thread
"[QVTO] Adding custom operations for primitive data types" some time ago.
I've attached modified 'org.eclipse.m2m.qvt.oml.ocl.emf.libraries'
plugin that provides easy XSDUtil functionality.
Original qvto script (that produced same output as java-code) is changed
to the follow:
modeltype ecore uses ecore('http://www.eclipse.org/emf/2002/Ecore');
modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
transformation interop2xsd(in interop: ecore , out XSD);
import library org.eclipse.m2m.qvt.oml.ocl.emf.libraries.XSDUtil;
main(in interopModel: EClass, out xsd: XSD::XSDSchema) {
xsd:= interopModel.map interop2Xsd();
}
mapping EClass::interop2Xsd() : XSD::XSDSchema {
init {
var schemaTargetNamespace := 'DUMMY';
var schemaTargetPrefix := 'tns';
var schemaForSchemaNamespace := 'http://www.w3.org/2001/XMLSchema';
var schemaForSchemaPrefix := 'xsd';
result := object xsd::XSDSchema {
targetNamespace:= schemaTargetNamespace;
};
result := result.setSchemaForSchemaQNamePrefix(schemaForSchemaPrefix);
result :=
result.putIntoQNamePrefixToNamespaceMap(schemaForSchemaPrefi x,
schemaForSchemaNamespace);
result := result.putIntoQNamePrefixToNamespaceMap(schemaTargetPrefix,
schemaTargetNamespace);
}
}
Regards,
Sergey.
Ed Merks wrote:
> Sergey,
>
> Just note that XSD wasn't designed to serialize as XMI:
>
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=166638
>
>
> It's there some way to accomplish what's done like this with the Java
> APIs can be expressed in QVT?
>
> http://download.eclipse.org/modeling/emf/emf/javadoc/xsd/2.4 .0/org/eclipse/xsd/util/XSDPrototypicalSchema.html#initializ ePrototypeSchema()
> < http://download.eclipse.org/modeling/emf/emf/javadoc/xsd/2.4 .0/org/eclipse/xsd/util/XSDPrototypicalSchema.html#initializ ePrototypeSchema%28%29>
>
>
> Sergey Boyko wrote:
>> Hi Min,
>>
>> I'm not quite familiar with XSDResourceImpl but seems that your case
>> somehow depends on ones behavior. Namely on
>> XSDResourceImpl.serialize(..) impl.
>>
>> For your case just try to specify output URI with file extension
>> differ from ".xsd" (for example ".xsde"). That way I've got the
>> following output:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xsd:XSDSchema xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
>> xmlns:xsd="http://www.eclipse.org/xsd/2002/XSD" argetNamespace="DUMMY"/>
>>
>>
>> Regards,
>> Sergey.
>>
>> Min wrote:
>>> Hi,
>>>
>>> 1. QVT -
>>>
>>> Executing the following .qvto :
>>>
>>> modeltype INTEROP uses "http://ms.com/interop";
>>> modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
>>>
>>> transformation interop2xsd(in interop: INTEROP , out XSD);
>>> main(in interopModel: INTEROP::InteropSchema, out xsd:
>>> XSD::XSDSchema) {
>>> xsd:= interopModel.map interop2Xsd();
>>> }
>>>
>>> mapping INTEROP::InteropSchema::interop2Xsd() : XSD::XSDSchema {
>>> targetNamespace := 'DUMMY';
>>> }
>>>
>>> with OUT target file specifies as <something>.xsd, produces:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <schema targetNamespace="DUMMY"/>
>>>
>>> which does not look like a valid xsd schema root element.
>>>
>>> 2. Java-
>>> On the other hand, running the following Java code:
>>>
>>> class Schema {
>>>
>>> private XSDFactory _xsdFactory;
>>> private XSDSchema _schema;
>>> private ByteArrayOutputStream _outputStream = new
>>> ByteArrayOutputStream();
>>> private Schema() {
>>> _xsdFactory = XSDFactory.eINSTANCE;
>>> initSchema(); }
>>> private void initSchema() {
>>> _schema = _xsdFactory.createXSDSchema();
>>> _schema.setTargetNamespace("DUMMY");
>>> _schema.setSchemaForSchemaQNamePrefix("xsd");
>>> Map<String, String> qNamePrefixToNamespaceMap
>>> =_schema.getQNamePrefixToNamespaceMap();
>>> qNamePrefixToNamespaceMap.put("tns",
>>> _schema.getTargetNamespace());
>>>
>>> qNamePrefixToNamespaceMap.put(_schema.getSchemaForSchemaQNam ePrefix(),
>>> XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
>>> _schema.updateElement();
>>> }
>>> private String serialize() {
>>> XSDResourceImpl.serialize(_outputStream, _schema.getDocument());
>>> return _outputStream.toString();
>>> }
>>> public static void main(String [ ] args) {
>>> Schema schema = new Schema();
>>> System.out.println(schema.serialize());
>>> }
>>> }
>>>
>>> produces, in stdout:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <xsd:schema xmlns:tns="DUMMY"
>>> xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="DUMMY"/>
>>>
>>> which looks like a valid xsd schema document root.
>>>
>>>
>>> 3. Question: how would one achieve the equivalence of 2. above,
>>> with a QVT transform? I.e., how would one re-write the .qvto in 1. to
>>> get the output produced in 2. ?
>>>
>>>
>>> Thanks.
>>>
>>> -Min
>>>
>>>
>>>
>>>
>>>
>
--------------040602030304050707040008
Content-Type: application/octet-stream;
name=" org.eclipse.m2m.qvt.oml.ocl.emf.libraries_1.0.0.200806091156 .jar "
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename*0=" org.eclipse.m2m.qvt.oml.ocl.emf.libraries_1.0.0.200806091156 ";
filename*1=".jar"
UEsDBAoAAAAAAA5fyTgAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAFBL AwQKAAAACAAN
X8k43DMrMQUBAAD9AQAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1GlZFNa8Mw DEDvgfyHUOhh
0AgnsLK19LDBbu0oG/Syk+OoQcwfqeyEbr9+SbNlzW3DGCwLPT/JO2npiD6k B2RPzq6SDEQc
PTa21Jg+S4OrZF7rpiLbB2PmQQVqZXC8ShxXgEpT7RFMbuDUBnBGg1Ma0BxB U8GSCT1sf077
OEouzJF3QFv2sHnNrqUSefLa7ttylMzH1NYpqelThst9PaW+fpjCaVJDH38W XXuylcbQWXbQ
TeCmU3k6145DupfqXVb/ocXRC54aYkwHq2mpcozAjQ1kcHGdOPtyErvOpkf3 Beti6K8d5rGZ
vWWQg1h0G8TN7Gqqv5/arVyIO7EU91l2u4yjOPoCUEsDBAoAAAAAAA5fyTgA AAAAAAAAAAAA
AAAEAAAAb3JnL1BLAwQKAAAAAAAOX8k4AAAAAAAAAAAAAAAADAAAAG9yZy9l Y2xpcHNlL1BL
AwQKAAAAAAAOX8k4AAAAAAAAAAAAAAAAEAAAAG9yZy9lY2xpcHNlL20ybS9Q SwMECgAAAAAA
Dl/JOAAAAAAAAAAAAAAAABQAAABvcmcvZWNsaXBzZS9tMm0vcXZ0L1BLAwQK AAAAAAAOX8k4
AAAAAAAAAAAAAAAAGAAAAG9yZy9lY2xpcHNlL20ybS9xdnQvb21sL1BLAwQK AAAAAAAOX8k4
AAAAAAAAAAAAAAAAHAAAAG9yZy9lY2xpcHNlL20ybS9xdnQvb21sL29jbC9Q SwMECgAAAAAA
Dl/JOAAAAAAAAAAAAAAAACAAAABvcmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9v Y2wvZW1mL1BL
AwQKAAAAAAAOX8k4AAAAAAAAAAAAAAAAKgAAAG9yZy9lY2xpcHNlL20ybS9x dnQvb21sL29j
bC9lbWYvbGlicmFyaWVzL1BLAwQKAAAAAAAOX8k4AAAAAAAAAAAAAAAABAAA AHNyYy9QSwME
CgAAAAAA5FslNwAAAAAAAAAAAAAAAAgAAABzcmMvb3JnL1BLAwQKAAAAAAAO X8k4AAAAAAAA
AAAAAAAAEAAAAHNyYy9vcmcvZWNsaXBzZS9QSwMECgAAAAAA51slNwAAAAAA AAAAAAAAABQA
AABzcmMvb3JnL2VjbGlwc2UvbTJtL1BLAwQKAAAAAADkWyU3AAAAAAAAAAAA AAAAGAAAAHNy
Yy9vcmcvZWNsaXBzZS9tMm0vcXZ0L1BLAwQKAAAAAADkWyU3AAAAAAAAAAAA AAAAHAAAAHNy
Yy9vcmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9QSwMECgAAAAAADl/JOAAAAAAA AAAAAAAAACAA
AABzcmMvb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL1BLAwQKAAAAAADj WyU3AAAAAAAA
AAAAAAAAJAAAAHNyYy9vcmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9vY2wvZW1m L1BLAwQKAAAA
AAAOX8k4AAAAAAAAAAAAAAAALgAAAHNyYy9vcmcvZWNsaXBzZS9tMm0vcXZ0 L29tbC9vY2wv
ZW1mL2xpYnJhcmllcy9QSwMECgAAAAgADl/JOAui6es7AAAAOwAAAAgAAAAu b3B0aW9uc8sv
StdLTc7JLChO1cs1ytUrLCvRy8/N0ctPztFLzU3Ty8lMKkosykwt1s/JT89J LUvNUbBVCAbS
RakAUEsDBAoAAAAIAA5fyTgnOt3nwwIAALQFAAAKAAAAYWJvdXQuaHRtbI1U XW/aQBB8LhL/
YeuHfkiYC0GpQgNIKSFqqjRBCenH42Ev+JrznXN3xvDvu2cbSBpShRc43+7s 7MyY/tuz69H0
92QMiUslTO6+XF6MIAgZ+9kdMXY2PYNfX6ffL6HTPoBbZ0TkGBtfBc0G0CdI nMs+M1YURbvo
trVZsOkNW3moju+tf4a2bGzHLg6GzUa/HLVKpbKDPQidXq9XNVbFyGP/naLj 4KtDfMjFchCM
tHKoXDhdZxhAVJ0GgcOVY777BKKEG4tucHF7HR4fH/XCTsA8lBNO4vB0pnPX Z9WBnrLNpJmO
1yC5WgyC8VV4d1vROKwaYJoIC/Vs6jmkS6D7bPgtVwhHLTg8OPjUZ9nwje/q Di9FhMoilXap
tKycJgjjSIrMIpzrXMXcCa0g5fdogS+5kHwmEbiUm7VAKHB+cCbzRUiHD+8e cu1Oah7V4WMb
4E5JtBa0S9AUgvCbDaFiEXGHMcxQ6qJFQLhZADyk0UsR07XTsNY5EB80ZZFD kxIhFXsasfAk
CXru75qNzQKTfCZFBPWa8AON9cv4vNQkx5PLHcFTwsrWNQrQlaew27nZ4A76 ZLTB+ZNwYDWu
TIjEBZcMMxkuOwftKimvLu0zPmw3G+faQJabTFu0j9i0oKI6MXpheFodoBBk RYpcPdau7U2u
Hb2Yl9LFIgalHRiMUCyxsmwjdSzosZNrmBudVvOeZeCZOc3GDIVaEGIs/Fs0 y0sj1+RK6TFk
3Lj1RumbXZU2tealf7GYz9F4zL2epnxNwmcZkatCYCAnXiQLV+TV7A8Rp/oY qxzuJAAYJRjd
l8+eDH9vQdaJcAlZWnC/yzZqhXDJP0AkodJg8yjZduKKAG2rfAk4MXg2ZU/g X8j7f6JchtA6
b/FWAr+2JRki3Lc2aUVAJdXHRaQijSS5HBeKxr8iyS/ltgzpNl/M/yNVf1EU 4OFfUEsDBAoA
AAAIAA5fyThWgtLXZgMAACUHAABIAAAAb3JnL2VjbGlwc2UvbTJtL3F2dC9v bWwvb2NsL2Vt
Zi9saWJyYXJpZXMvRW1mVG9vbHNMaWJyYXJ5JE1ldGFpbmZvLmNsYXNzpVRt b9NWFH5u82In
mAJpC6ODdQXWpkBrKFDatAOc1C0pJukar1K0D5Gb3GZmjt3ZTqX+K14kmDax L/u2HzVxrpOs
bRKkIhTpnuN7n/Oc9/z7359/A7iPHQkjDHnPb6q87tgHAVdbiy3198NQ9VqO 6tUdlbf2Vcfe
8y3f5oGqt/ZNz3MCI7o5uvWSh5bt7nsS4gwXX1mHlupYblMt773i9ZBhYlM3 a+uaqZnVbb1W
LFVMrVTQGcZ+MY7BldC33eYqw7kIrZta0agwpLVKTS/nt/SCySCvUXyuHT5h iGXndhniBa/B
JZw/5bbDJOECw5X+23zbdhrcT+ESxiRkGFbOnrbR07addtN2FYxjgpIoF4ya UczvaDvV2rZW
eKFtUmqZwczSUHBFwTe4yiAdWk6bl/cZZrJGf8FW54YZj+JbBddwnSG51q3B RHYQOLcrY4ph
JJcTJtMKbuAmmVgHB9xtMMwPMxm46lZpVcYPFGu57ux6dkPwzSrIYo4aEXod JMN4dki4Mu6Q
086HjHlqD697Ps/l9HUrtMyjA54Cg6oggaSM+1Sv3rvmul5ohbbnCsQDBZJA PCI2CkNzj2Q8
ZhjtoTsFE8gVBTKSDBcM2+WldmuP+6a153DRCq9uObvUOfEdXaYRw4+immka ofBXO2BYN75+
/ml4x5o87KVYdIPQcusUwsqQqg/pw9B1SLjBzztFBqXRpS1ZLaJMC0fCr0PB b2VPRS+ijSqk
nijnmR3GA+7QYN48AyWt4W/8iCFlBXpv2WeHDfRQR5lBIOVV8dp+nW/YonXj fZVeEAZUiqLr
cr/gWEHAAwnbX7TFfZQ0y732YZrmKEZ/iTFMisEkbVKMXyTlSCZIppAm3Dn6 +ie6AwLpI5Rq
7C+MVt/i4h+4/AGTme/e4/vMLTreY6ZSjWduV6oJcSQzdyvvsJCMTDL3Tjy9 w2Lic0QPj4mW
CLj8htyOIEfnEs7TOU2h0KbT7x7pDzCDFcziCW3rBulF3EEZd+FgHh7pPqaw GjGAUrn2f0Iq
SSbSvP0Ba8cuktFlx0TpAIj6KckUnkHrGi+TFITxt1h43We7GNle7rwjj4mo bnEUSKPxwTr0
QZbFfpalUywb2OyyPO+yFLHVZVnoJkIsy/0suRN5CJYX0bsRnS9RIpmOrMv4 CalPUEsDBAoA
AAAIAA5fyTjvxMJrEwcAAEsQAAA/AAAAb3JnL2VjbGlwc2UvbTJtL3F2dC9v bWwvb2NsL2Vt
Zi9saWJyYXJpZXMvRW1mVG9vbHNMaWJyYXJ5LmNsYXNznVdbcFvFGf7WlizZ PnHIzWCHixLS
IEd2BISSxnaTOEJJFGTHtRSTQCA5ltfyiY/OcY6OnLjQFEovBHqnt9CWaacP DMOLMTNOoVMm
mc7QoTy1j33oTKdPDE+d6VMfmH57dLEsyRZFD/r//ffb/7b/v7vnL5++9z6A h/B6AC0Ch2wn
G5UZ05jPy2ju4Vz08oIbtXNm1M6YUZmbiZrGlKM7hsxH47mZtG2b+aQnWQzA J3DHJX1Bj5q6
lY2enrokM67ApvjoePrchVhyJJWKpwS2PpVcBcVMPZ8fqoBOHzsVj6UJ2lYN KmpSqBPxdDo+
cWF8In48cZaqqkAp1zGsrALFbCvv6pY7qZsFGcQmgdaspCPBYYZlGe5hCsJ9 kwK+mD0tA9gq
sLnGo3YIbNfgR5viujUEECQqaVhyrJCbkk5anzKlcsDO6OYk86HGJWHbsGel A63YqaEHm2nJ
nTXyAkPJz51dBraNUTymu3p6cV4mvBAztHYiXJ+EeknfGsvKkszYjozGywqH 2rEL9wewW+CB
daDjemZOz8o9EzJr5F1nUcMefIFpTYyl0iNjsbjAulZqlw510toDGsLoE+hk XGWEwCMN4mmm
d0jlOqKhHwP0h+q8TWTGwn11tdbBDY1qeBAPsVQIHZXurD09pudoe29D23Wi DmzBAQ2P4IsC
7RUVAkcbLK8v9mqFjpwxWdrRogYqPohDAXxJ4K71MBoGwVpoM6wFe44uHwrX N0qD3umrFwXw
ZYH7mpRFB45gJICjAg9+9tJN2tmsdDQcQ6yYoKJA4O7yfhRcw4yalDJFJTgL 8AjiGo7jBMNL
xSfjE6yonkZ4uSBNup8QuLM238cKhjktnSAeFzg5IfMF0w3ZMyHdCumZjMzn bSeU8/IYkldl
hmptK2TkQ5btKoxR6iq1pJKCwVAHTmJUdfKYwI5GJTKpEOMavoIJ+q7Pz0uL 5TDQYGvqq6nk
8ZBSkdZwBjyYgq5dnOQpFG5YgGfxZADnynXSIJ0ansJ5HnSUCuwPr5vGRtEE 8YzAcPxqRs57
Cboya5gyZNr2HOdDM8xhg3wqcVXZnMRFlQ+9Jg3rNtVqGs4io5xnAmP/j9tV kvSsY19RZ7EX
y4zAwdpYSpvPaDYMI4BZgZ1VprjKMdzFiroALrGHVgFjdqqQmS12ahXIFNi9 CkqYpszq5oiT
LeSk5VbhLIFQPc7zsAo1LxCpPx4SPBAyukKkdUedqOUFAn4rf2aC3aJNl+Iq nnY+OT7H4gg1
O1xZ0rnSCde7/tlFlOP129pruXJ3C1q8J7lBLonZlWySSmL2JJtnkrDdDWBr E0nQQINw1s3j
UCmBbiWBHepClq5umLxrEuH18jhi8XjxNDa8mOtEnXgR3wrgm8xHU40anse3 mZRw/RWZsXM5
2yo2T3xUn6fel/ByANe55c2wGjbhlZr7cKOb5HtrXn7ls8uXlya77/7PkBie VHNykbeFno+X
H44HGlpfR1fFlZ+wzDbEcN9SdsHJyOOGeq1tr3lo7Vc2udUJy5KOd2PLfAA3 BO7duE14apdf
NwH8SuDY537q7RlVNWXN2FRZZvlcYor4Tm9Fr3qWkutVj1KPtkM9ajrJt0Dj XBBd2EzJHZQc
JFW/za1/xJZ3sI2k9R3seNsD38n/Lk/tESobIX8P7vJmwGU9FSVRUqXGv+8m eleXtnnC4hKt
CMDdHKvF9+K+4uKW5aK/Ihj5AIH+P8MvlpYRiryLvS0YG/DGAyvYt6//JvYv Y9sKHh709fgG
lrFjBY8O+nv8H6Czx38bwzfQ3uO/heGl3+PwMh77A06e23rqJpI9fi5fwekV pFbwxBv4zaCv
CvE0Ef0ruMDZHt8Kpt7A803mL66Zl3XzR5vMhzacF0vcrV7ejwaySGDGo2p8 nZwaK6rGb2LO
Gyuqxh8i540VVeOPYXtjRYv78Tc+ScEHVBAnaCOB7TjFvXmc6DHux2nsJY1g HI/yYo5hgog0
pWd4407iImmGYwNP0N5ZXMY5fBVP4hrpC6QvUnad1/IrOI8f4Wm8hmfwOulv SX9H2Zu4gLeo
5W3oeA9TeJ/0NumfKPuQmj/CNP4Kib/T43+Q/pP0X5R9zOg/wSz+Tcv/xSV8 CkMI3qqtvHrb
YHq1Na9qWwRLtaW4y17FK84h18JI/4M8XPUVgMMoYAE+RnkAV3CV1TeHnVhk ND56r7hnyb3l
cc+R+8jjvkbuE4+7Rq5FfR+Uij9OraohtnjbqXE7I8XtXKpphHnP2e4iuOws ua97zgqe1C+U
VJ4nRnVdd8Qrf/bCNwT638V3WnAL312q6U2XDhVo44qnP1RcWdHfje/jB579 bvzQS4bgBv24
ZOkUqfKnK3Ibr95AMHILry6JWgvPsvufYwtfq4qgq2Khixauenp+6q37GX5O upXcLvwCr/ET
+Zec/TXa/wdQSwMECgAAAAgADl/JOKF6EjTSAwAAoAgAAFAAAABvcmcvZWNs aXBzZS9tMm0v
cXZ0L29tbC9vY2wvZW1mL2xpYnJhcmllcy9MaWJyYXJpZXNQbHVnaW4kUGx1 Z2luTG9nSGFu
ZGxlci5jbGFzc61V61YbVRjdJyEZCNOCFa1IEapQQ7Cd2tbaNkAFDCU4pjVB Ktaqk+EQRicZ
nAuVV/BB6m9dCqt2LR/Ad+irdLnPTKiUS35Qf+TcZp99zre/b5/88/yvvwF8 CFtDSmDJ8xuG
tF1nM5BG80rT+GkrNLyma3i2a8jmuuE6dd/yHRkY5t7onhs1nNZY0pleY9Fq rbnS19AlMPKD
tWUZUei4hus1+L1h1EJfWs02SCAbbjjB2GWBonnis4ukmXJaTjgjMJN/BZ6J FYGueW9N9kCg
V0cG2RzSOKVDw2mBdF4B+kynJStRsy79ZavuSoEzpmdb7gqZ1Ly92KUCEzBP fp1DkjJObTOq
u06wITCaNw+LS2xV2p6/xlByeBNvaTgrMNQBqGMQbwt0N2Royi3pEp2fOIpZ fSz24Bze0TAs
cPYYiI4RjDIftdJKqVoSGOzI9a6O9xRcuz9brZQrdzSMCwzHOxzPmNsO5azv W9t3o3AzCpPK
yWEMp3LMT17HBArMRyDD/QCe2ZaGFPs/xJqk8YGO1zGgRpd0GCqvGdv1Apmj C65quCJw88Qp
03ENHzF6pabXEDhPLfeTUXFp+FErdJrSKBNS1PAxbXIsphZaYRSoq93UcQus gB5yz0WqHqhU
m94LGo6x7ltN+cjzfzSSz8VeTOO2Bppi8FiQjk8wSw1JWttu1j3XsStECAzs VYFrJaZl4opK
+3kdn6ot3aGXrKo6W9BxB4vJ5ZY3fO9RixXyEkO8qpxBkutYUo76TLm1fPiU I5aOJJpY6cXn
uKuhQiU6qqzjHr6gf12Vk/F8h5QkescPQdaPDULujkajEgHr2XfCbQFRFtC9 l4pxxOxYztyf
WXcj5ehc6WdbboaO1wo0PNizbSKDtCN1wguEwC+v8tD9n4+ScpXAtyqj3Qyi 5kW+LRccVZ8D
BzZfUhFRoXKrJf151woCySey/yAlRkmY5t+S6O9XbzBHGaQUP9d7OLvGWYp9 rjD5J5td6L9x
lkIf2ywxwA30s9XjcQ6v4YxiU75vMzwjVxf7h+npyR288TuGHqNbm/4Vfcn0 /GNkMtNPMba6
iwuVwsUdvF+Y3MUkz7pY+AO5HVx+iuur55LxjSeY4o2JmuP20i7KT2Cm8N+l ZuJ2irNpXmqG
F7qNIVpvGPMYp58KKPEpWsBV2ugWFmGijGX29zn/BktxMIXkwu1g1KiKGsNJ 4QGxX7IfZ9gr
3JPm6lc43Q51Mg6dv4MaVfZpJF5oxBeRqFWOuzj7ujNF9TAFFzTeOTn7AtEq kVkl3sOjk5SK
f9/F7few4oTRSXzy6kj9C1BLAwQKAAAACAAOX8k4dSZZoe4EAABFCgAAPwAA AG9yZy9lY2xp
cHNlL20ybS9xdnQvb21sL29jbC9lbWYvbGlicmFyaWVzL0xpYnJhcmllc1Bs dWdpbi5jbGFz
c6VWa1cTVxTdl4cDYRSKWoX6jIghYMZ3a2NtAYOiI6GAKPZBJ8kljk5m4mSC 2tp3+6X/oP/C
2q6Ada1+7If+qK7uOxMehUDXorAWd+6555y7z9nnnMtff//+B4Cz+FFDk8Bl zy8aMu/Y5Yo0
SudKxuPFwPBKjuHlHUOWFgzHzvmWb8uKYa58TTrVou1qaBE4ut487/nS8Ktu YJekESkJ7M2O
mvPm+MjU8NTc/OTw6K3h6xmBbvOhtWgZjuUWjenAt91iWqDTzF43M7MZcz47 OTOenRDYPeq5
lcByg1nLqco2xATaDccrOnJROgJtV3izawdXBZoTA7MCLaNeQbajE29o6BK4 uB5dGFAI0XYD
6buWYxDaNL0XLL8QBfdsvFR2dHRjL++uBAUGP2nlH1lFKXDMXO9NpSbylqlr pDuwHwc0vClw
ZHtNHQfRI6AVZTBhleh6X2Jgcz7aIfCWjlbsUpmxXTlRLeWkP2PlHKkS6OUt Z5Z8qH1duOtK
mI0YmnFMxxHozEjwwK4IpM0d80xiWsmBHwicTIRuvErRNhZ8Qn/i+Y+Mkapb cCSZCuTTIK1o
iGWe5mU5sEmehlOsgbXgVk8UyAEdJ9CnYVDgwMb4R6q2U5B+jFk4rSMFg9Qz YdFlAoeZsi2x
kIqzOK/hnEDPlko6LigWOul0+lkp5zl2XrERwyW8o+Ftga6NkHRcxrvkbVEV Y3ZBoD+xjrZs
7qHMM/7NTMaQxBXFx3sC+xObzwdmlcb7Oj7AMEm0ymXpFhh2I9VNonqewktG dVxTMbUFXnQY
wxhuaLgucHybRrWCBc8v6RjHTYE9zMc1masWsyFNG4LcEka6DSbrlbek6rek WGUpVlmKVZZi
lcUwgUkNWYGDoXE1sB3VyyyxomFylb6ODzEV8RwJBFJb397AAZtmBrMa7qwU 1L911NTQcRf3
mOVpDpopTqKeRs6UYlqV3n0dH+FjgY4IkhnNnbEGoLZ00xBt/YIJfKpjHp+R sgoviLwfSmzt
i7HlBG7uuJn7ooWh3LBUE7C/LBRUbbKnfkr8jymxc9NNmMKGmAD77QFsThOr UKifcLQ2Ss6a
HbszHw0igfh/DyuWu1NndaVhLsHV4akuaqGk1IbHAlDiio4AVVaOfFy1nMqG Vl7p/vtK9YmO
p8pDR+DdYTP7o1aFc2UGn+v4As85T8uWX5HbdngD8jV8xaDWDMYdRxYtZ9gv VkvSDVYnK/3X
38fmguSUik17VT8vx2w1N/dtSH5K+RPQx12XOB2rUpEMrWsjJTjOZmjm/w1N 6FFPEr96oXFl
5YbSdrTwqwM6JbspOcNV/egvsecV9gn8it5fQs1DUPls4t9D1O/F4VAK6h9Z tTa4KvvW5BKO
rpntCoWRiR4pEFg8NOZDQq2T/G7hrj908xvPFeix5OASEq+RnEvWMPQKZwSW cXEJ6e72Gq7W
MLKMzO3uW8u4nRx6ieklzNXwSbh/DWsuKZaQr2FhDcel0Huc3k8w8BPc9fFJ P0lcCkU/BnCK
D1A/H5gEn4wBjHDNcD4r3MciRHXc6ushHhFxH/cOI2ziL0dOPRHPuVP68cE/ 0TlYQ6m7XIP/
M1qHXqhdDYvm4DKevbg79IIWvUzhUXxZR9kb0nQaXXw9u0lIL87x9DwRXFiH JL6KJI6v6xmO
4xvcC5F8G8b8Hb4PSRMcFgI/oOkfUEsDBAoAAAAIAA5fyTibdKIjIwIAAMkD AAA2AAAAb3Jn
L2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL2VtZi9saWJyYXJpZXMvTG9nZ2Vy LmNsYXNzlVJd
bxJBFD1T2l0WlrZSLR/9RKtCqzst+qSNSdMAabJCAgYfzYIjbjOwuiz8LoUH jQ++mvijjHd2
19ZEMXE32XvP3DNnzr2z3398+QrgBI91LDEce/6Ai750340FH1aH/P004N5Q cq8vuRi+4dLt
+Y7vijG3vcFA+DqWGdYvnanDpTMa8FbvUvQDhkSrXmco2GFlEriSS+K7xLDF VMinDFqn1q21
awz6y7N286LZYFi+aNZbDGm71WjU2q+aZ8+pnLWv1TuBTxK0OXPujcaBMwq6 jpyIJFYZtsi6
FVu3yLpF1i2ybpF1BsOb+JFjhuLfXIU1Uk6eksTIDZ5RD+VKl0yde6+FgVvI 6dhkyC3oyMQK
NANEUNyiCT2CRQV3TCQjuKPgvgkjgvsMa7Y7Es3JsCf8F05PCtWx13dkl8as cLyonYauUkjg
nokDZMlZ8NYdM1Tt/700atMYiODXPLbLlcUTUS4fmFjDegoWjnVwhvwitokK This8p939o8j
GFIdup6+qLuq03S0bCk+SnR8gn5QDQU1YMoKarJhTMbRiGMKaWKblC8hQ4g8 U54g3g1kqbJB
6IKiegoz3JwjP0Nhjq0ZtufYnWFvjtLHcPtt+m7SgaDb0igzkSOJPL0buBMy QEIHV7KcohJe
OfyEu9cSWrgYbTEjAu6jTNGgSR3Gm5/EnrIzHH1DOpv5jIdzHBH6cKW0Gk5h lxT3KC/9ZqIa
Zo9+AlBLAwQKAAAACAAOX8k4Ssa6KQoFAACXDAAARgAAAG9yZy9lY2xpcHNl L20ybS9xdnQv
b21sL29jbC9lbWYvbGlicmFyaWVzL1N0cmluZ0xpYnJhcnkkTWV0YWluZm8u Y2xhc3OlVFlv
G1UU/m7ieMu0TZNutNAlTcnSxUna0IakpE7qtKaTOPU4SUNpzcS5TqaMZ9yZ SRtALFIlFiGx
CJ544g8gFSoBQiwST4gH/gAST4gH/gASD4gzMzduMh6XArLk851z7/nud849 d37866tvAQzg
RgxNDOdMaznFS7pWtXmqMlhJ3bzlpMyKnjJLeopXyildW7RUS+N2SnEszViW Pf+FrinuqJpR
NmOIMLTdUG+pKV01llO5xRu85DC0KoV0vqAU57OFiwwdV+X7W3yiEYb2DXuK uclJJVNgSGSm
z6+nxbPT5zNXaIn2rsPiZD435TkMW+S0Uije37R7k79xZ6SQz06RqnxmRk5P ZIppWWaICY+I
CrminJvP5IsTaUX4szMzNT+mzMjZQnGghgZJ3Ci1zdCcpxiae3rn6IwJc4nH sGdTP/xik9iL
R2PYx3D6PzZcwmPYT4eqpRK37a5+hh09vfVNjeMgQ9R34ugkveOmqXPVSICh S0ILonE8TuGs
4fBlbrnhHgkxRF3UJyHuo2MSEj46ISHpo34JrT4alCD56JSELT56QsJWH52R sM1HT0po89Go
hO3u0dSsNoXfXOVGiff4Mnvd9XMS2v2d4xI6EGXYJmsGn16tLHKroC7qnEZA NkuqPkfNcX0R
jI56d5BEMy5IyGAn3YOzotlEJP/f2aYRTdqOajn2vOasMAz31De8PtIbOusR m+tlt4aQtWjV
4mVtjUF+qAM2RMQtNjgz6phlm9Nj7AhJoVnixpKoLGqvlj0FMc1Y4ms5Utps Oxa9xrJlVrJu
jB6PrtpOdn09QqdUGLpDJIerSVq8qqslntZ1hkv/ttIHUkctKmmtShLFGRVu UNkx4ZHY2yuq
4xqv2lbHlM3b3JpQbe55s9XqutdiV3WNtrZ4lGR1reL6ScVctUp8UvMmcdO8 nHAVMUhZwyAW
apLNafzi61OEQzTVzfTN3UofAXp/hPa6D86zcWETwiaFbRVWEnaLsFuF3SZs m7DbhW0XtsOz
bcS/Azvp/F1AUx4RioHlo99g90Lzl3hEWYi0H1AWWtoPKfdwOFYXPqIsRL21 7vCU3vrwEQof
bcDkrh0PT0k9IGWgZfPaPZys333A3e2uDT1g7XQd03BdZKRe4FkKjzUQ6K6l P6W2NmGC/n/D
MP13UvcP0911Ufc7sRt99PE+SpFj6Cd8kn7DOIUxDOEC4acxghmMYg5ncZ2w SkzLOI8Kfc5e
JPwyZNzBFN7CNN4n/CEK+Aiz+JgyPiF8F9fwOWV+jSK+I/w9OH5AGT8Ry8+E f4GBX2Hid1Tx
B+E/cYsBt1kUayxBWMIrrB2vsj14je0jvB+vsy68wfrwJhskPIR32AjeZWm8 x6YJX8ZBUudW
TMPkfnL9+UKKLBGjpe8LTN5vSdQL+imSvwEXkSWboNIvieQzZF3CyGc4fDeQ 2+3l7vLXqQFT
7hgTmibEPJacYBkXT41YuoMs/R7LQX+9jsVFM7hMGQnkw1T1BvnONFClCFWF MJajQZZzDVhm
aywhtR0PsmQb1DZbq21O1DYfpioV5Lv8D6rmw1QNBFmeeWhVV7Ag+E6IISK+ k0G+xQ0ztM6X
oFOu1msZCuY+30DLszUt1wi5Wq6H8Z0O8tkN+Io1vucEnxpW23CQ76XQ2hbD ckeCuXdCc0th
Nz0WzH27wU0viZsuhd10OsjyQYNuLNW6wb2bbqLPkpu5jBWySa+mvdCQ+BtQ SwMECgAAAAgA
Dl/JOG90DzYDBgAAqA8AAD0AAABvcmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9v Y2wvZW1mL2xp
YnJhcmllcy9TdHJpbmdMaWJyYXJ5LmNsYXNzrZZdTBxVFMf/l6+BZWwplFaK aLG0XQp026r9
VgsUcNstW4HSQmtxWGZh2tmZ7cws0Pr9/f35ZKLxQeODxgfaJkDapMYHW2M0 Pmh80Pig8UHj
g8YHjUljPHf2MizLUKD6wM6dO/ec3/mfc+69fPbPhUsANuN1CTkM20xrMKTG dC1pq6HElkTo
1LATMhN6yIzpITURD+lav6VYmmqHOh1LMwYj7vtpCXkMJSeUYSWkK8ZgKNp/ Qo05DEvD7Xtb
jvS1R7v6WqOH2vcylEWmV4UNRx1UrV0MSzq7OsLtbX3N0fauliNdDKUZy9Ik WlW4myIzNOcu
htxgbTdDXrM5oEq4gWHZLK8ByFgqowTLGAp2C7O8YLi2uwgUhox8FEgoZ1iZ TWpKafqAahVh
JSok3MiwY+FZiUyNDuqpQc2QsQqFRIs2R/oi4aaOxo6evoONzfsb21oCuAk3 S6iakbd0ADJu
wWoGaVjRU2o0zrAuGMnO7a7a2RkKYDlu5ZLXMJQHZ3+v7S7EWkrjzp3pCb5+ vYwgailFSjKp
GgMMDX6Gs6ZEjlxknYx6NJBfx0x/ZFge9AmP5z0kQ+IZWRrRDLU9lehXrS6l X1d5xc2YondT
8vi7OxlALm7jegJUOWdIs6kUkevsUGqfgO0olmMf1pwhcuQj89rCm0xTVxWD ZOzALgk7ZzSd
+ChjN+5kyG9tjHS2zGz2KXNe97tlbMWeOYrUGyBAE++BZoYVwV6/GCgftqpT ZxQkLTWujTJE
FqTHZ/P5ued75x4ZYeyjqmqG080b0d10YR5+hId/gAc3mxCu7aXOdcx43Fbp ACiknnIzzu3u
lRHlsgvsVNwNWtKMAXWUd/jiyzEVP3fcLaMTh+fIZ5gCtx3rf0pRJvYoxx6b Kw/ELYpbZiLM
NTIU64rthNN6ufH9Mo7jMB/189Ex3uKWlsja7HNuQDeAuIwY33kBS03qSkxt 1HWGfYuVeW3G
CRmDOMmwfdEV8s7tAotSNpqkHIg4E6pBvSGJN05JyjjFKbKYa9Usm5bkjQwp 7sPds8WOGTFH
VKtZsV2jYRkOl0/zh+j08uZPyxjh8/l2UtfIfOtiQk85mk7HuO246h+ScQYP M6z3K8pRv4w9
isclPDZ1qrveGi1LOW3LeAJP8oPW5t4Z1gYz7Wee6tNBkAo3ewzh/9i+M4U9 y4U9xxD07V0f
ZRSIriV4OguVWEy17ZpN1HidZsri1XJP8BkH7kbugQoaNgyqDDW/rdoSXmXY c50neM0B1VE0
I25SBFNDVNOdkkv/wOTQRUsXOo1W8QuGnsvotwgB+l5MbxF3FVBzEXJPzgSW nEfpRSzvOYcV
k6icQHVpzTjWjWPDeWw86/rbRL9LXKs3yMNVrKGbbrP7BeSzxPMcoiejZ/6G CWyZNi1wJ9Mm
cnoBbscdrvFWbBPGR2k1R5TXXYZUfwXSOWwfq6sfx12TaBzLiuNNUvQWOXvb dbo6bSic8tFe
+s7cUQuNclxQqwAlaHUePasIVFxPsAYP1jCOtnHs9wG+Q7B3Sep7LnBD2oEH rPKAVQLIR+2k
PJdmo/NrPOiDfJ8cfUDYD+fV2CE0dqJLgPooQL6+YhpUOsbrzWGHqObZsDFy cZZg5zNgFR6s
woNV4IgH6xGwU1RPno/qmQmdAqaT2usDnSDgJCX1QkZSqz1otQetFlA+uk8k 9fjCtPb5YC+R
s48I/fGCtR5fnFbFB/oJAS+T1k+vQ2sMAwLfRk/+rbjuCvLrxurGoWaDPifX X5Dhly5oRXq5
ByoWIEY32ZBwqooNUZ6hiTvnarRs91+Rjq9p/E2GDv+u1IWOctpxha4OY0FI Mxv5LSG/o/H3
8yItD2kLpOOfOsZTl8oG/UCuf6TU/TRP6kau4XQ02+nP5PQXcvrrPE7P4AHh tEecEmWioblj
auUHJ/FItvPfyPh3On//yGjlMs95mZeaMjwlWvkMnhaYk6IGlZk1YN4p+IwP 7k+qxF80/juj
EpUertLDVQocHz3Pm7ikEC+gQYBr3DVA3jlsnCakb4mr3sWSgxfd35fwMj35 FfMK/b2Gon8B
UEsDBAoAAAAIAA5fyThZd881rgIAAH4FAABAAAAAb3JnL2VjbGlwc2UvbTJt L3F2dC9vbWwv
b2NsL2VtZi9saWJyYXJpZXMvWFNEVXRpbCRNZXRhaW5mby5jbGFzc52TW08T URDH/6ct24sr
YEFELgoKSquwlhcMEBNaWmjSlsouhMaHZlsOZcle6u6W4Hfww3h5MDHRD+CH Ms7uFpBSjdiH
zpxzZn7zPzNnf/z8+h1ABstRhBhWLbsl8aautR0uGcuG9PbUlSxDl6ymLnHj SNK1hq3aGnek
A3lzz9X0uTJ3Vc08sqKIMAyfqKeqpKtmS9ppnPCmyzAl55W6nNvOlzfqhZ3d c7e6my8UDxhG
3pQuc2TX1szWGoNY3VPqxYqyUy9vVAm7RYzsXrGkFCt1pVbNM8TWSaWpua8Y wgupfYZIzjrk
Udy+IiIAxjDEMHjmHK6ukmq5ecwNNYY7DEJwHgfpEDEAwfPuiohCiOEeab/I 0Yy2zpV3bb7J
j7yymmV6sfdFxCAwDJU0k1c6RoPbitrQOUOyZDVVfZ965a27m8K6LzmBMB6I mEKCZLvHmsOw
Xvr/zlO/ph3uBvcqWHbgvK6oBq/aJPeMIbtwhU/Xki46sXZ9AKm+QxEcP55h 8i8wCmt3iyb7
QWbaHbdoutZv8hTL85222uRltc2g3Ezsv8qPm+dVGGZb3CVmtqPprmb2my5N xotnSMhWx27y
guYNUOz2fsnj07JomtzO6arjcCeKFwyZG4+RnvL5IDFLTypMn2MYE95rJG/C e4u+jfl2gGwc
CYq7Rav3iMD7bQvfINbCyUG5FkkOy7UB8j4jGe3dpT/BPxq9ljBGu+MfiRWi WkCaagDzVPMJ
RsiOIUXvNY0lshksYoW8TbJbmMOknwXSNHWhTCLLPL3pL5i+xAr+ZpAiBgF4 iBmycbr8o27y
S7IeMPIJyQ89uSt+7lhwjsfEgu/Nk1CaMZ5ioUvJdptJlNFeSs6nzATn1yie lyIvRLx0P1Xj
vbzSH1Q983khPPfjF6lp8FvEqEEZxH8BUEsDBAoAAAAIAA5fyThVLTBZqAIA ADcGAAA3AAAA
b3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL2VtZi9saWJyYXJpZXMvWFNE VXRpbC5jbGFz
c61VW08TURD+pi0tlC2UtgjKtYraUmAFvMWqD0JIMAU1RcTEl205lEP2Une3 BP8VPpn64KMm
/ijj7HapYCvaxCY9M+ecme+bmTPTfv/x+QuAZTyIIURYtuyaKqq6rDtCNVYM 9f2xq1qGrlpV
XRXGgarLiq3ZUjjqXnn9tSv1GCKE5JF2rKm6ZtbUF5UjUXUJ0cfSlO5TQjiX 3yVE1qx9EUcY
Awr6ECUMl6QpthtGRdg7WkUXhFTJqmr6LqN7++Aw4h5Kh7Ba6jmwImHKEW65 eigMbcOyW8qr
bc0QL21xIE8Iz3MXYE+cfc+5ZVgs/cqp7NrSrBXzl1gPYgTpGFKEq380UjCE DGE01wWaSxR1
fCvCxCU8bFYPok91whBm6w1303Stc3nuWJ7u1LWq2NLqhHe9Zd17HSYVTGGa MFkT7iVxjOTy
LewGv5bKR+w8i+sxZAmJCxcKbmCOO4lzIzw8X75WtxU7T/KdR4QB8ywAQpaD 47CfNaTuSrMs
jTr33Ie6WOdQuXGlZRL2/kd/dEH2q5RXMI8CP2Oto0m5c3N/K/KigiWo3Cy2 cCz9WHTP4Em3
XvvnMHn8vIoR4mWrYVfFhvRGUgkGbMlD5u2maQp7TdccRzgx3CM86nlW57aE q0nzwCL0n6nI
gp8c3ifCGv9o8BrjncqSWPbNf0L/R1ZCiPMa9Q8VDPqrb8AywZJ47oYD5zJb e6CJwlfECwtN
JEMonLZBhvzLYWZMMlDaB5ttOQRgnjaKKz5BAmMYZ08eelwLCPbZOsIywwQj hSYmCAuLTcyE
8aaDZ4wtx5FiX49nvuXX5sm0eTIBj6fdZC3Mp7dwO2B8G6SULnxDH50yZ445 m1gI4XfCaaaY
4UplzyWWbhOm24Rp3PEJQ/zH4CGsYJVlnO/u8vc+Bn4CUEsDBAoAAAAIAA5f yThLB/JgLgEA
AHQCAAARAAAAcGx1Z2luLnByb3BlcnRpZXOtUU1Lw0AQvRf6HwZ6UbBJ6kUQ PNRSQaha0D8w
SabZwf1idpPQf+9ugvbmqQt72Nn33rx5s1pd9SwXK9g5fxbuVISb5hbuq+oB np1otC18ulMc
UShhxDvByM5mSr5brWGiBRAKJAO1BXwpDuDFdYIGskJUBNg0zni0Z7YdGIwk jDpkjSxtsE2Q
AVljrQl625JMtIQzAdxpeuwbzT4QHPtacwMHbsim57Apqiw0Km7UXyOmkEjJ ScshCtd99n03
+UnFSy+Mmati9I9lOY5jQXOXwklXaupQl+T1ethUhYpGZzDAHJmddZ2Ex7kM /4YGa2DLMc0N
2+Pr7MR4TYZs/E312ptNaxg4hfmOhp72l8nSj+47tlP9wLWg5MBOTuBjd4DR yXde1MhRwf7t
Zbn4AVBLAwQKAAAACAAOX8k4p9hcMBgBAAB0AwAACgAAAHBsdWdpbi54bWyt kztPwzAUhXck
/oPlHTuEBSGnWSgTTG0l1uC44Up+BNtpwr/Hbto8UEGtwJN9ffxdnyNdlndK op2wDozO8C1J
MBKamxJ0leHN+unmHueL6yuWCy6hdmLU3gXt/qqWTQU67BBCTHRe6CjYH/tV G9A+w8ZW5EAh
KlXkY+eJUZIYLomEN1tYEA4vjg9ZX/ucgMLisnDud5ZQ25FHVt4GL889C89h UGa4v3eY/nfj
pdqujZHu59ZR76NkNB3bg34RvlCmFBI1FjL87n39QGnbtkPr8A0antM0SVK6 5MaKiYEIMY3/
I4XRQw7HyslcLo7ldfW48SDnccQ0LkdMDJ8dWufK3m6AzCI7P7HTiG9xMTpM QiiEKaHDmHwB
UEsDBAoAAAAIABUF/jbC9i1j5QQAAJgTAABCAAAAc3JjL29yZy9lY2xpcHNl L20ybS9xdnQv
b21sL29jbC9lbWYvbGlicmFyaWVzL0VtZlRvb2xzTGlicmFyeS5qYXZh5Vdb b9s2FH52gPwH
wuiD0jhyUmAYYCMPiqsF7hzHsLRiwVAYjEzLbCjRpWi7Rpv/vkNS11i2ky7Y gJUPuvFcvu+c
Q/Ko/fZ1x/EReot6fLERNJxLZAUn6N35+a/oiguG4yny+EyusSAgIxZcYEl5 rHX0xWEMacUE
CZIQsSJTG/lzmqCF4KHAEVI25JwgHAQ8WuB4Q+MQRVgSQTFLtBFlPcJTkFlh yvA9I2gZT4nQ
eiAYJYjP9IsbMLpICBot7xkN0IAGJIbX1YV9ri2t5zSY564oSUALsExpIgW9 XyrsLY0IPhbO
sNTKcykXnXZ7vV7bxPixuQjbjISYtcmCna0uzu25jFhBv8djY5iLpKO/qLEv dOgM0ZhK4I6c
Ud9giRaMRCSWeWxfd7SPj9ppmgWBwE8RwPiwZOjioqVy/YuaA6EFDh5wSBCQ zgMQvYvsLytp
84jZPGA2iWY2o/cCCwhu9/jo+AjQcyHRZwinDaxDW5AZI4G0+/GKB5qSj0VI pPs1IAv12t2j
dEPknE/LhstolHcScEFs14ljbgLWPST6HkvsbxbkoODt/WfAcFBsZOL0XDl7 TEJVf5t6BRVV
CegS24k3u2EWYiNBIyigFXmO8EdOp6kcJNismoDhJEFuNPM5Z8lAZ3ODvikJ Vb2pVKKimwlD
WjCNZ1xJKZmGuWlxQVdQVJn8jMZQ2h6sijj86xO6dv3Je8d3/LuRO+kPPd8Z 9lx0iWKyLoS+
FdYag6y4RmwZ0ti+7Q0mg/7V2BnfTUZO73fn2kWnqNnpNOGWsbO9/vB64Pq3 w8nQuXFbqN1+
M7wdng0H3tnFm5L1Suxszx+DXqqyZ6qpE9rp5JXU3OXgsVs8vyhEru/0B96+ wOQgispvvi5R
VOaBXk7E8Sbu7dUHt+e/WoLTJfHs/OZBMkt5b55KtCoVn6OGPStLeD+GyTgg lplEcfLHuN8q
LGQjnZ6makMckZMyezUEkUsR16+MUvk81iZgN1K1QllilcoDJYTNWhmmB7Kp QGmUcZjy+0Hv
OEnDbZmb9lvrq6iQcn1t+XrMt6K6euupHQncujcj/27SGzie52Yrx8ydf+ru tWBg5iYMosxE
OnnIRhpViJ7vjiejsftb/0+w0IRUNLtPy66ysea7yOECO1hPdIYsLYouAf0S mrHv3yvS2fdd
Vajm6tOeHV+IjB5CYJadYnZWq7Y601MhA+KkW0VmNH8UgDSHUlnHdAcoMrdL DU3B0Gm3TtSj
EbG2l6Ya+bwKjVWJaqtaT2UqaqSVDT3ukknwbCDYFHqcB6KJtqrV9NSAikem XaQq/ULT7EOX
m1fHVsBKQbNKUsbEE2+P1dcBD0MiVHjME4SK8dBKP3vuR3fs1uxmajTHBiJA w7HqrEmScJGl
gHwlge6qVUMN+46SycigMpsO2rkX143TlFYpueWAPiJoLKHRtzxwL6jc5L0l 2o7bPyFf2IU/
C/hTYJw/qAU5gxDUhEN9Ptwk1BMuV2MLaNTRHXJvGcxNCf8klPtM/385Ilyq X6R/i3Va2MD7
vyKs3f4EdHf9Jf7vGBeP20ffVseTHvzVA6vUDci6bqDo6Eo9yWlFvvCnbpW+ pHD5ol6yoU42
Nbt10jca20QbqedsKuV0ou3bJd/6MLeUoz2Q077zQAdaICyfs0ZyG6yVzyiV HbCfpg4ufwNQ
SwMECgAAAAgAFQX+NlkMSgAvBAAA+AsAAEIAAABzcmMvb3JnL2VjbGlwc2Uv bTJtL3F2dC9v
bWwvb2NsL2VtZi9saWJyYXJpZXMvTGlicmFyaWVzUGx1Z2luLmphdmGtVl1v 4jgUfV4k/sNV
NQ/JLDV0XlYaVGkpi7poWEDQ3dU+VSYxwTtOnLEdGDTT/77XdgIJzXb6UKsi mNx77vG5H27/
/duubgfew1jmR8WTnYEgCuHDYPAL3EklaBbDWm7NgSqGNiqXihouM+fjPkZC gHPUoJhmas9i
Ag87riFXMlE0BYthdgxoFMk0p9mRZwmk1DDFqdAOxKKnNEabPeWCbgSDIouZ cn5omGqQW7eZ
RILnmsGy2AgewYxHLMPt/oYMHNJhx6PdKRRnGr2QS8y1UXxTWO49xwh/PAej xjnvjMk/9vuH
w4EwH4dIlfQFS6jos1xc728GZGdScT7+WGYeWCr90f1i10vSwTXwjBs8O4yW U88lzQVLWWZO
2r7t6nc7OY0+04QBnud0tvRDSr7sDZGpIDIShKVbIvhGUYW6DbudbgeJSWXg X1SKcEnujoaN
lKLHRWHywqyNYjQdNs1QYkGETBLMMpmxPRMvGshkxSKp4peMfJzfUSnBVJ1X /TAIwogqMsNT
RqZrlLLQwx9bLgU1W6nSV5kWSOcVhi8Fdzo7a55hYWdUkMV4hh5ZTFU8c+of p1gPTXepE062
2E3sINVncldYLWztsa/GKZL7fogE1RpmVRI9ZUAjlsUayu23bucn/CtdtK26 CLYcuQBKbbsT
KT3Opner0eqfx+Vo/Gl0P4FbaCdKtImxapa+wEjCzBxpBqGjZZshV3yP3d4a aLa4n03+mswe
F8uH6WKOQa76mHZh6+ZqCP3+u/lifj2fra9v3lV4vy72TCkes/MZ9pLHFl+Z oCENRP4Z4hRQ
8qBh8jViuevCbx7MLl3kTBHvXjkMz69LqkjLlXO5vYWqdOyRf2ObIlk45AC3 nkQQnkGqZY3X
x3QjkbbX6bnNz5ey1Nm09lCC/BHYfwvKHxDkfrJ6nI/+mIRE41vLPngezjv6 t81D9sBtyBq5
rCbhG9CgcVz2cQuRjB3KEkXXyuwU9emynhy3BvsqU3ZTcoeYbcN6svkWAmcA t7eQFXh7ff/u
PQh6p0FI2JcC76Xg6ipEx8sSrPNVzBQqsxFqwjydv5ZhmuhG/pljuY2p9j1S GRt1rNOs4fsc
5FShh4Oquz1BRA3eeMFUuGtqpJLC3iTnQucs/B/gVuLloym1HyuXuTnNlcaA tsHOqPVmbXSr
+653wekGQFb28YwszknQeGzFzRHFLEc7WXwaXthhYj2Eq0FXEKFNcqOGL9Ht akGfrFaL1UWA
J2AC/9X4QZy/R6v5dH7/2kCl+WWouoR2td68IOubW9c/rYaNQvNETON9HeiZ rZuOVbrKJLXa
REJeFLVdvkGx8nFQtDS9XZa41yOoJOpBbYw+H5o9GPTasapVPxI2nR8N1vGc uwd7J2Q4YcJm
G7yiereiQDEaSX6dY6lRdR+tWVTY47beS+eO7Hbw4z9QSwMECgAAAAgAFQX+ NvFmb2IQAgAA
GAUAADkAAABzcmMvb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL2VtZi9s aWJyYXJpZXMv
TG9nZ2VyLmphdmGtU01v2kAQvSPxH0ZRDhCFNURqKwVxoBEgJGoiqNpjtdiL ve1+uLtroyjq
f+/s2jFEbeCSsWTPeN+bjzd2dPO+1u3ADTzo4snwLHfQS/pwNxx+gs/aCKpS 2Oq9O1DDEGMK
bajjWgVOuE2FgEC0YJhlpmIpga85t1AYnRkqwedwOQOaJFoWVD1xlYGkjhlO hQ1JfHZJU8RU
lAu6EwxKlTITeAiUFvQ+BLNE8MIyeCx3giew4glTGFYjMgyZDjlP8rYUZxZZ 2EvKrTN8V/re
b0NH+PJYjLpAzp0r7qPocDgQVtch2mSRYBkVESvEoBoNSe6kOI7/oFWdWBt7 H954OycdDIAr
7nB2mD4u615kIZhkyrXavq9F3U7UrNkwFD4FbGNaGPh461f9wR8hpqDJL5ox wJnb+eWdJL8r
R7QURCeCMLkngu8MNajtuNvpdrB5bRz8RDUJ6iuI0FmGKyYrVjERIEW9rERQ a2GFx7jZZyyK
Vt8bgPUCJLDnCsUJdFjP5zCpfYL++BJ+O/s228xaSh1eZH2fbuJlvGhpTXyR t4zn65bkg4Zx
frItfjH4C6zWi8Vs8yOefvH9Xp1R/WoMUXQdr+NBvNoORtdNasMrXOZL7v8s oFZal6b2wi7+
bepNYsZc7fX6L+vyxvfQa3PCZAKqFOIVwtsJ4s0K5FjhRIz+iYh/jq5hrjTq 1TQNwl/4+AtQ
SwMECgAAAAgAIIt6ODIMKp31BQAAdSEAAEAAAABzcmMvb3JnL2VjbGlwc2Uv bTJtL3F2dC9v
bWwvb2NsL2VtZi9saWJyYXJpZXMvU3RyaW5nTGlicmFyeS5qYXZh1Vldb9s2 FH12gPwHIuhD
0jpykmEYlrQDXNfpvKm2Ybtrh6IwGJmyuVGiStF2grb/fZcU9WFbsuWPdK0e HFO6l/ecw0NJ
N649PexxfISeogYPHgQdTyQ6dc7Q1cXFL+glFwz7I9TnrpxjQSBGBFxgSbmv c/RHnTGkE0Mk
SEjEjIwsNJjQEAWCjwX2kJpDTgjCjsO9APsP1B8jD0siKGahnkTN7uERxMww ZfiOETT1R0To
PAj0QsRdPWg6jAYhQd3pHaMOsqlDfBjOLq0LPdN8Qp1JUoqSELIAy4iGUtC7 qcJe1YjgZFoM
S508kTK4rtXm87lFojoWF+MaI2PMaiRg57PLC2siPZbSb3A/mpiL8FqfUcc6 6dA5oj6VwB3V
u60Iixcw4hFfJtoe9qgdH9XMMgsCwo8QwPhj6qOrX6tqrX9W1yAowM6/eEwQ kE4E8K4869NM
WtxjFneYRTzXYvROYAHi3hwfHR8Bei4k+gfktEBgZtWFwA/q2soVG5ZB5wTR 8jkMhyHqg4L+
2NaTPqDPAAaO6LOm7amOp+gNkZj6Lkcuj4zhg1wzMA6REz4KUTjhUzZCd9pp JAypWlk5EXyq
o0OlrpPMFmeBr6jvg9UiLM8dPiK/xaWe1/QQzamcRJNgDz7oGEpPBUkmw740 mRGXDx/jTEEg
0EfyISAW6ukByI+VQjFgBywE1cJktlDPAamB2lHGFQpop2FHMKlLSeS3KCMF oib+cPFRD8+1
O8m9zCQtRfpJZBIBeATUDbgP6kgeKX0O/HlAjIMDDPuawL5cLuw/u/yop+ul tHOK16IvxgTR
whj9k0X+rGyCzBEIOgPfxqEu9WH3xFKj/qDeG/SH71qD39EL5JN5eulzOkel P+i12q+HjU57
0Hw/qKZX4uMkSjupopOXnDOC/RP09QbVak/anfZ52+6fXz7Jjq6eLGBcYJMg gLGQ4Tsw0Gl0
DoWEuVUTAMyIS+/PskDVYWyTYXaTBnzdSZph5/a23xwcSqEWOGtMxBZiZUc/ HUy6HJQGGpjX
DYksoa2RZjeJm+1X36v3CGzhQvnCqbvGeQmr3URptV8134Osh3bb/ppQeK+4 77j5kkhRpEdM
aD85hre9zhs9eIRtWFKjrbfhBsXWbEBXcK+lsjepmuqym752vT8Yfr+egyeb bO3muwVmBxDn
h3RgCf32cWGBQLupDcq9OYi0KyKWEAr+elmFihgrkLvR6zW7dr3RHNZt+1AG Wvl2aPvAizTD
DoFONdc9AlxyH+RgTK7rdNWfFemZUWUvWX80SXP1nE+wTAfw+rFBtUXF4q+l 91tnaHfeNXvD
Rr2/u36VYqGUGpU1Ukhu8zkRDRySla1XWWK8APbGXP9q/m7B+G23uw/jyl50 3wZBebop0gzd
uML61qVrtwbDyxyClXx2lUVqyvzk05T4iU3PNN31z3KzEusUCANGZfGdJFWi EncaEZPV9S6t
wtU+KmQe0FsLsnxj2F+eavJcZtSjskitq/zdkdxSc1WLZ46e5e3OYHjbedt+ ZcQzV0/PL89u
kmkiDqbl2qFZpy46VTHoBRSZMoa+fDFh8Zmiu5+pad3W7X7BPXApcobZlMAr kKpnZaAaWGc3
yxrtQK6a7Z5X2ufNbNUZk/mtBajGhS3qy79U6OnZRlG2bZHzFIjCHpluAtSA KiIWL982fW4u
KSk2MVraZms5ZTeg5hPjU1j25FLd8Kq/gZ4aJonfinM1LVnGrsk9c8tO8v9Y 2SzGMqtbprv7
UVZ4ifuWq2wIr+3ilqkW0VAxa7FrvLrUBjjl2qdN3VLeEkWpi2eS7MMQzICP gWYRlmK+Q5eT
x1ZlLIzVj0qHJHlLRShPI2AaUcpO/cm12prmRUVXCu1Wid/X1FlTqGIqVRYs lilRClFxf3Ew
RGmJIgeoXypLvennYkrMvRPI6PdTC4cKhHnZ0UiiqutELAM77w28HAt1Quc8 Aq1qNHPBbTJD
tLhdQovNELz22/EP1V02HVPf6jTsod162av3/h52640/66+b6Bk6ub423dLK f9yiugDgP1BL
AwQKAAAACAAjXMk45jayXJYCAAAUCgAAOgAAAHNyYy9vcmcvZWNsaXBzZS9t Mm0vcXZ0L29t
bC9vY2wvZW1mL2xpYnJhcmllcy9YU0RVdGlsLmphdmGtVF1v2jAUfQ4S/+EO 8QBVCW03aVJR
H6CFLVKhrAlSp2mK3NRQa46dOQ5tVfHfZychDTQNYW2UKI7v1zkn17d78LFX vQYHcM6DJ0EW
9xJaXhtOjo6+woALitgd2HwuH5DAykcEXCBJONMxaRyTgtxGkovwNN7RV1ko dIAwIgmi0J9a
oN2IH1DsYyaz3B97deu1AHl/0AIDFwsTe5QEITb9E9/8u5Qm96nJPWpif25S ciuQIDjs1Wv1
mgLGhdwIegzvzBv7wvbusY96pS4xLecpwBd4HlPmLM4aRLeUeOBRFIagHGeS UHiu1wx1p7as
AoRYJqsRF8nixwT5eCpUzseWyqt0zHnHr0NI9m31a9gCgti3HZcwyBxaiRd8 OgMWUZoajGTX
LC+Y5uqBDlnVa91uFrjAMufpcL0Ole54jIJW2wwi2WooaRqHGq/qm1AiJkPT Pv8+HPfd0dW1
my5n15arOvBYVel2m5OrSWdyaXeOm4ZuLVVXvwSWkWApX6WqxlKonyprMcnf RraHhFubbJ2m
qrQVFFoXesndS5U2jAqcC1oOVFVlGkSESsKKPKpJoBG9Jnq2STSFqLfewK1F 2OovRV3gkNMl
LkQXF87RhZRvqMfF+hiNsUSEzXmCIxBkiSReu+R5/PoN9tBxX3fd9Ho4sm5A 8cEPL74JLUM3
7ulpppDq4UbioldbNtjs2vzXycbX52acfBUrtRv2dOa41sS5csf9aTHMUpQf gTf/9SVGXxX8
N6X5YGZdOtbEdX5Oh+/SuaBL/kv1GPZGM2V4yqdgAnb/4VtyclaZPYkotqdH qayDX85dCb2d
U3Fvhjtm47uZa3uWdNvFeC1R/rRUkmT3mNxDk9ywrMRc+5f+8e3zk1FSj7r/ AVBLAQIUAwoA
AAAAAA5fyTgAAAAAAAAAAAAAAAAJAAQAAAAAAAAAEADtQQAAAABNRVRBLUlO Ri/+ygAAUEsB
AhQDCgAAAAgADV/JONwzKzEFAQAA/QEAABQAAAAAAAAAAAAAAKSBKwAAAE1F VEEtSU5GL01B
TklGRVNULk1GUEsBAhQDCgAAAAAADl/JOAAAAAAAAAAAAAAAAAQAAAAAAAAA AAAQAO1BYgEA
AG9yZy9QSwECFAMKAAAAAAAOX8k4AAAAAAAAAAAAAAAADAAAAAAAAAAAABAA 7UGEAQAAb3Jn
L2VjbGlwc2UvUEsBAhQDCgAAAAAADl/JOAAAAAAAAAAAAAAAABAAAAAAAAAA AAAQAO1BrgEA
AG9yZy9lY2xpcHNlL20ybS9QSwECFAMKAAAAAAAOX8k4AAAAAAAAAAAAAAAA FAAAAAAAAAAA
ABAA7UHcAQAAb3JnL2VjbGlwc2UvbTJtL3F2dC9QSwECFAMKAAAAAAAOX8k4 AAAAAAAAAAAA
AAAAGAAAAAAAAAAAABAA7UEOAgAAb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwv UEsBAhQDCgAA
AAAADl/JOAAAAAAAAAAAAAAAABwAAAAAAAAAAAAQAO1BRAIAAG9yZy9lY2xp cHNlL20ybS9x
dnQvb21sL29jbC9QSwECFAMKAAAAAAAOX8k4AAAAAAAAAAAAAAAAIAAAAAAA AAAAABAA7UF+
AgAAb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL2VtZi9QSwECFAMKAAAA AAAOX8k4AAAA
AAAAAAAAAAAAKgAAAAAAAAAAABAA7UG8AgAAb3JnL2VjbGlwc2UvbTJtL3F2 dC9vbWwvb2Ns
L2VtZi9saWJyYXJpZXMvUEsBAhQDCgAAAAAADl/JOAAAAAAAAAAAAAAAAAQA AAAAAAAAAAAQ
AO1BBAMAAHNyYy9QSwECFAMKAAAAAADkWyU3AAAAAAAAAAAAAAAACAAAAAAA AAAAABAA7UEm
AwAAc3JjL29yZy9QSwECFAMKAAAAAAAOX8k4AAAAAAAAAAAAAAAAEAAAAAAA AAAAABAA7UFM
AwAAc3JjL29yZy9lY2xpcHNlL1BLAQIUAwoAAAAAAOdbJTcAAAAAAAAAAAAA AAAUAAAAAAAA
AAAAEADtQXoDAABzcmMvb3JnL2VjbGlwc2UvbTJtL1BLAQIUAwoAAAAAAORb JTcAAAAAAAAA
AAAAAAAYAAAAAAAAAAAAEADtQawDAABzcmMvb3JnL2VjbGlwc2UvbTJtL3F2 dC9QSwECFAMK
AAAAAADkWyU3AAAAAAAAAAAAAAAAHAAAAAAAAAAAABAA7UHiAwAAc3JjL29y Zy9lY2xpcHNl
L20ybS9xdnQvb21sL1BLAQIUAwoAAAAAAA5fyTgAAAAAAAAAAAAAAAAgAAAA AAAAAAAAEADt
QRwEAABzcmMvb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL1BLAQIUAwoA AAAAAONbJTcA
AAAAAAAAAAAAAAAkAAAAAAAAAAAAEADtQVoEAABzcmMvb3JnL2VjbGlwc2Uv bTJtL3F2dC9v
bWwvb2NsL2VtZi9QSwECFAMKAAAAAAAOX8k4AAAAAAAAAAAAAAAALgAAAAAA AAAAABAA7UGc
BAAAc3JjL29yZy9lY2xpcHNlL20ybS9xdnQvb21sL29jbC9lbWYvbGlicmFy aWVzL1BLAQIU
AwoAAAAIAA5fyTgLounrOwAAADsAAAAIAAAAAAAAAAAAAACkgegEAAAub3B0 aW9uc1BLAQIU
AwoAAAAIAA5fyTgnOt3nwwIAALQFAAAKAAAAAAAAAAAAAACkgUkFAABhYm91 dC5odG1sUEsB
AhQDCgAAAAgADl/JOFaC0tdmAwAAJQcAAEgAAAAAAAAAAAAAAKSBNAgAAG9y Zy9lY2xpcHNl
L20ybS9xdnQvb21sL29jbC9lbWYvbGlicmFyaWVzL0VtZlRvb2xzTGlicmFy eSRNZXRhaW5m
by5jbGFzc1BLAQIUAwoAAAAIAA5fyTjvxMJrEwcAAEsQAAA/AAAAAAAAAAAA AACkgQAMAABv
cmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9vY2wvZW1mL2xpYnJhcmllcy9FbWZU b29sc0xpYnJh
cnkuY2xhc3NQSwECFAMKAAAACAAOX8k4oXoSNNIDAACgCAAAUAAAAAAAAAAA AAAApIFwEwAA
b3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2NsL2VtZi9saWJyYXJpZXMvTGli cmFyaWVzUGx1
Z2luJFBsdWdpbkxvZ0hhbmRsZXIuY2xhc3NQSwECFAMKAAAACAAOX8k4dSZZ oe4EAABFCgAA
PwAAAAAAAAAAAAAApIGwFwAAb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2Ns L2VtZi9saWJy
YXJpZXMvTGlicmFyaWVzUGx1Z2luLmNsYXNzUEsBAhQDCgAAAAgADl/JOJt0 oiMjAgAAyQMA
ADYAAAAAAAAAAAAAAKSB+xwAAG9yZy9lY2xpcHNlL20ybS9xdnQvb21sL29j bC9lbWYvbGli
cmFyaWVzL0xvZ2dlci5jbGFzc1BLAQIUAwoAAAAIAA5fyThKxropCgUAAJcM AABGAAAAAAAA
AAAAAACkgXIfAABvcmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9vY2wvZW1mL2xp YnJhcmllcy9T
dHJpbmdMaWJyYXJ5JE1ldGFpbmZvLmNsYXNzUEsBAhQDCgAAAAgADl/JOG90 DzYDBgAAqA8A
AD0AAAAAAAAAAAAAAKSB4CQAAG9yZy9lY2xpcHNlL20ybS9xdnQvb21sL29j bC9lbWYvbGli
cmFyaWVzL1N0cmluZ0xpYnJhcnkuY2xhc3NQSwECFAMKAAAACAAOX8k4WXfP Na4CAAB+BQAA
QAAAAAAAAAAAAAAApIE+KwAAb3JnL2VjbGlwc2UvbTJtL3F2dC9vbWwvb2Ns L2VtZi9saWJy
YXJpZXMvWFNEVXRpbCRNZXRhaW5mby5jbGFzc1BLAQIUAwoAAAAIAA5fyThV LTBZqAIAADcG
AAA3AAAAAAAAAAAAAACkgUouAABvcmcvZWNsaXBzZS9tMm0vcXZ0L29tbC9v Y2wvZW1mL2xp
YnJhcmllcy9YU0RVdGlsLmNsYXNzUEsBAhQDCgAAAAgADl/JOEsH8mAuAQAA dAIAABEAAAAA
AAAAAAAAAKSBRzEAAHBsdWdpbi5wcm9wZXJ0aWVzUEsBAhQDCgAAAAgADl/J OKfYXDAYAQAA
dAMAAAoAAAAAAAAAAAAAAKSBpDIAAHBsdWdpbi54bWxQSwECFAMKAAAACAAV Bf42wvYtY+UE
AACYEwAAQgAAAAAAAAAAAAAApIHkMwAAc3JjL29yZy9lY2xpcHNlL20ybS9x dnQvb21sL29j
bC9lbWYvbGlicmFyaWVzL0VtZlRvb2xzTGlicmFyeS5qYXZhUEsBAhQDCgAA AAgAFQX+NlkM
SgAvBAAA+AsAAEIAAAAAAAAAAAAAAKSBKTkAAHNyYy9vcmcvZWNsaXBzZS9t Mm0vcXZ0L29t
bC9vY2wvZW1mL2xpYnJhcmllcy9MaWJyYXJpZXNQbHVnaW4uamF2YVBLAQIU AwoAAAAIABUF
/jbxZm9iEAIAABgFAAA5AAAAAAAAAAAAAACkgbg9AABzcmMvb3JnL2VjbGlw c2UvbTJtL3F2
dC9vbWwvb2NsL2VtZi9saWJyYXJpZXMvTG9nZ2VyLmphdmFQSwECFAMKAAAA CAAgi3o4Mgwq
nfUFAAB1IQAAQAAAAAAAAAAAAAAApIEfQAAAc3JjL29yZy9lY2xpcHNlL20y bS9xdnQvb21s
L29jbC9lbWYvbGlicmFyaWVzL1N0cmluZ0xpYnJhcnkuamF2YVBLAQIUAwoA AAAIACNcyTjm
NrJclgIAABQKAAA6AAAAAAAAAAAAAACkgXJGAABzcmMvb3JnL2VjbGlwc2Uv bTJtL3F2dC9v
bWwvb2NsL2VtZi9saWJyYXJpZXMvWFNEVXRpbC5qYXZhUEsFBgAAAAAlACUA +QsAAGBJAAAA
AA==
--------------040602030304050707040008--
|
|
|
Re: QVT XSD [message #84057 is a reply to message #83926] |
Mon, 09 June 2008 14:35 |
Eclipse User |
|
|
|
Originally posted by: min.kong.morganstanley.com
Sergey,
I downloaded the modified jar, and was going to replace the original one
with it. But I have problem opening the jar with Winzip - "Cannot open
file: it does not appear to be a valid archive."
Subsequently, in my .qvto, the line:
"import library org.eclipse.m2m.qvt.oml.ocl.emf.libraries.XSDUtil;"
doesn't compile in Eclipse - "Library '..... XSDUtil' not found."
Could you upload the modified jar again please? Thanks.
-Min
>Sergey Boyko wrote:
> Hello,
> Ed, thank you for pointing about XSD serialization issues.
> So for XSDSchema initialization QVT script intends to use custom
> library. Short howto about these libraries was answered in thread
> "[QVTO] Adding custom operations for primitive data types" some time ago.
> I've attached modified 'org.eclipse.m2m.qvt.oml.ocl.emf.libraries'
> plugin that provides easy XSDUtil functionality.
> Original qvto script (that produced same output as java-code) is changed
> to the follow:
> modeltype ecore uses ecore('http://www.eclipse.org/emf/2002/Ecore');
> modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
> transformation interop2xsd(in interop: ecore , out XSD);
> import library org.eclipse.m2m.qvt.oml.ocl.emf.libraries.XSDUtil;
> main(in interopModel: EClass, out xsd: XSD::XSDSchema) {
> xsd:= interopModel.map interop2Xsd();
> }
> mapping EClass::interop2Xsd() : XSD::XSDSchema {
> init {
> var schemaTargetNamespace := 'DUMMY';
> var schemaTargetPrefix := 'tns';
> var schemaForSchemaNamespace := 'http://www.w3.org/2001/XMLSchema';
> var schemaForSchemaPrefix := 'xsd';
> result := object xsd::XSDSchema {
> targetNamespace:= schemaTargetNamespace;
> };
> result := result.setSchemaForSchemaQNamePrefix(schemaForSchemaPrefix);
> result :=
> result.putIntoQNamePrefixToNamespaceMap(schemaForSchemaPrefi x,
> schemaForSchemaNamespace);
> result := result.putIntoQNamePrefixToNamespaceMap(schemaTargetPrefix,
> schemaTargetNamespace);
> }
> }
> Regards,
> Sergey.
> Ed Merks wrote:
>> Sergey,
>>
>> Just note that XSD wasn't designed to serialize as XMI:
>>
>> https://bugs.eclipse.org/bugs/show_bug.cgi?id=166638
>>
>>
>> It's there some way to accomplish what's done like this with the Java
>> APIs can be expressed in QVT?
>>
>>
http://download.eclipse.org/modeling/emf/emf/javadoc/xsd/2.4 .0/org/eclipse/xsd/util/XSDPrototypicalSchema.html#initializ ePrototypeSchema()
>>
< http://download.eclipse.org/modeling/emf/emf/javadoc/xsd/2.4 .0/org/eclipse/xsd/util/XSDPrototypicalSchema.html#initializ ePrototypeSchema%28%29>
>>
>>
>> Sergey Boyko wrote:
>>> Hi Min,
>>>
>>> I'm not quite familiar with XSDResourceImpl but seems that your case
>>> somehow depends on ones behavior. Namely on
>>> XSDResourceImpl.serialize(..) impl.
>>>
>>> For your case just try to specify output URI with file extension
>>> differ from ".xsd" (for example ".xsde"). That way I've got the
>>> following output:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <xsd:XSDSchema xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
>>> xmlns:xsd="http://www.eclipse.org/xsd/2002/XSD" argetNamespace="DUMMY"/>
>>>
>>>
>>> Regards,
>>> Sergey.
>>>
>>> Min wrote:
>>>> Hi,
>>>>
>>>> 1. QVT -
>>>>
>>>> Executing the following .qvto :
>>>>
>>>> modeltype INTEROP uses "http://ms.com/interop";
>>>> modeltype XSD uses "http://www.eclipse.org/xsd/2002/XSD";
>>>>
>>>> transformation interop2xsd(in interop: INTEROP , out XSD);
>>>> main(in interopModel: INTEROP::InteropSchema, out xsd:
>>>> XSD::XSDSchema) {
>>>> xsd:= interopModel.map interop2Xsd();
>>>> }
>>>>
>>>> mapping INTEROP::InteropSchema::interop2Xsd() : XSD::XSDSchema {
>>>> targetNamespace := 'DUMMY';
>>>> }
>>>>
>>>> with OUT target file specifies as <something>.xsd, produces:
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <schema targetNamespace="DUMMY"/>
>>>>
>>>> which does not look like a valid xsd schema root element.
>>>>
>>>> 2. Java-
>>>> On the other hand, running the following Java code:
>>>>
>>>> class Schema {
>>>>
>>>> private XSDFactory _xsdFactory;
>>>> private XSDSchema _schema;
>>>> private ByteArrayOutputStream _outputStream = new
>>>> ByteArrayOutputStream();
>>>> private Schema() {
>>>> _xsdFactory = XSDFactory.eINSTANCE;
>>>> initSchema(); }
>>>> private void initSchema() {
>>>> _schema = _xsdFactory.createXSDSchema();
>>>> _schema.setTargetNamespace("DUMMY");
>>>> _schema.setSchemaForSchemaQNamePrefix("xsd");
>>>> Map<String, String> qNamePrefixToNamespaceMap
>>>> =_schema.getQNamePrefixToNamespaceMap();
>>>> qNamePrefixToNamespaceMap.put("tns",
>>>> _schema.getTargetNamespace());
>>>>
>>>> qNamePrefixToNamespaceMap.put(_schema.getSchemaForSchemaQNam ePrefix(),
>>>> XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
>>>> _schema.updateElement();
>>>> }
>>>> private String serialize() {
>>>> XSDResourceImpl.serialize(_outputStream, _schema.getDocument());
>>>> return _outputStream.toString();
>>>> }
>>>> public static void main(String [ ] args) {
>>>> Schema schema = new Schema();
>>>> System.out.println(schema.serialize());
>>>> }
>>>> }
>>>>
>>>> produces, in stdout:
>>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <xsd:schema xmlns:tns="DUMMY"
>>>> xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="DUMMY"/>
>>>>
>>>> which looks like a valid xsd schema document root.
>>>>
>>>>
>>>> 3. Question: how would one achieve the equivalence of 2. above,
>>>> with a QVT transform? I.e., how would one re-write the .qvto in 1. to
>>>> get the output produced in 2. ?
>>>>
>>>>
>>>> Thanks.
>>>>
>>>> -Min
>>>>
>>>>
>>>>
>>>>
>>>>
>>
|
|
|
Re: QVT XSD [message #84150 is a reply to message #83926] |
Tue, 10 June 2008 14:07 |
Eclipse User |
|
|
|
Originally posted by: David-392.Li.MorganStanley.com
Sergey,
Could you please upload again the jar, it seems corrupted because we can
not compile the rule you post.
Or maybe we need to do some extra step in order to make it work?
Thank,
David
|
|
| |
Goto Forum:
Current Time: Fri Apr 26 03:34:41 GMT 2024
Powered by FUDForum. Page generated in 0.03700 seconds
|