Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF "Technology" (Ecore Tools, EMFatic, etc)  » [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=true.
[Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=true. [message #124323] Fri, 30 May 2008 22:24 Go to next message
Eclipse UserFriend
Originally posted by: exquisitus.news.eclipse.org

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

Whenever we persist an EMF object that contains a map
(java.util.Map$Entry) set with containement=true, we get a class cast
exception. The problem does not occurs is containement is set to false.


I am using emf 2.4 and teneo 0.8.0RC1A.
mapping.emap_as_true_map=true.
The entry in the map are a simple Key (EString) and value (a simple
EObject).



java.lang.ClassCastException:
org.eclipse.emf.common.util.BasicEMap$DelegatingMap
at
org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
at
org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
at
org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
at
org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
at
org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
at
org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
at
org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
at
org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
at
org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
at
org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)




In EListPropertyHandler.java:286 we have the following line of code:
EcoreAccess.setManyEFeatureValue(eFeature,
createPersistableList(
(InternalEObject) target,
eFeature,
(List) value),
(BasicEObjectImpl) target);

The cast of value (an BasicEMap) to a list is causing us the exception.


Here is the method in which it fails:

public void set(Object target, Object value, SessionFactoryImplementor
factory) throws HibernateException {
if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl) target)) {
if (log.isDebugEnabled()) {
log.debug("Dynamic elist, set using the esettings");
}
Object currentValue = EcoreAccess.getManyEFeatureValue(eFeature,
(BasicEObjectImpl) target);

if (isEStoreList(currentValue)) {
final EStore eStore = ((InternalEObject) target).eStore();
if (eStore.size((InternalEObject) target, eFeature) != -1) {
currentValue = eStore.get((InternalEObject) target, eFeature,
EStore.NO_INDEX);
}
}

// if currentvalue is not null then use the passed value
if (currentValue != null && currentValue instanceof PersistableEList) {
((PersistableEList) currentValue).replaceDelegate((List) value);
} else {
EcoreAccess.setManyEFeatureValue(eFeature,
createPersistableList((InternalEObject) target, eFeature,
(List) value), (BasicEObjectImpl) target);
}

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

UEsDBBQACAAIAAqXvjgAAAAAAAAAAAAAAAAYAAAAU29mdGJhbGxNb2RlbC8u Y2xhc3NwYXRo
nZBBSwMxEIXPFfofltw7awXBw65FZIUWWqVde5U0Gbaj6SSdJGL/vdVaFKEe vM0bvnnvMdXo
beOKV5RInms1hHNVIBtvibtaPbZ3gys1uu6fVcbpGINO673ofSvkJLvihdjW KopRxcfyMJan
SeP5SHrpAI2jEBGebQKnM5v1Ph0m8+bp9n7W3oxnzbz8zREnFNYOLK5yB5m+ LlFgkTRbLXY5
bXcBy8nFohkM4fIfhYJFMF4QBLeZBO2Dyx1x/MvK5xRyOrqtiD/hqvz5wHdQ SwcIY3PMwM4A
AAB2AQAAUEsDBBQACAAIAAqXvjgAAAAAAAAAAAAAAAAWAAAAU29mdGJhbGxN b2RlbC8ucHJv
amVjdL2STYoCMRCF1yPMHaT3Js7ORWxBh9kpA60HiEnZRvJHkhaPbxLTMzQi uBB39V7Vy1cU
IYuLkuMzOC+MnldfaFqNQTPDhW7n1W77M5lVi/pzRKwzJ2DhGzxzwoY4Hd0P oqmCujGHsKdS
rg0HSXD2UpMZpUCHmuC+Sm55yWeBB2rfCckbCyypIlcxSjXPTuEZ1yJgUlgP 6MQDYsbFgp5p
DoD7XyEmqGu7xPZF46FB8B3lKa7lgNZUiwP4sHwvtmFHUPQl0OL0J4+80Dko 0zfx+Nq3flog
zz3KpJV/ZdcKvbkL9HUi/v2F4R+7AlBLBwgxMdGy6gAAAKICAABQSwMEFAAI AAgACpe+OAAA
AAAAAAAAAAAAACIAAABTb2Z0YmFsbE1vZGVsL01FVEEtSU5GL01BTklGRVNU Lk1GbVFba4Mw
FH4X/A9S2NsMrTAYFl/W+TLarcyx96in7tBcXBKl7a9fYoqz2Lfku5zvXHZU 4AG0ib9BaZQi
jVZkGQYvnagZxLsrO5LJSL1TDmn00LKuQeE+I1OceSkZVl5RyIMpKWM7WQNb axQNA2NLZUZ1
/55p+iR/w6jWe2p+0ohMtKKWymUr2WMN6iZ9KyvK8ELNUM63N5Kf8Nuhgjo/ QdU5RS56VFJw
ECaN3pIij1fkKQzyUyuVife0OtLGDqGvQ5D22Kwew+AWIMhbNkdtwAxNZsBd czKYw+Dab+zb
TyOpGgIVw1YDqaQCojphkIPzTzngB/u2gnWPGktkaM5ppgCGue6pq1quS7+k 3t8iWyzJM1ku
nHrz+vEF3Hqpq5SfDAgnmTmG6y3s/nzleEsv58JQZZfrz/0HUEsHCGQlo/s4 AQAAbwIAAFBL
AwQUAAgACAAKl744AAAAAAAAAAAAAAAAMAAAAFNvZnRiYWxsTW9kZWwvYmlu L3NvZnRiYWxs
L1NvZnRiYWxsRmFjdG9yeS5jbGFzc3VR30sCQRD+Vs3Ty/JnZSZBb0rQ0XMR hBgIYoHi+942
HmenJ+sa9GdFL9FDf0B/VDQrV0Thws7MfsP3zezMx+fbO4BzNB2kBOrLeGJ8 GUXeMAlupDKx
fnKQEShN5aP0IjkPvFt/Sso4yAocxzrwSEXhYkkezSYcx5q8bsIUyFNvMBxd DzpdgUZ/U4UL
gdwlq8xDcyWQbrXHAplOfE8udlB0sCtw8sMNZ4t/Aj3GCiihzDyrItBstTeX y0OgWoCDnECx
H85psJr5pEfSj0ig0o+VjMZSh/adgK7SJA0ZWrJ4+be4hfgDlYDMd507qR5k QBu6SLLMcYfx
Siu6CW2F2p8uz+zEecY8EL5bfA9tx7yxNNs8XEa2+XXK3h7nFYUXVJ45TKHG 1mUPNJBFFXtr
1C5yHwdrX2c5MLWxzhx9AVBLBwhv/+jtPgEAAA0CAABQSwMEFAAIAAgACpe+ OAAAAAAAAAAA
AAAAADkAAABTb2Z0YmFsbE1vZGVsL2Jpbi9zb2Z0YmFsbC9Tb2Z0YmFsbFBh Y2thZ2UkTGl0
ZXJhbHMuY2xhc3N9UE1PwkAQfYNoKVRBRAU0RhMPcLF6xpgYgglJgyZtuG/r QIqlNW0x/i31
pAd/gD/KOG3wYoKbzMebnd03876+Pz4BXOBQQ4FwkkST1FVBYNrL5E55D2rK p5afcqyCREOR
UJupJ2UGKpyat+6MvZRQdAa2Qziyonhqshf4jwmbPJ9IHsVsDvqBSpIeoXQp d6GfXhHWOt2x
POxH96yjgk0NBqG5agIDW6gSdB6ObOd61B8Q2taq5l5FPtw2UMcOQZtymnIi Qx53uv/Pp4Ow
a2AdG4Sq5Yc8Wsxdjh3lBkyoW5GngrGK/Qwvi2U7WsQe3/gZaPyZ4ywTimAM w5DjnIIT0eBX
TGERGUR/QisjzbMSNDHZVNC5xOwYryi/o0Z4Q+NFcAF74ssSgWdZNcJ+Xs2s mfsW2nlHxlDB
wYb+A1BLBwguWA7FPQEAAOoBAABQSwMEFAAIAAgACpe+OAAAAAAAAAAAAAAA ADAAAABTb2Z0
YmFsbE1vZGVsL2Jpbi9zb2Z0YmFsbC9Tb2Z0YmFsbFBhY2thZ2UuY2xhc3N1 UtFu00AQnGva
2DEpLaFA05bSQoGEAhavgJAiy5EsBbeKnYi36GK2lotjV/YFic9CvCAe+AA+ CrG2klCCYul8
O3M3t7N79+v3j58AXuGFhjWB3Ty9UGMZx6Y3C85l8EmGpGFdYPtSfpZmLJPQ PBtfUqA0VAUO
0yw0KYijq5xMmlxwnGZk2jOlwAa5nfe2QKP3V++pLErCNwKbVprkSiZqKOMp 6bghoM9NCGjk
eqNB39Fxk3lvwRsFf963u84HgRo5rud3XItz7PVWVcC51n3b8wWEU+GSwYYK POraHX/Qt0fW
2cDlVf0tl5JE6p1ApdUesspKP5KBPRxo2Bc4XiSIJlf/ZXGYq+M+DllXnCJw 0Gqv9lRjF0d1
bOOWwFYvSsidTsaU+XIcU9GwNJDxUGZRgWekFpJSlPPJR3zyit5bscxzrrjB m+c5uzJQafZl
haPZKmsML51mAXWjItvOkuOXxRUK1J0koazMQrmG0+ttWVKc9CJFmYxzbu08 5FfD3eWxgSqa
0KBzXOM7WYPBuH4NbzLeWlrndnHcRAO3F/wO4zv/4Aqr7uIeM7vMnPJcfNp3 NL/hwddy0zH/
DZ6B12xkHw9Ltnjqj3BSzo/xpOSelv8W2qVC4BmP59XaH1BLBwh9Pzqa3AEA AD8DAABQSwME
FAAIAAgACpe+OAAAAAAAAAAAAAAAADkAAABTb2Z0YmFsbE1vZGVsL2Jpbi9z b2Z0YmFsbC9p
bXBsL1NvZnRiYWxsRmFjdG9yeUltcGwuY2xhc3ONVVtT21YQ/g4XyxYKaUwg DqGpA7Q2ponb
XHqJKdSAaV1Uh2Lill7SCPkgDpEljyxnmuk/6hPlASZlps1TH/qjOt0jyzYB m9Qzks5l99vd
by/+598//gTwIRwFAwy3Gu6uv2PYdlbU6na2HO7WDNN3vRdFOlMwxJByPSvL TVvUGzzLa7u0
dj3e0im8JhxhSHQwz8AxDAlH+AxT6Tm9n1COpFbcKo9hBJcUaH2NFzYM85lh 8dlNbomG773Q
MIrLDNFiqbyVL60UGOb0/6mai+IKabZdGSHbYxquYpxhxOJ+oRPA/bS+bzw3 srbhWNmy7wnH
yvW10o4ohmu4riDBkO4tWbeblnCyBbnZCNYylkmGTB/o8wo5lYxMaXgbNxkG bddiGD/t66Od
fW76ubmKCoakhluYZogsyHwskkJ6rqJglmGsq1H4xeR1X7gOw2VdOLzUrO1w b8vYsTlDXHdN
w64YnpD79qG/x8+lfPKiTMd418i43sM2hTWIJJWEvycaDDP6G+uVUCOmxw2f HFpK90vNim00
Gv0zF7I1Qn1yT8FdqtiLcDTcxwNiiSol2Itdwb3iakBrUfL9sYZP8CmD2nLM 5w1qgiunm0Ae
5RSQ89NdFoq2zS3DzntWs8Ydv0OKgs8Yrp2tw+WmsKvci2KJinZrjydN6Usy pWIBeZnw5TMl
0S7figxzVUMBawwKBVEyakTeVfLvnLAE+1JDEV8RzUa9zp0qw+2eTdHHP2o1 neFGKikaScf1
k0byuWGLasvbgDlpo6ThkXQn6rstbRUPkSebPGCY4ebFmVWwxTDxerFIjmWF qCi3SipIQ0Lv
LUWpiBMX7QoLJ0af2RXe5mSyf9DwI34KB0dHbTr9pmFEPv/ca3h2IFQC7G5W ed3jJlUTJeD6
ZtPxRY1XRENQJ+YdItaQlUJETZxKRFeHZtITcA27sGQXdkdmj3Zt+0dGy27T M/makN2e6NF8
d6QtBq3oONwLMsEbCmxK18WxU6Lbo5gKlRqHnmH6m4ogBgVR2sVo52OAVsDs IdT4Wy8RH8Ar
DK9n/salzMH6ISYyR7hxArZ9jHcOAskxmuEzpPUurScJDZimwTqDOGbpJoVx pDGFDN6jmwmS
GyWZFJ2BbhTM0Q0Ih2Zl6ME9+krc4cwx5n+nRQtapS9oCAzhQQCltYTwPm4H AHeQDQF+pVMp
uzT/Eh8w/EZLmtvdX5xC+OjgBA+3T7CwHV88xuckucJwhC/i6/Q6wtfH2Pir Y3qUuAIWkcAS
zf58JxIyEZqXq2+wGXhOUyh0ZJlkpJR6gjLx9VifPzgTzjrxrp/CU0O8KO0q +DbA+w7bId7d
kJkoBfD9KzzpokWC88eniImGSDE8Jf1BGIGXO6GsGdxQlgNZYOgQ1bNoTwO0 geDZC94C+4GP
1Hd4hlok9h9QSwcIgJmfRSMEAADpCAAAUEsDBBQACAAIAAqXvjgAAAAAAAAA AAAAAAA5AAAA
U29mdGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvaW1wbC9Tb2Z0YmFsbFBhY2th Z2VJbXBsLmNs
YXNzlVbrcxNVFP/dJG0eXQqEVwsIbSmShkckIgIpj1JaDIRQmtJCfeAm2aZL 86i7W+ThW1RU
dPzgqFU/OI4jX3QGioQBZ5w4zuiMX/1/HM/ZbDZpSOiYmezee+7vvH7n3Hv3 738f/gZgNz51
wyHQrRemjKSczYbU3Gw2lLBmI3JqRs4oUZK54RLYVtAyISWVVWd1JaTkpmhc 0JSyztAicKtA
h22zzpyAz1B0Y2gwK+u6wKZYY6vl9YiAR9WjedVQ0gJiUsCr6oOaIpvzZeUl Vc6qV3nu6Scz
JDgk4Az0jQu4BgtpxQuBlRK88Aksj6l5JT6XSyramJzMUjD+WCElZ8dlTeW5 JWztN814sJaM
VuL3ogPr3ehslNuwnDIK2hUJG7CRYlSi8cTYQHxwSGB9rBk44oMTmySsxmaB ZwKxi/IlOZSV
85lQwtDUfCbSjJmKft84p9YtwQ0Pj7ZIaIOPR1slSJyuy5hWieMtsSULTES7 OGeBjYG+R0O2
kBEvtmOnGzuaNkOlD3pHlYyqG0zJLoSIxSojfc3yqleNtJG33RLCeFqgLaMY Q3YL7WlA11J2
iW/imflu9+BZyndkJrPbjf0CPXa+syQqc8SLNfx4EcFBN/oFOheDa3BcfWq9 DbGmiIgHR8qO
w24crXMcth2HFzk+hmE3huoch2tx7Ph4veNFCDP3qIQTaBdYkzI3kLU0WMgb St7QfdiHqA8D
/BCISzjN2E7V3mAN8HHGxxmfkDDG+NYpTVGu8r4yppVHdn47CWvoEOiNLU19 xNYLN9FrzBzp
ualp+LAR6Ao0bY/KQeMncN0WbbIbqhtY4IKElyELrOL+tBaied2Q8ymKs6e5 21ojKQlpEFwq
V6ZyNnYHoktE7UGG9lYlQDalSriIGUpdV4y4nCOjaxrtlXHG5iTkGdvGWH1E U6bUyyyflfAK
yz2m/Oyo2RG6BANzdIRyoom55GyZaQpza4MkU4VcrpAPzRkq3Q0x2s60mV/F FTcuU1pLgiVc
xTU6xOV0ui7+08mLSsqI9E268TpdAHZpuMoevMlHHo043rclvIN36bbhDq4w mg48ns8aT48I
LOomJyeXKAp7f0/C+/iAOrdc0VFFL8xp3BEH/8fJpVlaoYo6dakvYY6GVb6n Ohqc5LvYPLVS
NJ9XNDMgRXfjJt20jz8eqdyVgxfdlIGT/i1wwcHXC30s+PgGpbeDLxnzLZlv Xl2GdkIvp1kf
vfnX4ryLFXdMmN9UdtBzgMx1Y5Up5f9qWy1hugM6g/41C1h3H08ExT10BZ33 0MOP3qqptRQV
sJ+i2UbqN8nc93QxHzDNSmUjeJLWQIiAGQ85EKtJ20myHxewYh4rF0COHuAp B0pouV2d/Q4x
jxXV+S34foU4fx97ShAnXXfLa3st7L752vkttC7gQAn7Yiw7bGEGLMzhKmaw hIFTwSKe217E
yR1FxGh8isYjND5D49HgbTvbvcQtMElUvYh+XMARJOmoSOEGpij3DD7DND7H DL5CFt8ih+8w
ix+gmWx0Ucb9dBqcNdlI4yjGMUF83MAmnMN58iDI8vNWCUL0ZvZagr+gqxpA qym8VkNvi0Wv
wAsUVFk5bCl7KPyXSuio179eo++x9U/Y9T9l1X8dOe+Zh+tO0MWVDzqLSFIf VKvvpxYCviAj
XxIzX1M3fFNjep1t+rRt+h/qUK68SqZ7K6Z7g/6pIqbNZ5aKXUShWsgSIjUl LOEYF0vb/gCX
HJjg4Q5ryEz5X/O/4XS6inhrwrRzfaIabJjCAn6iYH+mYG9ToHeoORewGfew E0X6pHiAYTzE
GfwBGX9SKf+yC0cBW8nspCKO4xClE6FvqXM4TtYdVET28iE+MneXoC+lj/FJ q/c/UEsHCGwW
BbVzBQAA2gsAAFBLAwQUAAgACAAKl744AAAAAAAAAAAAAAAALgAAAFNvZnRi YWxsTW9kZWwv
YmluL3NvZnRiYWxsL2ltcGwvdGVzdEltcGwuY2xhc3N9UctO20AUPeOYOAlO aXkVaJsmEosQ
oVgV3YHYpEGKZEGlROwn5iYdmNiRPeGrWACbSiz4gH5U1RszRAi1Xcx96Zyj c+/8+v3wCOAL
6h4cgc0sGZmh1DpQk6kODGWmx4UHV6CVpOOAIq2mGQU0GQUqNpTGUgfRRRJ0 vp2dDS8psvii
QHWhNZcRKB6pWJljgUJz71zA7SQXVEEByz48lARWQhXT6WwypHQgh5oEVsMk kvpcpmre26Fr
fqhMYCv8u9VDAZ/6RhoVdbTMGFlv7oWvrVOUpBR0c8RhGWvY8LAu0Fho9m3x XUZXcky7oeJd
pc58bOI9mxh0+wOB2v+FBdaslROSZpZSJ5nFJj9AT6DST2ZpRCdqvlX12X/7 Ul5L3qEXx5Tm
MpR5qPHC//ImUHp2hwZYnd8S/2kB7vyw3JW5O+AsOC+1fqJyx4UDn2OFM1Bn aANVrvwnEN5g
hbOLt3hnBdpWwL3H6u2CX8xnrRdcd8Hdwrbl7luuU7h5xfz6gulYpoOdPH7A x9whnxGf8LlY
/gNQSwcIgyl0mZIBAACtAgAAUEsDBBQACAAIAAqXvjgAAAAAAAAAAAAAAAAs AAAAU29mdGJh
bGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMS9QZXJzb24uY2xhc3NlkM1uQiEQ hQdriz+12h+X
7nVT4rq72rSbpprcxD3iiFcRDNz6cF34AD5U08FLo00XwHxwOHDm8P21B4Ah 3HOoMHgIblHM
pDFiu9ZDMUEfnOVQZdBZyZ0URlotxrMVqoLDFYOe81qgMvk2oMDNQqi5E6OX cSlh0NJYPBup
1pOls0j+/cH7ySgrfG71E8nCX1m3/181mJZ2bx7RJl28d86czj/kJlbht2rQ XkafyZ0lCOeQ
uU+v8DU3JGuWWR/juxSMwQWNS2pNjcJzqEFsQh0ax7WZ+DpxK/FN4nbiTmTy uaW5Anc/UEsH
CDRKX67lAAAAbQEAAFBLAwQUAAgACAAKl744AAAAAAAAAAAAAAAAMQAAAFNv ZnRiYWxsTW9k
ZWwvYmluL3NvZnRiYWxsL3BrZzEvUGtnMUZhY3RvcnkuY2xhc3N9UVtLAlEQ /o6Zq7alaZmX
9KEnJWjxuQhCFAQxQfH97DYuq3uRdQ36WdFL9NAP6EdFczYfDLEDc5/5ZubM 1/fHJ4A2GhoS
ApVVMItM6brGcmG3jRGznrSiIHzRkBTIz+WzNFzp28ajOScr0pASaAShbZDl OssVGeTNWA9C
MrqbSoEM9YfjycOw0xWoDfa2uBVI3zGM70T3AgfN1lQg2QmeKItj5DScCFz9 LXa8pbuN0Gdb
Rx6nXKhgBOrN1j8NMxAo6tCQFsgNHJ+Ga8+kcCJNlwQKg8CS7lSGjrI3Tt0K SUY0onAV+ALl
Xfw4wrtkfzMnJD2B0k6e8nPWiU2RGmkkrYW0ad/Em7CCHQfr0KKeo6bJb21z o47D5+CvYzpk
qqjN+LpJ5hlk2XPE1jVL9bR36G8ovLKawBnzLEugihSKOI+96uYlXMSyzHBK VlHjmMBlnFH/
AVBLBwjTap3TVQEAAEECAABQSwMEFAAIAAgACpe+OAAAAAAAAAAAAAAAADoA AABTb2Z0YmFs
bE1vZGVsL2Jpbi9zb2Z0YmFsbC9wa2cxL1BrZzFQYWNrYWdlJExpdGVyYWxz LmNsYXNzfVNb
U9NAFP4WsKXtIuV+U+SmcpOIqKhFNIQAlTbNtJXRB6eTlqUG0oRJgzP+I1/V J33wB/ijHPek
LUVnSmay5zvJd75z9uzZ339+/gKwDjOKLoa5uncSlC3HUc7PquuKKRfTqpxZ VbGQsQPhW049
ih6G5Kn1yVIcy60qufKpqAQMEVPPF3IGw3TG86uKqDj2eV0oonYisecLRdcc q15PMQw1mKXS
TkbVDkvmQc7QZepOYWoQ+Hb5IhBXQ/fzum60Qnnrq6Fmpdvfcgu6VkxTST1F Xc0yxMm0WCMN
x8yns2r+fUnLGUVVK15TR16cCF+4FapjrBEsE+SM3X/Ce7dkpGsH2wzdi0tH MrfmHYsYRjAW
xSjDRMcOc4xjgiEm0kahqBqarHEq05GdSkjJKY5buC1jqiIwhV/3XIaZxaXr DyAGhjscNxAh
iVmOOcwzDF9KlHYcmcL86LmCYaGzWvtcSPEuRxS9pHifY/E/xX1fCDdUJOoy R6xBXeV4QNSb
baph1UKSwhFvkNY5HhFpoE0qyImzPZd4jzkSDd5Tjk1qRlTyisKq0d/nHLyx zxTHFqnw5t/L
RNscfQ2B1xwqdhhGWxTTt2uW/1nz3MCiEb+mGe3hIM1djpvoJ809jn3SHG9p ytI997itSvQ0
RxL9cnAztiuMi1pZ+EWr7Mj2D2a8iuUcWb5NfvNjvOBd+BWxZ5OTvDITa3Qr 5RbTriv88LBF
XU5k6+ZGmMzVLW97DBN0/BJN0KGFNta08aZNNC1v8vqavtxXaJOhleoYwKC0 Q9L7Ii09x98w
/AOTDN8xHcIZggshvEdwKYQrBNdC+JDgRgifEHwWwhcEX4bwFUEthDrBg68y TxfeyHVZ1gw2
jwRbkRdsA7MshVWmYZNlZeffIss+4B0TqLBJHIZR9GbCNQtD2jioMyPIRWJ/ AVBLBwgZJZW1
uQIAABAFAABQSwMEFAAIAAgACpe+OAAAAAAAAAAAAAAAADEAAABTb2Z0YmFs bE1vZGVsL2Jp
bi9zb2Z0YmFsbC9wa2cxL1BrZzFQYWNrYWdlLmNsYXNzfVNtU9NAEN4TaNpS 3l8rgoioIErE
dwXRNKSYsaSZJDD6qXMNRw2kCZOkzvCzHL84fvAH+KMc99IU0jqlndze8+zt s3d7e3/+/voN
AFtQFuAGgWLon0R16rri+VljS9Rx0Kl9RhtMgEEC46f0GxVd6jXEav2U2ZEA GQJLftAQme06
5yETWfME537ARCWJJDDENOlAITBZuYo3o8DxGtsERmTfCyPqRUfUbbEsDBMY 5MkJCEwza4eG
moVR5PSYy3NON5Sy+jkLEwQKmHuzs2kCOaZqpiVpMmZbqPQ9DKbN6IphVjUC RB3AAgCBqTZT
q5Uqkvyppn+sakqK3TcURWuzPIBg7o6Ln45zWMCxDmcqsqVWNU4PEJhO6LIi WYeGUpOrh5rF
fVjUQUuRDvBk3LS1CMy0gW6oB5LxBZdrliRbBObaPIpXtb0uz2Ts6dInkN3B W/GcaJfAwNr6
EeaS/WOWh3XYEOAhgZXuCjnNczddJhVxAR7BYwzkMgQW19avqWoOqygWYBKm sBAVx2Naq1ln
gUXrLuO379vUPaKBw3FC5hos0lkQ+h6BZRTv00qyS8MQb236cnmt5GJW/avv ocpq/0gpwkar
tyLWHb0fMOYl0aNXtEabSExcESY2ucM3JyBnMdrEa09myeLZDtQDp0mDC2zn iNrRtZsy2AkL
mGfzTc134jGV7x2nFeKNYX3LiPzgol/5Ezdq5U2/Fdis7PDSjqeuZpM/PNy6 6nksiIvJQgH2
/uuAVMhqxYlYQN0Q26gzxceOnYTfEIxBEQTI4jzHOx/yiAspPIJ4LIXHEWNj 4LwI0zBzyc8i
nuvB8ylcxP/NFF5AfCuFFxEvpfBtxMs98Xd69Fd6/Hd79Fe79IfxFPfgPjIP kNlAy3/CT1j7
AZvf40VPcMyjBdiBDIZsxSx/3E/hWWyfw4vYvkzsq8S+TuybZN3bBG+jErfv ErsL72PND/Eo
QSnOSEDGT8nk/gFQSwcIkR99s94CAADHBQAAUEsDBBQACAAIAAqXvjgAAAAA AAAAAAAAAAAq
AAAAU29mdGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMS9UZWFtLmNsYXNz bZDNTgIxFIVv
UangH8Noogv3w8aGtUuMKwIkY9yXcmkGOy1pq4mv5sIH4KGMt6NGDSzak9ue ++XkbD7e3gFg
CDmHFoN+cMs4l8aI9ZMeigeUNYd9Br2VfJHCSKvFdL5CFTm0GVw7rwUqU60D CqyXQi2cGN1N
vywMuMY4kTUyOC8G419EGX1l9S0Zwo/hotj+HzwyyAgx81Ut/evI2SgT9pJg /3PO0AdnCZiF
bftVsdud8DnhS1TOLv5u5GHXa7d0z17hfWUobydVc5MiUw8M9ugcUI9t6orD IaTOOtBt9AiO
Gz2B00bPvudemmkvo7sF/U9QSwcIelcnC/IAAACKAQAAUEsDBBQACAAIAAqX vjgAAAAAAAAA
AAAAAAA1AAAAU29mdGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMS9pbXBs L1BlcnNvbklt
cGwuY2xhc3OVlMtT01AYxc9tS0tLsMhLUXmK2gISEcFHESylYMdSOpRh4QbT cCmBNMEk1Rm3
+ue4UBY448Jx7R/l+OUBlJIw46K592a+c77fub03f/7+/AVgBqsxhBgGTX3P qkqqKh4d1mZE
pX6kimVumLpWoGkMEYYJ3aiJXFaVI5OLvL4nKprFDU1SRXlXF3MrGxvVAy5b bn2UofeipevG
EF1QNMVaZAin0tsMkZy+yxMIo0NADO0MyaKi8VKjXuXGllRVOUN3UZcldVsy FHvtvYxY+4rJ
MFy8EjzDIPCKJVmKnFMlkwQjqXSxNQiXdYOLeaciE0cP+mLoZRhrCUCPsiQf SjU+XlQouqSa
AvpxgzKV85uVjRLD0NXeDD0ezSqXrIbBc3pDs5ytKDB01ri1rFKH8r6uUcRe Qj2QPkiiKmk1
sWIZilZz8AYFDGGYzNy2OzvLxWzuzU759UYpT9hBDFmLLKoNi2cSYBgVMIa7 tJF8jRPCUipI
Ro0bMsFKqgededvM5f7rmRjuMXS14lIo82KovtTlTOltGygtYAKTNlDlf4Eu 49hHq1PjH5tb
d1/u7G76msG55hTZu/tIoFvRvLtrm/l86XR37Tzn9W6T5nWM/EpS3XGaF/DU dhJOnUrZdbKI
mW4JzUjszhIkqxC4omu2ckHAS1uZPFVW8rmtgn3CEuZZIS1If76o6A1D5quK fT2S53dg2k5N
EAVN44ZzDrkZwwrDQOD5Zmg/PeEYpb8mTL82+lp0IGJfUlrFaTVLI6OxbeIH Et9pEoJAzwSN
wAMqTaGTZoJbhGtI0hhBF657BtOeQeQY3d/O9FHn3UyTNnKmvYkBTzvlaUPh ry3KTJMy5CkZ
buG2p5x34lDFxDHuRE4w8hvjrd1XmjyEM4/7lMr1yJKHnTJue0yeINUaf512 qeSY9LuFnok9
m8JDB37aF0kMQNr2RXrsiyT6Ie0Q0rsApFkP6Ykv0lwA0r4v0jNfpDk/pPeE ZAQgPfeQXvgi
ZQKQPvkiLfoiZfyQPhPSlwCkJQcphFeOJotlR0VfCuSQj8b/AVBLBwiMCKbs EQMAAFMHAABQ
SwMEFAAIAAgACpe+OAAAAAAAAAAAAAAAADoAAABTb2Z0YmFsbE1vZGVsL2Jp bi9zb2Z0YmFs
bC9wa2cxL2ltcGwvUGtnMUZhY3RvcnlJbXBsLmNsYXNzjVVbVxtVFP4Ol0wy TKmGS0uBNlKU
JNjG3rylcg82ktIIGESrdhgOw8BkJs5M0P4Df4tPyAOslrW0Tz74o1zuczIk QBJq1prJuez9
7du39/zz7+s/AdzDLwo6GMZ8dzvY1G07U9kz72WscsXOFGm1qBuB673M015B F8OE65kZbthW
xecZXt6mtevxmnzunHCEYeg86Bk8hi7LsQKG0WSq0FYqS2Lz7haPoQdXFGht zeeKurGnm3x8
hZuWH3gvNfTiKkM0v7y6Nrs8n2NIFf6najaKd8mucKOH7PZp6McAQ4/Jg1zd +4fJwq6+r2ds
3TEzq4FnOWa2rYXTaGK4hiEF1xmSrSUrdtW0nExObIpyLeK4wZBuA92skFXJ yIiGUdxk6LRd
k2HgrK/PNne5EWRTJRUMCQ3vYYwh8lgUY4oUkqmSgnGGvoZG7leDVwLLdRiu FiyHL1fLm9xb
0zdtzhAvuIZul3TPEvvwsDfY4edqPXxpiWO8YWGg0MIwxdSJBNUk2LF8hvHC 27lKsBHD43pA
7kwn2xVm3tZ9v33dwlz1UJM8UHCfYeQyHA0P8YhyRDyRe2vb4l5+QSY1L7L9 iYZP8RmDVnOs
yD1fhHy9uQPkTVboZDU8xhcMak1njetlhsEmDXGeVTBNfdzIX962uanbs55Z LXMnqKdTwSzD
tYv0nata9hb3opgnrq/t8IQhgkhMqJhBTvBk8QKTTllfEvl5oiGPrxgUin5Z L1PW+8nJJmEB
VtDwFMtUH71S4c4Ww52WvdTGP+rOIhFqImH5CccNEnpiX7etrZq3MuXCxoqG VeFONHBr2iqm
QEMgwmVpGG5eTgkF39JoakUzWRrBMBXrgpORSljGWy1ZWRcnyB/I7xYyonY1 wOc1kssaj7aC
OxUldvdSogXnw+nVbpCG15JLWxo4tsNJVtcbS75tMpLrOy1neR1DFc7UNwu8 4nGD2Eq1HVqp
OoFV5iXLt2g2zDpUM12QkGoweKbGDR2akiZo7rmoiNHQGOCthsiph2R11a16 Bl+0xADqvzAN
7gpD1Hh5x+GerDD3FVSJBpdHTgQ6/SpQA1An09NNH00FMXqitIvRLkAHrYDx Q6jxd14h3oE3
6F5K/40r6YOlQwymjzB8ArZxjFsHUrKPPim3Set9Wt9AhN5jNOdvI45xupnA AJIYQRof0M0g
yfWSzASdgW4UpOgGhEOjO/TgAf0L3O70MSb/oEUNWqV/0FTqwiMJpdWE8CHu SIC7yIQAv9Gp
kH0y+QofMfxOSyRQ+zHpBDBMYXx8QK/PD04wtXGCmY343DEWSOVLhiMsxZ/R 6whfH2Ptr7oP
cbIOar4RTJPDM+THXD0sshf6IlbfoCTDoBkZejVHMkJKPcE6JW+jMHlwIbYC FeHpGTw1xIvS
7jt8L/FofjbjPSe8H5vxSqS53gbvJ7yQeDo2Q7z7YdqjlBTjDcwGWkSevziT 9WiIFINF+p3Y
lVHvhbK2vCEKSVmg6xDli2h7Eq1DPj/Ltwdf+kgtTSTcj8T+A1BLBwh4qTGl cgQAANQJAABQ
SwMEFAAIAAgACpe+OAAAAAAAAAAAAAAAADoAAABTb2Z0YmFsbE1vZGVsL2Jp bi9zb2Z0YmFs
bC9wa2cxL2ltcGwvUGtnMVBhY2thZ2VJbXBsLmNsYXNzpVdpdBPXFf6eJVmL HxBk7GCWgDHE
tpKi4iZpEzk0YEyiRDjGNk7jLjCWx2ZAixmNEkz3pG3SLG2a0gbaJE03kq4B E0yctNQ0XUn3
dDunf9ue0+10+9cfPb13NJqR5RmJc2rQ6M59373v3u/ed2d06b8vXQCwDb8N okFgUyE/aYwr
mUx8+vDUtriWnc7EB0kaVNKHlSk1SfdB+AU68/pUXE1ntOmCGlezkyTndbWE 718EbhRoW+y0
wp+AnFb1Qj7X35dRCgWBq1LujkvrCYGIoSrZMjqkFZI5zVAnBMSYQFgr9Omq Yt4vKy1pSkY7
xvehXvJJiu0Cvq7uUQF/X35CDUMgKhFBk8CKlJZTB4rZcVUfUcYzFFs0lU8r mVFF1/jeUjb2
mm5CuJJ8cCphtGFtEGtc89ytpI28PiOxDuspQDU5MDyyY6CvX2BtyhOdiMCH DRIt2ChwfVfq
kHKPEs8ouan4sKFruamEF0ll++5RTmyTRBAhljZLhEvS1RISTSx1SSzjtP3G QY2o3JyqX3mi
38/JC6zv6nYJ34ImwtiK1wcR92yTcodsHlKntILB/GxDDxXJoafbK8dq00QT 7XadxPW4QaBp
SjX67d66zoW6en6Je4E3MfcrQriJQhq20gyiV6DdTtrkp7xWwVEY23FLEG8W WG1jq2DcDDsE
1qS8AIkQ+krN1RNEf9Wh7LFL07No21uRDOK2qibsqcTxvrdXN94ihJl8SmIP Vgi0pM2zZC31
5XOGmjMKESSQimAXXwT2Sgwxtk2zz5oLfi/j9zJ+VOIuxjdO6qp6jEq03Dio LpoHUVJU0SHQ
karLe8L21WObbU7VJ47swtQ0g+YUEtjY5dkg5Qm0yobv35khR4MH8znezNty h0G9N140VOrV
cUwEkRZYV2sXCRWTAq3czdS3xbRR1JXMbipHUVfpsG5x2Sudz2bzuXjR0GgC p+ho0GYHcSgI
jdq2LljiMDI0GmlHqnxXsrvi5Nw5fkhNG4kgmJ96KS7i51aqcs7iZ7mjHlCy pFjpKIbJv8b0
B0k3QgOenguWZIFby7eDupZV9BluLxp2NWkfUidVXc2lVQr9Xu/QbRgd2fIu FFA+N1G5jxm+
M6K9RqAzwQXeJfFuvEegmctoLSRzBUMx99rkHXilk/dJvB/3ER+l01h+8rVz iWo2Kht/QOKD
+JDAFZZxRZU2ddU2T3aPsocHJT5c6cEmK4SHaURx3gx7VOIj+CjVr6AapYK1 uM3e0RA+RqnQ
xlvL1LH1xyWOs3UTWxcGdXVSO8r6T0o8wfqQqd83RAPuJPVXFetmC4XwaZoq JZlNn5J4Gp+h
1wUeTGXSJurkXBHxEoWVwtjY2GXw/lmJ/TjAT9nPS3wBX6ScTUzFZPLwUYGi 8/ssvhTEc1Ss
+miJL+MrlK81MihWGpveLbZLMZSRmWl+1HyNrMbtQcbhPy9xGmeo503yKprm OU8CnRFXkx1t
UlN1F1qXapLJJdUYs/4uY85yFmcl8jgQwjlmxR5EvHJeYppX5qmDc9StrHtZ 4gjrvmk2sTmO
gvgWPY8WdxtPhxAukiFLbPiKRAEHWPquhIEiS9+XeDveEcIPicPpRQOLV1+V +BF+XKa3Yvy8
6kmvM8ouh976Tv6/AnhXwNmCE/2pxFEUQ/g5zY/CkokaGc4X9bS6W+O36lVV r5pbeW86Nslc
TtXN3dVCEL+mHwi1X99oWJRfDNFOIfjoE6B/DfwqTL9zGvhFmL4j/M5v3kvr e5n5vYJWl9OV
Iqa7bvrmv4DvLFaeMWHNpnEDXW+Dn7ZYZWr502Kbvc3cFrgqFm2dxerzJIhz aOdLR8x3Dlv4
0un4W4NGut5CoXXS5ltJ9zusxn+wHjtM/7LkjcKJ0XcY1+Da0k5iFXnwke7U LFaexMpZvC7a
Oo83NGABgdPO3UWIk7jCuX8WkZch7j6PNy5A3OE/W7K80cImLOyNFrZxFjcv IJFi3U4Ls8vC
7HQwuxewa09sDndcM4eBa+dwJ8mDJA+TPELyvthpO+MbiG5Aoewm0ItJyl0j 6RAeRBaPIIfH
6Ogeh44TdLaepFP1DO6lOTpjsrGRMu4l7FtMNiawE3djjB9VxNBbifsGkun0 WbWI0zezF4i9
gHYngEZTeV8FvQGLXsGj2zK+2XQGNLPxPKghffOYYnaz1a4ernDVbLvK13Dl 93J13NXVdA1X
AS9XT7m6OlLDVaOXq1OurnRXojuqjZ93JbrgGkdHbaJfdI2DBq+nqzLR91S7 uujq6mgNVwEv
V5dcXc3gmOWqx2InRAfhnQtoq7Z/rcI+ZNvvsUfKOWuk7KdQtpyE/0zMz3Mk 5pvDe3m0cP1I
vt8U/GUhUBYaTcFvgjtY01EGd5DyAVMg8APOTOqhYIA/UDB/pLP6J7Tiz9iA v6ALf6Xf6n/D
Tfg7+vAPpPBP7MO/qA3+XZHCfjuFoXIK4n5EeU2002ad5RQ6Y9GH5vBILPrY HB6ncTmHT5gB
R09EP+XzUWxP3hUjyp4h3efmcYqex18VPn/0BK3xfwJ83QTMOoAXXAFzDuBF V8BLDuAbLgAi
KHohulAR07erPF6o9vgd+nxPRH9gL/pLq5fM1Z+UVn+2dNUpwnYiD8KPkAhg mQihWYTRJiLY
IJoRp+E/KFpwRLTicXElzoo2vCLW4PdirWgQ68RGsd4piGi3CtKAX5jX1/BL 80Em6HHzK/ym
Mfw/UEsHCEuMPzrmBwAACBQAAFBLAwQUAAgACAAKl744AAAAAAAAAAAAAAAA MwAAAFNvZnRi
YWxsTW9kZWwvYmluL3NvZnRiYWxsL3BrZzEvaW1wbC9UZWFtSW1wbC5jbGFz c5WUW1PTUBSF
1ymF0hrkfhNBQNRSkFBRvBTBWorTmVIY2mFGX+ppOJRAmmCS6viffFAecMYH x2d/lOPOBSxt
yowPybnMXnt/a+ec/P7z4yeAJLYiCDFMWMahXeGaJp+eVJOyWjvV5JLgtRxN IggzJAyzKgtF
U08tIYvaoazqtjB1rsnKgSFnNnd2KsdCsb34LoaBqwmdXAxda6qu2usMHfH5 fYZwxjgQMXTg
hoQIuhl686ouCvVaRZglXtEEpckbCtf2uak6a38zbB+pFsNk/hroFIMkija3 VSWjcYvCp+Pz
+WYTQjFMIWfdiFQUgxiOYIhh9mriXXrtcuWEV8VcXiXbXLMkjGCUUErZ9DbD 1PWZGQZ9li3B
7bopMkZdt9025BgiVWEXeI2MDRHiMf/IZY3rVblom6pedbEmJUzhDkPMKVcu F9LbWaJsVzRt
k7JSt0UqBoYZCbO4S6jijaCaG/F2MqpXV4iOaz5l6l0jjveBUxHcY+hrpiQX 1oWL4Xirifl9
B2VeQgILDkrxf1FaQZwTFNHFJ6/oQGtNhn7q7K6p1rj5OWPoNleo6Bj1uOnz CtMydLfPSQmP
sEIWvD7v7uW203tvy5mdQimdKV3T8j1xKEyhK4L684Q+ZFAF4rFaecbjwTiO vX6y1xw/EhxO
R4zMFglHP/gX7nhak/DS8TTqeSpmyc3mFVeDVquSdql4626saNRNRWypzkXs ubhtS07z6cbl
dF2Y7pkXVgSb5K7tTWLovrhLmKGz0UFPJ/2Rogg7PwNaRWm1QiOjsTPxHbFv NAlBoneMRuAB
hcbRQzPJC8JN9NIYRh/6/QRLfoLwGQa+Xuq73L1kgzZ8qR3DuK9d9LWhji9N ylSDMuQrGW5h
wleuunYoInGG2+FzTP/CXHP1zYYc0mWO++TKy5GmHI7LqJNj4RzxZvvb1KWC m2TEC/STOLNF
PHThlyAHIC17SI+bkfYDkVbxNABpOQipTEjv2yA9w3MX6UUgUqoN0lEg0nog UioI6QMhmW2Q
NlykEF65mjReuyo6+sgg2xX9C1BLBwjwj62+DwMAACQHAABQSwMEFAAIAAgA Cpe+OAAAAAAA
AAAAAAAAAD8AAABTb2Z0YmFsbE1vZGVsL2Jpbi9zb2Z0YmFsbC9wa2cxL3V0 aWwvUGtnMUFk
YXB0ZXJGYWN0b3J5JDEuY2xhc3OVVGtPE0EUPQO1hbra8rD4QlQKtEVZKj5I WjGkgUBSlQTC
9+l2Wha3O2R3quFfaaKY+MEf4I8y3plu+qFspexmZ+/euefMuXfu7J+/v34D KGMzhTGGlVC2
VIN7nn32qV22u8r17AOytpv8TIlglztKBuf5cgoJhvkhwYdfXOWcMCTViRvm 14m1PhJthSBV
13fVFkOpMCKmeMyQqMmmmATDTQs3kExjHLcspHCbYbygAzJ11xcfup2GCI54 wxMM03XpcO+Y
B67+jpwJLZihONrS+TIJTjs8FAciCKXP8G5QdG+iUqzLoG0Lx3PPQmGLTst2 ZKcjfduXym2d
2xFvJY0c7qYwx7A0kgIL93CfYcYJBFeRiiiCsiiMuiyVXTZOhaMYcvEJMEzo PI8E7zC8HcxS
u6+V42MLT7TwqZ5wje/Lno0jp51tihbveqpGMhj2CpdWE44MhL3z0SRyLTXL Fla0mtmemoii
L2jhiqUYCkMKcso/c9vjftuOQtPUoqsW5vGIYePqFGLxaxYWkY85IP1ei4WV Lcxglvr1UHYD
R+y6ut/nLrfUmkYzTB66bZ+rbqCLPew49M55dcRSb1GlMju+48nQ9dvvhTqR TQZr3/dFUPN4
GIoQ66R0nH5HLJvVB5mslHkmyD9J1ibG6AbSpdUfNPyE9Y2+xpDRPjPDCLeP LFkW2do7hWnj
p/Qjliq9dexE6TvSF7jztc+RNJi6wed6MRFeWw/wkOaZ3r94poVBpoOhTE8N E+1kPNPSINPR
UKYCVWubNBUjpuWoRsnS6gVKgzzM8NA8YRbxLA7z/H+YGdhxmPWhGCTwwlgb eGner/DaeHM0
vjE7xAyCrn9QSwcIqcbBWXwCAACNBgAAUEsDBBQACAAIAAqXvjgAAAAAAAAA AAAAAAA9AAAA
U29mdGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMS91dGlsL1BrZzFBZGFw dGVyRmFjdG9y
eS5jbGFzc41VbU/TUBR+7hgr24ob7/ImiEP2AlREVBigOCGQLBPDQqJ+6spl FLp2dp2GT/4A
f4F/wE9+UHwLmhj8ZOKPMp52ZQIbuDS59/bcc57nnKfn3v7+8+0HgCksC/Aw jJaMbSsna5pU
3MtPSWVL1aR1Wi1tyUWLmyuyYhnmvgAvw4xh5iWuaGqxxCVe2JYUo1AwdEk3 LHV7X1ILRU06
HbZGJgaxYGxxbV1W9uQ8Z+hPn6a02dzNJEPQcd54qVrKDsNQ+pz0Kg7k799Q 87pslU1CXr3Y
ez59cQFu7slFgvXNq7pqLTI0RWObDN4UZRVAE0IighAFtDGMNaRcZCqAMDrs sE6GePS8FE9H
JWObfjB0ixDQYq8ui2iGz48+DAjoZ+g9V0MRg/CRLnwts5FdyqSWGUJpVeeZ ciHHzayc00ip
9rShyNqmbKr2u2v0WjtqiepqMEWGsFpyX1YMM7tfJIyuaHpXfiFLmqznpUe5 Xa5YydhTAaMM
g2fV54phcmm54hVEBGMiooiR+DylySVKZTgaq/lmbpTjkQwigQkB4wwDF/mJ mIREvZXn1nK1
D0fOB//Xjj7Dyc5WrKYuhlbF5LLFXWEYHkf/02IZe1Kpx2qp6/diADO4I+A2 yXdhb4u4i1mG
li3j+OhM1+ZySnBKoaYiAVTUaEOZkTSWbJKgDA0XzdBREWydmyVDryLF6nyJ +nIwtFUQslwu
VOM7Kza3sKo5sGGUTYWvqHZz99R28KRdP11Pa7rOTadPeAlX6bA10f3ogXPi aOW1zyBZ/Y41
QDZm3wE0tpLlGe0zmgfjX3Ep/h3hJ7Ro/4yuA/T8gv8AvR/R88EJvUJjnwMZ o6BVgl+jqyGO
bmriAUxgiHbEChiGKRHQegTXXCKdEDw0xxOE/BbN3neJn4i8QX/iCJFDXGc4 RJzheLOJnipr
N3EBs1TIHJUxT6wLdNLuOYzdFVSX0V7doJ8Do+cmpl3ulMsdin9Cl833BbeO MPe+SuBz0s6d
AAxVAUNEuOAALhJlBXDceadodhbj+QkZPFUZ7jcQ+apu5FIDka/rRHrwwBlT eEhzgPbCTjX4
C1BLBwjdAA7pJAMAAEAHAABQSwMEFAAIAAgACpe+OAAAAAAAAAAAAAAAADUA AABTb2Z0YmFs
bE1vZGVsL2Jpbi9zb2Z0YmFsbC9wa2cxL3V0aWwvUGtnMVN3aXRjaC5jbGFz c6VVbVMTVxR+
bojEhK0gRRQRgRZqCC9B6YsFCkgMNRoimi1t1Vo3YRNWk2wm2djxB/Qf9Ev/ QDvTT2hn6NDp
dPzmTH9Up8+9WRcSkjBt82H35Jxzn/Ocl3v2r79//xPAVewG4BMYqdo5J2MU CtHys/zVaM2x
CtEtSunvLCdLF79A31PjuREtGKV89G7mqZl1BLSivWMWtozsMyNvCgwnG1Ek gGtcEuhetkqW
syLQFZ7aFvDHeDaELvRoCOB0EALvaDiF7iB6cTaAPoGhtnAa+tEtEDQTqbR+ IxWLC/QmrZKZ
qhUzZkU3MgXS6U/aWaOwbVQs+d9V+p1dqyowmuyYMOkONp5+UX6LMNH56LKu L63w/Okdu64Q
WAgn7Uo+amYLVrlqRs1ijrJdMaPxeiGXppLNtSVAMG3lS4ZTq8iYJyIwag8u YyyAUXazo7OG
cbzHfpixglFlLcbCU+3QlcdSiL2Z0DCESYF7bZnUff9LpiFn14y/nanRExAE 1v8nBVWqCGYC
mBa41AlKwyzmyM+M2SXH4HxVBMbbV8sNIMHnNV6ta5zKvOkoKCtnmZXETTX9 CVnQD2VBP+I7
nPj3NZMhPtFwHZ8KnGGIeLpW5txzSNnPyRYMs3axaJfqsxpPWlUJsYTPAlgm gIJXJmnRsIJV
gYBVjRfLzgvF+IFkfEPDOi4K9OyYOaNWcGJG1ZQoNzXEsUE/EhE4F060HmfZ ZHfiLnduIEOY
RxPqSzYypMN8k2q5M6K8kJMnF5qTEUBKYKBp8ZiVql2SJdjScA/3ORFZ5l5X C0TCzXtPGVr1
LQCde6nRWzeNosTe1vAlvuLikNhSKRBuRpbq1ndIyzZMmUjwgpddgoOt+dGj YlbZSLkqW0D6
HUVioBUHdpvF4spvl7uydtvupR5qnYhyCqXtWiVrblhyufYeLtI5SYk1WNYX j7NbOa7iViMr
ftNYDPkdoRSgzG8Ln0H++5pvwffZyG8IvYL2BsFXOPMrtJdUduFdPvvh53OG z1mEMIc+zGOA
Gq1+EOcwyPf5Bs0FFXIIF+HDMGUfLqlw94npk56R6QOMCEzv4/09L1K3Or+o 0Afrfi66lD7A
FdoP42huHL9cwl6csIrzBxEl6zWGmRJgYj+hV8aMCszsY2GP4scCqdkDLAr8 iJ4ItWs/oz8y
23WAmA+vITVHuF1m0cA7rWGDURMYxR3GSrIWm1jFbcU5Uo/pcV7D57iluK4p 9j6eGufZ28Q8
7+W45uZRt91RzLkFvYySMiPhp3SK//XhXxT2Juo/4db+2sxrbKYis/u4u+gf 8r9BSKUk5T2a
0sr0xTGTkg6zjLDDcigu4CFG8AgT+IYZPsYCDC7WDDPNkuEOUsipjG+pquhe xjrPPlCcdDfj
EVoeEqmLWL1Ee8zsrlP3LZ5Qt+rpZA5jalR1tx51f4O2VU8SctV4lcmoXssK yzr6RPMkPT8y
ST6Po485PGqYJJ83sVw2HvrOCejft0V/0gZ9/dh9aI/+Q1v0Ky3RfTDVM+fi 5/8BUEsHCKPo
bXFwBAAAzQoAAFBLAwQUAAgACAAKl744AAAAAAAAAAAAAAAAKgAAAFNvZnRi YWxsTW9kZWwv
YmluL3NvZnRiYWxsL3BrZzIvR2FtZS5jbGFzc21SyU7DMBB9ZksXylL2fSuQ XrDgCkJCZasE
4hDE3aQmpLhJFacgfo0DH8BHIcYmoBZ6sF48896bmXg+Pt/eAexj18EAQ1nH D+m9UIq3n4ID
fiFa0sEQw0RTPAuuRBTwm/um9FMHIwwrcRJw6auwrSWXrQfuN2JeO735pjCM BjI9eRGvnh8n
kmHQrdYpqHuCQ269esdQzKi3UrQYZt3qVXcn+9zED4mmu2lzbj+WsXPI7lSk 5F8mK9t8Jw0V
NzGycfRPesr9mzXyHMnPQ6kaDNM/eju8lyZhFJBDTv8yZtz/BGNipr+MWzIb 1MzddS1m2e9J
irrnRrnaY6ga16JtpuyegEKVsyhNXqmJvBcGkUg7xq/Wn3X0v7er3jf2/EfZ 6Ch5eEyOBS/u
JL48DxVZ5s3z7xk9dV+PIpnUlNBaagdb9Of6VHOwzVDqSTAM2xStC20AnWFa txKtlIMczGrl
UbBYxKjFEsYsjmPC4iTKFqcwbXEGsxbnMv18pl/I9IuZfgnLVG2Fqg1glc6a /VrHBmGBMpuo
YGck/wVQSwcIgtRNbJkBAAABAwAAUEsDBBQACAAIAAqXvjgAAAAAAAAAAAAA AAAxAAAAU29m
dGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMi9Qa2cyRmFjdG9yeS5jbGFz c31RXUsCURA9
18zVzdS0LDV96EkJWuq1CEI0BDFB8f3uOm6ru66sa9DPil6ih35APyqaawaG 2IU7c+fjnJm5
8/n1/gHgEhUNEYHC3B+FpnRdYzaxr4wui6a0Qj941hAVyIzlkzRcObWNB3NM VqghJlDxA9sg
y3VmczLIG/HbD8horJACCWp1ev27Tr0hUGpvLXEtEL9hmqkT3grsVGsDgWjd H5KOfaQ1pATO
/oIdb+auM7TYTiKDAwYqGoFytfZPwQQEckloiAuk286UOgvPpKAvTZcEsm3f ku5ABo6yV07d
CkiGdC89NvIb7MrPc6R+snrWIw0XClbcyPyNqWybQtVWV1oTadO2rldhBug9 fxFY1HQUdWZt
ogu1IF4Jfx/fXb4FNR1vOMoyAZ09e2yds1ZHe0PyFdkXfkZwyFJnDRQRQw5H S6/aex7HS33C
dEoXUeKYwOkyo/wNUEsHCPTh/WRYAQAARQIAAFBLAwQUAAgACAAKl744AAAA AAAAAAAAAAAA
OgAAAFNvZnRiYWxsTW9kZWwvYmluL3NvZnRiYWxsL3BrZzIvUGtnMlBhY2th Z2UkTGl0ZXJh
bHMuY2xhc3N9VD1wG1UQ/l4SLEt6luS/gBMIiQlgQ4hI+AngYLhIZ0v4JBlL VmL+jpP0LJ99
kjynE4x7KhoKOlJSUkGqhBkaOqgpU6amoKAL2X13xrJnbM3o7berb7/dd7u6 Px4/+A3ANXRj
OCUw2+9tBg3H87K7O+3r2VU6Vp3mjtNWly03UL7j9WM4I5DZdr5ysp7TbWcr jW3VDATOLBsl
U+CC1fPbWdX03N2+yqrOJuGer7JmznP6/QVKZZ5tG7eNDbuaq6xRzuxxOUYQ +G5jECjKSw/l
1UyjdELamtpUvuo2OS0RpuWNGhVKhs5S0bTy/3dSqNAZdZIeCoVFokiuULTy dslYFRit5gpm
ft0i+uQ+tG1Ns4rVmkDqIFrWzyRVruRNTrbNcm1tg/IOB2x7xaTo9NFo3bDW KX30Jl2x6waL
Aqfn5uv0qHO9lorjHJ6N4bzAzLFDk3gOFwTiqliu1oxyjsTOW8eyF5IkeVHi EmYFYm0VLDsd
JXBxbv7kmcYhcFniKYywwEsSL2NOYDwSsI2vnb0q84l1vNTBqFnuFYkYRlnu isRruErDGpar
KadzotrBBrDa6xJxJFjtusQb3JzcV8s7gWLKWxLJsOANiXeYMrZPWXKV12LO exIy5NyUeP/Q
HQu9jtJ3ZN4HEmMhz5C4dah55nHzTMtLpMKuliSWD9FyW67XKjm7TCtKpEPa ioTFo0kSrdrc
Uq2Bp+uVJTLhs1+V+JiFpoYYNitabj9galViPBRbl6jzFTLD1DJRmXZHYiK8 wScSn3LNNNHK
tHXUlNkN/D1mfS4xGda1Jb5ksckjLHtFaWZDYirUa0ko7nD6KLPueANduy0x jQRVtNyuKg86
DeXXnIZH2zNh9ZqOV3d8l/0omKj2Bn5TLbnsZIa2+Sq/omjSxW5X+XpRVZ/+ S/uvsRFBtU7T
qy+FGV5dQjO8c9rStmibjHwZ2bHIpqLf05HNRPnjkT8R8Saj+FTkT+vfqQuc xdNknyHvH7L8
ufsLZu7jeYF7eEHDFxnOa/gqw6yG1xi+qeHbDN/VcIHhooYfMsxpaDIsaPgR w5KGFYZrGtYY
3tZwg+FnGn7B0NGwyXDzZ2rvFLboXKQrQ3yPpLiLs+JHXBI/4Yq4hxviV9wS v6Mk/sQd8Rfl
PURXPMKe+BvfiH/xnfgPP4hv4Wol/m7rcwce2QR4GOfQGYk/AVBLBwiK9qGF fQMAAJAGAABQ
SwMEFAAIAAgACpe+OAAAAAAAAAAAAAAAADEAAABTb2Z0YmFsbE1vZGVsL2Jp bi9zb2Z0YmFs
bC9wa2cyL1BrZzJQYWNrYWdlLmNsYXNzfZRtc9tEEMf3yIMc12nctGkb+kgJ bUIh7iNQWgpC
lmMRWTaWHOgrzdm5uGplKSPLMP1YDG86vOAD8KEY/ifL7kUltUe6+//udm+1 u9I///71NxHd
J0+jjxhtjuOjtM/DsHb8evig1sGtwwev+VBotMio+or/xmshj4a1dv+VGKQa LTO6HifDmhiE
wfFY1MToCPM4ETUzt2S0JBy9ZTJat9/Zu2kSRMOnjFaNOBqnPEoPeDgRJTrD aFEezkgTjuv3
ulaJzoJ1MlaWrNM1G9avJTrHqIKzd2dBM1oRluN6umPgtCv2qQ+DYxf3spCY tYDHJzya1L6v
/6K/8F2j3cXamoI8U2/JnQwhTHFd90xJkLUzU9KwTLsu0cLcXbONe+ZO8sW5 z4zPfC7NsdG0
7Lrf0jsSI7PrGW6Yutfrmr7R7jmeXNEYlVyjadZ7NsI8P5v6frbdtlyP0dl3 dJr8i3Nwwh92
Ou26KQ/1TcfrvoDDk8D3903QjSI90O0e/F4t8IL30jM0RhSkzxktbO8cIPFG fCjK9IAeafSQ
0a2TRQpGx6FaKQu6Qo/pKxhKN4yube98oLArKOU3FVqn80iqHUTCmYz6IvF4 PxSyAeMBDw94
EkidQ20o0j0+wuwmXJ/Sy0bIx2O0zbl8s6//zt+4co3R1ulmeoo2709S2XFV 1dQTfPRBy644
EomIBtKyMrOs8xTnrc5kIxDhoRJTMx6JPKaqyqaHzZHxMggPW/wYjQvkDl6K w4lMxAVF+XKn
HYzTqd0cO1mi1oAclBFOzChN3qBnCsTfF6AbRZq942g5cFm1Bh+ksTT//6Lm y8hA2Y0nyUA0
AhlnVSn4rvyiIENWFIkkK5IYa9R9r68Uky07SEXCwzGaczbFu4b+xLVEG7RJ GpUwX5FvN5Wh
K4pehV5TdBUa7Yb5Jl2A9YxfhL5U0JcVvYn/x4q+An1V0degryv6BvRNRX8C fUvRn0JvKfoz
6NuF8+4U4tkurO8U4vm8oO8W7L8o2H95Yn8VWdqlGsg9kLsY5U97S/f/pK// yDY9wb2MkegZ
LeORv82o/FA+BZHjd/Q8G7+nH7JRz/WP+WjkYz1fN/Oxkdvv5bqZ77Ny/lOu 9/N1m1rZ2U52
b1Mni4zRz7jc5ZX/AFBLBwjq2g5wVQMAACgHAABQSwMEFAAIAAgACpe+OAAA AAAAAAAAAAAA
AC4AAABTb2Z0YmFsbE1vZGVsL2Jpbi9zb2Z0YmFsbC9wa2cyL1NjaGVkdWxl LmNsYXNzjZC7
TgMxEEWvE8AkIRAkoKNEShpG0C6i4dWsSLESveM4xsG7jna9fBwFH8BHIcag CKE0FC6u58yM
fT4+394BXOBQoiNw0oRFnCnvafViL6nQz2beeiOxJTBaqldFXlWWprOl0VFi R+A01JaM9m7V
GDLlgvQ80M3t9AcRGFgTH1RpctdwOhtP8o2GUJahojY6T3cJywR6hbOVim1t BLL/9Fzlf1+e
VmbXPEny/kcOAkc85/cLRaxdZRPQrIHj8WZ98iTQL0Jba3PvPEPDtZPzxLIA gS6fbZbYZUkS
u5x6nDrocx5gD0neEPt8J3DwXRl9AVBLBwiqNVjl8QAAAHcBAABQSwMEFAAI AAgACpe+OAAA
AAAAAAAAAAAAADMAAABTb2Z0YmFsbE1vZGVsL2Jpbi9zb2Z0YmFsbC9wa2cy L2ltcGwvR2Ft
ZUltcGwuY2xhc3OVldFX23QUx78/KIS2YTDYmIibDlBbNsmYOt2KbLUtUNcO pKzIptY0/VEC
acqS1J3po6/66Ks++uLDtgd2zjxnx2f/KI/3l4QuhJRzfCD5Jb33+/vce7/5 8c+/L18BWIAl
oY9hym7vOHXVMJSD/eZ1RW8dGMqK2uJFWkiIMcy1rabCNUM/sLnCWzuKbjrc MlVD0RptJZdf
W6vvcc3x4gcZxo4LCi2GwUXd1J0lhv5UusoQy7UbPIF+JGVIGGIYKekmv9dp 1bm1qdYNyhgr
tTXVqKqWLp79lzFnV7cZLpZOgc4wyLziqI6u5QzVpvB3UulSuAiutS2uFNyI TBzjOC/hHMP0
ceF1uqyr2r7a5LMlncpWDVvGBC4Qykq2XGC4dLoyw7jPssxVp2PxXLtjOm4b isTZ5E72sfqk
IlIExFsyLuISw6gQr9WyW9ntWiW3tkEbTffaKOs4ll7vODyTANUq4zKmCY+v cNrndqpXWsWx
OhoRqYZPlnmQLu2p36uKoZpNxRtqRsIsw9nXr4s0+ya3EpjBezLexyTDEPmh qhodGo9sB+oh
hlQxXRWhV8SU0wLvAxnzUARe5f/inYQTTpJN/jiwJaOuJv2ubnK1xTBBww8O dUER792Rfyzj
Bj4h8wW6vVnIlk9p9gbf4RY3NU6duRnyuqdM+9vB/S+korYX6Ekf3Ys7FxXG IFExedURH0TK
n0/H0Q1FvHOLyMr4XFgm4RWRz24WJOQZzhyPJSX7SGk8FRYSOBLheL+Phn+m IRPGss6NBoGm
gj6hOelm0yUpySgLkqRHslwslPIS1kgvHE56dlfvfOqknOAZIh4/ZOxkhPfx rLZbvPvxVGVs
BT6e1TW6+h+PMGY31jNN4DHpK4mWC6GvZXwT8IUr5Pkiab+O9AYYeCKV3K5u NMrqgRh7cFr0
arZgOtYT4o5X9KbpWpohFx21eLLe0IlX0XZ5o2PwzJLbei5jJ0CcWy2W8rVy dl3CLo07Ygfy
S6XdsTS+rItzdfjo8JwXsdSgomlyyz3CuC2Bqhs+JsIw4MpIoOVkzzOThnh0 atKpRKce/Q3Q
/55RxMSxT09xevqQ7ozuA3MvkHhGiz7IdE3QHbhGoQsYppXsBeEMRugeI5Gz vsC8LxB7jrGn
3fxB992tQG6sm/sGJv3cq35uX/+focx8ILPPz2R4s5t50y0HGJl7jqnYId7+ GzOHeDcsUw7I
jHRlUkj7MqtUkih0VMj8hZntqReYO8TVcCOqlLnlak148b6WWF2jFokyrru9 FKo3fDiZVD/y
4D4Nt6YWIJO7ZLeQ8TWypCF2iguNKxFIuzRCPYAU7yLFsYjPXKQl3I5AuuMh 5cJIjyKRCliO
QLoThfQDIf3YA2mFei2QivgiAumuh3QvjPRTJNI6voxAuhuF9DMh/dIDaQMV F2kz0lX3e7vq
10hXfRXpqvunuOo3yvy9h6u2fVc9iHTVwx6u+iOyX99GuuphVL+eUr+e9ehX zXfVd1Dpt7qb
qZ1Aa3hozTDaywi0PnKwuO5hn+5jtGrCgDkoTtU2Hg3G/wNQSwcILhZdZYYE AAAvCwAAUEsD
BBQACAAIAAqXvjgAAAAAAAAAAAAAAAA7AAAAU29mdGJhbGxNb2RlbC9iaW4v c29mdGJhbGwv
cGtnMi9pbXBsL05vZGVNYXBFbnRyeUltcGwuY2xhc3OVVl1zE1UYfk6aJk3Y 1sqXQOWrFExT
ZBUQP1qLoaRQST9oSgX8qJvtabp0synZDYgfoM443uqld446w42jwGgdvXC4 c8Yf5ficzZKm
m6TARbLnnH3f93ne57znPfvvf3/9DeBlfBlHROCQW17yCoZt66srxeO6VVq1 9anyopw0VrOO
V7k1wYU4ogLpcqWoS9O2Vl2py9KSbjmerDiGrZuLZX3s7PR04Zo0vZp9TGAo bG+WS6Wyo1c9
y9bPGK5lZokx4IMIRJcNd1lATAjERizH8kYFOlKD83wzRjZJdKBbQwLJBASe 0RBHF585y5FT
1VJBVuaMgi0FtubKpmHPGxVLzYPFqLdsuQKHc0+Q6rCAJvOe4VnmmG24dDuQ GsyFU5FmuSL1
rG8xnMBz2B3HLoH+jQAz/JsxzBWjKAdyFsUybFfDHvQJ9ExNn80uTGZmFrJT c7NXBPZtjiGw
LWA1Lg2vWpFj5arj+RJRsS1F6c3dWpWLFySl3E7C14wbhm4bTlHPexXLKfok D2roxyGG2gi+
sHAhSwb97RhkPIYoVD05nKT2hzUcwQsUVZ6TJHA61c6NwFWTVA07oDx8tZFX rVqG4xgU6A3T
ZUpuY0o7Us0ZDc4rOi9qOAZd0ck/LZ1mMqrcYo686WNubYYU6H6k9LxhV1la e6j1xk3Pm8ty
sWpLX/FXNJzCq+QfVnw+k7uU3UTzWbkkK9IxJQV6XWBnawzycTfy6Uu1o6Ny 62JugeGudnYC
ceZ4nqdRyfuWhgz2UxWuUZUkxpCN4+yGLauJp2EcewmhzrE6sfTxlmWTkoHS RHFrKNy61ERt
L3Ma9vlgbgAmMK0hjSHW+YoK1EUWPn/1Kq/hOE5w0Q0WBY63z77dCxXpHQ0X cUKNrmh4AyTX
eaMWsKtsP1JWqaIalsBAi4bQ2NuUFWMk8lbR8StNYOYJXEaa660d6VGftqGh AFMgyWbgeAZb
YUXgYPtuFUivXKWGJRRVUwlcS9LxgnPROsGmutwCCytxXBPYuymeahe2wOhT HMyWbcJhJ36c
hBTdXJdi/2OECHfK+vKRVIvW0LykhGR6c7gUalD1bqIsbmqYVBWczJerFVOO W+rY7ghfO8eU
t8BXTZTbX7LDm1ZU6IJ9quLiFTjhUEL/6pFuHJ+x7T8RGE+ODxfH5wK7296G PFiP7kMcpEYd
/HXyF1XXOr9NtnLEq54rWzgbQYQjIJn+A1o68jt67nMWQS//e+gLDNLeokca z3Km1awZZRuf
UWzHjiDSMT7Vu+gD7LxXjxHz1040+Ebrvs9jb+B7NPCNdPwc8nyzwTMSeArV yQLPU35+tEg/
wIHoGgYeIhVGH2+IodVjsPUFMTKMEeEzoWIMreHougRJ/8U0hZvxg+ysGQZB 1Oglfuwp8myX
LSidrFF6LUzpcktKbI8tKJ1sRckgpUIbSiNUTVEaretboI2y6k//hp7I99iV XsPpXHroH8Q7
7iJOgDPcefVyXX9VJ8B14lTQDZexqg14/QFeN23P4byPN4G3A7zRAC+W7ttQ UTXut1mPdxpi
xercY36NqliZ+g7rQW10kvOFsI5fN+jYWddxsr6160SY41SYyDf0+bYNkZlg Xy/W97WRyGyY
yHctibB9Bc6ztO7wi2IN85OKzeWj6zFqJ+0Hev5Iaj/5sQ7U7OuUNFz197WT Gr3LkTq37+F9
Pj/w4yz4OPkg4T7ifJhTGyzuoneIs8U/sRzBQ5TuhVT4hSF/bVChL4Ds5LyM VYjeDFW4HiRy
uEGF+bAKwg/DIHSZY93UXAYDTon0EI/CGtzN3CZZZi3cUmu4cX8Tt0xLgqfb IlHcj/zRrUC+
j/GJX/QR5v0pbsfUF+YdfBFL/A9QSwcIzRs8pnAFAADTDQAAUEsDBBQACAAI AAqXvjgAAAAA
AAAAAAAAAAA6AAAAU29mdGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMi9p bXBsL1BrZzJG
YWN0b3J5SW1wbC5jbGFzc41W6VcbVRT/PZZMCAPVsFQolJRFAthG6eISLLKE GkkDAmJRq06G
xzAwmcTJhBb3ffkP/Bv8hHyAUzlH+eQH/yiP971MQshCzTl5ecu9v7vfm3/+ /eNPAC/hFwUN
DIO5zJab0iwrkt01JiNmOmtFlmm3oOluxtmP01lBE8NoxjEiXLfMbI5HeHqL 9hmHF+hj54h9
DD3nQcvwGJpM23QZ+sNjibpUUSKby2zyFrSiTYFaV3xsWdN3NYMPr3DDzLnO vop2XGLwx5Or
azPJuRjDWOJ/skb9eJbkCjVaSW6Hik50MbQa3I2VtL8VTuxoe1rE0mwjsuo6 pm1E60ooWtOC
y+hR8BxDuDZl1sobph2JicOy3As7ehnG60BXM0QDJKRPRT+uMjRaGYOhq1zX pdQO193o2HoA
DCEV1zDI4JsSwbhLDOGxdQXDDB1nHLHHOs+6ZsZmuJQwbZ7Mp1PcWdNSFmcI JjK6Zq1rjinO
3mW7u83PxfrKhSFu4WcSuhI1BJNNjQhRTNxtM8cwnHh6rhKsT3e45pI60+F6 gZmztFyuftw8
X7VSkdxUMMnQdxGOilu4TT6iPJFnc8vkTnxeOjUuvP2yilfwKkOgoNg9LU3K dVflv7iPCvqo
iim8Tu4s0K/q23wzL/zbW8VTfJN80yrewAzFpsCXpAK6r2VjtitCcZl4pYvz rmlF6H5YPkQV
zFExXugIBVRGg2fxiVsWNzRrxjHyaW67pXApuEdyKstjNm9am9zxI061tLbN Q7pwUmg0gAUs
ijxMVGRqsarWhf+TKpawzKCQd5PScZ1FQ8qJBdiKilWsUfy1bJbbmwzXa9Zq Hf2o+tcpYUdD
Zi5kZ9yQFtrTLHOzoK0MqZDxQMWGUMfvZgrcAcxjkWRyGXqGqxennIIPSUiN NBbBF/kbwEOZ
8Ya0tb9WxhdJCUxnGKhBUcyKAmBKAPpzpSy6Vgu0nEWU5qpp2Jqbd4h+rnbm TFU7t15y3iVV
dxiGasgtT9KCuqZQV7XPJe9ILZUrWUntdsoS0RC81l5vynjPsmg+UeEg57X5 Et9g+Gljg0zK
1xx0JYyAUKZ0mOdZh+tUlpSYPSt52zXTfN3MmdQ4Z2xKOE1UEOnRXebWMx4a IS4+U/E5vhB9
82y61eqwRQ1J6mom7+h8wRRx76xolTeEIHJ13La5I9OT5xR8W5wB56Ot4HuG tnMPDM3e00+U
9xd7ixKwOGap4qk10reZ/oX40QKFVjKKTi4aaAcMHyIQfOYJgg04RfPi+N9o Gz9YPET3+BGu
nIBtHGPgQFJ20IweIq4R2vfCR+sQDc5hBOmmE2F0YQx9mMDz9NJNdO1EM0r3 oBeF3sZpx8Qs
9DS4Sb8Ct3n8GBO/06YAHaBf4DaacEdCqQUivIDrEuAGIh7Ar3QraNcmnuBF ht9oS1SFT4NU
EhgQJpIpdw5oeU0sd08xe3CC+Y0TLGwE3zzGW8R+n+EIbwffoeUI7x7jvb9K +nRL500jRA1/
BDNkxiwmqRMVzST5nm5i9z4+kGbREPK0nCUaQRU4wUNy5keJiYMKW5MUlKUy vICH56fTx9Ak
Hg2parwU4W1W4z0gzo06eBxbEo+GF50MybldiWsS7m41booQ9Dq4FtIS10bG 03PSC6+ffJ49
hXuG5pP3Vll0/R5SC/aIvxGPpDcfe7T78oXiKGmBpkN8Won2SKI1yO+Xcv0K X9NvkHbf4Dv8
4BP/b3/Ez76W/wBQSwcIpEZTFwsFAACVCwAAUEsDBBQACAAIAAuXvjgAAAAA AAAAAAAAAAA6
AAAAU29mdGJhbGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMi9pbXBsL1BrZzJQ YWNrYWdlSW1w
bC5jbGFzc6VXCXgT1xH+x5Kltf0MRjYkQLiMMLY4XNNA29gQwNigIIyDjQnO 4azltS2QJUeS
AZOTpkeaQps0aRta2tA2JOmVghNMnbSp0ztJr9C76V160aZ3E3olmbfaXa3F Sub76s/afTtv
3j8z/5s3s/vMy48/CaCOSr0oIFQm472pbjUarR3c3beiNjIwGK1t5VGrGt6t 9mlBfvbCTVgc
T/TVauFoZDCp1WoDvTyOJ7S0ftMEZQ9h5kRQGx6huE8d0Joao2oySZgbcoZN z9cTpiTD/VrP
UNRa4YvFe7Qt6mBTLJUYNoVKJBmMRVJaD4E6CUWRZGNCU/Xn0vRURI1G9stn pYGNsWANwVVd
00FwNzJgEQjlAiUQhKmhSExrGRro1hLtaneUXfaF4mE12qEmIvLZEHoadBgF FzOGjLAIs3CJ
F7Mdw29Ww6l4YlhgDuayg1qwpa19XUtjE2F2KKd2fTFcmC8wAwsIK6tDu9Q9 am1UjfXVtqUS
kVhffS72zPU1HTKwhQJeKHK0SKAoPVosUJwe1QiUQsjREoEpkgB3qj/CpPpD k6cG75Bb0kCY
U13jEIihWl+EOrzWixU588hMIf82rS+STEmmLsVK3q4MUTW5os1eWl/C1l4n 8Hq8gVDSp6Wa
rOS71IHEyXB5Fwj1chfKFKxml9qMML24nLDAClrnx5yzcVSEdWj0Yj3hYks3 S02mxQbCrFAu
hXoFzek0q/NiU9aprbO2pm6C2SsQ8mJzVjrW2fWk3S3ZKThBQw9+q0ArygjT w/qpMqYa47GU
Fksli7EGW4uxUV4I7QLbpe7MiHXqHPTbpX671N8p0Cn1Pb0JTdvPWzQl1a9N KBg+FmTRwTkd
mpT3egurzlrmD01OHK/zctJs5DJFmF+dMz3MEjXNUO5at1cdbpNzbCf3snUp TrvuoZTGaaqh
z4tewiX5TAj0I0KYIROZU3YonBpKqNFm3omhhMbndJGDrXB8YCAeqx1KRbg6 h/hUsLHdGPAi
yhk7qbJADHGuj2yRN706WGM7NFu7d2nhVL0XNzA5k4VIKLOT066pA3m52ab1 agktFtYYfyg3
vqVGECb+BlWaKzUfmyNatMe2N5viA5qxN2V2WdolS9TYH4n2cHdJ1402o/cQ KmxPXVJT0pRe
Z4lb9ISZyqIWW4vivpIl6dqssXR6trRDjQ7J9Ge5rQXkKqyZDkF4k8Cb8Za0 IbP0B2PJlKoz
VJmbbjvIHQJvw51MaPqMm511gdz9vAdALj4ocAjvYD6MxbYEqKzOvzxY0yER 7hK4245gbbGC
e7jwybil2rsF3oP38gFNMns639OdKnqHgsMcChteblInV79f4IhcXSJXJ1sT Wm9kn5R/UOB+
KVd0+fZtQS8+xHVnIuty1xV8hJ2RI7nsmMCDeIjfaGSpMwnrmSRem7fnCQz3 Ozs7L4Dzjwp0
Iyz79scFPoFPcry6jq3W5cCwaXFZ+BROeHGcN2pybYERPJqujk3BGOf/wty5 xedRbR8elJ3r
JL/wqGZtlK6fEvg0xjjXdeJsyfJwTvIyVTMvM5HeiJZwoPR8STB43k50Gn8X ULplFE8IJJAs
4Tb7WYEnoaaJkQVFwTgnk2pUPKn7eYEv4ItmxLb69WzOiDO18EIinhzk/+Mk NykZEzLQLwvs
QVhm1VcFnpbZoshskdVZwbN8eHp4JBW/LrA3rfhNgW9JxWKjwbEnCk4TCntl DZe63xHYh7CC
73Ei9ZuFXE78QGAYSQU/YjP9RjWX8h8L7EdSjn4qcAtUBT9njbBR3EuQwi8F fiW7qu4dF2Rd
+dcCt0qfduO3Ar/D77kFqj09WTXGaIA1nV78gbvyxCJhNgMFL8gXReNJYv9Z 4Ka0S38VuF66
9Hdp3WglUv5PgZtllC8xSzGWe/Evrum6Yb01s+d+vVUo+A8fdnvzUPA/9nW3 NixxXhG4TbdE
JHAjWyIXk7kn3V6K2+JDibDWHNG7Wtbb/HJpjKGDsZiW0PdfS3pJ4bY6wQtG 0616qYS/4PK/
PHOM5ms5FrBzLv4VwoMC+UnCn6EF8oNEvxfr92L5DaY/lxr3Kfq9gmenooxX T+OnGr7Lv0LX
o/Cd0NUq9MUFfG2FG5WYrkvlb4a1TNPNAwsDvotGMPMU5gXoJCrlxS8vVQHX SVTLSyADOpc9
BTaxn9XsSy3KsYo/+cowh1aymaBuSKRhsRTL+F6E5aynm6QKRnGx7MER+A5j 2ghe47toDKsK
MI7C45mnp0CHUZZ5fgjFT4B2nsJl46DNbo5SzjUYumsM3QZD1zOCteNYE5Ky JkNno6HTlNEJ
jmPjlsAoWpaM4sqlo9jG4zYed/B4B4+vChy3ol7F/AMRHkfRwK+Da3EDerje 3YEhHOQjfhef
3nv5kN3HGXaEM/son5wHcEBnYz5H3IBduFpnowfrcQ2ula8YzOV16GILJE+A sSmSKcleYeAx
VGYc8OjCO230Fhr0kux7xuLVOhhQLhePgc+qawy7JLuD2VD32KDKLSiu4Dmh 3AZUKhvqiCPU
njxeFeby6pgj1N48UJ5cUI84Qu3LA+XNBXXKEWo4D1dKLq7GHaH2W1BrDKgK C6rMkwvraRtW
hYV1o2Mq+bMXn3ZMpZscY/JPSKXz/HjeMaabHZn2T0il85g+4wh1i2NIVdmL X3AM6VZHP6ry
n44XHf24zZGdqvyn4xVHqAN4owG1wghJ4ZJz+zhmZa0nxbZesda3WlX8JaOK H2JXqg/DfSLg
llU74BrFW2U1l4nE47frA/co3qkPCk2Jxxx4zYFi6pR59JFbB/JLkd9lzPnd unahPlUlJVWm
jSppI9MvmvW6PwsKzUYpzcUMmod5NB/VtAB1VInLaCEayY8QLUIHLUYXVaOf avh7egn201Lc
TstwkJbbSDhkkbDdJKGgEz7Z3ug0OxAwSQgEfO8axb0B332jeB/3uFF8INMC xnFFSI/Sd9T3
YZeLnX5gR4C34GGWfWwMj/AHz2PkcvuO8pz8Z4VRXeHxJWP4DG+Z73PWtDs9 /5Q+/6U0wFcY
4BlHgK+lFb7BCs85Knw748J3HRW+b7rwQ2cXnuffT8j3M3IVZM/y5Bh+QeDB mTH8poA7ndxO
31nfH20k/Il/fyHf3yTA2fPg/5EJ4EXpwNmJ/nEK+M75/u1yuUy4M5kF/5UL zmUH9HJglMMp
pwJr1jKYyaROfnUBXc6ZtJYzqRHltAEzqYmzaROW0ZVYTdtwHbXhFmrH/bSd Pzo6ONId/N53
Fc2jnbSCrqb1dA1dT9fSAeqiu3k0Qio9R916ds1IZ5CRXcvoGHfnLZxfBeSW PlAhefgu8+wc
eanIU8T5W0zCU/QqUEsHCF1+pwa5CQAAQxgAAFBLAwQUAAgACAALl744AAAA AAAAAAAAAAAA
NwAAAFNvZnRiYWxsTW9kZWwvYmluL3NvZnRiYWxsL3BrZzIvaW1wbC9TY2hl ZHVsZUltcGwu
Y2xhc3OVVNtS01AUXacNDS1R7iheuAnaFiQKipdUHKYU7EwExiCjvjBpOJRA mjC56E/5oDzg
jA+Oz36U406aYmm56ENyzj6z19p7rZydX7+//wDwEIsiEgyjnrPrV3TLkg8P qnOyWTu0ZM3Y
4zuBxcsUiBAY8o5blblhmYcel3ltVzZtn7u2bsnGjiMXl9fXK/vc8Ov5KYah 06QNPoZUwbRN
f5Ehmc1tMQhFZ4dnkESXBBGdDN2qafO1oFbh7qZeCRF9qmPo1pbummEcHwr+ nukxjKuXNK8w
SFzzdd80ipbuEWQsm1NbxXDDcblcijKUNPoxKGKAYeI0+Qa9NnTjQK/ySdUk +brlSRjCNYZO
rfiqtPxWLTGMXMzO0B/3s8J1P3B50QlsP7KjzNBV5f6qXuOq6dHZ1BmtGk6t 5thy4JuWXArT
iDGtmVU7ImNQ/gVTaLEtLKksRspHJYxhnLpsKNreXl16XdpWy9omOXKeuDd8 l7vcNriSAcMd
CZOYoq/EVznpeJk9D6b5bmBQ47oVu6F8yKn7+kddtnS7KtcvlSLiHn3qS1Ux iGTfGmlhGMg2
81AZ065G+qYlzOA+w9W/+tZI3wXSlnxCVwKfUx8yQ08rLZX1GmUHs+1Vc1uh JfMSHuFxaIn2
v5a0GxJOjmjzT/Wife01GTKaE7gGXzHDaeltHonZMJvGomzb3I0uJfdEFBiG z73udMEbFx7j
JCZJTwf9QlIQwqmlKE3RPK2M1o78N2S+0iYBid4ZWoEspeZwhXZSPQlX0U2r gB70xgSzMYFw
hL4vJ/hUdDbXhBVOsNcxHGNnYmwi+bkFWWhCJmIkww3cpOhWdHY7YliIZFFm /ggjwjEmfuJu
axcrTVzSCVeWlLE2jnydY7aVY/1Mjgf0P65zLBFH6Fg65Jg+xlyrle/I8fcR yVA9MSYJdwt4
QjQJPI0wz/A8QtE4Q8GLVPoPUEsHCCwklHrLAgAA+wUAAFBLAwQUAAgACAAL l744AAAAAAAA
AAAAAAAAPwAAAFNvZnRiYWxsTW9kZWwvYmluL3NvZnRiYWxsL3BrZzIvdXRp bC9Qa2cyQWRh
cHRlckZhY3RvcnkkMS5jbGFzc6VVaVMTQRB9AyGBuMgdQEU8AoRwLIcHGkAj hsMKqBWlyo+b
zRAWN7upzUYr/0qrFKv84A/wR1n2TJYIYRdCmVQ2ne55b/p190x+//n5C8Ai diJoY5iq2Adu
XjNNtfyxuKRWXcNU35CVLmhllzubmu7aTi2+GEGIYSxgce6z4eqHDGH30KjE F4g12xJtiiCr
hmW46wzJRIuY6X2G0IZd4F1guKagA+Eo2tGtIILrDO0JsaAna1h8r1rKc+ed ljc5Q3/W1jVz
X3MM8dtzhkTCDNOtbR1fpIQ7da3Ct7QSodeaUxbu1HTWdooq102jXOEqLx2o ul0q2ZZq2a5x
UFM9zlQUMYxEMMww0dLuCkZxg6FPd7jmygy8OOWfaHVTKridP+K6yzDolzyD IvTl9ENeqIoK
pZs1noSupPOOgrsi+aF68iccDQEjQZsw9Ip89qjdu1o5Y7lOjWE9kT3SPmn1 QpE7Lv0tJ8TQ
lTOKluZWHRJ45Eu2WneamlVUc65jWMVUUIrrV6pEQsG0qMRovRKnhTWqMeQr jyF2doRr5ZMx
Tv+3BDpJBX6gVU13g8rNsJ04p4nrtsPVzGs5PlfSvKDQdUOaB+uaPYqG3PFL thLzHdDwfwq9
tVG6Ex4quI84QyLgePqCVhQMYJBh+XLhvviUgjnMM8xecF58gesKxnCbIZqz q47ONw3R0OHz
x39eoKkxQVdV/Q5ebbEtouM9GUs37QoNxi53D+0Cnf0dy+LOhqlVKrwSQYZh wKfuEWwxdJ8J
MHTIEBZIUTv9vbDeXnExk9VFnwg6yS+sFbTRG4gmZ77T4weUr/SrDT3CJyNE hVfoJUshW3j7
0C/91B+PZZW+xdrO5DdEjzH0pcERlphdiY/V13h4Yd3ELYozUXB/pvFmpreB TPckEw0axSYk
alIy7p1lnBKM7acY3wcyJik+09AtPLNyD5or/2zV5mw/BHIvUUfSlO2yxzTp 9SGcnDnGg2Ye
JnkoTpgBPPLDPL4IM4cnfpinF2HGpLpzmLVADEJ4Jq3nXv3TeCG9MXpu0Kef fC+xie1wl0TS
6y9QSwcINLi1RxkDAAD9CAAAUEsDBBQACAAIAAuXvjgAAAAAAAAAAAAAAAA9 AAAAU29mdGJh
bGxNb2RlbC9iaW4vc29mdGJhbGwvcGtnMi91dGlsL1BrZzJBZGFwdGVyRmFj dG9yeS5jbGFz
c41VS08TURT+bls6toy2qIC8FBGkD3R84auIILZaUyumhERdXYZLGZjONNOp pnt/gTs3Ll25
UHwFTYyuTPxRxjPTsQgttZlk5t5zzvedc76ee/vr95dvAM4jI8HHMFEx1+wV rutKebN4Qana
mq4s0mp+lZdtYWW4aptWTUKAYdq0iopQda1cEYoorSmqWSqZhmKYtrZWU7RS WVd2w7JkYpBL
5qrQF7m6yYuCYSi3O6WTzXOmGLrd4MIzzVbXGU7k9imvHkDxoYJWNLhdtYj5 bvvomVz7Brza
U7NEG5zRDM2eZfDH4ssMgQWqKgw/IjK6IUvoYZjsSLnx82FEccSBHWVIxPYr cTcqFV8OgaFP
hoQDzuqYjC4EQxjEsIQhhoF9NZQxgiDpIrL5wtJ8fiHNEMlphshXSyvCWuIr Oil1OGeqXF/m
lubsPWPAXtcq1FeHJTJEtYq3yZjWUq1MHL2x3AZ/yhWdG0XlwcqGUO1U/LGE CYaRveoL1bSE
kq5HdWMckzJiiJP4YkHnFSplNBZv+s08lBuR6kYSZyRMMQy3i5NxFgrNVlHY 6cYcju1PvjOO
QdOtzlGsqS+Gg6oluC08YRgexv4zYnnno9GMNaduPYthTOOKhMskX9vZlnEV 1xgOrJp/j87F
5lp2CU4lNHUkgZqa6KgyksbmFgnK0HHTDD11we7w0o5o8Ra/Q2sxaLzq+IK6 Llar+g7HQN2e
p1N6n5fThm3VGr6jdZ/XdsMcLphVSxUZzRn9/ub5PuuoQ5dX1jCE5U6RqOAk HUU/3Z4+uOeR
VgHnhJI15FrDtGPODUHvg2R5Qn5G35HEZxxKfEX0ES0Of0TvFvp/IrSFgffo f+dCj9N70KVM
EChL9Pfo4kiiD1MYpvk9QR65ToZRKgS0HsMpL5FBDD4HmyTm1+gKvEn+wPhL DCW/Y3wbpxm2
kWD46/TT08jaR7mA61R6itq4QVln6RzOuRn76qxeRmd1jv46GD0XcNHLveDl jiQ+oNfJ9wmX
vuP620aCoFt28R/CSIMwghlK6RDO4qZHOOXuCc32cjz9RwZfQ4a5DpDPWyLn O0C+aIm81QHy
VQukj+Ry3reRpm+YfFFXB/wBUEsHCPl/ecg7AwAAmAcAAFBLAwQUAAgACAAL l744AAAAAAAA
AAAAAAAANQAAAFNvZnRiYWxsTW9kZWwvYmluL3NvZnRiYWxsL3BrZzIvdXRp bC9Qa2cyU3dp
dGNoLmNsYXNzpVZrbxNHFD1jmzh2FhLCo4RXSAvFMQRToNDGbggYh7oY83AK 5dlunImziV/1
rqn40H/QP1D1eyvxKaUSFVVV8Q2pP6rqmdnNJk52E9Emyu7svTPn3HvunZn8 /c8ffwH4CM/i
iAgcsVsLzpxZr2fay7Vzma5j1TO3Oap8ZznVxThiAkNL5jMzUzebtcytuSVZ dQSMRmte1m+b
1WWzJgUOlXpRFIDnzAr05aym5UwJRFPj9wRiea5NIooBA3H0JyCw08AO9CUw iN1xDAmMhMIZ
GEafQEIWy5XZK+V8QWCwZDVluduYk51Zc67OcIZLrapZv2d2LPXtGWPOomUL jJa2TJjh7u9d
/by9inB866W52dnsFNf3z7dcg8D5VKnVqWVktW61bZmRjQWOWx2ZKbhCZsdL G7UlQKJi1Zqm
0+0ozm0RyDqAozgWxyirueVkA2N4n/WQ+bppU4tjqfEwdD0jm2RtjhsYwQmB O6GRuHP/S6ZJ
Z1EWVntqdBsEgav/MwQtVRqn4zglcHgrKAMTOMP4ZL7VdEz2V0dgLFwtj0CB nzW4tc6xK2vS
0VDWgiU7xWu6+4tK0AtK0I/5ThXfXTNFccnAJ/hUYBcpCpVum33PJmU9TwRE WG01Gq2m26uF
kmUriCw+iyNHAA2vXcpjYAqXBeKWXWi0nec64ocq4isGruKgwMC8XDC7dSdv 2lKhXDNQwAzn
MRCBfalicDurInsdd3TrApJCrk9oqNQbISec3WDKbY2oNuSJ7YVmZ8RR5snR u8Ovmw2pBLht
4A7ucmtXmbkyCqRSpc1zgyoWxyzPlN65leqinO/WNfY9A/fxFY9Uhb3qEDi9 EX/VFczxUGDP
mjA3zfbxQtPpPFcEjw08wVOKqQjKPHvp1U6B8VQpYFHwXjWqPd0sijxSa1qK vUFK8JjpSJvN
oo7jALh+20/1QFimJG32xLsvMFw2IOvHNg3y5taRV5yO1axlw+hUr4wEl1Xj 97W8k+pIeG30
xJlAWd8pEhcoWWl1O1U5YymZBteumjMKiT2Ym53crO1UYPWKTR5iek9IOw4m sbMnRIEdOkje
EJST/x9wibqTOernOK6fCX494FvwvTv9O5IvYbxF4iV2/QbjVxqj2MPnMGJ8 TvB5BklkMMQT
cS8thrsQ+7Cf7/d6LAc05QgOIoJDHEdwWNPdJWZEzUyfeo0jAqde4YMVn6lP r89q9P3uPA9d
jT7ESfrXeAyPJ6YuNJ8npXn+JKKKepo04wJM7GcMKs4Mt+IrnF/h8KJAeeI1 JgV+xECa1ulf
MJyeiL5GPoI3UJZ1sR2laMAMWa+T9QuMokSumziLMi7jho457XL6MU9z7uc6 1mkdfYSrxlDk
6qjOw81x2svD9d3QkfNG8TMqqYzEI4528Ns+9EJj1+H+KAQ17yL/7px+g5vl 9MQr3JqMjcTe
IqnTUuMVuira9WWQ64F2Pdrk0qM1ESaxi8+HLOZjBvuEAjzFBXyNS5hDDlXk MY9bkCzzIk9B
i94l/i6jwV8l0GNdHNsXyObab7RAtifQGD0m0aLEHiTiPMXI0SaxQFvet92n rUaWKDlWbUrS
C65InqQuhkVf3h+5K5f8lcom1H3gC76so1SFU+JGxMYG/X5dg0b8XCIsyVxP g0b8jcAbwUdv
bIP+Qyj6Qgg6rwMfveltszD0n0LRFz30Nd8B37ekT4mrm7ZzeBYvQnlOBmYR RUt/tT38b9Hh
W913D1jNbl/iX1BLBwgDKAvCEQUAAOgMAABQSwMEFAAIAAgAC5e+OAAAAAAA AAAAAAAAACUA
AABTb2Z0YmFsbE1vZGVsL2Jpbi9zb2Z0YmFsbC90ZXN0LmNsYXNzO/Vv1z4G BgZDBk52BiZG
Bt7i/LSSpMScHP2S1OISdgYWRgaBrMSyRP2cxLx0ff+krNRkoCgbI4NsflG6 fmpyTmZBcap+
am6afnJKvr6ziz9ECSMDV3B+aVFyqltmTiojAyfIMD2QOUCdjAzMQMzKAAKM DOxAkomBAwBQ
SwcIySkeWXoAAACHAAAAUEsDBBQACAAIAAuXvjgAAAAAAAAAAAAAAAA+AAAA U29mdGJhbGxN
b2RlbC9iaW4vc29mdGJhbGwvdXRpbC9Tb2Z0YmFsbEFkYXB0ZXJGYWN0b3J5 JDEuY2xhc3OV
U9tu00AQPdukuRhD0lLCpS0FGkouUDfipVKiSlXUQqVwkYL6vnE2iSvHW9kb UP8KJCgSD3wA
H4WY3VgVtIlqbHl3dnbOmZnj3V+/f/wE0ICTxQLDViQHqsd935koz3e68Wq/ z0+VCA+5q2R4
Vm5kkWZYmx3b/eQpd8SQUSMvKu8QZycJaZMQLS/w1B5DtZIMUj1mSLdlX+TB cMPGIjIWUrhp
I4tbDKmKDih0vEC8nYx7IvzAe75gWO5Il/vHPPT0OnamdbkMyTKXG1RuzuWR UCJSDLt/wbSn
We3IcOgI1/dOI+GI8cBx5XgsAyeQyhucOTFd00IJ97K4y1BOktfGfTxgWHJD wZXJHe9rzZLm
JKFl70S4Smvzb9mkYl8M+MRXbeqN4XXlCqdwZSicg3eG4b/6fGTjsa5+ZVp9 THHRwMY1qRg2
r6p8wj9yx+fB0ImjLDoJT23cxgrDy+urn4mv2FjHQwarKyehKw49fT5WZ/+R bc3AkO96w4Cr
SUiRr+YcoenFaCVUbI8aLhwEri8jLxi+EWok+wz2URCIsO3zKBIRdqjYFN1e Vizqs0/WIn1Z
5MifJ2sXC/QCVq3+jYbvsL/QagEF7TM7jBBHKJJlk629S1g2flIwZmnRrGNz ta+wznHn8wVH
xmA6Bl+axsR4ba1ijfaZ1nI208ZlpvdzmZ5Qj/tU02bMtBV3lqnVz1G+zMMM D+0TZp1iZ2Ce
zcUgjaqxaqib+TleGG+Jxm2jETMIev4AUEsHCNhEZMQ1AgAAPgUAAFBLAwQU AAgACAALl744
AAAAAAAAAAAAAAAAPAAAAFNvZnRiYWxsTW9kZWwvYmluL3NvZnRiYWxsL3V0 aWwvU29mdGJh
bGxBZGFwdGVyRmFjdG9yeS5jbGFzc41VbU/TUBg9dxsr24oDhKG8iThwL0BF RIUBihN0yTI1
IyRqYtKVyyh27dJ1mv0U/4Cf/KD4FjQx+MnEH2V82pUJbODS5Pa+Peec5/S5 t7//fPsBYBb3
BXgYohVj2yrImiZVLVWT8u5odUsuW9xclxXLMGsCfAzzhlmUuKKp5QqXeGlb UoxSydAl3bDU
7ZqklsqadDwsQ1MMYsnY4tpjWXkpFznDYLbBeEjmrqUYQs7e/GvVUnYYRrOt xdXXaXsgrxZ1
2aqahPvgzM1L2bPVu8JTK4TqX1J11Vph8Mbimwy+NGkKwouwiBBEAT0Mk+24 Fp0Nohvn7ag+
hnjsFIHHg1LxzQAYIiIEdNq9CyI64A9gEMMChmh8mn0iRuAnT3gml99YzaXX GMJZVee5aqnA
zQ25oJFLvVlDkbVN2VTtsTvps3bUCiXVnkCGbrXiDtYNc6NWJoj+WHZXfiVL mqwXpUeFXa5Y
qfgzARMMIyed54phcmmtviuEKK6KiCFOxvO0JldIyVgs3vS93ChnRyqEJKYF TDEMn7VPxAwk
qqoit9YaBTh+Ovi/QvQbjjrbsKa8GLoUk8sWd41heBL7T3nl7JdK9dVM3boO g5jHLQE3KcGz
ylrEbSwwdG4Zh2dmrlnKMb9JQVNCAiinibaEkTOWbJKfDG3nzNBT98viFauB E2/xGVp7wdBX
j3dTaEAE80bVVPi6ahfxUOtynbGzpUsoo+vcdIqCV3CZzpWXLkEPnMNFPZ99 3Gg24MwGaZbZ
h53aLpp5TuuM3iOJrziX+I7up9Tp/Yz+PQz8QmAPFz9i4IMTOkrtoAMZp6CH BJShSyCBCFXs
MKZxiVbEOhjGSAioP44rLpFOCB56J5KE/BYdvnfJn4i+wVDyANF9TDLsI8Fw uOilp8EaIS5g
gRJZpDSWiHWZjtUdhzFSR3UZ7d41+gMweq5jzuVOu9zhxCf023xfcOMAi+8b BH5H9osjgOEG
YJgIlx3AFaKsA045Y4pmJzFKR2zwNGy420ZkrUWkB6tOe49SAH07uqAcTfgL UEsHCAFJySQL
AwAA6wYAAFBLAwQUAAgACAALl744AAAAAAAAAAAAAAAANAAAAFNvZnRiYWxs TW9kZWwvYmlu
L3NvZnRiYWxsL3V0aWwvU29mdGJhbGxTd2l0Y2guY2xhc3OlVW1TW0UUfvYm TZpwLRRaWmjL
iy02hJegLb4AUkoaNO1t+pKIUm31Eha4NcllkhudfvJ3+Ad0xk9YZ+jgOE6/ dcYf5fjs5nIh
QMKo+bC79+ye53nO2bMnf/39+58A3sXXURgCl2vuurdql0qpuueUUnn/K/+9 4xU3owgLdD23
v7NTJbuykXqw+lwWPQGz7K7J0kO7+K29IQX6rQBkz9/fmxWIzDkVx5sXCCVG lwXCabrGEUKH
iShOxyDwlolTiMTQibNRdAlcbIVmohsRgZjM5vKF27l0RqDTcioyVy+vymrB Xi1RTLflFu3S
sl111LdvDHubTk1gwGoXLcX2Nju/2NoDuNrWc65QmJ2n++k1t2EQuJGw3OpG ShZLzlZNpmR5
nWu3KlOZRhJnR63DeSVALO9sVGyvXiXltRMRyNqBAQxFMShwpe1hE8N4m5ch 0yW7xkwMJUZb
oesTs3FezDUTfRgReNRSSePsf4k07m3KzF49DZ6AILD4PyXoVCUxHsUYa74d lIkJTFKfTLsV
z2Z1VQWGW2fLJ1DgUyZf1XusyQ3paShn3ZHV7B1d+lmV0JsqodOcE9l/nzNF 8YGJD/GRwBlS
ZPL1LVY9a5T3OXKMwqJbLruVRr1mLKemIGbxcRRzBNDwekvtmJjHLYGoU8uU t7wXWvETpfi2
iUX0C3SsyXW7XvLSdk0qlDsmMljiOQoROJ/IHl/O6pL9ihtof4GkkAcD6rKa FfLA1CHTXHtE
9SBHTk40KyOKHLtQ8MA9WfNU7A9NPMJjvuoig1ZGtoGE1XTs+No2i023L7Kq AWn/zkPufJFV
WWNeVd86BilEdQLnjrBqc8T1n08879arRbnkqE7V09yaJhWqQGKuMHOUYP6o iX2CtPyDYBiq
LXMV4ZqtmmOMXyucBeezyVeIv4T5BrGXOPMbzF9pDKGHYzfCHMc5TiCOSXRh CudoMRuOOI9e
zheaLBc1ZR/6YeAS1wYua7rHxDTUyeTYLq4IjO3g6nbAFNH+Mxq9t3HOR1er d3Cd+/s8ps8T
Vm0t4Elonj+IqFQvkGZUgIH9hE7FmRIY38GNbS7fF8hN7GJG4Ed0JGld+Bnd yYnQLtIGXkNZ
DmgbYNLAV2JiiaxZDOIeuSzm4j5u4a7WnGxwBpoX8Ak+1VoXtHqDXsP0vUvM C0GMC34cjb17
Wjn7ShCRpSN6xdUpztOXftHYk9j/9Yy/xv1ccmIHD2bCfeE3iOtw1Hpbr/bD 6Nc1sEK5X5Lk
KwzhKa/2GVL4Rodws0EShDCNPAo6hGk/hD7ufIZl4g3xP/5zfEG5+8FM+8E0 9la4J9SzC4J5
ooNRSVGnDXH48rcOXL4RqDCodrnp8o2gyBaPFFlr9B9aol8/Ft1ghtT41Md/ 9g9QSwcI4ATE
bQ4EAABvCQAAUEsDBBQACAAIAAuXvjgAAAAAAAAAAAAAAAAeAAAAU29mdGJh bGxNb2RlbC9i
dWlsZC5wcm9wZXJ0aWVzdY4xCgIxEEX7gblDwC01uYAKFgpbaGVpo8mwRrI7 YZKA3t7EbmGd
7r0Hw0dYqa3l+BE/PPMeG5oZN9X1rkNAePhJ+8mG4iipndLrG4Ka38iOglkI 5+P1sOkvp6UW
Qxnq6/cY/scoHEmyp4TwukvSlsfoA2kWR9LWICQuYknrSkmsQeCSY8k/UbdX 8QVQSwcIw7mU
pIwAAADwAAAAUEsDBBQACAAIAAuXvjgAAAAAAAAAAAAAAAAiAAAAU29mdGJh bGxNb2RlbC9t
b2RlbC9zb2Z0YmFsbC5lY29yZc1X32/aMBB+r9T/IfL2SgzZy4Sg1dbSCa2t okKlvZrkCB6O
HdkOkP9+55Ag0qKpLEhLHoJy/u7u8/2yGd3uUuFtQBuu5JgM/D7xQEYq5jIZ k9f5Q+8rub25
vhpBpDQMJyGL1iwBb5fy4UErQK3rKw8fNCbNEBfHZGVtNqR0u936Kk18pRP6 62lKaohpQrZf
SkTQ7w8Q9jiLVpCyHpfGMhlBw3rJpKEMkeCZgdICpEtnJaATByOeZCmCjVra BROiMiTN68t0
TGa1FAWhhiXfHSFvHHQEd4IZw5cc9+oh6aEtMrRXRaNcrH1YMJbQSm2WL7J9 qEy1nK2TAak9
h9VH7RWZ+03P5/kOEaJkrVkSsDqPbK6ZeACGv3DCxDdrNV/k9hCmhUDO4UpJ lMD8GHrPLHMC
70Nh/0TpBAlgDVUBacEp0QCyY5zcuztsDEQW+/DihEb0uAL/oSrnwNLWNflf Y/0CS9DgJlDd
xZqnTBd3SloW2QMvdOH6m1Z92NoNplTJ+OOOTqQKRUdD6G9jKTgeS8Elx9IP l7u2BcC2rJjt
h3nbKphK2z43jk9Z2W9zUgpbd3PM7AV2eu+stOaCORZxdwbdSqXQpUpwfC5X Ce/MRysu4ieW
ES/PMtDfVS7jMekNSG3XPQ3PAX1WMaDKRFpdIK2fUJjTi3QNxeUmvbuvxbk4 u9nf7TnB9yPH
i9QZey6nTDfP9NaBbeazvg+XkOcS8JttmJ9bLnyEfd7j2obClUZnTtwNEzmQ tzk/FNw5JyAK
Gv9iUPQHUEsHCJ4KJIJFAgAAAA0AAFBLAwQUAAgACAALl744AAAAAAAAAAAA AAAAJQAAAFNv
ZnRiYWxsTW9kZWwvbW9kZWwvc29mdGJhbGwuZ2VubW9kZWzNVl1r2zAUfS/0 PxjteVZWGIwQ
p4ykKYF2DUs39qrI17Y2WTKS8vXvdyXbWdwkHWNNaZ4c6d5zzr3nSvbgelPK aAXGCq0S8iHu
kQgU16lQeUK+PU7efyLXw8uLQQ6q1CnI/i2oe/8QbUrR3yVeYeLlRYQ/xFO2 j5sJKZyr+pSu
1+tYl3msTU5/3E9JEwJcG+gEAZeishACoczoVa93RW98WAe7lfL33FYriULC WBjgTpttQuhc
Z27BpAz71BreUEAqMOJkZFzvh4QadCaXuVDTcULawGbjCythb7GGN1q7m40D ldqpcmAyxjEI
Re8KQPExT3U8Gj88LH6iCrKfNJLM2sME4bEUk93MaVnteCGTuCJWMAYJOXPB NWeWQCJRVtpg
vq/hALjZi4NbJMqAuaXpgHzdQTdcXCOvYIrDHay8TR/9VHFdbY3ICzcRIFOs IWPSAhn6nEGG
4CKvzRrapmU154B2NkP4XuO/MyPYQoIdYtnJkUYO6NHogIOTNGP8F8vBRhW2 SGz2XUyFrbT1
4TOjVyIFM2HNUNSNC/oagIR0Zb+jdWk1S7ANScJW4+HTeHqLA9Mm1WmTuts2 4gafYFQImbaN
q7GaiISEf/2bz84ZsVg6iI7CU7Zm23mwkh5nUtqJbLsjOUZcGV2Bcds5Tsao 0IKD7XTkqSYc
EDB4qTyn6RFYeUrSixWfIszZSTI/3mdnKXQJb81Hr6nj44D+Gf1/PQwzfLNo dcbjUBPQhcTz
Oyu0OutkNGS5AbxxXolM+evk/DTW3/3o1EuYHqbnfIo9/LNted1DE+RURpTM bEdaOXy5vCFh
6KtW6RFp/2PwnBeQLuWp19zrltmKoTmOxJ2wJ7v/ErO3I+vM30Evw0L7TeK/ u+nBhzeu/gZQ
SwcIVtrSsJoCAAC2CwAAUEsDBBQACAAIAAuXvjgAAAAAAAAAAAAAAAAfAAAA U29mdGJhbGxN
b2RlbC9wbHVnaW4ucHJvcGVydGllc61RQW6DMBC8I/GHURpuFb1XTaVIUClS AxHwAQcWsOrY
lnFC8/vauJXaWw/4tLuzOzs7jqMHvLRK3w0fRvsa+/TpT+5L20O3jSMf7VZ4 nqdRaFVH6OhG
Qmkyz74KZApF2aAdmRwIdiRo42HLacKZ7EwkXZlPEFwSmOx8U5jdJEmCvMhQ vqGp9kX9vm/y
DKeqPOVVc8hruIbNMpiGiSP7cByQNP+suUOyCz2CaU2eWy0afKj6Jey5CGuD xMDjgeUc13+d
gu7fpOl61q35Cf/xa03lWlwHLgtnMHaoVW/PTAgcnXHCgUbdeEfmG57nOaVP dtGCUmWGOPoC
UEsHCFd/u6D4AAAAqgIAAFBLAwQUAAgACAALl744AAAAAAAAAAAAAAAAGAAA AFNvZnRiYWxs
TW9kZWwvcGx1Z2luLnhtbE2PMW/DIBCFd0v+DxeUFWjVpQO2t0oZIkVKO1cU XwgqBgSkSv59
IXad3nTvvnfvdGK4ThZ+MCbjXUee2RMBdMqPxumOfLy/0Vcy9G0jBlTWhIQP 70vxVlTghtK2
AaF8uEWjz7mviv+XZbDdjdu2oXReCfaijZsJCLxmdDUWgjcud8RHzZaLDKdT 6X1EptFhlBnH
zyDVt9RI6qVSYtEwy1KXaKADcvSn/CWtJQ+irEypsrQw9mc6LKGrtdzb+xFt dU+14etOQfcJ
Ad7fswVfn5g/5OuLv1BLBwiyNM8e1QAAAGUBAABQSwMEFAAIAAgAC5e+OAAA AAAAAAAAAAAA
AC8AAABTb2Z0YmFsbE1vZGVsL3NyYy9zb2Z0YmFsbC9Tb2Z0YmFsbEZhY3Rv cnkuamF2Ya1T
70rDMBD/3ELf4YSBOmj7ANahyIR+GeL2Aml67aJtUpKbOsR3N00zh50Thn67 Xn65+/1J0+k0
CmEKGVfdVot6TbPhO/3ecM1JXk76Io3CjvFnViMYVVHBmuYqCqNQtJ3SBErX CfJGdAYTbCtb
K43J/J5xUnrrkOlu7VkcQ4G1kPHGoI5LxSGOBwqrNUJWzPy1LC1mUCkNZNut KrFJHCon6LR6
ESUaYMA1MrLnSGtVOjgyvgapZMwKQ9rOAt4wY0BV40mOC8rykMmNwb3SZOmL h8GCAVGjRG1X
lzt/NkUjOAhJqCvGEXa3vBzAN7K7DOxsgfcoDJwtgdduhKwbJCXtFENM2iGe dDVcSQbsUQ+D
46KCEefAkQ4OSOaL5ep2cTeH671+m/LeBI/M+56Qgi4uXb57JY9IGy37bCS+ giqe0EZgdQwp
nGfYzggNZaktzv+qSLtlJ+36wYUe419SXx6V1Efx9R9suv7tYwnF1h4I818h eUmn7PolWP9m
oUYatbzKD0jTUbZR+AlQSwcIEm6KJYoBAAAlBAAAUEsDBBQACAAIAAuXvjgA AAAAAAAAAAAA
AAAvAAAAU29mdGJhbGxNb2RlbC9zcmMvc29mdGJhbGwvU29mdGJhbGxQYWNr YWdlLmphdmG1
VV1r2zAUfXYg/+EuK/SDxd573dDSpRDYshInsLcgy9euVkcykgIrpf99kj/i xIkd+vViZOlK
Ovcc3Xu8i4t+Dy7ApyJ7kix50KPi39udyCdPJtGJHXj9XkboI0kQlIh1SNL0 st/r99gqE1KD
kImLNGWZQhdXsRkLie74NiVKXR6Lui8Ozs/zKnBfhkMIMWF8uFYoh5GgMBwW QOcPCH44Krf5
XjiCWEjQZnolIkzdPGqigQquCeMKCKWolJCqDkRNQIR/kWoFWoDETKJCrovb 12lxFYCfshES
+gDU5vLN98x/cylGotcSQcRwLBT5erW3QnhUbIyIQaWfMqwjfK/CklOCPNon 5FphLYsblIM7
QrWQT0VETgw8Mh5dDUohB8VKghwl0RhVMq/DlFFgXKOMCUWoziv5BvynDQoF lW7w3O85uW5O
KU71UjhZoVtMt+rptGfmNOA5OT4n0JLxBHB682sMVzCoEh/kD6gdicpsNovZ 5BMhBUtzvgUV
vArUJxMVLO9n47vJn2NsKROeohbcqK804TR/0rqG/AkYm49rMg3mN9Nbq+zm RZv2UT/rMnJi
5xhn+uz8QCZb5Q0s2lT96fN1yvhj42SNStvjwMfVyP74nhm8nBZ1/N6cd2pz 577WgAOpfk1Q
231n561UmoqF+TiYG+a+H6DENJ4QpRVUabmmpmGRtOpcqtL5dIeCD2JgFypc CxmhPAB8eTe+
mS9m4+Xt78W0TmM7kRkauKahN1p4LnCOdV9im01T2fdmJHMYXSh2eXQPSW2X W8UsrBM2ql+2
8xAXfd6MibE8aRTFYqEq4o26lTt+VO5vu7mjC5SWZdNuTO0x0In/B8aMm9tT ZkyMpG22b2Fv
Gb+zcX6nw/oba53e34jdNv96qdX9ndr+X99Ya//+WZFgfbok8FCfLMl6d7Ps Vqcrk+P98o0N
c4+jkqSqzMq2uTEft1F3L/b7Ap7XuKjf+w9QSwcIM80lh9kCAABNCwAAUEsD BBQACAAIAAuX
vjgAAAAAAAAAAAAAAAA4AAAAU29mdGJhbGxNb2RlbC9zcmMvc29mdGJhbGwv aW1wbC9Tb2Z0
YmFsbEZhY3RvcnlJbXBsLmphdmG1VE1P4zAQPbtS/8NQIZEWNblTQFSlK/UC aOkfcJ1J6l03
jhyHD6347+s4dhLSIDjAJZlMxjPvzTxPNJuNRzCDSybzV8XTvb6uv6P3Dus8 3cSnlRGNRzll
f2mKUMhE76gQIT/kYjEejUfGkEqDVGmITPC8wBAPibGlwnC9ErQoFp9F3e/+ INOfhj3UID4v
W4EL178o01K9br6ENBdlyrNwXX08WLt7pqE9s97Id/FkPocdmuB5WaCax5LB fF53dJlBBQMP
mGmqucxAJqD3CAcZo4DL3bXDdxntrsM2HWbxcbKbFDNUVGPs51HuBGfAqvbC o0PXIQz4ok2m
ArpdaAEdnYF/4xGxtIgpt1JoahUWbowJLYWGxAW+JxXWBz5sBPmYFunxIpYY ccyKKj87gskz
roOpRUu0g01IP8rg7ruuIOi5pl5P4W8DvDDZws3d43Z5t1qHKWrfuGDiz02m C7DleALBQImT
K8hKIRw6QhTqUmUDYBb2/1v1tA9GNdtDsH5hmFuloLd8ro4sW5BCpkEbuWjS uboZPg8pI7CR
b5WMjwdOjWgz0/qMoZerm/uPDXoQYk27KHNUg3i/EcbN/RMqxWNsIbl9BMx2 JaiXGKB9eWjP
3M6sdlZ6sQZPOKrNbTD1g2O0wIai19t2/bi9ADemwFWb1tXMFHRNmRB39S5q Oem9ks92qhsh
MKViqdKyuoiNboLJ1gys3glnEziHFt0dPaBp6zlMzoAXkEkNFJ6o4HEdb4FP WhH9XL9djyue
0KXs7rSx7aqy/68sXe9zbfHXynh/Vhk9gbrpgelmz+XB+4n2fk+rbdKEfifm GHOFrAE9KO/b
bszwcu0wG2bUFzD6HdSQeYMoGrjJ49F/UEsHCKJC/rWMAgAAcQgAAFBLAwQU AAgACAALl744
AAAAAAAAAAAAAAAAOAAAAFNvZnRiYWxsTW9kZWwvc3JjL3NvZnRiYWxsL2lt cGwvU29mdGJh
bGxQYWNrYWdlSW1wbC5qYXZhzVjbbts4EH12gPzD9ALULhwZ68ekzdbrdQsD WzeIvcC+BbQ0
srmRRUOkk7pF/n2HF0mULF+23Rb7YkjUcDgzPHN46N7r1+dn8BrehGK9zfhi qa7te686YAZf
jqOX+qF3frZm4T1bIEgRqzlLkoCv1snV+dn5GT2ITIHIFgGGCV9LDHAV07PI MBgNEybl1TGr
G+v9uD+9amE+roVQxDZ1D+9ZqES2vdpv0bBwYbO+X/wS3NDPUSMTlWe5NzCy 7mvD/hGX/cJl
/5hLhVKZD718Z59dXMAcFzy92EjMLiIRwsWF3eVBCtoxrjBVTHGRgohBLRFW IsIE3syv3XJv
evProHSHabTr7N0CU8yYwijHyGae8BBCveVQq7COH/CzIk8S/A0sA9qZA1/P z1omrdahvFr7
o2zVwmyZOFvrjD/QAFh0gi6he3wL6SaxhS5XHmZI1hIYVS+ViqUhHqpbFzKK UirMMIJHrpbW
y9d3CU/vj3RAcGumZlvYGXmC+das6VrRes378s/bMTywZIOBK8j6eiIUXpoZ tESGoYJHRh4E
hCYf3xdwCQ+cmSGpkRFaL7FtIFihWoooT+EFT7kC/dPuPHXhccnDJbBEClhj FotsJe1sbcFZ
wr9UoOaW7FIlqFBqk6XSjHtFy02cmxhEirQAhR1tCURkJoPvBIVEPHUrvBn7 +OMFTqZ3tAWe
6Qtbn6MYbOiTdscgvyU3VM+2c92FGqsFOJ5MZ4PJcNQhvLaeqpj9Ad1igQFz IRLUrSDHlCHt
1luCSSKxuWnKZqBHlkYlKNBue7V3gOBDw9whyLSXnac/sHQLgiZlEjZrQpRF HmExwrUmlgBg
aujEzrajmIZcN29GGVACMuYUM7VSSKXk6cKslgOcfNJodbbK4SipnhQFQiT0 PAqGptIDUvK0
8szzE1HJsLkLdB48pXo0+I+4btNk2yULGs0oFnTRaB6xoRb9w5XEJC77/VNc MbDVJlatrKZr
0dVJlquaKlovS/aAkAoFW1SULaZ+V1r64VnJNbaqMc+kcqRiUWOWLmea4mC5 oJ5EnlIPCxoX
oB4FgQzX8tLtPip2YRlWzP+mykiLAgq+yiXWpYsg3yXaHxcMvXgrdUFyw+Bp Mf+VbFprRWyZ
YYwESGE90d5KQ/0sNTAsaz9OH0To0VwJhUdO4eqSsjjWHKwxXIStlkyZortI HcWZynsh/xdk
10RRtmKu/YaCcEKncMFZBYvZKPaZNRCG1QGOL+qHuuVFy3BE7e2cRzruNIB2 bUZnh5GDnPmC
Bar8a31a4BLuWGJq9Xrwaa4Y4Yww5I5AH6feudpqEi+04fVU3u7Eqi077RMD zgMsVAVBp2nl
X3fFwBGHl5DiY/PRkpfDo2+VbfDUIu2QiZ5Vk766VN6QLlPN4uQSefOCpnLV Vz65VI2OL6Ey
XDlfWzUx7pLsV5Psf2OS/SNJ9r81yV3Hl1AZ9pN0CLBHd3GOGGqMmGI5M2qz 3W4I9rDJlTP3
S3vctH/c1EU7LhiqOAGKiPdEeoDUmqI9zbx/mrmL+iPL7r3KkirnacRDXXfS MyFLX+kDGMIl
SxeGWpvyiDPEL1i4dfy5a/iD9aGle3eDIvzp+1TO8HlMxRXrp8RSk8o6qNpQ Lb527XNHt5F7
HrtObP8knV0K7KHD80GFbe+hzVLJ00g1hZor7MWGEZ1HGoBO/OVCRWth0iq8 VDbzjTKC0gi+
79Uke/fuQfAI9nS9rxpccXLZcGUPtbJk1VPNcZr5b8Jc5SMnZmMa32T2HKv8 EWBDsK/t2Wg6
++nbP/bk8R4ICH3bcXf5g9ft4jZQIsUhotDaFhb/V0QcYNW6lnQ1qyGjWs0q OrwzxFOBEtWE
rbSsGnx0IkAPyRu6FfDPRm3d3I7ej//yvtER294vPPWloeFiWdNQh/XTqXK4 SeHUhcxhEfMv
VtqRGWXugygCuZn7uerJ03Ko3QlYFLWrWdtYD1n2Pctql6vtGs39mVCNmSw+ T/WtVmz0X5CG
HfeY2YjXmGkDaf4xs7TRqDk8Rsm55AooShBrDWdqE/vRX4jwSB4ct5Ss0zXn ZBDa5+f65XkX
no2nd4PfprPbwXBm38aT2ej2/WA46gK9fRhNRreD2ej3u3x37oZ/DKbT3bpQ aGKThQbclt5u
3YiPWctxT9DrNVwgzs/+AVBLBwjn9uS+UgYAAEIYAABQSwMEFAAIAAgAC5e+ OAAAAAAAAAAA
AAAAAC0AAABTb2Z0YmFsbE1vZGVsL3NyYy9zb2Z0YmFsbC9pbXBsL3Rlc3RJ bXBsLmphdmHF
kk1qwzAQhdc2+A5TCOQHLHcfY1LSFAKFFJILyPLEUStLRpJLS8ndK9l1Qhya XeluRozffO95
ktksCmEGKVP1p+blwWZdn1w+tI+jdTHyRRKFNWVvtEQwam9zKgThVS3mURiF rlDagtIlQSZ4
bZBgtXe10khWS0GNuTXHpUUtqSCsUGT5uNnkr8jseqB+Wrv9KV46nvn1hEVj 20+T3updHEOO
JZdxY1DHhWIQx53tBwneCFYoLbVcSVB7sAeEShUoQLUwME6xytI889Jpkmdp 4voxOaujLK61
07qPtj5HuihRoqYWiz7YJhecAfM5gV/grQN+WKdp4CKQM2o3CV9RGLQug1s2 g98pgwFR0CIF
tVbW7cTiBDSZtssC09SoJ1OXb3D0Gf/J+sXmHbXmBV6gdKcEuPU/irVNT6XR NlrC4DbIM3en
RYUhu9V29x/I7rZ73iekjhGXqpF2gH1/QjtCkvSJR+E3UEsHCJHf1/9mAQAA qwMAAFBLAwQU
AAgACAALl744AAAAAAAAAAAAAAAAKwAAAFNvZnRiYWxsTW9kZWwvc3JjL3Nv ZnRiYWxsL3Br
ZzEvUGVyc29uLmphdmHNV8lu2zAQPVuA/2GKBLBj1BJ6bQUjXYAilyaocy8o aSSzpkmBopIG
Qf69XCRblvclQS4GRXPeDOe9R1HBYND1YABhLPInSbOJGrnnYHnCTl7eJJdm EHS9nMRTkiEU
IlURYczPp9mnL12v69FZLqQCITMfY0bzAn2cpX6cCP/7j9vb6C/Gyi4M6tQf hkOIMKN8WBYo
h4mIYTh0ZXwFibnEArkiigoOIgU1QZiJBBkICwa9EGejMBrdoSwED4NoFAZ6 pucv4JEnK+Du
39wlutegqWBMPFKeQYpElTotEKm3WOZmR5h8dhElcyEAIaOj52tG+XS5D76r 5CJD9Y3pRt1N
BEcwVdpHsM+2xpcw0Bj7w/2UiHwBZx9PgPtFZg7IDI5CGGsCDC8GpBq3ccKg 7lgY5IvOXxeI
bVj9c+eEZbBdlv6VW24pd0P8pzShBcz15KYz5CiJJqrWaBkxGgPlCmVKYgQH CCvh8Nz1OlaO
HY3zGzX3vLA6eyCsxFp0tc6WSKzFBkQpSaNSoe9gNsq6U8vODG4qPSPhRnjN TG2tNFIALXhP
QcyQyI8OSIdprUrUzXyCYiJKlujs2ijS1k8gwSKWNLdsmbW+Xxca1MVssIr5 61rarmxoypZS
qySW7YuiaYj+WC/h2VVjwR5y+NMAqEMraXRaIuhYFXRcGlgyY//KHkEL0seo 1jF+orsPVcWW
/udEkllVnSmN4+MJRLSasbF3D4ImsI41l7vdxZ3WWTqwXs867XPxHVtnS6lt 6ywO/yOt0wA4
1DrN0LNYZ9eb7M
Re: [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=t [message #124751 is a reply to message #124323] Sun, 01 June 2008 20:51 Go to previous messageGo to next message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------050106040708020105080405
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Francois,
Thanks for the testcase it helped to reproduce this.

It showed that there is a bug which causes this. This bug becomes visible because the model classes
are generated with dynamic efeatures (to support cdo). The Teneo code handling dynamic EMF could not
handle real maps yet. I have changed this. I have changed the EListPropertyHandler for this. I have
attached the new EListPropertyHandler. You can put it in your own package somewhere and then call
this code before dataStore.initialize():

dataStore.getExtensionManager().registerExtension(EListPrope rtyHandler.class.getName(),
MyGreatEListPropertyHandler.class.getName());

whereby MyGreatEListPropertyHandler is the EListPropertyHandler which you saved in your packagetree
somewhere.

Can you let me know if it works for you?

I need to do some more testing before I will commit the change to cvs.
The bugfix will be in the next build which is this week.

gr. Martin

Francois wrote:
> Whenever we persist an EMF object that contains a map
> (java.util.Map$Entry) set with containement=true, we get a class cast
> exception. The problem does not occurs is containement is set to false.
>
>
> I am using emf 2.4 and teneo 0.8.0RC1A.
> mapping.emap_as_true_map=true.
> The entry in the map are a simple Key (EString) and value (a simple
> EObject).
>
>
>
> java.lang.ClassCastException:
> org.eclipse.emf.common.util.BasicEMap$DelegatingMap
> at
> org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
>
> at
> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
>
> at
> org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
>
> at
> org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
>
> at
> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
>
> at
> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
>
> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
> at
> org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)
>
>
>
>
>
> In EListPropertyHandler.java:286 we have the following line of code:
> EcoreAccess.setManyEFeatureValue(eFeature,
> createPersistableList(
> (InternalEObject) target,
> eFeature,
> (List) value),
> (BasicEObjectImpl) target);
>
> The cast of value (an BasicEMap) to a list is causing us the exception.
>
>
> Here is the method in which it fails:
>
> public void set(Object target, Object value, SessionFactoryImplementor
> factory) throws HibernateException {
> if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl)
> target)) {
> if (log.isDebugEnabled()) {
> log.debug("Dynamic elist, set using the esettings");
> }
> Object currentValue =
> EcoreAccess.getManyEFeatureValue(eFeature, (BasicEObjectImpl) target);
>
> if (isEStoreList(currentValue)) {
> final EStore eStore = ((InternalEObject) target).eStore();
> if (eStore.size((InternalEObject) target, eFeature) !=
> -1) {
> currentValue = eStore.get((InternalEObject) target,
> eFeature, EStore.NO_INDEX);
> }
> }
>
> // if currentvalue is not null then use the passed value
> if (currentValue != null && currentValue instanceof
> PersistableEList) {
> ((PersistableEList) currentValue).replaceDelegate((List)
> value);
> } else {
> EcoreAccess.setManyEFeatureValue(eFeature,
> createPersistableList((InternalEObject) target, eFeature,
> (List) value), (BasicEObjectImpl) target);
> }


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org

--------------050106040708020105080405
Content-Type: text/x-java;
name="EListPropertyHandler.java"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="EListPropertyHandler.java"

LyoqCiAqIDxjb3B5cmlnaHQ+IENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwg MjAwNywgMjAw
OCBTcHJpbmdzaXRlIEJWIChUaGUgTmV0aGVybGFuZHMpIGFuZCBvdGhlcnMg QWxsIHJpZ2h0
cwogKiByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55 aW5nIG1hdGVy
aWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZQogKiBFY2xp
cHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhp cyBkaXN0cmli
dXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xp cHNlLm9yZy9s
ZWdhbC9lcGwtdjEwLmh0bWwgQ29udHJpYnV0b3JzOiBNYXJ0aW4gVGFhbCA8 L2NvcHlyaWdo
dD4gJElkOgogKiBFTGlzdFByb3BlcnR5SGFuZGxlci5qYXZhLHYgMS4xMiAy MDA3LzAzLzIw
IDIzOjMzOjQ4IG10YWFsIEV4cCAkCiAqLwoKcGFja2FnZSBvcmcuZWNsaXBz ZS5lbWYudGVu
ZW8uaGliZXJuYXRlLm1hcHBpbmcucHJvcGVydHk7CgppbXBvcnQgamF2YS5s YW5nLnJlZmxl
Y3QuRmllbGQ7CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Cmlt cG9ydCBqYXZh
LnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9y dCBqYXZhLnV0
aWwuTWFwOwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxv ZzsKaW1wb3J0
IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CmltcG9y dCBvcmcuZWNs
aXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBz ZS5lbWYuY29t
bW9uLnV0aWwuRU1hcDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5F T2JqZWN0Owpp
bXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CmltcG9y dCBvcmcuZWNs
aXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwppbXBvcnQgb3Jn LmVjbGlwc2Uu
ZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNl LmVtZi5lY29y
ZS5JbnRlcm5hbEVPYmplY3QuRVN0b3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uu ZW1mLmVjb3Jl
LmltcGwuQmFzaWNFT2JqZWN0SW1wbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVt Zi5lY29yZS5p
bXBsLkVTdG9yZUVPYmplY3RJbXBsLkVTdG9yZUVMaXN0OwppbXBvcnQgb3Jn LmVjbGlwc2Uu
ZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwppbXBvcnQgb3JnLmVj bGlwc2UuZW1m
LmVjb3JlLnV0aWwuRWNvcmVFTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1m LnRlbmVvLmV4
dGVuc2lvbi5FeHRlbnNpb25NYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uu ZW1mLnRlbmVv
LmV4dGVuc2lvbi5FeHRlbnNpb25NYW5hZ2VyQXdhcmU7CmltcG9ydCBvcmcu ZWNsaXBzZS5l
bWYudGVuZW8uZXh0ZW5zaW9uLkV4dGVuc2lvblBvaW50OwppbXBvcnQgb3Jn LmVjbGlwc2Uu
ZW1mLnRlbmVvLmhpYmVybmF0ZS5IYk1hcHBlckV4Y2VwdGlvbjsKaW1wb3J0 IG9yZy5lY2xp
cHNlLmVtZi50ZW5lby5oaWJlcm5hdGUubWFwcGluZy5lbGlzdC5IYkV4dHJh TGF6eVBlcnNp
c3RhYmxlRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudGVuZW8uaGli ZXJuYXRlLm1h
cHBpbmcuZWxpc3QuSGliZXJuYXRlUGVyc2lzdGFibGVFTGlzdDsKaW1wb3J0 IG9yZy5lY2xp
cHNlLmVtZi50ZW5lby5oaWJlcm5hdGUubWFwcGluZy5lbGlzdC5IaWJlcm5h dGVQZXJzaXN0
YWJsZUVNYXA7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudGVuZW8uaGliZXJu YXRlLm1hcHBp
bmcuZWxpc3QuTWFwSGliZXJuYXRlUGVyc2lzdGFibGVFTWFwOwppbXBvcnQg b3JnLmVjbGlw
c2UuZW1mLnRlbmVvLm1hcHBpbmcuZWxpc3QuTWFwUGVyc2lzdGFibGVFTWFw OwppbXBvcnQg
b3JnLmVjbGlwc2UuZW1mLnRlbmVvLm1hcHBpbmcuZWxpc3QuUGVyc2lzdGFi bGVEZWxlZ2F0
ZUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudGVuZW8ubWFwcGluZy5l bGlzdC5QZXJz
aXN0YWJsZUVMaXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRlbmVvLm1h cHBpbmcuZWxp
c3QuUGVyc2lzdGFibGVFTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRl bmVvLnV0aWwu
QXNzZXJ0VXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50ZW5lby51dGls LkZpZWxkVXRp
bDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50ZW5lby51dGlsLlN0b3JlVXRp bDsKaW1wb3J0
IG9yZy5oaWJlcm5hdGUuSGliZXJuYXRlRXhjZXB0aW9uOwppbXBvcnQgb3Jn LmhpYmVybmF0
ZS5Qcm9wZXJ0eU5vdEZvdW5kRXhjZXB0aW9uOwppbXBvcnQgb3JnLmhpYmVy bmF0ZS5lbmdp
bmUuU2Vzc2lvbkZhY3RvcnlJbXBsZW1lbnRvcjsKaW1wb3J0IG9yZy5oaWJl cm5hdGUuZW5n
aW5lLlNlc3Npb25JbXBsZW1lbnRvcjsKaW1wb3J0IG9yZy5oaWJlcm5hdGUu cHJvcGVydHku
R2V0dGVyOwppbXBvcnQgb3JnLmhpYmVybmF0ZS5wcm9wZXJ0eS5Qcm9wZXJ0 eUFjY2Vzc29y
OwppbXBvcnQgb3JnLmhpYmVybmF0ZS5wcm9wZXJ0eS5TZXR0ZXI7CgovKioK ICogSW1wbGVt
ZW50cyB0aGUgYWNjZXNzb3IgZm9yIEVNRiBFTGlzdCBtZW1iZXJzIGZvciBI aWJlcm5hdGUu
IFRoaXMgY2FuIGJlIGFuIEVSZWZlcmVuY2Ugb3IgYW4KICogRWF0dHJpYnV0 ZSB3aXRoIG1h
bnk9dHJ1ZS4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGdldHRl ciwgc2V0dGVy
IGFuZCBwcm9wZXJ0eWFjY2Vzc29yCiAqIGludGVyZmFjZXMuIFdoZW4gdGhl IGdldEdldHRl
ciBhbmQgZ2V0U2V0dGVyIG1ldGhvZHMgYXJlIGNhbGxlZCBpdCByZXR1cm5z IGl0c2VsZi4K
ICogCiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm10YWFsQGVsdmVyLm9y ZyI+TWFydGlu
IFRhYWw8L2E+CiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yNSAkCiAqLwpA U3VwcHJlc3NX
YXJuaW5ncygidW5jaGVja2VkIikKcHVibGljIGNsYXNzIEVMaXN0UHJvcGVy dHlIYW5kbGVy
IGltcGxlbWVudHMgR2V0dGVyLCBTZXR0ZXIsIFByb3BlcnR5QWNjZXNzb3Is IEV4dGVuc2lv
blBvaW50LCBFeHRlbnNpb25NYW5hZ2VyQXdhcmUgewoJLyoqCgkgKiBHZW5l cmF0ZWQgU2Vy
aWFsIFZlcnNpb24gSUQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9u ZyBzZXJpYWxW
ZXJzaW9uVUlEID0gMjI1NTEwODI0NjA5Mzk1MTM0MUw7CgoJLyoqIFRoZSBs b2dnZXIgKi8K
CXByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhF TGlzdFByb3Bl
cnR5SGFuZGxlci5jbGFzcyk7CgoJLyoqIFRoZSBFU3RydWN0dXJhbEZlYXR1 cmUgb2YgdGhp
cyBhY2Nlc3NvciAqLwoJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBl RmVhdHVyZTsK
CgkvKiogRXh0cmEgbGF6eSBiZWhhdmlvciEgKi8KCXByaXZhdGUgYm9vbGVh biBleHRyYUxh
enk7CgoJLyoqIE1hcCBlbWFwIGFzIGEgcmVhbCBtYXAgKi8KCXByaXZhdGUg Ym9vbGVhbiBu
ZXdFTWFwTWFwcGluZzsKCgkvKiogSXQgdGhpcyBhIG1hcCAqLwoJcHJpdmF0 ZSBib29sZWFu
IGlzQU1hcDsKCgkvKiogVGhlIGV4dGVuc2lvbiBtYW5hZ2VyICovCglwcml2 YXRlIEV4dGVu
c2lvbk1hbmFnZXIgZXh0ZW5zaW9uTWFuYWdlcjsKCgkvKiogSW5pdGlhbGl6 ZSB0aGlzIGlu
c3RhbmNlICovCglwdWJsaWMgdm9pZCBpbml0aWFsaXplKEVTdHJ1Y3R1cmFs RmVhdHVyZSBl
RmVhdHVyZSwgYm9vbGVhbiBleHRyYUxhenksIGJvb2xlYW4gbmV3RU1hcE1h cHBpbmcpIHsK
CQl0aGlzLmV4dHJhTGF6eSA9IGV4dHJhTGF6eTsKCQl0aGlzLmVGZWF0dXJl ID0gZUZlYXR1
cmU7CgkJbG9nLmRlYnVnKCJDcmVhdGVkIGdldHRlci9zZXR0ZXIgZm9yICIg KyBTdG9yZVV0
aWwudG9TdHJpbmcoZUZlYXR1cmUpKTsKCQlBc3NlcnRVdGlsLmFzc2VydFRy dWUoIk1hbnkg
bXVzdCBiZSB0cnVlIGJ1dCB0aGlzIGlzbid0IHRoZSBjYXNlIGZvciAiICsg U3RvcmVVdGls
LnRvU3RyaW5nKGVGZWF0dXJlKSwgZUZlYXR1cmUKCQkJLmlzTWFueSgpKTsK CQlpc0FNYXAg
PSBTdG9yZVV0aWwuaXNNYXAoZUZlYXR1cmUpOwoJCXRoaXMubmV3RU1hcE1h cHBpbmcgPSBu
ZXdFTWFwTWFwcGluZzsKCX0KCglwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJl IGdldEVGZWF0
dXJlKCkgewoJCXJldHVybiBlRmVhdHVyZTsKCX0KCgkvKgoJICogKG5vbi1K YXZhZG9jKQoJ
ICogCgkgKiBAc2VlIG9yZy5oaWJlcm5hdGUucHJvcGVydHkuUHJvcGVydHlB Y2Nlc3NvciNn
ZXRHZXR0ZXIoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nKQoJ ICovCglwdWJs
aWMgR2V0dGVyIGdldEdldHRlcihDbGFzcyB0aGVDbGFzcywgU3RyaW5nIHBy b3BlcnR5TmFt
ZSkgdGhyb3dzIFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gewoJCXJldHVy biB0aGlzOwoJ
fQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiAKCSAqIEBzZWUgb3JnLmhp YmVybmF0ZS5w
cm9wZXJ0eS5Qcm9wZXJ0eUFjY2Vzc29yI2dldFNldHRlcihqYXZhLmxhbmcu Q2xhc3MsIGph
dmEubGFuZy5TdHJpbmcpCgkgKi8KCXB1YmxpYyBTZXR0ZXIgZ2V0U2V0dGVy KENsYXNzIHRo
ZUNsYXNzLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgUHJvcGVydHlO b3RGb3VuZEV4
Y2VwdGlvbiB7CgkJcmV0dXJuIHRoaXM7Cgl9CgoJLyoKCSAqIChub24tSmF2 YWRvYykKCSAq
IAoJICogQHNlZSBvcmcuaGliZXJuYXRlLnByb3BlcnR5LkdldHRlciNnZXQo amF2YS5sYW5n
Lk9iamVjdCkKCSAqLwoJcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IG93bmVy KSB0aHJvd3Mg
SGliZXJuYXRlRXhjZXB0aW9uIHsKCQlPYmplY3Qgb2JqID0gKChFT2JqZWN0 KSBvd25lciku
ZUdldChlRmVhdHVyZSk7CgoJCWlmIChpc0VTdG9yZUxpc3Qob2JqKSkgewoJ CQlmaW5hbCBF
U3RvcmUgZVN0b3JlID0gKChJbnRlcm5hbEVPYmplY3QpIG93bmVyKS5lU3Rv cmUoKTsKCQkJ
Ly8gdGhlIGNhbGwgdG8gc2l6ZSBmb3JjZXMgYSBsb2FkLCB0aGlzIGlzIGEg dHJpY2sgdG8K
CQkJLy8gZm9yY2UgdGhlIGVzdG9yZSB0byBjcmVhdGUgYSBsaXN0LCBvdGhl cndpc2UgdGhl
IC5nZXQKCQkJLy8gd2lsbCByZXR1cm4gYSBudWxsIHZhbHVlLgoJCQlpZiAo ZVN0b3JlLnNp
emUoKEludGVybmFsRU9iamVjdCkgb3duZXIsIGVGZWF0dXJlKSAhPSAtMSkg ewoJCQkJb2Jq
ID0gZVN0b3JlLmdldCgoSW50ZXJuYWxFT2JqZWN0KSBvd25lciwgZUZlYXR1 cmUsIEVTdG9y
ZS5OT19JTkRFWCk7CgkJCX0KCQl9CgoJCWlmIChvYmogaW5zdGFuY2VvZiBF Y29yZUVNYXAg
JiYgbmV3RU1hcE1hcHBpbmcpIHsKCQkJcmV0dXJuICgoRWNvcmVFTWFwPD8s ID8+KSBvYmop
Lm1hcCgpOwoJCX0KCQlpZiAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGFibGVE ZWxlZ2F0ZUxp
c3QpIHsKCQkJcmV0dXJuICgoUGVyc2lzdGFibGVEZWxlZ2F0ZUxpc3QpIG9i aikuZ2V0RGVs
ZWdhdGUoKTsKCQl9CgkJaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2ljRmVhdHVy ZU1hcCkgeyAv
LyB0aGlzIG9uZSBpcyByZXBsYWNlZCBoZXJlIGJlY2F1c2UgdGhlIGVudHJp ZXMKCQkJLy8g
bmVlZCB0byBiZSBjaGFuZ2VkIHRvIGhpYmVybmF0ZSBlbnRyaWVzCgkJCWZp bmFsIFBlcnNp
c3RhYmxlRGVsZWdhdGVMaXN0IHBlbGlzdCA9CgkJCQkJKFBlcnNpc3RhYmxl RGVsZWdhdGVM
aXN0KSBjcmVhdGVQZXJzaXN0YWJsZUxpc3QoKEludGVybmFsRU9iamVjdCkg b3duZXIsIGVG
ZWF0dXJlLCAoTGlzdCkgb2JqKTsKCQkJZmluYWwgRU9iamVjdCBlb2JqID0g KEVPYmplY3Qp
IG93bmVyOwoJCQlpZiAoIUVjb3JlQWNjZXNzLmlzU3RhdGljRmVhdHVyZShl RmVhdHVyZSwg
KEJhc2ljRU9iamVjdEltcGwpIGVvYmopKSB7CgkJCQlpZiAobG9nLmlzRGVi dWdFbmFibGVk
KCkpIHsKCQkJCQlsb2cuZGVidWcoIkR5bmFtaWMgZWxpc3QsIHNldCB1c2lu ZyB0aGUgZXNl
dHRpbmdzIik7CgkJCQl9CgkJCQlFY29yZUFjY2Vzcy5zZXRNYW55RUZlYXR1 cmVWYWx1ZShl
RmVhdHVyZSwgcGVsaXN0LCAoQmFzaWNFT2JqZWN0SW1wbCkgb3duZXIpOwoJ CQl9IGVsc2Ug
ewoJCQkJLy8gVE9ETzogY3VycmVudGx5IGl0IGlzIHJlcXVpcmVkIHRvIHVz ZSB0aGUgZmll
bGQgc2V0dGVyCgkJCQkvLyBpbnN0ZWFkIG9mIHRoZSBlU2V0IG1ldGhvZAoJ CQkJLy8gYmVj
YXVzZSBFTUYgZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3Qgc2V0dGluZyBvZiB0 aGUgZWxpc3QK
CQkJCS8vIGZlYXR1cmUuCgkJCQkvLyBVUERBVEU6IGZvciBkeW5hbWljIGVj bGFzc2VzIG5v
dyBlbGlzdHMgYXJlIGFsc28gc3VwcG9ydGVkCgkJCQkvLyB0aGUgcmVhc29u IHRoYXQgdGhl
IGphdmFmaWVsZCBpcyBkZXRlcm1pbmVkIGhlcmUgYW5kIG5vdCBhdAoJCQkJ Ly8gY29uc3Ry
dWN0aW9uIHRpbWUKCQkJCS8vIGlzIHRoYXQgdGhlIG93bmVyIHBhc3NlZCBp biB0aGUgY29u
c3RydWN0aW9uIGNhbiBiZSBhbgoJCQkJLy8gaW50ZXJmYWNlIHdoaWxlIHRo ZXJlCgkJCQkv
LyBhcmUgbXVsdGlwbGUgaW1wbGVtZW50b3JzLiBGaWVsZFV0aWwgZG9lcyBj YWNoaW5nIG9m
CgkJCQkvLyBmaWVsZG5hbWVzIGFuZCBmaWVsZHMuCgkJCQlmaW5hbCBGaWVs ZCBqYXZhRmll
bGQgPSBGaWVsZFV0aWwuZ2V0RmllbGQob3duZXIuZ2V0Q2xhc3MoKSwgZ2V0 RmllbGROYW1l
KG93bmVyKSk7CgkJCQl0cnkgewoJCQkJCWphdmFGaWVsZC5zZXQob3duZXIs IHBlbGlzdCk7
CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCXRocm93IG5ldyBI Yk1hcHBlckV4
Y2VwdGlvbigiVGhlIGZpZWxkICIgKyBqYXZhRmllbGQuZ2V0TmFtZSgpICsg IiBjYW4gbm90
IGJlIHNldCB1c2luZyBvYmplY3QgIiArCgkJCQkJCQlwZWxpc3QuZ2V0Q2xh c3MoKS5nZXRO
YW1lKCkgKyAiIG9uIHRhcmdldCAiICsgb3duZXIuZ2V0Q2xhc3MoKS5nZXRO YW1lKCksIGUp
OwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBvYmo7Cgl9CgoJcHJvdGVjdGVk IGJvb2xlYW4g
aXNFU3RvcmVMaXN0KE9iamVjdCBvKSB7CgkJaWYgKG8gPT0gbnVsbCkgewoJ CQlyZXR1cm4g
ZmFsc2U7CgkJfQoJCWlmIChvIGluc3RhbmNlb2YgRVN0b3JlRUxpc3Q8Pz4p IHsKCQkJcmV0
dXJuIHRydWU7CgkJfQoJCS8vIHRoaXMgcmVhbGx5IHVnbHkgY2hlY2sgaXMg dG8gbWFrZSB0
aGlzIGNvZGUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBlbWYgMi4zCgkJ Ly8gdGhlIEJh
c2ljRVN0b3JlRUxpc3QgaXMgaW50cm9kdWNlZCBpbiBlbWYgMi4zCgkJaWYg KG8uZ2V0Q2xh
c3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKCJvcmcuZWNsaXBzZS5lbWYuZWNv cmUuaW1wbC5F
U3RvcmVFT2JqZWN0SW1wbC5CYXNpY0VTdG9yZUVMaXN0IikgPT0gMCkgewoJ CQlyZXR1cm4g
dHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXByb3RlY3RlZCBTdHJp bmcgZ2V0Rmll
bGROYW1lKE9iamVjdCBvd25lcikgewoJCXJldHVybiBlRmVhdHVyZS5nZXRO YW1lKCk7Cgl9
CgoJLyoKCSAqIChub24tSmF2YWRvYykKCSAqIAoJICogQHNlZSBvcmcuaGli ZXJuYXRlLnBy
b3BlcnR5LkdldHRlciNnZXRGb3JJbnNlcnQoamF2YS5sYW5nLk9iamVjdCwg amF2YS51dGls
Lk1hcCwKCSAqICAgICAgb3JnLmhpYmVybmF0ZS5lbmdpbmUuU2Vzc2lvbklt cGxlbWVudG9y
KQoJICovCglwdWJsaWMgT2JqZWN0IGdldEZvckluc2VydChPYmplY3Qgb3du ZXIsIE1hcCBt
ZXJnZU1hcCwgU2Vzc2lvbkltcGxlbWVudG9yIHNlc3Npb24pIHRocm93cyBI aWJlcm5hdGVF
eGNlcHRpb24gewoJCU9iamVjdCBvYmogPSAoKEVPYmplY3QpIG93bmVyKS5l R2V0KGVGZWF0
dXJlKTsKCgkJaWYgKGlzRVN0b3JlTGlzdChvYmopKSB7CgkJCWZpbmFsIEVT dG9yZSBlU3Rv
cmUgPSAoKEludGVybmFsRU9iamVjdCkgb3duZXIpLmVTdG9yZSgpOwoJCQkv LyB0aGUgY2Fs
bCB0byBzaXplIGZvcmNlcyBhIGxvYWQsIHRoaXMgaXMgYSB0cmljayB0bwoJ CQkvLyBmb3Jj
ZSB0aGUgZXN0b3JlIHRvIGNyZWF0ZSBhIGxpc3QsIG90aGVyd2lzZSB0aGUg LmdldAoJCQkv
LyB3aWxsIHJldHVybiBhIG51bGwgdmFsdWUuCgkJCWlmIChlU3RvcmUuc2l6 ZSgoSW50ZXJu
YWxFT2JqZWN0KSBvd25lciwgZUZlYXR1cmUpICE9IC0xKSB7CgkJCQlvYmog PSBlU3RvcmUu
Z2V0KChJbnRlcm5hbEVPYmplY3QpIG93bmVyLCBlRmVhdHVyZSwgRVN0b3Jl Lk5PX0lOREVY
KTsKCQkJfQoJCX0KCgkJaWYgKG9iaiBpbnN0YW5jZW9mIFBlcnNpc3RhYmxl RGVsZWdhdGVM
aXN0KSB7CgkJCXJldHVybiAoKFBlcnNpc3RhYmxlRGVsZWdhdGVMaXN0KSBv YmopLmdldERl
bGVnYXRlKCk7CgkJfQoJCWlmIChvYmogaW5zdGFuY2VvZiBFY29yZUVNYXAg JiYgbmV3RU1h
cE1hcHBpbmcpIHsKCQkJcmV0dXJuICgoRWNvcmVFTWFwPD8sID8+KSBvYmop Lm1hcCgpOwoJ
CX0KCgkJLy8gaWYgdGhpcyBpcyBhIGVsaXN0IHRoZW4gZ2l2ZSBhIG5vcm1h bCBhcnJheWxp
c3QgdG8KCQkvLyBoaWJlcm5hdGUgb3RoZXJ3aXNlIGhiIHdpbGwgd3JhcCB0 aGUgZWxpc3Qs
IHRoZSBoYiB3cmFwcGVyCgkJLy8gaXMgYWdhaW4gd3JhcHBlZCBieSB0ZW5l byByZXN1bHRp
bmcgaW4gbm90aWZpY2F0aW9ucyBiZWluZyBzZW5kCgkJLy8gb3V0IGJ5IGJv dGggdGhlIHRl
bmVvIHdyYXBwZXIgYXMgdGhlIHdyYXBwZWQgZWxpc3QKCQlpZiAob2JqIGlu c3RhbmNlb2Yg
RUxpc3Q8Pz4pIHsKCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKExpc3QpIG9i aik7CgkJfQoK
CQkvLyB0b2RvIG1heWJlIHRocm93IGVycm9yIGluIGFsbCBvdGhlciBjYXNl cz8KCQlyZXR1
cm4gb2JqOwoJfQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiAKCSAqIEBz ZWUgb3JnLmhp
YmVybmF0ZS5wcm9wZXJ0eS5HZXR0ZXIjZ2V0TWV0aG9kKCkKCSAqLwoJcHVi bGljIE1ldGhv
ZCBnZXRNZXRob2QoKSB7CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoKCSAqIChu b24tSmF2YWRv
YykKCSAqIAoJICogQHNlZSBvcmcuaGliZXJuYXRlLnByb3BlcnR5LkdldHRl ciNnZXRNZXRo
b2ROYW1lKCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkg ewoJCXJldHVy
biBudWxsOwoJfQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiAKCSAqIEBz ZWUgb3JnLmhp
YmVybmF0ZS5wcm9wZXJ0eS5HZXR0ZXIjZ2V0UmV0dXJuVHlwZSgpCgkgKi8K CXB1YmxpYyBD
bGFzcyBnZXRSZXR1cm5UeXBlKCkgewoJCXJldHVybiBFTGlzdC5jbGFzczsK CX0KCgkvKgoJ
ICogKG5vbi1KYXZhZG9jKQoJICogCgkgKiBAc2VlIG9yZy5oaWJlcm5hdGUu cHJvcGVydHku
U2V0dGVyI3NldChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0 LAoJICogICAg
ICBvcmcuaGliZXJuYXRlLmVuZ2luZS5TZXNzaW9uRmFjdG9yeUltcGxlbWVu dG9yKQoJICov
CglwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHZhbHVl LCBTZXNzaW9u
RmFjdG9yeUltcGxlbWVudG9yIGZhY3RvcnkpIHRocm93cyBIaWJlcm5hdGVF eGNlcHRpb24g
ewoJCWlmICghRWNvcmVBY2Nlc3MuaXNTdGF0aWNGZWF0dXJlKGVGZWF0dXJl LCAoQmFzaWNF
T2JqZWN0SW1wbCkgdGFyZ2V0KSkgewoJCQlpZiAobG9nLmlzRGVidWdFbmFi bGVkKCkpIHsK
CQkJCWxvZy5kZWJ1ZygiRHluYW1pYyBlbGlzdCwgc2V0IHVzaW5nIHRoZSBl c2V0dGluZ3Mi
KTsKCQkJfQoJCQlPYmplY3QgY3VycmVudFZhbHVlID0gRWNvcmVBY2Nlc3Mu Z2V0TWFueUVG
ZWF0dXJlVmFsdWUoZUZlYXR1cmUsIChCYXNpY0VPYmplY3RJbXBsKSB0YXJn ZXQpOwoKCQkJ
aWYgKGlzRVN0b3JlTGlzdChjdXJyZW50VmFsdWUpKSB7CgkJCQlmaW5hbCBF U3RvcmUgZVN0
b3JlID0gKChJbnRlcm5hbEVPYmplY3QpIHRhcmdldCkuZVN0b3JlKCk7CgkJ CQlpZiAoZVN0
b3JlLnNpemUoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0LCBlRmVhdHVyZSkg IT0gLTEpIHsK
CQkJCQljdXJyZW50VmFsdWUgPSBlU3RvcmUuZ2V0KChJbnRlcm5hbEVPYmpl Y3QpIHRhcmdl
dCwgZUZlYXR1cmUsIEVTdG9yZS5OT19JTkRFWCk7CgkJCQl9CgkJCX0KCgkJ CS8vIGlmIGN1
cnJlbnR2YWx1ZSBpcyBub3QgbnVsbCB0aGVuIHVzZSB0aGUgcGFzc2VkIHZh bHVlCgkJCWlm
IChjdXJyZW50VmFsdWUgIT0gbnVsbCAmJiBjdXJyZW50VmFsdWUgaW5zdGFu Y2VvZiBQZXJz
aXN0YWJsZUVMaXN0KSB7CgkJCQkoKFBlcnNpc3RhYmxlRUxpc3QpIGN1cnJl bnRWYWx1ZSku
cmVwbGFjZURlbGVnYXRlKChMaXN0KSB2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJ CQlpZiAodmFs
dWUgaW5zdGFuY2VvZiBNYXApIHsKCQkJCQlFY29yZUFjY2Vzcy5zZXRNYW55 RUZlYXR1cmVW
YWx1ZShlRmVhdHVyZSwgY3JlYXRlUGVyc2lzdGFibGVNYXAoKEludGVybmFs RU9iamVjdCkg
dGFyZ2V0LCBlRmVhdHVyZSwKCQkJCQkJKE1hcCkgdmFsdWUpLCAoQmFzaWNF T2JqZWN0SW1w
bCkgdGFyZ2V0KTsKCQkJCX0gZWxzZSB7CgkJCQkJRWNvcmVBY2Nlc3Muc2V0 TWFueUVGZWF0
dXJlVmFsdWUoZUZlYXR1cmUsIGNyZWF0ZVBlcnNpc3RhYmxlTGlzdCgoSW50 ZXJuYWxFT2Jq
ZWN0KSB0YXJnZXQsCgkJCQkJCWVGZWF0dXJlLCAoTGlzdCkgdmFsdWUpLCAo QmFzaWNFT2Jq
ZWN0SW1wbCkgdGFyZ2V0KTsKCQkJCX0KCQkJfQoJCQlpZiAobG9nLmlzRGVi dWdFbmFibGVk
KCkpIHsKCQkJCWxvZy5kZWJ1ZygiU2V0IHZhbHVlICIgKyB2YWx1ZS5nZXRD bGFzcygpLmdl
dE5hbWUoKSArICIgZm9yIHRhcmdldCAiICsgdGFyZ2V0LmdldENsYXNzKCku Z2V0TmFtZSgp
ICsKCQkJCQkJIiBmaWVsZCAiICsgZ2V0RmllbGROYW1lKHRhcmdldCkpOwoJ CQl9CgoJCX0g
ZWxzZSB7CgkJCS8vIHRoZSByZWFzb24gdGhhdCB0aGUgamF2YWZpZWxkIGlz IGRldGVybWlu
ZWQgaGVyZSBhbmQgbm90IGF0CgkJCS8vIGNvbnN0cnVjdGlvbiB0aW1lCgkJ CS8vIGlzIHRo
YXQgdGhlIG93bmVyIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0aW9uIGNhbiBi ZSBhbiBpbnRl
cmZhY2UKCQkJLy8gd2hpbGUgdGhlcmUKCQkJLy8gYXJlIG11bHRpcGxlIGlt cGxlbWVudG9y
cy4gRmllbGRVdGlsIGRvZXMgY2FjaGluZyBvZiBmaWVsZG5hbWVzCgkJCS8v IGFuZCBmaWVs
ZHMuCgkJCWZpbmFsIEZpZWxkIGphdmFGaWVsZCA9IEZpZWxkVXRpbC5nZXRG aWVsZCh0YXJn
ZXQuZ2V0Q2xhc3MoKSwgZ2V0RmllbGROYW1lKHRhcmdldCkpOwoKCQkJdHJ5 IHsKCQkJCWZp
bmFsIE9iamVjdCBjdXJyZW50VmFsdWUgPSBqYXZhRmllbGQuZ2V0KHRhcmdl dCk7CgoJCQkJ
Ly8gaWYgYWxyZWFkeSBzZXQgdGhlbiBpZ25vcmUgaXQKCQkJCWlmIChjdXJy ZW50VmFsdWUg
PT0gdmFsdWUpIHsKCQkJCQlyZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8gaGVy ZQoJCQkJfQoK
CQkJCS8vIHRoZSBkZWxlZ2F0aW5nIG1hcCB3YXMgcGFzc2VkIHRvIGhpYmVy bmF0ZSwgbm93
IGdldHRpbmcgaXQgYmFjawoJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU1h cC5JbnRlcm5h
bE1hcFZpZXc8PywgPz4gJiYKCQkJCQkJKGN1cnJlbnRWYWx1ZSA9PSAoKEVN YXAuSW50ZXJu
YWxNYXBWaWV3PD8sID8+KSB2YWx1ZSkuZU1hcCgpKSkgewoJCQkJCXJldHVy bjsKCQkJCX0K
CgkJCQkvLyBhbHJlYWR5IGhhbmRsZWQKCQkJCWlmIChjdXJyZW50VmFsdWUg aW5zdGFuY2Vv
ZiBQZXJzaXN0YWJsZURlbGVnYXRlTGlzdDw/PiAmJgoJCQkJCQl2YWx1ZSA9 PSAoKFBlcnNp
c3RhYmxlRGVsZWdhdGVMaXN0PD8+KSBjdXJyZW50VmFsdWUpLmdldERlbGVn YXRlKCkpIHsK
CQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJLy8gdGhlIGZvbGxvdyAzIGlmIHN0 YXRlbWVudHMg
aGFuZGxlIHRoZSByZWZyZXNoIGFjdGlvbiwgdGhlIHVuZGVybHlpbmcgb3Jt CgkJCQkvLyBj
b2xsZWN0aW9uIGlzIHJlcGxhY2VkCgkJCQlpZiAoY3VycmVudFZhbHVlICE9 IG51bGwgJiYg
Y3VycmVudFZhbHVlIGluc3RhbmNlb2YgUGVyc2lzdGFibGVFTGlzdCAmJgoJ CQkJCQl2YWx1
ZSAhPSAoKFBlcnNpc3RhYmxlRUxpc3QpIGN1cnJlbnRWYWx1ZSkuZ2V0RGVs ZWdhdGUoKSkg
ewoJCQkJCSgoUGVyc2lzdGFibGVFTGlzdCkgY3VycmVudFZhbHVlKS5yZXBs YWNlRGVsZWdh
dGUoKExpc3QpIHZhbHVlKTsKCQkJCX0gZWxzZSBpZiAoY3VycmVudFZhbHVl ICE9IG51bGwg
JiYgY3VycmVudFZhbHVlIGluc3RhbmNlb2YgUGVyc2lzdGFibGVFTWFwICYm CgkJCQkJCXZh
bHVlICE9ICgoUGVyc2lzdGFibGVFTWFwKSBjdXJyZW50VmFsdWUpLmdldERl bGVnYXRlKCkp
IHsKCQkJCQkoKFBlcnNpc3RhYmxlRU1hcCkgY3VycmVudFZhbHVlKS5yZXBs YWNlRGVsZWdh
dGUodmFsdWUpOwoJCQkJfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgIT0gbnVs bCAmJiBjdXJy
ZW50VmFsdWUgaW5zdGFuY2VvZiBNYXBQZXJzaXN0YWJsZUVNYXAgJiYKCQkJ CQkJdmFsdWUg
IT0gKChNYXBQZXJzaXN0YWJsZUVNYXApIGN1cnJlbnRWYWx1ZSkuZ2V0T1JN TWFwRGVsZWdh
dGUoKSkgewoJCQkJCSgoUGVyc2lzdGFibGVFTWFwKSBjdXJyZW50VmFsdWUp LnJlcGxhY2VE
ZWxlZ2F0ZSh2YWx1ZSk7CgkJCQl9IGVsc2UgeyAvLyB0aGVuIHdyYXAgdGhl IGhpYmVybmF0
ZSBjb2xsZWN0aW9uCgkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7 CgkJCQkJCWph
dmFGaWVsZC5zZXQodGFyZ2V0LCBjcmVhdGVQZXJzaXN0YWJsZU1hcCgoSW50 ZXJuYWxFT2Jq
ZWN0KSB0YXJnZXQsIGVGZWF0dXJlLCAoTWFwKSB2YWx1ZSkpOwoJCQkJCX0g ZWxzZSB7CgkJ
CQkJCWphdmFGaWVsZC5zZXQodGFyZ2V0LCBjcmVhdGVQZXJzaXN0YWJsZUxp c3QoKEludGVy
bmFsRU9iamVjdCkgdGFyZ2V0LCBlRmVhdHVyZSwgKExpc3QpIHZhbHVlKSk7 CgkJCQkJfQoJ
CQkJfQoJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CgkJCQkJbG9n LmRlYnVnKCJT
ZXQgdmFsdWUgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBm b3IgdGFyZ2V0
ICIgKyB0YXJnZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwoJCQkJCQkJIiBm aWVsZCAiICsg
Z2V0RmllbGROYW1lKHRhcmdldCkpOwoJCQkJfQoJCQl9IGNhdGNoIChFeGNl cHRpb24gZSkg
ewoJCQkJdGhyb3cgbmV3IEhiTWFwcGVyRXhjZXB0aW9uKCJUaGUgZmllbGQg IiArCgkJCQkJ
CShqYXZhRmllbGQgIT0gbnVsbCA/IGphdmFGaWVsZC5nZXROYW1lKCkgOiBn ZXRGaWVsZE5h
bWUodGFyZ2V0KSkgKwoJCQkJCQkiIGNhbiBub3QgYmUgc2V0IHVzaW5nIG9i amVjdCAiICsg
dmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIG9uIHRhcmdldCAiICsK CQkJCQkJdGFy
Z2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpLCBlKTsKCQkJfQoJCX0KCX0KCgkv KioKCSAqIENy
ZWF0ZSBhIEVNYXAuIENyZWF0ZSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4K CSAqLwoJcHJv
dGVjdGVkIEVMaXN0IGNyZWF0ZVBlcnNpc3RhYmxlTWFwKEludGVybmFsRU9i amVjdCB0YXJn
ZXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlc3RydWN0LCBNYXAgbWFwKSB7CgkJ ZmluYWwgRVJl
ZmVyZW5jZSBlcmVmID0gKEVSZWZlcmVuY2UpIGVzdHJ1Y3Q7CgkJaWYgKGxv Zy5pc0RlYnVn
RW5hYmxlZCgpKSB7CgkJCWxvZy5kZWJ1ZygiRGV0ZWN0ZWQgRU1BUCBmb3Ig IiArIGVzdHJ1
Y3QuZ2V0TmFtZSgpKTsKCQl9CgkJYXNzZXJ0IChpc0FNYXApOwoJCWFzc2Vy dCAobmV3RU1h
cE1hcHBpbmcpOwoJCXJldHVybiBnZXRFeHRlbnNpb25NYW5hZ2VyKCkKCQkJ LmdldEV4dGVu
c2lvbihNYXBIaWJlcm5hdGVQZXJzaXN0YWJsZUVNYXAuY2xhc3MsIG5ldyBP YmplY3RbXSB7
IHRhcmdldCwgZXJlZiwgbWFwIH0pOwoJfQoKCS8qKiBDcmVhdGVzIGEgcGVy c2lzdGFibGVt
YXAgb3IgbGlzdCAqLwoJcHJvdGVjdGVkIEVMaXN0IGNyZWF0ZVBlcnNpc3Rh YmxlTGlzdChJ
bnRlcm5hbEVPYmplY3QgdGFyZ2V0LCBFU3RydWN0dXJhbEZlYXR1cmUgZXN0 cnVjdCwgTGlz
dCBsaXN0KSB7CgkJaWYgKGVzdHJ1Y3QgaW5zdGFuY2VvZiBFUmVmZXJlbmNl KSB7CgkJCWZp
bmFsIEVSZWZlcmVuY2UgZXJlZiA9IChFUmVmZXJlbmNlKSBlc3RydWN0OwoJ CQkvLyB0aGUg
dGVzdCBmb3IgZW1hcCBjaGVja3M6IHRoZSBlbnRyeSBjbGFzcyBtdXN0IGhh dmUgYQoJCQkv
LyBpbnN0YW5jZWNsYXNzOiBNYXAuRW50cnkKCQkJLy8gYW5kIHRoZSBlbnRy eSBjbGFzcyBt
dXN0IGhhdmUgdHdvIGVmZWF0dXJlcyB3aXRoIHRoZSBuYW1lIGtleSBhbmQK CQkJLy8gdmFs
dWUKCQkJaWYgKFN0b3JlVXRpbC5pc01hcChlc3RydWN0KSkgewoJCQkJaWYg KGxvZy5pc0Rl
YnVnRW5hYmxlZCgpKSB7CgkJCQkJbG9nLmRlYnVnKCJEZXRlY3RlZCBFTUFQ IGZvciAiICsg
ZXN0cnVjdC5nZXROYW1lKCkpOwoJCQkJfQoKCQkJCXJldHVybiBnZXRFeHRl bnNpb25NYW5h
Z2VyKCkuZ2V0RXh0ZW5zaW9uKEhpYmVybmF0ZVBlcnNpc3RhYmxlRU1hcC5j bGFzcywKCQkJ
CQluZXcgT2JqZWN0W10geyB0YXJnZXQsIGVyZWYsIGxpc3QgfSk7CgkJCX0K CQl9CgkJaWYg
KGV4dHJhTGF6eSkgewoJCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uTWFuYWdlcigp LmdldEV4dGVu
c2lvbihIYkV4dHJhTGF6eVBlcnNpc3RhYmxlRUxpc3QuY2xhc3MsCgkJCQlu ZXcgT2JqZWN0
W10geyB0YXJnZXQsIGVzdHJ1Y3QsIGxpc3QgfSk7CgkJfQoJCXJldHVybiBn ZXRFeHRlbnNp
b25NYW5hZ2VyKCkuZ2V0RXh0ZW5zaW9uKEhpYmVybmF0ZVBlcnNpc3RhYmxl RUxpc3QuY2xh
c3MsCgkJCW5ldyBPYmplY3RbXSB7IHRhcmdldCwgZXN0cnVjdCwgbGlzdCB9 KTsKCX0KCgkv
KioKCSAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbk1hbmFnZXIKCSAqLwoJcHVi bGljIEV4dGVu
c2lvbk1hbmFnZXIgZ2V0RXh0ZW5zaW9uTWFuYWdlcigpIHsKCQlyZXR1cm4g ZXh0ZW5zaW9u
TWFuYWdlcjsKCX0KCgkvKioKCSAqIEBwYXJhbSBleHRlbnNpb25NYW5hZ2Vy CgkgKiAgICAg
ICAgICAgIHRoZSBleHRlbnNpb25NYW5hZ2VyIHRvIHNldAoJICovCglwdWJs aWMgdm9pZCBz
ZXRFeHRlbnNpb25NYW5hZ2VyKEV4dGVuc2lvbk1hbmFnZXIgZXh0ZW5zaW9u TWFuYWdlcikg
ewoJCXRoaXMuZXh0ZW5zaW9uTWFuYWdlciA9IGV4dGVuc2lvbk1hbmFnZXI7 Cgl9Cn0=
--------------050106040708020105080405--
Re: [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=t [message #124999 is a reply to message #124751] Mon, 02 June 2008 19:10 Go to previous messageGo to next message
Francois is currently offline FrancoisFriend
Messages: 17
Registered: July 2009
Junior Member
Hi Martin,

Thanks, Your fix seems to have worked, I only had to change
MyGreatEListPropertyHandler so that it extends EListPropertyHandler.

I get this error at commit now, I think it is only a matter of
annotating my map with cascade="persist", I have yet to find how to
annotate the EReference in the ecore to allow that.

François


Caused by: org.hibernate.TransientObjectException: object references an
unsaved transient instance - save the transient instance before
flushing: Game.childMap -> NodeMapEntry
at
org.hibernate.engine.CascadingAction$9.noCascade(CascadingAc tion.java:353)
at org.hibernate.engine.Cascade.cascade(Cascade.java:139)
at
org.hibernate.event.def.AbstractFlushingEventListener.cascad eOnFlush(AbstractFlushingEventListener.java:131)
at
org.hibernate.event.def.AbstractFlushingEventListener.prepar eEntityFlushes(AbstractFlushingEventListener.java:122)
at
org.hibernate.event.def.AbstractFlushingEventListener.flushE verythingToExecutions(AbstractFlushingEventListener.java:65)
at
org.hibernate.event.def.DefaultFlushEventListener.onFlush(De faultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java :338)
at
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransac tion.java:106)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.jav a:54)
... 12 more

Martin Taal wrote:
> Hi Francois,
> Thanks for the testcase it helped to reproduce this.
>
> It showed that there is a bug which causes this. This bug becomes
> visible because the model classes are generated with dynamic efeatures
> (to support cdo). The Teneo code handling dynamic EMF could not handle
> real maps yet. I have changed this. I have changed the
> EListPropertyHandler for this. I have attached the new
> EListPropertyHandler. You can put it in your own package somewhere and
> then call this code before dataStore.initialize():
>
> dataStore.getExtensionManager().registerExtension(EListPrope rtyHandler.class.getName(),
>
> MyGreatEListPropertyHandler.class.getName());
>
> whereby MyGreatEListPropertyHandler is the EListPropertyHandler which
> you saved in your packagetree somewhere.
>
> Can you let me know if it works for you?
>
> I need to do some more testing before I will commit the change to cvs.
> The bugfix will be in the next build which is this week.
>
> gr. Martin
>
> Francois wrote:
>> Whenever we persist an EMF object that contains a map
>> (java.util.Map$Entry) set with containement=true, we get a class cast
>> exception. The problem does not occurs is containement is set to false.
>>
>>
>> I am using emf 2.4 and teneo 0.8.0RC1A.
>> mapping.emap_as_true_map=true.
>> The entry in the map are a simple Key (EString) and value (a simple
>> EObject).
>>
>>
>>
>> java.lang.ClassCastException:
>> org.eclipse.emf.common.util.BasicEMap$DelegatingMap
>> at
>> org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
>>
>> at
>> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
>>
>> at
>> org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
>>
>> at
>> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
>>
>> at
>> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
>>
>> at
>> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
>>
>> at
>> org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
>>
>> at
>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
>>
>> at
>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
>>
>> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
>> at
>> org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)
>>
>>
>>
>>
>>
>> In EListPropertyHandler.java:286 we have the following line of code:
>> EcoreAccess.setManyEFeatureValue(eFeature,
>> createPersistableList(
>> (InternalEObject) target,
>> eFeature,
>> (List) value),
>> (BasicEObjectImpl) target);
>>
>> The cast of value (an BasicEMap) to a list is causing us the exception.
>>
>>
>> Here is the method in which it fails:
>>
>> public void set(Object target, Object value, SessionFactoryImplementor
>> factory) throws HibernateException {
>> if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl)
>> target)) {
>> if (log.isDebugEnabled()) {
>> log.debug("Dynamic elist, set using the esettings");
>> }
>> Object currentValue =
>> EcoreAccess.getManyEFeatureValue(eFeature, (BasicEObjectImpl) target);
>>
>> if (isEStoreList(currentValue)) {
>> final EStore eStore = ((InternalEObject)
>> target).eStore();
>> if (eStore.size((InternalEObject) target, eFeature) !=
>> -1) {
>> currentValue = eStore.get((InternalEObject)
>> target, eFeature, EStore.NO_INDEX);
>> }
>> }
>>
>> // if currentvalue is not null then use the passed value
>> if (currentValue != null && currentValue instanceof
>> PersistableEList) {
>> ((PersistableEList)
>> currentValue).replaceDelegate((List) value);
>> } else {
>> EcoreAccess.setManyEFeatureValue(eFeature,
>> createPersistableList((InternalEObject) target, eFeature,
>> (List) value), (BasicEObjectImpl) target);
>> }
>
>
Re: [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=t [message #125012 is a reply to message #124999] Mon, 02 June 2008 19:20 Go to previous message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
Hi François,
Yes setting cascade would handle this.

gr. Martin

François M. wrote:
> Hi Martin,
>
> Thanks, Your fix seems to have worked, I only had to change
> MyGreatEListPropertyHandler so that it extends EListPropertyHandler.
>
> I get this error at commit now, I think it is only a matter of
> annotating my map with cascade="persist", I have yet to find how to
> annotate the EReference in the ecore to allow that.
>
> François
>
>
> Caused by: org.hibernate.TransientObjectException: object references an
> unsaved transient instance - save the transient instance before
> flushing: Game.childMap -> NodeMapEntry
> at
> org.hibernate.engine.CascadingAction$9.noCascade(CascadingAc tion.java:353)
> at org.hibernate.engine.Cascade.cascade(Cascade.java:139)
> at
> org.hibernate.event.def.AbstractFlushingEventListener.cascad eOnFlush(AbstractFlushingEventListener.java:131)
>
> at
> org.hibernate.event.def.AbstractFlushingEventListener.prepar eEntityFlushes(AbstractFlushingEventListener.java:122)
>
> at
> org.hibernate.event.def.AbstractFlushingEventListener.flushE verythingToExecutions(AbstractFlushingEventListener.java:65)
>
> at
> org.hibernate.event.def.DefaultFlushEventListener.onFlush(De faultFlushEventListener.java:26)
>
> at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
> at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java :338)
> at
> org.hibernate.transaction.JDBCTransaction.commit(JDBCTransac tion.java:106)
> at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.jav a:54)
> ... 12 more
>
> Martin Taal wrote:
>> Hi Francois,
>> Thanks for the testcase it helped to reproduce this.
>>
>> It showed that there is a bug which causes this. This bug becomes
>> visible because the model classes are generated with dynamic efeatures
>> (to support cdo). The Teneo code handling dynamic EMF could not handle
>> real maps yet. I have changed this. I have changed the
>> EListPropertyHandler for this. I have attached the new
>> EListPropertyHandler. You can put it in your own package somewhere and
>> then call this code before dataStore.initialize():
>>
>> dataStore.getExtensionManager().registerExtension(EListPrope rtyHandler.class.getName(),
>>
>> MyGreatEListPropertyHandler.class.getName());
>>
>> whereby MyGreatEListPropertyHandler is the EListPropertyHandler which
>> you saved in your packagetree somewhere.
>>
>> Can you let me know if it works for you?
>>
>> I need to do some more testing before I will commit the change to cvs.
>> The bugfix will be in the next build which is this week.
>>
>> gr. Martin
>>
>> Francois wrote:
>>> Whenever we persist an EMF object that contains a map
>>> (java.util.Map$Entry) set with containement=true, we get a class cast
>>> exception. The problem does not occurs is containement is set to false.
>>>
>>>
>>> I am using emf 2.4 and teneo 0.8.0RC1A.
>>> mapping.emap_as_true_map=true.
>>> The entry in the map are a simple Key (EString) and value (a simple
>>> EObject).
>>>
>>>
>>>
>>> java.lang.ClassCastException:
>>> org.eclipse.emf.common.util.BasicEMap$DelegatingMap
>>> at
>>> org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
>>>
>>> at
>>> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
>>>
>>> at
>>> org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
>>>
>>> at
>>> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
>>>
>>> at
>>> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
>>>
>>> at
>>> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
>>>
>>> at
>>> org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
>>>
>>> at
>>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
>>>
>>> at
>>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
>>>
>>> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
>>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
>>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
>>> at
>>> org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)
>>>
>>>
>>>
>>>
>>>
>>> In EListPropertyHandler.java:286 we have the following line of code:
>>> EcoreAccess.setManyEFeatureValue(eFeature,
>>> createPersistableList(
>>> (InternalEObject) target,
>>> eFeature,
>>> (List) value),
>>> (BasicEObjectImpl) target);
>>>
>>> The cast of value (an BasicEMap) to a list is causing us the exception.
>>>
>>>
>>> Here is the method in which it fails:
>>>
>>> public void set(Object target, Object value,
>>> SessionFactoryImplementor factory) throws HibernateException {
>>> if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl)
>>> target)) {
>>> if (log.isDebugEnabled()) {
>>> log.debug("Dynamic elist, set using the esettings");
>>> }
>>> Object currentValue =
>>> EcoreAccess.getManyEFeatureValue(eFeature, (BasicEObjectImpl) target);
>>>
>>> if (isEStoreList(currentValue)) {
>>> final EStore eStore = ((InternalEObject)
>>> target).eStore();
>>> if (eStore.size((InternalEObject) target, eFeature)
>>> != -1) {
>>> currentValue = eStore.get((InternalEObject)
>>> target, eFeature, EStore.NO_INDEX);
>>> }
>>> }
>>>
>>> // if currentvalue is not null then use the passed value
>>> if (currentValue != null && currentValue instanceof
>>> PersistableEList) {
>>> ((PersistableEList)
>>> currentValue).replaceDelegate((List) value);
>>> } else {
>>> EcoreAccess.setManyEFeatureValue(eFeature,
>>> createPersistableList((InternalEObject) target, eFeature,
>>> (List) value), (BasicEObjectImpl) target);
>>> }
>>
>>


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
Re: [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=t [message #619132 is a reply to message #124323] Sun, 01 June 2008 20:51 Go to previous message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------050106040708020105080405
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Francois,
Thanks for the testcase it helped to reproduce this.

It showed that there is a bug which causes this. This bug becomes visible because the model classes
are generated with dynamic efeatures (to support cdo). The Teneo code handling dynamic EMF could not
handle real maps yet. I have changed this. I have changed the EListPropertyHandler for this. I have
attached the new EListPropertyHandler. You can put it in your own package somewhere and then call
this code before dataStore.initialize():

dataStore.getExtensionManager().registerExtension(EListPrope rtyHandler.class.getName(),
MyGreatEListPropertyHandler.class.getName());

whereby MyGreatEListPropertyHandler is the EListPropertyHandler which you saved in your packagetree
somewhere.

Can you let me know if it works for you?

I need to do some more testing before I will commit the change to cvs.
The bugfix will be in the next build which is this week.

gr. Martin

Francois wrote:
> Whenever we persist an EMF object that contains a map
> (java.util.Map$Entry) set with containement=true, we get a class cast
> exception. The problem does not occurs is containement is set to false.
>
>
> I am using emf 2.4 and teneo 0.8.0RC1A.
> mapping.emap_as_true_map=true.
> The entry in the map are a simple Key (EString) and value (a simple
> EObject).
>
>
>
> java.lang.ClassCastException:
> org.eclipse.emf.common.util.BasicEMap$DelegatingMap
> at
> org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
>
> at
> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
>
> at
> org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
>
> at
> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
>
> at
> org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
>
> at
> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
>
> at
> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
>
> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
> at
> org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)
>
>
>
>
>
> In EListPropertyHandler.java:286 we have the following line of code:
> EcoreAccess.setManyEFeatureValue(eFeature,
> createPersistableList(
> (InternalEObject) target,
> eFeature,
> (List) value),
> (BasicEObjectImpl) target);
>
> The cast of value (an BasicEMap) to a list is causing us the exception.
>
>
> Here is the method in which it fails:
>
> public void set(Object target, Object value, SessionFactoryImplementor
> factory) throws HibernateException {
> if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl)
> target)) {
> if (log.isDebugEnabled()) {
> log.debug("Dynamic elist, set using the esettings");
> }
> Object currentValue =
> EcoreAccess.getManyEFeatureValue(eFeature, (BasicEObjectImpl) target);
>
> if (isEStoreList(currentValue)) {
> final EStore eStore = ((InternalEObject) target).eStore();
> if (eStore.size((InternalEObject) target, eFeature) !=
> -1) {
> currentValue = eStore.get((InternalEObject) target,
> eFeature, EStore.NO_INDEX);
> }
> }
>
> // if currentvalue is not null then use the passed value
> if (currentValue != null && currentValue instanceof
> PersistableEList) {
> ((PersistableEList) currentValue).replaceDelegate((List)
> value);
> } else {
> EcoreAccess.setManyEFeatureValue(eFeature,
> createPersistableList((InternalEObject) target, eFeature,
> (List) value), (BasicEObjectImpl) target);
> }


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org

--------------050106040708020105080405
Content-Type: text/x-java;
name="EListPropertyHandler.java"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="EListPropertyHandler.java"

LyoqCiAqIDxjb3B5cmlnaHQ+IENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwg MjAwNywgMjAw
OCBTcHJpbmdzaXRlIEJWIChUaGUgTmV0aGVybGFuZHMpIGFuZCBvdGhlcnMg QWxsIHJpZ2h0
cwogKiByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55 aW5nIG1hdGVy
aWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZQogKiBFY2xp
cHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhp cyBkaXN0cmli
dXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xp cHNlLm9yZy9s
ZWdhbC9lcGwtdjEwLmh0bWwgQ29udHJpYnV0b3JzOiBNYXJ0aW4gVGFhbCA8 L2NvcHlyaWdo
dD4gJElkOgogKiBFTGlzdFByb3BlcnR5SGFuZGxlci5qYXZhLHYgMS4xMiAy MDA3LzAzLzIw
IDIzOjMzOjQ4IG10YWFsIEV4cCAkCiAqLwoKcGFja2FnZSBvcmcuZWNsaXBz ZS5lbWYudGVu
ZW8uaGliZXJuYXRlLm1hcHBpbmcucHJvcGVydHk7CgppbXBvcnQgamF2YS5s YW5nLnJlZmxl
Y3QuRmllbGQ7CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Cmlt cG9ydCBqYXZh
LnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9y dCBqYXZhLnV0
aWwuTWFwOwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxv ZzsKaW1wb3J0
IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CmltcG9y dCBvcmcuZWNs
aXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBz ZS5lbWYuY29t
bW9uLnV0aWwuRU1hcDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5F T2JqZWN0Owpp
bXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CmltcG9y dCBvcmcuZWNs
aXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwppbXBvcnQgb3Jn LmVjbGlwc2Uu
ZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNl LmVtZi5lY29y
ZS5JbnRlcm5hbEVPYmplY3QuRVN0b3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uu ZW1mLmVjb3Jl
LmltcGwuQmFzaWNFT2JqZWN0SW1wbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVt Zi5lY29yZS5p
bXBsLkVTdG9yZUVPYmplY3RJbXBsLkVTdG9yZUVMaXN0OwppbXBvcnQgb3Jn LmVjbGlwc2Uu
ZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwppbXBvcnQgb3JnLmVj bGlwc2UuZW1m
LmVjb3JlLnV0aWwuRWNvcmVFTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1m LnRlbmVvLmV4
dGVuc2lvbi5FeHRlbnNpb25NYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uu ZW1mLnRlbmVv
LmV4dGVuc2lvbi5FeHRlbnNpb25NYW5hZ2VyQXdhcmU7CmltcG9ydCBvcmcu ZWNsaXBzZS5l
bWYudGVuZW8uZXh0ZW5zaW9uLkV4dGVuc2lvblBvaW50OwppbXBvcnQgb3Jn LmVjbGlwc2Uu
ZW1mLnRlbmVvLmhpYmVybmF0ZS5IYk1hcHBlckV4Y2VwdGlvbjsKaW1wb3J0 IG9yZy5lY2xp
cHNlLmVtZi50ZW5lby5oaWJlcm5hdGUubWFwcGluZy5lbGlzdC5IYkV4dHJh TGF6eVBlcnNp
c3RhYmxlRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudGVuZW8uaGli ZXJuYXRlLm1h
cHBpbmcuZWxpc3QuSGliZXJuYXRlUGVyc2lzdGFibGVFTGlzdDsKaW1wb3J0 IG9yZy5lY2xp
cHNlLmVtZi50ZW5lby5oaWJlcm5hdGUubWFwcGluZy5lbGlzdC5IaWJlcm5h dGVQZXJzaXN0
YWJsZUVNYXA7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudGVuZW8uaGliZXJu YXRlLm1hcHBp
bmcuZWxpc3QuTWFwSGliZXJuYXRlUGVyc2lzdGFibGVFTWFwOwppbXBvcnQg b3JnLmVjbGlw
c2UuZW1mLnRlbmVvLm1hcHBpbmcuZWxpc3QuTWFwUGVyc2lzdGFibGVFTWFw OwppbXBvcnQg
b3JnLmVjbGlwc2UuZW1mLnRlbmVvLm1hcHBpbmcuZWxpc3QuUGVyc2lzdGFi bGVEZWxlZ2F0
ZUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYudGVuZW8ubWFwcGluZy5l bGlzdC5QZXJz
aXN0YWJsZUVMaXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRlbmVvLm1h cHBpbmcuZWxp
c3QuUGVyc2lzdGFibGVFTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRl bmVvLnV0aWwu
QXNzZXJ0VXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50ZW5lby51dGls LkZpZWxkVXRp
bDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50ZW5lby51dGlsLlN0b3JlVXRp bDsKaW1wb3J0
IG9yZy5oaWJlcm5hdGUuSGliZXJuYXRlRXhjZXB0aW9uOwppbXBvcnQgb3Jn LmhpYmVybmF0
ZS5Qcm9wZXJ0eU5vdEZvdW5kRXhjZXB0aW9uOwppbXBvcnQgb3JnLmhpYmVy bmF0ZS5lbmdp
bmUuU2Vzc2lvbkZhY3RvcnlJbXBsZW1lbnRvcjsKaW1wb3J0IG9yZy5oaWJl cm5hdGUuZW5n
aW5lLlNlc3Npb25JbXBsZW1lbnRvcjsKaW1wb3J0IG9yZy5oaWJlcm5hdGUu cHJvcGVydHku
R2V0dGVyOwppbXBvcnQgb3JnLmhpYmVybmF0ZS5wcm9wZXJ0eS5Qcm9wZXJ0 eUFjY2Vzc29y
OwppbXBvcnQgb3JnLmhpYmVybmF0ZS5wcm9wZXJ0eS5TZXR0ZXI7CgovKioK ICogSW1wbGVt
ZW50cyB0aGUgYWNjZXNzb3IgZm9yIEVNRiBFTGlzdCBtZW1iZXJzIGZvciBI aWJlcm5hdGUu
IFRoaXMgY2FuIGJlIGFuIEVSZWZlcmVuY2Ugb3IgYW4KICogRWF0dHJpYnV0 ZSB3aXRoIG1h
bnk9dHJ1ZS4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGdldHRl ciwgc2V0dGVy
IGFuZCBwcm9wZXJ0eWFjY2Vzc29yCiAqIGludGVyZmFjZXMuIFdoZW4gdGhl IGdldEdldHRl
ciBhbmQgZ2V0U2V0dGVyIG1ldGhvZHMgYXJlIGNhbGxlZCBpdCByZXR1cm5z IGl0c2VsZi4K
ICogCiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm10YWFsQGVsdmVyLm9y ZyI+TWFydGlu
IFRhYWw8L2E+CiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yNSAkCiAqLwpA U3VwcHJlc3NX
YXJuaW5ncygidW5jaGVja2VkIikKcHVibGljIGNsYXNzIEVMaXN0UHJvcGVy dHlIYW5kbGVy
IGltcGxlbWVudHMgR2V0dGVyLCBTZXR0ZXIsIFByb3BlcnR5QWNjZXNzb3Is IEV4dGVuc2lv
blBvaW50LCBFeHRlbnNpb25NYW5hZ2VyQXdhcmUgewoJLyoqCgkgKiBHZW5l cmF0ZWQgU2Vy
aWFsIFZlcnNpb24gSUQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9u ZyBzZXJpYWxW
ZXJzaW9uVUlEID0gMjI1NTEwODI0NjA5Mzk1MTM0MUw7CgoJLyoqIFRoZSBs b2dnZXIgKi8K
CXByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhF TGlzdFByb3Bl
cnR5SGFuZGxlci5jbGFzcyk7CgoJLyoqIFRoZSBFU3RydWN0dXJhbEZlYXR1 cmUgb2YgdGhp
cyBhY2Nlc3NvciAqLwoJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBl RmVhdHVyZTsK
CgkvKiogRXh0cmEgbGF6eSBiZWhhdmlvciEgKi8KCXByaXZhdGUgYm9vbGVh biBleHRyYUxh
enk7CgoJLyoqIE1hcCBlbWFwIGFzIGEgcmVhbCBtYXAgKi8KCXByaXZhdGUg Ym9vbGVhbiBu
ZXdFTWFwTWFwcGluZzsKCgkvKiogSXQgdGhpcyBhIG1hcCAqLwoJcHJpdmF0 ZSBib29sZWFu
IGlzQU1hcDsKCgkvKiogVGhlIGV4dGVuc2lvbiBtYW5hZ2VyICovCglwcml2 YXRlIEV4dGVu
c2lvbk1hbmFnZXIgZXh0ZW5zaW9uTWFuYWdlcjsKCgkvKiogSW5pdGlhbGl6 ZSB0aGlzIGlu
c3RhbmNlICovCglwdWJsaWMgdm9pZCBpbml0aWFsaXplKEVTdHJ1Y3R1cmFs RmVhdHVyZSBl
RmVhdHVyZSwgYm9vbGVhbiBleHRyYUxhenksIGJvb2xlYW4gbmV3RU1hcE1h cHBpbmcpIHsK
CQl0aGlzLmV4dHJhTGF6eSA9IGV4dHJhTGF6eTsKCQl0aGlzLmVGZWF0dXJl ID0gZUZlYXR1
cmU7CgkJbG9nLmRlYnVnKCJDcmVhdGVkIGdldHRlci9zZXR0ZXIgZm9yICIg KyBTdG9yZVV0
aWwudG9TdHJpbmcoZUZlYXR1cmUpKTsKCQlBc3NlcnRVdGlsLmFzc2VydFRy dWUoIk1hbnkg
bXVzdCBiZSB0cnVlIGJ1dCB0aGlzIGlzbid0IHRoZSBjYXNlIGZvciAiICsg U3RvcmVVdGls
LnRvU3RyaW5nKGVGZWF0dXJlKSwgZUZlYXR1cmUKCQkJLmlzTWFueSgpKTsK CQlpc0FNYXAg
PSBTdG9yZVV0aWwuaXNNYXAoZUZlYXR1cmUpOwoJCXRoaXMubmV3RU1hcE1h cHBpbmcgPSBu
ZXdFTWFwTWFwcGluZzsKCX0KCglwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJl IGdldEVGZWF0
dXJlKCkgewoJCXJldHVybiBlRmVhdHVyZTsKCX0KCgkvKgoJICogKG5vbi1K YXZhZG9jKQoJ
ICogCgkgKiBAc2VlIG9yZy5oaWJlcm5hdGUucHJvcGVydHkuUHJvcGVydHlB Y2Nlc3NvciNn
ZXRHZXR0ZXIoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nKQoJ ICovCglwdWJs
aWMgR2V0dGVyIGdldEdldHRlcihDbGFzcyB0aGVDbGFzcywgU3RyaW5nIHBy b3BlcnR5TmFt
ZSkgdGhyb3dzIFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gewoJCXJldHVy biB0aGlzOwoJ
fQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiAKCSAqIEBzZWUgb3JnLmhp YmVybmF0ZS5w
cm9wZXJ0eS5Qcm9wZXJ0eUFjY2Vzc29yI2dldFNldHRlcihqYXZhLmxhbmcu Q2xhc3MsIGph
dmEubGFuZy5TdHJpbmcpCgkgKi8KCXB1YmxpYyBTZXR0ZXIgZ2V0U2V0dGVy KENsYXNzIHRo
ZUNsYXNzLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgUHJvcGVydHlO b3RGb3VuZEV4
Y2VwdGlvbiB7CgkJcmV0dXJuIHRoaXM7Cgl9CgoJLyoKCSAqIChub24tSmF2 YWRvYykKCSAq
IAoJICogQHNlZSBvcmcuaGliZXJuYXRlLnByb3BlcnR5LkdldHRlciNnZXQo amF2YS5sYW5n
Lk9iamVjdCkKCSAqLwoJcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IG93bmVy KSB0aHJvd3Mg
SGliZXJuYXRlRXhjZXB0aW9uIHsKCQlPYmplY3Qgb2JqID0gKChFT2JqZWN0 KSBvd25lciku
ZUdldChlRmVhdHVyZSk7CgoJCWlmIChpc0VTdG9yZUxpc3Qob2JqKSkgewoJ CQlmaW5hbCBF
U3RvcmUgZVN0b3JlID0gKChJbnRlcm5hbEVPYmplY3QpIG93bmVyKS5lU3Rv cmUoKTsKCQkJ
Ly8gdGhlIGNhbGwgdG8gc2l6ZSBmb3JjZXMgYSBsb2FkLCB0aGlzIGlzIGEg dHJpY2sgdG8K
CQkJLy8gZm9yY2UgdGhlIGVzdG9yZSB0byBjcmVhdGUgYSBsaXN0LCBvdGhl cndpc2UgdGhl
IC5nZXQKCQkJLy8gd2lsbCByZXR1cm4gYSBudWxsIHZhbHVlLgoJCQlpZiAo ZVN0b3JlLnNp
emUoKEludGVybmFsRU9iamVjdCkgb3duZXIsIGVGZWF0dXJlKSAhPSAtMSkg ewoJCQkJb2Jq
ID0gZVN0b3JlLmdldCgoSW50ZXJuYWxFT2JqZWN0KSBvd25lciwgZUZlYXR1 cmUsIEVTdG9y
ZS5OT19JTkRFWCk7CgkJCX0KCQl9CgoJCWlmIChvYmogaW5zdGFuY2VvZiBF Y29yZUVNYXAg
JiYgbmV3RU1hcE1hcHBpbmcpIHsKCQkJcmV0dXJuICgoRWNvcmVFTWFwPD8s ID8+KSBvYmop
Lm1hcCgpOwoJCX0KCQlpZiAob2JqIGluc3RhbmNlb2YgUGVyc2lzdGFibGVE ZWxlZ2F0ZUxp
c3QpIHsKCQkJcmV0dXJuICgoUGVyc2lzdGFibGVEZWxlZ2F0ZUxpc3QpIG9i aikuZ2V0RGVs
ZWdhdGUoKTsKCQl9CgkJaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2ljRmVhdHVy ZU1hcCkgeyAv
LyB0aGlzIG9uZSBpcyByZXBsYWNlZCBoZXJlIGJlY2F1c2UgdGhlIGVudHJp ZXMKCQkJLy8g
bmVlZCB0byBiZSBjaGFuZ2VkIHRvIGhpYmVybmF0ZSBlbnRyaWVzCgkJCWZp bmFsIFBlcnNp
c3RhYmxlRGVsZWdhdGVMaXN0IHBlbGlzdCA9CgkJCQkJKFBlcnNpc3RhYmxl RGVsZWdhdGVM
aXN0KSBjcmVhdGVQZXJzaXN0YWJsZUxpc3QoKEludGVybmFsRU9iamVjdCkg b3duZXIsIGVG
ZWF0dXJlLCAoTGlzdCkgb2JqKTsKCQkJZmluYWwgRU9iamVjdCBlb2JqID0g KEVPYmplY3Qp
IG93bmVyOwoJCQlpZiAoIUVjb3JlQWNjZXNzLmlzU3RhdGljRmVhdHVyZShl RmVhdHVyZSwg
KEJhc2ljRU9iamVjdEltcGwpIGVvYmopKSB7CgkJCQlpZiAobG9nLmlzRGVi dWdFbmFibGVk
KCkpIHsKCQkJCQlsb2cuZGVidWcoIkR5bmFtaWMgZWxpc3QsIHNldCB1c2lu ZyB0aGUgZXNl
dHRpbmdzIik7CgkJCQl9CgkJCQlFY29yZUFjY2Vzcy5zZXRNYW55RUZlYXR1 cmVWYWx1ZShl
RmVhdHVyZSwgcGVsaXN0LCAoQmFzaWNFT2JqZWN0SW1wbCkgb3duZXIpOwoJ CQl9IGVsc2Ug
ewoJCQkJLy8gVE9ETzogY3VycmVudGx5IGl0IGlzIHJlcXVpcmVkIHRvIHVz ZSB0aGUgZmll
bGQgc2V0dGVyCgkJCQkvLyBpbnN0ZWFkIG9mIHRoZSBlU2V0IG1ldGhvZAoJ CQkJLy8gYmVj
YXVzZSBFTUYgZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3Qgc2V0dGluZyBvZiB0 aGUgZWxpc3QK
CQkJCS8vIGZlYXR1cmUuCgkJCQkvLyBVUERBVEU6IGZvciBkeW5hbWljIGVj bGFzc2VzIG5v
dyBlbGlzdHMgYXJlIGFsc28gc3VwcG9ydGVkCgkJCQkvLyB0aGUgcmVhc29u IHRoYXQgdGhl
IGphdmFmaWVsZCBpcyBkZXRlcm1pbmVkIGhlcmUgYW5kIG5vdCBhdAoJCQkJ Ly8gY29uc3Ry
dWN0aW9uIHRpbWUKCQkJCS8vIGlzIHRoYXQgdGhlIG93bmVyIHBhc3NlZCBp biB0aGUgY29u
c3RydWN0aW9uIGNhbiBiZSBhbgoJCQkJLy8gaW50ZXJmYWNlIHdoaWxlIHRo ZXJlCgkJCQkv
LyBhcmUgbXVsdGlwbGUgaW1wbGVtZW50b3JzLiBGaWVsZFV0aWwgZG9lcyBj YWNoaW5nIG9m
CgkJCQkvLyBmaWVsZG5hbWVzIGFuZCBmaWVsZHMuCgkJCQlmaW5hbCBGaWVs ZCBqYXZhRmll
bGQgPSBGaWVsZFV0aWwuZ2V0RmllbGQob3duZXIuZ2V0Q2xhc3MoKSwgZ2V0 RmllbGROYW1l
KG93bmVyKSk7CgkJCQl0cnkgewoJCQkJCWphdmFGaWVsZC5zZXQob3duZXIs IHBlbGlzdCk7
CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCXRocm93IG5ldyBI Yk1hcHBlckV4
Y2VwdGlvbigiVGhlIGZpZWxkICIgKyBqYXZhRmllbGQuZ2V0TmFtZSgpICsg IiBjYW4gbm90
IGJlIHNldCB1c2luZyBvYmplY3QgIiArCgkJCQkJCQlwZWxpc3QuZ2V0Q2xh c3MoKS5nZXRO
YW1lKCkgKyAiIG9uIHRhcmdldCAiICsgb3duZXIuZ2V0Q2xhc3MoKS5nZXRO YW1lKCksIGUp
OwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBvYmo7Cgl9CgoJcHJvdGVjdGVk IGJvb2xlYW4g
aXNFU3RvcmVMaXN0KE9iamVjdCBvKSB7CgkJaWYgKG8gPT0gbnVsbCkgewoJ CQlyZXR1cm4g
ZmFsc2U7CgkJfQoJCWlmIChvIGluc3RhbmNlb2YgRVN0b3JlRUxpc3Q8Pz4p IHsKCQkJcmV0
dXJuIHRydWU7CgkJfQoJCS8vIHRoaXMgcmVhbGx5IHVnbHkgY2hlY2sgaXMg dG8gbWFrZSB0
aGlzIGNvZGUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBlbWYgMi4zCgkJ Ly8gdGhlIEJh
c2ljRVN0b3JlRUxpc3QgaXMgaW50cm9kdWNlZCBpbiBlbWYgMi4zCgkJaWYg KG8uZ2V0Q2xh
c3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKCJvcmcuZWNsaXBzZS5lbWYuZWNv cmUuaW1wbC5F
U3RvcmVFT2JqZWN0SW1wbC5CYXNpY0VTdG9yZUVMaXN0IikgPT0gMCkgewoJ CQlyZXR1cm4g
dHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXByb3RlY3RlZCBTdHJp bmcgZ2V0Rmll
bGROYW1lKE9iamVjdCBvd25lcikgewoJCXJldHVybiBlRmVhdHVyZS5nZXRO YW1lKCk7Cgl9
CgoJLyoKCSAqIChub24tSmF2YWRvYykKCSAqIAoJICogQHNlZSBvcmcuaGli ZXJuYXRlLnBy
b3BlcnR5LkdldHRlciNnZXRGb3JJbnNlcnQoamF2YS5sYW5nLk9iamVjdCwg amF2YS51dGls
Lk1hcCwKCSAqICAgICAgb3JnLmhpYmVybmF0ZS5lbmdpbmUuU2Vzc2lvbklt cGxlbWVudG9y
KQoJICovCglwdWJsaWMgT2JqZWN0IGdldEZvckluc2VydChPYmplY3Qgb3du ZXIsIE1hcCBt
ZXJnZU1hcCwgU2Vzc2lvbkltcGxlbWVudG9yIHNlc3Npb24pIHRocm93cyBI aWJlcm5hdGVF
eGNlcHRpb24gewoJCU9iamVjdCBvYmogPSAoKEVPYmplY3QpIG93bmVyKS5l R2V0KGVGZWF0
dXJlKTsKCgkJaWYgKGlzRVN0b3JlTGlzdChvYmopKSB7CgkJCWZpbmFsIEVT dG9yZSBlU3Rv
cmUgPSAoKEludGVybmFsRU9iamVjdCkgb3duZXIpLmVTdG9yZSgpOwoJCQkv LyB0aGUgY2Fs
bCB0byBzaXplIGZvcmNlcyBhIGxvYWQsIHRoaXMgaXMgYSB0cmljayB0bwoJ CQkvLyBmb3Jj
ZSB0aGUgZXN0b3JlIHRvIGNyZWF0ZSBhIGxpc3QsIG90aGVyd2lzZSB0aGUg LmdldAoJCQkv
LyB3aWxsIHJldHVybiBhIG51bGwgdmFsdWUuCgkJCWlmIChlU3RvcmUuc2l6 ZSgoSW50ZXJu
YWxFT2JqZWN0KSBvd25lciwgZUZlYXR1cmUpICE9IC0xKSB7CgkJCQlvYmog PSBlU3RvcmUu
Z2V0KChJbnRlcm5hbEVPYmplY3QpIG93bmVyLCBlRmVhdHVyZSwgRVN0b3Jl Lk5PX0lOREVY
KTsKCQkJfQoJCX0KCgkJaWYgKG9iaiBpbnN0YW5jZW9mIFBlcnNpc3RhYmxl RGVsZWdhdGVM
aXN0KSB7CgkJCXJldHVybiAoKFBlcnNpc3RhYmxlRGVsZWdhdGVMaXN0KSBv YmopLmdldERl
bGVnYXRlKCk7CgkJfQoJCWlmIChvYmogaW5zdGFuY2VvZiBFY29yZUVNYXAg JiYgbmV3RU1h
cE1hcHBpbmcpIHsKCQkJcmV0dXJuICgoRWNvcmVFTWFwPD8sID8+KSBvYmop Lm1hcCgpOwoJ
CX0KCgkJLy8gaWYgdGhpcyBpcyBhIGVsaXN0IHRoZW4gZ2l2ZSBhIG5vcm1h bCBhcnJheWxp
c3QgdG8KCQkvLyBoaWJlcm5hdGUgb3RoZXJ3aXNlIGhiIHdpbGwgd3JhcCB0 aGUgZWxpc3Qs
IHRoZSBoYiB3cmFwcGVyCgkJLy8gaXMgYWdhaW4gd3JhcHBlZCBieSB0ZW5l byByZXN1bHRp
bmcgaW4gbm90aWZpY2F0aW9ucyBiZWluZyBzZW5kCgkJLy8gb3V0IGJ5IGJv dGggdGhlIHRl
bmVvIHdyYXBwZXIgYXMgdGhlIHdyYXBwZWQgZWxpc3QKCQlpZiAob2JqIGlu c3RhbmNlb2Yg
RUxpc3Q8Pz4pIHsKCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKExpc3QpIG9i aik7CgkJfQoK
CQkvLyB0b2RvIG1heWJlIHRocm93IGVycm9yIGluIGFsbCBvdGhlciBjYXNl cz8KCQlyZXR1
cm4gb2JqOwoJfQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiAKCSAqIEBz ZWUgb3JnLmhp
YmVybmF0ZS5wcm9wZXJ0eS5HZXR0ZXIjZ2V0TWV0aG9kKCkKCSAqLwoJcHVi bGljIE1ldGhv
ZCBnZXRNZXRob2QoKSB7CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoKCSAqIChu b24tSmF2YWRv
YykKCSAqIAoJICogQHNlZSBvcmcuaGliZXJuYXRlLnByb3BlcnR5LkdldHRl ciNnZXRNZXRo
b2ROYW1lKCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkg ewoJCXJldHVy
biBudWxsOwoJfQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiAKCSAqIEBz ZWUgb3JnLmhp
YmVybmF0ZS5wcm9wZXJ0eS5HZXR0ZXIjZ2V0UmV0dXJuVHlwZSgpCgkgKi8K CXB1YmxpYyBD
bGFzcyBnZXRSZXR1cm5UeXBlKCkgewoJCXJldHVybiBFTGlzdC5jbGFzczsK CX0KCgkvKgoJ
ICogKG5vbi1KYXZhZG9jKQoJICogCgkgKiBAc2VlIG9yZy5oaWJlcm5hdGUu cHJvcGVydHku
U2V0dGVyI3NldChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0 LAoJICogICAg
ICBvcmcuaGliZXJuYXRlLmVuZ2luZS5TZXNzaW9uRmFjdG9yeUltcGxlbWVu dG9yKQoJICov
CglwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHRhcmdldCwgT2JqZWN0IHZhbHVl LCBTZXNzaW9u
RmFjdG9yeUltcGxlbWVudG9yIGZhY3RvcnkpIHRocm93cyBIaWJlcm5hdGVF eGNlcHRpb24g
ewoJCWlmICghRWNvcmVBY2Nlc3MuaXNTdGF0aWNGZWF0dXJlKGVGZWF0dXJl LCAoQmFzaWNF
T2JqZWN0SW1wbCkgdGFyZ2V0KSkgewoJCQlpZiAobG9nLmlzRGVidWdFbmFi bGVkKCkpIHsK
CQkJCWxvZy5kZWJ1ZygiRHluYW1pYyBlbGlzdCwgc2V0IHVzaW5nIHRoZSBl c2V0dGluZ3Mi
KTsKCQkJfQoJCQlPYmplY3QgY3VycmVudFZhbHVlID0gRWNvcmVBY2Nlc3Mu Z2V0TWFueUVG
ZWF0dXJlVmFsdWUoZUZlYXR1cmUsIChCYXNpY0VPYmplY3RJbXBsKSB0YXJn ZXQpOwoKCQkJ
aWYgKGlzRVN0b3JlTGlzdChjdXJyZW50VmFsdWUpKSB7CgkJCQlmaW5hbCBF U3RvcmUgZVN0
b3JlID0gKChJbnRlcm5hbEVPYmplY3QpIHRhcmdldCkuZVN0b3JlKCk7CgkJ CQlpZiAoZVN0
b3JlLnNpemUoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0LCBlRmVhdHVyZSkg IT0gLTEpIHsK
CQkJCQljdXJyZW50VmFsdWUgPSBlU3RvcmUuZ2V0KChJbnRlcm5hbEVPYmpl Y3QpIHRhcmdl
dCwgZUZlYXR1cmUsIEVTdG9yZS5OT19JTkRFWCk7CgkJCQl9CgkJCX0KCgkJ CS8vIGlmIGN1
cnJlbnR2YWx1ZSBpcyBub3QgbnVsbCB0aGVuIHVzZSB0aGUgcGFzc2VkIHZh bHVlCgkJCWlm
IChjdXJyZW50VmFsdWUgIT0gbnVsbCAmJiBjdXJyZW50VmFsdWUgaW5zdGFu Y2VvZiBQZXJz
aXN0YWJsZUVMaXN0KSB7CgkJCQkoKFBlcnNpc3RhYmxlRUxpc3QpIGN1cnJl bnRWYWx1ZSku
cmVwbGFjZURlbGVnYXRlKChMaXN0KSB2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJ CQlpZiAodmFs
dWUgaW5zdGFuY2VvZiBNYXApIHsKCQkJCQlFY29yZUFjY2Vzcy5zZXRNYW55 RUZlYXR1cmVW
YWx1ZShlRmVhdHVyZSwgY3JlYXRlUGVyc2lzdGFibGVNYXAoKEludGVybmFs RU9iamVjdCkg
dGFyZ2V0LCBlRmVhdHVyZSwKCQkJCQkJKE1hcCkgdmFsdWUpLCAoQmFzaWNF T2JqZWN0SW1w
bCkgdGFyZ2V0KTsKCQkJCX0gZWxzZSB7CgkJCQkJRWNvcmVBY2Nlc3Muc2V0 TWFueUVGZWF0
dXJlVmFsdWUoZUZlYXR1cmUsIGNyZWF0ZVBlcnNpc3RhYmxlTGlzdCgoSW50 ZXJuYWxFT2Jq
ZWN0KSB0YXJnZXQsCgkJCQkJCWVGZWF0dXJlLCAoTGlzdCkgdmFsdWUpLCAo QmFzaWNFT2Jq
ZWN0SW1wbCkgdGFyZ2V0KTsKCQkJCX0KCQkJfQoJCQlpZiAobG9nLmlzRGVi dWdFbmFibGVk
KCkpIHsKCQkJCWxvZy5kZWJ1ZygiU2V0IHZhbHVlICIgKyB2YWx1ZS5nZXRD bGFzcygpLmdl
dE5hbWUoKSArICIgZm9yIHRhcmdldCAiICsgdGFyZ2V0LmdldENsYXNzKCku Z2V0TmFtZSgp
ICsKCQkJCQkJIiBmaWVsZCAiICsgZ2V0RmllbGROYW1lKHRhcmdldCkpOwoJ CQl9CgoJCX0g
ZWxzZSB7CgkJCS8vIHRoZSByZWFzb24gdGhhdCB0aGUgamF2YWZpZWxkIGlz IGRldGVybWlu
ZWQgaGVyZSBhbmQgbm90IGF0CgkJCS8vIGNvbnN0cnVjdGlvbiB0aW1lCgkJ CS8vIGlzIHRo
YXQgdGhlIG93bmVyIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0aW9uIGNhbiBi ZSBhbiBpbnRl
cmZhY2UKCQkJLy8gd2hpbGUgdGhlcmUKCQkJLy8gYXJlIG11bHRpcGxlIGlt cGxlbWVudG9y
cy4gRmllbGRVdGlsIGRvZXMgY2FjaGluZyBvZiBmaWVsZG5hbWVzCgkJCS8v IGFuZCBmaWVs
ZHMuCgkJCWZpbmFsIEZpZWxkIGphdmFGaWVsZCA9IEZpZWxkVXRpbC5nZXRG aWVsZCh0YXJn
ZXQuZ2V0Q2xhc3MoKSwgZ2V0RmllbGROYW1lKHRhcmdldCkpOwoKCQkJdHJ5 IHsKCQkJCWZp
bmFsIE9iamVjdCBjdXJyZW50VmFsdWUgPSBqYXZhRmllbGQuZ2V0KHRhcmdl dCk7CgoJCQkJ
Ly8gaWYgYWxyZWFkeSBzZXQgdGhlbiBpZ25vcmUgaXQKCQkJCWlmIChjdXJy ZW50VmFsdWUg
PT0gdmFsdWUpIHsKCQkJCQlyZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8gaGVy ZQoJCQkJfQoK
CQkJCS8vIHRoZSBkZWxlZ2F0aW5nIG1hcCB3YXMgcGFzc2VkIHRvIGhpYmVy bmF0ZSwgbm93
IGdldHRpbmcgaXQgYmFjawoJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU1h cC5JbnRlcm5h
bE1hcFZpZXc8PywgPz4gJiYKCQkJCQkJKGN1cnJlbnRWYWx1ZSA9PSAoKEVN YXAuSW50ZXJu
YWxNYXBWaWV3PD8sID8+KSB2YWx1ZSkuZU1hcCgpKSkgewoJCQkJCXJldHVy bjsKCQkJCX0K
CgkJCQkvLyBhbHJlYWR5IGhhbmRsZWQKCQkJCWlmIChjdXJyZW50VmFsdWUg aW5zdGFuY2Vv
ZiBQZXJzaXN0YWJsZURlbGVnYXRlTGlzdDw/PiAmJgoJCQkJCQl2YWx1ZSA9 PSAoKFBlcnNp
c3RhYmxlRGVsZWdhdGVMaXN0PD8+KSBjdXJyZW50VmFsdWUpLmdldERlbGVn YXRlKCkpIHsK
CQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJLy8gdGhlIGZvbGxvdyAzIGlmIHN0 YXRlbWVudHMg
aGFuZGxlIHRoZSByZWZyZXNoIGFjdGlvbiwgdGhlIHVuZGVybHlpbmcgb3Jt CgkJCQkvLyBj
b2xsZWN0aW9uIGlzIHJlcGxhY2VkCgkJCQlpZiAoY3VycmVudFZhbHVlICE9 IG51bGwgJiYg
Y3VycmVudFZhbHVlIGluc3RhbmNlb2YgUGVyc2lzdGFibGVFTGlzdCAmJgoJ CQkJCQl2YWx1
ZSAhPSAoKFBlcnNpc3RhYmxlRUxpc3QpIGN1cnJlbnRWYWx1ZSkuZ2V0RGVs ZWdhdGUoKSkg
ewoJCQkJCSgoUGVyc2lzdGFibGVFTGlzdCkgY3VycmVudFZhbHVlKS5yZXBs YWNlRGVsZWdh
dGUoKExpc3QpIHZhbHVlKTsKCQkJCX0gZWxzZSBpZiAoY3VycmVudFZhbHVl ICE9IG51bGwg
JiYgY3VycmVudFZhbHVlIGluc3RhbmNlb2YgUGVyc2lzdGFibGVFTWFwICYm CgkJCQkJCXZh
bHVlICE9ICgoUGVyc2lzdGFibGVFTWFwKSBjdXJyZW50VmFsdWUpLmdldERl bGVnYXRlKCkp
IHsKCQkJCQkoKFBlcnNpc3RhYmxlRU1hcCkgY3VycmVudFZhbHVlKS5yZXBs YWNlRGVsZWdh
dGUodmFsdWUpOwoJCQkJfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgIT0gbnVs bCAmJiBjdXJy
ZW50VmFsdWUgaW5zdGFuY2VvZiBNYXBQZXJzaXN0YWJsZUVNYXAgJiYKCQkJ CQkJdmFsdWUg
IT0gKChNYXBQZXJzaXN0YWJsZUVNYXApIGN1cnJlbnRWYWx1ZSkuZ2V0T1JN TWFwRGVsZWdh
dGUoKSkgewoJCQkJCSgoUGVyc2lzdGFibGVFTWFwKSBjdXJyZW50VmFsdWUp LnJlcGxhY2VE
ZWxlZ2F0ZSh2YWx1ZSk7CgkJCQl9IGVsc2UgeyAvLyB0aGVuIHdyYXAgdGhl IGhpYmVybmF0
ZSBjb2xsZWN0aW9uCgkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7 CgkJCQkJCWph
dmFGaWVsZC5zZXQodGFyZ2V0LCBjcmVhdGVQZXJzaXN0YWJsZU1hcCgoSW50 ZXJuYWxFT2Jq
ZWN0KSB0YXJnZXQsIGVGZWF0dXJlLCAoTWFwKSB2YWx1ZSkpOwoJCQkJCX0g ZWxzZSB7CgkJ
CQkJCWphdmFGaWVsZC5zZXQodGFyZ2V0LCBjcmVhdGVQZXJzaXN0YWJsZUxp c3QoKEludGVy
bmFsRU9iamVjdCkgdGFyZ2V0LCBlRmVhdHVyZSwgKExpc3QpIHZhbHVlKSk7 CgkJCQkJfQoJ
CQkJfQoJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CgkJCQkJbG9n LmRlYnVnKCJT
ZXQgdmFsdWUgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBm b3IgdGFyZ2V0
ICIgKyB0YXJnZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwoJCQkJCQkJIiBm aWVsZCAiICsg
Z2V0RmllbGROYW1lKHRhcmdldCkpOwoJCQkJfQoJCQl9IGNhdGNoIChFeGNl cHRpb24gZSkg
ewoJCQkJdGhyb3cgbmV3IEhiTWFwcGVyRXhjZXB0aW9uKCJUaGUgZmllbGQg IiArCgkJCQkJ
CShqYXZhRmllbGQgIT0gbnVsbCA/IGphdmFGaWVsZC5nZXROYW1lKCkgOiBn ZXRGaWVsZE5h
bWUodGFyZ2V0KSkgKwoJCQkJCQkiIGNhbiBub3QgYmUgc2V0IHVzaW5nIG9i amVjdCAiICsg
dmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIG9uIHRhcmdldCAiICsK CQkJCQkJdGFy
Z2V0LmdldENsYXNzKCkuZ2V0TmFtZSgpLCBlKTsKCQkJfQoJCX0KCX0KCgkv KioKCSAqIENy
ZWF0ZSBhIEVNYXAuIENyZWF0ZSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4K CSAqLwoJcHJv
dGVjdGVkIEVMaXN0IGNyZWF0ZVBlcnNpc3RhYmxlTWFwKEludGVybmFsRU9i amVjdCB0YXJn
ZXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlc3RydWN0LCBNYXAgbWFwKSB7CgkJ ZmluYWwgRVJl
ZmVyZW5jZSBlcmVmID0gKEVSZWZlcmVuY2UpIGVzdHJ1Y3Q7CgkJaWYgKGxv Zy5pc0RlYnVn
RW5hYmxlZCgpKSB7CgkJCWxvZy5kZWJ1ZygiRGV0ZWN0ZWQgRU1BUCBmb3Ig IiArIGVzdHJ1
Y3QuZ2V0TmFtZSgpKTsKCQl9CgkJYXNzZXJ0IChpc0FNYXApOwoJCWFzc2Vy dCAobmV3RU1h
cE1hcHBpbmcpOwoJCXJldHVybiBnZXRFeHRlbnNpb25NYW5hZ2VyKCkKCQkJ LmdldEV4dGVu
c2lvbihNYXBIaWJlcm5hdGVQZXJzaXN0YWJsZUVNYXAuY2xhc3MsIG5ldyBP YmplY3RbXSB7
IHRhcmdldCwgZXJlZiwgbWFwIH0pOwoJfQoKCS8qKiBDcmVhdGVzIGEgcGVy c2lzdGFibGVt
YXAgb3IgbGlzdCAqLwoJcHJvdGVjdGVkIEVMaXN0IGNyZWF0ZVBlcnNpc3Rh YmxlTGlzdChJ
bnRlcm5hbEVPYmplY3QgdGFyZ2V0LCBFU3RydWN0dXJhbEZlYXR1cmUgZXN0 cnVjdCwgTGlz
dCBsaXN0KSB7CgkJaWYgKGVzdHJ1Y3QgaW5zdGFuY2VvZiBFUmVmZXJlbmNl KSB7CgkJCWZp
bmFsIEVSZWZlcmVuY2UgZXJlZiA9IChFUmVmZXJlbmNlKSBlc3RydWN0OwoJ CQkvLyB0aGUg
dGVzdCBmb3IgZW1hcCBjaGVja3M6IHRoZSBlbnRyeSBjbGFzcyBtdXN0IGhh dmUgYQoJCQkv
LyBpbnN0YW5jZWNsYXNzOiBNYXAuRW50cnkKCQkJLy8gYW5kIHRoZSBlbnRy eSBjbGFzcyBt
dXN0IGhhdmUgdHdvIGVmZWF0dXJlcyB3aXRoIHRoZSBuYW1lIGtleSBhbmQK CQkJLy8gdmFs
dWUKCQkJaWYgKFN0b3JlVXRpbC5pc01hcChlc3RydWN0KSkgewoJCQkJaWYg KGxvZy5pc0Rl
YnVnRW5hYmxlZCgpKSB7CgkJCQkJbG9nLmRlYnVnKCJEZXRlY3RlZCBFTUFQ IGZvciAiICsg
ZXN0cnVjdC5nZXROYW1lKCkpOwoJCQkJfQoKCQkJCXJldHVybiBnZXRFeHRl bnNpb25NYW5h
Z2VyKCkuZ2V0RXh0ZW5zaW9uKEhpYmVybmF0ZVBlcnNpc3RhYmxlRU1hcC5j bGFzcywKCQkJ
CQluZXcgT2JqZWN0W10geyB0YXJnZXQsIGVyZWYsIGxpc3QgfSk7CgkJCX0K CQl9CgkJaWYg
KGV4dHJhTGF6eSkgewoJCQlyZXR1cm4gZ2V0RXh0ZW5zaW9uTWFuYWdlcigp LmdldEV4dGVu
c2lvbihIYkV4dHJhTGF6eVBlcnNpc3RhYmxlRUxpc3QuY2xhc3MsCgkJCQlu ZXcgT2JqZWN0
W10geyB0YXJnZXQsIGVzdHJ1Y3QsIGxpc3QgfSk7CgkJfQoJCXJldHVybiBn ZXRFeHRlbnNp
b25NYW5hZ2VyKCkuZ2V0RXh0ZW5zaW9uKEhpYmVybmF0ZVBlcnNpc3RhYmxl RUxpc3QuY2xh
c3MsCgkJCW5ldyBPYmplY3RbXSB7IHRhcmdldCwgZXN0cnVjdCwgbGlzdCB9 KTsKCX0KCgkv
KioKCSAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbk1hbmFnZXIKCSAqLwoJcHVi bGljIEV4dGVu
c2lvbk1hbmFnZXIgZ2V0RXh0ZW5zaW9uTWFuYWdlcigpIHsKCQlyZXR1cm4g ZXh0ZW5zaW9u
TWFuYWdlcjsKCX0KCgkvKioKCSAqIEBwYXJhbSBleHRlbnNpb25NYW5hZ2Vy CgkgKiAgICAg
ICAgICAgIHRoZSBleHRlbnNpb25NYW5hZ2VyIHRvIHNldAoJICovCglwdWJs aWMgdm9pZCBz
ZXRFeHRlbnNpb25NYW5hZ2VyKEV4dGVuc2lvbk1hbmFnZXIgZXh0ZW5zaW9u TWFuYWdlcikg
ewoJCXRoaXMuZXh0ZW5zaW9uTWFuYWdlciA9IGV4dGVuc2lvbk1hbmFnZXI7 Cgl9Cn0=
--------------050106040708020105080405--
Re: [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=t [message #619152 is a reply to message #124751] Mon, 02 June 2008 19:10 Go to previous message
Francois is currently offline FrancoisFriend
Messages: 17
Registered: July 2009
Junior Member
Hi Martin,

Thanks, Your fix seems to have worked, I only had to change
MyGreatEListPropertyHandler so that it extends EListPropertyHandler.

I get this error at commit now, I think it is only a matter of
annotating my map with cascade="persist", I have yet to find how to
annotate the EReference in the ecore to allow that.

François


Caused by: org.hibernate.TransientObjectException: object references an
unsaved transient instance - save the transient instance before
flushing: Game.childMap -> NodeMapEntry
at
org.hibernate.engine.CascadingAction$9.noCascade(CascadingAc tion.java:353)
at org.hibernate.engine.Cascade.cascade(Cascade.java:139)
at
org.hibernate.event.def.AbstractFlushingEventListener.cascad eOnFlush(AbstractFlushingEventListener.java:131)
at
org.hibernate.event.def.AbstractFlushingEventListener.prepar eEntityFlushes(AbstractFlushingEventListener.java:122)
at
org.hibernate.event.def.AbstractFlushingEventListener.flushE verythingToExecutions(AbstractFlushingEventListener.java:65)
at
org.hibernate.event.def.DefaultFlushEventListener.onFlush(De faultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java :338)
at
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransac tion.java:106)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.jav a:54)
... 12 more

Martin Taal wrote:
> Hi Francois,
> Thanks for the testcase it helped to reproduce this.
>
> It showed that there is a bug which causes this. This bug becomes
> visible because the model classes are generated with dynamic efeatures
> (to support cdo). The Teneo code handling dynamic EMF could not handle
> real maps yet. I have changed this. I have changed the
> EListPropertyHandler for this. I have attached the new
> EListPropertyHandler. You can put it in your own package somewhere and
> then call this code before dataStore.initialize():
>
> dataStore.getExtensionManager().registerExtension(EListPrope rtyHandler.class.getName(),
>
> MyGreatEListPropertyHandler.class.getName());
>
> whereby MyGreatEListPropertyHandler is the EListPropertyHandler which
> you saved in your packagetree somewhere.
>
> Can you let me know if it works for you?
>
> I need to do some more testing before I will commit the change to cvs.
> The bugfix will be in the next build which is this week.
>
> gr. Martin
>
> Francois wrote:
>> Whenever we persist an EMF object that contains a map
>> (java.util.Map$Entry) set with containement=true, we get a class cast
>> exception. The problem does not occurs is containement is set to false.
>>
>>
>> I am using emf 2.4 and teneo 0.8.0RC1A.
>> mapping.emap_as_true_map=true.
>> The entry in the map are a simple Key (EString) and value (a simple
>> EObject).
>>
>>
>>
>> java.lang.ClassCastException:
>> org.eclipse.emf.common.util.BasicEMap$DelegatingMap
>> at
>> org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
>>
>> at
>> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
>>
>> at
>> org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
>>
>> at
>> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
>>
>> at
>> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
>>
>> at
>> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
>>
>> at
>> org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
>>
>> at
>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
>>
>> at
>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
>>
>> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
>> at
>> org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)
>>
>>
>>
>>
>>
>> In EListPropertyHandler.java:286 we have the following line of code:
>> EcoreAccess.setManyEFeatureValue(eFeature,
>> createPersistableList(
>> (InternalEObject) target,
>> eFeature,
>> (List) value),
>> (BasicEObjectImpl) target);
>>
>> The cast of value (an BasicEMap) to a list is causing us the exception.
>>
>>
>> Here is the method in which it fails:
>>
>> public void set(Object target, Object value, SessionFactoryImplementor
>> factory) throws HibernateException {
>> if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl)
>> target)) {
>> if (log.isDebugEnabled()) {
>> log.debug("Dynamic elist, set using the esettings");
>> }
>> Object currentValue =
>> EcoreAccess.getManyEFeatureValue(eFeature, (BasicEObjectImpl) target);
>>
>> if (isEStoreList(currentValue)) {
>> final EStore eStore = ((InternalEObject)
>> target).eStore();
>> if (eStore.size((InternalEObject) target, eFeature) !=
>> -1) {
>> currentValue = eStore.get((InternalEObject)
>> target, eFeature, EStore.NO_INDEX);
>> }
>> }
>>
>> // if currentvalue is not null then use the passed value
>> if (currentValue != null && currentValue instanceof
>> PersistableEList) {
>> ((PersistableEList)
>> currentValue).replaceDelegate((List) value);
>> } else {
>> EcoreAccess.setManyEFeatureValue(eFeature,
>> createPersistableList((InternalEObject) target, eFeature,
>> (List) value), (BasicEObjectImpl) target);
>> }
>
>
Re: [Teneo] ClassCastException from hibernate trying to persist a new EMap entry with containement=t [message #619153 is a reply to message #124999] Mon, 02 June 2008 19:20 Go to previous message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
Hi François,
Yes setting cascade would handle this.

gr. Martin

François M. wrote:
> Hi Martin,
>
> Thanks, Your fix seems to have worked, I only had to change
> MyGreatEListPropertyHandler so that it extends EListPropertyHandler.
>
> I get this error at commit now, I think it is only a matter of
> annotating my map with cascade="persist", I have yet to find how to
> annotate the EReference in the ecore to allow that.
>
> François
>
>
> Caused by: org.hibernate.TransientObjectException: object references an
> unsaved transient instance - save the transient instance before
> flushing: Game.childMap -> NodeMapEntry
> at
> org.hibernate.engine.CascadingAction$9.noCascade(CascadingAc tion.java:353)
> at org.hibernate.engine.Cascade.cascade(Cascade.java:139)
> at
> org.hibernate.event.def.AbstractFlushingEventListener.cascad eOnFlush(AbstractFlushingEventListener.java:131)
>
> at
> org.hibernate.event.def.AbstractFlushingEventListener.prepar eEntityFlushes(AbstractFlushingEventListener.java:122)
>
> at
> org.hibernate.event.def.AbstractFlushingEventListener.flushE verythingToExecutions(AbstractFlushingEventListener.java:65)
>
> at
> org.hibernate.event.def.DefaultFlushEventListener.onFlush(De faultFlushEventListener.java:26)
>
> at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
> at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java :338)
> at
> org.hibernate.transaction.JDBCTransaction.commit(JDBCTransac tion.java:106)
> at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.jav a:54)
> ... 12 more
>
> Martin Taal wrote:
>> Hi Francois,
>> Thanks for the testcase it helped to reproduce this.
>>
>> It showed that there is a bug which causes this. This bug becomes
>> visible because the model classes are generated with dynamic efeatures
>> (to support cdo). The Teneo code handling dynamic EMF could not handle
>> real maps yet. I have changed this. I have changed the
>> EListPropertyHandler for this. I have attached the new
>> EListPropertyHandler. You can put it in your own package somewhere and
>> then call this code before dataStore.initialize():
>>
>> dataStore.getExtensionManager().registerExtension(EListPrope rtyHandler.class.getName(),
>>
>> MyGreatEListPropertyHandler.class.getName());
>>
>> whereby MyGreatEListPropertyHandler is the EListPropertyHandler which
>> you saved in your packagetree somewhere.
>>
>> Can you let me know if it works for you?
>>
>> I need to do some more testing before I will commit the change to cvs.
>> The bugfix will be in the next build which is this week.
>>
>> gr. Martin
>>
>> Francois wrote:
>>> Whenever we persist an EMF object that contains a map
>>> (java.util.Map$Entry) set with containement=true, we get a class cast
>>> exception. The problem does not occurs is containement is set to false.
>>>
>>>
>>> I am using emf 2.4 and teneo 0.8.0RC1A.
>>> mapping.emap_as_true_map=true.
>>> The entry in the map are a simple Key (EString) and value (a simple
>>> EObject).
>>>
>>>
>>>
>>> java.lang.ClassCastException:
>>> org.eclipse.emf.common.util.BasicEMap$DelegatingMap
>>> at
>>> org.eclipse.emf.teneo.hibernate.mapping.property.EListProper tyHandler.set(EListPropertyHandler.java:286)
>>>
>>> at
>>> org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropert yValues(AbstractEntityTuplizer.java:337)
>>>
>>> at
>>> org.hibernate.persister.entity.AbstractEntityPersister.setPr opertyValues(AbstractEntityPersister.java:3566)
>>>
>>> at
>>> org.hibernate.event.def.AbstractSaveEventListener.performSav eOrReplicate(AbstractSaveEventListener.java:277)
>>>
>>> at
>>> org.hibernate.event.def.AbstractSaveEventListener.performSav e(AbstractSaveEventListener.java:181)
>>>
>>> at
>>> org.hibernate.event.def.AbstractSaveEventListener.saveWithGe neratedId(AbstractSaveEventListener.java:121)
>>>
>>> at
>>> org.hibernate.event.def.DefaultPersistEventListener.entityIs Transient(DefaultPersistEventListener.java:131)
>>>
>>> at
>>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:87)
>>>
>>> at
>>> org.hibernate.event.def.DefaultPersistEventListener.onPersis t(DefaultPersistEventListener.java:38)
>>>
>>> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java: 618)
>>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
>>> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
>>> at
>>> org.hibernate.ejb.AbstractEntityManagerImpl.persist(Abstract EntityManagerImpl.java:212)
>>>
>>>
>>>
>>>
>>>
>>> In EListPropertyHandler.java:286 we have the following line of code:
>>> EcoreAccess.setManyEFeatureValue(eFeature,
>>> createPersistableList(
>>> (InternalEObject) target,
>>> eFeature,
>>> (List) value),
>>> (BasicEObjectImpl) target);
>>>
>>> The cast of value (an BasicEMap) to a list is causing us the exception.
>>>
>>>
>>> Here is the method in which it fails:
>>>
>>> public void set(Object target, Object value,
>>> SessionFactoryImplementor factory) throws HibernateException {
>>> if (!EcoreAccess.isStaticFeature(eFeature, (BasicEObjectImpl)
>>> target)) {
>>> if (log.isDebugEnabled()) {
>>> log.debug("Dynamic elist, set using the esettings");
>>> }
>>> Object currentValue =
>>> EcoreAccess.getManyEFeatureValue(eFeature, (BasicEObjectImpl) target);
>>>
>>> if (isEStoreList(currentValue)) {
>>> final EStore eStore = ((InternalEObject)
>>> target).eStore();
>>> if (eStore.size((InternalEObject) target, eFeature)
>>> != -1) {
>>> currentValue = eStore.get((InternalEObject)
>>> target, eFeature, EStore.NO_INDEX);
>>> }
>>> }
>>>
>>> // if currentvalue is not null then use the passed value
>>> if (currentValue != null && currentValue instanceof
>>> PersistableEList) {
>>> ((PersistableEList)
>>> currentValue).replaceDelegate((List) value);
>>> } else {
>>> EcoreAccess.setManyEFeatureValue(eFeature,
>>> createPersistableList((InternalEObject) target, eFeature,
>>> (List) value), (BasicEObjectImpl) target);
>>> }
>>
>>


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
Previous Topic:[Compare] is it possible for the diff to hold the old values?
Next Topic:[CDO] reading/writting throughput performances
Goto Forum:
  


Current Time: Mon Mar 30 20:12:09 GMT 2020

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

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

Back to the top