PK /¯-Aoa«,mimetypeapplication/epub+zipPK/¯-AiTunesMetadata.plistâû artistName Oracle Corporation book-info cover-image-hash 755051759 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 726297959 publisher-unique-id b65943 unique-id 163524 genre Oracle Documentation itemName Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12c リリース1(12.1.1) releaseDate 2012-01-13T07:52:37Z year 2012 PKA,äçâPK/¯-AMETA-INF/container.xmlâÿ PKYuìçâPK/¯-AOEBPS/xmlhttp.htm©IV¶ XML over HTTPを使用するWebサービスのプログラミング

20 XML over HTTPを使用するWebサービスのプログラミング

この章では、XML over HTTPを使用するWebサービスのプログラミング方法について説明します。

この章の内容は以下のとおりです。

XML over HTTPを使用するWebサービスのプログラミングの概要

標準的なSOAP over HTTPの使用例に加えて、XML over HTTP方式の一部のWebサービスでもWebLogic JAX-WSを使用できます。XML over HTTP方式を使用すると、JAX-WSプログラミング・モデルの利便性を活用しながら、単純でRESTfulなWebサービスを構築できます。


注意:

ベスト・プラクティスとしてお薦めする方法は、Jersey JAX-RS RIを使用してRESTfulなWebサービスを開発することです(RESTfulなWebサービスの開発に関する項を参照)。Jersey JAX-RS RIでは、RESTfulなWebサービスを構築するために本番環境として使用できるオープン・ソースのRIが提供され、すべてのHTTPメソッドがサポートされます。


HTTPプロトコルを使用してWebサービス・リソースにアクセスする場合、リソース識別子はリソースのURLであり、このリソースで実行される標準の操作はHTTPの1つのメソッド(GET、PUT、DELETE、POST、またはHEAD)です。


注意:

このJAX-WS実行で、サポートされたHTTPメソッドのセットがGETおよびPOSTに限定されています。DELETE、PUTおよびHEADがサポートされません。これらのメソッドを含むどのHTTP要求も405不可のメソッドというエラー・メッセージが表示され、拒否されます。

PUTおよびDELETEの機能が必須の場合、POSTメソッドで実行される実際のメソッドをトンネリングすることによって目的のアクションを実行できます。これは、オーバーロードPOSTと呼ばれる回避策です。「REST過負荷POST」でのWeb検索は、これを実行するためのいくつかの方法を返します。


javax.xml.ws.Provider<T>インタフェースのinvoke()メソッドを使用してRESTfulに類似したエンドポイントを構築します(http://download.oracle.com/javaee/5/api/javax/xml/ws/Provider.htmlを参照)。Providerインタフェースは、サービス・エンドポイント・インタフェース(SEI)を構築するための動的な代替手段を提供します。

この項の手順では、XML over HTTPを使用してWebサービスを実装するために必要なJWSファイルをプログラミングおよびコンパイルする方法について説明します。この手順では、これらのJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。

Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xmlファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。

表20-1 RESTfulなWebサービスのプログラミング手順

#
手順説明

1

XML over HTTPを使用するWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。

使い慣れたIDEまたはテキスト・エディタを使用します。「XML over HTTPを使用するWebサービスのプログラミングのガイドライン」を参照してください。

2

build.xmlファイルを更新して、JWSファイルをWebサービスにコンパイルするjwsc Antタスクの呼出しを含めます。

例:

   <jwsc srcdir="." destdir="output/restEar">
      <jws file="NearbyCity.java" type="JAXWS"/>
    </jwsc>

詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

3

Antターゲットを実行して、Webサービスを構築します。

例:

prompt> ant build-rest

4

Webサービスを通常どおりデプロイします。

『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。

5

Webサービス・クライアントからWebサービスにアクセスします。

「クライアントからWebサービスにアクセスする」を参照してください。


XML over HTTPを使用するWebサービスのプログラミングのガイドライン

次のサンプルでは、XML over HTTPを使用するWebサービスを実装する簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.jaxws.rest;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.BindingType;
import javax.xml.ws.Provider; 
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.http.HTTPBinding;
import javax.xml.ws.http.HTTPException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.util.StringTokenizer;

@WebServiceProvider(
   targetNamespace="http://example.org",
   serviceName = "NearbyCityService")
@BindingType(value = HTTPBinding.HTTP_BINDING) 

public class NearbyCity implements Provider<Source> { 
  @Resource(type=Object.class)
  protected WebServiceContext wsContext;

  public Source invoke(Source source)  { 
    try {
        MessageContext messageContext = wsContext.getMessageContext();

        // Obtain the HTTP mehtod of the input request.
        javax.servlet.http.HttpServletRequest servletRequest = 
          (javax.servlet.http.HttpServletRequest)messageContext.get(
           MessageContext.SERVLET_REQUEST);
        String httpMethod = servletRequest.getMethod();
        if (httpMethod.equalsIgnoreCase("GET"));
        {

            String query =
                 (String)messageContext.get(MessageContext.QUERY_STRING); 
            if (query != null && query.contains("lat=") &&
                query.contains("long=")) {
                return createSource(query); 
            } else {
                System.err.println("Query String = "+query);
                throw new HTTPException(404);
            }
            } catch(Exception e) {
              e.printStackTrace();
              throw new HTTPException(500);
            }
        }
        } else {
   // This operation only supports "GET"
       throw new HTTPException405);
   }
    private Source createSource(String str) throws Exception {
        StringTokenizer st = new StringTokenizer(str, "=&/");
        String latLong = st.nextToken();
        double latitude = Double.parseDouble(st.nextToken());
        latLong = st.nextToken();
        double longitude = Double.parseDouble(st.nextToken());
        City nearby = City.findNearBy(latitude, longitude);
        String body = nearby.toXML();
        return new StreamSource(new ByteArrayInputStream(body.getBytes()));
    }

    static class City {
         String city;
         String state;
         double latitude;
         double longitude;
         City(String city, double lati, double longi, String st) {
             this.city = city;
             this.state = st;
             this.latitude = lati;
             this.longitude = longi;
         }

         double distance(double lati, double longi) {
            return Math.sqrt((lati-this.latitude)*(lati-this.latitude) + 
                (longi-this.longitude)*(longi-this.longitude)) ;
         }

         static final City[] cities = {
            new City("San Francisco",37.7749295,-122.4194155,"CA"),
            new City("Columbus",39.9611755,-82.9987942,"OH"),
            new City("Indianapolis",39.7683765,-86.1580423,"IN"),
            new City("Jacksonville",30.3321838,-81.655651,"FL"),
            new City("San Jose",37.3393857,-121.8949555,"CA"),
            new City("Detroit",42.331427,-83.0457538,"MI"),
            new City("Dallas",32.7830556,-96.8066667,"TX"),
            new City("San Diego",32.7153292,-117.1572551,"CA"),
            new City("San Antonio",29.4241219,-98.4936282,"TX"),
            new City("Phoenix",33.4483771,-112.0740373,"AZ"),
            new City("Philadelphia",39.952335,-75.163789,"PA"),
            new City("Houston",29.7632836,-95.3632715,"TX"),
            new City("Chicago",41.850033,-87.6500523,"IL"),
            new City("Los Angeles",34.0522342,-118.2436849,"CA"),
            new City("New York",40.7142691,-74.0059729,"NY")};
        static City findNearBy(double lati, double longi) {
            int n = 0;
            for (int i = 1; i < cities.length; i++)  {
                if (cities[i].distance(lati, longi) <  
                     cities[n].distance(lati, longi)) {
                    n = i;
                }
            }
            return cities[n];
        }

        public String toXML() {
             return "<ns:NearbyCity xmlns:ns=\"http://example.org\"><City>"
                  +this.city+"</City><State>"+ this.state+"</State><Lat>"
                  +this.latitude +
                  "</Lat><Lng>"+this.longitude+"</Lng></ns:NearbyCity>";
        }
    }
}

XML over HTTPを使用するWebサービスを実装するJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

クライアントからWebサービスにアクセスする

Webサービス・クライアントからWebサービスにアクセスするには、リソースのURIを使用します。例:

URL url = new URL (http://localhost:7001/NearbyCity/NearbyCityService?lat=35&long=-120);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
// Get result
InputStream is = connection.getInputStream();

この例では、緯度(lat)と経度(long)の値を指定して、必要なリソースにアクセスしています。

XML over HTTPを使用するWebサービスの保護

Webアプリケーションの保護に使用するメソッドと同じメソッドを使用して、XML over HTTPを使用するWebサービスを保護することができます。詳細については、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のWebアプリケーションの保護のオプションに関する項を参照してください。

PK^*®I©IPK/¯-AOEBPS/wspolicy.htm€ÿ Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル

A Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル

この付録では、あらかじめパッケージ化されたWS-Policyファイルの概要を説明します。WS-Policyファイルは、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスで、信頼性のあるメッセージング、接続作成、またはこの両方の機能をサポートします。

これらのあらかじめパッケージ化されたファイルを変更することはできません。これらの値がニーズに合ない場合は、独自のWS-Policyファイルを作成する必要があります。詳細は、次の内容を参照してください。

信頼性のあるメッセージングおよび接続作成ポリシー・アサーションの詳細は、次を参照してください。

次の表に、あらかじめパッケージ化されたWS-Policyファイルをまとめます。この表は、WS-Policyファイルをメソッド・レベルでアタッチできるかどうかも指定します。この列の値が「No」の場合、WS-Policyファイルをクラス・レベルでのみアタッチできます。

表A-1 信頼性のあるメッセージングをサポートする、あらかじめパッケージ化されているWS-Policyファイル

あらかじめパッケージ化されているWS-Policyファイル説明メソッド・レベルのアタッチ
DefaultReliability1.2.xml

配信保証に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702のWS Reliable Messaging Policy Assertion 1.2が基になっています。「DefaultReliability1.2.xml(WS-Policyファイル)」を参照してください。

はい

DefaultReliability1.1.xml

サービス品質に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。「DefaultReliability1.1.xml (WS-Policyファイル)」を参照してください。

はい

DefaultRelibility.xml

非推奨。Webサービスの信頼性のあるメッセージングのアサーションは、WS Reliable Messaging Policy Assertion Version 1.0(http://schemas.xmlsoap.org/ws/2005/02/rm/WS-RMPolicy.pdf)に基づいています。このリリースでは、信頼性のあるメッセージングのポリシー・アサーションの多くが、JWSアノテーションまたは構成を通じて管理されます。

信頼性のあるメッセージングのポリシー・アサーションに一般的な値(非アクティブ・タイムアウト10分、確認応答の間隔200ミリ秒、基本的な再送信間隔3秒など)を指定します。「DefaultReliability.xml WS-Policyファイル(WS-Policy)[非推奨]」を参照してください。

はい

LongRunningReliability.xml

非推奨。長期実行プロセスに関して、Webサービスの信頼性のあるメッセージングのアサーションは、WS Reliable Messaging Policy Assertion Version 1.0に基づいています。このリリースでは、信頼性のあるメッセージングのポリシー・アサーションの多くが、JWSアノテーションまたは構成を通じて管理されます。

1つ前に示した、信頼性のあるメッセージングのデフォルトWS-Policyファイルとほぼ同じですが、アクティビティのタイムアウト間隔に、より大きな値(24時間)を指定する点が異なります。「LongRunningReliability.xml WS-Policyファイル(WS-Policy)[非推奨]」を参照してください。

はい

Mc1.1.xml

Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。WS-Policy 1.5プロトコルが使用されます。「Mc1.1.xml(WS-Policyファイル)」を参照してください。

いいえ

Mc.xml

Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。WS-Policy 1.2プロトコルが使用されます。「Mc.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.2_ExactlyOnce_WithMC1.1.xml

サービス品質に関するポリシー・アサーションを指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。「Reliability1.2_ExactlyOnce_WithMC1.1.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.2_SequenceSTRSecurity

信頼性のあるシーケンスでメッセージを保護するために、CreateSequenceメッセージで参照されるwsse:SecurityTokenReferenceをランタイムが使用するように指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702のWS Reliable Messaging Policy Assertion 1.2が基になっています。「Reliability1.2_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.1_SequenceSTRSecurity

Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。「Reliability1.1_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

はい

Reliability1.2_SequenceTransportSecurity

トランスポート・レベルのセキュリティとサービス品質に関連するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702のWS Reliable Messaging Policy Assertion 1.2が基になっています。「Reliability1.2_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

はい

Reliability1.1_SequenceTransportSecurity

トランスポート・レベルのセキュリティとサービス品質に関連するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。「Reliability1.1_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

はい

Reliability1.0_1.2.xml

1.2と1.0のWS-Reliableメッセージング・ポリシー・アサーションを結合します。1.2バージョンのポリシー・アサーションはWebサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。このサンプルは、適切なポリシーの選択に基づいて実行時に適用されるポリシー・アサーションを決定します。「Reliability1.0_1.2.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.0_1.1.xml

1.1と1.0のWS Reliable Messagingポリシー・アサーションを結合します。「Reliability1.0_1.1.xml(WS-Policy.xmlファイル)」を参照してください。

はい


DefaultReliability1.2.xml(WS-Policyファイル)

DefaultRealiability1.2.xml WS-Policyファイルは、配信保証に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrm/200702/wsrm-1.2-spec-os.htmlのWS Reliable Messaging Policy Assertion 1.2が基になっています。

<?xml version="1.0" encoding="UTF-8"?>
<wsp15:Policy xmlns:wsp15="http://www.w3.org/ns/ws-policy">
   <wsp15:All>
      <wsrmp:RMAssertion 
         xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
         <wsrmp:DeliveryAssurance>
            <wsp15:Policy>
               <wsrmp:ExactlyOnce/>
               <wsrmp:InOrder/>
            </wsp15:Policy>
          </wsrmp:DeliveryAssurance>
        </wsrmp:RMAssertion>
   </wsp15:All>
</wsp15:Policy>

DefaultReliability1.1.xml(WS-Policyファイル)

DefaultRealiability1.1.xml WS-Policyファイルは、サービス品質に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。

<?xml version="1.0"?>

<wsp:Policy 
  xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
  >
  <wsrmp:RMAssertion 
    xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702"
    > 
    <wsrmp:DeliveryAssurance> 
      <wsp:Policy> 
        <wsrmp:ExactlyOnce /> 
      </wsp:Policy> 
    </wsrmp:DeliveryAssurance> 
  </wsrmp:RMAssertion> 
</wsp:Policy>

DefaultReliability.xml WS-Policyファイル(WS-Policy)[非推奨]

このWS-Policyファイルは非推奨となっています。Webサービスの信頼性のあるメッセージングのアサーションは、WS Reliable Messaging Policy Assertion Version 1.0(http://schemas.xmlsoap.org/ws/2005/02/rm/policy/)に基づいています。現在のリリースでは、信頼性のあるメッセージングのポリシー・アサーションの多くが、JWSアノテーションまたは構成を通じて管理されます。

DefaultReliability.xml WS-Policyファイルは、信頼性のあるメッセージングのポリシーのアサーションに一般的な値(非アクティブ・タイムアウト10分、確認応答の間隔200ミリ秒、基本的な再送信間隔3秒など)を指定します。

<?xml version="1.0"?>

<wsp:Policy
   xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
   xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
   xmlns:beapolicy="http://www.bea.com/wsrm/policy"
  >

  <wsrm:RMAssertion >
    <wsrm:InactivityTimeout Milliseconds="600000" />
    <wsrm:BaseRetransmissionInterval Milliseconds="3000" />
    <wsrm:ExponentialBackoff />
    <wsrm:AcknowledgementInterval Milliseconds="200" />
    <beapolicy:Expires Expires="P1D" optional="true"/>
  </wsrm:RMAssertion>
</wsp:Policy>

LongRunningReliability.xml WS-Policyファイル(WS-Policy)[非推奨]

このWS-Policyファイルは非推奨となっています。Webサービスの信頼性のあるメッセージングのアサーションは、WS Reliable Messaging Policy Assertion Version 1.0(http://schemas.xmlsoap.org/ws/2005/02/rm/policy/)に基づいています。現在のリリースでは、信頼性のあるメッセージングのポリシー・アサーションの多くが、JWSアノテーションまたは構成を通じて管理されます。

LongRunningRelibility.xml WS-Policyファイルは、DefaultReliability.xml WS-Policyファイルと同じような値を指定しますが、指定するアクティビティのタイムアウト間隔がより長い(24時間)点が異なります。「LongRunningReliability.xml WS-Policyファイル(WS-Policy)[非推奨]」を参照してください。

<?xml version="1.0"?>

<wsp:Policy
   xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
   xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
   xmlns:beapolicy="http://www.bea.com/wsrm/policy"
  >
  <wsrm:RMAssertion >
    <wsrm:InactivityTimeout Milliseconds="86400000" />
    <wsrm:BaseRetransmissionInterval Milliseconds="3000" />
    <wsrm:ExponentialBackoff />
    <wsrm:AcknowledgementInterval Milliseconds="200" />
    <beapolicy:Expires Expires="P1M" optional="true"/>
  </wsrm:RMAssertion>
</wsp:Policy>

Mc1.1.xml(WS-Policyファイル)

Mc1.1.xml WS-Policyファイルは、Webサービスにおける接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を設定します。この場合、WS-Policy 1.5プロトコルが使用されます。アサーションは、http://docs.oasis-open.org/ws-rx/wsmc/200702/wsmc-1.1-spec-os.htmlに定義されている接続作成ポリシー・アサーションに基づいています。

<?xml version="1.0"?>
<wsp15:Policy  
  xmlns:wsp15="http://www.w3.org/ns/ws-policy"
  xmlns:wsmc="http://docs.oasis-open.org/ws-rx/wsmc/200702">
  <wsmc:MCSupported wsp15:Optional="true" />
</wsp15:Policy>

Mc.xml(WS-Policyファイル)

Mc.xml WS-Policyファイルは、Webサービスにおける接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を設定します。アサーションは、http://docs.oasis-open.org/ws-rx/wsmc/200702/wsmc-1.1-spec-os.htmlに定義されている接続作成ポリシー・アサーションに基づいています。

<?xml version="1.0"?>
<wsp:Policy
  xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
  xmlns:wsmc="http://docs.oasis-open.org/ws-rx/wsmc/200702">
  <wsmc:MCSupported wsp:Optional="true" />
</wsp:Policy>

Reliability1.2_ExactlyOnce_WithMC1.1.xml(WS-Policyファイル)

Reliability1.2_ExactlyOnce_WithMC1.1.xml WS-Policyファイルは、サービス品質に関するポリシー・アサーションを指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。

アサーションは、次の仕様に基づいています。

<?xml version="1.0" encoding="UTF-8" ?> 
<wsp15:Policy xmlns:wsp15="http://www.w3.org/ns/ws-policy">
   <wsp15:All>
      <wsrmp:RMAssertion 
       xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
         <wsrmp:DeliveryAssurance>
            <wsp15:Policy>
               <wsrmp:ExactlyOnce /> 
            </wsp15:Policy>
         </wsrmp:DeliveryAssurance>
      </wsrmp:RMAssertion>
      <wsmc:MCSupported 
        xmlns:wsmc="http://docs.oasis-open.org/ws-rx/wsmc/200702" 
        wsp15:Optional="true" /> 
   </wsp15:All>
</wsp15:Policy>

Reliability1.2_SequenceSTR.xml(WS-Policyファイル)

Reliability1.2_SequenceSTR.xmlファイルは、信頼性のあるシーケンスでメッセージを保護するために、CreateSequenceメッセージで参照されるwsse:SecurityTokenReferenceをランタイムが使用するように指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。

アサーションは、次の仕様に基づいています。

<?xml version="1.0" encoding="UTF-8"?>
<wsp15:Policy xmlns:wsp15="http://www.w3.org/ns/ws-policy">
   <wsp15:All>
      <wsrmp:RMAssertion 
       xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
         <wsrmp:SequenceSTR/>
         <wsrmp:DeliveryAssurance>
            <wsp15:Policy>
               <wsrmp:ExactlyOnce/>
            </wsp15:Policy>
         </wsrmp:DeliveryAssurance>
      </wsrmp:RMAssertion>
      <wsmc:MCSupported      
       xmlns:wsmc="http://docs.oasis-open.org/ws-rx/wsmc/200702" 
       wsp15:Optional="true"/>
   </wsp15:All>
</wsp15:Policy>

Reliability1.1_SequenceSTR.xml(WS-Policyファイル)

Reliability1.1_SequenceSTR.xmlファイルは、信頼性のあるシーケンスでメッセージを保護するために、CreateSequenceメッセージで参照されるwsse:SecurityTokenReferenceをランタイムが使用するように指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。

<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
  <wsrmp:RMAssertion
         xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
    <wsrmp:SequenceSTR/>
    <wsrmp:DeliveryAssurance>
      <wsp:Policy>
        <wsrmp:ExactlyOnce/>
      </wsp:Policy>
    </wsrmp:DeliveryAssurance>
  </wsrmp:RMAssertion>
</wsp:Policy>

Reliability1.2_SequenceTransportSecurity.xml(WS-Policyファイル)

Reliability1.2_SequenceTransportSecurity.xmlファイルは、トランスポート・レベルのセキュリティおよびサービス品質に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrm/200702/wsrm-1.2-spec-os.htmlのWS Reliable Messaging Policy Assertion 1.2が基になっています。

<?xml version="1.0" encoding="UTF-8"?>
<wsp15:Policy xmlns:wsp15="http://www.w3.org/ns/ws-policy">
   <wsp15:All>
      <wsrmp:RMAssertion 
       xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
         <wsrmp:SequenceTransportSecurity/>
            <wsrmp:DeliveryAssurance>
               <wsp15:Policy>
                  <wsrmp:ExactlyOnce/>
               </wsp15:Policy>
            </wsrmp:DeliveryAssurance>
      </wsrmp:RMAssertion>
   </wsp15:All>
</wsp15:Policy>

Reliability1.1_SequenceTransportSecurity.xml(WS-Policyファイル)

Reliability1.1_SequenceTransportSecurity.xmlファイルは、トランスポート・レベルのセキュリティおよびサービス品質に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。

<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsrmp:RMAssertion
         xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
    <wsrmp:SequenceTransportSecurity/>
    <wsrmp:DeliveryAssurance>
      <wsp:Policy>
        <wsrmp:ExactlyOnce/>
      </wsp:Policy>
    </wsrmp:DeliveryAssurance>
  </wsrmp:RMAssertion>
</wsp:Policy>

Reliability1.0_1.2.xml(WS-Policyファイル)

Reliability1.0_1.2.xml WS-Policyファイルは、1.2および1.0のWS-信頼性のあるメッセージングのポリシー・アサーションを結合します。

このサンプルは、適切なポリシーの選択に基づいて実行時に適用されるポリシー・アサーションを決定します。適切なポリシーの選択の詳細は、「複数のポリシー選択肢の使用」を参照してください。

<?xml version="1.0" encoding="UTF-8"?>
<wsp15:Policy xmlns:wsp15="http://www.w3.org/ns/ws-policy">
   <wsp15:ExactlyOne>
      <wsp15:All>
         <wsrmp:RMAsser…zótion 
          xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
            <wsrmp:DeliveryAssurance>
               <wsp15:Policy>
                  <wsrmp:ExactlyOnce/>
               </wsp15:Policy>
             </wsrmp:DeliveryAssurance>
         </wsrmp:RMAssertion>
         <wsmc:MCSupported 
           xmlns:wsmc="http://docs.oasis-open.org/ws-rx/wsmc/200702" 
           wsp15:Optional="true"/>
      </wsp15:All>
      <wsp15:All>
         <wsrmp10:RMAssertion 
          xmlns:wsrmp10="http://schemas.xmlsoap.org/ws/2005/02/rm/policy">
            <wsrmp10:InactivityTimeout Milliseconds="600000"/>
            <wsrmp10:BaseRetransmissionInterval Milliseconds="3000"/>
            <wsrmp10:ExponentialBackoff/>
            <wsrmp10:AcknowledgementInterval Milliseconds="200"/>
         </wsrmp10:RMAssertion>
      </wsp15:All>
   </wsp15:ExactlyOne>
</wsp15:Policy>

Reliability1.0_1.1.xml(WS-Policy.xmlファイル)

Reliability1.0_1.1.xml WS-Policyファイルは、1.1および1.0のWS-信頼性のあるメッセージングのポリシー・アサーションを結合します。このサンプルは、適切なポリシーの選択に基づいて実行時に適用されるポリシー・アサーションを決定します。適切なポリシーの選択の詳細は、「複数のポリシー選択肢の使用」を参照してください。


注意:

1.0のWebサービスの信頼性のあるメッセージング・アサーションには、接頭辞としてwsrmp10が付加されます。


<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <wsrmp:RMAssertion
           xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
        <wsrmp:DeliveryAssurance>
          <wsp:Policy>
            <wsrmp:ExactlyOnce/>
          </wsp:Policy>
        </wsrmp:DeliveryAssurance>
      </wsrmp:RMAssertion>
    </wsp:All>
    <wsp:All>
      <wsrmp10:RMAssertion
       xmlns:wsrmp10="http://schemas.xmlsoap.org/ws/2005/02/rm/policy">
        <wsrmp10:InactivityTimeout Milliseconds="600000"/>
        <wsrmp10:BaseRetransmissionInterval Milliseconds="3000"/>
        <wsrmp10:ExponentialBackoff/>
        <wsrmp10:AcknowledgementInterval Milliseconds="200"/>
      </wsrmp10:RMAssertion>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>
PK7ü Œ…ŒPK/¯-AOEBPS/cover.htmO°ý Cover

Oracle Corporation

PK[×ßpTOPK/¯-AOEBPS/callback.htm”mk’ コールバックの使用

12 コールバックの使用

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスで、コールバックを使用してクライアントにイベントを通知する方法について説明します。

この章の内容は以下のとおりです。

コールバックの概要

コールバックとは、クライアントとサービスの間の規約の1つです。サービスはコールバックを使用することで、クライアントに追加のデータを照会することを目的として、サービス・メソッドの呼出しの間にクライアント提供のエンドポイントで操作を呼び出すことができます。これにより、クライアントが動作を注入したり、クライアントに進行状況を通知したりすることが可能になります。サービスは、コールバックのポート・タイプを定義するWSDLを使用してコールバックの要件を公開します。一方クライアントは、WS-Addressingを使用して、コールバック・エンドポイントのアドレスをサービスに通知します。

コールバック実装のサンプル

この節で説明するコールバック実装のサンプルは、以下の3つのJavaファイルから構成されています。

次の図に、コールバック実装のサンプルでのメッセージの流れを示します。

図12-1 コールバック実装のサンプル

図12-1の説明については以下を参照
「図12-1 コールバック実装のサンプル」の説明

  1. あるWebLogic Serverインスタンスで実行されているCallerService Webサービスのcall()メソッドが、TargetServiceのtargetOperation()メソッドを明示的に呼び出し、CallbackServiceにWebサービスのエンドポイントを渡します。通常、TargetServiceサービスは、別のWebLogic Serverインスタンスで実行されています。

  2. TargetService.targetOperation()メソッドの実装が、CallbackServiceのcallback()メソッドを明示的に呼び出します。このメソッドは、呼び出されると、CallerServiceから渡されたWebサービス・エンドポイントを使用して、コールバック・サービスを実装します。

  3. CallbackService.callback()メソッドが、TargetService Webサービスに情報を返送します。

  4. 最終的に、TargetService.targetOperation()メソッドが情報をCallerServiceサービスに返送し、コールバック・シーケンスが完了します。

コールバックのプログラミング手順

この項の手順では、コールバックを実装するために必要な3つのJWSファイル(ターゲットWebサービス、クライアントWebサービス、コールバックWebサービス)をプログラミングおよびコンパイルする方法について説明します。この手順では、これらのJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。

Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xmlファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。

表12-1 コールバックのプログラミング手順

#
手順説明

1

ターゲットWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。

使い慣れたIDEまたはテキスト・エディタを使用します。「ターゲットWebサービスのプログラミングのガイドライン」を参照してください。

注意: ターゲットWebサービスを実装するJWSファイルは、コールバックWebサービスの1つ以上のコールバック・メソッドを呼び出します。ただし、コールバックWebサービスをプログラミングする手順については後ほど説明します。したがって、これらの3つのJWSファイルは、この手順に従って順番にプログラミングするのではなく、すべてを同時にプログラミングすることをお薦めします。手順をこの順番に説明しているのは、あくまで各手順を理解しやすくするためです。

2

build.xmlファイルを更新して、ターゲットJWSファイルをWebサービスにコンパイルするjwsc Antタスクの呼出しを含めます。

「ターゲットWebサービスのbuild.xmlファイルの更新」を参照してください。

3

Antターゲットを実行して、ターゲットWebサービスをビルドします。

例:

prompt> ant build-target

4

ターゲットWebサービスを通常どおりデプロイします。

『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。

5

クライアントWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。

クライアントWebサービスは、ターゲットWebサービスをホストするものとは別のWebLogic Serverインスタンスにデプロイされていることが前提となっています。「コールバック・クライアントWebサービスのプログラミングのガイドライン」を参照してください。

6

コールバックWebサービスを実装するJWSファイルを作成します。

「コールバックWebサービスのプログラミングのガイドライン」を参照してください。

7

クライアントWebサービスをビルドするbuild.xmlファイルを更新します。

クライアントWebサービスをビルドするjwsc Antタスクでは、CallbackWS.javaもコンパイルされます。また、そのクラス・ファイルは、Fileset Antタスク要素によってWARファイルに格納されます。例:

<clientgen
     type="JAXWS"
    wsdl="${awsdl}"
    packageName="jaxws.callback.client.add"/>
<clientgen
     type="JAXWS"
    wsdl="${twsdl}"
    packageName="jaxws.callback.client.target"/>
<FileSet dir="." >
    <include name="CallbackWS.java" />
</FileSet>

8

Antターゲットを実行して、クライアントおよびコールバックWebサービスをビルドします。

例:

prompt> ant build-caller

9

クライアントWebサービスを通常どおりデプロイします。

『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。


ターゲットWebサービスのプログラミングのガイドライン

次のサンプルでは、ターゲットWebサービスを実装する簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.callback;

import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.wsaddressing.W3CEndpointReference;
import examples.webservices.callback.callbackservice.*;

@WebService(
        portName="TargetPort",
        serviceName="TargetService",
        targetNamespace="http://example.oracle.com",
        endpointInterface=
                   "examples.webservices.callback.target.TargetPortType",
        wsdlLocation="/wsdls/Target.wsdl")
@BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http")

public class TargetImpl {
  public String targetOperation(String s, W3CEndpointReference callback)
  {
      CallbackService aservice = new CallbackService();
      CallbackPortType aport = 
         aservice.getPort(callback, CallbackPortType.class);
      String result = aport.callback(s);
      return result + " processed by target"; 
  }
}

ターゲットWebサービスを実装するJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

コールバック・クライアントWebサービスのプログラミングのガイドライン

次のサンプルでは、「ターゲットWebサービスのプログラミングのガイドライン」で説明したターゲットWebサービスを呼び出すクライアントWebサービス用の簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.callback;

import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.Endpoint; 
import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceRef;
import javax.xml.ws.handler.MessageContext; 
import javax.xml.ws.wsaddressing.W3CEndpointReference; 
 
import examples.webservices.callback.target.*; 

@WebService(
        portName="CallerPort",
        serviceName="CallerService",
        targetNamespace="http://example.oracle.com")
@BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http")

public class CallerImpl
{
   @Resource
   private WebServiceContext context;

   @WebServiceRef()
   private TargetService target;

   @WebMethod()
   public String call(String s) { 
      Object sc =  
          context.getMessageContext().get(MessageContext.SERVLET_CONTEXT); 
      Endpoint callbackImpl = Endpoint.create(new CallbackWS()); 
      callbackImpl.publish(sc); 
      TargetPortType tPort = target.getTargetPort(); 
      String result = tPort.targetOperation(s,  
           callbackImpl.getEndpointReference(W3CEndpointReference.class)); 
       callbackImpl.stop(); 
      return result;
  }
}

ターゲットWebサービスを呼び出すJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

コールバックWebサービスのプログラミングのガイドライン

次のサンプルでは、コールバックWebサービスを実装する簡単なJWSファイルを示します。callback操作は太字で示されています。

package examples.webservices.callback;

import javax.jws.WebService;
import javax.xml.ws.BindingType;

@WebService(
     portName="CallbackPort",
     serviceName="CallbackService",
     targetNamespace="http://example.oracle.com",
     endpointInterface=
         "examples.webservices.callback.callbackservice.CallbackPortType",
     wsdlLocation="/wsdls/Callback.wsdl")

@BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http")

public class CallbackWS implements 
     examples.webservices.callback.callbackservice.CallbackPortType {

     public CallbackWS() {
     }

     public java.lang.String callback(java.lang.String arg0) {
          return arg0.toUpperCase(); 
     }
}

ターゲットWebサービスのbuild.xmlファイルの更新

build.xmlファイルを更新して、コールバックWebサービスを呼び出すターゲットWebサービスを生成するには、次のサンプルのようにtaskdefsおよびbuild-targetターゲットを追加します。詳細は、サンプルの後の説明を参照してください。

  <taskdef name="jwsc"
    classname="weblogic.wsee.tools.anttasks.JwscTask" />

  <target name="build-target">
    <jwsc srcdir="src" destdir="${ear-dir}" listfiles="true">
         <jws file="TargetImpl.java" 
           compiledWsdl="${cowDir}/target/Target_wsdl.jar" type="JAXWS">
           <WLHttpTransport contextPath="target" serviceUri="TargetService"/>
         </jws>
         <clientgen
           type="JAXWS"
           wsdl="Callback.wsdl"
           packageName="examples.webservices.callback.callbackservice"/>
    </jwsc>
     <zip destfile="${ear-dir}/jws.war" update="true">
        <zipfileset dir="src/examples/webservices/callback" prefix="wsdls">
           <include name="Callback*.wsdl"/>
        </zipfileset>
     </zip>
   </target>

jwsc Antタスクの完全なクラス名を定義するには、taskdef Antタスクを使用します。クライアントWebサービスをコンパイルするjwsc Antタスクを次のように更新します。

jwscの詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のjwsc Weblogic WebサービスAntタスクの実行に関する項を参照してください。

PK{`Á‘™m”mPK/¯-AOEBPS/handlers.htm€ÿ SOAPメッセージ・ハンドラの作成と使用

17 SOAPメッセージ・ハンドラの作成と使用

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic WebサービスでSOAPメッセージ・ハンドラを作成および使用する方法について説明します。

この章の内容は以下のとおりです。

SOAPメッセージ・ハンドラの概要

Webサービスおよびそのクライアントは、メッセージのリクエストやレスポンスの追加処理において、SOAPメッセージにアクセスする必要が生じることがあります。SOAPメッセージ・ハンドラは、Webサービスのリクエストとレスポンスの両方でSOAPメッセージをインターセプトするメカニズムです。SOAPメッセージ・ハンドラを作成すると、WebサービスおよびクライアントがSOAPメッセージの追加処理を実行できるようになります。

ハンドラ使用の簡単な例としては、SOAPメッセージのヘッダー部分の情報へのアクセスがあります。SOAPのヘッダーを使用してWebサービス固有の情報を格納しておき、ハンドラを使用してその情報を操作することができます。

SOAPメッセージ・ハンドラは、Webサービスのパフォーマンスを向上させるために使用することもできます。Webサービスがデプロイされてしばらくすると、同じパラメータを使用してWebサービスを呼び出すコンシューマが多いことに気付く場合があります。よく使用されるWebサービス呼出しの結果をキャッシュしておき(結果が静的であることが前提となります)、適宜、キャッシュしておいた結果をただちに戻すことによって、Webサービスを実装したバックエンド・コンポーネントを呼び出す必要がなくなり、Webサービスのパフォーマンスが向上します。このパフォーマンスの向上は、ハンドラを使用して、SOAPリクエスト・メッセージに頻繁に使用されるパラメータが含まれていないかチェックすることで実現できます。

JAX-WSでは、SOAPハンドラと論理ハンドラという2つのタイプのSOAPメッセージ・ハンドラがサポートされます。SOAPハンドラは、メッセージのヘッダーや本文を含め、SOAPメッセージ全体にアクセスできます。論理ハンドラは、メッセージのペイロードにのみアクセスでき、メッセージ内のプロトコル固有の情報(たとえばヘッダー)を変更することはできません。


注意:

SOAPハンドラは、着信メッセージに(セキュリティ、WS-ReliableMessaging、MTOMなど)ポリシーと一緒に使用した場合、ユーザー定義のメッセージ・ハンドラの実行前に、ポリシーのインターセプタが実行されます。発信メッセージの場合、この順序は逆になります。


サーバー側SOAPメッセージ・ハンドラの追加:主な手順

次の手順では、WebサービスにSOAPメッセージ・ハンドラを追加する手順を大まかに説明します。

Webサービスを実装する基本的なJWSファイルを作成済であり、SOAPメッセージ・ハンドラおよびハンドラ・チェーンを追加してWebサービスを更新することが前提となっています。また、Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行するためのターゲットを含む、作業用のbuild.xmlファイルがあることも前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。

表17-1 WebサービスへのSOAPメッセージ・ハンドラの追加手順

#
手順説明

1

ハンドラとハンドラ・チェーンを設計します。

SOAPメッセージ・ハンドラを設計し、ハンドラ・チェーン内でグループ化します。「SOAPメッセージ・ハンドラおよびハンドラ・チェーンの設計」を参照してください。

2

ハンドラ・チェーン内のハンドラごとに、SOAPメッセージ・ハンドラ・インタフェースを実装するJavaクラスを作成します。

「SOAPメッセージ・ハンドラの作成」を参照してください。

3

SOAPメッセージ・ハンドラを構成するためのアノテーションを追加して、JWSファイルを更新します。

「JWSファイルでのハンドラ・チェーンの構成」を参照してください。

4

ハンドラ・チェーン構成ファイルを作成します。

「ハンドラ・チェーン構成ファイルの作成」を参照してください。

5

ハンドラ・チェーン内のすべてのハンドラ・クラスをコンパイルし、Webサービスを再ビルドします。

「Webサービスのコンパイルと再ビルド」を参照してください。


クライアント側SOAPメッセージ・ハンドラの追加:主な手順

クライアント側SOAPメッセージ・ハンドラは、スタンドアロン・クライアントと、WebLogic Server内部で実行されるクライアントの、双方のために構成できます。実際のJavaクライアント側ハンドラは、サーバー側ハンドラと同じ方法、つまり、SOAPメッセージ・ハンドラ・インタフェースを実装するJavaクラスを作成する方法で作成できます。多くの場合、WebLogic Serverで実行されるWebサービスとそのWebサービスを呼び出すクライアント・アプリケーションで、同じハンドラ・クラスを使用できます。たとえば、サーバーおよびクライアント用として、送信および受信したすべてのSOAPメッセージをログに記録する汎用ロギング・ハンドラ・クラスを記述できます。

次の手順では、Webサービス操作を呼び出すクライアント・アプリケーションにクライアント側SOAPメッセージ・ハンドラを追加する手順を大まかに説明します。

デプロイされたWebサービスを呼び出すクライアント・アプリケーションを作成済であり、クライアント側SOAPメッセージ・ハンドラおよびハンドラ・チェーンを追加してクライアント・アプリケーションを更新することを想定しています。また、Antベースの開発環境を設定済であり、かつclientgen Antタスクを実行するためのターゲットを含む、作業用のbuild.xmlファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のスタンドアロン・クライアントからのWebサービスの呼出し: 主な手順に関する項を参照してください。

表17-2 Webサービス・クライアントにSOAPメッセージ・ハンドラを追加する手順

#
手順説明

1

ハンドラとハンドラ・チェーンを設計します。

この手順は、サーバー側SOAPメッセージ・ハンドラを設計する手順と似ていますが、視点がWebサービスからではなくクライアント・アプリケーションからとなる点が異なります。「SOAPメッセージ・ハンドラおよびハンドラ・チェーンの設計」を参照してください。

2

ハンドラ・チェーン内のハンドラごとに、SOAPメッセージ・ハンドラ・インタフェースを実装するJavaクラスを作成します。

この手順は、サーバー側SOAPメッセージ・ハンドラを設計する手順と似ていますが、視点がWebサービスからではなくクライアント・アプリケーションからとなる点が異なります。ハンドラ・クラスのプログラミングの詳細は、「SOAPメッセージ・ハンドラの作成」を参照してださい。

3

クライアントを更新して、SOAPメッセージ・ハンドラをプログラム的に構成します。

「クライアント側SOAPメッセージ・ハンドラの構成」を参照してください。

4

アプリケーションのビルドに使用するbuild.xmlファイルを更新して、clientgen Antタスクにカスタマイズ・ファイルを指定します。

「Webサービスのコンパイルと再ビルド」を参照してください。

5

適切なタスクを実行して、クライアント・アプリケーションを再ビルドします。

prompt> ant build-client

次回クライアント・アプリケーションを実行したときには、SOAPリクエスト・メッセージの送信前とレスポンスの受信後に、構成ファイルに記述したSOAPメッセージ・ハンドラが自動的に実行されます。


注意:

clientgen Antタスクにハンドラの構成ファイルが指定されている限り、クライアント側SOAPメッセージ・ハンドラを呼び出すために実際のクライアント・アプリケーションを更新する必要はありません。ハンドラは、生成されたインタフェースによって自動的に正しい順序で実行されます。


SOAPメッセージ・ハンドラおよびハンドラ・チェーンの設計

SOAPメッセージ・ハンドラを設計するときには、以下の事項を決定する必要があります。

ハンドラ・チェーン内でSOAPメッセージ・ハンドラをグループ化します。ハンドラ・チェーン内の各ハンドラには、着信メッセージと発信メッセージ両方のメソッドを定義できます。

ただし、着信メッセージと発信メッセージで同じタイプの処理が必要となるため、通常は各SOAPメッセージ・ハンドラにリクエストSOAPメッセージとレスポンスSOAPメッセージを処理する別個のメソッドを定義します。一方、SOAPリクエストのみを処理し、それと同等のレスポンス処理は行わないハンドラを設計することもできます。また、ハンドラ・チェーン内の次のハンドラを呼び出さず、そのまま、任意の時点でクライアント・アプリケーションにレスポンスを送信することも可能です。

サーバー側ハンドラの実行

Webサービスを呼び出すときに、WebLogic Serverは次のようにハンドラを実行します。

  1. ハンドラ・チェーン内のハンドラのinboundメソッドはすべて、JWSアノテーションで指定されている順序で実行されます。これらのinboundメソッドのいずれもが、SOAPのリクエスト・メッセージを変更できます。

  2. ハンドラ・チェーン内の最後のハンドラが実行されると、WebLogic Serverは、Webサービスを実装するバックエンド・コンポーネントを呼び出し、最終的なSOAPのリクエスト・メッセージを渡します。

  3. バックエンド・コンポーネントの実行が終了したら、ハンドラ・チェーン内のハンドラのoutboundメソッドが、JWSアノテーションで指定されているのとは逆の順序で実行されます。これらのoutboundメソッドのいずれもが、SOAPのレスポンス・メッセージを変更できます。

  4. ハンドラ・チェーン内の最初のハンドラが実行されると、WebLogic Serverは、Webサービスを呼び出したクライアント・アプリケーションに最終的なSOAPレスポンス・メッセージを戻します。

たとえば、JWSファイルで@HandlerChain JWSアノテーションを使用して外部構成ファイルを指定することになっており、その構成ファイルでは、次の例に示す3つのハンドラが格納されたSimpleChainというハンドラ・チェーンを定義していると仮定します。

<?xml version="1.0" encoding="UTF-8" ?> 
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> 
   <handler-chain> 
      <handler> 
         <handler-class>
            Handler1
         </handler-class> 
      </handler> 
   </handler-chain> 
   <handler-chain> 
      <handler> 
         <handler-class>
            Handler2
         </handler-class> 
      </handler> 
   </handler-chain> 
   <handler-chain> 
      <handler> 
         <handler-class>
            Handler3
         </handler-class> 
      </handler> 
   </handler-chain> 
</handler-chains>

次の図は、WebLogic Serverで各ハンドラのinboundメソッドとoutboundメソッドが実行される順序を示しています。

図17-1 ハンドラ・メソッドの実行順序

図17-1の説明が続きます
「図17-1ハンドラ・メソッドの実行順序」の説明

クライアント側ハンドラの実行

クライアント側ハンドラの場合は、以下のタイミングで二度実行されます。

  • クライアント・アプリケーションがWebサービスにSOAPリクエストを送信する直前

  • クライアント・アプリケーションがWebサービスからSOAPレスポンスを受信した直後

SOAPメッセージ・ハンドラの作成

SOAPメッセージ・ハンドラには2つのタイプがあります。次の表にそれぞれの定義を示します。

表17-3 SOAPメッセージ・ハンドラのタイプ

ハンドラ・タイプ説明

SOAPハンドラ

ヘッダーを含めたSOAPメッセージ全体へのアクセスを可能にします。SOAPハンドラは、javax.xml.ws.handler.soap.SOAPHandlerインタフェースを使用して定義します。呼出しには、javax.xml.ws.handler.MessageContextを拡張したjavax.xml.ws.handler.soap.SOAPMessageContextのインポートを使用します。SOAPMessageContext.getMessage()メソッドは、javax.xml.soap.SOAPMessageを返します。

論理ハンドラ

メッセージのペイロードへのアクセスを提供します。メッセージ内のプロトコル固有の情報(たとえばヘッダー)を変更することはできません。論理ハンドラは、javax.xml.ws.handler.LogicalHandlerインタフェースを使用して定義します。(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/LogicalHandler.htmlを参照してください)。呼出しには、javax.xml.ws.handler.MessageContextを拡張したjavax.xml.ws.handler.LogicalMessageContextを使用します。LogicalMessageContext.getMessage()メソッドは、javax.xml.ws.LogicalMessageを返します。

ペイロードには、JAXBオブジェクトまたはjavax.xml.transform.Sourceオブジェクトとしてアクセスできます。(http://download.oracle.com/javaee/5/api/javax/xml/ws/LogicalMessage.htmlを参照)。


両方のタイプのメッセージ・ハンドラが拡張するjavax.xml.ws.Handlerインタフェースは、次の表に示すメソッドを定義します。(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/Handler.htmlを参照)。

表17-4 ハンドラ・インタフェース・メソッド

メソッド説明
handleMessage()

着信および発信メッセージの通常処理を管理します。MessageContextオブジェクトのプロパティは、メッセージが着信か発信かを識別するために使用します。「Handler.handleMessage()メソッドの実装」を参照してください。

handleFault()

着信および発信メッセージのフォルト処理を管理します。「Handler.handleFault()メソッドの実装」を参照してください。

close()

メッセージ交換を完了し、処理の間にアクセスしたリソースをクリーンアップします。「Handler.close()メソッドの実装」を参照してください。


また、@javax.annotation.PostConstructおよび@javax.annotation.PreDestroyアノテーションを使用すると、ハンドラが作成された後に実行するメソッドとハンドラが破棄される前に実行するメソッドを指定できます。

特に画像などの添付ファイルを処理する場合などには、ハンドラ内から直接SOAPメッセージを表示または更新しなければならない場合もあります。この場合は、(http://java.sun.com/webservices/saaj/docs.html)のSOAP With Attachments API for Java 1.1 (SAAJ)仕様の構成要素であるjavax.xml.soap.SOAPMessage抽象クラスを使用します。詳細については、「SAAJを使用したSOAPリクエスト・メッセージおよびレスポンス・メッセージの直接操作」を参照してください。

SOAPハンドラのサンプル

次に、単純なSOAPハンドラのサンプルを示します。このハンドラは、メッセージの内容とともに、メッセージが着信か発信かを返します。

package examples.webservices.handler;

import java.util.Set;
import java.util.Collections;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import javax.xml.soap.SOAPMessage;

public class Handler1 implements SOAPHandler<SOAPMessageContext>
{
  public Set<QName> getHeaders()
  {
    return Collections.emptySet();
  }

  public boolean handleMessage(SOAPMessageContext messageContext)
  {
     Boolean outboundProperty = (Boolean)
         messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);

     if (outboundProperty.booleanValue()) {
         System.out.println("\nOutbound message:");
     } else {
         System.out.println("\nInbound message:");
     }

     System.out.println("** Response: "+messageContext.getMessage().toString());
    return true;
  }

  public boolean handleFault(SOAPMessageContext messageContext)
  {
    return true;
  }

  public void close(MessageContext messageContext)
  {
  }
}

論理ハンドラのサンプル

次に、単純な論理ハンドラのサンプルを示します。このハンドラは、メッセージの内容とともに、メッセージが着信か発信かを返します。

package examples.webservices.handler;

import java.util.Set;
import java.util.Collections;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.LogicalHandler;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.LogicalMessageContext;
import javax.xml.ws.LogicalMessage;
import javax.xml.transform.Source;

public class Handler2 implements LogicalHandler<LogicalMessageContext>
{
  public Set<QName> getHeaders()
  {
    return Collections.emptySet();
  }

  public boolean handleMessage(LogicalMessageContext messageContext)
  {
     Boolean outboundProperty = (Boolean)
         messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);
     if (outboundProperty.booleanValue()) {
            System.out.println("\nOutbound message:");
     } else {
            System.out.println("\nInbound message:");
     }

    System.out.println("** Response: "+messageContext.ge€ÿtMessage().toString());
    return true;
  }

  public boolean handleFault(LogicalMessageContext messageContext)
  {
    return true;
  }

  public void close(MessageContext messageContext)
  {
  }
}

Handler.handleMessage()メソッドの実装

Handler.handleMessage()メソッドは、バックエンド・コンポーネントによって処理される前および後に、SOAPのリクエスト・メッセージをインターセプトするために呼び出されます。そのシグネチャは次のとおりです。

public boolean handleMessage(C context) 
  throws java.lang.RuntimeException, java.xml.ws.ProtocolException {}

このメソッドを実装すると、バックエンド・コンポーネントによって処理される前および後に、SOAPメッセージ内のデータの暗号化/復号化などのタスクを実行できます。

Cは、javax.xml.ws.handler.MessageContextを拡張します(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.htmlを参照してください)。ハンドラ・チェーン内のハンドラは、MessageContextプロパティを使用して、メッセージが着信か発信かを識別し、処理状態を共有します。MessageContextのSOAPMessageContextまたはLogicalMessageContextサブインタフェースを使用すると、SOAPメッセージまたは論理メッセージの内容を取得したり設定したりできます。詳細については、「メッセージ・コンテキスト・プロパティの値とメソッドの使用」を参照してください。

SOAPメッセージのすべての処理をコーディングしたら、以下のシナリオのいずれかをコーディングします。

  • trueを返すことにより、ハンドラ・リクエスト・チェーン内の次のハンドラを呼び出します。

    リクエスト・チェーンの次のハンドラは、@HandlerChainアノテーションによって指定された構成ファイル内の<handler-chain>要素の次の<handler>下位要素として指定されます。

  • falseを返すことにより、ハンドラ・リクエスト・チェーンの処理をブロックします。

    ハンドラ・リクエスト・チェーンの処理をブロックすると、Webサービスのこの呼出しについては、バックエンド・コンポーネントは実行されなくなります。Webサービスの一部の呼出しの結果をキャッシュしてあり、そのリストに現在の呼出しも含まれている場合は、この操作が便利な場合があります。

    ハンドラ・リクエスト・チェーンの処理は中断されますが、WebLogic Serverが、現在のハンドラから順に、レスポンス・チェーンを呼び出します。

  • ハンドラに固有のすべての実行時エラーに対して、java.lang.RuntimeExceptionまたはjava.xml.ws.ProtocolExceptionをスローします。

    WebLogic Serverは、この例外を捕捉すると、ハンドラ・リクエスト・チェーンの後続の処理を終了し、この例外をWebLogic Serverのログ・ファイルに記録した上で、このハンドラのhandleFault()メソッドを呼び出します。

Handler.handleFault()メソッドの実装

Handler.handleFault()メソッドは、SOAPメッセージ処理モデルに基づいてSOAP障害を処理します。そのシグネチャは次のとおりです。

public boolean handleFault(C context) 
  throws java.lang.RuntimeException, java.xml.ws.ProtocolException{}

このメソッドを実装すると、バックエンド・コンポーネントによって生成されたフォルトのほか、handleMessage()メソッドによって生成されたあらゆるSOAPフォルトの処理も扱うことができます。

Cは、javax.xml.ws.handler.MessageContextを拡張します(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.htmlを参照してください)。ハンドラ・チェーン内のハンドラは、MessageContextプロパティを使用して、メッセージが着信か発信かを識別し、処理状態を共有します。MessageContextのLogicalMessageContextまたはSOAPMessageContextサブインタフェースを使用すると、SOAPメッセージまたは論理メッセージの内容を取得したり設定したりできます。詳細については、「メッセージ・コンテキスト・プロパティの値とメソッドの使用」を参照してください。

SOAPフォルトのすべての処理をコーディングしたら、次のいずれかを実行します。

  • trueを返すことにより、ハンドラ・チェーン内の次のハンドラのhandleFault()メソッドを呼び出します。

  • falseを返すことにより、ハンドラ・フォルト・チェーンの処理をブロックします。

Handler.close()メソッドの実装

Handler.close()は、メッセージ交換を完了し、処理の間にアクセスしたリソースをクリーンアップします。そのシグネチャは次のとおりです。

public boolean close(MessageContext context) {}

メッセージ・コンテキスト・プロパティの値とメソッドの使用

SOAPメッセージ・ハンドラには、以下のコンテキスト・オブジェクトが渡されます。

表17-5 メッセージ・コンテキスト・プロパティの値

メッセージ・コンテキスト・プロパティの値説明
javax.xml.ws.handler.LogicalMessageContext

論理ハンドラのコンテキスト・オブジェクト

javax.xml.ws.handler.soap.SOAPMessageContext

SOAPハンドラのコンテキスト・オブジェクト


各コンテキスト・オブジェクトは、javax.xml.ws.handler.MessageContextを拡張します。これにより、SOAPメッセージ・ハンドラの実行時プロパティにクライアント・アプリケーションやWebサービスからアクセスするだけでなく、Webサービスのjavax.xml.ws.WebServiceContextから直接アクセスすることも可能になります(https://jax-ws.dev.java.net/nonav/jax-ws-20-pfd/api/javax/xml/ws/WebServiceContext.htmlを参照)。

たとえば、MessageContext.MESSAGE_OUTBOUND_PROPERTYには、メッセージの方向を識別するために使用するBoolean値が格納されています。リクエストの間にこのプロパティの値をチェックすることで、メッセージが着信リクエストなのか発信リクエストなのかを識別できます。このプロパティは、クライアント側のハンドラからアクセスしたときはtrue、サーバー側のハンドラからアクセスしたときはfalseになります。

使用できるMessageContextプロパティ値の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のMessageContextプロパティ値の使用に関する項を参照してください。

LogicalMessageContextクラスは、論理メッセージを処理する次のメソッドを定義します。詳細は、(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/LogicalMessageContext.html)のjava.xml.ws.handler.LogicalMessageContext Javadocを参照してください。

表17-6 LogicalMessageContextクラスのメソッド

メソッド説明
getMessage()

SOAPメッセージを含むjavax.xml.ws.LogicalMessageオブジェクトを取得します。


SOAPMessageContextクラスは、SOAPメッセージを処理する次のメソッドを定義します。詳細は、(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPMessageContext.html)のjava.xml.ws.handler.soap.SOAPMessageContext Javadocを参照してください。


注意:

SOAPメッセージ自体は、(http://download.oracle.com/javaee/5/api/javax/xml/soap/SOAPMessage.html)のjavax.xml.soap.SOAPMessageオブジェクトに格納されています。このオブジェクトの詳細は、「SAAJを使用したSOAPリクエスト・メッセージおよびレスポンス・メッセージの直接操作」を参照してください。


表17-7 SOAPMessageContextクラスのメソッド

メソッド説明
getHeaders()

メッセージ・コンテキスト内のメッセージから、特定の修飾名のヘッダーを取得します。

getMessage()

SOAPメッセージを含むjavax.xml.soap.SOAPMessageオブジェクトを取得します。

getRoles()

ハンドラ・チェーンの実行に関連付けられているSOAPアクター・ロールを取得します。

setMessage()

SOAPメッセージを設定します。


SAAJを使用したSOAPリクエスト・メッセージおよびレスポンス・メッセージの直接操作

javax.xml.soap.SOAPMessage抽象クラスは、(http://java.sun.com/webservices/saaj/docs.html)のSOAP With Attachments API for Java 1.1 (SAAJ)仕様の構成要素です。このクラスは、SOAPメッセージ・ハンドラ作成時にSOAPのリクエスト・メッセージおよびレスポンス・メッセージを操作するのに使用します。この節では、SOAPMessageオブジェクトの基本構造とSOAPメッセージの表示および更新に役立つメソッドのいくつかについて説明します。

SOAPMessageオブジェクトは、SOAPPartオブジェクト(SOAP XMLドキュメントそのものが入っています)、または同オブジェクトと添付ファイルで構成されています。

SOAPMessageクラスの詳細な説明については、SAAJに関するJavadocを参照してください。

SOAPPartオブジェクト


注意:

SOAPPartオブジェクトのsetContentメソッドおよびgetContentメソッドは、javax.xml.transform.stream.StreamSourceコンテンツのみをサポートします。これらのメソッドではjavax.xml.transform.dom.DOMSourceコンテンツはサポートされません。


SOAPPartオブジェクトには、SOAPEnvelopeオブジェクトに格納されたXML SOAPドキュメントが入っています。このオブジェクトは、実際のSOAPのヘッダーと本文を取得するのに使用します。

次のJavaコードのサンプルは、Handlerクラスによって提供されたMessageContextオブジェクトからSOAPメッセージを取り出して、その各部を参照する方法を示しています。

SOAPMessage soapMessage =  messageContext.getMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPHeader soapHeader = soapEnvelope.getHeader(); 

AttachmentPartオブジェクト

javax.xml.soap.AttachmentPartオブジェクト(http://download.oracle.com/javaee/5/api/javax/xml/soap/AttachmentPart.htmlを参照)には、 SOAPメッセージに対するオプションの添付ファイルが入っています。添付ファイルは、SOAPメッセージの残りの部分とは異なり、XMLフォーマットの必須部分ではないので、その形式は、単純なテキストからイメージ・ファイルまで、様々です。


注意:

SOAPメッセージ・ハンドラから直接に添付ファイルjava.awt.Imageにアクセスする場合は、「SOAPメッセージ・ハンドラで画像添付ファイルの操作」で重要情報を参照してください。


添付ファイルを操作するには、SOAPMessageクラスの次のメソッドを使用します。詳細には、(http://download.oracle.com/javaee/5/api/javax/xml/soap/SOAPMessage.html)のjavax.xml.soap.SOAPMessage Javadocを参照してください。

表17-8 添付ファイルの操作に使用するSOAPMessageクラスのメソッド

メソッド説明
addAttachmentPart()

作成されたAttachmentPartオブジェクトをSOAPMessageに追加します。

countAttachments()

このSOAPメッセージに含まれている添付ファイルの数を返します。

createAttachmentPart()

他のタイプのObjectからAttachmentPartオブジェクトを作成します。

getAttachments()

すべての添付ファイルをAttachmentPartオブジェクトとして取得し、Iteratorオブジェクトに格納します。


SOAPメッセージ・ハンドラで画像添付ファイルの操作

この項では、添付ファイルjava.awt.ImageにアクセスするSOAPメッセージ・ハンドラを作成すること、およびclientgen Antタスクによって生成されたクライアントJAX-WSポートを使用するクライアント・アプリケーションからImageが送信されていることを前提としています。

clientgen Antタスクによって生成されたクライアント・コードでは、添付ファイルjava.awt.Imageはimage/gifではなくtext/xmlのMIMEタイプで、呼び出されるWebLogic Webサービスに送信され、画像は画像を表す整数のストリームにシリアライズされます。特に、このクライアント・コードは次の形式で画像をシリアライズします。

  • int width

  • int height

  • int[] pixels

つまり、受信したImage添付ファイルを操作するSOAPメッセージ・ハンドラでは、このデータ・ストリームをデシリアライズして元の画像を作成し直す必要があるということです。

JWSファイルでのハンドラ・チェーンの構成

@javax.jws.HandlerChainアノテーションが(この章では、簡略化のために@HandlerChainとも言います)を使用すると、Webサービスのハンドラ・チェーンを構成できます。file属性を使用して、Webサービスと関連付けるハンドラ・チェーンの構成が含まれた外部ファイルを指定します。構成には、チェーン内のハンドラのリスト、ハンドラが実行される順序、初期化パラメータなどが含まれます。

次のJWSファイルでは、@HandlerChainアノテーションの使用例を示します。関連のJavaコードは太字で示しています。

package examples.webservices.handler;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.HandlerChain; 
import javax.annotation.Resource;
import javax.xml.ws.WebServiceContext;
@WebService(name = "Handler", targetNamespace = "http://example.org")
@HandlerChain(file="handler-chain.xml") 
public class HandlerWS
{
  @Resource
  WebServiceContext ctx;
  @WebMethod()
  public String getProperty(String propertyName)
  {
    return (String) ctx.getMessageContext().get(propertyName);
  }
}

このサンプルに示すように、@HandlerChainアノテーションを使用する前に、それをJWSファイルにインポートする必要があります。

@HandlerChainアノテーションのfile属性を使用し、ハンドラ・チェーンの構成情報を含む外部ファイルの名前を指定します。この属性の値はURLです。これは相対でも絶対でもかまいません。相対URLは、ファイルをコンパイルするためにjwsc Antタスクを実行した時点でのJWSファイルの場所を基準とします。


注意:

1つのJWSファイル内に複数の@HandlerChainアノテーションを指定すると、エラーになります。


外部構成ファイル作成の詳細は、「ハンドラ・チェーン構成ファイルの作成」を参照してください。

この項で説明した標準的なJWSアノテーションの詳細は、Web Services Metadata for the Java Platform仕様(http://www.jcp.org/en/jsr/detail?id=181)を参照してください。

ハンドラ・チェーン構成ファイルの作成

前の項で説明したように、Webサービスにハンドラ・チェーンを関連付けるには、JWSファイル内で@HandlerChainアノテーションを使用します。その際には、外部構成ファイルからなるハンドラ・チェーン・ファイルを作成し、ハンドラ・チェーン内のハンドラのリスト、ハンドラの実行順序、初期化パラメータなどを指定する必要があります。

このファイルはJWSファイルの外部にあるため、この単一の構成ファイルを複数のWebサービスで使用するように構成し、エンタープライズ内のすべてのWebサービスに関してハンドラ構成ファイルを標準化することができます。加えて、すべてのWebサービスを再コンパイルすることなく、ハンドラ・チェーンの構成を変更できます。

構成ファイルは、次の簡単なサンプルに示すように、XMLを使用して1つまたは複数のハンドラ・チェーンをリストします。

<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-class>examples.webservices.handler.Handler1</handler-class>
    </handler>
  </handler-chain>
  <handler-chain>
    <handler>
      <handler-class>examples.webservices.handler.Handler2</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

このサンプルでは、2つのハンドラが<handler-class>要素で指定したクラス名でハンドラ・チェーンに実装されています。2つのハンドラは、関連のWebサービス操作の前には昇順で実行され、操作実行後には逆順で実行されます。

ハンドラによって実装されるハンドラ初期化パラメータおよびSOAPロールを指定するには、それぞれ<handler>要素の<init-param>および<soap-role>子要素を使用します。

同じハンドラ・チェーンに、論理ハンドラとSOAPハンドラを含めることができます。ハンドラ・チェーンは実行時に再び並べ替えられ、発信メッセージではすべての論理ハンドラがSOAPハンドラより前に実行され、着信メッセージではすべてのSOAPハンドラが論理ハンドラより前に実行されます。

外部構成ファイルを定義するXMLスキーマ、その作成の詳細、および他のサンプルについては、Web Services Metadata for the Java Platform仕様(http://www.jcp.org/en/jsr/detail?id=181)を参照してください。

Webサービスのコンパイルと再ビルド

この項では、Webサービスをコンパイルおよびビルドする作業用のbuild.xml Antファイルがあり、そのビルド・ファイルを更新してハンドラ・チェーンを含めることを想定しています。このbuild.xmlファイルの作成については、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスの開発に関する項を参照してください。

メッセージ・ハンドラのコンパイルとビルドが含まれるように開発環境を更新するには、以下のガイドラインに従います。

クライアント側SOAPメッセージ・ハンドラの構成

クライアント側SOAPメッセージ・ハンドãƒ5Êï©ã¯ã€ä»¥ä¸‹ã®ã„ずれかの方法で定義できます。

PK'ÈC´D5PK/¯-AOEBPS/title.htmúå Oracle Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12cリリース1(12.1.1)

Oracle® Fusion Middleware

Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング

12c リリース1(12.1.1)

B65943-02(原本部品番号:E24965-02)

2012年1月

JAX-WS WebサービスでWeb Services Reliable Messaging(WS-ReliableMessaging)を使用して、クライアント・アプリケーションから別のアプリケーション・サーバー上で実行されているWebサービスを信頼性のある方法で呼び出し、2つのエンドポイント間で保証付きのメッセージ配信を行う方法について説明した、ソフトウェア開発者向けのドキュメント。


Oracle Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12c リリース1(12.1.1)

B65943-02

Copyright © 2007, 2012, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、Oracleまでご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracleおよびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracleおよびその子会社、関連会社の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

IntelおよびIntel XeonはIntel Corporationの商標または登録商標です。すべてのSPARC商標はライセンスに基づいて使用されるSPARC International, Inc.の商標または登録商標です。AMDロゴおよびAMD Opteronロゴは、Advanced Micro Devicesの商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

PKö›ßB PK/¯-AOEBPS/intro.htmA5¾Ê はじめに

1 概要

この章では、Java API for XML Web Services(JAX-WS)を使用してWebLogic Webサービスをプログラミングするソフトウェア開発者のための高度な機能を要約した表を示します。

表1-1 JAX-WSを使用した高度な機能のプログラミング

高度な機能説明

第2章「Web Services Addressingの使用」


Web Services Addressing(WS-Addressing)を使用してWebサービスとそれに関連付けられたメッセージをトランスポートに依存せずに指定する方法を説明します。

第3章「Webサービス・クライアントを開発する手順」


Webサービス・クライアントを開発するためのベスト・プラクティスを説明します。

第4章「Webサービスの非同期呼出し」


Webサービスを非同期的に呼び出します。

第5章「信頼性のあるWebサービスとクライアントを開発する手順」


非同期で信頼性のあるアプリケーションを開発するためのベスト・プラクティスを説明します。

第6章「Webサービスの信頼性のあるメッセージングの使用」


Webサーバーの信頼性のあるメッセージングを使用して、あるアプリケーション・サーバーで実行しているアプリケーションが別のアプリケーション・サーバーで実行しているWebサービスを確実に呼び出すことができるようにします。両方のサーバーがWS-ReliableMessaging仕様を実装している必要があります。

第7章「Webサービス永続性の管理」


Webサービスの永続性を管理します。Webサービス永続性は、長時間実行するリクエストをサポートし、サーバーの再起動があっても存続するように、高度な機能によって使用されます。

第8章「Webサービスのメッセージ・バッファリングの構成」


Webサービスのメッセージ・バッファリングを構成します。

第9章「クラスタ内のWebサービスの管理」


クラスタ内のWebサービスを使用する際のベスト・プラクティスを説明します。

第10章「Webサービス原子性トランザクションの使用」


Webサービス原子性トランザクションを使用して他の外部トランザクション処理システムとの相互運用性を実現する方法について説明します。

第11章「Webサービスのエンドポイントのパブリッシュ」


実行時に、WebサービスをデプロイせずにWebサービスのエンドポイントをパブリッシュします。

第12章「コールバックの使用」


コールバックをプログラミングしてイベントの発生をWebサービスのクライアントに通知します。

第13章「バイナリ・データ転送の最適化」


MTOM/XOPやストリーミングSOAP添付ファイルを使用してバイナリ・データを送信し、バイナリ・データの転送を最適化します。

第14章「動的プロキシ・クライアントの開発」


実行時に、clientgenを使用することなく、サービス・エンドポイント・インタフェース(SEI)に基づいてWebサービスを動的に呼び出します。

第15章「XMLカタログの使用」


XMLカタログを使用して、ローカルに格納されているバージョンに合わせてネットワーク・リソースを解決します。

第16章「SOAPフォルトを使用した例外処理」


SOAPフォルトおよび例外を処理します。

第17章「SOAPメッセージ・ハンドラの作成と使用」


WebサービスのSOAPメッセージ・ハンドラを作成および構成します。

第19章「XMLメッセージ・レベルでの操作」


XMLメッセージ・レベルで動作するWebサービス・プロバイダ・ベースのエンドポイントとディスパッチ・クライアントを開発します。

第20章「XML Over HTTPを使用するWebサービスのプログラミング」


XML over HTTPを使用してWebサービスをプログラミングします。

第21章「HTTPセッションを使用したステートフルJAX-WS Webサービスのプログラミング」


サービス・コール間の状態を保持するWebサービスを作成します。

付録A「Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」


信頼性のあるメッセージングをサポートするために使用できる、標準的な信頼性のあるメッセージングのアサーションを含むあらかじめパッケージ化されたWS-Policyファイルについて説明します。

付録B「信頼性のあるメッセージングのバッチ化のためのクライアント・ラッパー・クラスの例」


信頼性のあるメッセージングのバッチ化に使用できるクライアント・ラッパー・クラスの例を提供します。



注意:

Oracle WebLogic ServerのJAX-WS実装は、JAX-WS参照実装(RI)から拡張されて、Glassfish Communityによって開発されます(https://jax-ws.dev.java.net/を参照)。JAX-WS仕様(JSR-224)で定義されたすべての機能は、Oracle WebLogic Serverによって完全にサポートされます。

また、JAX-WS RIにはGlassfish寄稿者によって提供された様々な拡張があります。特にドキュメントされた限り、Oracle WebLogic Serverで使用するためのJAX-WS RI拡張はサポートされません。


WebLogic Webサービスの概要、標準、サンプルおよび関連ドキュメントについては、Webサービスの紹介を参照してください。

JAX-WSはWeb Services Security(WS-Security)1.1をサポートしています。WebLogic Webサービスのセキュリティについては、『Oracle WebLogic Server WebLogic Webサービスの保護』を参照してください。

PKP GÑF5A5PK/¯-AOEBPS/provider.htm€ÿ XMLメッセージ・レベルでの処理

19 XMLメッセージ・レベルでの操作

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスで、XMLメッセージ・レベルで処理を行うWebサービス・プロバイダベース・エンドポイントおよびディスパッチ・クライアントを開発する方法を説明します。

この章の内容は以下のとおりです。

Webサービス・プロバイダベース・エンドポイントおよびディスパッチ・クライアントの概要

JAXB生成のクラスを使用する方が単純で処理速度が速く、エラーになる可能性も低いですが、場合によってはXMLメッセージ・コンテンツを直接処理するために独自のビジネス・ロジックを生成する必要があります。メッセージレベルのアクセスは、サーバー側ではWebサービス・プロバイダベース・エンドポイントを使用して、クライアント側ではディスパッチ・クライアントを使用して実行できます。

Webサービス・プロバイダベース・エンドポイントは、Javaサービス・エンドポイント・インタフェース(SEI)ベースのエンドポイントにかわる動的なエンドポイントを提供します。JavaオブジェクトとそのXML表現の変換の詳細を概念化するSEIベースのエンドポイントとは異なり、プロバイダ・インタフェースでは、JAXBバインディングなしでXMLメッセージ・レベルのコンテンツに直接アクセスできます。Webサービス・プロバイダベース・エンドポイントは、javax.xml.ws.Provider<T>またはcom.sun.xml.ws.api.server.AsyncProvider<T>インタフェースのそれぞれを使用して、同期的または非同期的に実装できます。Webサービス・プロバイダベース・エンドポイントの開発に関する詳細は、「Webサービス・プロバイダベース・エンドポイントの開発(Javaから始める場合)」を参照してください。

javax.xml.ws.Dispatch<T>インタフェースを使用して実装されるWebサービスのディスパッチ・クライアントは、クライアントがXMLレベルでメッセージを処理できるようにします。Webサービスのディスパッチ・クライアントを開発する手順は、「Webサービス・ディスパッチ・クライアントの開発」で説明します。

プロバイダ・エンドポイントとディスパッチ・クライアントは、WSDLが使用できるかぎり、次のような他のWebLogic Webサービス機能と連動して使用できます。

また、ディスパッチ・クライアントは、非同期クライアント・トランスポート機能および非同期クライアント・ハンドラ機能と組み合せて使用できます。これらの機能の詳細は第4章「Webサービスの非同期呼出し」を、コード例は「ディスパッチ・インスタンスの作成」を参照してください。

XMLレベルでの処理のための使用モードとメッセージ・フォーマット

プロバイダベース・エンドポイントまたはディスパッチ・クライアントを使用してXMLレベルでメッセージを処理するとき、次の表に定義する使用モードの1つを使用します。使用モードは、「使用モードの指定(@ServiceModeアノテーション)」の説明に従ってjavax.xml.ws.ServiceModeアノテーションを使用して定義します。

表19-1 XMLメッセージ・レベルでの処理のための使用モード

使用モード説明

メッセージ

メッセージ全体を直接処理します。たとえば、SOAPバインディングが使用される場合、SOAPエンベロープ全体にアクセスします。

ペイロード

メッセージのペイロードのみを処理します。たとえば、SOAPバインディングが使用される場合、SOAP本体にアクセスします。


プロバイダベース・エンドポイントとディスパッチ・クライアントは、表19-2に定義されているメッセージ・フォーマットの1つを使用してメッセージを送受信できます。この表では、構成されているバインディング・タイプ(SOAP over HTTPまたはXML over HTTP)に対応する有効なメッセージ・フォーマットと使用モードの組合せも定義されます。

表19-2 XMLメッセージ・レベルでの処理でサポートされるメッセージ・フォーマット

メッセージ・フォーマットSOAP/HTTPバインディングでサポートされる使用モードXML/HTTPバインディングでサポートされる使用モード

javax.xml.transform.Source

メッセージ・モード: SOAPエンベロープ

ペイロード・モード: SOAP本体

メッセージ・モード: SourceとしてのXMLコンテンツ

ペイロード・モード: SourceとしてのXMLコンテンツ

javax.activation.DataSource

SOAP/HTTPバインディングの添付ファイルはSOAPMessageフォーマットを使用して送信されるため、どちらのモードでも有効ではありません。

メッセージ・モード: DataSourceオブジェクト

添付ファイルの送信にDataSourceが使用されるため、ペイロード・モードでは有効ではありません。

javax.xml.soap.SOAPMessage

メッセージ・モード: SOAPMessageオブジェクト

ペイロードのみではなくSOAPメッセージ全体が受信されるため、ペイロード・モードでは有効ではありません。

クライアントがSOAP以外のメッセージをXML/HTTPバインディングで送信できるため、どちらのモードでも有効ではありません。


Webサービス・プロバイダベース・エンドポイントの開発(Javaから始める場合)

次の項で説明されているように、同期および非同期のWebサービス・プロバイダベース・エンドポイントのどちらも開発できます。


注意:

WSDLから始めて、ポートをWebサービス・プロバイダとして設定するには、「Webサービス・プロバイダベース・エンドポイント(WSDLから始める場合)」を参照してください。


同期プロバイダベース・エンドポイントの開発

javax.xml.ws.Provider<T>を使用して実装されるWebサービス・プロバイダベース・エンドポイントでは、JAXBバインディングを使用せずXMLメッセージ・レベルでコンテンツに直接アクセスできます。Providerインタフェースはメッセージを同期的に処理するため、サービスはレスポンス処理を待機し、その後処理を続行します。javax.xml.ws.Provider<T>インタフェースの詳細は、http://download.oracle.com/javaee/5/api/javax/xml/ws/Provider.htmlを参照してください。

次の手順では、同期Webサービス・プロバイダベース・エンドポイントを実装するJWSファイルをプログラミングするための一般的な手順を説明します。

表19-3 同期Webサービス・プロバイダベース・エンドポイントを開発する手順

#
手順説明

1

Webサービス・プロバイダベースJWSファイルで使用するJWSアノテーションをインポートします。

Webサービス・プロバイダベースJWSファイルの標準JWSアノテーションの内容は次のとおりです。

import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.ServiceMode;

必要であれば他のアノテーションをインポートします。サポートされるすべてのJWSアノテーションのリストは、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』の"Webサービスのアノテーションのサポートに関する項を参照してください。

2

プロバイダベースの実装クラスを開発するときは、表19-2に定義されている、サポート対象のメッセージ・フォーマットの1つを指定します。

「メッセージ・フォーマットの指定」を参照してください。

3

必須の標準@WebServiceProvider JWSアノテーションをクラス・レベルで追加して、JavaクラスがWebサービス・プロバイダを公開することを指定します。

「JWSファイルによるWebサービス・プロバイダの実装の指定(@WebServiceProviderアノテーション)」を参照してください。

4

標準@ServiceMode JWSアノテーションをクラス・レベルで追加して、Webサービス・プロバイダがメッセージ・レベルまたはメッセージ・ペイロード・レベルで情報にアクセスすることを指定します。(オプション)

「使用モードの指定(@ServiceModeアノテーション)」を参照してください。

サービス・モードのデフォルトはService.Mode.Payloadです。

5

invoke()メソッドを定義します。

invoke()メソッドは呼び出されると、指定のメッセージ・フォーマットを使用するメソッドにメッセージまたはメッセージ・ペイロードを入力として提供します。「同期プロバイダベース・エンドポイントのinvoke()メソッドの定義」を参照してください。


次のJWSファイルのサンプルでは、簡単な同期Webサービス・プロバイダベース・エンドポイントの実装方法を示します。同期Webサービス・プロバイダベース・エンドポイントの開発手順の詳細は後の項で説明します。サンプル全体の中でこのJWSファイルを確認するには、Oracle WebLogic Serverに含まれるWebサービス・サンプルのJava EEのためのJAX-WS Webサービスの作成に関する項を参照してください。


注意:

RESTfulなWebサービスは、XML/HTTPバインディングのプロバイダベース・エンドポイントを使用して構築できます。RESTfulなWebサービスでのプロバイダベース・エンドポイントのプログラミング例は、「XML over HTTPを使用するWebサービスのプログラミング」を参照してください。


例19-1 同期プロバイダベース・エンドポイントを実装するJWSファイルの例

package examples.webservices.jaxws;
 
import org.w3c.dom.Node;
 
import javax.xml.transform.Source;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Provider;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.Service;
import java.io.ByteArrayInputStream;
 
 
/**
 * A simple Provider-based Web service implementation.
 *
 * @author Copyright (c) 2010, Oracle and/or its affiliates. 
 * All Rights Reserved.
 */
// The @ServiceMode annotation specifies whether the Provider instance 
// receives entire messages or message payloads.
@ServiceMode(value = Service.Mode.PAYLOAD)

// Standard JWS annotation that configures the Provider-based Web service.
@WebServiceProvider(portName = "SimpleClientPort",
    serviceName = "SimpleClientService",
    targetNamespace = "http://jaxws.webservices.examples/",
    wsdlLocation = "SimpleClientService.wsdl")
public class SimpleClientProviderImpl implements Provider<Source> {
 
  //Invokes an operation according to the contents of the request message.
  public Source invoke(Source source) {
    try {
      DOMResult dom = new DOMResult();
      Transformer trans = TransformerFactory.newInstance().newTransformer();
      trans.transform(source, dom);
      Node node = dom.getNode();
      // Get the operation name node.
      Node root = node.getFirstChild();
      // Get the parameter node.
      Node first = root.getFirstChild();
      String input = first.getFirstChild().getNodeValue();
      // Get the operation name.
      String op = root.getLocalName();
      if ("invokeNoTransaction".equals(op)) {
        return sendSource(input);
      } else {
        return sendSource2(input);
      }
    }
    catch (Exception e) {
      throw new RuntimeException("Error in provider endpoint", e);
    }
  }
 
  private Source sendSource(String input) {
    String body =
        "<ns:invokeNoTransactionResponse
             xmlns:ns=\"http://jaxws.webservices.examples/\"><return>"
            + "constructed:" + input
            + "</return></ns:invokeNoTransactionResponse>";
    Source source = new StreamSource(new ByteArrayInputStream(body.getBytes()));
    return source;
  }
 
  private Source sendSource2(String input) {
    String body =
        "<ns:invokeTransactionResponse 
            xmlns:ns=\"http://jaxws.webservices.examples/\"><return>"
            + "constructed:" + input
            + "</return></ns:invokeTransactionResponse>";
    Source source = new StreamSource(new ByteArrayInputStream(body.getBytes()));
    return source;
  }
 
}

非同期プロバイダベース・エンドポイントの開発

Providerインタフェースを使用する場合と同様に、com.sun.xml.ws.api.server.AsyncProvider<T>インタフェースを使用して実装されるWebサービス・プロバイダベース・エンドポイントでは、JAXBバインディングを使用せずXMLメッセージ・レベルでコンテンツに直接アクセスできます。ただし、AsyncProviderインタフェースはメッセージを非同期に処理します。そのため、サービスはスレッドをブロックすることなく処理を続行し、リクエストが使用可能になった時点でそのリクエストを処理できます。

次の手順では、非同期Webサービス・プロバイダベース・エンドポイントを実装するJWSファイルをプログラミングするための一般的な手順を説明します。

表19-4 非同期Webサービス・プロバイダベース・エンドポイントを開発する手順

#
手順説明

1

Webサービス・プロバイダベースJWSファイルで使用するJWSアノテーションをインポートします。

非同期Webサービス・プロバイダベースJWSファイルの標準JWSアノテーションの内容は次のとおりです。

import com.sun.xml.ws.api.server.AsyncProvider;
import com.sun.xml.ws.api.server.AsyncProviderCallback;
import javax.xml.ws.ServiceMode;

必要であれば他のアノテーションをインポートします。サポートされるすべてのJWSアノテーションのリストは、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』の"Webサービスのアノテーションのサポートに関する項を参照してください。

2

プロバイダベースの実装クラスを開発するときは、表19-2に定義されている、サポート対象のメッセージ・フォーマットの1つを指定します。

「メッセージ・フォーマットの指定」を参照してください。

3

必須の標準@WebServiceProvider JWSアノテーションをクラス・レベルで追加して、JavaクラスがWebサービス・プロバイダを公開することを指定します。

「JWSファイルによるWebサービス・プロバイダの実装の指定(@WebServiceProviderアノテーション)」を参照してください。

4

標準@ServiceMode JWSアノテーションをクラス・レベルで追加して、Webサービス・プロバイダがメッセージ・レベルまたはメッセージ・ペイロード・レベルで情報にアクセスすることを指定します。(オプション)

「使用モードの指定(@ServiceModeアノテーション)」を参照してください。

サービス・モードのデフォルトはService.Mode.Payloadです。

5

invoke()メソッドを定義します。

invoke()メソッドは呼び出されると、指定のメッセージ・フォーマットを使用するメソッドにメッセージまたはメッセージ・ペイロードを入力として提供します。「非同期プロバイダベース・エンドポイントのinvoke()メソッドの定義」を参照してください。

6

レスポンスを処理するための非同期ハンドラのコールバック・メソッドを定義します。

このメソッドは、レスポンスが返されたときにそのレスポンスを処理します。「非同期プロバイダベース・エンドポイントのコールバック・ハンドラの定義」を参照してください。


次のJWSファイルのサンプルでは、簡単な非同期Webサービス・プロバイダベース・エンドポイントの実装方法を示します。非同期Webサービス・プロバイダベース・エンドポイントの開発手順の詳細は後の項で説明します。

例19-2 非同期プロバイダベース・エンドポイントを実装するJWSファイルの例

package asyncprovider.server;
 
import com.sun.xml.ws.api.server.AsyncProvider;
import com.sun.xml.ws.api.server.AsyncProviderCallback;
 
import javax.xml.bind.JAXBContext;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceProvider;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
 
@WebServiceProvider(
    wsdlLocation="WEB-INF/wsdl/hello_literal.wsdl",
    targetNamespace = "urn:test",
    serviceName="Hello")

public class HelloAsyncImpl implements AsyncProvider<Source> {
 
    private static final JAXBContext jaxbContext = createJAXBContext();
    private int bodyIndex;
 
    public javax.xml.bind.JAXBContext getJAXBContext(){
        return jaxbContext;
    }
    
    private static javax.xml.bind.JAXBContext createJAXBContext(){
        try{
            return javax.xml.bind.JAXBContext.newInstance(ObjectFactory.class);
        }catch(javax.xml.bind.JAXBException e){
            throw new WebServiceException(e.getMessage(), e);
        }
    }
 
    private Source sendSource() {
        System.out.println("**** sendSource ******");
 
        String[] body  = {
            "<HelloResponse xmlns=\"urn:test:types\">
              <argument xmlns=\"\">foo</argument>
              <extra xmlns=\"\">bar</extra>
             </HelloResponse>",
            "<ans1:HelloResponse xmlns:ans1=\"urn:test:types\">
               <argument>foo</argument>
               <extra>bar</extra>
             </ans1:HelloResponse>",
        };
        int i = (++bodyIndex)%body.length;
        return new StreamSource(
            new ByteArrayInputStream(body[i].getBytes()));
    }
 
    private Hello_Type recvBean(Source source) throws Exception {
        System.out.println("**** recvBean ******");
        return (Hello_Type)jaxbContext.createUnmarshaller().unmarshal(source);
    }
 
    private Source sendBean() throws Exception {
        System.out.println("**** sendBean ******");
        HelloResponse resp = new HelloResponse();
        resp.setArgument("foo");
        resp.setExtra("bar");
        ByteArrayOutputStream bout = new ByteArr€ÿayOutputStream();
        jaxbContext.createMarshaller().marshal(resp, bout);
        return new StreamSource(new ByteArrayInputStream(bout.toByteArray()));
    }
 
    public void invoke(Source source, AsyncProviderCallback<Source> cbak, 
                       WebServiceContext ctxt) {
        System.out.println("**** Received in AsyncProvider Impl ******");
        try {
             Hello_Type hello = recvBean(source);
             String arg = hello.getArgument();
             if (arg.equals("sync")) {
                 String extra = hello.getExtra();
                 if (extra.equals("source")) {
                        cbak.send(sendSource());
                 } else if (extra.equals("bean")) {
                        cbak.send(sendBean());
                 } else {
                        throw new WebServiceException("Expected extra =
                             (source|bean|fault), Got="+extra);
                 }
             } else if (arg.equals("async")) {
               new Thread(new RequestHandler(cbak, hello)).start();
             } else {
                throw new WebServiceException("Expected Argument = 
                  (sync|async), Got="+arg);
             }
        } catch(Exception e) {
          throw new WebServiceException("Endpoint failed", e);
        }
    }
 
    private class RequestHandler implements Runnable {
        final AsyncProviderCallback<Source> cbak;
        final Hello_Type hello;
        public RequestHandler(AsyncProviderCallback<Source> cbak, Hello_Type hello) {
            this.cbak = cbak;
            this.hello = hello;
        }
 
        public void run() {
            try {
                Thread.sleep(5000);
            } catch(InterruptedException ie) {
                  cbak.sendError(new WebServiceException("Interrupted..."));
                  return;
            }
            try {
                String extra = hello.getExtra();
                if (extra.equals("source")) {
                    cbak.send(sendSource());
                } else if (extra.equals("bean")) {
                    cbak.send(sendBean());
                } else {
                    cbak.sendError(new WebServiceException(
                     "Expected extra = (source|bean|fault), Got="+extra));
                }
           } catch(Exception e) {
                cbak.sendError(new WebServiceException(e));
           }
       }
    }
}

メッセージ・フォーマットの指定

プロバイダベースの実装クラスを開発するときは、表19-2に定義されている、サポート対象のメッセージ・フォーマットの1つを指定します。

たとえば、例19-1「同期プロバイダベース・エンドポイントを実装するJWSファイルの例」に示したProviderの実装例では、SimpleClientProviderImplクラスがProvider<Source>インタフェースを実装し、入力と出力の両方の型がjava.xml.transform.Sourceオブジェクトであることを示しています。

public class SimpleClientProviderImpl implements Provider<Source> {
. . .
}

同様に、例19-2「非同期プロバイダベース・エンドポイントを実装するJWSファイルの例」に示したAsyncProviderの実装例では、HelloAsyncImplクラスがAsyncProvider<Source>インタフェースを実装し、入力と出力の両方の型がjava.xml.transform.Sourceオブジェクトであることを示しています。

public class HelloAsyncImpl implements AsyncProvider<Source>  {
. . .
}

JWSファイルによるWebサービス・プロバイダの実装の指定(@WebServiceProviderアノテーション)

次のコードの抜粋のように、標準のjavax.xml.ws.WebServiceProviderアノテーションを使用して、JWSファイルがWebサービス・プロバイダを実装することをクラス・レベルで指定します。

@WebServiceProvider(portName = "SimpleClientPort",
    serviceName = "SimpleClientService",
    targetNamespace = "http://jaxws.webservices.examples/",
    wsdlLocation = "SimpleClientService.wsdl")

この例では、サービス名はSimpleClientServiceであり、生成されるWSDLファイルのwsdl:service要素にマップされます。ポート名はSimpleClientPortであり、生成されるWSDLファイルのwsdl:port要素にマップされます。生成されるWSDLで使用されるターゲット・ネームスペースはhttp://jaxws.webservices.examples/で、WSDLの場所はWebサービス・プロバイダに対して局所的であり、SimpleClientService.wsdlにあります。

@WebServiceProviderアノテーションの詳細は、https://jax-ws.dev.java.net/nonav/2.1.5/docs/annotations.htmlを参照してください。

使用モードの指定(@ServiceModeアノテーション)

javax.xml.ws.ServiceModeアノテーションを使用して、Webサービス・プロバイダベース・エンドポイントが、メッセージ全体を受信するか(Service.Mode.MESSAGE)、メッセージ・ペイロードのみを受信するか(Service.Mode.PAYLOAD)を指定します。

例:

@ServiceMode(value = Service.Mode.PAYLOAD)

指定しない場合、@ServiceModeアノテーションのデフォルトはService.Mode.PAYLOADです。

有効なメッセージ・フォーマットと使用モードの組合せのリストは、表19-2を参照してください。

@ServiceModeアノテーションの詳細は、https://jax-ws.dev.java.net/nonav/2.1.4/docs/annotations.htmlを参照してください。

同期プロバイダベース・エンドポイントのinvoke()メソッドの定義

Provider<T>インタフェースによって、実装クラスに定義する必要がある1つのメソッドが定義されます。

T invoke(T request)

Webサービス・リクエストが受信されると、invoke()メソッドが呼び出され、指定のメッセージ・フォーマットを使用するメソッドにメッセージまたはメッセージ・ペイロードを入力として提供します。

たとえば、「同期プロバイダベース・エンドポイントを実装するJWSファイルの例」のProviderの実装例では、次の抜粋に示すように、invokeメソッドの入力としてSourceパラメータを受け取り、Sourceレスポンスを返すようにクラスが定義されています。

  public Source invoke(Source source) {
    try {
      DOMResult dom = new DOMResult();
      Transformer trans = TransformerFactory.newInstance().newTransformer();
      trans.transform(source, dom);
      Node node = dom.getNode();
      // Get the operation name node.
      Node root = node.getFirstChild();
      // Get the parameter node.
      Node first = root.getFirstChild();
      String input = first.getFirstChild().getNodeValue();
      // Get the operation name.
      String op = root.getLocalName();
      if ("invokeNoTransaction".equals(op)) {
        return sendSource(input);
      } else {
        return sendSource2(input);
      }
    }
    catch (Exception e) {
      throw new RuntimeException("Error in provider endpoint", e);
    }
  }

非同期プロバイダベース・エンドポイントのinvoke()メソッドの定義

AsycnProvider<T>インタフェースによって、実装クラスに定義する必要がある1つのメソッドが定義されます。

void invoke(T request, AsyncProviderCallback<t> callback, WebserviceContext context))

メソッドを呼び出すには、次のパラメータを渡します。

  • 指定のフォーマットのリクエスト・メッセージまたはメッセージ・ペイロード。

  • レスポンスが返されたときにそのレスポンスを処理するcom.sun.xml.ws.api.server.AsyncProviderCallback実装。詳細は、「非同期プロバイダベース・エンドポイントのコールバック・ハンドラの定義」を参照してください。

  • 処理されるリクエストのメッセージ・コンテキストを定義するjavax.xml.ws.WebServiceContext。非同期プロバイダベース・エンドポイントでは、注入されたWebServiceContextは使用できません。これは、情報を返す必要のあるリクエストを判別する際に呼び出し側スレッドに依存するためです。かわりに、WebServiceContextオブジェクトを渡します。このオブジェクトは、AsyncProviderCallbackを呼び出すまで使用できます。

たとえば、例19-2「非同期プロバイダベース・エンドポイントを実装するJWSファイルの例」のAysncProviderの実装例では、次の抜粋に示すように、このクラスのinvokeメソッドが次のように定義されています。

    public void invoke(Source source, AsyncProviderCallback<Source> cbak, 
                       WebServiceContext ctxt) {
        System.out.println("**** Received in AsyncProvider Impl ******");
        try {
             Hello_Type hello = recvBean(source);
             String arg = hello.getArgument();
             if (arg.equals("sync")) {
                 String extra = hello.getExtra();
                 if (extra.equals("source")) {
                        cbak.send(sendSource());
                 } else if (extra.equals("bean")) {
                        cbak.send(sendBean());
                 } else {
                        throw new WebServiceException("Expected extra =
                             (source|bean|fault), Got="+extra);
                 }
             } else if (arg.equals("async")) {
               new Thread(new RequestHandler(cbak, hello)).start();
             } else {
                throw new WebServiceException("Expected Argument = 
                  (sync|async), Got="+arg);
             }
        } catch(Exception e) {
          throw new WebServiceException("Endpoint failed", e);
        }
    }
 

非同期プロバイダベース・エンドポイントのコールバック・ハンドラの定義

AsyncProviderCallbackインタフェースには、非同期レスポンスを受信したときにそのレスポンスを処理するためのコールバック・ハンドラを定義できます。

たとえば、例19-2「非同期プロバイダベース・エンドポイントを実装するJWSファイルの例」から抜粋した次のAysncProviderの実装例では、RequestHandlerメソッドでAsyncProviderCallbackコールバック・ハンドラを使用して非同期レスポンスを処理しています。

    private class RequestHandler implements Runnable {
        final AsyncProviderCallback<Source> cbak;
        final Hello_Type hello;
        public RequestHandler(AsyncProviderCallback<Source> cbak, Hello_Type hello) {
            this.cbak = cbak;
            this.hello = hello;
        }
 
        public void run() {
            try {
                Thread.sleep(5000);
            } catch(InterruptedException ie) {
                  cbak.sendError(new WebServiceException("Interrupted..."));
                  return;
            }
            try {
                String extra = hello.getExtra();
                if (extra.equals("source")) {
                    cbak.send(sendSource());
                } else if (extra.equals("bean")) {
                    cbak.send(sendBean());
                } else {
                    cbak.sendError(new WebServiceException(
                     "Expected extra = (source|bean|fault), Got="+extra));
                }
           } catch(Exception e) {
                cbak.sendError(new WebServiceException(e));
           }
       }
    }
}

Webサービス・プロバイダベース・エンドポイントの開発(WSDLから始める場合)

プロバイダベース・エンドポイントがWSDLファイルから生成される場合、<provider> WSDL拡張を使用してポートをプロバイダとしてマークできます。例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<bindings wsdlLocation="SimpleClientService.wsdl" 
  xmlns="http://java.sun.com/xml/ns/jaxws">
<bindings node="wsdl:definitions" > 
    <package name="provider.server"/>    
   <provider>true</provider>
</bindings>

プロバイダベース・エンドポイントでのSOAPハンドラの使用

プロバイダベース・エンドポイントは、メッセージのリクエストやレスポンスの追加処理において、SOAPメッセージにアクセスしなければならないときがあります。SEIベース・エンドポイントに実行する場合と同様に、SOAPメッセージ・ハンドラを作成し、プロバイダベース・エンドポイントがSOAPメッセージに対してこの追加処理を実行できるようにすることができます。SOAPハンドラの作成に関する詳細は、「SOAPメッセージ・ハンドラの作成」を参照してください。

表17-1「WebサービスへのSOAPメッセージ・ハンドラの追加手順」には、WebサービスにSOAPハンドラを追加する場合に必要な手順が順に記載されています。これらの手順は、Webサービス・プロバイダベース・エンドポイントにも適用できます。

例:

  1. SOAPメッセージ・ハンドラを設計し、それらを1つのハンドラ・チェーンにグループ化します(「SOAPメッセージ・ハンドラおよびハンドラ・チェーンの設計」を参照)。

  2. ハンドラ・チェーン内のハンドラごとに、SOAPメッセージ・ハンドラ・インタフェースを実装するJavaクラスを作成します(「SOAPメッセージ・ハンドラの作成」を参照)。

    SOAPハンドラの例、MyHandlerを次に示します。

    package provider.rootpart_charset_772.server; 
     
    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.xml.namespace.QName;
    import javax.xml.soap.AttachmentPart;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.ws.WebServiceException;
    import javax.xml.ws.handler.MessageContext;
    import javax.xml.ws.handler.soap.SOAPHandler;
    import javax.xml.ws.handler.soap.SOAPMessageContext;
    import java.io.InputStream;
    import java.io.OutputStream;.import java.io.ByteArrayInputStream;
    import java.util.Set;
     
    public class MyHandler implements SOAPHandler<SOAPMessageContext> { 
       
        public Set<QName> getHeaders() {
            return null;     
        } 
        
        public boolean handleMessage(SOAPMessageContext smc) {
            if (!(Boolean)smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))            
                return true;
            try {
                SOAPMessage msg = smc.getMessage();
                AttachmentPart part = msg.createAttachmentPart(getDataHandler());           
                part.setContentId("SOAPTestHandler@example.jaxws.sun.com");             
                msg.addAttachmentPart(part);
                msg.saveChanges();
                smc.setMessage(msg);
            } catch (Exception e) {
                throw new WebServiceException(e);
            }
            return true;
        }
        
        public boolean handleFault(SOAPMessageContext context) {
            return true;
        } 
         
        public void close(MessageContext context) {}
        
        private DataHandler getDataHandler() throws Exception {
            return new DataHandler(new DataSource() {
                public String getContentType() {
                    return "text/xml";
                }
               
                public InputStream getInputStream() { 
                    return new ByteArrayInputStream("<a/>".getBytes());           
                }
                
                public String getName() {
                    return null; 
                }  
                
                public OutputStream getOutputStream() {
                    throw new UnsupportedOperationException();
                }
            }); 
        } 
    }
    
  3. @javax.jws.HandlerChainアノテーションをProvider実装に追加します(「JWSファイルでのハンドラ・チェーンの構成」を参照)。

    例:

    package provider.rootpart_charset_772.server;  
     
    import javax.jws.HandlerChain;
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.transform.Source;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.ws.*; 
    import java.io.ByteArrayInputStream;
     
    @WebServiceProvider(targetNamespace="urn:test", portName="HelloPort", serviceName="Hello")
    @ServiceMode(value=Service.Mode.MESSAGE)
    @HandlerChain(file="handlers.xml")
    public class SOAPMsgProvider implements Provider<SOAPMessage> { 
        
        public SOAPMessage invoke(SOAPMessage msg) {
            try {
        // keeping white space in the string is intentional
                String content = "<soapenv:Envelope
                    xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">
                    <soapenv:Body>  <VoidTestResponse
                    xmlns=\"urn:test:types\">
                    </VoidTestResponse></soapenv:Body></soapenv:Envelope>";
                Source source = new StreamSource(new 
                    ByteArrayInputStream(content.getBytes()));
                MessageFactory fact = MessageFactory.newInstance();
                SOAPMessage soap = fact.createMessage();
                soap.getSOAPPart().setContent(source);
                soap.getMimeHeaders().addHeader("foo", "bar");
                return soap;
            } catch(Exception e) {
                throw new WebServiceException(e);
            }   
        }  
    }
    
  4. ハンドラ・チェーン構成ファイルを作成します(「ハンドラ・チェーン構成ファイルの作成」を参照)。

    ハンドラ・チェーン構成ファイルの例(handlers.xml)を次に示します。

    <handler-chains xmlns='http://java.sun.com/xml/ns/javaee'>  
       <handler-chain>    
          <handler>      
             <handler-name>MyHandler</handler-name>      
             <handler-class>
                 provider.rootpart_charset_772.server.MyHandler
             </handler-class> 
          </handler>   
       </handler-chain>
    </handler-chains>
    
  5. ハンドラ・チェーン内のすべてのハンドラ・クラスをコンパイルし、Webサービスを再ビルドします(「Webサービスのコンパイルと再ビルド」を参照)。

Webサービス・ディスパッチ・クライアントの開発

javax.xml.ws.Dispatch<T>インタフェースを使用して実装されるWebサービス・ディスパッチ・クライアントでは、クライアントがXMLレベルでメッセージを処理できます。

次の手順では、Webサービス・ディスパッチ・クライアントをプログラミングするための一般的な手順を説明します。

表19-5 Webサービス・プロバイダベース・エンドポイントを開発する手順

#
手順説明

1

Webサービス・プロバイダベースJWSファイルで使用するJWSアノテーションをインポートします。

Webサービス・プロバイダベースJWSファイルの標準JWSアノテーションの内容は次のとおりです。

import javax.xml.ws.Service;
import javax.xml.ws.Dispatch;
import javax.xml.ws.ServiceMode;

必要であれば他のアノテーションをインポートします。サポートされるすべてのJWSアノテーションのリストは、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』の"Webサービスのアノテーションのサポートに関する項を参照してください。

2

Dispatchインスタンスを作成します。

「ディスパッチ・インスタンスの作成」を参照してください。

3

Webサービス操作を呼び出します。

Webサービス操作は、同期(一方向または双方向)または非同期(ポーリングまたは非同期ハンドラ)で呼び出すことができます。「Webサービス操作の呼出し」を参照してください。


Webサービス・ディスパッチ・クライアントの例

次のサンプルは、基本的なWebサービス・ディスパッチ・クライアントがどのように実装されるかを示します。このサンプルの詳細は後の項で説明します。

例19-3 Webサービス・ディスパッチ・クライアントの例

package jaxws.dispatch.client;
 
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.net.URL;
 
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import javax.xml.ws.soap.SOAPBinding;
 
public class WebTest extends TestCase {
   private static String in_str = "wiseking";
   private static String request = 
      "<ns1:sayHello xmlns:ns1=\"http://example.org\"><arg0>"+in_str+"</arg0></ns1:sayHello>";
 
   private static final QName portQName = new QName("http://example.org", "SimplePort");
   private Service service = null;

   protected void setUp() throws Exception {
 
      String url_str = System.getProperty("wsdl");
      URL url = new URL(url_str);
      QName serviceName = new QName("http://example.org", "SimpleImplService");
      service = Service.create(serviceName);
      service.addPort(portQName, SOAPBinding.SOAP11HTTP_BINDING, url_str);
      System.out.println("Setup complete.");
 
   }
 
   public void testSayHelloSource() throws Exception {
      setUp();
      Dispatch<Source> sourceDispatch = 
         service.createDispatch(portQName, Source.class, Service.Mode.PAYLOAD);
      System.out.println("\nInvoking xml request: " + request);
      Source result = sourceDispatch.invoke(new StreamSource(new StringReader(request)));
      String xmlResult = sourceToXMLString(result);
      System.out.println("Received xml response: " + xmlResult);
      assertTrue(xmlResult.indexOf("HELLO:"+in_str)>=0);
   }
 
   private String sourceToXMLString(Source result) {
      String xmlResult = null;
      try {
         TransformerFactory factory = TransformerFactory.newInstance();
         Transformer transformer = factory.newTransformer();
         transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
         transformer.setOutputProperty(OutputKeys.METHOD, "xml");
         OutputStream out = new ByteArrayOutputStream();
         StreamResult streamResult = new StreamResult();
         streamResult.setOutputStream(out);
         transformer.transform(result, streamResult);
         xmlResult = streamResult.getOutputStream().toString();
      } catch (TransformerException e) {
         e.printStackTrace();
      }
      return xmlResult;
   }
 
}

ディスパッチ・インスタンスの作成

javax.xml.ws.Serviceインタフェースは、Dispatchインスタンスの作成でファクトリとして機能します。ディスパッチ・インスタンスを作成するには、まずServiceインスタンスを作成する必要があります。その後、Service.createDispatch()メソッドを使用してディスパッチ・インスタンスを作成します。

次のパラメータから1つ以上のパラメータをcreateDispatch()メソッドに渡すことができます。

  • ターゲット・サービス・エンドポイントの修飾された名前(QName)またはエンドポイント参照。

  • タイプ・パラメータTのクラス。この例では、javax.xml.transform.Sourceフォーマットが使用されます。有効な値は、表19-2を参照してください。

  • 使用モード。この例では、メッセージ・ペイロードが指定されます。有効な使用モードは、表19-1を参照してください。

  • プロキシで構成するWebサービス機能のリスト。

  • メッセージまたはメッセージ・ペイロードのマーシャルまたはアンマーシャルに使用されるJAXBコンテキスト。

Service.createDispatch()メソッドの呼出しに使用できる有効なパラメータの詳細は、javax.xml.ws.Service Javadoc(https://jax-ws.dev.java.net/nonav/2.1.1/docs/api/javax/xml/ws/Service.html)を参照してください。

例:

...
      String url_str = System.getProperty("wsdl");
      QName serviceName = new QName("http://example.org", "SimpleImplService");
      service = Service.create(serviceName);
      service.addPort(portQName, SOAPBinding.SOAP11HTTP_BINDING, url_str);
      Dispatch<Source> sourceDispatch = 
        service.createDispatch(portQName, Source.class, Service.Mode.PAYLOAD);
...

前の例では、createDispatch()メソッドは次の3つのパラメータを取ります。

  • ターゲット・サービス・エンドポイントの修飾された名前(QName)。

  • タイプ・パラメータTのクラス。この例では、javax.xml.transform.Sourceフォーマットが使用されます。有効な値は、表19-2を参照してください。

  • 使用モード。この例では、メッセージ・ペイロードが指定されます。有効な使用モードは、表19-1を参照してください。

次の例では、Webサービス機能のリストを渡す方法を示します。具体的には、非同期クライアント・トランスポート機能と非同期クライアント・ハンドラ機能を渡します。これらの機能の詳細は、第4章「Webサービスの非同期呼出し」を参照してください。

...
  protected Dispatch createDispatch(boolean isSoap12, Class dateType,
               Service.Mode mode, AsyncClientHandlerFeature feature) 
               throws Exception {
    String address = publishEndpoint(isSoap12);
    Service service = Service.create(new URL(address + "?wsdl"), 
               new QName("http://example.org", "AddNumbersService"));
    QName portName = new QName("http://example.org", "AddNumbersPort");
    AsyncClientTransportFeature transportFeature = new
         AsyncClientTransportFeature("http://localhost:8238/clientsoap12/" + 
               UUID.randomUUID().toStØ'øring());
    Dispatch dispatch = service.createDispatch(portName, dateType, mode, 
         feature, transportFeature);
    return dispatch;
  }
...

Webサービス操作の呼出し

Dispatchインスタンスが作成されたら、それを使用してWebサービス操作を呼び出します。Webサービス操作は、同期(一方向または双方向)または非同期(ポーリングまたは非同期ハンドラ)で呼び出すことができます。同期および非同期の呼出し方法の詳細は、javax.xml.ws.Dispatch Javadoc(https://jax-ws.dev.java.net/nonav/2.1.1/docs/api/javax/xml/ws/Dispatch.html)を参照してください。

たとえば、次のコードの抜粋では、XMLメッセージはjavax.xml.transform.stream.StreamSourceオブジェクトとしてカプセル化され、同期invoke()メソッドに渡されています。レスポンスXMLはresult変数でSourceオブジェクトとして返され、XMLに変換されます。メッセージをXMLに戻すために使用されるsourcetoXMLString()メソッドは、例19-3に示しています。

...
private static String request = "<ns1:sayHello xmlns:ns1=\"http://example.org\"><arg0>"+in_str+"</arg0></ns1:sayHello>";
Source result = sourceDispatch.invoke(new StreamSource(new StringReader(request)));
String xmlResult = sourceToXMLString(result);
...
PKÏ´gžçØPK/¯-AOEBPS/publish.htm«Tá Webサービスのエンドポイントのパブリッシュ

11 Webサービスのエンドポイントのパブリッシュ

この章では、javax.xml.ws.Endpoint APIを使用して、WebサービスをWebLogic Serverインスタンスにデプロイすることなく、実行時にWebサービスのエンドポイントを作成する方法について説明します。

詳細は、http://download.oracle.com/javaee/5/api/javax/xml/ws/Endpoint.htmlを参照してください。

次の表に、Webサービスのエンドポイントをパブリッシュする手順をまとめます。

表11-1 Webサービスのエンドポイントをパブリッシュする手順

#
手順説明

1

Webサービスのエンドポイントを作成します。

javax.xml.ws.Endpoint create()メソッドを使用してエンドポイントを作成し、エンドポイントに関連付けるインプリメンタ(Webサービスの実装)を指定し、必要に応じてバインディング・タイプを指定します。指定しない場合、バインディング・タイプのデフォルトはSOAP1.1/HTTPになります。実行時に定義したように、エンドポイントに関連付けるのは1つの実装オブジェクトと1つのjavax.xml.ws.Bindingにのみであり、これらの値は変更できません。

たとえば次の例では、CallbackWS()実装のWebサービス・エンドポイントが作成されます。

Endpoint callbackImpl = Endpoint.create(new CallbackWS());

2

受信したリクエストを受け入れるため、Webサービスのエンドポイントをパブリッシュします。

javax.xml.ws.Endpoint publish()メソッドを使用して、サーバー・コンテキストを指定するか、Webサービス・エンドポイントのアドレスとインプリメンタ(必要に応じて)を指定します。

注意: エンドポイントに関連付けられているメタデータ・ドキュメント(WSDLまたはXMLスキーマ)を更新したい場合は、エンドポイントをパブリッシュする前に更新する必要があります。

たとえば次の例では、ステップ1でサーバー・コンテキストを使用して作成したWebサービス・エンドポイントがパブリッシュされます。

Object sc
context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
callbackImpl.publish(sc);

3

Webサービスのエンドポイントを停止して、処理完了後に追加のリクエストが受け入れられないようにします。

javax.xml.ws.Endpointのstop()メソッドを使用してエンドポイントを停止し、受信したリクエストの受け入れを停止します。いったん停止したエンドポイントをパブリッシュし直すことはできません。

例:

callbackImpl.stop()

コールバック・サンプルのコンテキスト内でWebサービスのエンドポイントをパブリッシュする例については、「コールバック・クライアントWebサービスのプログラミングのガイドライン」を参照してください。

上の表に示した手順に加え、javax.xml.ws.Endpoint APIのメソッドを使用して以下を定義することもできます。

詳細は、javax.xml.ws.EndpointのJavadoc(http://download.oracle.com/javaee/5/api/javax/xml/ws/Endpoint.html)を参照してください。

PKPhò}°«PK/¯-AOEBPS/preface.htm.Ñî はじめに

はじめに

ここでは、このドキュメント、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』で使用されるドキュメント・アクセシビリティ機能および表記規則について説明します。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info、またはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs(聴覚に障害のあるお客様向け)を参照してください。

表記規則

このドキュメントでは次の表記規則を使用します。

規則意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

斜体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。


PK“ö{g3.PK/¯-AOEBPS/buffering.htm-:ÒÅ Webサービスのメッセージ・バッファリングの構成

8 Webサービスのメッセージ・バッファリングの構成

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスのメッセージ・バッファリングを構成する方法について説明します。

この章の内容は以下のとおりです。

メッセージ・バッファリングの概要

バッファリングされたWebサービス上の操作が呼び出されると、その呼出しを表すメッセージがJMSキューに格納されます。WebLogic Serverは、このバッファリングされたメッセージを非同期に処理します。メッセージがまだキュー内にある間にWebLogic Serverがダウンした場合、WebLogic Serverが再起動するとすぐに処理されます。

WebLogic Serverは、あらかじめ構成されて管理されたスレッドのプールから取得した別のスレッドで、リクエスト・メッセージを処理します。これにより、WebLogic Serverはクライアントの負荷のスパイクを緩和し、リクエストの時間順の処理を続けることができます。メッセージ・バッファリングは、サービス拒否攻撃とサーバーでの一般的な過負荷状態を防ぐための強力なツールです。

Webサービスにメッセージ・バッファリングを構成するかどうかを判断するための参考に、「バッファなしの信頼性のあるWebサービスでの障害シナリオ」を確認することをお薦めします。

メッセージ・バッファリングの構成

WebLogic ServerまたはWebサービス・エンドポイントのレベルで、Webサービスにメッセージ・バッファリングを構成できます。サーバー・レベルで構成されたメッセージ・バッファリングでは、Webサービス・エンドポイント・レベルで明示的にオーバーライドされない限り、そのサーバー上で実行するすべてのWebサービスとクライアントに対するデフォルトのメッセージ・バッファリングが定義されます。

WebLogic Server管理コンソールを使用してWebLogic ServerまたはWebサービス・エンドポイントのレベルでWebサービスに対するメッセージ・バッファリングを構成する詳細な手順は、Oracle WebLogic Server管理コンソール・ヘルプのWebサービスに対するメッセージ・バッファリングの構成に関する項を参照してください。

Webサービス・エンドポイント・レベルでメッセージ・バッファリングを構成するときは、「バッファリング構成のカスタマイズ」を選択し、Webサービス記述子またはデプロイメント・プランで定義されているバッファリング構成をWebサービス・エンドポイント・レベルでカスタマイズすることを指定します。これを選択しないと、WebLogic Serverレベルで指定されているバッファリング構成が使用されます。

または、WLSTを使用して、メッセージ・バッファリングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。

次の項では、メッセージ・バッファリングの構成プロパティについて説明します。

リクエスト・キューの構成

次の表では、リクエスト・キューの構成に使用するプロパティを説明します。

表8-1 リクエスト・キューの構成

プロパティ説明

リクエスト・キューの有効化

リクエスト・キューが有効かどうかを指定するフラグ。デフォルトでは、リクエスト・キューは無効です。リクエスト・キューの名前は、そのレベルで有効な論理ストアによって定義されます。

WebLogic Server永続ストアを論理ストアの物理ストアとして使用すると、リクエスト・バッファリング・キューとレスポンス・バッファリング・キューの名前はバッファリングの構成ではなく論理ストアの構成から取得されます。

リクエスト・キューの接続ファクトリのJNDI名

リクエスト・メッセージ・バッファリングに使用する接続ファクトリのJNDI名。この値のデフォルトは、サーバーで定義されているデフォルトのJMS接続ファクトリです。

リクエスト・キュー・トランザクションの有効化

リクエスト・バッファリング・キューのメッセージを格納および取得するときにトランザクションを使用するかどうかを指定するフラグ。デフォルトはfalseです。


レスポンス・キューの構成

次の表では、レスポンス・キューの構成に使用するプロパティを説明します。

表8-2 レスポンス・キューの構成

プロパティ説明

レスポンス・キューの有効化

レスポンス・キューが有効かどうかを指定するフラグ。デフォルトでは、レスポンス・キューは無効です。レスポンス・キューの名前は、そのレベルで有効な論理ストアによって定義されます。

WebLogic Server永続ストアを論理ストアの物理ストアとして使用すると、リクエスト・バッファリング・キューとレスポンス・バッファリング・キューの名前はバッファリングの構成ではなく論理ストアの構成から取得されます。

レスポンス・キューの接続ファクトリのJNDI名

レスポンス・メッセージ・バッファリングに使用する接続ファクトリのJNDI名。この値のデフォルトは、サーバーで定義されているデフォルトのJMS接続ファクトリです。

レスポンス・キュー・トランザクションの有効化

レスポンス・バッファリング・キューのメッセージを格納および取得するときにトランザクションを使用するかどうかを指定するフラグ。デフォルトはfalseです。


メッセージの再試行回数と遅延の構成

次の表では、メッセージの再試行回数と遅延の構成に使用するプロパティを説明します。

表8-3 メッセージの再試行回数と遅延の構成

プロパティ説明

再試行回数

呼び出されたWebLogic ServerインスタンスのJMSキューが、操作が正常に呼び出されるまでWebサービスの実装にメッセージの配信を試みる回数。デフォルト値は3です。

再試行の遅延

バッファリングされたリクエストとレスポンスの再試行の間隔。この値は、「再試行回数」が0より大きいときにのみ適用されます。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP0DT30S (30秒)です。


PK$óc€2:-:PK/¯-AOEBPS/img/callback.gifªUáGIF89a$ŒÕ8???õøËïïïÀÀÀÏÏÏßßߟŸŸ___oooOOO@@@///¯¯¯```   ðððÐÐÐ000 °°°àààPPPpppz|e·º˜ -.&åè¾=>2ÖÙ±[]LÇɤ‰‹r¨ª‹LM?™›~klXˆˆˆ888˜˜˜HHH¨¨¨hhh¸¸¸€€€¿¿¿ÿÿÿÿÿÿ!ù8,$Œÿ@œ°F, qEã0Y;2›Ë¤“9•F•Hê•XÅ>»Ü-4k%{µæðqÍn¯ ã¯GËÓõò}oïëýg‚„j|ƒ†€‰ˆy…‹Žt’s”x“–•Lp™Šž—‡‘œŒ ¥¤n©©5§¢˜°¡³Ÿ£¯²µ±¦¶´®½¼¹¸¾Á»º¨Æ¬jªËÌÍÎÏÐÑÒÓÔlÊÒ×ÕÚÛÜÝÞßàáâãäåØæèéêÝÙÐíëðñòóôõöâc÷úûÚïÎþü H° ¿|Ȍ¡Â‡#J|ˆ…p`€A#Ç6°¹8M‚†Œª6R@7aF‰¥]̸±cM"א”fe*ÿ•æ.X9±¨Ñ£k®m°qGpÌ`Úf 6V§i°A´Í«6¨–ËVL„Ý–6}ujS¬W×d•¶µ+›¯aŊ×FŸH &x킍8*@i°¹G C›`—4v,·` ƒ¹F¬˜± Ç8$§Ž²ªË™1lÞ{X*æиs×»†Á†Hßp@¨`±‚ïŒV7@°ÐTuãVNت¡‚i!¬B6‚Ïé6,¬œ*‚aЗ£*‡`–o ŽL€ºµî¤h{ÿö,œ8ã ÕrͱÆtÒQgÝjØiwDwßm%žm均Cz8¬×fðaWÿÛefÝ'âˆãT„ƒðaÆT|v¬¶Á‹ÁIfX/ZàfS]‡Áp¼…ÃÆՖ|è8ÕbÂ÷n=É×p]]vYB’8…(º·â-jðbŒÉÑÈà7æ¸c=2øcAÊW$bG¤mLBठP2%¥ TzhU iiè¡Ô˜øÔ{ÆÔeÌ`Aq-•õeÈÕpBøÆ •^ÍfúÍ`ä a©Ä¡8â|Ÿ[OÉJZîຨxŽ^©¤”ªjÃ¥kdºœâàiV Þ%*©¾™ÊUªšÀꉼŠY¬k𵀤z!* DV …wÿÚ¹]W­dÆ®Hœ²×a™Ê| 4:hg¨+D£‹6Ù®|Ñy„žéQL«àznº¬ëW»gZ ïiš6:ï²WÙë¾ú¶Ûo|Ù0l¤‡tzJîË01RX¤ù¥‘  pA|e.·Ú @cé‹Äm•ÁR>ú'v @b¬îlÖT$ŸVF°ç4¯aXT8lUuB »ÑN£µG\o9ï,£šV=ƒÐ&6fH»©´N;][ÔLí¯cœ5Á™u}D¬Lep̐ŠÖ¨ñ±%ÄÆAÙèúµXaÅntYõ”»˜‡w„[àE[™l[Õd:ÿAÖ~µ´²¦oaxk?¸ ç¯å8¤®yjWðy_¢GL:¦s|¹q: Ázx¯S{ŒT?ˆ³·ú—â†UÁ둧?¢‰ê Ô(ØêsSö@îCÿýø›3ÿ7¬{Aeù‹ÆþÒ?=0€L`®è6IÀ> úñ€ $ ð¸.Ñs¤"ÉÈF:ò‘Œ¤$'IÉJZò’Š$$~Ø0Üà“  ¥(GIÊRšò”¨L¥*W©JR"d¥,gIËZÚò–¸Ì¥.wÉË^úò—²tå&»åI`ó˜º&D”Kd:ó™ÐŒ¦4§IÍj¦R™Q ¦5·‰LlÖCh@ËÀ™YLnšóœèL§:×ÉJoV¤™ìŒg+_Y"´@Ï"àH „hK‹+§<JЂô §ô¦ÌŠP„*”׸ @€ŠV4!@_´ÙЎzô£ }æCóϐ®ó¡õ\ƒæ*ÇÛìh®²ØɎï¾ÔQñFo1Ò=o¸WÂQÏ<;ݽÔSžÙÏʶÁ^+ßuØö»`ÿ¤4ýëà<À;wý£>ùÐSü¬½8ž»qu¨a¨EuéQ“JÎǂ~§2v½ ÊZוG·æ6˜öëkÐí*¯¾â¿ýy‰ pæ—´ÁÆ}ö™ý"ð^óèßüãމyP6×àî²Íõ|ßUzNô^ß>ó‡eôfGµgyoVxž¨&^ Fð]ÉÄq‚¥R,|ÿ0%Sª0V(†|ž¤|ðe¨µrø÷kÍv¤¥mu4sFنc{ebu´g;çu›uggfn hg ˜~:xRë‡%UJW†r@ßi]×eØcüW8Ƙåa—qŠgeaAY+§Ú•cû–…m6wø eõR¥QbÕ~ ä|zÆj;GÚÑwPˆlË¥hÀ„aá„ixr(PÊ7\+‡‡·…yx~;xˆUՃl…ˆ«DwåpOù´OýôO©ðƒ»Ä^_aLjœu×Õy˜P_˜à4âd6T÷KF{¡øŠ&hï‹¡äˆú0U¿Ô À_ÿ´ø‹Õ%‹ Œi8ŠìpHm€‹Ä¸ŒËÈy%njcfŒò<¥xŠÉ˜ŠÐ˜¯èŒ–ø‹¶¸ ىúÄOþd بèˆˆÜˆ†ÈTXKîxLà€¥ôÀcbHQ[•Q>¡ŒQgˆ³4—Héh=xŽ·´v0aµ‰îJyEϏ­ä¾tuõ(à˜+ÕRÁS3u†¨D‘ÇD’ TcÉK& w¸DV ‘Ï%ªTbÙTŸøŒ¼ÔV7Jàg¨FÅ´“ª´’¾Ô“žçyB|SHU‰ì(”Ç$•Ì¥%fh¼D•/yK q?YL4©J2Y“9u“Ý‘ÿ»ˆÒŀp¦“yuKçIDÈ/æZ;Ё÷–—ϵc‰öbV¸‹@y|/y¼(]Ÿ„‘b÷e ”ސU/ÕaA_{çg‰g`—¡6fˆé–|¦—|Ùeˆ™k÷I ð™eU—wie·×€kg„©z€˜ò› €˜,¦š]¶™­ie\J––˜kh• 4—5G‚¡Æ€÷b~֖ÅgcF˜Ï9J{ɋF–í¥ˆƒ&J°b5§zØv{$8JZIg¡„j֞m9W¼'•LXV5feÃue¦dž7àŠî)JÐ\Ú™Ý@X/‰•w#珒åìåpÿp—ƒ®ežðÚeËE• ‰m‘¥m¨YE‡uÃU poñ¡מë w”år¦—û&o‹ùž'`aY‹p\¼—£ÊæZ£¥ŸX×~ €Y`‘àÙM9ž¡¤œx†m»x4Ú¢µh‘LUcR:fVšö)o4)Píwequ~å$Aˆfº ¶edpd¸†ʞ©‹Ö w8J£;‰˜/öXZJWW÷&Př/¶Yè%Jtš¥†¤å”W¡äIaé£Wʀ^:¥c†Y¡$©, ¦¦ä†u„¤I:•K:‹ˆz|a™Ÿ,¹S™^C˜ªòù  ©b¦Ãåb¦dfƄßeZÿ¹™aÅ”°k»Fd.5`nZQIö*L&ktÄG㶉§J£L%£™x\Z¥Mv4àZÈI›*J>:­}:Ješ`{&«µÈ^­úI`i©‹:Jšê®7@«¨¦†^†ªÆ´Ž§t¡ÇՕ®£j¢DÀr5pVYa`….™°X‡¢bffF}«°Ô'©éŽËt ЋíçÇåaì•\ûv¾êx@kMÆdÄjQ(à@6`ú˺kÎÚG-'±˄ H±†gQZvš;°ã&‡àZ «×´Fq4ùVe÷\po@;WY{KÛeÛj Y{É_ÿ«±9è¡cö°Wžrت k•”ef©Yiօ&êZ²¦ôœR™hüÚ¯SǤ¡Ôm0FY.&W;érhawä€_Ë kç‹c¦m®5nvDY%–¹˜[iŸ*Jí§°mÉ­ße¦qWbiŠ P°¦åkôÕ[$—™ih¹÷ª¸ž›¹rŠg@lß”ÝJ›p{;Êla§‹ [VŒK~–¸ÑZ¹¿kewJp°WÛ¹¡$p’¼Ö0†YwÔj˜û¹uYå º¦„²9¶¡Ä¸˜Œ„ûL” Mυª«¤±¤4 ÁeÕ jk ÚqŠm¹”¢þyKì¨N ’Æt¿ÿð:’Œ ¿ñ[óÛT݆˜ê©Kåùk©+@c ™üUaµˆìùïËJ5֖ÌJlj•–ÁÁKÁêd– ̈9÷Á ´”wE5|P9o«ØÂ4\ÄeÃÙè¿ÞБ’è‡vùŽF<Å…ÄШÄKœdȏ5ŒðOGÅb|Ä£:ŒÍ¨ÃÛ Ž’XŽÃŠ°µ¯cÇ%Œ8ɌX¬º?!á4NT‡7’­F°vŠIÅ%ǧDˆ¼KW zP؛†Ê›†‹œP†ynÖ5¸¤êhlCJ‰v龩ôž¦…èGLc¦Á ÉlG·§{ È7, •Ü®CúbR{JÿqVD\Pt;¥DPNLhKÃLža\‹šlÆÄxÇ üÉœqRJ¯.Z¤™zY¡ÔÈCØjtÙÏÌ%ÅþzÅÜ -4/ ª4ÍaQÉVbÞ®‹IYO7\È )Vv©éµq潞dP½Þ˵eç½­F©iƀºgÑ&¥ÓV®`ùÓß:nÏêÒݸ%c´ºWŽÌŸLÈ]&:W eSÍ\Q ÃXw¤ÿ ð€êo ¯Þ×o²I¢€*o^FÄF¯Ìæg€©;UÆ\ó¬˜Ô×~Iš”^Ä02˦_;Øm Ptç†Ì9JÔʒ ËrÅԙ^KVK×Õ±:¥à\®ișÏuzþ–^…^EàŸ wE@ÑB¹“#Zqv¤rýŽœu1Yi§­Ö¡ÄmXÇÏö쟊쮓<ÑÙÆKɲʽÜYÄE…Œâ!»¤[YÁQNj{Æ0Š{ðÖeíúÙWwÙ~ê¨ËÙُêªyq^|]ÜTºÊ Ñîl‚äÔÇؔŠ»Ò ¯Ó[G…üÐñ-Ì÷¦\uTLLG¦ Ç7©DÿA$QǪäÇoU…‡¨Ê(ÄcægìõÙTêINʟ$X¢*v7¯-*”쵓ϛ­ß%Pæ-‡.JW7W¯}\ p{xI£×GJ €‰sµY–fÜè J‹6f)oÞ»˜¼÷\9 z àÀ îà .`+Ô-œ €·ã·ƒÙÝÄ”¼G½ÅfZÙ/¶gnæ ÖÕÊåÇfc£IŸñ b$¨çÑ&V¶™rÈe^VG½Èghþ\”ځ-wæÁ¹oa¾£:Ýf‘^¡Rʾò­è¥d¢‰fžoŽvÉg €çîÊèf HqÚ¦°|cb]Ù£ÉøÝT>—±ÿ,œQlä(~MKà€tIÔVKfVÒ)\¸ «Ñ,œÚìx¹Ë>ʸ`äÙË2}Ü\ëèðÕXʱ¹¿`,J'&Ç<©àêŽKDìŒÞžR#a‘HŽfñ€¡Qé”ZÒfÿÃa­&Œ@fžR€\&ƒ>í0b¡¬áqùœ^·ßñyýžß÷ÿ ûŠ¬›°ä&**&p$l8@ÌRB"*µ$) IKMOQSUWY[çcegi­ á(,"´(lD88HB,$pu]“•—™›Ÿ »†`k«­¯oµ$ 2â0$ff2ÞàÀ ÓÕ×ÙÛÝõ¤‰Œ°éë흴…f\Zü¸ß8`ÁhZ¨ÝS¸Ðš¶ *dˆ§çK9ƒ1fÔpbB†A.º…¡Â‚ \ä€'ЇZn”9“fÍSç…Ô¹s ¤s„ \3`ÁPxX0€¤P6¡F•ÿ:N)ÐPP ‰ \¼Þ¨ÑXLРA€Q x>šq ¡C6x0±)€ vQ<˜0MKðêAׯfŒµ9‰‹02`ÃA\&4 @°hwâ†#ø’ñhaׯa·;¬ä25 peâìYʓ%A`ƒA àY‰åQ¯< N­ÚÀØ×±g_5ÉfˑÔHð€xƒ#¼!›E@Ár—O`¼ØxP@1\%4ÈK`9lP†›‡¼´l˜§Ål0às@B…pà,èX`/2JÁ+4!Ä´KQÅñ°Ê‰ÿlh,  a8¸B/,³j$†8€†Ë¸¡€i¸Í«#`«¯,Db¸¼@ò ,-;#Ј'c¤¡†#ò«jÀK€²â0%ÌA…H°áC2<ˆ‰Å=ùTÑÅ&û±¹´(ð}ój9ïŽÀ Æ̆ó/²m0ïˆ %N8ã¢Ð®dë†ËŽ‹ÑÊG5T8Ä$°ÈZhHÓÊÌË'(i$@!µlHÁ êêSØa û“ %=bMâ|<ô±É2+1ý.;+ÐðS5<ò”Ìö+/‘ÈÅØ—7$ \,§YŠ;B€ÕVÒôá`“mÐÕ ÿÜ$Ößm2v ³.<¢Pó®EtÒE‰ÛŒI´AR³òÛÏH$.ÛªS.jÜ# `öáS(¹#`“ Qg ùÇ Íy…šÁÞ89øÀƒöíàŸ6Hà%`ä Û MàÆæ@V7{ÀÌD%N2ŌXïhý¸ÂZ­?>“Á%0L°@€†t›ÅUÒþÏgz-Ñw~ù5Ø ù¡—0B 3l0Ví-²/sU©£…ð¾°B.Pjõ]òâû†Íp<âã˽’°jã­¥Pn— Y à,£:àÀÌÈÓïÝyg‡;怯tÄ[Ÿû.ÿË8á< ±Œ{^zf~ÞzG2õêÕ$æå‚覣κéÉ/•ê¯O‘áÛ^ô¹‡ Ë4éøZ­5óñϟÀÕï¿ € •§mV‚fñååNÏóÀýôA ΁þ³`,æ%T`4D1 R”2¾ Ž„AAȺ.˜B úLOтJ梧ÎP‚Ta£dÁ²j@VøèW.X0‘ˆv9a,ƕ™îÀ5hTa€&6TI8tÃÃ) 6.Ѝ»‘Œ%´¡¸(¦ð j¦Ô •2©Q+ÖÚ|f§^îV&WÍßk|f§»muþ»Åky=OÇE„…†‡ˆ‰Š‹ŒŽ‘’““O—˜™š›œžŸ ¡¢£¤¥¦§¨^”®¯°±²³´µD ©»¼½¾¿ÀÁ¥¶ÇÈÉÊËÊÂЗLaUՙ §¥LÕÙ×Ñì Ìïðñò̺í Õöiò0`€ü™:àÂ( zXðà¼…*àß/æ‰I²d¢n…E @ÀC‚g7YÔdÀCÇTJXªÿÕ¼Y$ 1TÀ”½Di²©Ó§ÉB«) A µÐ7 ÚDŒŠ:ðЀ'ƒ Ä ð` Áƒ†è<0°ú¬„?œM{©%EL¢ë§­"®$ޓú- ¨#Kv´q°d,h€àí ¬MPí‡Øt?,HÛäuì'¹sF ì4é<Ànºæh•å^‹ù Ší)묍LðŒ«¸æªëeÐê믆ì*ì°Ä’Ò°È"[ì²Ì6ë@+ÉF+kNÍVkíT í¶H*ðϵà†û\ܖKaE‰«ÿîºÐ`î»ÓaÇî¼ôúpÉ[ï¾üŽ‚ï¿MéÛïÀ« ðÁ#-YðÂü €ðÃñHuIdñÅg¬ñÆwŒ@8v~2qÅ—lòÉ%l@ÈÐ8 ñËʤtÀ ÌÅ2±8@sG¡Ì\³s×æ¼sJ.Ãlt-­NõÓÍÕ°@WŸPÅt³NCÝNÑGg ‹À´•.»’‚Ú‰×û†=õ.Xk­¶$\3Ú×ô6€ž&o,w;î®­w$mûB@gÿ­p¤€,x;{'îHß½è¼p£š8^0äì(n¹"Œó²À·#ðõæ {Mڗ—>ÄàIºpë©^0ë-›.;Ñ0ÿ÷ä©w;ÁéŒ>ûïµï>°í˜Ï°ñþ»âIû‚|ÁÏ?O°ô¿(¿üޙ§B}¿Ñ Ͻ÷½XýÚÙ£²ý':Ð@óµ£J÷¦¤¿¾Ì¬lÊù¼ä=¾ååC¾'ÐŪÎvŠª1–gƒ£JÎ@‰0ä"™ot6I’ÿqUi‚•:dô/1ãßøӐs¤×uê~ÕÚÜ0)ŒŠŠ¤ ÅP1¬ê’(xY·ÞW­°ê'ü„<<ëãò‰ L»v#dmû¸Ä¯d  `ž~þÂڟÕ6æŠMo»™Ÿ`¡'OIRƳÝVhs€]&hñy‚ ÛA*ÝêF·K²ãf%»^•Ç'ð€pܦ#ãzˆg<48‰¢^8±?$ü 'ɨ]õpws"¨¿ôœPî?thã©B¿o@Óÿ@øÉ ‘ò‘¬ÜO-·ó¤?Ðì¹F5'j¾sïŸð§iÔîÐQÿt‘ýNI—4/µ•‹'yŒþ²s9vCä !°õIt}_gRØi=é¦;ý  ›kɓNô<­ßÏ°: E„ÝN@¤îlc·Ñ•þnxo¢¿®‚Q ꦻX{2‹Ê¤¹Œ¦á®ç·-y‘¸üÛwî³Z³*X¬žØMy½ï¼ôa õ·?ÄÝåzd÷~`±ðƒOôåÇ#ïD ½¸xD¿?ç °ó…0üçS¾òµ†@Ó³!h_ˆ¿H„À@°?ÌüîÃú’~¸j½CM”gzBýG¡Ý D !°}Üç|ï÷}ïvgÔ"'Ë¡H·NàS‘kMÀÿÄ"TàSºp&˜BýÆS˜4¡†^f1ì×~øð÷ ò.Ôw DN#`N 0U c;¹SEdAýe;+3ƒ,1G¹Ú ƒ£A-`†vhŽö„Pxf†d'È ŸG,+x--èvQ «#¡yL·¦ä4OWO<ä8Æ@çôQd†zÑVK؄`…vh‡S(+î÷ºÇd@ÖV (W#¦Sgy43 p7kÈs@×V!8‚Q‚ﲇ‚‰ËЇ0ö‡…T%ÅDé9m}òŸ¥a<`±L‘¤ òf b•×I …‘ÿ pv2Ú >— %ױғúº{»ÈH¾IŸÂm˜àÄ@>*ðù 0a¤Æ›!j-9‘Ó類ù×A`[–VT©.E1bAJzx…ÀÑ+,ú¡P¡&š+3XT ²0QúdTŠ¢Ž'OÚ.`qª!zó¢x×¢®Aê'áx ³¦h‘ ÕpeQVeV¦§T6eL—j˜pÚ ; ¦L“v £¨Á¨á’8dê¢fê  £™f1'©.5!›z'` Š=•Š‚¥ê PÐ,bÂ[›µªà0¨KZ¨’ ¹˜!oa)ߖ«ÿ·z'Äpª¿2©Ï¬¯PE„©Rü¨¬Mc²JªL:!]¦\ DÕJ­\€­V ­RÀ­óhs±­‘r­ãš­å*®ä`®éŠ®äº®Ýz®ïê®>Ô!êÚ®öZ¯øÊ®LàS¢:ª¦#¬ïG¬´  P°+[°0zÚ°û°±;±[±{±;± ¤ k°<Ù±õ-(Iîý y‰€c‚Y ¦×Ú À™¤­ØFQ-Ò‘ 1à»±.±WÎc±Î¬¢*5m1ß²ðAàñ>áÌèlË aH´¡Ñ‰aç¥Q E‘燡Ú0úPC¥&úð-±c=|¹¢ð7FVÙ9É´§º°-µ–­¸Å·ÀtQƒ"raAžqľ>²Œ"h­áL $ªQcÎÿ@ÂT¬êdà @amPüé͗0Dñ]æAì&â½ !¿îl“Æ\vu›þMŽWzý·N þ,Ëd¶ b1ä|+,ËÁA`Ò"¹!ÏÅ3½$S¾  Åæ¬ÐP€ÐN0>A3êÁï‚ﬖ. Ðí‡ .¢½ÞT 5x `.B Ñ>¨~ÄöÍêVN¯æÏÀÍÈåH½L sÛA(?Ñ­Ë{üŽÊmÒìÖ¬ÊD^ó8(¾ ^Hq£‘aV¨íJK¼²àÏÿ} ,áyñÛß_NÈl ­#ŠÊ±þ oAÑfËÿk®Œ´Q¾Œ0œ†ôɳœº@Çn)\¶ŒnÅä¦èj?ñVÑtØÍÚ]Kr~›@~Ð@ø£`/ÜÅW×Ðoö1b;þ²Ñ_¤weöù?^?k!ß#N9áU‹qTròœG—àS©–¡Œò 4T1’éOÆt<ïú昡Guªï UC³ž ±í$ÑVû¨'î ùw˜ºøÈ2܋)2=½³Ô^Hҍ6J>m¥€²aœaŽÈCD@uôýïè<Ît¨ Ì,Ãm¬¤s \ρal€¨ 0 ÃDZ‚Çâñ B™<ÿˆÏÁð4ŠÇAàÈBNê#Qø¼ ùœ^·ßñs ß÷ÿó"Èà !#%' š(3($?Aï Ç><>œVÞ ÔÞd?Ò>Œ`VŸÞÆ´ÞjßFáøB›Aöœ£¥ 5­¯±³µ·oWÀ ) r!˜§Õ픁É$Li‡áP£ÔVVTº”)64pÀëÿ™Ž18Žl!ãÀCƒÆÜ(` Õœd,ÃᨴC¥¤æô–d No?Ýý«µŠœ2f<Å»¬-Q¡…ӁؔqcNJ$(«‘Ø0<$"À™¨¦0ñ0ÊÃ̒?Àlº%‰A2àFY‘CސÑ6,ÜRr»qà€î»gÓP¨·“•‡Û…=}ñcëח.p@j#‚h¹÷~«3壝 ÷€ @ø Šqê ÃtA¸±[3`_º}ÄÕó P@M²xk4Ó<“Š³4½óHóe4Óª' üûÃÂ#Ạ‡ÃIDĒ¤>»‚ÀˆEŒÿüŒB 7ªð€®RAϐ:1 KdÄCÿK*È#94‘ϦJo5+ :ńÄHÆRJž %Aõ 4`@$³¤è¶c¼ý6\qÃ¥Y]ïàÕ×u¯A¿ë¤.èÔ¤U(›±ÿ¶ÐB˜F À0 x³1W*@·ŽÇá‡!ŽXâ‰)®Øâ‹1ÎXã9voEçQGŀ‚`!œˆ—\´í†å\6DªÐZ$€×þ€EÀ8À@a9*ØÃ裑NZ饙nÚ駡ŽZê©©>ºƒgI€­D0øfßhíR[Qc¾ë—ÛÌö)m8XñeÀ?ÈæÚï¿U5¥ XÎ×ÅàÝ%Åy"ÀA  88àY @ò>&çƒyà r>«¬Æ‘wÀYoÝ>ô…Û4òŽ„BP½þzëG3`¤•€º5ä|ÿ·¾øÀO€ÅñƒtEFÓ¼öF þpž]ïÞû†&ð tK àº!¹ýŸ½QUÞU‡C€í2º¼ìAŽeT Û¥7 eˆ(4¢€^=`A•GpîÚ÷ Áfdˆ8ÿÞ7 åd€ Ð9Ü® @…i;‘éJՊŠàœÅÉø€^ i½â—‘Îzˆ0å±kIç¨B€Ìì.8[€@ppD'€žA€ÝI‹]ă.€>C lðÈ À™Žè#f\zXáE‚RÄ.p7]q€sjŒnQkñk ÿÌ°a`¥‰6”â*,Q€£ ´ À¼˜IMV€'&j‘Gt!9®è”©¡”°2šàE¡E©´¦° 0¢b¬Èõa=Úá£aÀÜ À[¯‘x©IiÃEèR“Íôbž5Iª`†šà(O碴™Lˆš˜‘‚Ž!NùmRÀäÆG½|¤A˜ó›I@n1Šcꃁ‡:§3ñÙ=Áů ÂÐسòˆ ðÀ(”€ ô<ÅB9M¥·-Ú¡…ŽŠýÙ9öqr‚-¤¨ ~PReÈçI½×—è5Óx͝¢B©1hi4Z£C4À¬3àšÿð@ñ³7 C;­îÀJ°ï [4fÆ=”äÌæya£‚Ž“³Ó‰E †ÓMFŽC† ¿89[ ÖNg¸CtØ?VÄY"ËÅ)J)ð;–… J`+¢0…*\¡@\ðŒÂ¿œ! ZfÛ̴äÄÙªuØgSJä&;äÉï@…*^’ÃXÌâ£ë|Ã.€¬''>±E2 A^5«ƒÍBZÖ´±[5Ϲ!u>¢\â‰ÀwæC¤dõ@l8†ˆÚ @Qô¢Ý¢LQâ‰×"úÄ ÿ Áá#ð¾»hJ«„ïpÉ/äºçMgš 7ÁÇ ÿE ãq:Ѩ> #*— ¬Teš°0µÑÜØ!UÈ»ä]¯ã-¾>ö\¬l—ÿS/ àKüR2;ÒÔÎ6 #Ž:‰ùA… õì܈µÄØ¡Á†µ„Q=nF"9µ¹ nì‰;'8D Žq“1ç7ϱ÷PqaQIk¡ÝàȞ¤o84£&×B`îtò|‰-¬a?¨Ð9õœ¬,­ðiĖLþxC1í«ìï¯`ñ•CaŠÈ€z¦ŸŽ_&ž3 ÊZ!ô½wè.³A{ ]ÿ~ëё®DçƒlO˜dn^š»ÿº{WúMüþŠ+ƒí(Yܼb ¥—ÝÍÝtüã!yÌpOקž†Û‘÷¸'¢R-|¾HÌÜøÿ€öædzí)ðßÇüТ–\l_»åÛ~Þ4k~á‰\Fqöà"’¾Fہ&@2Ä€äZâ|Éí½d,ʛòáà€WÜHë°}Ðq Ì)ü¼Ïƒ".òñ| ˆH(T)~‰ü ÀÝü÷û=}•™OnÚò· þÆBZâD-¼¯üCÁˆÌ"gFe) .(̯÷íÈjO' ?AÀ Y@ÈYJå‡ÈÿàÇA'P*ÐѦáûpÍ_0øåø’-Lì!ÛlM°ÃX0HÆdÀN~V¡\&fÊ TffjöÁ·v„òp06t0æ  £‡ u°k–¥ĆlúG£Ð-Ž¯'ØF #c|â&8ð"l ‡ å°Cü`· ²\ÏqX¤a4grþÌr0‡7§‚¼ŽØîÁÑð`ËÀw€Gxˆ'^y†@y(dšG~b ›!>f€–¢ °A nMb Ð ;xiŠ§W ¨† ÈDEÂð¬òG›øƒ"€nÈ°<ñ­ìÈá%¡äÚp®*ÿ¥R !T! þ €I"$ È>&Ú²õ­›V*@ÒÈ  ²<ˆÜÍ+t¨†8‡àd‡lȇ¤-: Â-sP?rˆ ?¢H8È šca¡ÅºDP„ŒQè!x a[Û¤b;ç~¶(aA@ÈEÄ@¡½Þ"!±!™AìQ3!O0P¼àXé¤b ûá˔± žNò-JaÏ€ýÐÂÿZ¬`;â$  AæŒíd”QçVspC*œ² @ãÈõoÈ®°ÿB|p#PÁ#Ñce> ¡¢-Væ2j tʸÄp'éÿ’––‘И)%'ݍéJyJmÏ2m0@øÊbß`ÁÛ$áT-¢m ž°%¨ÅÀ ÀÃð¢@xèêÄ€È~àꇁ\Ïè #»"Ž^Á”/ÊT8¢â&>2GlS ¢b~p$'Fc” „ÍÌÉ/‘ºN2ÈAZFA(Ç@®”o9ñ˜.¿q¨@0üfrE Ó²àLO(÷PsÜ@ù®Ò.Léºóô =÷!‡ à#þÁ¹Q8#=À*»BsÚà#Mˆ2Ê@|.££Ä‡IjÄ4ì¯E¬©½˜DgØD‹Œ3&aïDí{ò#J­“ÿ“€ ’¨BúìXd:ô ”:Jþ¶ƒ N E¦'žG-¨ëð#ëì#½Ò´€+ÜMZ¶ Et3" ”¦ ¤¤¢FB ’r#p8Áˆ.?‚jBSí֐E¾À] &ãF ®²4»ŽL‡  va?‘€îóôð à˜oƒàB“+l†Ù~Oû¬D daO‘êÖ°óês…?Ëã2$)J̇¬ˆg<¢‚ØM»‚ dAWY.ƒ &¤Ç Â.= GÄKa#W@ W&@4@U* 6`k*@$ –buVA hxfÒ¡<á¶ê0°%hÿ7VFe`L3Ê`èr…'.쮲†@ ¨Yý([neТK€ËJs5½’*L#.µ4š *.C5g-T,QHêú¸ãRñ¯hUuåí –ëüÅ0+]™âA9„<ä²VK`¢+"@¸–Mäja»²aQ5@H²"€æb)Ÿ&`Áú@R®Q)v)IÐÑ:€KcOö¤,¾zÆUðcy6¦«º¸«[†­À庴Ë[¼ëfëªÁØêX–+[1jU“äk¿lždÅø€¾\ÕkߐiñIÆ ¼¨vg£V!Vl¯ê&Ölíð/ãÖ!Öÿ–móIÖ?êÖ{0QöÖn¹ˆ­8 oáoËËpÅq÷{*¾Â'lCq%Œp—r×{§§2@gADriËs3t/—u(À,€L6rˆ!0ÀrKtetE+¨)l7žö(0À.r.ÀRWó`w:ŠWvƯ†×(àñ\÷u£7t§yýæy©©zý º©>ñx|­·b1ƒ¤p: ›ÎwÅ·0Úw|—w›71h×Êß÷(ò~;· 71Ò×֗}µ×x X!$/x¸òæ%x‚)¸‚=àp8|3X.¹:ÿXW>Ø{juBøs7Ø}OXJx´VMZ˜u$àÿà…k‡Â†C†íJ‡A„‡±Ê‡¯ ‡é6…£ˆQʈ§‰óI‰ñIˆ‰‰IŠ ƒŠ5Ɋ3 ŠÐu°Ø‹ºx(¾˜‹ÂX‚´ø¹¸¼Æ¸!Ò‚Öø{ʘÏ؃#1X“ÞØÚØ{ò˜„é¹î8þ8ö8ŽA¸OŒˆ‘›a[‡‘Á‘’ÿv1‡ ¹S$Ùo2yh<—jv†/ùQ6yŽýØr=¹jñ8”e”Ñ…•–r¡åÕØ ”帕UY´ —5©é:±CP(//ò\“Iù¸†¹b ÿ—5ŀ#¤º:BƒT˜oYLŽy•ë˜!¡Až4,ÁŽ,GÁ,ÑrO”-¥u=¢#¼A.K‰Ne R¹– ž'—ܺ‘º¢ ‰b³`(5Al“*Ì(75‚7_Á7ͧB„ó-°Íû š]¸˜k‹¡+—ž!U?ù³a¼ƒ¢ÌE™Ôƒœô@£tÆùEô¸büÆX, ^+%°…r!ZšÕA¥Yz~›A„Õf‹ø¾xº§}z€_Y¢#A#áC]tÊuI‘¡I Jß@Jã#àP §(ᝥaw;ÀwÚ6 tÓ8¦í Œµš«S¢(€v½W~è­á:®åÿ®@‘?!—ÓURg3OÅs ¨"S7ՔlóS?º C|Tc9LU5.A¼$«Ù&¶W=¿°¥u‘eYvPB³' &@X¹ú´ºˆkO²ë€²_.{³A@³9»h>Û³Eû”צý à&á&9™ÓU8— 3ÞõÊäµ4>§#ìT‘`=ôµ#ø4ª‰Ãy¦=€2àn´ ­ëãyi7|¾Ûˆµ.à(@¾ìW€ÓkŒÛz®á;¾¨®»µ›»)À»Ÿa½Å{¿Ëû¼Ó;}i—{2 ×¢Áxyx pðdײ£¡JuA€êe$¼_#¼#ÿ€@@‹±2 }ÝönhW|["€ÆX³[h,0\XíwëÃ?<Ä=`Äywî&eï7škd-"xÛG|)6H <$ày{Êñö€½•¼Mê3" }âħÁ+bÁ-yžüÊ¥üyy¦¬¼§²¼Æ= $€{|L:#ƒ<¨±¹"b6óÅaÅؼ]E³©œ±‚÷5 |Z¸\1¾xÈ+ºÆ\ý¶Z…Ðç‹wÙ;ѽÑW…{uúN š³Aµ®–O•¯{4 ­]ÆyÇÑ|”W²RÖ[åÍ}rK)$íÂøÕ# Ö1ÿühÊAàÖå ׋}י{Ó:co:ɘ‚^d˜z7ï”!ŒCD{bu³Yųç³ç ³E[³)¯h¤¡Ô—Յ]¾=ܛ]È¿ÞÝa¥hÖxiº:ôŠ1ø Ï·g£x´ÀhKK2æ]±RVU'âÒ[a(Y'½†s"ž– ÌC̾‹¥EkâÃâs·ÕíêÍÃ5ªfæ£&ìzˆ Ù®D¾1Häëê×Cœh~蝦™N^¦_þ÷#Κü¤|;€Žb~¬ è#؛Ÿ ˜)‚²} §¾ĺ0žþ:¢>띩àóãã3ìé`ìÿbëóÃë}þ¤lÍ"À!#tÃáÑÏÀ½Ôíçã ^Ñ?%`'¼0C Šðýu¢üðåàðâî!¡pv#7Z̥ϯ æÓg=u=¨­À*˜>òo>â¯*ñmgñß ñ± _ì±êì&+ ´K>£Ešà6%Aíþ~õþó•¾LDßJÆÃôQçRßöQJæñ8ƒ+– Nì¡+n$Ánð{‰?(_!p?ø£äx|ÿ=šdÖéµÞÁº‘ù|ŸI|“+(^gT6%%@±h<"“Ê%³ÙÔ >Ò)µ:xžÇ‚1ð|žÆal=WšåÐé~ÃãÿÇ m—b?Oâó•j!DÝÙAdÈ!&*.20B¾µERRJPža$4lý}jhZPH(MV¶&Nx˜Zí}h5|0xdxxÌZxL¸;"»².;'ÑSåíõ…JK®>{#EkKy}d ”~,Ď_E|ÏÓ)×'6ãÃʎ×ÞʵëC¯_ðÌK¢o_« ¼S`¸ƒl`¨ñؽnz„î`¹séÖIqçžyH@†TtÁ@Ä;epÕü`àB̞Š:úT4’Cˆ9…Q¬y1ã˜CÝpÔÎʜ=ͪ¨V!]͜jåæѝÿ/¿ÊáPQ,ÛiТåªÕݺvïâÍ«w/ß½RÛR©ZójÓ¾†#N\÷!`ÀÀý*72e%j7ð¶2" 0O9à &ƒÍœ‡N>}ZcÐS«Ž‹Ý x@`TڗLðÊ‹í3µpʞ]MÚtq'Qíèr`m0å 7I<û×ÙvlãÖ=®÷AàܝH¸ðÍÚ½ˆcÀàÖÛP.9|@ìVŨrÞFÛ˜ÕshD7Ýo£]‡U‚KT€¾@àÏ]4ÜgÆýQŒÆ@$ð—T0¡FÊèSzëÑô—Ë|õÝgÿËúýu@öˆÆ€֘ÄHg<ða<ðK DñŽ ˜Tñ…/éâËg½¶ãÁgæy®N¸y°@¨.2Îêû¬cÙê®íjm †°kÿlrV(Û/ Ò@€ÀÎÞ`±OÑñnx+v'#!ʍ[²¹ 6ª®µí¾ûG¼0@¯½Tà»rXÈbÖÊ)­‹¡yliÆsœ4ÈRˆ<ÉVœ,ñâ0Ut%üz}ÌÏY£!ôН’=KaS6Û aöŽ\{Á”r‡œo·­2ßõ ÷«^[PÞz,û7$n+‰Ýff]€Þl_R2кdàˆæ›s޹矃ºè£“^ºé›G°vãô~8â|k°sÚXpºí·ãž»î¦¯ŽOåx£Â$ÛcmvïÇS;Þ ¬ñw´@ƒ‹¼ôhœñ|ŽqÙàÓs¯ÕóÈEÏw?È “o÷ç•}fª+žÁэ púó5¾kåÿ;fÁÓßOî#'~Òsfå¿nDáŸô:¡¶8 œ FØJOŠA d(èÁz8°1ü Kø nÐ04! Ï;PK¨Ì ¹Y1T1PK/¯-A OEBPS/img/cluster_request_id.gifø0ÏGIF89aÄ7Õ ¿¿¿???ïïïßß߀€€ÏÏϟŸŸooo___///ÀÀÀ@@@OOO¯¯¯ðððààà    ```ÐÐа°°PPP000pppÿÿÿÿÿÿ!ù ,Ä7ÿ@pH, %˜Ï'8ž%áI~¦Ô€[•fµÞìö;‡»Wòº§Ío4—§ÏÝ÷²\]Çóómzv„p€}‚nF’“”•–—˜™š›œCVJ¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹«Vž¿ÀÁÂÃĤºÊËÌÍÎÏÐÑÒ§ ÄØÙÚۛÓáâãäåæä ÜìíîÀçóôõö÷æ ïýþÿC ,ÀG°Þ% øpá)VMIk„³x{eYJL5¥W¡(À¨)ã!€X3Àà´)MÏåi ¨þ2AŒ¦¶úS},öôA.10P.TÊ1%pٖ¥O‰”‰æ%CJ1`°ª5 Õܱ‰mzÀ 8¥€jZ¶J@ªàjRÀ­–k@ÿd‡î»ðÆ«Ê}±kïäÊ«ï¾åÀÁ½ƒÀïÀ›ÚAÀ÷æ[ð ëUÂöÐðijÄÄëJ\ñÆӃqƇ,r8‡«ñÈ(§œK%ƒ{²Ê0Çü -§ú²Ì¨€ÀNDõìóÏ@-ôÐD'p‘[®èÌ3ÑL7í4ÓF€ô94×L'Ϊ ¥M=˜ lýTÒ[w ØbßSµÕ?b}V\^@“q+aXÝÅÍýX=k³] Â2v׎À:»ŠàåŽw4}û=ÜÍ2O78‘ ˜…ŠäèVNÏŽû9Ì4÷nèe¾&:º¤{Ü9Ÿ«v¼¼¢ò:¼±Ï³ÿ:ën«'O¼ PÔÀîðö~Ë· ×:Ê°é«©†°Æ»¼9_Õñ#`9íî.qý»Q-=`¹[¯¯ø¥¯ùäDÿ}Iáo.úè¿¿8ê¯à)Ï.üîïßÿ4õ³Ÿ?¨'2ýµ"lP@·¦ñ©ZðT 8À&5ZPœ U² ®B¾ÙÖâjq%Tî­xà,@¸Œ%DM ¢PÜ Û<ˆ-±p X€Cœâ߀Ênla‚–€(D^)#¹á*T( ~à‡AâŠè¶q %ôFX:+Ƃ‡ÐÈ¡I8Ø14¢â‡ øFs^G€ÿ€W£ò¡o Àø¦xNc`7¢‚Š±€£gˆ“:ÞñCWÔ#kúøÇ@ÚåHÉHþ¦(ÅgOa#Ç i 4éZ»Q ðD%,ϊ,¬á¬‚€n™‘”qº.•`J ² Qbåˆ^)IYF€–¶\`:yHf6#€ ä†(7¶ËHNòŠMr’Ö´´)kFr[cb̂8Ò­jj/—´`!±9¦mz'¼|‚•:b€qz“!š´¡÷¢ùö¥Ó7ÐaMé0ÌQíΏ¡KrKgž‘°ø¡…Š™‚^ñ  ‘å)êÍ:NŽ“ûäg?ü¹B-­Ò‘Âgðè?"•ÿ€@ Àq?žgñq(:˧Óx¥ò¨çJ! ­¼t2Mç挢1 lÏ,̉ hŠ›¬^O»¨„DXڝx"ÐM|Iª`\"F}Œ¬ÔåV¿èÕ+„U «X̚$îc­XZb˜°©0žq«¹°êU‡1͊Qe¥DÙy<Ö\l;K±ËºâŽö˜l3@kÄæB³îàìÄ3&8ëp^ ¨¥Ÿ¼0PO‰Ž~F: UoB”­VkÇtFÑgzÌÇ^! òêSù:¢ü"ÊfhìZ'»8p4ŸM êÕºLìµ?=îR@aZsÒ¬QÑMö²t§À©+ ]åÖUjln‹u¹ç½ïsٚ´§ÈçºÙ-–²Öޘé.½—<¯Ë89 È5Á­Âd3€\ǔ©+—éj@ѕƒo7#;·U o ¯ñO=àfCe`9dûm.O[äp¶*ßâx±XjY× Ðï4r(C7g¬b7·1Ñìv/¨I_…ŸºJ¬7òzJv’Ë3Âÿ ÃÖþ÷—Xa=/•°"ߦŽù„ ™»àFo…Ì1µôKœ ®†;BìQ*@ãV79}¥x‰“†4/—§9í õ”Ʀi7Ka?¾©n½ËÌEªënœ—Y\Á ylg³¼:1(fI‡ŠÓßw7 ×[!æ tˆŠf¦1K¬ð'„é³{Í¿ ‚j-JƒÊé;Ÿ?ñ²n‡õq@Ý8_ é ôz/Eó[Ø2Y/єX|SGr®snv©¡tڀµØ”A@4Kw Pðê,Àÿ{CN2â Açv’m.tøÆo׬:Œð¡ÃGÿh'}{vçpèqŒIàu¡–tÎÆ}L¶WW}q<õI±{uv¾‘@Ù¡)OàGfdB»Þ+‘§;OPfEõq·‘Peuƒ¥ o´V0d–b­ w¢ß°K´l…¦°o@ :È ±wH$8 ã"‚(ˆy–sçô;5ÔMÀÇTWù”@m&]Þ$>B8€çT#ÝttwYõq„',± |Š—lÂ&‡øhø“r!V'~è €T>oV& |°G}÷™¸$P¶-ä²{…zwxÒxJ0¥p‡Ô×z‘ˆ„˜÷j„Ø*dF†—v‚»†’ ÿ#÷q/Es݄à`=È1ƒr±Œ`7¾R k•@•#€¨XâSOš2Ai»A&Õ¸3B€ØiÌg*dVŽ¡ªÀˆ6hà€§…KÐhÞ kÅ ¡^ Op'¼@b¡%UHb ô}6^P ò¸,ä؀¨€‹ƒ‘lìX`f´0KH0çèo¼Øy™ýV‹æˆŽÃµ uUJº8 ›Ç‹_ø‘3“‘QF’È 0wÔT»#‹¬°IY2ye!ù“CBfi&>ÿÁøX)ùh…k¡”ɘmµ =IBycAéÔà &¢)¢KOà$,&ò`ÁTyÿbyEÑ!© ÛƋW9$DˆöWvõL0©eɕÐtX 0§BбÐ0!PGò¤ †7;â!ŸÈª NñqÖD>A*}Fin—O\¹€§ ³ @ÂÊ °bp” Š4 œâ }Hû¦ÿ;iµÉ*nç¯fñ´3›-¡Ú;ÎijW€µB /T{¯w;³€aãj$2- %LË)6¸Ad7O‘±)‘ K Õé¹çÇJ·gD—k|&K¢f zÝåuÄô²Ñ÷¶P u3£‹@v °µ­¯¬ÀŠ£Š‡eUˆ‘Q.ÛM ªåÔ¶‚z=,kFü¹Õ Êñšæ .´¼üÙ¼S£ƒø«„jŸÇ ®'dðä´§µÐ{n‚d·¯=òº©ù w(£x dŃŒÊ»FjMkÚå%>[%ä²´,F+&%(ˆ±·QGQ¿óƒ¼ Äê‹Ø‘ÿû¦xÓːvTHœ q³È§ ¢¾B0+¤Gš€ÙfSàelÂh‘µJ§‡á÷†'œpv:ú a¨ Á!ÂBP"»ƒî"ÃÌÕµ{ÕÂøÂÚÁþY’Z^¤›eÉ£Š€IŠ²dÆ[sÕJÄDâÆÒ K¼a+Â@·RÌkI &©¡»Yœ§ß Iç‘=ã Vly¦«H˜lin1%NÙ˜°ñ‚:Œz[¶·¯@ ‘õ¹¿¡É,æg‰(Y˜¬ Nl0Ê8 yuYHRDÞ`…øˆ&Åʂa›µVÿäâ´üÊ©ŒcZ"·‰jgÄ/ÄLhNq$¯  `“Ñàˆš5rRÊF` ,xÌl2©`¡Æ/Þ¬ ^cð@Òã °®«jF s@Ö´ b±qruE_þTÀI^`` Dö-0åUVå3Ó3?®hë‹UW¾n7àìÁ‡‚Dq=KCѯ!mÑPæà%Àç‘ÃðÙ!çóvçµð&$tç’ÁÈQýQ¡»^—CòÔpëÄ&*%9Rÿ‹f&ó„%ĒJaóWç?¡&1‘Ñþ¼ûðGï%Ž¢&Q/îàÅÛ\õœõ‰ÅõZR!àÑ¢"ðN¾(NÐ(g_†âï–'(ë¡}šqGEdñ òA÷J°ë4âð1ñ•qnžrD~Ÿ R¿X0øQø¶î†ø¡¼ÎòëÇ-,Î2ó°2Àwç;A–»_ÎQ\¡_J°¢ke)×¾s¸‚¡ÓՂvb{E€O]Põ\ÑöŒ_¸äËûWUS§•qþë•þêÿ÷KÖ9\Ñ!ÿ´ÏX4‘Iå’Ùt>¡Q©Tà]±ÿYí–Ûõ~Áañ[Á”0 €™^·ßñ ‡°Ý÷ÿ“8ó!ÁÌ> ÿ">ä"CEG³ö2OQSUÛ8^acegi[çHqí&‡ÖV™0‡@s•—ÃLU< ‚…­­ø2*$˜Á»v‰"< "ª¯#Ž‰’Ã癝›†^û!Žð ˆðž8§dÀ‚WS!píH¥mK(P¥à=ãŠXÐÀƒ3X`)Häy”)Êށž0ø Ѓ „Èk ”J@ð€€ÆTæž@˜ÿ(HÁÔ%HCE€†™à@V< €d'QB1 ©¹ø´Â¼õ•nžšJ4èçA$É<,ø Ø΁xjDå`ˆC€ÀÉ!œ!âAoȉ‘½ÀšÌk󉌙T¶„ƒ±u|ÀC‚"Dà•xAaJˆuH=p\$&…xPWYX› $’äüê,ë×H|å¡ö¾“ê–Äd>^Ì]Bü>y @©õžX¸3쎁úÅDpÎ鉤€ú¢‹ 'ÛK€à(&¬>(i <Э¶Úñëâ³ *îL´³'‘p©T°à›%ñ‘"7æÂÔÓ+š<ÒÕË«€¸Kõ¤'Kòò¾’MÏÌA“€$}R-‰Ö!|á°²\=Ðӈ k„ +Î<ѕ’ê“UX¨vH˜rS:ý”M7}"Imy Õ)‰ˆÏƒ†¸¬ ØÒ0¼„Ì¥h#Ó¾¢âKsÿ 1Ñ^Rö9É-! m-ØX¡ZƒC‚tUˆE‹ –D>ÆrZAàŠÏk ¨`pëà¶Û&¾%™9q‹Š‚ ë)KNtˆ¾¬xân"ãc`€l8ãnVÀ w̙ˆ«¢BàŸæ¢?rî“á`1|Qˆþ²¡oካO¦&è¦$2:™#•É0¹‰Ê(-•”ÙþŠe"h &Žc¬#·t*3à€<©ìºcö~lÌzªŒÜ´b˲!>Ëç„H«±^ÊÌÏ_ût¿¬oÇÙÚ 4Ï)É cÒ_BK$ãЋŗŒ xÃD ´T$DÀR*#3\ËÉfF¯Z{Hç‘!§uÿå‡qè¡ tø"8÷ _.ÿfÊ»7åQÕ¬66Ûðâ ëXîáîó$”œ Í×ÈXëDy§‹5à$'¶*ˆb›ÜŸñ‘tã",]É/‰Õ,µÅ0@ æ3Ì/wl¼akBHÐDzÈBu,Š—‘5ÚepJàÕÞñPt¹!®½ è–9c€nА*lֈ8ÜYÃbP·¢€d]cº­f %­¸h „žà¥ãJâÙBÆq¡×¨@Z Q¿µ¬¡]꟠¹m$=¢§~ß8¦Òo^tB4K,¡è\òô׎ﻢÁ’ 01šÛJÿ úÐáî‘ tÎ6$4Ê[3-–#£Hl4ÈÖ3ï:„¼MP8gëè%oûã—!ªZà¼ÝªÇá’% @€:T˜€— ÃoàKLÖ°†R(¨ã£ÄދàxÈϾGA®y?a~(¸Õ¤v|ƒ·NÀðæ!‰ñÇ«¢«=0DŽæcÿpÚOß#@q²+zín¡Þx”=õÁ_‡   `ô¸‚æíóûáYAuÏ,\à“'ƒÀÉy`é»_ˆ¡%€D±@Žîdºáª"éÅp¨ýøOIB‹¸€ î@þÞ ¯ɀiÁª‹€ (oS./˜LÿF ‚ÁZ~Äë/ P낍` ÎíOLœFðàmv"l0ìàÌ'õ„à%òŠ.“8Œùɏ€I,²‡_ ˆA8ÐI8,ë(«”Ï: ]&Â;¶0AÀ K *<öÏÙF ‚P ,©â)  /2i ®,Éá'¬.ÿÚ'¾Gå¦"†äêBt#íœè@>:0Nú ͐”–Àõ¦`,âÁ$€' tbða¶ â ¢ë¢Læ$§ fU”¨šöN Q¬¼ôN“Š°©h Vo·š‡óL(R"ðîLµ@?« _Œ„@0îÌg¨ÿÂçøáæV‘pLt‚%Qû/  à Â{JðfÇ!üc¶B dJZa'> ±: =hļbD¶ƒ¸ÀÕT؈q 4ï²ÆÊ!;¬ð,ր@ŠÏ’4/“0>ÁŠVÁA $ñ2Pï4¢çr1·†à¿Ä6ö…KPˆ 4҉òâg‚ÅE îó–(!­¢ 6€Èa›À Ñú¦5>Ëp¬2P")/†‚t¶®ÂžH#FŒ(·n'® )%Q"€)}.8Úq(Hã»*©3*ÒµÀ¬+½ò+¹Åø шp“˜ªdС }rImpQ ފd*¦ÿq¼˜h.­E= @0.1ûvNQš'ڋÑ-•Ø²-yD Fl_ *ƒ6áé°ÄE†‚ô°›,²þP8š)ÅË0¹OP82àð1sÑó 1s<’à'`áM¤¢$æp1/ö€Ûtl7§äé&‚89ï»"ë©`Á|„óM^A"´1eSœ2` 3(úg6µ ‘€:°ƒb“;»Ó;_0гǀƓ´ªÓªþlJ0 è°cºnÖP Ä`Þó~±äó éS+É ¸­\„€)c¥F11;^¨È†â ÿ ÈphÈoA´Aë@£°ByE-…ÃCà£(´ f«}d2 À@oô† ÔÏD߯A?€²ìšRrA¼§$X¨špŒA Ì"]$6¦Â)E':cv¬J5 @²MŒ(” 0ÀºïŠÀG´nA*\QTJ T bCûƉ¬D¢†BÅ ÓîÛ¼šB8>é ôޔÏßX2X8£ G5àphà×T[üàï¸â?Û ûŠҖ€H K¥¶ìB`É)®é.‡¶êi&â"#ë,ʱè&]/÷ªŒ’é^­ ÄÀ,à\Tˆµ.5yü "{ÿ±2à…:§pŽYM§“l#õ‚ DµZLbJsô D'ÄkïzQ.wzS0V¼\ñ'xe09'E'€ 2 ÉÐaX`¶óX‘µ ŒÊ9ç‰`‰×´8 ˆóÂEº¬ç¶¡}5[=ãü¬CEœ(5XðôB®õû¦T£Ð«^IoÐà±´&€Ì$Ät TÂ, ~Ô_u‡¸í"ëí/ñtñ:£oz6ñJ°yô[S´Z†¢ìe æÒõˆrÃ(²xGjs±ëmþR#|È9½Ç|Œõ$€. ÁÌ-Ú`-ÚÂ,à(ÀRqö_¥ÿ %}†+‚BŽ!9ð9>á"ãR¨žà( ðõdBÁ8  Á¦cl†K;ÖDÀèΪæ6˜¤)9o=Š›ê1×`”BÓI(#Ö>­4놖ØK¾ á 0so ”So%%H>®Dt¶ BK¥0TFPÞôCñଈÉvá ¢·e9 Œ(€2Àö(€Êö ¨wdØ+w2`.(à¬/„´pŸw}%!>³€J”Òw^Ù·~ÿçfïàúU~ç— ì÷saûÀMc– †xEáð2UiÎo²¶H ë8ƒó@å6úÿ@Y_BZQvKEZ§õ„e§4âá@SWƒ]˜ 8@û”`Cj ‚`{—Æ–ˆPvaG76ÒZ· ^¸ˆÉÀ”ØC0d †ögO/‡ Š¶27åéÕ]½ôÑ~øq°­þÜý 뿾³T)ƒ~²=ÿ,ì÷ÇÙ[½êî‚|~±ÕkíïÇí¾·æ GÏ‹üŸ^x¾[ò~¬{ È~„; Blþ`É :ñé ð!lñž ç1 š¾ÈjC/té Àëé9ôÇò¡€'&¿äØÀò»³bR òC)F„‚Bt#z €&¿³Fß "8Q õ¥ €õë¬8 WQ&0"$Ž\ÐØD ì©øù*÷£`÷ÏEv ø«É#Ÿ€ø»Àõ¿`Ìw«'øûè°ìGXÙÿ ¦ÿx¬" „Àó x†ä§é|B ¨jµz®Ú-·ëý‚Ã×$jŽŒãSl.<ÿ‰Ä¹î„tÄú=¿ïÿf nIT؝¥0(xD¼}ÌÅ0šTHt‚ Nxdš­}Ä)| x,xx˜šxL„æêîòæ~öw‘ÑB¥}¬µQÆÍCáyGo=Ì6;},`~4Z?>͊FCÕ®Lc +v,Ù²ÿfÏ¢= T+”¡)‹îL+w.ݺa²Ík¯~ÿ¶rU¯^\óр€° R"8Œx2e—ð2~ª°oå0£¾™ €šÍŠ,Ê·„_çÖ®Ñ)ÎüÁ1dɯ»ü¬ÓjA¬Äh„{{8ñ\Ÿëˆ&À41ÔWç"ÁB„3E@Û#R ‚¨>¶ÙÚáPÀüI ¢Ãß'÷™Ý½U?nTþ tÌD ð40>$àAxL4 ÐK$Àc0kE‘üqØ¡tÔYçvœÇJw߅—Šä­e@‰à©wF{ïyH€ 2@@€Û4@GÕU"ÿo´,‰[x䡓Nú'£€8 ‚ ¸Jƒ<(‡„¬Txá> Âeë‘ãÁi„å†M´’FuoPr„X©9±Y™{ògcਣ,ôè& ¹ ‘âØã’J¢aΞ ô„¥ÄqÀ³ PJK0ðßqpú „] \À§«ðYGkŠåæ5²HbkH„…gzî9"PËZ­Ä²Xàx°˜­\ûÁ¤yЛ°öª¶¯QÅ¥©x )>ÚÚ¨¢Aª=¦¢:[¬¾JŸ¥07@ßà+ôš‹ç¾¦àkÂm[pk \¬‚p‚¥ÿì›5;°Ð.­¶NÉÆÈTƒÜ™¼ñ›ç½ý>ñ/Êú”|„Ànì÷jËuŒ\:…œ3b×|ÆÇÛúÙ39’ê\ô_3£)ô7ŒAŽB§ÌFSíWÐP3ItÁ”õ1­V6SN/Y3R‡œÈ˲mB£ØoÇĵ×_ëÌÆB7@Ü{¿¤6ÖmÍsÇ?ó]¸Dvc·Ñ±v ¬á;$¸l„ë|5aMBžy;ŒËæxÑïȶæ£«cyaZ݆„ é¯Kzf¢‡í7a€Ãž;0ªËÖ:ÜQF¦îÃïb»^¸¿½A~l-°ñÏë¼^ÂÃí€]tq½ö†(¯Wóۃþ9Ö_/Wöâ;PKœ¦jý0ø0PK/¯-AOEBPS/img/wsadv_dt_001.gifcúœGIF89aå©÷òòòñññóóóðððôôôïïïõõõîîîöööêêê÷÷÷ëëëíííéééìììøøøùùùèèèúúú½ÒéÈÚíÓÞé¸ÅÒFKQÝÞÞáááØåò›©·Öäñçç犚©kkàêôñöúšËšÚæóÅØìÆÙ죣£ÎÞ’æï÷]bgûûûâìõ¹ÐèÐàï¶ÎçìòøÀÕêÊÜ툋UjUÒáðÌÝî©Ø©æææÙæòºÑè½è½ÙÙÚ²²²êñøÏÏÏÂÖëszÕãñ¾Ôê¾¾¾ÂÂÂÄÓâÞéô¹æ¹Ã×ëbei¥Å¥ÍöÍ~~~Üèó¥Ö¥ºÏ㥻Ñèð÷ÞêôÑàðbbb‡‡‡åîöÔâñx£xz…®Ü®îôùäíö±»ÄÐøÐÝèô´ÌæÈòÈÔÕÖÁÖê´â´ÓâðÁìÁ‚Š‘ÙáéôøûÄ×ëÈÈÉ°Þ°½ÐãÍÞîis|ÇÚ왼™ ©²¨½ÒqqqJ]JÒÒÒdkqV[a·Ïç²Ì傫‚ÆðÆ¡Ò¡ÒÔÕ²à²ÄîÄ;K;111ÌÙÌãããd{dÔãñ¦²½ ‘œ¦ÖãñÛçóÈÖ䪶Ây~‚QQQ¢°À+.0ÍÙåÕüÕ®¸Ã üüüLOS¬Û¬ÕÖØÄØëfffŒ– †’žAAA»ÑéÀÊӋ9<@(2(ÑÓÔ%.%(,0ËôË×Øږ¢¯ŸŸŸžÏž¿ë¿BHP·ä·ÇÇÇ>FOÙÚۈ˜¨ÃØëÑÜç¿ÎÞahnµÍç  ‡˜§2=2£Ô£Â×랯¿°¿ÎØþØ«Õ«ÓûÓ???‰˜§OOO†–¦ÎÜê Ÿ¯¿ÛÛÛ5:?wy{ßæìÂ×êrvzâèÊÙèRX_nooÔâðPV\  ¥¸ÌÂÖêäëñ^_`‡ŠÏÜÏËÛéãêð´Ëã@O@~›~'+/?GOÔãðËÝí·Îä!¶Íã¦Î¦t€ŒäîõÏßï-/1Ûèópw€µµµËËËâéâéìïµÌµƒƒƒÿÿÿ!ùÿ,å©ÿÿ H° Áƒ*\È°¡Ã‡†A±¢Å‹ËhÜȱ£Ç Cn B²¤É“(Sª\É2ˆ°—0a*™I³¦Í›8sêÜɳ§Î\@ƒ J´¨Ñ£FA)]Ê´©Ó§P£J…*"¢Õ«X³jÝZÈ?.ÂîK¶”ÙRÒª]›–ˆÛ·p1Ry²¦›»KKèÝk¢¯_tWL¸ðàˆ+¾Á¸qc9rPH–L¯²åÊ/2WټنçϞӈÎBšô¢!¨S?êÀºu‡ °cÇÖA[‰Û‘rëÖý¤÷“0À‘><„ñãÈ[(_μ¹—çн`™N}ºŠëدOÙÎ}ûïàÁÇÿO¾|—óèÓ«ï"¢½û÷ðÛ·™O¿¾ýúæO`ƒ«ÿÿø¸€%Yc…[ Âå rÉ@—Ivá¥Ô^|ýÕW`tæaŠ…8ƒc$B6e—Y–Ù œuÚg¢¥Qši©©æZk²åX›m¸í¶›o¿GqÈBsH2tÕU—]vÝuޔåUÃzX¢ߖïÝçe}Зß"ý hæ™hjE . ˜àY 6øà[NXR…nä…a n(؇…‰¸‰EvbŠ*jÖâ‹0Ž6ãi5±Ú¯å8ێ=ú˜À…1$‘F—ä¨K>×$uOb%wS†g¥yYbÿÉå¬"|i«˜mð—殼özКaµé¦‚q²5'rÙIžzbØ'`z˜ ˆZè‰( Š™¢œ1š£¥AZ㤔Z ێ gÄmM\qÓtWž;Û'ǃøqÈ":™¶ô˜¼¨·+?©¤0Ǭ#¦$¨»)»7ÿšó‘;+ٳϩª´ÐûmôÑZ& ßÒ÷ÜFOKmùå Qíæc=1„ÉZ\W…Íf¨!Ùöяd9Bf‘‹œà ª~@‰" ŽŒlä#!ILÒzL¢%€ÉLj’“ô$(chÞð—Q»Þv¨ÊG¶ò•±LÀ,kiK*âғ,à¢ãg Œ±ŒiD#ۈÊ8Әǜd2•iIfjr“‚„f4 ‰ÈS,қr\e8ÅËebò–œT'E©ÿ)”ò”¨l$ä9OJµ<ç3uÉE^ÖǗÀŒ¨¯„IÌx‚óŽô¬¤=ÿȅêrš`´f͘M5n ýf jÄqΒ–÷Äg>¡ÉÎڐà îL¥EWIdÖ³œ1uæLÊOÃùӔÝ(A{šÑƒ:1¡*!zˆJôªh¢(w*D¦âÑ¥@å¨PÓ©N¦š×$cIMºÍnÂsŽKÅèW“ùR¨FUªS=¤MqúN¥ÆU’M•eX£xW²B³¨ÛùgRUÚU¹T°µk ñJH‡ÒǪXÍ,€´ÊXV:ö±äŒ¬X'KY˜ÕhéZOŠR8 t ý,,éºÑÑÿJ—¹T§^isӜ¾Õ‘±ì\5*ZÂ֊êdAQ §Ø”rµ±E lh‹ûD™֓–f5Ë]5(Xd©(\y*[ÚR·™c¤'O›Zl–”µn}í_…{Äúýt°ÆM¯z=¹[ÛðU§Ïõlt‡ëÔK•´×ÕârÚZ—¼ômé}Ï«PV¶ª5쮆!ÂÙβt¶Ä}êoká,²W¤îÍ&|ÛH4¨D"†˜+àx°BðcY¦Æ0ƃ? l[—8‹ýíí; [»Rºu1:)»àæºÖ¯<ÝR`Ä< °$ˆûe˜yÊûÕbvÛ°Ý »¹ÿ!ð‡ÍKaë¦ùÄi%©ŠW|e9jV0‚‹IA€D4hHðЈàÇ8Aý€ZXÚË'`&zLÙ$ÿ×ÁM†n„Ab"W×Îi®2R+g"â¡F<òËW“9š®0e×Üæ7û!q¯¨ŸL`ÈÖù¸†Å³jßËç7 Ôâ ð + `D$CŽH R‚“sgmêS#;͞ö-“çûJR»Ü›6²TUÝ`Pǵ0@ЈC€ ðGlc&"€7&…Ό[äªÿŽ¸B‚ý` ΙÎðÖu՝â4²¶ÞÕò!Ð`„ ¾:’•ÿÀƒ¾#Mé$€Òäüq¦Í|f45ÝKÆò°Ûñrk·Êš•û,l‹ Hďñ€ü˜ yhD ðш<@€ßø z%"Àð†ç’×–¸Ä)j£ËÖÝÓq~õËIŽwüŒo#O kŸ@³Ž¤— à•</2Œ­ ö®{݊ýÕÁ§×ÜQ÷œæk—7né rQË'¨) °e'€_@ ð°€-ÓòÇR–<.?q±»~ d_¥€?á›ûÜVt»Z÷|R¹ûp@Tº˜÷pr;¦Üu‡1¸)] #ÔÂø½=Ûq™øÅë|çÒM;ä¥ÏiN.Wÿ¬|ÿ€Œ‡<Ù¤¨Ä!*‘Áøô¸=$;ý+²¾—aý›©&,ñ¶º¼=—k?wEº§g×{,ÖC[FGàֆmC¤eVpþ)àe9sÚ·}ܧzœT}ê&_Çsµ—qhBgJâ÷r`|wc€p·„iLÔwôWpõaù§Æc±CŒçd$Xj&x‚¸ZÈj@ R'h6–††hŠÆh9`~õpøRxNxEd;µ±xG8lÄZÚ'€'ø}ᗀE'`?¦r`0ærê—u‡p¥×YWu\—zcèƒô„BèzD8L†fÿ€%†b(oMÈlOèl~æ‚Wr.˜c‰`¯†G}øcoñVe¸#hx}³G{‘è†?‡*è{shGZkFÄh°”•c‡@¥÷‹€Æ©Ø}†8ˆ˜ˆc÷]àňŽøˆ£†vQ¶ƒ U‰¼×VrXvÒ8`U[5×}«x†ê¯˜„§¸„“¸I´ÈMDWq݈Žé(‹bhòqˆAȌšµˆF(‚HèS±hNë(EðE}Ñ^ow͆‰–çUÙWÖXXãH­èŠ­´†9í¸FÛȍ JˆŠ9EŸ˨¾Æ!ùIˆST wÿ){/ “àŽš4‘ŠWŽ.ùah·švŒTԑ+x‹Dùçyçt’ð‘’*éf,ioì&’éhŒH4é6¹{Ùè‘99_™‘‘È•%)E@‰†æؔ§–먔¶ç¨•ïf{P HRùTY•v•L’—GyŒ_y(¶lcI–Pȍ¯èq)—ٖBéj(y‰Š(EŸP<Ù~ŽÉ,8`Ŷ™\ٕ}é ˜Ü%˜Cél†©o‰‰Z‹™l¥ ™;yš¨™š•y.)”o)›h9’µ• ‰¢¹”v —†y˜b¸šíњ®™Y°éŠ‘©™ș u›aÿ)–Ú´îw{`‡pvãDNeö”áX†f”KFšê‰œEI›‡)VŸù$ÏY—àb0&cÝ L·•ý)}Ö)ؙWµ)iY›~$ž¹©›8éF³f‚ÖosI?vvE©L¦}ÖHŸäèe9‚Þɟ EŸÙœà§‚£‰Ÿhƒv >õ y°•ŠI ú Q°yœúùž´¤šgÚl€Þäe0k ¸²†žZc€¥ŒFdmä6pƒg¢ñ‡¢GɖÄ”,º:I¡Ê ž~4£¡i£7ú[Ð&mÔVm7V Cd¥ø0Š`~ Jb†3Gp• §sÿŠ’ùX¤6t¤˜Ùg™œ@j¡MÚ#Ežåy‰QGXÚUŠh‰ðmFàmàeØfªÞfVˆ2uø£'ړý©¢ÅéÐé›pz©1J§Îi§õöV"GrAu)àby@8æ9`cFÔV`ŠßV Ö&ÈJuyÀ¨O4¤ ©ÔÃmb„ø™Ÿ$ª¤Kz˜™º©œªOè~x`Uš€‡%g¯#j¯ëù‚çÇwÓ&p/‡íw¦1y˜ôi†8¥«ú¦úY¢KZ›3ڜÏy§sWAvw 7D£Ç¬\fLç|/øt•¦oyð  ¢Gzz)¤Ž ®ûèŒàE®åÊ« ‹®ÿËLëÊ®Nø®yà¡é©€ôúcA´e#:¢úckD[¦L¦X«`£p°¹:¬“J©íæ°kŒ¬ ©S?«)0|î‡ûdBæù†´c¦Gc[°2Ú².‹U⠍ïh®îùžßù´³›º³¼ù©oµeõú‚€¯d«¯öºea¨Ûw›µ*µlJ±Üy‘•Z¢y[[[{Kµ@ëH ¥ê€eëJVЇ´¶t@ à‹hi6˜®,;•ß·–3·2;³ {®x ¹|”©šª³–¨€ O‚ ¬zðcF@Éۂ€HiF «Ú:°Á‰¦Q{) {§ƒ¹»¦™}×ÿ † šë¹R˜Tˆžx>à}Xº cdðh`P µr °‡øЇ¾ËD Zµk»Á³b‘» F³5‹·™kIÀË®ةě ـ=ä¥èى/Ö¥YŠm9p¨+¦VD_§=)¹ÛK¹eµWËÀÿ»ã˹Âʽ=¤šH %ç‰Àˆm XDxàoñ{‡²Öµ oÄxŸðÂ<À¼0¸Û’½é½ß œ&ÜD,¼IÃÜ™—‹¹ L›ƒ “«Å+l¹WëÅ_ ÀMR£»éŽu«À$êÅJÜÄFjÀãš» ÇS̆ÊDÀ¼};¼n<³ÉÅgÌÀiÿlIa<)¬Âeü›à[Å0¼Æ¥ÔÆd<~ˆÜÂ. ¹Küm<¢<ÊES Á+Â"';²#®ìÊ,³²<˵ó¶\7v³-gẍž»Â›ìNù»‰›9ÐÈ Á~[Ⱥ+Å}l©üR|.ü˚lƜ¬Èy;¾ÓqɘlÍ!Ìx9̳´Ä0 ¹ -“íÐ…—á6 #Ûà qwP m² Y3à°, À'ÒΫ#—Ñ¢± Û0¬!y öð¿#*Êáó€øÌOœÉáŒÍ٬͐ÈʼÌýÑ =ÎÑÌGӜ;Õ Îv)Î*m³jÿÜ$Þ¼¡oÌÇόÆÊù ëñ1à³Ñ}ѨbTD£<S½V  B1J0Ð}ÑΌ‘-mƒ26¨Q)¶±)½¦R<ú2sóñÔ‡Ç:¤Ç0m·qÌÓãȂ̘x‰9-{2=É+ÝÒðÒJ×;m×ãD§âÍß\Ø~m¹]ŒØ?åÓêÔB}.Dí)F­3H}/i­ÖkÍÖmÝQ=Õ Ã5WMÐZ}\Í"žÖÙd½Ùf]/Jý }ÎCJÀËl,;ÄÌÝëÌÓHÅx‹×%MÈé~RZ¥>0~=ÜÃu-Ù`œ#/=׏ÒÂÌÀŠmÓEÿ ÁÂ=ÜfYÜ~¬È”–ýC½)š}Ô-pÖý´ÔéÑÔ¼MÚRýÏUÚY=-ŒÐ]ýÚaýc OPÖm۟=߻ݽÍÑpÜÜ+ލwØÐüžx×OÚ{:½œ?;‡[FN”ÆÝ»,mݧ «|ÝÌãÙþžÝ]ŒÝØyȐ}Æåýžçé½ÞÞޜýÞ¶}Û¸­<̳à nߦ=VíÝ!fÓßÙâÚ_}½Dmà­ò­Û]’äþÛaá'Ӑíâ/®DžÜY\¼ŸÚ€Ðö‹xà…ûb¿˜x×¾1†c>Ph²ö‹`؊,Ø8•8mÈÙÿ­Ý!·1N3~èˆNÜh.Ù;~é-֙]рsàžýÙLMß Õ÷MTÚN^ÐQ.2SîÕ-ãÐbÍޛ½éCžà¡Ý¡þÖb×+>˜6~ã8nÜkÎæà½F€Ë¼@´1f)9¦ì ˆì• ìxЂ‡`֖´‚þž„~ †鼞蒜ÈܽØßíqðç éìÞîðàðïîàó.öŽï÷¥X#1T½áL•Þ=.Û?®é‚Óéˆã/ þ8·ž¥ß¦®ÎP2òL^-#®~.¹a ¦ åðíéoë¾,À-×áýZ‡ÌÅä-îIÿtáÞ®îÊFðºÇn ðcЖ…ûìéW[õX0ãgÄ ½°õSíõúöSNö~ö´-äh-4¹½Ûihÿ9÷A­Þ ¿ð±Ž÷ýôð{äïñùøïüyBø‡Á Ñ𠌰›€ /p›° B¢ú ²A‰58B‚‚/_5:„E…Š)S~üˆÑ±ËG"D(ùWÒäI“@pùqÑÒåŠ dÎÀæÍtîÜ)Àçϟ„%*ÔÀQ¤I•"Õ ©„ ¨–h$jPÕjƒYµ(ÐÕkWš ¹‰A)R йv#Þ¦v­Ð»xRH”véߣ &,xÐĈ¿œÊ6¬Lœ7yNZ¹èeÀ™‘’ñ‚ųgJE¾våՋåŽR(‘!#ˆPO+T˜1ãÆÿ ô^Ø°‘eH‡#EzÒ0D ä/jôøQ¤ˆ6m҄[ú $È1€|nPÇpâa?Ž¼…—Î1fÜȱùõç"I¢¤ÿϊ”Ôª‰°vÄMl¨f«Qn£çH^è’#|‚.Ø TP©•ñj!œ´AÀ³å4r/†ë@š¯¾“TbÉ¥–`zL&…bD ÉxòÉ,»L(Rê#kꩨ¦ºÊª­¶ͱ™f,Â9-µØ`-©ÄˆJÒª«J¸ËŠFŒ°"-4û«0ÂKlƒÅc’¦´"Ë©F*À<Ðä RPˆ(RÀÇ¿4ãÿì3ÐD­´Óòãï5é Í6ÜtãÍ·G‚ûŽ¸ñÊ;O=ߋÏꔲ®Äì¶ëÎ †{B<òÌ;/=RE‘Äã;ŒîËoµI)%RÀM Éf bèÑ  z[dˆ XcILÐ°]êyÄõJíˆW„6E\``±Å xqÔRk;ñ`-=ül<ŠB*Ñ¥†„Ê©¨:²ª$³ZrN¨_|ÀQ§‹÷8Њë²8Ç=à«ÐB÷òQMÍp3±8¿zl,;ó­±2+¬¨= D­X¨¾üBÀ59Ëиú RPÓ¯µ×ÜxÊRÚnËÿí…*lHcZOc-θä@dÏÔçP­®Ä.Zå®»ƒdýºVóÐ#7#]ÏEûº_½Ïib[+ÃX¨¨&&H‚„zàEkNàc!¼!ÁhðVF<¾H/ÄöÎE· u×-I%w߅IޗɊ 3Ç@ƒBñ(´.+ú$%¹6>$çYW ú4ô/ƒ‹L䁅±jXé%_¬)f<óì×'­0¬ž‰BY³•cÌå°Æà„>!¿òÀ#ò0ÿ'<|HDö~öÙ ¼Úkè¢åþ,éG™¦i’bMÔ¦6Lå†YÛÚoã5ñ„ úkÚ+$RÙ²ÑD1)؃ ‰##8Ô`©ÎÄǚÁ¡>KÅúR?RŽT(¨L*™×ÊÆòX—b*^ñ T0( èÃ;ßiŠ' €Ñ©¬ù¹˜ãl%R¦«^åÌ·‰ÐVõ4a{võ9Љ.XRà[ßú›¥Fc[°ÄP za›¸‡@Ò>@¢m”£Ä¶¸š\µÕÿ­É'ŠöÉ¢'B¬^öªI¨TÐ+±%¡káO«$(“IÔduŠEå˜QÖñaÎû(HC*Tò¤‰ü éo € Ѐ†Fè¤Kî³Rü|’÷â'i!… T¡µQZñ ӚÆMX3@€(nXHèò°°"ŽV7±™ ]a½Ì'àZÖtŠm±!4G8M{º‰Í©l}¶ Þðâ5p&ØÅ, ­]ÐÀ€B6±†ßx‰Ä%.A¨5n‘5á= LŸË¾¤Ÿ^YäLnâÙ´·-¢=р™6ô¡9ŠèþV[”Š£°E’l›G[èÙ¶¸ÿŌšv+§¯¤FfɃLêqH)p¨ØÇ>ñÑ¡y¨L›ÙUµ‚*åH‰Ú£* R§A0à,U›ÁòBÄ`àz9ì^`󄡇9ê‹6ü귙ü}¦×ÊÖrÝsÀI”«}èêJþxSj0¬M…µMM«Sdt à‹DšnÖF؃©8¥0Úì)R`*Ù$-yè" Úë<„qŒeTè—Â$Ñ6¹µBÆhò”×0;"9ÉÑ )õ˜¼£¿Í5ßä´ÿ%¢£ML¢ ¼4 ´†Ç‘nG,t}Œßßt½ý…ÛˆKXâÉ"ñÄ(¹OÀ‰ÅMWJ@µ¹˜5fœÔ1d•êH³Ú}°(À?Hkx™—•@‹—‹Že…Ü”ŠIç£Æ¨(oyŒ§> @—¨ÎÚ¸öxCvöF£ý¢<ÊL_Õ¾6“ñ*Dæ`•ð¢pÑ0Xôé7&Eq§dHWvñÀ™â"€ù5B곓zÄÌx~û›•¦‰x• ÚãrxÅ=kªZu ±r/ØÂfO]¡ÀÐE±/­hï”z<·ùÇéƞÉn$ E }ím_{ |cu}å]ÿd‚•cÊ埆yD½_·­¾æD¼9ÎU0ûہ“ð†6ðÑ. ;qÅõè´š‚™U{zÊÎúS.:d"3ÌÈG~LØ÷(=²—}gSœ6[°»ÿýâד›Ñóÿ~+‚†á1€5“ë&ñª€W@ÉˍrÂʀÖ2¿×â::Z?°;Êà?ù» úcÆà.üƒB;y?ø£ÂÿéI<L4Àï²+;c0H`…-`¿BÌËÍÓ ˆ¯95H[ ´8Ó[¦!ÔÓ´R¾Sk=r)±‰ûj¨´’Û½J0p‚¼Ki9µÞà”T=G{´zúŒ;…Wû9~â(“6ïS27ü +,¿8Ú:ôë:.¬E5\Ãý£Â1Š³{ûCCök?ý+Æ\¬ 8ÀôƒÆ[ ¨!8¬ƒ3 8‚ĉ p¸5ˆS{´æS0=éÀsÁ/<+þ Iü/¤&Uˈ‘;‰’“ÁÞ yˆVx†KÁARÜA®a›O¡Gÿª‡/&”›L¤Cp‚ H‰ÿ&Ĭ ¸¿fì¾ÚbC>ŠÆ]¬ÁóC¿~`‚:`”TI–lI—|I˜ŒI™œIšdÉxPɛd} CK;%yBgüH6ŒÆŸ€Ãgˊ9´ÆD¹d¹LY MiD¶Aˆ\ÅulNj[&ãsÄD«Á ¬ÄT{½}4‰~ä½L›¶t„Á/Q$>ÞØA©D>Ž3ŽÊi{À‰\"ì:˜`ÆYFbÉ6¬¶‘̺’Ä(XHOàȄ8€L.L8 B8ͤ…3 ZHÐäÑMY(ÍÒTÔ,Õ Ö „1xÍ1hÙl…&¨M0¸ÍÛ<08†LàÍLȄbNÿáÎx žTÆ3üÉ4 J¡Ê\$"BÐ8Êà…?€Ä´lT¹P>P£ËÁÿŠÈ`ÇÊpGBÓÊx\4ðx‚F¡½\E±Lµ²œ«ÓÀ4þPK¼*^@: V@V°„؅[‚„Ø†\„,°ŽA 0Çmq/á±{´•¾\—Ÿ̍Ì.ôÂ/4LAÌ+,Åd'Ç¤L˼LÌÔÌÍôÌÏÍÐM0MY@ÍÔ\ÍքÍ؜ÍÚ´MÜÌÍc8ÒßüÍáÎX ‘BFàèŽeTΎÑ%ѐ?èŒÎ鐵ƒ¶ÑpE%lUyU;Á‘¸,ÍÒ~©…j¨W{E†"˜#­øÒ0]ÊãN–óÎâ“Êl4 D7=Ϭ܎R¬K…œGƒ U6ÅÓ<õ ÿR]!)èÓaé=µ”o8b`Àِ݂ÜØHEÙ4ˆÔ…„kـ5ðå;°ƒn©òAp¨´=UT]’C@‹Ù ðȏ­ÉÀÌ€gxª§Ú4H@¿`VʬÌbÍL¥ÑµQÍQgíÑBhMi}MjR"-Ò#ÍVà\Òn­ ¨Y¹](Ws '@ڋ’F ¨2vʼnµ€Ãx݉FðFX\Fèƒ"¸ ¤ü0¥Ã¨3m,S§”¹¤ËQÛ8÷´ÓS«ó ôŒübœiÁÔ«ÓzœDÈ¢ØϸXËØû$ ÖPK@ÙWHÿAY“¥”­”݆4Hˆ!à%€…p_²ÿ‚O *ž5U Fà¹ÐÉ;¢ õ¡’¾ëôy …XÚ}†©`€©VµZÍZ­ÑdõZfÍ°[²V!µÖk][ßÔV&uÒÊHÆŠê̼õ ³€u¥—ß Ø®By׳À`×€?’+É-…¬.E’/S¥ÔNoXÔASl&×}] ªk¨2ˆ½Ô9ÔÛ8â0؜ÕèŒHÚ¥ûPJܵ| %Șƒ|…g°„l H¸9ƒr2^H­å%ˆI˜;è>¸°ƒÿ ˪5øÁé­Þë ÓX L.l„FÈXð-™£"¨„F(€µ8„‡õ €F*áµt»c€®=€ßò+ù•Úú}€ªÅ_b•LcÝÚþUÖ¯ `h[ÖÒ •M´½ÖÝ\Û$u[ Ž`ŽœàȀ2d‹zP£>î¢> €ÁM£+<°ž!ÑNŽ¶ ëÓIÉÜà›¼—›ËA†\=ãÀaæáe²æx¤S·qcê%âØE#&9)èWNä&"h⨉b€nxtÚ^hÔWØ F';àç,À€K¨Y{T°Mèoˆ„ bmF땫ÿchبU*‚UuŸ"x ßj$ X ðà˜‚ *Ñ ›@³Ð2ÌĔäù¥_ûV™¾ÚÝddíä`PŽÖ²5[S>åVeæÖVþ‰Wî€X–e¥É[9…X ±Hy!¨¨ ³æ(*Á XiÃLfäXæªhæ^`á–pa;ƒKjÎAkžSlb7FnžŒž,øfk^Ý(eÏqÖær6g ÕÄuVb´ HMƒ„h0aàçF­lPˆu–þ¤*Ȃ#¨0¸„ ÐÊlM°‡ ³¸ƒ¸žh¿”ã—€¥f (¶s;^‹¦†j™0.äÒ5ٖ¬féø}iÿ˜^QéaÅZM¶i5Cðp†øß:…†:èQPˆ:hMIcøé´ÅMNÒ¶%j=9ê¤VêÈÛڃ®"pŨ†Ғ‰Á f­¶‹³Øí¯fS±n²~f¸MÛF§E®K¾nÏÐ :ÈaºŽ½»Þ˜óងÄy rþksNg~\gvÆO"¸¥*ÈÛ@YgaëMqn]ðp›Óæп´hõ«#ií®€…Š©Ú³‚Îe™È²CزϺ$(AäÁ ùÆí·À—+Ó£÷ëÈï>HtIŸtJ§ô;¸tLÏtMßtN¿ô ‡n¶ëeª6ñÿ ¾¶aØ5•«ûÀNÂÞØL c!_@"qÕuØ7‘ð Oq÷lñREíQío˜ ÀƒzHõ&R(<‡Gƒ•âñÀi*©„*Š’)Y \ƒU$÷mún'Ÿéü-îcõL0Ð4ææ1Ѽ@‡Uƒn†nHìn„×t†n(`V[¡nÛ8ŸŒ9¯s;ß ô¦=HÿWìóªŽj^³@Âå\˵/¢Õú¾RF "ó‡",y“?ù<.•_y–oùãr‚ñ u·jð EÆ1õ³BõÑökêÕYÁ~æÛuçÿÄmñµ–˼nDýB;H<ˆ_a·¬_‘0öcOVn‹—"¤,ºv¯íChЀåÚ &.q—„ØȺ$Wrer8÷á®iã¾r`P@M3X…ÍU0ƒU,‡îë„åø'ø6j¶Î 9Rà óØ­@W…hžÃ‘>÷ (HÂ` ÎåŠÑ5/óøÕ›ù|M¿«ÿY tžçq}Ü׉ºv+ÿ9X&]—S·^´ ݈Îٞ¨¯ÝʍuÕ°«»úï¢ï´¸Dú›oČëIjzØþíO~›úboø»­}Û¿}܏Œq§d%7÷¹nšÎÚu¿†+W3¨ƒ$hw5ØQèˆxŠ(*A2Ez Óêa«&›€©hñÆc™6‹EȐƒ:$©éTŽ*Wª<àòåË2gҔ9à&Μ9ð €'…‘Jz-ʓL‹¤J)yà”%T˜RkRÕi§Ñ¬Z‹’ùáõ«œ@>Ð{Q¥Š´i²,2¤ä†¸tè én¤'zà éëIˆÀ‚—ùgø0âÃV¤ÿôêÃd;v”¢`™2Ê ¢T‰<(]aƌªå  çÚlZµlݾ…+W.Ý܅óþ×cÈ~\¸X j©S©Ö¼ê|ÀÖ­$å ]âD ¶owxžÆçbž œôp:ãþ -ZÆ@B°*‰™U<öóXeFV<tSÃB©r ¦B‹CM$‘Ee´Q&#|H#•ÔÁI‰ ·’r01GÓsWbDtD!¥TRL9õԇɅxÀˆ$–ˆU‹=võ•WaõÚY±­Õ֏t]vá•×^|ý5%a½ñ¶Xc0Ge–Q€Yf›yæÿh£Ñaj©­Ö‘hÉ6›[vp»YyØoÁEVÜqÞèRŽ3íè\LZhØiÀ]w߅'y硧Þzí¹Œ!ðÑbI ƒ û,%xj… à́c¸ÚàCFXQFmä†ÊÙá5Úxc 6 ªS¡= cŒMÍØkâì°7›SX{­d› Bl‚$}Hòˆl€€¹9‰—^O„ÆõL闝wþ³˜Yn9Ye—…)CgJ)š g––¦j7°ÆfYn¾‰d’r.)W½wæ)\dÆùêl°ÂFk•VÓU—( (À¨w8@ñ(yžHJÿ){ïÕg’¾ø¢‡ÞàÀ P‡j ¤ÈA¬òª«E4Ѭ`Ôº‘…¹0ˆ’%ñʬŸCûñN-‹¬ŒËrœ×‚-í´T{­µÙ2 › } Ї(Þ^2ÄtÀÇq5¹.»aôý®”ôÚ«Øbä«ïž\vé%˜a–Q8Lðh¤™vpši¶“pÂr˜~º2,nØÅóyvTi½¶s‡"ªèÉÜy·2Ë-¿¬^̄c§¾bL´Ô!4ÀÔÁC€«È"‹u ŠªJ/Í´ƒ²ÎZk1¥JÖ&’ÈŒ¾þbÇÓ6OcÃXö²`s?þø—³ÿ?ÿý—Ó (ÀÍ°€x@zXà | ?Œò6¸ÉmnU¸xaƒµL]}ëº6pK àš A¹0€oØÁ§j—»ÞU1+YaÌøqˆ‹òp‡Êø!ø!±ˆF<"“˜DGPau¾Ɔc5Kvj{ŸNDv»’) w ؝ÊzWžóPªRïÑT|’ Æ$ð€üáÁô¨W45¢ŽjÕ«œæ½MM|E!_ù¶FÅ®ý©}ÀâUä·e-k~ f6“9qM¨Yk¶Á4l£-sœ"aw! ‚QŠæюi@ÇEp‹›X>ÀšL–åÿ8‚lҐ†"` ¸*4wè oø¼ > Àìj× { P³šÖ¼&6³©Ímr³›Õtâõ”1h¤ocÎzVû9ۑÌd]lâù(HÑ<0³Ô{â“Æ5º‘?q”#ëh<æ±{úF*DŽñ="ç3›úΉΎ©ó&ŠL–ÙÀ ?„iLjØä¦,DLpw‘R`’â/`A*˜‚Wbƒ.ÐT6mN·ÁJL[±TÃèÁ pk-YèÛz‰ÁÀ-µo’(&"Ñ·'=)šà¼*V³ªU{µcS,gÏiH÷},G((@ƒ».žlwòÿc='•ž˜åSŸüì§?ã8GÞq{}Ôz ?EIʚ —Q±Ž‘mS`¶v”’£é Dš’¾Å¤yéKJ[°Ò–¾4¦3­éMqš†æ¤§°˚2iË p‹“@j/ûvªÜš ªP%áîbÕ­·¸ÆíMW…óUŚ“±c%ës̚Vµr‘­ pë[Ãã;2ÞóŒú¤Å]ßG½îՎwäžA)‚P…Žï°æC_Fa;ç’v¬dgDYÍxô²§Q“fm0›O†ò³€ JYêR˜þ@¦4í‚MS»Z«¸v Ù*›ˆ€{IèÚ²ÐËW k“èÃÿú—¾ùvpÀ%Áp+ãc5¹Y.s›kÅçB÷&fE+uÝÉV쮌wàÙ®=‡O÷|—Ÿm|ã?Ëk^¿6-½QÃa{bX÷&¢‹¥ïs‡uß"pG¿å¯e=wI…½F-žôì@‹`•b¡¥ÖjðiQa°'¾0†]“ Šâ@Å ú&â5<"\'†„$T¼÷MsÉ ]bLãMsš76öŽsV0ó˜9ҝîZ‡ ‚x²zž-swçڞÝ&¼No`†BèÁS¦2¬¤^>Ž< À–#Ö¡üÆW}ëÛq©©“‹†¿ÛqÊ~7„Æs§ÁdYÜÿÜÙ¹Ü%ÎFe_Ê`?8Â"à3…_iáXªiM­¹Ç· ¡A8 àÀ6&ñ­MØaå"I¹6 ‰w˜‹NÐt§#¾éO‡ÚË:&u´ `V2¥5Õ]ôN0X]d¸þNɺ®Êk°O5>9¯²Ðµœ¾ž÷¯€öEŠm•d7tÙÌnö—%šñ b΋d”d³Í™ ¤³„ÍZj3»2´¢U°ºñœgÛÞa-—˜íà$”¥v^÷Ö¹^…iP… awéØǂ0 í{zÒæ…?&@šº[!$""dÚB2dCÊ椳L$(H¢E*@%‚€ dd&v`ÉéZ{°ÇB¤Ã¦œd§ôÿêñ€J"€”õ•K¦×°ÉâMÐbMÚäMâ$c Uð$ð½ÓrTeq›h˜FUY •¿1Z/ÍE/¹)„r^¥)¤›ºaWz¥8Ša9’%é cù¡ª….žw²Å"¼% IÁ#>Þa€EÝÄXá^^]º"» ä@äA&¤a#l].Îfcüçc–ŒEF¦%V&&¶Gn¢\i¦¥ ˜J,:,Äh–f:œfÍUÙ+T±Q…kžÂ¢àg~î`ÐñçØ&S°UnÊe#$ÌBH¹RÚ@/-šq®n \åh$ƒ™–t‚á8Žåç„NY¦ãY¦ávÿIßy§xöF\ZNãšñŸ›D’ ^Ê*e!|Æ'×¹›`.f&0&¦b–¨‰B"™@¦EJ@Zæej—‚v¢ÐÕ5$CóÔÇ50I®IîG*šŠ” T n(4A‡Ö暌ˆŽ(‰²©‰ºO"AŠªh0>R$Íe1cf½€†õ®ÆE/•‹|ÁˆÃ.и'i=' À4(Ç Ô™®bÁҁÁ˜£*ŒY&©vꝱr˓^ yÖã0rþÕ%pÒՒT–NÝ]˜‚)œÛ?j¥ ¢˜d/¦FªF^.²D¥º©À©EJeV&r Þ©’ÿÙËáy±$jº¢°Å""xhᝄ;‘k¹ŠÚ~VêK hX×Él³Nii(!:!$@a €,B/ÍI/E‚7ôÁôè¬ò¥sʛܪTäê®òj,=+Y–å°¢¡’.)²:Q”Ú£G!!èƒ K6à’ \@ÐnÂXk$$ȁÁê©Âp+Wra˜ŠÀ˜rÕ/„ë™z‘ˆª©Cž+cš•Àü'»*€»Â«j$çѓz¤ÕÕÊå«Ë¿fèK [£Ò„* ,ˆjj¤zí¹Î×l^j¦ZÄÒ_Ïã.̂ò…Ë. … qºx¬D‚&0\#ØA”K—êjØaÿ Ë„ËîêvίkÙ k:ÕkÜì:ÆF²&ÆÎ6k·ß °B4¼#lÁ& ÚlÂ&(؍l€]è–#% «2B#B_jÕFØÕZL֊+4øm×nà.&Lˆí®«€èd¢mFjdÍkÛv—wÙÕµÜ~D+¾^j¦WÞÎÄÞB Á:¬Ázíš&l2¬Ã*ÀáJ)1Ú®>¢'ʼn–n©¶&˜õÍ*ø…î¾,´C,qÎé¢.é¨.’žeë֝vÞ]ì"F”îfñ¡ ŒB¨¾$¼@xÃx3]@] *De)-¯RhD¯ôRmT¯•”©cl­önÿ/÷vo.BÃ(ÁؖíٚïÊ«ú–ÜÛÂmxéëô`(AièƒÜ¯L¨xºÅþòoÿ.1£MˆnÃ:,ÄÖ£:«·]’•ÊFÖE¹ù…ÕA°ß[ªcðXt›™l°‘¦.v~0Ûlݕ°b,kĶh/a6l14 Qª'­ H8‚ &T[¬¶€.ÔÃ;¤ìN-Õ ¸&¤q °Á¬~®ñ‡81“íø¨»Æ‚ùÆëÈ]ñçeñ½:^Éïü"*•Å£¬£ºc-öís­«).KžÃñ#E,%ù,´²É>ÆI^’—"ËJEðòŒ®®ò Šÿꦮ¯n#Ÿ%$=N21Ö11DC3B#d,/`)ñ2¹ `ênáÁxîµl¥+Ó,æ{UöÒr-ûofsèr—Œ ¨Ù‚0SqgWçÅûÂ-¾Êmüî«@!jý:M±)—ñWs-Û²¹Š4T¸qd²/À@yzªšÙqzR+ `âø!Œ¤óJÍÀ4 ‡;×ó³õôlüt5[ó5«±H †JwQRCí>뚉óHáeëS5²´Vkõ ǒÀ¤•!Ël‘&r—Y—õê¢õbôËZó&•"À¬†‡Á0$ÁlÔ0 Ž2&,¯ö¨þ¨ÖÉac­cˆÓ,¯6n¦ñb3¶³9¶øj@dŸtJW¶eW&BIÖÀÚvdyö1ƒ6)B t±7³N#OÞ"ìEÒ7kãç}í¹Âvl‡Àl“¯mÀuwÔ7DC‚¨Ã(”¼Bjðß àq 9†*Eqõq2Œ‰WwN1Òs"ës ÿ+êP·œxŽI —F4lÂì.*D=ünð¯ÆnxC¹%Œ2Fðz³7W¾·õÆ·WÝB†ÓwP µk#‡~Cv;À/W¶ù"Ä%^Có@B ƒà@ úB ”‡"0Ä€Ÿš"œÁð$0\Cçd6˜"¨",„3¼`!Ô@ŠxºÍÛi{煃hm»yPw8Â:ˆÇöˆ“¯$u¿Ôã7\¬<ŒÂ,¬ph·šÜñqÖz®‹9‡xW@VµU_µXü¸g$7¢¹¯Òs=‹õ‘“èì’㶶ý³i,nãbÀ.¸†Ñ&Ғ„7`€GÂ%\¬öÿqÎjEÉ y¶|³y›¯ö›Kª«›c+G¶«4€_v2„Ÿ§‚Ÿ“ž,„!ÔG pÁ®ÂBÃÅ×I‚"A€@7ÜGë)Â@Ԁ¦s::´Þ*B:\O ´ 3 ×ì´T v¤†¯:«·zÀOªJÄúÍ:ù&õäDÒ:øÂ9 L4°Â¯oÁ Œ‚òm‚(¼À+ œ؀Xý\Ä0`ÀD%¤È;|Ž†²ku³{Á <;gD;€Zµƒõµi¶o;o,@$ßúZߟíXÿ!4(ñaV5™—y â;r點¬¿µ†ÿ;œwøÀ|dS6€[6BðÿLã@I$C ‡~2xÂB\ƒ'8x}ÔÁð¹!8è8x8(Ԁ"œ<§ÄC̙æ§ÔÁ0Áª¸¢©×üwæ<‰kø†·vÏÇÐ÷…Ð(џ¸ @7”5Ð1h·†Ýƒ% =@B60B@‚ 8Úøsù;¬¼|A(,·Ù/;K BÚ¯½‹IÀH;Ü„ tèT0xá … 6œAä_Ĉ´yk$ñŸ)¥(t$BD†Œ2A”¸)QÂDAƒ oܐƒ‚½*6l¤É2dH‡6è )ғ0H„0Úi /K±4UñtJT©Â0VÅäW/[ýt]qËÿAX± Ȗ5K–AZµkÙª}ðn\¹såB;¢¯’a44Hð+Á4±$AbÝÐA‚ %'Càɲ'Í\,+† B1°k´@'V‡‡©Ȓ¥Z3…h#p6wî1#5ðý[•Í,YÒh:¥Alò³ËѶuž–ntésµŽDH‘äayÁر£#…V! ¥ [vm!ö*¢‰ºðÊTöít€´¦§5¼±>ìÀĎë¬3aš¸|d©½˜! ” i$óòrôND‚q%‡‚("–Q Œ4ځ#ñ>‰$Ó;ˆ%—`¢çÿ…™lnˆGvâI ‚ª¨£’Š°)§ž‚j ª¬² +­¸ò ¬í`Ž¹ç¼„nº0íÊK/¾þòK° #ì0Ȃyӱǒ‡d"«3O A .©aÏ:!$-ΨCC|1ƒZ˜H´3XcÍ5ØÐá3:l D·1Záíß| n¸áŒCNË°¸<ëËçÂ|®êÌ°äºsFˆ@` Ýpdõ¶x ÙD>QE ”M¬¼Il0„ I:¦a@.%œ°Â C¢QÒ8ô0½E$^‡P„¥ÏA_d’ù&W]CÒ½Jœ¡¥{¤Éÿ&œt"ò§#­3*„¤b²I,žœâŽ|5Þ™C¶°òʯRUuU³ZýÖºŽ ¯½úú+0Ô\3Ē9L8!£S Ù³Oñ¹gt@[PU:3MÆš–T5J_› ´TjHeSNsk¥ŽÞDm 8áŠ;nä±Jnîä¶RŽNÖëh­•»^pÏ£u ¹À1¥wáň`A&1m\”¢_1¬ñC•*Èñ¥˜®é&!‡ô (¡VrIŠ+Ƃÿš)©Äd°L›äµÙnÛU1WÎËeÎtBfšk† ç7ƒÙ™Îöñ¥:=Ñßc„U ñPDC‹kÃ4uHBÕTS)¨A ŠMϜ¯å†7c#[8hªãÐ-mÞûøÜò¶·ÄÍ:s£/솫áP‡´Y϶¹4š­“ø`^§+àêNš•¶t51ý^ˆA{ÚvBl’ ¬%:ªðñ.|jT?BÃðp[` YYÓZW“U¨HL|Yué:³½.°«"lђ‡ø+ ŠbW€ÅZOeRÇóÂ@?‘JðJPp£~/<„QÎa0/а8ˆƒ¨ÁöÔ÷’B÷¬|0ç~øx®ç„Lðâ1* —/FtètÁØÎaÿCˆ¡Ì 6AÚô.^àr . D'dáZö)4á`ŸìŠ(è¯þìÐízàAq§öOÍFñi r »r@0´@!’!Ò!"´`"+’"/2R#7’#;Ò#µ '=±»üñùpÏ¢M‘[R±»VQ zA&¹‚¯8­w$ uÀAŒ"ì¡fÇDf@pðÕt±uîS‡)‡Ð²(€5âGîỗdñ]¢ˆNÊõRê¶aÕXªa<‡% ðQíôñÍ$O ûp Ò ¹+BÁ î/íR/­ úÒ/ÿ0ÿS0“0 ³0­À/$K²-’ÿ:p%A‹@= ˜A37“3;ó>4CS4qAJÓ4O5S5-!–Cªd­&¿ã(q.)ñ1„)w³  ²þ¤R cÌÓ ,°ôH¶XïM-Ã6L,Dzy@tÐÒ¹îÏÝøQÛÒ-ßRÞâ2º3üâ2ûQQrÀ0.-æm 1Ùò1!32×l2MÑ%= ŠÀ>ï?óS?÷“?ûÓ?ï“ H6eMäl²6m³Ö€07sÓ7ÕN#H*ÏÅW^'!V裸S8P-,›ÓŠ:4¤s̨ó­ó2±S’ÜSmֆ;ÿ½s.ÃS<5<ËÓ<)m$ÃECÏ$Q4E«+>?g>K´=!3%Éâ5)6wp*gS‘ò74*¥B,ç`Q °²]°õJ͏–“9{¢ŸþÉ9DÙ-+²goGsTG÷ïì ’E»SM×FãMÒfT-Òs=ÃÓDOTGEHžÓG-³NíôNQ´‹TbŽôº"I t™´IÔRªAkêA§4U8†oà+ÌõrÃR-+LÅ´L§¤JÐt-ëôOµM·ãMUç”Ne•MñTÞ̓OO!uVk5î•P³cWy5H>+BRkÒ@ÿA+õR?"SI#L08;õw€§8CuT[/»Ta6”Ãú©ŸZ•Jδíb•Xg•VÛôVÃ(WuuY]´YEqîæ*XåòPՍ•{õ9•Õ;öO V9JFä/µÌ µ@«ÕZ¯µ÷.u[AK ¬d*;m8¯ôu+GX¥¸´_NÕR•Ãܵ*^5{ðp_™µX öV3$_õµEo´_ýµÿÚ&`Yt` v;ÖHva¶a‘6m"VþU&«¶í¤5R©Uk·–6»–6;öÅî &Aæb‡­J1D'Y†ŒJ¢L¤RÎ%ä@n_°\éfÉjÝ-ހoûÖoÿÿpWp—p7Ž ²â´p—q×q—qUáõ&AþÓr/s3×>]¡CQ tCt¥¦Ž”Dó3qAuW—u[×u_×uMó *Gp!u_W5Kóz×wxƒWx‡—x?À¨€ed0Àšwžz£Wz§—z«Wzg{³W{·W{× Fb$¾¡¸—{1`Ì}ÏW}ӗ}×÷|1~ãW~ç—~ë×~ï÷~;Á^o„àþ€X€x€ý׀ïAX˜؁˜ìÁCE¡*؂/ƒ3Xƒ7˜ƒ;؃3˜$vbc@€À„O…ÿSX…W˜…[èð Á…g˜†k؆[†•÷j¯Äb§uk’6'u5[ø‚@7Á×ĖÅvMèX,v$Ê'r!à֊Mjn閰*Œ‹y„c°+qQŒuQ8hpdoö‚$æZöK9l±ØŽÅôŸ<”ŽÉ:ËÒóìQ÷X„û؏ÿ¸tc†™ ِ‘9fÏt&w¸‡-ö‡xI‡˜ˆoӈs³)•±SŒ×6«³¤8^¨ød¯8n³˜n»•¿ŒKUŒ/Œi°Ñxö`ŽÙ؍oLá؟渎éøŽ¡óóx‡ù:٘96Y™—™™›™™•Myø‘ÿËVI»Vˆ)uc³uA‘Ñ)™螘ÅÐHFD”GùŠå֔땍‡»2Œ[ù\;–Ï8_nm—×U—w™—{¹C™2ƒÙ,‰™˜Ù ٙZ¡š¡¡y‡±¶‡#Ùk’’+9[I øvs½™“{ Š#jœCŠInÑY‹Õ9•¿ØYžý«ŒcO–í¹–ñ9ŸU•]åxLý™PY š  ú 9™š¨‹Ú¨søƶ‘¯vš}Xk'š¢+ْŸ4£W“7ä›=:œe'¤ËyõH_B‹×™‹Uy¥[:ž_:–ë9ÃkzŸWULuÚC…ù§óš(‚Zbÿ‡ú¨ÿ°+”z&w! ±û°;v!û±;²'û±+Û²ûâ ³7[³À³?´C[´G[´%á$µS[µW›µ[Ûµ1A0°a¶k›¶e·s[·w›·u|[€;¸‡›¸‹Û¸Û’[¹—›¹›Û¹›› , º§[º«›º¯› ²[»·›»»Û»¿¼Ã[¼»{ É(ü:°Ó[½Ÿ9©«V&· z@¾ç›¾ëÛ¾ï[¾oA¿¡¿ûôÀo¿œÀÜ¿Á\ÁœÁ<Â#\Â'œÂ+ÜÂ/Ã3œÂ5€Ã;ÜÃ?ÄC\ÄGœÄKÜÄÿC<R\ÅWœÅ[ÜÅ_œ öbÐ{½kÜÆy°Ý»lá x–g‹;ctUÀçm4ÈÈà’\ɗ|É-ÊɟÊ@ʧœÊ©<®˳<ˀ˻Ü˽\Â\ÌÇœÌ ÀÌÏÍÑÜ֜ÍÛ¼ÍÎã\Îå|êÜÎïüÎ!@Ï÷œÏû<þÐ=Ð'€Ð ÝÐ ]Ñ}Ñ9ÁÑÝÑ?Á®hüÆ+ÝÒ™°w¼Ç}\Wüg'I„ˆð»|H!1”ÿÝ ?÷ àð?ñ`ñ¿ñ!àñ“=ò%òŸ=Úí ó7_ýºó7íAÿၶKä>.œàôßÂô|#¢Q½м!k€!žeB ­á ÄñA O† ÈS$d°˜<‰r@€•Rȳg¥Ì•ÿjÚ¼yó)ñ$4¨D‹%“€¥L›6M5ªT© ªZ½Š‚Ö­\¹Fø 6lØ d˚=Ë"­ÚµlÕrzû ‰Ü¹tbü»‹7¯Þ½|ûúý 8°àÁ„ ûòKL¯Å‹m½É9²äÉ9}šêÕ¬Y?x Û ØȐÕ;ˆ'â4&D¸¬ÑŠ²Û‚3à)ÒÑ£“Ž>*7y½"hàÙ®ÜGíÜI!°RsÏÃCFp"84#Ô#`/À+ðT"š àü}´ë‘>ô—ÂSMˆUÿ…Vu…áVbm8ÖY–ÕVˆ!’F‰&ÖeXŠ*®Èb‹.ꅘbŒõâe6F–YŽ—yÆ#g£ýjBšÖZ‘®Áö€l¯AC’l$$Îv§ü†“§ˆ@WÜ!Nø]G»qt@ $™9@h"Ph `čçø¥8o¶§“•4‚S#äqÂAõù§f’‚Ј6Ú>fž`¢°_-f’1áTZ˜a†žúaª"®ª‰&–ˆâ‹²ÎJk­ƒÅ8#Ýh£Ž:öØ#@9¤‘Æ"™älIâñrS"„TBKÒ2È€À)½5ËCR¦)æÿvâV2šå"P] ¤Kg»-`¦´$çÔ{“æm×HœZ¯™{ œFÀ9)þ,åÏ d @†?LÊ 9à“C¨TšU©žºaªª²*¢«¯ÆjkÊ*¯ÌbŒ26¶+¯“ùš#°< û#±Bkä ñš’Ô#.¸5€ÌwÚ< Üv €‡6x8q2ËÂÐq ùP @D÷QHEd¤&ºe§kÒ»j×钙̛‚™E§p“¡ù¡!¨Üâƍ@Qx 7Q-µÔ”ÞÛ¥pƒT¢ñÆ_èqW ‡,2Z$øD暣Ìrçžž—Ë3Ö(óÌ4kfóg8“¦3ÿj<·öÀ•Aφœ§œ¢M– ÈKîE@ã„íO/ó]8ñÝ)(·Gق+]GožkҚ겻v»nÞÁVØ[“rv p–>x¿‡™EYqÈ!ynf KY>àcD-V‘9˜‰ÆAåq‹œV&'–Êyèrm!ƒæ6gÐIp‚)sÙËHW:nG©óÑê‚ÔºÔ¼n5(B¶Š€ŒF<@j¯ùÙn€€q DPT*À•ðÐfi8x@†ŠÐ›æ9o:ëºRLx <mØëNö¶×ìÇŽ’WM4€F!¤ …¦è¨D¨(Mؤþ„À‰SV "ÿrЈJx bL¯b@ !, ´[õÀÌqŽ‚„,dŠ,È f°2´L=øA„P„#d@оS"<`!HªÇ!õ¤˜P† 9²5áäÐ[‡ðsÄt p) ‰vª&\ káx”ó6ÀºNôµÿü„˜vòA~úæ·C…@‰0ägfV*›º¦„êxǪäQ{Œ@ÍòG@r†l§;ûbA)2ƒtä#%IÐL’H•´$²þùši ôi )¨A¦„R'% 5ÉLúPœHÔ&B©¨E‚Ñ¢8e£L©£ã8ΖӜçQ:Éÿ‰”ªÔ|§K_z—xÂl‘lä=ñ™OIþ(²:­ƒ Õ  UhC Ѥ¾m¢µ¨S‡’QŒr”£J8Å9Α~¥¤&e JUšR–Ât¬ï”©®h ™zzà¦9Õé$yêÓ•JC­kQzT†*¢LmêS+U©Nu£UµãUC ­rµ«$û*XÅJÖÈ2žŠ™géÔzSœFrŸ €k\‘4WºÖ¡wN^S²W¾öõ&l`2XÂVõª @¬VIºØ \α+m©dë9ʞ­˜ek>9ëÙÏ4´¥-QK»ÐÓ:4µ3Y-k[”×%¶O)ìaCzÛÿÜ2vD` «o‹Þ &F ìe¯eeVÜ{æ¹ýT.h™KPç6ºÑ•®J¨KëÖ»ÙÕ®F¹»”Â6œ¶U¬xɲ*ޚ7½Vo{Ûû^^©u­ò=îNëkßå2W¿å/Gü{XÀ.°ÜÑÙ~7«á}ðxY áH@¶Â<~eŐámظ›ýp%C,âВx¿&Fñt,à·ª/†±¼;cÔÆJKŽwÜã0«èÇAîU|;8_#9Äøͯ~M|b«x©Qž²‰bå+c™Áà­1—ÏòåóŠyЂ!sÌhzæÔ¥ù­ÉUn›—üÊ&ËYÅQ–2ïŒg+ÿ˜¶ˆM¬ŸÿL2`Ô¤3¡Oý2磬nµ«_ ëX·ú´®µ­oë\Cc׼ ì` {ػ΀±ìd+{ÙÌn¶³Ÿ mfk`ÚÔ®¶µ¯ílk{ÛÜ§ˆp‹{Üä.7¹EMêQ›Õì†Ñz/<‹È{Þô®·½ïï|ë{ßüî·¿ó½„|à/øŽð„+|á o¸ÃñˆK|⯸Ŋ%d|ã¼à¸Ç5Þq<!Šؐnu ºÝ,ÿq{s•+È|æ2÷ƒÍoŽsè|ç:߁ϾƒR]è(ºÑnt"(}éLWº žõ¨—aêÿe‚Õ¯%h]ënè:(¾Šˆ}ì%0ÙÏ~v:¨h»Ûß÷È}îtŸû îŽ÷¼ß]|ç; þxz~ð„ü ÿ‚*(~ñU°ãyȧaò”Ï‚å/oùE,bœï¼ç9ÿˆÐw`ô¤/½éI¿Ô«~õ¬o½ë7 ƒØË~ö´¯½ík¿n–·Ûå/‡ùbhNsœ ßÐ}>t¢#}ùEoºó£ý§SëWßúֻìbG»÷×Îv¸‹ßíu/¿ÜõŽþôÝï€ÿ{áß/xÄ'žñŠ¼ý%Où4`óšßüçÿzpzhz¯g€Èz·§€ ÿ{¹§{¨Æ{ìå{Œ|37|9W|=w|A—|Ì·|Î÷|ÑuTWuԗuև}Ù÷uÜ7vއvk7~1XæW~é§wë'íç~ðWxò7ôw÷—“·—×ÿ€¢G€KØè„ȀQ¨ø€„8hH|¨@—|¥à‚L'‚#8}&h}J‚`ǂeç‚i§v2(~4Xƒ6ˆw8¨ƒ(Àƒ=(ôWAhCX„FèHèyȄLø„è„R({TX…bv…/ã{Z\hs^èȁC7†GW†fx†Ò7u&x‚(èunȂqhvàG‡qg‡t‡‡y¸â~{؇„烀Øx‚yC¨…x„ˆ˜ˆŠ¸ˆèˆÉ¨Œ«W+7‰ƒV‰–s˜¨‰œØ‰Ç†¡(Š£èt¥(iH}k؆¬È}®h°‹ä7‹vW‹{×w¸˜‹†‡x¼Ø‹¾øx„XˆY0ŒÄzÆxŒ¸Œé„ÍøŒ-'R€ © ɐ é ‘)‘I‘I‘w€‘©‘ɑé‘ ’!)’#I’%i’'‰’))’ç Ùnp1)“3I“5i“7‰“9©“;ɓ=é“? ”A)”CI”Ei”G‰”;Y ÿ;PK(@ ccPK/¯-AOEBPS/img/coordinator.gif-ÒãGIF89alÁÕ ???¿¿¿ÀÀÀ@@@ððð000 ÐÐÐïïï///¯¯¯ßßߐààà```°°°   ŸŸŸÏÏÏpppPPP___OOOooo€€€ÿÿÿÿÿÿ!ù ,lÁÿ@pH,È¤rÉl#•ŽtJ­Z¯Ø¬vËíz¿àp¶qšÏè´zÍn»—ƒ"#®Ûïø¼þ›Q&o‚ƒ„…†C‡Ž ‘—˜™™•šŸ ¡B‰–¢§¨©Dœª®¯¥°´µ†’BQ¼ ReF¿HRm¶ÏBÐÔÕN e¹ Ä ÄHÄÆEœÄ m­Ö° æðõÖB Äý&p#W Lpֆž=Tº=œh SÞ<¨ÀÏ0ùàÇ(£„܄Eó®H,-œp ƒþˆ™ØMÿÊh"TFÑQ E“ºÂ0mÈÍ· ‰@^ͧØ8D É!%Ì5ff¹˜µâ â V âSpQé!¦vó†:`î B8°.ê€m­ˆçA%¡ à7`Ê#gM֘Á ž›‰‚¸9a@ç’zYNÍ:Òä"bø· ÜÈtË Ñ]›‡ ûpc+¤³Àu x'"gë@ŸK/4õ\GF霵ÛUY™âp:‡¨¼ AßÊv:—ÄÍCSžŒE£,]Ùñt5ÞߏÂ;"(5–1Êì£HP1ZÝ$Q[ ðS#á#ŀ=p+åSÿVpmSS‚ü±!C%¦hƅE´ƒœ[]Ý4”7`@—ŒU€0ˆ!íôÓ¡† „T>¨¢,>)eQNi%U^ye–ZNÉe—O~ fŠbŽÉ_™C Ál¶é¦ˆvšfN‡æ$Hðæž|ö‰ÅI‹4BgÏ‰ šÉˆÚÈ Š¦ö¥<ÿEŠ Žº©¥v}i@¥œ^"K!›†Z—@DÈ©Zzmtãj³.Q@e—€Ú£š*—t` ¬ú ±#‚ ¢áH1QQÑJ‹S81­8F!¥úúP–9Ú±hTwÿÄäÈƳ+öê^hlš_ÔºF¸â֓%-1j„4¹D¤«Hت ð£„ÊV@,»Xr_trP4¼€ËeLÁ§’pY¼`ìÉœÜMtDPl1Ì2§¼²?·[.…Ø(2 ø¿ýZ“%‹\*àLàp€%–DЏº'‚P¼CäëO?V[âŸO–x½ÈÞðB¢)0Âb~aëØ 62ç$^—«u]¸Ý“×þ5ÚXÊÛÒIS³tO ƒ°žLò‚.©;â6Þä(Ò ¯9Ä:ªë ÚÏV·‘"ù¼=€çB¬£®×,Q吏ÿÕR$ÍԄ8¿'nË¿«ZijE£7­ÞiÝÍ<è%‡îæѨ™!è!Iôì½¥çRtªÎ:´Î q!ÍBPŸµRBÝ !‡0÷m´¦† Ÿ¹æÍ\/-1ß4þ¡5ãe­+^ëš2ô·±±)gK/º—9Ðï@ç֍ á"Gy»ZSה °ݐ€ô¥†àéÀ֏V&1xႭ8”4Œd€†%0 ‰CÁ!ÀEˆ8r_úzx-Òé#-”ÐS8vv/$Z¢}À aöŒX>%Z-ȄEd⠚4å1æâÕ õ‚*ã­Ñ„ ߘ O5ÿ‹Žìp£ æˆGQLJwì#0Eªü ²†BT²©F Søcä¸ Ù •AÎO˜Ì$›µ+pQR’µ”õÚMš²MqzAy‰UÖ듬4‚+céˆYƋ–P‚%.!¢KCØ£äS*ÖË]†â—M@&(ðD‡>)"P‡+¦1?¡Ì%TœøÃ%„è®3\sšlø&ð¤i‹£Ò@êf.ÁJrîѝ´@(FÕBx²S•öŒdRRU3\™…Lˆã+ï Ã|FS)Á‚e@ÄZ!§7MøVÄIÐ[RÓ ÀL£º·Ñ-Á„­h1º/’Š`DP—ÉxKQwÿ£Û >:!ج]ÀÌ/Š6Q“Š”˜  èœzÅ(…4 oʸ×²%>Q€KÝ,ÌO¡þT c»èþˆZÝá.AÀÌžå‘ruàŠ¹øªîª„´^UńU R…¦pCû´×ÔpT¬|y_•xŠ†ú½5¯ÑjQôfWeM¤$«†4ä:ぴJ uú Š†jb®…HèSý¡ª0J0ݎâØC›æ^Q’èVÃYQÐ+ %?Ó µ7Ô ·­í'ÆøYŸŠBžM€@i°åzžá(î#ðQ\»˜“[Éhn]êu7ébj^²‰.Gp3 òXÿ¤w! ÜÌôÓ3;ii¬W¬ë{SL.Hà’]¦d¡Îû^‚ž€Dn_!TRØÀV} &ŠN"Á>Eæà§RžòÃ]ð°3ýPÞ Ÿ ¶ˆWŒó‰ &öÒ~'ãX.Ø7®±flë¸P<öWl%ó’ÈŒ4ò)”ŒäN YiOn2™¢¬8*K9èɲ–·Ìå.{fø²˜ÇLæ2›ùÌÿ=³šÇÞ+›Áˆ³œçLç:ÛùÎqv€8 ðÀŸñLèBúЈNtž­èFãÙV6°>@éJ[úҘδ¦)݀x` Þ€ÿЀM›úÔ¨NµªUÍ $àÀ@¬ú֛@¤ï;i\ûºÒhŽ~Mìb›Ò ðôâ,ê¼úØ·Öµ›ÝÐkh«:¸ €µ·ÍmM3 9 èvª¥=íw‰ûÔÀÎÍîmc;Únw®w½ÞjËûÒïŽ÷½÷ëà¦Ôü¾4¹Ë­{<ÝXwÀžj C ·ôÀ S:ÎÏx¦ýí€[|⳦-àèDû¹ä‰¶5±/€rD?à-?´©Aò&¼ÒЀvÎóžûüç@ºÐ‡NtP@ß¾ÀŠÎô S€MzÏo.qz{—ê°–µÆ-ÿ¤ãºë[‡6Ö)Móš/ë±»±ÁNl¶«Øc‡µÕ¥‹v­¿=é^¿µÛïŽë¸—ÝìI¨;ßñ^ì½^Õ~Ÿ»pøU^ïyo¼©x‘g:í’OõãùÌgšò•·¹¦1ïySo^Õ§/½¥Aú³Þî˜Þ¹Ç7€ ûÖµ¿=áÛï ÈþÖØÀ³üᣚõ­üë5}‡k:(uó7jèKÿÓ¼/¼¶NŒßÔ¢¾¦/ {S7€”ÿª‘Ÿü#0ÓøôFŸpJ_àûôWøý³Ÿýt˚P~¦–â‡ip–j؆lˆx3§xµõ~—¶ @ÿnÐu£Æ}àˆ~Ç¢öi  þ÷ °àZ÷iy©‡j`W‚߆~µ'hâWƒÀg€ €mЃ鰃ÀЁö¶Ā”F¶âðrÈ~íw<ˇiþÆÍgk¶ À àpÐþ7}àg°ftÀcèeX‚ ð àpÃ6j`‡±×yš·}pà};èJç@†ñ§m øÃÖ|K·ƒ/ç†øF˜p €ß¦ ‚°öi›hˆ`…W8VYxiÁ¶ñgˆÁf¸nrØqmø o­x]8kØw€%xiÿ/ˆn~ˆ±èoØv°”v€ €`¸Œñ†mv‹;Øk (j¯€떀¡Ø€£H¥hi¢–gpȊÞh‹²Fç{ s؎g‹ °‹~{”ö‹¦·×ØÍÇhŽ×؄zv‡ÑØkñ÷tÖŽÙèۘŽíŽ¢8Žˆl{ք·èo`nñfh§Œ¨m!9’²ætø¡¾È‡08lÈ0l¢VkÌ8iÀ Š„x juøx‰“lš˜Œµh‘â8ŽÃPŽ”öm*瑲h†˜z¶Öx”p8kئ:è•ÿ·X‚ j*h½hiþ¸i1hÍqké|,7?yˆ£¦¯F“Žà’!yžÆ„°¦gP•½v‘£˜‘ª7“Ú·jϖ‹jç˜W™‘Yiq©iùðg/·€[‡™í§™›y4 Œ«v~`ø—q¦™|¨¹™Ÿ¹‡©©i³Ùzµ™·)™¹i€SI•Ìa•÷Ö³·v«ù G€Ü¶›¡×›—FkqƏªörÛö›p¹œ–|à—¾¦~֝•'æ؆9÷k rЦœÉ‰ŠðiŠÂ·mä xæYiiiÐ'’dÇs¯fúšœF 7H Éɜü‡€yiB©pÿ} ”â'¸H È&”¡·vŸf—Ÿg˜ àg¤“·“‚“† s®v¢.¹ ž9Ÿ¸©j©ˆ~”¦ÉX;8‡l¶& ˆ–ßyˆ=ʊÇ7œÄ¹ÆI{ïqØùhkÄ}éFènjÎƑT‹}8™«€{F€øx\˜l†ˆ} ؎Ð|Ö¦ 8oMZœ—gèh@o.Ji~¥v€8¢~¦ ªj'€J„àȗÁ6l ø¨J ëǤM*¢³FiÜ€:)âW¨€fsølžºs¤É ¿ö™Ï6ƒß¶;g”²(h]ڌõW«²ªpÿ©¢5§©ÉˆmÚÖi0W”¢Êq·w€ß£ÄÚg¼Êš‰zj š]ڂ kš†ó8¢&èiGj­zª›˜JœšŠ¡Xiý}°V~úlj‚ZjéJ£™æžý8ŸêbXiBI⧡üŠ‹”°ý©pýºª“7®T©©g¯ªœÂi§wê¤y ±Û)¦»Œ ‹‘Oššë°oç«!Ç°‡÷±6Úx"Kq$;x&›±ú¹±Ù±¶y²ë²á(±»²|ײ6›²§³wdz.ë³å´o'´K´Ó†vÅkNû´PµR;µT[µV›s4˙*xµ\Ûµ^˵JëfXg®_[¶ÿfûµxk p¶lÛ¶U ³™i³r«v³s{·瀜wxÛ·ÝV·q뷂+o€{šƒ{¸çV¸´‰¸Œ»mŠË›#s’;¹ìék,7¹˜‹rpk¸—§sR÷¹ uGWxKº¦{º@¶Wf´j‡´«ºRƺaçº »M&»[G»Ái»H†»§»¹É»D滼©)¼?F¼g¼›‰¼:¦¼Ǽ‘é¼5fž¾ªÇri œ­ºœf8«7„KŠ³wjž¸ñƒ¨f}m–r™µ÷Šjï6jJºi:Yl¢ºiÔcæ«mX‰jpštì[£»i<•èÀ}·œùkbû éFÿ„˜à’~©à„ŸV€L}øŒo)Àњi9imXŒü„¡J ۇmϨš£f‚(ؖš°ä›©2«ŸKG†é–ŒЁðø†e˜‰ŸX« {ɨt÷Áõê¾{jØƆÔ7jP¡ó8Äðx_ˆÄșŒaˆ¦/y¦÷+®5L®7¼ŒÝgkYJi<‡µ¨£šŽ÷lëX«P‡À7Ú½ðK PŸ-*–)ïè£3¸Šö‡ú8¾£§·‡ÕÀœ–k<íèÆÜèÆ,Èp¨Äw¼{¦–­*ÉéX‚s<ƒs§†Å ¼¹‹[±§v¿½H†˜„锛¨Œ§({{¦t¤†ÉÿÜ«Élp…*ËP™nP葸Œœ{ÖÅ.™”áƟ‡Ê«Ê“‡t½8†/žh)k€˜Ád§gǁæÁv¼Ë_·œœ,ªÙ¼˜bÉ¿ßÜ¡\§l¹‚§<Æ [Æ¥'½ª·À½ gÏ¥‡Ï¦Ï ÇϞçϒFϞ'ЙGÐÏp+°òO}# F+Gµp?š5°ÆGz‹Ð’ws´FvðT¦!•1ÒF Œ5&=1íÌ𳅝]cÌ`Ñ× Z'‹EIváºmÎynýkûwn'` žu/=aI°ù0ÓÒbÓÍp€11ÛÂR¡jP0Rpÿ•æin˜uxt&žéÈj°n³øÓÒÛDó›jhØpE¨š•±³€óÒjpqY@M ÕBÓñ êe“¡1 Aΰ×âZƒ#¡,7Á_=ûpë>0¡Ùd½£ÄðÀ?-–´ q¾V|¨÷“ûžœi/7Û:Š{¶§jBʗÏ*œ ž¶­‚í gµ î1ÙÁ$N³Ù™=7œý,;Âô ·’RP¦­M©=Á á‘7Á>ê0íŠÝÙ‘¸² ÌõR!ðÝûð7Ñ-6‚ö½fû ÿ±׺©Œz®k¸sí šJ°z•^idèÜ ŒÇr ¦•v~®vê¯új‚úº¶úwá&n|.™¸¿SˆP·sfköÒ ‚ÂÀÞÌÛ0àò­ôÝ ÷íù½ß«ã?Ò ^ Î(~Úí€íÐ _-Š=úÝÝZŽ>ìB SR1䏡ä8± ݸÑC¯Uçv~ç#!gՈ@¯Âʊ<hˌm9ç£-Z¤zv¤î£%Û±éÛ!̟ž¦ˆŒs¨Œ‰‹˜€ ,homé<°ŸÖqæ×{&g@Cx¾ê€!#¸¡ eÎåšýånÎÕ,±äÿeŽg>_½æî æo^t‘Õ SÀnëcî!aݛf¼®æÅÀæÇÞØòéÕLPmÁÛ×:€QJÊsªŒW:’Zzp*§h*á•öÍÐ*â›6˜Wz”†ømB gßØq0%(ªÓZ«Jhµ½ŒËÝÜgúÜhÀ 2Ý­!@Ô>íbŽë̞Úûæjí¿^ëÅQ ې¾ÁÒÀAæ¡ßO~ÏÞS®AÁ(Ù Ø_= Ö®GgPmGX |Z©$¬oJê“Zm>oiߦgÉ-ΐ—jÀ‰Âk¹©Ûêoùô—«4<ðû)wjð 1îÑñÿ‡Á VÎ*üä%¯ììòÌ òiÎòþòó#óÅp (NӀëYäê! ¹ 5¤mì7ÞÁN˜! iÐkþ¶ÓXÛ¨šŽ±Ês3Lª ùÆ›–à ¨0¬Ê˙öll|¢<·¶¹šHïŽù¨o¨ÿ{8‡õøki@8ð$à(vß îññ{Ï}/$€Ï$‚?„¯!êý剏ڋ<¡Pë¡ ãsód7Üh½iÁZ¨à:ÃÈÊ­g×ý)kdؾ¿}iÍhÖxôù^‹° Š%¨ùàþ=ûIïו  áXì@ŠI£g@x:Jé”ZUv˜ÿN¨•Ûõ~…žÏ˜<Êéà,(3”Ë`)S‰±ýIðÝ>àäÈð>âÔÈÕ!ýçÆðØÇ..?)ô0Aõ:'Å ¢Àf±š†ždgu¹" ˆ "v‰‹§^ÕÎ&—™›%ŸÓ¢¥«­Ÿ‘cy}…¹ÃÅÇɉ²Ë”¯Õ×#Õ©ÙãÕÏÓ¶Ëïñóõ¹éÍúäJƒWm`@ƒ®&ÙÛ·a¹éGçßA‹ÐÜ]+x‘㇉frEÔ×ëחPB(¹Ï! ‰@ C¾‰é:æÜèlgNƒé„$7¥[ûj @`ˆ4W!ÿE‚ V"ú¥å À‚ß͊>-öd¦m<  ¶ìpÀð*K "‚ *lQ2Uˆ¼*D¨ d@‡¦ ªX „ ++wø¥‚Ý®/¡(8 Ïl[Žl'¡6}ííVq¸@Lð¡q²•/ƒ@·Ã0ÎvùVè±À„áBöBö€ÀÀh)„ MÀ°Ë -ý‚0àáü‚þDÓmúyÝ,6á\Põ£úó±%t6xáØ¿ OÅh ô¤ó )ôˆ):¶ó.¹¾®›l°–èZl* - ,&€­€®žðŽ=à øê/ö„ÀÀÿ¢*§4üèËȚûhd¦µ|ž(Ï/±Zò…D¼#L»°T€°ZÌb* ÁE—¦˜ªƒ RÒä²À6Ø@R°0©$ŒÅDóž›8ÃÍ7áŒSÎ9é¬ÓÎ34°‘ îìÓÏ?ýÜŸ'èÀ›¤ÀìÊÈÏ̤RK.{15“0r#=D‡Ä`DGQL’Ūv« >hMUUUíP'‘Ua•NýxT3©Ou#òÑ#S„×&›x2¹\÷ÂRc·, ;—ÐTÀ; cÒÅò-Á&ØC «Àj*+ÇoÁ W›bÒ&£ýÚ¹£« Ùì ¬í>””X*„+"ß!ÿŒ{L·+…@àJÌŽØ ‚ΐ³Ð8[:ÐÌ[q!Žx>¸†2ԉކ87§ À8‚ƒûã„˲1àø²X¤•¹’Øå—9¢˜å™i®Y"˜qΙ™mîÙg†²IP~ò@€p@™ˆçŸ¡ŽZd,xàÅ—vËè^l¥4hµé±A’Úì³ùƒ9@±åyэ¼n&Î"[ç§ÑîÛo%^qÀ ’ÜÂÍ0ñ»àSÁ7[€éð€ƒÈ˜£ G€«_a`à@Æ×û[¾ÿnÝo1¸ö ë8ð`¬&¼öÛsÿàn«Gaûn£'ãsÿ’&}Œ8ÀÝ ¼MAH`ô |'oÕW'×õ北ø4èú /߃CÐw ûôÐÀ üœòϨßè1ظû»û0:;Ä®wƒ÷º>þ v/²ÿ(·¹Ep|ƒ=B¼ûyÀr»€á¤—½>Èm rà i宐f¯0àÒx>ÛÅ}ùàü;·m°ƒF“*ç n€X;! 'æ=.1"¯¸€Õ8€üEŽw oPÜ¡ñ8XBÚÎyŽ¨ÝAêˆGD¢iTÈD9²„ ›\Á- ~УíúxÂƕîn_ J¢v7ÔÎ øÝF—:7¾-qœã%eDIMŠË’˜ôdÚ6Ê*ñ“¥$PD™ÊƒtҔ­ôÞdKYΒ–µ´%œ@JW;PK£8¯}2-PK/¯-AOEBPS/img/persistence.gif4æËGIF89a¤Õ???@@@€€€ïïïÏÏÏßßß___///rqqrrr¯¯¯ŸŸŸ«ª©ooo«««999OOO988ÕÕÕ***¹¹¹øøøÇÇǎcccŽŽŽêêêUUU¹¸·œœ›GGGÕÔÓÇÆÅGFFœœœccbUUT€XXXûûûùùùçççÈÈÈØØظ¸¸ˆˆˆÊÊʬ¬¬îîî   ppp¿¿¿ääääãâÿÿÿ!ù,¤ÿ@pH,È¤rÉl:ŸÐ¨tJ­Z¯Ø¬vËmÚx¹°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~¯Fx=‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›Š8œ ¡¢£¤¥¦§¨©ª‚ž€«¯°±²³´µ¶Ÿ·º»¼½¾¿²­†88=ÀÊËÌÍδ‚<ÕÉɋÏÝÞßàÝс <Ü=<Œ áðñòó©ã `ƒ8æ<=9<ŠMàqÀ€jz@(°®  G±¢Å‹ÆQ›(B@}Üö Æ ÂuB˜’`6Œ0cÊT6Nä jÿö(ðŽ€ÿ‰÷pô8P €‚ÌÍ\Ê´i°\= !N~Lp€>l¦uJ¶¬YPã¾2ÀÁ ¬”Ë1 Ž 㑀­P/Ï L—«@ ¢Äw¯@Òµ Lø." øå(̹3çqžC‹= 4éÓ¨S³‚ªºµëΦ_˞Ý46íÛ¸+ÚÎÍ»··ØøN¼¸q1B?μ¹óçe’c±(ôëسÛ°™Ñ]íàË?ÃQl}à Ó½úyìOÿþ[üEîë¯ï>ý0+úÀЀQhà&¨à‚ 6hàLÕÌ}ø‹€:¨á†*ÿ¡„ÌPHÈ|Í ÷Vk£âŠ,¶èâ‹0ƨbeÒ2"šg!/&N€¢Œ@)ä‹4Ú"…XÅØ2À@`Ì3 ð¢/9Ê “SÒòd”]6S¥dÊd™u=ä' ñʼn‰72Âæav“Ãqöbf’é±YÍ;še?ŽÌYç3wæÉ˞J ‚—1ir™NÊàO<÷´…%’‰¨È£èlRÔ(zˆ–Ê“é/Œ¢ééP€(èeS%€À ôé^•Àê@€I$刭ô4PЦí¥w@¬‚ÌZ@­·æêJ¼âà+°æ Ë ¦‚ì<ÊFºK«þe”ÿ^Rø p@_dEPtú ð¾‘ÙCUä(=È0ëݺÕlæ.¼òÚ÷滯>ï‚8¹‡\QÁzrš«ô)G·ð€:óz D#De%È2+â®tóÜÜq³…ˆŒÉ˜Œ²Êì2I1Ç…èL‘Óç2}fºiøQ€MÀ H°¸n€¾9ɊÏ" 숶ԗD8 ;lÈÕ ušJõàuR&¹D6K‚Ps©"iS2 (nK÷¢l7ªP8 „CRøró° ֐sÀZ&ٔDŒL'5B%µ@¦zNˆ\՜óˆ>jKcTœ¨Æÿ_`@.9å?ç$]æ=$°9Äÿºòä[Ä,"úM:™žSêT#VNÞ¯ÆH]ÞR;ãæ|Ó|µ5M5Yá$H9ÉpЛa£4²¬ ÷lVwTð¢º4|±¥)$‰SøÎö©+ÙbO# LÂ׃ñ½e$þA_×Ö×¾l° x‰˜_ êW¼d\LÑSG_ð¿G0ƒ ´¢Ö=ª½êéòš¼†—"£;q™"¥š!f˜ŠúH…ž¬ `l껀¶€‰šjÀÕ¨‚³²-¾ˆá“à†Èá¿åC‡Qˆ ¢ÝˆÄì-±‰zƒâ§(ˆ4rÿO>ÞëÕ*ö5uøÃΫ[Rr¾Ëœã!žW&¥-ø]M›ñw2C3É}Ivd¡ÜôX>&ŏÁK@ 3ÈA”£‡\‡"¿rà‘ø$ŠPDJA’Šw쟲Xˆ( ’àzdòÂcPDdÇ0.Øã^I1À-‡)ˆÇä뒸ÔäíxI_˜Rƒ¶ˆiL “ Y¦G ˜gš#šÓ$ä1 rM¼a²Šµ@×.9I€L €@ªQâi…RÑ–[*γ©cî°§[^¢àݲŽø¤ó»XP͟=Hp ›\nP(IíâзDô–ÿÖ #C³qÑ0ftúÄb/¦5¢2$!^SØDâ2luI|5œ€Dô&Ñ@ Ê$·´ä<"”t`sñÓè9ê žæç—Ñ[»† ‘¢òJHmÙR§RÓ§JTªTEǔjꖬâ´qyä\‡9Ð äRdGU'}TcszkS1kúbJÔO`8"A5ÅXyêb£ÿñÅ^ Q¶ü5ý¶ªQX‚"²‹%`cqKÈÒ¥¢”U­eo‘S®ö""Kj’4#å €­uê-!¸Ô@˜ òJ¤˜-ãJù¸•í*ä ÜW·Ð-®oKႸÊÍGr³Ë\íe7¼ÑeÿG.“”W^Ы"ü°ë]yÖÕp…#¾ÓQ{wÁ€³Òê]o§:‹þ*6˜.uªÙØp°‚©û‹?¸ž°~]H`Y¸ãÂͨ‘|µJß_|8"f^9¬Œ'à¦Ë0ˆ¿4¬£+Æʐ±µÉ^/b+a&€Š'®ÄùÜjfdPF>Y™V¼ÏeÔ[ÖÀ‡ÁŽGJVW3®,¶h™Ë{ðòˆiKe7Cš{x°c``VÌπ³ä¼:#ªÍ¶Œaq¼”;W0ƒ&Lm—,Åt&†~!Y­h@3Ú,†­¡eéG_$Ó5Ë¢ÿñ|–éýi0Œ©Ý$˜Qú,eh˜1’jX“”€eqµ¤—âµ¢l9 ©s¡g½ë™ôšF\6¬-Mj²ä@BñIɲKìlhwGÚ¢fö«Q=ë˜ÔšÛ…ѵ§iÝmH{Ü1´·µ]즨ÛÜԞv¥[XåV—›ÜñÎv¸Ùn‹¼ߛ÷¼ñècœÂ—÷‚mï}ç;×÷N7¿amí®E>禸V®}qyˆû,Çþµ²õp²„<ÙæTxëíì[wÜã·õJNp–“eÕ#ù6ƒó„¬à˜fè¦×ýðÚÝ竺Y(ôaô›"L§ùÂ/äç äD×Ys*¾mÿE«“;ZGÅÇuÁ˜ýìhO»Ú×Îö´cm»Ü玁¡Ÿ‚ëµ(ûÜ÷Îw¼½ï€—{ÝÙLo7ç}ˆO¼âÏøÆ;~ñàÀã'OùÊSÀî¦À;-xPùÎ{ñ‘ÿ¼è)yÂ×Üð›½êO¬þõ‰/½‹îQØ¿¾õ¶½ì“\x†>÷À¾å1_ ÍςóÂO¾òcO|RŒ†Ë¾ðwOâ’ÿ^úØ×}óGñ|[ ?ûà=õçkýԇÿü¿,º}ƗÀ®}(‚ÊÏ_òŠJ}õÇÂø²ð}î£7õGy÷·xúÇËç°À~æ×x Àÿ0z*À*PyPv‰@P®ø|ø X{Ž7(z˜”· ЁX !8‚¹W‚«Ç÷x*¨z+ø‚ˆx)Àõ·‚<@Ó·}¢p‚° €‹×ƒ£÷ƒ“ƒ‰7„EˆxG˜„¦7uÍÖ~OHŠ§À&p€(P`œ×ƒ@úy@%@’ç)°è¡ €o§-:|dêtf {{*§ŸX§e|%§ §„ªzjúŠlꤣW‹¨˜›ß™(‡¯7^I©¡é¨^J Yz g:yžj©ý‰©œ¸©Õ€„ÖÉyŸ:zZ–‘Úž>«01éÿ¨üG" y%€Áº‚yꕈŠRøy³:˜Mj«Qˆ«ºšx¼Zv¿¬ÃÊÅJ‹¤Ùš»èªËz’Dú§i²_’*z‰‡ï÷†(àz0‡ôÇ h¸•H˜õ“^¹®¾š¡æŠzÒª®ÎÙ®ð®º(¯!@¯c˜ˆ÷Zùº¯‰×¯ °ëɅÛF¥À¯oXN‰Ÿ`ؖnˆ!Ќ’wê—$ªo­ |[‹|Y"›Š%¢ô˜²æyƒ,«8µú²ÁG®Ù’F«‚Ë©¤ˆ…®º²ë{骠Eû±IKUËPÛ´>k®ŽÓ¦«}ù±5›$ð±ÿXéh›µZx±Ü赪¶)¶!›’f[vhûƒ=k{ϚšA[˜¹§ûhuŒõƒKG؟j|{»¡.ë·¶¸ :¸t†;†ˆû}cx¯—™·°÷¸&Ú·|Ś§ H*ð¯@*¬ w™Öi£wª¨Žû³‘0ª¦Pª*Z£Ü*—«û«5:¬°¬*0»} ª\‹®‹¦]ú´TµÌ«|¢£¤;£Ñ›}Ók¤‘[º×+}ً¥Õ‹¤Ý뽶 ¸[ º;¾È˶É)°B«¾kË{ìù¾ðë´ì{ îëQw»¿üÛ¿þû¿ÿ«&°¿(€"ÀœÀü{åûçK ÿ¨À<Á¹:Àw[ÀLÁ|· œ¼JG Ârk• tk Â"l&¸½¯ Â!LÂր 'LR) à ÂÂ9¾q·F±fZ|åo.¬ŠU…ć5ĦMLR;æ. E'œVÄþÅMSÃTLt§µKN1•Ä%aUL{1ÆkdÌÅÛnqD¶ÒY‡ YãUð6¿0Çè$düSÇ: s½÷¼1Á&0ü0[„P* 'lܶ2AȆVˆ È@f_È]÷r>67Ž•&©p;·›L\1W¡,q˜œ±g¼B|<O‚R'FÄfLÿ5r%²œµ-·ÜÄ< Ìڃd;V# ¼Ã¹,żÆǬÉüM¸ÜłÜÃ&³ ÊÂÄûÑÌð€Ù¬ Û,Ì­ìÆëÁȜ`(ôðÀ‚Λ Î—l͙œ3õǔÇö|$Þì O2cœ€ÏñÜÆO [Ì}ˆìLЍdFšÐÝ,Ï®¬*ìƒ ýuÊްо ,/ ­ÐÃÜ A³Ì¶ü+á Ñ¼0ÒªPÌ& N¼ †Ü]îvÿ¼ËK¢Ïx 1MË3ý ÓËk‚Óý ÀW°Ê°°N߅ÑùUcÞPÔ߅ԯ ÔkÂÔ†¿^¼ ‰Ô`C G]È •s*¶Ïÿ»°Õ±ÜÕ³ðÕSbÖSVÎ- ‘`Ç^ 0q fd­ q= t= pŒ×ùÓÖmμÐXÖÒº4e՗eÅüU ‰íЫÀØÕàØŒ ÀPQƒÃ qX”½~­ œý ŸM¡ý!m  †k· 2Å͏½×µÐÚ- °Ý:„=ÔÏPQõb·`·–2v6Ú¶àÛAÒʁܗ‘Ú-ìÖϐi¶’£Ü‹À$%ÃÚ½ÝÜÍÝtR’1Æ cÌeÕ} ØÝÝê½ÞÝýÝámÏÇÞò=ßô]ß  0 ü­/ +Ðß.à, #0Ð,xgßÿþà=—ßûÝßÿà>à žà ¾qÐ#> -:â*¾â,Îâ.ð0ã2>ã4^ã1~D â Þ%. 'ÞâB.ä/nãF~ä79®;ßFùãåPT 0äV~åXžå*N`)n€O=ÎRîT®åhžæXÎå^®`.æONeÞ0j~çx®â På*¾ âÖ7çñ èÊcçy~èh>|žâ~žÄqî„Þ)]Žè”~åÀ°âðÉ Þ£‘Ÿ.“^é¤Î◞é*¾éußr® °è¥ëp-~Š2æÿKê†ðê±Þë:0ëµ~ë^+‘Àa¬ áÜ)¸F+ÑνºNüÐæhnÀç°¨>ä°ÖŽæ{Þ⍮4žNìapì"þh¨‚ÙWÕ5ÏíŠ0í(ÅážåØ®íÜnéà~çãÎâåÞé!î‡ààóì¾ìæA@”1 áî@ï±ä @PVþ(^ñå À°®å-³…ë˜#6?QŽÐîøÁð|áðñŒ ñ±LññC®ñLN‡:?äòY>ò%òÃNÖÃþ`=M’äœþçŽôÉ ô,ßôPõS^zCõÐUSWß@bµõ]ÓõÅö!ö™e¯gŸök/ämÿö:÷Xþí÷Þù<`÷aÂê†`=å£Å+RñPEEZ·ÎÕàìå5Å_VQ l ‹”È5@.â˜Pífú:¿.ß(ŽÐoˆâ ü|.Ûî€ü@ý “Ÿ ׯó@ëBÞÁ蜕 §à£úæÄúmÂN›ûætÚ´O@¶Ï¸Oÿ¿8ރ‡#xœ§Ä)YœM§§«øõ‰‡ÂZ¥è+‰L1NLüûñÏ_‡`Ãçÿ‡´ üeiiš¾*§>ö-prîÓÓµ"¿¹ÔO´à!øç?B0^¤×ẏ/õ¬m 4!A0(=bBÊÁx.ÃÕA£"Dó”"òî|›\ ODÙk…Th!i`(C%"‚†6œý¡Ãª)„§ñ¡±¸¾õôå/(ßº±D1Þ/PD„ÂC1‹mlߥºèå8Œc´#ÒÊ(>4bŒw÷²"úÜHÊ­'dõZÿI¿nuG;F`âÁ%w@B ’’T dJ¤ÇD%R‘bd¤#!IEBæk’•4%‹G¥NvÒ'â[@@ x’–ÆI%'W)ÃVî•Sœ‚í5Â'dÌK‚Ž‚ˆƒ‘ær 'רi¬/,^Nw? ÔÁÜÊeh’ˆˆ^¦1’6:ٌÉdš8›¡0ÖÌgOš£¡&JI9læo›vðæ7ÅÎCŒ“ ¥07q¶€B8pfG‘{ˆŸE“&¹ö „²fûò—}l¡©(?ÊXªñ—H(ÚЇžøÓ^ƒ§ŠÒ©ÃÓh0ÿ8êÑ|60¤#mƒIOºK¤4–R©b0©€v2H%,Ø>ñ/e€£ZÂU³š© TŒR Ìm0'¸a=xÀPŽ>”VF²b‰¡J.wâóÂDjˆî=ï¯ÃÕbGˆlÆK©Œ]i9Ý4U!LÀªÀjÈÄÊÕ`œ`– ëVOFôÅ6R+[iñÖ¸†l®U³«@òúÑáõõpu^;:çaÈ°„@l² \W¦ÔeïôE€Ø¢ð-LQÓµh¢D`€]²¢Èý'- Ò}P€9àQFP,€´Œå*DH{lÙþŽ¶ñÚ’Òÿ·+tèhÛÈH”‘&!ŒŒ%.SY Uö(—¹ÎÍtµ;ÝîZ»ÑÝ®ºÛ˜-7¼ã-¯]¾âõÃí |gь½:®¾J¹o~ÁcþZ) °Œ³ƒÓ•ÆýåSetÅÌMW (Àð Z`w02’…°Œ&|÷,ô…z3CiYOŸ°® æ[‚”ŒŘͱ:Q(30ÃìÆc^ú˜i³D‘›{d!$YÊLö˓÷e¶í¹Ê½ÀXOµœeŒtÙ­žó%fÈÙâ:gÎÀ‘*°y'nÞ_œÉs`:—ï WÜ £V–©ÀxE½O‘ªBåÿàËTö•¨HWe-öGª`¼ ÌØS؂œT¹¹pKµ/ëŒÊ¶ úÕºau„R­›# „Û>ô"l]\¯l×cžôý€½”Oû1Çæô–m˜£Èy©£ÆI9…O r˜À!‘ÀáÎüwÀ] *?¬ü9´EI1€>%j!¡O¹¥}îû°\ºô6|b‡wßW!_l@{ mÚ9@ ë÷Á–ð€Üà9[¶M †'#B}8Â&Ne‹×ã¾Óbþ8î<NC!ïF²@r“;;åäO UD$‘ÞÔMåôö PB;9ãӾ¿\'òàž‡[¤§·dG¸ëpNÀ;³´‚ò )5*-õp6 SóË°:Õs@utDõu.CtàTNµ8WuNÑJùO7ÿ2eNÎÅ´ óÎSqŠJ/²N•U ™õ~3£õ¦5–¶&­vkÝ6k»vlåvnÃÿ¶lá^c’e‰69ô¯oýöo7pwpûšXURՖj²Q·q÷qýÖp Ö^ðUb÷ör#H?Ӗ<so—s=wtƒ6bõ–tGt…6qQ—t=–&Y·u=WuM7Yewv5vE÷v/—vWÖvywo_×`;7xw7RW÷x÷?‡W\—·e}Wj-÷y™7w‰—z«7B)á*è¶{½·{ùã{Åw|É·|Í÷|Ïw"‰{Ñ·}¿6|Ý7~åw~é×{Õ×wrõwsÃù÷8€x€÷w`Á8ý7¸øûրa6×{-ø„*ø‚×p-?·x5ÿøƒ''ƒA#¬ƒGø„ÝH„Q¸–8XUx…aølc6[øzgø†‰ç…q؍jØywø‡%G‡Xˆzxj‡øˆïփ‘˜Šxz—ø‰ÙŠ;°‰OWŠXˆ­˜x¨8™úD‘š”G$ú6‹I×o½8Á8sÄXÿÈ8™Jx}¥Ák/lG13lՂ}¡x¯90ŽçXcêøk︣Ðøk÷Økûø™WÞ8’äØ`’@l rCrMcm˜Á`Æ®arÀù„p`’ȒÁëp@“3÷w:ù“G lŠ”KùX'g´& -”a”ñ/ˆ°˜>N9c Ħ"ó–ÿ)vù.|Y‚×'˜™OŽñBŒ¹”©ô$À– š)®:AA0´”±YI¶ù˜1X‰Ïœ•ä¬¸‡ àøCb\لì4´´ ø9žç™ꙁîù,ԙ öYž ÀŸ¡¸… Æ9‹pÔB‘Ô¸*¢y‰:¢'‹*šP.º’26ú†9˜žkRW~*)Hì6‹UúÁXzeZr`Úlx-Kì£i9i´–Žà¤w¸§¨wp¨‘x-ñj Ý2 Š›º-!ӉX¦+ `&¿Cž G~GÕ<ˆs¾Aj­çGa €^èEÀ ŽžÕ“>.#>‡éúé÷£ëæСR&°Kåi~xZý<—Ö¿ÿ¾§¨lìöìýãìÏ¢#:!ë£Ýæ÷“ ãžç™ Þ-ÄȊˈ@Tš¡°~í§í!¾ä79ðݎ§/º ñïbñ!»çò7²ë‡'ÙñåÛ{@Žß,Fk¸!Áô aê#7!ö ßMÙõíÅôQŸ§¢aõ …ô_¹F|ö¤ö͝×)>¢ôC]òHùk’ùõPôÛ¨¦òü”¤?*ßބ¬ù·^û‘†³¿&·ÿ‚Çß©ÃÊ¿?ò‰üøó‡Ï_ Ë߂㟄ߟŹMXŠçzÂ!QHÀŠÊ%³é|6s9(µj½b©¸O‰dŸ„¯<èá5»'mÃãÿòçw>—yç´½¯|û 6muÕõ!ðôàñ€ öJVZ6FÚ)2:ö@^ÊQ‚Ž¶zeÎMð@ äõLLy>ä0¨õ4(:$@žM֒*Ç!Ú©² ¹–ÁÊÒ>Þæîöþó ۉ.—kqúð0 ñ$8&¸+ªµóâ4àÄ㠃cÀ  ðCÎC-¨ä¬k÷ŽÀôØó4kß¾~ÿä $h¡Âd OzAwè¡ŠyCñA<&x* d2Þ ðx—Ã[r8P%S'Íì¸,ÃèÓ̚7sîìYP¡D"UŠ¬)ÙFÿ*‰<íÀǪmºíZs±Ðî(G÷íàۍ/îºü¨äCΗuŒ*â bÊH–€zXbà’ø'D‚M@1 5¸ßƒÈ-WV…^âà†DXy HÁHˆŽxɄL¡˜ƒŠ¶J‰/Ö‡ˆ9’Ø!¡°øÿ£7ú(d;9d‘I†$“X™…Iñ$NZŽJL‰qOb™%Q2€|ñEÓJ¹2&šf  _ q †ð¥b€X4€áaŠiE‚p¢ €šlâԛ½È =ØiDž×ñé'Fd¡†žõ_‡8ðD{9¨ñMm>1ÔQd€A*.Ñe†cÛ5AK Áçÿ|9¡ŸºÉ©¦Ò‚*¥«6X°6 RÛIsÆP¸Þ´+¾r¹Ý ž;f¨vø@ ¢,«4CE Չ+G°íò FÅÜË ìºëK{q¶ËH‚ n¸†–{ÿ®užiÀï^éí¼¤N1]ÅèËo­1±ÀÕP°E_©ðÂƎk¢Š¢KÄ'm0P,D¼B F*_àS0ÿh7ÅPä7DÍ7 Ý±® +·01ìÊKóÃ1ÓlsR9;ÖIÏFm*C¿UïÑIïä5ÎNCýôÔZ}5™JÔëI`ÌÜPØDSŝ`LêÞg@ÒSQSZFþøÃu‰3TÕ*_í(yçñIß=DnØà²exáĤ¸7ykä¥J>åÂ6›ræP¶ çòøf]›Òœ¯·@íSoQ U”¤ŒS“oÀ{É\:×.,æ·cÝÿáî8ôþ9ôí z¾¤–wó½´Ò9ßÒ§[½Î×cwÏÅ<ÄçÚ­æÛ¹Pok€Æââ w•¡xpáÙ*þ÷ŽÆõo*‘ GåöúaO9LÀßÖ|×þq XÀ«°åã3Ì1ցB0„£ °,˜° VÁ~DàÖô<‹¨Ýf-½J\q5ªBìà^½È€80L@‰€ãÄy|b-r£ ʬ‡Ã,ˆ‡¨øœ®XEDZH´M]¼¡1'Z'Šu™âËø´ÛX$‹í/÷EqU@E±ûÜ †ví¤] hšX!… $Nd@ ÿI/éL €@.ÎМ)²’€0'ç¼oýñ ‚d² æ‹Zl‘Ÿ”Ð## ‹IŠrPÖ&;I©FÖ$”·¬)Ýe“BÚ.•„ȝ† 3Ð tâGe:¤ ÎÌÂ4+ÑM,T³SØdY 9N!@'çtBÓÖI„tº--sI4±¹¥qê#ž.‹g‰jrDw֌múÜÉ?×ЁšE~h(b°2ø¿`P™Ä@C±÷Јf®ŸÂzZ@¶243BhÕ8êхôi#Õ§F‰°'H@`¥b¢bOâ6’6á¥R“i–h Œܔ¥-ûW ’‚ ð´E„À!#œÿf]=yZ.’:¢¥6UZVªBى¢6&@Wû*Y¸—ƒ[8¨(T±`€¯:G¬H(Yѵ²§-­ÂRw% á"kåÞ% À½!€/e¨ÐQÚÖJôU±l ì`ó:êF ‰ýkŸªúX: 5G@,_Š±·Duö‘ª]­P{¶<–²Ü;égI1Z͖Ö}¨= k{ë×Dùd²²µemsÚK{‡õ-k+«\ÚwDÉUnŒ˜ûHçÎ6ºvØ«v»ëÝ,q÷»âoÂKÞó¢w2æM/{Ûːõº7¾ò­D!”kßûâ7¿úÝ/ûëßÿ8À0 là#86Á ^0ƒì`C ž0…+lá c8ÃÞ0‡;ìáƒ8Ä"1‰Klâ£8Å*^1‹=|ƒ ;PKõ\‘·44PK/¯-AOEBPS/img/wsatarch.gifráGIF89a†¦Õ ¿¿¿???@@@ÀÀÀðððÐÐР  000PPPïïï ßßߟŸŸ```àààÏÏÏ°°°///ooo___ppp¯¯¯OOO€€€ÿÿÿÿÿÿ!ù ,†¦ÿ@pH,È¤rÉl:ŸÐ¨tJ­Z¯Ø¬vë< $\£d08~Ç`ÃàR³‹ Á[86Dr¥ºþ†ÿ€Ocs^kFj^vh EE^R vIƒa‰   ˜€  `D’  ¨’E|Bµ·NI ¬aÆÇDÁ€¨Á ¢ °À͵ÍEÅDËR¤„ÉË Û[  Ølº¤¾D mÝ ÓçC¹DFqGD¼6ã°ð™Ã,®|I0ÕǃºZò„ðµJŖIrïÛ¾(Š’DtDQK â9  ›‘"õZ×Ï©ÿlj%€9d°ˆlò N†¤ øô”„.Ú:µLÁ¶| Hñ+#a¾7 ´ÌG A¬^ VÁ4+Á§Y¬¨Ëú°ï^¤±u+”Àªz®ZÝ}¡Tê\¹²ÁbÝ`"íTS€W¤ò€b ÖÀmH-Pòd„šõ„5µ*NbÀ|ak6˜ßÐN¶è3܆À‚£œ aa½ œ:V½H"ئŠ2È›A^ À0½z·5t„½ ® ¬Úðc?B°Á³£Í;*¤ˆ#dàà ¸%@r~5h…5Y„K?ÞYWÌr<axÿ)ðÿ* ,›® *¼,”Æ!g  ðRÏhBäOÔÒ‡‘AZ„êH‡^t,×ÜAÐñCA…z£#ú_X9õž5”Áe,£Þ“D`Õ%˜oñÑ{Y±Â¥—u´/ͬATVŽ¥åv!Ù@ØD€ ƒe‡MµÔCÕ89¨(t /ÐñًP5ÚÒ,ƒúç)ÝPÙÏ?'á”EýLYeI5Õ9Äf |«÷€“"Žö²&C˘’¥0‘öI)IAò¸á+8í(›ì,"N_ê¢ìS#.ÄGZ0‘×ϳ̶iћŸÊ)R¹¨˜DªË{Ÿ„‘WÿOh·èS#.*ïÜS.N ´PŸ1usdœY¼ ÁKX~bÀÁź‹å>4¾š”«¯´#GÔ+UÅâ*` ½ ¾ëõ’À}Ø|Ï”A£Aƒpi˄m5„5…jàd¯ÞL*2{5@͸'A-ª²è `®Ð·V÷™RË×AÐÖ¾œŸ9 ¸ÒÁÐ` ¼ç¼h/Á5×j}Ÿ/ë}´Ød{-ğÔ,*¦,$aM°´Ëe€#²Vځ}ò"I<ÀìèÊ෬͋:3­ª# $å6×cÑaK>¯IAMKE,S'¤ ¾^«@ótŽ öÿYÌ‚’\-ù$ÈO0êœþJ3`cmè¹€ê °Q¼>ÑؽQÓ|â˜Ãœ”ööa[Úó¯4j3Ááb=èÞ jBÔ˳>e`3‹ðKÁÛMÁØò<¨yl¼ªžª]žпÖ%Gu;iƒÖÂ'mï7}±ƒ.•¶Æpï‚\G¼Ž q¡mµK[ò €ä<“—Ÿ2ÈB´m$°K‘”‡¶Fµ¤…€0@¾"pCúð‡@TÂÓ:ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*r!ÅÊ¢·ÈÅ.zñ‹` £ÇF+šñŒ"¼ÖÈÆ6ºñpŒ£çHÇ:ÚÿñŽpÔ°HÆ>úñ€ $€A⫊…4d ÿÁ8ò‘Œ¤$'IÉJZò’˜Ì¤&'©Ç't@x ¥(GIÊR¾±“±¨€)p`Iqª4e+ÐFnò–¸Ì¥.w)IT6¡–¼ ¦0‡LT Áä€+£xÌd.¶$¦4§IMHú’ À¬¦6·ÉKc"“—ʬb3ÁùÌiD“›èL§%¯¹„lªóðt¤7)Îoî2œFpg<÷ÉMv*AŸü è4çIÎzÒ3Ÿç¨B…éÏ$t¡Í%AïYN'Ž“¢´LhD7ªÉ†"á¡ i%'ªK|Nñ¢%-'HEÊRkRa¥ÿ-m)IsiÒWÚ3¥äÀӞúô§@ ªP‡JÔ¢õ¨Bµ@/_ªÑ˜Æt¦¸¬)3oJS•&” \¥V·ÊU`€ªðhN!¹S¤šõ¬hMkZ•I¨ÞRªPDiUÇúH4Õ©ïXŊÐHbµ«€ l(¿ºT#È5ªmâaßjU¿Þ¯éÔka¥P»B6 ’m«ÀÊXƒ´¯´ìe÷™Y—N¡²­6KûH·n®O\ìkÚÔª–š¬•'S{[xæ6¬›=èI9;[º:R´½ì^w[Ûäªó·®Õ$l-J\éÒ¶®¶u®0¡Ë\ìjÜ5lu39]Ŏ“°Eÿíw¹^Ê^5»ëÕe{OqÞK–—‰²µ®q?€ÜøNs¾PP¯q»\ñ W‰€a~É{ÝãÂwÀ›°'ß áÿ¸ Fob8wdؾ æïƒ+ŒI ;AÀ$Þî…é{à$֋¢ø°%ÓKá«x²Q@±wibWò¾?l]VìàcJҘ·;楉Yã$ËwÅC(ò$9 ÅYùÊXβ–·Ìå.+® È ê;ã÷×É·\26›Œæ4Cùndþq•½Lç:Û¹Ë`>PÆÜbh"¹ÍnÆq€Ù¼M€˜¢oéøöͱˆ³‘7ä0'8Ò}6矹É8ºÑ¹À£ÿ=áM_ò`ëk=€ x`¸,@ž€ h²Ç’ž2¥qøâE9גIfO ývüÝañÂg»Óù><d L ð²–zÌsV`f< ÷¢·V•”ÿúå ¾f„Sòí —'@¾xºWÞù ÈûÓÃjOHýî¶><õ/ê3Àûn¿)Æ' ¹œÔ˜Î¼M7oüIÖ}ð¶xü·qgc\Ó?|ݹí àÞÙw\¬V~(ç,g€pwÖ `yëF|ÕÖ~‘T~ÿùsoÚ€¸{JÇjO7}FxÚ&jÚ§ €zU‚Û÷Hw ‚w~še`ê7Uì7l—ävùÓx(˜wyvȖ†gO¯‡w×H¨ƒ¶÷t;˜ò„LXws.hZî%t çUPtنxÍ7pŽæ}҇lá÷HÍGy"XvÈD†Ð—Ú÷ØæwpwŽ6|è§sòæYZޅI gzws\}n÷çƒ ØvŽ„{+—oE8€ùvIˆ‚KèHÉ÷„­Õ]–IʆxY rwo·x T_ØH”×w'Xw¶ww?Ȇv§ˆ(¸†Ì&m”×p8‡ñZ<§6 >’ ÿd€ {°‹Y@‡¸¸_g¶vϗ€àŸÈx»—{‚GˆåWx‚ùFyP{¢¦Š‡÷ˆÖTxY7m˜vR¨r2'qgv,çròÇ_vq1×t `q÷i–%s!×rFgKçÈrq¨qÂWI˜w‡T0C"úp <à `R ÀƒÄXWó–I÷HJ7íøuhqˆüuçhL}¢VZvŽÄrïÈu"W[#瀵ø‚QHƒEUJ¨]‰SUDÆ9j!Y"8a²‹ßby\¹K9©ë…vÅy™”j‘d·ÈQ;9WU°· !!õ’t¯3ÿKÉ_M©KX©Sÿö]RùQT h”´•)“ºfQã!›ã0®@pÂpÔS²ÕjfŒ#F—`7ŽSYŽŒ IvéHB˜˜J¹ 0!Cpòƒ »fyp²U™ ¦˜‘‰sèwp6yš™sąpvuW@æ`Y a³÷‚!g©”¯›³9i¦ÉšrH“96—Ä٘¶x|ù‰uX{Ö4R±'³° ³@ y3>I\ÍéœÅˆ‡—˜œ­™šÅ·šä)™®Y—n$œUP° ¹l€3¹™½i˜ÄõFîI ÈIœq9œé)I“éHH‡xý¹~”t Üöœþ ™¬ ÿâ)b:Iªpf‡-¸sv¨S Ðzê ñŸê˜r ¡§Y ±‰jǖ 28I+êwàI‘Z¡i¢5j£Êiœ¿FIÀrðýÆ¡T$[?*pBê¢~†ž*¡ʤZ ¥(k¾G¤š7IS›JªiPšžN:¢(™Ê_Šw žW:eez¦4:¡Çؤ8ꦋI—cÊ`ʕOš‡:Úuqš§ã¹§; …,IXT[J]W)T[t6ú¥Œ¦Œ¹•÷3ʔȐ³€ r5©ß¹¨$š¢} ¦]Jžuj™ÆÐ%‘–ÂVW0›®úª°«²:«´Z«¶z«³Šjæÿ£šœ[Y¨@u¨Ã8À4Âh r¬?婑¤t¸ú¬Ð­Ò*­´X‰§uU­:­Úº­ÜŠ«ºÊ£pIœš?!Š¦€XÁ,Ç°©”Z®m꧀šI|¯ÎÚ­öz¯÷Z­ºƒ’´leU*¢€€ª![þêHˬñºIó*ª +¯ÁÅI_§C*°@°šê[±æú¨ ±×ú± ûs“zåwªšS°Äe²€²y9¡"ËI–8³4˯‘4ÚFxxi©EJ\: гj¹_6 ®'6§€]`G´>›¦ê´E+³Gk­5YµËII"œ1 µ:åª +®j5¶d[¶ÿHÕ³ ë±X‹´²5®•:µ^ûHn¶Ö$Xv{·n¤J7{µd¶~û·‹¶ÛKYqVª „ÛFtÛZ€êw{{œœ„·’k·z›µ’TúÚµ‚Ћ$[˜kªkMk¸‚:hœ4ºÛ£“Äv>•²bf™Ê-ó³;Äź=µ¸ò„º»JŽ½Ä»lëÍéºE@5mÐCH`7j“>O [ª¹j+º{긽û˜¿;½¤kµƒj²+ DðôÉlÑ ÁP 4a“Ó*ÊS¾¶;ƒm¼¥[j׫£Ô¼•ÔilD¼ ¢ « ÂÇñ¿€q,ÀÉA ü2ÀíKIø»FºVÿ𫽦;¿6Z¿ñ›~’„¡Á ¿ât ÍR'c*0Á"%¡¼N [ ü¶ÉiÁ,¿ï‹½©®“$„WXêö®L°ïÒ/vÂÃ0‰bBTAd̛ÂąÃ Ã-ÁûÊ·ŒK`hmdkøÛ àFqOû–K0<ÅÛÛVX‡Nx¸L° {BDñq°0Äû€ Í#8„£—óͳÀ½tÆXÅVŒÅl¤ÅkÄÅ^¼OaŒKc \!KÁ½ÔªÍ‰LÌyrۜJ‹KøçH™¨ÈÙKƪ+IðwËÃLÐ(ŸÐÕ¾r,¡Á#¨yü lðÊP0š¢LÊÿ€||œ?’ Õ궗|K™ü›|K‹œ¶K:ülh̦FñWw°öH]L…ài‘Ep &ƝÌÈ$+Iø÷}¹O‹¸xhuGÎpºUÜÌVÍt'͑ÇJ͆Íà¥Í_ŒÌݬÌ\Ê̜ôMèv€ˆ~e{8k¸÷jˆ€{puچL m¡l lWyÁ°Š `kV5·†r»ÏƒË“qÛYTëÂ)СHСeÐ ‡Ð ° ÝÐÙч7ÑÙuíjº}Ýѯ¦Š’”Ì5»»#ЧpÀl •¥‡LÇl8ÈÏüõ÷ð†ÛVˆ[]qW˜}gØlÿUMx¢LÉ!]ÃÜu”ú¶µ™Drul”ºËÿÌÖ¶¤ÔL]ТöÔ'ÕÎGÕWhÕ€Õ`·Õw‡h ÷ÕÏ,փ‡e=ÎT¨¯DÝÈþüÈvíHT°ÝÒ{MÉ0©È¤†È4zZŒn ài¡ˆ‘wxÍWˆÛçim¹×Sٖ»ÐWT¥‘>Rƒ~ғäj}^æ(që]Ü'9pOÜæðæ'ç@çvnk¸§Ñ|Næ.ß_žá؝žþÉl=×y™'[T%×ÏäýÝÎ\êÿ|êä™ê6L͊:eÖ m|gÄ^ìv¹ýë´R(͚¼ž´§KòMSÁ Ãnì؞íW†ìî;äúì×ííúìªrS˜KTîF ÁÒnÝç©ë/Œë½NÒ/ñ)æÕí¶þíòíŽêû®îCÀ㈃Bžïã¾ïánð¹¤Û‡•; Y䞕å\#Ͻѫð¸Äðk•½îï.î¡ lÕÓÿï¿Î/jñæJ&òòÒ£åñ¼ ï‚P~ xóT‡ÇròhW–WqøgKûˆR—Ϻñívï_ë,Ïc6ó(Xu<Õ—h@ÿHB¯t*'rFOqÂ$óÿ¾KóÝF…Pé%øzŽçh„§xËhÌ`o¬¸x³‡x6§x†–{ݬÏj ð%]\Š.LD·ŒhŸh°WlOÊoŽèvW÷o^oˆàJÎKbo½dO^ Çp'—ý×áºG€ˆ”kh¨mÀl ÐdžÀ¦œÜ÷'ÿÖHä÷ìüô%µùÐù(øùsúùÖi¥Ï}V]‚ªÏúÙöúaðñoµŒ€§‘iwCøÚ`zåèË°LJßôOÒ·ÏîÉýò€AXýþ榧ý%8®2:Ì6®Ö û4U‚Tè‡Û†ˆ¢žÀàá`<†ðsñ>Ïǒ&ÿE·Ûõ~ÁÞìÑ Á0Üs:iùœ^·ßñùóÚÝïÂé:¶Êü ?8¦œ><65Œ>˜´”˜œ ¤¨¬°´ ÇÂÌôæICû?<,Ÿ+¤¶*Š †Š ¤¦ x®&UÝFËèø¿M£¥§ñšÿâN¿¦®¿X]afk){q=ty‰<~=‚‡ŠA½¿É¸©ÏP í»¶0à€‚00à…ÃtðÀáÅ paðˆøü1Ù¥”kÞ éS¹2ÏÉk)Óðã’ À ’;˜0bC‹PtRäò£FŽ#ÒIJ¥L/ݔFõÿ²É©ÉFr)™Æ¥3˜,Á†UÃÆÞ×}۞^UKՃUµ`”åÓç”äÛ¨¤¸ÀÀî=¦sº"3+–ð´ÀªÓÕڗ&^w{w‰û´)Úº‘1_L’Y”Ù ‡6ìù%蘖gVMs³ÖÊ©VÇö֚R球Eç®s8TbԔdGF{«4ÅÀ…'÷Cܶ?ܺ¡£ámÈ7lå×áf­=÷7Tìߗ.LÚ«éè祓lþ¬uðؙswÿ^y|“ê³G}z¡êýè»Î¾iŽó.@áLï6ýöÓ­??þ›é:ø/Áh Ejtß\¤V €Ï_ù´’’ò"Y+çÉ4(õšzÝG5ëÇð3®  @@)èƀÆÁªlíÀùÊÐÉη%ðücuüׅ*1AA ê;G‘Uo„³-áQ<Ã1±é,¾/G\ü“}'@!)ìéa3@`‡¢º?ƒ>q%–䉂¢xQ"l¤Bɞ¦” ¹¦7ùѨR´-íèE1ÚÑd<ùÇðP"~i:æÄÒµá«aь:ՂF ŒC-ÌS&¶˜ÉrlrwDÐt™‹%)r<“¦@˜3áF+N’DœTž/aìû‰y$‰Hgâ’vÜg77TØìA+SK$Ê =4gW ä+´:ÙSN-¹Ó’t¶¢4‰S‹å<9!@¤,-‘ÿ¨âs¨#T…ç£ØiN…V²µà¥çØÏ6kÔMiÖô ìN"é%¥Ø WµjÕªÜ媼¹ä©šÑ 4š< ¹Q‘×¼j«båO€«¤Ñ8é%șRqœ³vÔSûtR'Ùä G8­Ó$ÀȖXì¬ÚB–UÓÁF&'C ¸Ñº6¯lHKü9J¹$4y€^)qÀ²BVТS€¶®I.Ȧk]hÑ7ÑúÇPkœm}Ï[eG=7²"Xx›DÃòä NáD\£çœþ* ² h„EhýVE%é2R½Ye°µ %«¢ÏÝ "“MìöÎ)€ŠâÄÈ]º‰d!ÿ)·F8…ýa2¶£™íë¨ÿ H,{@‚u)Âirü›Ón…)É¡Ö~N{?Õ²I¡]ä&1á©uïl"bŠÆÖ5ÉUÎqÞ)Ì=Qn[ëZÖtҒ _"{'žpã(43Ò¾ñ])ìÜË ª¢8šÍùŽOÎÃȏ‰ 7û¥{Ù¦ÑÖ½¹=R“±,’TlÅq*䛺Þ͸j(’M×~hRÛL8lFZÙHŒœì‰'nšµÁ{¶·€æÏ®5¸¡õ•c¼ö)gvցÎcc÷Þ0ºdâ2Ä9ô;ܯ÷<.|$ܱٙ.‡pà×9où`…ŽŸ_ð˜@ÄÁýú*=þæ÷Q§2vô×~dðz/@UÐq4!/ AæÓ;ÿ P÷v÷vÝw Ö¶'Ú×9à¥tÞÇ~caw§gùÇl-‚©·z‡w {ϖz»§°÷tµ—{hwe°‚éFn>n­Gk£pƒlÃ5#ã€À  s†NՇ ·"^˜…ÛžòÓ`mtÀ&‹’/›jZ;}“€tLè„P(…ÒSeÛ+}ûT»²ûŏ¨ù6<†&GO·s /ö¸¶ð9¶ÿjµ°¸ý#’;=>KµžÉ¸›ÔG¹pVÞ¶¹Ú𷥆¹ ZV8) @*û¤ Ûù_½AS,Ú pœOy…f©ºr«µn¹/|‹>ûd¡ºÙ º˜ —qŠ ¢h à…âGÑ]óN.°±³k¤ÿ¡û2Ä ü)æQ˜)ðœiº[6º j ¦xªT½Ø ½/FµÿÕ 'i!H IñcfñSº`©Aÿ²—ë  š¥¹œP•Kg¿ßŠ±ˆb¼jËhEÄË[ <šû4»é[>)¶L`á>€Q—5¼ÀBÃ0|Ã? –©7 ">|¹¾°’œ ¯üÓ))'Ú 1c¾·Bo"3ÁÜ šÚi¾› ÄÌÁ¥¼‚¦-¡r$l¹Šã³Éƒ> ËÙ.ÕäTò[Ÿ÷¹'Ñ.€ö™Mà;B!‚õ1{üGJ‘ÝA)&¿¶qÄÛà¹üÈ C©¿l"A¡ÄùB»p¦›Ê–AYÁ7Ú§œ°« Æp Æl¢ßA ”T"¡Æ•PG1ª]M!¾;áL •ÅúÙÄÿÄj:aÁÁ1/* n¼œY|—)ñžŒ\5ž›™]¬¬ì‘^uÄ}íúcÏÔ'j¾ðFáMZ¯È*Ë Êš@™£Lʼ2(ݔ×a4‚O ÂÀþ;3®¼WVð¢NÂSÊÁ@ӜÅ#!'|y[l¾-0k”Cì|•©ÉLlÀ†ãÂá$ú!4AÅúÎÁ6´"QɯjÉ@L¯JŠÁ™0† iÎçÜ ÂÒÈò Pâ»-ìSÓ:9(õŒŸ”àº=í%1’ýœ’ü©Yü» < úZÐ<ÍCœ’ДФk±ÀБ»ó‘)­Òl`Êy]Á¢)Ò3ÿ½µ! "M[ 'Lª”^˜±> ^ËÔ8ÚCýŸÏôÇõÌð¢¯K²Ãé°Ö à£~ /àaÞÿ€«’tr߂°Sà$^0ޒüƒøëhh,Ð\Î˲/a·Mø„QhÝBq¼GËÕóàÊDu)AœáHL]똏 ¶NÁâ6ëâ§ãÇ£šìô”z+ òÝ é(²8 +¾áªÐáªúá5¡š)Ñå’Ú$ž©ãɳxålè=ÉC£ÝDT^­Wt ò ¼}ãQ#L¾´9>þ±@ž¢<&±—Y­·m “Wþ±o´á$›»®×Àێai ë‰[y^°{þ¥êzÛ]¸  èkþL’‹Ýñ¨èÔP^ž°-`툮”.æ]9 ¶Âe \8Ïû ¬ÿ›´éĀ7< ě$Î jîÔ½^»-ãà·ÂÄ«Ë,¹ÚŽ+Ћ©ê혛­îêI˜ z4ÜÀ€Ö­¬ ™:Å2áëKÖЗñ ÍbbÓ»ÀWúÈÐǾ ü @*ÞÈñæډ'°°ÒΎ–jeÖ~íÈ`4¶þ稡 Ñ- ášAasñŸ¦™ÉHÂÞE<ÊËÀ§ñ}äÊ ,€¥ì˜‡ ð]Z평T†M–Ð14#¦8£L¿Ê'i©SçõÙÓ ¢,j ‘’Ë¡ñš±Å֐0žnGJ6н à¡ZîÐQò«¾ž òíx¢,ßòt‹ T¯ÿ²BÓãUáL±Mcr*¢ Ò0’䌟 ÿbC/ õnÚKjÀ” ñØ\ªN Z3RßpO úN–-€%°‰ï˜ç^ïòOÊ']MÖÖ2£y`QLá.ìÁ³ûîI „Ò›à脍ðZÒ拯:¡ÞÃ¡ ô{ Ø]Ùa°û¼íí˜%üŒŽ¹˜½üÇ_z-Ïjæ*V e_ÑM2\«,Åy–æ]¼Þ¡ ëײ sÁúëp»®1ìn’¯JQû&q猃¯ îÿþ²`êè©õŸ˜Oðÿøß À•-אX4‘‹!¡ÕRZÀàjV‡ÿPA+2¼.šŠ!8AiµQÀZ»XŒ÷œ^·ß] 7þŽh%øíX>KZL>ö%ïX^.13579;=?ACEG=…&Zä ZX"¬Z°\^ün]¶ f ¶ÚX"O‹Ú掛䞑X¸VYЦ_A½A ²µ§+IÏÑÓÕ×K§X ² šmq]üˆ®r#à) €V.ڒ½YP 9‡wPòpHµ*GqNƒ ¾9¢°¡ÇfæØ¥T¹R¥)“/S£ L› ˆ1i‘ˆ?&ÚDr`C·@lh(tJ–O¡FÝÿä’iU> ç»gUÛU)ò,²àg>« |)òC’\ñ8•:—.;ªpñªÁJÇkÅ<˜padžP`+L±F°( À,ÓÈ Sèã#‘0XZÀƒb*ãé-@ðÔ¡K'W>õxs_2G—d;×Æj.gÞÜùótèÒÓÈ]>~ôiðUWŸWO‡ºš±¥A«Ö…¶où[¿FÀ … *¥šf_›‡Ýg½€Ôs’^Š‰€±Z"‚.€š’’AK êIàD„ää7 9…&PXÁ›+ï ¸‹/¦Úß«Ã2§­«,êC &ˆH (ªhCt*¡O¡ièc¸ÙÎanbfš/Õj±©áZê^Øõ\h f¨!ôÍ]AÎ~hî7ÿFÝDâaa’Ž‡é|ȬçN_´À €Z>áЊ8ñ.NTDM?EӁ„&çŸS Á6/‚ 8´Eà$—Dÿ½F¿gxt'iùF”ªd%me²Þjç2·à?Ôb ö\çü¦§¦˜h6%‚L`—è€X'@‚¼Àk½DM_ „f@/k * ÄÉ ^Õ@.!Œ€§w%ë%äzmÞ5¯/ÈÀZ@×KŒ`®"ˆiŠÍSAt Dð†zQYµ@‚&XDӜF7¢Ú¡žth‰DUÀ‚8¬(Æ2ñ‘[çtU;½D,ဠH@Á ,€Y¶ºõ5¥¬Âj‰ „¹oÅX «P „Àømp‡k¯VwºÕe«]k*Sƒjà–°À :žj§ËgøÁÿÎ2hÉÆج ¨ÉcRdˆ 4`$"¹Xbtâ„gm˓{Ñ‹±@RVÚÓà•ˆ—ñgµMÒ¯hi„Ø’ÔÄ!Ž§p돭¦¦Ÿqjlw1Q Èu¡km+&jjo¾€²Ž­€B­« ™¾ ÇÕñqü[ ˆ§FF²YIàψ` ß}ÁºœÝÍr6 âD@v—…´€`‚dÙÂìj!»j¡ ç]Uˆ‚†8`ÎmA hâð b è• œ`!F„®T+Zeœ ܊Bˆ»¡S‚Hs À4]µÀ,1€nÿUs¾PfnM»µÖÞ¶à¸Íå׏ÿúÞå~yÖDžÀÀš^£¸Z†«¯›Û­¾ŠÌÐ g+´d¡¸ˆ°¸g…’,:é;"pÇ-%8hÁ¸q—f5£›ÑS±¥Qéo؋Ě~ƒºÍ>XÄ)–ác1M|•Òìù#SdJ!y šÁ•Ç$l&xû¬`Áü‚%[¼$ðn`Eþ×KÈ×±]~p™ÜëvT»Ì׎D}5îÉ  l“˜‡½¤§Ûܚ޹“ §/Z„øíŸjð­Ô֋†Ù‚,E˜-4A‡i @ÈI€MÿžKð .rÏ:NDž0¡ävr8Ž®"7¡ÅÅ)Xۋ\å¾@±q üŽlW…4äÞ u3A؜Â÷}/¼Ê‘«P—Ÿ·ñ.—@rÚÖõ¶¼}Õ,}yÞóðDBÞ.€@ú^¯(dcéú0wínè Ü£ö­÷ ½E8„O‘v„¾'u(¯Ç"ìbSÙq–J¶TߒÈU.ֆš³P+b'`ÜjΡبq͊ÐÓÓ<®/A zÖ&8´ÝÇæù{­ldüƅë0 ýÆ,õˆÀ—¨Ïì–bý€*‚éL ꘮óLÖL™éÐ\€&vERˆ `”ÿ`øÚ©ÃneëDŒh˜j Îß $˜T&BrÉ~Œ*àãB¡¾ŒÅ”¶˜ @²áø^çÜ -÷r âa"jÏŽP7ˆÀk2¬h£$Hëðê$Óȁ8cÊ©DHb;¡ïgÈH`¸Lƒ[Ççø€D2žäøPðø¦ß´áX `BGtÂ é:`¾R'¬ +N/å è°oî3Š Q†¤Äè µ¤§náL  ¡Q—èBQE¢”á‚0ˆÎð(ÎI #±h܄Òâ$ˆHýC…õ˜$÷i]³RÆ6ÿ@3< ò<à}qD ®P¯ˆIPP)-º‚\‘8ñnŠÆÑ9&yb¨±Ó!*àßO·ñ°-Œ&Ɇ*‰; ’qÖ5#vdõ±dM–Ú&µIXÅX^…=OâeaVâfv%46CFÍü¢ùŒöLe+#{¶dög£³‡¶'Þîh­Ö5҄)˜¶iejí¢V¹&y–k÷õgƒÖ@¦6lUll›¶lgöl $mÕö©ìíudÝÖdáV@ävnSªn+ön16o÷coçvkÛöiÍÖ wq·q÷q!7r%wr© `ù–ضgWaý©s=÷sA7tEwtI·tM÷tQ· 7savs½öu1AuÕÖp5qa÷vc÷rã‚uíÖvq÷ve7li·u}÷w_7xɖwÿ¶xj‘·m•÷`]·yMöy57zOsz©Wa­·u±µw{±µ{íö{µ1|Å7R€rÙ·}Ý÷}á7~×üVz™7}ùuõwù·ý÷Q²rm€ ¸€ ø€8xïg5;PKs֗TÕ&Ð&PK/¯-A$OEBPS/img/persistence_clustermig.gifªFU¹GIF89aeÕ333¿¿¿™™™???€€€¿¿À ¥¥¦ïïï²²³&&&€rrsLLLÏÏÏßßßYYYŒŒŒŸŸŸ___??@///OOOooo¯¯¯²²²ØØÙòòòØØØøøø’’’ÕÕÖëëìVVV‚‚‚ÒÒӕ•–èèé¼¼¼999ÂÂÂÀÀÀfffÌÌÍÿÿÿ!ù,eÿ@‚pH,È¤rÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿QWìE.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€q13‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤”/…¥©ª«¬­®¯°±²³´–§†µ¹º»¼½¾¿ÀÁ¦¨‹3ÂÍÎÏÐÑÒÓ¢·Š1Ú1‘Ôäåæçèé™Öˆ1ãã1‘óõêùúûüý¹ì‡.4Àwh@ƒ.Ì0f††16¼Ð#B„ 1. ÃPAC CŠI`„50#F†¹ÙBŒ4ÀàÂËÿ .0#I´¨Ñ£Â2|‘è䋥3*Ðëvá›ÓP>Ԁ #A¤`Ê[X2—‰RèöMà¡ Eœ1àf cà%Ë·¯ß¿ŒÒ¡!͉&¾Êò)Æ9 ˜Ç!ޘ€3kÞ\T0‚ Ù4bLÖ ÁD®22ƒKﳶ—R9˞MàÚ¸së>z{·ïßÀm› N¼¸ñ`½+_Î|UrD‚¢KŸN½ºõëسkßÎý›¢ç‡ÆpO¾¼ùóèÓ«_fÓïÃájN¿¾ýDdoy¿¿åùÁ7#þgàµˆ_|Šˆàƒú¥ t &â`„fhԄ‡ìwÿ¡† †È‡0UˆÈ‡Éä$âŠ,FC¢‡Œ@Í;¡\QJ-æ¨c%/š# Õ3(<%ÕP;&©¤~ï-ˆ"‹”†Ì!e´QGŒ†Ð@¤6]q° "j-i¦™=>yá< éēO-EALÝT†’;vî4å éçŽi>ò!Y¦U\y5ƒ;  F‹EäÎKÐ5ôç¥,êŠî¼P×w嵗Mó0ÔlS {J…#¦°j¨i#r@A@™e«z×ÒM‡`ÐÀÜ ve€¯±6ûà¬.RD¨êZ±!’šwÊÅÔ,9D°Î–{ ´ò™«ÿ Û »ðÆ뮅ñÖ«î¼'Ú«o³øþ¸ï¿ö %À+)ð“'œáÁ /ÁœD,ñÄWlñÅg<±ì)à ëبK/»ìÉ(§¬òÊ,·ìòɋÉ9È!¯ˆl’‘CÁx Í5ƒ(c_‘óBHþÜ$…jb ¼zN7ªf´Ór´¡Cþu5Ö¾€A?„ëõÒú80ØêÄl>n+­ŸÚ³Mf_2g)¯#5Y_ÛÝ_IKõ͚ؒÏÿ.Št›â}*° Í#)aaè"m éŠ@ÁތèÑDwÐãˆ2ÒÆ ¢G‘ª52…0Ä#õØl,*2F×ð7% ±h¤T(끿ÏãXè(!JD´‘[ø6ÅIG€=mXœ,„ҏ“ØñŽš_/ã`¦Ázº€KÑÒñ>«iR™ËüŽÑ¨]TÓ4Ç7à Ådò2›Ú¤F7w±>rNcZÇäK 9I"nNŽȪÊ9"0€žmfžz¬g3ÖÉ ¬„uDrç&²G…–s—´Bg:§AP^I ïëC*ðGE-žàs6% “m~RE¹¨¨/Œá‡Òüaÿ´ûç5ÏIҒB"’Úè`# •ŠäŠO<×L#ZS›>¢49‘J=‘lܓ> ‰Ÿj €NQ o\@CÀӁ.„ f à¥z ƒ\ˆª?IÀYU†Xí!ãzxº¥€P¬ÞÐIà‚#´>B­ýxœ6ÆæÖ¡F«¨që„EWCH… .Á«L8ê–ðPՊ—݇ÇeÒþ¼µqµ Ӈ™ÓaDb…iHL²‚‰(³d‚­:lrÅP–UúìøâJ:Ž”fÝHD@WAqœ„'Û:‰²ˆõڞÊ6/˜R€“[æ ±…Îã0°—º`@K/Í7&rÃ-*58kÿn$ëÞzÖºïÂî$ÂaDZ°·no—ßD8T÷Qvý³_Îõ—Öì€ßkN¢ÖôÀ»H°> ܜ ŽÂ)µQ0¼ ۍÃöå¢@ª`YÁ—^ò¥®~wÀ°J¬H²^Ä^0dõ¯,ÉÞJ„ ]龇ºÏ:q¾R< Tñ‰«ºm¸2)B³ GBh¬ÚÚ6¼¸ rƒûàÛr.^E2fsÖѾÄ$†ê=›ç„žc³ñr……ì¯.«ø‘a֘»‡ÖÔ¼±­“P+§ü_g–F…Ýòuí<‰‰ÌÕ²r… Z½;çBBx(¹14تiC”Ë$=°£ÿ¬ç¶‚ɲ‹_¥×û\È$$gä˜êÂè¼6‰Ø" dI3T?6ٙrº;ílEǗѓ¸€N Öý’ (-é (°' `Òҙ(¶ÀýnW¬E/‹‡Ù᝝û`ä1Ž9¡c CůÂÙ]’gըҐ0$èkšx kÐÖGÂòp°x"ï©Töªˆˆ ¹(+K˱örYÄ|¾ 4ãö’ò|ä);wÚb^Æô¦7ýVLS*p•i%žÕÆxø!”qÿìDLO•±ÅÑyãñ¢âMcÚ׎±¡]§©p5E<‡¢1S"+KmDqúHHücßPÙ?Žpœ@¡¹£9.?7Âî*îiì4¸H{"ð<á)§µV4Ê4Z¯ìÆENÈs 5Ê;¹Gƒ™‘ähï@cì0ÒG%ÂFµ O٘²³A2óíþô¢7ßÆâó“”Ej|R2†”Ðî®B‚ëÈ^A­Zªâ\ƶwˆ ë,Eû…þÈ¿&6À;ÖЩÇ< cÑi.[§FÚpD´$¸,¤òg??UCé'OšG|‰À5ÿ¹ cÄS ÷ç+ý·äސUã&ûC€‰Àg96HD„j§1pç=êì7> Ñu°®Bp£põÔ·XÝ`1q\«£;¬A‚kÁfߐm1~sA.¡Ã &÷‚ ƒœHó 6ˆ8 ÷g0‘ ©çŽ"„ä8!. bMôïðYaüÇd–†Lø€È$|'€ÒVƒÓR4( E׬Ä3Î|çn'êó7¿P$+A…’yWk–5eøw» ˆ#a…l3NÑ ‰žH >ñ…¸áðõ÷ ¥ƒHxA'øt4¯ Y‘^uF·Ø^ÿ±hv³cRVnpÚ@L©ˆ½ˆ_¿è ÎôŒ€°Ðè¡¡£—„s”ÈŒŒxs.ÒLÓŽu0 ŽoPvpÙ@‹xÃOld=©Ç 1íhq”°Œ֍» =§}‰éxBzƨ˜H ¸6á‡Î˜s :. l’€%¦‡ÈhÆñww@ÑGÉH&†à ŠE&Ù@eô]‡°óOÑ!Ý0Z-±ta“)R4å"IîG §˜‘•0!ˆ2B1F;1Hý´Qñ”¬C.FIe€‡“֌IѓÌAE”`‰Ã‡xއ ÿ^5߀Au¡¦„~õ…j`‘[©Ù ýH3؅w™ E’>^åU1A˜A¤^s©•ùŠ¬—À…œ8[x’0’¨s,h‘–]E^Õ?˂˜œ@—‹É•Èá•Æч¦¹“ n–¹U†‡{Pó”¢3^⇠¹ ¢©Œé©Iç6hl#µ ³oCG*9'S²7íÀŠ{²oŸ°›ÐEšÀà˜»!Š™AŠ7֚±¦˜¼i¿€¹1‹²Áe9Ôiâé äY„2ˆ}žÞHëùfíÙ ï9XH‘œ1ŒÛv÷i½© ûùŸYø;#Þàtú ¡ÿ(~y¨“ƓòÅÑ{7Ávú¡ ¢#ŸŸ˜Ÿ¼p šÑ‘Æ!‹—0š ( ?¹bù//Z 1ê`Ù5 ¿Ô‚ _TU&º 9Ê{y=9Ü°‚Å,:qŒÀŠËB‹S¤ºp¤c™җšÐAäW¹Dº8gv靱 ¥aš²ššgYæ_×H4öq£¤ ¦`œmzƒ™`€bZ)ƒe¥´a§£€§G¡2œ‚X ÑÃÚàŸ]aUT„Z ¿¹æ"ôySåÅEièägP‘ • †JñÙ"›Êu¢--¸î0GQC¥ §:ý¹#«ŠKÿÁˆàŸÇr<3íĵú ·P3ª ´T¬MáP´3-àRLSœÏ¬þ ¡~² ·‚(¡@(—HªXú—ê*ú'A(¬Ÿ04‚šIgJ Úʈê'ÈÂ]Š' J¢W¯Ó0¯ú°£~BVtº‘|¶ú}Áq¬ž°¾Žó0¥éQ­ A( ´¤Å©±ƒæhšÆ°à°0P²&{²(›²*»²,Û²&k1 .;³4[³% çê¡i$Û² ³6;´D[´F[³8Û.åZ "0 PµR;µT[µV{µX µO›µ^ûµ` µ0³ÂhGÿ}‘ c /еW[`@µs¶v{·x›·S;¶Jë¯Òдúá¶z;¸_»@¸ˆ{µ|;ôçu³J nÚ.‚{µ µ ‰»¹œk·‹KK €û“Û¹y+u+°¦Û¹Ÿöã«è'n|ê´`{ðµÀº­û»Àûºe¡ ¦‘×YºÀ ¶ p¸2 °»ÉK¸Â‹ÙŸ1©™ ¨ÇÔ¶a[°  á½æ+½²œ0ºø¼ç«¸  ·ï«·ÓkŽôM_⠫ʽv+Ú ¹õ[À`{¿º³À¾Ðá¾,µÿ³ |·̋š@Ÿþk·•« ½<ÂR{Áê» Ü!<±Â$¼·d«NAöd‹¿Tº ÂT;¿ãâ/üÃ&¬À²Â0áÂ,À?쵬žaªOúº3 À¼R+È«DÏ»Ä#Ä~‹¡ãiÄT¦d\Æf|Æh à ÃçÛÄI±oŸY R‘—µ`勹0hȂ<È1 ÆlìÆæëÅYŸÙJà +ÆPËPɖ|ɘlÉ'ðµãà}Œµ°É³ˆœ¼pl „¼Ê¬ÜÊ®¼C’ж x,¶1;<Éÿ—¬/ ™ŒÉ› ¼£\ʧ¼é+ÄiêÈ!+ưö!ðÒ<ÍÔ,Í-` PÍÚLÍ))Q¸\¿©\ 1ÀÅœrþË €Çl¹QÛÌϬѼÍô\ÏÚÜÍßÎï«ÈěžÎ¨ÌëkÄ[ дz+ÐkoÔ¼Ï4\Îæ\Àè,¸Å1@¿ :±Ðo|Ì_l¼aìµÀ®¼ÀQøAʼnÜÐ э6¹0.¦<ÒÁ`ÒЁÒÑËÏ׺“ íž.,í ]ñ9'Q̦;ΔàÐ+}¾-µ ¦ ðÓ½ÔMDíº½ÈûØÈǛµ@Лx‹€yœÒÿ¡€ÔI½KÉ1ð³Îë՚֊ Ö Ý·Xý—´òÊz½×|=€ÐÁU«Ùtï1'iV$¡GÓ']×^hµP²  µ·¶ `ŒµH,¸ðØ PÕx›Ö20n,ØZ§œ-‰•†ˆ°” Ø5ÍØ ûё`Ög ¼uØTëß,Ç]çTQ{ –Åi‘®í ²µ <Ù`[ٗ}µ™µ¼Ê µ݃ ÚU‹Û‡à§þÔ¼-áýx«&”OÄÝÑvÝÏ{Û³m¾µ½Â P5uÁ A1–¾çƒ#§Ú’дâىkԓpܒË‚}¸“-»+ÿ íàP‹º2PÐÇP· Pá^ÈQk¾»» ÀÑP¾^½^µÜMµõÍ8øýoˆ€3Àßçßàð!TÍޏ‡¥ߜ;ßWKڏÆXxƒ e£>¡ó •¿óË°oG>=Ú³uuäDXaÍѨ¬Ò,ŽËàÉ2°ÖËÂ0›âž¼µÚÀÓ-Ë›M‡;ÝP;¾P¾-n® @á1Ëܸ« 6-Ù-=äÙèUFΔÁËÇä§òF»Ws²LIå×cå0¦è ¡åsÍåÆÜÞ9}¡• äÉ+äVËI4äWZŽukA‡ëÓ>ØYË1ÿ:a…Ò!Y<¸>ê,εA;cþ¼•ë€ €Ì•ÛÙ~þ´9, píA›áµ³µÓ¾Æ1àHlÙ ÀÖ➺ÈýIQT²êµ¨~@ªŽ~¬ÞÛË@'Ä> 1ë1ÁˆR`âR»½þëö{ÕîM”ð㤎¸¦^µÐ$ŸVE€ÀÒ?('ãÐïªå ÝÀ j©z&ÕË<þ ?žÜ`ìcŽËӝ Tè í0ân{ÌÜt®µ°ÜƾàÛ~ËH¬¹!ÎÖA[º‚kóTñò^†Tïtñ”ñ@±ñ Úñ2òmUŽ§Ý¿‹Óÿi³IÂ~ې]¾ÎýµÐíµ;/› mºOµà+^¥ARo)¥¶CäÂñ‰c’4fcúÜåemµiÿíÓ ó `P«l™àQKË À¾íR»ì+oí1p¸ >݂½&ëécN&Ëg»ã;âl÷¸€÷›iñ\Å÷áâ÷½‚‚c„_òLÛ ø ÜÌÝùÏmÙl¯ùÕ}Ý2Ý›;÷S;اƒ,w`Ćz‚[4}Ÿõo.AIÞA¡‹¾{Ó^>ƅßù¢¿æËÿ0ÿÓÁPó À˝ùn 2;¾á LˆI±ƒ F,Æ°‡ŒZ•ÅfÿAŒûš}Á³ƍÔ¼!2±'ÆA\°˜wÌ öÞ"úþÄbô¼^7b2¶¾0&ÃÀ¬69;=7aø.¿^DÁ^°FÁTW]c<Ïd ®d pÓv©d ª€g‡}›ª 4ƒebx¡‰ƒstq­9[]Ŝ8¶̼¸0ò ¿4Ì4Þ'Íñ,½Ga?´ê[Áoÿ8°I!4 ¨H@e‚ xÌ Xx0€±T`PÈK€JŽ¤Ñ‘£E ÚªˆÁÎLŒ ¥€–@JOiȵé‰NÝÎv|üÀ“ÿGŸ¢z3ô!úÒïB_;tUj*®aÎôjE–N Wˆa €%n $à€ r•803¥o½¬Ⴀ0aGbü<¥›Apžú!„0 ˆ0 4¡,ž¿€Fõh¥g¸Þ!žé´[Áææ$Örï>º7…ŒAxqã›tò4ó3¨P¢Œ. PçÏ¡G¿ `š5Õ_ºÇ [6 Úr¶ª=ž›wYS¤R©õÍ*VI&À- ØÁ„&þŒ#B"tQ@Á$(ŒŠ[ȖˆØ/˜0@pL°cزl O`˜g¾OÌà…x0جÅoÿ0q=€ÚCq•µtcBÂyÔ-sܹdÄ2¸@C†mLÒ YïEWbì‘Æ÷ KÈøBG5 P(¿ K@º2’ €›ˆ&œôâB©ØO®üdq𠡉¡Ã$©â¶SúˆJ% Aƒ°<êF€)w”Ð-sà ÒKcÁ„ VQ¯iª¨±PBM”,½ÄQL#ýÆÊ*±|EËXnaë–Â$æ­YÊ° /Z(“! Ëxs™Mü#B`g¢0Z€AÚGÕ1Ð*, `Ôm]Ñ¢ UY”[úÂ-WÊ~A­JÔÜ$Ûqá]ô[jYõ*͒ïDJÿe±—ehNÈ5¦eŒˆ‚Í!ä26…`Ћ!ˆ0 %LXŠNþ$åZ*°$^nÈ   èÅÔÞIÍmyF® ÀWZAyäQK>9åKWßXoœµ“†¬hh& )²££÷ó$‘H2‰¸”VòÅ¥¦crˆ¦ýl²´ZƒFÚæ› }µÓy–TIJ]n Žõ$d²·5»,´!íÙn1€öGhã„#ÎmᛓL3 ^ àTºï-Èðr{NòŸ&\"‰‹]/@˜¬¹ ¨@ð8ˆV©Œ+|›Ü Ä{[¼ñÇ!÷Yr¼¥Ôûç?áîj=<?×ÚL-ƒ@-ÿPò½×u¹rÿ±¦šy“tL°!þi‚üÛ9 »ú}€¨‰z¿Œãތ÷#†äk'EmõÍÕ½¬¾»úÛ8¯ƒ_¯p´{‡ø¯E²á ²ÏÀ<‰ëÔü\W¯ùAdžƒ,`©ŠX ?€`>MaƒDµ‘+”aMŸ‚È>‡H@ XH/BZÔ  ëzÁ¯D€ž! xØpÀ/$ð4ÚIÜv$AÜõÈ~Wâþú—Ł €–‰€OÀà+ª¨À:Ø«´/Ú‹7A¡eCA2HÂtáŸìE† z@®& BÁ.Æòÿc SÈ%Q@Â~!\Ýz9S—rŽ~)(#@Þú òÅ „q dtà θ“4þaMqãoGWíN_óa›÷?âÄ*¤@„)±@D‚ï°Êþ¤ÀÒUSäÑó°'èHÎ 0ÖÁ“' |hÖd6qòÍ)f!ŒtˆN#ä覟jµ‰ô ѓßèe=€9a²¦Æ2g ÌYƲeU„Õ÷…K…±™»üF Fù…3F Ÿq@TTÔ¸‡@ so$hýä˜PO Ñè Ž%¬Tò '…„èb˜)2O@IdŒ2£À”Ÿ¬ŒAÿ †‰VÔ[øCF_°Ñt”™cqæŒ z ü¡Eh˜»…æbÀ¹K}0ž¢»PéøÔIHu°ÐeO ‚#F%ŸgŠ¶úÅŁU‚cACjËNä§.1P€ Á)W `[  á ™Å°h ¾ åÅ6ØWgÁӟúTž½Q+ ت7¸µpeåäJW6¯µb-}½”<€zÓÀõ.%˜ÅtOß»¬øB¾Z™/bõtªCí©<ÀOˆG;æZÏlAì𠁹ö¸­…Ž˜`"°É €SÀˆA^.˜÷X€á‚´Ì`€¾·Š‘¯eëkÿ†õ«³Aì¢e Ü÷y¦¹Ï͂^ Ý2VWØÕ®‰šz6Y®ö °íÍ?`A jÐtÈq8B”ðà \BNiÚBi¼0†º ¡ ¡a¾ëM`‡(ñá-κÙP¾À 5ÀC P02 @[r¢¸Û)ÜR.¯±í„0¨Õ bƒ½¨‚–¯a7™ ’˜‘QŒG CF¿@ëGûëEsÁÇb@‡\ä#'yÉM~r1),å G>Õ+4IŒ; „䣞"HA걐}¬©e©'GB2c¢¤%©”nAÀÈñ& <Ë8ùIóÖ7ÀÒxÿÝr¡-›'ÚR}"VÇUó´{îgh+s¢ÓÔD7¯É„l ’›ÞtÖp‚b‡p¡œ5Eç9ýºÎÆÀ¼ïTC<·碍×¾yµ+bMåY×—·–¹Ë àT•¸TTÛÞò•%‘^¹¤FAi8ÄÄRÃɲÅàž9Q\,+Æ š3kïxórÞm¨÷3«|avkÑÝb›ø‰Î½Št‡+ª…¶°e¶ÄW»ü5°ÁP, {ؖ6¥˜‡&RÉb$.–åOénˆoâ¯üxñ8õ t™äGùƳØqNý辁@Ò]±ô_ ‰–ú>´Âû^h´‰ÛçåBzÉÎÞ>%<ÿ¾ómB~ç’ÃýA÷gÅUõ «g룢µËõÖ¡ šzïß½Kh¾ [ãÄ~Ó&ÀÌe°?*òÉPó—ÝŒyk4èò9ɼ/hÆÐîrÂ5¼Zh÷™¿c|ÖÒrýëa{ÙϞöRˆBíqŸûØK}¥?½AÖà ¬ª÷ö u·ìšaĽ€d.d@ÕÜ¢À¿0 8"¸Õ ¯æŒŸüå7ÿù_Ѐ ŸýíoÎà1ã|9Bú¨þ¶®o"ís+ÞÓ£Ìä¼nؔoùðî˖Iú`;ԏ(@ýRoTâ *ìL±b\aþO‚~^ô@+:ðn<ÿa0 !ð  e Ç,p0p4°mJnñNø 0—ÐO¸Ã€fÐ*%ûLd’Ì3®Ï3ŠŠl7@®Ha,yèGÖBp[z, …oÐãÀPÁCšûf ©OŸ€ žð ¢aP¬žÒ&qpo]†ùŠfA# "Á¡Œ¶â¡ºV0ŸP0É@"q8ÀdV!'ü¸PI> $îôìqB㔶ÂdN)*Q€ÆH´° ã@d(0'±]mÐø‚-ÍÅCÂʁÿ ÿ. Û(ŸâÿaôÀô(pë.á.Žõ6QI”c'²ñ AA•-ŠQ¢•‘q\ÑPbÀÁè»…ÃÀsó ùlI÷ð1õqs)¢ÕHɍ„©˜Œ±–"Ÿ€$£Ñ"pøܦðºQHŒ"H²Ð' ¥B û© ¢Ò1!5c!»¢!‰¯øèqªXEÜo%Y’Çæª%aòý¸èt"Q°8€ 0 b!™.€<ƒì(Q+"àqD2 ¶o6Àú." b£ì'>‹ í°&Gá&sr'ãÀ'£"‚Ž²(±€&!)Y¡âf )/á)R_K¥2r²ÿÑ‹Àè0¸@ᠮΠ^£)Øá €déa4 eG¯.Á5¬$f6/@/Áƒ/cÀ/ì}“3 s°`¹@1—2ŒS  ¯ƒF2¹®ñÒ,q"àúÚ1;| 8ãT@C4Df4(ÍÓððòœL/5à@+ 5]S>Á†>Ë­@à@71AÃ`AçaÓoÔvîrŠhÿA=C¾ð‹˜®A;ô?±D¿0IÔ4L4Cå²ÂèR2Tï t†Øòô>0à50à©rB¥òF ԙ¦#"{ôG HƒGCQ2=:ÔH.Gí¨X°7HÀ¸´K½ôKÁ4L»tÎé. Xâ3E3­t°TI¶TLåtNÇ´LÏ´ ”G%µP õPõP ýSMUô9¿âOuPµR-ÕP5‹ò”‹”OéÆJdÌDuTIµTMõTQUTÃ*2u6#T¡!UeuVi•TWEíjk´.©ôã`Õk "ÔSûX5ï^3JÿoJ‰õf~õXµHX›³W«TH¡—6uW;•6­õZ5µY±\µ[½õIgTªô”WÅUüœéMn•UܬA¨áM¸ÁÌ<ï±±UíUÛ5‚'^Ï,@ËÒt_i4@§u]Ç/0 r«Œ OdHnNì莝ô«Qõ5Wù – "VJBB.h‹§,¶Y–!c·Ú8ÖU66”Zëw†EðU7$¢æ*v.H'd§€¾JAhá-:‰9[•f'/oXå¯&  öëÊÀ°dh¯vh$«‚!ô8PE74˜•[B…ôb!˜ÀÀ?* Z ! ²éˆÿ"Vyö Ã%:Lãdódº mënmÛv.šE@nun¯EZ˓aÙµl[® Wm/¤pߖšÚ®às(6žd!ooaoo¡oµ¡Ó7mÿ…mÝöpã–s·UÀVYÓ§"!·nã„V€¡/$C@8@hÄ8Ȧ`.I>÷ Vg8Ú" Žeš2è_`àwç"xíbx‡ƒzŽ7y%‚QwO‹wv7x­{›Ax‰×{'y¯ |«`myjbÍJho¤ÄÛ² g›@}µW Ú×xß|—Î@evXOïú„â¢ø 3Œ ² ¾|¥F¬ Ih£ çôÿìîö ú¯ú¥¶³÷-*¸WÄ)ƒ‹¢88b*ëƒÃâv ԆëfŠZÂpW8«Z8Y6 d.¬€²pBŒ`„k,NøzRÛ,ø‡5˜Lb؃'¢†Ç“S_‡[g"kîTÈ.Uà¤Kà-c¥\"‚áD'( Ǩ)‚ÝØ ’@ÄX%È8¥Ì¥P'‹;f¹4*à©Âø ð¸Œ+‰ÕÇâI—sŽ×8ŽÁmŽ« Žïx%ôx‘/«‘ÿXv“5]·õ÷¬'.w` ÛèBh/ˆÐ$¦)?Š¶·Ò€—á`À.H§Cž`—+ë¶nëíÈø}o•À•áÿ$–›ÅWÌë“8ùèØ%{ /SٝV¹ Žù•i½–™–ÿXcârù«xÙ|0D0m˜»$k[™›©@™g¹™#Y]µ˜6¹Ø7"`w3‹äK"FO¦ —"îˆtly¼æâdeu€!§7hks÷ ÚÙÖ$¡Gl¡Ÿ¡YiG†Œ¢( w#ÃPB/8¡ûs@º_ˆÄ ¢y·˜K¦*ú¢ï„ZÚ _Ê£eÚgC:T8öqO'ÔŸµ\v¤û¹7JÙ Š)ª¥iñvS”¤Ç%–j„é´z«qµcÁ:^þÙ ^ä¬ÑgÿW”·G÷àT¾á:®U¦ª—Ö¯ ©SÉöš¯ó&©Ã–ªÆöã0@Õ^(øq²)»²-;÷°#T³·r¬õ)_@²/{´I»´u/³³X[ë:Þ@prVƒý%Pi»¶m{%?ÑQ×zTáðz1A¶_ò¶‰»¸oû»š®ù9Þ¦±Îx›³¡Y_w›²Uº£;¹÷¹Ü¡»7Àüf›ýœ±»s{à 4SI¦;º¡™¼à»Ç/¼Ûo¼»ÛFZûµG!?½—çø˜l8¾‹ ‚‹¤PoOöT'÷̧P{QŒ¬Æ Ä»ù›×¼`lCîœÌõÄö Úk¿üTã¶.ƹ6ÀÏ÷ÎC°Ð=ÑýÕ°K§’¨EàÒ5 ÓODÊ9=µ—Zø( ¢%ɟi"ɵ üÃLø‹?a…’ ‡Ê[}c].ÿÈ°Ë\CîÜ×!Øÿ|ØÉfÅ_ýƨbÑÃEzEv=Œ" CNT `ÖOÓ=Ú ¯Ú¯]ÔA&8€Ò+uÊýAѽ¤]± yýÂîҊ#¼ ÆjgDÀàÖ´ÞãôÝqݯ℅¾à>áÞF¤ý¿/!T€ÖÍe¥×CÛ?R¾,þâo†ã=ÞX»À]JJþäQ~>uuÚIA*¼Vþ²âkç;A’zæ?ç à%@à!èe^èé}.m> *¤ßý82Í(nýÊÚvé™g¢Þá©@ä÷ý8òb´~ëCY‹,S¡Ž,VÚ#tÿ¼íuãa ÊÞì“$íå~«u‹ &WJèÞîïŸÝé5> ´ %ì#ì'ðŠ£A°, bŒDð7ýÀ¸5óK¡¼­ÚQ* ÿX«¾'®Þ &¿CÒÀòóٞ8ÿõ‰;·3ÞÊWA |¡à¥Ã罐y©õ£y,DÛ´‰¿´Qgàö›ŒÑúíµ'%ö þh|¿ €ßcÁfø‹û+ûøçí“ß „–$sŸ¼¦Œs€±Š¢Qˆ ÂÁ|20ÑÂH°™iØÀiÓà7®öÿ˜b%çvÕÕ¥B4¼VïË{Þô*ô·UŠÃÞ‡øú1`βo| Q>ñ÷ä[€ï¡HŸ6F°u‰¨¼.x ]RïB#;*xcL#|ìæàˆ(vÊÐè"¢.>Žjg’”¡›‰Vn ŒÝ‹(•Ò*<éo ^©Vì·c…úÁY?VŸ†ü>#É Pò3åd&o¿ý Ҕee,Ë17³@—±éb\!ê®6Ž[«]CX£{}BDª4Ænn|ðê/¦Ç2>f®O™ â¿px³î¹³¤2su«ÈÚìîҋ¤çUé\ºwš–Ö4Ú¨Og.Ôcÿ5ËqŒSß,ÕÖØ|-¿VbG¯ ~‰¤ûÕ1},ӛcq"fe&‚ÅPÞs3W§6€Œm7ŒÂÂ22Nè2»?5&3c̬Êj³èÚU“ÜäÆmÛaêÛjóĝ¹(óÙÜ¡L·–oÖnd¼»ñNИã-ÅhçX Å·%´RGAnÂBo8ÑégMÄØzn—ʧra÷arÖ´‡-°šÆ®V°£÷J훅*K7›ÊE~ ”<'7â9¢Àß´\Ä2çWÌw&Œ(PŠ$oUÅÄ+TqDß»,½Ba;Wv<‘0ƒÏFuÛ\À: F$Dlœ7ë ƒ²‹mÿ7 ÚÏöÊ}í!ž››®“èëd¶ÍÙ£ôYxÈHí™b{aܞw¼Ëý°º%.=îž÷*í½W}ÿ;™ü>xK#‡›æmñmÎÀh”˜¥~§3ŒÐ99ÿ*Þ^=öPÐ>⬹½Â¾$‰Ý«ÚV×5jÏ'1ç=õ†G>>â±·szk–Zx>x¤ÿe׀½ÙŠ§ ´4$ӊÕW‚O¼âþ÷Ã?þòŸ?ýëÿž#ýéÇßúÒ~û` àÞß³=”ØiÅÀíßRô_°ÓB` ”R`J``_(àê^€‚à®S’ bàë5Bl îAÎe M€Æÿ Ê`m¬ ‚ëÍ öÅ`êàü0Ÿ ’ƒ•˜˜ËÛlÞ¼˜,„R,D"4H”ôS$ÀJ 6 V¡æ`ÔàøöZ ¡$aeđ¡Ä³”¬@ŸL¡g\!Ε¾ ‡¤ \l¡ç` '¡Cì| S1˜D°Õðá“ÅJmE*ñá÷qaŒ(Ý,[øÑ¡Sàß$’ÒÂþ’6CL": âÎHľ")¢D0b9"Bâꑟ%ÆÅÂ" ú ÆñBzeNœ) êØ© ‹À|̓Q‰”|YŠðÁX•Üà+ÎbtTâ42.ڎ.æÿ/ò[IuOñ còã°#±$#°,#-´â<#J¢5J#<Æb-šŸ{`c–´Ê66Q÷¨Š–ÀINæ$À‹À Ü8„É@Ï0T?²J¬l× €;â <¾#Eb&b>ò!&?NË/BB@æÙ@ސA"¤B²Á´8d8D&¤>ºâZd<Τ•-!À GZÄ>ÞL΄ —¤‘Ü”\D(à 4$®ÑeÄ˕U L1ãáU¤EÊbMšF^ÁNîLOÂM÷%HQN„Q΍¨)¥¥5å<åÏPJáPe4ʤV–†]ÚdØý f˜p$EøäÚLÄå€IÿÚW’ ¦ô ȨKæ–Må¸M¨lPv¸à,f%^^c_æYÉñNX2\ÛŸPBÂa6Lbrc2€cV:Jd~ e֑eÒåNÍäfÚ¥" c`cºp¤ˆ¦eÙÜñh\í¤‹6‘_rRŸ¯±Ïñ„ʹ eRAf¢nr&&üægêãpFg|'$$'µYò4ç.V tg|MgmWiFâDâ¥vÖ$oîefA—Ȉz§1€Y <I q¹ÌÔüa5¤K´˜ýAZ*ÖTސDÒ¤VÚçvÖ6òçF&€N¨€> €ŽI&¨‚Žà4hÿ9ÜL„.ф>¼Èå…Þfåf5j&=zÈp`£á™pv$)éQ‡=¿¡ÃˆGž‚ÀrŽ£$ÄdÉæ•Ò½¤­EĽ@†Öånòèvr%<™idé•Æç’6©(”&”ö •Zi’æ:h©ŠEŽ—b#¼]%En(Vúè Ø£<4ò¤ž(0ª$ÀbfZâ r(_fA¢J£Â§òA¤‚)nê¥fèÅÕc‡jAa5*LPL´*œª¯ÖÒ¬èÐ[lÀ dœB1`ĪÊF3ƒpÒTœ` E/½¥ïð^oönï!(Ez€o Œoùž¯ ­ïJå¯ Ò-õÎ |à ä(’PT®7,!0Ð/']ÀdÀ P@ü®ú²î<-0. À^ð`$°1ˆ/;0K0ÿV0-mÿrÿ,pco.iïQèEŽpOÐ#åù.AŸ°À®îÃã ßRÈð/OOì…ýÝ0Eäð4åR:ùð+n ïIJpìqh@{ñõN zñK«S£“*q€±GàwqñÜNo £ñþqðš1Cïס'.×6®¹^0«, -o«"«¸®pk1rÏÎ1#2"Sp%k§©N²ôj²%c1&“Ù'«0»nÝÞ1)ë/+£­(Ë-#›òo2$wò¥Îò ærçÂò#‹ò.ÿ-.Û²"s‡r/ ó/»r#/ò {í%£±#…10#íºÿ:\2'³K³ßÒÚZó5g³'³$/s8Ð5Ç@Xä¨s ܯ6Çò§ó5³3Eº³:dz;óëÚ*q.]@ç’VMlÒ/5Oãþ¸“A˳EôôC´­"ô5/ôL:ô/]´§²ÿNì"]óÙâò5#’Ef´41tD[#I»“I¯+J×äJQKÏóÈ&í¥Ö³Dh‡óòÚåéHDJ»ôLö4:ü´5 õ/õ6ß$!Oì £ƒS£qüÒ>Sä ÀQã¥U uVouX£ÃWrH۱Ѯt ®;ôG[$ Ã[ƒµJ’[+r\s&]ǀ]Kµÿ^:î°æ3W‡l0`ïè]ãea32bë5?§u?«2¸”àe[ `fsvgߒf{vh‹öh÷p“vhƒöi«ö¦öj»ökó’LíT?3Vàmãvnëönóvoû¶ý=ZÓÈüvq÷q#wr+·E÷ß«?cEÐJw€p“LNwvë˜u—jÅ„vƒ79qw awxgwu;·w+†y³7zc_y³wк·$>we{H|‡÷|_7~ƒ·~w÷ k·“·€Ÿ÷x‡T}‹ô}¸t¸ Áwƒ¿ëƒS,€›Ác°á`¤a$ •BløªŠ¤V G„…gF„ÃD†»Åÿ†óA‡ßć³CˆWÁö…„˜øl 6U8/"¿&œÓ}êÖÍø$b/¢"ÊM–(êqºS,4—cÜ8M x;ô:¤â ¤üڒB*‘+ˆ‘O’Ãf"Q“ 哋B”ƍsòw†2îS7døKœ‹$ÌyXP ¦”#2† cÍ8-À…ˆ‚z¶Å”‡C•{ƒœWåYUCDàÁ@æ¹VeŸÿ9¿Í‹9:=-„ z((zT¸y9ëa ¤¨”ϾˆÉ,Åå ¡ˆ¯ð›¤Àlíbùt­ãK²Ð¥ËE„A§iI&ÏAþg? ÂÀ=Ž™ Îtp $ÿ¹°H±–Dà-L0º+8:?Œ=H@«Ï ¬» ¼ÌzDüŠ­WÌÀ®«{Üøºñ;*IÀ°ËDØÜd²#¤GNÉ4”¥ZA»N{¯T{¿`»˜ Ã¶ûé«u$§:_¿L¹Ö)¸»‹êw=X»g£,)’‡ÌÊèKrJÉ½È ª$ÊÔËÕl• ¥ÃJŒ˜8»ZCºÔWùHÀ¥ÀŠ¸¼½(@0z¯,tû%|û20eíˆÉÅKŽ˜ÂÆc<º8»\ÉÍݐ•4ÎzŠ!6ÉM̈¼×XU°Èb¾ú˜Û«™¥ŒӔ>Ìâ€è¢çý‰÷ýkºàß|’>¦4¾áÁƒrI KãƒMœM¼Áä’â| ;ö‹æ7fšÊŒÀxþápR‘yÜè×iéM©CÄSö‚G÷cæy= ŒM–HŒΎE•ú¨lO¿Q<ÀÑ'︨0':8'ª)ÎóE™¥Ås8b @QˆÉ”KfÓù„6ƒYÕzÅf­Éh×û-Ä2ƒ¡`Àbå!öˆ9dqQ"ˆÁ–Œ¡S²¦;“[¢{0Pÿ*4XX"2’”Q;Š‰)@’ÁÓë#SÃ{ÀÛ¬Œ™Hx<»üŠ•UšÒ²zyÉz!ˆ±­êõåš~jm͓4`he]JÀ,áƒ`PèdB­œX0(˜®VÝä,„£>Pˆ±à–(€Kµˆ?À¦sø %CÈ).nLx&€;xH&D#qI-_¯“ÑXÀdËä¨a£äY&iyÄa+i€Û8ܼ3iœ>1΍I'`]»wlà,˜W/‰|pô!ãçoI¡€aÉ0ˆpÍž—f”HÑ.]¼*³…ë,Ï<ˆVÏÀ µ[Ãì%ŸœH!ÿ‰œÅH$¡\²¢oɾ±3L1‹a²I,æ3M5}¬ñ qŒïÌ/פ³Î Û4M;÷äÓ>¯¿;l±Ç&»l³ÏF;mµ×f»m·ß†;n¹ç¦»n»ïÆ;ﻐ7á­ôÂ8¢e‘TúÇ"€ð¶äEÉd‹'jY¥•°‘ù¤˜cÉåzJø¤™$§âš3¶é š*Zç]…Z¦·á•¥£€f^¸ç¡g¢i㜷¥È&HYÚy¢¤uÉ‘ܱYß .vZ%¢F™g‹¡Ž:(§€Š—d¡ŸRêåz‹êÿy$E¨´©¤ˆ†i⤏Ž)ëDµ&D\©¼Vª±—jú뒴¦š™†Àâºl£Èæe«K$àý†ÛÝ^ØèÛڸ뎻¹h¡·lûà‡ãÆË'Ÿvá8*’΢¤mÀ®K­»ÞÒKá¼Ô.Ø­“`âËѾ`ñˆn¾³B|`FÚ1Ü°yÃJœ°’~n|¥Å÷*Ÿ #õ\¶jÜUۅ±{‚Æ,óÌÙ.Ìò¶!?w³ÈΞ\Î*Ú~Ú~õrª:[uoÏô*½ÕÒ=;úçdýÎ,¨Ç€vÕ4˯ý·§ÁR– tËï¼´×ëÕ1tHJrh‡) 5Öf§ØÚe̜Ùvgÿû¢”€›äæÛ{§g®ßÚʟØê!wí€pÇœèù­Ù݌{èé~lQNv³{™ù›Ss¾ù؄f÷æ袖7p͑ÃDréVv½ºàsçÞ!혊[c‡‡Þ¨ùëƒkpŸ–òn_ÊðþNaðÃWŠpñÈßY}²®ïmì=Íö¢‰öº ~ô‰Çk¼õ“šýò•[|—ØŠ.­ûÌò:¸÷B+^â—ö3Ûäþñ›Tý¶„:ÂŽPTû‰÷þw°þ‘îÒóŸÓD%ì}Ž}„c×´>µ&Ya8ÊZ,è9¶yNƒÄU‹å–景MÇ*` gx4º]l-SC!±"¸ÂàU¯|ïëR¦ÿxFÄí}΃)ĖruÀ!ÊZ2¬!èNh?Wùj‚¤k" F"^Päúba€‚?Š0zÉÚ"iàåC(QŠ Êa9ˆD&‘s„•ú„•?*PˆsÄc«ûNXìR÷ú"Ç?êªZî¤gA)Öªkþ ŽñØ' ùŽz† —ï¼øÆ)‚ `#D'u(¯¡P`K)iÈ1ÀŒî%·¤"¦IU֋•\te+Q9Ê(ÂñaMáYë ˜·Í(SwÐDŸ_rù,ÎåqÊZäœ µÁ1³™KÁfãÆ9Ü3œo P7mX´kŽ_}Ë;ÉYKsFÓdéLÌ<µ‰ÿAˆYŒšm)߆–Ïœu d„”ËlŸ!t4 ÚÂ\öυz­s…VB%zÐÊËm|œXd>ZѼ 1 IãiB–žNºéDCÚҙvt‘Ý“)-UeӞ® œ>½éOcz—^ó, j?• 3'‰ \é›QTñ†L…:'}Oí$eùÄ¢U5©S§D½¤4ýê6äÔ$N°Aí,“MÙ*K·6 ®VUk2‘*Tº>ՊuÂ+SkJTEO„ü(îLhØé!€ …é`ÿõÂ"0 sàµB•ØÉ•±ä’¨>‰Ö—z6Ž²¢dGûI˺öQŽCUi3JÔÂÿ†6J£}]iM»TžîðUXÞnK©×‡ýöŽ šÞg½šV½–ž)eßq‘•\ ö6¯Ÿ^0…yÒvÉ6©M=Ó0ŸØÝT »Tmys#鈶µ•Žž^ùK…òoی‹ _Ùé×7(“ ôʵ^åJ³ã¡f]’Ñá¶%sr²ž üA»æ·(&#¬Rÿªæ–ÞॺŠ=&šR+§Éð‰/ÃáÈÞE_ð¼£õˆ\´¡§Ø!h^Z )eã*~ǺJ‹q/Qqv“ÌcÞòU£¥Ñg“G†ªöEɹòƒ­|Ú3Ëôárf´|e0‡Ùjh¾š‡Q:™4»ùÿiy³œÍ¶Ð$ë¸ÎxγžÁå=ûùπ^îMèBšŸŠófNÍèF:Äf†¢MéJKÌ6³¬æ¤-ÍéN“Ó3+nCÔ^Ý 9ƞNµª?¼éöÚ÷…«û«T맼UÛúÖ{M+ÎláXãékºÆµ°‡amæ6Ç½]6õFìf;ۚÙ{¯ËBdCöÈÏζ¶%§.siÐBÎ3_&¿ îMyÎ莴àÒÍn“±;Ý3aƒ‡FæÔ».b–]¾Ç¬îï[Ð腲”ÃÙo*ߥà?¸‚þï뺛É;vMŽy¹Ø`e±ä¦(S—ù'Š¹éør\§•ÿa5zO~އ[@±í÷ǵ÷M˜—óÞ{(cl sŠMÉ;¿³åÖÜ>Z­MœÌ¥€Ga`']é E\w*a±Ö<ã ²gŽQ];®3ćì:tQž.l·­ªçéÕIÞm:ó™ö 7‡ÄWê]q¶CmYÜ¥ ¼. O?㣡Î<Õ~o‹å{•YͨުÔ8N´Ó&'WÓUq…s_âIaÈë?½}[jlwù—¼jÓì-\èxF¼,Žw㧲·K ”Jãôu7”t.–as‚˜)¿4^!K{w+öGU,×e—UyùÂ0=8oåÔ~LÓPnW{74€î·_M¸"˜Ka—5H¨u\wTÏU\Pøc%H…Ò$…ä·…Ç#5CȄÜòn#DQ;XAóf#˜bÇSƒöd—ö…8G‚«q_¸†XB<’Ög&Ì3{1¸Xóñ4ˆ¸Sg‡„…È}üÿô3ôÄs‰Öˆÿ5…0ƒ†˜ÈGa…ƒH¤_lxh—#C¦\§h†´Råu4W&Ž³m÷†×†)äÃ|lHY3ü¢:W‰±¸tS(‰ƒX‹"Œ²èˆ|·Uáãwϧ^PåX-lÈ6»h .ô7Ndj¿xwB×cZŠ…¤åÓ÷Œ4Þx>™†É¸T²ÆIðS-¿(A„$-íXJרz$z&?’Iô(ŽJVW—÷| )øHïX‰âG'è×B“‚.D˜"w…œuFtdG¾—x¤¶,1”{ãø~)b=}S5’T’ÑT†”+ IAË$H ÿÃFÐçF÷tIT€´D¿¢EÓ×:I‹5÷w™G4”Ú³­Ô+Ìö(§”*¹+ 9?DkM‰>éG¤+T‘cyv”'©,ý7.ÿhzYɕX“T „óBLþ2w5¸^Ùø°¤‚¥w…+6ƒß¢Je¥—¤Å—(ØÀxÎ8”jR£Mê£A9`çRœY¤õI]À‡¢¿?TZ¥ø˜d,™a¹T}ô¥Ê¦a2¦\Zž\ȖZ|à&.î"§6ڟuy§âöj؊Fʤ‚‡J‚J™7¨¥€¨Ÿsj¨¶gˆÓùvyø¨ ˜bV3÷Š%g©tiÊˆ[‡žrB§ilF„¡AÛƪFo®ê<¶©”ZªŸ©ñ6‡yag¶ªRwho¿Êo´j3 'ÁšVØ«•‰è–Ì:g¼ù¬r¦¬ÔZ­Öz­Øš­Úº­ÜÚ­Þú­;PKF-@娣PK/¯-A!OEBPS/img/persistence_cluster.gifšDe»GIF89aëFÕ¿¿¿???333™™™€€€¿¿À ¥¥¦ïïï²²³&&&ÏÏÏrrs€LLL///ßßßYYYŒŒŒŸŸŸ___??@¯¯¯OOOooo²²²ØØÙòòòøøøØØؼ¼¼èèéëëì999ÒÒӕ•–‚‚‚ÕÕ֒’’ÀÀÀfffÌÌÍÿÿÿ!ù,ëFÿ@‚pH,È¤rÉl:ŸÐ¨tJ­Z¯Ø¬vËíz³¬WkL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿx/1…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡š-ƒ¢¦§¨©ª«¬­®¯°±Š¤„²¶·¸¹º»¼½¾…´¿ÂÃÄÅÆÇȟÁ‰1ÉÓÔÕÖ×ؗ˅/ßÒҏÙçèéêë¢Û1/æ1/ìûüýþìÛ,ˆ9 ބb´xáLË|“ƒƒ{12¼È a¿ CŠdµÍ›GC4'1†· *Úc°ÃBšǍÜɳ§ÏÿGÛZò¦a ú¼ð(@ŒZ€¸!ÞÏ«X³ŠÜæÁ¡‰ÔìŅ ŠÛàuªÖ·pãfÛ¦6€ 1^•˜^ -H (Ñًw¾Ð)·±ãÇ»Üe8s @ Uí^Œàu¡>Žf3l¹´éÓ«Ü¡^ͺõ/Õ®c˞ºíÛ¸ss‚­»·ï߇xN\¶ðâȓC†=óçУK¿ã4SóéسkßΧú,Û£rO¾¼ù¤3 6Ͼ½{@èÁÀX¹Ï1šèÛNJÑüúûíÔ&úx_zßÕB€ÄL`TD(á„Vhá…f(áxÅÿ‚—ˆŒƒjhâ‰(ZÈ¡‡W ˜ÈÈЧW v5cã8æ¨ãŽ<öhc @ÓO.Z"b12j@£L6éäŽ@ Ù"ˆˆÀ˜Î肀pðÌ4 Å¢€TVr¤!X~‰Ë–]ª‰L˜œ(x†œÉÀE‡"㐐ܩ›Ô´ðŸ#if}w~£'p‰$~: „nU¦!V2Ø3'yb–QLð@Bç„™ùÕ·é<Ÿ€7•."*©Ù˜Ê“¡˜ÒYș<Àb£fyÁ\àP!<< PÄ4AU’ «Ž¡ª^}½þêÂkl-É.»˜³ñD[ÿç ±*bm:Øv®ÀèÙU „ÀˆI@ÖC<Ȑ@tF?g `EÒ¢êD£-õåKÚ¾ýþ+äBl0ÂñË¢Còúq:zi½ Ö ¶ ¥DìÔ#Á3ÑG‘C@n¤Y†<´#ûz—NÑ*§šÌȼÍ6ãÌPÃ<¿ôspý€Ñè méœ-ïÊ FR-¦9+€=ìæõ@õk֎XÀ`$šÒ¡6´‚D¯$gB¶Dœ}¯U1¬]UL9Å}“!Þô͈ݘä-Êޖ™´öɁ8@U›Ã±!àÁvÅ$Ô®A¢¡Þ8Uÿi Åú:"}}#Ï$ݍ`ê"êæòyè ‘ÞtQÞ¥þë3\˖z5óÈìCu{Qº‡mH$Äóyüל‹d‡áÕÍ7de<Õ1 Ѥ‰ƒuɋȖ!BÂŀd‰Ø!ꁘ œŠ˜sľ"p±/y›`äç ½¸¤eøSÛþú7Ž|I¯,­' "BÜ8Ì]8‰¢‚‡ðÕ_Ô9áÝ"lkûWÃD#=|ÑÀ:U¡ NðŠþ^E² núR.¼0€‹§²Ù¾Â5ü-Ó=¸Šшñ±^”ÈDÿbŽQL\¨X¸"b±x[ìbâÀ¨Â1b;¬R…!>‘±­ ÉÇ÷WŠÜÏ,òÐÈV—–O [AH“ôˆFh¢ƒˆ9¯•·¶h$gù(I„’f9<$I{pR- ¥(RJ‰ Š %œEþB|ÁÖ(Ù%ÊæÏð‹æ‡k6]Á{Áª2eZÓ™1˜*—ÙJ¥=3Ñܚ¨)†O^3›/Øfïá͔€î\1ç Ê9s":Ü*Ë؏¿eªâ[ˆ¤±˜.äß°^Y¸6då£õÌZ=4…æE'”‘ž2ÉP~œÿiÌEDõBQ‰4¤„ÊéÑÑ|£©^JªÌó"¥F]éQ[º‡:Ó$/B‘µ]Ì#|A@¹ÆWD"j #‰3i!e¦)q =։:6ԕh„¥,¢º®P5qúÂêF´ª,®jug`õŠRÉjÒ³¦u_Rj^ÜêRW>”øêbçR™ð`™`Û`÷ Ö%OØTªF°iÒD‰áŠ=•h-ÙÎm #²‰ø^*{PŒb6YßàSA:ëEÐvA£}†2Mû—”ª–nAÝ'×X$iš:•1@°€ª.t³”yÀCÝE“wÊIÝéBî̤ÿDLqñÜCD—¼ ü®Ú°;<ùº—»æ­xó›¸ñò7¼… –rÉÜaŒalcÝù‹¯#Ánf…‘¾ª#èM/ðšë\ §Ã[.38‹ D@RÖ01ŠÍW˜’*NGŒ#œ« #+NFüV ÇçØñ­ûTalIL-FDb#½GNrƒÀd³lÄÇàÀÛhØ g‰â‹öÈñ?^úˆõòB˂…—CæšÉ©}X>`’…a>\à~Èì§äcbÌùm°3žû gÄ©6úÐ+?d`LDjq™ŸŒ‹r2š}x´Vç«ìVʳ!³#ÿÌ’O‡Óˆ 5H(CiԈºªþ«OMäD÷d·ßul^͈Xû× ú ª„x`ôd½áõ"|Ýc+j8ÃvY‹pJ·dKzÔ­NÇEAzíÖD[l?Y[Tî܂‹@7ÊV³Ù!n áÙÜ®u§oå¡þÐ$Þ}.T½Ósoß|û^Ù^GºY3ðT\wµ¼ ¾énïÚáË>¸¶!îí…;+ ?MÆÁqŠÜâÒîxq6ð†äÿÐÉóÝ’/å%9­Y>ä•Ã™á2‡¶Çq®ò™ßüâ-ß·ÚvþršûMè‰#úcþ½îu´›Üðö·ÒSΓ§¿;ŸøþyÈïCÿí©;†äMxׁÃt‰gÃÙy"»×þ´#[7eÇ °uí°›s×9Øæí“YëݵXñ»Ú÷Îs]lÇ!3ڎ¡Ïa÷^ž~ÜYü\`ÎöSˆA;ƒá’½ö»{j;™=ݯw^ˆ/hW*XÉb£Çâô¨H=,Xßc­S]¦¯X³+h¿`Àïö§Ð}+xßTÊ{¾ÀßñÒyˆŽdù7¾óE}„7ßôϽ5JÿûìsÞõ°H>;ª?qÂ]Œ(§˜¡¿s_©xâ•<%ȏŽÆc_VYšDû‘ÅíÊôÇxÒw³l‘’µltcZ¤ÅªW 8yà÷ ÿÀ·S’€€e¶€¾•88ÚW ܇~þa€hSt£M÷RFµ ˆ ö×}#ø)˜‚‚Õ±‚šÐ‚¤7€0X€FÃðGÐÀ/Çr:2âS‚r‚E7ñ;)5\*xDuöB28)×׃/b€@¨ò4P„Fq„ ¡AKˆ MxH…P‘öa‚Š ƒÛǃ"èƒãƒFq0Å1¢²Ax!F¦JÅäYkƒÓ³Em0ÿÔþT‡Y˜ /˜‡]èq0PP|ˆ 1ˆPÄ/b•8‹èE2ôˆ°â63J•˜@—ˆ !ˆ{1hñ UÁÿ»¨Qc+jã(„ XÐA^q>ŠSDldIÞ0v„…ßç{šX%Áö‹½ø‹-Œ±3Œš•Šó€Œ'…W÷0Ry጗ìÔz¶s\hÞù$Ï°1ӍóIÅXm‚3ʈæhT±!–8ôŽX¤Õ‹ôŒ÷x*ùà؏¤ñåÈFã0r…,e"Vx¸X€ƒÖ1|ˆŠ2#„ ˆñóhzQaûˆ ©÷*FaN‘,ˆFE@ãVv‚[XX3’xˆ2q( =AˆA䒩“µsŽ5É:/1Ž À“µx ·ˆ Èm qy4?`‘’FÑ;Qÿ…ó’è¤Aé‘„à‹f‡:Qn4Ycö“!م@õ•`XDJqГ» f£–Ŗ…à–‰ó-r‰)TÅP=(x˜—–ð Zõv¼™Z8® ~`™HA š‰‰“É•Öñ6с¸0š¶ˆ—¦‰ ¢2–ªy ¬©•¥ùC™€Âÿ µi ™H™” ›”Ø›³—•Ày›±ä}wə­à™†œÅ°•¸I}ÒI Áùš!ñ›Ó©œ²vÃÕ¹â) Ô¹œ—`7QV\$„ÖÑCžð€çù®Yž•@ŸîY8îG Í1ŸKQŸ’ÀØ靯‡ ‘,@â‚¢ ÿÒ³ ÝèédÓg Ú z†jTj :ž~B ±$bà-à!©ç ‚À ãPy‘…#Šžù©žF‚¢‹V¡,Ú. £2z•Zd£ £°³£"zŸ¾žß ›¸CPPP ÀWð€Y«# AdTÍ¡ƹTz(Z gj¤!ãf0Ã¥^ŠTö6.Á/j¦W¥kZc|§›3:$Uáô(l±61QR*èy=ŠŸÎÉ à „Úµp¨ÖƒZ‹Ú6ŽJ•,(¥ŽW¢Ø* ‘B¡SSS ۖQÚ ‘:¥?Z¥ž’ª¬ºªeRÿ¨©¢Ê Tš œð%æh¨F‘¨µ JÚ󪜫£:©«P©DC{‘©ÇŠMB¡¬Ñã«ze )¨™€fa;J(*zZ@ Â,Ú«°ú«‘1«Âº âê=åÚ+~¡Qª³ëʬ¡Ú­ QdÂy $r•Ü`.ú 2 "0AòÙ®þWmjB°Ed°E„°*¤°”È" Û¬îjx¤Ú™ÌɎ ”þà¬À²Ï9²µW²Û(û®æ·u& ³› ä ¤«v³¸¬&jëbû1 ²3{{\ù$JÛ#- 7²P#K«´ŽØœÔ(SS›µ7Ò´OµZû$UK²y~¹"ÿf+!ԆQ¢YÔg«!ÿi}Ъ ok¶i ¶8å¶u{!q[~íXyÖÀ¢8 ­ÚY ¨ps› „ R†Km]òpG뎅‚Sç¶/ õ'Ư e¹‰€¹¥¹’¸Ç§cj;‚Š²~Ewµ"ÑA8ˆ5©j*«W4,²µõ`6tUq‹› µÛA\¶@àðU»º ¨ÿp'€ÁZŠðŠZ6›‘³ý ¼Ì›KŒ½ƒ2ºÇû­þ@0÷ѼCZ÷2*uǹ뾪#¾wD¾`¾¼Kº­«C(¼‡°%<d«A½ì$cÂö»@N4ú«¸òû|bˆ°VpnA³ÿ€ë²üÀ€ÂÀŒàÀ[³¿³;¸4ó ؒ¸_‡¾ŒÛÁžðÁܽd Û ‘büËx+ü -\>{ [Re­BeÅÛs|4$µÃ—P»@i“+¸ÃÀc¨º£àYK'ÂԀĢ{ ‚À&wÀéË?ž°hjƒöîG=\+XÜ Zœ\ìÅïÆcK³èð4÷Ùàr<Çtì ðPÇz¼Ç|ÜÇ~üǀȂLÇàÄÈàÆÊÇ~|Çy<ȎüȐɁ\ÈE\º¬À¼Ã“iê-à0ðÉ Ê0P` Ê0pʨ¼Ê¬ÜÊ®üÊ°˲ì†Ì ˜|¿š ÿüʤlʨ¬Ê²ÌÂ<ÌÄÜÊ´\É֐’¥ˆ’Ó » Ë ðÊ@Å|Í؜ÍÆ\Ë» ÌìÉÐ,ÍÔlÍÚ|ÎèLÌÇlÅÓ°I(±Y¡ðÌ°|ðÉ°é¼ÏüìÊëÆÅàΉ Ïá,ËôlÏø¬Ïý¼Ð ýÏkŒ´Çpôp»[в\°  ðÍÐ Î¡Õ ÑÝPÑÊ Î±ŒÑÍÑÒ0­Í#-aÈ[ £eb͂ ò,Ë`.ð æÓB=Ì3­^–¬ 7í¶JŒ ;Ë=ýÓx<ÔRÌEí­)l )ÕÌñ¬ÒÁÍß`÷<Õb½Íÿ½K›¥Õ-Ì^ý`=ÖnÊUý¯¶f ÀƏ[=Ì` ÕoÝן×; uíu@ÁÕ±œ×{í×}׏…ÕÔ¶y¦ÐÔ®¬@m ֊-ր-´Ó€Tñ±’Ýʔm٘ÙRÍ؋$džg چíÊ0p·´]Û¶}Û/àÐ PÚ1½Ù“&Ø«-ŸËÚ¯Ýʱ=Û¸½ÜÌ}·ºÍÛ¾ Ó¨mcÍ]ÝÖ}Ý×í0ÇÍÊpààí ÐÞæmÞ&Ò°P´Ñ ÒÀm“…Ýô]ßö ž¡ÍÝÞmÞã]Þç}ÞéÍÐëÝÞïÝÐ<ø¦=Õø½Ý¢|ÿ m ð>á^á~á>@* §½…žàC½à±ìàŽá(žâ®áîáC=ݝâ"Ó$ÎË @Ø  ¶/ðâ >ãB]ã®\7î :N¬ÐãB ã<'ã@ÒBÞÊàD»€gÁ>Î`Nþä å¬<å¿`嘂åK~à\Ò^ŽÊàa»PòrÎÏñ k:±åg¾Ïi.Êk¾Ô­àæ<õq¾ÏLtv~çèœç¡Œ8 ðv0Í¿ýã†Þψʊþ ž^æȬ‚¬ÜrÜý.Ë `AÝʐÛÔ êèÄ\é0 ä h•ÿÂc€ÁçV&-@æÒ-é¨ ê. êŸLêÁ|ê©ÎÊ«ÎÕàê°>̲Në¼~ë«ëA b~åœnŅl-zÝãÈ.ËÊËÍÊ?½âþÉ °ì×,ë ÀáÇ·!¦JØ AqM Ðíùíá>îà^ê°|îýìnîïÅ,ïô®(ö~>ހÃÖÈïeÿ非¬Œì´ŽåÈ>÷<JŽòŸ<§\ðÑ©¬Ê ðò+ÏêŸl }ÏÀðJžÊíòpaMó«,ë p*…-Îë^tˆŠD“í’P‹èï{ïá#_ð0`ò[Ÿò)ßòDóÿŸ<ó­ð0€óŸ¬ó<Êðó&/ô+ó¢lôH?0ŸÈ~M™Ãõ¶{Tìõ£üî  ×`/ ô„Oäßàé>z½økåfßÑðѕý [?ùàòxü,?ùÀʕNíGU «P\ Ò°KP›ED… 3±vs]ÑBHƒd”­/z=ßÂ>÷^„oøˆ_ŠÏøàøÒù“ÿìeù6ïҙÿɛà’ÿ Ÿ¿ê úôü ¥ʧO¾B±ú·ïúï`±§p„D¶Ï¥Y¤û_ÄûòI‹üUÂ[/ؐ8|%\‹Wv,4^ÊË5u@ÿ…€ 3$˜‚¬Tp]ăáõ¢Ãï3Ê5P ýP4ÆZ[\\úü`^Z.^,bZ^b c&,,^$#"6"cB#/^6b[0% /ҁƒ‹\w …~’–š褨¬°´Ð¼ÀÄÈÌ´‡ÖÚޚⶩíðôø_Œ#'+W5ß;?CG•:•ªÅªV¯bͪu+“¥ Èz “8q1d–¼Û¥,P3wP`b†¶ (¼(0NÀ*ºˆKÐæŀpCž°aò"N8ž\ÞÀÔ£ÄW†^0—(f Åøÿðbƒ%\›Z{á(C$$ z0Á*«S«@U2ÕpÔ]-ÊQ”»ÈâE»82ö¤H8%»œL¹’MK40‹˜ÙÆfS9£ñìë§Bu÷6éRċžÞ“Jµ,¿Y™qõ V,Yƒg1¥±P[dpçææömFcyQí=GD²¶” 0 Qàâ4 ^@ ’`óÆE‰LI#ºôîÚ /@äbÀf@_C;cæ‚òD44Í)é>¬§P9ºDóÝÖ\˜P[eŸ}4‘o£át›«®»ìÎ#?$3ª§.ŽKn 朣¢»éª«é¦ìºà.º1¢ïñyÏ(¼"Ho)öÿNT†øîd’A®zµü¬âÇ²Äd@\ D¤hAy|Ûh™àœA²¸. {Á€ %´ ºD0À6®ƒfRÀ 1gtC‰Âñ¤ÛLšxË% æÚཨ ^˜€ƒ8@`ªÓðóS Ë? a + €¤¡ Lf$s[’Ác ӨòÊ,·ìòKÅÄ$ó¦Ð|AMØô’‚7ãü²NOƒ¤<-ٓ&?M-ôÐDÝÑQH%]æ5BV¹4S"95òSP嵐šLæÉ‹ÉuàÊm†¨XÉÝÇÿÀ‚ 8 ÝwapA€Þà`|àò²{ñ—1Š(à…ù»   @:ù;± vØhi£EFµZƔ6ªšôÚ҄ª¡£ŽAÜ`ÄÕ܎€Q7Ý  þ"Þyë˜á}ûý7`¥+:˜‚„~¢áò ~BbŠ‰°cš4æ¸ã!y‘K提”/Ö±Q—iŠÙZ+å'•›íÒyç_zÎ¥\¼Î·_+÷.\.¯C[lAæ¥'c`€¥A€H3±œ¬Ó(GÊ?d‚Ë5ate˜À”Íq6FoÉèÛç`up‚aÏÝÄ3{ìÆiz¼ÉC¯üòÑÿ=ß¼xÏA§üôÒO$õՙÉ[w¾‰õ»uÚõ¨ëÁ_ñΓ_ä󧂫š]}õ5hÁ”¤‡ÿ¢ ¿àìg/Õ{Ëì_G“‰µó!Ëé[ßïÒ¾÷G~È _ÿîwrmO âswô„åEíQ‘ì  ‰:䌁„£ª`’.ˆAÃi°E|K<;ü…#,¡²€s BPvüMàd˜DŠ´î3S° T‚‡U¼KS¸Â뵐A/Tâ̓'êé3E˜¢Ñh$îbˆý+âßNX;0ÎqE»ˆÇ é±®N¥1Ð€]4 EÝqñŠH¤ÿã!·wÇq!¢~ðÙ#­èG@ 2wo¤ !9ÇíÝ&ŠŽ„ä' b—õ¸q‡.Äd&¿¸Iõtr4ú$C)AVVFtRí¨°0€µÁBºÀ¼b§„(('†sq€ÐƜ&øl”‹HÀæî‚ ´ÀÊz¥Üu‘ðµ‹|é;ûæÈF*Û¯#ú{‹ÿÞ&ÀöîϺ·»²(¹ h —x"êBá ð1C¹°øx¤]ä(ØM˦¦({‰ Ò€‘‰ƒ¤Øút–$fRp߀âsˆâj$à ŒÆï0cO‰“ÊÈ?N²Ý@ä:#9ÈD`¨8¼dëÀ ʄ¶•Õº„+cô/a|m—»ˆŸ²ˆ™ÌâÀ™O‘æ¬Àn¶q-—êŊ½)d~jÊIÌÛþ˜;Û-Âf:hWÿ[ÇՁ¦I–ÁLHwt¾˜ÄÄL(ú‡¿‘xTšmÖfY.–‡¢î©W}Tc´Ô7õaýäò̺&µ®íi`ñ:Å¿öV áˆb·àØ£y¤%j¼MP_RŽE`B&ª  <ÙhJJ  Î}÷{ Žq5¿Æ@'Û´^ajÓ pÐs’$ÜËÎ5ƒ¦B[ÿˆy«Äºå€ùÖñfáI Yïì<&ßLÁ‹póûåဵ"žŒ2‡áp¸«#®p›Ë&¶KÆ#·qw¼ ‡q$B>re—ôÍê uœ¹@“4(†&¸I•ÔÄõ6xÝàb¥‰ªÚÿ팭ã!¢?ÚèÀ-¦Â×VÄm"¿€R ±"¯p_§-þé«0Z¿ÌbÝ°?¾ëá`ƒÖÍ×v˜P¡lg‚«;O“¸kÙ½‰Ÿ»ÝñNTFñQ~œˆp†F *B~×Ä[„èWœêÔ?°…×`X.€¿GNȀ'Pæý"þ6.•÷âuýøÒ¾ñ‹N›ì_MÊ/óÏ@ dd iúNÏö€jT°¯ ´Ï¸ÏûÎ#üƏÊïü*ÔïÒ¦N=Üïönãê•dÿÈËô ¨.(Ÿâè"ÚHñà,E‚H°XL‘AYǐáßïsJfP‰j¶fäÝvÐg°ˆ"J¸P®›dpçgɕ’–°dš°pn p¢P ¯‡ ƒ ¯0å\p ÷†›ì.ÎÀp um Ë ×H ™I‚ðuÚPwÄ𠀊âP}À†ŽA‚Ï› óPߐýð}&®·hÞþ)þÀH Àhéâ ±#¬§åð 1Si7±Õç®ð°Ÿ(‘¸Pa<`1eqi±ÇæÄuqeQý R Prpþ^‘•qÿ™ñgÑ‹…ÑgˆñÀ¹°yÐw¼ñÁ1}§ı͑cLÑàI.A¾Û@p‡,€û–%º"àݎƒÔPJîR Éq ÒwÒQúرPN_@¯©Ó'ðñ*ø‘ô‰½°“¡ Ȑ#P،QP& >!!>‰Pdf5"22#i 9’Qˆä&‘êD/úÃ$QÒT’XÒZ\rYbòfÒ5²u2ût²úÜAy~òP’5FhYÒ'ÊO)êQ)²2rÂ/)3 ärá(áM*ð£Ònæ0*° ¨²$­òRãR’ÒrNc[ á!çÃ?ºBðdAÌN²ürrR&€(38àŽApg-C( ;±1=²-ñ*h&3.g:âpS3a¯3Yì3 E>D“4â4‘A5™R1]‘#¿æbd³Ä€¡€„güc7,àP¦‰ÅL!Z!Å&å7±$ ӐR'›se3.¥3…¨Ó¬3°S;Ŭ;¿³#ÞÆ3Ê39p1«q?Ôæ9K*€=닊@áÒæ3d ‚ÅL&<ÃÓuð ²Q†þ‘TÞò O ÿÔTAUŒAÍìAÕFÌ&ô\:ô !CÔê‚PM4éž3.-æBM'8€T’PàQÔLÈB)žEQÞáP2a¬©Bw!¾È5ã°F/àF;#GùiGá$àGƒ4)ˆtӌ4rLQ”tM›ôI;TJwJ5´)™ 2)'–©-S/¦fÈ¢1@Ó‘&BeÞa[Ú )ä6€öj#.ª®5;´ ÙÍ0¥=¯°Oÿô<•*µ Õµ µmPÆdJ !Ra(eT@oò¨ 15¯¯{Ít2aHá¶<sË$“3ÿ ?%`$¬t}°´qÕK…aW/b|•¾GX¥‡X-ÇXEYñBY™ÕY+µ7fôV9ÕCƒËbHnFSùJfªNmR]Cô‰„Á]ãkYp^¥§^cÔm$×5“ЂÑ@7 /`ViÕRÛó`15¸6_kÃa!–5ѵ`”b;Õb¡ã]£2 Etl%‰6Ôc!d“0aGcMvsäK9v\@O]vV­.•#?À"`"Àbk2ucET(àg«1h‡ŠV‰ºÐ)urZÛÓh“ëxÔgHÀÀ6lÅvlɶlÃ6M$àWìiárgY°g·¶kGÿåkÍönñölÓvm¿¨jï_1VnñM.æp7qwq×Vs`C1iWk·p —q17s×qÁÈo£Õ±–OµVö¯tM÷tQ7uUwuK·˜žU}>×Cáv¤F÷2X÷vq7wO×uÏgÓÕ`•VnqWv97_…wxQÉsagרjWy©xyðjŸ÷•’Wzéˆy'6x£W{;wgc×y½|•—{%yÖ&x|¢ï TÄ&&Îÿp‚÷ ÷J›S¯”ÖwÚ÷zÞ×~…o~ p Ìó<•³z7DÓ.¯Js'¬°C2ø¤ª$ BoìÍÉ^7òÿ·S÷’ø¯§_Ø`¥p­‚I¤ 28R‚ƒ{×römË7¨C 87¾À1(˜/ÔɁGĆÉÄ©½:X ?øeC–‚ë†Kâzô­˜côž,àá„aˆÉ ˆéfeøw?¶†WdÄfâ ¸ ` f*<.C ”Ì >Ævy8Êfa&K2 …/ãD‚ÏŒ-#×˜/HäSŠ¬Ï专¨w#ixr…Œ‹Ñ8 ¹yìã¸œ&x8$ãŽã ã`)f¼þøŒCÙ¸ß‘5ùÔx×‘ƒAˆO¤Ð ì`ç„8 €ª @:ø»ªŽÛD™¬ÿD2 @˜|aÇ"k2p™/ty¢xÙJ ˜…ù w‘­vs5¸hY—¡ÙJry—{ùš+ ˜›@›ýl˜þÂKYˆã`™Õ®¢x ‡© š ʜ­ù—Ó9›‰Ùз‘ÕW"Âj¦ÊšãÏ`@;(LˆçÄáŽ@úŒÙKÐÀV"¤Æĝ99CÚ¡U¢Ñd¦&{î5– ZÚÐ:CêD¤ €¤%šÑp"L¸¦¼j‚ 0ú4š ª£]¤G¤¡©à¡¿¤¦£ÓNÇWŘikb¢wjš$ 9 `—⊹(,fÃìŠÇäî1ÆZ ¤ˆ'¤æ&¬«Od«Çz7R:ŒeÿY"Õ/>ãù¢aªÀ‡äéDF¾äéÖ§\=åi<š2@ðN¨Û㗼~`W.f2àæW]ç_z¾Eèa~è%b Š^ J!éÕå™”*C-€PÄá©þ>K 4 š4*绞‡¤IìÉÿ£ìwæìRíq¾í¶âÀÜEèå~.fZ ”>-ñÞ@÷þúþïa'ð¿ð¹þðýýØ ˜m–ñ G ÀàØOòu²ò!àò1g4Ÿó=A{—jV€ìK?7 BàóW_]öc_.f¿öUÿöai©pc÷í'4~ø=tc‰ßpŒé‘_„Cm–ÿz|®lÿùã¤ús§ú¯ûy(ÖÏã8—û ǁ ¾üwðîÊßüwýÕÿøÙÿä¯Na€ôá–‚¬;"‘­V²™,£Ò)µj½b³Ú+Àéý" áRÀÒê5»í~Ããÿò9Ý­p ‰ÆïüÜ fuµ¼8‰¥ @,PÕQVZ^Ê P,@L2ùµ¸œ¢¦ª®²¶º¾ÂÆ® ˆŽŽ2Â8BJböúþÆirzªíyõٖÊ.37;»Òú!*6áªUl¾PTƒÇ` ¼DV´;!¶¸„ÃÇ«¹ÔڂY§a/hs{ËÿÿG¡Ü¹t¡ì¹¨Ð=i‰xS ‚ Ìapá`@…aàÀ†}LUèøF]vÒÞ}Œ9§¡=?øÖL¬xqAƍ*eÊ 9²ä‹“.RÂa™Äå!˜@Ÿ²¡ÉçaµˆsB6¨¸Ïœ§ ðõÍ°ÿ§ غÀTŽu”*©×t,]Rkz¹)q@Ö´/¸zuVlÝ5eœõËÕE۟rà’’ËÇia™w×Q}bõRHÄ.–ù«MiUÀ¢N­zuꑩH“-dÛW·½ Ç`:¹òÓËx5÷ê| tÑ°M¥:ÍzùrרŽË&M¡¶cK¸u£Ìۣ陵Ãl–—ZèãæÏ£Ÿž*õÂ뒳o·üþw ½áƧ*~ÿyõ¨Ø+äBÚÅPwJ|w„}2XÌAÉØ <þ¶ „ á…ÎGJ‚õ…·aƒ¶¡ˆ¿Pˆ—…'FâK,NØan®ãX.Îeã7)ÖT£Ž@á¸ÿۏ(Ê8 DCn$|Hö£=>2Ùރ%F‰IŠFVUe]J®c¢–p8i ”_ÆÃeK^’Ùƕ4†˜¦Gf.E`gO•E˜,§§îÂêM{õ5Օb ÿüìµß޲ʴšRξS-@ðÞfîÐæ |%É·± ÖÂ&Éãiœ”€­E¯EZù± ~i‹÷ô¦«Ù`|/øùd•¸IÌ}Ëúܒâ·@úIGejÈßþ¸â?íÙËȔ÷AÀÜ6 dàùX¥9WI°bìN$!5ó5M0˜Ò`g à4ÿ›‡ðöÑ]™O„¥zÜÖNs5òoXgñÂÃ_À$6< Çô&’›9Ň#{žµw€‹´ÅF´ð”ˆ6Æ-À‰“c¡1.C]ÑY¼WQ0àÚ%,÷c£Èòa’ kD(ɼö‚‰|Mlö²–Úæøÿ¿'gU´b1±G“øñ[Å $ yC±Æaäâ÷È Dòq~«$͇ÉAK}0ì$òfx¦ ©¤hØ"Ò&ñÈKëø2NÀLƒ0wôBN^e˜‹ƒ¦Ù†°°(‹ ‚ÀZÌQ+AðíÉ4+QM:`óDÚ,7 òÍKܑsoPlˆQJ:ˆ œh†Y™uÆç§ð'1‹É>8Г4öÄåò9‡}* Ÿñèvz”pÄó oð•)ŠÆJP@`rا?ƒHrKÉT”#&N8p”{÷œCHõi¾ žŠ'M)](ª¬Œ‚¦‹r†0æ[ˆ¼ƒÛìb8ÿŒä—ÒˆJ@°^e 9ñ‡0u5Š45n̬Ѐw„\ji8¿`! UeQRi—¥2 ™UT§86¢eÈ*H(ÂU¯Â¬éªÀX'¡³¢• >}Pßú¸¢ñ­•ÚÇÍ @«&þo"€Y…ÐH>MmÞpÀEˆIH´,-'9£EFF™M–èÚ&ë)—º5YĬ¯N;Ξî³q íhKKÀ‚ä"Xmk¥úµ}8J¶ <‰рÛL†­ŒƒoUYáîʝWXÓ²B,)VÕ|QI ºoìóÅ1š%6¹”ƒÞP€ãÎ ¼ίÿRñ"¨Ê»'àO¨¦]@HZÆޏu ¾,œoêë€û&Ò^û}âo›µr˜].0#qø8 (øZ½]i¨ØªKh®!¦nÑ`·W˜„ÀaÓr+䛆Îg+1ùºE¾3n͋Ó h6cµjÈ}Þ%tœ·wôj?.@ÿGdsðjŸêR²%›L¬'+y‚™òãªÌÐÓØ\Z~¦1»ŒKgínŽÊ›ù€Ç •tÍ¿ûT 'ú{âG’ÏZÑøºø³¡Æškp°›¶Œã^ýùqþ4H²UhóõR4’K ƒF“Ï¿(Žô+)}àÇa,šv–©´ç÷9Ç¡ÿsÖte;»DùÀ iËa‘¬‰r6qÒ Âi»9·c3‡•ã%ž&%Ï;ž§ƒ jʚÆÖk²ÿÇì8û"GΞ_ށÛX¶Ûƚ¶'·•wxÛ"tàtšÎ‹P²ªáD@ è²¬üñ©Y¡k05Žv¬þ(ÀÄAUu9ÅgE¸È‰ZÖ£D–×Ç(׸;WnyÚá³"+ÃÙxÓ@ü[?jÅï WÖ1ïøT¹ò‘O¢ä;9R#n4ý–Ï0ïkm{¢ œĽ쵟ÈÝÖO«»,ÂzـåɧÛø;›VÒ`Ä(s0ø-hÿµAƒÊömèíË=;ÿ×eår©+¨ÇäûÊ‚œg >ñŠÍ×!øÁ#³ï|8üâ+oùXDCíë«O«!?ðøÒýîñÜ{áÓøȯ;–ž@|rF‹=Úø€‡Ã¦3¶éŒJ5«tö¢aïËóò¥Ñøòû~õь>j8F}XŸ,ƒ!'Xè[—¿axŸƒø)Á,ôOó…ÁóÍC½¨Ò_Ì°ÌÔ5UÙ©¤Aò—ÃØUqØRÆݟ¬ÊŸÏç ’ŸúɁ `•-`YܙŸ‰NŽh\ ÿ:ÒŠFâÄâD^Yá‰ào(_Ö*ˆâ"‘O‡yCúÙ;”øŽXOqÙ ­°Y{ÍË®)’`€­ÈÝáRœßªNŠ–f ÔiPΊŒŽL.Ý9• ªÁú_áŠ!° èŠÂœáiÐÁ슝ðôOTJÓøN TZbÂ8ÌeíCå¡ö!ö¡êa ZR.P!ÎÌê,b#jÃAâ#ª %ÎÌ%¾Cd¢$¢ëñà'ê!/ÎÈæ‘ 4 )¢!>Nä`Ϲ©ð8[qxƒ½Z,™YY #Û| ™Îÿ›î¢/®C‚£[á0NN1úŽ!#*n˜68cð8™4Y5²Á5^N¼<7b¡Ê…ã8~£?jÞ"ᰐ"l£î„Ù)#H0£êL·èÑR¡€ïT =¨¡ñý#@z"@öÈ@2ÙhÈW)ÚZBµØ9M½@ä°8ÀD¢ÔÒ­ÁEŠÏ¨md`udZ}¤?†$Pæž )®A:Pz‘ÆJÞOј¡"¤*¥Xv^ -¥¿H¨í?¶„8–_PŠä-aQŽâAZe L8¥%eØIå2dU*eaåNfËV¦Áÿ}!X‚£r^&\"å;4‘ÿH(N*"FQtD9Ñ¡MðŒ¶EѼoÁ‘ÕQÓäcmâOŽ#_†%9&&Jf&oNbÀbK8æ9óH&_<ŽeæÕdæ6rfzf_zeúe0J•fNÒ_LeË_,€g‘bQ:øNõÏº$ÀÚè ÐÍêܘê EgöchæFp†%qº#‘ØQšfrªs^âsfŠ*u.uv vj's§w‚Wíˆ'r%šçy(î#BZ»¤Ü7@(&@ü‘W/Š h&èÊAƒb„.ˆZB…’gW¨†~âp’áD¨‘ÿG¼¨%Ôøq¢¢è†ªg̵hĨBô(%Ìh‰¨yÞ¨eñí`y†f‘hŽ"©O*iX2éé“òÞoú┆¦“ZiÆʼn¢'ªh—^i”Š¤–¦'Ÿ^îa˜ à˜’©Gš)Hº©?r)™²©pÖ)úÁiœJ†Šéž‚ãvižf¨ ._Ÿú©—F˜nhª•j >ªw,袲 ê›"*/Fê“jjîe§ Ÿ_N€ `jÂQÀ¦ šŠä©¦ê¬¬ª¨¶i¥"ÈæÅœ€]ùé½X«ò)©~¢®òjœú*°~¥°úž_€Õ©@Àü*²&ª²ö¡ÿ³Bk—J+µšŸ£Úê/J Ìôä] <ÀL@;`+^¸ªyŠ¹îÞ¹¦ëº~+‘¶ëï}ˆ0ÀHÔ4^zJH˜à h€ Bä«Â†k1õë¿b@ÀæÁîÃÁ&l2,,Æ6,³~Áp€H?l„¸4ŒôìCl@\lf,»6lÝy,Ȋl¹jIÉrÓ  ¬Êú`ËÞ«­rì(L@´€D€tzÅiìh”EV`€*ÀpÀí%ÏZëËAÐmўÄÑچŽ,-I8-ÔJí΂«Ïî+ñ0@è‘Þ_œmÅü…öeت’€´€ÀÊ2ÕÒªÕâEÚ.ÁÿÚJ§Û*‡À‚ƒÜžBÓÖíÝæíޖªßb©”žmð¥mè -émt˜‡ÈãÇEüŐÞÓ.ÞB.¥â+àŠáåFhn•!Pý4è†è¾é’Þœ.¤.§–m¥þ¬N€ï/m̯ï.©äÎ)ëúcñ6oòné1oó>oð>êðn¯ô6êꂯվk'B¯‰†«÷JéùVQùöíø’/û ü†¯Ùâj‚ºï¨r/üv/ý’­øÚïËæo­0ÿ ¯ÿº«ÿ0ò©ï™"0Ëî¯G°+ð·Då0ë.pûZ°ׯônðün,/ø†ðÔzðÃï ÿoÿol;HÁò²p ‡¬ý…¤pÛª +/öÖp À ã°ohÓ)ë^ÿÅ€c0ñ Œí§G±û"3ñŸ) ƒ#À.éI€Ý’ž4ì<?ß~¢à°Sñ‡qŒqé±­¢±³qº±Ý1þz18Z@Wkúâ0Lo‹ÆÇñ82²Ïr"W#wo ƒãÛÙ.ã¬Hr@•!r#£&W'[­'G(‹² WêæþÅ*.Tâæ)$,ò,×rXârúb28æqîÚ+àöñû#üÅ1ë²/ó8óË&sh2óÿ L3 ߯yj±-Wê3?ó'v3ø‚³4‹ó‰~Hí±³D@´sûs?ûs@ßs>_ðæéÍå!tB+ôB3tC[ärÝ´CStE[ôEct,@´A.ÆêGçBD”Gƒtª€H+¨tI/êIûÞJ³tœºt@6LÇt—ÎôHßôGçtJ×ôNÇjOo’Muñ uA«tQcêQQ+µç1õ­&õSË4J5UW5GǀSÿƒþ=Åý]BMqX ÊÁX(H¬†–Dõopµ¶ùD¶\¢hTv±Ê_û¥fƒƒÒ!<@âEhM &Üv`€ÄK½À!bT嵯,X|\ƶUWmƒmï£\·Eqt#öö%ü6÷pg ÔÄáq¿Sg˜sƒsDŽlˆtÃ$®ˆn ØÔJ9JÇdË»HÓTâHŠ~S ʀvOP@q å‹{vÑ#F¢)ÖÊZ,ãMQ’Ð@Î6à#ºá R‰ÍÆfۃ{ÿ|ÿË|ÿká#~sLqx ˆP€Ãøï¸Ù¸-%øÒ1¸cøŽ#ºb„?Ž!–’iυ/¦†¿xvۇË_ˆ8<°·AC5ÞÏ°TÐ܁tNŠÈp9ÑMqµÝ(694öÞP’‰\6VðLXŽÔ N‡‰74’·Vû¥´QÛŸìèJÛ,`ýܓz mC"YË#°e ÿЦÀDå_L%•=ü¬¯fCJúù¼üI^¶£ÓÇÆÇ{ÇÃÆHOÈ/ÊÛOÈ5R|‹Ò«¼ÚRµRÏ÷`Í<¤½çiá¼Úp[V<±X=»{įû5\Oæã<ÂFœTîWGäЕü¾í¡Åýªœ™`é„ ÑÿKÖßcÎ&Шà;XK0ʬSfÑø<ÅQ¤ø½^K¯ƒ»‚Ð__Øæ;¬=_´#mäÝTM9Õ}kŠ~"¹Àì=ªG>m.7Gþ}¾~âW8.¦Mãg ,Ëë—CÓeFNNÆ¥µuÅÕåUöŽ %-žæîöNvP40sU\ƒøî­¶n÷ÜV—Ÿ§ /o=ï£geÆF¬ß@‚Ó4pá@« .\ä+ø‹“;Šð"^Ĉê`…«>̈é_°€ÚBžD™rÞHŠÂ,ª„Sæ*– D œ™SçÎ"5[~zÉSèЈ>;•JTéҁFÆÊTêTcN‘¾£šU뺉O]n•Õ›ÚœE›VíZ¶mݾ…Wî\ºuíÞś·^ÍêXð`… æÛîj'?†Yòdʕ-_ƜYófΝ=ÆÌÀ¯0Ð¥MŸFZõjÕ¢­-[ölÚµmßƝ[÷nÞ½}ÿœdYáōGž\ùræ͝‡ý\útêÕ­_Ǟ½vtíݽ^üxRÜɟGŸ^ýzöîÌ·‡_þ|úƱµÀŸ_ÿ~þýýÿ0@$°@D0Ad°A„0B '¤°Á;PKiҟ™ŸDšDPK/¯-AOEBPS/img/cluster_async.gifÞE!ºGIF89aöºÕ?õôô€€€ÀÀÀ¿¿¿@@@???÷ù™ïïŸßßßÏÏÏðððzzzààà___///¯¯¯OOOoooÐÐР  ```···000 ppp°°°PPP==={|LçéåäällBMM/ÖÕÕÇÆƹºrkjj™˜˜LLLš›_[[[‰‰‰---=>& \]9¨§§ÈÊ|ŠŒVØم©«i..ÿÿÿÿÿÿ!ù?,öºÿÀŸpH,È¤rÉl:ŸÐ¨ò±ðùØ,šÕr»ƒí,‡¿Ý2í§ÙXõÛÝ6ËëىGá“úÿ€‚ƒ„…†‡ˆ‰Š~ bV‘’“”•–—˜™š›œ ‹¢£¤¥¦§¨©¤!|ž¯°±²³´“ª¹º»¼½¾¿?µÄÅÆǯ ÀÌÍÎÏн>ÈÕÖ×Æ ÑÜÝÞßàIØãäå›áêëìí¦ÅXV gô‘— U°¼BÇG> ,Ü3ɝÇ#2PLB-zP3p‘R•pì¡ւ:!¸@²‡}XèáO“‚ Ç$êÜÉ3ÜÿœÄX†éÁ€Ì—ARJЧW¯,Ä¡Ç#Ub"¨©‰ã±P=Ê«+ÀbL øh᤾ lq9Ó@Í = Ü»À€@=0¨€a k*°À€¦¾~#!p9)¦W„õÁ´×`’g‰y Kº´éCŒ)ÈK@ „+ ``¡Š$àMiE«VW¨ª0}}OìC‚ßÅ5ç\’åW¬âH4AÕ ,ž zº¼ùóLR£`À¼€0…@€˜J-JB@ 1N PÕ€ ôXPðRb«iæ€6EƒV\§œU€¥s—Cÿz †xžÅÌ$Ák)è^à"~Vè7ÉdÈçb€…vҀÙàV$}¹h‰}Ýca].ê³!pó¡ˆPF2x!8Ùa>¬fÁœ•^q"|Ê=‡SŽ‘dÔsö%fJbÜeaZ€#‡M˓R*¨;Ȝ„݃%Mc8¡d‘B‘$zù€œ.ñ‡`$»QgÔ31 ¦ܓÀoJ‚tY}=Pà%HÌ ÐXhµ$0è­¸~C+C¼öJN®Àˌz¾k¬1Â&«¬*Äë쳝 °ì´Ô.Ò,´ØfkKµÜv+ȵچ - Þ–kîàŠ«ÿn±äžëî»?¸î¼¾¶ ï½ÝÒ«o½øöëí¾›c«¿O»kÀ#SðÂɦ›ðó0,q®_sBf¬ñÆwìñÇ i½J;ñɁVŒÌЦ–0Ç,óÌ4׌E(ï8ö¢ì³y*Ã×UWRpuMÏ?7MZеø&TE[ҟÒÕ0íôÖ=í\ g~V=‰`TgÍõÙd‘#iØbOrRK£-wOä¸ê¬žãÌvð1Ïí7D{st%´8dHÅ@k‘Ôù¶s7ºÈ@‹,`#¤¶„yÍߜ;µ,ô8‰/nTp§³<‰â\(E…V(p6×¾ÿÎç±°N‰îXAJ@>€ma…c àhÀé `l Þúê¡©~ÜÖ±M‹É¶wß î°ð.‰(žqbH:@© Ppðc¥ÝR‰tôdúõÔO¯Üéý³†Ö¼GÀ^€ïâÃ}À(ȇ¢$0AÿEï&Ë3Èâ–W§ òo|Õ³Q¥v7ºZ °€(d6h…2F ‡2Àh=ë1îµ ô=ëá£zØ]ÜRHÄ^xÍ,Ô $*°<ÍŠ@’¨¡ëŒ2;:)QzXôa ˜‰$:©ˆ`ÔÅ8’(Ã:%`6 pàýòçúèCŠÒ#Þ$`”6ÿ.uAԝ…(À0úc =°°øЖ‚Nìΰ•ÞÒÐA¤‰§Tҍ”%-…µV£o å"JX /¶Í¦¬…(W©ˆz"•§ôd&€£ß•­¬Ì¥!\Ù XÆò‡6©Ê F0‚ä喑àž.—ù^r—¿¼â%,gàš  De5fzÓÎÜ4™JÙ¹›è<€ €Ì~óDgWH™ ˆdúJ%L€Mä *À¦ 4''xt G,Ý,ÖÇ% $4j@™…)WcÍÜ ÿ è5IЃ[ºó ß äB•ÂÄތ'‘Wà¤##±€šÿö¤ öºXÂœ7@Ñy¯}¤Ì©,¬ç„,|fòAՉ‡o¡cü^Ã@‰–#H§N5zÍ0R@ ëèiՅ‡قw¸…Õ4$P|Pq´GXP “ÁÉ*:·º×¯6D¬a•gª † f+6j‘±GÎH. -ªB]_q(KØT«;ÅfOq X   è+¬ð %v§e¬RTjLbî›l'·T´«™ÍfG)¡ÌÎÂó³û`ÀL/ATŠÏR[p¨g°3©¼h}|˜äVÜ×>ZxðûÜknZ‰Ÿú6”À½„`÷ Í(€"üiÿO.U›C1 ÐÌp2ÈÄâ=Æ.±ÕL͙Î~²³»ß=hx-!;£²¼r`D1AÍÛfs›x½@€ *¼Ã6®‚ÍÑÆNœ·Ã,æ1/1š ó‚!Z4m#ÚMÐҌȬäL|âr( eø›| ›r 4þ¦2<ŽÀÉF!K²’—ü±ŒÎ%ò7Gh~ØìÊXÎ2Ì,L;)óˆ¦4céex #šã¤W¢\æo²b¸ûJóºnÑæƒ6€œdWB–:tŽÈÂ!Á0è.ZЋ4t¢%B/z}²2£%MÈG÷Ã҇®t£½iFO~îlÿ@j á¤Nµ©€êT `Õ­Võ©]ýêY»Ö´Æuª9° VçÚÖ²öõ­]jb×ZØÁŽu±CÍìg Ï͎v·ž-íjs‹ÚÖζ²°­ínçŠÛÞwˆð c;зºKóðšÐ@8ЀuÛÛ4hIKV}ï~‹åúî.üMð° %¨wÁ®“D€$g¸Ä!rð„OüâxÄ1í àã ¹ÈGNò’›üä(O9É; •»üå0ùɁÌñj`†uʹÎwÎóžûüç@ºÐ‡Nô¢ýèE§@ºk¾í<‹ùé]Y:ӅU§CýꄓúԁUÿu¬{Zß:®ºþõ²G]ìË"»Ùמu´7íp_]ØÝ(µÇî˜;Ý£d÷»¯=ï{Vßý^vÀþÛV'ü) ø[ ^ñXg|ãõxÈC]ò“—Råee¬î|Ä G€Çå¶a>óPÚ|±nÜÄ'9œèÒ$Ԓ  É& ØéQ"ÕûªM–’ŸbbÌÛêÄÎ%gIãí»¸á8ë÷§ñ=¯C!æÄä1}ÈZ^œ–À%DÎsÐT•Á|fSÑ~S얭ÝCÿ<ÒgÈò{#á,Ç%Gë(˜jÒ¤åb89’ðâ¡)ÃÑQk19¥Ç+î÷~åæ QÔ}ÿ !2~ÂøЍ“ˆ „ -t(ØÛ'. è€ø–xãpØc}5"$nòÿ÷Udҁ5èÓÀÆu(Ar#¨-)¨‚¤æÀò;0X&n‚øöe)ÑD #«AAâQ @)Á²'MHá2„D8FXü‘ÏA–B*Aƒ2q}±ƒ)w…&€A)2Q<²b%n„í÷|eghyEC†ƒØ…hˆƒˆ‰§pH°ˆŒˆ0ŽøˆßРüV”X‰º'ˆ˜ø ÐàøŸŠù$Š£è !p§jªÈ‚†H–èŠ5÷2׋ÿ¾ø‹!ç§oÐgÏ9_uU©ýG/ yq/iOéc©ƒ4’ÿ©BMˆZ Îa”-‰zaù€4Y/ey{,áµ'À‘—#Ù*I¢ŽL —™7—ÑW—%SU\à˜Xñ;bpÅqöä˜Å‘s#Áa øH~å•K –£¹cɊcXš§˜+ˆš—§š ǚ¥qš®‰-_9q²Y„ŒY›H钰´É›Îr›«ù›œÂi,Ä›Æùșœ¾²œ —›dñœÐɀÍéoÔi†»yÏ"·baÞYàIpâIˆÝYžÊ™ý–žŠ¸žìîyoðÉä9Ÿ×pžÚYŸìŸúY üùžþ¹ Ç0 öY êpsH÷ ¡ÿ:¡:¡Jç›QâqÚ¸¡Ú(Œð&rÐ:¢$Js“wŸ(„ ’8°‰¯¨(*( ¡`¢º °qEÐP-Ê 5úq7£N0£Qf FLƤ8Š н– 𤩠¤!Ö¤Xz6CEzm Z/ZMè¤MŠ¦àiêlª¦§P¦†¦pê4Zʤ=à¤67¦dñpNý¥NÐ¥ŠÐp¥P¥SŠ ~ ¨ýåƒ*7rz¦&Цӂ¤!¢üt;0=@zu&° ¦à£@*:Ê£¥ ©ØD#à©5ªhÓ¨*¨„êx|úo¶uMÿ.`*`L;°Q=p«…ð¢¤ê*z¬¥p·Å=à«ÅQÄÊ0¬zžÚ3pM²šv¹pSé¤=ª'°¨Š0cà£ôf ßÚO=€*à`åÊ5ÌzM7 * Sz%­ÜÚ-ªØ¤S70°ªz´8ÐuŠ¡ZEÁÚU{2ïšN3@·U¯ÛÖ­=°étQÙj°¢ o NЭ"{M°J4&»5-‹MâZ{u±¸Ú-‹¯4@:ÀSæZ PíŠC{=+±Ö´±šµ´'S³.ÛA;³É‚©èq¯Eñª«[Ó*Àÿ!¤†`¬¢Àµ7»=€³bË5={7›N›µ ÛÕz­$Q²Ûz/ÊfŠP¶g»Õz84Põ·vº«×$±\·ë-´¨:¶‰*¥¥j´hK—û¨‘z6ÕJ²éä¸T—·=1©­Z©)«²ª+(«¬»Q®+7¡›N™{©±û ³ða[:b Q I+µ‚p§"¦§sS»f©ÿ"Åðb¶d,¤€®êš_¦ƒ¼\º§Ð u«£–½š;(ZÛ €£½$ ``•ƒ í« £€RU“˜½Ë,ç =— gšÀ¿˜ O×xçË Gú+'¡)KN²À”°ÿ­ö¹H f 0 ‡WÀÑpÀB°ƒ)Àa㵿®±ì[¤…sFæX½C@ P82GÄãÀœp½JPd%£‡ÁРÁ? °¡e)VPZ"Yû‹€bŬÓV±µ—Ÿç a)KüšÓ =pjÀEDäàC{gÄÏ Á+@÷! ‹¥ÀÓcÇ"È:ñå6dî %\'®¢;œ <,÷†j´¦¦¢jäçÃD¼$‚Ñ"|€ÉÇ1*6¼D <-R&çóÂ-Ã0Ãëc ððjÿ!ÉBÀPŒéðȼ&gL̎\ ³&ÇÎ Çqå÷QÅüá#p³¿©“ÒÌ8ŠYñAŒ3;VPÅZ°%X´ fáÒ>éÀæ¡l— lOŠ©ö¹ ·¬¦£¶lŒÌäfØ⹀ã0Èè+ü J@Ӎôp;ÊÛ²¸°aýp-QüvpÇ¢Á@!0›P® Ö°IÚ2RNq¯ÖZ®ŠÞXb>p$ÈÜ`Á~Þ}dfþ£„Þd qlnÖà¿¿’ãk§ pèBK—o½ýpjíBß=°æ•în §žnç=@fméEØæ© 'ë é²ÀÆ;<åÿ±疰„Îagæ™NC éĬè^î֞êDèé춌éíêÕ ë‹  0cÓ …”b 8â ౙÅa òᘼ#iYró zÂC‘‚™ y rK°4Hþf®èRgælÄ ·æÑNÖQÚ3FèMÉjÎî£=ÐéÒþäbáÙ¡PåÖ[q"Up"PÏ-"·iÛò&I+,³%GcdFq4¶Ç^’Ý12!/IPÔ°Š´ëõ¾xôä¢`N ă@¢ñp¼Ö¢û>æ[®èšŽ¨Ñîç«êÅNÛÏn釮çŒþêb±ðÿÉÍj%îZ¬cdÝ(®Ð%5:¤òƒl tÝ3_!WÀÊÐ>Pq”}ðó‹f)I] ¶U˜aà¡îá˜ø¸7ßn‹O"UèŒO-à8@‹5ŠÞCšíœÌ»D¢ÉÞKOÃH֚®o}6ŒWðEà郞o—oÔ> 6ž :ŠÌPbòö+\24Ï?Àó60-ރ)$Ŀ•…Â#ÁNäã€=[¢ÄØ;(õ±…2ÿ[2^VPòÊÕÊU°Ê % _Ï毒9ß÷3Ãz¸84&ŽÞîüПÎï¡Ñ~Iå’Ùt>¡Ñd W- ›ÿÔvY¨ @‘^¤‘¬rk’3f†¾?íGÐÞ&½\éžß÷ó¯þ ›†–0:B>|| |* +{, |(|#37}$*MQM#{<.'S(|.gS R( %&,<†Üç!˜?Ð<èðÀ‡† ·$0 &š8M¨À $n¥*H¨0 R‚sD‚a€Äd[ÿ B4 VÍ體 ÀÞºÀ`(R8ù̅[€5°,¹ÃÖnÊ%Šï'™›ð''ߏ@øD&ÆУ0Àƒ‚—ñÒ#IƬùa°Bː<°S8à;7*#€H¼ZHÖ¯ùðá„?@¨F`‚ Â<]ûäHAoa Šf-^Ɂ[7ûD0aÂr¾+˜@`Õ™ºVÿttfªO Ðmö ›§¼•Ž±Ÿ%+ÕûSÄЩóÁ®–xƒ3ìžÆ`ã%€‡¤Ð¢Š‘˜Ì?72S¨2 ZÐB”( ¢0Ðb¡AŒÂµIìC—QLQÅT|ZÑÅJÿXÏ®@ *˜`®ª • ,hŠ®÷&è& mÌʔ¨yϨxD' $p„$B¨ÀÂÉ`ÄERРJƒ*TÓ ¥*ÊÀ­Ÿ*: PCªð@€*³Ä/õ쳉 ô¥@U,¸òŠ#@ï&NÑê¸ù.˜C%&RH+Á.à(…Ž(TÒI`SG~ ‹$¬ “~ø O?aõ#Vý¨-Ö=ºUW^à€ƒ6wõˆP³-¶ØI VÙe™]Ïf¡e46ÚBÕØm4ÙkÁ WÜÀƃê)[nÙmW+uá÷Ögå…Õ ‰êe¶ÿ8 5ß1@a} ×?:á=ˆ€à…wÕÀaˆ9úà ȸ2.Ä û¤‚â?虵4ààa“cÍ |Y$‚âiHŒ?de=EŽYŠ’}î¨×¬ V"xÕh'Î2Ã:hC¢¼¡2€êËÚY‘T“£/4øå’Vâ1¬nÀ ¨x€N:C@û!ÚÀç²Ê.@ƒÀh£ îlèW±ù¾š²;oî'ìe^ºEʖ\WÊ-èÞ €§îBب¸/ÃRôtE.à×®9TÃ62OƒÔpµš3ú á̬^ä‡ÊVÜ6ß~ íŒÿX³Å HïR·P½¢w q,]#pXÅ.6c„åÈ48¨ÕŽ[¸ƒ}H¿Z¨0åcÇÜ@Ëæ#´ðã(HCZÏ>9֞ãb­šøZ^Ä΃e˜žÜ,»é¯‡H` ÍÎDÃ|«¶<`ÃÄ*x”u|éØ3£Ï½5$²míµdk]Ëiw±Ë"hÎUÃÌp` w›ãA}€3JDŽ=€‡ì¬(›níLÊe¨D²¸ÿÑçJu Am¹¨ëî¢UøÈ@7WÛÎØ®ö¿z_ܑK³=8ÁFp¾!¸DÙ]°žÚÚ§'1™ð0Ïe€Å  &+'ñÄ×W‰÷Qc[Ï-öñ\03+˜Æ6¦Žõ¡ãWjÀ,¾Á ªPƒÀ§Lp”l²,ZHæŖ+™‘)ëÀ*¨ApÀbœÓO3† ˜KtµŒõ± A>y„íy¹p.ª :‚v îCNðãì =fñ Ùa"ïC€tbì¬^‡ëo¹á°z¦Æ| •–ã3!üܑÅp zIÊ´ÿŒÀÇO¶°G`hÖ¸™«nµjA^/X0Ç°:Ûñ| ³ºqamH ɐ?t €¡õðAñð¡ÅìØ`J5G¨ðI"X¬ ²¡]‡Tó<›§'Q7ªä€6tdÖ>ÖÁx@ƒ´8×°âu!Â̈́»T8÷ºÕ­š´›Z;0‚2è=|»k‹Gô³;åA gút`>ˆ÷1f|Ž]8ðÄÄÏ yÿpœ}p÷¬ÅrDv[ÒºrÙbQ܀ çd¢šEÔ@³Þɓm":GÄÌbà@#èA“]Ìæ+¶èÉûæÖwÃÜ®€¿ íä^´ÉxFì3¬Ðz'œePvÓó àÔ„Üàù“ÌBàn6AÓðë#s¹ ®ŕ͜zýf9+¨] ‡ç“Y¼ô€Rfq•‡Œe ?B 2~… Ò·ò1ßlmøč-Fþ²þÔ¼ô7ÒV8œ¤½ðx¬`¼Ü "s¿ÿCð - hh#|2ԍh¨àL`êfÈoó<‚Ǎł¬÷^ãßÐl.%G0 ðÿP0jö¤fÓ@É¥¸YpÖƧ€NÆÆ"H º(å«CÌù8"ŦLÍ`ìüv­é*.ï@;¯¸à‰m:G0Ü© +‘L •šg—¥¡ÀL ÏâAk”Ý&‚§LÝô€§D¢Â.,Ã6LW0p¸V¾pôdƒVÈPÍðÐp ðè. ´ËÀÄÿü`‰§ÔËA$3 1D ì"\q»*1_&‘ 1¿Œ·§=ÑY1DDq¯çQÑ#6ýZQY.QrX1÷ᥠmQUñwQ\p‘ñVfqitq!¡à‘ÿqåz›±ËJ±£±Íž‘«Q¦±@˜±‹Ñhº1ia#›ñƒÆű ”ñ ÔqÑÑgÞq›/I$cfñ±¯QòŠ çҐ ËñÁ!cŵodñ%r")²"-ò"12#5ò"FY†éÑ!2ææ©$Mò$£ ^ÀX²%]ò%a2&er&i²&m&E¤< î%}% rҏ‚21(ŽÂÁ]taˆm ` *¥r*©²*­ò*±2+µr+«ÒtR!ù)•r)›2 ‡²‹®öá²a,g4ID ’+é².íÿò.¯Ò+Ý,¥€-ÝRàÒ(ÏRÄÒ²º„/Fá/¹ a.ñò1!32§R/UñÛ("1ó&Ó0-YP<`23,@ºÉ1%35Us+)ó!G²Bs4IÓ4‹­3qå3 !#”d4@òNÓ*7€%W3*E †ó1[ó5• ÕtS6+¡7‘mó6³ @8œóLQS*e€z †³8/“Ó]“®3;+¶óô¦S Ó,ÿ Ø@ܸ³*K ^ V@*K`P @Å6* ´@K`*S*É3P *S@<TAºs6ÿ´@+ÔC7t2Îs9ùÒ ì?³S?ù>ãÓÁæS ¡ʃ=} øï ž²*Y 6 b *7<{b J z  d  àA´ 6 8§TH@D@D``At¤´ ÂTLÉTA{ÀPTHK`I{€¤2Ea+=Gu´x”>g”qS ö4-þëG©²Œ3@+TQQ B`NǔN{ P`LaÀR9´8/ôI»´D€œJ5BŸ´NµTàTÍÔM#u&µ6E¿Oý`P µ @×`ñO_C$Ñó.sW3a3C©;5ÿ•D`I35H´P@[€¢RTÙÔœÔM‰Ó8£4L‹óAc5[_õMƒ“K_µ\c5ÀS*4*í43Vt ŠÕXY?XƒµF«P4ÀŒu?¬Œ U*m@TYRJ-TQ3µZà®5L_uZ!¶[#6T£2HéTcÕUH58¶MÍP R¡^oU9ûà_vÕôu_µ0€v³P€&¨`£2@çrIKàV@Qéô`¹ô[³5TW2Èi›¶€`S Tdcj¥–j±vj…„@ë4e‡Õjöf÷4g…p/cP«“d°3`ÝÓG»óÒÿTLE@VE è”C+U*E`@™–NKòV MÿW* ÷o+4pAVijqWà]m@^€$×Z@` Vãu' ãm5n“lmÙVÿ ¢¡ei"Í0”u+7`Jg·<3tçu3Z×uk!vuCXU´Î:@?PˆÂ.`ÀžÃ]*à½öv³rRq7{'Sl‹×x‘÷D”w˜×y¡w,§W™(QxC‚xï”t5y/`AªÄ.az )]D;T¤Wûó.iU{ØVÕVe£à}Á7~«`~ë÷~ES„eT}9‚}å•Œ'zuz€<áèÿ7åƒSd„¬ ¬7€Q8/¹·}÷à‚SDƒ9Ø؈‘ø‰›ø‰?!Š_øeÓw‡o±‡Owà>Sd6Œ‹øˆõÓv‚z€,4+”X|SD?õÀŠ±ø·w€Ç6 âØEgŽß6Œñ˜ô˜ø؏{ñx€Ar)øÄ8€t}¡è‚Wïx&zxä)–ø&êX„U„šÒ³’]« ‘%S‹u¸ FYEèø”Ó"•`•[ÿ6’Á†Q„–a–ÛxfŸ€u]$j]T’À~¿,”–{™Qv›ï„«ÒL_ K{Àx92}y‘«¹-S›‰øŒ·Yˆå⛙Y–U„œSQš[Íó êu–ûøÌB›{3H†BŸc¹ÚaEîÕð̙*˵\íöèv@5w^ æ²Àq p閝#W¤£’p5ú.ß¹{ 1]Ĉ¡ÃٞÚFZa™:¢…_¥ ­S #Ø xEŒ¢ –A›%A‰ ^™™áâˆ]‚m+Ñ9K BW kÁUjaµ§¶«ã4k«ÔLà«ÓúIW@<¿zjëÿ–.cš…Ÿ ©Ud©M¹™íù©ûXª}:ªZŠO‚ƒ—¨ !”£ 9]÷E SvíÒLÄMÿS¤5j?÷MÙYc?6dÇZVŸ*+¤“Ô.뺂¡€±{Eû°[ìŒ:šŸ ˆyµUät«¢§òUϺj-ÄD§4H]Ût\ÓÕj¹ô«{${At;lY¦€¶mûEpûÿ^›‡©y ¹º]„³ú*;– T<ÙÙg#u@WT]¹MôQ±µ¼Ï¦Wµ™FŽ½[EÙµ³ÛÛGIy¿gÁ=Ã8EÖL=Ieà?ÑôM‘´bW`²“6V'¼7›Áí;ºíÿš`œÀÛó=w÷¿Ü >`ˆAE$àÜ? ÔH3tA£RDáUH)t*tÆ_œDOúCŸ;‘+3 N<ÅSdÅýû¿!¶_. ô´]€°ÿ²O[\5ǵ|‹¬ÉÙåɳ³OÉFÉÿù º; |À†!Í¿·˜ODGu[ú{ÊS38ßÕÊQ–Ãñ;¿ùÌo!Í×<tŸáÛ٥¿¿ÌÇq»=|ì7èw4ƒÝ0)¢ÙÅtéÏËó´'l=SáћYÒ{€ÒùÚÒ1[L7Ñ=”Ä»»”„Ž)$ J$à)dØRšY;eƒW™°bhJÿ eZ{Ó9}8=½…e½”kýÖMA×½ƒ&è×ןؽAT´:Ž=ÙS¡µY½Õ öÕ˽ëâ\™úz`Ž™~›º(ÀŒ}À~“X× j•xlš~{÷ô‰Ù›ÊïûÄ<`ݗ¸Ýqޗx¯ÞÞñ=×ӂßßýŒã‚Þ³™6Õܽm׉¦Q¹Žø~ؒ¿Á²½×á)âw†gŒ8Œy'ºœ‘Ó%Yóh·ÖºÓž º™IžŽEåã·-¢}å÷=åa¾™ežk~1ÑW=þãUw¬¹=W™‰W¹ÔéØB4!Ä,dރáˆÅœ¡á^*ûÿØKç:/y^+}~—«’sÍ3èù`ëÓ¼~ÒÃ>ŠE¸ìÍ ííy홀7¯^DÐ}¥@,äoÚÀó)`!H–—éeý˜/€(èåé7êË"ՙ²z[*/BKNA´@©òÆ9ôÅDIÖvk•+Ÿ½(_óûø:ޝ(Ä×ó‹Ã”E<ßôÏX?R_¶Ÿ#¨áX¿Í~"}<ðyöÝÖ÷ÚJd~ÅŒøá‡Ñq/Y¿Æ·”²·<TTsÙJ‘Tª€ž¬×c”ÆÞà|B£Gàg½Z{Ø«vë½ ŸaLø = ùғ ÿiCÒ»ø,½Ù®P×Ýù©I!0|1nu5BFJNRVZ^bfjb,n~~=J†@ùL(ø  ˜.´ú$$ÀV¡š².¨Ù’&L$Œù@„x4I-G-õˆLõ8”Ä0DԈ0m•ÀH0Äx÷Àp õÄ |Ãh3ÃOU…ÒW’š¢ª²º’ÁÊÒú:E@^{ÜÔ#Ø02Æ6‰%q"ŊAuºø)"¤ø˜ )r$ɑjDâ×/ÂdÊâ-#²aCŠhMÞ½³yÎɳCDì|`gN˜Q¨0âøCi# KBjêdȔ!°„¨q+×®^5eüZ‰)£ÿr¤¢-yᬩž¦™·%™Ñ˜Ðž(¹ÙÀ‹(¬ØÖc=^~QøpPhD÷օ‚´ž£KfÓb¹V¤[¸äf"+v4éқšn$ÚKƒ 3ÖZ¡Cƒ/t#CIç`·Mw{mYÁ@0ƒEôñPp-ÿÅ=ًÒÕ¬]ÇÎuvm­©¿ƒßµx.—2PЮ^$… Œnãv"bþ|,DÔ\q׆ˆü—÷Р-Øà„7"¼ÐD "°àa 6ˆB øÅ7]eÔa‚ÞzúÐ(֕¢ˆ‘"ˆs Äav0ÞKñÁø„O1҈hXT—I)ª‹8ÿ¢CZRbyA‚Á€*=b¦€".ÖHãŒQÆh!Ž”YƒL¢å¤'¦˜§})"’WhP —hA $ðQ§œFYi†™¤¹&›n9¦ŸJb¤xgZÑ@*é9Òt÷ދsB©uf¥%†"šhH‹6 & Ÿ‚j… ájÅeššt£K’²)¥KYjÉ©¨†ôE¥†š+i£‚‡ë A+ t裭"[¥ª•Þ© °Â[ì­ºRæ¨d@´$–¯ P@ ªP‚±É¢Kã«9n®¸š’kî´ÕÒ+¢‘hÐà #ŒpBtە¯?ì(쏁¾°›Â 3Üÿ°ÃC±Ä;,²°6 š—yeƙÀ,óš4Ûì1ÈOïZ¦G. \õ.dÅÕÀ?xÀ†¦xuiì~Ò5ª`_´µØkZ¦& <Ã#œlŸ[mif¯IÅ)ÛÞƊ‰Þzúm‘Ú#>חô`òÉ4Ô ‚ :œLB§-ÑÄѹçŸÛñ¹èSðAâ.ŽÉ棳޺è¥ktø鉣–Á U÷@·Õ'¸‡÷D¼ðà BŸü짎IòÏCÿ¼ïËS jè~ÿ€F@îø#\Ügj#‡]}jd›ogúë÷%ö(“ ¹¿Ùƒ¯5xtp7û¨¾ìû׫v·³Úz0”ñÎ~àiôÀØ5oyÿ{ µPÃ8ÇÝÀ*¨ApP¹Ë)p(@§(è4õ±o‚& yÞv2Р<ȞÝæŒâ0‡:Ü!{èÃ1ˆB"oÁÙ©p…Ÿ"ÏÔx2¬aîtà@ •h¸"b1‹ZÔ¡Ù'2’y/e+kõ4Ð2v1j\#2Šö|é‹_þû<À26â1]¼θõÀ ܱ+Â+ñ9õxPp‚Œ|ÀC+š(À>h¨C- Ñz1„Š ¨€âÀ¯¥èìÀ ÂNÀ)agêƒPoùÅ›"^Ìöµ ÀZ °$t6¯ÁÚ«š^ÛÚô¸¥¤(Àr°Üt —õ€´DôÕ¦ ƒˆëS,0° Q€WàTbè2¡”ÀVCK b( •>ˆï* b §cÄ°ÀdÆ]4,À¼d(e€ëûCÿ׬(»¼ õr¨@IÁ;Î ˜ ¾Ö@ °J<°!¡ˆðZ]¡¦ÅbUÞì@h1¬³Ö¥%ƒwû0,~$À=)ªð€t‡#úÀ‚G‚áªd ¥ƙbK™o•À*PÃR¸ KÀ’WAXð¨°¨í€ ž@ €TqdÎé#BÝr^gÁ^ CÀ-jf³*@g¶ ÅÁ§;ÆäÚÍ:`,jZíÊ!²5øPb±z®Ú]E‡] R Xn!Àº[†Rü@óPõ>ð¥œ~ç ” hÉZc·ýE4AB+ 9„•^ÿ´†‰èLóC ÝeÆPÜ6ëÆ4Nñ \q§4¶© ôÓ<НÈaÆd¨T¿Ú ¶r€ô,øFmºòÙ½æô)‚59øÌ^Ëï6< în”Õ©®´¢øt$ Õî¡ r×?œQl¶+ä°[0§ˆØ¡Õ°§©­ì¶ $q @°«×0WÛã®8tf@hn¯Mh@4 ðBî·* ž4 {œ¾emzºaŒò!óHBå©XWÄ7žúE@m{Zu[ ÉŽÅŠ«žZ\ª%Ã;Vö0pø  [!èTR>íu̾®xÿÄïËqDü}ぷû?Ü*達Ú¥Øt@Î#±ÊbN~mfk˜×K!Ð@ÛÑ ÊÝv=¬Øõ° „¬Y”³pºw«’¼Ú—©ë@d ˆ²¹Ï”ooÏé¹ßˆ‚;d ÈìBC€„„0=ÉÀ_ÜûÊ´€½U;Z20¥? ;}5qvú¹,Î<¬¥ý‘Ž­WéÿÚ§²®gaÿ@¹ÇSHPÙ°Ð_UÝ\È÷µ@aԘZ€³ÁF¼F¨Ä†~‰„ieàU-ôٕ7‘—žèI @Oa )T@‘‘`VIÅd5 Ø<`ÿT`jÅF瘂Æàš°V,ÜZZˆ’šÑ äÓ ÖK6¨<_¡và\l¬ÒD“ Àaµ,¡°€Š°àra U! vá:}Š†arÕ:àš<¡ÖTn¡ŠàÞP½áA À5¡¡®èIaå˙•JºCZĂI|?õ€Úá⠗?TšúaTŸ$â h\I"Il""*"#~LòÃæ‚×n pIñ)Yš„¬¨‚bÀ-´âŠe¨`@"Âb]¢%†R¨ ˜ìÒo!? @Btâ.ñ"‹©DX#2ÞB: #"ì’+Č0„Òÿ-á”Q¦Œ]@W!vâ/&VaQ%xE¢G¢æ>¢Ù?†e"$mþB‡ñC"æSæMÂU¶AÅ&µˆ"ø!Ø¡}WWž…F¢>äS^DâzLbA–Ô%r–àå/”T€%ÓQ€kíæf©‰BoujÞÂSâBˆ•'HàæÌ%nÂ'^žžmãi~¥^ö*]gZçO2 `vYo•ÂHiõCçÐgmvÖâ`dv’„zêæX¶$)õcCÊb*jŠ‘¨wZäN:Iʁ;.dÿ n*ə~žÅ‡¾$&âŒÒˆJÚ\€UyU„Kf(r”@òS¨aTl€#`Ù×(‰ã€}ÖuÉ4F…ä!‹}•þB( ‚M©˜Î×W‰ÒW‘ã —‚\€á^>dFa)¨$©ÛµÔΡ’¥…’âƒ‰ê ƒšá¦,b†ÉAÅáAåJ“ªˆ‹.&J@ê Ò©¡Ê bg®4€ bê  ¡¥æJ§Æ†Šª¨º ¨~J©JÅ:ª*¦"¢êŸ´j_ÕK—ÎjT8jZ4cì*fX^¬úU3­)B ÂÝ*Tø©`½%I|Ö`j°ZÒ0©‘¬«&âéÞhÿqm´ê‘´ª‘©Gƕ¤ÂbH°aÍVù¥Y°´#¥íåcš+^Eg­Ø»R@B\À¹Ž®âw#kY¼–´,«vÜ·vk¡âQ7iGaÍäV–[ €’œ ¹Ødí¥G' |’A@vÈΰ DŽÞcǎh"fìVª¤dz TH–Ã>¬>©(ZçŁÞ*êœ)ÄÕ²’šŽ¾ÖQv˜ýâŒN¥Åõ&ª&dŠ$]̞E!’,†ÂÆÍâlyëJeÇMÖ*õˆÉ-Õí|u–HÖR?`&­[gR²ÑVmn’hÖ:+gœjצÑײ‘ÿ'TÜ䌊 1Ü\̞B)¸¬M>msÃ\šÂ€mjiØÊ>'<îÀ^mí¡ØÂúêQ. .a€yò,ŽuÎ*5(°Yklƒ&`&"ƒš¢½Îå…VÜÓʨf֍žhÑ.mÂ'E¾Ÿæbéz-Ä^Òò‰›Š¬G%kvTbZ 0o´:/0=€FõÈôZTõ†­þaFmÛön÷Ӏõª ¾ï7%*´$Tó©/÷rÛ;ÅSßV«v(Þïú6 7A@üöoTˆ(05nCµÁ2p“DÓ4-0³/eyI•-ˆæR,¹Ò,}ðÛ>¡{ðo• w0ç^/õÿ9UpC50æI’# OE%Ñð ë0CÒ s[ ÇjH°1Á\°Ã¾mÁ1ó1´NQ£¬]ñCñ™ŠQ±[1´ÚQËD@0ñ;lC+ y€;ñ3oÁ˱±úšq¬îØ ñ£j[êKåéêqéò1ªz’Au2à2´rS¬q"ë";lúBò»ñ Àiò&sr'·H%›$ïώÉð'ƒ2õˆ2û2Ì­rSô%Ÿ²Ÿ¤òú´² ÕòÀѾôË¿Àr,É,§Ï-c°)oÁȔLÕ¨L ù2 ³ù³Z=s9-33_²ÿ=3R=³ ¡Œ  Ô ¬Vóˆ4sõd³N óUMä@€sʀÐ8‹I9SÏ9«”0ÛNՌ Œ€;#Ð#ËsyÐóòØ3G óûœŒÐôó;Oøtx ôìtCtöœ lP9NýDôLôéT´>áóÐ ½s}´„t⌴9¥sãXMCP/¯ti´4â¼t9m3Üè³?@ Ý49_sít5EsPÍ4gÍP‡HNÿÍQSS6s%óå9uj@5ÛHu0s.Ë/g5Q£31;XAc‹¶PðX?uQwQW\³u[—uj4VK„àõïõ%Èõ\‹ÇÿVǜYKÂ;-D7BÔ %(ÕR@sa'öbSÄ_vȸµIµb{@ˆ3$dQBü‹¶8oH6#„v>= ¶@LEÏlCÏes…`‹T÷€cAyÂñÏ'ÕF¶4@¶JÉ‹oci—Éñ)·ôÌ´ÈñaÀñ]¶|@··ª=ÀàÓäËcË ç¸Ny³¼¶m[Of+‘TjË xGô€¹ vxv}/E±¼·"uj»‰Ì·~›J¸šÔFD@„qK¤1„q‹(xü·éÀ‚ÿ·¹ô7i¸›Ðwü-# Ž2Šz[nCTûñÿ¿ü̸™?@&#Œ0·¸øÀøö,Ânÿà7㴈‘ï7ÍÍ73Š¡نë7}§~[BžhJ›˜8‰°÷ Ául_Ώ/ÁR˜2…“vKôw¸3øx” jOùñQ¹˜ËùÏù™ã8›Óy&§·Žk¬¦8I_gù$ øÓ¨¸¤19p¹)§q|r§±'$zð¬y›·ˆž7€›#y‹“3¹’?ù/Bëy%L¦v ɖ›TÏ÷{2}ÃT¸¹0NôN{€ó8j»öšx»y©ç „G€„sz†y²ã9”ºxD„ø¸‹ÿ°Ä‹ª ƒŒT«šu_A}@Ël ··"e‹¤@¸ƒÎ,¸˚'@¶¸|ãÔu{·vWwÿÀ¹«dʳ@ ±ä1¶·Q]ŸN­‹Å¬@‹­üz#<íL»E8Ed5õÃS‚¶Œe§‘•–c¼©³:q¼f‹=%ÂȶÆg^ªWÓ©ÓSDŽ|$°<½”ü iˆAyÈÌÓ¼ÊÐÍS¡ìl3U@‰ó|ûD|C1,d=¹teȓ$ ýÜë ݛψ«½ðAÀÚ»A!äÁ/ª½8¤YÖ[ÅIP…U ˜Ñ+¾ñ/ªã³‘Ù¸~Šde¿%ÊAó/‰ÚSšÆRÀ—Å+þI°ÿäKÜÄ?<ø3)~CbÑxD&•KfÓù4>z _Õ7è†^"ѳX²×…0Á¾¡!XÚ½ë«ô$ÝêSèy€",4FN.zTnV¶tŽža@ð¼ÆÎÖÞæF`‘Wf&?O„F_gê 冏—ÇNè`¿ÇÏ?2×ï/R÷Ç.@¯y n3 àB†Éø5Ä' ÇDŠ-^ĘQãFŽ=~´ØéàH’¥B@D™²ÑC•-]FP­äÌyÞ ½Ä™sßM=}2 ‘Šæ¶f^8ùS©J–Kê”¢+}(X3È¥ÎÈ‚ž~ ØìX”µ]èF¤Á¢%’…ËNl\ºùt¨ÿ‹Ô*x‰DUáÂy àUeÁß*„!`½V¡Cƒº•¥Íµœy\ Ùò€¡âCž PȒ‚èjwºš1ʇ‚ž(dМûfݽ®õT5y Ð™K^ª½±Ócה¾`VQFÌ÷ö•<¹?ò57ÜTŒn­›¼w¸ÕŠMðõñ¶Ÿ?‘†ÕžP™ ‹®:A€Š÷>遁ÎÒ @°À¾¬€@ý.t? 7lâ䫂‹‰zAk¢T­¡î@@D6èCOˆ`o\Æ;wlÂ,ÿ¤ZD€TL¾#!ÄâÇû> J+¯Ä2K-·ä²K/³ü 1Ç$³L3ÏD3M5×d³M7ÛÔ 9礳N;ïēN=ÆÊ z¢Üñƒ<%´PC¥Sƒ7e´QGm“Ê/'¥ôâú  À´SO?‚LTSO½ƒKG•G0@5VYëÓ@Vã±ÀÂYwåU³>¼•)ëµXcÉú@‚`·‘àƒcŸ…v)w–¥Çžh¯ÅÖ%ñ¨ýƒ¾l¿w!Q¹-E»pÏE÷)B£6Ӆ7Þh<¨-X<7_}ùÕÉQ‡Ý7`%áŒÚÛF8aD80êÖ 8P8b‰›$‹uœŠ ;PK¾ÈöãEÞEPK/¯-AOEBPS/img/cluster.gif.1ÑÎGIF89an‹Õ ¿¿¿€€€???ÀÀÀ@@@ïïïßßߟŸŸÏÏÏ///___oooOOOðððàà௯¯ÐÐР   ```000°°°pppPPPÿÿÿÿÿÿ!ù ,n‹ÿ@pH,È¤rÉl:Ÿ ÉâóX¯ê«Ý²U/ØûínÇb37|V[Ñmöš Ÿ_›ÃÊïûÿ€‚ƒ„€`T‹ŒŽ‘’“”•–—— …œžŸ ¡z˜§¨©ª«¬¢±²³´µH­º»¼½§¶ÂÃÄÅN¾ÊË̼ÆÑÒÓ³ÍÖ×ؕÔÝÞß}»VT e抋‘S¨§oëéًà Ò`YxH6¡#hèa!ª \2à ¢ ~€à¥z \ÉҘ„”º:~ñ@@H#:Bà!åÿS§ô“ÔÀC¢SD0I©a¯M-£JeÀ.ž@„€‘Ý‚ƒ²|$9Àä Ò9H€žLȨσ­6@HPòÃÚ¶‹ |l$Ò©>…ìBBûámE«º6LL™P^Ð `Ð@ÁÜ @˜ `Eg5R1pÐ(•·Šx› "Û²ñ~`ÐÀ셲µ¸fTØC£géÑDPÁƒebVžNÊe^ @hpö­ž (HRçAFðM©@€¢ÞÒó뀐x3'þÐþ}OáûQQnF½¥‘Hº¶‹Õ5èàóíBhußg10À†åQqÿ^#‚ÙVۆ¼Fð'@W‹°µá²•Î€dmÈ‚®)¨ ƒöè /gÕ'˜]dXuÚYiQaw¸õ–’‰‹(änã!à[R2B›Ø4 V8×a‚ • >¶Y™/ǟEÈ”@JÄÏ"(¤@ZÀåGéÕ·HjÂÙ´I 5(é Ðڍ&ž (‘nðY+¸)êdŸúcê©×ŒªjKסê꫼¬*«@­Âj뭗0ë®ßԊë¯ÀºÂë°Óø챸²Iì²Â‹ì³®*Ëì´²Díµ¨JKí¶Ÿ`ëm¶Ü† Ê·äfª¸èRÿj¹ìú’8ÛÀk¯ò2ƒR/öëï¿,ðÀ¿ÁŠ§êzïÂNäë ˆ–WlñÅgl´g­5Ú2,ró²ÖQô>2 0ÅLÈ#Ç\r+¬1Tʐ¨ç²20Ç,òÇÊ,¦&΍Äu3Ï>'=Ä5}Mt#èô²ÒJ_“éӕ„¶n/çRóÖ¼¬Œµ%ïYãµÏ3«Þؕ@^3gËÜÌ`³ýÓ¬(7Ãi§B·ÝMÕÝJÏ{‹Û7*.IâH¾ðá§0®ø#’÷B¸ãÛÍKå˜,Ý Þ•p¾ æ÷Zcº%¿Ö¤2 H­Êꃣnÿ¯ê‚SÒz¥7€MF=AD $V¼põÚ|UÛΗÐÎJ׶£›;+ÒOÒº< Ñ3>S·{ë@ê9†e±û*Ù×[}ºcÒ~$ €Fd ÀeáïZˆ˜¬À$0€­˜_*Þ¿¹]O»S€9Ü&-IM|:iÝÂ&=L@ìXßì˜ ½1[ñ‹ !±»0ñ' ÈBf¢*ðCÀC¸ÂS\J¡%øˆñE¤O¸‹> ’PA;àW 8“ÄÆ8ìD§Â©…\ÅRñ©w,âI!£LâŽ1°1:~ë!&~øÅUiÿnDl…œ^•ÇKбŽ£Â©rèª>’ Ôää aÈJP‘Ã’£ü$I4  ’Ëbéî¸È=.“™lÆ^·HFˆ&å¬4y’–²¿kÆUé VR‹¯$£+½HËUZÃmœ[þ` ôrW€^ØäRJ֐r’9欰”ٍ4ÏTÆ8 ÍibãCØÓ¾c¿d\CÜèæª`Îk€K#*˜<çIρ)Fþˆ¦:W(¸Cc ¨@)¦L³ísUÀà ­ƒÎ vch° O‡®Š¤#—Dõ ‹ò*lÛ¨­Ð¨x”WÈ@ÄàñϕR¡¥ÿV`©dºšº´H3}é0˜š§5ÕiPzSŸÚ4¦B½é4pRjE€P­€$ÕªJ5 UêT³J€«R5«^åjXÁºÕªfX%kZ­ZV¶®U«oíj[áúU·6õ®L(€IñÊW鵯€mÐ_KXÊ ¶°ˆmÉaËØnH€é¬öÚØʃ8k€ d – -1 à\U´¨¥…JëX¤öµ³€G(ZØÚ6 @E\{ÛÞzB¶´õ­p9±ZÞ7i€r—ËÜæ:÷¹Ð®t§KÝç^ÕÍ®v·Ë]é¦ó¸(ÃDÞòš÷¼èMÿ¯z×ËÞöº÷½ð¯|ã«Ê‚  d.'7ûÞ× ùݯ€'Ñßÿú!ÀN°# l`> XÁƇ¬„G8Á ¦0€õ{aœeXÃyåp‡éõaWXÄ#nW‰MŒ §ø•+f±\üâEÆXÆD qwc AÇ;Žè„}  _¦mÊ҈{qkVÊŽfr\«Ç>62ÙJ«_” ÎPTˆKEp"æå,"NMҊGdG‘ÓlÄL×À2Žµ\ *±Ï“k3 ¾"}ä'1…Þ¦›Ž´Ó)n«á–Q\º!g™Ñvn \È£—¸G@‹‰côL…¿¸Å.l1çZÿî£g¶|J&‰ò…,©áàCN¼ Þxeˆ¨Ù5}"RH¢FH¿9zΐÖÌiÞÄ.!iKsž#$/Ç¿¥ëҀê™'™‚ŽD¢i¥åëˍÒú<€I¯PXàãä ›& f£‰Üâ`k¨,òA ‘s MåÈ8±ãPàC%§4$ ‘æMFâI‘ðä`˜:NE𩈰E ÀI¬k*%Lt‰¸.ä,c:S"ÒTb¿Ïôï"‘÷."QÁC„sºÓõIN˜ÿS#…˜ÃՌpÊ·a®qòp\ÒV©Q>D2ò_—<؟²óxŽ Ù¤! a—´ÿ>«8…I֎z’xc€Ð´%. 8€`pÒÝ,XNӆÏYØ!wMåd2Óèt›|(ó¢0<«WÁSèyT¡¼.§Ž0Õㆈ9Ÿ‘)Ì%1™) Ð+N’¨ž€:€BÓ;…ØäRWÛ;öúnâ¿9e$÷;£_­Øß7§ýñìi,ۃ·­Íñîy¬þrõøÈOþñ{ÌBÅõÄ/× zÊSÆ ¬l+¢WèÇÃ7»Jô#ѐá3Á™ºËþéb€µFIrœ“|èD;Žp{9(ž º@ÂüKÅ$;¦"+´AÍÐÁ ~×Õ~Ø\ïÇZÖD?ÿÐsä¡f `$ùtúg òÀI$&Ù´9x @€¬ E”°i× n“{÷²XÄ°}Ð}$ä8Ñ(q0>qnêc°E*Ò ð߁ °E³x'N7"%"hwp%’Cà"t[„Z IÈ—†`N† „ChN[HsÁE°Ôk‰Ä Њ AÚøÔDïdr¨àmÚ=˜Êæ÷Op’ÄL +HÀ ±Cn³!À³e÷6Å,Á~±ñÓVñôP}ý4ؙÍ>ȽÜˍί±Eÿ8QÝ Þܯ1Ò­ÀD8Ø×Z0 Y,‡¿óž¯r»ÌtóNÁÜB6áJù»a ‚ÁÊðת0ßÌ<"Ô8tóß#ÑØ4þÉ-R„Ñi,¶ž©ÅÄäB-n+ ® >¦­%ô %”Óø­Þ°877ô;û+0~ "n¤ô7™‘6!îM½·­°;Õ¦6R$ŠÖÛ÷ñÈö<€<ÎVñBzÞ}@m¡˜ð5ø;›2Ýiö#:I¾æA(ÙØ9dJâôØxçrýRhà]~ K>íY&1Å»D£;‹N®å£$]œ p$e³ä0ªÑCËÿÿCÊ^Ü"=ÈdÊC7-)¡ÎÝìÔ(»ñþœ©É‹nŸ~*f} Væèçf ]¸ä¨ñª é½9„½Ðáa¼LÖ/·S Á«¹0'Cû)zMäGòÊSn´žtSEø vÏ]@mº3Ïî¼üáï"KA®ŒdݽGG2×3äâøÏ¤a»=äñ½¹D’к>ä1×ÿ3EIò;Y§ÍEðz©Ã3W¼ „Ææžì/ÍR´;MC³(̅·ñ B`ÜÜ¡q®ì`¼¸ÜiÍóÆýðFXî ¿MðØ @{¬…÷CÊ êÝDí £gNt# Óƒ,CŽÿ÷K–¡‘Í/’2JPֈ5À|À.%è. ­`•…²*ûå2ôZÍXíª€Z5{³†ý-cdP!ÕÇ5…ÿb,¡øǵôŸôÕ½e·i-”¯X–ß[p]q_ؓù÷¥ºß™¯4¤ÿ_*Ì x]=«ÿ_ÖÛù û¶3ûÿ•µLú€û¨£ûÿå±¥CüûWõ֐úšlûàÅÀ,°±€|‹ØÕ|¯¯úÎ^üYà ÖðÇüÍOoƒÐYPüPZf*ûÝÿ_ë_ÔJíó?+ áX4‘Iå’Ùt>¡Q)1‚ñ\¯ÿ’i±p-lÁañXY ÑiõšÝ^(XìfL¸žÝyý֜—ÿ ÷¢ %ÇúÜ<&1™.3—6õ$,:èÄ,,Ä<9S—*ÛPUS]_‡be›""Nku‰XÙhwõ~_…[‹u{׈Õ–9™É £Û’›©÷¦'µ±§¸»É¬Ó¾ÁŸÈƒËÓ%ÅÑÎוÞ-á¯éõÚ¥íݙåõ‰úý•Á£. €Ê †9˜Ë@_ ·,ÑE4øÆH´§1ŸE(bÌåÑ?’%O‚©0e#[Ƌ9e¥Á™2½L§3`͈7“ðü ôˆP}>+5bT SjNá!mÿªt©Iªÿ®2‘º(ë,«]¡®Ûú±«°NÎK n,J10èPMöå$W.]540%@aÇ'Vl¸§C„b*xȃã1âH\ÛiLäɕ×d Ð%Ø ¤V½šukשà=jy¢˜4‘À.ìV[Âp,ÐR”„À4/–>ý°MÛ¸uóö œƒpâƑ+Á܂¿Vün‰@À÷ïáǗ?ß= ¸ìµE[Ç… ø+ @´ÒnëBÉ@¸Í‚2¸à $°£ <º ã´×0ÌPµØ† ÃÿPÀ=0AtB =hÿ´ƒè«ÑÆøÀ`6?È°  èêà4À­À3 ,€8€16°ã ð«PŒõÚ»QKùìÏ«1|ì/È!‹ ¬D$aT’I'¡”’J!$-Œ 8`Ë;ã; ôÄ¢-¯1"¸MÇ?¸  <@TÇ.°0Ãل°2Œñ¬ôƒ“TP5TDQ/쀔Aø”¢,µT€/èÑÏ%@…x²4¬¸kõà^_Ô ° Jå :íluK=SõÊ^o͵°]ñxò×3‚¶Øã l 0@Y< P ·¨üì( F»–H_ÕôT+†‚v {ÔX1ÿV÷ÎW§ƒÝÜ-ò‚xy×W8ï%8_Ù ­o¡ˆàüŁ ¼,GVMÆE°Ç»‹ÊßHönˆðÊ+ΡäÂW܌o,÷\·À¹¼!v.”‡P¹ÖäZB‘NW‰ Ï õXi˜€²c§oܸc‰Šs¬·\Â>yTŠi°µ„š,¢(E[KLÓù˜³®)øÚíÅ&™ë›H`æ»k4 ©w‘' Úœ>¸½©_ÅmXê²ùörú'Ü, ,Pàò ˜Ã"êñÏå“|ï–Ö›õ'¸-Í;Œ©ó×é ½ñ–ÎƝ>µ»!‰Í&iÝwùÿbߺ¨™LvYH®÷ƒ§=Sޛ>^>àO©*à V?HÀƒîýuàVl„_>¦æñ<zé©Ïøz½åO©ï¿·d>0à ð€ðdi`Í?í¬%ã+ßùÜ£>öË}sKI`©x0€PãKyÀu H`¥PšÑMðKþ³žH@"P t ¹"Xº”pÀs®òÀ'À @…æk€id)p`†”; EHB¢‰+lá ñÃðYK­€€°°‹P€Fh·òɎñ«Ê‹X©3"Q‰]t"[5E!’dPÿÖ?P¶q„oFq ;xy(£Ó¸Æ ´ñqlU—†wúµª„!àöƒÊÚ_i¸6BҌ*TäyÀkÌìt ‹_zÕNÙõ/ÁêÆá¼O˜ï|X9Xéê üÕ.«¸‹¹ f%NYBñ¯Ð4éZ äópkG˜Úù؇Y-ñ(, ŸÕuÒÝ°O;ì`›ÐF#Ίeåc€º§Ãü¡O`·0ƒ9Y ë[|ä&Ô8p8ÎîŽSyKٔW°ñsǦՉ"õ¢’ˆÑÏS+Ädà €®Îqsd,ÇGË>ôòÌ´,æ¯i¹Ì_þ^h»"3¤Úlvq€®ÖènÌ£&µ¨GíT“æ,êžoÚç¸ÿ€–0•06Ѐڢn ˆïU4}SNÇ5P¿º³ï˜•÷ìÚw˜‹V Œ»[_E \j}<èÈ !D*£`€¢" ¦É.K¬€?³Ç{ lÃ{€†ØF ·–ŠŠlûnÛeр’ÄCðx  â»“KPÀ‡î€· ªT\²Ùt¤ŠÔ$Àús²Vª'ëéN(©¿6Ð,¢ Ü{§J Fók"œør^CL; Χ 0fòú“ 8&ôî+€(}ÆTìÉßc€œ^…ã—óøü0@Ð.Ún›6ìm#Uk@Ë%ïî ]ÿèI¿oÓw€„ËšPžšCÎæ1‹Ô i.´¯jØAÀ;Qh;Û»‡t¤ã­èk{0À\Sp_·ˆ®ù%lÀî`@$א\ø@Xäc¼ã×ÞßȳjòȯåK¿ì¼S[ž—ÛæIã âws÷rú@x<»O wË Óºî‘|bÃLw¥o©¨¤ÿÜéSó¸z â½Ûmq}o×¾Ço€-»ð‡wG§=ö ;Ÿß©,ÅwÛñ—àÛh† °ènÄÈ 6@ߣ׶dŠÊüÜý”@±æ-Z*$ *@ù8ʦ+Ž>Pÿ/+ Ðm0)°»‚˜ wòëZ>@ôøæpê-Y´ìƬR @ýæ£+80I+Ռ " }Öhèòd°Ü@ q„·,%+Œ°R`÷’° ´é   ?`öÍ=莣®¢|¬w0í /kho„†És êï¾ ¶r.šÊ˜ É€KÄÔËúR£=–(únä*B® ÇÌk$±R@Ý €h„XéR0¾Æö€–@Ž€éêƒF„.ÈGèæΠi Šî c&ÏF¨¢  ¨šœ¢¨[EÁPKL|¬\ ÿ ñâÎ= ë=` i¤gf<§0ÝèoàñM) ìóçR˜ÎN&@ìFÞHìÞë ëñ ёË°è1‰‘ èçìÄi¯ò‘àH²š†éú‘ìÞ#úŠ¨ñ.ÏäþQwÁÚC¬ c  ` “ÈuLŽÛënƱ€à $Èö¬‰!à™nêÄÀr H qÄ坰£ÎúXå›`œ ¹ŒàøÏ9ÒµÄe“¨ip˜¨½êƒàZÏ=ÂqÙ@öœRÕPËÎ *{ ¦÷`§òÊÿ—ê/ä`KÿÄE õïRxkû2h(óҚì’ó†‰Ëà0b„XSSW 1Š¬ Š&! òÜÎ=š(öÒ)g±ö¯ílïòJsöàÃ-ßr ¶0càÓàQ1"sZ&s6k“bÄTŽî 3Pè¶r³²(kÀ$͒òÐòÛ.?@5W3 ZӕÎ.¨ôÀ.@C~«=2s9IþŠs<S4­«iôd&Ñ&_5ßC:§ó ª³UèMà?^!>ú}cúó=¦'Yþs˜®†ÔúñzñjÞ±?“%¿²d@IÍ=à3>›`>c*åc*À 1¡->2ÿ‘BÃàCodƒJÅE " 2Á1IÔ=DtD_ôÆÀJáàÈĄ€¦ €ÛÀE_4Fá’f  1Tq ÄF.ÒI=vt€ôC@H·€ffq˜vÒm’4>ê±FvnIª 2`0<áº`bà …`d£  â" ~#¢ÔB'”J@Ÿ¢È°ì§zz¾¦´O—-P¨à#ÇL¨Èb´ L7Ò4A¾`=´àè¢H”`X´ rsì¦Ë.çHããNñ´hÆBègñù9iÂа€HÑu LuùZOñ@`I„ ¨HR9E*µP"ÿE7›‰"`õ åÃǐ-ë‡T£=þQKP5U‰ ¡êÏI\î9£,YeKnÖ°ñUýX„5AŠÕ+Ž•RÕT6Ì R'5 N´äš†(ÁI\Øún¤ ½•:ý…³üFORƒU¸Ñ)·² !Ö¸îK\iò=^¹¬4õ8. SπS9Å7òuYƒ•.ìà´d) €”è±>Í=nvfƒŽ±Þ¢‘>saV›Š¨4m‘ò†É„ÄP™sZYe°Buù`ô>ª 2à\4àDA†6`L“U_ÏÀM àEŽaZÐEŒáÞɐÊE˱€Š(ú€mÃÿÞvii[/ËG…Ö”¥VA±\^ËU 6ÐF66+ÉG4¡Gˆ}`~Ñs.tá£\ì:‘§o¥à“²dËA¥”,aгä9V?À 8@X&ƒ žu°Fx5umÉñæíò ÔÉyèòF²zÖ±F\÷u‡u[%jé#Š#zÓ CÌ]ˌ€æÖÀØgŵ}ïŽ}   ˜ñ·Wðôí ñ$63ⴗη ’o )$õÏn–è///‘lqY±{JH5¾ ác€ó÷þ.ðú¶[Çÿ 4—¦§èã<¸oA€Ã"* |1AX&AêMZ€å#ó28 ‚Z˜Œã 8Ô4ÈO ~xfTŠ8‡Å¡0ˆ@zÓâB†Û¨ˆD¥.‡@Ò AŠ‡@ŠD;@QŒ†6ƒ8B¦¥0Ö89b$0Ό/@9ÈXhÒ¸8dn@NJ]Xh  (€ƒéŒ‡/äB0@G"C77`ëD_·Žî3Ə†¤, MϘÐ/"yG¡ `LyærîC½øSDc…ý‘D‘sãI6‡r…€c,Yeè>…€Ðà„¾€_ —A@²<ÿþ­ŒÅø à­5CȋíBøB–•µ6áøUT VˆlÝ´‘‡V e›û`¶Y–1<”£ ` Ø[‹ãÚ(ÂrX‘ñ ›EvtٛÉl1 7*õ›™‘µ™ÔD¸TŸJ›Ý/âšóyRGy’ùõ›—µ‘Où â¤G•õ¢Gº™_÷‰`j|-UãÄÒÔ?T"Ì8FdR~@NƒŒwF;#0ÜY×xXuš™uÁ.€U³dՖÚÔNÍ©›ÚÔÐGܼµ’y0î4.%’غz"DÐ Ñ #ÎЃ¬ ƒo§³IZ¤ØPy&ÿº•yÁ¤§3@®€ì暮UÖ¯Àbä@¢-¢¯ÁÁžb¯‰ñTä ØZ¦íz ›lHÂlð²1;³ Á»¶`²kÅ/"䱧 |Ô³'§²9»àƒua›Á૑ J@ ‘)# ÒôMπX›H"{;\»oƒÛ $à *@†Ô@p¡ê%.÷„¬·Ua¸–ºÙà.ìEoþ-FalÇO†4 4¶»»7À»6X;"~›¬;UÛ šxd;Ad<$«(ààÆÊã¾Ï ¿§ø}t;½CBº;µ«Á¥?“€À¸4@oMñÂ6€Šî# &œ 4ÿõ • žÑå$ޛJGÜ Ä·s*Ã6=ḙIZ\7ï•[¼.ÌÀÙ[Áݛǣ€µÑûDvE%Ë^s9 í»c<¡¢»GÇ3¡ÄcTʛ€Á n¥£;à\@ïMq4«ß´¾\¬z̃¤7E ¨œBß| Š£ b ŠÛ_ëü´="Χ“Ï•àrc4€E—ÍEÜÇIÑ[ÂS-b½£\ѧҟÀ<ÀaN½Í'ÁÏßRӕ D›âÛÝÍ%ÎKÝ ªàÓñtÔ3ýÔûÜ՛ÀMU=;1Ý·k}Œa}ÓsÝx1€°Ýf]Ï {×’Ӎÿ7Ø×à>‘}v=ƒÝÄ·:, ÅS‚Õ%áÙ§ |ݨ¶]ÛÕÛc}6`8@1Êý0ÎÝ0ÒýÄ#Ï ÂÚq= ìâM¡¬Ú×»üMûxJýÞm›Ø¹NÌ]àѝàÕÝàMÛ#à]²]ݪǝÛÂËӝ@PÊYJ=˜KŠ—G :<^1û¯÷ÜÕ¤èxX ã.p!9£Vk‡zXåO^#2Ԕ„c @v/P­`b àB4äè[ƒC{áõ€ÏÏôf²:r£DÅ ¦~H*D°át¶;dž ãË)àA°çED£D8eì…Š@í±£Bnÿ£ëu:.`·©€ÝŒÏŠ½˜éó€Ï#€Q9Qp¥4® <ì 2<€Šà>a"ìvn ÎAŠD9Ðþ@¾ÀWnaDDcóKcñs:(U_ìhÝÆÊr˜ïÝ@ÓOF" 8¥™ä6´ B$åõ¯òg>öGßhHíÑ^T.!ømÿ<¥B¶%Ö³pÌ­•UŸ€]?^¤*Ÿ1‚^ä`"å^ª‘åÅ,†ùQžÄ£HÖ£4:?ý…ŸDФ÷Ÿ ë°ÆóúöùـÏäL¹DŠ<QâñXˆHBb@a&@<™B!)BFJNRVZ^úÌarvz ]lipT`%]qDYXDÌn¢ª^’–²6ù‚XpHXx ®qËZJӎ¶FF\ $jok#\Äz†‹“[j–£“ƒ¦³“µ? pÓ×ÐÂëïëŸóÿ;Zp £|:Y`o¡¶¢Œ(1’¿‰üZÌÈC†5ˆ¢q$ÁŠ$Óa<©2‚>Âd ©•6ə¼É2”Ξ“ ˆ)ôƒž>VʉÔRÊ¥K-(:TA5§V3Õ¼:©©Ö›(L*tpÿ]¯*=ШڕòÄÅ×ÖjÚ¹»ØÚÕhäÀÂðý€@@6¡<@ÌÛ³n^®Š'vpÀÀ‘ x˜7ÔA‡Ç‹³zvìy`˗ö(+`ða >0hÓôf‚­‘±]Ѻùexàñ 8P0ÀÇÂ&xÍðA†ß*yÏõm½‡¨x >ƒå°=4`ÝÑ£ÛGbo«ý}¹¯²¿{XÀùó(@œBP}ŧÖ|Š³0÷q¯ùG€1Apƒ%å¦Ø‚r²LÆ}@\Gx ›•ÅtXb ò“àYÂhŽe•÷_²!0À€ xÿ„xÕȎŒ]ÑX¤$¸—!w#L35¢d;Gj•¤•`ã¤!ê‰å͖WvØ‘cRò–—O:)šå`yUGÐY§w♧ž{òÙ§ŸÚ)åšk Ðٛ8•y¨’¥ :(nŠŽ'¤ïEÖh! 'g“Š#)§¿1 "4€Y -wßG¬½øé%žº:ššˆ ø‚Úƒ©PnƊ ¬½*vMXˆ,'êÈ `™LàÀ„õ,9®VžeÏ6`[!|¬¯‰zKT‰Lp1@žA  @fåvĀK汦€Â9€ hvUá¾ .ÀÛE®» P®0ÿÕrú¶bGæ¡؊àœ„5°9{¬£‰€÷xu~àß(‚–y*SV§ª2Ñ2%¿Ú|G‡,Àq°”|©ÌZޙGœÐ—A ˆ±ƒ„”óO K­˜3§L§f(!™Ê)YÖÇ.—™`˜y Z!¶Z5Vno8+!´ÙfÒVȵͦêÞ¦Åv¯pÿQ½ ž¸â‹3Þ¸ãC¹ä“S^¹å—'Žž¥ ‰Iø#`ºè£“^ºé§'¾Áq›ßƈ篏Y0ëÛt »íEV€ð쉐€2·¿!î~"Ÿ<}ö¿¶ÊC¿j7¶{ÑcÿK[—Íwž½÷<û£ß“Ÿ—ì³×^¾új‰Èº‹ëÃÖýZ:€†ñã¿ó–hVþÿûd\–ú è“à4Š:\ Næ(@QÍ.A;PK±µ# 31.1PK/¯-AOEBPS/img/mc.gifô= ÂGIF89aòéÕ0ÀÀÀ@@@€€€ùùe???¿¿¿ðððàààÐÐР  000ppp``` °°°PPPïïïÏÏÏßßߟŸŸ///___oooOOO¯¯¯>>ººKéé^ÙÙX]]%||2››? ..ÊÊRMMŒŒ8««Ell,ÿÿÿÿÿÿ!ù0,òéÿ@˜pH,È¤rÉl:ŸP"@âú¨HŸÐBíz¿à°xL.›Ïè4Úh»ßð¸|N¯ÛïøöA-44B%"ƒƒ&' {|Š‹ŒŽŠly’“”•w ]žŸ ¡¢£¤¥¦§¨k (‚„³-˜¹º»¼Ž ›©ÁÂÃĨ ®L/ÐÑÒÓÔÕÖ×ØÙÚÛÒ Êe ´å+á½ëìíîGÎÜôõö÷ôÞ¸Jø ´§\!d JñÁE9 ÞIœHё¼ 3jÜè:#2`ÜH²ä=Ê,0AëD ‡´F¸øx&E @à7ä@ÿšºØ¨ó ´b£#M*]jMC€$ \T`Jµ*´  Œ9˜´TD(s œ  ۅçD à"€ÚEѸ…ÁEÄ!TnÕuÀ«ˆ•N°ÀåH‰#—¼ð`Œr徚[Ñ Œ Án I°6Š€§It†!Aëº}ü]»ˆ€•…@+xð£ÿ$ XÀ£‘’_~±%¼‚u’ (ØއA€V0¸H ãAc!¿„À¥à¯Üü…@»ø 5h¬`µÚ0œ6Zvç© p‘àhÖá—H ´W]³(€h0D`Úwÿ_ÉÀak0à]~C(ßÖA ½QT˜rÌÕ¸ ç ÑÀ6öÈÍr…t^Y+ª= , ÀÑ…©c€ ˜|&„€ _.@€ÝTÂ!šˆnAþçBl\$`[ðµÖ¬„·$ µ™f—SðÞg< @-Á"ÎYçmph|*¹Ý¦Óo €¢g%BÁùhª5ä6ĕSê*5ì…$Y F‚d’¢V% Z8„–Zø”€[ʅ,iÊ< U§B@Ëg]jí)ÁžŸÂàä¼~禈ƕ·–¯I+D„ÿ®ž¬a+׋CDåÄ ¦@§†¨Qöê¿ÐX£l°v ¶ÒÒžHx«Þ’<`—x7i••.ìQ¬€Okì}õٕ§´ÒÒՆA¢e§Àöæ­Ä°EPrµ00àB®;1 ù2‘·.³œÎ ¡3Ï"`ñgÂÕÅWAÁÿ»¬yõ¿©ŠÀ™MGÈ ²6ÛÌò¹áJ±ä˜^Ì[>%Álê" ©{ @„ßåöÀ³R:ø3ï ÛÞz薝ÈE؇è˜xëBὅ&vO-À¡3}«²i¯Ód_»Jª@·šú©ˆê…*”#ÿå˜Àúg¹Ւ¿|&ɸæÚ¶M>u&MFt›nä€` àÝf¦DÄã"º°¤wç¾YOʨK×GÓóõ@¦EX„2ž—ï÷ðQÝÄ+k>ÀÖ`øûº©À,ð?Wq G]èKÌ1‹„ FHh@ɶ•³›)­>$3™køRÏ¡†õyÓvS§³˜ì>aÀþ —!¹0ÃbÈÍѶEÂ-tʄjá“Å⦦Tnlá’ÓŒ¶¤—;ä‚Í^vÒ,` 蔜Òò¶9<•‚Xª,ÚÈ\ó]ÈÀ  aשÜyØÀ“ð$R¨O"ØÀ$~ÿ…wüOo›tà±7tÔM™âU9ˆ ŠORä!_#»E&@à‡ODåÆU-²D˜xäkØÀ:›ä¥ à€}tíIà£ìQÚ†³Â&‘ð ŽyÁ4ƒ¡ E†ù梒@Ó¯¥²F\ÿŽi#s}!A X‚€`'HZºd2þò ¾ü&41ÄOJdÏ`&sBçuÖ(V|¦wPŸäÒ 6§>ÁÙ}Ó4rgbЬ T8ܧBÊÐ0Î!@€ˆ Çk¨F7ÊÑ×TÔ¢‘Á¨PRĀ±£(M©B#ÐŒR¥ÿß!©K©R€\çža°I<™°ž#Ä¡tÀ„`>‰à· ’ h¤2Ú`ÇÞõ ðgμi”,a¤3µJMЁ¬V¥¦KX.d¿D¡X‘3µf™åЀ É3h¯—ÕÒÀCØp³4PÀ]—Q#ø­š.K¹ÈA‹S.ð^¼À+Dö²ˆË S¯š¤õI§g8$¨F—¨1ÐjŸ9ÁhþQQ§p8#0À²æ|‚/õŠ­™ÔÆê‚BYŒÎ"\ ±{¸p])"DàÐrfh¨ŠD!( íhMRín—$ÎÜÀ–öü§3ðÿÎXÞ#XÁDud?ëŠÂ“^)jw%ï·Rô"ªJÏf€¹—îg„[ÔI=õ]#~ì¥Íw·7 Ô¤•haAæU&Ä' h§¸F`í°bÜ™§S]z_¾"VÞaJÏ»ßÕHwcÌ]%¬)[Úò#:hÅOº×â_ÒìÁO¹©‹¥X-AÕ¶¶2š‘!¢8ìazI»’– #UõõjXš.“¼0iå6ò¡l|›Ì.OU@»ÑJ”—„,ºy«/SŠã’ä—È–•:°¶ P$¦kðQÑ|u®°’¸0¦±@\€€€J: áVfÒ$) h+ü϶ÿr ’ŽY~Vcºô¬›4 3PU¡Ãu>ìr—ö»TJ"’ G0"\ŽVc’:?/ML"„ÃÃÆ^OqÐòVy«-ˆUöֆ•ŸÁ§ž'.6J:€¡p3d$I0è"B¦ÕéKã#²îÞȺ5„-´§?»AO}˜'Aœ RtŠÈM¶$´Zî&´5ÓljSgº!tƒŽÙƎP´Ë±yd![œu¨=âðÈç,rŽîR£MçG¸à2+ìDª"ôÎxeþŒ:âžÙxzê˜wv㝠´“ç™wi@l1™ç®ïñ±× ßó1®Lh½y±œ…QÕ&mºRlÿíŒíÁ<€Ó`‰ ¹64 H³Þü6mWû'Ø{€ IrøÚyIµe¶³Ýña¨ŸQÑËêR¨§ì+¾¯.BiÓn sƒ?w<@tÎ!§©I«N64#b^‘ºÎƒàµG 묬Masö*ÃÁcJ¡z´r&¾®¦¯›§DÓ<» CܓØÆe\©‰y +îur3¥V²|îûîɧouü¶úã“q¢²‡`¿Æ¦/–<@ /þÉ+!³ñҖB×y§E©> ¸kØnìá0ì”UKcŠµz)@˄iQ:µ!/ñõ c@“Kٗvä~®Ðv h1‰2ÿƒ3€׀ ²'2´!ìÒ$0t[LP,Qq€ÚAÝ4b4j1 ¤çF*ԍW~×@~4hóÆGñ2Go$*tt{ð^‘Ôü@)MF›ôáÒôTðàT;H6„B… ‹4„LXÈ'áÐORHIeÑn1„@…š”T„T"]6Æ÷zzô„=qIYÈHEàGØ5ƒ7H 6˜‡Ü0o² ~/Ù§R„Ø ¼$ƒ|øx‘—ˆÙà‡½ˆÑÂV…8‰í°sŒ˜ {x‰×àˆF‘[”ø‰¹`‰šh ™8ŠÔÀ‰ ˜Šª¸kxx‰¥hŠÒ€Š«X‹¶ !i²X ±¸‹ÿ/@‹·ŒŸX桋¾( ½¸‹À(ŒÌHˆQäň8¯ÈˆÉ(‹Ë،ØÈQtqYúã ¢xŒ/P¦H-SŽæxŽè˜Žê¸Žì؎îøŽðò8ôXöxéxYúÈ2Әˆâ8ŠPc 9Yy™ I÷¢ÚÁ ýȇÿ¨‰×˜¹P:Y ÀßxŒy‰y‘"IpE!­èpµhìŽÑ𑌒#9“ ¤3$Àd#,@!À4^ð)ñԑ¾“‰(“4y”Ë°@6¶£;åŠ. DɇF‰”XiX P+ 4+Pug ”»X•yx•Yy–ÿfR;„ &P,@ $~` –²H–7h–hàTd xP|ƒ1S%=  —åMæ¨àa bE Ѕ¶FIä5;Å 1'@%°™³ '•]@—¦h—4ˆ—aÙ6rÉSòA'vNW–W™Õ—ófG&T2:–#/rÑinÕB‡":x д 2‘³°ƒ%¤9Š¦Y~¨iáôHy´H€ >Q.SHL#£us…"Ò3þô¯1žE€†iøž¨±l÷oÖ K·*Ü2zãB:¢=e€; ä:2™‡Õ)~×Yáÿ¨78i1<Õsv|U9ãñ<”3ƒUž¶dB‡Ó$O¤ºC«MiÑ¡.ð)äÆ$Oôi$Z5ã´'ôépö8J„¥-ñ+9ú‡!֕,д|©[ zƒ *yÚK$X9A¢(R²%I&ùêñš²¡}ÀUX'=~Ô%\@sžbKv¥ÇJ#h¬!Ct1h%bu6k8¥y8ÊZ7×a+Ç@ ¹åð¢XKJƒMêxO:=öm†,° æ)‚3A‘c1`ÄæXBàÑf:qj2 è©®p%„¦*§ª©2Ò§{nYŒr𲧽ñ\K~f3ÿ"€\I (P¨J:•á¸ˆà¸¨ÒYXq‡‘Š2Ó[°c‘c£ j«¶qŸ~xvÍâW’Ëó}ǔk髪 Äš¨@‡¬a¡{©oRznò6½¡,ã£.·g[)¦5w|‚Ój°º£Þg[q£vj®J€®:²sÓ®)2K ¨ñŠ 0²ð:,›sy¨åg¯<‡¯s©š³Ù­ýZ›ò"ä^ÐH\{¢u»ñ$‘„¶-Ղ&` BA‹ ¨rõ=Š)²ÓLW§t§ë&A©êk´w›F¸¼s ôb+¶d4ÿjùª²âDzñæ²_`˜öÁafat‘vv{W}Jf&Za"‚ÅÂßq‹&°˜‡8ìƒË_ ";)6˜Š;¹DaMƒ]åøyëp‹vh ²]9,°„Œª¶’Ƕî涎àZF |ªr|ƒ¾~Pa £;”§)[¯ÆzŒ¬Û®ë\ûð¿˜Ip/eK Eê_½;•ª{iÁËâ¶Sr–‚–¦õð–Ôᔼ›¶¾K¬¿HKh˽êû>šcJ≣‰ºŽ7½’^6½ë»¿%Â7‹0šh¿4f.¿@iü{À•H¿@'À1†bYÿ’ˆÀ¬ ‹¿»P Ì à?K%¤#nئ{gÂ%\"'¬Â)L·†Â/ÌÂ1ì»Ã5,Ã7LǨÃ{ÂÃ6¼Ã+ìÃ8 Ä-ÄF\ÄH<ÃG¬ÄIœÃ{WÁÔxÁÙÀð Ð ‡A JÔPðv  [ÜUa.€JLÑ¢â!ÂQµÄNÜÄDÌÄrüÆsÇt|ÇvœÇ=ìÆzüÃ{ Ç\ǁŒÇƒÜÇC\Ȉ Åþ(ÅØÀ.^üÈ/à.ÀÅÓÉ×púØRöÀ°Á›è8'y\ʍ ÈÉÈ×@É¢ä‘%JàÆT0˜L0fÆÿ^Sþ“Á®SYL˵üü œ´ì:¸×U®,J‘õ `Æðvő…\ÎtXãÍ NÓ|i¦ o@ÅíääÊPfLˑ¥ÀÍ]¤ÉïìáÅUìȨtY@±Ì#×U÷Œí¬ÁÅzàÐæçS\Ð4=¬Ò«Ê5è/í®LÉÿ`Æ< y€É/ðÒ% àÈäü±¬Ëö,ËÐ@=ï ÷¬ÉUÍÓfüÏ}XÓb­ÿ¨Ì 8m ®Ë É±Ò"ìDMÔÓ@ՆyúXQ÷ fÌÖXíàÊõ‘¬*[½c]Êeͤg] ^ìs|YSÁÍɇØÒÐSA×ðÍÆ y ßüÕ}]Fí/Vm–Ї½Ú½tВfšV½Ô¿ÓEY@@‘Ì ‘EƳÉ/P>—`‡ñÙ¿Y4Ú/À͜PQßÜܖŒƒ¬=ÝÑ[´ì/×=Õ`ÎÑ°€Æ`<Ìá mÕ)ƨãÝ$ƝZì@=  ÆÞ›Ý 0X, bÜÙý=ÉT@Å÷Óԝà6]F ÿŽœÜÜÌÛÈ(ÉְΗÖô@ÉG­ ü]י€k ŽÀ‰M̑…úŒ'΋N t½`Pø0C;]xù ›Y%Ð(À ò;âYâËí×±í×^Œ50ÆTéàÝé, ®,ãАÔ`LKþ×ß<òT¼ÖÐåà`Åd®® 7>ZWÙ$"[#à”I*äC®²± ׏,˔Ì#±œfÜUvíç´]å¶-Zš¬ÍNþ®lÆÐà\–MÁýÝÀÍ€ÀÝ7²Ø1Mò«°‰t.’DÎÖ®LÕϨ~Üy¢¤Òná.@ÉmÆÿàʲ|_ÍזíÈ¥Bɨ¤É]^kîYF Î@&–£Ž”DÎÕ[L@³N~º®ÅŠ:×Y`á-Â~mÙ ýȎLϳ>Û¢e×"}ÇîU2©`K) . MãbÏ^çaÆ J—Î “<ë<ÍÓÙ Ü ÞR>ëTmïc~îS=ëÙ –=ÏÑìðŠè#Å  é#“P¶Ö4#e+€Ö y$HEÑ·L0…,Ÿ’úŽJí5ß,ɏ~¤}‡@ÉR ÍÓ>ç5@­ÁæØ/ Ï]nÙ± ôÛ­Õ°Ö© í> 4nàUo\=ô©’ÿ `¤æ€¢;$¾Ð#»Fð\T÷iÀ‘<:“Dð~ýN².ɐg×€ðY]žÏë.îÐ ôþbÙ Ô’œóÆMY ’®C½ÏÙ|õÕà /!©j9 Öäã™9&p÷pªBB;b¶ ¹gA.ŒyßñÄÌÒH½ÝÚýÛívÌs Ì/üрû¾ß˺Ÿûâm•OÌè<Áûœü¾LôÏ@ˏѮ !9$´`Y´Pì`(¢!鸶$Є ògVÄ^ò &L‰À þáðþè’€"±p0†;0‡&#  ÿMí–Ûõ~Áañø(¼ÐiõšÝv¿áqùœÞ&¸êy·Ç•Y\ðñ^.05Ð3&õ$Ó\ȼJ475EP29A,IK’`  `š® ˜`$jj¹ "\^Œ„"˜›x}…X `®`]¤¤ ¥©KÙÛÝ-Í&åçéëííç8\þ"_"P`߅,88´¡BÎä“SÉ]œ0–ø€ÑĨwµ4Œ%Å51À€p49™Æ0»àl² Æ/•.ÀhЄ¤I4mÎÜÂR‹¸”á’%ÿZdU«¤âIÔº•ë‹;]ßÜé§ @ œåpÐřG¼òë†b»'0Šèô # W߉C0+êßhÁbŒ@@„]ž2Õ cqJ¦% ¼¹ S[÷å¹.`ׯÃEœ;›vœ¯µÓlèãOP¤;\À ä6xܱ¸~|‚Ó‡Î?èÝ$"8ØX™¤Zôo´&%Dxeó$ÊE‚*E7wþ;®ç‚óè-s1ý‚WS$à¾ë¬*+ä¬í6ä*@¤‚&˜ ¬Htó`á^x+® l6âdFÀh€<*pŒ\‚àaÿH"“ä 'ÀÖÛ")´PppI">—Xs"Ç&pÔ¥4h'›,Nz¥H©dçÀ±ìjAä.Î&Ä£‚C2 À Ø".>"AÎÃR x`MLáÈ*¿p v4hˆüë€=aðq2-@`hþJ±ÈK±Æ ­  p• ƒÁÄ›oJ\sŸT&MË¢¨RXÿ´0$hž[¤°\þ,h±ñÔåM$9,„!ÑaFzÖCPõ8›§5€ •¹”*²ç)(ð©5ÓáTӔùX¡< Ɛ@“–@uÐ¥$ ‚ 2Z!E»-ü(MA¡’:hŒK)(áý´0)Θ§5Á0IŠ–P(÷ˆÌp¥‚ž†ïµn ósÂÞ§ª|k0e¨´W†FPAc#–ž6¹BAoãQÂP„² O .‚J½sì¢>áÿÌX½–ã?ç{! H’„µÝ°‰§˜Ä$QÎE‘”+ è©bcFËhÆ3Ú¨KÕb?ƒzÅ~Ä1$þ@€,¤ ,îcžpmq“¥Q@›  ŠXr$Z°¨…AI zj|#ª øÌ­<"`.¸ŠWJ? 0Œ2.w>¥Ôäc9]Ҁ¡trI¥9ʒdv yò±&³P´B˜¥ÂH<2§´žҚÜÙBgL¼ý䯝÷“¥8¼©…ödž§pסД¯'C1ÍNQÇ?R&{ï¬Fû¢'M,ES¥ù ¦ñ034êR‘’9D“»ò@`IøSNÿ—(  $ül(i¶˜ÄoT‚KTýš (ɐƒ‹!ÌL%šÊpÃG¯$`ßêKI©25YÌÓ¼|$8 J¤ôVSðèïi}O [K¹ÂR¼ÒãicŒ‘FÕuã( ÐTu”ç[, îqTœUË€¹ÄõÐÜp`©aáJ¬Ø€h­¤XÅtxZ`Qg.uåM^N§E-s«%s ×[=¼À‰˜r¢æ·ö†º¼Z&àxk¦=õVqÿ‰8\+¹Yª¯5ê‘Mëîڛµppôz o] %·¥;nyz²¦´D¡º¸zðÁBmhp­‚ Ü^´­•­¢^I•I”¿–n‘û3L®2à?X»V,Ó¶D¼Mpëkßá¶GøfnÎdNÝÇÙ¢ ÷n8PpÁƒÐP dWh |Տ \ ÀòÀ« N p høø}`ÜâŸxµóýq @|Œö7ž³hœç {_o¦ð7l ˘ ¢¸tàKÁ@?Z•ƒŒ¼°„0&·d †v@:`ƒ¤ȇ¼Mu«ÏÃÿæ7·XÏá÷fɺ,Pò \ýGÃÄ_ï4$$C Ÿ•á_w ¸MhàÀ°Ô r¸‐èė¼æýv»B2`úΎÓÀ\bú0À \%ñð àUððL‚à0ùØ®ßò¦°+¢P Q+ |orî )g,GL€D@ÀTÀ`çÈÀt(6äÿ Ï`BФÄÉB6þ, X±UBZQïEÿøÍ Zú‚…,hÎgeÓ@BF°Ðd•ÿñ Îà *@ó*àa € y°£.jcÛ`+1P èd>@ŽÚáS(çî¸Z¦Uö pú¦q%ùîíÂNÑÀùðpÎ 3@ ¢KÎ@,` „áÌÐòWlÅ °L̤ à0¿Q=rgpá"EH`@ÑÜñÝ áBð"Ðd2 M,o ¤ñá/Š/ø,€'ùà ‚ƒрèúoÐÆP 4Oì2„ñ 1|¯ /ì:ò#ՍmN+%D0bL€T@ux¦U2, QîÚü/ ~p Û¢ .¤p¥-’ÿR”Ñ80ø\€óâMÿŒ¯ð m0€†±U”o Ð÷6€Ð)/Dg´Ò52F%àÈ&þ"‹Zb2Ã CN""j ž@(ÆEy†@%¬ ›”€ÏPÓ†XÀ¸r¨£2Û!%Ër X²(³ ."1ƒ/áR.7@êAÿªÏ9Q(#¢¯V.MâꐳnÿÜ°å2ÒLª“A2GÑ€7ïgwŽëdLR@ªJʂ+ELƒ¨˜¥¤Ár¤`P"€$þ¢Åbá|ˆá @$9:H 7OD, „,ÛÎ ðü.CüÀ-¦ñÒá"¢Aª1 =ÿÔр)Û ª;ûo,†ï,4#5€'ßIŬ`nè ¤þ£ÝâÉ:šG$ Zøì)ã&–-`ÁÒCŽô[0k\Œ”ÉH¥%Œ Š‰âó{6ãµHl "ª¸ EÅ#`“ €90BV@#0bÚ$|óA!1B}ðøl "(SDÕ`&î –³ìÌP3@P-@:ëôÀî À„•QQ)”ëê ²ë8Ò÷Æä뺮*qƬ„"<ñ ni Q*¨ÇþÝÀ‰”ÂÁ~APꌈÄU¡A~êÌr´§Ç c\bPvõÀ8ÅÖDž<“ÓæeKëbUÍÿ”O. “nÆ°š€3½ÀLd6‚M1"J­7”(ð=ð -È9ZÆ Ó@€åV~âÐÕ+ÈSâsOæ(€^MîUîµ÷B°&" áñJŽ]QBäq㠁ã/" -âp…^%34m¤„Á‰XB[:KÊ*k¾lá h œÈ(êƒs$ŠYk'É8c>Š‹'$JÂl´4)óÊæsÈÌÃrâƾä35âDFlZÛôô[›C=±¢[%fú\¥\Û ßè@!,4°,eO«ö#¨‚̏ة)®ÀÀÁUO¡Ó"cfY&ºV'…EŒDžœÿ¬)Ôö Œ• U2 ´ pa>R#5Lĺô;Òô9œ#”VŠ“ v&ÀÓ`r—Ëóä4®¶J²¿è£k#5ÂC$¸ %x!®@ž. 2¤dmY¤5ÜV[t‚° €%æ‰Yä>{öXéóip!€ GhâI×  6 :HÐt:יòêÞèõã@óáUºdVèõåŽQæ" ÷•êfÅ!$r+ªV%§WE>w»˜"ck*>yê§HHc p¢nk‚O¸IeߖÄ`‚´’Xµ*>A÷…üv|¶K'Œ×˜ÎS¾’NŒVXÀ¼TK Bÿm÷Àÿd&Ñ»Îaúʎÿ&´ø ä"púTøá& (¶7WÚ·@øöT ~¹övÏE "w” VWHÒç| á jµP<Ñr—vG!F,ç|$}@]®”w×w‡ `4”ÔS¦+QÀ!c҇Ü` L·@ð‚NL 0âÎ30×6˜–W¼‚'5¯{)¯å¶÷÷.”ú ÎDSK4·†ßg0Kž\B| I"ŒI8Ó]ºÌÀ $ùR´å&"Hšô4|Y€JÝ¥ocÁSFI8“ŒkÁà¥o{BpV™’Á ¢t!“yä‘åIÆÀ@NF2Lj,µäÞ"ÿ±ëÛ ¶-ŠS™9#1WU™‘Ùà†M¦k ƒá´Ž¯£ÅŠfÏÀBÀ‡YYfȎ8ÇâúæÍ8%ñÖ²Nƒ1ߢ²š·/b`Ñj°¹d´¹ ÌA3­Ä›¯£qF= X`$A Î*âÔ6¹Å$ ÷!0aR 9$ñážÃ•šÁ"›vQU†׌†Õ¼@ÖÔf[­’ HBÌyF€ðì5"óØ)Z#ƒCìzCþ°ñ6à 5€(íy,ÖpÐ2—j7¸MºÞè ãÞ  oštÇrfú«çÎržC#N dšjîxá°â$ä©ú1ÿïa¼ÑVbR6(€æØ:¯ðY"7 äa¦qoq»mc²/†í’+Þ$<¬%»TÐf$ Z+fš—¦¯3ðÞ\à:²(ÏPVúШ3`£3„"™úUÄó|ƒª]ªSð¬'»¶§¦§ÁB³)f}±-—qX$Òb²!£b£e’&‹ëJN·ùÊ$8D&—°…ºeºM»×‹Ò¶»º‘-»¿»»¯;¼µ»¼Éû¼Ù ¼Ó[¼ÕÛ<¼{½Í¾ÑÛ½Ç[¾í›¾Û›»ãÛ½q»,y8§ТP-ÿúŽQž­- œ£yšŠÀK<‘fBC$\2(üû.Üû2|§ÿÃ;\Ã?œÃ•ÀÃGÄK\Ä+¼5OÜÂCœÅW\ÅS|Ã]<Æ[ÆIœÆ_\ÆmÜÄq¼ÇoüÇ5¼¿Uò¿©0:³1#¼™ûð8 ¹©\ܐ$ºALm»ÊÓMÈߑȅϳ#âÚ*”u2' B‡Ð£·üÉ%¢5«1fÄÊݼk°œû´ü)/O¯-S«®L‘N˜Cî…ÝbÁ3²A<`†çáM ¼Þ|Ñ¥&N=Ðö®“‘ªÕ`) : ÓW’³ó€¤YN X$¯ÐÑNžYÎaÛU#9d\–ÿúß¾àԑÑm}g|³ÁáÞ¹'Çb̏/ùdC ’Bÿº¤V( ×é`ÎëÁ¹!xo}ÚsÆ7 `.-hnúT”ŽÝÛd¶ó råä2ÐӑÚ#‡ÚÙýhR²ø®9 Úœ/. ñº ˆ¯ör'ŽÔ'ÎМP^Ð1g%à5’ã8ä`´ÙÑ7à²iú¹Ý)ž@RR×-ãæm6À8äEßÜ¥® ÕÄÕ œãFþچððTQìÌÎ ¢Î âÜ­yÅ*~ç;µ[í½ŒÝ)aòÚbýruOû4Ô9$éo,®3äA@Þè4òBñݝ=Ü&žç¹N}~,ÔÒÌ.çùi­ü`ñÏ…Ý,Ò!Žÿ“,d£Ýþñ ±þákx뻾ﭤ[…0úá:7ÀB®ÍÐ À=›óYQ/Qëx‘ø®“*Bò] ä0²¾ÑøÞïAßaô £¯ÎæÒ’ûÛña-Ñp ~R Fn ˆÏá4 Úf_ ¦ô9_ï£ÏB˜Pö­Zׅ%bßµÛ¶Úâ’x߆_c’B?ú›Bi / < írPgåùÌBÄÓ%ëí,Üúü¿³ïNÔáåïKÒ`LavOQ; bO^ÂÎF¨¡ ‹Â¥°ÂaB£šK´uÁ²Ú-·»=4§Ï咼ê5»í~Ããÿò9½n¿ãa‚µÿš¾PT4 ¾Lð-"&..QL0A2UV 5i.YbrZHúE¸Œöy8ld,ml˜¾lô9ÔN ev"¸xðí hNx¸?rV "u<^åÁ¸´Œ dˆ¬„L‡‹“—›Ÿ·íECM„®¿ÃÇ۪Ɨʯ"t¸ZPȺè`«VX¨õâ֋Rj1¬0a  .X½è0ƒ¿…­ʊ‡O)´¡ÜFb8t._Œ)º{6oâÌI*d< Kà ª€…. ñŒÂЗC24Š(ª( T| ™€ÊŸ¢¶þäôn¤ÿ(D¤L»²å̶nßÂWS'ݺv­Ø»م¢T!Ã:ð…à†ª¢"µÂ- Ceyp•õ¨Éø䑥 6m-È|0òƒ€¸¦O£N½eîÝÖ®qæżÙ~Ñ>:¸0Ã §Öê€X†ÇŠ Aõ²È;J¤tbzçl)°Uí&ÁíÞ¿¿aýz<ùS±ãe($‹ƒÉø@®”`ÈÞ !t•ñŒDù2Ár/¸Ó\¸€J.¤¥Í œ–@lA ¨@in €4Æ[lj╗¢Š«$õ Èr \ÐÔ]P@\åǛoBX ÿ µRÀWªÀèdP€p?6Qfv@ðAJ  ‚‚)­ÐÀiœ±ÅˆØ…†Û= (PæKH …šxâ"+âYÞyð<ˆB Ê\MpñøÂEP€Ü Š*AO,jÈ-`:„}Æ„H¥B¤¢—@‡R d¸@–ـÀi0àBK,€ˆÐ]g«¾f±@‰\ ÃÝq§Eà]¯º*›†`€a²YàÊÖ²½:[§\wænk{“Xâætc!ÒAjƒÛœPª6­¾*Àt6`a<ži/8 àoiÈڅýö ÿ¬¼kµ"@! G|ñµJÀ.À€¥Ð@¿ˆ¬ÇÄþZì-9(¢óMä¾C@2çd³M™É!@ ïP‚•(±àªi`!  p@,‚Ýi¨Àà0-­ `ô €¡ xY †ƒÀÕÔ,°4™KoÍ4Y ¬EÀ,]Œ„j;ܶË/ƒ‹³àðÐ<¸á£ð(ýÁÏ(µr\N­€«¼À@.¤€oÃÀ/£/@¢×ZH 9Pã5ç#Ӎ…è¤G €ß¿’ufÅZ0'æ‰ÿMSà‡_EáÅ#Ÿœ¸PÝ*´ ôY)Ð2\gÞ+ÿÁÞ¥1p/#°@Ê q ¬nf‰uw­Åë¿SS>Ä ´ÿužEûð/ÌÉ#ïx$ðàРd&( Òb‚œ( ø8PнO؝ոÀ´aÁ@srj[ý`ÁØÁ ƒ[X]v궫ÒËn"ã_ÿ¦ñ¿N€8\ß°AM"õàò€4 ÈKԈÙð¹Î•&MƒÁШå­kZÓCD­Ö¹Š(¤¢±¸€lÑX.ˆ†Î5 iې k˜‡îPp:Ì£Ìzø„à$@ ”xš e!DYP€ÈÀ€`ˆøÙ´ Vÿ¢X(dHÔtÅH»E’NÂV&7TIíeg’$Ý𴖰òb§³£ðÈǘíñ–âòãC°‚wà†¤%1‹Ù[ê2\¹L&žxù<à+¤?€,3›ÚD2™¹¢ez3E΄Læ,ÝÚ&;ÛYËá…S™-Šç.ÝiÏ{‚§›ô8÷éšqâ3 5‡>ý9®yTE(Cú΄Š«Ÿ¥ËBSÓ,‡zçZí,èDu"ю℗I‡- -8ä æ3Ÿäþ€“ºr…®D%¶ž6ŽXî C–óœ:e¹´®5à¤o ‘úÚÀ5huH-KjCW"úÿ!ÍMhS¯fU®ÐLðéA¹º"?‚â°×è>'Ô6¤ôkWä\µä 5jaƒ#1@¼¹ÙN¬áàUÞ"ZµÍ…ˆã,Ý0§¢®AŠ)}€»+,¬¥rÕ¿¢Š- <`°UEZ¬ºó€³®f«^­ËGGË./õZÀÐÒn妶r¡„¥û´¤uѾ抵Æbm³Ý®!d·c@¬² B/L(l¿jmŠu¬‹A‹¯&#ÜÐÛºáJYÝYí¯-ëÂn `^™Z‚ à¾q5 Kâ$0Ì-@‰ À&rEkڜ”ö¾ëð£­B'˜, JS@ùŒÅ0£}Rÿ¶ÂØ¿újµÍщs ØZ°°XG~ÕõÀ5Óu¥á‘¸ ©j,™ä\`»|Vv˜æ2&ÝÂí½uo¯îFÜŽ® ‹!ZÝFøzm‚.ô±°S,ʊ… ­~_“ß&#Ž ¬Ë[ú…! @mwZhÉ Ô=¶•µmY‹± ÿ‹°î¼n¶S£Ü Á¯toN<]`ÝN0tS.óc{¥Ü±•ÍÎ5žãü Z‰¬Žc–KxÂàmÂ¥Y©ùt›ÖTîYmxË®F‚0Ü˸uõWK-·…=×Ê]Uõ]üH–°% uY¦ÚÊĵŒé¯` Pîì0۔þZ‚mÿËó'¶eA«s´àt{»ñ.Ä8c괐>GSÇjÓ4£µpÄ1ÂÛ°ÓrxÙpé°bóÐd Vœ½º½Et0ø¶ûØÀQVâÉø–ÆÈbÁù*Ù×ØZ˜—V_«~ ‹_œ§k7üií¡c žìfmmŠœcކÕh>ÇZ|ë¸_L]Õ¸Þà˜ëĘRé^| €îÇ¥±!’w—+¯T¨ò ÙwßëзÐgÆxRH‡Á¿ZÊq ,áFã¸ÏÝG'¦Q(Dµ Y;ÀÙ|‰{ýömˆuÁ؋œrþÚw\¶ÝØáj×ó 1ò.L¸%1T;ÿyaÇãyOšÒ9·øÒÖMs;ËxtÔÊN¼¤´*Ó©Ë_¸]ª‹„Z~,lhÀÕ7–HåRãŠØéÈÇ=zm¶UT|_»ìD¿åïÃ¬ãÝ`5 h‘&–XáÏ7:Í[Òn»«º¸Ö4ˆ›i!"0yÅqn°eŒc tpµ‰ñݯÏjò7¶ZîX Ý,]5‘Olÿ¢þ"õºÈ÷ª4è™ïÑ-ïGüÀtÂ?)A$¶®)@¦È|’€‘L)õU9iHKäÇmÁ(õŸ"­Ò,]‡€ˆÐÕI͗°V'y’ää\‚H™à”Q`Ç(K¨‰†Žÿ{%$…ÐþIÀ ÎMp±–„ÄÙ­½@ ¸R'Å'µçq؛ü͟ñ`^FÙÑuL\¼FaáÙB¡<Ô_ÑñRˆØKT!êLQ¢a@†€Á:Ý[~¡ÐUÔLhÐaâ¡`Vî váO<áVÁæa!jӁŒ›¼!Æá¾¢!B"1=À9¹@—¥ b#⛠XU'zâ'‚b(Šâ(’b)šâ)¢b*ªâ*²b+ºâ+ŽâÇP":™ &þ¡&²'Ââ.òb/úâ/c0 c*Ê"%fÖØ"¢ BÁ#Fâ3PbéA22â22£ÑAãÿ6¾…uÎҁœ“œÔ"6!.ªš3rã:Ɓ,L€Æ  Ì:ÅA]ùX5fc4 #”©#;úã€Í‘©€Þ,÷ác>æ6æc?þãCj ‰0…ڐ5ž#Cf£CBä?N˜ M à(äB–dvdJÊÁüJˆ@  ÀÐd `Ç·œ$ýi$3r¤Jn£œ@JŒ@”ÀªdÃÐ×aäüíc“í$O>£L¤ƒÈKJ°å!åMâEN bS¶“† håA‹!áw8‘’™8H²€ ¨À@.ˆMbåNÄå Bb褵 ùŒáÀ‰¹µTj,ÝXŽÿƒ D7´å HGJ À=>Ô\2ÁRêWjG¶€neKì\ ­€MÙmqm‘’„‰æ´¥ÔøØmmˑKy±á†Ý–oéò9¦6”ãdC ¨@J|€cց9*¥Vþ!e¦ÕÕq!çîlN­¨ ìñ©Ø¶]&Ή ƒmH쉕ɠ²ÌÚ<ÍÉ(‘„P „(™+õ‹o}'֜QzRC‰çmfƒ èfÐÈd6„XҁpfždޗqžÆIKz‚ 8ðË´]ڙH'؈ͺ¹Ð˜1šýåîÔxIµÙÍÚ´Ê¥ÐÖ Ô` `hÝQ„(aN‘øå6„‰Àÿ DåŒWò§åYÀ¬ d>َœ¸JïŒÂ`Hþ$(Ä鏫ŒhútÝю QŒ ‹â±ùÌ _õNÞiAéÔQÀ$ܬIùN™P£80¡„ À㠘©6¬@þ]¤ŽÎF‚!>•ÐþôK¥Y\ð!YÈíîÜù4Üë´¨­Ô"¡ioiȖnȉuÚJ͐˜§g¤8‹Nê~&eæL§Ú>y€¹JãuŸˆ, [D€Xi™½½Ü]ÕM[ï̛EV˜RÈôÛ¬‰ei¬ÙàTgÞÔ} ,™s€*Êé¾Uª¹Óêٜ±¬›T™Öÿú¤]‘sßY†¬Þ™&ëhߚÀÀÁ­ø ùtTŒ¯¹ £¦«í¥A÷¬‰t‡Jû‰Ãجé»$=ÖÒÍÀé$Ê\@²jØ=Mý˜ MÅZþyÈnjÖh¥Œ ÞaèœI%ñJ¾T¯¸’"yˆš¼PAËɊ’×°Òɶ !Óà9ŒÍdj6Œ€ hX9=è(dÐBæÂ6³Í&jÀœ9Ì×Øèg€]ª˜ÀIŒ € 4ÁÞÁÏÂ)ahˆè¨f;)Uéá65m9L‹„ÒNbÁÔá9(4èh |Ì¥ ¤6yeÇnU9¥ÿ€ÞÆ%ß&€”è(ˆ˜YîãÆÅøœjÔgZÀ†• 'Bn羅 ˆd@ £ŽÖ†Ì‘Ï9q­ç².\BfÂ4@S­ß$ÀzQ"üµnî’-V ­€i€Ž:€$£1ú–à/¥%o¡Ê’ò6/óò ô"ïóšÏòV/õ¢öMô^/÷f¯÷nïô‚¯õ~¯øš¯óŽ¯ö’oø¢ïùJoûÂoœîIzÀx*n\€ZÎ,j-¶iúïÿº–ðÿ0·'°/0ãŠ?0G° ðKpðèd°S0cpk0spO0 p p oðK®ÿŽr6!À¹”dm°¯îâ°9<À²ª@KìÎeX¥±Øî¦æðˈíMv€ûA€eÜdåâ‡"qÛAâÎ¥f cemDíQZqÃÁw1lïMzÊq·‹Ý–ä 1‚äh>Z€»qs?ܤØj¤±B:ëq!·Àq6^€¿Æð0WUà±!S²!€Á2£VLj3f@ÙVr(‹×mä#àî4@„.N€ ±(ò0@z0£+¯.€mÅ*]¡X€Ür,Ã2ä2v@|8ÿ*ó23s3;ó3Cs4KóÒs5³I£4kó6ss7GóÄuA;PK€«Ýù=ô=PK/¯-AOEBPS/img/wsrm.gifsŒëGIF89a3ªÕ ÀÀÀ@@@ÐÐÐððð   000 àààppp```°°°PPP¿¿¿???___ßßßïïïOOOoooÏÏϟŸŸ¯¯¯///€€€ÿÿÿÿÿÿ!ù ,3ªÿ@pH,È¤rÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°Ø›o¹#0»ßðx³ ¶‚€[!?.ú€XC„hm‰†BlB„m j …I‰m Œ¢“žB  wC  « ©™•ž ™…j ¡CŽ¦²jG‰‰D­ C…± m…¿‚×ØÚÛÛÝÞÞëÜJ7aB¹"½¾ƒ|ށƒàA €$üá¼0òX1ýÍ¢hðw1N€Àªã!<À-`œ#€ð@W€Fa}¶á»Ú÷¾$ h@à”G€À`[÷³_Í8g·]̪ÛÛ¶辝%À(€ê¿èõp[#]Dè*&¶‹„Œ; À-z`‚/ÜÖ '˜^÷ °-q] ýë>ÊQ°Œ¦@_äÅ(0ÿc†Øžêò·¿<ø{ô ~x‡0^#Î8øMÌó8w‹¿ rRpb©4™®:~ˆƒŒ¤ø è çeì|(ôP—±f0RÂÃß#ùCŒ©.ˆœu† ²U_ð$zA‹¶¥‚m €#T֊Äñv­c×ìf‡†óµB‰Nàd¥Ò§¼2d–8ŸÂDiø c|˜ç¢Ha&L›„JŸÞô¸ÓMO ‰p Ä¶ÐtPXÛ"M`ŠF; w7vê žƒZßö6'À ªNyæ›eù Gûíqsw@:…€ÃþÐÊkÅé0Š€B–yÿRp' ê¥õ  (^º×ø¥l{D@%Ó)½½)À™}3L·Åû #’Ü\çâGG2UxD}‚LFÓ.­§TœŸò0Ñ?¯…¢,ßl×U>•ã©ðawl"RWµÆ”¡”sh¾ºú `z¸cT9W€8­{%$aÁÀÐ±eà¢~˜W©¢z$՟c[0ÒºO°VÀôìê‰<ÜA²Kxj¯@XÐt@ŒŸøpǐ²x¢ÐiŒêl†fyQÒ.vîŽèÀþü ‚ [íB÷Ё" ‘œ„VÉ9†ÚV„w\ÿ«ßäµ½ã}·žjµä„wB¿qkŠ~3ÄrA°=:¬3…ãbz·gD'd— ¦ …ðÀG˚%À‚tH@\€6lÏâƒy©B ®bÆÀ&쉷1@Âò"€Âs ©Š{ª0€ÅiPX 3܄o!uFß9—ÂH^lÂs5] ¹°áÍ4YZ>ÖÂ~ÇÉ­3BPBì¡ÎØF3<¹)_6V”³ä"™eëáïXÖåòΑg¦]rÄè\ȪùÊÕS³šÛ,†0cÃϾ3¶Û]‚·Ê,#ò™3.n¶U´ $m+Ac§FUƒk/ÙE*@ ÞlÍÿXÌc/P§v•¥û愭_©–C¬KõêzÍ·®T­é•k7ôz]q†ô¼~íf:g­.Ú±ƒ–샑pfЎ¶´_Ö즙v3Ï8“GËín{ûÛà·¸+îr›ûÜÝn,¡&¦í+âÝðŽ·¼çMïz×û„öη¾÷-olR‡ÝíÆVà¾[®zrLØ],pÀ±…[…“Kî(¾ps)n wûv©½q"`¯¸¯nˆ1]ªÞ ðÛu+uKœ ù«0ª1ó".wUË ðñ+Ä\æ¥:@âF«GŒS”ç/7UǑn…Ÿ½R @ª¸ ¾r!è/ÅÌZzқàÿô§—êç’@ °Nk!|s!÷º«ºN ±“Žà~ՈkŒM¶«}P?÷6‹Ð¸Â›Ø5î¹ÚÚ pÃOûÝ-õszKœÝ€'w Pj„"hyâÿ«®3 oʋÑ@£Ûo‹#éæ9«Ÿ¾ƒ”G²‹µbC\fTÙ™[ ۇKñ¬÷RÌ؋ébs¸n*ÿ†< Ýœ¦?*Š·F*®>økO»ÑŒFñ<诃̇Ãìçûch¯ ¨z±ÿªáóÍh ØøAm~l= vg¿¶wö£A&a1¶'6H;•³Gb ~ú·±• 6-Åsÿå×æ”XJå{D@xcyH x{Š'b´³u àJ¥× . PÀCp,³TȀ!(‚JP|€8—t*tZ§§P:uÄf¦‚51'CÄ7 ~ À 0)£´w AäWñ‡ PEATjJ¸„}ЄzÐwƒ$…Sw¦w ÅlP8jˆvdˆwŠ×†‹C0õ*˜Øt4x‡e8‚ª wLq G³1!7†„ø`÷Ž°u„0oMÁ‚.Eð>’8‰k‡9¸ƒ3'„DxÎ K×'Š›Ñ„O¸9RÈ9“2Ķ…|ӅLY¸~ÿ®øoiç|h˜~·‡J@r¢3ƒ¿Œ7ø`À‡o ¼øoPxÑ衸Œûbˆw Š"ÖAÈ PU XjƒLʨ›¨x²…ˆ²§ƒd׎2VIgN_¨Ø³ŽìhƒI ƒChŽ¦×3ôÎ× >hK¬ÈwƒØ`sFS€c?ä'r HæˆsH H8ŏɄi@±p†ÌgV¯˜EÛ²u¼¨iàoÙ8’Yðs þ7 PÓV:Dà ÙöˆX3I“>Œ¢åX!LJŸ¸b& €<óãX-u”FI’Ÿ ‘¿c7#H‚`yÓ` ˆsr‘W©ÿGžðb x™2ÈfvX‚x–…xL*„ tyàGÖÇÔÐ3byŽRP”vy˜—2NHÄx„Ђóˆs<—µ7V™˜pp'ؘCZY½o™©™npã8Ž8ɗ¦wÜö”Ø€‚sfiš´‰Kåmõnãšp yx›¶9Š]Ј›1zÛRz1e üâ›Ã©˜J Z‰ˆysvÛh‡rv6»Õ  uøœuiBà“Eè*ÂÈ»w˜óà¹IOgø]2~äœ ©1}ٞ]s©´Fzð˜¶bWpGS›ú¹?§Às§/7”žêžÿÀ' Q§ŠO„1ò¡ÐÙnÆ¥¡\€˜n€e4¢$Z¢&z¢(j¢“—¢,Ú¢.Š¢ê—òF–TÀOÞ¢kÀ’/º£<Ú£>ú£edÂ&aÇCn¹P7r@º¤(ª”Lú¤&ª28:.ٙ` „p8¥Lf¦Yªb×Æo¥dZ¦f*]7¥àR¥GcÓÐX[EX8ÇÃ-A4y|àTI~C¤4“;pjú-lú4³„Réô…öӍÈs“§0AèW3Bº}aº€÷ ‚j íR¨WãŸÀ0 Ö·31hWÈä4÷’2”iš¦šª.œú5nZ3è úƒ?èÇS3Yÿºê©€Ú0™ 1¯ÚP¾ 4µ*ªÉP_hª¼šª¿Ê0ÁÚ0ÃJ—¦JEzñ3,Ór_ÈQ̺•FcNöI—ê ÑÊ0Ó:6øô ׄAù¤0«ƒT6 ­ƒ9¡@™HGP®Õq® “®¢ ïÌ؊°ÕA nH®«zƒê-[σxª¬¬*¬Ö°ƒxûŠÛ0©ƒn";²${n焟ë€+®éX=˜ðaŽe  84®nÀsü¶³<Û³ûVKŠc:L³£µ DJ9FD;aGzÊð_Øx|6q 08D•WTO²4= 5}»Å““y K\ë<ÿ9&7–åX~óZs ªO—É=Ih£Úªï(œésÔsG€C”:]«YVø8 ÐA °–1™<1éGd4HÀ]cÓ^MÛ¦Ù¢[‚Ó6h+JóÔCœÓ×ë¼ë J¼À0·1eà8ôCdÔµ±‹1èHBÀBÿÿ½1ä>|ãa)5…ò•½KXht›«1{t1†÷@Ês¾ä$–”W±ôn³Ä-\Àt«LœSEôI,>ÒÛ P»U;Àà3 @ä8)„…;l;K5Wšå8¼¢´_´X TP9 Ó-› W¦ãJWô7YlÂÑAO =V˜K-ìYá>³7‘ÄEá“Äoô¼]달NÔ#ÁQXŸE cnô@kÁ§sRmteÉuÁ³£ÁEpÅTü½sfùÓ|³_mtGÈkIŒà:|È=úËÄÜBD÷sh24Æ7ÌdžPÄpÌÃ| tÜ=ÜSĦÿ¦sWË˾8ô`˜¼YÓNê˓vk¨ÿ ³=^É,››ÈFÆ2Ӄ?Ž¼7Žå<‰d½@Å9㙵FÇ-?*´wùIûÛ¿K¼0þ:p =ÛæXŒK:ó£CÆp¸ d &aÊd»¢`:’Ë Ó3„Up37–1½ø+r³i¢ðBœw¯¥KK›­3Ïò"Ëô\:1Û͛¶i?„aþÓ2ͳz£Ò¤,­żb|Èë°­š.@3µ¤‚»cÓ¿‡±*æ7•k))K!-0xFBF­Ñ£½UÕs‰®¼MZý°ÝŠ×†¯ÿZ`LP©JÐÔL±ÍW 5¶8šN¤Öþ¸ÒH—p~c“äzP³{ÿ¼`åD‚jy SýåØ×V}7ädN†ÕD£í;PKÏrÚ?xsPK/¯-AOEBPS/cluster.htm€ÿ クラスタ内のWebサービスの管理

9 クラスタ内のWebサービスの管理

この章では、クラスタ内のWebLogic Webサービスの管理方法について説明します。

この章の内容は以下のとおりです。


注意:

クラスタでのWebサービス永続性の使用に関する考慮事項は、「クラスタでのWebサービス永続性の使用」を参照してください。


Webサービス・クラスタでのルーティングの概要

ステートレスWebサービス(それまでの起動における状態情報を認識している必要のないサービス)のクラスタリングは単純であり、サード・パーティのHTTPロード・バランサに対して既存のWebLogic HTTPルーティング機能と連携して動作します。

状態情報のメンテナンスが必要なWebサービスのクラスタリングには課題がいくつかあります。そのようなWebサービスの各インスタンスは状態情報に関連付けられており、この状態情報を管理し、保持する必要があります。クラスタでのルーティングの決定は、メッセージがクラスタ内の特定のサーバーにバインドされているかどうかに基づいて行われます。たとえば、メッセージの処理に必要な状態情報が特定のサーバーに格納されいる場合、その状態情報はそのサーバーでローカルに使用することしかできません。


注意:

セッション状態レプリケーションを使用して状態を管理するサービスは、Reliable Secure ProfileのようなWebサービスの高度な機能を利用するサービスとは問題の種類が異なります。後者では、ローカル・サーバーのみで利用できる状態の格納を備えるなど、永続性に関してより堅牢なアプローチが必要です。詳細は、「永続性に関する注意」を参照してください。


Webサービス・リクエストが適切なサーバーにルーティングされるようにするだけでなく、クラスタリングに関する次の一般的な要件を満たす必要があります。

  • クラスタの内部トポロジは、クライアントに対して透過的にする必要があります。クライアントは、フロントエンド・ホストのみを介してクラスタと相互通信するため、クラスタ内の特定のサーバーを認識する必要はありません。これによって、クラスタは時間をかけて拡張し、需要を満たすことができます。

  • クラスタの移行がクライアントに対して透過的に行われることが必要です。クラスタ内のリソース(永続ストアなど、WebサービスまたはWebサービス・クライアントに必要なリソース)は、クラスタの拡大や障害対応などの理由で、あるサーバーから別のサーバーへ移行できます。

クラスタ内のWebサービスのルーティングについては、前述の要件に合せて、次の方式が用意されています。

  • インプレースSOAPルーター: リクエスト・メッセージが正しいサーバーに届き、そうでない場合は正しいサーバーに転送されることを前提としています(追加ホップは最大1回)。ルーティングの決定は、メッセージを受信するWebサービスが行います。このルーティング方式は実装が最も簡単であり、構成も必要ありません。ただし、次の方式に比べると堅牢性に劣ります。

  • フロントエンドSOAPルーター (HTTPクラスタ・サーブレットのみ): メッセージ・ルーティングは、クラスタのかわりにメッセージを受け入れるフロントエンド・ホストによって管理され、クラスタの選択メンバー・サーバーに転送します。Webサービスの場合、フロントエンドSOAPルーターは、SOAPメッセージ内の情報を検査し、メッセージをルーティングする先の正しいサーバーを決定します。

    このルーティング方式は構成が複雑ですが、メッセージが適切なサーバーに直接ルーティングされるため効率的です(追加ホップは発生しません)。


    注意:

    「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」の説明に従って接続作成を使用するとき、所定の接続作成匿名URIに関連するすべてのメッセージの適切なルーティングを保証できるのはフロントエンドSOAPルーティングのみです。


この章では、クラスタ内のWebサービスのルーティングが最適化されるように環境を構成する方法について説明します。フロントエンドSOAPルーターとしてのHTTPクラスタ・サーブレットの使用についても説明します。また、インプレースSOAPルーターを有効化し、HTTPクラスタ・サーブレットが使用できない場合や初期化されていない場合に使用します。

永続性に関する注意

「HTTPセッションを使用したステートフルJAX-WS Webサービスのプログラミング」で説明されているように、一部のケースではHttpSessionを使用してWebサービスの状態を維持できますが、この単純な永続性には十分な堅牢性がありません。Webサービスの高度な機能(信頼性のあるメッセージング、接続作成、Secure Conversationなど)では堅牢な永続性が要件となっており、HttpSessionのみを使用して満たすことはできません。Webサービスの高度な機能は、論理ストアという概念に基づいた専用の永続性実装を使用します。詳細は、「Webサービス永続性の管理」を参照してください。

現時点では、Webサービス状態の永続性に関するこの2つのアプローチには互換性がありません。HttpSession永続性を使用するクラスタ化ステートフルWebサービスの作成を選択してから、(クライアントまたはサービスとして)そのサービスでWebサービスの高度な機能を使用すると、クラスタにおけるサービスの正常な動作が保証されません。これは、HttpSessionレプリケーションが、Webサービスの高度な機能の永続性をホストするのではなく、様々なサーバー・セットでHttpSessionを使用可能にできるためです。

クラスタでのルーティングのシナリオ

次の項では、クラスタ環境内でWebサービスのリクエスト・メッセージとレスポンス・メッセージをルーティングする際のシナリオについて、図を使用して説明します。

シナリオ1: 単一サーバーへのWebサービス・レスポンスのルーティング

このシナリオでは、受信したリクエストがサーバーに対してロード・バランシングされます。そのリクエストへのレスポンスをすべて、その同じサーバーにルーティングすることによって、元のリクエストにかわって状態情報を保持する必要があります。

図9-1 単一サーバーへのWebサービス・レスポンスのルーティング

図9-1の説明が続きます
「図9-1 単一サーバーへのWebサービス・レスポンスのルーティング」の説明

前の図に示すように、次のような処理が行われます。

  1. フロントエンドSOAPルーターが、受信したHTTPリクエストをルーティングし、標準的なロード・バランシング手法でServer2に送信します。

  2. Server2が、Webサービスのエンドポイント・アドレスにあるMyserviceを呼び出します。SOAPメッセージのReplyToヘッダーには、フロントエンドSOAPルーターへのポインタが含まれています。

  3. MyServiceがフロントエンドSOAPルーターにレスポンスを戻します。

  4. フロントエンドSOAPルーターは、レスポンスのルーティング先を決定する必要があります。Server2がレスポンスに関連する状態情報を保持しているため、フロントエンドSOAPルーターはレスポンスをServer2にルーティングします。

シナリオ2: ルーティング情報を使用した単一サーバーへのWebサービス・レスポンスのルーティング

このシナリオでは、受信したリクエストがサーバーに対してロード・バランシングされます。レスポンスには、後続のリクエストに関する元のサーバーを宛先とするルーティング情報が含まれています。

図9-2 単一サーバーへのWebサービス・リクエストのルーティング

図9-2の説明が続きます
「図9-2 単一サーバーへのWebサービス・リクエストのルーティング」の説明

前の図に示すように、次のような処理が行われます。

  1. フロントエンドSOAPルーターが、受信したHTTPリクエスト(Request1)をルーティングし、標準的なロード・バランシング手法でServer2に送信します。リクエストにはルーティング情報は含まれていません。

  2. Server2が、Webサービスのエンドポイント・アドレスにあるMyserviceを呼び出します。SOAPメッセージのReplyToヘッダーには、フロントエンドSOAPルーターへのポインタが含まれています。

  3. MyServiceが呼出し元にレスポンスを戻します。レスポンスには、Server2を後続のすべてのリクエストのターゲットに指定するルーティング情報が含まれています。呼出し元は、レスポンスに含まれているルーティング情報を、後続のすべてのリクエスト(Request2など)に入れて渡します。

  4. フロントエンドSOAPルーターが、Request2とともに渡されたルーティング情報を使用して、Request2をServer2にルーティングします。

シナリオ3: IDを使用した単一サーバーへのWebサービス・レスポンスのルーティング

このシナリオでは、受信したSOAPリクエストにIDが含まれていますが、ルーティング情報は含まれていません。同じIDを持つ後続のリクエストはすべて、同じサーバーに送られる必要があります。

図9-3 IDを使用した単一サーバーへのWebサービス・レスポンスのルーティング

図9-3の説明が続きます
「図9-3 IDを使用した単一サーバーへのWebサービス・レスポンスのルーティング」の説明

前の図に示すように、次のような処理が行われます。

  1. リクエストは、ID (接続作成匿名URI)を含むWebサービス・クライアントに由来し、このIDはRequest1に関連する将来のリクエストによって共有されます。このIDのフォームはプロトコル固有のものです。

  2. フロントエンドSOAPルーターがRequest1のIDを検出し、アフィニティ・ストアをチェックして、そのIDがクラスタ内の特定のサーバーに関連付けられていないかを調べます。この場合、関連付けは定義されていません。

  3. フロントエンドSOAPルーターがリクエストのロード・バランシングを行い、処理のためにリクエストをServer2に送信します。

  4. Server2のMyService Webサービス・インスタンスがリクエストを処理します(必要に応じてレスポンスを生成します)。この場合、シナリオ2: ルーティング情報を使用した単一サーバーへのWebサービス・レスポンスのルーティングとは異なり、ルーティング情報は伝播できません。

  5. Request1で使用したのと同じIDを使用して、Request2がフロントエンドSOAPルーターに到着します。

  6. フロントエンドSOAPルーターがIDを検出し、アフィニティ・ストアをチェックして、そのIDが特定のサーバーに関連付けられていないかを調べます。この場合、IDがServer2にマップされていることが判明します。

  7. アフィニティ情報に基づいて、フロントエンドSOAPルーターがRequest2をServer2にルーティングします。

Webサービス・クラスタでのルーティングの仕組み

次の項では、Webサービス・クラスタでのルーティングの仕組みについて説明します。

送信するリクエストへのルーティング情報の追加

Webサービス・ランタイムは、次のような場合でもメッセージのルーティングが適切に行われるよう、送信するすべてのメッセージのSOAPヘッダーにルーティング情報を追加します。

  • リクエストの送信元のWebサービス・クライアントが、クラスタに属するすべてのサーバーからはアクセスできないストアを使用している場合。

  • リクエストが、レスポンスの処理に使用されるメモリー内の状態情報を必要とする場合。

送信するメッセージを処理する際、Webサービス・ランタイムは次のことを実行します。

  • 送信するリクエストにメッセージIDが割り当てられていない場合はメッセージIDを作成し、RelatesTo/MessageID SOAPヘッダーに次の形式で格納します。

    uuid:WLSformat_version:store_name:uniqueID

    説明:

    • format_versionには、WebLogic Server形式のバージョン(WLS1など)を指定します。

    • store_nameには、永続ストア(メッセージを送信する現在のWebサービスまたはWebサービス・クライアントによって使用されるストア)の名前を指定します。たとえば、Server1Storeです。この値は、システムで生成される名前(デフォルトの永続ストアを使用する場合)または空の文字列(永続ストアが構成されていない場合)です。

    • unique_IDには、一意のメッセージIDを指定します。例:68d6fc6f85a3c1cb:-2d3b89ab8:12068ad2e60:-7febです。

  • 他のWebサービス・コンポーネントが、メッセージにルーティング情報を組み込んでからメッセージを送信できるようにします。

受信したリクエストのルーティング情報の検出

SOAPルーター(インプレースまたはフロントエンド)は、受信したリクエストにルーティング情報がないかチェックします。特に、SOAPルーターはRelatesTo/MessageID SOAPヘッダーを探して永続ストアの名前を特定し、その永続ストアをホストするサーバーにメッセージを戻します。

フロントエンドSOAPルーティングを使用して正しいサーバーを判別する際にエラーが発生した場合、メッセージはクラスタ内のいずれかのサーバーに送信され、インプレースSOAPルーターが使用されます。インプレースSOAPルーターでフォルトが発生した場合、メッセージの送信元はプロトコル固有のバック・チャネルでフォルトを受信します。


注意:

ルーティング情報を含むSOAPメッセージ・ヘッダーは、平文で表す必要があります。暗号化することはできません。


クラスタ内でのリクエストのルーティング

ルーティングの決定を助けるため、SOAPルーター(インプレースまたはフロントエンド)はストアとサーバーの名前の関連付けを表す動的マッピングを使用します。この動的マップはクラスタ内の管理対象サーバーで作成されたもので、インプレースSOAPルーターはメモリー内でアクセスし、フロントエンドSOAPルーターはHTTPレスポンス・ヘッダーを介してアクセスします。HTTPレスポンス・ヘッダーは、クラスタ内のWebサービスから送信されたすべてのHTTPレスポンスに自動的に組み込まれます。


注意:

HTTPレスポンス・ヘッダーの詳細は、「フロントエンドSOAPルーターでのルーティング・マップの保持」を参照してください。


当初、動的マップは空です。初期化されるのは、クラスタ内の管理対象サーバーから最初のレスポンスを受信した後です。HTTPレスポンス・ヘッダーを含む最初のレスポンスを受信するまで、フロントエンドSOAPルーターは単にリクエストのロード・バランシングを行い、インプレースSOAPルーターはリクエストを適切なサーバーにルーティングします。

SOAPベースのルーティング情報がない場合、単純なロード・バランシング(ラウンドロビンなど)が行われている、HTTPセッション・ベースのルーティングを含むベース・ルーティングに従います。

フロントエンドSOAPルーターでのルーティング・マップの保持

「クラスタ内でのリクエストのルーティング」で述べたように、ルーティングの決定を助けるため、SOAPルーター(インプレースまたはフロントエンド)はストアとサーバーの名前の関連付けを表す動的マッピングを使用します。

この動的マップを生成するために、2つの新しいHTTPレスポンス・ヘッダーが用意されています(この後の項を参照)。これらのヘッダーは、クラスタ内のWebサービスから送信されたすべてのHTTPレスポンスに自動的に組み込まれます。


注意:

サード・パーティのフロントエンドを実装する際は、この後説明するHTTPレスポンス・ヘッダーを組み込むために、変数X-weblogic-wsee-request-storetoserver-listを任意の値に設定したHTTPリクエスト・ヘッダーを、クライアントから送信する必要があります。


X-weblogic-wsee-storetoserver-list HTTPレスポンス・ヘッダー

ストアとサーバーのマッピングの一覧は、X-weblogic-wsee-storetoserver-list HTTPレスポンス・ヘッダーに保持されます。フロントエンドSOAPルーターは、このヘッダーを使用して、実行時に参照可能なマッピングにデータを移入し、メッセージのルーティングを行います。

X-weblogic-wsee-storetoserver-list HTTPレスポンス・ヘッダーは次の形式を取ります。

storename1:host_server_spec | storename2:host_server_spec | storename3:host_server_spec

各値の説明は次のとおりです。

  • storenameには、永続ストアの名前を指定します。

  • host_server_specには、servername:host:port:sslportという形式で指定します。不明な場合、sslportは-1に設定されます。

X-weblogic-wsee-storetoserver-hash HTTPレスポンス・ヘッダー

ストアとサーバーのリストのハッシュ・マッピングは、X-weblogic-wsee-storetoserver-hash HTTPレスポンス・ヘッダーに指定されます。このヘッダーを使用すると、新しいマッピング・リストをリフレッシュする必要があるかどうかを判断できます。

X-weblogic-wsee-storetoserver-hash HTTPレスポンス・ヘッダーには、X-weblogic-wsee-storetoserver-list HTTPレスポンス・ヘッダーに含まれるリストのハッシュ値を表す文字列値が組み込まれます。リストの最後のエントリを追跡することで、リストのリフレッシュが必要かどうかを判断できます。

クラスタ内のWebサービスの構成

次の表に、クラスタ内のWebサービスを構成する手順をまとめます。

表9-1 クラスタ内のWebサービスを管理する手順

#
手順説明

1

WebLogicクラスタを設定します。

「WebLogicクラスタの設定」を参照してください。

2

Webサービスの高度な機能に必要なクラスタ・ドメイン・リソースを構成します。

クラスタ拡張テンプレート・スクリプトを使用すると、必要なクラスタ・ドメイン・リソースを自動的に構成できます。もう1つの方法として、Oracle WebLogic管理コンソールまたはWLSTを使用し、リソースを構成することも可能です。「クラスタ環境におけるWebサービスの高度な機能に必要なドメイン・リソースの構成」を参照してください。

3

フロントエンドSOAPルーターを拡張してWebサービスをサポートします。

注意: この手順は、フロントエンドSOAPルーターを使用する場合のみ必要です。

Webサービス・ルーティング・サーブレットは、WebLogic HTTPクラスタ・サーブレットの機能を拡張して、クラスタ内のWebサービスのルーティングをサポートします。「フロントエンドSOAPルーターの拡張によるWebサービスのサポート」を参照してください。

4

Webサービス原子性トランザクション・メッセージのルーティングを有効にします。

「Webサービス原子性トランザクション・メッセージのルーティングの有効化」を参照してください。

5

Webサービスの接続作成メッセージのルーティングを有効にします。

「Webサービスの接続作成メッセージのルーティングの有効化」を参照してください。

6

フロントエンドSOAPルーターのIDを構成します。

クラスタ内の各WebLogic ServerインスタンスをフロントエンドSOAPルーターのアドレスおよびポートで構成する必要があります。「フロントエンドSOAPルーターのIDの構成」を参照してください。


WebLogicクラスタの設定

『Oracle WebLogic Serverクラスタの使用』のWebLogicクラスタの設定に関する項の説明に従って、WebLogicクラスタを設定します。次の点に注意してください:

クラスタ環境におけるWebサービスの高度な機能に必要なドメイン・リソースの構成

構成ウィザードを使用してドメインの作成または拡張を行う際には、WebLogic Advanced Web Services for JAX-WS拡張テンプレート(wls_webservice_jaxws.jar)を適用すると、クラスタ環境でWebサービスの高度な機能をサポートするのに必要なリソースを自動的に構成できます。この拡張テンプレートの使用は必須ではありませんが、使用すると必要なリソースの構成が格段に容易になります。あるいは、Oracle WebLogic管理コンソールまたはWLSTを使用して、これらの高度な機能に必要なリソースを構成できます。

また、テンプレートによって、ドメインの変化(サーバーの追加や削除など)に合せて、高度なWebサービスで必要なリソースを管理するために使用できるスクリプトがドメイン・ディレクトリにインストールされます。

ドメインの構成方法やリソースを管理するためのスクリプトの実行方法の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』の高度なWeb Services機能のためのドメインの構成に関する項を参照してください。

フロントエンドSOAPルーターの拡張によるWebサービスのサポート


注意:

フロントエンドSOAPルーターを使用しない場合、この手順は不要です。


フロントエンドSOAPルーターを拡張してWebサービスをサポートするには、次の例(太字の部分)に示すRoutingHandlerClassNameパラメータを、WebLogic HTTPクラスタ・サーブレット定義の一部として指定します。

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>HttpClusterServlet</servlet-name>
    <servlet-class>weblogic.servlet.proxy.HttpClusterServlet</servlet-class>
    <init-param>
       <param-name>WebLogicCluster</param-name>
       <param-value>Server1:7001|Server2:7001</param-value>
    </init-param>
   <init-param>
      <param-name>RoutingHandlerClassName</param-name>
      <param-value>
         weblogic.wsee.jaxws.cluster.proxy.SOAPRoutingHandler
      </param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>HttpClusterServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
. . .
</web-app>

Webサービス原子性トランザクション・メッセージのルーティングの有効化

Webサービス原子性トランザクション・メッセージの高可用性およびルーティングは、Webサービスのクラスタ環境では自動的に有効になります。ただし、WebLogic HTTPクラスタ・サーブレットがフロントエンド・サーバーとして使用されている場合は、WebLogic HTTPクラスタ・サーブレットをホストするサーバーで、次のシステム・プロパティをfalseに設定する必要があります。

weblogic.wsee.wstx.wsat.deployed=false

また、WebLogic Serverプラグインを使用するときは、WLIOTimeoutSecsパラメータ値を適切に構成する必要があります。このパラメータは、WebLogic Serverからのリクエストに対するレスポンスをプラグインが待機する時間を定義します。サーブレットによる処理の時間よりもこの値が小さい場合は、予期しない結果が生じることがあります。WLIOTimeoutSecsパラメータの詳細は、『Oracle WebLogic ServerにおけるWebサーバー・プラグインの使用』のWebサーバー・プラグインの一般的なパラメータに関する項を参照してください。

Webサービスの接続作成メッセージのルーティングの有効化

Webサービスの接続作成をサポートするには、「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」に記載されているように、WebLogic HTTPクラスタ・サーブレットをホストしているWebLogic Server上にデフォルトの論理ストアを構成する必要があります。デフォルトの論理ストアの構成の詳細は、「論理ストアの構成」を参照してください。

フロントエンドSOAPルーターのIDの構成

クラスタ内の各WebLogic ServerインスタンスをフロントエンドSOAPルーターのアドレスおよびポートで構成する必要があります。ネットワーク・チャネルを使用すると、クラスタのフロントエンド・アドレスにアクセスするための一貫した方法を提供できます。ネットワーク・チャネルの詳細は、『Oracle WebLogic Serverサーバー環境の構成』のネットワーク・チャネルの理解に関する項を参照してください。

各サーバー・インスタンスについて、以下の手順を実行します。

  1. Webサービスの呼出しに使用するプロトコル用のネットワーク・チャネルを作成します。ネットワーク・チャネルの名前は、weblogic-wsee-proxy-channel-XXXとする必要があります(XXXはプロトコルを表します)。たとえば、HTTPS用のネットワーク・チャネルを作成する場合、weblogic-wsee-proxy-channel-httpsという名前にします。

    ネットワーク・チャネルの作成に関する一般情報は、Oracle WebLogic Server管理コンソール・ヘルプのカスタム・ネットワーク・チャネルの構成に関する項を参照してください。

  2. 「外部リスニング・アドレス」および「外部リスニング・ポート」フィールドを、それぞれプロキシ・サーバーのアドレスおよびポートで更新して、ネットワーク・チャネルを構成します。

クラスタのルーティング・パフォーマンスのモニター

次のクラスタ・ルーティング統計をモニターすると、アプリケーションのパフォーマンスを評価できます。

  • リクエストおよびレスポンスの総数。

  • サーバーにルーティングされたリクエストおよびレスポンスの総数。

  • ルーティングの失敗に関する情報(総数と最後の失敗を含む)。

WebLogic Server管理コンソールまたはWLSTを使用して、クラスタのルーティング・パフォーマンスをモニターできます。WebLogic Server管理コンソールを使用してクラスタのルーティング・パフォーマンスをモニターする方法については、Oracle WebLogic Server管理コンソール・ヘルプのWebサービスのモニターに関する項およびWebサービス・クライアントのモニターに関する項を参照してください。

PKfåñé¬ß¬PK/¯-AOEBPS/img_text/callback.htmÙ&þ Description of the illustration callback.gif

This figure shows the flow of messages for the example callback implementation.

PKÙËEÞÙPK/¯-A OEBPS/img_text/cluster_async.htm?Àý Description of the illustration cluster_async.gif

This figure shows a clustering scenario that results in an error. The cluster consistes of two servers, Server1 and Server 2. The flow resulting in an error is described below.

PK‚+ŠD?PK/¯-AOEBPS/img_text/coordinator.htmäý Description of the illustration coordinator.gif

Shows the coordinator for managing Web services atomic transactions. The figure shows the activation service and registration service components which enable a Web service to activate a transaction and create a coordination context, and register as a participant. The coordinator can support multiple protocols (such as, WS-AtomicTransaction).

PK@B>éäPK/¯-A&OEBPS/img_text/persistence_cluster.htmÈ7þ Description of the illustration persistence_cluster.gif

This figures show a two-node cluster configuration.

PKz§0¥ÍÈPK/¯-A*OEBPS/img_text/handler_execution_order.htmÖ)þ Description of the illustration handler_execution_order.gif

This graphic shows the order of execution of handler methods.

PKì3] ÛÖPK/¯-AOEBPS/img_text/cluster.htmùþ Description of the illustration cluster.gif

The figure shows how a Web service response is routed to a single server. The flow is described in detail below.

PK[ÕÖóþùPK/¯-A"OEBPS/img_text/cluster_request.htmÿý Description of the illustration cluster_request.gif

The figure shows how a Web service request is routed to a single server. The flow is described in detail below.

PKêä„PK/¯-AOEBPS/img_text/wsatarch.htm0Ïý Description of the illustration wsatarch.gif

Figure shows two instances of WebLogic Server using Web services atomic transactions. The coordinator and participant interact with the local JTA transaction manager.

PKì[™50PK/¯-A!OEBPS/img_text/asynctransport.htmýþ Description of the illustration asynctransport.gif

The figure illustrates the asynchronous client transport message flow that is described in full detail below.

PKrÚ0ëýPK/¯-AOEBPS/img_text/wsadv_dt_001.htmò þ Description of the illustration wsadv_dt_001.gif

This figure illustrates how the SOAP fault processing is performed during the SOAP protocol binding.

PKÕñ·ù÷òPK/¯-AOEBPS/img_text/wsrm.htm˜gý Description of the illustration wsrm.gif

This illustration shows the flow of a one-way reliable message exchange. The Web service client sends a message to the RM Source, which transmits to the RM Destination. The RM Destination delivers the message to the Web service and send and acknowledgement to the RM Source.

PK±Q»½˜PK/¯-A%OEBPS/img_text/cluster_request_id.htmñý Description of the illustration cluster_request_id.gif

The figure shows how a Web service request is routed to a single server using an ID The flow is described in detail below.

PKW04áPK/¯-AOEBPS/img_text/persistence.htmØ'ý Description of the illustration persistence.gif

The figure shows the components of the Web service persistence store. Two servers within a cluster each have a Web service that accesses the logical store, which in turn references the physical store and buffering queue. The physical store provides the connection to the physical storage mechanism, such as a file, DBMS, and so on.

PK´»ÝÝØPK/¯-A)OEBPS/img_text/persistence_clustermig.htmÛ$þ Description of the illustration persistence_clustermig.gif

This figure shows a two-node cluster configuration after migration.

PKYò³?àÛPK/¯-AOEBPS/img_text/mc.htmI¶ü Description of the illustration mc.gif

This figure shows the MakeConnection Message flow. The flow shown is as follows: 1) The MC Initiator sends a qetQuote() request message. 2) The MC Receiver sends an Empty Response back to the MC Initiator. 3) The MC Initiator polls the MC Receiver for a response. 4) The MC Receiver sends an Empty Response back to the MC Initiator. 5) The MC Initiator polls the MC Receiver for a response. 6) The MC Receiver sends the response back to the MC Initator.

PKÛ¹vNIPK/¯-AOEBPS/stateful.htmy,†Ó HTTPセッションを使用したステートフルJAX-WS Webサービスのプログラミング

21 HTTPセッションを使用したステートフルJAX-WS Webサービスのプログラミング

この章では、Oracleデータベースと対話する、Java API for XML Web Services (JAX-WS)を使用したWebLogic Webサービスの開発方法について説明します。

この章の内容は以下のとおりです。

ステートフルWebサービスの概要

通常、JAX-WS Webサービスはステートレスです。つまり、Webサービス・オブジェクトに設定したどのローカル変数とオブジェクト値も、1つの呼出しから次の呼び出しまで保存されません。1つのクライアントからの順次的な各リクエストも独立、ステートレス・メソッド呼出しとして扱われます。

Webサービスの使用例として、クライアントが呼出しの途中でサービスにデータを保存しておき、その後の呼出しで保存したデータを使用するというものがあります。たとえば、ショッピング・カート・オブジェクトを、addToCart Webメソッドを繰り返し呼び出して追加した後、getCart webメソッドで取得するとします。ステートレスWebサービスでは、addToCartメソッド呼出しの数に関係なく、ショッピング・カート・オブジェクトは常に空となります。しかし、HTTPセッションを使用して複数のWebサービス呼出しにわたって状態を保持すれば、カートの中身を徐々に増やした後、カートをクライアントに戻すことができます。

JAX-WS Webサービスでのステートフル・サポートは、クライアント側、サーバー側ともに最小限のコーディングで有効にできます。

サーバーでHTTPセッションにアクセスする

サーバーでは、すべてのWebサービス呼出しがHttpSessionオブジェクトに関連付けられています。このオブジェクトは、リソース・インジェクションを使用してWebサービス・オブジェクトにバインドされているWebサービス・コンテキストからアクセス可能です。HttpSessionオブジェクトにアクセスしたら、それに任意のステートフル・オブジェクトを「ハング」オフできます。クライアントが次にWebサービスを呼び出すと、Webサービスは同じHttpSessionオブジェクトを見つけて、その中に以前格納したオブジェクトを参照することができます。これでWebサービスはステートフルになりました。

サーバーでの必要な手順は以下のとおりです。

  1. Webサービスの冒頭に(Common Annotations for the Java Platform、JSR 250で定義されている)@Resourceを追加します。

  2. コンテキストが注入されているWebServiceContext型の変数を追加します。

  3. Webサービス・コンテキストを使用してHttpSessionオブジェクトを取得します。

  4. setAttributeメソッドを使用してHttpSessionにオブジェクトを保存し、getAttributeを使用して格納されたオブジェクトを取得します。オブジェクトが割り当てる文字列値によって識別されます。

次のスニペットは、その使い方を示します:

例21-1 サーバーでのHTTPセッションへのアクセス

@WebService
public class ShoppingCart {
   @Resource    // Step 1
   private WebServiceContext wsContext;    // Step 2
   public int addToCart(Item item) {
      // Find the HttpSession
      MessageContext mc = wsContext.getMessageContext();    // Step 3
      HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
      if (session == null)
         throw new WebServiceException("No HTTP Session found");
      // Get the cart object from the HttpSession (or create a new one)
      List<Item> cart = (List<Item>)session.getAttribute("myCart");  // Step 4
      if (cart == null)
         cart = new ArrayList<Item>();
      // Add the item to the cart (note that Item is a class defined 
      // in the WSDL)
      cart.add(item);
      // Save the updated cart in the HTTPSession (since we use the same 
      // "myCart" name, the old cart object will be replaced)
      session.setAttribute("myCart", cart);
      // return the number of items in the stateful cart
      return cart.size();
   }
}

クライアントでのHTTPセッションの有効化

クライアント側コードはとても簡単です。必要なのは、リクエスト・コンテキストにSESSION_MAINTAIN_PROPERTYを設定することのみです。これにより、Webサービスから受信したHTTP Cookieを戻すようクライアントに指示します。Cookieには、サーバーがWebサービス呼出しを正しいHttpSessionと対応させるためのセッションIDが含まれており、これによって任意の保存済ステートフル・オブジェクトへのアクセスが可能になります。

例21-2 クライアントのHTTPセッションの有効化

ShoppingCart proxy = new CartService().getCartPort();
((BindingProvider)proxy).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
// Create a new Item object with a part number of '123456' and an item 
// count of 4.
Item item = new Item('123456', 4);
// After first call, we'll print '1' (the return value is the number of objects 
// in the Cart object)
System.out.println(proxy.addToCart(item));
// After the second call, we'll print '2', since we've added another 
// Item to the stateful, saved Cart object.
System.out.println(proxy.addToCart(item));

セッション状態レプリケーションを使用してクラスタ内のステートフル・サービスを開発する

高可用性環境では、1つのJAX-WS Webサービスがクラスタ内の複数のサーバー・インスタンスにレプリケートされる場合があります。このような環境でステートフルJAX-WS Webサービスをサポートするには、WebLogic Server HTTPセッション状態レプリケーション機能を使用します。詳細は、『Oracle WebLogic Serverクラスタの使用』のHTTPセッション状態レプリケーションに関する項を参照してください。

セッション状態レプリケーションを使用してクラスタ化された環境を設定するには、様々な技術要件および構成要件(サポートされているサーバーやロード・バランサなど)があります。JAX-WSプログラミングの観点から、唯一の新しい考慮事項は、(例21-1に示されているように)HttpSession.setAttributeメソッドを使用してHttpSessionに格納するオブジェクトは、シリアライズ可能であることが必要な点です。シリアライズ可能であると、クラスタ内のレプリケートされたすべてのWebインスタンス上のWebサービスに対してそれらのステートフル・オブジェクトが使用可能になり、JAX-WSステートフルWebサービスでロード・バランシングとフェイルオーバーの両方の機能を使用できるようになります。

JAX-WS RI @ステートフル拡張に関する注意

JAX-WS 2.1 Reference Implementation (RI)には、@Statefulアノテーションを使用してステートフルJAX-WS Webサービスの異なるモデルをサポートするベンダー拡張があります。その実装は、状態を特定のインスタンスに固定するもので、スケーラビリティやフォルト・トレランスを目的としていません。WebLogic Server JAX-WS Webサービスでは、この機能はサポートされません。

PK<Ë9~,y,PK/¯-A OEBPS/rm.htm€ÿ Webサービスの信頼性のあるメッセージングの使用

6 Webサービスの信頼性のあるメッセージングの使用

この章では、Java API for XML Web Services(JAX-WS)を使用するWebLogic Webサービスで、Webサービスの信頼性のあるメッセージング(WS-ReliableMessaging)を使用する方法について説明します。

「信頼性のあるWebサービスとクライアントを開発する手順」も参照してください。

この章の内容は以下のとおりです。

WebLogic Serverのサンプル・サーバーには、信頼性のあるメッセージングに関する次の3つのサンプルが含まれています。

  • JAX-WS Webサービスでの信頼性のあるメッセージングの構成

  • JAX-WS Webサービスでの接続作成および信頼性のあるメッセージングの使用

  • JAX-WS Webサービスでの保護された信頼性のあるメッセージングの構成

詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Server配布キットのWebサービス・サンプルに関する項を参照してください。

Webサービスの信頼性のあるメッセージングの概要

Webサービスの信頼性のあるメッセージングとは、ある1つのアプリケーション・サーバーで実行中のアプリケーションが、別のアプリケーション・サーバーで実行中のWebサービスを確実に呼び出せるフレームワークです。ここでは、双方のサーバーでWS-ReliableMessaging仕様が実装されていることが前提となっています。信頼性が高いとは、ソフトウェア・コンポーネント、システム、またはネットワークの障害があっても、2つのエンドポイント(Webサービスとクライアント)間でメッセージ配信を保証することができる状態として定義されます。

WebLogic Webサービスは、WS-ReliableMessaging 1.2仕様(2009年2月)(http://docs.oasis-open.org/ws-rx/wsrm/200702)に準拠しています(また、バージョン1.1をサポートしています)。この仕様では、異なるアプリケーション・サーバー上の2つのエンドポイント(Webサービスとクライアント)が確実に通信できる方法について記述されています。具体的には、この仕様では送信元エンドポイント(つまりクライアントWebサービス)から宛先エンドポイント(つまり操作を確実に呼び出せるWebサービス)へ送信されるメッセージが、1つ以上の配信保証に基づいて確実に配信されるか、そうでなければ必ずエラーが発生する、相互運用性を備えたプロトコルについて説明されています。

信頼性のあるWebLogic Webサービスには、次の配信保証が備わっています。

表6-1 信頼性のあるメッセージングの配信保証

配信保証説明

At Most Once

メッセージは最大で1回、重複なしに配信されます。メッセージによっては、一度も配信されない可能性もあります。

At Least Once

すべてのメッセージが、少なくとも1回配信されます。メッセージによっては、1回よりも多く配信される可能性があります。

Exactly Once

すべてのメッセージが、必ず1回重複なしに配信されます。

In Order

メッセージは、送信された順序で配信されます。この配信保証は、上記の3つの保証と組み合わせることもできます。


次の項では、信頼性のあるWebサービスとクライアントの作成方法、およびWebサービスをデプロイするWebLogic Serverインスタンスの構成方法について説明します。

WS-Policyを使用した信頼性のあるメッセージング・ポリシーのアサーションの指定

WebLogic Webサービスでは、宛先エンドポイントがWebサービスの信頼性のあるメッセージングの機能と要件を記述および公開できるように、WS-Policyファイルを使用します。WS-Policyファイルは、サポートされているWS-ReliableMessaging仕様のバージョンやサービス品質の要件などが記述されたXMLファイルです。WS-Policy仕様(http://www.w3.org/TR/ws-policy/)では、Webサービスのポリシーを記述して通信するための、汎用的なモデルと構文が提供されています。

WebLogic Serverには、標準的な信頼性のあるメッセージング・アサーションを含むあらかじめパッケージ化されているWS-Policyファイルがあります。「Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」を参照してください。あらかじめパッケージ化されているWS-Policyファイルがニーズに合わない場合は、独自のWS-Policyファイルを作成する必要があります。詳細は、「Webサービスの信頼性のあるメッセージングのWS-Policyファイルの作成」を参照してください。信頼性のあるメッセージングのポリシー・アサーションに関するリファレンス情報は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスの信頼性のあるメッセージングのポリシー・アサーションに関するリファレンスの項を参照してください。

信頼性のあるメッセージングでサポートされるトランスポート・タイプ

Webサービスの信頼性のあるメッセージングは、非同期的または同期的に使用できます。メッセージを非同期に配信するときは、必要に応じて、メッセージ配信の自動再試行をサポートするようにバッファリングを構成できます。

次の表では、Webサービスの信頼性のあるメッセージングに対するトランスポート・タイプのサポートを示します。Webサービス・クライアントのトランスポート・タイプのサポートの詳細は、「Webサービス・クライアントからの信頼性のあるWebサービスの呼出し」を参照してください。障害リカバリの詳細は、「信頼性のあるメッセージングの障害リカバリのシナリオ」を参照してください。


注意:

メッセージ・バッファリングは、Webサービスに対して構成できます。詳細は、第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。Webサービス・クライアントの場合、メッセージ・バッファリングはデフォルトで有効化されています。


表6-2 Webサービスの信頼性のあるメッセージングのトランスポート・タイプ

トランスポート・タイプ特長

非同期トランスポート

バッファ付きWebサービスの場合:

  • 最も堅牢な使用モードですが、最も多くのオーバーヘッドを必要とします。

  • メッセージ配信を自動的に再試行します。

  • ネットワークが停止しても維持されます。

  • 送信元エンドポイントまたは宛先エンドポイントを再起動できます。

  • 非匿名ReplyToを使用します。

  • 非同期クライアント・トランスポートを使用すると、1つのスレッドで複数のリクエストを処理でき、負荷をいっそう効率よく緩和できます。詳細は、「スケーラブルな非同期JAX-WSクライアントの開発(非同期クライアント・トランスポート)」を参照してください。

  • Webサービス・クライアントは、非同期または同期の呼出しセマンティクスを使用して、Webサービスを呼び出すことができます。詳細は、表4-1「非同期Webサービス呼出しのサポート」を参照してください。

非バッファWebサービスの場合:

  • 非同期のバッファ付き使用モードよりオーバーヘッドが少なくなります。

  • 順序の状態のみが保持されます。

  • 非匿名ReplyToを使用します。

  • Webサービス・クライアントは、非同期または同期の呼出しセマンティクスを使用して、Webサービスを呼び出すことができます。詳細は、表4-1「非同期Webサービス呼出しのサポート」を参照してください。

同期トランスポート

  • オーバーヘッドは最も少なく、最も簡単なプログラミング・モデルです。

  • 匿名ReplyToを使用します。

  • Webサービス・クライアントは、非同期または同期の呼出しセマンティクスを使用して、Webサービスを呼び出すことができます。詳細は、表4-1「非同期Webサービス呼出しのサポート」を参照してください。

  • Webサービス・クライアントが同期トランスポートを使用してバッファ付きWebサービスを呼び出した場合、結果は次のいずれかになります。

    - シーケンスの最初のリクエストの場合、宛先のシーケンスはバッファなしに設定されます(Webサービスの構成がバッファなしとして設定されていた場合と同様)

    - シーケンスの最初のリクエストではない場合は(つまり、クライアントが前に非同期トランスポートを使用してリクエストを送信していた場合)、リクエストは破棄されてエラーが返されます。


信頼性のあるメッセージ・シーケンスのライフサイクル

次の図に、信頼性のあるメッセージの一方向の交換を示します。

図6-1 Webサービスの信頼性のあるメッセージの交換

図6-1の説明が続きます
「図6-1 Webサービスの信頼性のあるメッセージの交換」の説明

信頼性のあるメッセージ・シーケンスは、RM送信元とRM宛先の間で確実に交換されるメッセージ・セットの進捗状況を追跡する際に使用されます。シーケンスは、0個以上のメッセージの送信に使用でき、文字列識別子で識別されます。この識別子は、信頼性のあるメッセージングを使用する際に、そのシーケンスを参照するために使用されます。

Webサービス・クライアント・アプリケーションは、RM送信元がRM宛先へ送信する信頼性のある配信のメッセージを送信します。RM宛先は、信頼性のあるメッセージを受信したことを確認応答し、そのメッセージをWebサービス・アプリケーションに配信します。RM送信元は、確認応答を受け取るまでメッセージを再送信できます。RM宛先は、リクエストをバッファリングするように構成されている場合は、Webサービスがリクエストの処理に失敗すると、Webサービスにリクエストを再配信できます。

Webサービス・クライアントは、クライアント・インスタンス(ポート・インスタンスまたはディスパッチ・インスタンス)でメソッドを呼び出して、ターゲットWebサービスにメッセージを送信します。ポートは、ポート・タイプの信頼性のあるWebサービスと関連付けられていて、そのサービスに対するプログラム・インタフェースを表します。ポートは、jwsc Antタスクの<clientgen子要素で作成されます。ディスパッチ・インスタンスはクライアントからWebサービスにメッセージ全体を配信するための、緩やかに型指定された汎用インタフェースです。ディスパッチ・クライアントの詳細は、「Webサービス・ディスパッチ・クライアントの開発」を参照してください。

WebLogicでは、このクライアント・インスタンス内に、信頼性のあるメッセージ・シーケンスの識別子が格納されます。これによって、信頼性のあるメッセージ・シーケンスが単一のクライアント・インスタンスに接続されます。特定のクライアント・インスタンスを使用して送信されるすべてのメッセージは、その送信メッセージ数に関係なく、同じ信頼性のあるメッセージ・シーケンスを使用します。(バッチ化を使用しない場合は、「ビジネス作業単位へのメッセージのグループ化(バッチ化)」を参照してください。)

WebLogic Serverには、信頼性のあるシーケンスに関連付けられたリソースが保持されるため、タイミングよくリソースを解放する手順を踏むことをお薦めします。この手順は、クライアント・インスタンス自体のライフサイクルを管理するか、またはweblogic.wsee.reliability2.api.WsrmClient APIを使用して実行できます。WsrmClient APIを使用すると、構成オプションの設定、シーケンスIDの取得、信頼性のあるシーケンスの終了といった一般的なタスクを実行できます。詳細は、「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」を参照してください。

信頼性のあるメッセージングの障害リカバリのシナリオ

次の項では、さまざまなシナリオでの信頼性のあるメッセージングの障害リカバリの概要について説明します。

最初の3つのシナリオでは、Webサービスとクライアントの両方でバッファリングが有効であるものとします。最後のシナリオでは、バッファなしのWebサービスでの信頼性のあるメッセージングの障害リカバリについて説明します。バッファリングは、Webサービス・クライアントではデフォルトで有効になります。Webサービスでのバッファリングの構成の詳細は、第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。

リクエストが到着する前にRM宛先がダウンする

表6-3では、RM送信元からのリクエストが到着する前にRM宛先が使用できなくなったときの、信頼性のあるメッセージングの障害リカバリ・シナリオについて説明します。

Webサービスとクライアントの両方でWebサービス・バッファリングが有効であるものとします。バッファリングは、Webサービス・クライアントではデフォルトで有効になります。Webサービスでのバッファリングの構成の詳細は、第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。

表6-3 信頼性のあるメッセージングの障害リカバリのシナリオ: リクエストが到着する前にRM宛先がダウンする

トランスポート・タイプシナリオの説明

非同期トランスポート

  1. クライアントが非同期メソッドを呼び出します。

  2. 信頼性のあるメッセージングのランタイムがリクエストを受け付けます。クライアントは他の作業に戻ります。

  3. 信頼性のあるメッセージングのランタイムはリクエストの配信を試みますが、RM宛先がダウンしているため失敗します。

  4. 信頼性のあるメッセージングのランタイムは再試行間隔だけ待ってから、リクエストの送信を再び試みます。リクエストの配信は再び失敗します。

  5. RM宛先が起動します。

  6. 信頼性のあるメッセージングのランタイムは再試行間隔だけ待ってから、リクエストの送信を再び試みます。リクエストの配信が成功します。

  7. リクエストのメッセージ番号を含む確認応答が、クライアントに送信されます。信頼性のあるメッセージングのランタイムは再試行リストからメッセージを削除します。

  8. レスポンスが到着し、クライアントはそれを処理します。

注意: 「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」で説明されているように、クライアントはいつでも、確認応答のステータスを確認したり、メッセージについての情報にアクセスしたりできます。

同期トランスポート

  1. クライアントが同期メソッドを呼び出します。

  2. 信頼性のあるメッセージングのランタイムはリクエストを受け付け、クライアントのスレッドをブロックします。

  3. 信頼性のあるメッセージングのランタイムはリクエストの配信を試みますが、RM宛先がダウンしているため失敗します。

  4. 信頼性のあるメッセージングのランタイムは再試行間隔だけ待ってから、リクエストの送信を再び試みます。リクエストの配信は再び失敗します。

  5. RM宛先が起動します。

  6. 信頼性のあるメッセージングのランタイムは再試行間隔だけ待ってから、リクエストの送信を再び試みます。リクエストの配信が成功します。

  7. レスポンスと確認応答は、トランスポート戻りチャネルを通してクライアントに送信されます。確認応答には、リクエストのメッセージ番号が含まれます。信頼性のあるメッセージングのランタイムは再試行リストからメッセージを削除します。

  8. 信頼性のあるメッセージングのランタイムはクライアント・スレッドのブロックを解除し、レスポンスを返します。

  9. クライアントは、メソッド呼出しの戻り値としてレスポンスを受け取り、レスポンスを処理します。

注意: 「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」で説明されているように、クライアントはいつでも、確認応答のステータスを確認したり、メッセージについての情報にアクセスしたりできます。

注意: 同期トランスポートで真の信頼性を実現するには、接続作成を使用することをお薦めします。詳細は、「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」を参照してください。


リクエストが行われた後でRM送信元がダウンする

表6-4では、リクエストを行った後でRM送信元がダウンするときの、信頼性のあるメッセージングの障害リカバリ・シナリオについて説明します。

Webサービスとクライアントの両方でWebサービス・バッファリングが有効であるものとします。バッファリングは、Webサービス・クライアントではデフォルトで有効になります。Webサービスでのバッファリングの構成の詳細は、第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。

表6-4 信頼性のあるメッセージングの障害リカバリのシナリオ: リクエストを行った後でRM送信元がダウンする

トランスポート・タイプシナリオの説明

非同期トランスポート

  1. クライアントが非同期メソッドを呼び出します。

  2. 信頼性のあるメッセージングのランタイムがリクエストを受け付けます。クライアントは他の作業に戻ります。

  3. クライアント(RM送信元)がダウンします。

  4. クライアントが起動します。クライアントは、同じクライアントIDを使用してクライアント・インスタンスを初期化する必要があります。ランタイムは、このクライアントIDを使用して、クライアントに対してアクティブであった信頼性のあるシーケンスIDを取得します。詳細は、「クライアントIDの管理」を参照してください。

  5. 信頼性のあるメッセージングのランタイムは、クライアントがダウンする前に使用中であった信頼性のあるシーケンスIDを検出し、受け付けたリクエストを回復します。

    注意: リクエストの配信はクライアント・インスタンスによって提供されたリソースに依存するので、この手順は、リクエストの送信ã€ÿ«ä½¿ç”¨ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ»ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’クライアントが再初期化した後でのみ実行されます。クライアントでは、静的ブロック内でクライアント・インスタンスを初期化するか、@PostConstructアノテーションを使用するか、クライアント・インスタンスの早い初期化が保証される他のメカニズムを使用することをお薦めします。詳細は、「Webサービス・クライアントを開発する手順」で示されているベスト・プラクティスの例を参照してください。

  6. 信頼性のあるメッセージングのランタイムがリクエストを送信し、成功します。

  7. リクエストのメッセージ番号を含む確認応答が、クライアントに送信されます。信頼性のあるメッセージングのランタイムは再試行リストからメッセージを削除します。

  8. レスポンスが到着し、クライアントはそれを処理します。

注意: 「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」で説明されているように、クライアントはいつでも、確認応答のステータスを確認したり、メッセージについての情報にアクセスしたりできます。

同期トランスポート

  1. クライアントが同期メソッドを呼び出します。

  2. 信頼性のあるメッセージングのランタイムはリクエストを受け付け、クライアントのスレッドをブロックします。

  3. 信頼性のあるメッセージングのランタイムがリクエストの配信を試みます。リクエストの配信が成功します。

  4. レスポンスを送信できる前に、クライアント(RM送信元)がダウンします。VMが終了するので、クライアント・スレッドが、呼出し状態およびクライアント自体の呼出しスタックと共に失われます。

  5. クライアント(RM送信元)が起動します。クライアントは、同じクライアントIDを使用してクライアント・インスタンス(ポートまたはディスパッチ)を再初期化します。詳細は、「クライアントIDの管理」を参照してください。

  6. 信頼性のあるメッセージングのランタイムは、クライアントの以前のシーケンスIDを検出し、最後のリクエストが同期的に行われたことを確認します。

  7. 信頼性のあるメッセージングのランタイムは、そのリクエストに対して永久的障害通知を配信し、クライアント・インスタンスと関連付けられているRMシーケンス全体を失敗させます。クライアント・インスタンスと関連付けられているすべてのReliabilityErrorListenerが、この時点で呼び出されます。

  8. クライアントは、元のリクエストを取得し(何らかのクライアント固有のメカニズムを使用して)、リクエストでクライアント・インスタンスを再度呼び出してリクエストを再送信します。

注意: 「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」で説明されているように、クライアントはいつでも、確認応答のステータスを確認したり、メッセージについての情報にアクセスしたりできます。

注意: 同期トランスポートで真の信頼性を実現するには、接続作成を使用することをお薦めします。詳細は、「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」を参照してください。


リクエストが到着した後でRM宛先がダウンする

表6-5では、RM送信元からのリクエストを受け付けた後でRM宛先が使用できなくなったときの、信頼性のあるメッセージングの障害リカバリ・シナリオについて説明します。

Webサービスとクライアントの両方でWebサービス・バッファリングが有効であるものとします。バッファリングは、Webサービス・クライアントではデフォルトで有効になります。Webサービスでのバッファリングの構成の詳細は、第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。

表6-5 信頼性のあるメッセージングの障害リカバリのシナリオ: リクエストが到着した後でRM宛先がダウンする

トランスポート・タイプシナリオの説明

非同期トランスポート

  1. クライアントが非同期メソッドを呼び出します。

  2. 信頼性のあるメッセージングのランタイムがリクエストを受け付けます。クライアントは他の作業に戻ります。

  3. 信頼性のあるメッセージングのランタイムがリクエストの配信を試み、成功します。

  4. RM宛先はリクエストを受け付けて、戻りチャネルで確認応答を送信します。

  5. 信頼性のあるメッセージングのランタイムは確認応答を受け取り、再試行リストからメッセージを削除します。

  6. RM宛先がダウンします。

  7. RM送信元の信頼性のあるメッセージングのランタイムは、この間に保留中のリクエストを再試行します。

  8. RM宛先が起動します。

  9. RM宛先は格納されているリクエストを回復し、処理して、レスポンスを送信します。

  10. レスポンスが到着し、クライアントはそれを処理します。

注意: 「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」で説明されているように、クライアントはいつでも、確認応答のステータスを確認したり、メッセージについての情報にアクセスしたりできます。

同期トランスポート

注意: 同期トランスポートを使用してバッファ付きWebサービスを呼び出そうとした場合、結果は次のいずれかになります。

  • シーケンスの最初のリクエストの場合、宛先のシーケンスはバッファなしに設定されます(Webサービスの構成がバッファなしとして設定されていた場合と同様)。

  • シーケンスの最初のリクエストではない場合は(つまり、クライアントが前に非同期トランスポートを使用してリクエストを送信していた場合)、リクエストは破棄されてエラーが返されます。

次にこのシナリオのシーケンスを説明します。

  1. クライアントが同期メソッドを呼び出します。

  2. 信頼性のあるメッセージングのランタイムはリクエストを受け付け、クライアントのスレッドをブロックします。

  3. 信頼性のあるメッセージングのランタイムがリクエストの配信を試みます。リクエストの配信が成功します。

  4. RM宛先はリクエストを受け付けて、トランスポート戻りチャネルで確認応答を送信します。

  5. クライアント(RM送信元)は確認応答を検出し、再試行リストからリクエストを削除します。

  6. RM宛先がダウンします。

  7. クライアント・スレッドはブロックされたままになります。

  8. RM宛先が起動して回復し、リクエストを処理して、クライアントにレスポンスを送信します。

  9. 信頼性のあるメッセージングのランタイムはクライアント・スレッドのブロックを解除し、レスポンスを返します。

  10. クライアントは、メソッド呼出しの戻り値としてレスポンスを受け取り、レスポンスを処理します。

注意: 「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」で説明されているように、クライアントはいつでも、確認応答のステータスを確認したり、メッセージについての情報にアクセスしたりできます。


バッファなしの信頼性のあるWebサービスでの障害シナリオ

バッファなしWebサービスの動作はバッファ付きWebサービスとは異なり、リクエストの確認応答と処理を行う前に、強化されたストレージに要求をバッファリングしません。バッファなしWebサービスはサービス・ロジックが失敗した場合でもリクエストを再処理しませんが、バッファ付きWebサービスはリクエストを再処理します。どちらの場合も、Webサービスによって生成されるすべてのレスポンスは、クライアントに返送される前にバッファリングされます。

バッファなしWebサービスは、次の場合に有効である場合があります。

  • Webサービスが非トランザクション・リソースに対して動作しており、リクエストを2回以上処理する必要がない場合(バッファリングされたリクエストをデキューしたトランザクションのロールバックでは、非トランザクション・サービスの二次的影響をロールバックできないため)。

  • Webサービスが比較的軽量であり、リクエストの処理に時間がかからない場合。

  • Webサービスではパフォーマンスが最も重要であり、リクエストまたはレスポンスを失ってもかまわない場合。バッファなしWebサービスではリクエストをストアにバッファリングするオーバーヘッドがないため、バッファ付きWebサービスよりスループットがよくなります。パフォーマンスの向上は、リクエストをバッファリングするために必要な時間とリソースによって異なります(たとえば、非常に大きいリクエスト・メッセージでは、バッファリングに多くの時間とリソースが必要な場合があります)。

ほとんどの障害シナリオでは、バッファなしWebサービスの動作はバッファ付きWebサービスとほぼ同じです。例外は、サービス(RM宛先)自体で障害が発生した場合です。たとえば、説明したすべてのRM送信元障害シナリオでは、動作はバッファ付きWebサービスでもバッファなしWebサービス(RM宛先)でも同じです。バッファなしWebサービスでは、次の2つのポイントの間で障害ウィンドウが開きます。

  • リクエストが処理のために受け付けられます。

  • Webサービスからのレスポンスがクライアント(RMリソース)への配信のために登録されます。

これら2つのポイントの間でWebサービス(RM宛先)に障害が起きると、RM送信元はリクエストが正常に処理されたものと判断しますが(確認応答を受け取ったため)、レスポンスを受け取ることはなく、リクエストが処理されない可能性があります。

Webサービスをバッファなしとして実行するように構成する前に、この障害ウィンドウをよく検討してください。

信頼性のあるWebサービスの作成および呼出し手順

WebLogic Webサービスの信頼性のあるメッセージングを構成するには、JMSサーバーやストア・アンド・フォワード(SAF)・エージェントの作成など標準的なJMSタスクとともに、JWSファイルへのJWSアノテーションの追加などWebサービス固有のタスクを実行する必要があります。また、あらかじめパッケージ化されているファイルを使用しない場合は、必要に応じて、信頼性のあるWebサービスの信頼性のあるメッセージング機能を記述したカスタムWS-Policyファイルをユーザー側で作成します。

信頼性のあるWebサービスの呼出しにWebLogicクライアントAPIを使用している場合、クライアント・アプリケーションはWebLogic Server上で実行される必要があります。したがって構成タスクを、Webサービス・クライアントのコードがデプロイされる送信元WebLogic Serverインスタンスと、信頼性のあるWebサービスそのものがデプロイされる宛先WebLogic Serverインスタンスの双方で実行する必要があります。

表6-6は、信頼性のあるWebサービスと、その操作を呼び出すクライアントを作成する手順を説明しています。この手順では、Webサービスとクライアントを実装するJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。またこの手順では、ソースWebLogic Serverインスタンスと宛先WebLogic Serverインスタンスの構成方法も示しています。

以下の作業を完了している必要があります。

  • 宛先と送信元のWebLogic Serverインスタンスを作成しておきます。信頼性のあるWebサービスを宛先WebLogic Serverインスタンスにデプロイし、信頼性のあるWebサービスを呼び出すクライアントを送信元WebLogic Serverインスタンスにデプロイします。

  • Antベースの開発環境を設定しておきます。

  • 編集(jwsc Antタスクを実行して信頼性のある生成済Webサービスをデプロイするためのターゲットの追加など)が可能な作業用のbuild.xmlファイルの用意。

詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスの開発に関する項を参照してください。非同期の信頼性のあるWebサービスとクライアントの開発のベスト・プラクティスは、「信頼性のあるWebサービスとクライアントを開発する手順」を参照してください。

表6-6 信頼性のあるWebサービスの作成および呼出し手順

#
手順説明

1

宛先WebLogic ServerインスタンスとソースWebLogic Serverインスタンスを構成します。

信頼性のあるWebサービスを宛先WebLogic Serverインスタンスにデプロイし、信頼性のあるWebサービスを呼び出すクライアントを送信元WebLogic Serverインスタンスにデプロイします。宛先WebLogic Serverインスタンスの構成の詳細は、「送信元と宛先のWebLogic Serverインスタンスの構成」を参照してください。

2

WS-Policyファイルを作成する(オプション)

任意のXMLまたはプレーン・テキスト・エディタを使用し、必要に応じて宛先WebLogic Server上で実行されているWebサービスの信頼性のあるメッセージング機能が記述されたWS-Policyファイルを作成します。独自のWS-Policyファイルを作成する方法の詳細は、「Webサービスの信頼性のあるメッセージングのWS-Policyファイルの作成」を参照してください。

注意: WebLogic Serverに付属しているいずれかのWS-Policyファイルを使用する場合、この手順は不要です。詳細は、付録A「Web Services Reliable Messagingと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」を参照を参照してください。

3

信頼性のあるWebサービスを実装するJWSファイルを作成および更新します。

このWebサービスは、宛先WebLogic Serverインスタンスにデプロイされます。「信頼性のあるJWSファイルに関するプログラミングのガイドライン」を参照してください。

たとえばベスト・プラクティスについては、「信頼性のあるWebサービスとクライアントを開発する手順」を参照してください。

4

信頼性のあるWebサービスのコンパイルに使用されるbuild.xmlファイルを更新します。

build.xmlファイルを更新して、信頼性のあるJWSファイルをWebサービスにコンパイルするjwsc Antタスクの呼出しを含めます。

jwscタスクの使用に関する一般情報は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

5

信頼性のあるJWSファイルをコンパイルおよびデプロイします。

適切なターゲットを呼び出して信頼性のあるJWSファイルをコンパイルし、宛先WebLogic Serverにデプロイします。例:

prompt> ant build-reliableService deploy-reliableService

6

Webサービス・クライアントを作成または更新します。

Webサービス・クライアントは、信頼性のあるWebサービスを呼び出し、送信元WebLogic Serverにデプロイされます。「Webサービス・クライアントからの信頼性のあるWebサービスの呼出し」を参照してください。

7

信頼性のあるメッセージングを構成します。(オプション)

管理コンソールを使用して信頼性のあるWebサービスに対する信頼性のあるメッセージングを構成します。信頼性のあるWebサービスにアタッチされているWS-Policyファイルが、初期構成の設定を提供します。「信頼性のあるメッセージングの構成」を参照してください。

8

信頼性エラー・リスナーを実装します。(オプション)

信頼性のある配信が失敗した場合に通知を受け取る信頼性エラー・リスナーを実装します。「信頼性エラー・リスナーの実装」を参照してください。

9

信頼性のあるメッセージ・シーケンスのライフサイクルを管理します。(オプション)

WebLogic Serverでは、Webサービスの信頼性のあるメッセージングで使用するためのクライアントAPI weblogic.wsee.reliability2.api.WsrmClientが提供されています。このAPIを使用して、構成オプションの設定、信頼性のあるシーケンスIDの取得、信頼性のあるシーケンスの終了などの一般的なライフサイクル・タスクを実行します。詳細は、「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」を参照してください。

10

クライアントWebサービスのコンパイルに使用されるbuild.xmlファイルを更新します。

build.xmlファイルを更新して、信頼性のあるJWSファイルをWebサービスにコンパイルするjwsc Antタスクの呼出しを含めます。

jwscタスクの使用に関する一般情報は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

11

Webサービス・クライアント・ファイルをコンパイルしてデプロイします。

適切なターゲットを呼び出してクライアント・ファイルをコンパイルし、ソースWebLogic Serverにデプロイします。例:

prompt> ant build-clientService deploy-clientService

12

Webサービスの信頼性のあるメッセージングを監視します。

管理コンソールを使用して、Webサービスの信頼性のあるメッセージングを監視します。「Webサービスの信頼性のあるメッセージングの監視」を参照してください。


以降の項では、これらの各手順について詳細に説明します。さらに、次のトピックについて説明します。

送信元と宛先のWebLogic Serverインスタンスの構成

送信元と宛先のWebLogic Serverインスタンスに、Webサービスの永続性を構成する必要があります。信頼性のあるWebサービスを宛先WebLogic Serverインスタンスにデプロイし、信頼性のあるWebサービスを呼び出すクライアントを送信元WebLogic Serverインスタンスにデプロイします。

Webサービスの信頼性のあるメッセージングを使用するときは、状態が変化するたびに、Webサービスの信頼性のあるメッセージング・シーケンスがWebサービスの永続ストアに保存されます。状態変化の例を次に示します。

  • 信頼性のあるメッセージングの状態が更新された(作成中、作成済み、終了中、終了済みなど)。

  • セキュリティ・プロパティが更新された(セキュリティ・コンテキスト・トークンなど)。

  • 信頼性のあるメッセージング・シーケンスでメッセージが送信された(メッセージ・バッファリングが有効の場合)。

  • メッセージが到着したときに確認応答。

構成ウィザードでWebサービス固有の拡張テンプレートを使用してWebLogic Serverドメインを拡張することにより、Webサービスの永続性を構成できます。あるいは、Oracle WebLogic管理コンソールまたはWLSTを使用して、これらの高度な機能に必要なリソースを構成できます。Webサービス永続性の構成の詳細は、「Webサービス永続性の構成」を参照してください。

Webサービスにバッファリングを構成することもできます。メッセージ・バッファリングの構成に関する考慮事項と手順は、「第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。

Webサービスの信頼性のあるメッセージングのWS-Policyファイルの作成

WS-Policyファイルは、WS-Policy仕様に準拠するポリシー・アサーションを含むXMLファイルです。この場合、WS-PolicyファイルにはWebサービスの信頼性のあるメッセージングのポリシー・アサーションが含まれています。

WebLogic Serverには、標準的な信頼性のあるメッセージング・アサーションを含むWS-Policyファイルがあらかじめパッケージ化されています。独自のWS-Policyファイルを作成しない場合は、これらのファイルを使用できます。

次の表に、あらかじめパッケージ化されているWS-Policyファイルを示します。この表は、WS-Policyファイルをメソッド・レベルでアタダÿƒãƒã§ãã‚‹ã‹ã©ã†ã‹ã‚‚指定します。この列の値が「No」の場合、WS-Policyファイルをクラス・レベルでのみアタッチできます。詳細は、付録A「Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」を参照してください。


注意:

このリリースでは、DefaultReliability.xmlファイルとLongRunningReliability.xmlファイルは非推奨となっています。DefaultReliability1.2.xml、Reliability1.2_SequenceTransportSecurity、またはReliability1.0_1.2.xmlファイルを使用することをお薦めし、http://docs.oasis-open.org/ws-rx/wsrm/200702/wsrm-1.2-spec-os.pdfであるWS-ReliableMessaging仕様の1.2バージョンに準拠する必要があります。


表6-7 信頼性のあるメッセージングをサポートする、あらかじめパッケージ化されているWS-Policyファイル

あらかじめパッケージ化されているWS-Policyファイル説明メソッド・レベルのアタッチ
DefaultReliability1.2.xml

配信保証に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702のWS Reliable Messaging Policy Assertion 1.2が基になっています。「DefaultReliability1.1.xml (WS-Policyファイル)」を参照してください。

はい

DefaultReliability1.1.xml

サービス品質に関するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。「DefaultReliability1.1.xml (WS-Policyファイル)」を参照してください。

はい

Reliability1.2_ExactlyOnce_WithMC1.1.xml

サービス品質に関するポリシー・アサーションを指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。「Reliability1.2_ExactlyOnce_WithMC1.1.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.2_SequenceSTRSecurity

信頼性のあるシーケンスでメッセージを保護するために、CreateSequenceメッセージで参照されるwsse:SecurityTokenReferenceをランタイムが使用するように指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702のWS Reliable Messaging Policy Assertion 1.2が基になっています。「Reliability1.2_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.1_SequenceSTRSecurity

Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。「Reliability1.1_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

はい

Reliability1.2_SequenceTransportSecurity

トランスポート・レベルのセキュリティとサービス品質に関連するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702のWS Reliable Messaging Policy Assertion 1.2が基になっています。「Reliability1.2_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

はい

Reliability1.1_SequenceTransportSecurity

トランスポート・レベルのセキュリティとサービス品質に関連するポリシー・アサーションを指定します。Webサービスの信頼性のあるメッセージング・アサーションは、http://docs.oasis-open.org/ws-rx/wsrmp/200702/wsrmp-1.1-spec-os-01.htmlのWS Reliable Messaging Policy Assertion 1.1が基になっています。「Reliability1.1_SequenceTransportSecurity.xml(WS-Policyファイル)」を参照してください。

はい

Reliability1.0_1.2.xml

1.2と1.0のWS-Reliableメッセージング・ポリシー・アサーションを結合します。1.2バージョンのポリシー・アサーションはWebサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。このサンプルは、適切なポリシーの選択に基づいて実行時に適用されるポリシー・アサーションを決定します。「Reliability1.0_1.2.xml(WS-Policyファイル)」を参照してください。

いいえ

Reliability1.0_1.1.xml

1.1と1.0のWS Reliable Messagingポリシー・アサーションを結合します。「Reliability1.0_1.1.xml(WS-Policy.xmlファイル)」を参照してください。

はい

DefaultReliability.xml

非推奨。Webサービスの信頼性のあるメッセージングのアサーションは、WS Reliable Messaging Policy Assertion Version 1.0(http://schemas.xmlsoap.org/ws/2005/02/rm/WS-RMPolicy.pdf)に基づいています。このリリースでは、信頼性のあるメッセージングのポリシー・アサーションの多くが、JWSアノテーションまたは構成を通じて管理されます。

信頼性のあるメッセージングのポリシー・アサーションに一般的な値(非アクティブ・タイムアウト10分、確認応答の間隔200ミリ秒、基本的な再送信間隔3秒など)を指定します。「DefaultReliability.xml WS-Policyファイル(WS-Policy)[非推奨]」を参照してください。

はい

LongRunningReliability.xml

非推奨。長期実行プロセスに関して、Webサービスの信頼性のあるメッセージングのアサーションは、WS Reliable Messaging Policy Assertion Version 1.0に基づいています。このリリースでは、信頼性のあるメッセージングのポリシー・アサーションの多くが、JWSアノテーションまたは構成を通じて管理されます。

1つ前に示した、信頼性のあるメッセージングのデフォルトWS-Policyファイルとほぼ同じですが、アクティビティのタイムアウト間隔に、より大きな値(24時間)を指定する点が異なります。「LongRunningReliability.xml WS-Policyファイル(WS-Policy)[非推奨]」を参照してください。

はい


WebLogic Serverに含まれる、あらかじめパッケージ化されている信頼性のあるメッセージングWS-Policyファイルの1つを使用できます。これらのファイルは、ほとんどの場合に適合しています。あらかじめパッケージ化されているファイルは変更できません。値がニーズを満たさない場合は、カスタムのWS-Policyファイルを作成する必要があります。以下の節で、カスタムWS-Policyファイルの作成方法を説明します。

WS-ReliableMessagingポリシー・アサーション・バージョン1.2と1.1を使用したカスタムWS-Policyファイルの作成

この項では、次の仕様に基づいたWebサービスの信頼性のあるメッセージングのアサーションを含むカスタムWS-Policyファイルを作成する方法について説明します。

WS-Policyファイルのルート要素は<Policy>であり、次のネームスペース宣言が含まれている必要があります。

<wsp:Policy
   xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">

Webサービスの信頼性のあるメッセージングのポリシー・アサーションはすべて、<wsrmp:RMAssertion>要素の内部でラップします。この要素には、Webサービスの信頼性のあるメッセージングのポリシー・アサーションを使用するため、次のネームスペース宣言が含まれている必要があります。

<wsrmp:RMAssertion
   xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702"> 

次の表に、WS-Policyファイルで指定可能なWebサービスの信頼性のあるメッセージングのアサーションを示します。アサーションの指定順序は重要です。次のアサーションを指定できますが、WS-Policyファイルでは次の一覧の順序どおりに指定する必要があります。

表6-8 Webサービスの信頼性のあるメッセージング・アサーション(バージョン1.2および1.1)

アサーション説明
<wsrmp:SequenceSTR>

信頼性のあるシーケンスでメッセージを保護するため、ランタイムではCreateSequenceメッセージで参照されるwsse:SecurityTokenReferenceが使用されます。指定できるセキュリティ・アサーションは1つのみとなります。つまり、wsrmp:SequenceSTRまたはwsrmp:SequenceTransportSecurityのいずれか1つは指定できますが、両方は指定できません。

<wsrmp:SequenceTransportSecurity>

信頼性のあるシーケンスでメッセージを保護するため、ランタイムではCreateSequenceメッセージの送信に使用されるSSLトランスポート・セッションが使用されます。このアサーションは、特定の転送レベル・セキュリティ・メカニズム(sp:HttpsTokenなど)の使用を要求するsp:TransportBindingアサーションとともに使用する必要があります。指定できるセキュリティ・アサーションは1つのみとなります。つまり、wsrmp:SequenceSTRまたはwsrmp:SequenceTransportSecurityのいずれか1つは指定できますが、両方は指定できません。

<wsrm:DeliveryAssurance>

Webサービスの配信保証レベル(配信品質)。有効な値は、AtMostOnce、AtLeastOnce、ExactlyOnceおよびInOrder。次の表に定義されている配信保証レベルのいずれか1つを設定できます。設定しない場合、配信保証レベルはデフォルトのExactlyOnceが使用されます。配信保証の詳細は、表6-1を参照してください。


次の例では、簡単なWebサービスの信頼性のあるメッセージングのWS-Policyファイルを示します。

<?xml version="1.0"?>

<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsrmp:RMAssertion
         xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
    <wsrmp:SequenceTransportSecurity/>
    <wsrmp:DeliveryAssurance>
      <wsp:Policy>
        <wsrmp:ExactlyOnce/>
      </wsp:Policy>
    </wsrmp:DeliveryAssurance>
  </wsrmp:RMAssertion>
</wsp:Policy>

WS-Policyファイルにおける信頼性のあるメッセージングのポリシー・アサーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスの信頼性のあるメッセージングのポリシー・アサーションに関するリファレンスの項を参照してください。

WS-ReliableMessagingポリシー・アサーション・バージョン1.0を使用したカスタムWS-Policyファイルの作成(非推奨)

この項では、WS Reliable Messaging Policy Assertion Version 1.0(http://schemas.xmlsoap.org/ws/2005/02/rm/WS-RMPolicy.pdf)に基づいたWebサービスの信頼性のあるメッセージングのアサーションを含むカスタムWS-Policyファイルを作成する方法について説明します。


注意:

この項で説明されている信頼性のあるメッセージング・ポリシー・アサーションの多くは、JWSのアノテーションまたは構成を通じて管理されます。


WS-Policyファイルのルート要素は<Policy>です。Webサービスの信頼性のあるメッセージングのポリシー・アサーションを使用するには、これに次のネームスペース宣言が含まれていることが必要です。

<wsp:Policy
   xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"
   xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
   xmlns:beapolicy="http://www.bea.com/wsrm/policy">

Webサービスの信頼性のあるメッセージングのポリシー・アサーションはすべて、<wsrm:RMAssertion要素の内部でラップします。wsrm:ネームスペースを使用するアサーションは、WS-ReliableMessaging仕様(http://docs.oasis-open.org/ws-rx/wsrm/200702/wsrm-1.1-spec-os-01.pdf)で定義される標準的なアサーションです。beapolicy:ネームスペースを使用するアサーションは、WebLogic固有のものです。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスの信頼性のあるメッセージングのポリシー・アサーションに関するリファレンスの項を参照してください。

次の表に、WS-Policyファイルで指定可能なWebサービスの信頼性のあるメッセージングのアサーションを示します。Webサービスの信頼性のあるメッセージングのアサーションは、すべてオプションなので、デフォルト値が不適切なものだけを設定します。アサーションの指定順序は重要です。次のアサーションを指定できますが、WS-Policyファイルでは次の一覧の順序どおりに指定する必要があります。

表6-9 Webサービスの信頼性のあるメッセージング・アサーション(バージョン1.0)

アサーション説明
<wsrm:InactivityTimeout>

非アクティブ間隔を定義する、Milliseconds属性で指定されるミリ秒数。この時間が経過した時点で、宛先エンドポイントがソース・エンドポイントからのメッセージを受け取っていなければ、宛先エンドポイントは、処理が行われずシーケンスは終了したものと見なす場合があります。これは、ソース・エンドポイントについても同様のことが言えます。デフォルトでは、シーケンスがタイムアウトすることはありません。

<wsrm:BaseRetransmissionInterval>

ソース・エンドポイントがメッセージを送信してから、そのメッセージの確認応答を受け取っていない場合に再送信を行うまでの間隔(ミリ秒単位)。デフォルト値は、ソース・エンドポイントのWebLogic Serverインスタンス上のSAFエージェントによって設定されます。

<wsrm:ExponentialBackoff>

再送信の間隔が、指数関数的なバックオフ・アルゴリズムを使用して調整されることを指定します。この要素に属性はありません。

<wsrm:AcknowledgmentInterval>

宛先エンドポイントがスタンドアロンの確認応答を送信しなければならない最大間隔(ミリ秒単位)。デフォルト値は、宛先エンドポイントのWebLogic Serverインスタンス上のSAFエージェントによって設定されます。

<beapolicy:Expires>

信頼性のあるWebサービスの有効期限が切れ、これ以上の新しいシーケンス・メッセージを受け付けなくなるまでの時間の長さ。デフォルト値では、有効期限が切れることはありません。この要素には、Expiresという1つの属性があります。この属性のデータ型はXMLスキーマ期間型です。(http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#durationを参照。)たとえば、有効期限までを1日と設定する場合は、<beapolicy:Expires Expires="P1D" />とします。

<beapolicy:QOS>

表6-1で説明されている、配信保証レベル。この要素にはQOSという1つの属性があり、この属性はAtMostOnce、AtLeastOnce、ExactlyOnceの各値のうちの1つに設定します。また、メッセージを順序通りにすることを指定するためにInOrder文字列を含めることもできます。デフォルト値はExactlyOnce InOrderです。この要素は通常、設定されません。


次の例では、簡単なWebサービスの信頼性のあるメッセージングのWS-Policyファイルを示します。

<?xml version="1.0"?>

<wsp:Policy
   xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
   xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
   xmlns:beapolicy="http://www.bea.com/wsrm/policy"
  >
 <wsrm:RMAssertion>
   <wsrm:InactivityTimeout
      Milliseconds="600000" />
   <wsrm:BaseRetransmissionInterval
      Milliseconds="500" />
   <wsrm:ExponentialBackoff />
   <wsrm:AcknowledgementInterval
      Milliseconds="2000" />
 </wsrm:RMAssertion>
</wsp:Policy>

WS-Policyファイルにおける信頼性のあるメッセージングのポリシー・アサーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスの信頼性のあるメッセージングのポリシー・アサーションに関するリファレンスの項を参照してください。

複数のポリシー選択肢の使用

カスタム・ポリシー・ファイルを作成することによって、単一のWebサービスに対して複数のポリシー選択肢(適切なポリシー選択肢)を構成できます。実行時には、適用されるポリシーがそれらの中から自動的に選択されます。その際は、サポートされていないポリシーやアサーションが競合しているポリシーが除外され、構成されているプリファレンスに基づいて、受信メッセージの検証とレスポンス・メッセージの構築に適したポリシーが選択されます。

次の例では、1.2と1.0 WSの信頼性のあるメッセージングの両方をサポートするセキュリティ・ポリシーの例を示します。各ポリシー選択肢は、<wsp:All>要素で囲まれています。


注意:

1.0のWebサービスの信頼性のあるメッセージング・アサーションには、接頭辞としてwsrmp10が付加されます。


<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
  <wsp:ExactlyOne>
    <wsp:All> 
      <wsrmp10:RMAssertion
       xmlns:wsrmp10="http://schemas.xmlsoap.org/ws/2005/02/rm/policy">
        <wsrmp10:InactivityTimeout Milliseconds="1200000"/>
        <wsrmp10:BaseRetransmissionInterval Milliseconds="60000"/>
        <wsrmp10:ExponentialBackoff/>
        <wsrmp10:AcknowledgementInterval Milliseconds="800"/>
      </wsrmp10:RMAssertion>
    </wsp:All>
    <wsp:All>
      <wsrmp:RMAssertion
           xmlns:wsrmp="http://docs.oasis-open.org/ws-rx/wsrmp/200702">
        <wsrmp:SequenceSTR/>
        <wsrmp:DeliveryAssurance>
          <wsp:Policy>
            <wsrmp:AtMostOnce/>
          </wsp:Policy>
        </wsrmp:DeliveryAssurance>
      </wsrmp:RMAssertion>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

複数のポリシー選択肢の詳細は、『Oracle WebLogic Server WebLogic Webサービスの保護』の適切なポリシーの選択に関する項を参照してください。

信頼性のあるJWSファイルに関するプログラミングのガイドライン


注意:

信頼性のあるWebサービスの開発に関するベスト・プラクティスについては、第5章「信頼性のあるWebサービスとクライアントを開発する手順」を参照してください。


信頼性のあるメッセージングのアサーションが含まれるWS-PolicyファイルをWebサービスに追加するよう指定するには、JWSファイルで@Policyアノテーションを使用します。WebLogic Serverでは、あらかじめパッケージ化されているWS-Policyファイルのセットが提供されます。付録A「Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」を参照してください。

Webサービスの信頼性のあるメッセージングで@Policyアノテーションを使用する場合は、次のガイドラインに従います。

  • uri属性を使用して、ポリシー・ファイルのビルド時の場所を以下のように指定します。

    • 独自のWS-Policyファイルを作成した場合は、JWSファイルを基準として相対的に場所を指定します。例:

      @Policy(uri="ReliableHelloWorldPolicy.xml",
                direction=Policy.Direction.both,
                attachToWsdl=true)
      

      この例では、ReliableHelloWorldPolicy.xmlファイルがJWSファイルと同じディレクトリに置かれています。

    • あらかじめパッケージ化されているWS-Policyファイルの1つか、共有Java EEライブラリにパッケージ化されているWS-Policyファイルを指定するには、そのポリシー・ファイルの名前とパスとともにpolicy:接頭辞を使用します。この構文ではビルド時のjwsc Antタスクに、ファイル・システムの実際のファイルを探させず、Webサービスが、サービスのデプロイ時にWebLogic ServerからWS-Policyファイルを取得することを通知しています。


      注意:

      共有Java EEライブラリは、様々なエンタープライズ・アプリケーション内にパッケージ化されている複数のWebサービスとWS-Policyファイルを共有する場合に有用です。WS-Policyファイルが共有Java EEライブラリのMETA-INF/policiesまたはWEB-INF/policiesディレクトリに置かれているかぎり、ポリシー・ファイルはWebサービスの同じアーカイブにパッケージ化されている場合と同様に指定できます。ライブラリの作成、およびWebサービスがポリシー・ファイルを見つけることができるようにするための環境設定については、『Oracle WebLogic Serverアプリケーションの開発』の共有Java EEライブラリおよびオプション・パッケージの作成に関する項を参照してください。


    • ポリシー・ファイルをWeb上で公開するよう指定するには、次の例に示すとおり、URLと共にhttp:接頭辞を使用します。

      @Policy(uri="http://someSite.com/policies/mypolicy.xml"
              direction=Policy.Direction.both,
              attachToWsdl=true)
      
  • デフォルトでは、WS-Policyファイルはリクエスト(着信)とレスポンス(発信)の両方のSOAPメッセージに適用されます。このデフォルトの動作は、direction属性をPolicy.Direction.inboundまたはPolicy.Direction.outboundに設定すると変更できます。

  • uriで指定されるポリシー・ファイル内でwsp:optional属性を使用し、Webサービスで操作が確実に呼び出され、そのレスポンスが確実に配信されるよう要求するかどうかを指定できます。

    次の点に注意してください:

    • クライアントが同期トランスポートを使用してWebサービスを呼び出し、操作のインバウンド方向で信頼性が必要な場合は(optional属性がfalse)、クライアントは信頼性のあるレスポンスを送信する時使用できるようにofferシーケンスを提供する必要があります(http://docs.oasis-open.org/ws-rx/wsrm/200702/wsrm-1.1-spec-os-01.pdfにあるWS-ReliableMessaging仕様で説明されている<wsrm: Offer...>)。

    • クライアントが非同期トランスポートを使用する場合は、クライアントはofferシーケンスを送信する必要はありません。リクエストが信頼性を持って行われて、アウトバウンド方向にRMポリシーがある場合(オプションかどうか)信頼性のあるメッセージングのランタイムは、レスポンスを送信するために新しいRMシーケンスのハンドシェイクを強制します。この新しいシーケンスはリクエスト・シーケンスと関連付けられ、それ以降のすべてのレスポンスは新しいレスポンス・シーケンスで送信されます。レスポンス・シーケンスは、リクエストのReplyToアドレスで示されているエンドポイントとネゴシエーションされます。

  • @PolicyアノテーションのattachToWsdl属性を設定して、ポリシー・ファイルをWebサービスのパブリック規約が記述されたWSDLファイルに付加するかどうかを指定できます。通常は、クライアント・アプリケーションでWebサービスの信頼性のあるメッセージング機能が認識されるよう、パブリックなものとしてポリシーを公開します。そのため、この属性のデフォルト値はtrueです。

@Policyアノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のweblogic.jws.Policyに関する項を参照してください。

例6-1では、信頼性のあるWebサービスを実装する簡単なJWSファイルを示します。

例6-1 信頼性のあるWebサービスの例

import javax.jws.WebService;
 
import weblogic.jws.Policies;
import weblogic.jws.Policy;
 
/**
 * Example Web service for reliable client best practice examples
 */
@WebService
// Enable RM on this service.
@Policies( { @Policy(uri = "policy:DefaultReliability1.2.xml") })
public class BackendReliableService {
 
  public String doSomething(String what) {
 
    System.out.println("BackendReliableService doing: " + what);
 
    return "Did (Reliably) '" + what + "' at: " + System.currentTimeMillis();
  }
}

この例では、事前に定義されたDefaultReliability1.2.xmlポリシー・ファイルがクラス・レベルでWebサービスにアタッチされています。つまり、ポリシー・ファイルはWebサービスのすべてのパブリック操作(doSomething())に適用されます。ポリシー・ファイルは、デフォルトでリクエストとレスポンスの両方に適用されます。あらかじめパッケージ化されている利用可能なポリシーおよびカスタム・ポリシーの作成の詳細につぃては、「Webサービスの信頼性のあるメッセージングのWS-Policyファイルの作成」を参照してください。

Webサービス・クライアントからの信頼性のあるWebサービスの呼出し


注意:

信頼性のあるWebサービス・クライアントの開発に関するベスト・プラクティスについては、「信頼性のあるWebサービス・クライアントを開発する手順」を参照してください。


次の表では、使用するトランスポート・タイプに基づいてWebサービス・クライアントから信頼性のあるWebサービスを呼び出す方法を示します。トランスポート・タイプの詳細は、表6-2を参照してください。

表6-10 トランスポート・タイプに基づく信頼性のあるWebサービスの呼出し

トランスポート・タイプ説明

非同期トランスポート

非同期トランスポートを使用するには、次の手順を実行します。

  1. Webサービス・クライアントを実装します(表4-3「非同期でWebサービスを呼び出すための手順」を参照)。

    表4-3の手順3で、クライアントがファイアウォールの内側にあるかどうかに応じて、次のいずれかのトランスポート・メカニズムを実装します。

    - 非同期クライアント・トランスポート機能(「スケーラブルな非同期JAX-WSクライアントの開発(非同期クライアント・トランスポート)」を参照)。

    - クライアントがファイアウォールの内側にある場合は接続作成(「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」を参照)。

  2. 同期または非同期の呼出しセマンティクスを使用して、Webサービスを呼び出します。

    注意: 非同期クライアント・トランスポートまたは接続作成が有効になっているときは、同期操作を呼び出すことができます(「同期操作用の非同期クライアント・トランスポートの構成」および「同期メソッドのトランスポートとしての接続作成の構成」を参照)。

同期トランスポート

同期トランスポートを使用するには、標準のJAX-WS参照実装を使用して、信頼性のあるメッセージング・サービスのポート・インスタンスで非同期メソッドまたは同期メソッドを呼び出します(「JAX-WS参照実装の使用」を参照)。

注意: 同期トランスポートを使用してバッファ付きWebサービスを呼び出そうとした場合、結果は次のいずれかになります。

  • シーケンスの最初のリクエストの場合、宛先のシーケンスはバッファなしに設定されます(Webサービスの構成がバッファなしとして設定されていた場合と同様)。

  • シーケンスの最初のリクエストではない場合は(つまり、クライアントが前に非同期トランスポートを使用してリクエストを送信していた場合)、リクエストは破棄されてエラーが返されます。


クライアント側での追加の制御として、次のタスクを実行できます。

信頼性のあるメッセージングの構成


注意:

信頼性のあるWebサービスの構成に関するベスト・プラクティスについては、第5章「信頼性のあるWebサービスとクライアントを開発する手順」を参照してください。


WebLogic Server、Webサービス・エンドポイント、Webサービス・クライアントのレベルで、信頼性のあるWebサービスとクライアントのプロパティを構成できます。

WebLogic Serverレベルで定義したプロパティは、そのサーバーのすべての信頼性のあるWebサービスとクライアントに適用されます。WebLogic Serverレベルでの信頼性のあるメッセージングの構成の詳細は、「WebLogic Serverでの信頼性のあるメッセージングの構成」を参照してください。

必要がある場合は、次のようにして、サーバー・レベルで定義されている信頼性のあるメッセージングの構成オプションをオーバーライドできます。

次の項では、WebLogic Server、Webサービス・エンドポイント、Webサービス・クライアントの各レベルで信頼性のあるメッセージングを構成する方法を説明します。

WebLogic Serverでの信頼性のあるメッセージングの構成

WebLogic Serverでの信頼性のあるメッセージングは、管理コンソールまたはWLSTを使用して構成できます。以降の項を参照してください。

管理コンソールを使用する

管理コンソールを使用してWebLogic Serverに対して信頼性のあるメッセージングを構成するには、次の手順に従います。

  1. 『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Server管理コンソールの使用に関する項の説明に従って、管理コンソールを起動します。

  2. 左側のナビゲーション・ペインで、「環境」、「サーバー」の順に選択します。

  3. 「構成」タブを選択し、「サーバー」表で、信頼性のあるメッセージングの構成の対象となるサーバーの名前をクリックします。

  4. 「構成」タブ、「Webサービス」タブ、「信頼できるメッセージ」タブの順にクリックします。

  5. 次の項の説明に従って、信頼性のあるメッセージングのプロパティを編集します。

  6. 「保存」をクリックします。

詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのWebサービスの信頼性のあるメッセージングに関する項を参照してください。

WLSTの使用

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。

Webサービス・エンドポイントでの信頼性のあるメッセージングの構成

既定では、Webサービス・エンドポイントは、サーバーに対して定義されている信頼性のあるメッセージングの構成を使用します。次のようにすると、Webサービス・エンドポイントで使用される信頼性のあるメッセージングの構成を、管理コンソールを使用してオーバーライドできます。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』の管理コンソールの起動に関する項の説明に従って、管理コンソールを起動します。

  2. 左側のナビゲーション・ペインで、「デプロイメント」を選択します。

  3. 「デプロイメント」表でWebサービスの名前をクリックします。

  4. 「構成」タブ、「ポート・コンポーネント」タブの順に選択します。

  5. 「ポート」表でWebサービスのエンドポイントの名前をクリックします。

  6. 「信頼できるメッセージ」タブを選択します。

  7. 「信頼性のあるメッセージ構成のカスタマイズ」をクリックし、必要に応じて、指示に従ってデプロイメント・プランを保存します。

  8. 次の項の説明に従って、信頼性のあるメッセージングのプロパティを編集します。

  9. 「保存」をクリックします。

詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのWebサービスの信頼性のあるメッセージングの構成に関する項を参照してください。

Webサービス・クライアントでの信頼性のあるメッセージングの構成

Webサービス・クライアントでの信頼性のあるメッセージングの構成の一般情報は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービス・クライアントの構成に関する項を参照してください。

Webサービスの信頼性のあるメッセージングのクライアントを作成するときのweblogic.wsee.reliability2.api.WsrmClientInitFeatureの使用の詳細は、次の項を参照してください。

基本の再送信間隔の構成

ソース・エンドポイントが、指定された基本の再送信間隔内で所定のメッセージの確認応答を受信しなかった場合、ソース・エンドポイントはメッセージを再送信します。ソース・エンドポイントは、メッセージのシーケンスの存続期間内の任意の時点で、この再送信間隔を変更することがあります。

この間隔を再送信間隔の指数関数的バックオフ(「再送信間隔の指数関数的バックオフの構成」を参照)と組み合せて使用すると、再送信間隔を調整するアルゴリズムを指定できます。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP0DT5S (5秒)。

次の項では、基本の再送信間隔を構成する方法について説明します。

WebLogic ServerまたはWebサービス・エンドポイントでの基本の再送信間隔の構成

管理コンソールを使用して、WebLogic ServerまたはWebサービス・エンドポイントのレベルで再送信間隔の指数関数的バックオフを構成するには、次の手順を実行します。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 管理コンソールを起動し、次の項の説明に従って、サーバー・レベルまたはWebサービス・エンドポイント・レベルで、Webサービスの信頼性のあるメッセージングのページにアクセスします。

  2. 必要に応じて、「基本の再送信間隔」の値を設定します。

Webサービス・クライアントでの基本の再送信間隔の構成


注意:

Webサービス・クライアントの構成の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービス・クライアントの構成に関する項を参照してください。


表6-11では、メッセージをRM宛先に再送信する前に経過する必要のある時間を構成するためのweblogic.wsee.reliability2.api.WsrmClientInitFeatureメソッドについて説明します。

表6-11 基本の再送信間隔を構æ€ÿˆã™ã‚‹ãŸã‚ã®ãƒ¡ã‚½ãƒƒãƒ‰

メソッド説明

String getBaseRetransmissionInterval()

基本の再送信間隔を取得します。

void setBaseRetransmissionInterval(String interval)

基本の再送信間隔を設定します。


次の例では、基本の再送信間隔を3時間に設定しています。

import java.xml.ws.WebService;
import java.xml.ws.WebServiceRef;
import wsrm_jaxws.example.client_service.*;
import wsrm_jaxws.example.client_service.EchoResponse;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
...
@WebService
public class ClientServiceImpl {
...
    @WebServiceRef(name="ReliableEchoService")
    private ReliableEchoService service;
    private ReliableEchoPortType port = null;
    WsrmClientInitFeature initFeature = new WsrmClientInitFeature(true);
    initFeature.setBaseRetransmissionInterval("P0DT3H");
    port = service.getMyReliableServicePort(initFeature);
...

基本の再送信間隔の構成は、weblogic.xmlファイルでは次のように記述されます。

<service-reference-description>
...
   <port-info>
      <stub-property>
        <name>weblogic.wsee.wsrm.BaseRetransmissionInterval</name>
        <value>PT30S</value>
      </stub-property>
...
  </port-info>
</service-reference-description>

再送信間隔の指数関数的バックオフの構成

再送信間隔の指数関数的バックオフは、基本の再送信間隔(「基本の再送信間隔の構成」を参照)と組み合せて使用します。宛先エンドポイントが、基本の再送信間隔で指定した時間内にメッセージのシーケンスを確認応答しなかった場合、メッセージが引き続き確認されなければ、連続する再送信のタイミングに対して、送信元エンドポイントでは指数関数的バックオフ・アルゴリズムを使用します。

指数関数的なバックオフ・アルゴリズムは、連続再送信の間隔が、基本の再送信間隔を基に指数的に増えるように指定します。たとえば、基本の再送信間隔が2秒で、指数関数的なバックオフ要素が設定されている場合、連続再送信の間隔は、メッセージが確認されなければ、2、4、8、16、32秒というように増えていきます。

デフォルトではこのフラグは無効(false)であり、連続再送信の間隔は指数的に増えず、同じ値が維持されます。

次の項では、再送信間隔の指数関数的バックオフを構成する方法について説明します。

WebLogic ServerまたはWebサービス・エンドポイントでの再送信間隔の指数関数的バックオフの構成

管理コンソールを使用して、WebLogic ServerまたはWebサービス・エンドポイントのレベルで再送信間隔の指数関数的バックオフを構成するには、次の手順を実行します。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 管理コンソールを起動し、次の項の説明に従って、サーバー・レベルまたはWebサービス・エンドポイント・レベルで、Webサービスの信頼性のあるメッセージングのページにアクセスします。

  2. 必要に応じて、「再送信間隔の指数関数的バックオフの有効化」フラグを設定します。

Webサービス・クライアントでの再送信間隔の指数関数的バックオフの構成


注意:

Webサービス・クライアントの構成の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービス・クライアントの構成に関する項を参照してください。


表6-12では、メッセージの再送信間隔を再送信間隔の指数関数的バックオフ・アルゴリズムを使用して調整するかどうかを構成するためのweblogic.wsee.reliability2.api.WsrmClientInitFeatureメソッドについて説明します。

表6-12 再送信間隔の指数関数的バックオフを構成するためのメソッド

メソッド説明

Boolean isRetransmissionExponentialBackoff()

再送信間隔の指数関数的バックオフが有効かどうかを示します。

void setBaseRetransmissionExponentialBackoff(boolean value)

再送信間隔の指数関数的バックオフが有効かどうかを指定します。有効な値はtrueまたはfalseです。


次の例では、再送信間隔の指数関数的バックオフを有効にしています。

import java.xml.ws.WebService;
import java.xml.ws.WebServiceRef;
import wsrm_jaxws.example.client_service.*;
import wsrm_jaxws.example.client_service.EchoResponse;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
...
@WebService
public class ClientServiceImpl {
...
    @WebServiceRef(name="ReliableEchoService")
    private ReliableEchoService service;
    private ReliableEchoPortType port = null;
    WsrmClientInitFeature initFeature = new WsrmClientInitFeature(true);
    initFeature.setBaseRetransmissionInterval("P0DT3H");
    initFeature.setBaseRetransmissionExponentialBackoff(true);
    port = service.getMyReliableServicePort(initFeature);
...

再送信間隔の指数関数的バックオフの構成は、weblogic.xmlファイルでは次のように記述されます。

<service-reference-description>
...
   <port-info>
         <stub-property>
            <name>weblogic.wsee.wsrm.RetransmissionExponentialBackoff</name>
            <value>true</value>
         </stub-property>
...
  </port-info>
</service-reference-description>

順序の有効期限の構成

順序の有効期限は、アクティビティにかかわらず、シーケンスが期限切れになるまでの時間を指定します。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP1D (1日)。

次の項では、順序の有効期限を構成する方法について説明します。

WebLogic ServerまたはWebサービス・エンドポイントでの順序の有効期限の構成

管理コンソールを使用して、WebLogic ServerまたはWebサービス・エンドポイントのレベルで順序の有効期限を構成するには、次の手順を実行します。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 管理コンソールを起動し、次の項の説明に従って、サーバー・レベルまたはWebサービス・エンドポイント・レベルで、Webサービスの信頼性のあるメッセージングのページにアクセスします。

  2. 必要に応じて、「順序の有効期限」の値を設定します。

Webサービス・クライアントでの順序の有効期限の構成


注意:

Webサービス・クライアントの構成の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービス・クライアントの構成に関する項を参照してください。


表6-13では、アクティビティにかかわらず順序が期限切れになるまでの時間に対するweblogic.wsee.reliability2.api.WsrmClientInitFeatureメソッドについて説明します。

表6-13 順序の有効期限を構成するためのメソッド

メソッド説明

String getSequenceExpiration()

現在構成されている順序の有効期限を返します。

void setSequenceExpiration(String expiration)

アクティビティにかかわらず、シーケンスが期限切れになるまでの時間。


次の例では、順序の有効期限を36時間に設定しています。

import java.xml.ws.WebService;
import java.xml.ws.WebServiceRef;
import wsrm_jaxws.example.client_service.*;
import wsrm_jaxws.example.client_service.EchoResponse;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
...
@WebService
public class ClientServiceImpl {
...
    @WebServiceRef(name="ReliableEchoService")
    private ReliableEchoService service;
    private ReliableEchoPortType port = null;
    WsrmClientInitFeature initFeature = new WsrmClientInitFeature(true);
    initFeature.setSequenceExpiration("P0DT36H");
    port = service.getMyReliableServicePort(initFeature);
...

順序の有効期限の構成は、weblogic.xmlファイルでは次のように記述されます。

<service-reference-description>
...
   <port-info>
         <stub-property>
            <name>weblogic.wsee.wsrm.SequenceExpiration</name>
            <value>PT10M</value>
         </stub-property>
...
  </port-info>
</service-reference-description>

非アクティブ・タイムアウトの構成

非アクティブ・タイムアウト間隔内に、エンドポイント(RM送信元とRM宛先)がアプリケーションのメッセージまたはプロトコル・メッセージを受け取らなければ、エンドポイントはRMシーケンスが非アクティブなため終了したものと見なします。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP0DT600S (600秒)。

次の項では、非アクティブ・タイムアウトを構成する方法について説明します。

WebLogic ServerまたはWebサービス・エンドポイントでの非アクティブ・タイムアウトの構成

管理コンソールを使用して、WebLogic ServerまたはWebサービス・エンドポイントのレベルで非アクティブ・タイムアウトを構成するには、次の手順を実行します。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 管理コンソールを起動し、次の項の説明に従って、サーバー・レベルまたはWebサービス・エンドポイント・レベルで、Webサービスの信頼性のあるメッセージングのページにアクセスします。

  2. 必要に応じて、「非アクティブ・タイムアウト」の値を設定します。

Webサービス・クライアントでの非アクティブ・タイムアウトの構成


注意:

Webサービス・クライアントの構成の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービス・クライアントの構成に関する項を参照してください。


表6-14では、非アクティブ・タイムアウトを構成するためのweblogic.wsee.reliability2.api.WsrmClientInitFeatureメソッドについて説明します。

表6-14 非アクティブ・タイムアウトを構成するためのメソッド

メソッド説明

String getInactivityTimeout()

現在構成されている非アクティブ・タイムアウトを返します。

void setInactivityTimeout(String timeout)

非アクティブ・タイムアウトを設定します。


次の例では、非アクティブ・タイムアウトを1時間に設定しています。

import java.xml.ws.WebService;
import java.xml.ws.WebServiceRef;
import wsrm_jaxws.example.client_service.*;
import wsrm_jaxws.example.client_service.EchoResponse;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
...
@WebService
public class ClientServiceImpl {
...
    @WebServiceRef(name="ReliableEchoService")
    private ReliableEchoService service;
    private ReliableEchoPortType port = null;
    WsrmClientInitFeature initFeature = new WsrmClientInitFeature(true);
    initFeature.setInactivityTimeout("P0DT1H");
    port = service.getMyReliableServicePort(initFeature);
...

非アクティブ・タイムアウトの構成は、weblogic.xmlファイルでは次のように記述されます。

<service-reference-description>
...
   <port-info>
         <stub-property>
            <name>weblogic.wsee.wsrm.InactivityTimeout</name>
            <value>PT5M</value>
         </stub-property>
...
  </port-info>
</service-reference-description>

Webサービスのバッファなし宛先の構成

特定の宛先サーバーでメッセージ・バッファリングを無効にするかどうかを指定し、メッセージを受信するときにバッファリングを使用するかどうかを制御できます。宛先サーバーでバッファなしを構成できるのは、WebLogic ServerまたはWebサービス・エンドポイントのレベルのみであり、Webサービス・クライアントのレベルでは構成できません(Webサービス・クライアントではバッファリングがデフォルトで有効になります)。


注意:

バッファなし宛先を構成した場合、@WebServiceRefを使用して構成の参照を定義しているすべてのWebサービス・クライアントは、レスポンスをバッファリングなしで受け取ります。

バッファなし宛先の構成は、weblogic.xmlファイルでは次のように記述されます。

<service-reference-description>
...
   <port-info>
         <stub-property>
           <name>weblogic.wsee.wsrm.NonBufferedDestination</name>
           <value>true</value>
         </stub-property>
...
  </port-info>
</service-reference-description>

@WebServiceRefの詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』の@WebServiceRefアノテーションを使用したWebサービス参照の定義に関する項を参照してください。


管理コンソールを使用して、WebLogic ServerまたはWebサービス・エンドポイントのレベルで、メッセージのバッファリングを無効にするように宛先サーバーを構成するには、次の手順を実行します。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 管理コンソールを起動し、次の項の説明に従って、サーバー・レベルまたはWebサービス・エンドポイント・レベルで、Webサービスの信頼性のあるメッセージングのページにアクセスします。

  2. 必要に応じて、「非バッファ宛先」の値を設定し、宛先サーバーを構成します。


    注意:

    送信元サーバーでは、メッセージのバッファリングは常に有効にする必要があります。つまり、「非バッファ送信元」の値は常に無効にしておく必要があります。


確認応答の間隔の構成

確認応答の間隔では、宛先エンドポイントがスタンドアロンの確認応答を送信する必要のある最大間隔を指定します。確認応答の間隔を構成できるのはWebLogic ServerまたはWebサービス・エンドポイントのレベルのみであり、Webサービス・クライアントのレベルでは構成できません。


注意:

@WebServiceRefを使用してWebサービスへの参照を定義しているWebサービス・クライアントは、確認応答の間隔の値を使用して、クライアントのレスポンス処理が確認応答の受信を待機する時間を制御します。つまり、クライアントは、レスポンス・メッセージを受信するときにRM宛先と同じように動作します。

バッファなし宛先の構成は、weblogic.xmlファイルでは次のように記述されます。

<service-reference-description>
...
   <port-info>
         <stub-property>
          <name>weblogic.wsee.wsrm.AcknowledgementInterval</name>
          <value>PT5S</value>
         </stub-property>
...
  </port-info>
</service-reference-description>

@WebServiceRefの詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』の@WebServiceRefアノテーションを使用したWebサービス参照の定義に関する項を参照してください。


宛先エンドポイントは、ソース・エンドポイントからメッセージを受信した直後に、返されたメッセージに対する確認応答を送信できます。また、スタンドアロンの確認応答として個別に確認応答を送信することもできます。返されたメッセージに対して確認応答を送信できない場合、宛先エンドポイントは、スタンドアロンの確認応答を送信するまで、確認応答の間隔に設定した時間範囲内で待機することがあります。未確認のメッセージがない場合、宛先エンドポイントは確認応答を送信しない可能性があります。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP0DT0.2S (0.2秒)です。

管理コンソールを使用して、WebLogic ServerまたはWebサービス・エンドポイントのレベルで確認応答の間隔を構成するには、次の手順を実行します。


注意:

または、WLSTを使用して、信頼性のあるメッセージングを構成することもできます。WLSTを使用したドメインの拡張の詳細は、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。


  1. 管理コンソールを起動し、次の項の説明に従って、サーバー・レベルまたはWebサービス・エンドポイント・レベルで、Webサービスの信頼性のあるメッセージングのページにアクセスします。

  2. 必要に応じて、「確認応答の間隔」の値を設定します。

信頼性エラー・リスナーの実装

リクエストを配信できない場合に信頼性のある配信の障害に関する通知を受け取るには、次のweblogic.wsee.reliability2.api.ReliabilityErrorListenerインタフェースを実装します。

public interface ReliablityErrorListener {

   public void onReliabilityError(ReliabilityErrorContext context);
}

表6-15では、信頼性エラー・リスナーを構成するためのweblogic.wsee.reliability2.api.WsrmClientInitFeatureメソッドについて説明します。

表6-15 信頼性エラー・リスナーを構成するためのメソッド

メソッド説明

ReliabilityErrorListener getReliabilityListener()

現在構成されている信頼性リスナーを取得します。

void setErrorListener(ReliabilityErrorListener errorListener)

信頼性エラー・リスナーを設定します。


次の例では、Webサービス・クライアントに信頼性エラー・リスナーを実装して使用する方法を示します。この例は、例5-1「信頼性のあるWebサービス・クライアントのベスト・プラクティスの例」からの抜粋です。

import weblogic.wsee.reliability2.api.ReliabilityErrorListener;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
...
@WebService
public class ClientServiceImpl {
...
    WsrmClientInitFeature rmFeature = new WsrmClientInitFeature();
    features.add(rmFeature);
 
    ReliabilityErrorListener listener = new ReliabilityErrorListener() {
      public void onReliabilityError(ReliabilityErrorContext context) {
 
        // At a *minimum* do this
        System.out.println("RM sequence failure: " +
                           context.getFaultSummaryMessage());
        _lastResponse = context.getFaultSummaryMessage();
 
        // And optionally do this...
 
        // The context parameter tells you whether a request or the entire
        // sequence has failed. If a sequence fails, you'll get a notification
        // for each undelivered request (if any) on the sequence.
        if (context.isRequestSpecific()) {
          // We have a single request failure (possibly as part of a larger
          // sequence failure).
          // We can get the original request back like this:
          String operationName = context.getOperationName();
          System.out.println("Failed to deliver request for operation '" +
                             operationName + "'. Fault summary: " +
                             context.getFaultSummaryMessage());
          if ("DoSomething".equals(operationName)) {
            try {
              String request = context.getRequest(JAXBContext.newInstance(),
                                                  String.class);
              System.out.println("Failed to deliver request for operation '" +
                                 operationName + "' with content: " +
                                 request);
              Map<String, Serializable> requestProps =
                context.getUserRequestContextProperties();
              if (requestProps != null) {
                // Fetch back any property you sent in
                // JAXWSProperties.PERSISTENT_CONTEXT when you sent the
                // request.
                String myProperty = (String)requestProps.get(MY_PROPERTY);
                System.out.println(myProperty + " failed!");
              }
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        } else {
          // The entire sequence has encountered an error.
          System.out.println("Entire sequence failed: " +
                             context.getFaultSummaryMessage());
 
        }
      }
    };
 
  rmFeature.setReliabilityErrorListener(listener);
 
  _features = features.toArray(new WebServiceFeature[features.size()]);
 
  BackendReliableService anotherPort =
    _service.getBackendReliableServicePort(_features);
...

信頼性のあるメッセージ・シーケンスのライフサイクルの管理

WebLogic Serverでは、Webサービスの信頼性のあるメッセージングで使用するためのクライアントAPI weblogic.wsee.reliability2.api.WsrmClientが提供されています。このAPIを使用して、構成オプションの設定、信頼性のあるシーケンスIDの取得、信頼性のあるシーケンスの終了などの一般的なライフサイクル・タスクを実行します。

次に示すように、WsrmClient APIのインスタンスには、weblogic.wsee.reliability2.api.WsrmClientFactoryメソッドを使用して信頼性のあるWebサービス・ポートからアクセスできます。

package wsrm_jaxws.example;
import java.xml.ws.WebService;
import java.xml.ws.WebServiceRef;
import wsrm_jaxws.example.client_service.*;
import wsrm_jaxws.example.client_service.EchoResponse;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
...
@WebService
public class ClientServiceImpl {
...
    @WebServiceRef(name="ReliableEchoService")
    private ReliableEchoService service;
    private ReliableEchoPortType port = null;
    port = service.getReliableEchoPort();
    WsrmClient wsrmClient = WsrmClientFactory.getWsrmClientFromPort(port);
...

次の項では、WsrmClientを使用して信頼性のあるメッセージ・シーケンスのライフサイクルを管理する方法を説明します。

Webサービス・信頼性のあるメッセージング・クライアントAPIの詳細は、Oracle WebLogic Server APIリファレンスのweblogic.wsee.reliability2.api.WsrmClientを参照してください。

信頼性のあるシーケンスの管理

信頼性のあるシーケンスを管理するには、次のタスクを実行します。

信頼性のあるシーケンスIDの取得および設定

シーケンスIDは、特定の信頼性のあるシーケンスを識別するために使用されます。シーケンスIDの取得および設定は、それぞれ、weblogic.wsee.reliability2.api.WsrmClient.getSequenceID()メソッドおよびweblogic.wsee.reliability2.api.WsrmClient.setSequenceID()メソッドを使用します。getSequenceID()メソッドを発行した時点でメッセージが送信されていない場合、返される値はnullです。

例:

import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.api.WsrmClient;
...
   _service = new BackendReliableServiceService();
...
   features.add(... some features ...);
   _features = features.toArray(new WebServiceFeature[features.size()]);
...
   BackendReliableService anotherPort =
   _service.getBackendReliableServicePort(_features);
...
   WsrmClient rmClient = WsrmClientFactory.getWsrmClientFromPort(anotherPort); 
...
   // Will be null 
   String sequenceId = rmClient.getSequenceId();
   // Send first message
   anotherPort.doSomething("Bake a cake");
   // Will be non-null
   sequenceId = rmClient.getSequenceId();

サーバー障害からのリカバリ時には、新規作成したWebサービス上で信頼性のあるシーケンスを設定したり、クライアントまたはサーバーの再起動後にインスタンスをディスパッチしたりできます。クライアント・インスタンスのシーケンスIDの設定は高度な機能です。高度なクライアントは、setSequenceIdを使用してクライアント・インスタンスを既知のRMシーケンスに接続できます。

信頼性のあるシーケンスの状態へのアクセス

シーケンスの状態にアクセスするには、weblogic.wsee.reliability2.api.WsrmClient.getSequenceState()を使用します。このメソッドは、weblogic.wsee.reliability2.api.SequenceState型の定数java.lang.Enumを返します。

次の表では、シーケンスの状態に対して返される可能性のある有効な値を示します。

表6-16 シーケンスの状態の値

シーケンスの状態説明

CLOSED

信頼性のあるシーケンスは閉じられています。

注意: シーケンスを閉じるのは、最後の手段と考える必要があり、すべてのリクエストを受信することがないと予想される信頼性のあるメッセージング・シーケンスを閉じる準備をするだけです。詳細は、「信頼性のあるシーケンスを閉じる」を参照してください。

CLOSING

信頼性のあるシーケンスは閉じられている途中です。

注意: シーケンスを閉じるのは、最後の手段と考える必要があり、すべてのリクエストを受信することがないと予想される信頼性のあるメッセージング・シーケンスを閉じる準備をするだけです。詳細は、「信頼性のあるシーケンスを閉じる」を参照してください。

CREATED

信頼性のあるシーケンスは作成されており、初期ハンドシェイクが完了しています。

CREATING

信頼性のあるシーケンスは作成されている途中であり、初期ハンドシェイクは進行中です。

LAST_MESSAGE

非推奨。WS-ReliableMessaging 1.0のみ。シーケンスの最後のメッセージを受信しました。

LAST_MESSAGE_PENDING

非推奨。WS-ReliableMessaging 1.0のみ。シーケンスの最後のメッセージは保留中です。

NEW

信頼性のあるシーケンスは初期状態です。初期ハンドシェイクは開始していません。

TERMINATED

信頼性のあるシーケンスは終了されました。

通常の処理では、最終メッセージまでのすべてのメッセージが確認応答された後は、信頼性のあるメッセージ・シーケンスは終了されます。お薦めはできませんが、信頼性のあるシーケンスを強制的に終了できます(「信頼性のあるシーケンスの終了」を参照)。

TERMINATING

信頼性のあるシーケンスは終了されている途中です。

通常の処理では、最終メッセージまでのすべてのメッセージが確認応答された後は、信頼性のあるメッセージ・シーケンスは終了されます。お薦めはできませんが、信頼性のあるシーケンスを強制的に終了できます(「信頼性のあるシーケンスの終了」を参照)。


例:

import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.api.WsrmClient;
import weblogic.wsee.reliability2.api.SequenceState;
...
   _service = new BackendReliableServiceService();
...
   features.add(... some features ...);
   _features = features.toArray(new WebServiceFeature[features.size()]);
...
   BackendReliableService anotherPort =
        _service.getBackendReliableServicePort(_features);
...
   WsrmClient rmClient = WsrmClientFactory.getWsrmClientFromPort(anotherPort); 
...
   SequenceState rmState = rmClient.getSequenceState();
   if (rmState == SequenceState.TERMINATED) {
         ... Do some work or log a message ...
   }    
...

クライアントIDの管理

クライアントIDは、Webサービス・クライアントを示します。各クライアントは固有のIDを持っています。クライアントIDを使用して、クライアントまたはサーバーが再起動した後で信頼性のあるシーケンスに対して存在している可能性のある保存されたリクエストにアクセスできます。

クライアントIDは、WebLogic Serverによって自動的に構成されます。ポートを作成するときにweblogic.wsee.jaxws.persistence.ClientIdentityFeatureを使用して、クライアントIDをカスタム値に設定できます。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のクライアントIDの管理に関する項を参照してください。

信頼性のあるメッセージングはクライアントIDを使用して、VMが再起動する前に送信されて、VMが終了する前に送信されなかったリクエストを発見します。以前のクライアントIDを使用して最初のクライアント・インスタンスを確立するとき、信頼性のあるメッセージングはそのポートと関連付けられているリソースを使用して、復元されたクライアントIDの代わりにリクエストの送信を開始します。

クライアントIDは、weblogic.wsee.reliability2.api.WsrmClient.getID()メソッドを使用して取得できます。

例:

import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.api.WsrmClient;
...
   _service = new BackendReliableServiceService();
...
   features.add(... some features ...);
   _features = features.toArray(new WebServiceFeature[features.size()]);
...
   BackendReliableService anotherPort =
      _service.getBackendReliableServicePort(_features);
...
   WsrmClient rmClient = WsrmClientFactory.getWsrmClientFromPort(anotherPort); 
...
   String clientId = rmClient.getId();
...

確認応答済みリクエストの管理

信頼性のあるメッセージ・シーケンスのライフサイクルの間に確認応答されたリクエストを表示するには、weblogic.wsee.reliability2.api.WsrmClient.ackRanges()メソッドを使用します。ackRanges()メソッドは、一連のweblogic.wsee.reliability.MessageRangeオブジェクトを返します。

確認応答が済んでいるリクエストの範囲を確認した後、クライアントは次を選択できます。

  • weblogic.wsee.reliability2.api.WsrmClient.requestAcknowledgement()メソッドを使用して、RM宛先に確認応答リクエストを送信します。

  • シーケンスを閉じ(「信頼性のあるシーケンスを閉じる」を参照)、特定の時間の後で確認応答されていないメッセージのアカウントに対してエラー処理を実行します。

注意: クライアントはgetAckRanges()を繰り返し呼び出して、信頼性のあるメッセージ・シーケンスを追跡できます。ただし、各呼出しにはある程度の追加オーバーヘッドが伴うことを考慮する必要があります。

メッセージに関する情報へのアクセス

weblogic.wsee.reliability2.api.WsrmClient.getMessageInfo()メソッドを使用すると、メッセージ番号に基づいて、クライアントから送信された信頼性のあるメッセージについての情報を取得できます。このメソッドは、クライアント・インスタンスから送信されたリクエスト・メッセージのシーケンシャル・メッセージ番号を表す長い値を受け取り、weblogic.wsee.reliability2.sequence.SourceMessageInfo型のメッセージに関する情報を返します。WsrmClient.getMostRecentMessageNumber()メソッドを使用すると、getMessageInfo()に渡すメッセージ番号の最大の値を特定できます。

返されるSourceMessageInfoオブジェクトは変更不可として扱う必要があり、getメソッドのみを使用する必要があります。

次の表では、送信元メッセージに関する特定の詳細にアクセスするために使用できるSourceMessageInfoメソッドの一覧を示します。

表6-17 SourceMessageInfo()のメソッド

メソッド説明

getMessageID()

メッセージIDをString値として取得します。

getMessageNum()

メッセージの番号をlong値として取得します。

getResponseMessageInfo()

現在のSourceMessageInfo()オブジェクトによって表されるリクエストと関連付けられているレスポンスを表すweblogic.wsee.reliability2.sequence.DestinationMessageInfoオブジェクトを返します。このリクエストに対してレスポンスを受信していない場合、またはレスポンスが期待されない場合(たとえば、リクエストが一方向であった)は、NULLを返します。

isAck()

メッセージが確認応答されているかどうかを示します。


次の表では、宛先メッセージに関する特定の詳細にアクセスするために使用できるDestinationMessageInfoメソッドの一覧を示します。

表6-18 DestinationMessageInfo()のメソッド

メソッド説明

getMessageID()

メッセージIDをString値として取得します。

getMessageNum()

メッセージの番号をlong値として取得します。


getMessageInfo()メソッドをweblogic.wsee.reliability2.api.WsrmClient.getMostRecentMessageNumber()と組み合わせて使用すると、最後に送信された信頼性のあるメッセージについての情報を取得できます。このメソッドは、1から始まり単調に増加するlong値を返します。次の状況では、このメソッドは-1を返します。

  • 信頼性のあるシーケンスIDが設定されていない場合(getSequenceID()はnullを返します)。

  • 最初の信頼性のあるメッセージがまだ送信されていません。

  • 信頼性のあるシーケンスが終了されました。

信頼性のあるシーケンスでの最後のメッセージの識別

WebLogic Serverは信頼性のあるシーケンスと関連付けられたリソースを保持するので、適切なタイミングでこれらのリソースを解放することをお薦めします。通常の状況では、すべてのメッセージが送信され、RM宛先によって確認応答されるまで、信頼性のあるシーケンスを保持する必要があります。シーケンスの適切な終了を容易にするため、信頼性のあるメッセージ・シーケンスの最後のメッセージを識別することをお薦めします。これにより、RM宛先へのメッセージの送信が完了したことがわかり、WebLogic Serverは信頼性のあるシーケンスを自動的に終了する前に最後の確認応答の検索を開始できます。最後のメッセージを示すには、weblogic.wsee.reliability2.api.WsrmClient.setFinalMessage()メソッドを使用します。

最後のメッセージを識別すると、最後のメッセージまでのすべてのメッセージが確認応答され、信頼性のあるメッセージ・シーケンスが終了し、すべてのリソースが開放されます。識別しない場合、シーケンスは、構成したシーケンスの有効期限に達した後で自動的に終了します。

例:

import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.api.WsrmClient;
...
   _service = new BackendReliableServiceService();
   ...
   features.add(... some features ...);
   _features = features.toArray(new WebServiceFeature[features.size()]);
...
   BackendReliableService anotherPort =
        _service.getBackendReliableServicePort(_features);
...
   WsrmClient rmClient = WsrmClientFactory.getWsrmClientFromPort(anotherPort); 
...
   anotherPort.doSomething("One potato");
   anotherPort.doSomething("Two potato");
   anotherPort.doSomething("Three potato");
   // Indicate this next invoke marks the 'final' message for the sequence
   rmClient.setFinalMessage();
   anotherPort.doSomething("Four");
...

信頼性のあるシーケンスを閉じる

®}Q‚

信頼性のあるメッセージング・シーケンスを閉じるには、weblogic.wsee.reliability2.api.WsrmClient.closeMessage()を使用します。


注意:

このメソッドはWS-ReliableMessaging 1.1に対してのみ有効です。WS-ReliableMessaging 1.0ではサポートされていません。


信頼性のあるメッセージング・シーケンスを閉じると、新しいメッセージはRM宛先で受け付けられなくなり、RM送信元で送信されなくなります。閉じられたシーケンスは、まだ、RM宛先によって追跡され、確認応答リクエストに対応します。RM送信元は、シーケンスを終了する前に、信頼性のあるメッセージ・シーケンスの完全な会計情報を取得できます。

注意: シーケンスを閉じるのは、最後の手段と考える必要があり、すべてのリクエストを受信することがないと予想される信頼性のあるメッセージング・シーケンスを閉じる準備をするだけです。たとえば、確認応答が済んでいるリクエストの範囲を確認した後(「確認応答済みリクエストの管理」を参照)、クライアントはシーケンスを閉じる必要があると判断し、特定の時間の後で確認応答されていないメッセージのアカウントに対してエラー処理を実行できます。

信頼性のあるメッセージング・シーケンスが閉じられると、シーケンスの終了はクライアントに委ねられます。構成したタイムアウトに到達した後は、サーバーによって自動的に終了されなくなります。「信頼性のあるシーケンスの終了」を参照してください。

例:

import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.api.WsrmClient;
...
   _service = new BackendReliableServiceService();
...
   features.add(... some features ...);
   _features = features.toArray(new WebServiceFeature[features.size()]);
...
   BackendReliableService anotherPort =
      _service.getBackendReliableServicePort(_features);
...
   WsrmClient rmClient = WsrmClientFactory.getWsrmClientFromPort(anotherPort); 
...
   anotherPort.doSomething("One potato");
   anotherPort.doSomething("Two potato");
   // ... Wait some amount of time, and check for acks 
   // ... using WsrmClient.getAckRanges() ...
   // ... If we don't find all of our acks ...
   rmClient.closeSequence();
   // ... Do some error recovery like telling our
   // ... client we couldn't deliver all requests ...
   rmClient.terminateSequence();
...

信頼性のあるシーケンスの終了

これはお薦めできませんが、weblogic.wsee.reliability2.api.WsrmClient.terminateSequence()メソッドを使用すると、すべてのメッセージが確認応答されているかどうかに関係なく、信頼性のあるメッセージ・シーケンスを終了できます。


注意:

代わりに、setFinalMessage()メソッドを使用して、信頼性のあるシーケンスの最後のメッセージを識別することをお薦めします。最後のメッセージを識別すると、最後のメッセージまでのすべてのメッセージが確認応答され、信頼性のあるメッセージ・シーケンスが終了し、すべてのリソースが開放されます。詳細は、「信頼性のあるシーケンスでの最後のメッセージの識別」を参照してください。


シーケンスを終了すると、RM送信元とRM宛先は、そのシーケンスに関連付けられているすべての状態を削除します。クライアントは、終了されたシーケンスに対してはいかなるアクションも実行できなくなります。シーケンスが終了されると、サーバー側の再試行(SAFエージェント)によってシーケンスに対して配信された保留中のリクエストは破棄され、ReliablityErrorListenerで通知として送信されます。

例:

import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.api.WsrmClient;
...
   _service = new BackendReliableServiceService();
...
   features.add(... some features ...);
   _features = features.toArray(new WebServiceFeature[features.size()]);
...
   BackendReliableService anotherPort =
      _service.getBackendReliableServicePort(_features);
...
   WsrmClient rmClient = WsrmClientFactory.getWsrmClientFromPort(anotherPort); 
...
   anotherPort.doSomething("One potato");
   anotherPort.doSomething("Two potato");
   // ... Wait some amount of time, and check for acks 
   // ... using WsrmClient.getAckRanges() ...
   // ... If we don't find all of our acks ...
   rmClient.closeSequence();
   // ... Do some error recovery like telling our
   // ... client we couldn't deliver all requests ...
   rmClient.terminateSequence();
...

新しいメッセージ・シーケンスを開始するためのクライアントのリセット

信頼性のあるシーケンスが閉じられて、保持する必要のなくなった信頼性のあるメッセージングに関係のあるすべてのRequestContextプロパティをクリアするには、weblogic.wsee.reliability2.api.WsrmClient.reset()メソッドを使用します。通常、このメソッドは、同じクライアントから信頼性のあるメッセージの別のシーケンスを開始するときに呼び出します。

reset()の使用例については、例B-1「信頼性のあるメッセージングのバッチ化のためのクライアント・ラッパー・クラスの例」を参照してください。

Webサービスの信頼性のあるメッセージングの監視

管理コンソールを使用して、Webサービスまたはクライアントの信頼性のあるメッセージング・シーケンスを監視できます。信頼性のあるメッセージング・シーケンスごとに、シーケンスの状態や送信元サーバーと宛先サーバーなどの、実行時監視情報が表示されます。「この表のカスタマイズ」をクリックすることで、表に表示される情報をカスタマイズできます。

具体的には、監視ページを使用して次のことを特定できます。

  • 適切なタイミングでシーケンスをクリーンアップしているかどうか。監視タブに多数のシーケンスが表示される場合、クライアントのコードを調べて原因を特定します。

  • 個別のシーケンスに確認応答されていないリクエストがあるか、または予想されるレスポンスを受信していないか。

Webサービスの信頼性のあるメッセージング・シーケンスを監視するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービスがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開すると、「Webサービス」カテゴリにアプリケーション内のWebサービスのリストが表示されます。Webサービス名をクリックし、「監視」→「ポート」→「信頼性のあるメッセージング」を選択します。

Webサービス・クライアントの信頼性のあるメッセージング・シーケンスを監視するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービス・クライアントがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開し、Webサービス・クライアントが存在するアプリケーション・モジュールをクリックします。「監視」タブをクリックし、「Webサービス・クライアント」タブをクリックします。次に、「監視」→「サーバー」→「信頼性のあるメッセージング」をクリックします。

ビジネス作業単位へのメッセージのグループ化(バッチ化)

多くの場合、Webサービス・クライアントとサービスの間を流れるメッセージは、単一のビジネス・トランザクションつまり作業単位の一部です。たとえば、旅行代理店、航空会社、ホテル、レンタカー会社の間でメッセージを必要とする旅行代理店の予約処理などです。2つのエンドポイントの間を流れるすべてのメッセージはビジネス作業単位と考えることができます。

メッセージをRMシーケンスにグループ化することで、作業単位に関連のあるメッセージを処理するように信頼性のあるメッセージングを調整します。作業単位(つまりシーケンス)の全体がまとめて処理され、エラー・リカバリなどをシーケンス全体に適用できます(http://docs.oasis-open.org/ws-rx/wsrm/200702にあるWS-ReliableMessaging 1.2の仕様(2009年2月)でIncompleteSequenceBehavior要素の説明を参照)。たとえば、シーケンスのギャップの後で発生したリクエストを破棄したり、シーケンスから欠落したリクエストがある場合はリクエストのシーケンス全体を破棄したりするように、RMシーケンスを構成できます。

単位の最初のメッセージを送信する前に新しいクライアント・インスタンスを作成し、単位の最後のメッセージの後でクライアント・インスタンスを破棄することで、メッセージがビジネス作業単位の一部であることを示すことができます。または、WsrmClient API(クライアント・インスタンスをWsrmClientFactory.getWsrmClientFromPort()メソッドに渡すことで取得します)を使用して、シーケンス内の最後のリクエストが送信されようとしていることを示すことができます。これは、クライアント・インスタンスで呼出しを実行する直前にWsrmClient.setFinalMessage()を呼び出すことで行います(「信頼性のあるシーケンスでの最後のメッセージの識別」を参照)。

RMプロトコルには大きなオーバーヘッドが伴います。具体的には、シーケンスの作成と終了では、サービス(RM宛先)との間で往復メッセージが交換されます。つまり、RMシーケンスを確立して終了するには、4つのメッセージをやり取りする必要があります。このため、単一のRMシーケンス上の単一のビジネス作業単位内でリクエストを送信することには利点があります。これにより、RMプロトコルのオーバーヘッドのコストを複数のビジネス・メッセージに分割できます。

場合によっては、信頼性のあるサービスへの通信に使用されているクライアント・インスタンスは、メッセージの所属先のビジネス作業単位の固有概念がない環境で実行されます。その一例は、メッセージ・ブローカなどの仲介者です。この場合、ブローカは、メッセージ自体のみを認識し、メッセージが送信されているコンテキストを認識しないことがしばしばあります。ブローカは、ビジネス作業単位(またはシーケンス)の開始と終了の境界を定めるために何も実行しない場合があります。その結果、リクエストの送信に信頼性のあるメッセージングを使用するとき、ブローカは、送信するすべてのメッセージのRMシーケンス作成および終了プロトコルのオーバーヘッドを負担します。これは、パフォーマンスに重大な負の影響を及ぼす可能性があります。

組込みのビジネス作業単位がメッセージに対して不明の場合は、任意のグループ(バッチ)・メッセージを選択して、恣意的に作成した作業単位(バッチと呼ばれます)に含めることができます。信頼性のあるメッセージをバッチ化すると、前記のパフォーマンスに対する影響を回避でき、信頼性のあるメッセージングのクライアントとサービスの間のネットワーク使用とスループットを調整して最適化できます。関連のないリクエストを小さい単位(約10個のリクエスト)でバッチ化すると、クライアントとサービスの間のスループットが、信頼性のあるメッセージングを使用する(小さいメッセージを送信する)ときの3倍になる場合があることがテストにより示されました。


注意:

すでにビジネス作業単位と関連付けられているリクエストをバッチ化することはお薦めしません。これは、RMシーケンスの境界と作業単位の境界が一致しない場合、エラー・リカバリが複雑になる可能性があるためです。たとえば、ReliabilityErrorListenerを(WsrmClientInitFeatureを使用して)クライアント・インスタンスに追加すると(「信頼性エラー・リスナーの実装」を参照)、このリスナーを使用してシーケンス内の単一のリクエストまたはシーケンス全体の障害に対するエラー・リカバリを実行できます。リクエストをバッチ化する場合、リクエストの障害を適切に処理するために、各リクエストに関する何らかの情報を、このエラー・リカバリ・ロジックで格納する必要があります。バッチ化を行わないクライアントのほうが、それが属しているビジネス作業単位に基づいて、リクエストに関するコンテキストをより多く保持する可能性があります。


次のコード例では、RMリクエストのバッチ化を簡単かつ効率的にするために使用できるBatchingRmClientWrapperという名前のクラスの例を示します。このクラスは、リクエストを指定した数のリクエストのグループにバッチ化します。通常のクライアント・インスタンスに代わる動的なプロキシを作成できます。クライアント・インスタンスで呼び出すと、バッチ・ラッパーが発信リクエストをバッチにシームレスにグループ化し、各バッチに専用のRMシーケンスを割り当てます。バッチ・ラッパーは、特定のバッチの最大存続期間を示す期間指定も取得します。これにより、バッチを完全に満たすのに十分な発信リクエストがない場合でも、完了していないバッチを適切なタイミングで完了させることができます。バッチが指定されている最大存続期間のあいだ存在している場合、バッチの最後のメッセージが送信された場合と同じように閉じられます。

信頼性のあるメッセージングをバッチ化するために使用できるクライアント・ラッパー・クラスの例は、付録B「Example Client Wrapper Class for Batching Reliable Messages」を参照してください。必要であれば、このクラスを独自のアプリケーション・コードとして使用できます。

例6-2 作業単位へのメッセージのグループ化の例(バッチ化)

import java.io.IOException;
import java.util.*;
import java.util.*;
 
import javax.servlet.*;
import javax.xml.ws.*;
 
import weblogic.jws.jaxws.client.ClientIdentityFeature;
import weblogic.jws.jaxws.client.async.AsyncClientHandlerFeature;
import weblogic.jws.jaxws.client.async.AsyncClientTransportFeature;
import weblogic.wsee.reliability2.api.ReliabilityErrorContext;
import weblogic.wsee.reliability2.api.ReliabilityErrorListener;
import weblogic.wsee.reliability2.api.WsrmClientInitFeature;
 
/**
 * Example client for invoking a reliable Web service and 'batching' requests
 * artificially into a sequence. A wrapper class called
 * BatchingRmClientWrapper is called to begin and end RM sequences for each batch of
 * requests. This avoids per-message RM sequence handshaking
 * and termination overhead (delivering better performance).
 */
public class BestPracticeAsyncRmBatchingClient
  extends GenericServlet {
 
  private BackendReliableServiceService _service;
  private BackendReliableService _singletonPort;
  private BackendReliableService _batchingPort;
 
  private static int _requestCount;
  private static String _lastResponse;
 
  @Override
  public void init()
    throws ServletException {
 
    _requestCount = 0;
    _lastResponse = null;
 
    // Only create the Web service object once as it is expensive to create repeatedly.
    if (_service == null) {
      _service = new BackendReliableServiceService();
    }
 
    // Best Practice: Use a stored list of features, per client ID, to create client instances.
    // Define all features for the Web service port, per client ID, so that they are 
    // consistent each time the port is called. For example: 
    // _service.getBackendServicePort(_features);
 
    List<WebServiceFeature> features = new ArrayList<WebServiceFeature>();
 
    // Best Practice: Explicitly define the client ID.
    ClientIdentityFeature clientIdFeature =
      new ClientIdentityFeature("MyBackendServiceAsyncRmBatchingClient");
    features.add(clientIdFeature);
 
    // Best Practice: Always implement a reliability error listener. 
    // Include this feature in your reusable feature list. This enables you to determine
    // a reason for failure, for example, RM cannot deliver a request or the RM sequence fails in
    // some way (for example, client credentials refused at service).
    WsrmClientInitFeature rmFeature = new WsrmClientInitFeature();
    features.add(rmFeature);
    rmFeature.setErrorListener(new ReliabilityErrorListener() {
      public void onReliabilityError(ReliabilityErrorContext context) {
        // At a *minimum* do this
        System.out.println("RM sequence failure: " +
                           context.getFaultSummaryMessage());
        _lastResponse = context.getFaultSummaryMessage();
      }
    });
 
    // Asynchronous endpoint
    AsyncClientTransportFeature asyncFeature =
      new AsyncClientTransportFeature(getServletContext());
    features.add(asyncFeature);
 
    // Best Practice: Define a port-based asynchronous callback handler,
    // AsyncClientHandlerFeature, for asynchronous and dispatch callback handling.
    BackendReliableServiceAsyncHandler handler =
      new BackendReliableServiceAsyncHandler() {
        public void onDoSomethingResponse(Response<DoSomethingResponse> res) {
          // ... Handle Response ...
          try {
            DoSomethingResponse response = res.get();
            _lastResponse = response.getReturn();
            System.out.println("Got reliable/async/batched response: " + _lastResponse);
          } catch (Exception e) {
            _lastResponse = e.toString();
            e.printStackTrace();
          }
        }
      };
    AsyncClientHandlerFeature handlerFeature =
      new AsyncClientHandlerFeature(handler);
    features.add(handlerFeature);
 
    // Set the features used when creating clients with
    // this client ID "MyBackendServiceAsyncRmBatchingClient"
 
    WebServiceFeature[] featuresArray =
      features.toArray(new WebServiceFeature[features.size()]);
 
    // Best Practice: Define a singleton port instance and initialize it when 
    // the client container initializes (upon deployment).
    // The singleton port will be available for the life of the servlet.
    // Creation of the singleton port triggers the asynchronous response endpoint to be published
    // and it will remain published until our container (Web application) is undeployed.
    // Note, we will get a call to destroy() before this.
    _singletonPort = _service.getBackendReliableServicePort(featuresArray);
 
    // Create a wrapper class to 'batch' messages onto RM sequences so
    // a client with no concept of which messages are related as a unit can still achieve
    // good performance from RM. The class will send a given number of requests on
    // the same sequence, and then terminate that sequence before starting
    // another to carry further requests. A batch has both a max size and
    // lifetime so no sequence is left open for too long.
    // The example batches 10 messages or executes for 20 seconds, whichever comes
    // first. Assuming there were 15 total requests to send, the class would start and complete
    // one full batch of 10 requests, then send the next batch of five requests.
    // Once the batch of five requests has been open for 20 seconds, it will be closed and the
    // associated sequence terminated (even though 10 requests were not sent to fill the batch).
    BackendReliableService batchingPort =
      _service.getBackendReliableServicePort(featuresArray);
    BatchingRmClientWrapper<BackendReliableService> batchingSeq
      = new BatchingRmClientWrapper<BackendReliableService>(batchingPort,
                                                   BackendReliableService.class,
                                                   10, "PT20S",
                                                   System.out);
    _batchingPort = batchingSeq.createProxy();
  }
 
  @Override
  public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException {
 
    // TODO: ... Read the servlet request ...
 
    // For this simple example, echo the _lastResponse captured from 
    // an asynchronous DoSomethingResponse response message.
 
    if (_lastResponse != null) {
      res.getWriter().write(_lastResponse);
      System.out.println("Servlet returning _lastResponse value: " + _lastResponse);
      _lastResponse = null; // Clear the response so we can get another
      return;
    }
 
    // Synchronize on _batchingPort since it is a class-level variable and it might
    // be in this method on multiple threads from the servlet engine.
    
    synchronized(_batchingPort) {
 
      // Use the 'batching' port to send the requests instead of creating a
      // new request each time.
      BackendReliableService port = _batchingPort;
 
      // Set the endpoint address for BackendService.
      ((BindingProvider)port).getRequestContext().
        put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
            "http://localhost:7001/BestPracticeReliableService/BackendReliableService");
 
    // Make the invocation. Our asynchronous handler implementation (set 
    // into the AsyncClientHandlerFeature above) receives the response.
      String request = "Protected and serve " + (++_requestCount);
      System.out.println("Invoking DoSomething reliably/async/batched with request: " +
                         request);
      port.doSomethingAsync(request);
    }
 
    // Return a canned string indicating the response was not received
    // synchronously. Client needs to invoke the servlet again to get
    // the response.
    res.getWriter().write("Waiting for response...");
  }
 
  @Override
  public void destroy() {
 
    try {
      // Best Practice: Explicitly close client instances when processing is complete.
      // Close the singleton port created during initialization. Note, the asynchronous
      // response endpoint generated by creating _singletonPort *remains*
      // published until our container (Web application) is undeployed.
      ((java.io.Closeable)_singletonPort).close();
      // Best Practice: Explicitly close client instances when processing is complete.
      // Close the batching port created during initialization. Note, this will close
      // the underlying client instance used to create the batching port.
      ((java.io.Closeable)_batchingPort).close();

      // Upon return, the Web application is undeployed, and the asynchronous
      // response endpoint is stopped (unpublished). At this point,
      // the client ID used for _singletonPort will be unregistered and will no longer be
      // visible from the Administration Console and WLST.
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

信頼性のあるWebサービスを再デプロイする際にクライアント側で考慮すべき事項

WebLogic Serverでは、本番用の再デプロイメントがサポートされています。つまり、信頼性のあるWebLogic Webサービスの更新後の新しいバージョンを、同じWebサービスの古いバージョンと並行してデプロイできます。

WebLogic Serverでは、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでにWebサービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続け、作業が完了した時点で古いWebサービスが自動的にリタイアされます。クライアントが信頼性のあるWebサービスに接続されている場合は、既存の信頼性のあるメッセージ・シーケンスがクライアントによって明示的に終了されるか、またはタイムアウトになったときに、そのクライアントの作業が完了したと見なされます。

本番用の再デプロイメントとWebサービス・クライアントの詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービスを再デプロイする際にクライアントで考慮すべき事項に関する項を参照してください。

WebLogic Webサービスの信頼性のあるメッセージングとの相互運用性

WebLogic Webサービスの信頼性のあるメッセージングの実装は、IBMおよびMicrosoft .NETの各サードパーティ・ベンダーのWebサービスで提供されるWebサービスの信頼性のあるメッセージングの実装と相互運用できます。Microsoft .NETと相互運用するときのベスト・プラクティスは、『Oracle WebLogic Server WebLogic Webサービスの紹介』のMicrosoft WCF/.NETとの相互運用性に関する項を参照してください。

Webサービスの信頼性のあるメッセージングを使用するOracle SOAサービスとの相互運用性を拡張するには、相互運用性に関する次のガイドラインを考慮してください。

  • 非同期トランスポートには接続作成を使用しないでください(「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」を参照)。信頼性のあるSOAサービスは接続作成をサポートしません。

  • WS-SecureConversationを使用して信頼性のあるWebサービスを保護しないでください。SOAサービスは、Webサービスの信頼性のあるメッセージングとWS-SecureConversationの併用をサポートしません。

  • 信頼性のあるSOAサービスにアクセスする信頼性のあるWebLogic Webサービス・クライアントの場合:

    • 同期(匿名WS-Addressing ReplyTo EPR)リクエスト応答または一方向MEP(メッセージ交換パターン)を使用します。

    • 非同期(非匿名WS-Addressing ReplyTo EPR)リクエスト応答MEPは使用しないでください。

  • 信頼性のあるWebLogic Webサービスにアクセスする信頼性のあるSOAクライアントの場合、次のいずれかを使用します。

    • 同期(匿名WS-Addressing ReplyTo EPR)リクエスト応答または一方向MEP。

    • 非同期(非匿名WS-Addressing ReplyTo EPR)リクエスト応答MEP。

PKëyÇ1Ñ}®}PK/¯-AOEBPS/clients.htmoä Webサービス・クライアントを開発する手順

3 Webサービス・クライアントを開発する手順

この章では、Java API for XML Web Services(JAX-WS)用のWebLogic Webサービス・クライアントを開発するためのベスト・プラクティスについて説明します。

この章の内容は以下のとおりです。


注意:

『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービスの呼出しに関する項で説明されているWebサービス・クライアントの開発に関する一般的な概念に習熟していることが前提となっています。

信頼性のあるWebサービス・クライアントの開発に関するベスト・プラクティスについては、第5章「信頼性のあるWebサービスとクライアントを開発する手順」を参照してください。

次の項でクライアント・インスタンスは、ポートまたはディスパッチ・インスタンスです。


Webサービス・クライアントを開発する手順

表3-0では、Webサービス・クライアントを開発するためのベスト・プラクティスとその例を示します。非同期Webサービス・クライアントの開発に固有の他のベスト・プラクティスについては、「非同期Webサービス・クライアントを開発する手順」を参照してください。

表3-1 Webサービス・クライアントを開発する手順

ベスト・プラクティス説明

クライアント・インスタンスの使用と同期させます。

クライアント・インスタンスは必要なときに作成します。長い間保存しないようにしてください。

クライアントIDを含む機能の保管されたリストを使用して、クライアント・インスタンスを作成します。

クライアントIDが含まれるWebサービス・クライアント・インスタンスのすべての機能を定義し、クライアント・インスタンスを作成するたびに異なることがないようにします。例:

_service.getBackendServicePort(_features);

クライアントIDを明示的に定義します。

ClientIdentityFeatureを使用してクライアントIDを明示的に定義します。このクライアントIDは、統計と他のモニタリング情報のグループ化や、実行時の検証のレポートに使用されます。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のクライアントIDの管理に関する項を参照してください。

注意: クライアントIDは明示的に定義することを強くお薦めします。明示的に定義しないと、サーバーによって自動的にクライアントIDが生成されますが、ユーザーにとってわかりにくい場合があります。

処理が完了したら、クライアント・インスタンスを明示的に閉じます。

例:

((java.io.Closeable)port).close();

明示的に閉じないと、クライアント・インスタンスはユーザーがスコープ外になった時点で自動的に閉じられます。

注意: クライアントIDは、コンテナ(WebアプリケーションまたはEJB)が非アクティブ化されるまで、登録済みで可視の状態を維持します。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のクライアントIDのライフサイクルに関する項を参照してください。


次の例では、Webサービス・クライアントを開発するためのベスト・プラクティスを示します。

例3-1 Webサービス・クライアントのベスト・プラクティスの例

import java.io.IOException;
import java.util.*;
 
import javax.servlet.*;
import javax.xml.ws.*;
 
import weblogic.jws.jaxws.client.ClientIdentityFeature;
 
/**
 * Example client for invoking a Web service.
 */
public class BestPracticeClient
  extends GenericServlet {
 
  private BackendServiceService _service;
  private WebServiceFeature[] _features;
  private ClientIdentityFeature _clientIdFeature;
 
  @Override
  public void init()
    throws ServletException {
 
    // Create a single instance of a Web service as it is expensive to create repeatedly.
    if (_service == null) {
      _service = new BackendServiceService();
    }
 
    // Best Practice: Use a stored list of features, per client ID, to create client instances.
    // Define all features for the Web service client instance, per client ID, so that they are 
    // consistent each time the client instance is created. For example: 
    // _service.getBackendServicePort(_features);
 
    List<WebServiceFeature> features = new ArrayList<WebServiceFeature>();
 
    // Best Practice: Explicitly define the client ID.
    // TODO: Maybe allow ClientIdentityFeature to store other features, and
    //       then create new client instances simply by passing the
    //       ClientIdentityFeature (and the registered features are used).
    _clientIdFeature = new ClientIdentityFeature("MyBackendServiceClient");
    features.add(_clientIdFeature);
 
    // Set the features used when creating clients with
    // the client ID "MyBackendServiceClient". The features are stored in an array to 
    // reinforce that the list should be treated as immutable.
    _features = features.toArray(new WebServiceFeature[features.size()]);
  }
 
  @Override
  public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException {
 
    // ... Read the servlet request ...
 
    // Best Practice: Synchronize use of client instances.
    // Create a Web service client instance to talk to the backend service.
    // Note, at this point the client ID is 'registered' and becomes
    // visible to monitoring tools such as the Administration Console and WLST.
    // The client ID *remains* registered and visible until the container
    // (the Web application hosting our servlet) is deactivated (undeployed).
    //
    // A client ID can be used when creating multiple client instances (port or Dispatch client).
    // The client instance should be created with the same set of features each time, and should
    // use the same service class and refer to the same port type. 
    // A given a client ID should be used for a given port type, but not across port types.
    // It can be used for both port and Dispatch clients.
    BackendService port =
      _service.getBackendServicePort(_features);
 
    // Set the endpoint address for BackendService.
    ((BindingProvider)port).getRequestContext().
      put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
          "http://localhost:7001/BestPracticeService/BackendService");
 
    // Print out the explicit client ID, and compare it to the client ID 
    // that would have been generated automatically for the client instance.
    showClientIdentity();
 
    // Make the invocation on our real port
    String request = "Make a cake";
    System.out.println("Invoking DoSomething with request: " + request);
    String response = port.doSomething(request);
    System.out.println("Got response: " + response);
    res.getWriter().write(response);
 
    // Best Practice: Explicitly close client instances when processing is complete.
    // If not closed, the client instance will be closed automatically when it goes out of 
    // scope. Note, this client ID will remain registered and visible until our
    // container (Web application) is undeployed.
    ((java.io.Closeable)port).close();
  }
 
  /**
    // Print out the client's full ID, which is a combination of
    // the client ID provided above and qualifiers from the application and
    // Web application that contain the client. Then compare this with the client ID that
    // would have been generated for the client instance if not explicitly set.
    //
  private void showClientIdentity()
    throws IOException {
 
    System.out.println("Client Identity is: " + _clientIdFeature.getClientId());
 
    // Create a client instance without explicitly defining the client ID to view the 
    // client ID that is generated automatically.
    ClientIdentityFeature dummyClientIdFeature =
      new ClientIdentityFeature(null);
    BackendService dummyPort =
      _service.getBackendServicePort(dummyClientIdFeature);
    System.out.println("Generated Client Identity is: " +
                       dummyClientIdFeature.getClientId());
    // Best Practice: Explicitly close client instances when processing is complete.
    // If not closed, the client instance will be closed automatically when it goes out of 
    // scope. Note, this client ID will remain registered and visible until our
    // container (Web application) is undeployed.
    ((java.io.Closeable)dummyPort).close();
  }
 
  @Override
  public void destroy() {
  }
}

非同期Webサービス・クライアントを開発する手順

表3-1では、非同期Webサービス・クライアントを開発するためのベスト・プラクティスとその例を示します。これらのガイドラインは、「Webサービス・クライアントを開発する手順」で示されている一般的なガイドラインと併せて使用する必要があります。

表3-2 非同期Webサービス・クライアントを開発する手順

ベスト・プラクティス説明

非同期およびディスパッチ・コールバック処理のためにポートベースの非同期コールバック・ハンドラAsyncClientHandlerFeatureを定義します。

拡張性があり、JVMを再起動しても維持されるため、非同期呼び出しを使用するときのベスト・プラクティスとして、AsyncClientHandlerFeatureを使用することをお薦めします。このハンドラは(持続可能かどうかに関係なく)任意のクライアントで使用できます。詳細は、「非同期ハンドラ・インタフェースの開発」を参照してください。

シングルトン・ポート・インスタンスを定義し、(デプロイメント時に)クライアント・コンテナを初期化するときに初期化します。

シングルトン・ポートの作成:

  • デプロイメント時に公開する非同期レスポンス・エンドポイントをトリガーします。

  • VMの再起動後にシングルトン・ポート・インスタンスを再初期化することで、障害リカバリをサポートします。

クラスタ内では、シングルトン・ポートを初期化すると、クラスタ内のすべてのメンバー・サーバーが非同期レスポンス・エンドポイントをパブリッシュすることが保証されます。これによって、非同期レスポンス・メッセージが任意のメンバー・サーバーに配信され、必要に応じてインプレース・クラスタ・ルーティングを介して正しいサーバーに転送されることが保証されます。詳細は、「非同期Webサービス・メッセージングのクラスタリングの考慮事項」を参照してください。

ファイアウォールの内側にあるクライアントに接続作成を使用する場合は、接続作成ポーリング間隔をシナリオに対して現実的な値に設定します。

接続作成のポーリング間隔は、不必要なポーリング・オーバーヘッドを避けることができる大きな値で、なおかつ遅れずにレスポンスを取得できる十分に小さい値に設定する必要があります。接続作成ポーリング間隔の推奨される値は、呼び出されるWebサービスの予想される平均レスポンス時間の半分です。接続作成ポーリング間隔の設定の詳細は、「ポーリング間隔の構成」を参照してください。

注意: このベスト・プラクティスは、例3-2では示されていません。

JAX-WS参照実装(RI)を使用している場合は、AsyncHandler<T>インタフェースを実装します。

AsyncHandler<T>インタフェースを使用する方が、Response<T>インタフェースを使用するより効率的です。詳細および例は、「JAX-WS参照実装の使用」を参照してください。

注意: このベスト・プラクティスは、例3-2では示されていません。

ワーク・マネージャを定義し、スレッド・プールの最小サイズ制限(min-threads-constraint)を、最低でもサービスに対して予想される同時リクエスト数または同時レスポンス数と同じ値に設定します。

たとえば、Webサービス・クライアントが20個のリクエストを立て続けに発行する場合、そのクライアントをホストするアプリケーションで推奨されるスレッド・プールの最小サイズ制約の値は20です。構成した制約値が小さすぎると、受信処理で処理スレッドの空き待ちが発生するためパフォーマンスが大幅に低下するおそれがあります。

スレッド・プールの最小サイズ制約の詳細は、『Oracle WebLogic Serverサーバー環境の構成』の制約に関する項を参照してください。


次の例では、非同期Webサービス・クライアントを開発するためのベスト・プラクティスを示します。

例3-2 非同期Webサービス・クライアントのベスト・プラクティスの例

import java.io.*;
import java.util.*;
 
import javax.servlet.*
import javax.xml.ws.*
 
import weblogic.jws.jaxws.client.ClientIdentityFeature;
import weblogic.jws.jaxws.client.async.AsyncClientHandlerFeature;
import weblogic.jws.jaxws.client.async.AsyncClientTransportFeature;
 
import com.sun.xml.ws.developer.JAXWSProperties;
 
/**
 * Example client for invoking a Web service asynchronously.
 */
public class BestPracticeAsyncClient
  extends GenericServlet {
 
  private static final String MY_PROPERTY = "MyProperty";
 
  private BackendServiceService _service;
  private WebServiceFeature[] _features;
  private BackendService _singletonPort;
 
  private static String _lastResponse;
  private static int _requestCount;
 
  @Override
  public void init()
    throws ServletException {
 
    // Only create the Web service object once as it is expensive to create repeatedly.
    if (_service == null) {
      _service = new BackendServiceService();
    }
 
    // Best Practice: Use a stored list of features, including client ID, to create client 
    // instances.
    // Define all features for the Web service client instance, including client ID, so that they
    // are consistent each time the client instance is created. For example: 
    // _service.getBackendServicePort(_features);
 
    List<WebServiceFeature> features = new ArrayList<WebServiceFeature>();
 
    // Best Practice: Explicitly define the client ID.
    ClientIdentityFeature clientIdFeature =
      new ClientIdentityFeature("MyBackendServiceAsyncClient");
    features.add(clientIdFeature);
 
    // Asynchronous endpoint
    AsyncClientTransportFeature asyncFeature =
      new AsyncClientTransportFeature(getServletContext());
    features.add(asyncFeature);
 
    // Best Practice: Define a port-based asynchronous callback handler,
    // AsyncClientHandlerFeature, for asynchronous and dispatch callback handling.
    BackendServiceAsyncHandler handler =
      new BackendServiceAsyncHandler() {
        // This class is stateless and should not depend on
        // having member variables to work with across restarts.
        public void onDoSomethingResponse(Response<DoSomethingResponse> res) {
          // ... Handle Response ...
          try {
            DoSomethingResponse response = res.get();
            res.getContext();
            _lastResponse = response.getReturn();
            System.out.println("Got async response: " + _lastResponse);
            // Retrieve the request property. This property can be used to 
            // 'remember' the context of the request and subsequently process
            // the response.
            Map<String, Serializable> requestProps =
              (Map<String, Serializable>)
                res.getContext().get(JAXWSProperties.PERSISTENT_CONTEXT);
            String myProperty = (String)requestProps.get(MY_PROPERTY);
            System.out.println("Got MyProperty value propagated from request: "+
                               myProperty);
          } catch (Exception e) {
            _lastResponse = e.toString();
            e.printStackTrace();
          }
        }
      };
    AsyncClientHandlerFeature handlerFeature =
      new AsyncClientHandlerFeature(handler);
    features.add(handlerFeature);
 
    // Set the features used when creating clients with
    // the client ID "MyBackendServiceAsyncClient".
 
    _features = features.toArray(new WebServiceFeature[features.size()]);

    // Best Practice: Define a singleton port instance and initialize it when 
    // the client container initializes (upon deployment).
    // The singleton port will be available for the life of the servlet.
    // Creation of the singleton port triggers the asynchronous response endpoint to be published
    // and it will remain published until our container (Web application) is undeployed.
    // Note, the destroy() method will be called before this.
    // The singleton port ensures proper/robust operation in both
    // recovery and clustered scenarios.
    _singletonPort = _service.getBackendServicePort(_features);
  }
 
  @Override
  public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException {
 
    // TODO: ... Read the servlet request ...
 
    // For this simple example, echo the _lastResponse captured from 
    // an asynchronous DoSomethingResponse response message.
 
    if (_lastResponse != null) {
      res.getWriter().write(_lastResponse);
      _lastResponse = null; // Clear the response so we can get another
      return;
    }
 
    // Set _lastResponse to NULL to to support the invocation against
    // BackendService to generate a new response.
 
    // Best Practice: Synchronize use of client instances.
    // Create another client instance using the *exact* same features used when creating _
    // singletonPort. Note, this port uses the same client ID as the singleton port 
    // and it is effectively the same as the singleton
    // from the perspective of the Web services runtime. 
    // This port will use the asynchronous response endpoint for the client ID, 
    // as it is defined in the _features list.
    BackendService anotherPort =
      _service.getBackendServicePort(_features);
 
    // Set the endpoint address for BackendService.
    ((BindingProvider)anotherPort).getRequestContext().
      put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
          "http://localhost:7001/BestPracticeService/BackendService");
 
    // Add a persistent context property that will be retrieved on the
    // response. This property can be used as a reminder of the context of this
    // request and subsequently process the response. This property will *not*
    // be passed over the wire, so the properties can change independent of the
    // application message.
    Map<String, Serializable> persistentContext =
      (Map<String, Serializable>)((BindingProvider)anotherPort).
        getRequestContext().get(JAXWSProperties.PERSISTENT_CONTEXT);
    String myProperty = "Request " + (++_requestCount);
    persistentContext.put(MY_PROPERTY, myProperty);
    System.out.println("Request being made with MyProperty value: " +
                       myProperty);
 
    // Make the asychronous invocation. The asynchronous handler implementation (set 
    // into the AsyncClientHandlerFeature above) receives the response.
    String request = "Dance and sing";
    System.out.println("Invoking DoSomething asynchronously with request: " +
                       request);
    anotherPort.doSomethingAsync(request);
 
    // Return a canned string indicating the response was not received
    // synchronously. Client will need to invoke the servlet again to get
    // the response.
    res.getWriter().write("Waiting for response...");
 
    // Best Practice: Explicitly close client instances when processing is complete.
    // If not closed explicitly, the port will be closed automatically when it goes out of scope.
    ((java.io.Closeable)anotherPort).close();
  }
 
  @Override
  public void destroy() {
 
    try {
      // Best Practice: Explicitly close client instances when processing is complete.
      // Close the singleton port created during initialization. Note, the asynchronous
      // response endpoint generated by creating _singletonPort *remains*
      // published until our container (Web application) is undeployed.
      ((java.io.Closeable)_singletonPort).close();

      // Upon return, the Web application is undeployed, and the asynchronous
      // response endpoint is stopped (unpublished). At this point,
      // the client ID used for _singletonPort will be unregistered and will no longer be
      // visible from the Administration Console and WLST.
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
PKLª¨û ooPK/¯-AOEBPS/proxy.htm94ÆË å‹•çš„ãƒ—ãƒ­ã‚­ã‚·ãƒ»ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®é–‹ç™º

14 動的プロキシ・クライアントの開発

この章では、静的プロキシ・クライアントと動的プロキシ・クライアントの違いを明確にするとともに、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスの動的プロキシ・クライアントを開発する手順について説明します。

この章の内容は以下のとおりです。

静的プロキシ・クライアントと動的プロキシ・クライアントの概要

表14-1は、静的プロキシ・クライアントと動的プロキシ・クライアントの違いを示しています。

表14-1 静的プロキシ・クライアントと動的プロキシ・クライアントの比較

プロキシ・クライアントのタイプ説明

静的プロキシ・クライアント

開発時にWebサービス・クライアントをコンパイルしてバインドします。これにより、Webサービス・クライアント・プロキシの静的スタブが生成されます。生成される静的スタブ・クライアントのソース・コードは、特定のサービス実装に依存します。そのため、このオプションには柔軟性がほとんどありません。

静的プロキシ・クライアントの例は、次を参照してください。

動的プロキシ・クライアント

開発時には何もコンパイルしません。実行時にアプリケーションがWSDLの取得および解析を行い、動的に呼出しを構成します。動的プロキシ・クライアントを使用すると、実行時にclientgenを使用することなく、サービス・エンドポイント・インタフェース(SEI)に基づいて、Webサービス・クライアントからWebサービスを動的に呼び出すことが可能になります。このオプションは、特定のサービス実装に依存しないため柔軟性は増しますが、パフォーマンス・ヒットも大きくなります。

動的プロキシ・クライアントの開発手順は、「動的プロキシ・クライアントの開発手順」を参照してください。


動的プロキシ・クライアントの開発手順

動的プロキシ・クライアントを作成する手順を次の表に示します。詳細は、javax.xml.ws.ServiceのJavadoc(http://download.oracle.com/javaee/5/api/javax/xml/ws/Service.html)を参照してください。

表14-2 動的プロキシ・クライアントの作成手順

#
手順説明

1

javax.xml.ws.Serviceインスタンスの作成

Service.createメソッドを使用してServiceインスタンスを作成します。

サービス名と、必要に応じてWSDLドキュメントの格納場所を渡す必要があります。メソッドの詳細は次のとおりです。

public static Service create (QName serviceName) throws javax.xml.ws.WebServiceException {}
public static Service create (URL wsdlDocumentLocation, QName serviceName) throws javax.xml.ws.WebServiceException {}

例:

URL wsdlLocation = new URL("http://example.org/my.wsdl");
QName serviceName = new QName("http://example.org/sample", "MyService");
Service s = Service.create(wsdlLocation, serviceName);

使用方法に関するその他の情報は、「WSDLの場所を指定する際のその他の考慮事項」を参照してください。

2

プロキシ・スタブを作成します。

Service.getPortメソッドを使用してプロキシ・スタブを作成します。このスタブを使用すると、ターゲット・サービス・エンドポイント上の操作を呼び出すことができます。

サービス・エンドポイント・インタフェース(SEI)と、必要に応じてWSDLサービス記述内のポートの名前を渡す必要があります。メソッドの詳細は次のとおりです。

public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) throws javax.xml.ws.WebServiceException {}
public <T> T getPort(Class<T> serviceEndpointInterface) throws javax.xml.ws.WebServiceException {}

例:

MyPort port = s.getPort(MyPort.class);

WSDLの場所を指定する際のその他の考慮事項

HTTPSを使用してWSDLからWebサービスを取得する際に、WebLogic Server SSL証明書のホスト名定義がピアHTTPSサーバーのホスト名と同一ではない場合、または次のいずれかではない場合には、ホスト名検証エラーが発生して処理が失敗します。

  • localhost

  • 127.0.0.1

  • localhostのホスト名

  • localhostのIPアドレス

ホスト名検証エラーは次のとおりです。

EchoService service = new EchoService(https-wsdl, webservice-qName);
:
:
javax.xml.ws.WebServiceException: javax.net.ssl.SSLKeyException:  
Security:090504 Certificate chain received from host.company.com - 10.167.194.63
failed hostname verification check. Certificate contained {....} but
check expected host.company.com

推奨される回避策は、サービスを作成する際にHTTPSではなくHTTPを使用してWSDLからWebサービスを取得すること、そしてサービスの作成後に独自のホスト名検証コードを使用してホスト名を検証することです。

EchoService service = Service.create(http_wsdl, qname);
//get Port
EchoPort port = service.getPort(...);
//set self-defined hostname verifier
((BindingProvider) port).getRequestContext().put(
      com.sun.xml.ws.developer.JAXWSProperties.HOSTNAME_VERIFIER,
      new  MyHostNameVerifier());
/*
*/  

必要に応じて、バインディング・プロバイダ・プロパティを設定してホスト名検証を無視することもできます。

((BindingProvider) port).getRequestContext().put(
      BindingProviderProperties.HOSTNAME_VERIFICATION_PROPERTY,
      "true");

ただし、HTTPSを使用してWSDLからWebサービスを取得する必要がある場合は、いくつかの回避策が考えられます。

  • WebLogic Server HTTPS接続を使用している場合は、ホスト名検証を無効にします。そのためには、ホスト名検証を無視するグローバル・システム・プロパティを設定します。

    weblogic.security.SSL.ignoreHostnameVerification=true
    

    接続がJDK接続またはその他の非WebLogic Server接続の場合、このシステム・プロパティはサービスの作成には使用できません。

  • WSDLからWebサービスを取得する前に接続に対する独自のホスト名検証を設定し、その後HTTPSを使用してWSDLからWebサービスを取得します。

    //set self-defined hostname verifier
    URL url = new URL(https_wsdl);
    HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
    connection.setHostnameVerifier(new MyHostNameVerifier());
     
    //then initiate the service
    EchoService service = Service.create(https_wsdl, qname);
     
    //get port and set self-defined hostname verifier to binding provider
    ... 
    

回避策として独自のホスト名検証を設定する場合のホスト名検証の例を次に示します。

public class MyHostnameVerifier implements HostnameVerifier {
    public boolean verify(String hostname, SSLSession session) {
            if (hostname.equals("the host you want"))
          return true;
           else
               return false;
    }
}
PKöè6T>494PK/¯-AOEBPS/asynch.htm€ÿ Webサービスの非同期呼出し

4 Webサービスの非同期呼出し

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスを非同期に呼び出す方法について説明します。

この章の内容は以下のとおりです。

Webサービスの非同期呼出しの概要

Webサービスの非同期呼出しをサポートするため、WebLogic Webサービスでは、非同期クライアント・プログラミング・モデルと非同期トランスポートのどちらか一方または両方を使用できます。

表4-1では、非同期クライアント・プログラミング・モデルの主要な利点とトランスポート・タイプ、およびWebサービスの非同期呼出しをサポートするために使用できる構成オプションについて説明します。


注意:

2つのportType(非同期操作用に1つとコールバック操作用に1つ)として定義される2つの一方向操作を含む非同期Webサービス用のWSDLを生成する方法は、現在のリリースではサポートされていません。


表4-1 非同期Webサービス呼出しのサポート

タイプ説明利点

クライアント・プログラミング・モデル

Webサービス操作の呼出しに使用される呼出しセマンティクスを記述します(同期または非同期)。

Webサービスを同期的に呼び出す場合、呼出し側のクライアント・アプリケーションは、レスポンスが戻るまで待機してから、処理を続行します。レスポンスが即座に戻る場合であれば、このWebサービス呼出しの方法は適切であると考えられます。しかし、リクエストの処理が遅延する可能性があるため、クライアント・アプリケーションによる処理を続行しレスポンスへの対処は後で行うようにすると便利なことがよくあります。

Webサービスを非同期的に呼び出すと、クライアントは処理を中断することなく続行でき、非同期レスポンスが返ると通知を受け取ります。

非同期呼出しをサポートするには、clientgen Antタスクを使用して、Webサービス・ポート上で非同期的な種類の操作をそれぞれ自動的に生成します(この後の「非同期Webサービス呼出しのためのクライアント・アーティファクトの作成」で説明しています)。続いて、非同期のレスポンスまたは障害が後で戻されたときにそれを処理するクライアントのメソッド(ビジネス・ロジックを含む)を追加します。最後に、Webサービスを非同期的に呼び出すため、操作を直接呼び出すのではなく、非同期的な種類の操作を呼び出します。たとえば、addNumbersという操作を直接呼び出すのではなく、addNumbersAsyncを呼び出します。

非同期的に呼び出すことで、Webサービス・クライアントは、Webサービスに対するリクエストを開始し、中断することなく処理を続行し、以降の何らかの時点でレスポンスを受け取ることができます。

トランスポート

トランスポートには、非同期クライアント・トランスポート、接続作成トランスポート、同期トランスポートの3種類があります。トランスポートの各タイプの比較については、表4-2を参照してください。

非同期クライアント・トランスポートおよび接続作成トランスポートの主要な利点は次のとおりです。

  • ネットワークが停止したときのフォルト・トレランスが向上します。

  • サーバーでトラフィックのスパイクをいっそう効果的に緩和できるようになります。

構成

Webサービスの非同期呼出しをサポートするようにWebサービスの永続性とバッファリング(オプション)を構成します。

詳細は、「Webサービスを非同期に呼び出すためのサーバーの構成」を参照してください。

Webサービス機能の構成には、次のような利点があります。

  • 永続性は、時間のかかるリクエストをサポートし、途中でサーバーを再起動しても継続できます。

  • バッファリングを使用すると、Webサービスに対するすべてのリクエストを非同期に処理できます。


表4-2では、Webサービス・クライアントからのWebサービスの非同期呼出し(または、構成されている場合は同期呼出し)に対してWebLogic Serverがサポートするトランスポートのタイプを示します。

表4-2 Webサービスの非同期呼出しのトランスポート・タイプ

トランスポート・タイプ説明

非同期クライアント・トランスポート

アドレス可能なクライアント側非同期レスポンス・エンドポイントとWS-Addressingを使用することで、スケーラブルな非同期クライアント・プログラミング・モデルを提供します。

非同期クライアント・トランスポートは、レスポンス・メッセージの配信を、リクエスト・メッセージの送信に使用されるトランスポート・リクエストの開始から切り離します。レスポンス・メッセージは、Webサービスから開始する新しい接続を使用して、非同期レスポンス・エンドポイントに送信されます。クライアントは、WS-Addressingヘッダーを使用して、リクエスト・メッセージとレスポンス・メッセージを関連付けます。

非同期クライアント・トランスポートは、向上したフォルト・トレランスを提供し、サーバー負荷のスパイクをより適切に緩和できるようにします。

非同期クライアント・トランスポートの使用に関する詳細は、「スケーラブルな非同期JAX-WSクライアントの開発(非同期クライアント・トランスポート)」を参照してください。

非同期クライアント・トランスポートは、次のプログラミング・モデルをサポートします。

接続作成トランスポート

Web Services Make Connection 1.1または1.0を使用してファイアウォールの内側からの非同期Webサービス呼出しを可能にします。

接続作成は、非同期クライアント・トランスポートの代わりとなるクライアント・ポーリング・メカニズムです。非同期クライアント・トランスポートと同様に、接続作成を使用するとリクエスト・メッセージの送信に使用されるトランスポート・リクエストの開始から、レスポンス・メッセージを切り離すことができます。ただし、レスポンスを転送するためにアドレス可能な非同期レスポンス・エンドポイントを必要とする非同期クライアント・トランスポートとは異なり、接続作成では、通常、リクエスト・メッセージの送信元はアドレス可能ではなく、着信接続を受け付けることはできません。たとえば、送信元がファイアウォールの内側にあるような場合です。

接続作成トランスポートは、向上したフォルト・トレランスを提供し、サーバー負荷のスパイクをより適切に緩和できるようにします。

接続作成トランスポートの詳細は、「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」を参照してください。

接続作成トランスポートは拡張性があり、JVMを再起動しても維持されるため、ファイアウォールの内側から非同期呼出しを使用するときのベスト・プラクティスとしてお薦めします。次のプログラミング・モデルをサポートします。

拡張性があり、JVMを再起動しても維持されるため、非同期呼出しを使用するときのベスト・プラクティスとして、接続作成トランスポートとAsyncClientHandlerFeatureを使用することをお薦めします。

同期トランスポート

WS-Addressingの非常に制限されたサポートで、同期と非同期のWebサービス呼出しをサポートします。詳細は、「JAX-WS参照実装の使用」を参照してください。

同期呼出しを使用するときは、同期トランスポートをお薦めします。ベスト・プラクティスとはみなされませんが、非同期呼出しに使用することもできます。次のプログラミング・モデルをサポートします。

  • 「JAX-WS参照実装の使用」で説明されている、標準JAX-WS RIの実装を使用したリクエスト単位での非同期およびディスパッチ・コールバック処理。

  • 「JAX-WS参照実装の使用」で説明されている非同期ポーリング。

  • 同期呼出し。


非同期でWebサービスを呼び出すための手順

この項では、Webサービスを非同期に呼び出すために必要な手順について説明します。

Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xmlファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。

表4-3 非同期でWebサービスを呼び出すための手順

#
手順説明

1

Webサービスの非同期呼出しをサポートするようにWebサービスの永続性を構成します。

Webサービスまたはクライアントでメッセージを処理するために必要なコンテキスト情報を保持するように、WebサービスとクライアントをホストするサーバーでWebサービスの永続性を構成します。詳細は、「非同期Webサービス呼出しのためのサーバーの構成」を参照してください。

注意: 「JAX-WS参照実装の使用」で説明されているように、(手順3で)標準のJAX-WS RI実装と同期トランスポートを使用してWebサービス・クライアントをプログラミングしている場合は、この手順は必要ありません。

2

Webサービス・バッファリングを構成して、リクエストを非同期的に処理するためのWebサービスを有効化します。(オプション)

この手順はオプションです。リクエストを非同期に処理するようにWebサービスを構成するには、Webサービスをホストするサーバーでバッファリングを構成します。バッファリングを使用すると、Webサービスによる非同期処理のためにJMSキューにメッセージを格納できます。詳細は、「非同期Webサービス呼出しのためのサーバーの構成」を参照してください。

3

非同期呼出しに必要なクライアント・アーティファクトを作成します。

サービス・エンドポイント・インタフェースで非同期ポーリング・メソッドおよび非同期コールバック・ハンドラ・メソッドを生成するには、非同期マッピングを可能にする外部バインディング宣言を作成し、クライアントをコンパイルするときにclientgenに引数としてバインディング・ファイルを渡します。「非同期Webサービス呼出しのためのクライアント・アーティファクトの作成」を参照してください。

4

必要なトランスポートとプログラミング・モデルに基づいて、Webサービス・クライアントを実装します。

必要なトランスポートとプログラミング・モデルに応じて、次のいずれかの項を参照してください。

クラスタでWebサービスを使用するときは、「非同期Webサービス・メッセージングのクラスタリングに関する考慮事項」で説明されているガイドラインを確認してください。

5

Webサービス・クライアントをコンパイルし、クライアント・アーティファクトのパッケージを作成します。

詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のクライアント・アプリケーションのコンパイルと実行に関する項を参照してください。

6

Webサービス・クライアントをデプロイします。

『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。

7

Webサービス・クライアントをモニターします。

管理コンソールまたはWLSTを使用して、呼出し、エラー、フォルトの数など、Webサービスを非同期に呼び出すクライアントの実行時情報をモニターできます。「非同期Webサービス呼出しのモニタリング」を参照してください。


Webサービスを非同期に呼び出すためのサーバーの構成


注意:

「JAX-WS参照実装の使用」で説明されているように、標準のJAX-WS RI実装と同期トランスポートを使用してWebサービス・クライアントをプログラミングしている場合は、この手順は必要ありません。


Webサービスの非同期呼出しをサポートするには、Webサービスとクライアントをデプロイするサーバーで、次の表で定義されている機能を構成する必要があります。

表4-4 非同期Webサービス呼出しの構成

機能説明

永続性

Webサービスの永続性は、次の種類の情報を保存するために使用されます。

  • クライアントのIDとプロパティ

  • ヘッダーと本体を含むSOAPメッセージ

  • Webサービスまたはクライアントでメッセージを処理するために必要なコンテキスト・プロパティ(非同期メッセージと同期メッセージの両方)

接続作成トランスポート・プロトコルは、Webサービスの永続性を次のように利用します。

  • MCレシーバ(Webサービス)上に構成されたWebサービス永続性は、宛先の接続作成匿名URIに対する着信接続作成メッセージを待機しているレスポンス・メッセージを保持します。メッセージは、着信接続作成メッセージに対するレスポンスとして返されるまで、または永続ストア・オブジェクトの最大存続期間に達してストアから消去されるまで保持されます。

  • MCイニシエータ(Webサービス・クライアント)上に構成されたWebサービス永続性は、VM再起動後のリカバリのために非同期クライアント・ハンドラ機能で使用されます。

構成ウィザードでWebサービス固有の拡張テンプレートを使用してWebLogic Serverドメインを拡張することにより、Webサービスの永続性を構成できます。あるいは、Oracle WebLogic管理コンソールまたはWLSTを使用して、これらの高度な機能に必要なリソースを構成できます。Webサービス永続性の構成の詳細は、「Webサービス・クライアントのためのWebサービス永続性の構成」を参照してください。クライアントとメッセージの情報の保持に使用できるAPIの詳細は、「レスポンスへのリクエスト・コンテキストの伝播」を参照してください。

メッセージ・バッファリング

バッファ付き操作がクライアントによって呼び出されると、リクエストはJMSキューに格納され、WebLogic Serverはリクエストを非同期に処理します。リクエストがまだキューの中にある間にWebLogic Serverがダウンした場合は、WebLogic Serverが再起動してからすぐにリクエストの処理が行われます。メッセージ・バッファリングは、Webサービスをホストしているサーバー上で構成されます。構成情報の詳細は、第8章「Webサービスのためのメッセージ・バッファリングの構成」を参照してください。

注意: Webサービス・クライアントではメッセージ・バッファリングが自動的に有効になります。


Webサービスを非同期に呼び出すためのクライアント・アーティファクトの構築

WebLogic Serverのクライアント側ツール(clientgenなど)を使用すると、非同期Webサービス呼出しに必要なクライアント・アーティファクトを自動的に生成できます。具体的には、次のアーティファクトが生成されます。

  • リクエストごとの非同期コールバック・ハンドラを使用して、または使用しないで、Webサービスを非同期に呼び出すためのサービス・エンドポイント・インタフェース。たとえば、Webサービスで次のようなメソッドが定義されているものとします。

    public int addNumbers(int opA, int opB) throws MyException
    

    この場合は、次のようなメソッドが生成されます。

    public Future<?> addNumbersAsync(int opA, int opB,
                      AsyncHandler<AddNumbersResponse>)
    public Response<AddNumbersResponse> addNumbersAsync(int opA, int opB)
    
  • ハンドラを実装し、AsyncClientHandlerFeatureを使用してポート上にそのハンドラを設定するための非同期ハンドラ・インタフェース。非同期ハンドラ・インタフェースの名前は、portInterfaceNameAsyncHandlerとなり、ここでportInterfaceNameはポート・インタフェース名を指定します。

    たとえば、ポート・タイプ名がAddNumbersPortTypeであるWebサービスの場合、次のメソッドを含むAddNumbersPortTypeAsyncHandlerという名前の非同期ハンドラ・インタフェースが生成されます。

    public void onAddNumbersResponse(Response<AddNumbersResponse>)
    

    AsyncClientHandlerFeatureについては、後の「非同期ハンドラ・インタフェースの開発」で説明します。

WSDLのコンパイル時に、サービス・エンドポイント・インタフェースで非同期クライアント・アーティファクトを生成するには、WSDLファイルでjaxws:enableAsyncMappingバインディング宣言を有効にします。

あるいは、特定のWSDLまたはXMLスキーマ・ドキュメントのすべてのバインディング宣言を格納する外部バインディング宣言ファイルを作成できます。次に、バインディング宣言ファイルをwsdlc、jwsc、またはclientgen Antタスクの<binding子要素に渡します。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のJAX-WSバインディング宣言を使用した外部バインディング宣言ファイルの作成に関する項を参照してください。

次に示すバインディング宣言ファイル(jaxws-binding.xml)の例では、jaxws:enableAsyncMappingバインディング宣言を有効にしています。

<bindings
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    wsdlLocation="AddNumbers.wsdl"
    xmlns="http://java.sun.com/xml/ns/jaxws">
    <bindings node="wsdl:definitions">
        <package name="examples.webservices.async"/>
        <enableAsyncMapping>true</enableAsyncMapping>
    </bindings>
</bindings>

次に、build.xmlファイルを更新し、Webサービス操作を非同期に呼び出すために必要なクライアント・アーティファクトを生成するため、次の手順を実行します。

  1. taskdef Antタスクを使用して、clientgen Antタスクの完全なクラス名を定義します。

  2. 前に定義した非同期バインディング宣言が格納されている外部バインディング宣言ファイルへの参照を含むターゲットを追加します。この場合、clientgen Antタスクは、同期的な種類と非同期的な種類のWebサービス操作をJAX-WSスタブ内に生成します。

例:

<taskdef name="clientgen"
    classname="weblogic.wsee.tools.anttasks.ClientGenTask" />

<target name="build_client">

<clientgen
      type="JAXWS"
      wsdl="AddNumbers.wsdl"
      destDir="${clientclasses.dir}"
      packageName="examples.webservices.async.client">
      <binding file="jaxws-binding.xml" />
    </clientgen>
    <javac
      srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
      includes="**/*.java"/>
    <javac
      srcdir="src" destdir="${clientclass-dir}"
      includes="examples/webservices/async/client/**/*.java"/>

</target>

スケーラブルな非同期JAX-WSクライアントの開発(非同期クライアント・トランスポート)

非同期クライアント・トランスポート機能は、スケーラブルな非同期クライアント・プログラミング・モデルを提供します。具体的には、次のような機能があります。

  • 図4-1に示すような、クライアント側の非同期レスポンス・エンドポイントを公開します。

  • 要求された非同期ハンドラの実装を呼び出すサービスの実装を作成して公開します。

  • すべての非一方向アウトバウンド・メッセージに、WS-Addressingの非匿名ReplyToヘッダーを自動的に追加します。このヘッダーは、公開されたレスポンス・エンドポイントを参照します。

  • 前記の機能を使用して、非同期リクエストとレスポンス・メッセージを関連付けます。

非同期クライアント・トランスポート機能が有効になっているとき、他のすべてのJAX-WSクライアント・プログラミング・モデル(非同期ポーリング、コールバック・ハンドラ、ディスパッチなど)は引き続きサポートされます。非同期クライアント・トランスポート機能が有効になっているとき、この機能を使用するように明示的に構成されていないと、同期Webサービス操作はデフォルトで同期トランスポートを使用します。

次の図では、非同期クライアント・トランスポート機能が使用するメッセージ・フローを示します。

図4-1 非同期クライアント・トランスポート機能

図4-1の説明が続きます
「図4-1 非同期クライアント・トランスポート機能」の説明

前の図に示すように、次のような処理が行われます。

  1. クライアントは、クライアント・プロキシで非同期クライアント・トランスポート機能を有効にして、非同期Webサービス操作を呼び出します。

  2. Webサービス操作がクライアント・プロキシを介して呼び出されます。

  3. Webサービスはリクエストを処理し、(その後のどこかの時点で)レスポンス・メッセージをクライアントに返送します。レスポンス・メッセージはクライアントの非同期レスポンス・エンドポイントに送信されます。非同期レスポンス・エンドポイントのアドレスは、WS-Addressingヘッダーに保持されています。

  4. レスポンス・メッセージがクライアント・プロキシを介して適切なクライアントに転送されます。

  5. レスポンス・メッセージを処理するために、クライアントの非同期ハンドラが呼び出されます。

次の項では、非同期クライアント・トランスポートを使用してスケーラブルな非同期JAX-WSクライアントを開発する方法を説明します。

非同期クライアント・トランスポート機能の有効化と構成


注意:

接続作成と非同期クライアント・トランスポート機能を一緒に使用することはできません。同じWebサービス・クライアントで両方の機能を有効にしようとすると、エラーが返されます。接続作成の詳細は、「ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)」を参照してください。


クライアントで非同期クライアント・トランスポート機能を有効にするには、Webサービス・プロキシまたはディスパッチを作成するときにパラメータとしてweblogic.jws.jaxws.client.async.AsyncClientTransportFeatureのインスタンスを渡します。次の項では、クライアントで非同期クライアント・トランスポート機能を有効にして構成する方法を説明します。

AsyncClientTransportFeatureによって記述されている非同期レスポンス・エンドポイントは、同じクライアントIDを共有するすべてのクライアント・インスタンスによって使用され、そのクライアントIDを使用する最初のクライアント・インスタンスが公開された時点から有効になります。非同期レスポンス・エンドポイントは、クライアントIDが明示的に破棄されるか、または(たとえば、ホストWebアプリケーションまたはEJBがアンデプロイされて)クライアントのコンテナが非アクティブ化されるまで、発行されたままになります。クライアントIDの管理の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のクライアントIDの管理に関する項を参照してください。

非同期レスポンス・エンドポイント・アドレスは、次の形式を使用して自動的に生成されます。

http://contextAddress:port/context/targetPort-AsyncResponse

各値の説明は次のとおりです。

  • contextAddress:port: 次のいずれかを指定します。

    • クラスタ・アプリケーションの場合は、クラスタ・アドレスとポート。

    • クラスタ・アプリケーションでない場合は、選択されているプロトコルのデフォルトのWebLogic Serverアドレスとポート。

    • デフォルトのアドレスが定義されていない場合は、指定されているプロトコルの最初のネットワーク・チャネル・アドレス。ネットワーク・チャネルの詳細は、『Oracle WebLogic Serverサーバー環境の構成』のネットワーク・リソースの構成に関する項を参照してください。

  • context: 既存のコンテキスト内で実行している場合は、現在のサーブレット・コンテキスト。それ以外の場合は、UUIDによって名前を指定され、スコープがアプリケーションに設定された、新しいコンテキスト。

  • targetPort-AsyncResponse: クライアントによってアクセスされるサービスのポート名の後に-AsyncResponseを付加したもの。

非同期クライアント・トランスポート機能は、次の項で説明するように構成できます。

AsyncClientTransportFeature()コンストラクタの形式の詳細は、WebLogic Server Javadocを参照してください。

非同期レスポンス・エンドポイントのアドレスの構成

次に示すように、非同期レスポンス・エンドポイントのアドレスは、AsyncClientTransportFeatureに引数として渡すことで構成できます。

String responseAddress = "http://myserver.com:7001/myReliableService/myClientCallback";
AsyncClientTransportFeature asyncFeature = new AsyncClientTransportFeature(responseAddress);
BackendService port = _service.getBackendServicePort(asyncFeature);

指定アドレスは、サーバーまたはクラスタの合法的なアドレスにする必要があります(ネットワーク・チャネルまたはプロキシ・アドレスを含む)。エフェメラル・ポートはサポートされません。指定するコンテキストは、スコープを現在のアプリケーション内に指定されているか、または未使用コンテキストを参照している必要があります。別のデプロイ済アプリケーションにスコープが設定されているコンテキストは参照できません。参照しようとするとエラーがスローされます。

次の表では、非同期レスポンス・エンドポイントのアドレスの構成に使用できるコンストラクタを示します。

表4-5 非同期レスポンス・エンドポイントのアドレスを構成するためのコンストラクタ

コンストラクタ説明

AsyncClientTransportFeature(java.lang.String address)

非同期レスポンス・エンドポイントのアドレスを構成します。

AsyncClientTransportFeature(java.lang.String address, boolean doPublish)

次のものを構成します。

AsyncClientTransportFeature(java.lang.String address, boolean doPublish, boolean useAsyncWithSyncInvoke)

次のものを構成します。


非同期レスポンス・エンドポイントのReplyToヘッダーとFaultToヘッダーの構成

非同期レスポンス・エンドポイントのjavax.xml.ws.wsaddressing.W3CEndpointReference型のすべての発信ReplyToおよびFaultToヘッダーに対して使用するアドレスは、AsyncClientTransportFeatureに引数として渡すことで構成できます。

たとえば、ReplyToヘッダー・アドレスのみを構成するには次のようにします。

W3CEndpointReference replyToAddress = "http://myserver.com:7001/myReliableService/myClientCallback";
AsyncClientTransportFeature asyncFeature = new AsyncClientTransportFeature(replyToAddress);
BackendService port = _service.getBackendServicePort(asyncFeature);

ReplyToとFaultToの両方のヘッダー・アドレスを構成するには次のようにします。

W3CEndpointReference replyToAddress = "http://myserver.com:7001/myReliableService/myClientCallback";
W3CEndpointReference faultToAddress = "http://myserver.com:7001/myReliableService/FaultTo";
AsyncClientTransportFeature asyncFeature = new AsyncClientTransportFeature(replyToAddress, faultToAddress);
BackendService port = _service.getBackendServicePort(asyncFeature);

次の表では、発信ReplyToおよびFaultToヘッダーのエンドポイント参照アドレスの構成に使用できるコンストラクタを示します。

表4-6 ReplyToおよびFaultToヘッダーを構成するためのコンストラクタ

コンストラクタ説明

AsyncClientTransportFeature(javax.xml.ws.wsaddressing.W3CEndpointReference replyTo)

発信ReplyToヘッダーのエンドポイント参照アドレスを構成します。

AsyncClientTransportFeature(javax.xml.ws.wsaddressing.W3CEndpointReference replyTo, boolean doPublish)

次のものを構成します。

AsyncClientTransportFeature(javax.xml.ws.wsaddressing.W3CEndpointReference replyTo, boolean doPublish, boolean useAsyncWithSyncInvoke)

次のものを構成します。

AsyncClientTransportFeature(javax.xml.ws.wsaddressing.W3CEndpointReference replyTo, javax.xml.ws.wsaddressing.W3CEndpointReference faultTo)

発信ReplyToおよびFaultToヘッダーのエンドポイント参照アドレスを構成します。

AsyncClientTransportFeature(javax.xml.ws.wsaddressing.W3CEndpointReference replyTo, javax.xml.ws.wsaddressing.W3CEndpointReference faultTo, boolean doPublish)

次のものを構成します。

AsyncClientTransportFeature(javax.xml.ws.wsaddressing.W3CEndpointReference replyTo, javax.xml.ws.wsaddressing.W3CEndpointReference faultTo, boolean doPublish, boolean useAsyncWithSyncInvoke)

次のものを構成します。


非同期レスポンス・エンドポイントのコンテキスト・パスの構成

クライアントがサーブレットまたはWebアプリケーション・ベースのWebサービス内で実行している場合、ServletContextとコンテキスト・パスを使用して非同期レスポンス・エンドポイントを構成できます。次のように、AsyncClientTransportFeatureに引数として情報を渡します。

  • サーブレット内で実行している場合:

    AsyncClientTransportFeature asyncFeature =
          new AsyncClientTransportFeature(getServletContext());
    
  • WebサービスまたはEJBベースのWebサービス内で実行している場合:

    import com.sun.xml.ws.api.server.Container;
    ...
    Container c = ContainerResolver.getInstance().getContainer();
    ServletContext servletContext = c.getSPI(ServletContext.class);
    AsyncClientTransportFeature asyncFeature =
        new AsyncClientTransportFeature(servletContext);
    

指定するコンテキストは、スコープを現在のアプリケーション内に指定されているか、または未使用コンテキストを参照している必要があります。別のデプロイ済みアプリケーションにスコープが設定されているコンテキストは参照できません。


注意:

AsyncClientTransportFeatureに対して空のコンストラクタを使用すると、Webサービスのランタイムは現在の機能がインスタンス化されたコンテナの検出を試み、使用可能なコンテナ・コンテキストを使用してエンドポイントを公開します。


次の表では、非同期レスポンス・エンドポイントのコンテキスト・パスの構成に使用できるコンストラクタを示します。

表4-7 非同期レスポンス・エンドポイントのコンテキスト・パスを構成するためのコンストラクタ

コンストラクタ説明

AsyncClientTransportFeature(java.lang.Object context)

非同期レスポンス・エンドポイントのコンテキスト・パスを構成します。

AsyncClientTransportFeature(java.lang.Object context, boolean useAsyncWithSyncInvoke)

次のものを構成します。


非同期レスポンス・エンドポイントの公開

次のプロパティを構成するときにdoPublishブール値をAsycnClientTransportFeature()に引数として渡すことで、非同期レスポンス・エンドポイントを公開するかどうかを構成できます。

  • 非同期レスポンス・エンドポイントのアドレス。表4-5を参照してください。

  • ReplyToおよびFaultToヘッダー。表4-6を参照してください。

  • 非同期レスポンス・エンドポイントのコンテキスト・パス。表4-7を参照してください。

doPublishをfalseに設定した場合は、非同期レスポンス・エンドポイントは自動的に発行されま€ÿせんが、WS-Addressingヘッダーがアウトバウンドの非一方向メッセージに追加されます。このシナリオは次のプログラミング・モデルをサポートします。

  • 非同期ポーリング(Responseオブジェクトへのアクセスは試みられません)

  • ディスパッチ非同期ポーリング(Responseオブジェクトへのアクセスは試みられません)

  • ディスパッチ一方向呼出し

  • 同期トランスポート・オプションを使用する同期呼出し(デフォルト)

他のすべての非同期プログラミング・モデルについては、非同期レスポンス・エンドポイントが使用できる必要があり、doPublishがfalseに設定されている場合は、Webサービス・クライアントはアウトバウンド・リクエストを行う前にエンドポイントを公開する必要があります。

次の例では、非同期レスポンス・エンドポイント・アドレスを構成し、非同期レスポンス・エンドポイントを公開します。

String responseAddress = "http://localhost:7001/myReliableService/myReliableResponseEndpoint";
boolean doPublish = true;
AsyncClientTransportFeature asyncFeature = 
      new AsyncClientTransportFeature(responseAddress, doPublish);
BackendService port = _service.getBackendServicePort(asyncFeature);

同期操作用の非同期クライアント・トランスポートの構成

次のプロパティを構成するときに、useAsyncWithSyncInvokeブール・フラグを使用して、同期操作用の非同期クライアント・トランスポートを有効または無効にできます。

  • 非同期レスポンス・エンドポイントのアドレス。表4-5を参照してください。

  • ReplyToおよびFaultToヘッダー。表4-6を参照してください。

  • 非同期レスポンス・エンドポイントのコンテキスト・パス。表4-7を参照してください。

次の例では、非同期レスポンス・エンドポイント・アドレスを構成し、同期操作に対して非同期クライアント・トランスポートを使用できるようにします。

String responseAddress = "http://localhost:7001/myReliableService/myReliableResponseEndpoint";
boolean useAsyncWithSyncInvoke = true;
AsyncClientTransportFeature asyncFeature = 
      new AsyncClientTransportFeature(responseAddress, useAsyncWithSyncInvoke);
BackendService port = _service.getBackendServicePort(asyncFeature);

非同期ハンドラ・インタフェースの開発


注意:

この項で説明するように単一の非同期ハンドラ・インスタンスをポートに設定した後、「JAX-WS参照実装の使用」で説明されているようにリクエスト単位の非同期ハンドラの構成を試みると、実行時例外が返されます。


「Webサービスを非同期に呼び出すためのクライアント・アーティファクトの構築」で説明されているように、非同期ハンドラ・インタフェースweblogic.jws.jaxws.client.async.AsyncClientHandlerFeatureは、リクエスト単位ベースではなく、ポートに単一の非同期ハンドラ・インスタンスを設定します。

たとえば、「Webサービスを非同期に呼び出すためのクライアント・アーティファクトの構築」で説明されているようにclientgenを使用してクライアント・クラスを構築するときは、次に示すように、非同期ハンドラ・インタフェースが生成されます。

例4-1 非同期ハンドラ・インタフェースの例

import javax.xml.ws.Response;
 
 
/**
 * This class was generated by the JAX-WS RI.
 * Oracle JAX-WS 2.1.5
 * Generated source version: 2.1
 *
 */
public interface BackendServiceAsyncHandler {
 
 
    /**
     *
     * @param response
     */
    public void onDoSomethingResponse(Response<DoSomethingResponse> response);
 
}

非同期ハンドラ・インタフェースは、ポート・インタフェースと同じパッケージの一部として生成され、サービスで定義されている操作に対するレスポンスを受け取るために必要なメソッドを表します。クライアントのコードでこのインタフェースをインポートして実装し、厳格に型指定された方法で非同期レスポンスを受信して処理する手段を提供できます。

ポートに単一の非同期ハンドラ・インスタンスを設定するには、Webサービス・プロキシまたはディスパッチを作成するときに、パラメータとしてweblogic.jws.jaxws.client.async.AsyncClientHandlerFeatureのインスタンスを渡します。レスポンス・メッセージを受信したときに呼び出される非同期ハンドラの名前を指定します。

次の例では、非同期ハンドラ・インタフェースの開発方法を示します。この例を見ると、AsyncClientHandlerFeatureを初期化し、バックエンド・サービスで呼出しを行うために使用されるポートに非同期ハンドラの実装を接続する方法がわかります。この例は、例3-2「非同期Webサービス・クライアントのベスト・プラクティスの例」からの抜粋です。

例4-2 非同期ハンドラ・インタフェースの開発の例

import weblogic.jws.jaxws.client.async.AsyncClientHandlerFeature;
...
    BackendServiceAsyncHandler handler = new BackendServiceAsyncHandler() {
        public void onDoSomethingResponse(Response<DoSomethingResponse> res) {
            // ... Handle Response ...
            try {
                DoSomethingResponse response = res.get();
                _lastResponse = response.getReturn();
                System.out.println("Got async response: " + _lastResponse);
            } catch (Exception e) {
                _lastResponse = e.toString();
                e.printStackTrace();
              }
        }
      };
    AsyncClientHandlerFeature handlerFeature = new AsyncClientHandlerFeature(handler);
    features.add(handlerFeature);
    _features = features.toArray(new WebServiceFeature[features.size()]);
    BackendService anotherPort = _service.getBackendServicePort(_features);
...
    // Make the invocation. Our asynchronous handler implementation (set 
    // into the AsyncClientHandlerFeature above) receives the response.
    String request = "Dance and sing";
    System.out.println("Invoking DoSomething asynchronously with request: " + request);
    anotherPort.doSomethingAsync(request);
 

レスポンスへのユーザー定義リクエスト・コンテキストの伝播

weblogic.wsee.jaxws.JAXWSProperties APIで定義されている次のプロパティを使用すると、非同期ハンドラ・インスタンスの状態に依存することなく、ユーザー定義のリクエスト・コンテキスト情報をレスポンス・メッセージに伝播できます。

非同期ハンドラ・インスタンスはいつでも作成される可能性があります(たとえば、クライアントのサーバーがダウンして再起動されるとき)。したがって、非同期ハンドラ・インタフェースにリクエスト・コンテキストを格納しても役に立ちません。

次の表では、JAXWSPropertiesのプロパティを定義します。

表4-8 JAXWSProperties APIによってサポートされるプロパティ

プロパティ説明

MESSAGE_ID

リクエストのメッセージID。クライアントでは、リクエスト・コンテキストにこのプロパティを設定し、リクエストごとのメッセージIDヘッダーの自動生成をオーバーライドできます。

PERSISTENT_CONTEXT

クライアントまたは通信チャネルで必要なコンテキスト・プロパティ。Webサービス・クライアントでは、コンテキスト・プロパティがシリアライズ可能である場合、リクエスト・メッセージに対してコンテキスト・プロパティを保持できます。これらのプロパティは、非同期ハンドラが呼び出されるときに、Responseオブジェクトから使用可能なレスポンス・コンテキスト・マップで使用できます。詳細は、「レスポンスへのリクエスト・コンテキストの伝播」を参照してください。

RELATES_TO

レスポンスが関連付けられているメッセージID。

REQUEST_TIMEOUT

非同期クライアント・トランスポートを使用する同期操作の場合、ブロックしてレスポンスを待機する最大時間。このプロパティのデフォルトは0で、タイムアウトしないことを示します。


さらに、Webサービス・クライアントでは、コンテキスト・プロパティがシリアライズ可能である場合、リクエスト・メッセージに対してコンテキスト・プロパティを保持できます。コンテキスト・プロパティは、クライアントまたは通信チャネルで必要な情報を格納できます。メッセージのプロパティは、weblogic.wsee.jaxws.JAXWSProperties.PERSISTENT_CONTEXTマップ・プロパティの一部として格納し、レスポンス・メッセージが返された後で取得できます。詳細は、「レスポンスへのリクエスト・コンテキストの伝播」を参照してください。

ファイアウォールの内側からの非同期Webサービス・クライアントの使用(接続作成)

Webサービスの接続作成は、非同期クライアント・トランスポートの代わりとなるクライアント・ポーリング・メカニズムであり、通常はファイアウォールの内側にあるクライアントのサポートを提供します。http://docs.oasis-open.org/ws-rx/wsmc/200702の接続作成仕様で説明されているように、WebLogic ServerはWS-MakeConnectionバージョン1.1をサポートし、バージョン1.0と下位互換性があります。

接続作成の具体的な機能は次のとおりです。

  • リクエスト・メッセージの送信に使用された開始トランスポート・リクエストから、レスポンス・メッセージを切り離すことができるようにします(非同期クライアント・トランスポートと似ています)。

  • アドレス可能ではなく着信接続を受け付けることができないWebサービス・クライアントをサポートします(たとえば、ファイアウォールの内側のクライアント)。

  • WS-MakeConnectionの仕様で定義されているように、Webサービス・クライアントがMC-Initiatorとして機能し、WebサービスがMC-Receiverとして機能できるようにします。

Webサービスの接続作成の仕様から抜粋した次の図では、標準的な接続作成のメッセージ・フローが示されています。

図4-2 接続作成のメッセージ・フロー

図4-2の説明が続きます
「図4-2 接続作成のメッセージ・フロー」の説明

前の図で示されているように、接続作成のメッセージ・フローは次のようになります。

  1. getQuote()リクエスト・メッセージが、Webサービス・クライアント(MCイニシエータ)からWebサービス(MCレシーバ)に送信されます。ReplyToヘッダーには、MCイニシエータのUUIDを指定する接続作成の匿名URIが含まれます。

    MCレシーバがgetQuote()メッセージを受信します。ReplyToヘッダーに接続作成匿名URIが含まれる場合はレスポンス・メッセージを接続の戻りチャネルで返送できることを示し、ない場合はクライアントが接続作成ポーリングを使用してレスポンス・メッセージを取得します。

  2. MCレシーバは、空のレスポンス(HTTP 202)をMCイニシエータに返送することで接続を閉じます。

    空のレスポンスを受信すると、MCイニシエータはポーリング・メカニズムを初期化して開始し、以降のポーリングをMCレシーバに送信できるようにします。具体的には、MCイニシエータのポーリング・メカニズムは、連続するポーリング間の時間に対して構成されている間隔に有効期限が設定されたタイマーを開始します。

  3. タイマーが切れると、MCイニシエータは、同じ接続作成匿名URI情報を格納した接続作成メッセージをMCレシーバに送信します。

  4. MCレシーバはgetQuote()操作の処理を完了していないので、MCイニシエータに返送できるレスポンスはありません。その結果、MCレシーバは、再び空のレスポンス(HTTP 202)を返送することで現時点では送信できるレスポンスがないことを示し、接続を閉じます。

    空のメッセージを受信すると、MCイニシエータは接続作成ポーリング・メカニズムのタイマーを再起動します。

    タイマーが切れる前に、getQuote()操作が完了します。元のリクエストのReplyToヘッダーには接続作成匿名URIが含まれていたので、MCレシーバはレスポンスを格納し、アドレスが一致する次の接続作成メッセージの受信を待ちます。

  5. タイマーが切れると、MCイニシエータは、同じ接続作成匿名URI情報を格納した接続作成メッセージをMCレシーバに送信します。

  6. 接続作成メッセージを受信すると、MCレシーバは格納されているレスポンス・メッセージを取得し、受信した接続作成メッセージに対するレスポンスとして送信します。

    MCイニシエータはレスポンス・メッセージを受信し、接続作成ポーリング・メカニズムを終了します。

ファイアウォールの内側から非同期呼出しを使用するときは、接続作成トランスポートを使用することをお薦めします。サポートされるプログラミング・モデルの一覧については、表4-2「Webサービスの非同期呼出しのトランスポート・タイプ」を参照してください。

次の項では、Webサービスとクライアントで接続作成を有効にして構成する方法を説明します。

Webサービスでの接続作成の有効化と構成

接続作成を有効にするには、接続作成ポリシー・アサーションをWebサービスにアタッチした後、標準のJAX-WSクライアントAPIを使用してクライアントからそのメソッドを呼び出します。ポリシーをWebサービスにアタッチするには、次のいずれかの方法を使用します。

  • @PolicyアノテーションをJWSファイルに追加します。接続作成ポリシーをアタッチできるのはクラス・レベルだけです。

  • ポリシーに対する参照をWebサービスのWSDLに追加します。

次の項では、Webサービスで接続作成を有効にするために必要な手順を説明します。

Webサービスの接続作成WS-Policyファイルの作成(オプション)

WS-Policyファイルは、WS-Policy仕様に準拠するポリシー・アサーションを含むXMLファイルです。この場合、WS-PolicyファイルにはWebサービスの接続作成のポリシー・アサーションが含まれています。

WebLogic Serverには、標準的な接続作成アサーションを含むWS-Policyファイルがあらかじめパッケージ化されているので、独自のWS-Policyファイルを作成しない場合は、このファイルを使用できます。次の表に、接続作成をサポートするあらかじめパッケージ化されているWS-Policyファイルを示します。場合によっては、ポリシーによって信頼性のあるメッセージングと接続作成の両方が有効化されます。詳細は、付録A「Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」を参照してください。


注意:

接続作成ポリシーをアタッチできるのはクラス・レベルのみです。メソッド・レベルで接続作成ポリシーをアタッチすることはできません。


表4-9 あらかじめパッケージ化されていて接続作成をサポートするWS-Policyファイル

あらかじめパッケージ化されているWS-Policyファイル説明

Mc1.1.xml

Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。WS-Policy 1.5プロトコルが使用されます。「Mc1.1.xml(WS-Policyファイル)」を参照してください。

Mc.xml

Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。WS-Policy 1.2プロトコルが使用されます。「Mc.xml(WS-Policyファイル)」を参照してください。

Reliability1.2_ExactlyOnce_WithMC1.1.xml

サービス品質に関するポリシー・アサーションを指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。「Reliability1.2_ExactlyOnce_WithMC1.1.xml(WS-Policyファイル)」を参照してください。

Reliability1.2_SequenceSTR.xml

信頼性のあるシーケンスでメッセージを保護するために、CreateSequenceメッセージで参照されるwsse:SecurityTokenReferenceをランタイムが使用するように指定します。Webサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。「Reliability1.2_SequenceSTR.xml(WS-Policyファイル)」を参照してください。

Reliability1.0_1.2.xml

1.2と1.0のWS-Reliableメッセージング・ポリシー・アサーションを結合します。1.2バージョンのポリシー・アサーションはWebサービスでの接続作成のサポートを有効にし、オプションとしてWebサービス・クライアントでの使用方法を指定します。このサンプルは、適切なポリシーの選択に基づいて実行時に適用されるポリシー・アサーションを決定します。「Reliability1.0_1.2.xml(WS-Policyファイル)」を参照してください。


WebLogic Serverに含まれる、あらかじめパッケージ化されている接続作成WS-Policyファイルの1つを使用できます。これらのファイルは、ほとんどのユースケースに適合しています。あらかじめパッケージ化されているファイルは変更できません。値がニーズを満たさない場合は、カスタムのWS-Policyファイルを作成する必要があります。たとえば、Webサービスのクライアント側でリクエストされるように接続作成のサポートを構成する場合があります。接続作成ポリシー・アサーションは、WS-PolicyAssertions仕様(https://www.ibm.com/developerworks/library/specification/ws-polas)に準拠します。

接続作成アサーションを含むカスタムWS-Policyファイルを作成するには、次のガイドラインを使用してください。

  • WS-Policyファイルのルート要素は常に<wsp:Policy>です。

  • Webサービスの接続作成を構成するには、<wsmc:MCSupported>子要素を追加して、Webサービスの接続作成のサポートを定義します。

  • <wsmc:MCSupported>子要素は、1つのポリシー属性Optionalを含み、接続作成をWebサービス・クライアントで構成する必要があるかどうかを指定します。この属性はtrueまたはfalseに設定でき、デフォルトではtrueに設定されます。falseに設定した場合は、接続作成の使用は必須であり、ReplyToヘッダーとFaultToヘッダー(指定する場合)の両方に接続作成匿名URIが含まれる必要があります。

次の例では、Webサービスで接続作成を有効にし、Webサービス・クライアントで接続作成を有効にする必要があることを指定しています。この例では、WS-Policy 1.5プロトコルを使用しています。

<?xml version="1.0"?>
<wsp15:Policy  xmlns:wsp15="http://www.w3.org/ns/ws-policy" 
  xmlns:wsmc="http://docs.oasis-open.org/ws-rx/wsmc/200702">
  <wsmc:MCSupported wsp15:Optional="false" />
</wsp15:Policy>

接続作成を有効にするためのJWSファイルのプログラミング

この項では、あらかじめパッケージ化されている接続作成WS-Policyファイルまたはカスタム接続作成WS-Policyファイルを使用して、Webサービスで接続作成を有効にする方法を説明します。カスタム・ポリシー・ファイルの作成の詳細は、「Webサービスの接続作成WS-Policyファイルの作成(オプション)」を参照してください。

接続作成アサーションが含まれるWS-PolicyファイルをWebサービスに追加するよう指定するには、JWSファイルで@Policyアノテーションを使用します。WebLogic Serverでは、あらかじめパッケージ化されているWS-Policyファイルのセットが提供されます。付録A「Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル」を参照してください。

Webサービスの信頼性のあるメッセージングで@Policyアノテーションを使用する場合は、次のガイドラインを参照してください。

  • 接続作成ポリシーをアタッチできるのはクラス・レベルのみです。メソッド・レベルで接続作成ポリシーをアタッチすることはできません。

  • uri属性を使用して、ポリシー・ファイルのビルド時の場所を以下のように指定します。

    • 独自のWS-Policyファイルを作成した場合は、JWSファイルを基準として相対的に場所を指定します。例:

      @Policy(uri="McPolicy.xml", attachToWsdl=true)
      

      この例では、McPolicy.xmlファイルはJWSファイルと同じディレクトリに置かれています。

    • あらかじめパッケージ化されているWS-Policyファイルの1つか、共有Java EEライブラリにパッケージ化されているWS-Policyファイルを指定するには、そのポリシー・ファイルの名前とパスとともにpolicy:接頭辞を使用します。この構文ではビルド時のjwsc Antタスクに、ファイル・システムの実際のファイルを探させず、Webサービスが、サービスのデプロイ時にWebLogic ServerからWS-Policyファイルを取得することを通知しています。


      注意:

      共有Java EEライブラリは、様々なエンタープライズ・アプリケーション内にパッケージ化されている複数のWebサービスとWS-Policyファイルを共有する場合に有用です。WS-Policyファイルが共有Java EEライブラリのMETA-INF/policiesまたはWEB-INF/policiesディレクトリに置かれているかぎり、ポリシー・ファイルはWebサービスの同じアーカイブにパッケージ化されている場合と同様に指定できます。ライブラリの作成、およびWebサービスがポリシー・ファイルを見つけることができるようにするための環境設定については、『Oracle WebLogic Serverアプリケーションの開発』の共有Java EEライブラリおよびオプション・パッケージの作成に関する項を参照してください。


    • ポリシー・ファむÿ¤ãƒ«ã‚’Web上で公開するよう指定するには、次の例に示すとおり、URLと共にhttp:接頭辞を使用します。

      @Policy(uri="http://someSite.com/policies/mypolicy.xml"
              attachToWsdl=true)
      
  • @PolicyアノテーションのattachToWsdl属性を設定して、ポリシー・ファイルをWebサービスのパブリック規約が記述されたWSDLファイルに付加するかどうかを指定できます。通常は、クライアント・アプリケーションでWebサービスの信頼性のあるメッセージング機能が認識されるよう、パブリックなものとしてポリシーを公開します。そのため、この属性のデフォルト値はtrueです。

@Policyアノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のweblogic.jws.Policyに関する項を参照してください。

次の例では、接続作成を有効にする簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、例の後の説明を参照してください。

package examples.webservices.async

import javax.jws.WebMethod;
import javax.jws.WebService;
import weblogic.jws.Policy; 

/**
 * Simple reliable Web Service.
 */

@WebService(name="HelloWorldPortType",
              serviceName="HelloWorldService")

@Policy(uri="McPolicy.xml", attachToWsdl=true) 
public class HelloWorldImpl {
  private static String onewaySavedInput = null;

/**
 * A one-way helloWorld method that saves the given string for later 
 * concatenation to the end of the message passed into helloWorldReturn.
 */
  @WebMethod()
  public void helloWorld(String input) {
    System.out.println(" Hello World " + input);
    onewaySavedInput = input;
   }

/**
 * This echo method concatenates the saved message from helloWorld 
 * onto the end of the provided message, and returns it.
 */
  @WebMethod()
  public String echo(String input2) {
    System.out.println(" Hello World " + input2 + onewaySavedInput);
    return input + onewaySavedInput;
  }
}

前のサンプルでは、カスタムMcPolicy.xmlポリシー・ファイルがクラス・レベルでWebサービスにアタッチされています。つまり、ポリシー・ファイルはWebサービスのすべてのパブリック操作に適用されます。接続作成ポリシーをアタッチできるのはクラス・レベルのみです。メソッド・レベルで接続作成ポリシーをアタッチすることはできません。

ポリシー・ファイルはWSDLファイルにアタッチされます。使用可能なあらかじめパッケージ化されているポリシーと、カスタム・ポリシーの作成の詳細は、「Webサービスの接続作成WS-Policyファイルの作成(オプション)」を参照してください。

echo()メソッドは、@WebMethodJWSアノテーションでマークされています。これは、このメソッドがechoというパブリック操作であるということです。@Policyアノテーションがあるために、この操作では接続作成トランスポート・プロトコルが使用されます。

Webサービス・クライアントでの接続作成の有効化と構成


注意:

接続作成と非同期クライアント・トランスポート機能を一緒に使用することはできません。同じWebサービス・クライアントで両方の機能を有効にしようとすると、エラーが返されます。非同期クライアント・トランスポートの詳細は、「スケーラブルな非同期JAX-WSクライアントの開発(非同期クライアント・トランスポート)」を参照してください。

非同期コールバック・ハンドラ・プログラミング・モデルを使用するときは、非同期ハンドラ機能AsyncClientHandlerFeatureを使用することをお薦めします。詳細は、「非同期ハンドラ・インタフェースの開発」を参照してください。


Webサービス・クライアントで接続作成を有効にするには、Webサービス・プロキシまたはディスパッチを作成するときにパラメータとしてweblogic.wsee.mc.api.McFeatureのインスタンスを渡します。接続作成を有効にする方法の簡単な例を次に示します。


注意:

この例では、同期メソッドに同期トランスポートを使用します。同期メソッドのトランスポートとして接続作成を構成する方法は、「同期メソッドのトランスポートとしての接続作成の構成」を参照してください。


package examples.webservices.myservice.client;

import weblogic.wsee.mc.api.McFeature;
...
    List<WebServiceFeature> features = new ArrayList<WebServiceFeature>();
...
    McFeature mcFeature = new McFeature();
    features.add(mcFeature);
...
    // ... Implement asynchronous handler interface as described in 
    //  Developing the Asynchronous Handler Interface. 
    // ....
    AsyncClientHandlerFeature handlerFeature = new AsyncClientHandlerFeature(handler);
    features.add(handlerFeature);
    _features = features.toArray(new WebServiceFeature[features.size()]);
    BackendService port = _service.getBackendServicePort(_features);
...
    // Make the invocation. Our asynchronous handler implementation (set 
    // into the AsyncClientHandlerFeature above) receives the response.
    String request = "Dance and sing";
    System.out.println("Invoking DoSomething asynchronously with request: " + request);
    anotherPort.doSomethingAsync(request);
..
  }
}

次の項では、Webサービス・クライアントで接続作成の特定の機能を構成する方法を説明します。

接続作成メッセージ送信の有効時間の構成

表4-10では、MCイニシエータがMCレシーバへの接続作成メッセージの送信を停止するまでの最大時間を構成するためのMcFeatureメソッドについて説明します。

表 4-10 接続作成メッセージ送信の有効時間を構成するためのメソッド

メソッド説明

String getsExpires()

現在構成されている有効期限の値を返します。

void setExpires(String expires)

有効期限を設定します。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP1D (1日)。


ポーリング間隔の構成

表4-11では、空のレスポンス・メッセージを受信した後でMCイニシエータがMCレシーバに接続作成メッセージを送信するまでに経過する必要のある時間を構成するためのMcFeatureメソッドについて説明します。指定されている時間内にMCイニシエータが特定のメッセージに対する空ではないレスポンスを受信しない場合、MCイニシエータは別の接続作成メッセージを送信します。

表4-11 ポーリング間隔を構成するためのメソッド

メソッド説明

String getInterval()

ポーリング間隔を取得します。

void setInterval(String pollingInterval)

ポーリング間隔を設定します。

指定する値はXMLスキーマの期間を表す字句形式(PnYnMnDTnHnMnS)に従った正の値でなければなりません。ここで、nYは年数、nMは月数、nDは日数を表し、Tは日付/時刻のセパレータ、nHは時間数、nMは分数、nSは秒数を表します。この値のデフォルトはP0DT5S (5秒)。


次の例では、ポーリング間隔を36時間に設定しています。

...
    McFeature mcFeature = new McFeature();
    mcFeature.setInterval("P0DT36H")
    MyService port = service.getMyServicePort(mcFeature);
...

指数関数的バックオフの構成

表4-12では、指数関数的バックオフ・フラグを構成するためのMcFeatureメソッドについて説明します。このフラグは、「ポーリング間隔の構成」で説明されているポーリング間隔を、指数関数的バックオフ・アルゴリズムを使用して調整するかどうかを指定します。ポーリング間隔で指定されている時間が経過してもMCイニシエータが空ではないレスポンスを受信しない場合、指数関数的バックオフ・アルゴリズムを使用して、MCイニシエータがレスポンスを受信しないときの連続する再送信のタイミングが設定されます。

指数関数的バックオフ・アルゴリズムは、ポーリングの間隔が、ポーリング間隔を基に指数的に増えるように指定します。たとえば、ポーリング間隔が2秒で、指数関数的バックオフ要素が設定されている場合、レスポンスを受信しない場合の連続ポーリングの間隔は、2、4、8、16、32というように増えていきます。

デフォルト値はfalseであり、連続するポーリングの間隔は指数的に増えず、同じ値が維持されます。

表4-12 指数関数的バックオフを構成するためのメソッド

メソッド説明

boolean isExponentialBackoff()

指数関数的バックオフが有効かどうかを示すブール値を返します。

void setExponentialBackoff(boolean backoff)

指数関数的バックオフ・フラグを設定します。有効な値はtrueとfalseです。デフォルトはfalseです。


次の例では、指数関数的バックオフ・フラグを有効にしています。

...
    McFeature mcFeature = new McFeature();
    mcFeature.setMessageInterval(P0DT36H)
    mcFeature.setExponentialBackoff(true);
    MyService port = service.getMyServicePort(mcFeature);
...

同期メソッドのトランスポートとしての接続作成の構成

デフォルトでは、クライアントで接続作成が有効であっても、同期メソッドは同期トランスポートを使用します。同期メソッドのトランスポートとして接続作成を使用するように、クライアントを構成できます。この場合、空ではないレスポンス・メッセージを受信するまで、構成されているポーリング間隔(「ポーリング間隔の構成」を参照)に基づいて、MCイニシエータは接続作成メッセージを送信します。

同期メソッドに使用するトランスポート・プロトコルとして接続作成を構成するには、次のいずれかのメソッドを使用します。

  • 新しいMcFeature()オブジェクトをインスタンス化するとき、同期メソッドのトランスポート・プロトコルとして接続作成を使用するかどうかを指定するブール値を、パラメータとして渡すことができます。例:

    ...
        McFeature mcFeature = new McFeature(true);
        MyService port = service.getMyServicePort(mcFeature);
    ...
    
  • 表4-13で示されているMcFeatureメソッドを使用します。例:

    ...
        McFeature mcFeature = new McFeature();
        mcFeature.setUseMCWithSyncInvoke(true);
        MyService port = service.getMyServicePort(mcFeature);
    ...
    

表4-13 同期メソッドのサポートを構成するためのメソッド

メソッド説明

boolean isUseMCWithSyncInvoke()

同期メソッドのサポートが有効かどうかを示すブール値を返します。

void setUseMCWithSyncInvoke(boolean useMCWithSyncInvoke)

同期メソッド・サポート・フラグを設定します。有効な値はtrueとfalseです。デフォルトはfalseです。


weblogic.wsee.jaxws.JAXWSProperties.REQUEST_TIMEOUTプロパティを使用すると、同期メソッドがブロックしてレスポンスを待機する最大時間を設定できます。このプロパティのデフォルトは0で、タイムアウトしないことを示します。メッセージ・プロパティの設定の詳細は、「レスポンスへのユーザー定義リクエスト・コンテキストの伝播」を参照してください。

JAX-WS参照実装の使用

JAX-WS参照実装(RI)は、次のプログラミング・モデルをサポートします。

  • java.util.concurrent.Futureインタフェースを使用する非同期クライアント・ポーリング。

  • リクエスト単位の非同期コールバック・ハンドラ。呼出し元のクライアントが、呼出し時にコールバック・ハンドラを指定します。レスポンスが使用できるときは、レスポンスを処理するためにコールバック・ハンドラが呼び出されます。

非同期クライアント・トランスポート機能とは異なり、JAX-WS RIはWS-Addressingに対する非常に制限されたサポートを提供します。次のものが含まれます。

  • クライアント側アウトバウンドWS-Addressingヘッダーの追加の手動サポート。

  • レスポンスを受信するためのクライアント側エンドポイントの公開の手動サポート。

  • 正しくないクライアント側プログラミング・モデルの検出はサポートしません(たとえば、同期呼出しはハングします)。

  • クライアント側またはサービス側の再起動時の情報の保持はサポートしません。

次に示すサンプル・クライアント・ファイルAsyncClientには、AddNumbersServiceサービスのAddNumbersAsyncメソッドを非同期的に呼び出すAddNumbersTestDriveというメソッドが定義されています。太字で示したJavaコードについては後ほど説明します。

package examples.webservices.async.client;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import javax.xml.ws.BindingProvider;

import java.util.concurrent.Future;
import javax.xml.ws.AsyncHandler; 
import javax.xml.ws.Response;

public class AsyncClient  {

   private AddNumbersPortType port = null;
   protected void setUp() throws Exception {
      AddNumbersService service = new AddNumbersService();
      port = service.getAddNumbersPort(); 
      String serverURI = System.getProperty("wls-server");
      ((BindingProvider) port).getRequestContext().put(
            BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
             "http://" + serverURI + "/JAXWS_ASYNC/AddNumbersService");
   }

/**
* 
* Asynchronous callback handler
*/
   class AddNumbersCallbackHandler implements AsyncHandler<AddNumbersResponse> {
      private AddNumbersResponse output;
      public void handleResponse(Response<AddNumbersResponse> response) {
         try {
            output = response.get();
         } catch (ExecutionException e) {
             e.printStackTrace();
         } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
      AddNumbersResponse getResponse() {
         return output;
      }
   }

   public void AddNumbersTestDrive() throws Exception {
      int number1 = 10;
      int number2 = 20;
      
      // Asynchronous Callback method
      AddNumbersCallbackHandler callbackHandler = 
         new AddNumbersCallbackHandler();
      Future<?> resp = port.addNumbersAsync(number1, number2,
         callbackHandler);
      // For the purposes of a test, block until the async call completes
      resp.get(5L, TimeUnit.MINUTES); 
      int result = callbackHandler.getResponse().getReturn(); 

      // Polling method
      Response<AddNumbersResponse> addNumbersResp = 
           port.AddNumbersAsync(number1, number2);
      while (!addNumbersResp.isDone()) {
            Thread.sleep(100);
      }
      AddNumbersResponse reply = addNumbersResp.get();
      System.out.println("Server responded through polling with: " + 
          reply.getResponseType());    
   }
}

次の例では、非同期ポーリングと非同期コールバック・ハンドラの両方のプログラミング・モデルを実装する手順を示します。

非同期コールバック・ハンドラを実装するには:

  1. javax.xml.ws.AsyncHandler<T>インタフェースを実装する非同期ハンドラを作成します。(http://download.oracle.com/javaee/5/api/javax/xml/ws/AsyncHandler.htmlを参照)。この非同期ハンドラには、handleResponseメソッドを定義します。このメソッドにより、非同期的に呼び出されるサービス・エンドポイント操作の完了時に、クライアントがコールバック通知を受信することが可能になります。タイプはAddNumberResponseに設定する必要があります。

    class AddNumbersCallbackHandler implements AsyncHandler<AddNumbersResponse> {
       private AddNumbersResponse output;
    
       public void handleResponse(Response<AddNumbersResponse> response) {
          try {
             output = response.get();
             } catch (ExecutionException e) {
               e.printStackTrace();
             } catch (InterruptedException e) {
               e.printStackTrace();
    
             }
          }
    
          AddNumbersResponse getResponse() {
             return output;
       }
    }
    
  2. 非同期コールバック・ハンドラをインスタンス化します。

    AddNumbersCallbackHandler callbackHandler = 
       new AddNumbersCallbackHandler();
    
  3. AddNumbersService Webサービスをインスタンス化し、非同期バージョンのWebサービス・メソッドaddNumbersAsyncを呼び出して非同期コールバック・ハンドラにハンドルを渡します。

    AddNumbersService service = new AddNumbersService();
    port = service.getAddNumbersPort();
    ...
    
    Future<?> resp = port.addNumbersAsync(number1, number2,
       callbackHandler);
    

    java.util.concurrent.Future(http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.htmlを参照)は、非同期計算の結果を表現し、非同期タスクのステータスの確認、結果の取得、タスクの実行の取消を可能にします。

  4. 非同期計算の結果を取得します。このサンプルでは、計算の完了を待機するためのタイムアウト値を指定しています。

    resp.get(5L, TimeUnit.MINUTES);
    
  5. コールバック・ハンドラを使用してレスポンス・メッセージにアクセスします。

    int result = callbackHandler.getResponse().getReturn();
    

非同期ポーリング・メカニズムを実装するには:

  1. AddNumbersService Webサービスをインスタンス化し、非同期バージョンのWebサービス・メソッドaddNumbersAsyncを呼び出します。

    Response<AddNumbersResponse> addNumbersResp = 
         port.AddNumbersAsync(number1, number2);
    
  2. メッセージを受信するまでスリープします。

    while (!addNumbersResp.isDone()) {
            Thread.sleep(100);
    
  3. レスポンスをポーリングします。

    AddNumbersResponse reply = addNumbersResp.get();
    

レスポンスへのリクエスト・コンテキストの伝播

WebLogic Serverには、リクエストおよびレスポンス・メッセージの内容に関係なく、ビジネス・コンテキスト(ビジネス・レベルのメッセージIDなど)をリクエスト・メッセージにアタッチして、レスポンスが返されたときにアクセスできるようにする強力な機能があります。たとえば、他の方法ではレスポンス・メッセージで利用できないビジネス・レベルのメッセージIDを使用できます。メッセージにこの情報を伝播することにより、レスポンス・メッセージが返されたときに情報にアクセスできます。

Webサービス・クライアントは、シリアライズ可能でさえあれば任意のリクエスト・メッセージ・コンテキスト・プロパティを格納できます。メッセージ・コンテキスト・プロパティは、weblogic.wsee.jaxws.JAXWSProperties.PERSISTENT_CONTEXTマップ・プロパティの一部として格納でき、レスポンス・メッセージが返された後で取得できます。

次の例では、PERSISTENT_CONTEXTマップ・プロパティを使用してメッセージ・コンテキスト・プロパティを定義および設定する方法を示します。

例4-3 メッセージ・コンテキスト・プロパティの設定

import weblogic.wsee.jaxws.JAXWSProperties;
. . .
MyClientPort port = myService.getPort();
Map<String, Serializable> clientPersistProps =
    port.getRequestContext().get(JAXWSProperties.PERSISTENT_CONTEXT);
Serializable obj = <my_property>;
clientPersistProps.put("MyProperty", obj);

port.myOperationAsync(<args>, new AsyncHandler<MyOperationResponse>() {
    public void handleResponse(Response<MyOperationResponse> res) {
        try {
            // Get the actual response
            MyOperationResponse response = res.get().getReturn();

            // Get the property stored when making request. Note, this property did not get
            // passed over the wire with the reuqest. The Web services runtime stores it.
            Map<String, Serializable> clientPersistProps =
                res.getContext().get(JAXWSProperties.PERSISTENT_CONTEâ&ÙXT);
            Serializable obj = clientPersistProps.get("MyProperty");
            // Do something with MyProperty 
        } catch (Exception e) {
           // Error handling
        }
    }
});
...

Webサービスの非同期呼出しのモニタリング

管理コンソールを使用すると、呼出し、エラー、フォルトの数など、Webサービスを非同期に呼び出すクライアントの実行時情報をモニターできます。Webサービス・クライアントをモニターするには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表で、Webサービス・クライアントがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開し、Webサービス・クライアントが存在するアプリケーション・モジュールをクリックします。「監視」タブをクリックし、「Webサービス・クライアント」タブをクリックします。

接続作成トランスポート・プロトコルを使用している場合、Webサービスまたはクライアントの接続作成匿名エンドポイントを監視できます。匿名エンドポイントごとに、受信メッセージ数、保留中メッセージ数などの実行時監視情報が表示されます。

「この表のカスタマイズ」をクリックすることで、表に表示される情報をカスタマイズできます。

Webサービスの接続作成匿名エンドポイントを監視するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービスがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開すると、「Webサービス」カテゴリにアプリケーション内のWebサービスのリストが表示されます。Webサービス名をクリックし、「監視」→「ポート」→「接続作成」を選択します。

Webサービス・クライアントの接続作成匿名エンドポイントを監視するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービス・クライアントがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開し、Webサービス・クライアントが存在するアプリケーション・モジュールをクリックします。「監視」タブをクリックし、「Webサービス・クライアント」タブをクリックします。次に、「監視」→「サーバー」→「接続作成」をクリックします。

非同期Webサービス・メッセージングのクラスタリングの考慮事項

Webサービス・クライアントがクラスタで実行するときは、非同期呼出しの非同期レスポンス・エンドポイントにレスポンス・メッセージを正しく配信できるように、特別に考慮する必要があります。「非同期クライアント・トランスポート機能の有効化と構成」で説明したように、非同期レスポンス・エンドポイントはAsyncClientTransportFeatureで定義します。

次の図で示すようなシナリオについて考えます。

図4-3 エラーになるクラスタリング・シナリオ

図4-3の説明が続きます
「図4-3 エラーになるクラスタリング・シナリオ」の説明

前の図で示されているシナリオ:

  • 2つのノードから成るクラスタがクライアント・アプリケーションをホストします。ノード名はServer1とServer2です。クラスタには簡単なロード・バランシング・フロントエンド・プロキシが含まれます。

  • クライアント・アプリケーションはClientWebAppという名前のWebアプリケーションで、クラスタに同じようにデプロイされています。つまり、Webアプリケーションはクラスタ内の両方のメンバー・サーバーで実行します。

  • ClientWebAppアプリケーションの外部クライアントが、クラスタのフロントエンド・アドレスを通してリクエストを行います。

次のようなシーケンスについて考えます。

  1. 外部クライアントは、クラスタのフロントエンドを介してClientWebAppにページを要求します。

  2. クラスタのフロントエンドはページ・リクエストのロード・バランシングを行い、Server1のClientWebAppにページ・リクエストを送ります。

  3. Server1のClientWebAppはWebサービス・クライアントBackendServiceClientのインスタンスを作成し、バックエンド・サービスBackendServiceと通信します。BackendServiceClientを作成すると、BackendServiceClientを使用して非同期リクエストを行うときに常に非同期レスポンスを受信するための非同期レスポンス・エンドポイントが公開されます。

  4. Server1のClientWebAppはBackendServiceClient.doSomethingAsync()を呼び出して、バックエンド・サービスで操作を実行します。非同期レスポンス・エンドポイントのアドレスはReplyToアドレスに含まれます。このアドレスはクラスタのフロントエンドのアドレスで開始しており、Server1のアドレスではありません。

  5. クラスタがdoSomething操作に対するレスポンスを受信します。

  6. クラスタはメッセージをロード・バランシングし、今度はServer2にメッセージを送ります。

  7. Server2にはレスポンスを受信するための非同期レスポンス・エンドポイントがないので、メッセージの配信は失敗します。

この問題を解決するには、次のどちらかを使用できます。

  • SOAP対応のクラスタ・フロントエンド・プロキシ・プラグイン(WebLogic Server HttpClusterServletなど)を使用します。詳細は、『Oracle WebLogic Serverクラスタの使用』のプロキシ・プラグインの構成に関する項を参照してください。たとえばクラスタのフロントエンド・テクノロジが標準化されているような場合、この解決方法は使用できない場合があります。

  • クラスタ内のすべてのメンバー・サーバーが非同期レスポンス・エンドポイントを公開して、非同期レスポンス・メッセージを任意のメンバー・サーバーに配信できるようにし、必要に応じてインプレース・クラスタ・ルーティングを介して正しいサーバーにメッセージを転送します。

第2の方法を実装するには、シングルトン・ポート・インスタンスを定義し、その初期化をクライアント・コンテナの初期化時(デプロイメント時)に行うことをお薦めします。クラスタの非同期レスポンス・エンドポイントの初期化のお薦めする方法の例については、例3-2「非同期Webサービス・クライアントのベスト・プラクティスの例」を参照してください。


注意:

コンテナの種類によっては、異なる方法でエンドポイントを初期化することもできます。たとえば、クライアントがWebサービスでホストされている場合、Webサービス・コンテナのメソッドに@PostConstructアノテーションを付けることができ、そのメソッドでシングルトン・ポートを初期化できます。EJBコンテナでは、シングルトン・ポートを作成するためのトリガー・ポイントとしてejbCreate()メソッドを使用できます。


PK ¹û&â&PK/¯-A OEBPS/toc.ncxX§à Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12c リリース1(12.1.1) Cover 目次 Oracle Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12cリリース1(12.1.1) はじめに はじめに Web Services Addressingの使用 Webサービス・クライアントを開発する手順 Webサービスの非同期呼出し 信頼性のあるWebサービスとクライアントを開発する手順 Webサービスの信頼性のあるメッセージングの使用 Webサービス永続性の管理 Webサービスのメッセージ・バッファリングの構成 クラスタ内のWebサービスの管理 Webサービス原子性トランザクションの使用 Webサービスのエンドポイントのパブリッシュ コールバックの使用 バイナリ・データ転送の最適化 動的プロキシ・クライアントの開発 XMLカタログの使用 SOAPフォルトを使用した例外処理 SOAPメッセージ・ハンドラの作成と使用 SOAPヘッダーの送受信 XMLメッセージ・レベルでの処理 XML over HTTPを使用するWebサービスのプログラミング HTTPセッションを使用したステートフルJAX-WS Webサービスのプログラミング Webサービスの信頼性のあるメッセージングと接続作成のためのあらかじめパッケージ化されたWS-Policyファイル 信頼性のあるメッセージングのバッチ化のためのクライアント・ラッパー・クラスの例 Copyright PKÖŸ¶]XPK/¯-AOEBPS/batchrm.htm*7ÕÈ ä¿¡é ¼æ€§ã®ã‚ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ³ã‚°ã®ãƒãƒƒãƒåŒ–ã®ãŸã‚ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ»ãƒ©ãƒƒãƒ‘ãƒ¼ãƒ»ã‚¯ãƒ©ã‚¹ã®ä¾‹

B 信頼性のあるメッセージングのバッチ化のためのクライアント・ラッパー・クラスの例

この付録では、Java API for XML Web Services(JAX-WS)を使用したWebLogic Webサービスで、信頼性のあるメッセージングのバッチ処理に使用できるクライアント・ラッパー・クラスの例を示します。

信頼性のあるメッセージングのバッチ化の詳細は、「ビジネス作業単位へのメッセージのグループ化(バッチ化)」を参照してください。


注意:

このクライアント・ラッパー・クラスはサンプル・コードです。正式にサポートされている製品クラスではありません。


例B-1 信頼性のあるメッセージングのバッチ化のためのクライアント・ラッパー・クラスの例

package example.servlet;
 
import java.io.PrintStream;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
import java.util.SortedSet;
import java.util.Timer;
import java.util.TimerTask;
 
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.ws.BindingProvider;
 
import weblogic.wsee.jaxws.JAXWSProperties;
import weblogic.wsee.jaxws.spi.ClientInstance;
import weblogic.wsee.reliability.MessageRange;
import weblogic.wsee.reliability2.api.WsrmClient;
import weblogic.wsee.reliability2.api.WsrmClientFactory;
import weblogic.wsee.reliability2.property.WsrmInvocationPropertyBag;
import weblogic.wsee.reliability2.tube.WsrmClientImpl;
 
/**
 * Example wrapper class to batch reliable requests into fixed size 'batches'
 * that can be sent using a single RM sequence. This class allows a client to
 * send requests that have no natural common grouping or
 * 'business unit of work' and not pay the costs associated with creating and
 * terminating an RM sequence for every message.
 * NOTE: This class is an *example* of how batching might be performed. To do
 *       batching correctly, you should consider error recovery and how to
 *       report sequence errors (reported via ReliabilityErrorListener) back
 *       to the clients that made the original requests.
 * <p>
 * If your Web service client code knows of some natural business-oriented
 * grouping of requests (called a 'business unit of work'), it should make the
 * RM subsystem aware of this unit of work by using the
 * WsrmClient.setFinalMessage() method to demarcate the end of a unit (just
 * before sending the actual final request via an invocation on
 * the client instance). In some cases, notably when the client code represents
 * an intermediary in the processing of messages, the client code may not be
 * aware of any natural unit of work. In the past, if no business unit of work
 * could be determined, clients often just created the client instance, sent the
 * single current message they had, and then allowed the sequence to terminate.
 * This is functionally workable, but very inefficient. These clients pay the
 * cost of an RM sequence handshake and termination for every message they send.
 * The BatchingRmClientWrapper class can be used to introduce an artificial
 * unit of work (a batch) when no natural business unit of work is available.
 * <p>
 * Each instance of BatchingRmClientWrapper is a wrapper instance around a
 * client instance (port or Dispatch instance). This wrapper can be used to
 * obtain a Proxy instance that can be used in place of the original client
 * instance. This allows this class to perform batching operations completely
 * invisibly from the perspective of the client code.
 * <p>
 * This class is used for batching reliable requests into
 * batches of a given max size that will survive for a given maximum
 * duration. If a batch fills up or times out, it is ended, causing the
 * RM sequence it represents to be ended/terminated. The timeout ensures that
 * if the flow of incoming requests stops the batch/sequence will still
 * end in a timely manner.
 */
public class BatchingRmClientWrapper<T>
  implements InvocationHandler {
 
  private Class<T> _clazz;
  private int _batchSize;
  private long _maxBatchLifetimeMillis;
  private T _clientInstance;
  private PrintWriter _out;
  private WsrmClient _rmClient;
  private int _numInCurrentBatch;
  private int _batchNum;
  private Timer _timer;
  private boolean _closed;
  private boolean _proxyCreated;
 
  /**
   * Create a wrapper instance for batching reliable requests into
   * batches of the given max size that will survive for the given maximum
   * duration. If a batch fills up or times out, it is ended, causing the
   * RM sequence it represents to be ended/terminated.
   * @param clientInstance The client instance that acts as the source object
   *        for the batching proxy created by the createProxy() method. This
   *        is the port/Dispatch instance returned from the call to
   *        getPort/createDispatch. The BatchingRmClientWrapper will take over
   *        responsibility for managing the interaction with and cleanup of
   *        the client instance via the proxy created from createProxy.
   * @param clazz of the proxy instance we'll be creating in createProxy.
   *        This should be the class of the port/Dispatch instance you would
   *        use to invoke operations on the service. BatchingRmClientWrapper will
   *        create (via createProxy) a proxy of the given type that can be
   *        used in place of the original client instance.
   * @param batchSize Max number of requests to put into a batch. If the
   *        max number of requests are sent for a given batch, that batch is
   *        ended (ending/terminating the sequence it represents) and a new
   *        batch is started.
   * @param maxBatchLifetime A duration value (in the lexical form supported
   *        by java.util.Duration, e.g. PT30S for 30 seconds) representing
   *        the maximum time a batch should exist. If the batch exists longer
   *        than this time, it is ended and a new batch is begun.
   * @param out A print stream that can be used to print diagnostic and
   *        status messages.
   */
  public BatchingRmClientWrapper(T clientInstance, Class<T> clazz,
                                 int batchSize, String maxBatchLifetime,
                                 PrintStream out) {
    _clazz = clazz;
    _batchSize = batchSize;
    try {
      if (maxBatchLifetime == null) {
        maxBatchLifetime = "PT5M";
      }
      Duration duration =
        DatatypeFactory.newInstance().newDuration(maxBatchLifetime);
      _maxBatchLifetimeMillis = duration.getTimeInMillis(new Date());
    } catch (Exception e) {
      throw new RuntimeException(e.toString(), e);
    }
    _clientInstance = clientInstance;
    _out = new PrintWriter(out, true);
    _rmClient = WsrmClientFactory.getWsrmClientFromPort(_clientInstance);
    _closed = false;
    _proxyCreated = false;
    _timer = new Timer(true);
    _timer.schedule(new TimerTask() {
      @Override
      public void run() {
        terminateOrEndBatch();
      }
    }, _maxBatchLifetimeMillis);
  }
 
  /**
   * Creates the dynamic proxy that should be used in place of the client
   * instance used to create this BatchingRmClientWrapper instance. This method
   * should be called only once per BatchingRmClientWrapper.
   */
  public T createProxy() {
    if (_proxyCreated) {
      throw new IllegalStateException("Already created the proxy for this BatchingRmClientWrapper
        instance which wraps the client instance: " + _clientInstance);
    }
    _proxyCreated = true;
    return (T) Proxy.newProxyInstance(getClass().getClassLoader(),
                                     new Class[] {
                                       _clazz,
                                       BindingProvider.class,
                                       java.io.Closeable.class
                                     }, this);
  }
 
  private void terminateOrEndBatch() {
    synchronized(_clientInstance) {
      if (_rmClient.getSequenceId() != null) {
        if (terminateBatchAllowed()) {
          _out.println("Terminating batch " + _batchNum + " sequence (" + _
                rmClient.getSequenceId() + ") for " + _clientInstance);
          try {
            _rmClient.terminateSequence();
          } catch (Exception e) {
            e.printStackTrace(_out);
          }
        } else {
          _out.println("Batch " + _batchNum + " sequence (" + _rmClient.getSequenceId() + ") 
            for " + _clientInstance + " timed out but has outstanding requests to send and 
            cannot be terminated now");
        }
      }
      endBatch();
    }
  }
 
  /**
   * Check to see if we have acks for all requests sent. If so,
   * we can terminate.
   */
  private boolean terminateBatchAllowed() {
    try {
      synchronized(_clientInstance) {
        if (_rmClient.getSequenceId() != null) {
          long maxMsgNum = _rmClient.getMostRecentMessageNumber();
          if (maxMsgNum < 1) {
            // No messages sent, go ahead and terminate.
            return true;
          }
          SortedSet<MessageRange> ranges = _rmClient.getAckRanges();
          long maxAck = -1;
          boolean hasGaps = false;
          long lastRangeUpper = -1;
          for (MessageRange range: ranges) {
            if (lastRangeUpper > 0) {
              if (range.lowerBounds != lastRangeUpper + 1) {
                hasGaps = true;
              }
            } else {
              lastRangeUpper = range.upperBounds;
            }
            maxAck = range.upperBounds;
          }
          return !(hasGaps || maxAck < maxMsgNum);
        }
      }
    } catch (Exception e) {
      e.printStackTrace(_out);
    }
    return true;
  }
 
  private void endBatch() {
    synchronized(_clientInstance) {
      if (_numInCurrentBatch > 0) {
        _out.println("Ending batch " + _batchNum + " sequence (" + _rmClient.getSequenceId() + ")
           for " + _clientInstance + "...");
      }
      /**
       * _rmClient.reset() resets a WsrmClient instance (and the client instance it represents)
       * so it can track a new WS-RM sequence for the next invoke on the client
       * instance. This method effectively *disconnects* the RM sequence from the
       * client instance and lets them continue/complete separately.
       */ 
      _rmClient.reset();
      _numInCurrentBatch = 0;
      if (!_closed) {
        _timer.schedule(new TimerTask() {
          @Override
          public void run() {
            terminateOrEndBatch();
          }
        }, _maxBatchLifetimeMillis);
      }
    }
  }
 
  public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    boolean operationInvoke = method.getDeclaringClass() == _clazz;
    boolean closeableInvoke = method.getDeclaringClass() ==
                              java.io.Closeable.class;
    boolean endOfBatch = false;
    if (operationInvoke) {
      synchronized(_clientInstance) {
        // Check our batch size
        if (_numInCurrentBatch == 0) {
          _batchNum++;
        }
        endOfBatch = _numInCurrentBatch >= _batchSize - 1;
        if (endOfBatch) {
          _rmClient.setFinalMessage();
        }
        _out.println("Making " + (endOfBatch ? "final " : "") + "invoke " + 
           (_numInCurrentBatch+1) + " of batch " + _batchNum + " sequence (" + _
           rmClient.getSequenceId() + ") with operation: " + method.getName());
      }
    } else if (closeableInvoke && method.getName().equals("close")) {
      synchronized(_clientInstance) {
        // Make sure we don't try to schedule the timer anymore
        _closed = true;
        _timer.cancel();
      }
    }
    Object ret = method.invoke(_clientInstance, args);
    if (operationInvoke) {
      synchronized(_clientInstance) {
        _numInCurrentBatch++;
        if (endOfBatch) {
          endBatch();
        }
      }
    }
    return ret;
  }
}
PKŽià/7*7PK/¯-AOEBPS/content.opfï0Ï Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12c リリース1(12.1.1) en-US b65943 Oracle Corporation Oracle Corporation Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12c リリース1(12.1.1) 2012-01-13T07:52:37Z Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング, 12c リリース1(12.1.1) PK&¿Á×ô0ï0PK/¯-A OEBPS/xml.htmsXŒ§ XMLカタログの使用

15 XMLカタログの使用

この章では、Java API for XML Web Services(JAX-WS)を使用したWebLogic WebサービスでXMLカタログを使用する方法について説明します。

この章の内容は以下のとおりです。

XMLカタログの概要

アプリケーションでXMLカタログを使用すると、WSDLやXSDなどのインポート済XMLリソースを、Webサービスの記述の一部ではないソースから参照できます。この方法によるXMLリソースのリダイレクトは、パフォーマンスを向上させるため、またはローカル環境においてアプリケーションを常に正しく実行できるようにするために必要になる場合があります。

たとえば、クライアントの生成時にはWSDLにアクセスできても、クライアントの実行時にはWSDLにアクセスできなくなることがあります。ネットワーク経由で参照できるリソースではなく、ローカルのリソースやアプリケーションにバンドルされているリソースを参照する必要が生じることもあります。XMLカタログ・ファイルを使用すると、Webサービスが実行時に使用するWSDLの場所を指定できます。

次の表に、WebLogic Server AntタスクでXMLカタログがどのようにサポートされるかをまとめます。

表15-1 WebLogic Server AntタスクでのXMLカタログのサポート

Antタスク説明
clientgen

XMLカタログは、以下のいずれかの方法で定義および参照できます。

  • catalog属性を使用して、外部XMLカタログ・ファイルの名前を指定します。詳細については、「外部XMLカタログの定義」を参照してください。

  • <xmlcatalog>子要素を使用して埋め込んだXMLカタログ・ファイルを参照します。詳細については、「XMLカタログを埋め込み」を参照してください。

クライアントをビルドするためにclientgen Antタスク(clientgenタスクが埋み込まれている場合はjwsc Antタスク)を実行すると、jax-ws-catalog.xmlファイルが生成されてクライアントの実行時環境にコピーされます。jax-ws-catalog.xmlファイルには、外部XMLカタログ・ファイルに定義されているXMLカタログや、build.xmlファイルに埋み込まれているXMLカタログが格納されています。このファイルは、参照されるXMLターゲットとともに、エンタープライズ・アプリケーションのMETA-INFフォルダ、またはWebアプリケーションのWEB-INFフォルダにコピーされます。

注意: XMLリソースの内容は、このプロセスの間は影響を受けません。

jax-ws-catalog.xmlファイルが、クライアントの実行時環境にコピーされないようにすることもできます。詳細については、「クライアント・ランタイムでのXMLカタログの無効化」を参照してください。

wsdlc

XMLカタログは、以下のいずれかの方法で定義および参照できます。

  • catalog属性を使用して、外部XMLカタログ・ファイルの名前を指定します。詳細については、「外部XMLカタログの定義」を参照してください。

  • <xmlcatalog>子要素を使用して埋め込んだXMLカタログ・ファイルを参照します。詳細については、「XMLカタログを埋め込み」を参照してください。

wsdlc Antタスクを実行すると、コンパイル済みのWSDL JARファイルまたは展開されたディレクトリにXMLリソースがコピーされます。

wsdlget

XMLカタログは、以下のいずれかの方法で定義および参照できます。

  • catalog属性を使用して、外部XMLカタログ・ファイルの名前を指定します。詳細については、「外部XMLカタログの定義」を参照してください。

  • <xmlcatalog>子要素を使用して埋め込んだXMLカタログ・ファイルを参照します。詳細については、「XMLカタログを埋め込み」を参照してください。

wsdlget Antタスクを実行すると、WSDLとインポートされたリソースが指定のディレクトリにダウンロードされます。

注意: XMLリソースの内容は、XMLカタログに定義されているリソースの参照のため更新されます。


以降の節では、以下の内容について説明します。

XMLカタログの詳細は、(http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html)のOasis XMLカタログ仕様を参照してください。

XMLカタログの定義と参照

XMLカタログは、以下のいずれかの方法で作成し、build.xmlファイル内のclientgenまたはwsdlc Antタスクから参照できます。

  • 外部XMLカタログの定義 - 外部XMLカタログ・ファイルを定義し、そのファイルをbuild.xmlファイル内のclientgenまたはwsdlc Antタスクからcatalogs属性を使用して参照します。詳細については、「外部XMLカタログの定義」を参照してください。

  • XMLカタログの埋め込み - <xmlcatalog>要素を使用してXMLカタログを直接build.xmlファイルに埋め込み、<xmlcatalog>子要素を使用してbuild.xmlファイル内のclientgenまたはwsdlc Antタスクから参照します。詳細については、「XMLカタログを埋め込み」を参照してください。

競合が発生した場合は、外部XMLカタログに定義されているエントリよりも、埋め込みXMLカタログに定義されているエントリが優先されます。


注意:

wsdlget Antタスクを使用すると、XMLリソースのローカル・コピーを取得できます。詳細については、「クライアント・ランタイムでのXMLカタログの無効化」を参照してください。


外部XMLカタログの定義

外部XMLカタログを定義するには、次の手順に従います。

  1. リダイレクトしたいXMLリソースを定義した外部XMLカタログを作成します。「外部XMLカタログ・ファイルの作成」を参照してください。

  2. 作成したXMLカタログ・ファイルを、catalogs属性を使用してbuild.xmlファイル内のclientgenまたはwsdlc Antタスクから参照します。「外部XMLカタログ・ファイルの参照」を参照してください。

以降の節では、これらの各手順について詳しく説明します。

外部XMLカタログ・ファイルの作成

<catalog>要素はXMLカタログのルート要素で、XMLカタログ・エントリのコンテナとして機能します。XMLカタログ・エンティティを指定するには、たとえばsystem要素やpublic要素を使用します。

次に、XMLカタログ・ファイルのサンプルを示します。

<catalog xmln="urn:oasis:names:tc:entity:xmlns:xml:catalog"   
    prefer="system">
    <system systemId="http://foo.org/hello?wsdl" 
            uri="HelloService.wsdl" />
    <public publicId="ISO 8879:1986//ENTITIES Added Latin 1//EN" 
            uri="wsdl/myApp/myApp.wsdl"/>
</catalog>

このサンプルで注目すべき点は以下のとおりです。

  • <catalog>ルート要素によってXMLカタログのネームスペースが定義され、システムの一致が優先されることを指定するためprefer属性がsystemに設定されています。

  • <system>要素により、URI参照がシステムIDに関連付けられています。

  • <public>要素により、URI参照がパブリックIDに関連付けられています。

XMLカタログ・ファイル構文の詳細は、(http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html)のOasis XMLカタログ仕様を参照してください。

外部XMLカタログ・ファイルの参照

作成したXMLカタログ・ファイルをbuild.xmlファイル内のclientgenまたはwsdlc Antタスクから参照するには、catalogs属性を使用します。

次のサンプルでは、clientgenを使用してXMLカタログを参照する方法を示します。関連するコード行は太字で示されています。

<target name="clientgen">
<clientgen 
     type="JAXWS"
     wsdl="${wsdl}"
     destDir="${clientclasses.dir}"
     packageName="xmlcatalog.jaxws.clientgen.client"
     catalog="wsdlcatalog.xml"/> 
</clientgen>
</target>

XMLカタログを埋め込み

XMLカタログを埋め込むには、次の手順に従います。

  1. build.xmlファイル内に埋め込みXMLカタログを作成します。「埋め込みXMLカタログの作成」を参照してください。

  2. 作成した埋め込みXMLカタログを、xmlcatalog子要素を使用してclientgenまたはwsdlc Antタスクから参照します。「埋め込みXMLカタログの参照」を参照してください。

以降の節では、これらの各手順について詳しく説明します。


注意:

競合が発生した場合は、外部XMLカタログに定義されているエントリよりも、埋め込みXMLカタログに定義されているエントリが優先されます。


埋め込みXMLカタログの作成

<xmlcatalog>要素を使用すると、XMLカタログを直接build.xmlファイルに埋め込むことができます。次のサンプルに、build.xmlファイルに埋め込まれたXMLカタログを示します。

<xmlcatalog id="wsimportcatalog">
     <entity publicid="http://helloservice.org/types/HelloTypes.xsd"
             location="${basedir}/HelloTypes.xsd"/>
</xmlcatalog>

XMLカタログ・ファイル構文の詳細は、(http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html)のOasis XMLカタログ仕様を参照してください。

埋め込みXMLカタログの参照

clientgenまたはwsdlc Antタスクの<xmlcatalog>子要素を使用すると、埋め込みXMLカタログを参照できます。<xmlcatalog>要素を指定するには、次の構文を使用します。

<xmlcatalog refid="id"/>

<Xmlcatalog>子要素によって参照されるidは、埋め込みXMLカタログのIDと一致している必要があります。

次のサンプルでは、clientgenを使用して埋め込みXMLカタログを参照する方法を示します。関連するコード行は太字で示されています。

<target name="clientgen">
<clientgen 
     type="JAXWS"
     wsdl="${wsdl}"
     destDir="${clientclasses.dir}"
     packageName="xmlcatalog.jaxws.clientgen.client"
     catalog="wsdlcatalog.xml"/>
     <xmlcatalog refid="wsimportcatalog"/>
</clientgen>
</target>
<xmlcatalog id="wsimportcatalog">
     <entity publicid="http://helloservice.org/types/HelloTypes.xsd"
             location="${basedir}/HelloTypes.xsd"/>
</xmlcatalog>

クライアント・ランタイムでのXMLカタログの無効化

「XMLカタログの定義と参照」に従ってbuild.xmlファイル内でXMLカタログを定義して参照する場合、clientgen Antタスクを実行してクライアントをビルドすると、デフォルトではjax-ws-catalog.xmlファイルが生成されてクライアント実行時環境にコピーされます。jax-ws-catalog.xmlファイルには、外部XMLカタログ・ファイルに定義されているXMLカタログや、build.xmlファイルに埋み込まれているXMLカタログが格納されています。このファイルは、参照されるXMLターゲットとともに、エンタープライズ・アプリケーションのMETA-INFフォルダ、またはWebアプリケーションのWEB-INFフォルダにコピーされます。

クライアント実行時環境でのXMLカタログ・アーティファクトの生成は、clientgenのgenRuntimeCatalog属性をfalseに設定することで無効にできます。例:

<clientgen 
     type="JAXWS"
     wsdl="${wsdl}"
     destDir="${clientclasses.dir}"
     packageName="xmlcatalog.jaxws.clientgen.client"
     catalog="wsdlcatalog.xml"
     genRuntimeCatalog="false"/>

この場合、jax-ws-catalog.xmlファイルは実行時環境にはコピーされません。

genRuntimeCatalog属性をfalseに設定した状態でクライアントを生成した場合、後からクライアント・ランタイムでXMLカタログを有効にするには、jax-ws-catalog.xmlファイルを手動で作成し、エンタープライズ・アプリケーションのMETA-INFフォルダまたはWebアプリケーションのWEB-INFフォルダにコピーする必要があります。jax-ws-catalog.xmlファイルには、外部XMLカタログ・ファイルに定義されているすべてのエントリ、またはbuild.xmlファイルに埋め込まれているすべてのエントリが含まれていることを確認します。

XMLリソースのローカル・コピーの取得

wsdlget Antタスクを使用すると、WSDLやXSDファイルなどのXMLリソースのローカル・コピーを取得できます。その後は、「XMLカタログの定義と参照」で説明したとおり、XMLカタログを使用してXMLリソースのローカル・コピーを参照できます。

次に示すAnt build.xmlファイルの抜粋に、wsdlget Antタスクを使用してWSDLとそのXMLリソースをダウンロードする方法を示します。XMLリソースは、Antタスクの実行ディレクトリ内のwsdlフォルダに保存されます。

<target name="wsdlget"
     <wsdlget 
          wsdl="http://host/service?wsdl"
          destDir="./wsdl/"
     />
</target>
PK?ùxXsXPK/¯-AOEBPS/dcommon/prodbig.gif öùGIF87a÷ÿÿÿ!!!)))111BBBZZZsss„„„¥¥¥­­­µµµÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷½µµ„{{ZRRcZZ!!1!ÞÖÎ91)JB9B9)ÎÎÆÖÖÎççÞkkc¥¥”JJB991sscï÷÷ÖÞÞÞççµ½½½ÆÆZcc!!{”œ¥Ö祽ÆBZc!9B!c{!)c{9œÆ{¥Z{{­œ­µc­ÎZ¥ÆBœÆ1Œµ)”Æ„µŒÆs¥„½Jk{µ{œ­Z{Œ„µÎk­ÎBsŒZ­ÖJœÆ9Œµ1Œ½)„µZ{!ŒÆ„½{µ„½Bc„½Þs­ÎRœÆs­Bc{½9ZZŒ”­½k„”¥Î甽Ök­ÖBkR„½Öç¥ÆÞ!BZ9c)JJc{!))BZŒ”œ„Œ”ks{Bc„R{¥JsœBk”9kœ)ZŒcµkÎ!!BZµ”œ¥1k­!ZœcµRœB„ZµcÆZ½Jk”Bkœ1ZŒ9c!RŒ!cµ9kZ­R¥ZµR­B”ZÆ9{99„!R1{9Œ9R{1„!1)c1J”œ­)1BÖÞ÷!BJRïï÷¥¥­ŒŒ”œœ¥„„Œkk{œœµ¥¥Æ½½çµµÞŒŒ­­­ÞkkŒ­­çµµ÷RRs{{­„„½ŒŒÎ””Þ{{½JJsssµŒŒÞBBk„„Ökkµ!!9ssÎ{{çZZ­ssçccÎJJœZZ½RRµccÞRR½ZZÖ))cBB¥JJÆ99¥JJÖ!!c11”99½11¥99ÎZ11½!c!!œ))ÎZ!!ÆÆ­µÆ΄­µ!1BRck{„”œ½¥„Œ½µ÷)!cJBkZRZ,ÿHPà)X²ÆRõ  Ã‡EåZÖ¬4jÛJ0 ¢@ "8„pð‰YÒ´ES–ìYº3CƊª@µ*•U:l“ÎY0_û0üë’#  5tXð1E:‰î šCã_ºxޘýÂeK©‘T¢<¹ñOC(xrÔ' Jžþ©“çm1aÀú½0S%È-IÒex ‚ŸD} 1ZÔi”^sà°Eƒ¦Ïß #…ø`¢˜qTv å©ÓFËá¼Y»–Í3è)PÖ¶e ÁOê@¬]ëåëìoàÁ…{(óbÀ½S¯ž#|¯·b´\±º‹'YÐ$ÿÀP tߪƒ¿¶Î,¯^ãXB†.+ÎKWÿo¹Ø³qc[¸=1‡ ( Ÿ#ü‘H#¯ùGN8ãÌãN:ŸUaE\èpÅ (s’Ç#˜ä¥Ž9Šc!† m¸ƒ†8b‰…DbI%zÝC9ç¼xEŒUA#ˆÐ‘èˆ!9îxُ.^8¤†Ei£’LF² +¶($‘Dxˆ¤ˆX6É%‹@~ÉņF֘$Ž:r)O=õœ#”g±C›cÞ¸¤™O¦‰çVÁç•v,É xý£K2ǃŒ4ß`h†M”±Å 6ôéƒw$¢Èÿ ÐÊ)§¼âË3ž­E ¢¤î‘„ ž&JÈx4Bª·Ô’Ï.ÆPãPd1†Ltj㧆òH£ÛT3Í4ÖtSégBàðRìÑ'*u¢‡†H‡^ø”SÎ8ö¼“Î: 1„Eœá핇2I!„˜‹îèÐãî ñÎë…÷B‡&ƒd" &—šÎ;óÈ#<íüóÂ`€qÆ_¤“ tq¼ñI)¦¢Î?^±ãŽ;í°óÒ?ž°q |X62° 'é¨ó’´0Œ:ë-?-„²Ç6¸á† 4ôlðAЀ't`×#0àc{àA @ P@;PKœ_£ã PK/¯-AOEBPS/dcommon/doclib.gif õþGIF89aó1ÿÿÿïï÷ÖÞçÆÎÖ­½Îœ­½„œ­{ŒœkŒ­c{ŒJsŒBc„9Zs1Jk,@¿ÈI«­Œ¥vÊ Ø5aƒ-¡‡é5-vÆasEnq0& ˆó҈VF[|’ÉO ¸ @’@°É48ÛªpM„(¬‘œ 7*X(±ÅƙÎjŽ¶o0Fq|uH‡ˆ‰Šu9’(dK@ @Y ! mFt,¥gN–¬h¦%± N˜µN¸@±¶·¬ À§F³¦Ë¿lºN· du¸_ÂÒg%½‹áâ‹;PKÏY@¹ PK/¯-AOEBPS/dcommon/oracle-logo.jpg€ÿÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ'7"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (ÅQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE!KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE†–šzгE7Vö%È£Š‹ÎOïΏ9?¼?:aË"\Òf£óSûãóžrýÐğjAÊÉsKš„J:n§OzO=}E1-I›îÐ)3•¥(ÔQEQEQEQEQEQEQEÓ֝HzŠa<Õ[›Èí"2Í"¢’ÌpÅO#ˆÁf8šðÏø®M[R“L·‹(‹,˜?ëg¯û9þ¶3«QSZØ ñuy"lø‹â£ïx4hƒ`àO!Âþ¸›¿ë÷ŒLºµÂúˆ˜ÅÊ¨Xé×Z­ìv¶q™&“  äúcÿ՚ô]+á:˜‘õ É ãîǵ@ý+…Jµ]©tðËQ]ž~ø§¹ã¶Õã[å[ˆ¾eϸ¦ê¿ –(Ú]6êA&>äÜ«~+ƒúכêzmÛZ^ÄÉ(°<îûÃ57«KsHÒÀf妬Ϧmnẁ&…ƒFÃ!”çŠÏñ¼:-ëÆî¥`b¥©\/¨¯(øâÙtÝF*îBÖ³“ü ~èöVä{W«x™ƒxfù‡Cnøÿ¾MvF·=;Ÿ5_,6%S’>}ö²ücQÿÀ§ÿQ¯jÀs«ßñÿOOþ5›Îê=«Òü)ðûO×t [û†¸W‘9 /{é^tyêNÑgØâ#„ÁЄªGs‡þßÖ¿è1ÿ-þ4oëô¿ÿÀ–ÿõoøTZ?üõŸþûáKÿ Gÿž³ÿßcü+o«ÕîyÿڙoòNuíhÿÌ^ÿÿüiSÄÔo¹5{ì¯\ܹý3·ô¯Y´oùísÿ}ðª÷ô¿$ˆ.nQ€ã-œ~½nå,Ó-zr~- |KÕ4ëˆ×R"êÔðÌ8‘¯¡¯aÒõ{]^Ê;»I<ȤL©¯ž5"çEÔ¤²¹ÆP’²7_jë>ëOoªK¥;*U.œôaŒùþ•t*ÉK’[˜fymÒúÅÜ3Æii ü´^ò#wcŒõ®CÇ'ÓIŒ†º”ì‰Iêk¤½ºŽÊÒIæp‹î$ö󿉵ù|C­ËtĈ—÷p¯÷Wü¹±½œl{9>⪦׺·*ͯjóÜ¥Õ.L„ä•‚§Ðf½Gáߍ¦ÔÒõw] Ýÿ|W–Á¤ÞÝéWŒ1–·ƒï8>¸úw¨­.çÓ¯!»öÍ ïVӃüÈú× :²Œ¯#ê1¹~½ +މõ·=Å;5Îøc_‹_Òb¼ˆò@¹û­ÜW@ +ï^´]ևÀՃ§7 n‚ º»ŠÖ&–gŠ2I8ÅLí±w7u¯ø‡â×Ôï¤Ò­$"Ö&"b§‰ê eZ§":ð8)âªòDÙñ'Å%{}5¯{±Çà;× wâÏ]–iu;”_údLʳ¬4û­Rí-,â2Hß6Ñü>þ½HøL¯K¨Ü¹”ŽR ~f¸oZ£Ðú§K—®ZŠìà¿·õ‘ÿ1[ÿüoñ£ûZÿ ­ÿþ7ø׫„Z7üõ¸ÿ¾ÇøRÿ¢Ñÿç½Ïýö?«êõ»‘ý«—'ày?öþµÿA}Cÿ_üiGˆ5®s¬_ý~Òÿã^«ÿ Jí5Çýö?œŸ tpÊ]îX/c'𪎯r%šeܺA|4µÕ®-¤Ôµ+ëْeÄ1M38Ç® `|KÕµ O¬VڅÔ‹u;"™Ðd–À5ì6¶ÑÙÚ, XЯø¢â­ÿÉÿ¡5kY¸R<Ì­CÕiØ·ð×XÔ®¸ô©¼]âü;£Oy)•O–¿ÞcÐW€j…Ö©}=í܅¥s‚Û¸QÏò®Zõ”*Üö²¼­âŸ<þ§Õ~%뺃²ÛȶpÒ ˆ÷f~B¹éð®î„zbæ\ݳz™øW*yê{’¯–á=Î[³Ë·õ¯ú ßÿàC/öö³ÿAkÿü oñ¯Xÿ…C¢ÿÏkŸûì…ð¨t_ùísÿ}ð«ö{‘ý­—'ày?öî±ÿAmCÿüjޓ{â WR‚Æ×VÔ7ÌÁr.Ÿ gæ~¿Qõ"½7þ&×͹Ïûãü+cÃÞÓ<=,מd³J1¾V߁è=³ÍT)TR՜¸¬Ó*N4á«ò ^æëBðÚ¥¼%ÎäËìB+±=@fþ•ÂE5ëkía§}öꕧódܤFHÉþ¬®æû¤ï^¥¬i1k\¶SgdƒüðkŒ> Ö¤ŸaŸOM®\_ \T)8靠¸ã¡®»3Ä£Rš‹æ:ï j²júä ,Ž˜p‡Ù·k/KÓ!Ótø,íÓÀ=ÇϯãZ•¡Ç6œ´Š( ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¤4´†€9Ïê ¦xnúå_k¬Lž›ˆÀýkç&f9s’K`’zóýxü…{¿ÅçÁ×{yù£8úHµàÄ ˜Ï8ÿðçbß4’>Ç©¨ÐE¹î|7›£Åvñ´Ü(‘É€z/á]ð½k7IxÛM‰»Œ}8­!÷«ºœyc¡óº’«ZR˜ïÀQø péKVrü(§RPEr?^}ñ'ðßhÏ{x¸´ýè+Հê¿LW¡15—®4cKºó@ÙåœçÓÔN<ËS«VT«EÅõ>g À† C)rœr9ý+Þc¿:¯Ã×¹b –ЖÇf*s^ éøf½‹ÂêÃáKƒŸõSî7¶å^} ‘õ¹Ì*{£Çîzq_@ü8#þË ÿpÿèF¾~þ ÷´Ëà[V·Pe³(nw0šM‹ˆWû=3·Í#økȵ‰z晨Écy¥Ç ñòPÊpG÷Ç#ô÷ªƒâæ¦W:%ÿ¶­ÿÄ×d±ã¹ó´rŒMhóÁ]Ð3éHH<ôâ¼\ü]ԁÿ|_÷ôÿ…Wºø«ªÜÆË ¤HHë’ßÒ¡bàú›¬‹}PÿŠ×>¹k {ZEŒœrxþMX¾‰¤ñ¾ž@8C&qî¤søç󬫹¯®k©L³Êۙ‰çŸOnOç^ð«ÃsCæk7ql2¨XCw©5ÍÞVæG¿Š¶.öS~ñêÿÁHÌ8=(§­s1ñ~Ñå¸c™V5îÌz ô§%v|U2«QF=Nâo‰šW]Õ¸?<ì`~ï×®}ˆõ¯=Ó¬fÔµ,­òÒÈà=;ÿ"~‚£žâIç–æy7K#–gì{ñúJõ?†žû5§ö½Ú$ y`ÿ zýzÿÀ@¯-~þ¥úm7·m¤ÎËGð宝 G§ˆ•£Ù±ò>öG&¼KÅ#ø]–؃öy1$$«ÎÔt>Äw¯£q·€jãüsáµ×t·XÆ.b̐·£{ûWej)ÃDxfc:8‡)=$y‡|Lú²°Îø³¹`²xV8Úߙö¯~‰ÖE)HÎkåwW$Œ¬ˆJ²0äuʟ®kÙ>ø¨ê6ŸÙ×S»·ÿg¡¬pµ~Ë;óÜ•±4֌ê¼W¨+ÃחcŠ"Ã=Í|àřÙå9bùcýãÜþ5îÿÉ> ½*r™ðgôá {~cüj1rnIðì#¨·Gµ|8ðìv4w³Ä¿h¸Fb>è<^‚ pJÌÑLm¥[ùDl1®Ð;ŒV®x5ÝIZ:1Œ­*µ¤äp)Ø¥Š1Z¢bŒAKŠ(1´ûׅ|SÇü&Óì©ÿ¡5{Áé^ ñKþGÿ^éÿ¡5rã>Üáï÷´;áXÿŠÈÿ×»ÿèK^ì•á? sÿ ‘ÿ¯fþk^îµ8Oá•Ä/ý­ú"J)3K]‡‚ÒN)iL怏ÿ„×Ãÿô±ÿÀ…ÿ?á5ðÿý¬ð!ƾq:þ¢Çü‘GÖåØ_êíùø£Œü=ÛX²ÿÀ…ÿšßÄú-ìé ¾©i,Žv¬i2’N3Ž |Ö03œóõ¯Qøaá†Ûý·s ! ¼€7}kZU§7ª81ùM,->e;³×@Q°z T(êëG€„Kš(Åah¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šç¼Y¦[׶j2ÒFÁ}oÖ¾o‘YY¢qµ× ƒÆêú©£<ç?…x¯Ä/Ëe}&©e h$%¦@3µ¿½\XªM®d}AŒ9:Sz3¦øqâ4½ÓÆy¹¶R q_þµz6îœõ¯–¬ï.-.cº²™áš?¸Ès¯¨äó^¥|XžÝ5;`äËHÛþù¢†!ZÒ5ÌrZŽ£©E]3ÚâŒûחÿÂàÓÿçÆïþù_þ*ø\Zwüø]ãŸüUoõˆw<¯ìŒ_ò3Ô3Fáê+ËÿáqißóáwÿŽñTŒzüø]ÿãŸüUX§Ü?²1ÈÏLf rkÎ>$øš+]%´è$æè” v^rÏ­`êÿn®ax¬,ZÃïÏÉEþuç÷WSÞܽÅÌÍ,Òg%Ðà~"°¯‰MrÇsÕËrYÆ~Ò¾‰ÇË"Åî–Fت;±8üÍ{Ñ°þËøxÖYËEfP°ö^µÂü;ð„×WPëwqbù¡B:œc?…z‡‰p<7ŽÇþ;SB›Œ˜fØÕZ¼)Ãdϛ; ÷ÿ‡ 7ƒ¬sýÓ×ýã^>í}ðá¿â±ìŸýÖx?¼BßÕi“x§Âö^#±hfŒ,©Ÿ*P9Sþ{w¯Öô[ÝüÛ]Gœó€Fñê?1ùZú_nGõ‡­ø~Ï]³kkˆƒ)9¡SêcÉç¯5Ո¢¦´<<¯6žJ-èϛ€éè}xþUÓi>Õux#šÖâÅ£cœùþ‰ü'{ᛲ²‚öŽqà?Oþ¸ªºˆoü?x&´mѱùá'å#×ë^t)ƴϲÄbªb0þÓ ÏFðÿ«kIVmVsv@º}êkÒ¡!ËUTt¬x³Oñ¢½»þ𬍇̧é]òO±¯R”b•â|2­yÔµk܊{„¶¥s…PIcí_?ø×ħÄ:ÛI“g)¡=¾¹Zí~'øŸìð "Ò\M2æVS÷S°üMyLÉslûú⺿øU~"ù–CþÚ7ÿ\¶­£ÞhzƒØ_ Rsµ—$~? ÂTêAóØõá‹Áâi¬<Ïl¹•óòOþ*“þŸÿ>’ÿñUÑõŠ}Ï+û'üŒôüÒf¼ÃþŸÿ>7_øçÿKÿ ‹NÿŸ ¯üsÿŠ£ëûå8¿äg¦1í^ñCæñÿ¯eÿК½ÿíüE¨ ;{+ ÅY™È\ ìO5翲|Yü{/oö›ü+ L”©ÝùÑÆòÔVc¾ÿÈÞOý;7óZ÷€x¯›ü-­E k&úd‘—ËØp¥zübÓ±°Þß+ÿÅTa«B0³gNy—×­‰æ§£Ô 3^cÿ ŠÃþ÷’ÿñTßø\šýîÿ$ÿâ««ëûž?öF3ùéù…‡¨¯3?tãÿ._øçÿQŒ~Nln°:ðŸüU/¬C¸eb’»ƒ1þ-i­§m¨¢’ °è ’WùŸÊ¸ÍQM+V‚æpØafR3òd׫éÙ|AÒ¯-Äq*ŒI P7óÓò:Ÿ¯­y&©¤]h×ÒX^Fbtû¼pëÜ©î?—|Wuï󭏤ʫóÑxJš3ß´ûm"öš( uqÁA}jÿö.˜ßòéýð+Àü?âÍSÃò„öÜ£¹Çà wVÿí¼¡ö‹ …~á °üó[B½&µ<¬^UŒ§?rí‡ý‡§Ϝ_÷À£ûOÿŸH¿ï\'ü.;þ|.ÿ%ÿâ©ápéßóáwù/ÿZûZG'Ô1ÿÊÎçûÀøõ‹þøj(#†0‘¨UT` WŸŒzw}>ïò_þ*“þþš9m>󑓀¼ãÔF¥?²EL3–õ"ìzpãŠubèz¯öΕêÁ$+0܉&3ŒåzÚ¶+¡jy­r»1ôQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ƒUç·I£d‘C«0EZæ“m+]Y6Ñå^!ø[ Ô¯s¥Ìmܶ捆å?óü+Š¸ð‰me+ýŸæãþZE2•üŽ¾ˆ9¤)žÜÖÃB[Æ;Äя*wGÍÿð‡x‡þsã¿ãKÿˆ¿è7þ;þ5ôw”¾‚)}gõHë~ÈùÃþÿÐ.ÍƔx?ÄXÿ\ߚÿ}äA@ˆtQõ(â:ý‘óͧ€|Iq(C§ˆTÿ’ ð?¥vÞø[´‰s«Kö©G+Œ*ר„qÇҍ¾Üc¥k <#©ÇˆÎ±5ãÊ݈`†8cXãP¨6T5ëi.´KÈ!äxX*ú’­p¸Æ&ќ÷çšÕÅZǓ¸Ï˜ù´ø7Ä ãû*oÍƽ³ÀÖ:w…lຈÇ:‚QÉ5ÒyIž‚´‘Á¬¡EA݆/2©Š‚„ú*2¦jAҐÖçšeê}¶¥k%½ÌK$N9R2?Ïò¯ñ7ýKM¾VÓ!{«W9\PûŽâ½×›Aì+´c4w`ó ØWx=ž´ÝÅZeò\ÙXͪ{‘ó}y¯X°ÖõIô §¹Ò®!½…aùO˜ßÎ{ÿúñ]Q‰xÊ)#¹ D@9éÓéE:*µÇŠÇ}b|òZŸ>_økÅ7ú„÷—:dí$¯¼Œ¯Ýz ë>ø&êÖùµVÜÆêvÅ󃏽ùW¬lR:Rìq¥J ¹ùêfõ§GØ¥d9Tmè(ÇҝEtO¨}©1O¢•‚ä[xâ¸xEõÛ´Y ût¦8,3’¼vþ ô bšFF )Ǚr›PÄN…E8=OœÂ#ÒæV*C”Œó×Ôçð¯cð¹¾¾ðê&±lñÜ&cmøùÀïŒ÷®¨CçhÍ<.ÌÖP¡{˜¼Ê¦&Üۣ̥ÿY+öGÎð‡x‹þs~kþ5$>ñ ÓÇÓ¥PÌquŽä×ўZt~Tl†>œQ.g> ¯%k#ú:•œK¸‘Én¤þ'Ÿ­&¿á{[yWQGÝqÃF}Aþ•Ð…À¥Ûÿ×®§òòž/·©í}¥õ<;VøY«ZÈÍa$wQg!$;_ñã ùŠÀ“Áþ$NK—þúSü}“Ë_•„°{½ÿMYê|áÿwˆè7æ¿ãGü!þ"ÿ \ßøïø×ÑþJÿtRy+è´¾§õŽ¿d|ãÿoˆ¿è/þ;þ5­áßj—zÌ_Ú6fHÈw˼ŽÝkÞ<µþâÑ°ƒJ#„„]ÌkçõêAÆȎÚ J€ €=¥Y¤NÅu%dxRwwbÑEÄQEQEQEQEQEQEQEQEQE'f–ŠLQŠZ(1F)h ¢ŒQ@X1KE˜æŒQE-Q@ Š1KE3h=©iÔPb“ê(¢Š(¢Š(1GjZ(£ð¥Å-Í´ìRâŒPbŒRÑ@ Š1KE7`bÚ’y´S0(Å- Å&)ÔP+ ڎԴP11F)h Å&:ŠLRm§Q@¬¥Q@Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Šò¿|I×¼5ñ{JðĶzlúN¤öâ&]âuY[ËË6vä8c€¼®A9©@áÿ>5ëñ¤úec$v±Gç½äNI‘†ÿ”¬ƒåÚÉÔg;»b½CÀþ$ÿ„»Áz^¸cò事÷¨H¤£í?.åldçÏ4ÐQ\?Å_Þx ÂQêv°\]Mv–È''beY‹'„#sÛsÁږ¥¬ø;JÕ5e´[ËÛu¸e´ # ÿ2¸“¥sÉç8â€7(¢Š(¢¼?ûwXÿ†¥þÈþÕ¾þÌÿŸ/´?“ÿ[¾ævýîzuæ€=Š( Šàþ,ø×Rð…muM. I§–õ-Ùn‘™B”vÈÚÊs”ýk¨ðÖ¥6³á]#T¸XÖ{Û(n$XÁ Ð1$œdúšÔ¢Š(¢Š(¢Š(¢Š(¢¼¿ûÇ?𽿵<ÛïøD¹öñäÿǶßõ;óþ³ýž¼ûרPEPEPEpÿ~"[ü>Ðã”CöNórYBÀì%q¹Üá]ËÀ99c–}œ?üCԆ¥¥h1Ë´Çc4* ®ÑÎ r2ç'!›p9à P´Q^?k⏊>ñ¥xŸJ±Ôô˛¸í¤Õ­#n|ÇU Yp©µ¤Q†wm gïW°PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPƒþҚ6ý;C× _*W³•ñ‰xރ8åFÉ:ž p95í§ý·áí3Vò|Ÿ·ZEsånݳzۜ ã8Îrÿ´oí¿…úÔJ­¢‘¼ÃîyD;88bÔ½Œ€Myÿ‚hßÙÿ›QtƒÌÔ®ä•dAó˜Ó÷aXã³,„@ÝêMrþÿŠCö‰ñ‡›÷vú‡äAiÄ)œ\G•à ±î^ÁbšgÇã6½ã¯ øZÞ8ãÓ1Ï#¥®%€@€ YÏ?{§ûßú—§Ë ;X½£ŽÔ~TôW€hÿÂ[ûPê—ÍmæK+ÉÇ~|…êËÇÞß±ÇLc© gÒþ3Ï5·ÂMyà–Hœ¤HY©*Ó"°ã±RAÁ"€8;ø÷ã£w†gÿ„{ÃPJïyYœeN7ŽL€ÛP¨¶³‚ljÞø“à9|E¥xâ}r8š[»]D¾ JUŽÕwpx IB’N+á¾¥ñCNðEšx[š5Η#Èés+*É3o!‹þùI  ‘ÑG¥uðüsÿ¡3Cÿ¿ËÿÉÚ|9ñšøëÁÖú»GWjíÜQîڒ®3ŒŽ…J·SØÉ ×†xÛ^¼ð×í}ªéÖ_m¾ËŽÞßï’KEx·.ÑÉÆ23šïþø'Ä^þÞþßÓþÇö¯³ù?¾ŽMÛ|ÍßqŽ1¹zú×94Üþ×!'Š9P:¸WPÀ2ÙSÏpÀ{ mÿµø“¬ißÚzÄkë-^h·µŒÒÜ *‰ÂŽƒqT<äÝM†uÛ¿]x/ÆñùZÜYïöp#(gpåNß¹´©P¨'$‘Ÿ`¯Ÿþ$ÿ þўžÏýiþÇçIÈÒnãmÄuʧ=WŽ”Ð~ÑßòO4ÿû Çÿ¢¥¯@ð'ü“Ï Ø*×ÿE-yÿíÿ$óOÿ°¬ú*ZôÉ<ð×ý‚­ôRÐA\?Ä߈–ÿ´8åý£S¼Ü–P°; \nw#øWrðN@å‡q_?ü\ÿLøëàÍ:ë÷ö-öLÛKóFwܲ¿Êxù‚¨>  ô  áÿğiɬë¾>Õt[ˬ0²…\lL¥‘ã%@úüā^Çƞ)øQâØô]Ϫhû.¦Ê]Âî'~îY±»„–^6ä`?¼WþÒBÞÓ.(Ì驪$…FåVŠBÀ ªHï´zP¨x_±ð·‡ï5­I¤–¨üµÜÌI ª©b8ò@æ¼OÃqüIø»æk#ŸÃzDy[c`Êü ¡Ã2§,Ìpąþ-¶>+ßÞIû?øRY.çy.þÅö—i 3fݜï?ÅóÜ÷õ¯Tø}6ß|6EHtËw*ŠhÃ1ã¹bI=É&€<ƒÅºïď…éójòjú}Ú*ØkÄ –ò‡Þêû·d•ÞrxÁR6²×©ü-Öõü8ÒumZãíÓùÞd»7m™Ôp ÀY`†o„š»Ënð¼2‚Q¼ä\¯¡ÚÌ2;;ԟ¿äè_öñÿ¥P?ÿ ·ˆ¿á£áþÐÿ‰'üúù1ÿϧ™÷öîûüõöé^ãOYø+Â÷ZÕây¾V„i¤c…POâN2B†88ÅxÿüÝçùÿŸ “ö™že·ðÕºË ÞåÞ0Çk2ˆ‚’:0¶ãë@4}'âÄëxuÍCÄÒxcL‘ ZA`®Œà…¶RQ°H.äú ¬ lXø↵í6úËÇWzՙ¸/íïYò ‰¿`‘IÛ¸“•`$â½RÂÆßLÓ­¬,ãòímbHaMÄíE(ÉäàÖ¬PEPϟ$mâ焼Gw §Â6èʖs åäP ítë€s׃oÑ ¾µÆ|ϵ—ºcvc¿\ç#¦9÷ Ï×5›?hwº½ûìµ´‰¥| c¢®H‰À<’|ùwñà–©f×ZŒšÇ‡]ÄQ«»!øƒÃšSÿhÍ%Ý͎›‘û; p$ÈQ»j+}ã´gsd£üð¶³áÞXk–dº“Py•<ԓ(cŒ”$uSùW ðÂfý¢|^òż/~ñ3(%í*¹_Cµ˜dv$w ¯Oøkã‹}ZÃW½ø}u2]Ãqw` ©1ZTRq¸°ÀƒÅ?øïĖ¿u?øŽêKÈä[xaA’6fŒ(ÃEÉàœíáy¯d¯øñ¥7‡üKáïéÖÑùñÜ"NÏ·cKà0ÌHWç¢(㌀{åxޝã¿x£ã­Ç‡ôÛ©-¼?¦¼‹uÃw|¬ÌÎá¥*¿.Òä×qâÃ¥|2›Æ°HÈöQÜ[G*wJFnu݃Ó8Íp³·†ÇÂ÷~#ž ]j˜ ‘¶ŸÜ!ÁێW/¸O;ã€HIñCâLÞ K ;G³Žÿ^Ô\-Û.w’ŠC±bv¨É Ï˃ÍÙü5ø“­Äu {â5ö™}6Òml‹”A´pB: lä Ž3“šäøq«jÚMÇÙï ò|¹v+íÝ2)၂G"¼ƒÇ^ø·ñìÚÞ±‡ì>g—öK˜—;öç;¦oî˜ï^Ÿñ·þI»ÿnÿúQy焵߉ì"ÓáÕäÒ4ûDe¿Ö"ˆ .%/½6íÁ °„q’ÄîU¯Oð'„uï \jK«ø¦ï_‚á!0=Ó>è™L›ÀVfSyÁÈàg?àtÃð“Hx¢gåeP ·œë–õ;UFO`jôJ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠŽx!º·–Þâ(æ‚T)$r(eu#x Ž1_jsÍá”ñ/„"–Iµ4InŒbU·i— œä3:¶ à ëÔ}·\ž©ðÓÁú׈]Ô´Xîµtw’I¤*Å ”Ý°Œ(#¾hSš7ü#ÞÒt‚$––‘Å/0 Q½‡9mÇ$dç'šñOfoüRð׌-cŒE.¹ŠIÚùð93ς0~ƒ¬?ø?@ñ…¼kÚlw‰—ˆ—dd$`ᔃƒÆFpp=y_ìצy^×5o;?i»Ko+oÝò“vìçœùØÆ8Ûß!±·¢2µ¼ó*ΘÎTŝņÀ=²ϔxVk‹Ÿá(6»tMË1Ç4^0GËÉc i9I#ú}÷Áÿê’]MáÈGÆDÉ 8D`£§aÏ^µØXØYé–qÙØZAikvCb4\’Np2I?y?íÿ$óOÿ°¬ú*Zé<ãO ÚøÃÖ÷%Ñ¡ž-2Ù$ŽKø•‘„J ¶AŒWIâO hÞ.Ó£°×,þ×k¢eO5ãÀ@9BF?rÿð¤¾нÿ“·ür€:øNüÿC^‡ÿƒøªó?Úõâhž>ðÒÇ<šb e¹¼ÃåE*¯*Ȥ¹$v`NT:ÏøR_?è^ÿÉۏþ9]Ņ¾™§[XYÇåÚÚЛ‰ÚŠQ“ÉÀ­qþø±á?hpßÍ«ØéwåšÒöé#xÜuq—žuö æ¼CqñcÅ> ðzý®ÖÖVšâë#Égo™»ˆÐ3 ÀüÅðùKz}÷Áÿê’]MáÈGÆDÉ 8D`£§aÏ^µÐx{º…,Í®‡¦Ae}ò€—“‘¹ÎY±¸ã$ã8P7ñÀ‹â†MáýÖ?>Å"m:'™”)Œm ¸žIrÜd‚Hê9?ƒß´{ Ûè:þ¡…ö›Ž9®äH£žp˜c€FÕÚy Éù±íÃÜx[áïĸ£Ö͝Ž©ž Õ´­’U~Y mÁvü¯ÊôÀÍy¿Æ߉zƏ/†<97Ûá]Æ¥ym‰!Hà ©¸ŸœÆK;W$’ |ÿ’C¡ÛÇþ”I\?Å©¼àŸ‡÷^ðý­Œ7÷òēà ›¦„Áåc–=@Päpù^ê¼=qá_‡ú>xÙº†"ó ‘ÝšFN ib¹œg½y?üÝçùÿŸ í>6ø&oø9n´ûy'Õ4·2Á`³K`H€d à+t$ìÀ5uŸð„øwþÿøJÿ³ÿâwÿ?^tŸóÏËû›¶ýÎ:{õ®‚€<¯áÇÅïjÞ±²Ö5hì5kKuŠs¨O6À«æ [‹g8'vwp@Üz‹¿‰~¶½Óì¡Öí/®ïîÞldYÉfuL±RB¸˜Œ€q’1Rx‡áׄ|Ux/5 î‡Y‘ž'~ù™-€  ÙÇlU}ág‚t E/ôíºLy¤’m„C(‘˜+r=h°¢Š(‡ñ7Å- Áþ-‡C×{xç´[”¼D2"å¤YGÌ>àÁ³»œ“©ÄÜÛÅ:x«F "Q%ìhÀžUˆ*}ˆw­MOBÑõ¿+û[J±¿òsåý®Ý%ٜgÆp:z ãÿáI|<ÿ¡{ÿ'n?øåyçÅÿØü@}7Á~ŽMZðÞù­4&õWMŠHà 1bùÚ$WÐüað÷ûká,>‰þÑ}¦ZEö)q³ÌšÚ8ÜÞ7/$…ßžq]&àïxYt]ÒÑÂó•7JÊ[q #eØgzA[”áÿþ'iÚ~†¾ñU÷öv¥§Êð@oC 1ŒŽìp¬„2ᶀ6(ÉÍzE÷Äiör]Mâ)ãLdAr³9É„BXõì8ëÒ¬x“Àþñw–uÍ" ¹#ÀY²ÑÈÎzÛ~bvç9Ækƒ­®"<;xÜ:‰.fu$ò¬ä0ö ƒÞ€:kö>(Ñ!Ö4Ƒ¬çy'uÚ\#²nÇP RFppF@“«[ý¢Æ}¾d[Ù7m`Õ Ž@<ãþ É!пíãÿJ$¯@¬ýDÓ¼9£Á¤é6ÿg±ƒw—ö}»˜±å‰'’O&´(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¹¿ø×Mð©ªAw4Ü-º­ª+0b¬Ù;™F0‡¿¥li:”:΍cª[¬‹í¼w¬€ ê‚Fp}M\¢Šó=W㧄4Üh—)©¶¸û<×)n¦$`pÇïo!NAœàãÉ­çe„óÀ0@È yA žxmm常–8`‰ É$ŒQ@É$žœÐ”WáOŠZ?uˍ7DÓõY£·É–ùáDW¤’û¾lp6îöwQEqzwÄÝPñåǃZ×R´Õ"y~ÓT” ÝòÄà¨. õ€v”Q^gâ?Ž^ð׈/4k‹}Jæ{G $–‰Ç» ‚v‘Ž#µzeÃuoż±Í¨9#`ÊêFApAæ¹|CÑ|og.¬—r½ã²Ã¬a˜…sÄåsó Î:Ê*½…×Û´ëkϳÏoçĒù7 ²H÷vºöaœØחë?t¸µ‡Ñü3£_xŠýe1lq ),ce όwAÆ2ëä÷߳ς®ï$žu[(Û‚ …(˜p]¹ëÉ=}8ªÿð¼o4¿ßø£À:æ‘bß"O´¶é:…ĉèõ'ŽÇ¦xs_±ñO‡ìõ­5¤6—HY<ÅÚÊA*ÊG¨`GpHæ€9? |ðw…ï!½†Ò{Ûè%óa¸½—yŒã ¡SƒÈ%Iœð1èW?ãYø'Cþ׿³¾¹µ¬Oö8ƒ˜÷g Ù`äœõeè ¢²ü9¯Øø§Ãöz֚ÒK¤,žbíe •e#Ô0#ŒŽ8$sUü[â½7Áž—YÕ †uEŽ-¾dŒÇ@Äq–#=žÔ¹Eq~øŸ øúâòßKŽî íQ]£»¬êIP®Ä€@öܾµÚPEq~ø›¢øãY¾Óôk]I’Í ½ä°†í«ƒ» ·$áOLb»J(¢Š(®âύu/øV×TÒചyoRݖé”)Gl¬§9AßÖº jSk>Ò5K…g½²†âEŒ¡2IÆO©  J(¢€ *ž­©C£h×Ú¥ÂÈÐY[Éq"Æb¨¥ˆ gÔV‚ìüÀ´›‹`ãÈny8ôÚ_¹tÑü!§4’OzÿhžÞrò ÛaQŽ3o;y9E%·ü!Ÿ´? g·µ»ò%¹¹x÷ P|™•~^q\–ò1‘^ç¦ø—AÖnßKÖôÛéÕ ´v·I+È!I8É>⼯öÑ¾×á-3WDä°»16Á”Hå^Y¸ãæHÀ9æÇ$ŠöIç†ÖÞ[‹‰c†¼’HÁU ’Ià9Í|iáé¼eáøÖæÚïí–÷ÜD¶¨|†i$-89ŠCpß( œŠö¿xÓí³±Ö…ÜÝê|vnÓ.Ï6gÄS…_—æ½#|¹ÁQR|"ð¤-ðXØ]‹¸Fº—p ʲ)‘À1ª0'9Îz(sá³ý·ð¿E•ž5´FÎD„ýÏ(”PÃ' P#÷³€¯0ø¼ßð˜|fð÷„’Y浇ʊâ(#ùái[t¬ ^q³ÊŒ½Z³–¥4þ!ðÝâÇö· p Ÿq9ARs…1Æ:p[ž¢³>7ü&µÏg¸µ´ó嶹Hö!R|˜U¾^3l†;2sƒ@Ÿñ‚úãOøQ¯Ík'—#D“´¤’$n9õVaíž9¬€–:\ í®ì£ƒí×2È/¤FÜåÕØ"·¦© ÇÞÎ>bO¤_ØÛêzuͅä~e­ÔO ɸÈÀ†Œ‚zWƒÍð[ƾÔn/< â|[ñ0…æhd•±HÙ@1ÉÆ[j’Ç ÷Éà†êÞ[{ˆ£š P¤‘È¡•ÔŒAà‚8ÅWÒô«Ál4ÛhímÝÒøU.åÛ°ÜǁÀè08¯›Ç_|‚÷Å:Dwú{º™⌈”0o€á nœ`}ÀÞ3±ñ׆£Ö,c’Ãqòa”Jça†Ô@é+—ø£oü:×´à“É#Z4±G˼‘þñ å‘F'm¾J™xy6ÃÓ²ðÜÐO i°ü5ý¢ƒnÒ.›{oöxç¿ 4Šñ¬€«ªI™6uë^×ãoþÏkZ²Ü}žh-ȗfý³0Û9ùʎF=xÍyÇè&ÐüUá_YÅ$“Û¾ÂdR`V‰Ä±Œ±i8Ï!xÆ ­Ú ÄpÇðúÂÊÊú6½Â8òÀužÝòC`Œn0œ‚ Ï ÿg ìžÔõwIÒKû±ïGŽ%ᗎ~g’>\pA®ÓÇß4_[Æ·‚K­Btf‚Ê7Ã9?q g“×àâçÝûáօ§ž9Ñe–9Æ$“÷Ž¤`c ì0yçšðKÏ鶿µ]{Åp]ÝÁ¥ÜMoeª,&òã%dlçàÞÃݟ|f¹³›S´ð-ŒV?<‘Ã:·ž¨¤ðPʮ́Ùî r+¬ðÅ ^ÝiRi×z^µfŒ÷sÁB¾Ó†À9®C*[8&¹¿øhïÿÐ7\ÿ¿ÿñÚó˟é¾!øõáßøn »3qqmotn‘wHÌÞS70ÄUxÇBx<СþÑßòO4ÿû Çÿ¢¥¬¿üKñ¥ é^øáØõK3Lµ[Û»¶Ù°Œ+ “Ã‚[¯… n­OÚ;þIæŸÿaXÿôTµØ|-ѬôO†ºVi´ÚGy37<’¨v$€3Œ…çj¨ÉÅqzgÆM_Eñ,~ø… G¥ÝÌéåÜÛ8*¹P¬Ûœƒç%Ücr z¦·­éÞÑçÕµk³ØÁ·Ì—c>ÝÌp “Ɂ^ñïF³Ô>Üê3'úV›,rÛÈÈÞë)$gi ’2U}+Sá“Ã⏃újÖV—0³´D7Xd1¡*Ùâ5?^F(şü ©ø7\°³×|Ë«­>âS쓍ÎÑ°Q’˜$u®Cà§ÄO øGÁ·–æ«öK©5™Sìòɔ1ÆÊ)TþUéþ,ð'†ÿá ×?³¼)¥}»û>ãìÿgÓ£ó<Ï-¶ìÂçvqŒsšàþxkAÖ| }qªhšmôë©È‹%ÕªJÁ|¨Ž`N2Iǹ  >)|RðoˆþjÚN“¬ý¢ú'ˋì³&í³#Yy4|-ø¥àß|8Òt[Yû=ôw™Ùf}»¦vªx ðkcâÿ„ü7¦|-Öo,U\¬2Ò+›ÿ†þÔÔ~Õâjº¾Ø¼´;vȼä|ò4Ÿ/-òàrsŸ^ÃFøCàmcE Áu0ˆDÒ_q¿¦X«å:ªŽ¤ Šãþèz75ˈ`¾Ò58w«xⶻŸ•ó£~êpáГÃg“'´QEQEQEQEQEQEQEQEQEQEQEQExÿíÿ$óOÿ°¬ú*ZôÉ<ð×ý‚­ôRםþÒ¾Ó-ÚXÄï©«¤e†æUŠ@Ä¤Ê í¸z×i§èwš— Éö «9Zx ˜wB¨à¦å;€Ü9#¨8ÁñMÃPühø³â=RââH´X_>} Ò(ýÜÉRʛ‰Ú~é\ŒwðÎ>ÿ –¹ÿáÿãUØ|;øgðûC–Ə¶]\Je¸»0ˆËöUd… $òÌxÎ+° ˜>#|;O…:Žƒâ]iî­b»BEñVÙ:1Û´•`­Àl<üÃIÁªØÜèÑk sÓä·Kq'È¢"»·ØÚ6óÎ1Þ²üiá;?ø^ëE¼+ÍÃÃ8@í Šr¬üAÆ RÃ#9®>o…:¤Ÿ í¼Š ŠÆ9Yå˜i™yP¿˜¨s/rI#®qƒ¸Î,þÙñÛ⩞_>/ iÛdò&É  Ê`,’Iç ‚Û®¯ãgÃå].ßž‚;+Í!Î[HÙ¢M¡vp¦ :àaGP ôÏøNÏÁ^µÑlßÍò²óNP#M#³?3’(ÉÆk  /៏¡ñÿ†ãE¾¡lâ+Ëtp@ld:Œä#sŒ÷ 2väÉ­ü-ðoˆõ‰õm[FûEôû|É~Õ2nÚ¡G à çü7ðþïɯø]û=Œ™ôùí<ÜÂÄŒI¼È[ÝÎïP _Ãü+áFKýJû%ԑYþÑ,™BA#ÄuQùTž?ÐÅÖtx–Fž{rÐ"2©yP‡rÜYTã‚yk¤¢€>0—Äך§Ã]Á°ŸµM«,±À“"©U*>mÏ,ürÙ À?aé:l:6c¥Û´•¼vñ´„*Š€p=y>•û?Øé^5·×bÖäv׿k‚Å-°P+n<Æv$FH¡9É@2kÚ¤ß þ5ø¢âÙä·MFÊåḸˆ¹ó%‹ÍRœ`´(L@ƒÐ‘ÝþÎÚ'Ø| w«Io²mJìì—~|ÈcWŒñ‡2Ž€Ÿ¦+SâOÂ~ ë6š¢ë2ióÃoöwSn&WPŔ™H9fÏ')ðý择,†Òé¿–ÛYH!•õ ç#ŽAW—€ói7Þñγ£Á*(™Y¤`N hÚ1€ƒŽyæ€=S\¾Òôíöë[’ôĉ…ɝw!CÁR¼îÎq·9ÆkÅÿf‹ˆôï_´xµšX!÷™Ð9aŽ¼ óö5¨~Í«\#x§Ç:αHÂ9V‰!¤i€xçŠõ+J±Ðô»}3L¶ŽÚÎÝ6EtQüÉ'$“É$“’håQ@>|L¼ñ×@ñhšK{;牮'`®&"™U@-$¯brÇ#‰þÁ6¹â¯xÂò)#žáö‘4®e” äåJÇÆx Îr z'į‡ÿ4ëZ÷ì7Vr³Çqå~FdÛ¹G$!Ïm¾æ®|<ð<>ðÓi1_Izò\=ij4abp«“µW©<ä÷ÀÃøç£kü/½•Ry&ÓåŽò4„g8;°ÁùB;±é¹Î¯µÔ¦ø¯|:ðä‹Õ½•º[ÜÚ 1T‘¼Ã¸I6ñFÇ®vàñ_SêÚl:΍}¥Ü4‹í¼–ò4d êT‘Fp} yŸ€>Ûø'Å ®O¬ÿiI N'ÙL>[°Á|‰~RÃz@±_:%Ó|1ý¢îæÔ^?ìýmݍÃí]‘\I¸7ß„•v’߬qȯ¢ëŸñg‚ô/éËg­Zy¾VãÈÅ$…˜`•aø© d è*9'†…%–4yŸdJÌvÚ[ êv«ÀžÕãðü×´ä6º?ĽfÃOGc²+–',ª ç’däàf¶<%ð~øž/jž#Ôµj'b³Ë…VS—‡ ]˜€NáØcŽ@2ÿhïù'šý…cÿÑR×Ið‡Å>#ø}¦Co$kw¦ÛÇgun-AµXð8e]÷Q’TÕψþÿ…áë}'ûGìMÚÜù¾G›œ#®Ün_ïç9í\½ÏÁ xb³¸ð´Z+H­nn¬”¢\„PŠ+)VbªO͎2A$µGñÿÅ:w‚ÃæHäÔ57ŒˆCᣉ9Œ7 P3’Fv‘]‡Ã-o|7Ðôë3Ï[6E’3FÒ1¡SÈ*_oáÐt®oÃ_tí3\]{ÄÅ÷ˆ5xåYbžvh²m(Än,Ì»qËmÁÆÞ3^¡@r~øy¢øÞò-%îå{ÇVš[©1 Õ@ Ìzgæ9'Œu•ç<'â¿YYÚxs[’Ò \Åylî#‰£üìê7~áO˜Êp6’@8¿,ÿ„¦òÛáï†{íIîÔÝ}ð›”ܞ̓ó±'jlä¾Éá½xkMÑ òÊYÛ¤EÒ1‘€ùŸhèY²Ç“É<šåþü*Ñ| o恡«,u a È0@XÆNÁ´prÙ98ÀåQEQEQEóÇÆ+ë}3㯄ïï$òímb³šgÚNÔ[™ N=+èzæügàmÇZZXëH O¾ˆYa+×-o¾#x’ BÖÏ+K TH§%!P&H\ 0ã+€kÚ(¢€ (¢€ (¢€ (¢€ (¢€ (®ÿâÿ4ÍFæÂó]òî­exfO²Nvº’d&=(¸¢¼ÿþoÃÏúòJãÿ×/©üxÓWÇ:mž›¨ØŸ •ËøïÄZ—‡­ô5ÒŧŸ©ëús=ÔM"Ʋù‚«)$;úÐYEW¾¿³Ó,伿»‚ÒÖ(üQ¼X“XŸÂº¹’Ñ ••Ìl0¨U¤ûªwHT|û`âª%­÷Å?Wpê)#h>¸u6ïóÄm´/ÜÚL®»ˆnJ;E{Žu¿øG< ­jËqöy ´"]›öÌÃl|`çç*9õã4ó§Âÿ ëÞ3Ö|A.‘ã-KJ‚7WžéK‰î™ÙöU à9$¹Á­«| Ðíì`ÛæKö»GÛ¹‚Ž2O$z…áë~Ó5oøC´8~Ýiϕö[fô ·;qœg¼ƒ[_xGŸIÕ¾*øâÆ}¾d_n…7m`Ոȃ^ÇàÝkA‡AÑ'ø«MÕ5-?Gð Þ¨;Å£jòÏ0㐱rU¾VPÜ2²çŒ×ŽišŸŽ~"|@—ÄÚN—î§g*„³Ú|¥¨•¶† LŠ2~p[¾‡øâïøBü {©DÛo¥ÿF²ã?¾ppßt”|ƒ·ëŸøáøG< š•ÂâûYÛrüýØ@>RðÄ |àÞ`ýÚ¹à#âE®³&¡ã=nÒêÒ{%Ag¢”0a¨Á*Nxê#ŸñÅ?øÆ7ƒ_ðč᙮ZOʜ("AòDr?–Øa»– ï>"x’óÂ>ÔµËà’ê×Êؓ©(wJˆr£õ_Á:¯ü,‡:Ž¿ac7Û¼Ï:ÛÉÝ Ù3*ü®[ûŠyÏ4sž<ðçŒíÃèڌrNt–’|“ÇÂç(y pÊç€Mp>!ëE¯ˆt/øCo¥ÓÐÛlou„yÑ»ýY^öãw$cŠï<)àMÁO¨6…k%¸¾ti¦g pª»‰8ÉcÎNXó€áÿh}U¬¾[ØEsoz‰$'néb@Îp8"É wÁå< &©ã„7¾ÿ„rú;TÓçžÏT¶;©ÖãÌHdÚ2çæè­Ó¨ÇøSýÿ •ß‰þþ³IÒ"]Ò«Þ7nŒ®å|3»³–*­4d`Å?‡Zύ,|?}áChgÖmÚöËιX¤+–‚S O›”Ü70Ú bÍtþÏ~*>šÊ_Ú+‹:-=ZVµfÀ_1›kíÜ8CÀ<ð'Š4wñňúH{æS¢%Üv֒°ó§Š8 @ âNI ý㌇á©,nu->×Æ°ÚiÞðR=µÍ»Ÿ9g½’Wã—bÅK7§î[€­Ðx¶i¿%ƒA6ƒXñFŽ±>é-˜+µÙ$I+örᶃþÉ8®Dø{­j6^&ðZx¢Ho4—k“¤E X¯Ý‘!£f£A–B«•e$>hé=sVMC½Õ¥¶žâ8ši#ƒný‹Ë¹”p2zöã'¼Hñ/‰®þ&ÝøÅ|¬êÂõßH2#C¼ p¬‘ÕK. `ÁFùFãÕôÈõ¯ü!uÔf´»Õ4}2vV@LL"V1/E$Bpyï\߅¼IñOÅÞ´×,#ðlv·[ö$ëtmvC T÷ 3W³ø‘¦øóþöðìv½ÄP>gx%–þ,¦Ðϼˆã¶¨ÆÐá>Va衸¸Ó¼' ×Ù.¤ñ-šCqå‰<§"@¯´ðØ88=qUõ|Gð棡nGáG±Ôµ[}=¾Â·Eó ÉÈ€yçœqW>1[™¼5¤¼¬zv¡±o-ƒ½´“‰.}‰¶4sžI)¨æ€2ì~é×7‘Þø»Ä¯‰.£Ê/Ÿ+F†<)ù™øbÍÁÏN¹ôÍ6 6Êݬ4¸­ ‚ÕÊ5½ªª¬,@|^á±þÐ=ëÊÿá!øçÿBf‡ÿ—ÿ’+sÀú/æñU犼a=¥£ÜÙ-œzU¡%P+’°HÈùˆùœþõ¹\m ãUÕlt=.ãSÔîc¶³·MòÊý2IÀrIdšðùü]ãÿ‹—Ûø*4=1M{$ûÛ;—2(ܧ £lyÆÿ˜•a‹oõ­wÅZÃý$ȉ~‹<ÛX픳•]áT‘ùlç¨ç$|€×²hz5Ÿ‡´;-"Á6ZÚD±&@±Õ›Ä䓎I&€>d¿ð¾¼ÿìü/Œµ+Z$uk‚è𩉥`„HÌFÆ"|Òüyy£×ö^¦0³\$>`À »—æa³Óƒœ.ÝOü3Ñ|o#Y™.µ ÑV{ـÜ@*€}Ä,3ŽOL“€£IÓaÑ´k.ݤh,­ã·¤ ±TP œ3è+‡øÑâ¸|5ðúòÜÚóUF²‚6ÁùXbGÆAÀRFFp̙5—ñZøŠ-ô_Ùoµš%o"²!Ɖ唘¿‡wE<¨ÿ{Á¿ï%Ö"ñoÿ´®øsdîfÜÁWo#›o  Ê£æ+@:O$Ú?Ã+y§óê7^Þ2…€‹×¨+pxÈaõ<ߏtM;Ä´O†´Zßí3éMæE½“vß´°åH#½Â¼Ä?òt>ÿ°TŸú ÕGã_ü*ð©ªxbîh%¸[u[[©™ƒfÉÝ*ŒaJá?á!øÿBf¹ÿ›ÿ’+Õþ5ø[Yñwƒlì4;?µÝG¨$̞jG„È Ë:°üëþŽô&h÷ùù"€3ü ោŸ>ßý“á[è~ÃåùŸk¹•s¿v1¶fþáëŽÕ]|-£xGöð½†‡göKY4ùfdó^L¹Žà—$ôQùWIð‹Ã^(ѵŸjž'Ó#±ŸW¸ŽáV9‘Ô¶éYÀÚÌ@ÇSß½gêsê~Ó¾}>XîÒËL•.Ú݄‚Ý€¸RÚC2ŒrÀwÜ|NÔ¡Ò¾xŠâu‘‘ìžÜÒ)O$q¹Á>ÙëÒ©øÃvr|Òô3$ÿe¿Ò¿zá†õûB—}§àÈØÈ=s\ÿÆÛëRÏGð.“&íO\»C$aCw>2ʻ¶à:DüðAõô=/Nÿ–v6±{G1¨ü¨è œ>$üÑüg¥êö“j·:@»XµL²<ÑÆÄa“ta–8ÜÈ;šÔÔ¾|-Ó<¾)“ÄZ̺\ˆ 𖝎pˆ¦ wäAÆ0wc¿Š>/xr}F²“Åš…Â2+óbu* p0(XáCýÒæ ðƒÆZV—ˆKÓn¥Ä×_ðK$“"´ ¡\‰ ’»É"4¹%@gðÁ×]÷‰¥ûu¾¥òYØLà†€É+æä…;WÄ 8Ç´Wèü)«:ÙêSÉ¡jŠæ)­51ˆÝW,<ÌmÊ7$º2z%|Ùâ)¯¾4|^‹A¶C¢éNÁ¼Øü‰cˆ2,îCÛ˪¤qòåWæ5ë~7ø‰áÿ†ºuµ¬ù—M-4ë@«µ¤öŽ<€¹Áï€vœv‚Váî(Ä Q¹•I* ê@,Äۏ­x¿Å3WÐ>$i?H“^ÒìmÊÉl1þŒÈ²ÇJ -æ;°Àä¯Ë@>'ëÚς/4SÀ:–‹ëƋwtî2¸“4J !õ=««ø)㏠GàÃRêðC«Çæƒo0h÷Šª³¬ÇzáA'žœçº½’)~\ÌaÜ òܽ¹Ã>Fãûޑð·Âúï…<.ÖZþ«=åǚË xíãC±l~m¬ª­ƒ€jÙ§¨ø+MðŸ|wwi=ÝÍæ«euqwstêYÛʐàUP2ÎxÄ{á/[ø‹àç‡õk}cûS³óµt|p$·9@Û×bþõ‰ Œãœàc˜økaâˆnŒüNÕtû«m¥m~Ó4²:¯ƒ" àpO'2»¶ÄšGìÑ¡éºu¼ó_kRϧÇåD_ Ó˸}Ò 0ùä1ÜJýÓWõ? ?ÂÍsáö±¦A³vÍ'Xû>éw|!HÌL¬8?êãF çÄkÞ Õ4-vûÇ•ÒMqö9uf%±S“òþñS)Âã¡ÅW5ïEàÿY¾§ñjúÓYÕt×BÝĂ<`4² ò±åA'²±]ÿŠþ7Ñüagÿ'†í·u{¹ahg¶(ðÂÀî%_<°PA# Û,0¹OÜØèCÆ7>+¼»¶ø…co#ÚO¨Ür F ynOÎ傂 !ã Êηø–Îm;á¯eqw%äöúÑIs&wLËÎI9$g©ëÔ×ΞѾÝørÒø›U²ÕÛÚ ‚6(˜v ‚!n«´õ= ÷ûûëOàUÍýäžeÕ׆žiŸh­‰cÀÉ'¥sÿ<'á½Oányáý*îêO?|ÓÙG#¶' ±8€<Ò+὏Š¼)/ƒüA©j×lÖH®£*¢-ü°ÌIÎ࣯sǧ«üiÔ¡Ñ´o j— #Aeâ;[‰0 E‘ˆ gÔVÄ-'º6³àË}/OѬuFñ‹´v°ÅæÎ2B€Û73Ó V§Æ+ë}3Nðýäž]­¯‰læ™ö“µHXàrpé@pøëâ\Åá? ǤX:1]SX݆FRb‘g8Q–\ñÉê<àÝ_Ãך¦»â[½_T¿E À#Á,27¬òcW÷Sÿ…Ûðóþ†ü’¸ÿãu'…>%ÚxÏƺ†—¢Á%Ώkd’ÿh˜œ[0áR1§1¿ 0@ø£þ)Ú_Mñ­û½3PÛåÎ8DÌg;™°£ka›áXø®ÃãgŽ­ü3á)ôxLjz´Oìs ¬¯)þù#$睤WQã¯é~<Ðͅøò®#ËZÝ¢åíÜ÷ªp2½ñ؀G'àoº/„µHõ[ëÉ5{øµ¹xDqDxÃlËàƒ‚[  l| ð¤Þø}iov$[Ë×7·¾G”ÎÁ‚Ps†ÝÎ1]f¹¬Ùø{C½Õïße­¤M+à€[r@,Nä+—ø¡­x³Bðô7>²ûeÔ²˜$,žâHÃ#*í8Jÿ°%‡¦šZü$ñç5E¿ø¬ÉmO‘$r>@|´OÝF¼9Êä©Îhÿ­¯5ÏxŸÆWKåyû£*‘É4žkíb‡jü¼œ8Éõú©éZUŽ‡¥Ûéše´vÖvé²(“¢æI9$žI$œ“W(¬ýg\Òü=§=þ¯•ªäo™ñ¸€NÕY°dœp+Íþ&ÿÂϺñØ|箘tôûC'“ïäl’aƒm ÷NWƒÆA<ýÀ-cZ¼ŽóÆþ-žòDÌ{ ‘æs \K/Ýù‰;vï“À&¹©jÿücm¥è+weáÛW™î@ÛæWU8.FUqèNTÇÐúV•c¡évúf™mµºlŠ$è£ù’NI'’I'$Ôz6‡¥ø{NK " +UÁÙ cq Ìz³` ±É8äօóçŹáµøûàû‹‰c†’Éä’F ¨¢éÉ$žœ×Ðuâ~ëž3ø—¢ÝÛØÉ&Š-à·¼¹Žx‘£_9ː䐭ž‡ñé@™ÿ ߃ÿèkÐÿðcÿGü'~ÿ¡¯CÿÁŒ?üUyÿü3ƒÿè%®ßøøÕðÎ>ÿ –¹ÿáÿãTÈ~ÐúÿÂ9ý“ªØßù?ió>Ép’ìϕŒí'ÁëèkèúùÃÇ_n¬>Áÿ]½ö¥¿Ìû_Úî _/vc!:åýzþ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠäükãÛ¾’ú¥ÛÙß\e»‰7%° œ·rIÆr@r2W¤±¿³Ôìã¼°»‚îÖLìš ˆØ$0àà‚? ±EPEPX÷Ñ®üQiâYì÷êö‘`¸ó\lB´§ï·Qßé[PEPsÁ Õ¼¶÷G4¡I#‘C+© ƒÁqŠçü5à øBâ{ IŽÖyÐ$’FÚp ± gŒàg ®’ŠË>ÒÄ ¯=Œrj‘£$w2Í°…ÉŒ/AŒn|}öÏ'«|$ѼEâ9u]{PÕu 5¤·Ó¤»"È¡€É,2à·ÊÊ>êã Ï Q@z'†ô_[ù6—ib…ÃV(Âïn®FO,IäúÖ¥P?ˆ|+¡x®ÌZëšd±¯Ü.xòA;\a—;FpFqƒÅðƗá#HƒÊ·–fååsÕÜ÷cù±EQEQE^þÆßSÓ®l/#ó-n¢xfMÄnF0ÈädÒ¹?üLÑ|_qs`šn­Н:ô„‚–Á ÜíS¹G*AŒ1í(?DÑ4ïhði:M¿Ùì`Ý原næ,ybIä“ɪ~-𭏌ü?.¨Íw¼Ž®ZÖ]•9ê{0#¡ê”P?‡¼+¡xRÌÚèzdQ·ß( y0Iœå›Ž2N3ÅWñ'ü5âï,ëšDrG€³e£œ.ô!¶üÄíÎ2sŒ×AEgÿbißð`}Ÿþ%Ÿdû‘½¿ÔìÙ·vw}Þ3œûÑ¢hšw‡4x4&ßìö0nòâÞÏ·s<±$òIäօÏÝxÃWÞ(ƒÄ·:Djðí)pKuQ…b¹ÚÌ;1Œ.Ê1¹<Ý[ËoqsA*’92º‘‚<G©( þOÿЩ¡ÿàºþ&µ4Ý'MÑ­ÚßKÓí,`g.ÑÚ±)l’œ3ì*åQEQEQEQEgêzy_ÚÚ­‡Ÿ/íw üc8ÜFq‘ÓÔP…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W¿¾·Ó4ë›ûÉ<»[XžiŸi;QA,p98ô«óÇÄÿ?ÄMrÏÀ>>}¼·j³Ý£1IÜg·9…9bØ9Û¸p °ðÿÇú^ƒãíWŞ Žù®/<ÖX4äù7Êûœ¶éå”îêA¯Wÿ†ŽðýuÏûñÿ®ÃCøeá=C²ÓåÐt«Ù ‰RK©ì‘Þgþ'%·NN2qÐpyßÇ{/ økÁÖÖznƒ£ZêÀU’+I$ù‘Ô §w–§'ÇŽàð=®¯w{ao¥jø³ÀÚ»Ï5ìÄ@½ŒÕÙe$6eÜÈÀtr]‚¨>ezç†<1¥øGC‡HÒ ò­ã噹y\õw=Øà~@eü2Ñ&ð÷Ã}N¸ó<õ·ódY#1´m# <‚¥öþJë(?]Ó?¶ü=©é>w“öëIm¼Ý»¶oB»±‘œg8ȯÿ†eÿ©»ÿ)¿ý¶ºxâ>·âûíG@ñoØ4ɼ¿&ÛûJâ-˜U¾TR£,ñë\ÿü*ϋÿô>ÿåbïÿˆ þ—þ¦ïü¦ÿöÚõ‡ÿ…áë'ûGíþuÛ\ù¾G•Œ¢.Ünoîg9ï^_ÿ ³âÿý¿ùX»ÿâ+”Öoþ%|8ñ®™csâ;½VþDIâ¶[¹îb˜32Ù‰*FÏ ‚0õ]f·‰®#Ž9Ê"FåÕ[€ÄF{àgÐT”åþ=ø[¬x«ÅĚgŠ?²ï­­>ÏfÀèÏÍ*ɑ’ì œ`ãž]m~9ø;Ë\AâhžVRë>ìî%I}“» )?Â~ítž9ø“⯠x²Htÿ]ê ¸{»“m*†m¥‰I†ä ®I^ªãŽ SÑ?hŸ _yêÖwÚ\Ï»Ì}¢xcÆqó/Îrèœè3@>|ZÕ<_âðî­áï²ßÛÅ,—3Ã&Ō£…ÃDÿ2õ pÌwv;}b°ôxgÄwϤêšmõØ·.‚)U§Ž&*[+÷Ð ÈäVåãÿu‰>ñ~"ÑÒ ¿AGöXâyžK…#Hu8P¸8ÜC{Ãü;ø›¥üA³”Eص82f±y7™Àul ËȁƒÁ©=Åsþð^…á;ÍRçF´û3jR¬³"±Ø»A¢ôUÉcýâ:  æžd<±Ä…Õ;™‚¨ç¹bɤ¯Ÿ>6x–oø‚ÃÀ·Pž+,Í ,ßh×Ëì *’X䁞Jìjö¿ øzßžÓ´;VߤA à1É˾ 8ÜŎ3Æp8  Šð?ÚO_Qo£xr6Œ»9¾J¶åŒƒÓ2är~QÓ¿ªxëÇZ_€ô3~|ۉ2¶¶ˆØ{‡‡¢ŒŒ·l÷$äÿ ¼þ:×5?ø®Ú Ène‘-ín"gFsŒ¸H1 Ìjì`ô(2sÃ|áß iº:Zx‚qenù¯d¹“óLHè¹ÂŒÀ­ñGø¬hö~×u_kvR¼Öy k‰ŠíXßk·ÌzAg\1p¬ àÿú4?üCÿÄ׈|1µ·ñ7ǝK]Òmà´Ò4ï:H¡ŽB¦Æ8Ø̤¿#’­Àç—á ¶¿o¢x¯ÆZ¤&¶FmË«JHA³(Q‰UPaI!rNáSÑ(¢€ (¢€ ñÿøGþ1x§[Äv>±¹ÿYm`»¦ƒoM¬¼üÅA8›£÷kØ( ýž5Ýc[ÿ„“û[U¾¿ò~Íåý®áåٟ78ÜN3ÓÐW¸WÏÿ³/üÍ?öéÿµ«è ò|?ñ¯Œ¼_ª³x®}#ÍÛÛÛÂìÞjùk¿tJÊ¥K4€–%¸Æ6â©Íû:è0 ›G×µ›-B7W‚åÝFÁÎPçŽaƒƒÛì•óÃko-ÅıÃH^I$`ªŠI$ðæ€l۞TÔvzo>:j^êí&›àä¸y"Hʀ6áv§‘ú1†Ðwãpûþ•¥Xèz]¾™¦[Gmgn›"‰:(þd“’Iä’IÉ4rŠ( ŠË×üC¦x_KmOXžH,ÕÂ4«’„'¦íŠHã'Œ:‘^_ªþѾµK…Ó4ÍJúxßlEÂãv7nÉ`1’2™è€=rþúßLÓ®oï$òímby¦}¤íE±ÀäàÒ¼Á—Ÿ>0ÜøÎö Ɖ¦Ëº×Ì(dǓùøa‘+ÊîÎFQ6“ãߎ–Ójpÿ`xf=ÒÛæ2C2ŒÒ±W?ʘ ·}¿ÃÒü#¡Ã¤iyVñòÌܼ®z»žìp? 6*ž«ªØèz]Ƨ©ÜÇmgn›å•ú(þd“€ä’É5r³õ½Nñ>“«[ý¢Æ}¾d[Ù7m`Õ Ž@<ÇѾ#x;_Ø4ïX¼(…!šO&GsŒI6³g Ojæ¿àïx¥u­ÒíÊó™6ʪp "áÔg<:ŸS^w­þÎÞ¾óäÒo/´¹Ÿo–›„ðnjgåoœäÕø'Ðb¸ÇøoñSáã¼þÔä¼³G–o.Ên Ïo'ÊÎËÐ(s•ë¹ö?|5ðÿµF÷HI̗¸•ü„‘¶ÝÁNFrNv®NEvóæ‡ñãÄÚn©‹â Éqy¾vAAu“Œ“Ø!FÁ“èF>ƒ Š+Åþ)|Zñ'6çÜ`ø5cÕuK„·0–8¤bˆÔ%|Àà¿{æQÌ |\øžQ5û‰4Wgh¦UóËä¯ÎämÊùŸÝÎᜟSð/ÂÏø!-¼_mÔÎ _Ü¢—S·iŒ~íN[€I;°IÀÀ?Â߅¿ð‹îñˆíž&ºÜîò?™ömßxçt‡'sû8ÉoP¢Šàü_ðŸ@ñŸˆ,uAîÖX\ ˆÖf+qG‚v7s”ÆrýØ0î ‚­íâŽ"@‘Ç…TP0€ãâ_h·‚}{RŽÍ'r‘Œìä œ*‚p8ÉÆG¨¯#ñ'Ç GÄŒ~øwa<—ׄŽöTR͂s²6 ½ñ…Ý•\dn|gøŸ¥Íàí̺׵4%OxB9ŽsÈÙA8R3,§X”à…êN ŠªÇñïÇZ¥ßˆî|û>™gå´Á›§dYoöWpÂúŒœü»t< ñSá߀ô1aa¦k’ÜI†º»{hCÜ8î{Œœ/l÷$’ì~ðe|5c$“æk‰ßƒ4¤[Œ(€ ’rO‘þÓ_ó+ÛßþÑ®ãÂßü7âïÚhvZ¬wW[ö<ñFmFs’$'¢žÕ¹ñÁ‹ã¯\i $q]«¬ö’É»jJ¹Æpz,½7g@DÃuoż±Í¨9#`ÊêFApA椯Ð>(ë? ôëOxû×ѭ¬^U¥Ý²¡óBmN¡jœVãåg&·,~8Ãâm{MÒ|/áíJå縌]ÍqÅ´&DV}±–ÈÚÍÉ*í<ô \¢Š(¯/øÁðãXøýý“scØ|ÿ3ínëþ^1µ[û‡®;W¨TsÏ ­¼·Ç !y$‘‚ª($“Àsš’¾xøã7ü$¿¼3á$¹#\m* ï —;†{*ÆÁx?7\ŽÏÆßü9áëyí´Y£Ö5M„GäÖñ¶‚ò†lá3ʐJõ¬„>Ö®|Ayã¿Ev5i‹E¹%$‚ŽïÑ· ŠpÏˍ†€=²Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¸÷ø]àéüGu¯]h°]_\Êea0Ý%ŸÝýÒ ÀÌNzc°¢€ (¢€ (¢€2üC Xø£D›GÔÖF³ãiQipŽ¯·=@%@8ÁÁ8 óYz7ßháÛ‘%$ÓGçHŽ1‚¯&æ\`ƒÁç­uPEPEPEP~¡¡éz­å…Ýý„7|¦kY$L˜ŸÈýÕTõPF…PQ˜!k„¸h£3¢2$…FåV °¨ª’;í•%QEQEâo i~.ÑΗ«ÁçZ™c—†XªäeI;Y€#4x{º…,Í®‡¦Ae}ò€—“‘¹ÎY±¸ã$ã8VÅQEW›üAøwãÏø~K™¬SÃÚv^â2dóå,Àº `m!¸–<à ôŠ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(‹ÐþxC@Önuk}.9¯%¸iãi²Ûeƒ‰ HùN7™Åv”Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yÿůkðõ–­¤¥Œ¾mض’+¸]󹃮¸ÆÂ0AÎGLsèãÿ´wü“Í?þ±ÿè©hÓ<5©M¬øWHÕ.5žöʉ0B†t @É'>¦¼ÿãî­©hÞ±¸Òõ »ÛSKYš&+åJpJq=…vžÿ’yá¯ûZÿ襯?ý£¿äžiÿöÿEK@‰à¹æºð/‡®.%’iåÓ-žI$bÌìbRI'’Iç5¹\ÿ?äžxkþÁV¿ú)k  Š( Š( «ßß[éšuÍýäž]­¬O4Ï´¨ –8œzUŠ(Ïÿávü<ÿ¡‡ÿ$®?øÝð»~ÐÃÿ’WünøR_?è^ÿÉۏþ9Gü*‡gú|ºÇkûæ{‹¹Lj’\;í*1Îî1׊±¤ü]ðN·®E¤Xë®'Ú i ’4•Îï ÀëŒîP 9¸¯™>x{Mø‘ñgSֆ‘ioáÛóVÉ TŒÿ (цÀ$)vÆT•`F¾›  ø’ÏÂ>»×/ãžK[]›ÒÎçTÕ‡zò}oâßÄ4yõkoÿdØÙmû\º¯˜s½‚¦À|¢yàà7Qœw÷ óÿ¿òHußûwÿ҈ècá߉/<]àM7\¿ŽÝ鐃l®ƒ’z(ï]EyÿÁ/ù$:ý¼éD•èæ|m7„¼¶º}Đjš£˜ ’2U¢pdppFpUz‚7ä–ºÏèWþ𽭎­ªO©ê\Ésu4ÒK¹Éè¥É!@Œc8Î&¼ŽþEñgíIgnðÇwg£ ]öåˆCm ge<ööHÎsï”æþ)ø§y£øŽïCÐüªë×V;>Øð=讘(®NA=BýÞ3۟ð·ÅÝüR´ðo‰t*ÊFßö…Xºb•pÂF^~_^¾µíóÿüÝçùÿŸ ú¸?ˆÞ,ñ7‡î4m;š$z¦¡¨¼…¼ÄgX‘ .HR¸¥_œ° Žzäw”PÃ¥|uÔÝ¿ˆ4m0ÊìßbxãcÜp¹XœŽŸ3c'9£ÂßüG§xÆÛÂ?´¸ìï.(í®aO¿#p¥ö’¬ñ¹0c;}’¾tý¢µ(u_è>°Y.u d¼p€çtÅ “¿äÎ1їÍ}EP?Š|Igá]ë—ñÏ%­®Íé‚çsª @êýy>·ñoâ<úµ·€²ll¶ý®]WÌ9ÞÁS`>Q<ðp¨Î;û…yÿÆßù$:ïý»ÿéDt±ðïėž.ð&›®_ÇwW^nôHA¶WA€I=w®¢¼ÿà—ü’ þÞ?ô¢Jô *ž­©C£h×Ú¥ÂÈÐY[Éq"Æb¨¥ˆ gÔUÊ(Åïþ-øÖÿN¹½ð÷€g‚ÆÞ'½û~§¸G%ª‚wò Äl+·Àn£¬øMã]KǞºÕ5H-!ž+×·UµFU*'s1Î\÷ô­ÏÿÉ<ñ/ý‚®¿ôSWŸþÎ?òO5û Éÿ¢¢ `¯ñ–³ªü5ø³¥ëåÜþÖÖ[n$‘m€Ø$`­»€Ì² ˜=P:ûeyßÆý)u?…z›ýšIç²x®¡Ù¸”!»àu6“9à žÙ‰EpÿuŸí¿…ú,¬ð­¢6r$'îyD¢†8bÿ½œEwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW•ü}Òu-gÀ¶6ú^Ÿw}:êq»Gk JÁ|©FHPN2@ϸ¯T¢€0üÖ¾ðõ½ÄRCÝ©IŽæþLœ ‹ŸáÝ\–#4çÿ|Y¡iš<Þ¾Oì­n+·iíÊ}ªF`˜±¶A…O/©À#$¶=¼¯âÏÂh|enúƎ‘Ãâ“‘«x p¬z…cþéãpþ|\¼¹¼·ðwŠ-o¤ÕÖSo Ȅ³ åg_¼vණck1÷ óÿ¿òHußûwÿ҈뼞xmm常–8`‰ É$ŒQ@É$žœ×•ü_ñg†õ?…ºÍ‡ˆ4«»©<Á{ŽØž2p äà Øø%ÿ$‡Bÿ·ý(’½¼Ÿá‹<7¦|-ѬïüA¥Z]Gçï†{ØãuÌò•'# ƒøתA<7Vñ\[ËÐJã’6 ®¤dGÎhÀþÉÂø×þß¿ô­+è ð;ø×µ%ÃÍ¥ž°¶[†̱´a]TrZtÝÜd†'9ǾP_?ÿÍÞŸùð¯lÔ¼K è× oªkzmŒìÖ;«¤‰ŠäŒ€ÄdŸc^ ý»£ÿÃRÿkÿjØÿfÏïÚÉÿ-¿;~÷zñ@GÑYzo‰tfá­ô½oM¾P»Gkt’°\’“Œ3î+›ø›ñßáö‡¢´jw›’Êa+Îä î^ÉÈ°âgÄËiaGs­\!6¶„ðO2LrÝXŒ„¯ð‡Àº¦¹®?Ä/´ÍqûÛ%¹\»¿gÇT„ô (T'˜øw£èž'×%ñ‡ÄiR;Ê^;+Ëè•çqÆéP‘¶1Œ*`g€€÷ÿøNüÿC^‡ÿƒøªè(¢¸ýâ>â?jž³¶¾Kí7Íó¤™FÞ\‚6ÚCy#Šì+Ïþ6ÿÉ!×íßÿJ#®òyáµ·–ââXá‚$/$’0UE$’xs^WñŞÔþë6v Ò®î¤ò6Cìr;bxɃ“€ ü(cà—ü’ þÞ?ô¢Jô ò„,ðޙð·F³¿ñ•iuŸ¾ïc×3ÈFTœŒ‚ã^©ðÝ[Åqo,sA*ŽHØ2º‘AG9  (®?þ>ÿ þ³_iÿÏ]‰äÿ©ózîÝ÷xû½:ì(Ÿñßü“ÏÿØ*ëÿE5yÿìãÿ$óPÿ°¬Ÿú**éÓ$Þ¼V°ìÜ ’á2:ɜðFG| ?ÙÇþIæ¡ÿaY?ôTUìÃü!Ñ¿±>è±2@&¹ˆÞHð¿æ’êXàe‚Sþî2@ÜPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP‹êŸÄ4»¿ÕüG}&Œ6‹Hžá®.BIC$™ØªäãïäH<ŸXÑ´=/ÃÚrXiYZ®ÈSˆnc՛eŽIÇ&´( Š( Š( Š( ¸ÿü3ð׌µË-[Z·žY­¢0˜ÒvD•9*ü¥˜¥zó‘ÅvP{ =2Î;; H--cÎÈ`ŒF‹’IŽI'ñ«Q@eÁáí6ÛÄ·ž ŠÚ5Ô.í㷖@Š T,sœg'*O"4þíjQ@ïìmõ=:æÂò?2Öê'†dÜFä`C ŽFA=+‡ÿ…%ðóþ…ïü¸ÿã•èPŸÿ’øyÿB÷þNÜñÊî,,môÍ:ÚÂÎ?.ÖÖ$†ÜNÔPŒžNjÅæ|7‹|·Z}¼“êš[™`Ž0Y¥°$@2pºv`šºë–¹àë ­fÆîÏTDò®ãº¢f‘x.Ua†ùFâ3Á®’ŠåüIðï¾.Ôc¿×4¯µÝG…_íDŽ0ŒV?cÿ’øyÿB÷þNÜñÊô (—ðßÿ øGQ’ÿCÒ¾Éu$F´K&PHñT~UcÄþ ðïŒ~Ëý¿§ý³ì»üŸßIÝØÝ÷g;W¯¥tPŸÿ’øyÿB÷þNÜñÊ?áI|<ÿ¡{ÿ'n?øåzW?¥x'ú'ˆouý;Oòu;ï3íùÒ6ýî¾RÅFXÀÐQ@ïìmõ=:æÂò?2Öê'†dÜFä`C ŽFA=+‡ÿ…%ðóþ…ïü¸ÿã•èPŸÿ’øyÿB÷þNÜñÊî,,môÍ:ÚÂÎ?.ÖÖ$†ÜNÔPŒžNjÅÏÿÂáßøKÿá+þÏÿ‰ßüýyÒÏ?/înÛ÷8éïÖº ( ?ÿ…%ðóþ…ïü¸ÿã”’øyÿB÷þNÜñÊô (?DÑ4ïhði:M¿Ùì`Ý原næ,ybIä“ɯ#ñ–ªüJø³¥è÷ÜÑÝÚ[émänAØdPÍ·‚ʱ™=\:{eQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙPK߇câ{ŸqŸPK/¯-AOEBPS/dcommon/contbig.gifŸ`úGIF87a÷ÿÿÿ!!!111999BBBJJJRRRccckkksss{{{„„„ŒŒŒ”””œœœ¥¥¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷skk„{{ZRRRJJƽµ„{sµ­¥ZRJRJB91)kcZB9)Œ„sskZRJ1÷÷ïÿÿ÷ÎÎÆÖÖÎÞÞÖççÞ½½µÆƽ””Œœœ”{{ssskkkcÆƵZZRµµ¥ccZRRJJJBŒŒ{BB9991ssckkZccR))!RRB!!JJ1))99!11”œ”œ¥œ„Œ„”œœœ¥¥„ŒŒ„Œœ­µÆŒ”¥¥­Æ)œ¥Æ1RÎ)k­µÖ”œ½œ¥Î)s1”œÆRZ„JR{BJs9RÎ1J½!1„1JÆ1JÎ9k{ÖcsÎZkÖ!1ŒJ¥­ç!)cBRÎ9JÎ1B½)9¥1BÆ!cRs{Î!)s!){1BÎ!k!s!{ksÎksÖckÎckÞZcÎ9B­)1œ!)„!)ŒBJÎ9BÎ19µ19έ­µœœ¥””¥­­ÆŒŒ¥!!)JJcZZ{!!!1RR{JJsBBkJJ{!!9BB{1!!J9)!!Z!!c1!!kR!!s9Z!BckJs)19!!c!!ZRZ,ÿH° Áƒ r àà†Œ„rxÁ¡B(Khˆ±‰" DÕªuIÇCŽiи @±S« zõ$G”3èT«T°ø°äʖ&7!f°ã b¸`ýDŒ 0€õá!éA  ÙkÖ,>S«òôçO¬[!ÄÁÄ\µ µ*¨¯_¬‚t Èà Eªxr%¨*_¿}Á€!#¨U #4 & Ö©Ž˜3|b]…Lš Ñ]štÌ Øb+Da&…Rõ—ô_2ƒlEÙ±Z`a´îÀC)/яm›vUkS ¾… ró(Ž–-iPE¶™ V¯v_ÿàð{z G…ÌLât\2÷Æs•!F A…#Ä©ù葡JY ¡ r|‘AÆ‚ôAÇ,©hB€}øé÷…àqˆ|B`d€u }—00Á”Ì(„䡆‘<‡–pb‡,¦‘ÑG+oÔB Cü0ÅpÂ/Œ´á…x$…ŸÈ– ]Ð7€Ôã ƒ@2HF‚‡cˆ‘ )µ¼¢ @ìAD€À \0 LøÒHGö',(AŒà` `@SÐC)_®ˆ"˜¸Ä àPœH`}¼Y+ˆÒÈ_|1‡.K8„pAKMA @À?3È®æ҄$[£„JPA–ñÀ)€´¡Ç+NH I ,€@8°G0؂/‹@R T,à`pÁF8ùЃ)³à$^á$Ð DñD¼TƒDlAÃÁ@ s;PKüïü³¤ŸPK/¯-AOEBPS/dcommon/darbbook.cssÿÿPKPK/¯-A!OEBPS/dcommon/O_signature_clr.JPG×"(ÝÿØÿàJFIF``ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ "ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (®ÇÞ?O 'ö~Ÿ²MQ×$žVz;· üOlÅJ‘§i8L%\]UFŠ»ÕÙÖjšÞ™¢Â%Ô¯¡¶SÐ;rßAÔþÈÜü]ðÔ¶5¾¸ފþ<À׈Þß]j7Ouyq$ó¹Ë<’jŎ…«ji¾ÇM»¸OïÅ 2þxÅy’ÇT“´÷8SFØ©¶ýl¿¯™ìð¹<=ÿ>z§ýúÿ‹£þ'‡¿çÏTÿ¿Qÿñuåð†ø—þ€wÿ÷á¨ÿ„7Ä¿ô¿ÿ¿ KëXžß§öMüÿù2=Sþ'‡¿çÏTÿ¿QÿñtÂäð÷üùêŸ÷ê?þ.¼¯þßÿÐÿþü5ð†ø—þ€wÿ÷á¨úÖ'·àØ97óÿäÈö;Š~½pq=£Ú" ~k?ëí®`¼'¶ž9¡q•’6 §èE|³yay§Må^ÚOm'÷fŒ¡ýkCÃþ&Õ<5x'Óî ©?¼…¹ŽAî?¯Zºxù'jˆæÅð•ß={=SùÿßMÕ gVƒCÒ.5+¤‘á€ËŽHdßÖªxcÄÖ^)ҖòÐíuùf…Íz{CÞ©|Dÿ‘ Vÿ®kÿ¡­zšönqì|…+XÈaë+{É5ó0ÿárx{þ|õOûõÿGü.OϞ©ÿ~£ÿâëÃëf/ x†x’X´[çÔ2²ÂH ò¯)c+½¿#ïjpÞUOZ¯YXõø\žÿŸ=SþýGÿÅÑÿ “Ãßóçªߨÿøºò¿øC|Kÿ@;ÿûðÔÂâ_úßÿ߆ªúÖ'·àeýƒ“?þLTÿ…ÉáïùóÕ?ïÔü]:?Œ>w Öڔ`ÿD˜““^Sÿo‰èÿ~«Þxo[Ó 3Þi7B:Èð°Qõ8â—Öñ V¿®Éäùc-ď¢ôoi:üFM2ö9öòÈ2~ªy©_*Ø_Ý闱ÞYNð\Fr®‡ÿ®=«èxZ›3鳎£Oêá¼wW½×_™íôQEz‡ÂWãßÇá˜~Ãc¶]REÈeaSüMê}â}â¥Hӏ4Žœ&®.ª£E]¿êìêu=gMÑ óµ+Ømôó–ú§ð®Fçâç†`r±‹ë‘ýè¡ãÄñëû½Níîïn$žw9gäÿõ‡µMa¡êº¢–°Ón®Tuh¢f˜¯2Xú’v‚>އ a(Û6ß­‘ì?ð¹<=ÿ>z§ýúÿ‹£þ'‡¿çÏTÿ¿Qÿñuåð†ø—þ€wÿ÷á¨ÿ„7Ä¿ô¿ÿ¿ KëXžß¯öMüÿù2=Sþ'‡¿çÏTÿ¿QÿñtÂäð÷üùêŸ÷ê?þ.¼¯þßÿÐÿþü5Kkào\ÝÃÒ.â8S$±TÉêO £ëXžß€žG’¥w?ü™çáZx®æ±´¼ŠX)’áC7 Ã‘Æ~¢²µŸ‰Ú.‡«Üi·6ºƒÍš(ЩÈŒ¸=ý+¤Ñ4{mG·Ó­¸-Ž]»±÷&¼â'üº·ýt_ýk«V¥*Iõ<£ƒÌ1Õ)Ùû4®µ×thð¿tßIs„q›p¥üôQœçÃJé+È> ÿÇæ±ÿ\âþm^¿[aªJ¥5)nyÙÖž:4¾oÅ&QEnyAEPEEss •¬·72,PD¥ÝÛ¢Ô׃øÏâ÷ˆ¦’ÒÉÞÛK᦯ííüë øˆÑW{ž®W”×ÌjrÓÒ+wÛüÙêÚ¯Ä iÑM¨¬Ó/;pd?˜à~&±Æ?‚@´ÔÎ;ˆ£çÿ¯Ž7–EŽ4gv8 £$Ÿ¥l'„z§ýúÿ‹£þ'‡¿çÏTÿ¿Qÿñuåð†ø—þ€wÿ÷á¨ÿ„7Ä¿ô¿ÿ¿ GÖ±=¿þÁÉ¿Ÿÿ&GªÂäð÷üùêŸ÷ê?þ.Æ iR(¬5W‘Ø*ªÃ$ž€|õå?ð†ø—þ€wÿ÷᫼øgàk«mIõbÎHÜí·†eÁ/Ž_Ðt÷>Õtëâg%ÐåÆåy.„ªÞíl”·}NÔ5[]+Mkëæ0Ä eHËdôPrsÆsÖÿtù'U¹³»´›ižC,y8`V%9Àù‡Z³ãÁ•©IËia|³Üª‚v¦Öñßi מÀ±YG,’Ëo}öë+«kk{YbyIeb¡‚Ì*sÎÞAÅtÕ«8ÊÈñ2ü¾…zóWoÏ×Eæ·×K5óöz*¦—o-®“eo;nš(³œ°P üêÝu-I)4ÂŠ(¦HQEQEQEQEŸ®ê±hzæ¥(ÊÛÆX/÷›¢Ä?ùŽöò}BökË© “ÌåݏrkÚþ0]4>†8óîÑXz¨V?Ì ñ}6Óíú¥¥˜$}¢d‹ö˜ë^F>nUú ááK µì¿?äBÕ¿ëšÿèk_9×¾xžåï~Éw'ßžÆ êÛ þuDŽ›t§ØúLÿ ãð؈îä“ù5cÀëê-þEÍ/þ½"ÿÐ|»_Oè³Åoá.I¥HÓ쐍ÎÀ¸=iå߈ãÝ*Iw’5(ªŸÚºwüÿÚÿßåÿ?µtïùÿµÿ¿Ëþ5ês.çÂû)ÿ+û‹tŒªèQÔ2°ÁdUµtïùÿµÿ¿Ëþ5Vÿĺ.™j×Zª"Ž‚@ÌÞÀIúRrŠZ±Æ…Y4£ß¡á_´;}ųÛÚ(KyQfŽ1üº¦Aǵt¯?ßÙç÷sZù„g«+?F5Èø·_oøŠãQØR&ÂD‡ª àgß¿ã]¿Á6F¿ÔuR¤D‘ u>¤ÇòÚ¿xôlñ7†×?IÌTéäŽ8Ÿ‹•'ë§ãsØh¢«jöú^Ÿ=õÛì‚.ííè=ÏJö›¶¬üÊ1rj1Wlä¾$ø¯þý얲cP¼˜ÓøŸú¥x«;„E,Ìp$֟ˆµËkw•É Èqg"4ž¹5Úü(ð§Ûõ®ÝǛkVć/¯Ñž=+Å©)b«Yl~›„£K#˝JŸïÍô_כ5&ø\«ðüF±®'úI#©8æ/Ëÿõä|«wʾ²¯ø§á_ìXjö±âÎõŽðËÔþ ×ëšÛ†QŠ”:oçs¯^T1.îMµëÕ‘è_|TO.;?ãßÜëëæ_ ø‚ ë°j吳F?å¤g¨þ£Ü úNÎî û8ní¤A2FÁ®œ%i =ÑâqWõ,G=5îOUäú¯òòô Öu8´]ïR›”·ˆ¾Üãqì?ø×Ìw÷םü÷·r'Ë»Sý+Û¾.ܼ ©ââê8Ûè7óQ^elo/ííTàÍ*Æ?õ®L|ۚô<%‡…<,ñ/víò_ðOKøsðú BÙ5½f/29¶·nŽñ0î=¥züq¤Q¬q¢¢(ªŒ=¦ÛÁ­´Vð¨X¢@ˆ£²€*Jô(э(Ù™f5qõJN‹¢_ÖáEVǞQEóŸÄOùuoúè¿ú×ѕóŸÄOùuoúè¿ú×aü5ê}gÿ¾Oü?ª:߂¿ñù¬×8¿›W¯×|ÿÍcþ¹ÅüÚ½~µÁ]N&ÿ‘O—þ’‚Š(®£Á (¢€<Ÿãˆ]>Í @øVQ=Æ^~Uý ü«Ì´m&ë\Õ­ôë5i›žŠ:’}€æµ|}r×~9՝‰ùfòÆ}þ•_Ã>'»ð­ì·vVÖ²Í$~^ë„fÚ3“Œ0ë^i©×n{\ý_.ÃO –F8tœÜoó}ý?${φ|#¦x^Í#µ…^è¯ïn~w=þƒØ~½k~¼?þ'ˆçÏKÿ¿RñtÂäñüùé÷êOþ.»ãŒ¡hŸ![‡3Zóu*Ù·Õ³Ü(¯ÿ…ÉâùóÒÿïԟü]ð¹z_ýú“ÿ‹ªúõ/õW1ì¾óÜ(¯ÿ…ÉâùóÒÿïԟü]v~ñgˆ|Yq<ז¶0éð ¥âÃ;žŠ b8ŸÃÖ®ºs—,w9ñ\?ŒÂÒuªÙEyíS·ÒtÛK†¸¶Óía™¾ô‘ªÇê@Í\¢º,™ã)Ê)¤÷ (¢™!EPEPEPEPEPñzѧðts¨ÿ{¤v>ŠC/ó"¼NÂèØê6×`dÁ*J®Òô¯§µ2gG»Ó§ÿWqBq§±üá_1êZuΓ©\X]¦ÉàrŒ?¨ö=Ey8ø8ÍM¡pž&p³ÃKtïòðO©-®"»µŠæ¨wR2 K^-ðóâZ< £ëÂÌÜ\c>V…¿Ù÷íôéì–÷0^@³ÛOÑ7ÝxØ2ŸÄW¡F´jÆësãó<²¶³„×»Ñôküû¢Z(¢¶<ТŠ(®OâF¤šw‚/ƒ6$¹Þ1ê[¯þ:ÖÞ¯®éš©¸Ô¯#q¤üÍì«Ôþà~4ñ|þ,Õ›LVPemá=@=Y½ÎÓõ®LUxӃV}A•UÅbcU«B.í÷·Ds5ïÞ*µk„²Ù¸ÃAeG>ªPJòxžt͝› §b88?*þ$~@ׯüDÿ‘ Vÿ®kÿ¡­raiµJs}Qôö.2Ì0Øxï&þmXùξ›Ó,íµØZ]“A-”Jñ¸È#`¯™+ê-þEÍ/þ½"ÿÐ<½]È\a'tZÞïô