What’s that user doing? Rich Banville / Richard Shulman June 7, 2011 The OpenEdge Statement Cache.

Slides:



Advertisements
Similar presentations
MFA for Business Banking – Security Code Multifactor Authentication: Quick Tip Sheets Note to Financial Institutions: We are providing these QT sheets.
Advertisements

Yukon – What is New Rajesh Gala. Yukon – What is new.NET Framework Programming Data Types Exception Handling Batches Databases Database Engine Administration.
Module 13: Performance Tuning. Overview Performance tuning methodologies Instance level Database level Application level Overview of tools and techniques.
The Architecture of Oracle
DB-03: A Tour of the OpenEdge™ RDBMS Storage Architecture Richard Banville Technical Fellow.
Strength. Strategy. Stability. The Application Profiler.
Some More Database Performance Knobs North American PUG Challenge
DEV-2: Getting Started with OpenEdge® Architect – Part I
The Linux Kernel: Memory Management
Week 6: Chapter 6 Agenda Automation of SQL Server tasks using: SQL Server Agent Scheduling Scripting Technologies.
REST support for B2B access to your AppServer PUG Challenge Americas Michael Jacobs : Senior Software Architect Edsel Garcia : Principal Software.
MCTS GUIDE TO MICROSOFT WINDOWS 7 Chapter 10 Performance Tuning.
DEV-13: You've Got a Problem, Here’s How to Find It
File Management Chapter 12. File Management A file is a named entity used to save results from a program or provide data to a program. Access control.
© 2010 Eaton Corporation. All rights reserved. Database-Request Statement Cache Ben Holmes – July 2014.
1 - Oracle Server Architecture Overview
Harvard University Oracle Database Administration Session 5 Data Storage.
Backup and Recovery Part 1.
Chapter 9 Overview  Reasons to monitor SQL Server  Performance Monitoring and Tuning  Tools for Monitoring SQL Server  Common Monitoring and Tuning.
Module 8: Monitoring SQL Server for Performance. Overview Why to Monitor SQL Server Performance Monitoring and Tuning Tools for Monitoring SQL Server.
DEV-14: Understanding and Programming for the AppServer™
Backup & Recovery 1.
Module 8: Server Management. Overview Server-level and instance-level resources such as memory and processes Database-level resources such as logical.
DB-13: Understanding VSTs By Paul Guggenheim. Copyright © 2005 Paul Guggenheim & Associates 2 DB-13: Understanding VSTs 2 About PGA  Working in Progress.
Migration XenDesktop 7. © 2013 Citrix | Confidential – Do Not Distribute Migration prerequisites Set up a XenDesktop 7 Site, including the site database.
Hands-On Microsoft Windows Server 2008
Implementing Database Snapshot & Database Mirroring in SQL Server 2005 Presented by Tarek Ghazali IT Technical Specialist Microsoft SQL Server MVP Microsoft.
Introduction and simple using of Oracle Logistics Information System Yaxian Yao
DONE-10: Adminserver Survival Tips Brian Bowman Product Manager, Data Management Group.
Lesson 7-Creating and Changing Directories. Overview Using directories to create order. Managing files in directories. Using pathnames to manage files.
MCTS Guide to Microsoft Windows 7
Database Administration TableSpace & Data File Management
Chapter Oracle Server An Oracle Server consists of an Oracle database (stored data, control and log files.) The Server will support SQL to define.
Copyright ®xSpring Pte Ltd, All rights reserved Versions DateVersionDescriptionAuthor May First version. Modified from Enterprise edition.NBL.
5 Chapter Five Web Servers. 5 Chapter Objectives Learn about the Microsoft Personal Web Server Software Learn how to improve Web site performance Learn.
Copyright © 2007, Oracle. All rights reserved. Managing Concurrent Requests.
By Lecturer / Aisha Dawood 1.  You can control the number of dispatcher processes in the instance. Unlike the number of shared servers, the number of.
Strength. Strategy. Stability.. Progress Performance Monitoring and Tuning Dan Foreman Progress Expert BravePoint BravePoint
Chapter 6 SAS ® OLAP Cube Studio. Section 6.1 SAS OLAP Cube Studio Architecture.
Chapter 13 Users, Groups Profiles and Policies. Learning Objectives Understand Windows XP Professional user accounts Understand the different types of.
DEV-5: Introduction to WebSpeed ® Stephen Ferguson Sr. Training Program Manager.
The protection of the DB against intentional or unintentional threats using computer-based or non- computer-based controls. Database Security – Part 2.
Computer Emergency Notification System (CENS)
DONE-08 Sizing and Performance Tuning N-Tier Applications Mike Furgal Performance Manager Progress Software
Chapter 7 File I/O 1. File, Record & Field 2 The file is just a chunk of disk space set aside for data and given a name. The computer has no idea what.
OPS-15: What was Happening with My Database, AppServer ™, OS... Yesterday, Last Month, Last Year? Libor LaubacherRuanne Cluer Principal Tech Support Engineer.
1 Chapter Overview Performing Configuration Tasks Setting Up Additional Features Performing Maintenance Tasks.
© 2006 Cisco Systems, Inc. All rights reserved.1 Connection 7.0 Serviceability Reports Todd Blaisdell.
® IBM Software Group © 2007 IBM Corporation Best Practices for Session Management
37 Copyright © 2007, Oracle. All rights reserved. Module 37: Executing Workflow Processes Siebel 8.0 Essentials.
Process Architecture Process Architecture - A portion of a program that can run independently of and concurrently with other portions of the program. Some.
B2: What’s New in 10.1 RDBMS? So many features, so few releases Richard Banville Progress Fellow.
Chapter 5 Introduction To Form Builder. Lesson A Objectives  Display Forms Builder forms in a Web browser  Use a data block form to view, insert, update,
Using Progress® Analytical Tools Adam Backman White Star Software DONE-05:
20 Copyright © 2008, Oracle. All rights reserved. Cache Management.
A2: Making OpenEdge ® Architect Work For You Susan Houniet Senior Solution Consultant.
OPS-3: What’s New in 10.1 RDBMS? So many features, so few releases Wei Qiu Principal Software Engineer.
Oracle Business Intelligence Foundation – Testing and Deploying OBI Repository.
5 Copyright © 2008, Oracle. All rights reserved. Testing and Validating a Repository.
Module 5: Managing Content. Overview Publishing Content Executing Reports Creating Cached Instances Creating Snapshots and Report History Creating Subscriptions.
2 Copyright © 2004, Oracle. All rights reserved. Running a Forms Developer Application.
13 Copyright © 2007, Oracle. All rights reserved. Using the Data Recovery Advisor.
4 Copyright © 2004, Oracle. All rights reserved. Managing the Oracle Instance.
 Database Administration Oracle Database Instance Management Starting Up and Shutting Down أ. ندى الغامدي, أ. ندى الطوالة.
SQL Database Management
Running a Forms Developer Application
DEV-25: You've Got a Problem, Here’s How to Find It
Is 221: Database Administration
SQL Server Monitoring Overview
Presentation transcript:

What’s that user doing? Rich Banville / Richard Shulman June 7, 2011 The OpenEdge Statement Cache.

© 2010 Progress Software Corporation. All rights reserved. 2 Agenda  What is the Statement Cache  Promon access  Virtual system table visualization  Memory consumption  Performance costs  Use case examples

© 2010 Progress Software Corporation. All rights reserved. 3 Client Database-Request Statement Caching  What is it? Client execution stack trace dump Includes: Line #, procedure name, file name Introduced in 10.1C –Not a new feature  When should you use it? Diagnosing deployed application problems Local and remote access  What’s in a name? Don’t confuse with other “statement caches”  Documentation OpenEdge Data Management: Database Administration

© 2010 Progress Software Corporation. All rights reserved. 4 Procedure Call Stack  Top is last procedure executed  Bottom is first procedure executed  Top down, newest to oldest  More on data format later… Its just a LIFO… # Procedure Name File Name 19 : reallyLongNamedInternalProcedure3 proctestb.r 12 : reallyLongNamedInternalProcedure2 proctestb.r 5 : reallyLongNamedInternalProcedure1 proctesta.r 445 : reallyLongNamedInternalProcedure0 proctesta.r 1 : /usr1/stmtest/p72340_Untitled1.ped Newest Oldest Top Bottom

© 2010 Progress Software Corporation. All rights reserved. 5 promon  R&D  1. Status Displays Client Database-Request Statement Cache Activate For Selected Users 2. Activate For All Users 3. Activate For All Future Users 4. Deactivate For Selected Users 5. Deactivate For All Users 6. Deactivate For All Future Users 7. View Database-Request Statement Cache 8. Specify Directory for Statement Cache Files Enablement Activate Multi-level activation

© 2010 Progress Software Corporation. All rights reserved. 6 Activation Types  1. Single Report top of the stack Last procedure call only Better performance Continual update  2. Stack Reports entire stack (31 deep, sometimes more) 32,000 byte maximum stack size Most information –How did I get there? Continual update Multi-level activation

© 2010 Progress Software Corporation. All rights reserved. 7 Activation Types  3. One time stack Full stack snapshot Reports stack one time (on next DB operation) Not continuous update –Remembered until deactivated or reactivated –Re-activate for update Diagnose quickly changing stack  Summary Select, current, future users One time vs continuous Top of stack or full stack SQL exception – statement level only Its not a trace. It’s a current stack dump.

© 2010 Progress Software Corporation. All rights reserved. 8 Server Enablement  Server level enablement Activates all currently served clients Remote logout/login disables it  Application server agent Connection based, not session based Setting does not follow user through to AppServer Agent  OpenEdge SQL Server Same activation rules Statement level report Stack level does not apply Continuousness applies Multiple clients on same server.

© 2010 Progress Software Corporation. All rights reserved. 9 Disablement promon  R&D  1. Status Displays Client Database-Request Statement Cache Activate For Selected Users 2. Activate For All Users 3. Activate For All Future Users 4. Deactivate For Selected Users 5. Deactivate For All Users 6. Deactivate For All Future Users 7. View Database-Request Statement Cache 8. Specify Directory for Statement Cache Files Deactivate Let’s have a look at…

© 2010 Progress Software Corporation. All rights reserved. 10 promon  R&D  1. Status Displays Client Database-Request Statement Cache Activate For Selected Users 2. Activate For All Users 3. Activate For All Future Users 4. Deactivate For Selected Users 5. Deactivate For All Users 6. Deactivate For All Future Users 7. View Database-Request Statement Cache 8. Specify Directory for Statement Cache Files Disablement  Deactivate server deactivates all users of that server. 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:15:03 Deactivate For Selected Users Usr Name Type Login time Serv IPV# Remote Address 1 pug11 SERV 12/06/10 16: usera REMC/ABL 12/06/10 16:23 1 IPV userb REMC/ABL 12/07/10 08:34 1 IPV

© 2010 Progress Software Corporation. All rights reserved. 11 Viewing the Statement Cache promon  R&D  1. Status Displays Client Database-Request Statement Cache Activate For Selected Users 2. Activate For All Users 3. Activate For All Future Users 4. Deactivate For Selected Users 5. Deactivate For All Users 6. Deactivate For All Future Users 7. View Database-Request Statement Cache 8. Specify Directory for Statement Cache Files View Let’s have a look at…

© 2010 Progress Software Corporation. All rights reserved. 12 Caching Types 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:20:50 View Database-Request Statement Cache Usr Name Type Login time Serv Type Cache Update 5 userb SELF/ABL 12/07/10 09:380 L1 12/07/10 09:50 23 userb REMC/ABL 12/07/10 09: userb REMC/ABL 12/07/10 09:401 L2 12/07/10 09:50 25 userb REMC/ABL 12/07/10 09:401 RQ 12/07/10 09:50 26 userb REMC/SQL 12/07/10 09:40 3 L2 12/07/10 09:50 Type  Describes value in the cache  Remains blank if cache not populated yet

© 2010 Progress Software Corporation. All rights reserved. 13 Caching Types 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:20:50 View Database-Request Statement Cache Usr Name Type Login time Serv Type Cache Update 5 userb SELF/ABL 12/07/10 09:38 0 L1 12/07/10 09:50 23 userb REMC/ABL 12/07/10 09:40 1 L2 12/07/10 09:50 24 userb REMC/ABL 12/07/10 09:40 1 RQ 12/07/10 09:50  “L1”: Level 1 Continuous procedure at top of stack only “SQL Statement or Single ABL Program Name”  “L2”: Level 2 Continuous full stack “SQL Statement or Partial ABL Program Stack”  “RQ”: Client Trace Request (level 3) One time stack “SQL Statement or Partial ABL Program Stack”

© 2010 Progress Software Corporation. All rights reserved. 14 OpenEdge SQL Support  Operates on user or server level - same rules apply “All users” option does not indicate server specifically  Lower overhead Statement level entry No additional network traffic (all server side)  Line number not used (always 0 in VST) 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:25:34 View Database-Request Statement Cache User number : 22 User name : userb User type : REMC/SQLC Login date/time : 12/07/10 09:02 Statement caching type : SQL Statement or Partial ABL Program Stack Statement caching last updated : 12/07/10 11:23 Statement cache information : select count(*) from pub.customer

© 2010 Progress Software Corporation. All rights reserved. 15 Statement Caching for ABL  Line #: procedure/function name, file name Maps to COMPILE w/DEBUG-LIST option  No internal procedure/function name, no problem Line # and file name only  Pathname Same as run command PROPATH not prepended 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:25:34 View Database-Request Statement Cache … Statement cache information : 2 : finalProcedure userb/my_dot_rs/longNamedDotr4.r 4 : userb/my_dot_rs/longNamedDotr3.r 4 : userb/my_dot_rs/longNamedDotr2.r 4 : userb/my_dot_rs/longNamedDotr1.r 1 : r2.r

© 2010 Progress Software Corporation. All rights reserved. 16 Statement Caching for OO ABL  Line #  Method name  Class file name without.cls extension  Example run from proc editor (note.ped) 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:25:34 View Database-Request Statement Cache … Statement cache information : 17 : reallyLongNamedProcedure3 proctest2.p 12 : reallyLongNamedProcedure2 proctest2.p 5 : reallyLongNamedProcedure1 proctest2.p 445 : proctest2.p 16 : methodB test13d 3 : runner.p 1 : /usr1/userb/11/stmtest/p49070_Untitled1.ped

© 2010 Progress Software Corporation. All rights reserved. 17 Application Server  Establish logging by user (AppServer Agent) Same as any other user  Tracing back Actions based on AppServer agent connection Connection/tracing maintained across session disconnect Difficult to identify originating user request  asbroker1.server.log Contains procedure call info too! –Even at loggingLevel=1 (error only)

© 2010 Progress Software Corporation. All rights reserved. 18 Manually Generate Stack Trace  Stack also available via ABL dump request Useful for “non-responsive” connections Available with 10.1c Must have access to client’s machine  kill –SIGUSR1 (Don’t forget the dash) protrace. –Startup parameters –Execution stack (Statement cache) –** ABL Stack Trace ** –** Persistent procedures/Classes ** –** PROPATH ** –** Databases (logical/type/physical) ** Enhanced protrace format

© 2010 Progress Software Corporation. All rights reserved. 19 Statement Caching and -1  Line # of -1 Database action at end of procedure Not a specific line # in a.p Often the result of buffer flushing 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:25:34 View Database-Request Statement Cache … Statement cache information : -1 : reallyLongNamedProcedure1 proctest2.p 445 : proctest2.p 16 : methodB test13d 3 : runner.p 1 : /usr1/userb/11/stmtest/p49070_Untitled1.ped

© 2010 Progress Software Corporation. All rights reserved. 20 File Overflow Directory promon  R&D  1. Status Displays Client Database-Request Statement Cache Activate For Selected Users 2. Activate For All Users 3. Activate For All Future Users 4. Deactivate For Selected Users 5. Deactivate For All Users 6. Deactivate For All Future Users 7. View Database-Request Statement Cache 8. Specify Directory for Statement Cache Files Other Let’s have a look at…

© 2010 Progress Software Corporation. All rights reserved. 21 External Files  Setting Default is.db directory Set it once New overflow files go to new location One file per connection  Format (“/” replaced by “~”) Fully qualified.. usr1~pug~x cst OR C!~users~pug~x cst  Persistence Created when stack > 256 bytes Removed at disconnect Location instance specific No startup parameter Location, location, location.

© 2010 Progress Software Corporation. All rights reserved. 22 Virtual System Table Visualization

© 2010 Progress Software Corporation. All rights reserved. 23 VST Monitoring  _Connect-CachingType Caching level: 01, 02, 03 Value “requested” in promon (top, stack, one-time)  _Connect-CacheInfoType "ABL Program", "SQL Statement", "ABL Stack“ Value of current stack type displayed “?”: stack requested and no stack yet  "ABL Program“ (01) Procedure and.p name displayed  "ABL Stack“ (02 & 03)  “SQL Statement” (01, 02 & 03) _Connect. …

© 2010 Progress Software Corporation. All rights reserved. 24 VST Monitoring  _Connect-CacheLastUpdate Date/time of cache update One time stack - indicates age of information Continual stack – indicates time of last database request  _Connect-CacheInfo[32] Up to “last“ 32 stack entries Procedure & executing image name –.p or.r executed (run) –Pathname specified (not fully qualified)  _Connect-CacheLineNumber[32] Up to “last” 32 stack entries Line number of code _Connect. …

© 2010 Progress Software Corporation. All rights reserved. 25 Example Query DISPLAY _Connect-id _Connect-Usr _Connect-CachingType _Connect-CacheInfoType format "x(12)“ _Connect-CacheLineNumber[1] label "Line“ _Connect-CacheInfo[1] label "Entry“ _Connect-CacheLineNumber[2] no-label _Connect-CacheInfo[2] no-label END. FOR EACH _Connect WHERE _Connect-CachingType <> ?: “one-time” sets CachingType to “?” after processed. FOR EACH _Connect WHERE _Connect-CacheInfoType <> ?: CacheInfoType set when data exists, not pending. No! Yes!

© 2010 Progress Software Corporation. All rights reserved. 26 VST Sidebar FOR EACH _Connection: DISPLAY _Connect-id _Connect-Usr END. Connect-Id Connect-usr ? 4 ? 5 ? ? 8 ? 9 ?  All VSTs have an index (VSI) Find by VSI field is usually quicker (for queries with where clause) Index find vs table scan Depends if table based or not –Lock table is chain based Value always known  VSI Counts from 1  Data may count from 1 or 0 _Connect user counts from 0 FIND _Connect WHERE _Connect-Usr = aUserId. No! FIND _Connect WHERE _Connect-Id = aUserId + 1. Yes!

© 2010 Progress Software Corporation. All rights reserved. 27 Memory

© 2010 Progress Software Corporation. All rights reserved. 28 Memory Consumption  Statement cache is always “server side”  Static allocation 28 bytes * (–n + -Mn + 2), regardless of cache state  Dynamic allocation 288 bytes per enabled user Allocated upon stack population 32 bytes control info, 256 bytes actual stack SHM reserved at DB startup –80 bytes * (-n + -Mn + 2) –-Mxs is used for overflow  Consumption subject to change without notice

© 2010 Progress Software Corporation. All rights reserved. 29 Memory Management  Shared resource Cache protected by USR latch  Reusable resource Self service clients reuse the memory Network clients free it at disconnect  Finite resource -Mxs exhaustion produces no error or warning! Generic status of: "Statement caching information cannot be obtained or is not available.“ Shared memory is a…

© 2010 Progress Software Corporation. All rights reserved. 30 Increase Startup Parameters Online sidebar proutil -C increaseto  : -L, -B, -bibufs, -aibufs, -Mxs  Increase, not decrease  New segment restrictions Kernel restrictions apply Security restrictions –Servers: automatically attach quickly –Self serve: attach w/db action over time Minimum segment size created: 128 MB Increase startup parameters without database restart

© 2010 Progress Software Corporation. All rights reserved. 31 Increase startup parameters online Increasing excess shared memory online proutil myDb -C increaseto -Mxs Waiting for broker connection to newly added shared memory segments. Usr Name Type Pid 7 userb ABL 5957 The connections above have not attached to recently added shm segments. Do you wish to recheck? (y/n) (n): Increase params aborted because of shared memory allocation issue. (y): Increase params increasing excess shared memory (-Mxs) from 1024 to

© 2010 Progress Software Corporation. All rights reserved. 32 Performance

© 2010 Progress Software Corporation. All rights reserved. 33 Performance: Communication  Client message coupled w/statement cache message Each database “update” and find request Each database “lock” request –(SHARE/EXCL) –Record/Schema Same stack, no new message Can more than double the network traffic  Server side queries Do not required additional messages Client stack is not changing anyway!  Full stack displayed if enabled while in use 1: for each customer no-lock: 2: the_addr = address. 3: end. 1: for each customer share-lock: 2: the_addr = address. 3: end.

© 2010 Progress Software Corporation. All rights reserved. 34 Performance: Communication  Network message size is –Mm If exceeded, multiple messages required  How to get really large messages Long.p names (run path) for one! Deep stack for another.  Help! Increase –Mm (client AND server) PROPATH to decrease “run” path length Shorter function/procedure/file names One-time request Request stack top entry only Be frugal with activation More data can mean more messages

© 2010 Progress Software Corporation. All rights reserved. 35 Performance Impact  Performance vs information trade off Continuous full stack reporting Modular programming – Improves information – Increases stack size  Let’s look at some data

© 2010 Progress Software Corporation. All rights reserved. 36 Performance Data 300 User ATM Results

© 2010 Progress Software Corporation. All rights reserved. 37 Some Numbers  Overall I/O not an issue RAM disk external file –no change  Self service ~5% any stack depth  Network connection Biggest affect -Mm no help  Deep Biggest affect on network 24% ATM 300 User Test Difference chart in % With and w/out caching Shallow vs deep stack (~3K) Client server vs Self Service With and w/out –Mm 8K

© 2010 Progress Software Corporation. All rights reserved. 38 Example Use Case

© 2010 Progress Software Corporation. All rights reserved. 39 Scenario #1 - Deadlock  Situation Users are in deadlock  Step #1 Look at promon lock activity 12/07/10 Status: Lock Table Usr Name Trans ID Type Rec-id Table Flags Tran State 6 user REC X Begin 7 user REC S QH Begin 7 user REC X Begin 6 user REC S QH Begin

© 2010 Progress Software Corporation. All rights reserved. 40 Scenario #1 - Deadlock  Statement cache already enabled View users in deadlock 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:45:34 View Database-Request Statement Cache Statement cache information : 22 : find-orders x2.p 20 : process-customers x1.p 25 : x.p x.p 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:45:34 View Database-Request Statement Cache Statement cache information : 32 : find-customers c2.p 30 : process-orders c1.p 35 : c.p c.p

© 2010 Progress Software Corporation. All rights reserved. 41 Scenario #1 - Deadlock  Statement cache NOT already enabled Enable and wait for next occurrence  Too late to enable statement caching Use kill –SIGUSR1 cat protrace. ** ABL Stack Trace ** --> find-orders x2.p (x2.p) at line 22 process-customers x1.p (x1.p) at line 20 x.p (x.p) at line 25 ** ABL Stack Trace ** --> find-customer c2.p (c2.p) at line 32 process-orders c1.p (c1.p) at line 30 c.p (c.p) at line 35

© 2010 Progress Software Corporation. All rights reserved. 42 Scenario #2 – Lock Table Overflow  Situation New.r code is deployed but “nothing changed” “Lock table overflow, increase -L on server”  Your job Find user doing table scan Try to identify where code went wrong  Step #1 Look at promon lock activity 12/07/10 Other: Lock Requests By User Usr User --- Record Trans Schema --- Name Locks Waits Locks Waits Locks Waits 0 pug userb userb …

© 2010 Progress Software Corporation. All rights reserved. 43 Scenario #2  Enable statement cache for user  Track data back to user/code  Report to development 12/07/10 OpenEdge Release 11 Monitor (R&D) 11:45:34 View Database-Request Statement Cache Statement cache information : 445 : report-customers all_customers.p 16 : change-cust-address update_customer.p 3 : manage-cust-acct runner.p

© 2010 Progress Software Corporation. All rights reserved. 44 Summary  Flexible enablement options  Impact noticeable on network connections  Provides remote visualization  As always, choose the best tool for the job

© 2010 Progress Software Corporation. All rights reserved. 45 Questions ?

© 2010 Progress Software Corporation. All rights reserved. 46