PK dDoa,mimetypeapplication/epub+zipPKdDiTunesMetadata.plistn artistName Oracle Corporation book-info cover-image-hash 531979118 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 279280950 publisher-unique-id E40977-01 unique-id 926849755 genre Oracle Documentation itemName Oracle® Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0 releaseDate 2013-11-08T08:27:00Z year 2013 PKZsnPKdDMETA-INF/container.xml PKYuPKdDOEBPS/xt_appsr.htm+vԉ Creating WebRTC Session Controller Applications, Packages, and Criteria

3 Creating WebRTC Session Controller Applications, Packages, and Criteria

This chapter explains how to create the applications, packages, and criteria that WebRTC Session Controller Signaling Engine (Signaling Engine) uses to establish and modify communication between your client applications and IMS core.

Starting the WebRTC Session Controller Console

You use the WebRTC Session Controller console GUI to create and manage the applications, packages, and criteria that Signaling Controller uses to translate and modify messages between client applications and your IMS core.

This procedure requires a running WebLogic server, and that you know the WebLogic username and password that you created for the domain. See the discussion on getting started in WebRTC Session Controller System Administrator's Guide for instructions on creating and starting a WebLogic domain.

To start the WebRTC Session Controller console:

  1. Start the WebRTC Session Controller domain server.

  2. Open a web browser.

  3. Access this URL:

    http://localhost:port/wsc-console

    or this command if HTTP security is configured:

    https://localhost:port/wsc-console

    Where:

    localhost is the IP address of the system running the WebLogic domain or the value localhost.

    port is the port of the domain. The default port is 7001.

    This command starts the WebRTC Session Controller console on a local system using the default port:

    http://localhost:7001/wsc-console

  4. The WebLogic user login screen appears. Enter the username and password you set when creating the WebLogic domain.

    The WebRTC Session Controller console window appears.

  • The item marked weblogic in this screen capture is the username of the user or group logged into the WebRTC Session Controller console. In this case it shows the default user, Weblogic.

  • The Accessibility item brings up the WebRTC Session Controller console accessibility tools. For details see the discussion on starting the WebRTC Session Controller console in the WebRTC Session Controller Installation Guide.

  • The Logout item logs the current user out of the WebRTC Session Controller console.

Creating Criteria

Each Signaling Engine criteria contains a single Groovy script that performs all translation and processing tasks for a single type of JSON or SIP message. You must create separate criteria for all possible JSON or SIP message that your Signaling Engine implementation processes. In synchronous request/response communication, you must create a separate criteria for each request and response message.

Before creating a new criteria, look through the Groovy code in the default packages, and in the Script Library to see whether there is already some code that accomplishes what your message requires.

Criteria are applied to messages based on this information included in each criteria:

  • Direction - Either FROM_APP for messages originated in a WebRTC-enabled browser, or FROM_NET for messages originating from your IMS core (SIP server or proxy).

  • Verb - Identifies the message action verb (SIP method or JSON action) that the criteria matches. For example PUT, GET, INVITE, complete, shutdown, and so on.

  • Type - The type of message; can be one of:

    • request

    • response

    • message

    • error

    • acknowledgment

  • Network Service - Identifies the application that the message is being used for.

To create a Signaling Engine criteria:

  1. Start the WebRTC Session Controller console.

    See "Starting the WebRTC Session Controller Console" for details on starting the Signaling Engine console.

  2. Select the Packages tab.

  3. Select the package to add criteria for from the Package Name table.

  4. Click Lock and Edit at the top of the window.

  5. Click Create Criteria.

    A blank criteria appears at the top of the criteria table and a Groovy script pane appears below the criteria table.

  6. In the Direction field, select either FROM_APP or FROM_NET. If the criteria affects calls originating in a WebRTC-enabled browser, select FROM_APP. If the criteria is for calls originating in the IMS core, select FROM_NET.

  7. In the Verb field, Enter a SIP method name or HTTP request that identifies the message to affect.

  8. In the Type field, enter (request or response) as appropriate.

  9. In the Network Service field enter the network service for messages that you want to affect.

  10. In the Groovy Script window enter a Groovy script as appropriate for this criteria.

    The Groovy script defines all actions for this criteria. See "About the Groovy Scripts" for more information.

  11. Click Validate Script to ensure that your Groovy script meets the Signaling Engine validation requirements.

    See "About the WebRTC Session Controller Console Validation Tests" for a list of the validation tests and error messages.

  12. Click Commit to save your new criteria. See "About the Groovy Scripts" for details.

  13. Click Commit to make your changes take effect.

Creating Packages

A package is a collection of all the criteria (Groovy scripts) necessary to translate the telecom messages in a session from JSON to SIP and back. So creating a new package really just creates a shell that you fill with criteria. This procedure assumes that you have already created the criteria required.

To create a package:

  1. Start the Signaling Engine console.

    See "Starting the WebRTC Session Controller Console" for details on starting the Signaling Engine console.

  2. Click Lock and Edit.

  3. Click the Create Package. icon (blank page with "+" sign).

    The Create Package dialog box appears.

  4. Enter a logical name for the new package and click OK.

    Your new package now appears in the package table which is arranged alphabetically.

  5. Click Commit to make your changes take effect.

Creating Applications

Each application is a collection of packages that contain the criteria that translate (and probably change) WebRTC application to SIP network communication for a single program. This procedure assumes that you have already created the criteria and packages required.

Applications reference your WebLogic security groups. Create any security groups your implementation requires before following this procedure.

To create an Application:

  1. Start the WebRTC Session Controller console.

    See "Starting the WebRTC Session Controller Console" for details on starting the Signaling Engine console.

  2. Select the Applications tab.

  3. Click the Lock and Edit button.

  4. Click Create.

    The Create Application dialog box appears.

  5. Enter a logical name for the application.

  6. Click OK

    The Applications table appears with the new application in the top row.

  7. Select the Active check box if you want the application to take effect immediately.

  8. Description - Enter an informative description of the application.

  9. Request-URI - Enter the URI that messages are allowed to originate from. The WebRTC application's name. The default location is /ws/webrtc/application_name.

  10. Resource Limits - Select the pencil icon to enter resource limits and the Resource Limits screen appears. Enter positive integers to set maximum session limits; enter 0 to prohibit any sessions, and -1 to allow unlimited sessions.

    • Max sessions - Enter the grand total number of sessions that the original session can spawn.

    • Max sessions per user - Enter the total number of sessions that a subscriber is allowed to spawn.

    • Max sub sessions per user -Enter the total number of sessions that each user is allowed to spawn within a session.

    • Max sub sessions per session - Enter the total number of sub sessions spawned by a single session.

    Click OK.

  11. Allowed Domains - Click the pencil icon to edit the list of cross-origin resource sharing (CORS) domains to share data with this application. Allowed Domains window appears. Enter all domains to allow cross-origin resources sharing (CORS) with this application. Click OK when finished.

  12. Packages - Click the pencil icon to edit the list of packages that apply to this application. The Packages window appears. Move all packages that apply to this application to the Selected Packages list. Move all others to the Existing Packages list. Click OK when finished.

  13. Any warning icons disappear and the new application is shown in the applications table.

  14. Click Commit to make your changes take effect.

Debugging Groovy Script Run Time Errors

You can diagnose Groovy script problems using the stack trace in the domain_home/wsc.log file, which contains Signaling Engine stack trace messages. You identify the individual Groovy script by searching for the individual criteria method name that contains the criteria information. See "About the Groovy Scripts" for details on the signature that each script uses, and the method it invokes.

Figure 3-1 shows an illustration of a formatting problem in the register package, in the FROM_APP/connect/request/default criteria shown highlighted. The red arrows show the problem, the sipReq variable is used before it is declared.

Figure 3-1 Groovy Script With a Formatting Error

Surrounding text describes Figure 3-1 .

This is a violation of Java syntax, and as you would expect, the operation failed and these debugging messages were written to the wsc.log file:

Caused by: groovy.lang.MissingPropertyException: No such property: sipReq for class: Script2
     at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
     at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
     at Script2.pkg_register_dir_FROM_APP_typ_request_verb_connect_netsvc_default(Script2.groovy:705)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
     at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1085)
     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:952)
     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
     at groovy.lang.Closure.call(Closure.java:411)
     at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.callGlobal(GroovyScriptEngineImpl.java:411)
     at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.callGlobal(GroovyScriptEngineImpl.java:405)
     at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeImpl(GroovyScriptEngineImpl.java:394)
     ...

The package and criteria values of the offending Groovy script are identified in this line from wsc.log:

Script2.pkg_register_dir_FROM_APP_typ_request_verb_connect_netsvc_default(Script2.groovy:705)

This messages shows the method name that Signaling Engine creates from each criteria's package name and criteria values (highlighted).

In this example, the criteria with the syntax error is in the register package. Within that package the criteria with the problem has a FROM_APP direction; a request type; a connect verb; and a default network service. This matches the syntax error of the FROM_APP/connect/request/default criteria shown in Figure 3-1.

About the WebRTC Session Controller Console Validation Tests

The WebRTC Session Controller console runs validation tests to confirm that your Groovy scripts, Groovy library, packages, and applications are all valid. It runs the validation tests each time you commit changes to an application, package, or criteria, or click the Validate Script or Validate Library buttons.

Table 3-1 lists the validation error types and their error messages.

Table 3-1 WebRTC Session Controller Groovy Script Validity Tests

Error TypeError Message

APPLICATION_NAME_NOT_UNIQUE

Application name application_name is not unique.

RESOURCE_LIMITS_PROFILE_NAME_IS_NOT_UNIQUE

Resource limits profile name resource_limit_profile_name is not unique.

INVALID_RESOURCE_NAME

Invalid resource name resource_name, do not enter invalid characters.

INVALID_APP_NAME

The application_name application contains invalid characters.

INVALID_REQUEST_URI

The request_URI request URI contains invalid characters.

INVALID_SECURITY_EXPRESSION

The security_expression security expression contains invalid characters.

INVALID_ALLOWED_DOMAINS_EXPRESSION

The domains_expression domains expression contains invalid characters.

INVALID_RESOURCE_LIMITS_NAM

Invalid resource name resource_name in application_name application.

PACKAGE_NAME_NOT_UNIQUE

Package name package_name is not unique..

SCRIPT_NAME_NOT_UNIQUE

Script name script_name is not unique for package package_name.

MODULE_NAME_NOT_UNIQUE

Module name module_name is not unique.

INVALID_PKG_NAME

The package_name package contains invalid characters.

INVALID_CRITERIA_VERB

The verb_name verb name contains invalid characters.

INVALID_CRITERIA_TYPE

The type_name type contains invalid characters.

INVALID_CRITERIA_NETWORK

The network_name network contains invalid characters.

PKG_REQUIRED

At least one package is required for the application application_name.

INVALID_PACKAGE_REFERENCE

Package name package_name is referenced from app application_name but it does not exist.

GROOVYALL_COMPILATION_ERRORS

Error occurred for the criteria criteria, in the package package_name and the error message is reason at line number line_number.

GROOVY_COMPILATION_ERRORS

Error is reason, at line number line_number.

DUPLICATE_CRITERIA

Duplicate criteria found for criteria direction, verb, type, network_service in package package_name.

GROOVYALL_SCRIPT_RESTRICTION

Error occurred for the criteria criteria, in the package package_name and the error message is reason.

GROOVY_SCRIPT_LIBRARY_COMPILATION_ERRORS

Script library validation error is reason at line number line_number.

ME_INVALID_LOGIN

Invalid credentials found, for the media engine.

ME_ADDRESS_IS_NOT_UNIQU

Media engine address address is not unique.

ME_PORT_IS_INVALID

Invalid media engine port port_number.

ME_NODE_NOT_REACHABLE

Server not reachable with address address and port port_number.

ME_LIFE_CYCLE_ERROR

Media engine life cycle is not initiated for the server server_name and port port_number.

INVALID_MODULE_NAME

The module_name moduel contains invalid characters.

INVALID_MODULE_REFERENCE

Nonexistant module module_name is referenced from application application_name.

INVALID_SCRIPT_TYPE

The script script_name contains an error of type error_type.

GROOVY_SCRIPT_LIBRARY_RESTRICTIONS

Error occurred in script library reason.

GROOVY_SCRIPT_RESTRICTIONS

Error message is reason.


PK0v+vPKdDOEBPS/cover.htm  Cover

Oracle Corporation

PK@t` PKdDOEBPS/xt_wse_protocol_ref.htmA< JsonRTC Protocol Reference

A JsonRTC Protocol Reference

This appendix provides reference information for the WebRTC Session Controller JsonRTC Protocol used by WebRTC Session Controller Signaling Engine (Signaling Engine).

About the JsonRTC Protocol

WebRTC Session Controller uses this protocol to communicate with WebRTC-enabled browser client applications. It establishes the sessions and subsessions that you use to pass messages between WebRTC Session Controller and its client applications inside WebSocket connections.

You can also use this protocol to create new WebRTC Session Controller packages for your WebRTC Session Controller implementation.

See "About Building JSON to SIP Communication" for more information about how WebRTC Session Controller handles WebSocket connections, sessions, and subsessions.

While WebRTC Session Controller uses this protocol to communicate with JavaScript-based applications by default, this protocol also communicates with client applications based on different operating systems. Your client application must open the WebSockets necessary for the JsonRTC protocol subsessions to communicate with.

Initiating a HTTP/HTTPS Handshake with Signaling Engine

The JsonRTC protocol is a sub protocol of the WebSocket protocol, and you establish a handshake with a WebSocket protocol to initiate communication between the two. The handshake establishes a connection between the client (usually an application in a browser) and the Signaling Engine server inside HTTP/HTTPS. Once the client receives the handshake response, communication can proceed. The handshake is an HTTP GET /chat message using webrtc.oracle.com as the value for Sec-WebSocket-Protocol. For Example:

GET /chat HTTP/1.1
Host: server.wsc_IP.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://client_IP.com
Sec-WebSocket-Protocol: webrtc.oracle.com
Sec-WebSocket-Version: 13

Where:

wsc_IP is the domain name of the Signaling Engine server.

client_IP is the domain name of the client.

The handshake reply must include a 101 Switching Protocols entry to allow the connection, as shown in this example handshake reply:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: webrtc.oracle.com

Once the client receives the handshake response, the client and Signaling Engine server can communicate further.

Immediately after establishing a WebSocket connection, the client sends a JsonRTC CONNECT message to establish the WebRTC Session Controller JsonRTC session. Once WebRTC Signaling Controller accepts the CONNECT message, it responds by sending back a session_id. If the WebSocket connection is broken unexpectedly, for example by a network problem, the client can re-establish the session by starting a new websocket connection with the original session_id in a CONNECT message.

Tearing Down a JsonRTC Session

You tear down a JsonRTC session by closing the WebSocket connection.

About JsonRTC Sessions and SubSessions

See "About Sessions and Subsessions" for details on how this protocol establishes and manipulates sessions and subsessions.

JsonRTC uses a session_id field instead of a Message Broker WebSocket Subprotocol (MBWS) connection_name to identify the WebSocket session. The session_id field value must be unique across time and space to work with geographically redundant clusters.

The subsession_id is the session_id value with a c or s prefix added to it.

Also see "Initiating a HTTP/HTTPS Handshake with Signaling Engine" for more information about using session_id to reconnect a session.

About Message Reliability

This protocol uses the MessageBroker WebSocket Subprotocol (MBWS) as basis for message reliability. For more information on MBWS, see the MBWS specification:

http://tools.ietf.org/html/draft-hapner-hybi-messagebroker-subprotocol-03

About the JsonRTC Session Controller Messages

The basic communication unit used between a WebRTC-enabled client application and the WebRTC Session Controller JsonRTC protocol is a message. Signaling Engine communication can be synchronous or asynchronous. Each messages includes these components:

This section also includes "Example Message Bodies" that you can use for reference.


Control Headers

The control header specifies information that the client and server use to handle (control) the message. It includes the message type, session ID, message state, and so on. Typically Signaling Engine uses this information itself, not applications or Groovy scripts.

type

The control type of JSON message. Can be one of:

request

A message that requires a response. A protocol frame with control type request may also contain a payload header.

response

This message is a response to a request message. A protocol frame with control type request may also contain a payload header.r.

message

A message that does not require a response. For example notification, or publish. A protocol frame with control type request may also contain a payload header.

acknowledge

A message that acknowledges another message. Can not contain a payload header.

error

Indicates that an error has arrived. Can not contain a payload header.

package_type

Optional. The call, presence, and message_notification types are defined by default. Identifies the Signaling Engine package that the message applies to. If no package_type is specified, Signaling Engine assumes that the default call package is used for all messages except messages those with a CONNECT action. CONNECT messages attempt to establish a session and are not associated with a package. See "Creating Packages" for details about the Signaling Engine packages.

session_id

Identifies a WebSocket session. The server creates the session ID and returns it to the client in the CONNECT response. A CONNECT message containing a session ID reestablishes a JsonRTC session. This value must be completely unique so that it may be used across redundant clusters. This has the same role as the MessageBroker WebSocket Subprotocol (MBWS) connection-name.

sequence

A serial number that uniquely identifies a message in a JsonRTC session. Both the client and server keep their own serial number counts, starting with 1.

ack_sequence

Optional. Identifies a message to acknowledge. Used to confirm that the client received the message with the ack_sequence value. A value if 0 means the message was not received. All messages with a lower value than the ack_sequence are also considered acknowledged.

subsession_id

Identifies a subsession with a session. The sequence numbers are incremented each time a new session is started. The client and server keep separate subsession ID counts. This subsession ID typically includes a c prefix if the subsession originated with the client and an s prefix if it originated with the server. An implementation can also choose to use a globally unique identifier as the subsession ID.

For example the second client-originated subsession has the value "subsession_id":"c2". The seventh server-originated session uses the value "subsession_id":"s7"

correlation_id

A string that identifies a specific message within a session. It can simply be a sequence number incremented each time a new message is sent. The client and server keep separate message counts. Messages from the client have a ”c” suffix and messages from the server have an ”s" suffix.

For example the third client-originated message has the value ”correlation_id”:"c3". The sixth server-originated message has the value "correlation_id":"s6".

message_state

Identifies the message state as Initial, Subsequent, or Final. A state of Initial is assumed if no state is present. Only Subsequent or Final messages need specify the message_state.

For example: "message_state":"Final"

version

Identifies the JsonRTC protocol version that message sender supports (client or server). If none is present in the message version "1.0" is assumed.


General and Action Headers

The general header (header) includes fields that Signaling Engine uses to build up and tear down calls. These fields are specific to one or more packages and are available to use in both client applications and Groovy scripts.

action

The purpose of the message. Can be one of:

CONNECT

Establishes a session with the server. These general headers are only used with the CONNECT action.

cslr

Optional. Sent with the session_id of a session to reconnect. Uses the sequence number of the last message received from the client to identify the session.

cslw

Optional. Sent with the session_id of a session to reconnect. Uses the lower bound of the messages in the client's retained window to identify the session.

csuw

Optional. Sent with the session_id of a session to reconnect. Uses the upper bound of the messages in the client's retained window to identify the session.

sslr

Optional. Sent with the session_id of a session to reconnect. Uses the sequence number of the last message received by the server to identify the session.

START

Starts a session with a specific package.

COMPLETE

Announces that the media session has been established.

NOTIFY

Equivalent to Notification of Notification Server.

SHUTDOWN

Shuts down session opened by a specific request.

initiator

Optional. Identifies the URI of the user initiating the HTTP request. If this value exists, it may be set by the client or the HTTP session.

target

Optional. Identifies the URI of the Signaling Engine server being targeted by the message.

error_code

Optional. In error type messages, lists the error message.


Message Payloads

The message payload is specific to Signaling Engine package that the message is used for. The default call package the payload is an SDP offer or answer. The default message-notification package includes JSON data with message text. If you created a presence package, that package probably includes presence data.


Example Message Bodies

The following sections show message body examples.

Connect Request Message
{
   "control": {
    "type":"request",
    "sequence":"1",
    "version":"1.0"
   },
   "header": {
    "action":"connect",
    "initator":"bob@example.com",
   }
}
CONNECT Response Message
{
   "control": {
    "type":"response",
    "sequence":"1",
    "correlation_id":"c1",
    "subsession_id":"c1",
    "session_id":"Hyi89JUThhjjR",

    "version":"1.0"
   },
   "header": {
    "action":"connect"
   }
}
START Request Message
{
   "control": {
    "type":"request",
    "sequence":"2",
   },
   "header": {
    "action":"start",
    "initator":"bob@example.com",
    "target":"alice@example.com",
   },
   "payload": {
     "<offer_sdp>"
   }
}
START Response Message
{
   "control": {
    "type":"response"
    "sequence":"2",
    "correlation_id":"c2"
    "subsession_id":"c2"
   },
   "header": {
    "action":"start"
   },
   "payload": {
     "<pranswer_sdp>"
   }
}
SHUTDOWN Message
{
   "control": {
    "type":"message"
    "sequence":"4",
    "subsession_id":"c2"
   },
   "header": {
    "action":"shutdown"
   }
}
ERROR Message
{
   "control": {
    "type":"error"
    "sequence":"6",
    "correlation_id":"c2"
    "subsession_id":"c2"
    "error_code":"480"
   }
}
PKY@dAAPKdDOEBPS/title.htm5 Oracle Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0

Oracle® Communications WebRTC Session Controller

Extension Developer's Guide

Release 7.0

E40977-01

November 2013


Oracle Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0

E40977-01

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

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

PKPKdDOEBPS/xt_building.htmkK About Building JSON to SIP Communication

2 About Building JSON to SIP Communication

This chapter explains how you use WebRTC Session Controller Signaling Engine (Signaling Engine) to build up and tear down calls, and translate them between the JSON data format and the SIP protocol.

About Building JSON to SIP Communication

Figure 2-1 shows the sessions and subsessions used in making a simple JSON to SIP call flow. Client applications first set up JSON sessions that include WebSocket connections to start communicating with Signaling Engine. Signaling Engine then starts subsessions to communicate with the client application, and SIP sessions to communicate with your IMS core. The sections that follow explain information you need to know to set up this communication.

Figure 2-1 Signaling Engine Call Flow Overview

Surrounding text describes Figure 2-1 .

Securing Signaling Engine Connections

See the Oracle Communications WebRTC Session Controller Security Guide for information on securing:

  • Signaling Engine-SIP connections.

  • Client application to Signaling Engine connections.

  • Internal Signaling Engine internal components and processes.

  • WebRTC to SIP connections.

About Connecting to a Client Application

Signaling Engine uses the JsonRTC protocol to communicate between client applications and the WebRTC Session Controller console. Signaling Engine establishes communication using an HTTP/HTTPS handshake message using a value of webrtc.oracle.com for Sec-WebSocket-Protocol.

See "JsonRTC Protocol Reference" and WebRTC Session Controller Web Application Developer's Guide for details on this protocol and how to use it to develop client applications.

About Sessions and Subsessions

Figure 2-1 shows an overview of how Signaling Engine handles JSON sessions, WebSockets, and subsessions, and how they relate to SIP sessions. First, Signaling Engine opens a protocol session using the WebRTC Session Controller Configuration API, and within that session Signaling Engine then opens a WebSocket connection. Inside the WebSocket connection, Signaling Engine uses the JsonRTC protocol to open a subsession to pass messages between the browser and the Signaling Engine. Finally Signaling Engine opens a SIP session to communicate with your IMS core.

There is usually a 1:1 relationship between WebRTC sessions and WebSocket connections. However if a network problem interrupts the WebRTC session, the WebSocket connection can be reestablished with session information (rehydrated) if the problem is fixed before the connection timeout limit is reached. If the time limit is reached, the WebRTC session exits. See WebRTC Session Controller System Administrator's Guide for details.

Each subsession is associated with a WebRTC Session Controller package, which defines the allowable actions for the WebSocket and its subsessions. Each subsession is responsible for maintaining the media session between the client application and the peer (media server, SIP phone, web client, and so on). When call is torn down, the media stream and the subsession are closed.

Usually each Signaling Engine subsession has one corresponding SIP session. However, a SIP session may not always required. If for example, a SubSession that just sends a SIP MESSAGE outside of a dialog would not create a media session or require a SIP session.

There is usually only one JSON session per WebSocket. However, each JSON session can have multiple WebSocket connections which run in parallel. If a WebSocket is disconnected unexpectedly, Signaling Engine can start a new one to continue using the existing subsessions. This enables you to continue sessions if a WebSocket connection is unexpectedly terminated by a network failure, HTML refresh, or other service interruption.

About JSON to SIP Communication

Figure 2-2 shows the JSON and SIP message flow for a call originating from the client application and how the messages relate to JSON sessions, WebSocket connections, subsessions, and SIP sessions.

Figure 2-2 Default WebRTC Session Controller FROM_APP Call Flow Detail

Description of Figure 2-2 follows

The client application initiates communication with Signaling Engine by sending a wsc.session object (not shown), which includes the handshake and connect message.

The call shown in Figure 2-2 originates from a client application (WebRTC-enabled browser) using the RFC WebSocket protocol. In this case Signaling Engine translates the JSON data into SIP protocol messages for the SIP server to respond do. The call recipient (not shown) may be a SIP device served by the SIP server itself, or another WebRTC browser using another Signaling Engine implementation.

As Figure 2-2 shows, Signaling Engine translates the JSON messages to SIP and passes them to the SIP server, and translates the SIP messages to JSON and passes them back to the client. Signaling Engine groups the Groovy-based translation code segments into applications, packages, and criteria. Each application represents all JSON to SIP communication for a collection of related Signaling Engine features. Each of the features is composed of a package, which is a collection of individual criteria that each perform a single translation action. These criteria contain the individual Groovy scripts that perform each action.

See "About SIP to Client Communication" for a description of how Signaling Engine processes messages that originate in your IMS core.

About SIP to Client Communication

This section explains how Signaling Engine processes messages what originate from your IMS core. For example, if a subscriber using a SIP phone attempts to communicate with a Signaling Engine client application. The call could originate from any SIP device or another Signaling Engine implementation. From the Signaling Engine perspective, these calls originate from a SIP server.

Figure 2-3 shows a sample call flow initiated by a SIP phone and how Signaling Engine translates the SIP messages from the phone's SIP server to the JSON data format that the client application can use for communication.

Figure 2-3 Default Signaling Engine FROM_NET Call Flow Detail

Description of Figure 2-3 follows

About Storing Data Within Sessions

As you are building up and tearing down calls, you will probably need to store data within Signaling Engine for different messages to use, such as customer subscriber data. Signaling Engine provides an attribute store to hold data that you use within sessions. You use the getSessionStore() class in the oracle.wsc.feature.webrtc.template package (TemplateContext interface) to retrieve data from the attribute store. The attribute store is created when a WebSocket session or SIP session is created within Signaling Engine, and is persistent until that session is torn down.

Understanding the WebRTC Session Controller Components

Using the WebRTC Session Controller console, you equate one WebRTC-enabled client application to a WebRTC Session Controller application. Each Signaling Engine application in turn, is a collection of WebRTC Session Controller packages that each roughly equate to a single real time WebRTC feature. Each package contains any number of Groovy scripts, called criteria, that each perform a single translation function on a single type of call message. The sections below provide more detail on applications, packages, and criteria.

About Applications

A WebRTC Session Controller application represents a single client application or service that sends messages between a browser and a SIP server through WebRTC Session Controller. Each application must have at least two packages, one for translating from the SIP server to the application and one for translating from the application to the SIP server. Each application has:

  • An informal name.

  • An active/inactive setting.

  • An informal description.

  • References to the WebRTC Session Controller packages that contain the Groovy scripts that performs message processing and translation.

  • A Request URI that the application uses to communicate with a SIP server or proxy.

  • The WebLogic security group. The security groups is required, and the Weblogic Server contains some default security groups that you can use. For details on using security groups, see the discussion on users, groups, and security roles in Oracle Fusion Middleware Securing Resources and Policies for Oracle Weblogic Server.

  • A list of Allowed Domains that serve as a white list of domains the application is allowed to contact.

  • Resource limits that allow you to protect system performance by limiting an application's impact on Signaling Engine. These resource limits can also serve as application white- and black-lists for individual applications.

See "About Packages" for details on the packages that comprise an application.

About Packages

Each WebRTC Session Controller package contains a group of criteria that contain the Groovy scripts to translate a logical group of messages from JSON to SIP or SIP to JSON. For example, Signaling Engine provides an example call package that includes all of the JSON (FROM_APP) and SIP (FROM_NET) criteria to build up and tear down a JSON to SIP call, including:

  • JSON start messages (request, response, and error)

  • JSON complete message

  • JSON prack message

  • JSON shutdown message

  • SIP INVITE messages (request and response)

  • SIP CANCEL message

  • SIP ACK messages (request and response)

  • SIP UPDATE messages (request and response)

  • SIP PRACK message

  • SIP BYE messages (request and response)

A package generally contains criteria for a single client application. Each package can be used by any number of Signaling Engine applications.

See the WebRTC Session Controller console to inspect the default packages provided, and "About Criteria" for details about the criteria that comprise a package.

About Criteria

Each WebRTC Session Controller criteria matches one kind of JSON or SIP message and runs the code in a Groovy script against it. For example, one criteria translates an INVITE request message from SIP to JSON, and another translates the response back from JSON to your SIP format.

Each criteria uses this information to identify the messages it translates:

  • A FROM_APP or FROM_NET direction that specifies whether the message originated in a WebRTC-enabled browser, or your SIP IMS core.

  • A verb matching the type of JSON or SIP request or response. For example, an UPDATE verb matches SIP UPDATE requests and response messages, and a complete verb matches a JSON complete request or response message.

  • A type of message for the criteria to match. For example request or response. See "JsonRTC Protocol Reference" for the list of supported type values.

  • A Network Service name. Each default criteria uses a Script Library call to return the network service of the call. A default network service name is the default.

See "About the Groovy Scripts" for details on the Groovy scripts.

By default, WebRTC Session Controller contains useful criteria that you can use to build and tear down calls, and use as stubs to add functionality that your implementation requires. You can use these default criteria as provided but you will probably modify them to fit your implementation's needs.

This is the default FROM_NET/INVITE/request/default criteria Groovy script:

def sipRequest = context.originatingSipMessage
def webMessage = context.webFactory.createWebRequest("start")
webMessage.header = [
  initiator : sipAddressToString(sipRequest.from),
  target    : sipAddressToString(sipRequest.to)
]
// SDP
if (sipRequest.sdp) {
  webMessage.payload = [sdp : sipRequest.sdp]
}
def sdpString = sipRequest.sdp

if(context.mediaFactory.isAvailable() && sdpString!=null) {
  def sdpOffer = context.mediaFactory.createSdpOffer("1", sdpString,
Constants.ME_CONFIG_NAME, null, sipAddressToString(sipRequest.to),
sipAddressToString(sipRequest.from));
  def ascFuture = sdpOffer.send()
  context.getTaskBuilder("processMediaResponseToSendWebMsg").withArg("ascFuture",
ascFuture).withArg("webMessage",webMessage).onSuccess(ascFuture).build();
}
else{
  webMessage.send()
}

About the WebRTC Session Controller Console

You use the WebRTC Session Controller console to create, organize, use, and extend the applications, packages, and criteria for your implementation.

At the highest level, you use the Applications tab to create and manage applications, that roughly equate to a single web client application. See "Creating Applications" for details on creating applications.

Figure 2-4 shows the WebRTC Session Controller console with the Packages tab exposed. Each package is listed with its direction, verb, type, and network service. The Groovy script used in each criteria is shown on the bottom right of the pane. You enter or change the Groovy script for each package in this pane. You can also reference any existing Groovy code stored in the Scripting Library tab. The See "Creating Packages" for details on creating packages for your applications.

Figure 2-4 WebRTC Session Controller Console Packages Tab

The graphic is described in the surrounding text.

The Script Library tab is a repository of validated Groovy scripting code that you can reference in any of your packages.

About the Groovy Scripts

Groovy is a scripting languages based on, and very similar to the Java programming language. Each Signaling Engine package contains its own individual Groovy scripts that translate messages matching its criteria specifications. The translation is either from WebRTC Session Controller's normalized format to SIP, or SIP to the normalized format depending on the direction you set. Packages require that you set up one criteria for translating in one direction, and a corresponding criteria for translating messages in the other direction. Signaling Engine then translates the normalized format to a format that your browser/application uses and back again.

Most packages use synchronous communication, so most criteria are created in pairs; one that translates messages from the client application (JSON) to SIP, and the other to translate from SIP to JSON. However the traffic can be asynchronous, as with SMS messages for example.

Figure 2-5 shows how criteria use Signaling Engine components to translate messages. The register package shown contains two criteria, one for FROM_NET messages and the other for FROM_APP messages.

Figure 2-5 Signaling Engine Criteria Components

Description of Figure 2-5 follows

Every criteria uses this Java signature:

void method (TemplateContext context) { Groovy script }
 

At run time, Signaling Engine converts the criteria identifying information (FROM_APP or FROM_NET, the verb, message type, and network service) to a method name. However, you only encounter this method name while debugging criteria operations.

The signature calls the TemplateContext interface of the oracle.wsc.feature.webrtc.template package in the WebRTC Session Controller JsonRTC protocol to act on the Groovy script. This interface includes all of the other JsonRTC protocol interfaces that specify the specific Java methods that you can use to get information from or set information to a message.

See WebRTC Session Controller Configuration API for details on this API.

Finally every criteria contains a Groovy script that acts on the information obtained from the context. It is in these scripts that you add any new functionality or redirection instructions that change the behavior or destination of the message. In addition to simple translation, you can add any other processing that your implementation requires to each message. For example, you could:

  • Map JSON information to SIP fields so that your SIP server accepts it.

  • Map SIP header information to a form that your web application can use.

  • Route the message to a specific URL based on its JSON information.

  • Route the message to a specific URL based on its SIP information.

  • Incorporate features such as redirecting a message to a different URL for example, to prevent bill shock.

See WebRTC Session Controller Configuration API for details on the packages and methods of the API.

About the Script Library

The Groovy scripts you create for a package will probably use some functionality provided in the script library. The script library contains a set of useful methods that you can add to as required by your implementation. To use one of these methods, select the Script Library tab, click Lock and Edit, make your changes, then click Commit. Example methods in the Script Library include code to:

  • Return a user address based on the characteristics of a SIP string.

  • Set the SIP routing URI.

  • Set the SIP message contact parameter.

  • Copy SDP data to a SIP header.

The Groovy code that you create in a package's criteria is appended to the code in the script library at run time. So you can reuse any of the library code in the scripts that you create for each individual package. You can also add more code to the library as needed, and use it in other individual packages.

After changing the code in either a package or the library, you need to validate it to ensure that it compiles correctly. You use the Validate Script button on the Package tab to validate an individual script, and the Validate Library button on the Script Library tab to validate the library.

About the Normalized Data Format

As pictured in Figure 1-1 Signaling Engine converts messages into a normalized data format in the process of translating them between SIP and JSON. All messages are converted to the normalized format, regardless of whether they originated in a WebRTC client application, or from your IMS core.

The syntax for the normalized format is straightforward:

Map<String, Object>

For example, this JSON data format message:

{
"age":25,
"name":{
"first":"joe",
"last":"smith"
},
"messages":["msg 1","msg 2","msg 3"]
}
 

Is translated to this normalized message format, which is a hash map representation of the message:

{"age"=25,
{"name"={"first"="joe","last"="smith"}},
{"messages"=["msg1","msg2","msg3"]}}

Notice that the messages array is a nested hash map of its own.

Table 2-1 lists a variety of actions that you might perform while creating a Groovy translation script and the Groovy code that performs the action.

Table 2-1 Java and Groovy Actions on the Normalized Format

Translation ActionGroovy Code

Get the age

def age = map.age

Get the first name

def firstName = map.name.first

Get the list of messages

def messages = map.messages

Get message 2 from the list

def message2 = messages[1]

Modify the last name

map.name.last = "doe"

Add a middle name

map.name.middle = "bob"


PK|=$ֹkkPKdDOEBPS/xt_introduction.htm4N˱ About Extending WebRTC Session Controller

1 About Extending WebRTC Session Controller

This chapter introduces the Oracle Communications WebRTC Session Controller Signaling Engine (Signaling Engine) and WebRTC Session Controller Media Engine (Media Engine) features that you use to establish communication between WebRTC-enabled browsers and SIP-based network services.

In order to use WebRTC Session Controller functionality, you must be familiar with

About Extending WebRTC Session Controller Functionality

WebRTC Session Controller builds up and tears down real-time multimedia calls between client applications on WebRTC-enabled web browsers, and your SIP multimedia services. WebRTC Session Controller does this by translating telecom messages between the JSON data structure used by the client applications and the SIP protocol used by your IMS core.

See "WebRTC Session Controller Software and Protocol Conformance" for details on the protocol levels this release uses.

Figure 1-1 illustrates the WebRTC Session Controller architecture, lists the developer extension points you use to customize the JSON to SIP communication, and shows how JSON messages are translated to SIP and SIP messages to JSON.

Client applications send JSON messages to Signaling Engine, which uses Groovy scripts to process them and translate them to SIP messages and send them on to your SIP servers and IMS core. During Groovy processing you can use interact with a Policy Control and Rules Function (PCRF) to include policy (QoS) information, and Media Engine to manage the call's media session.

Figure 1-1 WebRTC Session Controller Components and Developer Extension Points

Description of Figure 1-1 follows

This guide explains how to customize Signaling Engine Groovy scripts to:

  • Change the JSON data used in messages. For example, to modify your JSON data if the JSON specifications change.

  • Change the SIP data used in messages. You can then add any additional SIP header data that your SIP implementation requires.

  • Use Media Engine to affect the media parameters (SDP data) of media sessions. For example, you can use Media Engine to negotiate a codec supported by both call parties.

  • Send and receive policy information from your PCRF. You can exchange information with a PCRF and affect the call (or the subscriber's account) either before or after the call's media session.

  • Streamline communication between client applications and WebRTC Session Controller to provide a more lightweight and efficient protocol. You can tune the network traffic by filtering or aggregating messages to limit the call flow. For example, you could remove some or all of the SIP 1xx informational messages from the call flow as they arrive at WebRTC Session Controller. Or you could aggregate related SIP messages and forward them to the client application as a single combined message once WebRTC Session Controller has received them all. This reduces the amount of traffic that the client application must process, enabling you to simplify the client applications logic.

The WebRTC Session Controller Web Application Developer's Guide explains the extension points not covered in this document, including:

  • How to extend the default WebRTC Session Controller JavaScript API package

  • How to create a WebRTC Session Controller JavaScript API package

During the JSON to SIP translation you have a lot of flexibility in what you can do with individual messages. You can manipulate messages:

  • At the field level, by adding new fields, creating a new field layout, adding optional data, and creating a new data representation.

  • At the header level, by separating a SIP message header from the message content, and pass on one or the other in a new message (for a different service). You can then pass one or both to a new service.

As shown in Figure 1-1, calls can originate either from a WebRTC-enabled web browser (client application), or from the SIP IMS core itself. Browser-originating messages are first translated from JSON to a normalized format by Signaling Engine. Then the normalized message is translated to the SIP protocol by Signaling Engine Groovy scripts calling methods from the WebRTC Session Controller API.

Signaling Engine processes SIP server-originated messages in the opposite direction. They are first translated from SIP to a normalized format using your Groovy scripts. Then Signaling Engine translates them again from the normalized format to the JSON format that your web browser can parse.

Figure 1-2 shows the WebRTC Session Controller console graphical interface that you use to create, select, and modify the Groovy scripts that translate and customize messages. In Figure 1-2 the Packages tab is selected, showing one of the default Groovy scripts provided with this release.

Figure 1-2 The WebRTC Session Controller Console Window

Description of Figure 1-2 follows

See "Customizing Messages for New SIP or JSON Data" for details on how to use the WebRTC Session Controller console.

About the WebRTC Session Controller Console Components

WebRTC Session Controller uses these concepts and components:

  • WebRTC Session Controller applications - Each application represents a single WebRTC-enabled client application and all of its capabilities. For example, an application could be a website that offers a video and audio chat capabilities. Each application uses a set of WebRTC Session Controller packages.

    See "About Applications" for more details and "Creating Applications" for instructions on how to create them.

  • WebRTC Session Controller packages - Each WebRTC Session Controller package is a unit of real time communication capability that WebRTC Session Controller supports. Each package is a collection of the individual Groovy scripts (criteria) that actually do the message processing and translation from SIP to JSON and back. Each JavaScript client application must reference the packages that it is allowed to use.

    Each package typically includes the logical set of message processing behaviors for an application. For example you might put all message translation scripts for video chat calls between a web browser and a SIP phone in one package. You would probably define a separate package for audio chat calls, and another for a sending SMSs, and another for file transfers.

    See "About Packages" for more details and "Creating Packages" for details on how to create one.

  • WebRTC Session Controller criteria - Each criteria includes information to identify a SIP or JSON message to translate, and a Groovy script to do the translation. The translation can be from SIP to JSON or JSON to SIP. For example one criteria accepts the BYE message from a SIP phone to stop a media stream, and translates it to a JSON shutdown message.

    You use one criteria for each type of message that you expect to receive during the process of setting up or tearing down the WebRTC multimedia calls that WebRTC Session Controller processes. The Groovy scripts that you create and use are where you add code to process any new or custom SIP or JSON data that your implementation requires.

    See "About Criteria" for more details on WebRTC Session Controller criteria, and "Creating Criteria" for details on creating criteria.

  • Script Library - The script library is a collection of useful groovy code and examples that you can use or reuse in any of the criteria Groovy scripts that you create.

    See "About the Groovy Scripts" for details on using the script library.

  • WebRTC Session Controller console - A Graphical User Interface (GUI) that you use to create WebRTC Session Controller applications, packages, and criteria. This GUI also contains the Script Library, and a Configuration tab that use to configure Signaling Engine and Media Engine.

    See "About the WebRTC Session Controller Console" for information about this GUI. See the WebRTC Session Controller System Administrator's Guide for information on the configuration settings.

  • Web RTC Session Controller console configuration settings - Used to set performance limits for each Signaling Controller implementation. You use these settings to balance WebRTC Session Controller capabilities with your network load and hardware capabilities. For example you use this tab to enable/disable glare handling (avoiding race conditions caused by concurrent requests), and set a maximum number of WebSocket connections.

About the WebRTC Session Controller Groovy Scripts

The WebRTC Signaling Controller Groovy scripts translate WebRTC messages between JSON messages to SIP, and also serve as extension points that you use to customize behavior during the translation. During the translation process you can:

  • Make your WebRTC-based client web applications communicate with your SIP servers and IMS core.

  • Make the client-to-SIP communication more efficient by removing unimportant messages. For example, your IMS core probably includes media servers, which send status messages that may by unimportant to a client application. You can add instructions to the Groovy scripts to remove any unnecessary messages from traffic, to save bandwidth.

  • Redirect the messages to different SIP services. For example, during a shopping session, offer a video chat with a customer representative. As the chat session is being set up, you can automatically provision the chat session with subscriber information.

  • Intercept, modify, or replace individual messages as they are being processed, within the same session. For example, you could modify or replace functionality based on the values included in the message parameters. If your message includes subscriber information, you could apply a special deal to all residents of a specific city; or shut off service to all residents of a city; or redirect suspicious messages to a quarantine area. You can make these decisions based on any information contained in the messages from your SIP servers or client application. You are only limited by the information in your JSON and SIP messages and the capabilities of the Groovy scripting language.

  • Use policy control and charging rules function (PCRF) information to affect the call or the subscriber's account. You can use policy information to affect the call either before the media stream is set up or afterward.

  • Use Media Engine data to change the call's Session Description Protocol (SDP) parameters. for example, to negotiate a codec that two web browsers support.

  • Add other features or behaviors that your implementation requires.

About Creating Client Applications Using the JavaScript API

You use the WebRTC Session Controller JavaScript API library to create multimedia applications that run on WebRTC-enabled browsers. These client applications use this API to communicate with the Signaling Engine, and Signaling Engine, in turn, translates the JSON data format to one the SIP nodes can use.

See WebRTC Session Controller Web Application Developer's Guide for details on how to use this API to create client applications.

About Translating Calls Using the Configuration API

You use the WebRTC Session Controller Configuration API, documented in the WebRTC Session Controller Configuration API Reference and WebRTC Session Controller JavaScript API Reference documents to translate call messages between the JSON data format that the client application uses, and the SIP language that your IMS core understands. It contains separate packages for:

  • Creating, sending, and receiving SIP messages

  • Creating, sending, and receiving JSON messages

  • Sending and receiving policy (Diameter Rx) messages

  • Creating and using Java Future interface objects to delay processing until computations by Media Engine or a PCRF are complete. For example you can delay establishing a media session until your PCRF confirms that the subscriber is entitled to the resources.

  • Using Media Engine to translate between WebRTC-enabled browsers and entities that do not support the same codecs. These entities can be SIP nodes, or web browsers that do not support the codec sent in the call request.

  • Administering Signaling Engine. WebRTC Session Controller API contains a configuration MBean. See WebRTC Session Controller System Administrator's Guide for details on using this MBean.

About Extending WebRTC Session Controller Using the JsonRTC Protocol

WebRTC Session Controller includes the JsonRTC WebSocket subprotocol that it uses to communicate with client applications and extend the default JavaScript capabilities. JsonRTC uses the JSON data interchange format and the MBWS subprotocol as the basis for message reliability.

If you use the WebRTC Session Controller console to create applications and packages, then you do not need to understand this protocol. However, if your implementation requires that you extend WebRTC Session Controller with new software packages, you use this protocol to do so.

You can use this protocol to change the extend the JSON and SIP data structures and add new fields and headers as necessary using the optional fields in the JsonRTC protocol. However, you must use a Groovy script to validate and use the data as necessary. WebRTC Session Controller accepts new data freely, but ignores if you do not process it in your Groovy scripts.

See "Extending WebRTC Session Controller Functionality" for guidelines for creating a custom package, and "JsonRTC Protocol Reference" for details on the WebRTC Session Controller JsonRTC Protocol.

WebRTC Session Controller Software and Protocol Conformance

WebRTC Session Controller uses the following revision levels of the software tools and protocols:

  • The JSON data format for communicating with web browsers and other HTTP nodes.

  • Session Description Protocol (SDP) RFC 4566 for communicating information about message media streams. The specification is available at the SDP specification website: http://tools.ietf.org/html/rfc4566

  • The default JDK version - 1.7.

  • The Groovy scripting engine version 2.1.3.

  • The SIP protocol RFC 3261 for building up, tearing down calls.

  • A Groovy scripting language. See this Groovy website for information and documentation:

    http://groovy.codehaus.org/JSR+223+Scripting+with+Groovy

Prerequisites for Extending WebRTC Session Controller Functionality

Before using the instructions in this guide to configure and customize your WebRTC to SIP communication, you need to know:

  • How to program in the Groovy scripting language. This Groovy website can get you started: http://groovy.codehaus.org. There are also third party tutorials and books available.

  • Details of your WebRTC client application message requirements.

  • Details of your SIP message requirements.

  • Details of any policy information that you provide to a PCRF to affect subscriber profiles or accounts, and any policy information that you intend to use to affect calls.

  • Details of the security groups that your WebLogic server uses. For details on using security roles, see the discussion on users, groups, and security roles in Oracle Fusion Middleware Securing Resources and Policies for Oracle Weblogic Server.

  • Details on the other security considerations that your network requires. See WebRTC Session Controller Security Guide for information about setting up a secure WebRTC Session Controller implementation.

PK4(9N4NPKdDOEBPS/xt_media.htmU0 Anchoring Media Sessions

6 Anchoring Media Sessions

This chapter explains how to use the Oracle Communications WebRTC Session Controller Media Engine (Media Engine) features to anchor media sessions.

About the WebRTC Session Controller Media Server

You use Media Engine to:

  • Establish communication between a WebRTC-enabled browser and a SIP/PSTN device.

  • Establish communication between two end points (WebRTC-enabled browsers, or SIP or PSTN based devices) that do not share a common codec they can use to communicate directly.

  • Enable a content service provider to forcibly anchor a call for example, to lawfully intercept it.

In the WebRTC Session Controller JsonRTC protocol, you use the WscMediaFactory interface in the oracle.wsc.feature.webrtc.template.media package to interact with Media Engine. It includes these methods:

  • createSdpOffer - Can contain the media session ID, SDP data, fromMediaConfigName, and toMediaConfigName to use, and the From and To URLs to use for communication. See "About Media Engine Sessions" for details on the supported sessions.

  • createSdpAnswer - Contains the media session ID and SDP data.

  • createReleaseRequest - Contains the media session ID to release. This method releases the media or resources currently being used by the callee.

  • isAvailable - Confirms that a Media Engine can be used. This is useful in cases where your Groovy script uses the Media Engine functionality if one is available, or does its own internal processing (attempts to connect the two client directly) if not.

See WebRTC Session Controller Configuration API Reference for details on this interface and these methods.

Figure 6-1 shows a flow of SDP data between two clients, in this case a WebRTC-enabled browser and a SIP endpoint. The two Signaling Engines may be different nodes in a clustered implementation, or they may be the same instance. This flow also shows where the processSdpOffer, processSdpAnswer, and createReleaseRequest actions occur.

Figure 6-1 Media Engine SDP Flow

Description of Figure 6-1 follows

In a typical scenario, Signaling Engine sends a createSdpOffer message to the Media Engine that includes all possible codecs that the caller supports. The Media Engine then returns modified SDP data including a list of the codecs that it supports and allows.

Further, the callee's SDP data, including a list of supported codecs, is sent from the SIP proxy to Signaling Engine in a 200/OK message, as shown in Figure 6-1. Signaling Engine then sends a createSdpAnswer to Media Engine with the list of codecs. If any codecs sent by Signaling Engine match the codecs supported by the Media Engine, the Media Engine returns the codecs it supports. Or, if Media Engine is configured to do so, it may attempt to convert the media stream to a alternate codec that the callee can use.

Once the media session has terminated, you send a createReleaseRequest message to the media server to release any resources the media server has allocated.

This code snippet from the Signaling Engine default call package, FROM_NET/INVITE/request criteria shows how to set up media anchoring:

if(Constants.ME_CONFIG_NAME_NET && sdpString!=null) {
  def sdpOffer = context.mediaFactory.createSdpOffer("1", sdpString, Constants.ME_CONFIG_NAME_NET, null, sipAddressToString(sipRequest.to), sipAddressToString(sipRequest.from));
  def ascFuture = sdpOffer.send()
  context.getTaskBuilder("processMediaResponseToSendWebMsg").withArg("ascFuture", ascFuture).withArg("webMessage",webMessage).onSuccess(ascFuture).build();
}
else{
  webMessage.send()
}

This Groovy code tests whether a Media Engine is available, and if so sends a createSdpOffer request to the Media Engine with SDP data. If no Media Engine is available sends a webMessage.

This code snippet from the Script Library shows one example of handling a reply from Media Engine:

void processMediaResponseToSendWebMsg(TemplateContext context) {
  def resp = context.taskArgs.ascFuture.get();
  def newSdp = resp.getSdp();
  def webMessage = context.taskArgs.webMessage
  if (webMessage.payload) {
    webMessage.payload.sdp = newSdp
  } else {
    webMessage.payload = [sdp : newSdp]
  }
  webMessage.send()
}

It processes the response and sends the new SDP data back to the original caller.

About Media Engine Sessions

Table 6-1 lists the supported Media Engine session types, lists their Media Engine config names, and describes how they are used.

Table 6-1 Media Engine Session Types

Session TypeConfig NameDescription

Web to Web Conditional Anchoring

web-to-web-anchor-conditional

Used when WebRTC-enabled browsers are allowed to communicate directly. If for some reason they cannot communicate directly, they can communicate through WebRTC Session Controller

Web to Web Forced Anchoring

web-to-web-anchor-anchored

Forces all media flows through Media Engine.

Web to SIP

web-to-sip

For WebRTC-enabled browser to PSTN communication. All media flows through Media Engine.

SIP to Web

sip-to-web

Used for making calls from a SIP phone/PSTN to a WebRTC client application. All media flows through Media Engine.


About Using createSdpOffer to Modify INVITE SDP Data

You use the createSdpOffer method to direct Media Engine to process SDP data sent by the calling end point. You either send SDP data with this method for Media Engine to process, or send the name of a media configuration that the node uses to determine for itself which SDP data to use. The Media Engine replies to Signaling Engine with the new or modified SDP data. Signaling Engine then uses the SDP data returned in the call's media session.

createSdpOffer includes these parameters:

  • A set of SDP data to use.

  • A media configuration name. The Media Engine uses the media configuration to select SDP data to return to the Signaling Engine. Media configuration names must be preconfigured on the Media Engine. See "About Media Engine Sessions" for details.

  • A fromURI.

  • A toURI.

You can send a session_id value with createSdpOffer to identify a specific media session. For example, createSdpAnswer requires a session_id to function.

You use the send() method from the oracle.wsc.feature.webrtc.template interface, WscMessage package to send createSdpOffer. See WebRTC Session Controller Configuration API Reference for details on send().

About Using createSdpAnswer to Process 200 Message SDP Data

A SIP 200/OK message that accepts a session invitation contains SDP data to use in that session. You use the createSdpAnswer method in a Groovy script to accept and process that SDP.

About Using createReleaseRequest to Explicitly Release Media

All media sessions are released automatically when the call terminates. You can also force Media Engine to release all media for a session immediately by sending the session ID to the createReleaseRequest method in a Groovy script.

PK9Z0U0PKdDOEBPS/preface.htm| Preface

Preface

This document describes the developer extensions for Oracle Communications WebRTC Session Controller product.

Audience

This document is intended for developers who use WebRTC Session Controller to make their SIP-based services available to users using WebRTC-enabled web browsers. WebRTC Session Controller does this by making your web-based JSON messages understandable to a SIP network, and your SIP messages understandable to JSON-based browsers and applications. This document also explains the points where the SIP to JSON translation is extendable to add new features and incorporate other features and technologies. This document further explains how to take advantage of the WebRTC Session Controller Media Engine media anchoring features, and how to incorporate WebRTC Session Controller policy (QoS) restrictions in your implementation.

Related Documents

For more information, see the following documents in the Oracle Communications WebRTC Session Controller Release 7.0 documentation set:

  • Oracle Communications WebRTC Session Controller Concepts

  • Oracle Communications WebRTC Session Controller System Administrator's Guide

  • Oracle Communications WebRTC Session Controller Security Guide

  • Oracle Communications WebRTC Session Controller Web Application Developer's Guide

  • Oracle Communications WebRTC Session Controller Configuration API Reference

  • Oracle Communications WebRTC Session Controller JavaScript API Reference

Documentation Accessibility

For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.

Access to Oracle Support

Oracle customers have access to electronic support through My Oracle Support. For information, visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing impaired.

PKN{VPKdDOEBPS/img/wsc_groovy_error.gif gGIF89aw!,!C$G*P0V/]7k?~=[EPR.LDaB|JXZHeMjRb!Wr$_g.7@'\w'a(o33330hb;P]L=XVXB0zC'jxÊb«B '632#@XC_R{H І ^ιR fHH<)_DPS2ǙH2LeVB9: =E5hsh"x"6 H&#ҙ x"B3LXBxl $؁̰dA/HzQЃ&}cb"CAUOJsC$'9un\ ͛0': Es3])3L6xl')OztCKJMj:OV%TSNU?v_SKHъcUB.U$&,؞`@,#PjH+vWo"h]YӉX ?$Q}i03tBX7RWجZ7qD_m:XT;]fO;d.%ߩUJֻZ!+Yֱ#@zU2d\pvq[ ׋̕GwU0`]_4 {ӋX:u>f4#\zhഩբ^v%>1TpFzϐG/P l<%[`eNy`&ss4ջW6L@o ^"ƫ~-L䰂͂PU(VqZ\ZeLF ZH&Uje|W}KAc 4jVܢ"H  E#Y&3/mSADmcY:zϛ] sBZe05PR'\LnD-:wPs!f.Xt;I8CuA|8}ԡ7ڭ3D;wA>ysWN[Vq)w=;0E2g{SaXۙ1Λ\~}Jz |w4jo= X@N2z;>O[q]{ory8ЏO?&@GFgşF@'?wll_pĿzs)^O.sMp~w ~7v*7w kx@-h ^,7"8G4Ĕb.W%SXZh\؅^`b8d7 4P `.Z؆npr8tXvxxz|؇"gᇆx؈h0X!!؉[Hh(؊ Plx}hXы8XxqHX،(ؘڸܨ8XxxX 8Xx؏9Yy ِ﨎(!Yyّ )"&y(*,ْ.I4Y6y8: )؎<B9DYFy(HٔNPRJ@ Z\ٕ^`b9dYf jlٖn 0tYvyY 79Yy p 9` ٗ9YyٚI tW9Yyșʹٜ‰ )͠D=Pp <|y虞깞)I Uu 1) e8U㞬y V · 0ٟZ ڡ% ) " )906 , ڜ+ +a2zHK }yP'9ʜ;*  STJb4Qz8 |" qz0 /bczʛeh5{ jZ[H ypW0PP@W0Sj}ʡ0"6>1@l02StJ W0 *4r +P>`0ਏzW0z  Jzc y @PЬX _  Яz@ _ { _9`Ȁ.G9rP@ 6-@ ؀-1 *kz;ذ*#DJzg@@ bjpp ZŊ j z0i뎙ʶh  | Q o[r +;0gJгGؐ6 j G K{J˴MO"= ,*a_{0 #{} Q0) QϠ p z "ٻ{ j};!0`H x !@ۺN;#pD0 J3 sܽ L{z @ P{)K)ưK@F H0D ;P-Y,3 10`# x0؀ op ` b\[b\#l jp0u| ƛ:XH08Sؠ6kI [ćȩZL(O| ;z z@x@ K,zoϐW0 % ċ  _ L op$sX0: 3;6K :6ټΠĚ!ɝ |еSY s 0<ЮˤVϞL#+qI frp s5g "=boy(qQiQ<Ɛ:}.8< >B=D}HFL8NRP=V}իZX\Z`b]fd}julp}nt]99vz͒x~0؄]؆}؈؊،؎ْؐ8ٖ}ٜ٘ٚٞ٠ڢ=ڤ]ڎ=d FuڀM#i{BQ۲폼 ګm X=ܭ]]} ڽݼݥ p}- ❐ ]m(G1r ୙P N #ߥ~P#0"xD2uxj.`x) ޏ "&.ppH㹝2 P ĕ}YP \`~fc C~XPYLicfh._^x]ԉZ^k nN9ߕλxMI| gxh cݷj0 ~ŲÎ.HhK >n.^L K~nߝ>8FHdpZ ޹I@~Nv gp`~~nL   ? &I0ޏpxG2>N M #z ?N T ؀ tTmfbg]ߏ>ej? Y_a?Xh^~n/4xж1.r H䡯tYܔ_[tHII /o ]f^q?/f^oNo60B^F _x ߚ 0 ~ hcIa3HAg Е &t$ ntR$UbBy ˪ز,4v…i2x[Å%RyqfƊ=lSRM>UTU^*u~Ekԥ"o@LJE-y2ʖŋ-1bc"RU`eGU[v쌫(ܤ5l6YCǐ%SZ14En j\XPRKlx¶uˬG.Zȓ] ~"lS ƞ]vݱo ֫Xd+N)msOu'EmZh)kkB @D :493Cr?9#4\ALm,TA񽐒ȢEMp$blC;3QB-A>#D2I%OƂHloȤ[uki ))Tr)KJ2< Ze qcNl̴3O=I'C<)7K$I2FI3DOH3Q%.čKSQG%5$?TА(UR2 NURG+uI \3DPE6$O+(#א֖nu[:VY"qǥLE7neݪoE w\q˥\#s[nݭj]NV`>'{;b b ʈ6-9ɏC&O]dkeɌ^hwg:h&hF:iCRi:jj:kN Ux%lF;mf[-UBm离n;oomYkG{ȥ7\{{~|{&ozw^G|}~׿5wӹNq`A3`)hQ96C!dblNbĴ:U $)z49`gܔ%DNv0jViegXTpQԣU8pR`S]ŁW1jB< *?t}ݫfzGLAcȣT!Y>0y$F LXlVH9yjnvTc{^PgG)V+Ge82^6m_V,w/ ߓdb G9X%o_ 8h\ɕl`qX0+qyaOxGPIтgXR0;<}pi+~:1Ѽh,2ݼ7 F,^S@D<,iM?nF)dδecѷu_wzյ;-dGΫ^5} A94,;/FV g9=yխ>,c@Dll ײq[gi'3z,y2}oVUP!x+^Uț@^#/*Tf5?^#(u<^ [sRh8 r nrˈ8ѥl˼™8BD-Mr<+ljdp0[9zK D;yþbU~тeWP3eg| N!ʳ:[֜'/vڻuQkD97;?ࢯ {e@A{W}񨬡-,u̿_D >ɞی#Б~\ {g8kbJƿ\:D@fC18K@k3+aqÂ>&$1ܯU@$A \ , gȁ[>@<1J@[0!A+3"lA&A&2t\q;)dA+tA%4&.?.BF062C3@-/U6t789:;<=8>@A$B4CDDTEdFtGC5|JKLMNOPQ$LRDTTUdVtWXYZ[DIl+ <_`Tg,a4ƹycTƵIetFigc$imj nGpq$g4sTǶ%uGj,y\tG`|}Tv I4ȼ9H}\_džHyLQz-ljȳIH_HȽȐdFNJ|\CdȖɲəFTG?I|ɞdaʒ,mIdhʣǟtJ2"X$ ' # 'LKJ/E">0hʬJ4˭,#0K@$'BEr˴4˸iJGxĘ(H]4lLDzL bѤ+LA-KͷL $T?K\'ȄLMDGΤIƄtJ$TI̼# 0'ͤNem}bTR3dMX״$ndeOz5R.53ThbslƐ1MѦ{,ٴ0$״QP8Rn|UYϦ̭I՜N+L\5R3کӋ֒k8`5tֳlNT@,(dβD8Aٴū T8[Gu-ImۦZ١Y+ZcJXlVlMɴM(Ӯ|O[qG(,sPݑ'uܽUmB<}@͓MܛŢpʛML _ʌWEJܛ^hSP{4ߡ4_IOE^^e_GJI f`L`l O~W II`FSTv& AC2F !&"6#F$NgP&v'(b&*+~b*-.)a3F%N5f)n7^c-9c)&?2B3>b9@nb@B6bB6D;<)cEd FINJBL+f5|=NM&e:6STVV>0PQveAfZF[/]OYe>bcFf+Ved`AY;K6isA>Ʊ 3hn*a4{4a(b;`uPgqg?nf)ցb'gdFdx Mbxhgnch\{b.gЂ@3@uga !F@@an4HFpig:>i\g']!"V3fh0*DTPsʄxhj f'{z|ʨ7Zs( (^ӱֽԳ0h+b-xFjniiFlca;PP;2;g$@k@؁);plTgk^$hmm@wfFr6ma&wm6m+$p8`ʺ,mxPc+裰#2Wn-bFS9dP+Fobf*3f ;6ՂFXi -@FH-l4X!0n03 3gqxpnFFlk8$ oa;h;e*hkkxn?^n6.=ӣ[2kVZ ˰,7oz1d+ï0/b#>  @ ngp@!hg4v^@Dk?qKi2F>e-L1H'( HFnޖFku4$7u)O8$b*vK6/=?47=6߳僵8oZNlM[MMVV'gRGRTwGn-\ufN9Y v x,1oboK_ofs ^txfqF$Pu}bsgvgw&wF oFVqp(!_g@0nk;8opׁ'z{#$Gl4q.16=S'S|ѻckS3:+̿?lymgzksFgVgyqށ:H7d*mnFʶzS;}vwMF؆;2Jnw;8gq}xNp!hv~~Fn|/.|G6[!eF,h „ 2l03U&R67""6UF,i$JX-2gRJi&Μ:wB9ФJ>[)ԤMzj*éXr'H9nhϴ#𐃘ڸrU bPz^ .PĊޭx1#َ+k2̚K6WТ"mԟ;O|YYʛgӮmd缪w,۴ߢ /UbXב"9ҧSn:ڷs}:rǓ/o<׳o=w UZy%Yj9Rr!eR9& R%i&uY7T&uyfy'[dMh'Bg*(N*XzV(z\'  :&*dsa$8E -HQM59GbC#AêՎjjZ k-#I!TO5GsZr/mYrx!BS 񁹩1!<2%|2)2-21<35|39l'$S_SVCJO4UYk5]{5a=6e}6i6m3=7}7CeLqzI8L] O>Z=}9k9{9ǍNzͷF:?+8[,)ڐ~8 ;SKN9X:+<;<Ϥd:)6밁L  ŋЛ>髿8>P?_u:|G'@3a}< @>| #(y-B#8ڂf *C(j S{S߶?Z4!sm[ ("F<"uCb>N|"!NPV"-r^"(1f<#Ө5n|DlHB=~# )A<$"E2# [g:1$&3ɾ9ʆA&C)Qlċ'?YU$bHT"镶%.-yJF%0)2$0e::~iRfs&4fmr/$MIӛ<29N|-չN g(9O ͨG`X69g`@5 kX>#*QER{ܧ@ ` h*47cp !П1t.}ir*gbtBʂ(1k !ah@tPzT$`"-8B "6B:\# =Bz!82#.gM%^E/* `8+|SJx`)E䠤ؐI7PlUd2<Yu+j ׸BHCmA6 rm9]r!C"B ߎA!-EA2\F/pQ۟6pJ[suNӉ؀-m3x^bc -a h[]6EFv{ӻߵa,|`FxF)&SlB&+h@ Ȃf_$R x>0m3_3SPy;%Q:LީWk`aHHvj#u1yco&np/bA!YXv,j̙13<=2Dl9k3G c0ю~4#-ISzҀe9Zω4)]QԤtLiNn6>4cDQֶ.5A"Vղ%i}aѹgkW4]Daڶ>d:e̦ÝCj[ܣ6mnk&n=BrޑF7FDvy~7Ho{5yo:OE4zI('a\ۚN8%@&L`CD|1Ӫ!69,2~ 66.L%Ǿc$796}؊_ 0_w% ȟp$@ L% `j"C$#B0VL*_a evR 8]MQZBi*\8/P*A^^$VBm }]]#$)rÀ%@_1A@H؜8@pAXB%8֡vd!a%@a>"$uA#!L>bN6t':"\+bU6a8@ "B"+!(b+b'Vb NCƹ&(BBPB]\J7"P1PAcy]eū!4A"$n`=\@\=c>bC?bC(*" dA]- bC%0 Qd 4dE$]q˽H\Eb,؜u$E4,=d>dFI¤L.Hp nMAc/Z:? e@ \,O%[.dC>MD]ޥ,%F&fI2$ pɹ\ae6XXBC^vde&PP[dg:bR]hΤq -ʜ2Z&A]1BƝ鹂7vUt18RUz%[XeO%$,. eG%6!&mzΑ#E& ˕N&|^M  zE.&*|*l+R#L."w~y(J(1hEt!HD%%Ti"(%Pr76! dAٞ&tXua"W ._-C]}]bLD:g.iC$-B)ELTixK^@ 1\)6) ` ]! ~&))VV)N钖aRi)!j2&M}ti*YZ %ށ(2#R:^**ejZP Y{M S l@Xa\՝j*L'HYBQhV(|)Eۮ*Ybj ^=+^~ VkJ+hv]k멥k8#ڄ^Nk`kIt.,6>,FNl@,t~,ȆȎ,ɖɞ j,Ï*\,֬,,,--&.-6ЪŪ*/l^-fn-v~-؆-.*-ڞm*,N-՞̊---Ҧ08 Z-A*m-N.V^.,E<8n8J>nFN&,3LB&l1PC3]̚.1ܭf^/z-炮V醅­̪֭/,%(3\C/m1d5,%L5<+lp35p6pN0WnHt~o6>.֬&P͖0fA1RhA1o^50 l fl;0# Ͷ 0.( o0SBqU1bp~-x5/ԲlƢ..> ,p1`?p^+3L5^/.jl1"" p?o%$G1 ? 5A#o3q)?#//0&1-r)qqWʂ0l)(3^r^/^.o4K3뮎Ҟ3s/"ӯ,vsf3*˲; *<92?3-@B/ñF1>(p?tΪ0$/;74/66833&H3>KBIq~E3<B_$`E_uV44kF"0cs#_Cv2KcUc342*o<5u]? 44_Oak-.ă/u&RSFR6Vϰ5to {v3"% / 7/40+0v/9W4sg_q&hiw1/p̒66tGw2ằA{0B{kR-C+ztk-J7ywRwnpc03yx7}7Ѣu;FvB۷8O.~[/g[{{x?8G8צ-Wxt&{/K8w_p143$x!uR8̂A~k4*Bi,?VSr)$5o8 r, 28,gp~ϸ3/uj/s^%{ަ5V'f-+LβJ4yx#w8wWq6/Ӭ˲ ðFnm/`q:JK1.Uv㯦S1ʬ?'2'B1 OBl4 㹱kҸ>6d]kB_7)y1]q*BBFkJ6,*3#w2%4fl{NBr#K S+`1.Ur{42.r+S3P3K0.?LE|u;s/E_gyw8M\7pxˏɷʳAϏޛ:}VtCN/۟'1a f_=c|o|{vG{_Z"K0oo]_Mg*;kf>`/J4̏}"}Gc1#78'2oq:9N;i6>v?/ |IpWz= vrr?@dvȜ!H@;S G\qKV5LĖ OD&VTʿ.rǑ'WymY0nݻ{Ńr>|y-80ۈu/F{}*>} пfͽko,) 1d rک'/1? ID2Fd ΨQI0;,HsƔ lDLDPRKTIȏ¢2?U~4h 4] &8Gr4'- mrq,Ь GAT!ΠȕzIG!3SMYt@ZFSeT(iGo2X]{WS%oԴEbK5b mՈ#=향 0@CMD;":]W|M7xwV?ߌ>"M❷^7 W_V7$L܅55 6ђzB":,|MZ&k-&wY)M齆:bK\|&qD4smzKvU^:Z-XҚNأ V^{!Tgx cW4@V~;j6[b2)]$M<!DJuͳmǼNkX 2p?П?U 7lXYt#ɋ<7ιo߭Y=FW޷ wRa2Y>gH 0U{:r2laɋ Ed!ϤkTj5;OZ5E<qIВg&;k@MP&2Y5XgְZղc} EIjaZUmKnvZm1*zqE544̯lCPFWNV5W4{̃0NDFܗH>ZH}ާDݹlaaJS3=CSE\P ]1c4x4T腇_7C &MU3x&aIkrc\&_,~e`xc`uУDcW1 wDژLW y% 8^N,)qa7e ƠۿVIz^48.'Č3sݛ_1iӀRƤwdFNFm{y^\5ĥ%&4n0[ է.6k\w ^+pj<x#H;ʎVv .#tG1F4 GEGDˁLn?aʾ. m1%.ܤBE= vj~^ MB/WB+Ԗ<>Bh(3<8r>^)s<0=[yk7i3LW7='|e ,N ߧ;4 l5bJ]_ѯ&UT^Mt׸9[jmPaL=VvVe/^y_űYŽRma˵ۣ%m5Ԛ w&6k?Vӵ^Q_v?liڵbY <3\0ܔcVD׳bzi1h3Y8CP1-S| 3̙4kڼ3Ν<{ 4СDm6lҥL5* A8R6رd˚=6ڵlۺ}KVUW/9CA2TE95\d(*8r䗆+f&2~<.^5^ [4ٴk۾;I6}:լW^̛;V.yVy]ܻ{>'dVJHKne^٤oOB%VS:xej>Phӛq1S1}UJNr L5I$T]v?=sG MBg?5ىjA1sHrJZӟw%ZKm5 "4ZR_zka\z$6>VB)+?Q{QL>*NZAj+ D"^L" &(K'LB5l¨+nL~.[+d+PupIO&Lp=2"\ZGc݅A Wsdpį|%%s~ߠZj1)̋A@ֺbR#V Hw~Zs/!QdPg1Ľ XGwyvfMEe_3l TKZ wi0;j߄+G.y$jIܽRLgcG G IVj|~|$.ѱIh $PjĐ+tHHb|O_C#&Z'3J0@+htkՂ?eAҧMLiC4Q\k_! DP" I@O}C4=i%tP8;v vr4A홦x2 0]\&<^ 2Ea;pL5 @7*<%Hj=%*h+1~*oI ^A&D`HgtxFyTM4IQ(Ȼ a)QNk%%cG2kq_`* d0F&?, bLzIIrX]dv'1 /6D1D@,3H[#*D2R!t@و @ q_#NJX1OS0H>+GcuqgH rr|>"O`t4ilgG,FKԙ{ 49U{1Pt)7M0%>x9}ӊSES#T^N󈑅LPa!Qn$*)2O|yajRӥ5i_^R9n'c8>ГF:[hۗWU`Iu\ ZQn$գXBk%R5**4IfxږC+InKe;H՝7Χ*7EQUʞv%4 4Rze];h0\4~p$WkLb&x *Qh.FeuE^Pp*]D^`I%5oZlI$LDe2н3/vM;F ٙAbgZEX 5")wAgjrL!h21ܨK5:,ky\2$>QPc8 6;ԫ/,s8|gpTI=nM1 >J~3'+q2xYxLz)? PZ&tág>{w"_OzִJmJ_na .5kJҫ^hl:ǮR!vvl9Җt[(G pw s{wLp @5܅dİj/uLX1<|ԣ.q@`_;X~=J]0>W̮ mBT ꨵdPT6)'jAd$HH,PLZ+]I0ZYr t|oQ.}FN̤*B.YjFmC06KZNv@0(,5+s:/XLxW2>MS4!'?$#36P)FwxVu-X$e &y$~uRS6()RP\`0~nzj& ?." '8fw4TyAv FgLRD @CH% Y^"GJfٰVM-y͝lGmؼXUYnvG5`N ª nX$)5hRWr@˔ͮvkbiy )pۑr}܍|G'MwKVΡK[ T 'R I 羦b-[7 r ~W&8jG^8@@4 8$IFl &(pњXd"IhH\F0OH Pcb eѫkjTZ̠Aۊc!y eP$yu+p W:y yp|f!yB]*P$fE`9gVE<}>1#HT5Жdӂdӟ]B>M&d,'7H;+Z95X~.8u(92scSWzI|}j ].t`^ɹq 5W?d Srˉ>ƚTYzY Ok!j91 t)6 (*& &0f)!+^ٶ.1OyT ü;x.S`cm\#,-ͭb/:ebM+uo )zk`jo0WsZ[ćNvٌǬ].XIKp DKX7P[U,"Y ϺBKMLG坐r#o8bE\0`Z'-ho]j5uem ^0=yᯎzv|wdBqřARsS@᪑ ^Oӆu }WI˛hP=f_ߖxs%ƽ%S')y@|qj(}m T%zWu6lgrY,ާ:ud8Sz^bvUtʅf7"C-c81L2a%U#\6/$4Βie`ƃ*1{cI=&WeX&&0/Z3%h,C EfgYXP4b-z]m8(W7`4I2lj^Ȇ 6n!.!2I6?71|`@ч 1qK2P#!1؊8,m.dvEZ Pቯ8H"w!ri}Å  !xؘ.,"J$H9R_!2#e+9,`%^uf>Xf3T8`-ԏq8;-ddoeQ @b.ّ Pafyp% *)۫V ":|3bHbG/ڳP9JV[ r27PY0f)GH-jFs:f p{'_f\b*ޚ Rnrv4 [":L Xa5T1|.S\* -wyۥP )%&9BbB3?)i,M9븱m5G[Rݻ#NKQG&:*>f,{)m28a D__ek%V;>7I:  Ȓn2)Hsji*+jIv C%AX6&i\f(&R$t* %0ʍ U#R #q1"cq)H )"P$)P.Ȩ"`;µbZ F%;«x ;Gls=T%hT%hGӪKQ0=QJ+z Uwl٤ ~\:!S΢ld+ubv&۟u~Rg(ڙ)0vj%Eܬz#`(P `p]'`6̏F yUIOݦLpPjGIОGXIvW魜YSy p%=ٷ ϢPzmgUTBC-ng-DD1˂ʍ#+iEʭ(PmHK2"֩#֜7)mu:Tkjp )'°+Z«+ㅾ |b.@ ^,:? 4#o2l> aE'YFKj巉v*QV>b?dC$ R !Ds.>Yq%"jj >˧Ǯ ^lVg&#$|ilӲ~ёl1C 0ֹ2߬93aW49vvE #4ݎ߮b)v*lD" G%[b̪c3@xbC1ICpQH4 8Xl%F(r05@|`Bea^sZ4g:@Zj֭P0 *rp ! UIrR01FY<aL~\~m{>8ax-&aGOFH@춃(L. .(G(N::db!>(ķ䪫 ?FG+vG2d , lI ,@nA Fj3B:;d ':ᆬ$:Ar͞:Ƃ 6˜2kjʏdG2,@IF1!F' Q?(ʄ95VH nV" ,"hSY( >cs`+LY}v jf;B%WWE x }x @2,(vtje6<G 6Vl˝h_qŘ&B͸c 648*6RВ! !\sƆC{8f f9OygAhp i @ii,pZjgA8ȌhM{&і9hoI_~a$xpƠ )iQ 肉 cƻS-n;.=ycӅ B6BɁ@O>@rG?}059NV2x_6P6!!x UNoG+^.9$e~~q@23! p@e:d}]I7TG85BH X&6ADJKHx:wUCm,I5G2!eU$)C▆3ICӢ8"~eL`B6qx"A@<`Y%JBFh},f$<,6X%9I%!+Ku6Lґ#HDe*UJVҕ%,PcogQ'I9>BX6I2Lf6әτf4i̞,!i?0),!(9Nrs' ͹Nv 29OzӞt N~L6پ]  #[\ @ hD%:QVԢhF5QQ38hC7JԤ'h)޸/iLe:S45iN_j.)J:TfTh7L<9UVUTف_e&V$c$VVFSIm"T-=Qk[ Vrjվ q6V*x+\g x {3AE`mhE;ZҖִEmjG V#8e\ZVf)˪Cַnmq+Yy%,،kr @ebÞR1[tƶ!`A`sfCA*wki/R,wy[C@ + nXG@Y(;xGpݝC }Ubh'!`@CŒ[`#rca!C A 1(` A7{'3$T N$+_s3Imrbf4KNʯu}>czdfH'D.~"|אzAb'$L֞t "o}e5.a9П,&1.SrQ21P@i8G[(}ѳG3`<@ p ; >0x! m(I8@پpx80< \P@:˺%;Tc?Ƞ @?8)8 *<;lǐ1܊nA0ϓ귗S4V NBX Y4! ]$]dӿIIX ˈ<2̈́M`L*t)ʏ)h h I|趀ُHܬA(D-֫ ܴ@OXNtEPI50ŰB`DX.ΣPZnĽ{|NINDPծkQZx7Sρ` ]; g VRS>QXcUɑsI)bǭX;[ ؊b @;``  !X0 -UrJT h@ bI4t]eH1isٴ*=zsYR1٣P:V<@ j}܊Z05Ma5u،`e^CmS;/ǣ@ MƚWݡ^DߕS_b_߳H\;ݮ>NX́ ]~`  2 F@W`N 2baTMU~.[5F @M8aad69aP Θ=Zƹ t`6_Bk>< :Y:0(~ )&7+ O|YebPP 6v4 ;:EqhpP#A&d +`{ ܤݬAɫWd]  H}=SeЀ!M6J"97WA&ff ]{@_fXQ,mfT(п=i#Q,9FحNdq?WνN&`rTNUe|e=_nee^[/pARaq`Þ?uؼi(ҤJ2m)ԣ4Dj*֬QjEZeװI=x[٫8\X56@k!ѕ:0>x0BM{5{A# .˂P T g<eŜ [4ԩѪnYK5ڪqxPAEA(.(qRo`XPMP#nкkWmD`6xG*>}#"@vu' 8 xRYUGzPU JR#|!8"%ޤaT!@Ha `[ XC&#=h 0$Ey W.ބ$QFSŸ$'H'( ?9&X&8Lm&p2%Q''}ƩOt:'mvP`h:B:Q%,NV. ǖRz*陚ԇi'kW*EO説j_+BHkA^,RV^h:,V5>ڠٱ^!G9K -Bd*nT4.{b}!{0:pVByDvA2|1b墼s<2% .>2|21f\% !x0 %5BGi Ш: G%-MEtT͐-DaXX GL.x@kR9WS0YP2!eYFՂ-U8SBRH&m%,d2n6ڧ͂oVT7Qxf/&8FPeEn]OpհD 4e:MtC|A:mcz{nS!@ CR.8MLW@}@4 Kp&z Hp Ay#/A6A`Bs4L`2)N&i|:A+}m`LAJ`5$'`RPHG'ȡsѯM.1G3Y!)Mkyě{Ctm=U|ůNqdZRGw0Ԅ)cJְ,u™3߇wAq_5aK _!AVfD @D_MXTN  Uă( H [G\Ѹ P FNPMJt;- & 2  > LP @a Ѥ OQ9an`Yޯ@XUMM܍hOapJ6%GLh]5 tNL1"&J#@_Z呉&b̌br"mΛ ")2)!*Z%bb""(֢-:.:.1J/f 3N0J#4_3&3&\4v4*5~X#8,!5#:xbRlM$:<;BȞL"> 9"#@nb@$B&B.$C*$ x# b@?VQnd8@0>.G׭O+Che#FW̉DS\@F1$)}0M$R 6ERpAXRTXĺ9A%ET6bq K$AK. % }MT `Q ]U4DDR\Re^UBEPS\%V,[\PԀl@5UGL@dOT_O V9ϢiAe4YA`ZbL@hZa@ikS^&YR$V,ILnʒ(UDQ(\^f ,HRI1FyKTg`aM[vǥRaO|A'% B(HCP(QXIjrhz腂hɆh臢hI@8@@G菶h 鐼hb(K $D0bR\BέD^+)KJT`u~RTN0RtK W\&8]@I@@Q jj 2&@,4jFN*j*^*fnJO@X,@4ꭎ*~j*j[.@v* 0N65u-͖%BYGƓ1F]UuR0Qaq@mr0@\ds tG hT^[\9 A^E@DnDdiy+i+6@JZ^\ffE | P,QZBXUYqE@bU]%MUD]EQ * I)ySf7*E7ZlATWDІ0Q\(r HJHt yd!) 隮d@!bלaV!.jD PnRq Z^,X8oSVo߰Z̃f w~↊YH⸩A$H|oưB/6ʙ/lqp/ FX@aXDVE dD+HDLNrÆ (@l|piXiB '-Qpz@], jYXmD7pzx/R8 U\@d _6ūQkK0Dmm'jqZVȕZXe~oL`RYiZS 2ǫR]aSKWPTg1ƶXaKEV 1SDSV%]RΎu[ $CxX$ ]I % @`?DA5F$lOGvaa]A@@V8 lU  X"RײyҬzJEUzw{^ k{z{DžFq ;7\pPp3sj02S SD dr]_i9MټuM͎bqa-א_DFd}c0XlHe&NJ8 0 s֪᱀OkTU$0R49hПt0|8@[ 3X Tړ7W#Ś'-ո6 01ygi3Hš?6 z5БŦ7*xv/ŧ{*2g: >!S˫Gt JC$::ˬ70#`QSʩ'E#Hĵ/O; \wRb7"ȶĸϹ; /.A@QWksMzxǻK% z M;(@0KK@xCLdG[ pH4ÀR@ȏ|ɟ|{C Hc{ɯ-XG=@aZw̜(\T}}мקb l# &4=tݫ@շ}# }p<0~xҐET0&AF#g@s v=t~[E4`c$~ @0'J_>V d&uc=Hh\WGSx8&:QG $zHS?:Z@ 3>E6:?kTS@1`A8XA#8Q/#A;F@pDCSh# CfM7qԹgO?,q!hQ6H"GF5HR:Y@"Aˍh|'(y1g.`1aBĆ3!3{:paÇ1ΤK>m<9$U;;.C *ߪ%xC4LQZ0f5G7=!9< crkeZ)g׾ݹ?fz)S\ͩ@].5nq3`6c/ҡ.誠kKF80/885L+ڂ`ZO @@s 4q/2CO=!M "2ʁxƻr낙, `Bm& A6n0ЭSOn+ E3-,G!t%G$T*!w` ݈®?S(:DT$Pm֮>p->-fdS`\599kA6 WmUMVRJ-R(Nu4;E%>SK$?YX͵UKVc!6^zCa X%4d0.U9iW^q9x;n=ۂ 'rsk6ceVL=M N ^i}8|=s;ue.RQ,b%Z?qS:lNy3ApnT3.(n/nV\9Kj(Xj(Q;3(/Hڦs e x#nє\_w] E2Zr)65֪U1&+i8TH˜‰/~R M閶Y兯9p-L3cFhtLIx) 6ZB'7A7b*3 ­ " E2#h${v͆,4qFDEσȓ,?5|UUҳ :a ]ؑbb#r-,H[]8`7R1FzZ (t ъF-{'{:XZ(D&N(Ǎ4EyYH3Fz#KleEia kkC5$0Ӷ(JpMjrD aKYd"x#%o3 3\$I[|*5%OrS Oi@12KqdQ)^V)ɇ &aP.xMKP ֜e6mR)&4p QdϙɁ@BAƲ&d9ZGZo8cF@KZʋAeP@2Q5]r2 kAj M EHG9*un՛G9xR @@XAu5[EX',Ȁ `]XlUz%_mUl+Dǚg n6iQ1DJ]Hg0-J¤D>Rs$wX65nVK^! 0KSW%N J-.b{\<ɍH^M@#>tQjdbi[t7q@mPtmox;K^/Gա>42 `Qݧk`KK]p];c%`KQ`*"D70Hz"O Z/평ƫ &4}&Zc k!Ex$$\ 9TusGl̑ 5aξٚΰu T$AWd".uv |1j!MB;oy4L\H6@:rOu!СiN˞H$kr2ek Fǫ1ξ1 mmUf]l@`s&I3LuBV||6Pl eݝ"#@X|cv#J[ jX;zp$b]p :xybx>M8@*]f_›εA|یb hPҗ)мxΆ8?7{X.p шT;3gi\(I[=B0@TF8P@i@gYr`VQ{&fkd3v/dKm>tcύCdcc;gA$#^l_j36 mgdUqz^w}FLi{#4&P% qƇ#/C'F I " @2 CEɻBD8Ԉpi/>Dv.",m¥&$nr&VZFV/%bFpeF+˞2."0 ')LM&$P%Hi)V]dliK .B!mE\bLp+:d 1 P^n *S`sl#ORkB7P4"l+ bB!/ELV (6tGzƋ$l$m8IY0jސx0CBFe6QjEchvh@jC4#H/J_ErOJuCjctGb,NK|,-V_[bdllpIrbTErdFv^G6"v.-( 6BEcEJb$:'@\%/h$ve͌ 1C&MF׊HtId+ifI$/$Qm$@:X)L8_>j84c.^߂1vQx6XЪrb%|D2dHcL2dt=""8j!^ T >YvĨBQ2.B`GQdMd脆Wr%9feVDŽ$"{`%J>z,꺒lcctx"4Rs3p@C$ek@ˈ#of6Ť2QVb?>j D1|LȐ.lOW339&4;Fq'TfцoܰJ+r"r>GIF89afp,f  8<$$$(((000 444888<<'<:֙2^89zѫO^}]޹VWgBG[5retah0hU݆iy8"v(u$bt-U|\"* ,@@lF)m1h<A.@U,UT8֧#M:T $P Ж4,ҖIu[J$ ) SeP[9U~ٜskj@_A[4g@0y^{Q@@[ DH谤N@Il.I4P@PE㋃*ѠA[n -i# PSFAۂzZZ%- A4캀fV48z!7 kPZ4*.yo|*FVƏm.~ʪ@k) MqvE0o4L&Cl鶵X VjLCj:a,'#$nլD&s@)t1}yv\u|QX&x9ca8T҆C+h$X[ (S {@j)UZȴ͇]2!0oylATF5InwCH/ڃk3,M_2Q!1`kR6iʲ܈ȑ-LIUIZҪ6K}AbDj3]8 㙐s 2֐%Q.Y'$Mp XR% j֬ V)Ff'%qQc$W>6ꏸCԄ`ivYr jTAlQJ9 bbR* EF*$."}cRՒ5O͡Bt0`R )ɤD&w- TkJka B*mȥPjG3-IjTHc-ͻ-I~E!TyD+O~8+'TK gjqnz Mdsci9,`\[w7kJ<̩-ajB[!Ni迾nV2kS5XҠ=˽lj2;}RJZf%9 djR ÔÅ!pRqiLddo4ܑX1f.vzM1NcY^'Ya\7?Cef0m׵;|h.mҗ*AyXE& d!ĩ[2pZi]K{LSDjc[jH[,_Fݤ+Sٖ5i2<5+dM+]&wV!tʫN Cۖ=zV˸y1|h}u/m3}׆u18un. kuxO!NpLwŕX_P1ۏIV^;|98ms7]tDk&U2-]zQ94J6>?!ynfq^HYp*Qw*`[hϻ0}[x򧇹Tr 뫹wjhG ; I kY|; r , ܮrdrTOl!UJ+cXw=;+em&BI,qa'c@ˊc@05<>L%߂;{K,d&((#+^\,ŐD"|\$$bN&*p 8:*m|gRèV0s,_|&JDDzH~rgAF-A%G'ēEB+C6R{kzF0AT'FNv;V ˨R|W ,aI P ˆ/@U BQ(ܱ F9L~Hɞ Uh9\nk-}RIa#Ҙ$M\' ̷A#wB2lɸdTdFRNV<;e-g˸2is44'WB%aS\]JEYcȩQ7@H72T?4#;y2k}$Nl-(0}uYio1dh @4C}=y-),4A-v:"Ew$/}'lׅ}*6*#!W!RSrڧc t+ںQ7L3DBȬ-NƆM$h486ҡҺC )#O|؉90e&I|w))-t9R'JR4A(9mӐB6gVEIeMGe ݝ}m!+ -<P+ J+M/9kR m)heX<+^&}*l7( :RBPjwF#sd.,>|ܬ(>y+\*{5@$Vnr46]~N끞DPDL)Hd{PË́ĤR YG@ݮ?o#,tNRȎ?!B|&E~Rqg#HvB`=M%'dLESQ6J S\$UNrbP:)xñk@qgn '(l]$Y*%--1ZT-4ZF(4=o\0!"Y+jdݭ?<60Ι} Jv/@Q(!*M,>zCNhEZѕf{r>- ][2["6{F@THEUĂ/U 4( Q"E DRJ\SL5męSK=} gPf8–-IB hLE#H4MAVAF3EVڠgپ ׭2:M#?F]ЂS '-8dʕqJYJenx !A>` uC4GѠΌynquygٽ1З˝?7nsJ:xcr1Pzݿ_|`^xt ?30TĮcpB pB |!*0D@8ɪXDHTȚsAcE[rԱ{ qH4RA$$jI&G'*dJ,r˚ 00J2}3L TqL6Sr38-M:њ&$|*ZZzvErE_B3NS:7\s^2cˈ9138В#>Yp@d4cE1?{d(2l.Li[$%7IOR&e'_A+9Wpt@o!@Д>Qf+ jbABWDS'm$Q*+pD=&d5myn^;%*}A/0)Ґ`$He228?UˮD寞cqJ8 W>aOZVR"Kg¥9yiV (%JLZi̩j+ii}ϘGVH>iNt`{r`"X\MV:}-|Ok'#_)R3?ۥ|(@S`8 UJ C6qZ,Y3тYbXpLZS%k4MIV39ה|ˣbmBx# ImsUKeŴ>q;%I&SlAւ-`"i {SS:jԎ'ƪuVNxck[%* ^tbRjO;9LRڭ̝zXCeU :Z 0 HQit0km^w vℰt ۢhx& *~KakX5! TC#~o) EV9TY/qvY\8@ף)o `PB`@a3g>?M_!H5aDh!,ݥ)9 ; /T K4[ APZ™N%KYʺiOj:QpYVcՂ\;sEӄUG16Zu2͖e5pE4p6R"FqEo۷wi3[3ףjC(0nriGzj/ ٷi/X56ۦam\U=J~io1QZD0+D𩊌fO>M}=,Q<ՆSe[bjDwp jZ`& ~# -Ȱp5F? j@Mj ?'J0k ! p+yXj?@?X̼XсAq{b b¾㣷3 ۀyB좟ٿR’X={4,L/3 4( 1܉-A䳘π>7T4SC!C#<B;TÝDTEdFtGt@#4>I\ؼJD-$Os(AS"Ȳ|顲PI BȆ|H() h8C1@smw f{dd[ xJ (G`\񋿡 *Y:\ K,Ij)`Iht-K[KM̅1e%SLcXMɜL`kҎ KSq|dL˪ s{17ˊ`LHTVbKN߰3ʤTɊX\NJ,686\J/\Z)IY\Oh NqKGZ * Iۄ +$ mM\V -XR(LO1 qH*) -Ejs;91q'()*AY%%@:/CRJB]6/5>4!@$D=4ŎAL657=#@!%B5CEDEDnR=E>.r '`+MNOT!>7TE2HT9AX"6-UXEUJ=R}T>U,sU찂0eIVeDoEV/eq c-/V?0Tj-<q,6;8YI%'0-Sm ݲ:7n<}T5W.uTnUM޺# `=:Œ=`HRW0 HdE̪~\b90x;<=>?cD:CFDNdAnb,-)&PII%F/ؽUMތNE"MedOVeSnUTv4eR+JeZPnR&Me_>cYeVWSYFU^ӌтjւ.2 kfЂgqcaÜpp 0g8 *8(hЂ8stG Ђ0g*p"hp tXXVi4h4g4h8xww%iFX&{悠hHꁸ>iV`iat_ir蚮(hjpFmhF2`mh}@"@"gFŶig~nX.8h.fi4hNh>>%l~ꢖy.mǞ眶A:^^H&Ԇlgkg>"v~gow^hkjl엾&h&njno6g(.go4ivha[oghhihpj4o*jo^o gjpf^0X^rlq('nɶ/'1rrpfVg`.3H F1x]sg.ssѕse>!Dt4t(f{;3IJKLMNOuJD'8G?9{pWXYZ[\] uR (5n}I_/hto.HdtTfie_d/@ nak7"/6o_f]fSuHw-tvagbw- ~0s1rwB^wx ւ! grX膮hqGxjGc.ks^-篆/zgn^>lv jo nwpxkol΁&ȁ z{'r5'ybn^FVkvNꏮ{k&{FN gpy7y-0m>陗nhWF lkggj~}gǼ_'yN(g>~/>'.jg|'􅇜9y>g&~ҖhnnĮ2颟j΁'4C 2l 'Rh"ƌ!j#H5pI-h@ď.\9,D08O3(΄?~OEha*AXx0dǑ`ǒ-KVٴj>]]Yd.ށ7@07֙ ]I71A-] \pįlYG,4h45lװgu*YZ_DėgFZ8K>pq [5bvڛPi=ӯo>7y*Tq@ gB : J8!Zx!jؠ W "sQzXwy#X'7cn-"#m8EΖɦb Q.bhS~V%Tng`eyfokYoqwdft4 @E'[|9VTrN A$!4$*Upsi)$ՊNꇮk뭻DZ;R,pVa $lpJ^'t-\[*DƎniohE~@_F JꮲEYː6< $ N +$zpm. =,-e\@+벯)kTrɬ X`3#іQ8=4=3\@+Yk5]{5a=6`Aio}m[ Rw\ `y7}7 >8^+ηmr+EIO4FB8N;LѠ/E18yˢKIE ~3{noNQ\]O{E|ϹƋ̓)}gDgC+GG)~=i<+ ; ~C+i~F0B|e"R ,(*$i@ؐF4XP -.V R
B 0g"dYE‰,#'L@jB PS3 57$|Qi! ) a- ֕ULpmuL%Rċ )\R@lUAα^w#@(mhEC4蠑 IkcB',V:X@8+*r ɨ @IRH?ˀhx4?GFR32B D) 1;ӎ+@h&vN5l:{ĶJ$2h)qBPD#*QqD(0Z uUEő&[,J+SNG!Y'mRRچi`CS ">e]PGu)9++Ҁ FNxʽVdьAA 2D T*UG- > T/8 biNn|_ Dicc(1~JpR:UMuym"'l\\%Y6RCRsE7#c-qECz[<8 C!bdn rY묷: -R  [e=YzoP*ThkKY#$]6|R{6قxS(lvT<$)Mx tTD )s.s L*>L4lZz·[&5 DB49ns pnYI]V.SAY]J3f&9$X 0'WFsW$$A"ˊ'TfI:Wե;WqQzPL4CLKuġ.p\3Ҹi9OZѿ@ ֮z>n lN־6iulCTYh:n'=7ӭn n$=kuΊ`+fhF,C@QɚAVy=:[[ o%|I^?(':3kqa3k>^g.qLcFS EAafNscf"*51Rd +GrKɁI$$h(I>`tOzE~ND9h:YlR XzAN} 0v/Dg5y>ѕw` Z >'9p掆ğ g7Oby@~/Si?_w4`'K|rӃ!W ]ѯR/TJZR.&B{|7㷆Aov ӕPW{Kk<򍹻@0]߉^KL]AM_K _WDip9_^)rϵ7} ١Nȝ@ԀMN۩]]ITPfm]JDKDL̄ OP$^ΟS@ 9DF\Յ_aD_Ed$aaPic8bB bYA`($)5\@ >(nh)~b* H+E()40#1ㅌh l,>[-T4N#5V5އ$c X(N(>yZ zԀF7VV A#; #A<8\@?~>PAU#[B25 dw<$[$X$]] \_ \GxbCPL$^.DiSt$>!YFF^F@$]E]C`PXKdDRE OR:kj~ZGxk䘱MEZBZE"+sXΣIQVkO!Lʿtը(S ժWĐ DtIPP]ZL슱̫@LYP dоL> YllDg՗k ЊlE"[, D -,l fmj:cxF<DʒRl*$eYJW66úѮAJؐx 렘-lN$iJeB>+qk[< Bpn1.|nx۽,9/ nܿ9M٤Vh[.*ڊd*-mBDU*~nJ WTAW*n.sLt ~ ` FT/(+@- ٮϩʼBe*|>- FXpLod v0 wp˔ ϵrZLD3KFp r`LhqqǭW;PxXq;q@k D p oɫm/ 7$zO Ǭg [& {FNٓi^] f&m2 $)*THA(zTptmg!o$GfN^U0F`bpZ11r23k6Cr%qu3r34K 5<:Hs<3qXsr6)2j?738?3< cn[-t|CF@;PKi\>W>PKdD!OEBPS/img/wsc_asc_flow_detail.gifGGIF89a0p,0  $$$(((,,,000444888<<< y$$i,,L88P88@@@DDD$$HHH00LLL00PPP88$$}@@ ((UUU$$yHHYYY((mUU00eYY]]]a]]00aaaeee88<*I=IJUTgԩXʰׯKز8Ϣ]ku,[jʅ6mݹsp߿ LÈL1E+'ڴx!Ko5O t%Xzm\ƭZХKаc]vܺM:W1 jYןw3pfiQŽE\?8l.x)RN֩E! E R6!`^~jJa` +ń&=`ӭٓӯQ-|>-{w2@=+F2tAJ+ XLk-N~Ws1vNgfذYDBXˀFDXpS9MF!TDhsN=kLAStC1NcܯղbDM7 D=/ŜSϪ4-s63 ;/M3IKl/=DWSM-8~qdh6=!jQ*&}!-DP 09Espw EJPȠxL>ODzPvDn-;G.ţCх =x~;5Ȯ>0< ]z=.<[Wpg61PR)õS#,K ;q(51 hM QIO{ḟb0e̴UEM66*ғhc;iC@%}vT[BŧZh,]iArR(I l(*5jіyH;cҒ^ iia!ôjN~1sCl*DRnΊX'/iIٮPkW03l"k58z1o#FsqADWBZQ<6XbFl׮n]ES5V]0Zf[ȶ$sTKE%SU UDmu_$#%چ~"cX4bLqqH}/r W,ʔzgHBXzV u>+U"#H_$؄jeXQXM7QMkisK;p"1E\6-bP[@==QΝ"#dqFnl)-D`Z] l $C$Wdj2\Θh}F2W>텀{Y޺EK`echufVȭ=5K.o-tQF8gN8-`O :C>L/C8l b3&8v*Usn,3WlccٛEҵYL&IMl(ʸ]Sp< W6Mcn՘Ipq)ϥ4EV7 & 2B"[LFn蓳7ډqRs4:3)>LD۹]-M'={QrRIZEx^B1DԇRZvtaCC+hE}S/a>Rsx&AAnl\Xz0y])pr,ejư1yLm(%ŀ{Z+׮{a_.t-'k(CeD8t؈uf„NtXV5`EUr8Hxnjs5~wP~G',V5 "7n3`aÀFȈ%1SI6o2.I,Xcg.[_m*9,/(I:4Hx9G(6hyyt3dSY 9GRfȅU79srD|eNhf\uvǨ*ֆTY\5\w(Ke;bg@(xֵ1n97w&qm)yj8т{gW`p^x(Y8i t"q<h"?7x.hIek4{&!ol~IgV)5PlȘoi֛ۘa'ipydI~VɇęšTD!Iѝɗٙ؜p9,)ɜ˜y"9@J* #쉞yi9(#hٞ*Z&b&z(':Ωy)":<ڣ>;`?:D鹡 ʙ68ZR::Tz=zωoI# sPdZfzhj@kpu6Hʥ z+i?2@bݲߩɧ}*^*Pzکʩ@`*4O}Q*;*Zzqjګ JʨrR;ѪڬziZ9ڭzȚٺz蚮*M:,ʪy :Zzaگ<1:ZJ{ )z# p\۱R]q;ꮪ{qڲ.0۲Q,6{8{3ʳ>\A[F`-@{ŴNMùP~U{XKR˝T2` Z+={y0f jye+_{,[s[w{&]{yK.u}봁'{۠n뤉d[P;yZ%H˴q0kgKgK* ` 볯˳;k;avXxYɻ~"k+ċۨ˫[+۴G^X˽cۧ;k {-[F|ؾtJ-+i~ʿ˴{(IG;sVr g lI$XW|a55x q ˱\ǟ ",juq5plp,l?P(ь,d˅<[$2i(myeI53iV5{p?l5`XLH$=_Qoն-HD9JDh1L<{pſk898]pX%>e32P,3^5X3SUUBF5l(}Od) ̝1L]}FS}βWjE}CLMMg{ FPV!4 ^2j`^|}<7e}x0kqnxxpsM"m~ ÀMɹ[e?d69V5ٍU{Ltw`ھ,}{k/4%K#̭mA3s;T l(( W]ĭ\|/d>aR[%ѳ>r1Rgܟ-[WqqgdQ\ɣY+-] ".+L:^!1~ȄdP;$-}~䔑%\=  Z\^`b>d^f~[~R@dMGPPv~xz|~n 4γ.]7h@'lL~A+/=pn8sC#C.޼ޢMUKbA>~nnLK&~>;\Npk;N/n>|~`^nɾ^&Fn>n~m| N ({/]SL{"5$0_ PAt1?Q`ODO ׷X?;o51լ{(p%_ n( #/ \Qsh_-{te~il.7߾ݸ'PUZyUV] 0/y"v!'$\dOlڢ3m鴽6\O/~ĹE( k,8{ - V-Ξ_silڵ)nݽ}'-tKeНP,IELnA5p2wɬ4wX̕`)Hc<|ُ#WޚoGgo@@"@=RpAB3Щ ;,jxĮ(TQ[EgƦ -CFkc1*H$l}\ MI*RȟΘK/3L1$L3D3M5I7@,rNج& :77Vpalm ǹ:ry 9CMuk'0ۂhZ"66Z&&~SYG ߫Zz%%Z[վ GyymCh rꊞ;": plFEq :lڤ/ȡ\҉Eҧ}ϐj_)<ʐGKwO<{?<~ߊޠU{ڼ9v{HY}o(\Vod@w?1ebؚ`~0A VЂ`5AvЃ!?pp g@0a e8Cְ@ U)p5B ʇsߩ#5A %&j"h+"S<_sEeXf<FЉhGQJ&\D1|/ǨF"4Fl$H 2u$"Iq)<&;)~y2Il(@M3{%T'Sj+ekxZz%iYNoa˥ cJc226'iZ/iKoҦӉrq99ys)}Vs w(!Dab=l]^)X2hA چ *$n&IH[jp&2_3Q1ҜLPi)ԠtG=jp;!8jU@HE@գ\])RЀ=ts^>ËIWԝ )g, kC4 mx@ЊXa|Ce*!, U2@!$aWed mOwQU{EE IP 0;t-{TwcM+ݞE3Ա[2'Si:J%"з"PKw8d d{c֢ s A .YK;aLB,,=|אEjJ`c"nnrs<DP~c?V ECGs9D.""THK/-ŘB:8^6hІ#"Xg9eE%M]y,6#$_VH JY2q wZў)N2]<6X19vcx_.ɺ! &uњ`{qTI&I!I>Lg] cMA#t&h\ûR`f7#p*[gX~*g>v? ΄c//RH~r(u”p/O3>NP9%XۦYʡ:S"t46DBɬ<{"~< uPJ ^pFz6't6 _hm쨐wk\63ͫCmFe#K ./ wGXQ<Bz԰3//y^Wx㼁=?U1`7+C;/^݃y#s}P3-->=htQwO}~ᯍ#+X>b>⿋*9˪?=K&{>cj,<l?z3@":SA+ B9!c $  4Z5? &\=<.@.`<îd;/ BJ(.6[*K0c+8D0$'*/ A\yC VJ]+ FCzDXwļD+ħ9*DD+Lg:0*(wAEPEغkDMDh |@' 0XdY4QDb+0+Xi֍%]F),% CdC2= "Z6<@&0`Ln@$  R S֘-91*7`Xϣbs( 3*곾"\X y-c6z'F?(iȴJ6Ie #"{(X*sa n$Zئ6ޢmm5mvϮv^oFn6nFoVpom Op.=< oloԾp$Jpu2벞nnp-h ܊]I^pUQ( wق:Xgҝho86Nh]+HH|:0's`0 \k4h񵺋@sr=в v=4-` X:.6 BG*skUtI `tָDqk$x 5`󣡝IvuFEx2؃ϱr-?%Wًr6_oq Gӑ ؈`wvG@Iws2htA'!8|/(t( P Ӏ ؋T0 P-Lj d!y0:A ?RXϴxn7sA}p䩎pz%(5OxHM/n>F[ t+Ur#҈{F"9Gϥ&yO'=)ϟCy%]'q.|gw tu&}N|&e_+?פ7`[;dz?q?^&p~ ~  g~~/o_w~{}=,h „ 2lС'Rh"F3rQ"GH$J&Slr˘23œi!ț:GSğB}jeѣ:s*m0ӗAR*VSdUկÊ- ,ڄd^Vڷ ʍJnӻxR_[sLx*.9ĐcJe!3YgYQ x%3]r8cs }RqAѺ{8gE㸅+]w@#F H]k_>4_?xT@x\AM'@VC _]xhexZ (ځwłlmq(3aY8(^UgB A@Mn5WTa@[ A-x{((Rژ%VlCg``B%|1@t&j ep^XSA1gqiJG e(Vri^^yJ@FdBht{lAF$2|чl53эE=M-em0_ׁ,U rٺqۤ=$ZZ߀n}sxwxWlی/ Ys7˒W9Fsz CP1\^nP3矗A@=p Azsz@D<{@ #AC#nMtp&5~~C₆ ADĎ=1KKAh_ ~sa07mYa{hΊ{hAh@ S`$P sH'/2b 2<=SC@(`j"![RP %CuJDa yAMNC42p&QX_?҆ijlhVr* : s٤4)س*ZI3^jqLi796,aJ]!d>ΦLR^󩮈ʍ&)HR.rPN0ތij*x:Se3H5!Qf .^XzסirTL^#RXAyDX@I+X "Uh0-OJ"LM gc2AA M. UVe{BA =$lBk&if2~Pk9,~+5+ O*\Qo a: {>`<- EI,$c)T5 YDF/P0k '#dԣP)I5Z%e3JLR XyOuPm {h`1{L6I W`EPI Di<`ZRUKiVl> @F-׾5@ַ>I'MV]ϳG̺tZmȦ8{*m/=]qdɽf7'`Uw}h櫼Enޛ뷍-u8ip{pOp? 'ė^\;2mE!32T;`Ky`ޖP.uyenM293'7ϡm19 ZNeAӯwk.e3uc63aW}=@!|,b>|*O/{BpމBik6foUMHпUWCJ{N:>+=0Bl+ܞO|޹;3$x#uG.GJ17@81 Cݭ/׮ > r4]Qu8 z*RzA-? X:SA`ni=PKDұE^MSV$ ֵ %O8tRDQ6 ̒ 9T _E QU1T9 ^u_aA5@P!= p㽎9ObAaxnMEEK\`Zd`B & Jf)N"`n=a"Fa2%aK!ȥ_^AQNbV5+~"b<4$@,:S0V"H}%_bZ acxR3"($_"D1'A:;E<& c"-Br52-#_`- M#S&V"uula?!^G&RnMl"4>h}]!!f]">`n͒)!h_nE< MRf"2J4z]@bKFWV^X}%|eARdߴ]mY#we%T\ueLYsaF[fb*, RA@bN&XX^>eh&gJ&PP f*KXHfo%Uftf&$)XAD&lnFpR gJacL'uVu^'vfvn'wvw~'xx'yvg'zz'{x2@}8'Q@XD|('iZ~R~fYkh~؁m:,hZ'$K8LlphV<W*U8p,gShXeah5(E'b)AheeGp@h imhmhS @1)I~&K(Ё)]b)i)`֛-[irI)۩))y)Qi!)1gij(PjiFrR F)g)]b*ꊾjZ)ߌ"jjj**kJpQeSLWQm ƥjܩʄT@Ca+ޥǴ1e%Ď*j2kJTf9_ԧ +jCd@ Nkx+A1SYd kvkL0[)ZFQYQ&Z+A ll^jT0&Fjl6-ek_n0֋u~ ll,k-eN-۶$AĪAe֋ZZm,dxݢ.8Ne콚mD)-m~Gn-NNVnk`nb\m:nkKnk.憮Ǯ..Rѩ)ޓk8AqR+rUrfǷ-J,.+ū$%&kkDĿno϶ D/ʭ CbQ. ȊlA|@Viz~ @,,8/Zn~f):/}LAlӺ. kJNͰ0ݶ.oѹp;@/17?1GO1W_A `1w1SAL 01DZ1ױ1q1 @1^0i"0jcj"C%?nĪ !Q ](w)o2Ϯ,V2oVp~!^ P2 2^2r wr #s(#* p "03.''/b^27s+_6s,w3::s2{2s33Ko43;7'0#s;68.044Ɂ3F<%q$\!Dr8&DEEEH-rHAx a],JJ_KE4Z(PF\s܉AQCHKu@ǡFSu$@RUCIWSrY XIW RG\ഹ3^x4u<xĴk6 i(`CvK]va a'hgG6We;`weـAx jc\'cOtZصR3JD0\7Gu\Ar5rՀF{$r/I8PGkLfv# [r;txp/;XLksq e}IXlʯq 1| |1 AȓXx} ļ; q}[<|=S50_ЀKNA x}mr͸9<3?2DnCsCs++3= 4=s#+3>'>AW}[>߽o蛽7~Ňƍl_>'*/S|~OE9+Qo??ŸjPrLgYP`A?=ZQPzuחPX9:3c5 9tҁh5qA /4bT4?4s#%@9Z]Ʒ# ܌ Ꭾi>A$B Q$rXt70p (U "pC$ IJ~ ijAb50c4@9S"C}YrL6,sI8z>dĭМEן #u#Sg<+n<9Ԩ!Cz($S^`0o%Db@,T "A/'xQ #QJQ13+zѬsd#::%16M6,G@7$ʰ@ )-C6#cƓhFծ56sd?$B= O:rqB"PxFK _D3C=ä#,53(D:ˤOtM:D39#.@4HL pPk,K mMwhgiCN^,+4iˀ޾t~zB@`PE2ǑaL FC/'m@; ҕ&j[5X@@! ѐB8!FlV.n0A찇z.aO,& }(#0- cw :CϐH8$/glZ`< "fzVQcZաGؚCm G4' cP)'g.̟̐­,~dA'~ y%uu:C^KP,N%OeJr4W.Yi^ˀ ӒTTh23o<#a![ u\a8x$bV3+fb7y#C3b&sPVbH2Z9 Nt=phyu>g=3g6pC8TQL,X,;yj|f ;880 H@pDeE;duHe:HB䐜Dr()f C*0}rBDp$_'(ĪaVzUG8zrU*P9a( BWsկ"@c!+u`c)bVT_Ѣ2 4mL!P +Qb(ϰYP A9q r8ew!cge2Ή#0>1 0DJKټb)DD =PG`A$>jτ죟MT|-G&->|ӆ$]:TpgPO('j}w Oo%D:DK|2QK9 R2eVT~ʲY.˩-Hd+hA#| AA$ADAl" 8}kPCԅ(\M_syeUc"x1JulH iD0 Bp+FEt#Ղ< rQuʵ@~T#}!، d1{drQZ׋DPnSŰAch'MlMQ)kpĶ8:SM@LBQ0ŁFK UB~1px4a?π|:%^‘?ԡp0_렧ec݋U-3z"CvD6Ԩ.V 1h¬*.PO^7&rc$A+yWf D\3:dn@F8z?LczUD1't*U zI a3(ppUy26X{qpŒt @ ׇsXc1 <@:ȵ ` P n <lpFW(bq0T 75'8(8:?9sD '7X[8peO#eep!8Qcf)G{?hjxfy~gm{{5'}+b p8w pA :uN X C s0L0}5 Vtt7oE8De#O ?At%cxg|<m*VՃr0SmzpٴlHOh#0P%8 @#f) 2X%9}:撉cEp8?KdɠIԎ*eAKf r7rHILK8'8L C•hY7 L;ӕ$,cii--!0pM |ؘ9y1љYyIٚ)9iY!Yyʹv؜y9yةٝ99y晞ٞ!X9oblB9ٟDq y *ۙ:j z AIڡquz(F,ڢ.@4Z6z8:<ڣ>@B:DZFzHJLڤNPR:M*VzXZj6"@`b:dZfzhjlڦnz^r:tZvzxz|qڧ:Zzzڨ:]pک:Zzڪ:Zzj^:ZzȚʺ:Zzؚںڭ:Zz蚮꺮ڮ:zJگ;[{ ۰;[;ڱ^j";$[&*,.02;4[6{8:<۳>/pD[F{H ;N PRg(Z\۵^`b;d[f{hjlKU{T;r;-KNkx˴zJ K `qm{۸;[{+8{(۹(, [)۷{[c;ۻ;[˻ʻ [ H!+ C{x ;q[{蛾꛾۾ Ϋkҫ;۽;+{ Y{DQ)K?ʿ( <ˆk |(*.cL,l3+qk!9KB&F|HĻL1|7 59@6;^|Eb 4-|8[ :PϘ+ԤkD}F ۹]O:\ % += kP *7Iv; nm\}y{;l,ӃL59׀ӡc|?\z> Ԗ~ݓ ՠ酎/ @Х>Ri; ?:^nl~Dэ7p7խ-?0 %0,s;.- |9mu .|Ƹ ښZ|1oTodO llnlՑlPnw|{nFSn$xjloPfFvMFt v8ٻ_@/?Dy؏ =:V ] ؜-] FMp.OFNR!v ۽z?}O{_%0?/_ g) erMޱ n"D_ *TUznݳP9Xe͞EV-ՒmD6Ȳ.0CC]B=G$DU P^/F%q:C_n0,԰I'30J)E D+2˟fK.kx nbvgs?#wz믏zCrtK7IH{_^T3秿uFɀ&q9CQ>Ѐƽy/d P1MdĠp ޑ~q<\0'dЅS!IA0`f6Ї(ш;LzC&.A8E=Q"!lxÂ|;D\O$GDcG1э J8E8^ZYD//VQ ?-/@ ~J#BB.ЎcE= pQ>08кTp{3l0Kl%" @1H[S/e%(a T%ә׃%1z鱓>Ӕt(x'K%"D>uYzKE 19s G!u." kYMJi=}fHRnbf@9LH E K1|E$6N"< E(-ҡ%PFt(`h|J [ uzl)J4D%XZjΔfWB@[G9\촧MqJ\-b:Ԛ،f2G y&ʀ_A wo9%+Y9laEErV/FT`W`#|2nw{O>@b8/|AW J%^5GM⦏0.fKrS%o\Ж2 "ύnhQ)BB >nMk"0uEe֪슭l-E[XA[®$\T%k\/ !ZU+jl@H[RJeZ6 o-?&rKjPBq{[™0++hD.I|?XMy1b,:8#Hq U2NA]P/-zC2RӟVBY}jH$Y::_T[,]z V^*V..~釜U¦N^d=kQǺpu\HmzNpL+'p=Yo;јF]nU뭜_rW5iJ?yucpj>!ԐHƔ/q1ȺNF0ajQ}s흌f;ɹZ-R;sn6x{ bLEqc\~˹m&˔0K}pRnqf5.J^Pyۥ"<) _xG/c:iSǂ^κ{ 5NOa짴,nX)']fP ZJ MX>C WVZGl婵*A |j65=ʷZG(NpPӚEWn-5d<ì ( OD:tS٧ >HgHm";5 ;c @ 9_"`+g dQ Dd`<DQ  A APhBDBqxF%(_b7(l?! "#E0g4E^ȊO(9.OhT_H-VaV W@R9V9RF腭PdVgSlulmVe]1(ZP-PgSM{Uˊ-Ŋjˋ BjӆV5ևX55T^V9X9eC9ŮX%+N…W83S*|YG>(1LDOh@jU]׉EکXڋNh_xeJvgVZ-Y5±%3;zٙEDYg NMAA=ܽeWFSj]F]uXMFp߅d=u^peX"I0UG=E_]Z]KY|]P\ߦ dlYYX`O\[$6FDʤ_]_T9`J J Iaf&6VaSDvaFVa#! &#Fb1$f#^&b~(*bI.^01&263Fc#~_Rl\|c ,D6ec c:WVɞcecd>M?I)dN\dVld}dCn~ÉdId7.:NdC@CHdDJ6 UeQ%2XueY.LEeTXN؃bFXXXcRE;]^`bVAk2)xno&\E]r@uif${UfA=gAf=eg>t^v>wy{uj`oVah=S|&h g@TJXm Q( !*@&iX>JyF{ya֊iQ>‘iggu>i}.kmq^_Vt~d(Q &Qukul!!fEXL (I6NXFV䨶ҩLK^뺾kill_WemrEs_@NtEM` Bl?(jn&kn.F.i`YJplۦl^֊_o~pf/Fo.woogfMvNn~4\Am݅i~Xk ! x(Q lfj"r?^r(#OYE ˮ&_o3irN*rds shqq?-r/&xaW`tG!nP4n Uv:6Z uH0v (uvrQ/uu>TFt0uRuVu&vaPucou[\T d~V tNt^WEGQm&wQmk &Vdh*HUL{Yuw~rx1.1u7|z_Ox_dvUsvwׄxglɖxatQ tq EFfA\%Fr3 ;6Uvzuy?qxj!{/Gi{z۔Wjj'l'Xȶcy _/!_`V{nj0u(f}=lѮ׏ٯ8h{wGƮ*}\ޯ~O}/x}t!g&kѷW{F~xP~|iq }:Oku,h „ 2L(h*Z:z몰+#9*YN:P*,ZPJ۪Zjjjz- 'XJJ..;/{Ϧ/o`<0+ +/ ;0G,GîS!+1{,< |2&*21KqCc 豂ʼ3s.ͲC\I+/ \A4$sGgVw56E3"6W #ws]y=Beϗ7P[- J`뭰ۇw38 ;^/ߍ#|L^7A8vkn/`(Q;+7JM@Eԍ/J4dJ6(Q@3P ݸH3 B?9DЯc~A{$@JyV#ن,٤J0=)a Έ:g P܂j!axAl >@{#:p T=o-P d}=f{AB2С6Qm&C1FA3 A _*T̡XU>#ut7y1yg +@*2Nd0QD*r\#"k h :ɍҫ+!"ltå. ȼiu+jhڍP%}XZ61#"TTa*Zҕ- 'SU g">Rב轴%GiFF-I e:Z`ҫ63=u}hX'R:2{k#؁((]@nK&V]XSia6ш댌еK'N9k.t` rLޖ$,pe\E.92oePnräxC9RR mJ+Ґs|˽vSZmC;5eOPCH EX" |߃S{Y1рsw^wCjG/Du9]jJ] R-<Ȇi("? ayCfde+nwDخ[☳Dinm pFCŊ 4Uvqf+o tkgp{@&9ƮA1cx+I2P[HhK|Φ߭!Xp2PQr*\/1wco[Ջ|E *[v&N{;6tnD26] If5qmzw}?838#.j83s8C.򑓼&7lyC+\.9PӼ69sMX(.F?:ғ3N:ԉ^ j_׵:\oUp".v;^n;:ZOhpƻxsYr?<xӝR;<#/S>Ờz[,'Ϡe߾6ů驟pXDi8E`_V HlΞ]$lA($BNA=ƠQZ b`쁠Ё *((AB$  ~Y 4l !MT^(Cϗ sQ鐔~a{XMс-)0"v^(`A_6b lP4)MD ijq!Xl^ay3(Ot( D5)O({aA[EK !"A$ 2#cAA(Ӥ Y=EŢEV'b_"P`(n7c+>Qe'%Ф)R:JSY:R!:QXaMBkeaYxDMNcJ%maTTgrY#^^B39#AQ%3J5Ye&=PI*‡bX6=S!qoc>&%gf)ATbf9u^'v^U\ .h~en%P!kolj@T5)"2'c`F%PWhW'! (h3XtNgJTgvn}&/'ʝxWD $bL'W(VON'[$'ΤuDY7TPfĒ>搞 )#>џ9bKh(bv^ρfi iG\hyiiZ"):ĄNU3 )"i)U N#Djf#"̩zV^J)ye)YHՉj{j&jwڞ5**+r._6_jǰnhf>k>6kZkNv*zIJ>ɹVv멢j)b+֠kmDkv,W(UQC,++m릾+ˑtOdgDҫ"l*ll0v P uP@Cʚ=MMf#Ah=,ި^bjr,jx`ƫ 8 ;RFPU- I)6@,I-׃ X+Ids>`~=2a!XA  ڢK*ah"mB(m:,2tJUIA¶9C]M@[ŏ4iQE'[`4)i&@LUA& [*2*c[b .f".B(.kUW=:V2F.oxU2VB>nZ 2v<#D4'7".UO44 ѬolS,uc=zQl)R8Bk,lT$.=nE$xz{]om֘ڰ~mING.2 d[KJR>e$6e6%{PZqN e=zqV{1%A 00 *;_ao2!TRӒU!oRon%b[U8lqp^sdT Ob(Qe>2d̲pj>l(񍨏Nmjm&iP)pI!s'++/CyO5o;9&71./gհ9cTr30ĺDuíDԟV%ۜ'gIs )%(%5->ziR {WM( ':/eE4/sss1E[)8b퉦PA OizLY.)-_6i!r/Ii 5Ui0K2-,YSJ1k`4ۆ\5G1ZﹴD?o?I5Bu55^$LL NY,6J>F__f,hYs"[6vѮvl6l#Ro6pp n7^vclj۶fq%lms?wk6uݨwgB 5^+u3wmwKykrAn- 6]{|y{wa)~ /wc|7OSeQ! `'~H`7yu|7|OS͌Ű18>&N^Sխmpa]wr"_kڦKy+/. NKĮyή-e"Bܮ(ʯfE/l΢𶹼.8wrjt8Hmt3c3, Qzc7y YOʚ"琳yv#ǣcs?0vYd d}:h9ު.G&IaI؟0o/J2tD;O9my9RS\jSwevޤQ5Vx'RjS1$7>Ej iWw~/|s C9w7D`O`?ί*>7G~־qK9h>|83=˳>x;D7>?OwcW+:gu*k?8O?@8`A&TaCF8bł-fԸq"FA9EDPT 0n7i,dO?E(hQ&TiӌLF:ɕW|3M9k$JlىcǚU+ZmݒnݑլbU L:ovv]f.;WQƍ><2ۼzQ-k;+XtRɥvuc]׮b[Hz"[I-lGHXys[/=\ {iێ'HgKCovfٴgz | K4J+x*>(1S4JC̔HaqFO͆U9U\| eW|au&m)!iecg U=>eln[mA_(FΑ+U@~EEΰD1yF<__ԙeVɅYXg㪶H6Kk(_. uYdzX%ʣjj绹4eZyP~麹dN>|GcSl%'yE+MSAWMl>2Aw&Ci80ffA[I PmxRzˋWCtw,HV: ">0Hbbב,KZWT(3iR'{ p:SJ `xQ*Eiܣ$BЄ(կj?u< onV&&qa G!kT I2 2S%2uP(4hb,Q\_80<|Pd5я^clBRو~FTIStdn vf$] FK$jULS-հ-qK]/La41Le.t3MiN[`Rv$,gYP 'rMlDs78seT49*Zed6XQ|::T %K=-Ԣ%Jg?р’hT0jDg#:]KR<<ՍOq*T}"mDjkZh!Q)ot@Qp\H)r%|M:CNv*< xݩ*Dj5JkPgh # YhV@n71djkힷ.f`e4N$Y0k%mE:R¤ahAeJ S6ܗH(F=̕aoOD0Rp/Mѫ1m`*جXEmlCխr]UbY+mjײ7ZzI_qG>n^ʗ:%~qs5oI>Ҵ53B,,-ilwRXBDMή;x2%WoK1f8$i7›D戈}۬wmC`em "W3X ӤmG3s碖f'oDETd9ĉmIgvJQfBRGF|M*QK^V|wEo*j@93+Z@H(5|xtetKk49$b|]nrNN2nzdTɼoX>V-p4u}G;{;k#^D͸[aS?h䨙r-wasϜŜInk|=ρtE7ёj$MwӡGUӧ~uo]ץY(7՝-=wϝuwgSx| x/^G7|/_zK鹼߶/܎zoo/R 7џ~,t7=E~ϟ؄w3nF.B0b ԯկj)C"2L,.G1џqfjLe*AXQobP,01 K#J e1 -S8 .8q@L  }·Ҭx7m|:|>-&(B!3 pCGdxE%0g:b-%Ql#!Ma(df,ڦOFl'mlOeB5l; Q,TL> qtwpX!ȸpJ0WvfSQS7BAETGDQRJ%Q3rU-ue6VV?!xWT;S;Xc.[[[uZ#Z-RT[[[õ^ٲlO]WMUMRURhvaqaa%vb `]8c=6ddEddM6eUve.)P0c'u((fmfq6guvgy.f344:N'\T]Ohh9.iGM;hTf )=ߤj;g,fXuΞe6hRc϶kN imLll uI hoBoIoK0wp6p Z[r] Cshnqq 8cj:J;u4"7׃QQe [ 9qlu"bC8Ĕ;8v DlW!y|i=0x=b^ mĶDItzvd'SU<9˺$ZhFNs^=~(wT{x٢s#ml x WtB7+;FXJҥ& zV1eH %%g%|tX$tusɭw1l|w,}}K:PbVlѤXJ&ƂLwd7f 9^7S$0opq@xŭʆ Y8Gh7*AmÐtli,B'S]3in[s1x B: v4VhJ,ėђT{y5m|TMن9͑w_8|`7@(9,$5 w "?y9ydMxrJvm z&ز8Sd(Pc;PdaXvJHUpxj'Io1=z%wkr鬪۸w=hglYyv'"H{zn#`Ϩ"^=X5w9-Nr ڦ[=AdFO`Kpg<,n;:{eFkKZg:zrU驽:w+q:zٺ:z麮:z;{ I {ϚU!@!{!PU+9"bQb' D!H{ZSXw;P ;y۶7;{{vX}^{K۹6ki5GUXػ;{黾{;ۼMNsU-Iz |wZ<;%½=<4M?*UP\nWgid|kk<-[}|x "@g'AL|FEXQǥ\$\g(Bp'"[#0|" "I$N!Γ\ ""DdB@g $"-=BlY|Ѽie "BEfU*}A L[~!lPSneU[!:ȇSemT] ҉! BV%mE٩ClXz!^l &B@W]Cz̋}[9 ST(m,ۃ=[jX|a|H}@=}-[b$׈gB}1ׁ/Z paU-I~m]~U|:|#>旙)+هq}v <\ zGC ̥ }ɟ}!""sG歾 74z$ 9=>7؝>4>Z#~>#q~">h^ٽ+;!^)^''^) n @bfL7|+J J2 @ x?"~_ !`^ a# !~. #7B ". ~i34'"F"ס ʺ~ET j:|@ !p!B8cĐ"K6hr ʁ.rX@4kڼ3Ν<{鰚СDگ*E&pڴU05R=BID| `uKC_@ '_P: ANvJCxκjU0V@&6gbB#O..,;_\2*_Zį˒j3SQ⪶:DܗSs5?F*`:i[ >=au{ l3/[E Jc~T TLS"VF :ڂU"(W X[%^wu\{b.(`$5K&GIDrcQ!$Gޘ>V:Dz4@I.ɛhDyJ1eFp!N&%v@TGgFC &4Z՝;g|*)矁dC[T e/niP2]妃P5&%`$ZyمW0~ l7 PKvlCFfSIPEtwh̢$-löJpDU3:NTѸ:жN~[hKж ٪4CjNLq,*D,,.\ kɮF3B]YIC kqLP?4A6ːњ [~MLPt:K$uN?o膠DLi4S (RoEh7ݯl o3-l7=LP2xd3?xH32>L 0K~M3f4y174'X͋"psX•YtZ$<񢭳Q!!$Jp{mcS}eQGo[2VX&:Z+OR/(5DFu5.v{pQ:jf֍t\B0⃈I7;Ԯ.Cn3!#u5]O~aeLeYĐG!:&yq p$`3`D-IbV/^,>VELن*HLG/qЉ30 ?Њ!mml# H:-Y!PB&cXsY'Rr7Q$_ X:d mIV#RٓQ20J%w6d*s3l3_IK[L//\.{K`n n|9ϙheWf.ǩJls=[|>S%4UT{P-Ars';w"wE/)eCiI\IKҔbmi#?ϐs+jӜt.ExĒbdy`:QD繿64Z|"_$ƛ)ۉ[/8^Qgnվu/L wȩ :Ex`Cd |yYj$7uM\׿~#&|P7u6AVVϚv]k0"Ƶmj"Wܭ78#٣wt _B'tk>QY[ްo}eMj09#>#+{/f6^{I.qaoĚa o<#Q.iX /z0팜t?i{܈( v:xv~| ^ahwGj(~N6w8iǁ7i`NPpXH6Lk)(f/XX'3&R)0[L)C2b!(yO`4DKQ(cק&uM8l]a Eec5}LxRboUXpu[ ]]؆pȇ}Xrx@#}kȁmH~^Ai_6d_y=<)_BpL7g3Ņ`zaHa,h.nxhx$SXj}elxVfr]&r֌j6b(^؈da&gZ6]zgw}ƀ倃^&捍_ R؋(]oym,lXvz6qVlfo}WakF_nmȇll_noFq6}8vhVgv>W"'qWgi|+r'|XnOV  K5E jWcy37q5kf׮~񺸊ˠỶ=)Q/Rx'#' rPe,`KTkVd6؝8ihzJfszwvh˯^xd t@־8 ew6[hMJ<>lł"\f ^&ܯLf*s akxc[glkًۋU;Ka9vjo) EЪʑZ~"oc|9oɊd%ӥ$'yoF~`<ceg k<7)dǏc'Kjd&Ȗ橇|ay7*X_!nf_v%&o'HqLN\IC: s8ה hAI3n9צH|*xȚά[a^?uh&Ω{y)| A|  hI]KʮngZوny oYgh| |Զڿĵam  X_ZښzjZܮmٹ٢ ܿGrÝaKܸ{+ފiE̙Kz*)&׸ إ̴<Ɲv9y=W'\㹯 +io'e|`th Nr9 [_ >]r,.)Ng.n0Ό@6^^kWpa@p8˃ 8hPjR-^`.;kz;lnP~Q*Jֹ !M,һ\%}L.tSg陮Kˉؕ^9N˨0t!KҖ.Lbcs`;!k뺺r%:k8dW| 1+*HJ"!k Pכ0K|λ6怾x\>bZfaJWkN4^.ŸN5d{ }: l=f|J]<\m >hxh0hpd>̾f:t{6~57a<?ߝMֿg6&!vNd>Ʈi:f*qǜnkLr\~grUA)| },xŅ9ʁ_y &禗D][8a星k|4޲_|jd6٬n&}daP@)=av/ϑҨ몭#X `H`]7 uE5nG!AV4XK3:a v+B%jJ^j 3A*]ыD”It̛(qRŠV lzȳuZ^ݪSCJ| HjT_:UⳳhƜY^Dw-u^Oj] L7JyTHęͲ|91]1&]3ԩUFc…!vȐbiܹu͑dA ͋rWtw*uղ9++Г?ujzuuٝJ⌏GWNG-~hW<C(h?<ɯDoZ 4sI& śB{(> ā|y쪾j",:1# ;0zrV3ҙ6ۆrJ*ϴW}5}_'JE][/ O d wn~Wx]$6]bl$R %uda ]")`wLrHwg09$b[Yw60LB h#=Q[g^_b0`R*I2QW= ͉sQ5$d(;K,doVǥd%'6Qxdh$2N.2{(YJXfOSdX+Kڍ^SТk Iêا zjzG7yea\2)ϰ-+WLujW(i8nRzĥPYP>LB C3JckZ|AXrD\?Zv](Cν^Z2Yzm/FA2^]7p%q:u,4Ulx߂3%HKAx+$7ArR#PQcމ>so^iG|k!­I f1]̘); IƖ1YTd`q/gy+*#T5>Z/\*b+I'%dAȔ~#}O?~io__bq}{/+@e?fk"+=, ;RB@"?ۡ@ % s?Ҹ W@ 3#A$%#AKzN-?> TA SO3 YՖա ՘mV(SQHO-H&Z;(jg&HO Hdڭ0YR=ڐH6=}Z;U?jd8Ym5\-QTQ\O_x&&Z;ZZ;ܢU åDuZ}SM xT\eے (uOm\=xu[޴s SmH[%^me} Hjj^ۮ Qݏa4Hjx ` ~- g}-Md0[ ` &0dx3h ._x\ `E F`P|5}`` `5 0p b)v+n`?_aŅg%`!"Ea=c>c?c@dAd=c_Ao=>H\<(5dIdJBdD^!]-GJeRQLMN&3PPH.eZeZNZecUX`[e`dJ^Yfe^fewcef`vff|idfp&elNC]fVfeu^gvngw~gxgygzamft:}~6~f&_Xhnh~hhhhhhFh…e>ide%H@i%H d}i%HYS~&ޛ9ZTi|jjjjjjjnjjkk.k>kNk^knk~kkkkknpkknHj;PK~~PKdD$OEBPS/img/wsc_client_flow_detail.gif P߯GIF89aI6p,I6  0 ,HHUPa a $]$e$Y$$$y (amL(((@H,i,U ,D,,,0004mqy04448m 8i888 9O>(p}yiO&9ꉕ&)jc4a-"8PHEmNg&qtJj&EɬPrkd+c:TdlRD gp KaF RAg?L˴?X*֧Pr/eC;ͤ;eC O,Gx,̣3Fж-c="|+); lKzS exs@0PY;AI V/s<N\<֒OF0Tz )CtYc]Ƈg4Aؗap𫜳7Q k|ǿT4CPDD(F eXG>Z%lAi?-A~ Fˡ'saB<7~(U tg&:Prej3Dg1-2em@`A qn\YHJAHފk0'$jZ)%/(r P bBTo?5EU $HQCS[߆3~Qx"A.S9]Z1l,P3[5lQqicꅷܴX`k9A"[Ԭ `N7' W3ڷȲ-R^ӅJY\El˸Yp{@B>S3{Esׂlcۗ8lzRČ: D;CK6PJ! @&,tRlp20˛\Ş!dc# DR4[VѢsu&̀j))@,W #׽[n/tJ[%BYUt]~aAΉ]* kYY\ V_#T U@D]a%Џe,L֒rLg4 b'U2VN\.L "^RbѥL=ϯh^[ *ʩAjI.=/Zk* qծD1=[+ǿ7v܃ېto- !rV!=O#92aP Yᗆ V d n pXQ fȴd $_&exTx"ưV&%dɩiljDy9EVH\ː@#Su_>uV T >P"6(ςxI>jeΌVSAdriit \a!/fS ,b~ i53PXhr@kHyt̤!8k"h jC1;J듃Qu2ڴ*42gEio"z7hM>@}#vG"kUaPջˀtTVWYՆ {n 3$`.E 8sBo8"m9fr}{Agh+& 6V#2{R(q 9 ^ak'8 hFDpi*w#%lOSaL6/kvɉW{T m'gX'L*L?:]^y =~,KHpˮABx_^3&^XZϥR_ڟw]^v3Si4#O|9{GVY- @B9DY: /.Ii$ 8*PVyXZ\ٕ^`+!qhjlٖnpjySxz_iX vI|9Y\ &O a) Yy`darr It R;LDHW kYmdٜpY i8yYYYO$߰ О9@yy 6!( 9E@ѐqpa Z 0=ڡ !j0"Z&z!#) (ڢ./:3z4z Z <*(zAEj$¨Ȥ餗M*rHohшWȥ]dJ\JZj`:AJhjmJoBPjNrztz:{zFbjTjꨉ [ʦj*Z:eZ꩛_ tfZj pZ꧟ꪫyj:}Zx**FϪ884ffj ҪdA>x#a-uѭ8ZAc*>c5u jB\U4Pu;˅3DYNt0#ow:FUH{-*+UAS½ S <  ,K$)̳$|K ܱ+\FU[ؚG !aÂz ` Q Ē2*1iMǯC,j,[‚Do-4 {0 ;v0+/{/vJl#ǹ0:&K/8+N4{E/,1~YCs!s7˺Svz<@[~CFK{Htc`iOU{`Lz;auwfk4h+Egs7gyq; b|:}:/;mtZ?}q̸qEhY2{uYQo:;̩jT;KQceJK`- țQӼ隍0,ϜХ(t ѣ*vkћK|ҲKєp -} q 2}p `40@0  8t ٬m! J9=m q JPJ^> S2 `՞@L$! J J [{Mq {-X-V0ԂMmo-"=Jm -}tՂՂ؀Ӄ} x-ؐ*,QلP P=ڞ@ Z ՇԂOӹڜ-a8<'T1!VٙqZʠĽܥ==Z]ӣ=W!ԝpQ5K:+{0Irj!wɣ V-ׯ`=-؀=OMݫm/ ʐ>U&d2W9sBc4 80g9J.պ=S-ԧ}pM#.`S}N<U8p^~-a=5=^ؗ-ٞX}ܬ k-\=vգ gW p ;E;+6PD5},X18M9´m Э ?=ځ. W ΐS z94/8uVQQ{u\qA.=Հ a)!ײy's#dF1ԀW7j5UMO1yԡ:JZ怂RQgTV4Pӂ#W5KaN? oQ (>q u!13`׎` a*ZpJ\pޥpq MT {JPߤL UVNEr N Z! \@J`sJ`ݻi ǝw+Q ./\ۗWx>1bOZBO@%_ l` } >~_]h܏_ڍڣ}O- -Iy@pa) L_]-9R -t O0Xnܥ7?9!? DE >QD-\UF=~LH%M4/A/ GAOJÂ^$Hž@4kYN3-.!$ȸH%dI'2J)$ C,C.tH{yD3M5dM7߄3N9MK 3 3NN"hf6J"*ⅲXF6#ŧF^B/+l ZT6U4St%^ܼWA]=Nl"ƈRXf|F<'ŁfsKƇ'ko";opls<#&wB@>FxGcFFpӒ'3<:}tvtjD'D8X Y<{ϊH~\v,<+XȁdbcLw`HG@ ~ԧ; ҈GшI]G@%=;XDkP`hZ.R]k O ii)F,&qnkjkF?MVH)rx|V( "0qsAq0lVld<4+Or%o)=w8*Hh8w.r!?<n@xtqEq>N"5 x?1.+8'4t)sTH ]t,L'QouKV u0Bo=sJi?rיr0H+#.t,hoctxx?VJms]?PMn0)lPpsO79r,tjnhhna2hIWvv;'{IVtY_w]?r)>Mww_hC^Qi`^2hh/|x\y{xJXP +r`{oyl')8z}'ɀ?C-!H/ ȇrvhh(v>/J/h^{χ_?`Ûf` ^SKyxs1Ol?/Py|tH^Gz؁T,|hIZ_Gon|x,r]Hy/4sh/PGwWyTvpz)uӟH?dJg „ -R!Ĉ'RhC1rci+F\a[Ue@leD0gҬYG6%̈Iז2m)ԨRRj*-%ZFN+j,EhײR,Rsжz& V/.l0ĊG^P`5J̶,:BnІGŴ4ԪW'nl)ˮMYi}1Mr8ʗ3o9ҧSw.&J#a ~}s.CvWa=s{x1H_wZNxSQ-apVx^HN:YQD!Z4⋤cm)c[.)^RHlb6ā"Y骻..;/˂#ͷmYʯDW.%Tp$:Q?V Gp++1J* Zǖp  D)3-kϿ1F T!>яEs/Y"8'MO񘧮A/ s-ݵ]5P,C˂Bc-HH PB?A@AI6r/eq?pM?H7܌ua@jX's 4 ՗'Զ|}P6-,A8?P O[nG`Z9~:tAgq3?#v˫<%8d?CԂޒcT~Dg3z+='XN!; ҂l<0H3?Pe$^ H{v LHv r R`@h4dq+ RDJY [ X8 .U&:qlrC F@tӡ;Ql#Hx>)Vl_GQxDdv8d [=a+$1I>M>dPQX.s]򲗾%0)a 4C&# Ԓ6mr&8)q@ K6AHg%NIe>yB\XgA-C@{T74^!FhTSt$0?Bs}"@OgWb(Aw@ Np)_h1x s,b=P[Eꮊ&J$he<#Ƙ"04'Ӭ5 @6IdT0~5'j~ L=$rqGNp]R 9}ȓS*x^=eY #Kyǧ#&2$ tCb=`O -_Dj{̀ZeIwbM mc F9vF 8qTnncLbEoBWM)7;{?$/iZF[wJSq-8R߿%|{DVh "NaaA8H%q9BHApP qGr11R{M2f7}~q-Q ޲aNZ %7Fi;,ԚεX@BN+>b?@&)/#@X≣;X,I=#YY'UHJWWP`N$KPA8HI5!aKB A^V%#Pv_ >@R$6r&HgEh9&_n&jzf7&"xAQ, Cog01ejfPH='tF7=9qj,f,dkbLڑMuV(NWwJ=@%gm.gnD| _ ggb'PaVB,B(W68,BYbdw%,Wyx}z c2,Pq^B4([QLH(PX( ihYkMO%(MΕ WDϒY\MIΏ:TԊ]Pj@.<zDcZ ^ZD@hiNpi RiB؝ũ;Y"Քi}Bd bQZ:Dݩd_|6G ڋeX *{WAJbf^DbЈ* ~E+@ێkjXjWki+J șAɽ`^"w«p]豢AkjʤNR wڱ+h+'~wApn,USIlR,pYIʮl_r.,4lx^J^ͶjƬy*i/0/4YyGJ &gʧ҆YAVuG> ڇ".:vD(B-Bm:D+.$،!UD)R26#Py3/4֥16X綀4vٲ'2X\0ezWT8I%_cI:cT<% ;rd=R\Nڂo+tOR9OBAI%뀝:OQnBRFDJMu)fLp dJA> v ՚Uz=2HI/XSp2P%5eZB% ?4qU7Ą~\UYpЕ]vs`$Le:eTJ[*)*krq!{&!̔ ܬYݔ؜b8&d9:)W`^&ՉrU(B8d!#lۊkF!"mg:&.e"p/ch?rC׎8L`i԰pl4Φ6W:mpxӐnv=s18גqyh_YL/pNF--6'VE3)Y?;TTZ|,4C/p"r+--@>92QaXJ<<' 8ks{Zɒ.H-.M 5' 'Z4*go6,MCnD/\._YZuEhZZ\[!O$~طZHKPXu`vDF5RO Ur5KKU6\Gdd eKehOlii_lumm0˫{/om0?6wu7n6l7q;s"G3β7{Ǫ摷0rs \~7,xjqwwnwW,tdztypcbmkkLl? sWV?T\8dl8sw7r˲}k22rovo uჷa ݣrBθte88ȐDP/bg 4 yUydDcGɎCtCsCREz9uG"u/F5-NYkz:hyD%:^k;CzJYoM]9mK{79Z8"NUnUUv$ ?:󶫛W0sgrywW($ɸ7O{8^;xrvk}{#a)=@{ǻS2m{w;8; 57<:{tyr뻲!C)A`;x8 sz{:N|u?, 7Qin7yG2#<' -8wGh {<x(E\[(3=;}ׇcn?|Л{{ѳi1A1N1NݔxT՝ NG<߻ħ"UM!QhOYz S{}LYD[}kk=LB* u iߞ(yc}{>D/ ZBρmW 3?+[bu-6*^oQ'>>#GOܔgM);fM-V[`ªT{@Xa +TaC!F8bEWx`A9aF'QTb2%JfAq"*QS:TɇWx$DMF%̞4m.tקTerOcz}ҴoQ;nŪ1}XSV̽6GVR¶!crݻW! ʟ  KSn5y}/g!ֽwo߿>xBF3u7/\zuۜ ?|yѧW}{+LuԣK]Ү;6/-S2PsP$"!);0*.2*TÅ4\C<ܥťH.ґ'}EbThF+ȝr\rRt& Lmb.*j˦xR%*Ŭ$2W͢(d+7E"NL5$>W Џ<pKCEQ}tB% Q* Q:]YSHiSI"EԸd(LV.l['4l`!R,i"Jt"%ևZY(Z8 V!]VYy]lu]M!J) ,x0 qrdRseH^"Inp ᝼r|E@&szł%\U۝ 8I/؂_HVxőyYU(قM;`~x5Z\e\|!%zݱ@{ZYo^FXZ} {9 2q,y.ul"]hQBzCp $|UT˦2gyU(b tᅂZeQb]W @cw wpI2\FĕV$|)x^VfUWGmc?] tV{civ({$v޻} =}c#W(|S3/hAh\H nP!0sǫ8!ZSQ>9$pT|g$Mx#1 dey]l&*bD.w?B5J(qLY!ũ1TX@u`F_\OI=+c(Ȯ gzX+&mP(C` ŨHqO",֯>L $"\%>|!EuPM'IP32mVJJ69ID㉳H-mrt8t3A Mmn,N U49y`r4DbX=O}?N5AP.B!Q ;OGA~tIQ|6tUKaO?ba P~==OT !AD T.MuNUC A&At +Nr\/u’]UWLweKCkX^ҭ7BLpUpLa*}k)i/^փBW4֭m=1]6Mw;ľij 4v;M;J0@~Fb-Mk3C=(4w6sq1\.wJ}A-ddlS׉.Z4C8"_؎br)(qދ.}vly'-\ fDطIz^a wȹ6g Gw`G 0|.c%$NDr^w*$~8e~Dx>{ Ͱ}sH M+@y:1iM/$AjbtF)kYP*Uik]g80"O5%G=b\6 tDZ$oM{pXٷM4=>vɵ!BXbFrigho6D~A*E׾-|; 9(piWYo/;" ڂ2{,,XKf&(,gJw"%9*8my[snd敪9nȜK a̐m!-}vƧQg?*Ĥg٥,{k=]w3(FzKga{ԒE G9f-=,}ZOh0ók0G!θTNX""/u~dP`jT k*\L`o~ZN^p"ܡ($~n 3ŢbŤ$ -b]|K Nd` 0nՋ +"NȐPP+-KwLp"b 怴damEpQL 1"ŷPTVڰa8] ^qimq1uqyqo((D`(TXM/K ND21 1q1qe|Pq$$ L&O~ZZc[ q yg JQiQ"pQ&h$M$Q2%`R%]%a2&er&i&m%  8C:2"$$*^((2)r)))2*r* /+27;|>ˤ!*,2-r-*W /.R<$  z!/30/ 031s111 > l'(D(g">(3 n,y34W@4L#MTs'Xw\6yBR5spvjn&SiQ3S%h3$asǒ:R7C93Ǔ;8;3>s>>>3?s??>i,p=G;5bAAA!4B%tB)B-B'HJB $aCIDMDQE5B)3?@ۓpFmFq4GutGyG}G4HGy@|a^T$BT;=$T=:#@J"CJ"6tKǔLcTIM4!13[DNUNիLLMTOO4i4PPQ wt8QtR4RUQ UL-Q:uQTu%P PPKdD%OEBPS/img/xt_wse_console_overview.gifGIF89ajw!,j%9%K2`?~JMWTYme s. FcJ\e` dDz,u@}at #So!W#j+!P&4',+*)))).:F/AS$Yt+p+=1*I-72Kb4\{2d876?Q8.?@ADG8To=Ͳ7A2b \u9|A#]Bl &K&X )XG?hbZk 9AF!۳8l.݂~D_<@q? P A\80\||AA.n SŃYG= ],?m@"Dg?&o  y+WÉԼ;gGs,B4҅. `@0$q2JU\NK+C"C ??K,w8֐:xS;hň*Z D" Õ@֭m >zmR*cDHy X&#"dM( ⥀5 MEB&Ai.1Y4q!m/F_FH L@q;`5F0BXCDS͑^Ki93[XKT:lq,WO6rp8hB10K借L)tHXRȂ SsRL/mVكH>F&4 aCETTr0<0ܬ wy TCxnUx-0,Xtn HKCg AaaUFQ֓e[|q|†. MlX2G-MMdNz;| ]8O@ulevCPW9!oB69b@FE*D)zqX״܉5D"Wl5]ws w~y钳 oSN-& [ΰ7{ GLb a]_8rl쁊]b?/pAO cC cnF.p\JѸ,%a\5q\(#C2njf+ i7|YBs=Y jHY){9Qy {,X\I`橡Js:f؍٠=qjfJyAHȘڃ2z{Y*z zG8z;*{/*y K{ΘY*Rɂ'ʩ؉2ٯKj,٠؂۱JJ-ʯO˪ I{ . *+䪰: D ~"G~N F{{:7T|V{i{ǵ]b}bMjQׂۗr[vz||귂[{'ض۸:}3[{۹;[{ۺ;{ X`mۻ;[{țʻƋЋm Cq؛ڻ۽+O0Km;;O雿 ]<\|  CJzZz0$<ԗ *,.D"%<x)&@ {<, ABμǢjȖPX }񰰺} I+AA!4): P 2)PD3ɢ b *в>  L{ :@)<{L@m \MA ن0j֥)3)Q]Dž|{q| {GծlE`dp $9)`XcJ):P]\׹'I}]U-{&XZp XIزg֥Zgmبʸ-l}{[Ƞ2 m]|ڱgBBl$.`]ZȚKUxy6A3za{r|x]܃E LN1m(ȇ4Mnޝ Q*-jm}m)ݷ͝~wG ۇm(~m:>ÔY8~ЍgL仧;T~'U^x<_}zp f~hjlnpr>t^v~xz|~yna{B]~舞芾茮^Ͱ>^~~>VHꨞꪾꬾꦞ~>^. >N얰 ȞYJE ȝ>~N酠 ǎ &.ؾPP^$~@> p l>P0??ψ VA7t~`'%&>'??31_@BoP k X0Y0,#T_UD`V& Z%9^_<> ?iOkCB xH $P~ v9^- /_$|l0c ʰ JO. /_$PGd`oZbFoEssdO%o/ܰ![25 DPB >DH/&RQF=l,]g|D4bA%Bp5頢#^Mp ɓhx@5)k@7h>jLꐟz]~/ d -hh%X2\]Kr\6%DN,` -YbK0G %lqe('\YG/눽Cxv;-*s :ʤh\9uʑkĐDZР >@iN>rJ(?]ʛу[T,Ĭ 0@6:eޚb˷˺lf v3烎ˉ -`e40x҆fZ 5_ ˺B z-zꃤ~h/ mv /xx.;l hԇp^u&qhJm2YZB9pBܾtҤ;o,B,!j5+}1d c[},4|Qkԁ!gנ ڼsۚ>TX$·܄j!8 xy΄:f!d/cG`m ,1EKW )Y"G%IΖV٩A2B mfQ!]mTQ ,hn[;t!'`D`#L-eeIdo{\Z4N\СRCP5Az輛C%xgUXA?xzZsR y*2d ad G>H "Xx=ŒStQ-EkO!h҄ i'!rkiO8'7B`m%7͢劜 `0 l:p^|FWV,YU)]P!YZ<4,]ӏBq٪\á F4{ C ( 샑a5G8cs} CW:=1%BQ,#Oc!> |>-4uv.9 sQ"x#o^ȼ  u  | oSbZQxeX[/E f <ܐL</"/O"ʐe9~5澐Xer N=EFz;%۬СH (J$PYfu+zG =8~#(" sPʠt-m41D}|M<:yW565OP[2 5|U˄n 8^etݏԲ~bi1([oGg§PD: +cСǑ `꛳ H0 S4!p0B8B"&t'()*%0+-./0<143D4T5d1+69:;|B,C<>?@2dBA4CDDTD)EtGHiIKL|JNO4P$R4SQDUdVtEPWYEZZ\N]_FC`$b45cTedF*LfhF`jFlxinf3pllmsD``dž G$tz,fc|dwļ2ǀY|4jG%yȆtHTʓȉ|ȍȎȏɐɑ$ɒ4ɓDɔTɕdɖtɗɘəɚɛɜɖ䂞ɟʠI䉝DʤTʥdʦtʧʨʩʪ\ɢʭʮʯ˰˱$˲4˳D˴T˵d˶t˷˸˹˺˻˼˽\K$4DTdtDŽȔɤʴЌL 4DTdtׄؔLҬ 4$4DTdtN$N$4DTdMtOO%5EUeu QP4EUp `#E$EU&!()*+,-R -R'e05.E4US+M89:;<=S9?@A%B,.QCUEeTlDmHTS%5355N6u>Q%R5SE<@DTWGuUXUCTTO^T`a%b]U@leUTYUVfkUU_lbnocduh5?ur=uuTKH@kyWp{|qCr=vwJ hVWzeX_ׇ؈5U~C-Xv؋փEP"mؑU5ٓEY?G1W?4X5׌%eWYW+]6=P]X5Z4M٤U|#tڧ5Blݛ]ڬڭڮگ ]T\\YkYAYY=[xZڎ YM=ڻҥ۽5VY^wZ1`fo'=A9&gktaY. @jz~U]FYxrppfc-n%وhQkhR钶u>bY_pwYhf&PgiΪVn#DF;f꩎yfkJlxbd\\#'V2B` g~akph>ټhoj ilV/`NlK&*lrʞ扱i^^Ԏc4ctx`t~'u.mF[-v~^G@節jP^lG>mS 7 X S؂Rh^*  K2hq'c2q]m_r(qj:|Nj@}5\5c&.zV@EmcPfj]4rrE;sx'EWUguDot(Hs-J?LMN`7VRiT'dWegfWWv]P^P_UoֈXre[@mggvwwfhWig6}wl7m/TOeWgB 'xPxWwyrzw.wUq_xIw9 hw=ʘQ'zGWw}Pngy}wy8QPzUn_MQPzwQzw:O'uwӸT']y']<G /Bȗɧʷ̟  ieh'̱݁9`wׇؗ٧o}RM}ߏ}G?ЄB+w~wB0/.\D(毫}= Gf,G7~E~w{6PN_2X(K;,h"\2l!Ĉ'R%2%p1AB"G,Ə*Wl%̏y&Μ:w'РBs0X􀁤J2mt)t /*MBKYtg,ڴjײmm[K6o: .ޒ[Ľ1.sf͡3n>l)֩Tbmj 0h 4Ԫbs؀GoT [6n ]q/nd/3YQ=NRڷsOKm;=HK}o/SorPBܟ_-}W‘*]&Q/,Q?{1$Kt%AʂiLY.12xNeX`pb23qa .P$bg?CCU4qzRB(4m{P:?V0sj-N$Ah5~ (ac|_1F[ɨ6\ # ÇřEpdps##a \ƖQ 9l;C X%zcъ@ DŃDXm϶.(^*IAI (,@-k|ц)Pۨ+\2dDD7vsiLꏥpWgn>鑪iM' fI$JK`TyM*UZcPu%&͏:zjW(cᯌpMZ˴bc\τ%"<b: TgvQ~ Z\+QZj̲ mp;[U_pUnKmN[@-}:T`SJ #;"X\F{ip'2F!-oG5@oۼYv.ײ-_D`ͼY;2:dNO+xwB6?3X, Sd{3̦^É0'܆ |8 S` *~&0R?Hx4,da2 K <`lSY1;f!s^2,1f>3&8\MJ,9ӹv3g 9Ynʞ-AІ>4g)~4#-ISBf3,^8[Ӟ4C-j;T-ծ~5c-4Y=]׾ `4z)>6e+Hu\s־6kg:^u-q܈6q n~7-yӻ7}7.?83w7mUk9)83s8C.c9Ѓ.I)R3N:?nt)Q:ֳsSG튱f?;Ӯn;ѽv;޹~ſ^u0><+<#<-hG;w+2pɓ+ =.Dճ^L oȶ= PxkES?}6vbj2 B](-|s9;n;߽mZnph/+<{͏bcgF )F-ĻE0^ CzE!1De m6u" ."8  \u" 5A ,M½YAt4azfZ 2.1,$B-Bf! [.i!Ǎa!#^z[`(H!0! ta!6L$Pa)"8@\C8xB+"(MB' b8 b-B,.C,)2@a/)/B8UB)b#=R!Z!x'^C(RZ $N?c L1dY@]AzB⻥D-2A8$C&$3ʢEbF1ނBRa8JK8(A-C#9֙cEE70A=PaZ#]**DFraS((Z!SNT"6"05DN{%$Wm/F%V#(LM%dؽ[:Z; Ba!Uf{(U2&6Z "M':fA5p$fjf8pZXΛ[7d8ҥ]Ʀ^Z,'N=QIaA~B $qq'B*F&qbCr%q&.X!ss.Cd]g8Es'$qAK.~\.l&:Ξ:`jobd t$(&2-Vc.u[+A |BF)&AB~N^ce6 %|ʧ}d:ETj{u嵨^ v'ꨑZ^-)6>)]M).cn]4)cu)`)i%))))Ω橞&)*Z*&!߷>*.ꗦ[YE*f!~*z\^j*Fj ݪz*\r`*>*Hۭ Y)k1k >kMMEj.Ev+f}֙+kӭ+֫+$+ݫۂ5q+bEHl¡mn+Q Z^BY. %lNaYh, u}lȎݦYƛŪ8`&O}l8!A8%֛U- -2-ѝ& Λ.ݺZm 8z/~,emt-B J)m׾[..5>mEVlE^ڛmnn$b8ڬr.߭=8, ;ʛ8.Jný!C{Q߼n1o{.:\bQl.bc62n ../蕭`.8vo{`n 'B^%%/r.'p_ Gn o/.62 { p:0.b S /0Umڛ ^̺.6P6qʛݺ +h-ӂjN.K-Ҧqcn-ԝ.1 w1DZ!p.bk]g19.&2n& QҚ:o2+rr%ҝW.*(,/2-r'#rb/N"0:Zo-Q.n3'7Λ6! &!:Se!012Us!o>'*/s0X>M2Û"32JZ@?@[%4Ic%,r}sF[R!6.sYB%̲MNG rE74O ?/{?0U*oOTg_V5P4M5V#N/5QtEC3<3ޛt[rK75݅]0[l?[ު36  (v8q_ma 6ag0\S#a? ;76b^/v06gqd6X/u5v5[6Hp4tm-6ϝnAӶv]442!*1rua7toݺ5[5ץx"@˵]39wZpmy˛v[}'5q{l.| 7zCmYS]lctXtl~mvn2s]wl?l+mk0Cxsz6{,3Xsxyxu8x9 '/97?9GO9W_-o9w999Kf8z{Wι߹y9:: l7?.O:W:Ig#:ozokT9:z/kzϺ;zߺzﺯǛ;3:/{:?GW:a {ڭºh߸_c oT4#;!;{ ;\{{ֻ<E;Utk޹3!Žܹ[6elDƫ{8fSrЍ#4?ݸgc^w[[qA[wk}C_W|ӯL^)ԟwf#7}5]O}՗|Ʒ[%[]=[㛅Ut~T sAKiLO?Y ~_"Yѣ0q +W>6츂o 'E mF=K_w޷Wǹ_|(A$@S)%XW<%-!`bp B:)!DqILy1ƎaƔ9fM7qRF:Qp5rX Ʉbh#&ʜWfE8c%˂m1ф9zm[Z*ٳi uoߛq2ilj*aS$WPR-.†0+jZWSK z.+`<{#P۷ }MG\! !)L<6:c)rƝ^>uy;_v Ν(e-6Gr/.rm=A slˎ$\0ZC p>9S":%pr0@B fMv7~L律X*#ȗ\g;\Hɓ3xQ̿vTo|#p,<& jL\L$*\OD%;sN ڌ<' 'G 8I`j/K?j0jGzHpx L"3e".J$$uW(x<ӕ= CVYED/635Mc)KV[_xVjrmPƸVϊBFst7dȈX~#ep +q*WODHx\Qb_sWY=b?siUhsX kJ .QBeNZft"l ,G$E % (k1S Q,S#@zabӄ`.QkN (`;.)#NU8VKdHH'eʼIڞ+]Uu@ߦ,U̓Qp Guyחg^xgot/wvnsiVYBB_ʧ|=Թf?A_?m{WM<R~K &0UW_;yt `MW gY`By}> 4%e-t aCΐ5 qC1,SD!E4D%.MtfRQ-n]F1e4X&4mtG9ΑuG;FG_dB,&4!HE.t#!IINETe-d[%4 'xT-qKG^{dK(}y`'$&~.ɇkMą+y@vO5Mm⒗<0cS&$&6+z QfEr=M&gYTz('y9ҌpON'JshFiИt1#a)n-uK/AmHoΑlh<YMԽEgLSwӏ~sljN$R Z,)NjMB'$u`e=$RҴ5DMk+D"R3OUD5qkӈM)T[9MkOeh艁]7d*UUUWj$:VhEbaۓ2 +TS/:@mL~+XlQCL:V+x]dg\@58k}d(JAPBa5u L-k S7c0` vڤH5yu'eƜW 9]5a\8YErF4*M 6(Oi鹄A B{ 1ƗumBW&\E]tF>Q*kI7y!+XLfJt&4e& Cf3#BՔ" hK b uX{K&1d{D򅓣ʊPvP31p3-+_Lf:n0-vstx mYUх ?Z5)-#w//Gx&XfF,@CaAjK{~fZ. @V&_9ޚҟMj I^%f/ZȐsmn=qVI GqRׅ| u+qyE[f42GᖞL\ !P]gæmn)3,2S a$\z Dr5Sv1;=zI@-@9ǜMx,!C 5Qz 2 :y,-.-:R$r~ I2~1a%$kl$q,Bff?;#N^-ӈ"L5KF@wM@qѐ,ǔ2R*9=L S:t 81S@ 0K84B,ђQ;R:-01(SIRQd !T "JNPNEʬAD>3t@KŦu7ټ=s a;Fϴ"-Hq!sԐEB%,O%yvP! ڤ= Y' -3Yr.YH$6@ bWXb.b\E&d61A;&!D>U *uqBSa,M+`N]JO˲N <-A@-T2U!=5#q,AM'nY=#SRp 2Y%! fhxJl]sT^d1M!r$@5L}2VtVE%rEj"y5Y3;1E)J9n=*U02k0}9E/0  eE- 붮d+i φpR͵Role Ax*>qO "j iq\3RipBx#Bt=='Xjo)RVh hAoć|vMjז' EnkԻ(5Ioooo!p r% >nkW)7 Cwp+w/Wk>Yu]7vewvivmvOnE2uuq;0Iox76 VThx9wy$w˕wq7wyks.{y@{׺a~~|7}7<ڗׂأ~x~7HnB7 ؀&x*8x|Y#}W~3~77x7}?&@LԊ ʎ ʮ_lX҆-*`B qX&Nd8RXQWqB7`#f+j7LdNn!v|K3 '8L$ 'uop: "\BENx4+u:MxBЭ4'8fVl'?4>2@BlLbىY,1ذ?6CTKMIN3_ķ6*lȧʰX.c $Oj퉡ٙ z# b5%#5t.lQWXF=\=fּD@.dl@M\)$"b6=:b O e@\t)|-n=a?C$4FKL2Zn?I ߤV$d[zoߤ&:L/ )r ƇN:& '"*z?:mwNihyD Z5T 2zA\ |WkmzQLy(.o4˺ؑNx9EvJoxz׃V2fqqմ_さ!e$@ONZt>G^³W{kgl3'xb)x+ۄ"Ez嶾W$h |('{&؛ <'w/áW|ZCO~X k ˏ{vy\aǁ<ȅ|ȉǥm~ >>#l&}ձsb>5~9=A8>li"}-^+0>a>e~i^ڱm\Q^UIY找葞顾5҅&^>~빾%~>W^{⿾>מ&^~﷞+֗ ?ځ^c1?cB5_>EI??KY]OS߰^mq_65?s?>|J?շ?7>}_~ ɿ꿿x?1" <0… :|1ĉ (` F:^DG6f,+ʕ,[| 3̙4kڼ3K\}ѡc O D̲: \3ԩTZ5֭\z-hIA$9εlۺ} ЁBqDܭ?t!(P~=8Ō;Vv,YpC옖`ʸ;{vo5:&k8BHk pDpb![8?ܝ|ߏ[=#%Y,fjA?ʱ5(bpt}@_,S@ȷa.I-7G1wna~(w&ge%Yz*bN\~ӭve#6A8ȁ}6m9wK, bRNIeD@fajQgX8 yb,!'A1PHG% ٧Jhb❸Qyb> yեxe~ݧ~iEib} ERފkZhFK,\OȁSDl–')9QH)ePɽ$t$枋n:Yxv)ЗK\aUnk(rhpKpWcOLq_q #pY[W |rWer.qǔHF&s>+rB E ; u*Mu-ֈ/lM=bͳf[`dMwg=t߭]IK grMxT⍸zk=nj*-rsF1u_oYߑONz[ب/gzq;Ş' 㢻]z:O꫻|e`Ġ2+Ou8N=MP0CDaA@?Խ@Ta!_Ro2D C7T/?24 ^1DLV.[X5絋f3ͪA\=K",=Q~kH,@D*!@|a?2~2d É 4F'ꀎ!^!|B {"( Bg?B^$+U6Q* lgep,٠P`  0C{X@֏ 8@a8YBď|!q{d&9=:=_48%!)IH8HR,+M9IY`% f*G["d3I& 0LpqEPy :A@(Fₛ"q\:|O!XbФP]$@3 e:r\E aNը dG?G  a@B0$2f0* MQǢ" FhڄV*RUJ 0%" .X|λ/k>1.ag%4 HR)~ZIx4#"I]2{ˢvd Ag"|aj/;>K_lZ6[}>>"!j3\˦Ҵod2&\4| smiv YE/Y<twDE,-/XtAi?F"3{&3v"e]β_"2.cXh g69a4+S`f'O#. vrڣ#y؄uc~馟4LpY24gP=T󑜺uNEisP8UH8p% O~Xj\/Jd)+8'"\U|x?]YG}r9,s sc/{No:ѷztG9v w_W~>qy/hx=>Wy;zbo_~?}oyb;h /+oK'@ߔ]/ϏS?4wln_1׀ |hp 7m'zZ79s,hm$0e}x3+Ȃ-/rz -! r%xh1vu1aF-3WcWUTW' bTxM4Ph5Gx1T@NxF2VEdcWb@0H.QqAv<؃$#t @+ZE &Tj(J1ȎDv YUz;4ΨČ|WČyb}٨ȸŧJ r:A·huu^ʺ8XAh!E8*z;NIj ke'K97ɠO@sukTVYXi˕*Z*Õ6嫝uU뛄** X8,iWǕt3BX ɾS [WfDEhĿ%Ekeſsꇽn{߻"ɚ)XN\~%՚ieEXkP X.ˠ MYZ]fPNy؈(NDEdl[|O\T,Uɘ*艘bL =,ݫ*AĄa&[̳؞EyY5{H\i ^ƓٝȐ G)L)ũe4ꇨ\򙌟D|TJzD+I|T&AJ1<:4!jaZRᨈˈ|ܲZ|:C{N-ܣTA* \[]O7目8:ĢnjIRքהSM9q-c百y~^*޽xڎf{dB+Zk|^u܁N.//>6 ono-zw, Lƣl6eYF^Y(4 1>;T/M%o6}'l0+wY9D/?RcQ_ }L"n1{vŸ~}Y]lp!/ҨN83H$4 #>(e@jSqEUM܂ͪ~G t.:!C ك%Uq4/<Kir+!ȓ, 5 k s4r,1'I A$@;[5 ,B eܔ4Qp5\ă SUuՙ^)F*(ʑ8p+RH^{W"2UbSXde \&XM%=?eiՖ&Wq)Vhv\_Uwݲ mIZyjr&zznciFj7[U ]v#Xbwb3xc;fUByeU*ru,]'v^+ckfsv e]ܖa6hdyivi N^*e\ui&Ki{lnUEFqQ\Yk 욖xEХ*LqE<gʗWrOmo5{j۾:h&znSom}_1Mا}A mhYUr͖:7pyK]գusTKlT14:"5J67h\ԉD4|~M.H r(}wYX#PA o%UALU<΁,m$;D[yr\2=k53䓡JwJ4M Ra5 {|["8LjM@;CȩTY"n26Q?GhƁlM }V+0k, H1,Z9Pv{j Fr$?ċiq4&(0dTa"HhDy$e'DZ[TP$bdTTt0k++ @9\BIkD39eIڅ5 "\M1~#=:*E+f?tA0~SC ^<5JgۃOb2t&ЀoT!apO ZA*FiQsLUN^fw8TBV**3Β,Fs[h:{*{fW{ܯens rVQik!WhQs]-<]OanWwnx^nlw,uWo_UwՁiM^Wkm`G$.i |*X1̭=R]}T kq]\2ս3b;wc<] y Ʊۛ'Yɛ/k^}8E^|e,Qȓi,d>"9>r|f4׫3Zo4p ^=)^[{`$%wrO%8a}r<<'=I$*9?p+Rn-p:y.=,;(Pw0^i"IXD~XK4A9|] [=֥Ӝ ed(8S2?Nwew]8&.@YT6T^XFYY%#C'-w橺ᯇ}weGn#`ٙҝ0**&;;Ƹ>ێͰy:)x[&1^C=zK7[7k?c$Y)0@ښ Az  $(kA ɌP7[.AP-`6XC?`;0aCLꉸ:C bB+Aq@*& \ 㪺"Dú@˛+C$ī!oCLMI:' cCsC8CW3 X]Ŗ,8F<^E|[t!w`d _ F :7m$5e4kƮyF+GFFEq\\4Gwl4t[iw:ֻ5z4rG\2}EGǀLHÒ1szNkPиOKL\MQ #MQ0 mRŤQJ$tR, (L #%X*R2-Q# S2}ӗ8S)e5L6SڄS= 9˳Ӡ;5 7SC.4AM2#CZFrS<"}I@QAmԱ5hPU-.! JT?QRSM 7⸕`+9 S  :5:+շtPEu[M\2[ė5r(C<3 sVZ1.`m%nLXU%;M?[J$y 1Z ?|M.ڔcXQ '=vjW t|{X RX3hɹt('L),|)Yhׇ@ZRb٦t5Y- ha+N; C+*6N4yK4֗eگpScĭie#{l$=u.LSmZa lw)IeVS-2[qɕE]Z.\Y\eх5]'E] [l]-ݽ[mU]UVUClUL-Xؖmܵݜ(ԙR͖0zռ9iMFMZ]͊S2BZS2ɸP5+=Xc`cQݽ T Pm">"䎾@dU4. TxO| -è'C4DaE6Ȧ:H#ًڏ# j,L5A8f1Dff&P)dY ͬZƴ[bxBQYEAOu+NDb*)2A 8~6n %bZ9ŬŔN9D?d^Ql}gx~ %\y[g mi=*\:bEz薘zQIWc]VvZ$i[]~] R15ΝꩆѪRmfЮQ\kk,kefL R7ej>k2eInz}ؚ -pH\.le΢FUl<lkml}c[ώQˆ^R6&k悞XmNF&{=  vǎgneeo~fﶔEvl^oK=X: \`m6O\k烊 p p pppqq/q?qppi(Nqqqqqqr"/r#?r$Or rxfq%r*r+r,W &Gq'p,s1s2/rn\)7s7s8s#GsWfd9s=s>?q:/q;sB/tC?pst/pDtHt,Wwr^䬖tMtNb ?p*S_6pK_s} DtZu[p \vRgNaEZuo;t[_vfu8؛"iw':i. &5NapbtdovyG :9 A'g}~C0dXq7 @qнoxWvzxA0_p"xB(74lvOKֶXxy23yB_.y\ySia/-o q( yz* i<.z~ ,0r# "!H zw {r}Bjv+mkv-:}/wxuvotx{|k |Rt0'|O}} rY!տ}i{y̴|!/e}?~nF~_.pkٗ~7~~GoGgu{[%p qKp!Æ (``"E.^ӡDG*Nd+ɒ&OLr%˖._Œ)s&Jo̩s'Ϟ> *t(ѢF"Mt)ӦE!JiFu+׮^t,ٲfϢMv-۶JJ .Ǝ. v/߾~u+x0†#NTt/ʖ+Vy3Ξ?v?J{p5֮_Î-{6ڭCέ{7IGW,2ꊾ|#O|9}NQ8qNcϮ};v>鸈.O~=Ï/>0 WnF.X"'xT W~ĈbrءaE:Dx~/3X7☣;c,CYG"K2٤OBXWb[XhcYgfQئosYw&j٧f9y2ڨBMzbrکZ^JѤ Z$;PKvnxnPKdDOEBPS/img/wsc_groovy_intro.gif[ZGIF89afew!,fe#F-Z=[@=cHPU Da?}LZM_Pl ?^ Ho W"Xs"b!j///)9B/Li'[v,[y333/8@.b|8h2e<<=7BN?YTjg|txxɽ H*Dx@#JHŋ3jlぎ CII R\ɲ˗0cL٠J4k&ɳϟ@ J4B*]ʴӧPJJHJXjʵׯ`Â(ٳh.Dxp۵ nK] ?˷̿I΢+^haÎ]L2̾3˹oCVv踟SWk̖c~I8rcƸs綽0ɳ~M^.4sKAQ ^ۺ2p繫_}H?O>tn>2ygMh 7 m6@'jͷAtv (u1PD0(4h^k%@)$$9H&L6E %FO#&Ffk,umk.2aݬnTh34ɽ|o% @E^H H%`Wl\P:L ;ūEVH'",D 笳T;3-4O@Ekr`(#Kgs%Ԁ`](:Lhu ?pQFqYpo'!؄ H|8oSGo%^ݚ}ny,xqpC'wzO_yfSZ ̈[T,'Ľ+Ipw,vЂRC ({|(O|ˇ{tB eP, |~!//e-r-+uZXP09Hz^Q-^~1o_CCAXk ̆"[!Y"@LH%TA"E BQch UE)2TDXUС`4* PIc:A2@ ^t݀:&%`QYz8H:  A? EQzBЂ!G BGhRp2U!XDQTT (W~1|A O4'd]$"!F5oc؈mX g/_qgLc l:SڡJzؗ, *~h'}@e*.tB0*UsA b IX(!24BJy/=#" d iMo1z8 ᏛiEZunXNщVt{(C~B{鉋CHwUKugQO|4"iY+7`u[оUo+?Uy>{gJ[*#X'Nڴ`]*2&Vg'jZ&n(g)@GnCH$p. ,)T $0i w( ʐتvEC͊״`Wk̏*bwe,n`6uՖB\jvV-g? "}[.XF(Ml#RK:>z8s+FF AF4 > yC8bm|I`~kX#n% M~ҡ8v [moA `Oax .A XÚa^+D K@PpG Ayhy]j$K-hCT1(qM]Ւ$$ Y|]pP~i )kz:e=h!(љ\JsիhuG}Xv"ՉU7%o}Yh6iTZV4P~R"PO񍋵߃*}AE |4 %8`!d r80`* '&:HN l' W!ӪTAQnA/M5wBpI-m Z{b~jm X%y8".?zhA ;oblު?dQZ^y i ˶Of$?!@O}mOUYHMwP#~Iw?ӯ*%0GSE7J, #.ϿXP g#WH(p~r"puXOi` ''!}"X|&x(&8`m#02x^#&P|@0*8DX'HJL؄N:# 0 PNhZ\X`b8duPQ]l؆npr8tXvxxzP`8XxH8Xx `ȉ8Xx88؋0XxȈ ؅Hpؘڸ؍8Xx蘎긎؎8XxX1 ؏9Yy ِ9Yyy("9$Y&y(*,ْ294Y6y8: <@B9DYF>yJLٔNP8VyXZ\ٕ^`bQYfyh 8Ypr9tYvyxq|ٗ~Fɖ8Py٘ Yy()8Ӹɐ9 ٙ7 9e9Yf ٛA9Y, ƹٜل9Y ѹ p_Npx`ُNpp繒Q`IؙIɏWЏʒY AW@  ŀkv J ݹ0 xp* pޙ9 ʏ_ _@8@7:* `0: *2*7P Y,p-,@ pT:ӠRJV: Oz | _pxОp oСwJo`:?jxw  *1_P0 0{ڡAZk: v ٧: ᩠s0 Y@ HG[0 pڪ<ʦ*n'kWШ١ڨY (*3ꏯ *JNkЭz Z *!J! ŰHЏ9@Z9ĪAyX i;K ʏڮ{᪭hp €p: + Hڏ0 6 hj@koӐ `pPNNzYR; O{ʱ*0U W _0`;p: Ybm: }7ೳ6Kv; ۗCK`Тy.: oУ%: ``D_;&ۺGKMT,[:Tz7,?{қb ;;k`Ґp@Z@9{{hO*p0,S Y<\(< <$l"\(y*.ܚ,2<4|86<È>B1Pzk}]Z[m[ '9PϽ я09ҩP|͗ LN  N ]` 峹Pj.-_mbeGmҨ͏kya=i:M<]ϼ,[- ]=mMp-׃- M) - ZуP}jPctP c~nڭڣ]8 ]]۷ڮ-۱}pwM= ܸ]ܾ]ݯ-M@ǝMܺɽ ك(ُ,nq}לՔmR Aވ<( ܏m< i] RΏ>j]I~MߩpА ! 06$>덓<]r *~צ - {Q>UiGh͏Rd> @!c^`> oޏ.p^fzjސ@mNnv^u_r~s~i)C,]}% RnAf~   ͏@b@~ pݏ;>딾-a R>n븮^.^E> |Sz`噍(ҬeŐ!MR o6mpn  QuͪTOMP*/ /nNN^bP " c 3JJڌ0n@ePeXoQ?U-[_M YUFҡkoIceO:׀^i;o(PuU!OJϏIK ~Y= v?3Ӣ/Y -2~Ioͪ(/׶oͯ(ߗtͩh/?Ӽ_G?v/ / lL<=1h@ DpZ*1 ŤRHQDNQF=~R$G#MDRJ- P@f%]4hN=}zgPE5 s&͌Ct2SUU֭Jg rʱa͞YZmzip\uśW^}+`… FXbƍ?YdʋeJp?Ν=ZhҥMFyͩ][lڵmƝ[n޽} fҌG\r͝?]65OǞ]m^w͟Fz?~9ׂǟ<~۫/@ D0{iS0> /d@ 7p ;0D)$8E D QE AtQ@c1@2%Tqg= H#q+I'2J)J+2&UԲK/6$L3L5d4ۄ3N92%لN=K>M@=SPBQEN3cIB<`Mp2SFIC8NBOLS,itF̂Qٰu77=UTTx`#d^ut)֜ MnY29`UuӺHbYt]plR֕C +}U(W_6J|&Kw3Z4IIX9nHEUY8bnف22& M_YH2N"My _Xyzf78 x(,[`^|IYl9`LCb&YheᕔQV9iaayxuf㎩A~Y[ԥ9tA% u[LF$ZS>2RI>oS8qy}͠,7ӫa[ZT9tTeacz|[T#}~>nؘ׽aV׸As ^ {$=5@aPBnbb:B tjBʐшaR7#HX [N4 "VъWĢVBF80F$#:LocQr ȁ0\c 9HB Ud4N 6 9IJR_DH#Z159|b=@cY@G6%+K^αt?I"a,n(4D3M b&vif/c_l"81*2c))NzqGxN7rh//){x)UMbԡ(6)6T, FQytfS54hCш}2/%/OX"t&vEa@6):&ʽ&! D0X@MtDQwԀS$E:Q(UfU7|"+Fu0@!nUkF#pj qxTG*U:XCz4K[D cbr@X]!`֍]o՝z5$ qdt|`p6Y{`+[ڒ 1`Ƨc1l(jĭUGU*6ѹmԟ¥YQ" jo?p`vv+ AMy4mp[׈}.:+TL3n?Qh"fR<[zO DIxT/t SJMľw;N)jL(4gM?o`^4g_Wh9Ã=}m}nw>R+XP,1c򠱾}z݇hG eo+5 dY93H(؄#h,<1;?8c Vj@4=3tȂ`(Iҳ;sAS<>B=}(؁" @۽)B8 jMB> K)@5l)2>7D?Ψ7CCۛ8tAK@k;›(,C1,448u1@!#EH2 CQ +Bs4G!2EQB #8cBGFcCd\!Ftك FpF;˥9Aؿ#>r! #t\s4EQǴK_)`$Es1Y,C llІC7G T³cȂGH;iÂG# -Hx,IΈΈpHP@J= |zdwǀt@|}B4[ȆE9\ܶKGt=L?syH,vHpT˳S+ヾ"ZIp|IhK(Kt|R˚@r@M$=xAsKLdL<;h)`Ldف-9k]X;I Ż˻> zJg݉4 E+|y(+B:UPEeFuGHIJhLMNmTLPQTP%SETUUU+4A#mwȇ7JTV\TS^U^`]U`b5ceTW0X#svR8UdN%jIlVGnpV@u3f}{hp09VquouWlxy{Ve2s|xnІ@jW|WW{5X_E؄eX]?""yZh hXyj]؎UՏّ Շ Ԉzhq(h%b٘ՙYOYT-W-3˂/:v).v}XUppE% ETF)x5z5#ٜT%k[GTH W}& ."lpo3J9rYUpTǵZ%OP>8ZUG8E\UhE=]-XTX}TٍTF[V!9ؙ,5 yt8^S^(t$ߒ*^&Q sBT j&B?0-%iMF-偪]T:EBFPF8UT\ͅ\Of]JZN8PNڴ >9VE}1 Nf8)V`JdZUYP`Raa7a2#|%WJ׉DbG@y&G*F$"cM|"ʂnGrPp5b0~'5F6FRb(I˝C:PF9U9U(@)dH=U)`[JxUۨU \%XS1#eYAWVT @U#@Oa_e`>b[VuAv&Ve z33g3CT`"z"M:3\Rb#Munwg(c@E.]]T"NEfTGŁN( [B-hEh &hv\ d shEUhmW\&h=,is< ͕ژՒIÚVBhFN0jfp'~*o:b-agI㧆հznvm2bngh@΅~߅^TO[FCV`d"DFVPbE]hiUViFǎEv隦k^J_7dh$=IۣmVqc:/V)ir*^A"oREnl`N8sͽ-p$ >a=s7`kUUJR ~`>1ؘ)EA?E[PowX'swV^pq8TrA&uR\TMEiuQJu^VS,192#Q/qpu|hNUB Qm`WvU_mta?cGtYfw(2zW(mp>(wzV/YMiwNbdWQg.+X^2|y`vqt`lyVbx|}\yRyMxcGvqxk"sv^"{wXyl8\twu7xUN[yNv֛xzMY? 6a8pdˆepHf5kgȵora{6{Y'ߵK{a|7|rȗɧʷ̟|~||wy|{&.'hH܈/K!اJ'߇x}| w@z/շGp} ŗ?1o[~O~w|Xtz~Pg}p/aѸ+h „ 2l!Ĉ'Rh"ƌ7:h"Ar,i$MV&`@ZN&Μ:wg=wzW/wiKӊQ$J! %L bǒ-k,ڴ=90ڸYUt S&MO}~:ݛ箝zm3ԪW&-0WF3Т 9 |)sfKgOы.^=|i-TbV (gUSnncκko;|F㭃7_壉d>? 8 x * :( (Vw}Rx1E w%Xrlg"}uWjz++[' zdܤ G("?a(Su骻.~% ;/{/// ,` YZޥx2GP!w㊬"] lﻲ\╼'21<35,,W! „6MsL$Pl 7AQ˪$6nY5]{5V۸s\=7aMz`-I\m=?v髿>r]OA;><_~H>(F}3M0| #(AJB#*8 r C(&)P*ԡF=*REZ.+=~RV*TDuS*X*ֱV{CƯn}6օul+^Tu v_, ְTՅ2Xrcu2s e8%8}tq 2C*ZdFd[]dc%`cdXlll!&c+i}$i͘F6t8liSKnja; g÷xmn]9[ 11tZ+qJݕ\ôľӠw^36+5G`.HG:1ںXF2J%`\]\B؅o/-I2FZ#x[^+0aceAiHFkwDxː2teL_%drw>62%!WȆF6={Ɔ8-AЄhD#IvGgYdwRp e8o&a3wx]Ll"S.~O9rkdq`E. !C 2X~6dv,ֶv7 m|dzqܖ\c]|ӌH{ٴ'nI3vnf@״8-vڕF. `~g n-yk^h!PBH%`5mMVGi.K D.0l{awqO5DžoBJ>Z8Xa%Yzבp^ xb( -<ƶœ#p<9p^Bnݻd@ƔY*\ko6Wڽw1k%r]t=2j;0! Y{o(9́SN̂sa8ȂAa'9|s@'YP{bON"2nn'úesNu= %n13_KB%-]ԃML0UITpICpU@@B.p%, `,퍝q`lj-^ԅP Njf`EJhA!Ad̂[*4`! ua14Wԅ pH\q@4P°A4pBr\%A\,BhA\Ĵ,PE!'VS®@&4|y֭J  B*,\!'B<Jb4D &v3'5Ab-r%CQC3nTy3[E4Mc)G*P"\"PB*XIE#mQ2#%$&% $B&B*d1Y9;B rB<.'=b>V#Q-@fdIR AB$LPCօ:D>4B+`&\O.|cUur|!eId9eAJeLVeLdk4YEDJ0~0Q#^ٜV3XM?%͡hVε\s}h][bW`.ee[sĩ`~WZ&]kHk2T-uC3K`jTYlVVB$W$NB~Per[\^Fa3Tp38.%l1'wr}Yd)C2hBs>S֜wNax. tuufg{9rgsEx'`j|~e5Cj./\d/4^lfmbmW$}}XQջWU^IEfV2MWwMzR&ѭJh(ꥧiUČZoh~Uxhx{RV)x$08(Kd34N-&1-Tl^dv$}X)Qx[ۧ]i~I\U)g~i jwu~|׸V?*~X~.K&(3Bޗ>h~UiY鐆nnB1(C爎Ubj}הh:Ao[jF)֯r1*+M)w=k(zbjgbj.KB$聪&C3L$֤(*&rcqFqbjIEo5'j5~]޸fvpBv^^lrf2}-,f^peylnQl_f%'}+\[jWJ/.CwhwU*>Ѭj[뜺Zn[f]B.%fjpaWiVYYkvsimhhRvƘ٪[ފwUYWݲ.x_ʬ%—%0_K~f %ABzn֫):P@KPHPJ.Ĵ'P.X(*G.VQ&N@]@:ZKPA.C.."dZ(ӎAnn*NCAKx.>//RA@o%&90/XMhoaY %1x$l /1LC'x/1xn ԰$%0A, Vj]N4@@. //K /xLq1A1|:1tJ@O@OC. pq{1O4q1x+o1@D#|1P+L@ 8wA#| ()2*rKcUmg#1%xL2I%p w,$5+A K.2A/`q1nFd$s@#R.Z/pJ4B!(_b>3;3 r$ Sw:{AC,P4@ ';4.?GtItE 4x44KK/F[/M4J[tN44KX/M@X)dl31A.xn 2B*l! oVKZA$\'3d7իf]@[o1xKOxG50qK'|4O6`{d1hDb@c#/OcfddC`464xcd"k g?6m6n;vK0Vo*4P*5g3nw6?sJA,C*.knekc'~t{S_6}*7d6ot$W%6x~GNC!@@!c4P66Bnnv7z8_'xD_JFZs/JxsBV svgZ'*x  7M/)+$u<tCӳ|wOp C73t=4tJwrp6GGt3r*9'{Bs/z'k9K A=9KOSzkJ3M//&Rs˂K3!lAA!1u#9o,AP]?]3APdqt1|aoq'J z tRca4{;:ˀ! @o1{O;r{˻Gs!DG{]+|ïK/<<D_zc2sg"3:ҮҖ9BApxA$+^#<}B.y<<5œ[V;Ks<< 8y<$5G~%;K]=f3gܿ}_=ѿ=ߋc;}罃} ~=G0=?1>޿}Co>+Q>Q臾>闾>> >Ǿ>׾%T# d$> |k~'/?7??GO?W_?go;( ,r???ǿ?{.Ò'?@'LAd 6aiXM0fԸcGA9dM-SeK/aƔ9fM7qԹgO?D,W.Yd%iSAO ƍ*sWA{ʇ'VXlYgb<)i[oƕ;.ӡE&͵n_5X깬Zx8ñi!GLvcؠ1c$Ff.)eƸIzLS iZz kӹN-ő'{(Rʡ 0VhО%F8Wr\[;%`<_zEnt[e~b[#8#K.lp'z n0 ;,;H,@ Ѭ*%BH[ E-Aͨ6Z%6(jkYh,#WjMc'+H`˱#1 z,3d BJM,Dh^ư6ܮJ??"!YE 5O "b)#b8qC@R1JI)sIT%:胓5Cs)FtJcE4JTU$,65re_MN촫;T[mMIS \L#TLPcts-(\.We1{rAWQVm{=oVuif⺐UrG@jAMn ]iUz9&%5Go'Y#8bQUs.g,"NJv+68X@.;9dC86_ Ӟ]I)һIM= m%|7~>Y|R]b(rdIokeKOYtiutM>ۮ]+'L9 ي!d2^1(FxM-:XsQ:P#GLHȫzğ^1fEcKG?VUuCb'ev< 0AcF$ hU'kim`IX39P%Lؠ fm>C05aPx0$k:(C!r:4ߔC$ MtE!N$Y %f1.aDž Ç "8"rm|X/ Cbx21kZKR9r3 btS09&LE8f)^aXƯ P|IH0,AGJjȥI*E2̂`Kxa ehyߕWH<1W3uT`/`9Q_P%,bՔ6#nH7tP 6^TԬ SrNtګeªi\l2"5AOI;b." )CaUͭA~[#/ .a-S!" Q?Q4KAFm~r4$A~Di(J9tҷd\ lep$h_/;&&? c-osmu{6an՝2v˛wiBFw7&[@ 3}!yÚ4QI${BɚXҖ8\nGBea+KD1sC,+`'%mPq%MwELgǞyh!W"́DїtYCw9#,S\?sf&=%P:TE2W\e>Ζ1I I=KzV-ވAZ\,k,-t^>2 j/2/'p =NPDlpX\p&y<[骬[bϖN'>zpJT@'~ Ќ~ ei^p Y" nhPDlpPjch.94 %P0 Ad 0־'lh-9nЌ;pr-1iO!#'Eq;4ޮ=12@ Ia&qp' cqyYLqD.Hb  ]QXJ#E5TP&4ΰQ9%Epri8ޢ1@C8TU^#64wGpݢWbq ,l}0~Aı8l|!oP?dT.sr!e!+~@e@F_KBv8q ˂ wNNg ej.>p' ,U Np=2L(GtodɫͲNrG(W0(֌Еڲج?ꥦbhRiJjlN yjBdSW&? R]F{*!)O0b@!4jïZ~DJ󾪧@o'UfĪg/$Sx/"/RdaV:R󒮧PEUH4ap%] Fs6 2'T:o#;s* I 2 Q373i/&bt/ (rB~0I+/p@7fa6 "GE(!` ^Q6+XI^^4 Y%_fE&%^j&\%svb&3? uQEhArįP/orQT`0ftfC?p%oAīg_CL͔Zl%Fh_ΔrF>JI1,?p?tJPQGlpStWN3JX3'SI QlQ,G& XNocVS,fXhVXO5qtV]^2ps:ZUZ!vZΠ'6:V%`} cҟgzz{Ua616e2<3k`KB`WnS$)V$MV^yb-'pk3S&#Ķ/"oBaDpT' Q:9Q ooT-wk#7$r=3T7W$:sMCwGW$u]TO7v0uuu7bd7wwvv5wu7xw;w7yKx!xx7zyUy27{zxW{z;{|h|v}w}y߷~*~y~׍W~ͷ؄w}x |88uz)k"yh3VB35`P.Qi+Xv/{w=EY,$3RAPNrP3I1}w6-{~ƚ{Ri(}^pqxuv(Q%^Y=w'p8WSs`5cpxuh\VaHtMS.FahD[T8xtHf\#_ptݯLP MSi̸gqkE7i(nn]'\k5ZõB_[1גQuW3&dVizlv}24zV6~vdu%Fv{`rxsCH8dy%9r'xl9yoɹ.lǹd9okzKdLI_5y+#\gS@ı$4љ:qW&pt_y+# ڀ/2Jaw.yK .i/iwAi]i1~WsLb@w;%CWRsM ,4S[$A鸧ϲEFbBf}G:_{Qz>UWjTQn:Z~Ǖ7UI9C[ \pp.X?\y:TJcwzauTz!mZVwg59F$q$zﰵz wU۸OSomt;x[3;mr۹{ ;W{[yacG6.?6;wD1JxRRa B}Q%{{cљpWq϶8$^:i~K)%\('A>劇4 VnPM:GkkxbRϕ=]}B`CPش(ښi 50=DEκDECSTy/kO!t>INtq45f7 DI|%Hk8GWk~[BʫMt 堮1OLg5]A㱞kTo40hB#LD&^H=SK]Ubf*PAyS1G/Uaf!q7U"F[,Ժn+d.vn[hV>-H9{Zuz]Im/nn`G H%=LFM LM6 anGEф4"Hb&b*H+Lc6:˜";dB cdCa tRfA V`aZnɥbH cSgY7BrIHRgJaN.ǃ$PC5P(th~K¢g^iHH駛:"}:H( 1khj( PJj l8MILѷ1&gh< [z';C*v<}k"7 ʆn DF )HQu-`~5zEn<E dl *lJd@ԃ=!mE'CY8 bA@!&W|+n0EMy yĀb Ĺqn*[O 5)&ʦZBb iuD'BMvaxJ i.ѣP "f=]ig 5nd:E*igie*"D@' IMbgz%)n॓< ):!h.mvf>@n$nuNRMd@[("HE\$h ovvaEC¨ 2_u*dB [g٪[Coರcf'#뙙]"p1.I翡(%7. "t"хrjmlz rP iFuQz^ 9\.,ނ>ub[$u q"$_!D"W{ `o2[ uتk"6>ɇZY"%j)"w%54t~XmVI{xW O!_QY0U젔`CJzF pZ3ȌrLx;J9g ǀAӒTdbQa'9iLVa2d7}K9_uA"n:B-TP|+ Dbp4okA mSZD!SUHB2]RC,U8eC1$waUFt(ZPţ B~@X5MXP"&D*H:Su%QFe=Zmt)D˵rSɁ @)(J$S3!A*} At#{X" UF(܈t*1rl!Z[)R{." Ո|~*Y~=K ç *Jojz:U 1gdXyғ[H Ptz@P R=$\Xib0!'@O*tE$-0%цD'[&N[ϸ7{J B+_l0gN,WBp[{L')BHO;P/|҉`Ⱥַ{`N P;7H!pp%@fQ{}< IOã!jO[w={G?zOGsgt;$@BFC ߻ 0 2~ p| `ɾ{Ow_-1ׯ;T_r}_{9Rn|y%DchƀSd% GfOxpWnh 1Vx(X*Xo,(.6X68HL:<؃tGEGhI 7PHA Zx@ BgWQ A!A vi pvA/~xZ~0/Z i(6=HexA i z/qtXl(` /h @a a /rp0 ih(6ȉ1`hZ zi Øz(p(øjXi0Xx?Xxؐh/oH@  q@Zii8% iQА,8aA0Ɋ/3yD7 lȒQЎhXPYr:I0(-h7IыȆ/PF銷(HJxu)a0x'lI،\YѐH> h ZGyIqɔЍًz@ٔaБik9g! }Ɇ9v8X)H) d)ک ґх*)YZXiٙ:i PXZ'Jh*Ԅ-袱 hFɣ_iDnF! sa #IzoK S*(%UoWډ#h)AG!4Xe8l9z)ah+ɦ "u+J5yxx)x陑Eyɝڕtz* YZlè_M (cp 8hi8[8ȫ#) I39ئq&JZ x芎I ،ؘZK 0:;i Q(:) i$vfkAzv'yحQʡ ;;~zj7{HOQS LquZzKrJB c+eۃⶎk؆X!x ! zZ;D\˪1*j;馨ZtaA1Xx阫ȍȡAIazK<[(rP ` lFɰ/Ј?Yh;,Ymk⦓<9KSeIyʼCȆh9/naI8hxy z금nhJYbꦘȘky +)Lrs񋿀+`Ahn؛ ȑoYi؍ K@xt`Q SlWYՈi^-L q\-k mMձY!iPm "R mׁ- MBQ*2b]-=u!8m,+031 nڪ0Qw-UM]k TQr%_E _ۼ=n=&!&e""ceSm5jAaݐզ́m!"@npe=CܢWCWު~ ߿}MB1@ C.GoD6pNב8߸=s-A#eZ^ '$p# TsFEEw3$dI/s q @6-dLPjC#jz}&epr>t^v~xz|^P~pQpfh.p>^~阞难n1e}0h ? k M~A2P Q׍~ȞʾfA"!Q{ > 0n2? u2n0]@|>^}rB>4q?q0W$13. ? P /.> N@0@"OupP u!8.,ϊ\_Nw  M0$b  NZ @d} }/k^/ @\?ݞB_GI>n튞Q߾u a?  u /_rbb3?_ pk@zCEݪ~ Sjf]^. Q|b/[ ?o2>?>?x]oqKS DE|¿.,hB,X2H,>c UJ41,~PР>A &DL23L1D t"Bun& )dM5c"I)Ύ!4QnReLso YcV2 /ڢHȲUe G]N:..b!3!Tm6kUKTRW YeH2b ϠN}^U`"X#J 8g!N[L4mWEbU0PPc]$a#e~5!UE$d]MdYvQ}7bD=U6@RN $\+̍"c3jؠ&[_N #7ejRmcRmDolCd6.HYpn.YI8Jl6@rUlT $Ezr@\z0kTr:;2-K[-V 6xv߇0puqD>0ESwi;iiE*Tʋ-7H"@ zhE((ˏρjwa-oi[BOz6L ;46P AvLe#l=Їn1(Q")`< xqHn}k/GB╥zv|0Ԗ$U]F®,50FDt&2S\TO4D82?.J3Apm| '%3D/`h:nc(jIctB82#DAN NSSĤe>3O[sC q RSt*Lۥ2::%D (6>pp7MZ(T9)$ vX<|3tWgDPNnc I3[EoPAT(XjяF,%%GR.c)NSxԣ4XH'B>=O:TըGEjRT+rpRevTSN% 5MkX:VUZӪtjZek^Wկl`;X 봮Je-se,\TVֲlf5YvֳgY9+%mu<жֵmle6֥oAmm np;\}nWeڌVwGq˽[{]Dnw^1#%/Z Ngy)^Rd{+NE}- ,` fyղVY `Nyy:ԯb'FO"8#vi;1q,ǯQt W! GlNfweTyW*nQ777<4@IB FIpk?{F7IR4,È:4\Cb9i!III3‹a$[6J+`EHpPV¢Zp"=ƲDxEp(@@6:sL݃$G %pɼ1&юP,Hs[+NCM( Q3hәD3h'RQɤjLpq'mU-UҢ!L-#))dD#S8[#4 ! @~A2Sl;a*\:˃NLjm%R6,Y*i9{Ҏ-#,I6UI AmCԁj[,cWl0dP"oqL pPUТ$1̘naASɄMv[[!49P o#)THKpB&ekq"o"m6bQ"5pL@Q: hċ5~ԉai1R3(DLƻP'͈A5B%KI8QK;PYO DP "HdJPCkS3( Ri[16Ӧ_I<@R&K/ UA鹖NȜ]^UŔ!;J$1Ʊ'T|(!@aYqԩQYŸ#6TJѢ IRY:,-MؗAlyODӀjH8Y@¸X`>Zלܳ䎠P!Y5U0HT.Y\RX,Z%}}٣岞%ږPUZ-2۰۱%۲5۳E۴U۵e۶ ڪZWP K۲JjZۿm%2cN9E C6ճ#8ʵЀekz/.##sT%ű=@>m [/1ۍ1MR7]h][1u1*up2]^US]MQZ_h_JM^߃^u_|}ڷr3 ܜ:õ 6 `[5ũ@BK h[ݰEߵ44KK)5``}ƪW#YMĵ`^s_{`aa&3e486Oj#X:\6nLa1#6"9"y7{v-y;b0Vb1fb2a3" Y{awb9zc0>^c'3(^[t:#kPd :)Vsm<Ƀ-tXӒ5>A>^[c>e$vYEVY 80=,aRufvޫ+<@!@4CaKe0ӺF캵 KCOP;3{;+;PBԿ1P܎h*C(A4}{hϛ@ۼ!F@=c~==@;rjzďFj\Dp`j)4CnhN [:0 ?XڠCc ?U ?-lE&lE08=DlȖlmFTDUal4D!f  @މ * +h?ֽc\jADqDR8! m8BS£H8'ƊdBкmn444/8>xxiЍEA3G|u54|?/irL)`9W\oML\ Nq-[!WXNkeZZPSi 5#ZX54CdRZ EmA!uM&\a)ŋ|˸Uuk uZQ:yS^G EPF4'o RPvP:V kgS; "(umJVC5&B'n1у>hA}Vzt ՃUK6UTuUWe:Xu=u .wݾyLKY3  aQRwo)g@,bQg4"#pN'T>ׇu%ZWԉW$n__HWyL^uw0Xoay'A$ Jy"1k X֕wf~W5 i5xjNgZ!PK `,M*DNYV2-q(w3ߺWx՗Hx9z~%#jٔDR LQz Y1VQ#yG~?_E`~|!I|2Fz$qSlƨR5FCTٹ`G%]`pa\$b1]E$ʔ*Wl%̘,߼x&'`<'РB8TQIBErASM\dʦOkDUㅅ8rUJJXR.tzU-RRSɸ*A$ir)ӴS'3VEԨ**#eP#٘bHe̚ b#aAMl1[٠f(uAiȒH'/N͗9wfi9t&nݸkW(: 'wC+_ns?/a X5>R8 D(8.  @:' ;PKUVc1^1PKdD"OEBPS/img/wsc_call_flow_detail.gifRLGIF89ap, 0@8L <@ a ] P ]$e $,$$$(Y((( ,i,i]4m (,,,@$$ 0P 000q44m}0444H(U888 _c ֠J ރEiGr)P84@Xd25B 8P8t≭i y+4e@O#StLȝMBÐLHNEɤX:"ax]x_+a@\ʑgeݸR8Od2fN&fy}֗sr tR@L9;3E'R^I'Vi~ԙhet"PR:Z饙dSC.hy VPYsPs e숨"iT7eP*P W;R: @e$`j'|W$l Rnp.絾[1B,1F2O Z $3*PtG5U 071D<<_Ј  EC/lLM2#tYVj.Yƀ@p[>jIg,:h LvT{2D/w~]{ 5@ #j8j ~hSnZԀ+]Cm ]^NdϷ.}\0O2pݹM|V MhRHD5SPnJtH^sX[P'̺B땵@7.#\IIxs680|71n!S(5&.Wg۞+﩮JgAx+E 3Aca\xc JlKA^x7DYJxY)+1Hf̔ؐ]J~PJ2XuR -QEԺUc=S֘H) 1yr+$÷ c8*)o+T"83H˕ 12^K?v eyYTfR6qL5=$*6hX{.@rK5emI%vG&L\&rĄԓO4&H856nj Me:SPֺUTxQS%LX z%!;GSx,u j<~$7rꉋꢺT" WtUidK* 7 j'dUaj`̡=HeřbI?!Ҍ6D:~7x͋[vQ^w2e<2 W ֫| Ef%!+䂯Hue29u-eZ$SZ E=)̠3ԋqo1,ijI$]\>ɤJB 6?X՝򙭽j?1P.3f[}dz5"Yԙ]b)פ}.uJ ܪ@\ת#}0R8:ökg QJ g'_/B5vWov &s–P Fc=&.f,:1.0֒0"vL#acHi Y?=_<;A!-^#7K(ӗc*0}|HT^Ӫ@SPf,͕ C֚FhK7''%zG&W_sh`ja!b|G j1YؔZ,b-̭wj7Q9k z6P)Tl ֫>ȳImm]XU fMtAиTФqߖ3O|Jg;ĭ=R6;J߻339|޷"'/WvMĀ(OW0g΂8'w"? >rҗ;P_ԧN31яt{ؿu7A/:Apx{ڕ~|͎)O;񐏼}c<ba;ћ>OO>AϽuς\~ ȧG_+wvǾ3W4Y {Hq}Poߵsە~{:6XB  ƀ P (x 1vNNa N N01#0llN(qqC0(11,(p,(p1 2xp@XCcl0.h l` Slp  H\xL}"h0 phCxF8 [l0l0 *㰃v肓H[XqH؈цrx l \肗0 Ph|l`hb[CkkWk*awa芰1l&8h$pT&8*x 8[06P!i_nA{>ppX,`hh488o6BSi27H)[~(qpgWXO8jYy*4$!DS%BÓ7$%RB9%%B]1  q ` jX'@ dYX9?889A4J1&{sc)18`(1 I,b)=EcV& Rɘ# ?B(d7R> F5J-0/$W8tv2?% pIo2=7&֗Cd(=A"*JCfeҨ}ɚ6&9F2ga*0f'i$\Yri$#} 9"Ai(B,6Fet%i+%K2ٶ52%e*"Fr)|$T*"%( 9#S韬1Qp~9g(HHoy(@6~2ٍ<87X[2 P_á7\eRUȏNXxKj!cZ2*HW7vȥ `vz=QU8裼؍U r Pxx<@8jl; y؃鐧 FJx^Q򗪰Y(P(%iZK] pxeG[h~GZJ~8#((5I*Y$Y؃ڊ ҶzygYy8jX ~oKK;p ;`Sw X ۰&bi8] юȱe)A"i39(&[7©)2ՓSDS$2SMÔĝ9Q %rAtRɹ%**wOYqK7P9k85q 9M#A,CJ(&Fc)[öS"譳8X4I769]A /Bb'Wk`hhr;[Rhېȳ)\չ8iB0Y+=rCضKl n#cɏ?XhVt`x4[»S֗i7̓0B$һKHeHxj9yHAZ0 b9 9rC}` * >RV _P)㐉@ W*j**آKì{=וUˡjȆ&:#] Ȇk-?x+7݄N{7Om2XJ2G9.HY"]):M۴^X聜uh[xX*\̕=x;k<@CK%JU/*")#2f2=$(8ah8j**(A = pq <,ŝhW$8omʇ#(J ~}ރNtMR6 ?=( k+wMn͙! ߃9ݱ.p$z1Ho0,2?4_1`:<>@B@P ,PtכR?T_VXZ\N^R6(nAq.1^nprz.BQȍ}?ZN F?_/vuq #6H<ȏ((d/ݸ08_aR[-(z"k:]3hJƀ, lނ\=u1KP ?_o0@!yϿ؜\ɸj،ˉy#?8lSL9qN<TPEBRM>UTU^ ]U%6cM(2"DWVtF.XYTKS'=fΠlACč?Ydʕ-_\yFVΝ=iMd>~YsrVm۵2bmwDo[9X'=?]tխ_Ǟ]vO(}Jx͟G^zݿO/Pz+JI#_@6NSRi6h{kb!|)0x;.? 9|DO$\E_,DFe2Ƣ? "F@C,"G %,% b_\9FF3ϜIEZD6eFsN;|)LD NqU&N̾ﻧ%Lվqk7q_8{bpqZn1,9? _e'2`垽E3e߈[Fq)fw׭. ~Sdi}bG'LL2QlƯ^{i~6ޙ7sa蕨 H;F4΃FB(#`N87@3#s?n Ԓ!(x:I/?hD^-rሜD5dH ;(D4x0z(e h1nMF9EiΘGБ亣G؂0#!75Hg)\#҈H$iGM d' QQ) [e+0˗ce$lD/o)e,]:q+ВS'W'PJS6!ɷU/ kwp8rӞd.w4Wa9~RDhBP6ԡhD%:Qyg:9^s|5z8d=?8zO& ͔ ƃX`,/"Ҁ b/AܻYiDwYw/*̱E8C/+R@F5;Č$LZNM<3"P<V 49U!I/i.r赕 /h^W(,RKBcp]`F2gTnۄ=\Lr=/pQ2*B]W[R.> <{5 [@Ҿ) ?nf`1.a*2/ػ &@,TY haQs860,Ab@y(`2mY%tK5▨=ϨQ[g" 9/a_ˣ. )7ͭ,O&DPf$=?T&?Rƒ4o `YGI>ѲMgq3QK(p]7n||1N< Q^/IÔl#?&DmlW,:0be{Փ]"\&-#,W I;&Ab6aJt{6-*r> ӯ 700 @u3.X#tdݥj^r;H].X.P|:hV2)݉bԑm-g~O|k6>* #rn:%Pz)XA.P CYA8 sص|p^2#x@, 40Y@@⃇Y"B !$"4#@J{@y#Oh$BAA$01$C!|*-~XZH@-n)AC>:;941iãH0xQB7RȄD~ t8IJ\#A8 DDHa/H@SE4K+2: XŮH@XE?#yxcz x8h\i䣘F)p9Gf#<2snh;Cx6:Gzx`D0Mk?R?~O QrH&~6qH8" vȯE_}$3- ˅D7%`"{إ,\ɯHe|VxFI\98ʚ4Ʌ&Bɭ2!f2'\:'LJ'\J3FnD0EJYIȡ0I)3S9)L4t\Gӓ|$l%WNi*$ܰĥډd0B r˘ذ٥4DLӰG8-0>9@C8'd2Y%T)t 1'洞KQM`\"j)D 6FІ`N(J̻ܳԊLM,씚;KD7uZy M<6-~X @̛žI| AA)Q!ˡ̺2ڪP3؀<eY=(JYB2ZU(oNѺtRG!d8H1s`SWl]Bu)hZ%¥286mtL䘜wT@:  цc´NThFAUdV GQ|hvRMKRZU^uGA<2U؁2mn Pg}%AyltUu B O)qCZyB8C] WyM9O{ME}%  p1V?=mfmXCXe'ٚYoe Wh {ܙժ>ݛk2ٝY Dؖɇ H{ɝԝuk аtR0QOZ%Վ5Fpp۪s[lN )8\l4Pf[JmRE`H\ZܑAQEM0\ΕKϝUj5u  pel]ص˸9ޞ!ޒۂ]T-Ҵr ؛uw-߽]/^BT=ӰLܱ )Y͞\8Z9`rf\-`[eYT-VU [6KVVU1aBaŦJv=B5Boz`vՍΘ0RRv'FB `!fX"FXn]܋b+6e<ئ۽nٺs<8K.^*c\ RG9,5ؗ$4> ?nX@$ABXCv$D6EWFV$GnHWI&$JKvVL#MNUO#PQnUR#SVTЫ#U#VW~*eI8!zȌb6cFd.U]*`И(^.,# XXpq&pV B[F]#`W/:TH B"R:MHx2M/@eMbt^@;Lr*ӄ~n8چk82Z2+V+g/;8&X2C2&k?n\t~]q:*R8]52ˇ!s5.h2|pB3Ycgf}h_7pi z؄F4J"&Tt nЁw /R Ȯe9TbF-Q ѱ59p-gunq%@bklmv͞l{p~&bZG#Gd.RX*_0J{ 7Qq~tw:V4;c]|woG㑇7M/:UHB:g'7@(x9jr&D_E]#ZQNQib_0OuQ[{CYZi[[?d_fguS_xdX8{OzA'_9?AXFh{ٺdS\/|4} q 膪I-)z~ .x??uSxxv%̏ڳ}{,h „ R:E'Rh"ƌySXa5 9=<dQ%̘9q. :!HGpe^\hp4b:X>eVqQ)GdꔨȆ#-k¡ ?)S^79r:ph%JIpl)gPj2n P%,k 21 ]>=uzKj6FCAѩ^CMufC'R4EgSpZՔ2O*e^BUj$A6^aif$#U^g) DIhOWv̯,F҅6`AV1V]SQ֫Ȗ Be89kUϒ + hp,]ĝmd=ʦnjdo9[7!uYޝB~}VT>]^9Wjw ¨v}XܫjQ}p)/F[ܷ;~;wW$47*A;c׀ X4bʰ829V#61Lt23Ӭ5)U2x=~3-AІ>76CKeaCPh`rGLSyW3,iz NhMN/8J5-:VI]W, vcMlȮ fg]BmZ{ζHmSJL/*qt nq'Ryj1d[©=o{fnnط~Rxl8*+&h8E]#Wk]פƵ]8_9X]k,O )CT+r$$#1b)IJ׵| G#ަW&'[ˢ]$/:E^)Bb @O&m~kşj۸5xB{>k5jD BtM@O)tѓ/ziQ{TvnlqܷW'G;0AJև HYj.҉$HAvޯN{Y`/nMm}尿-~YA)LAGE=˂N'x D]_W 5X@9`S5 j ^ V؅`L`kj eE߈SDjE)r^KXK_F`:T#UEmY`x-Xڝ2n]8D֋͏ᘑ]v UݛHHG=׭A=݂mPM١'fXa F4E͎W<V$] DE@e]D]]\R8&Γ"A|a6iyU5^#6f㙹3j)ɝK!::#;7"79٤`Zc&6Z;0_]fPRYnBp&A$gwwj'wVGu ZLx^c?S*Eub6{g|N}'@tdf,E( U2Jah+qh](L61hħaff"fX\@;)˃bjJG&)Hb&U9l:^dfddNDѱm)QDYdI=-+*ɩ*i')i')&i)&*" *"*!!)*!1*9*A*IjQYja*iq*y**jꦡj*j*깩5UeᇬnWWUM!=dELi?6F.pĥ[XʡV$CRZk>&H"]upEDf)ڈV^$Bz fRI e+ k ?"lC'!Z09lAVʌMސO+, ^N \XNvQָlYDũ\.BPE,[R+ľXתXPnPWҐA+7Av♞=FٍbdmAnILN.Vnq$>Њ=DY.n#nnv.w 3#cমO@Z@n޲.e$uY rBVZCNզ.RBAwf~^[~)qEa8_JΎ&DLB-A/Bm uaYՖAt^-%]=jfN^=@% RQ.>,eSf.%/ ɯn]UUe-,RTS4냝L (EƥL>o5{X>\eY]5ke\exOsEkXqV`\ʴgnDZf?Xenqr4=`yqtl/ eTo6^R0avUh22hαѲUr ޜM pSrp.Xy_[VrorS7P'cU6"#r!He]"aN\z%{jPqR ] z~`s^ sU]xQR`EX<1l'.p1 Se(܎^9@$(P:;uEFFU}ާGkL4JM(T(tJor:tEyzMMCt>Z.Q5AOO/@@rTO@RsRT.tzV镆ZVWTVTzu&n.ij[-8i\/̔ nn4u? \ aab/UgcSdB/H_65e<ޥy"T1AS]$bXelh;hS_.,ϒ]dUamYY`k_!>UUHʌbwg?e<~VGĀugU" &}IuV,@m ZE8N,6ǎs5Ƶ^o.n~vTEԅ!\ mK5EEEcnFxwMwfmlA%\gNwȀ4kot,_/C_%k@@%y68eC@] P5y:(@f y?90_K0A|`\5j~/# 4yW-l"r+ȐӤ7YzHaMѸGHF9]cr'leǧS(D}hGGsӮ ZO`^8{6%;)Smz?98z_u[22 TH;5Q;9ڸ3Z{u7z=rfz:%;^8;LC/36gƟSy%T;/C쀛< GiSS׈G<goL;Tz?0zS%Y=|?MU폱r֍3f~~s>X>Mec2Uf50>SS\^ @p'E}~o@ߵ]؅\p.kM)A9r'Fa$c)aƔ9fM7q֤t…l9:(M1ViSOSN /6R ˆ\7Vza*BKKoƍOw= 3yym7NӢ!GIקd˗r秄41^T2hp)}=jki CoC8A0n&H%9>NP)] ?Br*F21kzK5i̐ʒ|NF-ɝ h$-!aDC2J^<'9S2w)"+/pʑi*)ϛL t34 D]; (‘U.> SM9ͨL$f"HF_CU}`1)S]R".` )PX*T\X̝N"o1F<+b2RSբIU.j |3{"RRZEN! E xQi ߌڗc"p>jc,㠮ndNBS׊vՏۘ<\pFՈvͪ ra\j98ՙ^3~簋 r>Uf) H/\qŊ;%e6Q|=<pp_.tԛ$$y Î8r8݃wqgc>Wry[7p/?r#L2me%bv'O\}Nk9}1<\/skwA$$g hcF F{.)"Lag1n.+;Z2}px.Pr >$>T-U aAE,vq6[U:H cDh̸34:Lؙ8~-A4!Y:1#縤G%1IMnr "H<,SѧP" P27!SV!C/%zsl%d-QD)qs4d< 2]+ UVt>*"ßfVU8DHGܕ6 iI(Kk20bStN\5Pr2WFⲂ]-k;emg$c5 l¥ZS :fFm=*ep1QlT.KCS8/+sW8VQNC3ESʅOQ(BRæ^9W5KbzԗQK R?ŧS{jx" R@buKE :;n.eLiV4V,_Y0)t ٦4eYgJLp%( m 9泘 )cp'@4q\L`OoIVeP;֋&h0qdIST%j75o`ˑ89Arߑ7%{ߛRCA 7Ovjt{qLyxO/\r'$sMV0S9w{Ů!*Bzad !Mve)OUL8.\ X%]kg0Ldpg9ϙug=nV{<pкDiHtyL%dҬf(!/U]ϼ֐%Jt}Bm^*̔b8t8`"j&V߫mvfq_S5KґR}Zؤ52nq)ʝnuvoy; f;,&nw{(i1ɿp7p/ wB ]>< G#" oANpO0lbcbyiw2JA(E?& ;PKWLRLPKdDOEBPS/xt_pcrf.htm.# Using Policy Data in Messages

5 Using Policy Data in Messages

This chapter explains how Oracle Communications WebRTC Session Controller Signaling Engine (Signaling Engine) uses policy data from policy charging rule functions (PCRFs) to affect subscriber calls and profiles.

About Using Policy Control Data with Signaling Engine

Signaling Engine supports using its Groovy script translation capability to make policy (QoS) decisions by using the policy information contained in Diameter Rx interface messages. Signaling Engine acts as a Diameter application function (AF) by exchanging Diameter Rx messages with your policy control and charging rules function (PCRF) in a 3GPP architecture.

Signaling Engine supports sending AA Request (AAR) and Session Termination Request (STR) Diameter Rx messages from Signaling Engine to your PCRF, and using the data from AA Answer (AAA) and Session Termination Answer (STA) messages that it receives in return.

The Diameter Rx messages and their responses are frequently used with the pcrfFuture interface that enables you to delay processing until a later message arrives. Oracle expects that most implementations will send Diameter AAR requests and then delay the media session until they receive an AAA confirming that the subscriber is entitled to the service.

The AAR and AAA messages can be exchanged any time before a call's media stream, and the STR and STA messages are exchanged after the stream. So you can affect your PCRF and PCEF affect the subscriber profile before the media stream resources are used, update the subscriber's profile after the media stream resources have been consumed, or both.

See WebRTC Session Controller Statement of Conformance for the complete list of Diameter Rx commands and AVPs that Signaling Engine Supports.

Before the AAR and STR messages can be useful, you must configure your PCRF to accept and make policy decisions based on the AVPs that you send them. If your implementation requires it, you must also configure a PCEF to enforce those decisions.

Figure 5-1 shows an example call flow in which Signaling Engine exchanges messages with a PCRF both before and after the call's multimedia stream. Diameter Rx AAR, AAA, STR, and STA messages are shown in red in the call flow.

Figure 5-1 Signaling Engine Call Flow with PCRF Support

Description of Figure 5-1 follows

Creating and Sending Diameter Rx Request messages

You use the createRxAAR and createRxSTR methods in the WscDiameterFactory interface of the oracle.wsc.feature.webrtc.template.diameter package to create AAR and STR messages. These methods accept a map of AVPs that you create, and adds them to a Diameter Rx message that your PCRF can parse. Your PCRF then accepts the AVPs and take whatever action that you have configured it.

These AVPs are automatically added to each outgoing request and need not be specified in a Groovy script:

  • Session-Id

  • Origin-Host

  • Origin-Realm

  • Auth-Application-Id

  • Destination-Realm

You must specify any other AVPs that your implementation requires in your Groovy scripts. See WebRTC Session Controller Conformance Statement for details on the AVPs supported.

This example defines an AAR message and specifically defines the AVPs used (for example: Subscription-Id, Subscription-Id-Type, and Subscription-Id-Data):

 def avps = [
      'Subscription-Id':[
        'Subscription-Id-Type':2, //END_USER_SIP_URI
        'Subscription-Id-Data':"bob@example.com"
      ],
      'Framed-IP-Address':[
        0x84,
        0x08,
        0x88,
        0x65] as byte[],
      'AF-Application-Identifier':"WSE".getBytes("utf-8"),
      'Media-Type':0, //Audio
      'AF-Charging-Identifier':'charing-id-55'.getBytes("utf-8"), //Audio
      'Media-Component-Description':[
        'Media-Component-Number':[0, 1],
        'Media-Sub-Component': [
          [
            'Flow-Number':1,
            'Flow-Description':'permit out 8001 from assigned 34 to 24.2.1.6/18 8000'
          ],
          [
            'Flow-Number':1,
            'Flow-Description':'permit out 8005 from assigned 36 to 24.2.1.6/18 8001'
          ]
        ],
        'Flow-Status':2
      ]
    ]
 
   def aar = context.diameterFactory.createRxAAR(avps) 

After creating a Diameter request message, you must explicitly send it using a send method call. send is a method in the WscDiameterRequest interface in the oracle.wsc.feature.webrtc.template.diameter package. This example sends an AAR message, and provides example success and error conditions:

def pcrfFuture = aar.send();
 
//success
context.getTaskBuilder("processSuccessFromPcrf").withArg("sipRequest",sipRequest)
       .withArg("pcrfFuture", pcrfFuture).onSuccess(pcrfFuture).build();
 
//error
context.getTaskBuilder("processErrorFromPcrf").withArg("sipRequest",sipRequest)
       .withArg("pcrfFuture", pcrfFuture).onError(pcrfFuture).build();

This example lists the pcrfSuccessHandler and pcrfErrorHandler methods that you would define to handle the success and failure conditions.

You use the methods in the PcrfFuture interface in the oracle.wscfeature.webrtc.template.diameter package to determine if any future objects are ready for use by your Groovy scripts. This interface extends the oracle.wsc.feature.webrtc.template.future interface.

This example checks the AVP values in the response to confirm that the subscriber bob@example.com uses a media type of 0.

def avps = context.taskArgs.pcrfFuture.get().getAvps()
 
if(avps.'Subscription-Id'?.'Subscription-Id-Data'=='bob@example.com"){
  //add logic here.
}else if(avps.'Media-Type'==0){
//provide alternative
}

Accepting and Using Diameter Rx Answer Messages

You use the getAvps, getCommandCode, and getResultCode methods in the WscDiameterResponse interface of the oracle.wscfeature.webrtc.template.diameter package to process the Diameter Rx AAA and STA messages returned by your PCRF. getCommandCode, returns the command code identifying the type of message (265 for AAR and AAA, and 275 for STR and STA). getResultCode returns the integer values for the Result-Code AVP. getAvps returns a map of all the AVPs in the AAA or STA message. You use this method in groovy scripts you create to obtain the data necessary to perform policy actions, and take those actions.

PKd3#.#PKdD OEBPS/toc.ncx Oracle® Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0 Cover Title and Copyright Information Contents Preface 1 About Extending WebRTC Session Controller 2 About Building JSON to SIP Communication 3 Creating WebRTC Session Controller Applications, Packages, and Criteria 4 Customizing Messages for New SIP or JSON Data 5 Using Policy Data in Messages 6 Anchoring Media Sessions A JsonRTC Protocol Reference Copyright PKa PKdDOEBPS/xt_overview.htmd Customizing Messages for New SIP or JSON Data

4 Customizing Messages for New SIP or JSON Data

This chapter contains examples of how to use Oracle Communications WebRTC Session Controller Signaling Engine (Signaling Engine) to process customized SIP data in messages, and add new JSON data to support protocol changes.

Processing Messages With Custom SIP Data

This section provides some examples for how to translate SIP messages which contain custom SIP data.

Example SIP Request Variable

The examples in this chapter assume that you have created a custom sipReq variable as shown in this example:

// Create REGISTER request
def from = getFromAddress(context)
def to = getToAddress(context)
def sipReq = context.sipFactory.createSipRequest("REGISTER", from, to)
 
// Set request URI
sipReq.requestURI = context.sipFactory.createSipAddress(Constants.PROXY_SIP_URI).URI
 
// Set contact user
if (from.URI?.user) {
  sipReq.setContactUser(from.URI.user)
}
 
// Set sip.instance to allow container to use SIP Outbound
// for routing purposes as defined in RFC 5626
def sipInstance = "\"<urn:uuid:" + java.util.UUID.randomUUID() + ">\""
sipReq.setSipContactParameter("+sip.instance", sipInstance)
sipReq.setSipContactParameter("reg-id", "1")
context.subSessionStore.put("sip.instance", sipInstance)
 
// Enable GRUU support (disabled by default)
//sipReq.setHeader("Supported", "gruu")
 
// P-Charging-Vector example
//def icidValue = context.uniqueId
//def myIp = java.net.InetAddress.localHost.hostAddress
//sipReq.setHeader("P-Charging-Vector", "icid-value=" + icidValue + //";icid-generated-at=" + myIp)
 
sipReq.send()

Extending SIP Messages with New Headers

This Groovy code snippet from the default register package, in the FROM_APP/connect/request/default criteria (commented out) adds support for a Globally Routable User agent URI (GRUU).

sipReq.setHeader("Supported", "gruu")

Protecting System Performance by Removing SIP Messages

You can save network bandwidth by removing unimportant messages during processing. For example, you would use this code snippet to remove provisional SIP responses (the 1xx SIP messages). You would put this in the Groovy script for the FROM_NET/INVITE/response criteria:

if (sipResponse.status < 200) {
  // Ignore provisional responses
} else if (sipResponse.status < 300) 
  // Proceed with processing
}
{... }

Removing a SIP Header in a Message

Use this Groovy code snippet to remove a header. Headers cannot be renamed.

sipReq.removeHeader("headername")
 

Replacing a SIP Header in a Message

You use the setHeader method to replace a header in a SIP message. Setting a header overwrites its value.

Conditionally Passing SIP Headers in Messages

This example Groovy code snippet probes for a JSON parameter called myWebParmeter and if present it copies the value to a SIP header.

def myWebParameter = context.webMessage?.header.?myParameter
if (myWebParameter) {
  sipRequest.setHeader("MyHeader", myWebParameter)
}

You pass SIP headers as extension headers (extHeader) in the JSON API. See WebRTC Session Controller Web Application Developer's Guide for examples of using extension headers.

Changing JSON Data to Support Protocol Changes

If the JSON protocol specification changes, you can add processing for additional data in your Groovy scripts. WebRTC Session Controller ignores new JSON data if you do not use it in processing.

Extending WebRTC Session Controller Functionality

If your implementation requires client application logic that WebRTC Session Controller or Javascript does not support by default, you need to create new software packages to implement it. The procedure below offers guidelines for creating a new package. The exact steps and sequence depend on your requirements.

See "JsonRTC Protocol Reference" for details on the JsonRTC protocol that WebRTC uses to communicate with client applications. Also see "Prerequisites for Extending WebRTC Session Controller Functionality" for information on other protocols you may need to understand.

To create a new package:

  1. Design your new package.

    Include the new JSON to SIP message mapping and any new JSON and SIP data, formats, and headers.

  2. Use the WebRTC Session Controller console to create the criteria and Groovy script processing necessary to implement your new package.

    See "Creating Criteria"for details on creating criteria.

  3. Create or extend the tools necessary to use the package with a client application.

    • If you use the JavaScript Development Environment client operating system, see the WebRTC Session Controller Web Application Developer's Guide for more information.

    • If you use a different client operating system, see that operating system documentation for details. You may also find the WebRTC Session Controller Web Application Developer's Guide helpful.

  4. Write the client application.

    • To develop JavaScript client applications see the WebRTC Session Controller Web Application Developer's Guide for more information.

    • To develop client applications in another operating system, see that operating system documentation for information on how to communicate with WebRTC Session Controller.

PK?Vi d PKdDOEBPS/content.opfy Oracle® Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0 en-US E40977-01 Oracle Corporation Oracle Corporation Oracle® Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0 2013-11-08T08:27:00Z Oracle® Communications WebRTC Session Controller Extension Developer’s Guide, Release 7.0 PK|hPKdDOEBPS/dcommon/oracle-logo.jpg _JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222'7" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE!KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzE7V%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( g\==oNYdp+@jhs2X".]q8mQ\V_ Ehl%d24O@@^2QҬudKhCrnWS0H9Ey?H@2pX9[RFѯKEQK2@IԡtkRdX/m㸍d0WP3k|]1U@dPRY"Pp2H8;DzD<?;ۿb1@}gYywx4r@c ~5ChڥY[q"b gW_5h^Wwgy@\+#nܜ]*ǃ|M^->Y:+F8\i::΍c[w Fp}M\3Լg!?G9Qk$hڱ@D($P1׃jx%`]f;KXbv pé#pLx^JfbKXYPCaݎ6?G4me#ֵO IU¾/P0qJ+/x]/S?t9绗̗â4)%܈ Q` +[ӵg\yae2crq+C{iڇhɑvlp p ^|X$m?oYvdc0z j>ug,p[ l ? @CFSfsZ~ԡV+`dmP$KcOZx]my#cB39AʫbM.[69)T5Ys/ZZ|>JI3HrFOlW(eO閑>j[ڏrUC"e"5SǞH|Mj֚ދ.amj Z'tX$dGx8I@FFBFFU8<Mώdj 2ϑsrN^1R=h60xNεKw$5\)<g(.߇0 ◃|GA:/Yv,ydp $:DuOY>zwKĒAO12A0H=k?j/a%d:Cl UjXr]&]\sgp:0`AAO#äiyVܼzp? .XiV:c=pۃuqU/8rO$i~ӞWr7@'j 2N8|K5E4}j9 M 8zXt\~>Ǯ&2MavރcAVLl.it-SXtWE_nI wWύ7iȲjB#:nHC`I<֣hj>.қSUv *ɸP~^O'W^"$^~"sw//EhR=z+dK1%6II }*eS᳐{YG×zskkz@:[~/u|#.5hR#iFUd rh@$csY'zʮ~z@ZGokoG$隤P 4$rF Ϗ<]qx|SiiťMI؇YB  Eq|CkZu='PL\<[s  QEQEQEQEQEQEQEQEQEQEQEQEp$޻g[) kRazh R&ڬB}j6>Ö*Ksy-w$jA1" g𫸏Q@gxVÚL~"u/w#%7"15#&u BJs@l'98,ޙEqؚ)ywmݝ{bj?>?Go_gٷvv3{aEymf"ujl(Ȑ8l=[?5o;> vB7$g j(?&/o}:Sv#Y)|K`32Oyo2 F;~v}goymg5]n*?|MaO"]>XlF+;\Q@gx3_Cچ$px6HZϵQ%p #!|K=&?5wlQwr;aQGQNO\Eq54ծmX_a$\%_r0N9=k>6ooiEi-ÃG) xQ@7h-p7wDx X`PN8pJ(/xI֟i ƻc`n:lx<3gR%HO4)e >XvqX]wk&vMDlppAX/ m;5I$WXn3ngPrWuHS0M&ps ŷu\Տ[@?1 vlύ~.v{egoHHPh '>*MCǞխkb*(xJDA sz(oi%\ETCĬ *W#WAjq~y/"+B'wz]>[]{,eܼ ^+(4csxb P44cmxb}PFtGjBH,;񃚏C(Dҡax4w(c;uVt'T$K`bȦHABNprA{im:I^jcQp3M9rx,ᶓq/&eEB$O(<Wr>^/&m\F5 y|o7)c˫ ƀ2xz ռA4wjJTm9MW%xAd݊gPtKx8 r8R/?~/;]i_\Ȳ ؒ8 9nK¾-%z?_Y_N,X-fS,~!_sX5L. SsuPYXL?޿TJ;EHZv2&٘|9+oYվK62\rd'S*O\.Pim'ǍF W9ܠ$V>_Tu]g\Vv.l$e#f 6W0,sž2ׇXxc#Xpfvb'$H-'67o&ÚnA-̉!F~b~<Y}F_kΑO6U89nG8Cž9Ӿ)xr?x>)u-Wy̱IƎ+pI|wwxQ>e7= hD(@.ddJi>nk꺦gԷ+ݙ#Eꥈr<\?|Lō'EDC۞ d9};_IR)4њ&G˻SM~bG~%YF4[]kq#I7a3ңҾ"]mvO]&t{峂t%Cr~*Z„:t֛iqm-y1QF13q\|Oi?ľ$^iZ t=)LC^g mY1`+t+Wxm%to5,lV`z=R<^|B汮k_iҘ]j ""eR7g8 4xOZl'<:%Lf&R.ʱ XՉ8D' *E-I#׬J("293ʅ$rcsž(| wYݡ1 ԟcl.0@#$pT;J["e> ֒[}VVJl p zibOx[.QiKpA (IV}>%Q0}An 2eٕ 'y"OE%N<#0q/OI> ^c]/MKèjw`D,UK8$`8#G<_=~W7ٿ :QxS#>c}n;ΌیcϵpN]xcci-ߒG/_鎃'\}?[]ۣwp42abuQd2Jž2ׇXxc#Xpfvb'$H'Ygwe_hڞ@ :2ˀm^ѡzO__nѵ_FWS͕N[DZN>'QѼW׾oe;izXh~nx=387:]5L@˞]"$v=A޹?Ϡw. uhg m$"r8:(\C%`oUFT*4gSӣC׿nPq4ܘ 8${f_i|?|q&(Ⱥ,QUZB VrmFV‘s8Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O~!>v!͈"`rG]EPEPEPEPEPEPEPEP=;JR,-\\Iu6޲JRI`*PEPEPEPEPEPEPEPEP@vB_;L$l\WJZ*/nɨ^jM.4Dk۳u9Q'& gOyNvo8ϽjvLֳ#׮#g7,rgb@vC$m2<ؘlG\szWo躥aƗvϾ'y+v;]88#(ԼIxK^m?H{i[(n$6 B?'74Yh㳼dX& ?v1Wk#뉭j$7238PBa< U<mQ! M3Q湵32Tgm#=ux7X=iki4WhLi7"ӵco3 _,b9/py8ٌ6Wh <}Qu=E B+M${8x^.ιAw$x 6Z9BoN'8aC״x^фu-*Gl:7%Q+? x?@}h:lvi;gg `ep2}MlO H##F8e ڀ<oxH acn-/0$Ks8.|]oʰCH̑.zJҬt=.L-MD2I$I$䚏U4o_6wn㽷vLdr=gK;cXf8trO84 Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2014, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in preproduction status:

This documentation is in preproduction status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Oracle Logo

PK0hPKdDOEBPS/dcommon/oracle.gifJGIF87aiyDT2F'G;Q_oKTC[ 3-Bq{ttsoGc4I)GvmLZ).1)!ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPKdDOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PKdDOEBPS/dcommon/blafdoc.cssc@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.10.7 */ body { font-family: Tahoma, sans-serif; /* line-height: 125%; */ color: black; background-color: white; font-size: small; } * html body { /* http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html */ font-size: x-small; /* for IE5.x/win */ f\ont-size: small; /* for other IE versions */ } h1 { font-size: 165%; font-weight: bold; border-bottom: 1px solid #ddd; width: 100%; text-align: left; } h2 { font-size: 152%; font-weight: bold; text-align: left; } h3 { font-size: 139%; font-weight: bold; text-align: left; } h4 { font-size: 126%; font-weight: bold; text-align: left; } h5 { font-size: 113%; font-weight: bold; display: inline; text-align: left; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; text-align: left; } a:link { color: #039; background: inherit; } a:visited { color: #72007C; background: inherit; } a:hover { text-decoration: underline; } a img, img[usemap] { border-style: none; } code, pre, samp, tt { font-family: monospace; font-size: 110%; } caption { text-align: center; font-weight: bold; width: auto; } dt { font-weight: bold; } table { font-size: small; /* for ICEBrowser */ } td { vertical-align: top; } th { font-weight: bold; text-align: left; vertical-align: bottom; } ol ol { list-style-type: lower-alpha; } ol ol ol { list-style-type: lower-roman; } li { text-align: left; } dd { text-align: left; } td p:first-child, td pre:first-child { margin-top: 0px; margin-bottom: 0px; } table.table-border { border-collapse: collapse; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } table.table-border th { padding: 0.5ex 0.25em; color: black; background-color: #f7f7ea; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } table.table-border td { padding: 0.5ex 0.25em; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } span.gui-object, span.gui-object-action { font-weight: bold; } span.gui-object-title { } p.horizontal-rule { width: 100%; border: solid #cc9; border-width: 0px 0px 1px 0px; margin-bottom: 4ex; } div.zz-skip-header { display: none; } td.zz-nav-header-cell { text-align: left; font-size: 95%; width: 99%; color: black; background: inherit; font-weight: normal; vertical-align: top; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-header-link { font-size: 95%; } td.zz-nav-button-cell { white-space: nowrap; text-align: center; width: 1%; vertical-align: top; padding-left: 4px; padding-right: 4px; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-button-link { font-size: 90%; } div.zz-nav-footer-menu { width: 100%; text-align: center; margin-top: 2ex; margin-bottom: 4ex; } p.zz-legal-notice, a.zz-legal-notice-link { font-size: 85%; /* display: none; */ /* Uncomment to hide legal notice */ } /*************************************/ /* Begin DARB Formats */ /*************************************/ .bold, .codeinlinebold, .syntaxinlinebold, .term, .glossterm, .seghead, .glossaryterm, .keyword, .msg, .msgexplankw, .msgactionkw, .notep1, .xreftitlebold { font-weight: bold; } .italic, .codeinlineitalic, .syntaxinlineitalic, .variable, .xreftitleitalic { font-style: italic; } .bolditalic, .codeinlineboldital, .syntaxinlineboldital, .titleinfigure, .titleinexample, .titleintable, .titleinequation, .xreftitleboldital { font-weight: bold; font-style: italic; } .itemizedlisttitle, .orderedlisttitle, .segmentedlisttitle, .variablelisttitle { font-weight: bold; } .bridgehead, .titleinrefsubsect3 { font-weight: bold; } .titleinrefsubsect { font-size: 126%; font-weight: bold; } .titleinrefsubsect2 { font-size: 113%; font-weight: bold; } .subhead1 { display: block; font-size: 139%; font-weight: bold; } .subhead2 { display: block; font-weight: bold; } .subhead3 { font-weight: bold; } .underline { text-decoration: underline; } .superscript { vertical-align: super; } .subscript { vertical-align: sub; } .listofeft { border: none; } .betadraft, .alphabetanotice, .revenuerecognitionnotice { color: #e00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #e00; background: inherit; } .comment { color: #080; background: inherit; font-weight: bold; } .copyrightlogo { text-align: center; font-size: 85%; } .tocsubheader { list-style-type: none; } table.icons td { padding-left: 6px; padding-right: 6px; } .l1ix dd, dd dl.l2ix, dd dl.l3ix { margin-top: 0ex; margin-bottom: 0ex; } div.infoboxnote, div.infoboxnotewarn, div.infoboxnotealso { margin-top: 4ex; margin-right: 10%; margin-left: 10%; margin-bottom: 4ex; padding: 0.25em; border-top: 1pt solid gray; border-bottom: 1pt solid gray; } p.notep1 { margin-top: 0px; margin-bottom: 0px; } .tahiti-highlight-example { background: #ff9; text-decoration: inherit; } .tahiti-highlight-search { background: #9cf; text-decoration: inherit; } .tahiti-sidebar-heading { font-size: 110%; margin-bottom: 0px; padding-bottom: 0px; } /*************************************/ /* End DARB Formats */ /*************************************/ @media all { /* * * { line-height: 120%; } */ dd { margin-bottom: 2ex; } dl:first-child { margin-top: 2ex; } } @media print { body { font-size: 11pt; padding: 0px !important; } a:link, a:visited { color: black; background: inherit; } code, pre, samp, tt { font-size: 10pt; } #nav, #search_this_book, #comment_form, #comment_announcement, #flipNav, .noprint { display: none !important; } body#left-nav-present { overflow: visible !important; } } PKT' hcPKdD OEBPS/toc.htmk Oracle Communications WebRTC Session Controller Extension Developer's Guide , Release 7.0

Contents

Preface

1 About Extending WebRTC Session Controller

2 About Building JSON to SIP Communication

3 Creating WebRTC Session Controller Applications, Packages, and Criteria

4 Customizing Messages for New SIP or JSON Data

5 Using Policy Data in Messages

6 Anchoring Media Sessions

A JsonRTC Protocol Reference

PKJ;=pkPK dDoa,mimetypePKdDZsn:iTunesMetadata.plistPKdDYuMETA-INF/container.xmlPKdD0v+vOEBPS/xt_appsr.htmPKdD@t` |OEBPS/cover.htmPKdDY@dAA~OEBPS/xt_wse_protocol_ref.htmPKdDOEBPS/title.htmPKdD|=$ֹkkOEBPS/xt_building.htmPKdD4(9N4N?OEBPS/xt_introduction.htmPKdD9Z0U0rOEBPS/xt_media.htmPKdDN{V OEBPS/preface.htmPKdDnZg gOEBPS/img/wsc_groovy_error.gifPKdD1P,P#/6OEBPS/img/sip_to_json_extension.gifPKdDi\>W>'OEBPS/img/wsc_call_flow_detail_pcrf.gifPKdDD+GG!bOEBPS/img/wsc_asc_flow_detail.gifPKdD~~! OEBPS/img/xt_wse_console_pkgs.gifPKdD>u%P P$̋OEBPS/img/wsc_client_flow_detail.gifPKdDvnxn%COEBPS/img/xt_wse_console_overview.gifPKdDr$2`Z[ZaOEBPS/img/wsc_groovy_intro.gifPKdDUVc1^1$OEBPS/img/wsc_call_flow_overview.gifPKdDWLRL"oOEBPS/img/wsc_call_flow_detail.gifPKdDd3#.#:OEBPS/xt_pcrf.htmPKdDa ]OEBPS/toc.ncxPKdD?Vi d gOEBPS/xt_overview.htmPKdD|h~OEBPS/content.opfPKdDRi:_ _HOEBPS/dcommon/oracle-logo.jpgPKdD0hOEBPS/dcommon/cpyr.htmPKdDl-OJ OEBPS/dcommon/oracle.gifPKdDo"nR M <OEBPS/dcommon/doccd_epub.jsPKdDT' hcOEBPS/dcommon/blafdoc.cssPKdDJ;=pk 6OEBPS/toc.htmPK1U