users@jersey.java.net

RE: [Jersey] Doh! Re: [Jersey] ExceptionMapper and Viewable

From: Jordi Domingo <noseya_at_hotmail.com>
Date: Fri, 16 Oct 2009 11:02:05 +0200

Great test Paul!

But, did you try to turn your resource into an EJB ? :)

Results change:

1) Now Fails with a complete dump, escaping the servlet container
2) Same like not ejb
3) Same like not ejb

My resource's are Stateless beans :(

Sorry for the delay, i got a bit crazy with maven and failures deploying the app with an EJB (your web.xml was 2.4 version and I didnt noticed :)) )

Thanks,

Jordi

Date: Thu, 15 Oct 2009 12:50:44 +0200
From: Paul.Sandoz_at_Sun.COM
To: users_at_jersey.dev.java.net
Subject: Re: [Jersey] Doh! Re: [Jersey] ExceptionMapper and Viewable

H Jordi,
I have attached a very simple project that exercises many of the possible ways of mapping exceptions.
Hopefully it should be fairly intuitive to understand. The main index.jsp provides links to click on that results in various forms of error pages.
Results of investigation:
1) Jersey will propagate runtime exceptions to the servlet layer if those exceptions are not mapped by an ExceptionMapper. Those exceptions can then be mapped using an error page. See the error page SecurityExceptionErrorPage.jsp and the link: http://localhost:8080/exceptions/webresources/myresource/runtime?ex=java.lang.SecurityException
     supported by the following resource method:
      @Path("runtime") @GET @Produces("text/plain") public String runtimeException(@QueryParam("ex") String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class c = Class.forName(className, true, this.getClass().getClassLoader()); RuntimeException re = (RuntimeException)c.newInstance(); if (true) throw re; return "Hi there!"; }
2) Jersey will propagate checked exceptions wrapped in a MappableContainerException to the servlet layer. That exception can then be mapped using an error page and the cause can be extracted. See the error page MappableContainerException.jsp and the links:
       http://localhost:8080/exceptions/webresources/myresource/checked/ioexception http://localhost:8080/exceptions/webresources/myresource/checked/myexception
     supported by the following resource methods: @Path("checked/ioexception") @GET @Produces("text/plain") public String checkedIOException() throws IOException { if (true) throw new IOException(); return "Hi there!"; }
      public static class MyException extends Exception { }
      @Path("checked/myexception") @GET @Produces("text/plain") public String checkedMyException() throws MyException { if (true) throw new MyException(); return "Hi there!"; }

3) If Jersey sets the status code in the servlet response it is not possible for error pages to be mapped to the status code. See the links:
       http://localhost:8080/exceptions/404 http://localhost:8080/exceptions/webresources/404
    The first link is mapped to the 404 bound error page, NotFound.jsp. The the second link returns the default GF 404 error page. The first works because the Jersey servlet is not invoked.
    I verified i get the same behavior with a simple servlet if one only sets the status code to 404. However, i could get this to work if instead of calling HttpServletResponse.setStatus i call HttpServletResponse.sendError.
  Conclusions:
Result 1 is working correctly.
Result 2 could be improved by unwrapping the cause in the MappableContainerException and re-throwing the cause wrapped in ServletException.
Result 3 might be a bug in the servlet container. I am not quite sure how to work around it. For example if using sendError then any headers that have been added are ignored. It seems to me the correct behavior would be to map status codes if no entity is present (nor no bytes have been written to the response output stream).
Paul.


                                                _________________________________________________________________ Vive toda la experiencia de Messenger con Orange desde tu Blackberry ¡Descúbrelo! http://serviciosmoviles.es.msn.com/messenger/blackberry.aspx
--_a3ccb682-cff9-489f-ac6c-be35db795338_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
Great test Paul!<br><br>But, did you try to turn your resource into an EJB ? :)<br><br>Results change:<br><br>1) Now Fails with a complete dump, escaping the servlet container<br>2) Same like not ejb<br>3) Same like not ejb<br><br>My resource's are Stateless beans :(<br><br>Sorry for the delay, i got a bit crazy with maven and failures deploying the app with an EJB (your web.xml was 2.4 version and I didnt noticed :)) )<br><br>Thanks,<br><br>Jordi<br><br><hr id="stopSpelling">Date: Thu, 15 Oct 2009 12:50:44 +0200<br>From: Paul.Sandoz@Sun.COM<br>To: users@jersey.dev.java.net<br>Subject: Re: [Jersey] Doh! Re: [Jersey] ExceptionMapper and Viewable<br><br><div>H Jordi,</div><div><br></div><div>I have attached a very simple project that exercises many of the possible ways of mapping exceptions.</div><div><br></div><div>Hopefully it should be fairly intuitive to understand. The main index.jsp provides links to click on that results in various forms of error pages.</div><div><br></div><div>Results of investigation:</div><div><br></div><div>1) Jersey will propagate runtime exceptions to the servlet layer if those exceptions are not mapped by</div><div>&nbsp;&nbsp; &nbsp; an ExceptionMapper. Those exceptions can then be mapped using an&nbsp;error page.&nbsp;</div><div>&nbsp;&nbsp; &nbsp; See the error page SecurityExceptionErrorPage.jsp and the link:</div><div>&nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; <a href="http://localhost:8080/exceptions/webresources/myresource/runtime?ex=java.lang.SecurityException">http://localhost:8080/exceptions/webresources/myresource/runtime?ex=java.lang.SecurityException</a></div><div><br></div><div>&nbsp;&nbsp; &nbsp; supported by the following resource method:</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;@Path("runtime")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;@GET</div><div>&nbsp;&nbsp; &nbsp; &nbsp;@Produces("text/plain")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;public String runtimeException(@QueryParam("ex") String className)&nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws ClassNotFoundException, InstantiationException, IllegalAccessException {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Class c = Class.forName(className, true, this.getClass().getClassLoader());</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;RuntimeException re = (RuntimeException)c.newInstance();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (true) throw re;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return "Hi there!";</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div>&nbsp;</div><div><br></div><div><div>2)&nbsp;Jersey will propagate checked exceptions wrapped in a MappableContainerException to the servlet layer.</div><div>&nbsp;&nbsp; &nbsp; That exception can then be mapped using an error page and the cause can be extracted.</div><div>&nbsp;&nbsp; &nbsp; See the error page MappableContainerException.jsp and the links:</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; <a href="http://localhost:8080/exceptions/webresources/myresource/checked/ioexception">http://localhost:8080/exceptions/webresources/myresource/checked/ioexception</a></div><div>&nbsp;&nbsp; &nbsp; &nbsp; <a href="http://localhost:8080/exceptions/webresources/myresource/checked/myexception">http://localhost:8080/exceptions/webresources/myresource/checked/myexception</a>&nbsp;</div><div><br></div><div>&nbsp;&nbsp; &nbsp; supported by the following resource methods:</div></div><div>&nbsp;</div><div><div>&nbsp;&nbsp; &nbsp; &nbsp;@Path("checked/ioexception")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;@GET</div><div>&nbsp;&nbsp; &nbsp; &nbsp;@Produces("text/plain")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;public String checkedIOException() throws IOException {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (true) throw new IOException();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return "Hi there!";</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;public static class MyException extends Exception {</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;@Path("checked/myexception")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;@GET</div><div>&nbsp;&nbsp; &nbsp; &nbsp;@Produces("text/plain")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;public String checkedMyException() throws MyException {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (true) throw new MyException();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return "Hi there!";</div><div>&nbsp;&nbsp; &nbsp; &nbsp;}</div><div><br></div><div><br></div><div>3) If Jersey sets the status code in the servlet response it is not possible for error pages to be mapped to the&nbsp;</div><div>&nbsp;&nbsp; &nbsp; status code.</div><div>&nbsp;&nbsp; &nbsp; See the links:</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;<a href="http://localhost:8080/exceptions/404">http://localhost:8080/exceptions/404</a></div><div>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;<a href="http://localhost:8080/exceptions/webresources/404">http://localhost:8080/exceptions/webresources/404</a></div><div><br></div><div>&nbsp;&nbsp; &nbsp;The first link is mapped to the 404 bound error page, NotFound.jsp. The the second link returns the default&nbsp;</div><div>&nbsp;&nbsp; &nbsp;GF 404 error page. The first works because the Jersey servlet is not invoked.</div><div><br></div><div>&nbsp;&nbsp; &nbsp;I verified i get the same behavior with a simple servlet if one only&nbsp;sets&nbsp;the&nbsp;status&nbsp;code&nbsp;to&nbsp;404.</div><div>&nbsp;&nbsp; &nbsp;However, i could get this to work if instead of calling HttpServletResponse.setStatus i call&nbsp;</div><div>&nbsp;&nbsp; &nbsp;HttpServletResponse.sendError.</div><div><br></div><div>&nbsp;&nbsp;</div><div>Conclusions:</div><div><br></div><div>Result 1 is working correctly.</div><div><br></div><div>Result 2 could be improved by unwrapping the cause in the&nbsp;MappableContainerException and re-throwing the cause wrapped in ServletException.</div><div><br></div><div>Result 3 might be a bug in the servlet container. I am not quite sure how to work around it. For example if using sendError then any headers that have been added are ignored. It seems to me the correct behavior would be to map status codes if no entity is present (nor no bytes have been written to the response output stream).</div><div><br></div><div>Paul.</div><div><br></div><div><br></div></div><div><br></div> <br /><hr />En tu material escolar no puede faltar el nuevo Pack de Emoticonos Vuelta al Cole <a href='http://www.vivelive.com/emoticonosvueltaalcole ' target='_new'>¡Descárgatelo gratis! Es muy divertido</a></body>
</html>
--_a3ccb682-cff9-489f-ac6c-be35db795338_--

--_70c406c9-dd59-4f88-9ae6-8dcca57dae60_
Content-Type: application/zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="exceptions.zip"

UEsDBAoAAAAAAGhXUDsAAAAAAAAAAAAAAAALAAAAZXhjZXB0aW9ucy9QSwMEFAAAAAgAkVVQO2LR
/zgOAQAAYAIAABUAAABleGNlcHRpb25zLy5jbGFzc3BhdGidkl9LwzAUxZ8V/A4lj4MlbiD40DrK
qOhwVda61xGTS5eZJiV/yvbtbdfNyagDfbw35/zuSW7CybaUQQ3GCq0iNMK3KADFNBeqiNB7/ji8
R5OHm+uQSWptRd26Ka5OFShndsGnUDxC1jAUaO8q7yLkqCnAkb0QLApa8V5CSioU2dCaItLHgi2T
vhs/GKB/oA1Y7Q1rTnr5vwMdWDfsobb9C4E7INPq6NGmwMCkqCzgDXdYUq/YurkRni2S1fQ1zePn
NFmQc51QDoyiEnP48AX24uAEgzNHFaeGL+f5rgIyG2fJcITv/hCopDUoLDh8j5zHyyQdr6YvcZa9
xfnTKdklbPdmR/LZKlpfSH5+lS9QSwMEFAAAAAgADGtPOxmmsL7XAAAANAIAABMAAABleGNlcHRp
b25zLy5wcm9qZWN0rZGxDsIgEIZnTXwH011QJwesiRpHF/UBEC4NTYEGaNPHFyjVVKOT2/3f3c9/
ANl1spq3YKzQaput0DKbg2KaC1Vss9v1tNhku3w2JbXRJTB3BMuMqJ2f9nRCFJWQQ8cgIktwBKHD
tJSgXE7wUAWajrFR4JG6N6LilxpYUEkevJUqHkkK06ZAwCpRW0Ald4hp4wva0mgA81rBO6gpmpBt
k8ZjQPBHys9cSVtQSHB4bhDJev+P6ESGF/CprjGQpnvx/fJ9PywQ59493xY/f9iGOuQ+P2j86w9Q
SwMECgAAAAAAkVVQOwAAAAAAAAAAAAAAABUAAABleGNlcHRpb25zLy5zZXR0aW5ncy9QSwMEFAAA
AAgAkVVQOwyu3sx+AAAA0QAAAC8AAABleGNlcHRpb25zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5q
ZHQuY29yZS5wcmVmc43NvwrCMBgE8L3Qdwi4fyTaChY6ia4K+gIhvYZI/vEl+vxm6azLccPvuN2V
nbiZKtRRKDkNw3QYxfnyeIq9lKe+g/EuF1BmrGBEg0IfcHEpzqrvElvayGupZBKjRcjOg1tZYBGp
araod6/rmjjMisbfy5C90+3uH13Smzf5BVBLAwQUAAAACACOVVA77muEx7YAAAAPAQAAMAAAAGV4
Y2VwdGlvbnMvLnNldHRpbmdzL29yZy5tYXZlbi5pZGUuZWNsaXBzZS5wcmVmc1WPTQvCMAyG74X+
h4JnZRNRHOziUE+iqODFy+gyica1JO1+vyuIH7eEN3meZLRhNHsbTD43eVbMZsV0Yar16WymWbbU
qrYBeziwa5FASq3AEnqBiWdogaGzIJMeWNB1Za5VG4lWEanZupqk9OyGARkHkDBmEBd56LXCzlJs
YOeamLCBI2iVcurh4vghvrbJegcbfuO0vkEKwP/8D9p8qmuRpMevUx7oK/f0wyN8oHjD7g3+Of8F
UEsDBAoAAAAAAI5VUDsAAAAAAAAAAAAAAAAPAAAAZXhjZXB0aW9ucy9iaW4vUEsDBAoAAAAAAI5V
UDsAAAAAAAAAAAAAAAATAAAAZXhjZXB0aW9ucy9iaW4vY29tL1BLAwQKAAAAAACOVVA7AAAAAAAA
AAAAAAAAFwAAAGV4Y2VwdGlvbnMvYmluL2NvbS9mb28vUEsDBAoAAAAAAI5VUDsAAAAAAAAAAAAA
AAAiAAAAZXhjZXB0aW9ucy9iaW4vY29tL2Zvby9leGNlcHRpb25zL1BLAwQUAAAACACOVVA73ghV
zHgCAADDBgAAPgAAAGV4Y2VwdGlvbnMvYmluL2NvbS9mb28vZXhjZXB0aW9ucy9FeGNlcHRpb25z
JE15RXhjZXB0aW9uLmNsYXNz1VTfaxNBEJ6taZNco9Fo/Ykwgg8tQgLiUxv6YIkYSBRsLPi4udvk
ttztnrt7tfnLBAV998E/SZy9tNfYFokvonewd7Mz980338zttx+fvgDAU3hQhRUGW6FOOxOtO+I4
FJmTWtlOr3x9PJyVRhUqDOqlyWCtK5V0uwyubG4dMKjs6UhUoc6geciPeCfhatrpGaNNDdZZ5ftb
ZYTVyZGIkHJmMuEeBjOjx4lI7TYG9X6aJTKUDm2eCUNhyjqTh04bfD0+FKHb3EJpMVeRmEhFQBPy
0DvPE7cY3cZhbh3Oo5ArFMcnwAtBwVktGHKltMOxwJKj08jRzTKxfNybXDmZimXDR7HAWArDTRjP
UE/Q0YZ34XA25FkmohKpMI2vXSpfgrROKPfXBRudEvQNbvsGt0ex0R84dfCSYtvYd3POkTREJpmR
ayKMUKGnYnRK9vucfBG2w4RbixOZCBvUn2uijKm0KXdhvI1l4rPRbF8QyafyDDge8URGpMnYOuly
J4qyvbpjj0vZMm54KhxJ1u1RrSRmZLEsZfeXZpxrQre3OxeCvo91hFPh9jz1y5S+iHEJ7WUG4fxk
/SPz8CdtuvBz/FfdOs8+CKAGVxuwCtcYbGwOzk68fWekmu74E7E5IOxXeToWZuSZMmgNdMiTA26k
t082Ky6WlsGTwdJH8Q6DYF/nJhQvpEdoLjD2TIhSf2EuXp7OFoNGXylhCgmErcJdBg9/m5XB+kJe
+n4oraX6RqSThUdAhz/4i9G9Cmu0Vsl6RruMnsFnqL1rBR+h8ZWsFWjSulZ4anCd1sY8Cm5Ai54V
uFlE3YKNAvN24fPId+Ae1OF+EUMZfwJQSwMEFAAAAAgAjlVQO/RdDOZ3AgAA1QYAAEQAAABleGNl
cHRpb25zL2Jpbi9jb20vZm9vL2V4Y2VwdGlvbnMvRXhjZXB0aW9ucyRNeU1hcHBlZEV4Y2VwdGlv
bi5jbGFzc9VVTW/TQBCdhbRJTCG0UD6FNEgc2ksiEKe26oEqiEgJSDRU4rixJ81W9q7ZXZfmlyGB
BHcO/CTErNOmoalQe0FgS2vPzuTNmzfjzfefn78CwDN4WIUrAlqxyVpDY1p0FFPuldGu1Z6+PumN
ezLPKZluVaEioD41BSxuKa38toCra+t7Aio7JqEq1AU0DuShbKVS77fa1hpbg2ui8uOdtuRMekgJ
cuZcpTLAYG7NIKXMbWBU72R5qmLl0RU5WQ7Tztsi9sbim8EBxX5tHZXDQic0VJqBhuzhd1mkfja6
ib3CeZxEodRIR8fAM0HRaS0YS62NxwHhlKM3KNGPc7p43NtCe5XRRcP7I8KRIittPBqjGaLnjeDC
Oe1L04balQ4lKOdJ+78uWP+EYGhwMzS42R9Z81FyB88ptokdP+GcKMtk0jG7hmRJx4GKNRnbHwr2
JdiMU+kcDlVKLqq/MEwZM+Uy6ePRBk4Tnw5oc06kkCowkHgoU5WwJgPnlS88lWUHdQcBl7Pl0sqM
PEu21eZaWczE4bSU7d+acaYJW+3tiRD8+5FJcJ/8TqB+ntLzGOfQvsggnJ2sf2QeLtOmuY/jv+rW
WfZRBDW4vgQLcEPA6lr39MTb9Vbp/c1wIja6jP26yAZk+4GpgJWuiWW6J60K9vFmxY+UE/C0e8kD
eVNAtGsKG9NLFXAaM7wDHybWmZmOVycTJmCpozXZUghyVbgn4NEfcwtYnsvOKD3lHNfaZ80cPAb+
I4BwCb4XYJHXKlvPeVfwM/oCtfcr0SdY+sbWFWjwulh6anCT16VJFCzDCj8rcKuMug2rJead0heQ
78J9qMODMoYz/gJQSwMEFAAAAAgAjlVQO3xgmjMsAwAAhwkAAEoAAABleGNlcHRpb25zL2Jpbi9j
b20vZm9vL2V4Y2VwdGlvbnMvRXhjZXB0aW9ucyRNeU1hcHBlZEV4Y2VwdGlvbk1hcHBlci5jbGFz
c9VWW08TQRQ+g5XSFS2ggDdkVNTiQzcajQklTZRgJClqpJL4ON2d0iG7M+vMLJdfZqKJvvvgTzKe
2ZZSW0BqjNGH3bmcM9985zszZ/fr94+fAeAh3M/DCIHHgYr9plI+3wt4YoWSxl/tdhfW99dZkvCw
O5UNdR5yBCa22Q7zIya3/FeNbR7YPIwSmHeze/6u8bVBUOv3LSUwuiyksFUCZ0qLmwRyKyrkeThH
oHgIuKq10mNwnuS+vZWaGxXt8JAi10REzIHRRKtGxGOzRL3CWpxEIhCWmhR3QDdprE4DqzRtMyst
UmFoKkPeFBKBmmjBPksj2+tdpuupsbTtRZmkfK8D3OPkFboR0YBJqSxtcNrlaBVl1O4n/PR+b1Jp
RcxP615vcdoSXDMdtPapalKLE85Ej8mWi11IF4Iwlkv71wWrHxB0CS67BJfrLa12GWbwiGDLdM22
OYdCI5loH01NrrkMHBWtYhy/T9EW0nIQMWNoU0TceIVnCinTWJiY2aC1RLsbHx7p8oBIbivHgNEd
FokQNWkYK2xqeRa2U7fhcHG3hGkWc4uSLa9irChmaGg3lOpPyehLwvJqtS0Erm+pkG5xu+KoH6X0
IMYRtE9zEPpP1j9yHoZJ08Dl+K+y1c/e88CD4jjkYYLAdKl2WPE2rBZyq+IqYrGG2C/TuMF13TEl
MFVTAYs2mRZu3JnM2ZYwBJ7UfquEVwh4Vr3hJkEnRHtZGhansljrrfWB0tw/wKuMwWUC6uTa7Ur3
H70RBApd7gQeDB0QSrKhUh3w58IJXOzZzEWK8BtiSzKbarQ2a/3fv0rtF9++5aEZVZHTlc4h2hRG
oGxPXbnMdMTkXx3Y8rVWOyLM8ju91nPJXxwUCgLja1JynWnNTR4WCPhD8srDXQJzJy4iMDmwjMDs
MacRSa0LY/AG1DHLBm4C/h7gcxZ/VUawzcMYvgs4epTNA3ifwHs3Nf4BLnzJfCbxPZpZxmAK3+Nt
L7gIl7BFMWCmg1BFhJEuwuwRCDMZwkzbq4PgelfgKtpH4Vrmfx3msvYGzHdWUmxvZr638JlC2224
A/dwV4JtCdtFnM+52H4AUEsDBBQAAAAIAI5VUDtrEjB5fwIAAPEGAABLAAAAZXhjZXB0aW9ucy9i
aW4vY29tL2Zvby9leGNlcHRpb25zL0V4Y2VwdGlvbnMkTXlNYXBwZWRSdW50aW1lRXhjZXB0aW9u
LmNsYXNz1VVRb9MwED6Pbm1DoWMwGCCkQ9rD9tJKCCG0TXtgKqJSCxIrk3h0E3fxlNjBdsb6y5BA
gnce+EmIc7plpRsweECQSHbOd/n83XcX5/PX9x8B4AHcrcIcg0ehTtsjrdviKBSZk1rZdqd8XO2P
+zzLRPQyV06movRUocJgcXaVwcKWVNJtM7i0tr7HoLKjI1GFOoPmAT/k7YSr/XbHGG1qcJlVvrxS
RlidHIoIiUcmE+5hMDN6mIjUbmBQ76ZZIkPp0OaZMBSmrDN56LTBF8MDEbq1dZQWcxWJkVQENCIP
PfM8cdPRLezn1uEkCrlCcXQMPBUU1MtcMORKaYdDgSVHp5GjG2fi4nGzEv0ifBALjKUw3ITxGPUI
HS14F55UokQqTONzl8qnIK0Tyv11wQYnBH2BW77ArUFs9FtOFTwn2RZ23YRzJA2RScbkGgkjVOip
GJ2S/SYnX4StMOHW4kgmwgb1J5ooYyptyl0Yb2C58Wm7ts6I5LfyDDge8kRGpMnQOulyJ4q0vbpD
j0u7ZdzwVDiSbKtDuZKYkcUyle3vijFThK3O9kQIej/WEe4Lt+Opn6f0WYxzaF+kEWY76x/ph98p
05mP47+q1iz7IIAaXGnAPFxlsLzWOz3xdp2Ran/Tn4jNHmE/z9OhMAPPlMFST4c82eNGevt4seJi
aRk87v3Z8bzJINjVuQnFU+nhmlP0PS3i151qkmcnjcag0VVKmEIPYauwwuDeTykwWPkRCQLrS2sp
8wEpaOE+0G8B/MXonocFGqtkPaRVRnPwAWqvl4J30PhE1hw0aVwoPDVYpLExiYJrsERzBa4XUTdg
ucC8Wfg88i24DXW4U8TQjt8AUEsDBBQAAAAIAI5VUDtlxaxQMAMAAMYJAABRAAAAZXhjZXB0aW9u
cy9iaW4vY29tL2Zvby9leGNlcHRpb25zL0V4Y2VwdGlvbnMkTXlNYXBwZWRSdW50aW1lRXhjZXB0
aW9uTWFwcGVyLmNsYXNz1Vbfb9MwED6Psq5hsDF+jR9jBgZ0PDQSQgitVSWYhpjUAdrKJB7dxF2N
EjvYTtn+MiSQ4J0H/iTEOe260pZtFAHiIXHiO3/33Xf2JV++ffgEAPfhXh4mCFQCFftNpXy+G/DE
CiWNv9Z7XNrY22BJwsPNVFoR854lm9V5yBGYfcPazI+Y3PFfNN7wwOZhksCim9313xlfG8S2/sBS
ApMVIYWtEjhRXN4mkFtVIc/DKQIzB4BrWis9BadJ7usrqblRUZuHFCknImIOjCZaNSIemxXqFdbj
JBKBsNSkGAHdpLE6DazStMOsuEyFoakMeVNIBGqiBZ9ZGtl+7xLdSI2lHS/KJOW7XeA+J6/Qy4gG
TEplaYPTHkerKKN2L+HH9xvU+Aj3eovTluCa6aC1R1WTWpxwJrpftAHJXe5CuhSEsVzavy5YfZ+g
K3DJFbhUb2n1jmEFRyRbouu2wzkUGslEe2hqcs1l4KhoFeP72xRtIS0FETOGNkXEjVd4opAyjYWJ
mQ1aK7QX+GBnl4ZEcqEcA0bbLBIhatIwVtjU8ixtp27D4WK0hGkWc4uSVdYwVxQzNLSXSvWHYgwU
obJW7QiB61sqpDvcrjrqo5QexhhB+zgbYfTp/ef74VfKNHQ4/qtqDbL3PPBgZhryMEvgQrF20PG2
rBZyp+w64kwNsZ+ncYPrumNKYK6mAhZtMy3ce3cyZ1vCEKjWfqeTlwl4Vm1yk6Avgr4qjglXXq71
d/5Aae7vw5anYJ5A+/BO7hr5n1CcQKGXCYFH46aHOm2pVAf8qXDiz/SFdnljlC2xI5lNNVrj2uC3
sVw74rtYGZdYFald7s5uCyNQy8euo2bi4v64MhT5pVZtEWa1v7De1wee7fcSAtPrUnKdFYCbPCwR
eDgevTzcIbBw6FoC8z9bTeD64dsXmW4IY/Dk1HE/GLgB+FuB10n805nAMQ9TeC/g24NsHsD7CN7r
uen3cOZz5nMW75OZZQrm8D7d8YJzcB5HVAgudhGqiDDRQ7g0AmEhQ7jY8eoiuKfLcAXtk3A187+G
fm68DovdlRTHG5nvTbzm0HYLbsNdjEpwLOK4jPM5l9t3UEsDBBQAAAAIAI5VUDtq8SnLrQIAAP8H
AAAyAAAAZXhjZXB0aW9ucy9iaW4vY29tL2Zvby9leGNlcHRpb25zL0V4Y2VwdGlvbnMuY2xhc3PV
Vd1PE0EQn8XCtUe1gCL4ASyKCfjQJkZ9gIYHSU1IWk2kkvi4vdtyS+52z909pH+ZiSb67oN/knG2
hVJbwOKD0btk52Zn9je/+ej2249PXwDgCTzyYILAUqCSSlupCj8OeGqFkqZS6396kCMwc8iOWCVm
8qDyunXIA0tgqiqksNsErq1v7BPI7aiQe1AgUDrzrWmtdB6mSe77W6m5UfERDymGS0XMHDpNtWrF
PDGb1C/sJmksAmGpyVKu0U0aq7PAKk17Qdc3qDA0kyFvC4lAbbTgN8tiO+hdpo3MWNrzokxSfnwC
PODkF/op0oBJqSxtcdrnaBVl1HZSPr7fm0xakfBx3ZsRp5Hgmukg6lDVphY3nIk2Og2WpjzsI3VV
7XIX0qUgjOXS/vWCNU8JugaXXYPLzUirDww7eE6yZbpre5xDoZFM3EFTm2suA0dFqwT19xnaQloO
YmYMbYuYG7/wQiFlmgiTMBtEm7Qf+GwqyyNFcqEcA0aPWCxCrEnLWGEzy7tpu+q2HC5GS5lmCbdY
smoNc8Vihob2U9n+pRlDTajWtnuFwPORCukBtzuO+nmVHsU4h/Y4gzA8Wf/IPFylTSM/jv+qW8Ps
fR/ycL0Ik3CDwPx6/ezG27NayIMtdyOW6oj9KktaXDcdUwJzdRWweJ9p4fSTzZyNhCGwUr/0Ft4i
4O+pTAf8pXCnSgMsXXQCxV0pue6mx/HSXiCwcSniWqPTVwhMD2ge3CVQ+d3hoTkmMDuy58ESgWdX
BOp1jsDCBRYPKIHn44EO943A4kUmDx4SqP4Z7Cnl5csdYBXw3xLcQ/CdhClcPdSe4i5B6X+G/Ls5
/yMUv6I2ASVcp7qWPMzgWux5wSzMde03u+stmEf5GPFuo30RCnAH5T2U91Euo1xBuYryAco1KPwE
UEsDBBQAAAAIAI5VUDveKLjmuAQAAEkVAAAyAAAAZXhjZXB0aW9ucy9iaW4vY29tL2Zvby9leGNl
cHRpb25zL015UmVzb3VyY2UuY2xhc3PtWNtyG0UQ7ZEvkhWDsePYCSZkkoAjc9GGEG52EjCOHRQs
28TGFMXTaDWyx+xFzMz6UhRfwodQBVVQxSO/wL9Q9OzK0kqeuBZQ9JDCD7tz6e5zuqd3uuU//vr5
VwC4A1t5yBG46oa+0whDhx+7vKlFGCinevKEqzCSLs/DMIGXDtghczwW7DmbtQPuagKj90Qg9AMC
Q6WFXQLDK2EdZccITHRkV6UMZQEukPzkl4FEg94hr1OEawqPGSDalGHN475apMWxnX1O9UmTU2Og
bAyUEzDqsiAINa1xemqkTCuaCkVFUBcSRbwT3GpwyQMXERoy9HH+XYR7dVp2PaYUbQiPKyvKkyjQ
wuerp+4/a7xtLUWw13cU4TdDqRMcEVrMF8cqftMTrtBURU0u8SQCpWXk6lDSJNSlBYMfBXXeEIHB
xB0cs8jTaekyrUZK00SKsoDy45bhlFBx7KmOUh1SFoeln0IrJiIboV4L0YHzTjOtVEG+DM8/zsfM
Sp7H95i37LpcqaxKGdLsH7tc2cxMObNkJuCNkLavCxo2khRvI6hy9aQLzpjR+zI8CpaSdDndi/V8
k0wowTAva0leo8kdI8/wehg0Wp8CUGXNJq8PNgz9x+xrMGyfwCD4/XsnvuK15aa5287eD/+NeBEK
8MI4jMCLBC6V1jtFM+G6ZIrqxDperxuRX+NyxygRmFoPXebtMinMvLU4rPeFInBt/dxCvkRgZI/r
Ctbu6dLCWUACV1rHsyuUQMPLJlix22h8MlY4do6UI5XzaHUH5We61rZkWI/wPjQ4h8yLkFhR82Pt
ND0mggLMEVg7vwswTUCWk8J+RPYkEoF5WwxtXhY7eZkHil7Yy0YebuCevTrk4TWzZy0C5oy6wsL0
PqLmW4wJ3OiO8haTzOeay65wX+6y8UXE5UksiJZy/LgAbxKymKGl+r+2PiWBxuIvcoP5/PS8erJk
yt3n7re8niqbebhN4EJqgcDFlpQjwvY3V4B3CfzYr8N5BgW+41yqbKZ88U9SvnxAyM1++fIc9wz4
xbZj2lOD8V7tRNaP91LxXSLEGVx8n4uWBCtdT6x7v34CtDfkres3FfmPCfw+6Mj3v/8hMHtkb1EI
3CpVMtZEijZYx0abg/M9XuA6Uj8gzJmqdlqQRhMZAgR/6z8i8OdAC9NguzZ0soItxHbcUa0J031N
dFqssgkR1gjMOtlawuauFTh+UMOAM83xB7taysNG179VEl8JjFeFUjjaQTYKrgOBITB/BRyNwCg+
8zi7i6sE38VfoPD1VPEnGP8NZzmYwOdovIPG8TmeSMEkTMVrF2EapS7heArfM/iexdXL3wBRcMVi
+WWL5Wmr5VfgKgzDqzHTIbiGzG/GOHM4e91gKJg/A3jLGMKQQimRWIgpPECVXJvCGxYKczGFmUSq
RcGM3oK3wZgrI8mhmMwwzpxeIu9k8PyOBXbe6vndNpih0wP1Xgao9y1Qt61QH54H9VEGqEUL1H0r
1L12pqQg7meAeGCBeGyF+ASWUbMH4lNrkszmcGElkXjYyZfVGP8z1B5q469Z8LdjfJpIpfLlIeom
nFYxc3K4X4k1H8esJnDUYvU5rOPCZuzECGa3g9l9Hap/A1BLAwQUAAAACAAibE87A1Z/YtEDAABH
EgAAEgAAAGV4Y2VwdGlvbnMvcG9tLnhtbNVYS4/bNhA+e38Fu+ihPZDyYwsEC1bAFkXTLnaTIFs0
uQWUNLLpyKRAUrYXQf97aVK29baT7CboTZoX5/tmRhyb5kouITZou8qE/vVyYUx+HQQrtgZBWM7i
BRCp5sGb1/fBFRmT8aW3vN5qfrDebDZkM3N20/F4Ery/v3uwjiuGudCGiRguLxCyHtfaie9kzAyX
4ozjUJ+FE+D11YfxhzHZ6uQytEcgRFcygewfUNrGD10IGtRk3myuZJH/lYSxXJFUShrsBV7NlOEp
i40VwDaGfJetpkFF7O1sPh/ZnIt5uGGKBsfXUq1kyjPQ/rUqOkqclCfhMvmIJ+QXGvCkobQH8rUj
rK5wSusWOrfdQ90v6HOkCeQgEhAxr+bWVj+GiP6AMfICJAW6vXn/GzISgWBRBujdze93SBd5LpVB
GLdjtcjWhSC2g0jERdJgveVXoXvJthHmqzxrF6Hlti4rPSUTMpnSYF2tfJ2hCtKLHk2NIlviav0O
r6XJ4egJGeOHVzdvHv58/XcjASrYCipdhW6tFh7RO4hYntPAqb1lVPCsApKmXLDsVd2dBkdppcuy
wrZho7altIOHfRnsYO1nzA9cGWegUNUi+Zm0Vc4tJQp75+GCUS4WoLiBJDSqANv9h/e2bSxFyueF
6pkFZ6NloWLwI1E+dxsapuZgvGH53NEgA0fa4nfweR7J84xpnXK9+CxmD14nqW3ntpfsOzWoNFfP
94D2TkdzoJeuhXuw1MbYGWINys7EQPr7ifnxU+lRCv7tmObuKX6+5JdaDjH/LVJfFoKbczL2didz
nZEXpO9DSXUscwgNaBvJP3836uOMgzgH0DnkPxe42nyThGujeFSUH+uTSDcQYZYNXHPHO8buNthN
MbZb14vx1Wz83VDCKoIkgb4bvQpwnuK9NWY5PweoxcmyfMHw1fMCHB0HjK3ZlsAy6gA0qm2Hy2iH
As/IxOfYjWdUr1rPauAtff52sVhzx+hJPF3Lym7PzMFmUvug14fCEjshMwyskk/D4rjl1IJRBbnU
3EhVj38QN7vG7rTHy8tdZlN8NCYJrMmOciLAdCzAbiW6LfXofueOpujtwR+lUqGXu/h/uCtV1JYh
F6JQWVj+lEjkRmSSJYcT/W+J4JBgQIOdeT1Axh5lYcIEUlZkNsnyvVKWTvCDlDw5EV8KffqEkE8j
/krAk2rlf8pgzuLHn78U+WQAuA/9VbhHtc6vAxx5dC/32oE6jj6rfxuQ2ulWJJUPhlsP33YPdkP5
9L3cGGZX6W/dzf0gz8X//+/sbqAtuesOdy/s/jwKL/4DUEsDBAoAAAAAAKJaTzsAAAAAAAAAAAAA
AAAPAAAAZXhjZXB0aW9ucy9zcmMvUEsDBAoAAAAAAKJaTzsAAAAAAAAAAAAAAAAUAAAAZXhjZXB0
aW9ucy9zcmMvbWFpbi9QSwMECgAAAAAAolpPOwAAAAAAAAAAAAAAABkAAABleGNlcHRpb25zL3Ny
Yy9tYWluL2phdmEvUEsDBAoAAAAAAKJaTzsAAAAAAAAAAAAAAAAdAAAAZXhjZXB0aW9ucy9zcmMv
bWFpbi9qYXZhL2NvbS9QSwMECgAAAAAAolpPOwAAAAAAAAAAAAAAACEAAABleGNlcHRpb25zL3Ny
Yy9tYWluL2phdmEvY29tL2Zvby9QSwMECgAAAAAAplJQOwAAAAAAAAAAAAAAACwAAABleGNlcHRp
b25zL3NyYy9tYWluL2phdmEvY29tL2Zvby9leGNlcHRpb25zL1BLAwQUAAAACADwbE87/Vm98SgB
AAAvBAAAOwAAAGV4Y2VwdGlvbnMvc3JjL21haW4vamF2YS9jb20vZm9vL2V4Y2VwdGlvbnMvRXhj
ZXB0aW9ucy5qYXZhrZJNasMwEIXXDeQOQ1Y2BR2gLqVQsgmklNxAkadBrWWJkezalNy9kh3/NHEg
AcsLj5j3Po2fbLj45gcEoRX71JphJdA4qXObLBfLhVRGk4MvXvKK/VhGlglNyHZojddgMinByrF1
B9pyY5CuCz9IlzJtFOExxT6TAkTGrYUeYn9D7+HUtI67XrOtexV4HubpyAfeB34dvfmqv5kwnYey
K3InFV7CLhr/mKF67ZJotzfN2oYLPtoMFeZuNHTber6wvHQnjw7prhOc7spoKpdTFY8RYRG6gvIe
wyxSibQm0hTFzM8lXR2tNkgWa1ANdqA9wQoehy07oHsLX+udvnznCqM4ZvtCZmkUJ8PBxz7A8Lo7
w/MLuT3Kc+e9iU78I3MGSy1+/oB98QdQSwMEFAAAAAgALldQO2fF03BfAgAAPAkAADsAAABleGNl
cHRpb25zL3NyYy9tYWluL2phdmEvY29tL2Zvby9leGNlcHRpb25zL015UmVzb3VyY2UuamF2Ya1V
S4/aMBC+51e4OdkVcu5FqKwq2iKVdstW2rNxZsG7SRz5UUCI/147CSaBoKUIHxJrHt/MN5PMlIy/
sSUgLnP6IiWFDYfSCFnoYRSJvJTKoFf2l1Eh6fTX5KDtKjcUXhf0yTADGWjn2dGtNVWafpv86ZU/
MrO6qHhkiuX9WiVTy6E/1m8LanvZ9xkWD2WZCc48lRanHlsuFdA56NJVBIKFdlQF7ykanRyvH4fR
2JPAcZJvFWhpFYeYRONQqKi0i8zjZExrNNvOGyO0i5A71WPsCtfcDpxxbGBjkjJjonB4XtcAPRkl
iiVagpkaTBoYfxQYqwoUfxfIrEDBh3hY6fZRA13lqWxhRA4Npo/8n4EbgFAEPD62AsewicnBsqL8
k+VAUEjSH7NScq3Rl0otzVdpizTADdC0cKV3Mbqdc/IsgyXLHrjLUgd5KECSoBoScTSqb65xysfH
IZMBMsr650po6kpYmWESrj8kS0FhQoYt1PkJY1dpFwGfigmnBazr7DngAIGQeEHYxyU1deTMzkDb
9td1kq+Av0GaCBm+zdu72oC1fn9MDo1qCVufWx+pjvvVfHpZ5dv7sZpte1i1hO+w6rhfxapF6wK5
nJUlpPekOKsQe4meqN6lewZ1V9LNALk/9/Nf6kqmN/6LbZJrWLDjvgnckp1fI1bvbye57t9kuDNS
x2GT4riO6MawKOotZvWga9we2Oo4r1V/vXYd58OedIXRpR+DCo1GqLBZRjp2/nwO1rTOA9cvQhdW
ZCk+9/h00QNci8wWq+A7jM6XStXVC6sf+4Rbjd1f0eJ99A9QSwMECgAAAAAAolpPOwAAAAAAAAAA
AAAAAB4AAABleGNlcHRpb25zL3NyYy9tYWluL3Jlc291cmNlcy9QSwMECgAAAAAAjVZQOwAAAAAA
AAAAAAAAABsAAABleGNlcHRpb25zL3NyYy9tYWluL3dlYmFwcC9QSwMEFAAAAAgABWJPO11tFtgO
AQAABQYAACQAAABleGNlcHRpb25zL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3CtlMFSwyAQhu8+
BeYBSsapN0Knhx70aJ3xTMg2QSFhCGh5ezHR1klbbUhyYIDZf/9vl8mSyipJb1D4SN4Uvt92x+qO
PoJpwaOnzfZ55yR6gRyttZaCMyua+pbgEHMUaEoYqgzssuQDcgNt4wyHFiv/s8fG1VYoWME+e2Xv
bCFZXS62wJ0R1m/2HPRX4oRO0xPMZsB6kBJKJtemdApqG0t3Kc1oSF4Bf4MCiwb+RzkTHG2o/AjD
X8ETDBXTGopRtgPJZPPvx4xgGCpPULA+j7ZMlwkNy3XsXfTwZnTZ4Z4df+kDM75P08sV/yGaDeC0
vOtEc3ZgZbLYPvTSObsRMsb2pJceYAjuR32Y3930/wRQSwMEFAAAAAgABV5PO/sd7AuGAQAApQIA
ADkAAABleGNlcHRpb25zL3NyYy9tYWluL3dlYmFwcC9NYXBwYWJsZUNvbnRhaW5lckV4Y2VwdGlv
bi5qc3B9UdFOpEAQfN+vaCch0USYxd17EAeisiR6cXWjmMs9jtBZSGAGh8Z17+uPgYhrvBxP1T3V
VV2NcFwXZtB/K511NSrqYQBPmHWmpH3ynmFDpVaJMdps5BYHbmxQEuagVc99yAj8H6dwNp+fn4Lv
B4vzYLmAq/VAveqo0MaintrIrmqlyvWfmes60WwmnMumF4WynQxCRqZDBplW1K+T7hvbwnfiBdUV
A8tPVKbzUm1DtpbZo66lYr2aOFo9xOnvTQI36foONs/Xd7cxMJfzX4uY81W6Gh+W3tyH1EjVljaa
rDhP7pndlhVETcD5brfzdgtPmy1PHwffJa+0btHLKWd2b9uLhoCiQJmPcChrJAlWx8XXrnwLWTwG
cW2SKdZBpAvICmlapHAKcyBHJVUY/XzagD2O4GM9OvNPa/Gi8/3BWOFHa9k08qVC6y9LhWb6mYD2
2MMlew3/69jECkA4IeBH6W2R4kq27fGJhfeyxuMTcKLvCrHsWvzXtO2P0/8XEnxMI/h45r9QSwME
FAAAAAgAzmBPO6Rf3VVCAQAA+AEAACcAAABleGNlcHRpb25zL3NyYy9tYWluL3dlYmFwcC9Ob3RG
b3VuZC5qc3BNUMFOg0AQvfMV4ya9FRbaeihCowJGE9uSBmM8rrApJLCLyyDWr3cXYts9vZ2ZN2/e
C2a2DRboF8u8b7hADX3YSXySvSjGTqQ4Q16AFLqzzxG82zksXHc9B2/hu57vrSHdjqMPPZZSGaRH
W9bXHROF/LVse7axrGB237Ijh6pLlJIq1TgkqHpOIJcCtXh2ak2J/yAtsakJmPlE5LKoxDEkW5Yf
ZMME0duCm3gfZR9pAs/Z9hXSt8fXlwiITen7MqI0zuKpsXJcDzLFRFdhJQWrKU12xFxLSsTWp3QY
BmdYOlIdaXYYdVe0lrLjToEFMXeb2mY0GJScFRMcvw1HBmaPzb/66jsk0WTENk7Otq4s3UFeMtVx
DM9mrtZhhTXf6PRhjD+gU2GSphft4FMWpyte6V1IMIYLJl1N8f7JEyOgk5c/UEsDBBQAAAAIAHpd
TzvZg0HVbAEAAFMCAAA5AAAAZXhjZXB0aW9ucy9zcmMvbWFpbi93ZWJhcHAvU2VjdXJpdHlFeGNl
cHRpb25FcnJvclBhZ2UuanNwZVFhT4MwEP2+X3E2IdFE6HDzg1iIykjUOF0UY/xY4TJIoMVyOOev
l0KcM/bTu+vre/euwnFdmEB/FjrralTUwwCeMOtMSdvkM8OGSq0SY7RZyTUO3NigJMxBq577kBH4
p8dwMp2eHYPvB7OzYD6Dy+VAveyo0MaintrIrmqlyvXXxHWdaDIRzkXTi0LZ7gxCRqZDBplW1I+T
bhvbwk/iBdUVA8tPVKbzUq1DtpTZo66lYr2aOFg8xOnrKoHrdHkHq+eru5sYmMv5yyzmfJEuxou5
N/UhNVK1pY0mK86Te2anZQVRE3C+2Wy8zczTZs3Tx8F3ziutW/Ryypmd2/aiIaAoUOYjHMoaSYLV
cfG9Kz9CFo9BXJtkF2sv0jlkhTQtUrgLsydHJVUY3T6twC5H8LEenfmvtXjT+XbvWeFH//4Q0O54
WGD/1P/L3rECEE4I+FN6a6S4km17eGThvazx8Aic6FdB8NFb8HEp31BLAwQKAAAAAACNVlA7AAAA
AAAAAAAAAAAAIwAAAGV4Y2VwdGlvbnMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvUEsDBBQAAAAI
AMpuTzsqiaOVRwEAAAACAAAuAAAAZXhjZXB0aW9ucy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9z
dW4td2ViLnhtbFWQT08CMRDF736KsRcvdgdJSNTsQhQwIf4jAQ6eSO0Oy2K3bdouC9/esqhZb503
7/X9MunoUCnYk/Ol0Rm7SXoMSEuTl7rI2Gr5xG/ZaHiRXk7ex8uP+RR8rXlDn1xYC/PV48tsDIwj
LmoNr6V0xh99oMpfw0zLBHGynMCDtaqUIsQGWJCLZXCX9NqnogD9ZIA4fWPAtiHYe8SmaZJYk0hT
oTeb0AhHGPt8m8U85B47GOv+esB7SZRZBO3ykXPG8dqpjMUVQCqNDnQI3BkThkgHSfZE5VP8t2mt
SnjPlRF5xM1JUSECZWwjlCeGrWXnLY+5TVmcxihYZyy5cAQtquj9IrIFaXIxmTPYC1VHNbia2DkQ
Izl56cqWYvgc/SBAGnsEs4GwJfiLg/+5Vst1BTuxPzlzSlLs/nEGwV+SlhO7oGn3dMOLb1BLAwQU
AAAACABMUlA7PeHOavQBAACHBQAAKgAAAGV4Y2VwdGlvbnMvc3JjL21haW4vd2ViYXBwL1dFQi1J
TkYvd2ViLnhtbK1UW2vbMBR+Xn6F0ePAUpK1MILiMrYWNtox6Mb2Vk7sE1eZLQlJzuXf70ROnMTN
aHfxi/E557ucC5ZX67pKlui8MnrKRnzIEtS5KZQup+zb15v0LbvKBnKFsxSsTaha+8naqyl7DMFO
hFitVnz1hhtXivFwOBI/7m7v80esIVXaB9A5ssGrCOsgC1gC943muakFpYT2MYbIdgIk94JqsXP1
MH645GtfbIW8mvgof2tyCLGpZ3mSv1FSxZR9x9k7Cn78wJIaAxQQICWsrTDglM2h8tRRN9wxv2TZ
IKFHenRLKmq/jiOphhqzTwTBTUL0CfFXqu1EipOip9i8Au8zMhCbWEQS7q2ifnQApdHxXSm/b9/v
94kDd0tyIFdahdSCg/oQjIkYa630JElurkpunbHowoZbyH9CiV6KI8w5siVUTcs2N4bjOke7bbwD
tvmDN3HOnKwMFKnRKV2fC43NRlL0Q+0WxMkaujHWtGg6//+0nMZV5DAEdDrbnpFDbxqXoxevpThO
nno6dSHROeOotDym7gaUho3FLJ5vBbqk7eaNU2FzvS+Qold7PK22gUw8QV1vRb+QJl94ux3irnLn
tO/pRSZ7pwIn13lHPcOswu4s/6yB38P/qYEYpF8iZhfDiz0qfp8z8dmEG9Po4nlJuf+rZINfUEsD
BAoAAAAAAKJaTzsAAAAAAAAAAAAAAAAUAAAAZXhjZXB0aW9ucy9zcmMvdGVzdC9QSwMECgAAAAAA
olpPOwAAAAAAAAAAAAAAABkAAABleGNlcHRpb25zL3NyYy90ZXN0L2phdmEvUEsDBAoAAAAAAGhX
UDsAAAAAAAAAAAAAAAASAAAAZXhjZXB0aW9ucy90YXJnZXQvUEsDBAoAAAAAAGhXUDsAAAAAAAAA
AAAAAAAaAAAAZXhjZXB0aW9ucy90YXJnZXQvY2xhc3Nlcy9QSwMECgAAAAAAaFdQOwAAAAAAAAAA
AAAAAB8AAABleGNlcHRpb25zL3RhcmdldC90ZXN0LWNsYXNzZXMvUEsBAhQACgAAAAAAaFdQOwAA
AAAAAAAAAAAAAAsAAAAAAAAAAAAQAAAAAAAAAGV4Y2VwdGlvbnMvUEsBAhQAFAAAAAgAkVVQO2LR
/zgOAQAAYAIAABUAAAAAAAAAAQAgAAAAKQAAAGV4Y2VwdGlvbnMvLmNsYXNzcGF0aFBLAQIUABQA
AAAIAAxrTzsZprC+1wAAADQCAAATAAAAAAAAAAEAIAAAAGoBAABleGNlcHRpb25zLy5wcm9qZWN0
UEsBAhQACgAAAAAAkVVQOwAAAAAAAAAAAAAAABUAAAAAAAAAAAAQAAAAcgIAAGV4Y2VwdGlvbnMv
LnNldHRpbmdzL1BLAQIUABQAAAAIAJFVUDsMrt7MfgAAANEAAAAvAAAAAAAAAAEAIAAAAKUCAABl
eGNlcHRpb25zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmc1BLAQIUABQAAAAI
AI5VUDvua4THtgAAAA8BAAAwAAAAAAAAAAEAIAAAAHADAABleGNlcHRpb25zLy5zZXR0aW5ncy9v
cmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnNQSwECFAAKAAAAAACOVVA7AAAAAAAAAAAAAAAADwAA
AAAAAAAAABAAAAB0BAAAZXhjZXB0aW9ucy9iaW4vUEsBAhQACgAAAAAAjlVQOwAAAAAAAAAAAAAA
ABMAAAAAAAAAAAAQAAAAoQQAAGV4Y2VwdGlvbnMvYmluL2NvbS9QSwECFAAKAAAAAACOVVA7AAAA
AAAAAAAAAAAAFwAAAAAAAAAAABAAAADSBAAAZXhjZXB0aW9ucy9iaW4vY29tL2Zvby9QSwECFAAK
AAAAAACOVVA7AAAAAAAAAAAAAAAAIgAAAAAAAAAAABAAAAAHBQAAZXhjZXB0aW9ucy9iaW4vY29t
L2Zvby9leGNlcHRpb25zL1BLAQIUABQAAAAIAI5VUDveCFXMeAIAAMMGAAA+AAAAAAAAAAEAIAAA
AEcFAABleGNlcHRpb25zL2Jpbi9jb20vZm9vL2V4Y2VwdGlvbnMvRXhjZXB0aW9ucyRNeUV4Y2Vw
dGlvbi5jbGFzc1BLAQIUABQAAAAIAI5VUDv0XQzmdwIAANUGAABEAAAAAAAAAAEAIAAAABsIAABl
eGNlcHRpb25zL2Jpbi9jb20vZm9vL2V4Y2VwdGlvbnMvRXhjZXB0aW9ucyRNeU1hcHBlZEV4Y2Vw
dGlvbi5jbGFzc1BLAQIUABQAAAAIAI5VUDt8YJozLAMAAIcJAABKAAAAAAAAAAEAIAAAAPQKAABl
eGNlcHRpb25zL2Jpbi9jb20vZm9vL2V4Y2VwdGlvbnMvRXhjZXB0aW9ucyRNeU1hcHBlZEV4Y2Vw
dGlvbk1hcHBlci5jbGFzc1BLAQIUABQAAAAIAI5VUDtrEjB5fwIAAPEGAABLAAAAAAAAAAEAIAAA
AIgOAABleGNlcHRpb25zL2Jpbi9jb20vZm9vL2V4Y2VwdGlvbnMvRXhjZXB0aW9ucyRNeU1hcHBl
ZFJ1bnRpbWVFeGNlcHRpb24uY2xhc3NQSwECFAAUAAAACACOVVA7ZcWsUDADAADGCQAAUQAAAAAA
AAABACAAAABwEQAAZXhjZXB0aW9ucy9iaW4vY29tL2Zvby9leGNlcHRpb25zL0V4Y2VwdGlvbnMk
TXlNYXBwZWRSdW50aW1lRXhjZXB0aW9uTWFwcGVyLmNsYXNzUEsBAhQAFAAAAAgAjlVQO2rxKcut
AgAA/wcAADIAAAAAAAAAAQAgAAAADxUAAGV4Y2VwdGlvbnMvYmluL2NvbS9mb28vZXhjZXB0aW9u
cy9FeGNlcHRpb25zLmNsYXNzUEsBAhQAFAAAAAgAjlVQO94ouOa4BAAASRUAADIAAAAAAAAAAQAg
AAAADBgAAGV4Y2VwdGlvbnMvYmluL2NvbS9mb28vZXhjZXB0aW9ucy9NeVJlc291cmNlLmNsYXNz
UEsBAhQAFAAAAAgAImxPOwNWf2LRAwAARxIAABIAAAAAAAAAAQAgAAAAFB0AAGV4Y2VwdGlvbnMv
cG9tLnhtbFBLAQIUAAoAAAAAAKJaTzsAAAAAAAAAAAAAAAAPAAAAAAAAAAAAEAAAABUhAABleGNl
cHRpb25zL3NyYy9QSwECFAAKAAAAAACiWk87AAAAAAAAAAAAAAAAFAAAAAAAAAAAABAAAABCIQAA
ZXhjZXB0aW9ucy9zcmMvbWFpbi9QSwECFAAKAAAAAACiWk87AAAAAAAAAAAAAAAAGQAAAAAAAAAA
ABAAAAB0IQAAZXhjZXB0aW9ucy9zcmMvbWFpbi9qYXZhL1BLAQIUAAoAAAAAAKJaTzsAAAAAAAAA
AAAAAAAdAAAAAAAAAAAAEAAAAKshAABleGNlcHRpb25zL3NyYy9tYWluL2phdmEvY29tL1BLAQIU
AAoAAAAAAKJaTzsAAAAAAAAAAAAAAAAhAAAAAAAAAAAAEAAAAOYhAABleGNlcHRpb25zL3NyYy9t
YWluL2phdmEvY29tL2Zvby9QSwECFAAKAAAAAACmUlA7AAAAAAAAAAAAAAAALAAAAAAAAAAAABAA
AAAlIgAAZXhjZXB0aW9ucy9zcmMvbWFpbi9qYXZhL2NvbS9mb28vZXhjZXB0aW9ucy9QSwECFAAU
AAAACADwbE87/Vm98SgBAAAvBAAAOwAAAAAAAAABACAAAABvIgAAZXhjZXB0aW9ucy9zcmMvbWFp
bi9qYXZhL2NvbS9mb28vZXhjZXB0aW9ucy9FeGNlcHRpb25zLmphdmFQSwECFAAUAAAACAAuV1A7
Z8XTcF8CAAA8CQAAOwAAAAAAAAABACAAAADwIwAAZXhjZXB0aW9ucy9zcmMvbWFpbi9qYXZhL2Nv
bS9mb28vZXhjZXB0aW9ucy9NeVJlc291cmNlLmphdmFQSwECFAAKAAAAAACiWk87AAAAAAAAAAAA
AAAAHgAAAAAAAAAAABAAAACoJgAAZXhjZXB0aW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvUEsBAhQA
CgAAAAAAjVZQOwAAAAAAAAAAAAAAABsAAAAAAAAAAAAQAAAA5CYAAGV4Y2VwdGlvbnMvc3JjL21h
aW4vd2ViYXBwL1BLAQIUABQAAAAIAAViTztdbRbYDgEAAAUGAAAkAAAAAAAAAAEAIAAAAB0nAABl
eGNlcHRpb25zL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3BQSwECFAAUAAAACAAFXk87+x3sC4YB
AAClAgAAOQAAAAAAAAABACAAAABtKAAAZXhjZXB0aW9ucy9zcmMvbWFpbi93ZWJhcHAvTWFwcGFi
bGVDb250YWluZXJFeGNlcHRpb24uanNwUEsBAhQAFAAAAAgAzmBPO6Rf3VVCAQAA+AEAACcAAAAA
AAAAAQAgAAAASioAAGV4Y2VwdGlvbnMvc3JjL21haW4vd2ViYXBwL05vdEZvdW5kLmpzcFBLAQIU
ABQAAAAIAHpdTzvZg0HVbAEAAFMCAAA5AAAAAAAAAAEAIAAAANErAABleGNlcHRpb25zL3NyYy9t
YWluL3dlYmFwcC9TZWN1cml0eUV4Y2VwdGlvbkVycm9yUGFnZS5qc3BQSwECFAAKAAAAAACNVlA7
AAAAAAAAAAAAAAAAIwAAAAAAAAAAABAAAACULQAAZXhjZXB0aW9ucy9zcmMvbWFpbi93ZWJhcHAv
V0VCLUlORi9QSwECFAAUAAAACADKbk87KomjlUcBAAAAAgAALgAAAAAAAAABACAAAADVLQAAZXhj
ZXB0aW9ucy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdW4td2ViLnhtbFBLAQIUABQAAAAIAExS
UDs94c5q9AEAAIcFAAAqAAAAAAAAAAEAIAAAAGgvAABleGNlcHRpb25zL3NyYy9tYWluL3dlYmFw
cC9XRUItSU5GL3dlYi54bWxQSwECFAAKAAAAAACiWk87AAAAAAAAAAAAAAAAFAAAAAAAAAAAABAA
AACkMQAAZXhjZXB0aW9ucy9zcmMvdGVzdC9QSwECFAAKAAAAAACiWk87AAAAAAAAAAAAAAAAGQAA
AAAAAAAAABAAAADWMQAAZXhjZXB0aW9ucy9zcmMvdGVzdC9qYXZhL1BLAQIUAAoAAAAAAGhXUDsA
AAAAAAAAAAAAAAASAAAAAAAAAAAAEAAAAA0yAABleGNlcHRpb25zL3RhcmdldC9QSwECFAAKAAAA
AABoV1A7AAAAAAAAAAAAAAAAGgAAAAAAAAAAABAAAAA9MgAAZXhjZXB0aW9ucy90YXJnZXQvY2xh
c3Nlcy9QSwECFAAKAAAAAABoV1A7AAAAAAAAAAAAAAAAHwAAAAAAAAAAABAAAAB1MgAAZXhjZXB0
aW9ucy90YXJnZXQvdGVzdC1jbGFzc2VzL1BLBQYAAAAAKAAoABUNAACyMgAAAAA
--_70c406c9-dd59-4f88-9ae6-8dcca57dae60_--