diff options
author | San Mehat <san@google.com> | 2009-06-03 15:36:35 -0700 |
---|---|---|
committer | San Mehat <san@google.com> | 2009-06-03 15:36:35 -0700 |
commit | e20e1347b9914aa05e30548c15d7cd5e412cc0e2 (patch) | |
tree | 1204a7ec18a5ed9ed146e06ab6ac1e2e8c31e76e | |
parent | b1126ed93245bdf9fe7c701626055caeb75b9870 (diff) | |
download | blktrace-e20e1347b9914aa05e30548c15d7cd5e412cc0e2.tar.gz |
blktrace: Initial checkin of ported version
Signed-off-by: San Mehat <san@google.com>
-rw-r--r-- | Android.mk | 53 | ||||
-rw-r--r-- | COPYING | 340 | ||||
-rw-r--r-- | LICENSE | 340 | ||||
-rw-r--r-- | Makefile | 90 | ||||
-rw-r--r-- | README | 183 | ||||
-rw-r--r-- | act_mask.c | 47 | ||||
-rw-r--r-- | barrier.h | 33 | ||||
-rw-r--r-- | blkiomon.c | 756 | ||||
-rw-r--r-- | blkiomon.h | 117 | ||||
-rw-r--r-- | blkparse.c | 2877 | ||||
-rw-r--r-- | blkparse_fmt.c | 464 | ||||
-rw-r--r-- | blkrawverify.c | 322 | ||||
-rw-r--r-- | blktrace.c | 2664 | ||||
-rw-r--r-- | blktrace.h | 149 | ||||
-rw-r--r-- | blktrace_api.h | 136 | ||||
-rw-r--r-- | btrace | 38 | ||||
-rw-r--r-- | btrace.spec | 55 | ||||
-rw-r--r-- | btreplay/Makefile | 45 | ||||
-rw-r--r-- | btreplay/btrecord.c | 789 | ||||
-rw-r--r-- | btreplay/btrecord.h | 95 | ||||
-rw-r--r-- | btreplay/btreplay.c | 1627 | ||||
-rw-r--r-- | btreplay/doc/Makefile | 18 | ||||
-rw-r--r-- | btreplay/doc/abstract.tex | 34 | ||||
-rw-r--r-- | btreplay/doc/btreplay.tex | 532 | ||||
-rw-r--r-- | btt/.Android.mk.swp | bin | 0 -> 12288 bytes | |||
-rw-r--r-- | btt/Android.mk | 23 | ||||
-rw-r--r-- | btt/Makefile | 45 | ||||
-rw-r--r-- | btt/README | 17 | ||||
-rw-r--r-- | btt/aqd.c | 80 | ||||
-rw-r--r-- | btt/args.c | 414 | ||||
-rw-r--r-- | btt/bno_dump.c | 82 | ||||
-rw-r--r-- | btt/bno_plot.py | 127 | ||||
-rw-r--r-- | btt/bt_timeline.c | 126 | ||||
-rwxr-xr-x | btt/btt_plot.py | 394 | ||||
-rw-r--r-- | btt/devmap.c | 92 | ||||
-rw-r--r-- | btt/devs.c | 281 | ||||
-rw-r--r-- | btt/dip_rb.c | 86 | ||||
-rw-r--r-- | btt/doc/Makefile | 15 | ||||
-rw-r--r-- | btt/doc/activity.eps | 923 | ||||
-rw-r--r-- | btt/doc/bno_plot.eps | 7696 | ||||
-rw-r--r-- | btt/doc/btt.tex | 1176 | ||||
-rw-r--r-- | btt/doc/dhist.eps | 2513 | ||||
-rw-r--r-- | btt/doc/qhist.eps | 1289 | ||||
-rw-r--r-- | btt/doc/sample-btt-output.tex | 95 | ||||
-rw-r--r-- | btt/doc/seek.eps | 5628 | ||||
-rw-r--r-- | btt/doc/sps.eps | 5377 | ||||
-rw-r--r-- | btt/globals.h | 347 | ||||
-rw-r--r-- | btt/inlines.h | 383 | ||||
-rw-r--r-- | btt/iostat.c | 283 | ||||
-rw-r--r-- | btt/latency.c | 73 | ||||
-rw-r--r-- | btt/list.h | 239 | ||||
-rw-r--r-- | btt/misc.c | 177 | ||||
-rw-r--r-- | btt/mmap.c | 150 | ||||
-rw-r--r-- | btt/output.c | 891 | ||||
-rw-r--r-- | btt/plat.c | 93 | ||||
-rw-r--r-- | btt/proc.c | 263 | ||||
-rw-r--r-- | btt/q2d.c | 121 | ||||
-rw-r--r-- | btt/seek.c | 305 | ||||
-rw-r--r-- | btt/trace.c | 105 | ||||
-rw-r--r-- | btt/trace_complete.c | 125 | ||||
-rw-r--r-- | btt/trace_im.c | 107 | ||||
-rw-r--r-- | btt/trace_issue.c | 73 | ||||
-rw-r--r-- | btt/trace_plug.c | 47 | ||||
-rw-r--r-- | btt/trace_queue.c | 53 | ||||
-rw-r--r-- | btt/trace_remap.c | 59 | ||||
-rw-r--r-- | btt/trace_requeue.c | 35 | ||||
-rw-r--r-- | btt/unplug_hist.c | 87 | ||||
-rw-r--r-- | doc/Makefile | 15 | ||||
-rw-r--r-- | doc/blkiomon.8 | 116 | ||||
-rw-r--r-- | doc/blkparse.1 | 567 | ||||
-rw-r--r-- | doc/blkrawverify.1 | 47 | ||||
-rw-r--r-- | doc/blktrace.8 | 259 | ||||
-rw-r--r-- | doc/blktrace.tex | 814 | ||||
-rw-r--r-- | doc/bno_plot.1 | 64 | ||||
-rw-r--r-- | doc/btrace.8 | 88 | ||||
-rw-r--r-- | doc/btrecord.8 | 210 | ||||
-rw-r--r-- | doc/btreplay.8 | 233 | ||||
-rw-r--r-- | doc/btt.1 | 369 | ||||
-rw-r--r-- | doc/verify_blkparse.1 | 44 | ||||
-rw-r--r-- | jhash.h | 157 | ||||
-rw-r--r-- | rbtree.c | 389 | ||||
-rw-r--r-- | rbtree.h | 165 | ||||
-rw-r--r-- | stats.h | 155 | ||||
-rw-r--r-- | strverscmp.c | 156 | ||||
-rw-r--r-- | verify_blkparse.c | 66 |
85 files changed, 46213 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..918aa5e --- /dev/null +++ b/Android.mk @@ -0,0 +1,53 @@ +BUILD_BLKTRACE := true + +ifeq ($(BUILD_BLKTRACE), true) + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := blkparse.c blkparse_fmt.c rbtree.c act_mask.c strverscmp.c +LOCAL_C_INCLUDES := external/blktrace/ +LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +LOCAL_MODULE := blkparse +LOCAL_MODULE_TAGS := +LOCAL_SYSTEM_SHARED_LIBRARIES := libc +include $(BUILD_EXECUTABLE) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := blktrace.c act_mask.c +LOCAL_C_INCLUDES := external/blktrace/ +LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_ANDROID_ +LOCAL_MODULE := blktrace +LOCAL_MODULE_TAGS := +LOCAL_SYSTEM_SHARED_LIBRARIES := libc +include $(BUILD_EXECUTABLE) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := verify_blkparse.c +LOCAL_C_INCLUDES := external/blktrace/ +LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +LOCAL_MODULE := verify_blkparse +LOCAL_MODULE_TAGS := +LOCAL_SYSTEM_SHARED_LIBRARIES := libc +include $(BUILD_EXECUTABLE) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := blkrawverify.c +LOCAL_C_INCLUDES := external/blktrace/ +LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +LOCAL_MODULE := blkrawverify +LOCAL_MODULE_TAGS := +LOCAL_SYSTEM_SHARED_LIBRARIES := libc +include $(BUILD_EXECUTABLE) + +#include $(CLEAR_VARS) +#LOCAL_SRC_FILES := blkiomon.c +#LOCAL_C_INCLUDES := external/blktrace/ +#LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +#LOCAL_MODULE := blkiomon +#LOCAL_MODULE_TAGS := +#LOCAL_SYSTEM_SHARED_LIBRARIES := libc +#include $(BUILD_EXECUTABLE) + + +endif @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..623b84b --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +CC = gcc +CFLAGS = -Wall -O2 -g -W +ALL_CFLAGS = $(CFLAGS) -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +PROGS = blkparse blktrace verify_blkparse blkrawverify blkiomon +LIBS = -lpthread +SCRIPTS = btrace + +ALL = $(PROGS) $(SCRIPTS) btt/btt btreplay/btrecord btreplay/btreplay \ + btt/bno_plot.py + +all: $(ALL) + +btt/btt: + $(MAKE) -C btt + +btreplay/btrecord: + $(MAKE) -C btreplay + +btreplay/btreplay: + $(MAKE) -C btreplay + +%.o: %.c + $(CC) -o $*.o -c $(ALL_CFLAGS) $< + +blkparse: blkparse.o blkparse_fmt.o rbtree.o act_mask.o + $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) + +blktrace: blktrace.o act_mask.o + $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIBS) + +verify_blkparse: verify_blkparse.o + $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) + +blkrawverify: blkrawverify.o + $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) + +blkiomon: blkiomon.o rbtree.o + $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIBS) -lrt + +$(PROGS): | depend + +docs: + $(MAKE) -C doc all + $(MAKE) -C btt docs + $(MAKE) -C btreplay docs + +docsclean: + $(MAKE) -C doc clean + $(MAKE) -C btt clean + $(MAKE) -C btreplay clean + +depend: + @$(CC) -MM $(ALL_CFLAGS) *.c 1> .depend + +INSTALL = install +prefix = /usr/local +bindir = $(prefix)/bin +mandir = $(prefix)/man +RPMBUILD = rpmbuild +TAR = tar + +export prefix INSTALL TAR + +dist: btrace.spec + git-tar-tree HEAD btrace-1.0 > btrace-1.0.tar + @mkdir -p btrace-1.0 + @cp btrace.spec btrace-1.0 + $(TAR) rf btrace-1.0.tar btrace-1.0/btrace.spec + @rm -rf btrace-1.0 + @bzip2 btrace-1.0.tar + +rpm: dist + $(RPMBUILD) -ta btrace-1.0.tar.bz2 + +clean: docsclean + -rm -f *.o $(PROGS) .depend btrace-1.0.tar.bz2 + $(MAKE) -C btt clean + $(MAKE) -C btreplay clean + +install: all + $(INSTALL) -m 755 -d $(DESTDIR)$(bindir) + $(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1 + $(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man8 + $(INSTALL) -m 755 $(ALL) $(DESTDIR)$(bindir) + $(INSTALL) -m 644 doc/*.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL) -m 644 doc/*.8 $(DESTDIR)$(mandir)/man8 + +ifneq ($(wildcard .depend),) +include .depend +endif @@ -0,0 +1,183 @@ +Block IO Tracing +---------------- + +Written by Jens Axboe <axboe@kernel.dk> (initial version and kernel support), +Alan D. Brunelle (threading and splitup into two seperate programs), +Nathan Scott <nathans@sgi.com> (bug fixes, process names, multiple devices) +Also thanks to Tom Zanussi <zanussi@us.ibm.com> for good input and +patches. + + +Requirements +------------ + +blktrace was integrated into the mainline kernel between 2.6.16 and 2.6.17-rc1. +The target trace needs to run on a kernel at least that new. + +git://git.kernel.dk/blktrace.git + +If you don't have git, you can get hourly snapshots from: + +http://brick.kernel.dk/snaps/ + +The snapshots include the full git object database as well. kernel.org has +excessively long mirror times, so if you have git installed, you can pull +the master tree from: + +git://git.kernel.dk/blktrace.git + +For browsing the repo over http and viewing history etc, you can direct +your browser to: + +http://git.kernel.dk/ + + +Usage +----- + +$ blktrace -d <dev> [ -r debug_path ] [ -o output ] [ -k ] [ -w time ] + [ -a action ] [ -A action mask ] + + -d Use specified device. May also be given last after options. + -r Path to mounted debugfs, defaults to /sys/kernel/debug. + -o File(s) to send output to. + -D Directory to prepend to output file names. + -k Kill running trace. + -w Stop after defined time, in seconds. + -a Only trace specific actions (use more -a options to add actions). + Available actions are: + + READ + WRITE + BARRIER + SYNC + QUEUE + REQUEUE + ISSUE + COMPLETE + FS + PC + + -A Give the trace mask directly as a number. + + -b Sub buffer size in KiB. + -n Number of sub buffers. + -l Run in network listen mode (blktrace server) + -h Run in network client mode, connecting to the given host + -p Network port to use (default 8462) + -s Disable network client use of sendfile() to transfer data + -V Print program version info. + +$ blkparse -i <input> [ -o <output> ] [ -b rb_batch ] [ -s ] [ -t ] [ -q ] + [ -w start:stop ] [ -f output format ] [ -F format spec ] + [ -d <binary> ] + + -i Input file containing trace data, or '-' for stdin. + -D Directory to prepend to input file names. + -o Output file. If not given, output is stdout. + -b stdin read batching. + -s Show per-program io statistics. + -h Hash processes by name, not pid. + -t Track individual ios. Will tell you the time a request took to + get queued, to get dispatched, and to get completed. + -q Quiet. Don't display any stats at the end of the trace. + -w Only parse data between the given time interval in seconds. If + 'start' isn't given, blkparse defaults the start time to 0. + -d Dump sorted data in binary format + -f Output format. Customize the output format. The format field + identifiers are: + + %a - Action + %c - CPU ID + %C - Task command (process) name + %d - Direction (r/w) + %D - Device number + %e - Error number + %M - Major + %m - Minor + %N - Number of bytes + %n - Number of sectors + %p - PID + %P - PDU + %s - Sequence number + %S - Sector number + %t - Time (wallclock - nanoseconds) + %T - Time (wallclock - seconds) + %u - Time (processing - microseconds) + %U - Unplug depth + + -F Format specification. The individual specifiers are: + + A - Remap + B - Bounce + C - Complete + D - Issue + M - Back merge + F - Front merge + G - Get request + I - Insert + P - Plug + Q - Queue + R - Requeue + S - Sleep requests + T - Unplug timer + U - Unplug IO + W - Bounce + X - Split + + -v More verbose for marginal errors. + -V Print program version info. + +$ verify_blkparse filename + + Verifies an output file from blkparse. All it does is check if + the events in the file are correctly time ordered. If an entry + is found that isn't ordered, it's dumped to stdout. + +$ blkrawverify <dev> [<dev>...] + + The blkrawverify utility can be used to verify data retrieved + via blktrace. It will check for valid event formats, forward + progressing sequence numbers and time stamps, also does reasonable + checks for other potential issues within invidividual events. + + Errors found will be tracked in <dev>.verify.out. + +If you want to do live tracing, you can pipe the data between blktrace +and blkparse: + +% blktrace -d <device> -o - | blkparse -i - + +This has a small risk of displaying some traces a little out of sync, since +it will do batch sorts of input events. Similarly, you can do traces over +the network. The network 'server' must run: + +% blktrace -l + +to listen to incoming blktrace connections, while the client should use + +% blktrace -d /dev/sda -h <server hostname> + +to connect and transfer data over the network. + + +Documentation +------------- + +A users guide is distributed with the source. It is in latex, a +'make docs' will build a PDF in doc/. You need tetex and latex installed +to build the document. + + +Resources +--------- + +vger hosts a mailing list dedicated to btrace discussion and development. +The list is called linux-btrace@vger.kernel.org, subscribe by sending +a mail to majordomo@vger.kernel.org with 'subscribe linux-btrace' in +the mail body. + + + +2006-09-05, Jens Axboe <axboe@kernel.dk> + diff --git a/act_mask.c b/act_mask.c new file mode 100644 index 0000000..8890887 --- /dev/null +++ b/act_mask.c @@ -0,0 +1,47 @@ +#include <string.h> +#include "blktrace.h" + +#define DECLARE_MASK_MAP(mask) { BLK_TC_##mask, #mask, "BLK_TC_"#mask } +#define COMPARE_MASK_MAP(mmp, str) \ + (!strcasecmp((mmp)->short_form, (str)) || \ + !strcasecmp((mmp)->long_form, (str))) + +struct mask_map { + int mask; + char *short_form; + char *long_form; +}; + +static struct mask_map mask_maps[] = { + DECLARE_MASK_MAP(READ), + DECLARE_MASK_MAP(WRITE), + DECLARE_MASK_MAP(BARRIER), + DECLARE_MASK_MAP(SYNC), + DECLARE_MASK_MAP(QUEUE), + DECLARE_MASK_MAP(REQUEUE), + DECLARE_MASK_MAP(ISSUE), + DECLARE_MASK_MAP(COMPLETE), + DECLARE_MASK_MAP(FS), + DECLARE_MASK_MAP(PC), + DECLARE_MASK_MAP(NOTIFY), + DECLARE_MASK_MAP(AHEAD), + DECLARE_MASK_MAP(META), + DECLARE_MASK_MAP(DISCARD), + DECLARE_MASK_MAP(DRV_DATA), +}; + +int find_mask_map(char *string) +{ + unsigned int i; + + for (i = 0; i < sizeof(mask_maps)/sizeof(mask_maps[0]); i++) + if (COMPARE_MASK_MAP(&mask_maps[i], string)) + return mask_maps[i].mask; + + return -1; +} + +int valid_act_opt(int x) +{ + return (1 <= x) && (x < (1 << BLK_TC_SHIFT)); +} diff --git a/barrier.h b/barrier.h new file mode 100644 index 0000000..14d06b5 --- /dev/null +++ b/barrier.h @@ -0,0 +1,33 @@ +#ifndef BARRIER_H +#define BARRIER_H + +#if defined(__ia64__) + #define store_barrier() asm volatile ("mf" ::: "memory") +#elif defined(__x86_64__) + #define store_barrier() asm volatile("sfence" ::: "memory") +#elif defined(__i386__) + #define store_barrier() asm volatile ("": : :"memory") +#elif defined(__ppc__) || defined(__powerpc__) + #define store_barrier() asm volatile ("eieio" : : : "memory") +#elif defined(__s390__) || defined(__s390x__) + #define store_barrier() asm volatile ("bcr 15,0" : : : "memory") +#elif defined(__alpha__) + #define store_barrier() asm volatile("wmb": : :"memory") +#elif defined(__hppa__) + #define store_barrier() asm volatile("":::"memory") +#elif defined(__sparc__) + #define store_barrier() asm volatile("":::"memory") +#elif defined(__m68000__) || defined(__m68k__) || defined(mc68000) || defined(_M_M68K) + #define store_barrier() asm volatile("":::"memory") +#elif defined(__mips__) /* also mipsel */ + #define store_barrier() do { } while(0) +#elif defined(__arm__) + /* taken from linux/arch/arm/kernel/entry-armv.S, thanks to pbrook! */ + typedef void (__kernel_dmb_t)(void); + #define __kernel_dmb (*(__kernel_dmb_t *)0xffff0fa0) + #define store_barrier() __kernel_dmb() +#else + #error Define store_barrier() for your CPU +#endif + +#endif diff --git a/blkiomon.c b/blkiomon.c new file mode 100644 index 0000000..9fc4d75 --- /dev/null +++ b/blkiomon.c @@ -0,0 +1,756 @@ +/* + * I/O monitor based on block queue trace data + * + * Copyright IBM Corp. 2008 + * + * Author(s): Martin Peschke <mp3@de.ibm.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <signal.h> +#include <getopt.h> +#include <errno.h> +#include <locale.h> +#include <libgen.h> +#include <sys/msg.h> +#include <pthread.h> +#include <time.h> + +#include "blktrace.h" +#include "rbtree.h" +#include "jhash.h" +#include "blkiomon.h" + +struct trace { + struct blk_io_trace bit; + struct rb_node node; + struct trace *next; + long sequence; +}; + +struct rb_search { + struct rb_node **node_ptr; + struct rb_node *parent; +}; + +struct dstat_msg { + long mtype; + struct blkiomon_stat stat; +}; + +struct dstat { + struct dstat_msg msg; + struct rb_node node; + struct dstat *next; +}; + +struct output { + char *fn; + FILE *fp; + char *buf; + int pipe; +}; + +static char blkiomon_version[] = "0.3"; + +static FILE *ifp; +static int interval = -1; + +static struct trace *vacant_traces_list = NULL; +static int vacant_traces = 0; + +#define TRACE_HASH_SIZE 128 +struct trace *thash[TRACE_HASH_SIZE] = {}; + +static struct dstat *vacant_dstats_list = NULL; +static struct rb_root dstat_tree[2] = { RB_ROOT, RB_ROOT }; +static struct dstat *dstat_list[2] = {}; +static int dstat_curr = 0; + +static struct output drvdata, human, binary, debug; + +static char *msg_q_name = NULL; +static int msg_q_id = -1, msg_q = -1; +static long msg_id = -1; + +static pthread_t interval_thread; +static pthread_mutex_t dstat_mutex = PTHREAD_MUTEX_INITIALIZER; + +int data_is_native = -1; + +static int up = 1; + +/* debugging */ +static long leftover = 0, driverdata = 0, match = 0, mismatch = 0, sequence = 0; + +static void dump_bit(struct trace *t, const char *descr) +{ + struct blk_io_trace *bit = &t->bit; + + if (!debug.fn) + return; + + fprintf(debug.fp, "--- %s ---\n", descr); + fprintf(debug.fp, "magic %16d\n", bit->magic); + fprintf(debug.fp, "sequence %16d\n", bit->sequence); + fprintf(debug.fp, "time %16ld\n", (unsigned long)bit->time); + fprintf(debug.fp, "sector %16ld\n", (unsigned long)bit->sector); + fprintf(debug.fp, "bytes %16d\n", bit->bytes); + fprintf(debug.fp, "action %16x\n", bit->action); + fprintf(debug.fp, "pid %16d\n", bit->pid); + fprintf(debug.fp, "device %16d\n", bit->device); + fprintf(debug.fp, "cpu %16d\n", bit->cpu); + fprintf(debug.fp, "error %16d\n", bit->error); + fprintf(debug.fp, "pdu_len %16d\n", bit->pdu_len); + + fprintf(debug.fp, "order %16ld\n", t->sequence); +} + +static void dump_bits(struct trace *t1, struct trace *t2, const char *descr) +{ + struct blk_io_trace *bit1 = &t1->bit; + struct blk_io_trace *bit2 = &t2->bit; + + if (!debug.fn) + return; + + fprintf(debug.fp, "--- %s ---\n", descr); + fprintf(debug.fp, "magic %16d %16d\n", bit1->magic, bit2->magic); + fprintf(debug.fp, "sequence %16d %16d\n", + bit1->sequence, bit2->sequence); + fprintf(debug.fp, "time %16ld %16ld\n", + (unsigned long)bit1->time, (unsigned long)bit2->time); + fprintf(debug.fp, "sector %16ld %16ld\n", + (unsigned long)bit1->sector, (unsigned long)bit2->sector); + fprintf(debug.fp, "bytes %16d %16d\n", bit1->bytes, bit2->bytes); + fprintf(debug.fp, "action %16x %16x\n", bit1->action, bit2->action); + fprintf(debug.fp, "pid %16d %16d\n", bit1->pid, bit2->pid); + fprintf(debug.fp, "device %16d %16d\n", bit1->device, bit2->device); + fprintf(debug.fp, "cpu %16d %16d\n", bit1->cpu, bit2->cpu); + fprintf(debug.fp, "error %16d %16d\n", bit1->error, bit2->error); + fprintf(debug.fp, "pdu_len %16d %16d\n", bit1->pdu_len, bit2->pdu_len); + + fprintf(debug.fp, "order %16ld %16ld\n", t1->sequence, t2->sequence); +} + +static struct dstat *blkiomon_alloc_dstat(void) +{ + struct dstat *dstat; + + if (vacant_dstats_list) { + dstat = vacant_dstats_list; + vacant_dstats_list = dstat->next; + } else + dstat = malloc(sizeof(*dstat)); + if (!dstat) { + fprintf(stderr, + "blkiomon: could not allocate device statistic"); + return NULL; + } + + blkiomon_stat_init(&dstat->msg.stat); + return dstat; +} + +static struct dstat *blkiomon_find_dstat(struct rb_search *search, __u32 device) +{ + struct rb_node **p = &(dstat_tree[dstat_curr].rb_node); + struct rb_node *parent = NULL; + struct dstat *dstat; + + while (*p) { + parent = *p; + + dstat = rb_entry(parent, struct dstat, node); + + if (dstat->msg.stat.device < device) + p = &(*p)->rb_left; + else if (dstat->msg.stat.device > device) + p = &(*p)->rb_right; + else + return dstat; + } + search->node_ptr = p; + search->parent = parent; + return NULL; +} + +static struct dstat *blkiomon_get_dstat(__u32 device) +{ + struct dstat *dstat; + struct rb_search search; + + pthread_mutex_lock(&dstat_mutex); + + dstat = blkiomon_find_dstat(&search, device); + if (dstat) + goto out; + + dstat = blkiomon_alloc_dstat(); + if (!dstat) + goto out; + + dstat->msg.stat.device = device; + + rb_link_node(&dstat->node, search.parent, search.node_ptr); + rb_insert_color(&dstat->node, &dstat_tree[dstat_curr]); + + dstat->next = dstat_list[dstat_curr]; + dstat_list[dstat_curr] = dstat; + +out: + pthread_mutex_unlock(&dstat_mutex); + return dstat; +} + +static int blkiomon_output_msg_q(struct dstat *dstat) +{ + if (!msg_q_name) + return 0; + + dstat->msg.mtype = msg_id; + return msgsnd(msg_q, &dstat->msg, sizeof(struct blkiomon_stat), 0); +} + +static int blkiomon_output_binary(struct dstat *dstat) +{ + struct blkiomon_stat *p = &dstat->msg.stat; + + if (!binary.fn) + return 0; + + if (fwrite(p, sizeof(*p), 1, binary.fp) != 1) + goto failed; + if (binary.pipe && fflush(binary.fp)) + goto failed; + return 0; + +failed: + fprintf(stderr, "blkiomon: could not write to %s\n", binary.fn); + fclose(binary.fp); + binary.fn = NULL; + return 1; +} + +static struct dstat *blkiomon_output(struct dstat *head, struct timespec *ts) +{ + struct dstat *dstat, *tail = NULL; + + for (dstat = head; dstat; dstat = dstat->next) { + dstat->msg.stat.time = ts->tv_sec; + blkiomon_stat_print(human.fp, &dstat->msg.stat); + blkiomon_stat_to_be(&dstat->msg.stat); + blkiomon_output_binary(dstat); + blkiomon_output_msg_q(dstat); + tail = dstat; + } + return tail; +} + +static void *blkiomon_interval(void *data) +{ + struct timespec wake, r; + struct dstat *head, *tail; + int finished; + + clock_gettime(CLOCK_REALTIME, &wake); + + while (1) { + wake.tv_sec += interval; + if (clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &wake, &r)) { + fprintf(stderr, "blkiomon: interrupted sleep"); + continue; + } + + /* grab tree and make data gatherer build up another tree */ + pthread_mutex_lock(&dstat_mutex); + finished = dstat_curr; + dstat_curr = dstat_curr ? 0 : 1; + pthread_mutex_unlock(&dstat_mutex); + + head = dstat_list[finished]; + if (!head) + continue; + dstat_list[finished] = NULL; + dstat_tree[finished] = RB_ROOT; + tail = blkiomon_output(head, &wake); + + pthread_mutex_lock(&dstat_mutex); + tail->next = vacant_dstats_list; + vacant_dstats_list = head; + pthread_mutex_unlock(&dstat_mutex); + } + return data; +} + +#define BLK_DATADIR(a) (((a) >> BLK_TC_SHIFT) & (BLK_TC_READ | BLK_TC_WRITE)) + +static int blkiomon_account(struct blk_io_trace *bit_d, + struct blk_io_trace *bit_c) +{ + struct dstat *dstat; + struct blkiomon_stat *p; + __u64 d2c = (bit_c->time - bit_d->time) / 1000; /* ns -> us */ + __u32 size = bit_d->bytes; + __u64 thrput = size * 1000 / d2c; + + dstat = blkiomon_get_dstat(bit_d->device); + if (!dstat) + return 1; + p = &dstat->msg.stat; + + if (BLK_DATADIR(bit_c->action) & BLK_TC_READ) { + minmax_account(&p->thrput_r, thrput); + minmax_account(&p->size_r, size); + minmax_account(&p->d2c_r, d2c); + } else if (BLK_DATADIR(bit_c->action) & BLK_TC_WRITE) { + minmax_account(&p->thrput_w, thrput); + minmax_account(&p->size_w, size); + minmax_account(&p->d2c_w, d2c); + } else + p->bidir++; + + histlog2_account(p->size_hist, size, &size_hist); + histlog2_account(p->d2c_hist, d2c, &d2c_hist); + return 0; +} + +static struct trace *blkiomon_alloc_trace(void) +{ + struct trace *t = vacant_traces_list; + if (t) { + vacant_traces_list = t->next; + vacant_traces--; + } else + t = malloc(sizeof(*t)); + memset(t, 0, sizeof(*t)); + return t; +} + +static void blkiomon_free_trace(struct trace *t) +{ + if (vacant_traces < 256) { + t->next = vacant_traces_list; + vacant_traces_list = t; + vacant_traces++; + } else + free(t); +} + +static int action(int a) +{ + int bits = BLK_TC_WRITE | BLK_TC_READ | BLK_TC_FS | BLK_TC_PC; + return a & (BLK_TC_ACT(bits)); +} + +static void blkiomon_store_trace(struct trace *t) +{ + int i = t->bit.sector % TRACE_HASH_SIZE; + + t->next = thash[i]; + thash[i] = t; +} + +static struct trace *blkiomon_fetch_trace(struct blk_io_trace *bit) +{ + int i = bit->sector % TRACE_HASH_SIZE; + struct trace *t, *prev = NULL; + + for (t = thash[i]; t; t = t->next) { + if (t->bit.device == bit->device && + t->bit.sector == bit->sector && + action(t->bit.action) == action(bit->action)) { + if (prev) + prev->next = t->next; + else + thash[i] = t->next; + return t; + } + prev = t; + } + return NULL; +} + +static struct trace *blkiomon_do_trace(struct trace *t) +{ + struct trace *t_stored, *t_old, *t_young; + + /* store trace if there is no match yet */ + t_stored = blkiomon_fetch_trace(&t->bit); + if (!t_stored) { + blkiomon_store_trace(t); + return blkiomon_alloc_trace(); + } + + /* figure out older trace and younger trace */ + if (t_stored->bit.time < t->bit.time) { + t_old = t_stored; + t_young = t; + } else { + t_old = t; + t_young = t_stored; + } + + /* we need an older D trace and a younger C trace */ + if (t_old->bit.action & BLK_TC_ACT(BLK_TC_ISSUE) && + t_young->bit.action & BLK_TC_ACT(BLK_TC_COMPLETE)) { + /* matching D and C traces - update statistics */ + match++; + blkiomon_account(&t_old->bit, &t_young->bit); + blkiomon_free_trace(t_stored); + return t; + } + + /* no matching D and C traces - keep more recent trace */ + dump_bits(t_old, t_young, "mismatch"); + mismatch++; + blkiomon_store_trace(t_young); + return t_old; +} + +static int blkiomon_dump_drvdata(struct blk_io_trace *bit, void *pdu_buf) +{ + if (!drvdata.fn) + return 0; + + if (fwrite(bit, sizeof(*bit), 1, drvdata.fp) != 1) + goto failed; + if (fwrite(pdu_buf, bit->pdu_len, 1, drvdata.fp) != 1) + goto failed; + if (drvdata.pipe && fflush(drvdata.fp)) + goto failed; + return 0; + +failed: + fprintf(stderr, "blkiomon: could not write to %s\n", drvdata.fn); + fclose(drvdata.fp); + drvdata.fn = NULL; + return 1; +} + +static int blkiomon_do_fifo(void) +{ + struct trace *t; + struct blk_io_trace *bit; + void *pdu_buf = NULL; + + t = blkiomon_alloc_trace(); + if (!t) + return 1; + bit = &t->bit; + + while (up) { + if (fread(bit, sizeof(*bit), 1, ifp) != 1) { + if (!feof(ifp)) + fprintf(stderr, + "blkiomon: could not read trace"); + break; + } + if (ferror(ifp)) { + clearerr(ifp); + fprintf(stderr, "blkiomon: error while reading trace"); + break; + } + + if (data_is_native == -1 && check_data_endianness(bit->magic)) { + fprintf(stderr, "blkiomon: endianess problem\n"); + break; + } + + /* endianess */ + trace_to_cpu(bit); + if (verify_trace(bit)) { + fprintf(stderr, "blkiomon: bad trace\n"); + break; + } + + /* read additional trace payload */ + if (bit->pdu_len) { + pdu_buf = realloc(pdu_buf, bit->pdu_len); + if (fread(pdu_buf, bit->pdu_len, 1, ifp) != 1) { + clearerr(ifp); + fprintf(stderr, "blkiomon: could not read payload\n"); + break; + } + } + + t->sequence = sequence++; + + /* forward low-level device driver trace to other tool */ + if (bit->action & BLK_TC_ACT(BLK_TC_DRV_DATA)) { + driverdata++; + if (blkiomon_dump_drvdata(bit, pdu_buf)) { + fprintf(stderr, "blkiomon: could not send trace\n"); + break; + } + continue; + } + + if (!(bit->action & BLK_TC_ACT(BLK_TC_ISSUE | BLK_TC_COMPLETE))) + continue; + + /* try to find matching trace and update statistics */ + t = blkiomon_do_trace(t); + if (!t) { + fprintf(stderr, "blkiomon: could not alloc trace\n"); + break; + } + bit = &t->bit; + /* t and bit will be recycled for next incoming trace */ + } + blkiomon_free_trace(t); + free(pdu_buf); + return 0; +} + +static int blkiomon_open_output(struct output *out) +{ + int mode, vbuf_size; + + if (!out->fn) + return 0; + + if (!strcmp(out->fn, "-")) { + out->fp = fdopen(STDOUT_FILENO, "w"); + mode = _IOLBF; + vbuf_size = 4096; + out->pipe = 1; + } else { + out->fp = fopen(out->fn, "w"); + mode = _IOFBF; + vbuf_size = 128 * 1024; + out->pipe = 0; + } + if (!out->fp) + goto failed; + out->buf = malloc(128 * 1024); + if (setvbuf(out->fp, out->buf, mode, vbuf_size)) + goto failed; + return 0; + +failed: + fprintf(stderr, "blkiomon: could not write to %s\n", out->fn); + out->fn = NULL; + free(out->buf); + return 1; +} + +static int blkiomon_open_msg_q(void) +{ + key_t key; + + if (!msg_q_name) + return 0; + if (!msg_q_id || msg_id <= 0) + return 1; + key = ftok(msg_q_name, msg_q_id); + if (key == -1) + return 1; + while (up) { + msg_q = msgget(key, S_IRWXU); + if (msg_q >= 0) + break; + } + return (msg_q >= 0 ? 0 : -1); +} + +static void blkiomon_debug(void) +{ + int i; + struct trace *t; + + if (!debug.fn) + return; + + for (i = 0; i < TRACE_HASH_SIZE; i++) + for (t = thash[i]; t; t = t->next) { + dump_bit(t, "leftover"); + leftover++; + } + + fprintf(debug.fp, "%ld leftover, %ld match, %ld mismatch, " + "%ld driverdata, %ld overall\n", + leftover, match, mismatch, driverdata, sequence); +} + +#define S_OPTS "b:d:D:h:I:Q:q:m:V" + +static char usage_str[] = "\n\nblkiomon " \ + "-I <interval> | --interval=<interval>\n" \ + "[ -h <file> | --human-readable=<file> ]\n" \ + "[ -b <file> | --binary=<file> ]\n" \ + "[ -D <file> | --debug=<file> ]\n" \ + "[ -Q <path name> | --msg-queue=<path name>]\n" \ + "[ -q <msg queue id> | --msg-queue-id=<msg queue id>]\n" \ + "[ -m <msg id> | --msg-id=<msg id>]\n" \ + "[ -V | --version ]\n\n" \ + "\t-I Sample interval.\n" \ + "\t-h Human-readable output file.\n" \ + "\t-b Binary output file.\n" \ + "\t-d Output file for data emitted by low level device driver.\n" \ + "\t-D Output file for debugging data.\n" \ + "\t-Qqm Output to message queue using given ID for messages.\n" \ + "\t-V Print program version.\n\n"; + +static struct option l_opts[] = { + { + .name = "human-readable", + .has_arg = required_argument, + .flag = NULL, + .val = 'h' + }, + { + .name = "binary", + .has_arg = required_argument, + .flag = NULL, + .val = 'b' + }, + { + .name = "dump-lldd", + .has_arg = required_argument, + .flag = NULL, + .val = 'd' + }, + { + .name = "debug", + .has_arg = required_argument, + .flag = NULL, + .val = 'D' + }, + { + .name = "interval", + .has_arg = required_argument, + .flag = NULL, + .val = 'I' + }, + { + .name = "msg-queue", + .has_arg = required_argument, + .flag = NULL, + .val = 'Q' + }, + { + .name = "msg-queue-id", + .has_arg = required_argument, + .flag = NULL, + .val = 'q' + }, + { + .name = "msg-id", + .has_arg = required_argument, + .flag = NULL, + .val = 'm' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'V' + }, + { + .name = NULL, + } +}; + +static void blkiomon_signal(int signal) +{ + fprintf(stderr, "blkiomon: terminated by signal\n"); + up = signal & 0; +} + +int main(int argc, char *argv[]) +{ + int c; + + signal(SIGALRM, blkiomon_signal); + signal(SIGINT, blkiomon_signal); + signal(SIGTERM, blkiomon_signal); + signal(SIGQUIT, blkiomon_signal); + + while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) != -1) { + switch (c) { + case 'h': + human.fn = optarg; + break; + case 'b': + binary.fn = optarg; + break; + case 'd': + drvdata.fn = optarg; + break; + case 'D': + debug.fn = optarg; + break; + case 'I': + interval = atoi(optarg); + break; + case 'Q': + msg_q_name = optarg; + break; + case 'q': + msg_q_id = atoi(optarg); + break; + case 'm': + msg_id = atoi(optarg); + break; + case 'V': + printf("%s version %s\n", argv[0], blkiomon_version); + return 0; + default: + fprintf(stderr, "Usage: %s", usage_str); + return 1; + } + } + + if (interval <= 0) { + fprintf(stderr, "Usage: %s", usage_str); + return 1; + } + + ifp = fdopen(STDIN_FILENO, "r"); + if (!ifp) { + perror("blkiomon: could not open stdin for reading"); + return 1; + } + + if (blkiomon_open_output(&human)) + return 1; + if (blkiomon_open_output(&binary)) + return 1; + if (blkiomon_open_output(&drvdata)) + return 1; + if (blkiomon_open_output(&debug)) + return 1; + if (blkiomon_open_msg_q()) + return 1; + + if (pthread_create(&interval_thread, NULL, blkiomon_interval, NULL)) { + fprintf(stderr, "blkiomon: could not create thread"); + return 1; + } + + blkiomon_do_fifo(); + + blkiomon_debug(); + return 0; +} diff --git a/blkiomon.h b/blkiomon.h new file mode 100644 index 0000000..2ea1716 --- /dev/null +++ b/blkiomon.h @@ -0,0 +1,117 @@ +/* + * I/O monitor based on block queue trace data + * + * Copyright IBM Corp. 2008 + * + * Author(s): Martin Peschke <mp3@de.ibm.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef BLKIOMON_H +#define BLKIOMON_H + +#include <string.h> + +#include "stats.h" +#include "blktrace.h" + +#define BLKIOMON_SIZE_BUCKETS 16 +#define BLKIOMON_D2C_BUCKETS 25 +struct blkiomon_stat { + __u64 time; + __u32 size_hist[BLKIOMON_SIZE_BUCKETS]; + __u32 d2c_hist[BLKIOMON_D2C_BUCKETS]; + __u32 device; + struct minmax size_r; + struct minmax size_w; + struct minmax d2c_r; + struct minmax d2c_w; + struct minmax thrput_r; + struct minmax thrput_w; + __u64 bidir; +}; + +static struct histlog2 size_hist = { + .first = 0, + .delta = 1024, + .num = BLKIOMON_SIZE_BUCKETS +}; + +static struct histlog2 d2c_hist = { + .first = 0, + .delta = 8, + .num = BLKIOMON_D2C_BUCKETS +}; + +static inline void blkiomon_stat_init(struct blkiomon_stat *bstat) +{ + memset(bstat, 0, sizeof(*bstat)); + minmax_init(&bstat->size_r); + minmax_init(&bstat->size_w); + minmax_init(&bstat->d2c_r); + minmax_init(&bstat->d2c_w); + minmax_init(&bstat->thrput_r); + minmax_init(&bstat->thrput_w); +} + +static inline void blkiomon_stat_to_be(struct blkiomon_stat *bstat) +{ + histlog2_to_be(bstat->size_hist, &size_hist); + histlog2_to_be(bstat->d2c_hist, &d2c_hist); + minmax_to_be(&bstat->size_r); + minmax_to_be(&bstat->size_w); + minmax_to_be(&bstat->d2c_r); + minmax_to_be(&bstat->d2c_w); + minmax_to_be(&bstat->thrput_r); + minmax_to_be(&bstat->thrput_w); + bstat->bidir = cpu_to_be64(bstat->bidir); + bstat->time = cpu_to_be64(bstat->time); + bstat->device = cpu_to_be32(bstat->device); +} + +static inline void blkiomon_stat_merge(struct blkiomon_stat *dst, + struct blkiomon_stat *src) +{ + histlog2_merge(&size_hist, dst->size_hist, src->size_hist); + histlog2_merge(&d2c_hist, dst->d2c_hist, src->d2c_hist); + minmax_merge(&dst->size_r, &src->size_r); + minmax_merge(&dst->size_w, &src->size_w); + minmax_merge(&dst->d2c_r, &src->d2c_r); + minmax_merge(&dst->d2c_w, &src->d2c_w); + minmax_merge(&dst->thrput_r, &src->thrput_r); + minmax_merge(&dst->thrput_w, &src->thrput_w); + dst->bidir += src->bidir; +} + +static inline void blkiomon_stat_print(FILE *fp, struct blkiomon_stat *p) +{ + if (!fp) + return; + + fprintf(fp, "\ntime: %s", ctime((void *)&p->time)); + fprintf(fp, "device: %d,%d\n", MAJOR(p->device), MINOR(p->device)); + minmax_print(fp, "sizes read (bytes)", &p->size_r); + minmax_print(fp, "sizes write (bytes)", &p->size_w); + minmax_print(fp, "d2c read (usec)", &p->d2c_r); + minmax_print(fp, "d2c write (usec)", &p->d2c_w); + minmax_print(fp, "throughput read (bytes/msec)", &p->thrput_r); + minmax_print(fp, "throughput write (bytes/msec)", &p->thrput_w); + histlog2_print(fp, "sizes histogram (bytes)", p->size_hist, &size_hist); + histlog2_print(fp, "d2c histogram (usec)", p->d2c_hist, &d2c_hist); + fprintf(fp, "bidirectional requests: %ld\n", (unsigned long)p->bidir); +} + +#endif diff --git a/blkparse.c b/blkparse.c new file mode 100644 index 0000000..eec4952 --- /dev/null +++ b/blkparse.c @@ -0,0 +1,2877 @@ +/* + * block queue tracing parse application + * + * Copyright (C) 2005 Jens Axboe <axboe@suse.de> + * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> +#include <fcntl.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include <errno.h> +#include <signal.h> +#include <locale.h> +#include <libgen.h> + +#include "blktrace.h" +#include "rbtree.h" +#include "jhash.h" + +static char blkparse_version[] = "1.0.1"; + +struct skip_info { + unsigned long start, end; + struct skip_info *prev, *next; +}; + +struct per_dev_info { + dev_t dev; + char *name; + + int backwards; + unsigned long long events; + unsigned long long first_reported_time; + unsigned long long last_reported_time; + unsigned long long last_read_time; + struct io_stats io_stats; + unsigned long skips; + unsigned long long seq_skips; + unsigned int max_depth[2]; + unsigned int cur_depth[2]; + + struct rb_root rb_track; + + int nfiles; + int ncpus; + + unsigned long *cpu_map; + unsigned int cpu_map_max; + + struct per_cpu_info *cpus; +}; + +/* + * some duplicated effort here, we can unify this hash and the ppi hash later + */ +struct process_pid_map { + pid_t pid; + char comm[16]; + struct process_pid_map *hash_next, *list_next; +}; + +#define PPM_HASH_SHIFT (8) +#define PPM_HASH_SIZE (1 << PPM_HASH_SHIFT) +#define PPM_HASH_MASK (PPM_HASH_SIZE - 1) +static struct process_pid_map *ppm_hash_table[PPM_HASH_SIZE]; + +struct per_process_info { + struct process_pid_map *ppm; + struct io_stats io_stats; + struct per_process_info *hash_next, *list_next; + int more_than_one; + + /* + * individual io stats + */ + unsigned long long longest_allocation_wait[2]; + unsigned long long longest_dispatch_wait[2]; + unsigned long long longest_completion_wait[2]; +}; + +#define PPI_HASH_SHIFT (8) +#define PPI_HASH_SIZE (1 << PPI_HASH_SHIFT) +#define PPI_HASH_MASK (PPI_HASH_SIZE - 1) +static struct per_process_info *ppi_hash_table[PPI_HASH_SIZE]; +static struct per_process_info *ppi_list; +static int ppi_list_entries; + +static struct option l_opts[] = { + { + .name = "act-mask", + .has_arg = required_argument, + .flag = NULL, + .val = 'a' + }, + { + .name = "set-mask", + .has_arg = required_argument, + .flag = NULL, + .val = 'A' + }, + { + .name = "batch", + .has_arg = required_argument, + .flag = NULL, + .val = 'b' + }, + { + .name = "input-directory", + .has_arg = required_argument, + .flag = NULL, + .val = 'D' + }, + { + .name = "dump-binary", + .has_arg = required_argument, + .flag = NULL, + .val = 'd' + }, + { + .name = "format", + .has_arg = required_argument, + .flag = NULL, + .val = 'f' + }, + { + .name = "format-spec", + .has_arg = required_argument, + .flag = NULL, + .val = 'F' + }, + { + .name = "hash-by-name", + .has_arg = no_argument, + .flag = NULL, + .val = 'h' + }, + { + .name = "input", + .has_arg = required_argument, + .flag = NULL, + .val = 'i' + }, + { + .name = "no-msgs", + .has_arg = no_argument, + .flag = NULL, + .val = 'M' + }, + { + .name = "output", + .has_arg = required_argument, + .flag = NULL, + .val = 'o' + }, + { + .name = "no-text-output", + .has_arg = no_argument, + .flag = NULL, + .val = 'O' + }, + { + .name = "quiet", + .has_arg = no_argument, + .flag = NULL, + .val = 'q' + }, + { + .name = "per-program-stats", + .has_arg = no_argument, + .flag = NULL, + .val = 's' + }, + { + .name = "track-ios", + .has_arg = no_argument, + .flag = NULL, + .val = 't' + }, + { + .name = "stopwatch", + .has_arg = required_argument, + .flag = NULL, + .val = 'w' + }, + { + .name = "verbose", + .has_arg = no_argument, + .flag = NULL, + .val = 'v' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'V' + }, + { + .name = NULL, + } +}; + +/* + * for sorting the displayed output + */ +struct trace { + struct blk_io_trace *bit; + struct rb_node rb_node; + struct trace *next; + unsigned long read_sequence; +}; + +static struct rb_root rb_sort_root; +static unsigned long rb_sort_entries; + +static struct trace *trace_list; + +/* + * allocation cache + */ +static struct blk_io_trace *bit_alloc_list; +static struct trace *t_alloc_list; + +/* + * for tracking individual ios + */ +struct io_track { + struct rb_node rb_node; + + struct process_pid_map *ppm; + __u64 sector; + unsigned long long allocation_time; + unsigned long long queue_time; + unsigned long long dispatch_time; + unsigned long long completion_time; +}; + +static int ndevices; +static struct per_dev_info *devices; +static char *get_dev_name(struct per_dev_info *, char *, int); +static int trace_rb_insert_last(struct per_dev_info *, struct trace *); + +FILE *ofp = NULL; +static char *output_name; +static char *input_dir; + +static unsigned long long genesis_time; +static unsigned long long last_allowed_time; +static unsigned long long stopwatch_start; /* start from zero by default */ +static unsigned long long stopwatch_end = -1ULL; /* "infinity" */ +static unsigned long read_sequence; + +static int per_process_stats; +static int per_device_and_cpu_stats = 1; +static int track_ios; +static int ppi_hash_by_pid = 1; +static int verbose; +static unsigned int act_mask = -1U; +static int stats_printed; +static int bin_output_msgs = 1; +int data_is_native = -1; + +static FILE *dump_fp; +static char *dump_binary; + +static unsigned int t_alloc_cache; +static unsigned int bit_alloc_cache; + +#define RB_BATCH_DEFAULT (512) +static unsigned int rb_batch = RB_BATCH_DEFAULT; + +static int pipeline; +static char *pipename; + +static int text_output = 1; + +#define is_done() (*(volatile int *)(&done)) +static volatile int done; + +struct timespec abs_start_time; +static unsigned long long start_timestamp; + +static int have_drv_data = 0; + +#define JHASH_RANDOM (0x3af5f2ee) + +#define CPUS_PER_LONG (8 * sizeof(unsigned long)) +#define CPU_IDX(cpu) ((cpu) / CPUS_PER_LONG) +#define CPU_BIT(cpu) ((cpu) & (CPUS_PER_LONG - 1)) + +static void output_binary(void *buf, int len) +{ + if (dump_binary) { + size_t n = fwrite(buf, len, 1, dump_fp); + if (n != 1) { + perror(dump_binary); + fclose(dump_fp); + dump_binary = NULL; + } + } +} + +static void resize_cpu_info(struct per_dev_info *pdi, int cpu) +{ + struct per_cpu_info *cpus = pdi->cpus; + int ncpus = pdi->ncpus; + int new_count = cpu + 1; + int new_space, size; + char *new_start; + + size = new_count * sizeof(struct per_cpu_info); + cpus = realloc(cpus, size); + if (!cpus) { + char name[20]; + fprintf(stderr, "Out of memory, CPU info for device %s (%d)\n", + get_dev_name(pdi, name, sizeof(name)), size); + exit(1); + } + + new_start = (char *)cpus + (ncpus * sizeof(struct per_cpu_info)); + new_space = (new_count - ncpus) * sizeof(struct per_cpu_info); + memset(new_start, 0, new_space); + + pdi->ncpus = new_count; + pdi->cpus = cpus; + + for (new_count = 0; new_count < pdi->ncpus; new_count++) { + struct per_cpu_info *pci = &pdi->cpus[new_count]; + + if (!pci->fd) { + pci->fd = -1; + memset(&pci->rb_last, 0, sizeof(pci->rb_last)); + pci->rb_last_entries = 0; + pci->last_sequence = -1; + } + } +} + +static struct per_cpu_info *get_cpu_info(struct per_dev_info *pdi, int cpu) +{ + struct per_cpu_info *pci; + + if (cpu >= pdi->ncpus) + resize_cpu_info(pdi, cpu); + + pci = &pdi->cpus[cpu]; + pci->cpu = cpu; + return pci; +} + + +static int resize_devices(char *name) +{ + int size = (ndevices + 1) * sizeof(struct per_dev_info); + + devices = realloc(devices, size); + if (!devices) { + fprintf(stderr, "Out of memory, device %s (%d)\n", name, size); + return 1; + } + memset(&devices[ndevices], 0, sizeof(struct per_dev_info)); + devices[ndevices].name = name; + ndevices++; + return 0; +} + +static struct per_dev_info *get_dev_info(dev_t dev) +{ + struct per_dev_info *pdi; + int i; + + for (i = 0; i < ndevices; i++) { + if (!devices[i].dev) + devices[i].dev = dev; + if (devices[i].dev == dev) + return &devices[i]; + } + + if (resize_devices(NULL)) + return NULL; + + pdi = &devices[ndevices - 1]; + pdi->dev = dev; + pdi->first_reported_time = 0; + pdi->last_read_time = 0; + + return pdi; +} + +static void insert_skip(struct per_cpu_info *pci, unsigned long start, + unsigned long end) +{ + struct skip_info *sip; + + for (sip = pci->skips_tail; sip != NULL; sip = sip->prev) { + if (end == (sip->start - 1)) { + sip->start = start; + return; + } else if (start == (sip->end + 1)) { + sip->end = end; + return; + } + } + + sip = malloc(sizeof(struct skip_info)); + sip->start = start; + sip->end = end; + sip->prev = sip->next = NULL; + if (pci->skips_tail == NULL) + pci->skips_head = pci->skips_tail = sip; + else { + sip->prev = pci->skips_tail; + pci->skips_tail->next = sip; + pci->skips_tail = sip; + } +} + +static void remove_sip(struct per_cpu_info *pci, struct skip_info *sip) +{ + if (sip->prev == NULL) { + if (sip->next == NULL) + pci->skips_head = pci->skips_tail = NULL; + else { + pci->skips_head = sip->next; + sip->next->prev = NULL; + } + } else if (sip->next == NULL) { + pci->skips_tail = sip->prev; + sip->prev->next = NULL; + } else { + sip->prev->next = sip->next; + sip->next->prev = sip->prev; + } + + sip->prev = sip->next = NULL; + free(sip); +} + +#define IN_SKIP(sip,seq) (((sip)->start <= (seq)) && ((seq) <= sip->end)) +static int check_current_skips(struct per_cpu_info *pci, unsigned long seq) +{ + struct skip_info *sip; + + for (sip = pci->skips_tail; sip != NULL; sip = sip->prev) { + if (IN_SKIP(sip, seq)) { + if (sip->start == seq) { + if (sip->end == seq) + remove_sip(pci, sip); + else + sip->start += 1; + } else if (sip->end == seq) + sip->end -= 1; + else { + sip->end = seq - 1; + insert_skip(pci, seq + 1, sip->end); + } + return 1; + } + } + + return 0; +} + +static void collect_pdi_skips(struct per_dev_info *pdi) +{ + struct skip_info *sip; + int cpu; + + pdi->skips = 0; + pdi->seq_skips = 0; + + for (cpu = 0; cpu < pdi->ncpus; cpu++) { + struct per_cpu_info *pci = &pdi->cpus[cpu]; + + for (sip = pci->skips_head; sip != NULL; sip = sip->next) { + pdi->skips++; + pdi->seq_skips += (sip->end - sip->start + 1); + if (verbose) + fprintf(stderr,"(%d,%d): skipping %lu -> %lu\n", + MAJOR(pdi->dev), MINOR(pdi->dev), + sip->start, sip->end); + } + } +} + +static void cpu_mark_online(struct per_dev_info *pdi, unsigned int cpu) +{ + if (cpu >= pdi->cpu_map_max || !pdi->cpu_map) { + int new_max = (cpu + CPUS_PER_LONG) & ~(CPUS_PER_LONG - 1); + unsigned long *map = malloc(new_max / sizeof(long)); + + memset(map, 0, new_max / sizeof(long)); + + if (pdi->cpu_map) { + memcpy(map, pdi->cpu_map, pdi->cpu_map_max / sizeof(long)); + free(pdi->cpu_map); + } + + pdi->cpu_map = map; + pdi->cpu_map_max = new_max; + } + + pdi->cpu_map[CPU_IDX(cpu)] |= (1UL << CPU_BIT(cpu)); +} + +static inline void cpu_mark_offline(struct per_dev_info *pdi, int cpu) +{ + pdi->cpu_map[CPU_IDX(cpu)] &= ~(1UL << CPU_BIT(cpu)); +} + +static inline int cpu_is_online(struct per_dev_info *pdi, int cpu) +{ + return (pdi->cpu_map[CPU_IDX(cpu)] & (1UL << CPU_BIT(cpu))) != 0; +} + +static inline int ppm_hash_pid(pid_t pid) +{ + return jhash_1word(pid, JHASH_RANDOM) & PPM_HASH_MASK; +} + +static struct process_pid_map *find_ppm(pid_t pid) +{ + const int hash_idx = ppm_hash_pid(pid); + struct process_pid_map *ppm; + + ppm = ppm_hash_table[hash_idx]; + while (ppm) { + if (ppm->pid == pid) + return ppm; + + ppm = ppm->hash_next; + } + + return NULL; +} + +static struct process_pid_map *add_ppm_hash(pid_t pid, const char *name) +{ + const int hash_idx = ppm_hash_pid(pid); + struct process_pid_map *ppm; + + ppm = find_ppm(pid); + if (!ppm) { + ppm = malloc(sizeof(*ppm)); + memset(ppm, 0, sizeof(*ppm)); + ppm->pid = pid; + strcpy(ppm->comm, name); + ppm->hash_next = ppm_hash_table[hash_idx]; + ppm_hash_table[hash_idx] = ppm; + } + + return ppm; +} + +static void handle_notify(struct blk_io_trace *bit) +{ + void *payload = (caddr_t) bit + sizeof(*bit); + __u32 two32[2]; + + switch (bit->action) { + case BLK_TN_PROCESS: + add_ppm_hash(bit->pid, payload); + break; + + case BLK_TN_TIMESTAMP: + if (bit->pdu_len != sizeof(two32)) + return; + memcpy(two32, payload, sizeof(two32)); + if (!data_is_native) { + two32[0] = be32_to_cpu(two32[0]); + two32[1] = be32_to_cpu(two32[1]); + } + start_timestamp = bit->time; + abs_start_time.tv_sec = two32[0]; + abs_start_time.tv_nsec = two32[1]; + if (abs_start_time.tv_nsec < 0) { + abs_start_time.tv_sec--; + abs_start_time.tv_nsec += 1000000000; + } + + break; + + case BLK_TN_MESSAGE: + if (bit->pdu_len > 0) { + char msg[bit->pdu_len+1]; + + memcpy(msg, (char *)payload, bit->pdu_len); + msg[bit->pdu_len] = '\0'; + + fprintf(ofp, + "%3d,%-3d %2d %8s %5d.%09lu %5u %2s %3s %s\n", + MAJOR(bit->device), MINOR(bit->device), + bit->cpu, "0", (int) SECONDS(bit->time), + (unsigned long) NANO_SECONDS(bit->time), + 0, "m", "N", msg); + } + break; + + default: + /* Ignore unknown notify events */ + ; + } +} + +char *find_process_name(pid_t pid) +{ + struct process_pid_map *ppm = find_ppm(pid); + + if (ppm) + return ppm->comm; + + return NULL; +} + +static inline int ppi_hash_pid(pid_t pid) +{ + return jhash_1word(pid, JHASH_RANDOM) & PPI_HASH_MASK; +} + +static inline int ppi_hash_name(const char *name) +{ + return jhash(name, 16, JHASH_RANDOM) & PPI_HASH_MASK; +} + +static inline int ppi_hash(struct per_process_info *ppi) +{ + struct process_pid_map *ppm = ppi->ppm; + + if (ppi_hash_by_pid) + return ppi_hash_pid(ppm->pid); + + return ppi_hash_name(ppm->comm); +} + +static inline void add_ppi_to_hash(struct per_process_info *ppi) +{ + const int hash_idx = ppi_hash(ppi); + + ppi->hash_next = ppi_hash_table[hash_idx]; + ppi_hash_table[hash_idx] = ppi; +} + +static inline void add_ppi_to_list(struct per_process_info *ppi) +{ + ppi->list_next = ppi_list; + ppi_list = ppi; + ppi_list_entries++; +} + +static struct per_process_info *find_ppi_by_name(char *name) +{ + const int hash_idx = ppi_hash_name(name); + struct per_process_info *ppi; + + ppi = ppi_hash_table[hash_idx]; + while (ppi) { + struct process_pid_map *ppm = ppi->ppm; + + if (!strcmp(ppm->comm, name)) + return ppi; + + ppi = ppi->hash_next; + } + + return NULL; +} + +static struct per_process_info *find_ppi_by_pid(pid_t pid) +{ + const int hash_idx = ppi_hash_pid(pid); + struct per_process_info *ppi; + + ppi = ppi_hash_table[hash_idx]; + while (ppi) { + struct process_pid_map *ppm = ppi->ppm; + + if (ppm->pid == pid) + return ppi; + + ppi = ppi->hash_next; + } + + return NULL; +} + +static struct per_process_info *find_ppi(pid_t pid) +{ + struct per_process_info *ppi; + char *name; + + if (ppi_hash_by_pid) + return find_ppi_by_pid(pid); + + name = find_process_name(pid); + if (!name) + return NULL; + + ppi = find_ppi_by_name(name); + if (ppi && ppi->ppm->pid != pid) + ppi->more_than_one = 1; + + return ppi; +} + +/* + * struct trace and blktrace allocation cache, we do potentially + * millions of mallocs for these structures while only using at most + * a few thousand at the time + */ +static inline void t_free(struct trace *t) +{ + if (t_alloc_cache < 1024) { + t->next = t_alloc_list; + t_alloc_list = t; + t_alloc_cache++; + } else + free(t); +} + +static inline struct trace *t_alloc(void) +{ + struct trace *t = t_alloc_list; + + if (t) { + t_alloc_list = t->next; + t_alloc_cache--; + return t; + } + + return malloc(sizeof(*t)); +} + +static inline void bit_free(struct blk_io_trace *bit) +{ + if (bit_alloc_cache < 1024 && !bit->pdu_len) { + /* + * abuse a 64-bit field for a next pointer for the free item + */ + bit->time = (__u64) (unsigned long) bit_alloc_list; + bit_alloc_list = (struct blk_io_trace *) bit; + bit_alloc_cache++; + } else + free(bit); +} + +static inline struct blk_io_trace *bit_alloc(void) +{ + struct blk_io_trace *bit = bit_alloc_list; + + if (bit) { + bit_alloc_list = (struct blk_io_trace *) (unsigned long) \ + bit->time; + bit_alloc_cache--; + return bit; + } + + return malloc(sizeof(*bit)); +} + +static inline void __put_trace_last(struct per_dev_info *pdi, struct trace *t) +{ + struct per_cpu_info *pci = get_cpu_info(pdi, t->bit->cpu); + + rb_erase(&t->rb_node, &pci->rb_last); + pci->rb_last_entries--; + + bit_free(t->bit); + t_free(t); +} + +static void put_trace(struct per_dev_info *pdi, struct trace *t) +{ + rb_erase(&t->rb_node, &rb_sort_root); + rb_sort_entries--; + + trace_rb_insert_last(pdi, t); +} + +static inline int trace_rb_insert(struct trace *t, struct rb_root *root) +{ + struct rb_node **p = &root->rb_node; + struct rb_node *parent = NULL; + struct trace *__t; + + while (*p) { + parent = *p; + + __t = rb_entry(parent, struct trace, rb_node); + + if (t->bit->time < __t->bit->time) + p = &(*p)->rb_left; + else if (t->bit->time > __t->bit->time) + p = &(*p)->rb_right; + else if (t->bit->device < __t->bit->device) + p = &(*p)->rb_left; + else if (t->bit->device > __t->bit->device) + p = &(*p)->rb_right; + else if (t->bit->sequence < __t->bit->sequence) + p = &(*p)->rb_left; + else /* >= sequence */ + p = &(*p)->rb_right; + } + + rb_link_node(&t->rb_node, parent, p); + rb_insert_color(&t->rb_node, root); + return 0; +} + +static inline int trace_rb_insert_sort(struct trace *t) +{ + if (!trace_rb_insert(t, &rb_sort_root)) { + rb_sort_entries++; + return 0; + } + + return 1; +} + +static int trace_rb_insert_last(struct per_dev_info *pdi, struct trace *t) +{ + struct per_cpu_info *pci = get_cpu_info(pdi, t->bit->cpu); + + if (trace_rb_insert(t, &pci->rb_last)) + return 1; + + pci->rb_last_entries++; + + if (pci->rb_last_entries > rb_batch * pdi->nfiles) { + struct rb_node *n = rb_first(&pci->rb_last); + + t = rb_entry(n, struct trace, rb_node); + __put_trace_last(pdi, t); + } + + return 0; +} + +static struct trace *trace_rb_find(dev_t device, unsigned long sequence, + struct rb_root *root, int order) +{ + struct rb_node *n = root->rb_node; + struct rb_node *prev = NULL; + struct trace *__t; + + while (n) { + __t = rb_entry(n, struct trace, rb_node); + prev = n; + + if (device < __t->bit->device) + n = n->rb_left; + else if (device > __t->bit->device) + n = n->rb_right; + else if (sequence < __t->bit->sequence) + n = n->rb_left; + else if (sequence > __t->bit->sequence) + n = n->rb_right; + else + return __t; + } + + /* + * hack - the list may not be sequence ordered because some + * events don't have sequence and time matched. so we end up + * being a little off in the rb lookup here, because we don't + * know the time we are looking for. compensate by browsing + * a little ahead from the last entry to find the match + */ + if (order && prev) { + int max = 5; + + while (((n = rb_next(prev)) != NULL) && max--) { + __t = rb_entry(n, struct trace, rb_node); + + if (__t->bit->device == device && + __t->bit->sequence == sequence) + return __t; + + prev = n; + } + } + + return NULL; +} + +static inline struct trace *trace_rb_find_last(struct per_dev_info *pdi, + struct per_cpu_info *pci, + unsigned long seq) +{ + return trace_rb_find(pdi->dev, seq, &pci->rb_last, 0); +} + +static inline int track_rb_insert(struct per_dev_info *pdi,struct io_track *iot) +{ + struct rb_node **p = &pdi->rb_track.rb_node; + struct rb_node *parent = NULL; + struct io_track *__iot; + + while (*p) { + parent = *p; + __iot = rb_entry(parent, struct io_track, rb_node); + + if (iot->sector < __iot->sector) + p = &(*p)->rb_left; + else if (iot->sector > __iot->sector) + p = &(*p)->rb_right; + else { + fprintf(stderr, + "sector alias (%Lu) on device %d,%d!\n", + (unsigned long long) iot->sector, + MAJOR(pdi->dev), MINOR(pdi->dev)); + return 1; + } + } + + rb_link_node(&iot->rb_node, parent, p); + rb_insert_color(&iot->rb_node, &pdi->rb_track); + return 0; +} + +static struct io_track *__find_track(struct per_dev_info *pdi, __u64 sector) +{ + struct rb_node *n = pdi->rb_track.rb_node; + struct io_track *__iot; + + while (n) { + __iot = rb_entry(n, struct io_track, rb_node); + + if (sector < __iot->sector) + n = n->rb_left; + else if (sector > __iot->sector) + n = n->rb_right; + else + return __iot; + } + + return NULL; +} + +static struct io_track *find_track(struct per_dev_info *pdi, pid_t pid, + __u64 sector) +{ + struct io_track *iot; + + iot = __find_track(pdi, sector); + if (!iot) { + iot = malloc(sizeof(*iot)); + iot->ppm = find_ppm(pid); + if (!iot->ppm) + iot->ppm = add_ppm_hash(pid, "unknown"); + iot->sector = sector; + track_rb_insert(pdi, iot); + } + + return iot; +} + +static void log_track_frontmerge(struct per_dev_info *pdi, + struct blk_io_trace *t) +{ + struct io_track *iot; + + if (!track_ios) + return; + + iot = __find_track(pdi, t->sector + t_sec(t)); + if (!iot) { + if (verbose) + fprintf(stderr, "merge not found for (%d,%d): %llu\n", + MAJOR(pdi->dev), MINOR(pdi->dev), + (unsigned long long) t->sector + t_sec(t)); + return; + } + + rb_erase(&iot->rb_node, &pdi->rb_track); + iot->sector -= t_sec(t); + track_rb_insert(pdi, iot); +} + +static void log_track_getrq(struct per_dev_info *pdi, struct blk_io_trace *t) +{ + struct io_track *iot; + + if (!track_ios) + return; + + iot = find_track(pdi, t->pid, t->sector); + iot->allocation_time = t->time; +} + +static inline int is_remapper(struct per_dev_info *pdi) +{ + int major = MAJOR(pdi->dev); + + return (major == 253 || major == 9); +} + +/* + * for md/dm setups, the interesting cycle is Q -> C. So track queueing + * time here, as dispatch time + */ +static void log_track_queue(struct per_dev_info *pdi, struct blk_io_trace *t) +{ + struct io_track *iot; + + if (!track_ios) + return; + if (!is_remapper(pdi)) + return; + + iot = find_track(pdi, t->pid, t->sector); + iot->dispatch_time = t->time; +} + +/* + * return time between rq allocation and insertion + */ +static unsigned long long log_track_insert(struct per_dev_info *pdi, + struct blk_io_trace *t) +{ + unsigned long long elapsed; + struct io_track *iot; + + if (!track_ios) + return -1; + + iot = find_track(pdi, t->pid, t->sector); + iot->queue_time = t->time; + + if (!iot->allocation_time) + return -1; + + elapsed = iot->queue_time - iot->allocation_time; + + if (per_process_stats) { + struct per_process_info *ppi = find_ppi(iot->ppm->pid); + int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0; + + if (ppi && elapsed > ppi->longest_allocation_wait[w]) + ppi->longest_allocation_wait[w] = elapsed; + } + + return elapsed; +} + +/* + * return time between queue and issue + */ +static unsigned long long log_track_issue(struct per_dev_info *pdi, + struct blk_io_trace *t) +{ + unsigned long long elapsed; + struct io_track *iot; + + if (!track_ios) + return -1; + if ((t->action & BLK_TC_ACT(BLK_TC_FS)) == 0) + return -1; + + iot = __find_track(pdi, t->sector); + if (!iot) { + if (verbose) + fprintf(stderr, "issue not found for (%d,%d): %llu\n", + MAJOR(pdi->dev), MINOR(pdi->dev), + (unsigned long long) t->sector); + return -1; + } + + iot->dispatch_time = t->time; + elapsed = iot->dispatch_time - iot->queue_time; + + if (per_process_stats) { + struct per_process_info *ppi = find_ppi(iot->ppm->pid); + int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0; + + if (ppi && elapsed > ppi->longest_dispatch_wait[w]) + ppi->longest_dispatch_wait[w] = elapsed; + } + + return elapsed; +} + +/* + * return time between dispatch and complete + */ +static unsigned long long log_track_complete(struct per_dev_info *pdi, + struct blk_io_trace *t) +{ + unsigned long long elapsed; + struct io_track *iot; + + if (!track_ios) + return -1; + + iot = __find_track(pdi, t->sector); + if (!iot) { + if (verbose) + fprintf(stderr,"complete not found for (%d,%d): %llu\n", + MAJOR(pdi->dev), MINOR(pdi->dev), + (unsigned long long) t->sector); + return -1; + } + + iot->completion_time = t->time; + elapsed = iot->completion_time - iot->dispatch_time; + + if (per_process_stats) { + struct per_process_info *ppi = find_ppi(iot->ppm->pid); + int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0; + + if (ppi && elapsed > ppi->longest_completion_wait[w]) + ppi->longest_completion_wait[w] = elapsed; + } + + /* + * kill the trace, we don't need it after completion + */ + rb_erase(&iot->rb_node, &pdi->rb_track); + free(iot); + + return elapsed; +} + + +static struct io_stats *find_process_io_stats(pid_t pid) +{ + struct per_process_info *ppi = find_ppi(pid); + + if (!ppi) { + ppi = malloc(sizeof(*ppi)); + memset(ppi, 0, sizeof(*ppi)); + ppi->ppm = find_ppm(pid); + if (!ppi->ppm) + ppi->ppm = add_ppm_hash(pid, "unknown"); + add_ppi_to_hash(ppi); + add_ppi_to_list(ppi); + } + + return &ppi->io_stats; +} + +static char *get_dev_name(struct per_dev_info *pdi, char *buffer, int size) +{ + if (pdi->name) + snprintf(buffer, size, "%s", pdi->name); + else + snprintf(buffer, size, "%d,%d",MAJOR(pdi->dev),MINOR(pdi->dev)); + return buffer; +} + +static void check_time(struct per_dev_info *pdi, struct blk_io_trace *bit) +{ + unsigned long long this = bit->time; + unsigned long long last = pdi->last_reported_time; + + pdi->backwards = (this < last) ? 'B' : ' '; + pdi->last_reported_time = this; +} + +static inline void __account_m(struct io_stats *ios, struct blk_io_trace *t, + int rw) +{ + if (rw) { + ios->mwrites++; + ios->mwrite_kb += t_kb(t); + } else { + ios->mreads++; + ios->mread_kb += t_kb(t); + } +} + +static inline void account_m(struct blk_io_trace *t, struct per_cpu_info *pci, + int rw) +{ + __account_m(&pci->io_stats, t, rw); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_m(ios, t, rw); + } +} + +static inline void __account_pc_queue(struct io_stats *ios, + struct blk_io_trace *t, int rw) +{ + if (rw) { + ios->qwrites_pc++; + ios->qwrite_kb_pc += t_kb(t); + } else { + ios->qreads_pc++; + ios->qread_kb += t_kb(t); + } +} + +static inline void account_pc_queue(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_pc_queue(&pci->io_stats, t, rw); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_pc_queue(ios, t, rw); + } +} + +static inline void __account_pc_issue(struct io_stats *ios, int rw, + unsigned int bytes) +{ + if (rw) { + ios->iwrites_pc++; + ios->iwrite_kb_pc += bytes >> 10; + } else { + ios->ireads_pc++; + ios->iread_kb_pc += bytes >> 10; + } +} + +static inline void account_pc_issue(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_pc_issue(&pci->io_stats, rw, t->bytes); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_pc_issue(ios, rw, t->bytes); + } +} + +static inline void __account_pc_requeue(struct io_stats *ios, + struct blk_io_trace *t, int rw) +{ + if (rw) { + ios->wrqueue_pc++; + ios->iwrite_kb_pc -= t_kb(t); + } else { + ios->rrqueue_pc++; + ios->iread_kb_pc -= t_kb(t); + } +} + +static inline void account_pc_requeue(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_pc_requeue(&pci->io_stats, t, rw); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_pc_requeue(ios, t, rw); + } +} + +static inline void __account_pc_c(struct io_stats *ios, int rw) +{ + if (rw) + ios->cwrites_pc++; + else + ios->creads_pc++; +} + +static inline void account_pc_c(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_pc_c(&pci->io_stats, rw); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_pc_c(ios, rw); + } +} + +static inline void __account_queue(struct io_stats *ios, struct blk_io_trace *t, + int rw) +{ + if (rw) { + ios->qwrites++; + ios->qwrite_kb += t_kb(t); + } else { + ios->qreads++; + ios->qread_kb += t_kb(t); + } +} + +static inline void account_queue(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_queue(&pci->io_stats, t, rw); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_queue(ios, t, rw); + } +} + +static inline void __account_c(struct io_stats *ios, int rw, int bytes) +{ + if (rw) { + ios->cwrites++; + ios->cwrite_kb += bytes >> 10; + } else { + ios->creads++; + ios->cread_kb += bytes >> 10; + } +} + +static inline void account_c(struct blk_io_trace *t, struct per_cpu_info *pci, + int rw, int bytes) +{ + __account_c(&pci->io_stats, rw, bytes); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_c(ios, rw, bytes); + } +} + +static inline void __account_issue(struct io_stats *ios, int rw, + unsigned int bytes) +{ + if (rw) { + ios->iwrites++; + ios->iwrite_kb += bytes >> 10; + } else { + ios->ireads++; + ios->iread_kb += bytes >> 10; + } +} + +static inline void account_issue(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_issue(&pci->io_stats, rw, t->bytes); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_issue(ios, rw, t->bytes); + } +} + +static inline void __account_unplug(struct io_stats *ios, int timer) +{ + if (timer) + ios->timer_unplugs++; + else + ios->io_unplugs++; +} + +static inline void account_unplug(struct blk_io_trace *t, + struct per_cpu_info *pci, int timer) +{ + __account_unplug(&pci->io_stats, timer); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_unplug(ios, timer); + } +} + +static inline void __account_requeue(struct io_stats *ios, + struct blk_io_trace *t, int rw) +{ + if (rw) { + ios->wrqueue++; + ios->iwrite_kb -= t_kb(t); + } else { + ios->rrqueue++; + ios->iread_kb -= t_kb(t); + } +} + +static inline void account_requeue(struct blk_io_trace *t, + struct per_cpu_info *pci, int rw) +{ + __account_requeue(&pci->io_stats, t, rw); + + if (per_process_stats) { + struct io_stats *ios = find_process_io_stats(t->pid); + + __account_requeue(ios, t, rw); + } +} + +static void log_complete(struct per_dev_info *pdi, struct per_cpu_info *pci, + struct blk_io_trace *t, char *act) +{ + process_fmt(act, pci, t, log_track_complete(pdi, t), 0, NULL); +} + +static void log_insert(struct per_dev_info *pdi, struct per_cpu_info *pci, + struct blk_io_trace *t, char *act) +{ + process_fmt(act, pci, t, log_track_insert(pdi, t), 0, NULL); +} + +static void log_queue(struct per_cpu_info *pci, struct blk_io_trace *t, + char *act) +{ + process_fmt(act, pci, t, -1, 0, NULL); +} + +static void log_issue(struct per_dev_info *pdi, struct per_cpu_info *pci, + struct blk_io_trace *t, char *act) +{ + process_fmt(act, pci, t, log_track_issue(pdi, t), 0, NULL); +} + +static void log_merge(struct per_dev_info *pdi, struct per_cpu_info *pci, + struct blk_io_trace *t, char *act) +{ + if (act[0] == 'F') + log_track_frontmerge(pdi, t); + + process_fmt(act, pci, t, -1ULL, 0, NULL); +} + +static void log_action(struct per_cpu_info *pci, struct blk_io_trace *t, + char *act) +{ + process_fmt(act, pci, t, -1ULL, 0, NULL); +} + +static void log_generic(struct per_cpu_info *pci, struct blk_io_trace *t, + char *act) +{ + process_fmt(act, pci, t, -1ULL, 0, NULL); +} + +static void log_unplug(struct per_cpu_info *pci, struct blk_io_trace *t, + char *act) +{ + process_fmt(act, pci, t, -1ULL, 0, NULL); +} + +static void log_split(struct per_cpu_info *pci, struct blk_io_trace *t, + char *act) +{ + process_fmt(act, pci, t, -1ULL, 0, NULL); +} + +static void log_pc(struct per_cpu_info *pci, struct blk_io_trace *t, char *act) +{ + unsigned char *buf = (unsigned char *) t + sizeof(*t); + + process_fmt(act, pci, t, -1ULL, t->pdu_len, buf); +} + +static void dump_trace_pc(struct blk_io_trace *t, struct per_dev_info *pdi, + struct per_cpu_info *pci) +{ + int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0; + int act = t->action & 0xffff; + + switch (act) { + case __BLK_TA_QUEUE: + log_generic(pci, t, "Q"); + account_pc_queue(t, pci, w); + break; + case __BLK_TA_GETRQ: + log_generic(pci, t, "G"); + break; + case __BLK_TA_SLEEPRQ: + log_generic(pci, t, "S"); + break; + case __BLK_TA_REQUEUE: + /* + * can happen if we miss traces, don't let it go + * below zero + */ + if (pdi->cur_depth[w]) + pdi->cur_depth[w]--; + account_pc_requeue(t, pci, w); + log_generic(pci, t, "R"); + break; + case __BLK_TA_ISSUE: + account_pc_issue(t, pci, w); + pdi->cur_depth[w]++; + if (pdi->cur_depth[w] > pdi->max_depth[w]) + pdi->max_depth[w] = pdi->cur_depth[w]; + log_pc(pci, t, "D"); + break; + case __BLK_TA_COMPLETE: + if (pdi->cur_depth[w]) + pdi->cur_depth[w]--; + log_pc(pci, t, "C"); + account_pc_c(t, pci, w); + break; + case __BLK_TA_INSERT: + log_pc(pci, t, "I"); + break; + default: + fprintf(stderr, "Bad pc action %x\n", act); + break; + } +} + +static void dump_trace_fs(struct blk_io_trace *t, struct per_dev_info *pdi, + struct per_cpu_info *pci) +{ + int w = (t->action & BLK_TC_ACT(BLK_TC_WRITE)) != 0; + int act = t->action & 0xffff; + + switch (act) { + case __BLK_TA_QUEUE: + log_track_queue(pdi, t); + account_queue(t, pci, w); + log_queue(pci, t, "Q"); + break; + case __BLK_TA_INSERT: + log_insert(pdi, pci, t, "I"); + break; + case __BLK_TA_BACKMERGE: + account_m(t, pci, w); + log_merge(pdi, pci, t, "M"); + break; + case __BLK_TA_FRONTMERGE: + account_m(t, pci, w); + log_merge(pdi, pci, t, "F"); + break; + case __BLK_TA_GETRQ: + log_track_getrq(pdi, t); + log_generic(pci, t, "G"); + break; + case __BLK_TA_SLEEPRQ: + log_generic(pci, t, "S"); + break; + case __BLK_TA_REQUEUE: + /* + * can happen if we miss traces, don't let it go + * below zero + */ + if (pdi->cur_depth[w]) + pdi->cur_depth[w]--; + account_requeue(t, pci, w); + log_queue(pci, t, "R"); + break; + case __BLK_TA_ISSUE: + account_issue(t, pci, w); + pdi->cur_depth[w]++; + if (pdi->cur_depth[w] > pdi->max_depth[w]) + pdi->max_depth[w] = pdi->cur_depth[w]; + log_issue(pdi, pci, t, "D"); + break; + case __BLK_TA_COMPLETE: + if (pdi->cur_depth[w]) + pdi->cur_depth[w]--; + account_c(t, pci, w, t->bytes); + log_complete(pdi, pci, t, "C"); + break; + case __BLK_TA_PLUG: + log_action(pci, t, "P"); + break; + case __BLK_TA_UNPLUG_IO: + account_unplug(t, pci, 0); + log_unplug(pci, t, "U"); + break; + case __BLK_TA_UNPLUG_TIMER: + account_unplug(t, pci, 1); + log_unplug(pci, t, "UT"); + break; + case __BLK_TA_SPLIT: + log_split(pci, t, "X"); + break; + case __BLK_TA_BOUNCE: + log_generic(pci, t, "B"); + break; + case __BLK_TA_REMAP: + log_generic(pci, t, "A"); + break; + case __BLK_TA_DRV_DATA: + have_drv_data = 1; + /* dump to binary file only */ + break; + default: + fprintf(stderr, "Bad fs action %x\n", t->action); + break; + } +} + +static void dump_trace(struct blk_io_trace *t, struct per_cpu_info *pci, + struct per_dev_info *pdi) +{ + if (text_output) { + if (t->action == BLK_TN_MESSAGE) + handle_notify(t); + else if (t->action & BLK_TC_ACT(BLK_TC_PC)) + dump_trace_pc(t, pdi, pci); + else + dump_trace_fs(t, pdi, pci); + } + + if (!pdi->events) + pdi->first_reported_time = t->time; + + pdi->events++; + + if (bin_output_msgs || + !(t->action & BLK_TC_ACT(BLK_TC_NOTIFY) && + t->action == BLK_TN_MESSAGE)) + output_binary(t, sizeof(*t) + t->pdu_len); +} + +/* + * print in a proper way, not too small and not too big. if more than + * 1000,000K, turn into M and so on + */ +static char *size_cnv(char *dst, unsigned long long num, int in_kb) +{ + char suff[] = { '\0', 'K', 'M', 'G', 'P' }; + unsigned int i = 0; + + if (in_kb) + i++; + + while (num > 1000 * 1000ULL && (i < sizeof(suff) - 1)) { + i++; + num /= 1000; + } + + sprintf(dst, "%'8Lu%c", num, suff[i]); + return dst; +} + +static void dump_io_stats(struct per_dev_info *pdi, struct io_stats *ios, + char *msg) +{ + static char x[256], y[256]; + + fprintf(ofp, "%s\n", msg); + + fprintf(ofp, " Reads Queued: %s, %siB\t", size_cnv(x, ios->qreads, 0), size_cnv(y, ios->qread_kb, 1)); + fprintf(ofp, " Writes Queued: %s, %siB\n", size_cnv(x, ios->qwrites, 0), size_cnv(y, ios->qwrite_kb, 1)); + fprintf(ofp, " Read Dispatches: %s, %siB\t", size_cnv(x, ios->ireads, 0), size_cnv(y, ios->iread_kb, 1)); + fprintf(ofp, " Write Dispatches: %s, %siB\n", size_cnv(x, ios->iwrites, 0), size_cnv(y, ios->iwrite_kb, 1)); + fprintf(ofp, " Reads Requeued: %s\t\t", size_cnv(x, ios->rrqueue, 0)); + fprintf(ofp, " Writes Requeued: %s\n", size_cnv(x, ios->wrqueue, 0)); + fprintf(ofp, " Reads Completed: %s, %siB\t", size_cnv(x, ios->creads, 0), size_cnv(y, ios->cread_kb, 1)); + fprintf(ofp, " Writes Completed: %s, %siB\n", size_cnv(x, ios->cwrites, 0), size_cnv(y, ios->cwrite_kb, 1)); + fprintf(ofp, " Read Merges: %s, %siB\t", size_cnv(x, ios->mreads, 0), size_cnv(y, ios->mread_kb, 1)); + fprintf(ofp, " Write Merges: %s, %siB\n", size_cnv(x, ios->mwrites, 0), size_cnv(y, ios->mwrite_kb, 1)); + if (pdi) { + fprintf(ofp, " Read depth: %'8u%8c\t", pdi->max_depth[0], ' '); + fprintf(ofp, " Write depth: %'8u\n", pdi->max_depth[1]); + } + if (ios->qreads_pc || ios->qwrites_pc || ios->ireads_pc || ios->iwrites_pc || + ios->rrqueue_pc || ios->wrqueue_pc || ios->creads_pc || ios->cwrites_pc) { + fprintf(ofp, " PC Reads Queued: %s, %siB\t", size_cnv(x, ios->qreads_pc, 0), size_cnv(y, ios->qread_kb_pc, 1)); + fprintf(ofp, " PC Writes Queued: %s, %siB\n", size_cnv(x, ios->qwrites_pc, 0), size_cnv(y, ios->qwrite_kb_pc, 1)); + fprintf(ofp, " PC Read Disp.: %s, %siB\t", size_cnv(x, ios->ireads_pc, 0), size_cnv(y, ios->iread_kb_pc, 1)); + fprintf(ofp, " PC Write Disp.: %s, %siB\n", size_cnv(x, ios->iwrites_pc, 0), size_cnv(y, ios->iwrite_kb_pc, 1)); + fprintf(ofp, " PC Reads Req.: %s\t\t", size_cnv(x, ios->rrqueue_pc, 0)); + fprintf(ofp, " PC Writes Req.: %s\n", size_cnv(x, ios->wrqueue_pc, 0)); + fprintf(ofp, " PC Reads Compl.: %s\t\t", size_cnv(x, ios->creads_pc, 0)); + fprintf(ofp, " PC Writes Compl.: %s\n", size_cnv(x, ios->cwrites, 0)); + } + fprintf(ofp, " IO unplugs: %'8lu%8c\t", ios->io_unplugs, ' '); + fprintf(ofp, " Timer unplugs: %'8lu\n", ios->timer_unplugs); +} + +static void dump_wait_stats(struct per_process_info *ppi) +{ + unsigned long rawait = ppi->longest_allocation_wait[0] / 1000; + unsigned long rdwait = ppi->longest_dispatch_wait[0] / 1000; + unsigned long rcwait = ppi->longest_completion_wait[0] / 1000; + unsigned long wawait = ppi->longest_allocation_wait[1] / 1000; + unsigned long wdwait = ppi->longest_dispatch_wait[1] / 1000; + unsigned long wcwait = ppi->longest_completion_wait[1] / 1000; + + fprintf(ofp, " Allocation wait: %'8lu%8c\t", rawait, ' '); + fprintf(ofp, " Allocation wait: %'8lu\n", wawait); + fprintf(ofp, " Dispatch wait: %'8lu%8c\t", rdwait, ' '); + fprintf(ofp, " Dispatch wait: %'8lu\n", wdwait); + fprintf(ofp, " Completion wait: %'8lu%8c\t", rcwait, ' '); + fprintf(ofp, " Completion wait: %'8lu\n", wcwait); +} + +static int ppi_name_compare(const void *p1, const void *p2) +{ + struct per_process_info *ppi1 = *((struct per_process_info **) p1); + struct per_process_info *ppi2 = *((struct per_process_info **) p2); + int res; + + res = strverscmp(ppi1->ppm->comm, ppi2->ppm->comm); + if (!res) + res = ppi1->ppm->pid > ppi2->ppm->pid; + + return res; +} + +static void sort_process_list(void) +{ + struct per_process_info **ppis; + struct per_process_info *ppi; + int i = 0; + + ppis = malloc(ppi_list_entries * sizeof(struct per_process_info *)); + + ppi = ppi_list; + while (ppi) { + ppis[i++] = ppi; + ppi = ppi->list_next; + } + + qsort(ppis, ppi_list_entries, sizeof(ppi), ppi_name_compare); + + i = ppi_list_entries - 1; + ppi_list = NULL; + while (i >= 0) { + ppi = ppis[i]; + + ppi->list_next = ppi_list; + ppi_list = ppi; + i--; + } + + free(ppis); +} + +static void show_process_stats(void) +{ + struct per_process_info *ppi; + + sort_process_list(); + + ppi = ppi_list; + while (ppi) { + struct process_pid_map *ppm = ppi->ppm; + char name[64]; + + if (ppi->more_than_one) + sprintf(name, "%s (%u, ...)", ppm->comm, ppm->pid); + else + sprintf(name, "%s (%u)", ppm->comm, ppm->pid); + + dump_io_stats(NULL, &ppi->io_stats, name); + dump_wait_stats(ppi); + ppi = ppi->list_next; + } + + fprintf(ofp, "\n"); +} + +static void show_device_and_cpu_stats(void) +{ + struct per_dev_info *pdi; + struct per_cpu_info *pci; + struct io_stats total, *ios; + unsigned long long rrate, wrate, msec; + int i, j, pci_events; + char line[3 + 8/*cpu*/ + 2 + 32/*dev*/ + 3]; + char name[32]; + double ratio; + + for (pdi = devices, i = 0; i < ndevices; i++, pdi++) { + + memset(&total, 0, sizeof(total)); + pci_events = 0; + + if (i > 0) + fprintf(ofp, "\n"); + + for (pci = pdi->cpus, j = 0; j < pdi->ncpus; j++, pci++) { + if (!pci->nelems) + continue; + + ios = &pci->io_stats; + total.qreads += ios->qreads; + total.qwrites += ios->qwrites; + total.creads += ios->creads; + total.cwrites += ios->cwrites; + total.mreads += ios->mreads; + total.mwrites += ios->mwrites; + total.ireads += ios->ireads; + total.iwrites += ios->iwrites; + total.rrqueue += ios->rrqueue; + total.wrqueue += ios->wrqueue; + total.qread_kb += ios->qread_kb; + total.qwrite_kb += ios->qwrite_kb; + total.cread_kb += ios->cread_kb; + total.cwrite_kb += ios->cwrite_kb; + total.iread_kb += ios->iread_kb; + total.iwrite_kb += ios->iwrite_kb; + total.mread_kb += ios->mread_kb; + total.mwrite_kb += ios->mwrite_kb; + + total.qreads_pc += ios->qreads_pc; + total.qwrites_pc += ios->qwrites_pc; + total.creads_pc += ios->creads_pc; + total.cwrites_pc += ios->cwrites_pc; + total.ireads_pc += ios->ireads_pc; + total.iwrites_pc += ios->iwrites_pc; + total.rrqueue_pc += ios->rrqueue_pc; + total.wrqueue_pc += ios->wrqueue_pc; + total.qread_kb_pc += ios->qread_kb_pc; + total.qwrite_kb_pc += ios->qwrite_kb_pc; + total.iread_kb_pc += ios->iread_kb_pc; + total.iwrite_kb_pc += ios->iwrite_kb_pc; + + total.timer_unplugs += ios->timer_unplugs; + total.io_unplugs += ios->io_unplugs; + + snprintf(line, sizeof(line) - 1, "CPU%d (%s):", + j, get_dev_name(pdi, name, sizeof(name))); + dump_io_stats(pdi, ios, line); + pci_events++; + } + + if (pci_events > 1) { + fprintf(ofp, "\n"); + snprintf(line, sizeof(line) - 1, "Total (%s):", + get_dev_name(pdi, name, sizeof(name))); + dump_io_stats(NULL, &total, line); + } + + wrate = rrate = 0; + msec = (pdi->last_reported_time - pdi->first_reported_time) / 1000000; + if (msec) { + rrate = 1000 * total.cread_kb / msec; + wrate = 1000 * total.cwrite_kb / msec; + } + + fprintf(ofp, "\nThroughput (R/W): %'LuKiB/s / %'LuKiB/s\n", + rrate, wrate); + fprintf(ofp, "Events (%s): %'Lu entries\n", + get_dev_name(pdi, line, sizeof(line)), pdi->events); + + collect_pdi_skips(pdi); + if (!pdi->skips && !pdi->events) + ratio = 0.0; + else + ratio = 100.0 * ((double)pdi->seq_skips / + (double)(pdi->events + pdi->seq_skips)); + fprintf(ofp, "Skips: %'lu forward (%'llu - %5.1lf%%)\n", + pdi->skips, pdi->seq_skips, ratio); + } +} + +static void find_genesis(void) +{ + struct trace *t = trace_list; + + genesis_time = -1ULL; + while (t != NULL) { + if (t->bit->time < genesis_time) + genesis_time = t->bit->time; + + t = t->next; + } + + /* The time stamp record will usually be the first + * record in the trace, but not always. + */ + if (start_timestamp + && start_timestamp != genesis_time) { + long delta = genesis_time - start_timestamp; + + abs_start_time.tv_sec += SECONDS(delta); + abs_start_time.tv_nsec += NANO_SECONDS(delta); + if (abs_start_time.tv_nsec < 0) { + abs_start_time.tv_nsec += 1000000000; + abs_start_time.tv_sec -= 1; + } else + if (abs_start_time.tv_nsec > 1000000000) { + abs_start_time.tv_nsec -= 1000000000; + abs_start_time.tv_sec += 1; + } + } +} + +static inline int check_stopwatch(struct blk_io_trace *bit) +{ + if (bit->time < stopwatch_end && + bit->time >= stopwatch_start) + return 0; + + return 1; +} + +/* + * return youngest entry read + */ +static int sort_entries(unsigned long long *youngest) +{ + struct per_dev_info *pdi = NULL; + struct per_cpu_info *pci = NULL; + struct trace *t; + + if (!genesis_time) + find_genesis(); + + *youngest = 0; + while ((t = trace_list) != NULL) { + struct blk_io_trace *bit = t->bit; + + trace_list = t->next; + + bit->time -= genesis_time; + + if (bit->time < *youngest || !*youngest) + *youngest = bit->time; + + if (!pdi || pdi->dev != bit->device) { + pdi = get_dev_info(bit->device); + pci = NULL; + } + + if (!pci || pci->cpu != bit->cpu) + pci = get_cpu_info(pdi, bit->cpu); + + if (bit->sequence < pci->smallest_seq_read) + pci->smallest_seq_read = bit->sequence; + + if (check_stopwatch(bit)) { + bit_free(bit); + t_free(t); + continue; + } + + if (trace_rb_insert_sort(t)) + return -1; + } + + return 0; +} + +/* + * to continue, we must have traces from all online cpus in the tree + */ +static int check_cpu_map(struct per_dev_info *pdi) +{ + unsigned long *cpu_map; + struct rb_node *n; + struct trace *__t; + unsigned int i; + int ret, cpu; + + /* + * create a map of the cpus we have traces for + */ + cpu_map = malloc(pdi->cpu_map_max / sizeof(long)); + n = rb_first(&rb_sort_root); + while (n) { + __t = rb_entry(n, struct trace, rb_node); + cpu = __t->bit->cpu; + + cpu_map[CPU_IDX(cpu)] |= (1UL << CPU_BIT(cpu)); + n = rb_next(n); + } + + /* + * we can't continue if pdi->cpu_map has entries set that we don't + * have in the sort rbtree. the opposite is not a problem, though + */ + ret = 0; + for (i = 0; i < pdi->cpu_map_max / CPUS_PER_LONG; i++) { + if (pdi->cpu_map[i] & ~(cpu_map[i])) { + ret = 1; + break; + } + } + + free(cpu_map); + return ret; +} + +static int check_sequence(struct per_dev_info *pdi, struct trace *t, int force) +{ + struct blk_io_trace *bit = t->bit; + unsigned long expected_sequence; + struct per_cpu_info *pci; + struct trace *__t; + + pci = get_cpu_info(pdi, bit->cpu); + expected_sequence = pci->last_sequence + 1; + + if (!expected_sequence) { + /* + * 1 should be the first entry, just allow it + */ + if (bit->sequence == 1) + return 0; + if (bit->sequence == pci->smallest_seq_read) + return 0; + + return check_cpu_map(pdi); + } + + if (bit->sequence == expected_sequence) + return 0; + + /* + * we may not have seen that sequence yet. if we are not doing + * the final run, break and wait for more entries. + */ + if (expected_sequence < pci->smallest_seq_read) { + __t = trace_rb_find_last(pdi, pci, expected_sequence); + if (!__t) + goto skip; + + __put_trace_last(pdi, __t); + return 0; + } else if (!force) { + return 1; + } else { +skip: + if (check_current_skips(pci, bit->sequence)) + return 0; + + if (expected_sequence < bit->sequence) + insert_skip(pci, expected_sequence, bit->sequence - 1); + return 0; + } +} + +static void show_entries_rb(int force) +{ + struct per_dev_info *pdi = NULL; + struct per_cpu_info *pci = NULL; + struct blk_io_trace *bit; + struct rb_node *n; + struct trace *t; + + while ((n = rb_first(&rb_sort_root)) != NULL) { + if (is_done() && !force && !pipeline) + break; + + t = rb_entry(n, struct trace, rb_node); + bit = t->bit; + + if (read_sequence - t->read_sequence < 1 && !force) + break; + + if (!pdi || pdi->dev != bit->device) { + pdi = get_dev_info(bit->device); + pci = NULL; + } + + if (!pdi) { + fprintf(stderr, "Unknown device ID? (%d,%d)\n", + MAJOR(bit->device), MINOR(bit->device)); + break; + } + + if (check_sequence(pdi, t, force)) + break; + + if (!force && bit->time > last_allowed_time) + break; + + check_time(pdi, bit); + + if (!pci || pci->cpu != bit->cpu) + pci = get_cpu_info(pdi, bit->cpu); + + pci->last_sequence = bit->sequence; + + pci->nelems++; + + if (bit->action & (act_mask << BLK_TC_SHIFT)) + dump_trace(bit, pci, pdi); + + put_trace(pdi, t); + } +} + +static int read_data(int fd, void *buffer, int bytes, int block, int *fdblock) +{ + int ret, bytes_left, fl; + void *p; + + if (block != *fdblock) { + fl = fcntl(fd, F_GETFL); + + if (!block) { + *fdblock = 0; + fcntl(fd, F_SETFL, fl | O_NONBLOCK); + } else { + *fdblock = 1; + fcntl(fd, F_SETFL, fl & ~O_NONBLOCK); + } + } + + bytes_left = bytes; + p = buffer; + while (bytes_left > 0) { + ret = read(fd, p, bytes_left); + if (!ret) + return 1; + else if (ret < 0) { + if (errno != EAGAIN) { + perror("read"); + return -1; + } + + /* + * never do partial reads. we can return if we + * didn't read anything and we should not block, + * otherwise wait for data + */ + if ((bytes_left == bytes) && !block) + return 1; + + usleep(10); + continue; + } else { + p += ret; + bytes_left -= ret; + } + } + + return 0; +} + +static inline __u16 get_pdulen(struct blk_io_trace *bit) +{ + if (data_is_native) + return bit->pdu_len; + + return __bswap_16(bit->pdu_len); +} + +static inline __u32 get_magic(struct blk_io_trace *bit) +{ + if (data_is_native) + return bit->magic; + + return __bswap_32(bit->magic); +} + +static int read_events(int fd, int always_block, int *fdblock) +{ + struct per_dev_info *pdi = NULL; + unsigned int events = 0; + + while (!is_done() && events < rb_batch) { + struct blk_io_trace *bit; + struct trace *t; + int pdu_len, should_block, ret; + __u32 magic; + + bit = bit_alloc(); + + should_block = !events || always_block; + + ret = read_data(fd, bit, sizeof(*bit), should_block, fdblock); + if (ret) { + bit_free(bit); + if (!events && ret < 0) + events = ret; + break; + } + + /* + * look at first trace to check whether we need to convert + * data in the future + */ + if (data_is_native == -1 && check_data_endianness(bit->magic)) + break; + + magic = get_magic(bit); + if ((magic & 0xffffff00) != BLK_IO_TRACE_MAGIC) { + fprintf(stderr, "Bad magic %x\n", magic); + break; + } + + pdu_len = get_pdulen(bit); + if (pdu_len) { + void *ptr = realloc(bit, sizeof(*bit) + pdu_len); + + if (read_data(fd, ptr + sizeof(*bit), pdu_len, 1, fdblock)) { + bit_free(ptr); + break; + } + + bit = ptr; + } + + trace_to_cpu(bit); + + if (verify_trace(bit)) { + bit_free(bit); + continue; + } + + /* + * not a real trace, so grab and handle it here + */ + if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && bit->action != BLK_TN_MESSAGE) { + handle_notify(bit); + output_binary(bit, sizeof(*bit) + bit->pdu_len); + continue; + } + + t = t_alloc(); + memset(t, 0, sizeof(*t)); + t->bit = bit; + t->read_sequence = read_sequence; + + t->next = trace_list; + trace_list = t; + + if (!pdi || pdi->dev != bit->device) + pdi = get_dev_info(bit->device); + + if (bit->time > pdi->last_read_time) + pdi->last_read_time = bit->time; + + events++; + } + + return events; +} + +/* + * Managing input streams + */ + +struct ms_stream { + struct ms_stream *next; + struct trace *first, *last; + struct per_dev_info *pdi; + unsigned int cpu; +}; + +#define MS_HASH(d, c) ((MAJOR(d) & 0xff) ^ (MINOR(d) & 0xff) ^ (cpu & 0xff)) + +struct ms_stream *ms_head; +struct ms_stream *ms_hash[256]; + +static void ms_sort(struct ms_stream *msp); +static int ms_prime(struct ms_stream *msp); + +static inline struct trace *ms_peek(struct ms_stream *msp) +{ + return (msp == NULL) ? NULL : msp->first; +} + +static inline __u64 ms_peek_time(struct ms_stream *msp) +{ + return ms_peek(msp)->bit->time; +} + +static inline void ms_resort(struct ms_stream *msp) +{ + if (msp->next && ms_peek_time(msp) > ms_peek_time(msp->next)) { + ms_head = msp->next; + msp->next = NULL; + ms_sort(msp); + } +} + +static inline void ms_deq(struct ms_stream *msp) +{ + msp->first = msp->first->next; + if (!msp->first) { + msp->last = NULL; + if (!ms_prime(msp)) { + ms_head = msp->next; + msp->next = NULL; + return; + } + } + + ms_resort(msp); +} + +static void ms_sort(struct ms_stream *msp) +{ + __u64 msp_t = ms_peek_time(msp); + struct ms_stream *this_msp = ms_head; + + if (this_msp == NULL) + ms_head = msp; + else if (msp_t < ms_peek_time(this_msp)) { + msp->next = this_msp; + ms_head = msp; + } + else { + while (this_msp->next && ms_peek_time(this_msp->next) < msp_t) + this_msp = this_msp->next; + + msp->next = this_msp->next; + this_msp->next = msp; + } +} + +static int ms_prime(struct ms_stream *msp) +{ + __u32 magic; + unsigned int i; + struct trace *t; + struct per_dev_info *pdi = msp->pdi; + struct per_cpu_info *pci = get_cpu_info(pdi, msp->cpu); + struct blk_io_trace *bit = NULL; + int ret, pdu_len, ndone = 0; + + for (i = 0; !is_done() && pci->fd >= 0 && i < rb_batch; i++) { + bit = bit_alloc(); + ret = read_data(pci->fd, bit, sizeof(*bit), 1, &pci->fdblock); + if (ret) + goto err; + + if (data_is_native == -1 && check_data_endianness(bit->magic)) + goto err; + + magic = get_magic(bit); + if ((magic & 0xffffff00) != BLK_IO_TRACE_MAGIC) { + fprintf(stderr, "Bad magic %x\n", magic); + goto err; + + } + + pdu_len = get_pdulen(bit); + if (pdu_len) { + void *ptr = realloc(bit, sizeof(*bit) + pdu_len); + ret = read_data(pci->fd, ptr + sizeof(*bit), pdu_len, + 1, &pci->fdblock); + if (ret) { + free(ptr); + bit = NULL; + goto err; + } + + bit = ptr; + } + + trace_to_cpu(bit); + if (verify_trace(bit)) + goto err; + + if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY) && bit->action != BLK_TN_MESSAGE) { + handle_notify(bit); + output_binary(bit, sizeof(*bit) + bit->pdu_len); + bit_free(bit); + + i -= 1; + continue; + } + + if (bit->time > pdi->last_read_time) + pdi->last_read_time = bit->time; + + t = t_alloc(); + memset(t, 0, sizeof(*t)); + t->bit = bit; + + if (msp->first == NULL) + msp->first = msp->last = t; + else { + msp->last->next = t; + msp->last = t; + } + + ndone++; + } + + return ndone; + +err: + if (bit) bit_free(bit); + + cpu_mark_offline(pdi, pci->cpu); + close(pci->fd); + pci->fd = -1; + + return ndone; +} + +static struct ms_stream *ms_alloc(struct per_dev_info *pdi, int cpu) +{ + struct ms_stream *msp = malloc(sizeof(*msp)); + + msp->next = NULL; + msp->first = msp->last = NULL; + msp->pdi = pdi; + msp->cpu = cpu; + + if (ms_prime(msp)) + ms_sort(msp); + + return msp; +} + +static int setup_file(struct per_dev_info *pdi, int cpu) +{ + int len = 0; + struct stat st; + char *p, *dname; + struct per_cpu_info *pci = get_cpu_info(pdi, cpu); + + pci->cpu = cpu; + pci->fdblock = -1; + + p = strdup(pdi->name); + dname = dirname(p); + if (strcmp(dname, ".")) { + input_dir = dname; + p = strdup(pdi->name); + strcpy(pdi->name, basename(p)); + } + free(p); + + if (input_dir) + len = sprintf(pci->fname, "%s/", input_dir); + + snprintf(pci->fname + len, sizeof(pci->fname)-1-len, + "%s.blktrace.%d", pdi->name, pci->cpu); + if (stat(pci->fname, &st) < 0) + return 0; + if (!st.st_size) + return 1; + + pci->fd = open(pci->fname, O_RDONLY); + if (pci->fd < 0) { + perror(pci->fname); + return 0; + } + + printf("Input file %s added\n", pci->fname); + cpu_mark_online(pdi, pci->cpu); + + pdi->nfiles++; + ms_alloc(pdi, pci->cpu); + + return 1; +} + +static int handle(struct ms_stream *msp) +{ + struct trace *t; + struct per_dev_info *pdi; + struct per_cpu_info *pci; + struct blk_io_trace *bit; + + t = ms_peek(msp); + + bit = t->bit; + pdi = msp->pdi; + pci = get_cpu_info(pdi, msp->cpu); + pci->nelems++; + bit->time -= genesis_time; + + if (t->bit->time > stopwatch_end) + return 0; + + pdi->last_reported_time = bit->time; + if ((bit->action & (act_mask << BLK_TC_SHIFT))&& + t->bit->time >= stopwatch_start) + dump_trace(bit, pci, pdi); + + ms_deq(msp); + + if (text_output) + trace_rb_insert_last(pdi, t); + else { + bit_free(t->bit); + t_free(t); + } + + return 1; +} + +/* + * Check if we need to sanitize the name. We allow 'foo', or if foo.blktrace.X + * is given, then strip back down to 'foo' to avoid missing files. + */ +static int name_fixup(char *name) +{ + char *b; + + if (!name) + return 1; + + b = strstr(name, ".blktrace."); + if (b) + *b = '\0'; + + return 0; +} + +static int do_file(void) +{ + int i, cpu, ret; + struct per_dev_info *pdi; + + /* + * first prepare all files for reading + */ + for (i = 0; i < ndevices; i++) { + pdi = &devices[i]; + ret = name_fixup(pdi->name); + if (ret) + return ret; + + for (cpu = 0; setup_file(pdi, cpu); cpu++) + ; + } + + /* + * Get the initial time stamp + */ + if (ms_head) + genesis_time = ms_peek_time(ms_head); + + /* + * Keep processing traces while any are left + */ + while (!is_done() && ms_head && handle(ms_head)) + ; + + return 0; +} + +static void do_pipe(int fd) +{ + unsigned long long youngest; + int events, fdblock; + + last_allowed_time = -1ULL; + fdblock = -1; + while ((events = read_events(fd, 0, &fdblock)) > 0) { + read_sequence++; + +#if 0 + smallest_seq_read = -1U; +#endif + + if (sort_entries(&youngest)) + break; + + if (youngest > stopwatch_end) + break; + + show_entries_rb(0); + } + + if (rb_sort_entries) + show_entries_rb(1); +} + +static int do_fifo(void) +{ + int fd; + + if (!strcmp(pipename, "-")) + fd = dup(STDIN_FILENO); + else + fd = open(pipename, O_RDONLY); + + if (fd == -1) { + perror("dup stdin"); + return -1; + } + + do_pipe(fd); + close(fd); + return 0; +} + +static void show_stats(void) +{ + if (!ofp) + return; + if (stats_printed) + return; + + stats_printed = 1; + + if (per_process_stats) + show_process_stats(); + + if (per_device_and_cpu_stats) + show_device_and_cpu_stats(); + + fflush(ofp); +} + +static void handle_sigint(__attribute__((__unused__)) int sig) +{ + done = 1; +} + +/* + * Extract start and duration times from a string, allowing + * us to specify a time interval of interest within a trace. + * Format: "duration" (start is zero) or "start:duration". + */ +static int find_stopwatch_interval(char *string) +{ + double value; + char *sp; + + value = strtod(string, &sp); + if (sp == string) { + fprintf(stderr,"Invalid stopwatch timer: %s\n", string); + return 1; + } + if (*sp == ':') { + stopwatch_start = DOUBLE_TO_NANO_ULL(value); + string = sp + 1; + value = strtod(string, &sp); + if (sp == string || *sp != '\0') { + fprintf(stderr,"Invalid stopwatch duration time: %s\n", + string); + return 1; + } + } else if (*sp != '\0') { + fprintf(stderr,"Invalid stopwatch start timer: %s\n", string); + return 1; + } + stopwatch_end = DOUBLE_TO_NANO_ULL(value); + if (stopwatch_end <= stopwatch_start) { + fprintf(stderr, "Invalid stopwatch interval: %Lu -> %Lu\n", + stopwatch_start, stopwatch_end); + return 1; + } + + return 0; +} + +static int is_pipe(const char *str) +{ + struct stat st; + + if (!strcmp(str, "-")) + return 1; + if (!stat(str, &st) && S_ISFIFO(st.st_mode)) + return 1; + + return 0; +} + +#define S_OPTS "a:A:b:D:d:f:F:hi:o:Oqstw:vVM" +static char usage_str[] = "\n\n" \ + "-i <file> | --input=<file>\n" \ + "[ -a <action field> | --act-mask=<action field> ]\n" \ + "[ -A <action mask> | --set-mask=<action mask> ]\n" \ + "[ -b <traces> | --batch=<traces> ]\n" \ + "[ -d <file> | --dump-binary=<file> ]\n" \ + "[ -D <dir> | --input-directory=<dir> ]\n" \ + "[ -f <format> | --format=<format> ]\n" \ + "[ -F <spec> | --format-spec=<spec> ]\n" \ + "[ -h | --hash-by-name ]\n" \ + "[ -o <file> | --output=<file> ]\n" \ + "[ -O | --no-text-output ]\n" \ + "[ -q | --quiet ]\n" \ + "[ -s | --per-program-stats ]\n" \ + "[ -t | --track-ios ]\n" \ + "[ -w <time> | --stopwatch=<time> ]\n" \ + "[ -M | --no-msgs\n" \ + "[ -v | --verbose ]\n" \ + "[ -V | --version ]\n\n" \ + "\t-b stdin read batching\n" \ + "\t-d Output file. If specified, binary data is written to file\n" \ + "\t-D Directory to prepend to input file names\n" \ + "\t-f Output format. Customize the output format. The format field\n" \ + "\t identifies can be found in the documentation\n" \ + "\t-F Format specification. Can be found in the documentation\n" \ + "\t-h Hash processes by name, not pid\n" \ + "\t-i Input file containing trace data, or '-' for stdin\n" \ + "\t-o Output file. If not given, output is stdout\n" \ + "\t-O Do NOT output text data\n" \ + "\t-q Quiet. Don't display any stats at the end of the trace\n" \ + "\t-s Show per-program io statistics\n" \ + "\t-t Track individual ios. Will tell you the time a request took\n" \ + "\t to get queued, to get dispatched, and to get completed\n" \ + "\t-w Only parse data between the given time interval in seconds.\n" \ + "\t If 'start' isn't given, blkparse defaults the start time to 0\n" \ + "\t-M Do not output messages to binary file\n" \ + "\t-v More verbose for marginal errors\n" \ + "\t-V Print program version info\n\n"; + +static void usage(char *prog) +{ + fprintf(stderr, "Usage: %s %s %s", prog, blkparse_version, usage_str); +} + +int main(int argc, char *argv[]) +{ + int i, c, ret, mode; + int act_mask_tmp = 0; + char *ofp_buffer = NULL; + char *bin_ofp_buffer = NULL; + + while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) != -1) { + switch (c) { + case 'a': + i = find_mask_map(optarg); + if (i < 0) { + fprintf(stderr,"Invalid action mask %s\n", + optarg); + return 1; + } + act_mask_tmp |= i; + break; + + case 'A': + if ((sscanf(optarg, "%x", &i) != 1) || + !valid_act_opt(i)) { + fprintf(stderr, + "Invalid set action mask %s/0x%x\n", + optarg, i); + return 1; + } + act_mask_tmp = i; + break; + case 'i': + if (is_pipe(optarg) && !pipeline) { + pipeline = 1; + pipename = strdup(optarg); + } else if (resize_devices(optarg) != 0) + return 1; + break; + case 'D': + input_dir = optarg; + break; + case 'o': + output_name = optarg; + break; + case 'O': + text_output = 0; + break; + case 'b': + rb_batch = atoi(optarg); + if (rb_batch <= 0) + rb_batch = RB_BATCH_DEFAULT; + break; + case 's': + per_process_stats = 1; + break; + case 't': + track_ios = 1; + break; + case 'q': + per_device_and_cpu_stats = 0; + break; + case 'w': + if (find_stopwatch_interval(optarg) != 0) + return 1; + break; + case 'f': + set_all_format_specs(optarg); + break; + case 'F': + if (add_format_spec(optarg) != 0) + return 1; + break; + case 'h': + ppi_hash_by_pid = 0; + break; + case 'v': + verbose++; + break; + case 'V': + printf("%s version %s\n", argv[0], blkparse_version); + return 0; + case 'd': + dump_binary = optarg; + break; + case 'M': + bin_output_msgs = 0; + break; + default: + usage(argv[0]); + return 1; + } + } + + while (optind < argc) { + if (is_pipe(argv[optind]) && !pipeline) { + pipeline = 1; + pipename = strdup(argv[optind]); + } else if (resize_devices(argv[optind]) != 0) + return 1; + optind++; + } + + if (!pipeline && !ndevices) { + usage(argv[0]); + return 1; + } + + if (act_mask_tmp != 0) + act_mask = act_mask_tmp; + + memset(&rb_sort_root, 0, sizeof(rb_sort_root)); + + signal(SIGINT, handle_sigint); + signal(SIGHUP, handle_sigint); + signal(SIGTERM, handle_sigint); + + setlocale(LC_NUMERIC, "en_US"); + + if (text_output) { + if (!output_name) { + ofp = fdopen(STDOUT_FILENO, "w"); + mode = _IOLBF; + } else { + char ofname[128]; + + snprintf(ofname, sizeof(ofname) - 1, "%s", output_name); + ofp = fopen(ofname, "w"); + mode = _IOFBF; + } + + if (!ofp) { + perror("fopen"); + return 1; + } + + ofp_buffer = malloc(4096); + if (setvbuf(ofp, ofp_buffer, mode, 4096)) { + perror("setvbuf"); + return 1; + } + } + + if (dump_binary) { + dump_fp = fopen(dump_binary, "w"); + if (!dump_fp) { + perror(dump_binary); + dump_binary = NULL; + return 1; + } + bin_ofp_buffer = malloc(128 * 1024); + if (setvbuf(dump_fp, bin_ofp_buffer, _IOFBF, 128 * 1024)) { + perror("setvbuf binary"); + return 1; + } + } + + if (pipeline) + ret = do_fifo(); + else + ret = do_file(); + + if (!ret) + show_stats(); + + if (have_drv_data && !dump_binary) + printf("\ndiscarded traces containing low-level device driver " + "specific data (only available in binary output)\n"); + + if (ofp_buffer) { + fflush(ofp); + free(ofp_buffer); + } + if (bin_ofp_buffer) { + fflush(dump_fp); + free(bin_ofp_buffer); + } + return ret; +} diff --git a/blkparse_fmt.c b/blkparse_fmt.c new file mode 100644 index 0000000..ed6cd5c --- /dev/null +++ b/blkparse_fmt.c @@ -0,0 +1,464 @@ +/* + * This file contains format parsing code for blkparse, allowing you to + * customize the individual action format and generel output format. + */ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <ctype.h> +#include <time.h> + +#include "blktrace.h" + +#define VALID_SPECS "ABCDFGIMPQRSTUWX" + +#define HEADER "%D %2c %8s %5T.%9t %5p %2a %3d " + +static char *override_format[256]; + +static inline int valid_spec(int spec) +{ + return strchr(VALID_SPECS, spec) != NULL; +} + +void set_all_format_specs(char *option) +{ + char *p; + + for (p = VALID_SPECS; *p; p++) + if (override_format[(int)(*p)] == NULL) + override_format[(int)(*p)] = strdup(option); +} + +int add_format_spec(char *option) +{ + int spec = optarg[0]; + + if (!valid_spec(spec)) { + fprintf(stderr,"Bad format specifier %c\n", spec); + return 1; + } + if (optarg[1] != ',') { + fprintf(stderr,"Bad format specifier - need ',' %s\n", option); + return 1; + } + option += 2; + + override_format[spec] = strdup(option); + + return 0; +} + +static inline void fill_rwbs(char *rwbs, struct blk_io_trace *t) +{ + int w = t->action & BLK_TC_ACT(BLK_TC_WRITE); + int a = t->action & BLK_TC_ACT(BLK_TC_AHEAD); + int b = t->action & BLK_TC_ACT(BLK_TC_BARRIER); + int s = t->action & BLK_TC_ACT(BLK_TC_SYNC); + int m = t->action & BLK_TC_ACT(BLK_TC_META); + int d = t->action & BLK_TC_ACT(BLK_TC_DISCARD); + int i = 0; + + if (d) + rwbs[i++] = 'D'; + else if (w) + rwbs[i++] = 'W'; + else if (t->bytes) + rwbs[i++] = 'R'; + else + rwbs[i++] = 'N'; + if (a) + rwbs[i++] = 'A'; + if (b) + rwbs[i++] = 'B'; + if (s) + rwbs[i++] = 'S'; + if (m) + rwbs[i++] = 'M'; + + rwbs[i] = '\0'; +} + +static const char * +print_time(unsigned long long timestamp) +{ + static char timebuf[128]; + struct tm *tm; + time_t sec; + unsigned long nsec; + + sec = abs_start_time.tv_sec + SECONDS(timestamp); + nsec = abs_start_time.tv_nsec + NANO_SECONDS(timestamp); + if (nsec >= 1000000000) { + nsec -= 1000000000; + sec += 1; + } + + tm = localtime(&sec); + snprintf(timebuf, sizeof(timebuf), + "%02u:%02u:%02u.%06lu", + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + nsec / 1000); + return timebuf; +} + +static inline int pdu_rest_is_zero(unsigned char *pdu, int len) +{ + static char zero[4096]; + + return !memcmp(pdu, zero, len); +} + +static char *dump_pdu(unsigned char *pdu_buf, int pdu_len) +{ + static char p[4096]; + int i, len; + + if (!pdu_buf || !pdu_len) + return NULL; + + for (len = 0, i = 0; i < pdu_len; i++) { + if (i) + len += sprintf(p + len, " "); + + len += sprintf(p + len, "%02x", pdu_buf[i]); + + /* + * usually dump for cdb dumps where we can see lots of + * zeroes, stop when the rest is just zeroes and indicate + * so with a .. appended + */ + if (!pdu_buf[i] && pdu_rest_is_zero(pdu_buf + i, pdu_len - i)) { + sprintf(p + len, " .."); + break; + } + } + + return p; +} + +#define pdu_start(t) (((void *) (t) + sizeof(struct blk_io_trace))) + +static unsigned int get_pdu_int(struct blk_io_trace *t) +{ + __u64 *val = pdu_start(t); + + return be64_to_cpu(*val); +} + +static void get_pdu_remap(struct blk_io_trace *t, struct blk_io_trace_remap *r) +{ + struct blk_io_trace_remap *__r = pdu_start(t); + __u64 sector_from = __r->sector_from; + + r->device_from = be32_to_cpu(__r->device_from); + r->device_to = be32_to_cpu(__r->device_to); + r->sector_from = be64_to_cpu(sector_from); +} + +static void print_field(char *act, struct per_cpu_info *pci, + struct blk_io_trace *t, unsigned long long elapsed, + int pdu_len, unsigned char *pdu_buf, char field, + int minus, int has_w, int width) +{ + char format[64]; + + if (has_w) { + if (minus) + sprintf(format, "%%-%d", width); + else + sprintf(format, "%%%d", width); + } else + sprintf(format, "%%"); + + switch (field) { + case 'a': + fprintf(ofp, strcat(format, "s"), act); + break; + case 'c': + fprintf(ofp, strcat(format, "d"), pci->cpu); + break; + case 'C': { + char *name = find_process_name(t->pid); + + fprintf(ofp, strcat(format, "s"), name); + break; + } + case 'd': { + char rwbs[6]; + + fill_rwbs(rwbs, t); + fprintf(ofp, strcat(format, "s"), rwbs); + break; + } + case 'D': /* format width ignored */ + fprintf(ofp,"%3d,%-3d", MAJOR(t->device), MINOR(t->device)); + break; + case 'e': + fprintf(ofp, strcat(format, "d"), t->error); + break; + case 'M': + fprintf(ofp, strcat(format, "d"), MAJOR(t->device)); + break; + case 'm': + fprintf(ofp, strcat(format, "d"), MINOR(t->device)); + break; + case 'n': + fprintf(ofp, strcat(format, "u"), t_sec(t)); + break; + case 'N': + fprintf(ofp, strcat(format, "u"), t->bytes); + break; + case 'p': + fprintf(ofp, strcat(format, "u"), t->pid); + break; + case 'P': { /* format width ignored */ + char *p = dump_pdu(pdu_buf, pdu_len); + if (p) + fprintf(ofp, "%s", p); + break; + } + case 's': + fprintf(ofp, strcat(format, "ld"), t->sequence); + break; + case 'S': + fprintf(ofp, strcat(format, "lu"), t->sector); + break; + case 't': + sprintf(format, "%%0%dlu", has_w ? width : 9); + fprintf(ofp, format, NANO_SECONDS(t->time)); + break; + case 'T': + fprintf(ofp, strcat(format, "d"), SECONDS(t->time)); + break; + case 'u': + if (elapsed == -1ULL) { + fprintf(stderr, "Expecting elapsed value\n"); + exit(1); + } + fprintf(ofp, strcat(format, "llu"), elapsed / 1000); + break; + case 'U': + fprintf(ofp, strcat(format, "u"), get_pdu_int(t)); + break; + case 'z': + fprintf(ofp, strcat(format, "s"), print_time(t->time)); + break; + default: + fprintf(ofp,strcat(format, "c"), field); + break; + } +} + +static char *parse_field(char *act, struct per_cpu_info *pci, + struct blk_io_trace *t, unsigned long long elapsed, + int pdu_len, unsigned char *pdu_buf, + char *master_format) +{ + int minus = 0; + int has_w = 0; + int width = 0; + char *p = master_format; + + if (*p == '-') { + minus = 1; + p++; + } + if (isdigit(*p)) { + has_w = 1; + do { + width = (width * 10) + (*p++ - '0'); + } while ((*p) && (isdigit(*p))); + } + if (*p) { + print_field(act, pci, t, elapsed, pdu_len, pdu_buf, *p++, + minus, has_w, width); + } + return p; +} + +static void process_default(char *act, struct per_cpu_info *pci, + struct blk_io_trace *t, unsigned long long elapsed, + int pdu_len, unsigned char *pdu_buf) +{ + struct blk_io_trace_remap r = { .device_from = 0, }; + char rwbs[6]; + char *name; + + fill_rwbs(rwbs, t); + + /* + * For remaps we have to modify the device using the remap structure + * passed up. + */ + if (act[0] == 'A') { + get_pdu_remap(t, &r); + t->device = r.device_to; + } + + /* + * The header is always the same + */ + fprintf(ofp, "%3d,%-3d %2d %8d %5d.%09lu %5u %2s %3s ", + MAJOR(t->device), MINOR(t->device), pci->cpu, t->sequence, + (int) SECONDS(t->time), (unsigned long) NANO_SECONDS(t->time), + t->pid, act, rwbs); + + name = find_process_name(t->pid); + + switch (act[0]) { + case 'R': /* Requeue */ + case 'C': /* Complete */ + if (t->action & BLK_TC_ACT(BLK_TC_PC)) { + char *p = dump_pdu(pdu_buf, pdu_len); + if (p) + fprintf(ofp, "(%s) ", p); + fprintf(ofp, "[%d]\n", t->error); + } else { + if (elapsed != -1ULL) { + if (t_sec(t)) + fprintf(ofp, "%llu + %u (%8llu) [%d]\n", + (unsigned long long) t->sector, + t_sec(t), elapsed, t->error); + else + fprintf(ofp, "%llu (%8llu) [%d]\n", + (unsigned long long) t->sector, + elapsed, t->error); + } else { + if (t_sec(t)) + fprintf(ofp, "%llu + %u [%d]\n", + (unsigned long long) t->sector, + t_sec(t), t->error); + else + fprintf(ofp, "%llu [%d]\n", + (unsigned long long) t->sector, + t->error); + } + } + break; + + case 'D': /* Issue */ + case 'I': /* Insert */ + case 'Q': /* Queue */ + case 'B': /* Bounce */ + if (t->action & BLK_TC_ACT(BLK_TC_PC)) { + char *p; + fprintf(ofp, "%u ", t->bytes); + p = dump_pdu(pdu_buf, pdu_len); + if (p) + fprintf(ofp, "(%s) ", p); + fprintf(ofp, "[%s]\n", name); + } else { + if (elapsed != -1ULL) { + if (t_sec(t)) + fprintf(ofp, "%llu + %u (%8llu) [%s]\n", + (unsigned long long) t->sector, + t_sec(t), elapsed, name); + else + fprintf(ofp, "(%8llu) [%s]\n", elapsed, + name); + } else { + if (t_sec(t)) + fprintf(ofp, "%llu + %u [%s]\n", + (unsigned long long) t->sector, + t_sec(t), name); + else + fprintf(ofp, "[%s]\n", name); + } + } + break; + + case 'M': /* Back merge */ + case 'F': /* Front merge */ + case 'G': /* Get request */ + case 'S': /* Sleep request */ + if (t_sec(t)) + fprintf(ofp, "%llu + %u [%s]\n", + (unsigned long long) t->sector, t_sec(t), name); + else + fprintf(ofp, "[%s]\n", name); + break; + + case 'P': /* Plug */ + fprintf(ofp, "[%s]\n", name); + break; + + case 'U': /* Unplug IO */ + case 'T': /* Unplug timer */ + fprintf(ofp, "[%s] %u\n", name, get_pdu_int(t)); + break; + + case 'A': /* remap */ + get_pdu_remap(t, &r); + fprintf(ofp, "%llu + %u <- (%d,%d) %llu\n", + (unsigned long long) t->sector, t_sec(t), + MAJOR(r.device_from), MINOR(r.device_from), + (unsigned long long) r.sector_from); + break; + + case 'X': /* Split */ + fprintf(ofp, "%llu / %u [%s]\n", (unsigned long long) t->sector, + get_pdu_int(t), name); + break; + + case 'm': /* Message */ + fprintf(ofp, "%*s\n", pdu_len, pdu_buf); + break; + + default: + fprintf(stderr, "Unknown action %c\n", act[0]); + break; + } + +} + +void process_fmt(char *act, struct per_cpu_info *pci, struct blk_io_trace *t, + unsigned long long elapsed, int pdu_len, + unsigned char *pdu_buf) +{ + char *p = override_format[(int) *act]; + + if (!p) { + process_default(act, pci, t, elapsed, pdu_len, pdu_buf); + return; + } + + while (*p) { + switch (*p) { + case '%': /* Field specifier */ + p++; + if (*p == '%') + fprintf(ofp, "%c", *p++); + else if (!*p) + fprintf(ofp, "%c", '%'); + else + p = parse_field(act, pci, t, elapsed, + pdu_len, pdu_buf, p); + break; + case '\\': { /* escape */ + switch (p[1]) { + case 'b': fprintf(ofp, "\b"); break; + case 'n': fprintf(ofp, "\n"); break; + case 'r': fprintf(ofp, "\r"); break; + case 't': fprintf(ofp, "\t"); break; + default: + fprintf(stderr, + "Invalid escape char in format %c\n", + p[1]); + exit(1); + /*NOTREACHED*/ + } + p += 2; + break; + } + default: + fprintf(ofp, "%c", *p++); + break; + } + } +} + + diff --git a/blkrawverify.c b/blkrawverify.c new file mode 100644 index 0000000..e669179 --- /dev/null +++ b/blkrawverify.c @@ -0,0 +1,322 @@ +/* + * block queue tracing application + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "blktrace.h" + +struct trace_info { + int bit_field; + char *string; +}; + +int data_is_native = -1; + +#define TRACE_TO_STRING(f) {.bit_field = f, .string = #f} +static struct trace_info traces[] = { + TRACE_TO_STRING( BLK_TC_READ ), + TRACE_TO_STRING( BLK_TC_WRITE ), + TRACE_TO_STRING( BLK_TC_BARRIER ), + TRACE_TO_STRING( BLK_TC_SYNC ), + TRACE_TO_STRING( BLK_TC_QUEUE ), + TRACE_TO_STRING( BLK_TC_REQUEUE ), + TRACE_TO_STRING( BLK_TC_ISSUE ), + TRACE_TO_STRING( BLK_TC_COMPLETE ), + TRACE_TO_STRING( BLK_TC_FS ), + TRACE_TO_STRING( BLK_TC_PC ), + TRACE_TO_STRING( BLK_TC_AHEAD ), + TRACE_TO_STRING( BLK_TC_META ), + TRACE_TO_STRING( BLK_TC_DISCARD ), +}; +#define N_TRACES (sizeof(traces) / sizeof(struct trace_info)) + +struct act_info { + __u32 val; + char *string; +}; + +#define ACT_TO_STRING(f) {.val = f, .string = #f} +static struct act_info acts[] = { + ACT_TO_STRING( __BLK_TA_QUEUE ), + ACT_TO_STRING( __BLK_TA_QUEUE ), + ACT_TO_STRING( __BLK_TA_BACKMERGE ), + ACT_TO_STRING( __BLK_TA_FRONTMERGE ), + ACT_TO_STRING( __BLK_TA_GETRQ ), + ACT_TO_STRING( __BLK_TA_SLEEPRQ ), + ACT_TO_STRING( __BLK_TA_REQUEUE ), + ACT_TO_STRING( __BLK_TA_ISSUE ), + ACT_TO_STRING( __BLK_TA_COMPLETE ), + ACT_TO_STRING( __BLK_TA_PLUG ), + ACT_TO_STRING( __BLK_TA_UNPLUG_IO ), + ACT_TO_STRING( __BLK_TA_UNPLUG_TIMER ), + ACT_TO_STRING( __BLK_TA_INSERT ), + ACT_TO_STRING( __BLK_TA_SPLIT ), + ACT_TO_STRING( __BLK_TA_BOUNCE ), + ACT_TO_STRING( __BLK_TA_REMAP ) +}; +#define N_ACTS (sizeof(acts) / sizeof(struct act_info)) + +static char *act_to_str(__u32 action) +{ + static char buf[1024]; + unsigned int i; + unsigned int act = action & 0xffff; + unsigned int trace = (action >> BLK_TC_SHIFT) & 0xffff; + + if (act <= N_ACTS) { + sprintf(buf, "%s ", acts[act].string); + for (i = 0; i < N_TRACES; i++) + if (trace & (1 << i)) { + char buf2[1024]; + sprintf(buf2, "| %s ", traces[i].string); + strcat(buf, buf2); + } + } + else + sprintf(buf, "Invalid action=%08x", action); + + return buf; +} + +static void dump_trace(FILE *ofp, char *prefix, struct blk_io_trace *bit) +{ + fprintf(ofp, " Dump %s\n", prefix); + fprintf(ofp, " %8s: %08x\n", "magic", bit->magic); + fprintf(ofp, " %8s: %u\n", "sequence", bit->sequence); + fprintf(ofp, " %8s: %llu\n", "time", (unsigned long long) bit->time); + fprintf(ofp, " %8s: %llu\n", "sector", (unsigned long long) bit->sector); + fprintf(ofp, " %8s: %u\n", "bytes", bit->bytes); + fprintf(ofp, " %8s: %s\n", "action", act_to_str(bit->action)); + fprintf(ofp, " %8s: %u\n", "bytes", bit->bytes); + fprintf(ofp, " %8s: %u\n", "cpu", bit->cpu); + fprintf(ofp, " %8s: %u\n", "error", bit->error); + fprintf(ofp, " %8s: %u\n", "pdu_len", bit->pdu_len); + fprintf(ofp, " %8s: (%u,%u)\n\n", "device", MAJOR(bit->device), + MINOR(bit->device)); +} + +static int process(FILE **fp, char *devname, char *file, unsigned int cpu) +{ +# define SWAP_BITS() do { \ + if (bit_save) { \ + struct blk_io_trace *tmp = bit_save; \ + bit_save = bit; \ + bit = tmp; \ + } \ + else { \ + bit_save = bit; \ + bit = malloc(sizeof(struct blk_io_trace)); \ + } \ + } while (0) + +# define INC_BAD(str) do { \ + nbad++; \ + fprintf(ofp, " ----------------\n"); \ + if (bit_save) dump_trace(ofp,"seq-1",bit_save); \ + dump_trace(ofp, str, bit); \ + SWAP_BITS(); \ + } while (0) + + size_t n; + FILE *ifp, *ofp; + __u32 save_device = 0, save_sequence = 0; + __u64 save_time = 0; + struct blk_io_trace *bit_save = NULL; + struct blk_io_trace *bit = malloc(sizeof(struct blk_io_trace)); + unsigned int ngood = 0; + unsigned int nbad = 0; + unsigned int nbad_trace = 0, nbad_pdu = 0, nbad_cpu = 0; + unsigned int nbad_seq = 0, nbad_dev = 0, nbad_time = 0; + char ofname[1024]; + + ifp = fopen(file, "r"); + if (!ifp) + return 0; + + sprintf(ofname, "%s.verify.out", devname); + + if (!*fp) { + *fp = fopen(ofname, "w"); + if (*fp == NULL) { + fprintf(stderr,"Failed to open %s (%s), skipping\n", + ofname, strerror(errno)); + fclose(ifp); + return 0; + } + fprintf(*fp, "\n---------------\n" ); + fprintf(*fp, "Verifying %s\n", devname); + } + + ofp = *fp; + while ((n = fread(bit, sizeof(struct blk_io_trace), 1, ifp)) == 1) { + if (ferror(ifp)) { + clearerr(ifp); + perror("fread"); + break; + } + if (data_is_native == -1) + check_data_endianness(bit->magic); + + trace_to_cpu(bit); + + if (!CHECK_MAGIC(bit)) { + INC_BAD("bad trace"); + continue; + } + + if ((bit->magic & 0xff) != SUPPORTED_VERSION) { + fprintf(stderr, "unsupported trace version\n"); + break; + } + + if (bit->pdu_len) { + char *pdu_buf; + + pdu_buf = malloc(bit->pdu_len); + n = fread(pdu_buf, bit->pdu_len, 1, ifp); + if (n == 0) { + INC_BAD("bad pdu"); + nbad_seq++; + break; + } + free(pdu_buf); + } + + if (bit->cpu != cpu) { + INC_BAD("bad cpu"); + nbad_cpu++; + continue; + } + + /* + * skip notify traces, they don't have valid sequences + */ + if (bit->action & BLK_TC_ACT(BLK_TC_NOTIFY)) + continue; + + if (ngood) { + if (bit->sequence <= save_sequence) { + INC_BAD("bad seq"); + nbad_seq++; + continue; + } + else if (bit->time <= save_time) { + INC_BAD("time regression"); + nbad_time++; + continue; + } + else if (bit->device != save_device) { + INC_BAD("bad dev"); + nbad_dev++; + continue; + } + } + + save_sequence = bit->sequence; + save_time = bit->time; + save_device = bit->device; + + ngood++; + SWAP_BITS(); + } + + if (n == 0 && !feof(ifp)) + fprintf(stderr,"%s: fread failed %d/%s\n", + file, errno, strerror(errno)); + fclose(ifp); + + fprintf(ofp, " ---------------------\n"); + fprintf(ofp, " Summary for cpu %d:\n", cpu); + fprintf(ofp, " %10d valid + %10d invalid (%5.1f%%) processed\n\n", + ngood, nbad, + ngood ? 100.0 * (float)ngood / (float)(ngood + nbad) : 0.0); + + if (nbad) { + if (nbad_trace) + fprintf(ofp, "%8s %d traces\n", "", nbad_trace); + if (nbad_trace) + fprintf(ofp, "%8s %d pdu\n", "", nbad_pdu); + if (nbad_cpu) + fprintf(ofp, "%8s %d cpu\n", "", nbad_cpu); + if (nbad_seq) + fprintf(ofp, "%8s %d seq\n", "", nbad_seq); + if (nbad_dev) + fprintf(ofp, "%8s %d dev\n", "", nbad_dev); + if (nbad_time) + fprintf(ofp, "%8s %d time\n", "", nbad_time); + fprintf(ofp,"\n"); + } + + return nbad; +} + +int main(int argc, char *argv[]) +{ + char *devname; + struct stat st; + int i, cpu, nbad, rval = 0; + FILE *ofp; + char *ofname = malloc(1024); + char *fname = malloc(1024); + + if (argc < 2) { + fprintf(stderr,"FATAL: Need device name(s)\n"); + fprintf(stderr,"Usage: blkrawverify <dev> [<dev>...]\n"); + exit(1); + } + + for (i = 1; i < argc; i++) { + devname = argv[i]; + sprintf(ofname, "%s.verify.out", devname); + ofp = NULL; + + printf("Verifying %s\n", devname); fflush(stdout); + for (cpu = 0; ; cpu++) { + sprintf(fname, "%s.blktrace.%d", devname, cpu); + if (stat(fname, &st) < 0) { + if (cpu == 0) { + fprintf(stderr, "No tracefiles found for %s\n", + devname); + rval = 1; + } + break; + } + printf(" CPU %d ", cpu); fflush(stdout); + nbad = process(&ofp, devname, fname, cpu); + if (nbad) { + printf("-- %d bad", nbad); + rval = 1; + } + printf("\n"); + } + if (ofp) { + fclose(ofp); + fprintf(stdout, "Wrote output to %s\n", ofname); + } + } + + return rval; +} diff --git a/blktrace.c b/blktrace.c new file mode 100644 index 0000000..4a4c255 --- /dev/null +++ b/blktrace.c @@ -0,0 +1,2664 @@ +/* + * block queue tracing application + * + * Copyright (C) 2005 Jens Axboe <axboe@suse.de> + * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk> + * + * Rewrite to have a single thread per CPU (managing all devices on that CPU) + * Alan D. Brunelle <alan.brunelle@hp.com> - January 2009 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <errno.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <getopt.h> +#include <sched.h> +#include <unistd.h> +#include <poll.h> +#include <signal.h> +#include <pthread.h> +#include <locale.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/vfs.h> +#include <sys/mman.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <sys/sendfile.h> + +#include "btt/list.h" +#include "blktrace.h" + +/* + * You may want to increase this even more, if you are logging at a high + * rate and see skipped/missed events + */ +#define BUF_SIZE (512 * 1024) +#define BUF_NR (4) + +#define FILE_VBUF_SIZE (128 * 1024) + +#define DEBUGFS_TYPE (0x64626720) +#define TRACE_NET_PORT (8462) + +enum { + Net_none = 0, + Net_server, + Net_client, +}; + +enum thread_status { + Th_running, + Th_leaving, + Th_error +}; + +/* + * Generic stats collected: nevents can be _roughly_ estimated by data_read + * (discounting pdu...) + * + * These fields are updated w/ pdc_dr_update & pdc_nev_update below. + */ +struct pdc_stats { + unsigned long long data_read; + unsigned long long nevents; +}; + +struct devpath { + struct list_head head; + char *path; /* path to device special file */ + char *buts_name; /* name returned from bt kernel code */ + struct pdc_stats *stats; + int fd, idx, ncpus; + unsigned long long drops; + + /* + * For piped output only: + * + * Each tracer will have a tracer_devpath_head that it will add new + * data onto. It's list is protected above (tracer_devpath_head.mutex) + * and it will signal the processing thread using the dp_cond, + * dp_mutex & dp_entries variables above. + */ + struct tracer_devpath_head *heads; + + /* + * For network server mode only: + */ + struct cl_host *ch; + u32 cl_id; + time_t cl_connect_time; + struct io_info *ios; +}; + +/* + * For piped output to stdout we will have each tracer thread (one per dev) + * tack buffers read from the relay queues on a per-device list. + * + * The main thread will then collect trace buffers from each of lists in turn. + * + * We will use a mutex to guard each of the trace_buf list. The tracers + * can then signal the main thread using <dp_cond,dp_mutex> and + * dp_entries. (When dp_entries is 0, and a tracer adds an entry it will + * signal. When dp_entries is 0, the main thread will wait for that condition + * to be signalled.) + * + * adb: It may be better just to have a large buffer per tracer per dev, + * and then use it as a ring-buffer. This would certainly cut down a lot + * of malloc/free thrashing, at the cost of more memory movements (potentially). + */ +struct trace_buf { + struct list_head head; + struct devpath *dpp; + void *buf; + int cpu, len; +}; + +struct tracer_devpath_head { + pthread_mutex_t mutex; + struct list_head head; + struct trace_buf *prev; +}; + +/* + * Used to handle the mmap() interfaces for output file (containing traces) + */ +struct mmap_info { + void *fs_buf; + unsigned long long fs_size, fs_max_size, fs_off, fs_buf_len; + unsigned long buf_size, buf_nr; + int pagesize; +}; + +/* + * Each thread doing work on a (client) side of blktrace will have one + * of these. The ios array contains input/output information, pfds holds + * poll() data. The volatile's provide flags to/from the main executing + * thread. + */ +struct tracer { + struct list_head head; + struct io_info *ios; + struct pollfd *pfds; + pthread_t thread; + int cpu, nios; + volatile int status, is_done; +}; + +/* + * networking stuff follows. we include a magic number so we know whether + * to endianness convert or not. + * + * The len field is overloaded: + * 0 - Indicates an "open" - allowing the server to set up for a dev/cpu + * 1 - Indicates a "close" - Shut down connection orderly + * + * The cpu field is overloaded on close: it will contain the number of drops. + */ +struct blktrace_net_hdr { + u32 magic; /* same as trace magic */ + char buts_name[32]; /* trace name */ + u32 cpu; /* for which cpu */ + u32 max_cpus; + u32 len; /* length of following trace data */ + u32 cl_id; /* id for set of client per-cpu connections */ + u32 buf_size; /* client buf_size for this trace */ + u32 buf_nr; /* client buf_nr for this trace */ + u32 page_size; /* client page_size for this trace */ +}; + +/* + * Each host encountered has one of these. The head is used to link this + * on to the network server's ch_list. Connections associated with this + * host are linked on conn_list, and any devices traced on that host + * are connected on the devpaths list. + */ +struct cl_host { + struct list_head head; + struct list_head conn_list; + struct list_head devpaths; + struct net_server_s *ns; + char *hostname; + struct in_addr cl_in_addr; + int connects, ndevs, cl_opens; +}; + +/* + * Each connection (client to server socket ('fd')) has one of these. A + * back reference to the host ('ch'), and lists headers (for the host + * list, and the network server conn_list) are also included. + */ +struct cl_conn { + struct list_head ch_head, ns_head; + struct cl_host *ch; + int fd, ncpus; + time_t connect_time; +}; + +/* + * The network server requires some poll structures to be maintained - + * one per conection currently on conn_list. The nchs/ch_list values + * are for each host connected to this server. The addr field is used + * for scratch as new connections are established. + */ +struct net_server_s { + struct list_head conn_list; + struct list_head ch_list; + struct pollfd *pfds; + int listen_fd, connects, nchs; + struct sockaddr_in addr; +}; + +/* + * This structure is (generically) used to providide information + * for a read-to-write set of values. + * + * ifn & ifd represent input information + * + * ofn, ofd, ofp, obuf & mmap_info are used for output file (optionally). + */ +struct io_info { + struct devpath *dpp; + FILE *ofp; + char *obuf; + struct cl_conn *nc; /* Server network connection */ + + /* + * mmap controlled output files + */ + struct mmap_info mmap_info; + + /* + * Client network fields + */ + unsigned int ready; + unsigned long long data_queued; + + /* + * Input/output file descriptors & names + */ + int ifd, ofd; + char ifn[MAXPATHLEN + 64]; + char ofn[MAXPATHLEN + 64]; +}; + +static char blktrace_version[] = "2.0.0"; + +/* + * Linkage to blktrace helper routines (trace conversions) + */ +int data_is_native = -1; + +static int ndevs; +static int ncpus; +static int pagesize; +static int act_mask = ~0U; +static int kill_running_trace; +static int stop_watch; +static int piped_output; + +static char *debugfs_path = "/sys/kernel/debug"; +static char *output_name; +static char *output_dir; + +static unsigned long buf_size = BUF_SIZE; +static unsigned long buf_nr = BUF_NR; + +static FILE *pfp; + +static LIST_HEAD(devpaths); +static LIST_HEAD(tracers); + +static volatile int done; + +/* + * tracer threads add entries, the main thread takes them off and processes + * them. These protect the dp_entries variable. + */ +static pthread_cond_t dp_cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t dp_mutex = PTHREAD_MUTEX_INITIALIZER; +static volatile int dp_entries; + +/* + * These synchronize master / thread interactions. + */ +static pthread_cond_t mt_cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t mt_mutex = PTHREAD_MUTEX_INITIALIZER; +static volatile int nthreads_running; +static volatile int nthreads_leaving; +static volatile int nthreads_error; +static volatile int tracers_run; + +/* + * network cmd line params + */ +static struct sockaddr_in hostname_addr; +static char hostname[MAXHOSTNAMELEN]; +static int net_port = TRACE_NET_PORT; +static int net_use_sendfile = 1; +static int net_mode; +static int *cl_fds; + +static int (*handle_pfds)(struct tracer *, int, int); +static int (*handle_list)(struct tracer_devpath_head *, struct list_head *); + +#define S_OPTS "d:a:A:r:o:kw:vVb:n:D:lh:p:sI:" +static struct option l_opts[] = { + { + .name = "dev", + .has_arg = required_argument, + .flag = NULL, + .val = 'd' + }, + { + .name = "input-devs", + .has_arg = required_argument, + .flag = NULL, + .val = 'I' + }, + { + .name = "act-mask", + .has_arg = required_argument, + .flag = NULL, + .val = 'a' + }, + { + .name = "set-mask", + .has_arg = required_argument, + .flag = NULL, + .val = 'A' + }, + { + .name = "relay", + .has_arg = required_argument, + .flag = NULL, + .val = 'r' + }, + { + .name = "output", + .has_arg = required_argument, + .flag = NULL, + .val = 'o' + }, + { + .name = "kill", + .has_arg = no_argument, + .flag = NULL, + .val = 'k' + }, + { + .name = "stopwatch", + .has_arg = required_argument, + .flag = NULL, + .val = 'w' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'v' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'V' + }, + { + .name = "buffer-size", + .has_arg = required_argument, + .flag = NULL, + .val = 'b' + }, + { + .name = "num-sub-buffers", + .has_arg = required_argument, + .flag = NULL, + .val = 'n' + }, + { + .name = "output-dir", + .has_arg = required_argument, + .flag = NULL, + .val = 'D' + }, + { + .name = "listen", + .has_arg = no_argument, + .flag = NULL, + .val = 'l' + }, + { + .name = "host", + .has_arg = required_argument, + .flag = NULL, + .val = 'h' + }, + { + .name = "port", + .has_arg = required_argument, + .flag = NULL, + .val = 'p' + }, + { + .name = "no-sendfile", + .has_arg = no_argument, + .flag = NULL, + .val = 's' + }, + { + .name = NULL, + } +}; + +static char usage_str[] = \ + "-d <dev> [ -r debugfs path ] [ -o <output> ] [-k ] [ -w time ]\n" \ + "[ -a action ] [ -A action mask ] [ -I <devs file> ] [ -v ]\n\n" \ + "\t-d Use specified device. May also be given last after options\n" \ + "\t-r Path to mounted debugfs, defaults to /sys/kernel/debug\n" \ + "\t-o File(s) to send output to\n" \ + "\t-D Directory to prepend to output file names\n" \ + "\t-k Kill a running trace\n" \ + "\t-w Stop after defined time, in seconds\n" \ + "\t-a Only trace specified actions. See documentation\n" \ + "\t-A Give trace mask as a single value. See documentation\n" \ + "\t-b Sub buffer size in KiB\n" \ + "\t-n Number of sub buffers\n" \ + "\t-l Run in network listen mode (blktrace server)\n" \ + "\t-h Run in network client mode, connecting to the given host\n" \ + "\t-p Network port to use (default 8462)\n" \ + "\t-s Make the network client NOT use sendfile() to transfer data\n" \ + "\t-I Add devices found in <devs file>\n" \ + "\t-V Print program version info\n\n"; + +static void clear_events(struct pollfd *pfd) +{ + pfd->events = 0; + pfd->revents = 0; +} + +static inline int net_client_use_sendfile(void) +{ + return net_mode == Net_client && net_use_sendfile; +} + +static inline int net_client_use_send(void) +{ + return net_mode == Net_client && !net_use_sendfile; +} + +static inline int use_tracer_devpaths(void) +{ + return piped_output || net_client_use_send(); +} + +static inline int in_addr_eq(struct in_addr a, struct in_addr b) +{ + return a.s_addr == b.s_addr; +} + +static inline void pdc_dr_update(struct devpath *dpp, int cpu, int data_read) +{ + dpp->stats[cpu].data_read += data_read; +} + +static inline void pdc_nev_update(struct devpath *dpp, int cpu, int nevents) +{ + dpp->stats[cpu].nevents += nevents; +} + +static void show_usage(char *prog) +{ + fprintf(stderr, "Usage: %s %s %s", prog, blktrace_version, usage_str); +} + +/* + * Create a timespec 'msec' milliseconds into the future + */ +static inline void make_timespec(struct timespec *tsp, long delta_msec) +{ + struct timeval now; + + gettimeofday(&now, NULL); + tsp->tv_sec = now.tv_sec; + tsp->tv_nsec = 1000L * now.tv_usec; + + tsp->tv_nsec += (delta_msec * 1000000L); + if (tsp->tv_nsec > 1000000000L) { + long secs = tsp->tv_nsec / 1000000000L; + + tsp->tv_sec += secs; + tsp->tv_nsec -= (secs * 1000000000L); + } +} + +/* + * Add a timer to ensure wait ends + */ +static void t_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + struct timespec ts; + + make_timespec(&ts, 50); + pthread_cond_timedwait(cond, mutex, &ts); +} + +static void unblock_tracers(void) +{ + pthread_mutex_lock(&mt_mutex); + tracers_run = 1; + pthread_cond_broadcast(&mt_cond); + pthread_mutex_unlock(&mt_mutex); +} + +static void tracer_wait_unblock(struct tracer *tp) +{ + pthread_mutex_lock(&mt_mutex); + while (!tp->is_done && !tracers_run) + pthread_cond_wait(&mt_cond, &mt_mutex); + pthread_mutex_unlock(&mt_mutex); +} + +static void tracer_signal_ready(struct tracer *tp, + enum thread_status th_status, + int status) +{ + pthread_mutex_lock(&mt_mutex); + tp->status = status; + + if (th_status == Th_running) + nthreads_running++; + else if (th_status == Th_error) + nthreads_error++; + else + nthreads_leaving++; + + pthread_cond_signal(&mt_cond); + pthread_mutex_unlock(&mt_mutex); +} + +static void wait_tracers_ready(int ncpus_started) +{ + pthread_mutex_lock(&mt_mutex); + while ((nthreads_running + nthreads_error) < ncpus_started) + t_pthread_cond_wait(&mt_cond, &mt_mutex); + pthread_mutex_unlock(&mt_mutex); +} + +static void wait_tracers_leaving(void) +{ + pthread_mutex_lock(&mt_mutex); + while (nthreads_leaving < nthreads_running) + t_pthread_cond_wait(&mt_cond, &mt_mutex); + pthread_mutex_unlock(&mt_mutex); +} + +static void init_mmap_info(struct mmap_info *mip) +{ + mip->buf_size = buf_size; + mip->buf_nr = buf_nr; + mip->pagesize = pagesize; +} + +static void net_close_connection(int *fd) +{ + shutdown(*fd, SHUT_RDWR); + close(*fd); + *fd = -1; +} + +static void dpp_free(struct devpath *dpp) +{ + if (dpp->stats) + free(dpp->stats); + if (dpp->ios) + free(dpp->ios); + if (dpp->path) + free(dpp->path); + if (dpp->buts_name) + free(dpp->buts_name); + free(dpp); +} + +static int lock_on_cpu(int cpu) +{ +#ifndef _ANDROID_ + cpu_set_t cpu_mask; + + CPU_ZERO(&cpu_mask); + CPU_SET(cpu, &cpu_mask); + if (sched_setaffinity(0, sizeof(cpu_mask), &cpu_mask) < 0) + return errno; +#endif + + return 0; +} + +#ifndef _ANDROID_ +static int increase_limit(int resource, rlim_t increase) +{ + struct rlimit rlim; + int save_errno = errno; + + if (!getrlimit(resource, &rlim)) { + rlim.rlim_cur += increase; + if (rlim.rlim_cur >= rlim.rlim_max) + rlim.rlim_max = rlim.rlim_cur + increase; + + if (!setrlimit(resource, &rlim)) + return 1; + } + + errno = save_errno; + return 0; +} +#endif + +static int handle_open_failure(void) +{ + if (errno == ENFILE || errno == EMFILE) +#ifndef _ANDROID_ + return increase_limit(RLIMIT_NOFILE, 16); +#else + return -ENOSYS; +#endif + return 0; +} + +static int handle_mem_failure(size_t length) +{ + if (errno == ENFILE) + return handle_open_failure(); + else if (errno == ENOMEM) +#ifndef _ANDROID_ + return increase_limit(RLIMIT_MEMLOCK, 2 * length); +#else + return -ENOSYS; +#endif + return 0; +} + +static FILE *my_fopen(const char *path, const char *mode) +{ + FILE *fp; + + do { + fp = fopen(path, mode); + } while (fp == NULL && handle_open_failure()); + + return fp; +} + +static int my_open(const char *path, int flags) +{ + int fd; + + do { + fd = open(path, flags); + } while (fd < 0 && handle_open_failure()); + + return fd; +} + +static int my_socket(int domain, int type, int protocol) +{ + int fd; + + do { + fd = socket(domain, type, protocol); + } while (fd < 0 && handle_open_failure()); + + return fd; +} + +static int my_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) +{ + int fd; + + do { + fd = accept(sockfd, addr, addrlen); + } while (fd < 0 && handle_open_failure()); + + return fd; +} + +static void *my_mmap(void *addr, size_t length, int prot, int flags, int fd, + off_t offset) +{ + void *new; + + do { + new = mmap(addr, length, prot, flags, fd, offset); + } while (new == MAP_FAILED && handle_mem_failure(length)); + + return new; +} + +static int my_mlock(const void *addr, size_t len) +{ + int ret; + + do { + ret = mlock(addr, len); + } while (ret < 0 && handle_mem_failure(len)); + + return ret; +} + +static int setup_mmap(int fd, unsigned int maxlen, struct mmap_info *mip) +{ + if (mip->fs_off + maxlen > mip->fs_buf_len) { + unsigned long nr = max(16, mip->buf_nr); + + if (mip->fs_buf) { + munlock(mip->fs_buf, mip->fs_buf_len); + munmap(mip->fs_buf, mip->fs_buf_len); + mip->fs_buf = NULL; + } + + mip->fs_off = mip->fs_size & (mip->pagesize - 1); + mip->fs_buf_len = (nr * mip->buf_size) - mip->fs_off; + mip->fs_max_size += mip->fs_buf_len; + + if (ftruncate(fd, mip->fs_max_size) < 0) { + perror("setup_mmap: ftruncate"); + return 1; + } + + mip->fs_buf = my_mmap(NULL, mip->fs_buf_len, PROT_WRITE, + MAP_SHARED, fd, + mip->fs_size - mip->fs_off); + if (mip->fs_buf == MAP_FAILED) { + perror("setup_mmap: mmap"); + return 1; + } + my_mlock(mip->fs_buf, mip->fs_buf_len); + } + + return 0; +} + +static int __stop_trace(int fd) +{ + /* + * Should be stopped, don't complain if it isn't + */ + ioctl(fd, BLKTRACESTOP); + return ioctl(fd, BLKTRACETEARDOWN); +} + +static int write_data(char *buf, int len) +{ + int ret; + +rewrite: + ret = fwrite(buf, len, 1, pfp); + if (ferror(pfp) || ret != 1) { + if (errno == EINTR) { + clearerr(pfp); + goto rewrite; + } + + if (!piped_output || (errno != EPIPE && errno != EBADF)) { + fprintf(stderr, "write(%d) failed: %d/%s\n", + len, errno, strerror(errno)); + } + goto err; + } + + fflush(pfp); + return 0; + +err: + clearerr(pfp); + return 1; +} + +/* + * Returns the number of bytes read (successfully) + */ +static int __net_recv_data(int fd, void *buf, unsigned int len) +{ + unsigned int bytes_left = len; + + while (bytes_left && !done) { + int ret = recv(fd, buf, bytes_left, MSG_WAITALL); + + if (ret == 0) + break; + else if (ret < 0) { + if (errno == EAGAIN) { + usleep(50); + continue; + } + perror("server: net_recv_data: recv failed"); + break; + } else { + buf += ret; + bytes_left -= ret; + } + } + + return len - bytes_left; +} + +static int net_recv_data(int fd, void *buf, unsigned int len) +{ + return __net_recv_data(fd, buf, len); +} + +/* + * Returns number of bytes written + */ +static int net_send_data(int fd, void *buf, unsigned int buf_len) +{ + int ret; + unsigned int bytes_left = buf_len; + + while (bytes_left) { + ret = send(fd, buf, bytes_left, 0); + if (ret < 0) { + perror("send"); + break; + } + + buf += ret; + bytes_left -= ret; + } + + return buf_len - bytes_left; +} + +static int net_send_header(int fd, int cpu, char *buts_name, int len) +{ + struct blktrace_net_hdr hdr; + + memset(&hdr, 0, sizeof(hdr)); + + hdr.magic = BLK_IO_TRACE_MAGIC; + strncpy(hdr.buts_name, buts_name, sizeof(hdr.buts_name)); + hdr.buts_name[sizeof(hdr.buts_name)-1] = '\0'; + hdr.cpu = cpu; + hdr.max_cpus = ncpus; + hdr.len = len; + hdr.cl_id = getpid(); + hdr.buf_size = buf_size; + hdr.buf_nr = buf_nr; + hdr.page_size = pagesize; + + return net_send_data(fd, &hdr, sizeof(hdr)) != sizeof(hdr); +} + +static void net_send_open_close(int fd, int cpu, char *buts_name, int len) +{ + struct blktrace_net_hdr ret_hdr; + + net_send_header(fd, cpu, buts_name, len); + net_recv_data(fd, &ret_hdr, sizeof(ret_hdr)); +} + +static void net_send_open(int fd, int cpu, char *buts_name) +{ + net_send_open_close(fd, cpu, buts_name, 0); +} + +static void net_send_close(int fd, char *buts_name, int drops) +{ + /* + * Overload CPU w/ number of drops + * + * XXX: Need to clear/set done around call - done=1 (which + * is true here) stops reads from happening... :-( + */ + done = 0; + net_send_open_close(fd, drops, buts_name, 1); + done = 1; +} + +static void ack_open_close(int fd, char *buts_name) +{ + net_send_header(fd, 0, buts_name, 2); +} + +static void net_send_drops(int fd) +{ + struct list_head *p; + + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + net_send_close(fd, dpp->buts_name, dpp->drops); + } +} + +/* + * Returns: + * 0: "EOF" + * 1: OK + * -1: Error + */ +static int net_get_header(struct cl_conn *nc, struct blktrace_net_hdr *bnh) +{ + int bytes_read; + int fl = fcntl(nc->fd, F_GETFL); + + fcntl(nc->fd, F_SETFL, fl | O_NONBLOCK); + bytes_read = __net_recv_data(nc->fd, bnh, sizeof(*bnh)); + fcntl(nc->fd, F_SETFL, fl & ~O_NONBLOCK); + + if (bytes_read == sizeof(*bnh)) + return 1; + else if (bytes_read == 0) + return 0; + else + return -1; +} + +static int net_setup_addr(void) +{ + struct sockaddr_in *addr = &hostname_addr; + + memset(addr, 0, sizeof(*addr)); + addr->sin_family = AF_INET; + addr->sin_port = htons(net_port); + + if (inet_aton(hostname, &addr->sin_addr) != 1) { + struct hostent *hent; +retry: + hent = gethostbyname(hostname); + if (!hent) { + if (h_errno == TRY_AGAIN) { + usleep(100); + goto retry; + } else if (h_errno == NO_RECOVERY) { + fprintf(stderr, "gethostbyname(%s)" + "non-recoverable error encountered\n", + hostname); + } else { + /* + * HOST_NOT_FOUND, NO_ADDRESS or NO_DATA + */ + fprintf(stderr, "Host %s not found\n", + hostname); + } + return 1; + } + + memcpy(&addr->sin_addr, hent->h_addr, 4); + strcpy(hostname, hent->h_name); + } + + return 0; +} + +static int net_setup_client(void) +{ + int fd; + struct sockaddr_in *addr = &hostname_addr; + + fd = my_socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { + perror("client: socket"); + return -1; + } + + if (connect(fd, (struct sockaddr *)addr, sizeof(*addr)) < 0) { + if (errno == ECONNREFUSED) + fprintf(stderr, + "\nclient: Connection to %s refused, " + "perhaps the server is not started?\n\n", + hostname); + else + perror("client: connect"); + + close(fd); + return -1; + } + + return fd; +} + +static int open_client_connections(void) +{ + int cpu; + + cl_fds = calloc(ncpus, sizeof(*cl_fds)); + for (cpu = 0; cpu < ncpus; cpu++) { + cl_fds[cpu] = net_setup_client(); + if (cl_fds[cpu] < 0) + goto err; + } + return 0; + +err: + while (cpu > 0) + close(cl_fds[cpu--]); + free(cl_fds); + return 1; +} + +static void close_client_connections(void) +{ + if (cl_fds) { + int cpu, *fdp; + + for (cpu = 0, fdp = cl_fds; cpu < ncpus; cpu++, fdp++) { + if (*fdp >= 0) { + net_send_drops(*fdp); + net_close_connection(fdp); + } + } + free(cl_fds); + } +} + +static void setup_buts(void) +{ + struct list_head *p; + + __list_for_each(p, &devpaths) { + struct blk_user_trace_setup buts; + struct devpath *dpp = list_entry(p, struct devpath, head); + + memset(&buts, 0, sizeof(buts)); + buts.buf_size = buf_size; + buts.buf_nr = buf_nr; + buts.act_mask = act_mask; + if (ioctl(dpp->fd, BLKTRACESETUP, &buts) >= 0) { + dpp->ncpus = ncpus; + dpp->buts_name = strdup(buts.name); + if (dpp->stats) + free(dpp->stats); + dpp->stats = calloc(dpp->ncpus, sizeof(*dpp->stats)); + memset(dpp->stats, 0, dpp->ncpus * sizeof(*dpp->stats)); + } else + fprintf(stderr, "BLKTRACESETUP(2) %s failed: %d/%s\n", + dpp->path, errno, strerror(errno)); + } +} + +static void start_buts(void) +{ + struct list_head *p; + + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + if (ioctl(dpp->fd, BLKTRACESTART) < 0) { + fprintf(stderr, "BLKTRACESTART %s failed: %d/%s\n", + dpp->path, errno, strerror(errno)); + } + } +} + +static int get_drops(struct devpath *dpp) +{ + int fd, drops = 0; + char fn[MAXPATHLEN + 64], tmp[256]; + + snprintf(fn, sizeof(fn), "%s/block/%s/dropped", debugfs_path, + dpp->buts_name); + + fd = my_open(fn, O_RDONLY); + if (fd < 0) { + /* + * This may be ok: the kernel may not support + * dropped counts. + */ + if (errno != ENOENT) + fprintf(stderr, "Could not open %s: %d/%s\n", + fn, errno, strerror(errno)); + return 0; + } else if (read(fd, tmp, sizeof(tmp)) < 0) { + fprintf(stderr, "Could not read %s: %d/%s\n", + fn, errno, strerror(errno)); + } else + drops = atoi(tmp); + close(fd); + + return drops; +} + +static void get_all_drops(void) +{ + struct list_head *p; + + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + dpp->drops = get_drops(dpp); + } +} + +static inline struct trace_buf *alloc_trace_buf(int cpu, int bufsize) +{ + struct trace_buf *tbp; + + tbp = malloc(sizeof(*tbp) + bufsize); + INIT_LIST_HEAD(&tbp->head); + tbp->len = 0; + tbp->buf = (void *)(tbp + 1); + tbp->cpu = cpu; + tbp->dpp = NULL; /* Will be set when tbp is added */ + + return tbp; +} + +static void free_tracer_heads(struct devpath *dpp) +{ + int cpu; + struct tracer_devpath_head *hd; + + for (cpu = 0, hd = dpp->heads; cpu < ncpus; cpu++, hd++) { + if (hd->prev) + free(hd->prev); + + pthread_mutex_destroy(&hd->mutex); + } + free(dpp->heads); +} + +static int setup_tracer_devpaths(void) +{ + struct list_head *p; + + if (net_client_use_send()) + if (open_client_connections()) + return 1; + + __list_for_each(p, &devpaths) { + int cpu; + struct tracer_devpath_head *hd; + struct devpath *dpp = list_entry(p, struct devpath, head); + + dpp->heads = calloc(ncpus, sizeof(struct tracer_devpath_head)); + for (cpu = 0, hd = dpp->heads; cpu < ncpus; cpu++, hd++) { + INIT_LIST_HEAD(&hd->head); + pthread_mutex_init(&hd->mutex, NULL); + hd->prev = NULL; + } + } + + return 0; +} + +static inline void add_trace_buf(struct devpath *dpp, int cpu, + struct trace_buf **tbpp) +{ + struct trace_buf *tbp = *tbpp; + struct tracer_devpath_head *hd = &dpp->heads[cpu]; + + tbp->dpp = dpp; + + pthread_mutex_lock(&hd->mutex); + list_add_tail(&tbp->head, &hd->head); + pthread_mutex_unlock(&hd->mutex); + + *tbpp = alloc_trace_buf(cpu, buf_size); +} + +static inline void incr_entries(int entries_handled) +{ + pthread_mutex_lock(&dp_mutex); + if (dp_entries == 0) + pthread_cond_signal(&dp_cond); + dp_entries += entries_handled; + pthread_mutex_unlock(&dp_mutex); +} + +static void decr_entries(int handled) +{ + pthread_mutex_lock(&dp_mutex); + dp_entries -= handled; + pthread_mutex_unlock(&dp_mutex); +} + +static int wait_empty_entries(void) +{ + pthread_mutex_lock(&dp_mutex); + while (!done && dp_entries == 0) + t_pthread_cond_wait(&dp_cond, &dp_mutex); + pthread_mutex_unlock(&dp_mutex); + + return !done; +} + +static int add_devpath(char *path) +{ + int fd; + struct devpath *dpp; + + /* + * Verify device is valid before going too far + */ + fd = my_open(path, O_RDONLY | O_NONBLOCK); + if (fd < 0) { + fprintf(stderr, "Invalid path %s specified: %d/%s\n", + path, errno, strerror(errno)); + return 1; + } + + dpp = malloc(sizeof(*dpp)); + memset(dpp, 0, sizeof(*dpp)); + dpp->path = strdup(path); + dpp->fd = fd; + dpp->idx = ndevs++; + list_add_tail(&dpp->head, &devpaths); + + return 0; +} + +static void rel_devpaths(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + list_del(&dpp->head); + __stop_trace(dpp->fd); + close(dpp->fd); + + if (dpp->heads) + free_tracer_heads(dpp); + + dpp_free(dpp); + ndevs--; + } +} + +static int flush_subbuf_net(struct trace_buf *tbp) +{ + int fd = cl_fds[tbp->cpu]; + struct devpath *dpp = tbp->dpp; + + if (net_send_header(fd, tbp->cpu, dpp->buts_name, tbp->len)) + return 1; + else if (net_send_data(fd, tbp->buf, tbp->len) != tbp->len) + return 1; + + return 0; +} + +static int +handle_list_net(__attribute__((__unused__))struct tracer_devpath_head *hd, + struct list_head *list) +{ + struct trace_buf *tbp; + struct list_head *p, *q; + int entries_handled = 0; + + list_for_each_safe(p, q, list) { + tbp = list_entry(p, struct trace_buf, head); + + list_del(&tbp->head); + entries_handled++; + + if (cl_fds[tbp->cpu] >= 0) { + if (flush_subbuf_net(tbp)) { + close(cl_fds[tbp->cpu]); + cl_fds[tbp->cpu] = -1; + } + } + + free(tbp); + } + + return entries_handled; +} + +/* + * Tack 'tbp's buf onto the tail of 'prev's buf + */ +static struct trace_buf *tb_combine(struct trace_buf *prev, + struct trace_buf *tbp) +{ + unsigned long tot_len; + + tot_len = prev->len + tbp->len; + if (tot_len > buf_size) { + /* + * tbp->head isn't connected (it was 'prev' + * so it had been taken off of the list + * before). Therefore, we can realloc + * the whole structures, as the other fields + * are "static". + */ + prev = realloc(prev->buf, sizeof(*prev) + tot_len); + prev->buf = (void *)(prev + 1); + } + + memcpy(prev->buf + prev->len, tbp->buf, tbp->len); + prev->len = tot_len; + + free(tbp); + return prev; +} + +static int handle_list_file(struct tracer_devpath_head *hd, + struct list_head *list) +{ + int off, t_len, nevents; + struct blk_io_trace *t; + struct list_head *p, *q; + int entries_handled = 0; + struct trace_buf *tbp, *prev; + + prev = hd->prev; + list_for_each_safe(p, q, list) { + tbp = list_entry(p, struct trace_buf, head); + list_del(&tbp->head); + entries_handled++; + + /* + * If there was some leftover before, tack this new + * entry onto the tail of the previous one. + */ + if (prev) + tbp = tb_combine(prev, tbp); + + /* + * See how many whole traces there are - send them + * all out in one go. + */ + off = 0; + nevents = 0; + while (off + (int)sizeof(*t) <= tbp->len) { + t = (struct blk_io_trace *)(tbp->buf + off); + t_len = sizeof(*t) + t->pdu_len; + if (off + t_len > tbp->len) + break; + + off += t_len; + nevents++; + } + if (nevents) + pdc_nev_update(tbp->dpp, tbp->cpu, nevents); + + /* + * Write any full set of traces, any remaining data is kept + * for the next pass. + */ + if (off) { + if (write_data(tbp->buf, off) || off == tbp->len) { + free(tbp); + prev = NULL; + } + else { + /* + * Move valid data to beginning of buffer + */ + tbp->len -= off; + memmove(tbp->buf, tbp->buf + off, tbp->len); + prev = tbp; + } + } else + prev = tbp; + } + hd->prev = prev; + + return entries_handled; +} + +static void __process_trace_bufs(void) +{ + int cpu; + struct list_head *p; + struct list_head list; + int handled = 0; + + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + struct tracer_devpath_head *hd = dpp->heads; + + for (cpu = 0; cpu < ncpus; cpu++, hd++) { + pthread_mutex_lock(&hd->mutex); + if (list_empty(&hd->head)) { + pthread_mutex_unlock(&hd->mutex); + continue; + } + + list_replace_init(&hd->head, &list); + pthread_mutex_unlock(&hd->mutex); + + handled += handle_list(hd, &list); + } + } + + if (handled) + decr_entries(handled); +} + +static void process_trace_bufs(void) +{ + while (wait_empty_entries()) + __process_trace_bufs(); +} + +static void clean_trace_bufs(void) +{ + /* + * No mutex needed here: we're only reading from the lists, + * tracers are done + */ + while (dp_entries) + __process_trace_bufs(); +} + +static inline void read_err(int cpu, char *ifn) +{ + if (errno != EAGAIN) + fprintf(stderr, "Thread %d failed read of %s: %d/%s\n", + cpu, ifn, errno, strerror(errno)); +} + +static int net_sendfile(struct io_info *iop) +{ + int ret; + + ret = sendfile(iop->ofd, iop->ifd, NULL, iop->ready); + if (ret < 0) { + perror("sendfile"); + return 1; + } else if (ret < (int)iop->ready) { + fprintf(stderr, "short sendfile send (%d of %d)\n", + ret, iop->ready); + return 1; + } + + return 0; +} + +static inline int net_sendfile_data(struct tracer *tp, struct io_info *iop) +{ + struct devpath *dpp = iop->dpp; + + if (net_send_header(iop->ofd, tp->cpu, dpp->buts_name, iop->ready)) + return 1; + return net_sendfile(iop); +} + +static int fill_ofname(struct io_info *iop, int cpu) +{ + int len; + struct stat sb; + char *dst = iop->ofn; + + if (output_dir) + len = snprintf(iop->ofn, sizeof(iop->ofn), "%s/", output_dir); + else + len = snprintf(iop->ofn, sizeof(iop->ofn), "./"); + + if (net_mode == Net_server) { + struct cl_conn *nc = iop->nc; + + len += sprintf(dst + len, "%s-", nc->ch->hostname); + len += strftime(dst + len, 64, "%F-%T/", + gmtime(&iop->dpp->cl_connect_time)); + } + + if (stat(iop->ofn, &sb) < 0) { + if (errno != ENOENT) { + fprintf(stderr, + "Destination dir %s stat failed: %d/%s\n", + iop->ofn, errno, strerror(errno)); + return 1; + } + /* + * There is no synchronization between multiple threads + * trying to create the directory at once. It's harmless + * to let them try, so just detect the problem and move on. + */ + if (mkdir(iop->ofn, 0755) < 0 && errno != EEXIST) { + fprintf(stderr, + "Destination dir %s can't be made: %d/%s\n", + iop->ofn, errno, strerror(errno)); + return 1; + } + } + + if (output_name) + snprintf(iop->ofn + len, sizeof(iop->ofn), "%s.blktrace.%d", + output_name, cpu); + else + snprintf(iop->ofn + len, sizeof(iop->ofn), "%s.blktrace.%d", + iop->dpp->buts_name, cpu); + + return 0; +} + +static int set_vbuf(struct io_info *iop, int mode, size_t size) +{ + iop->obuf = malloc(size); + if (setvbuf(iop->ofp, iop->obuf, mode, size) < 0) { + fprintf(stderr, "setvbuf(%s, %d) failed: %d/%s\n", + iop->dpp->path, (int)size, errno, + strerror(errno)); + free(iop->obuf); + return 1; + } + + return 0; +} + +static int iop_open(struct io_info *iop, int cpu) +{ + iop->ofd = -1; + if (fill_ofname(iop, cpu)) + return 1; + + iop->ofp = my_fopen(iop->ofn, "w+"); + if (iop->ofp == NULL) { + fprintf(stderr, "Open output file %s failed: %d/%s\n", + iop->ofn, errno, strerror(errno)); + return 1; + } + + if (set_vbuf(iop, _IOLBF, FILE_VBUF_SIZE)) { + fprintf(stderr, "set_vbuf for file %s failed: %d/%s\n", + iop->ofn, errno, strerror(errno)); + fclose(iop->ofp); + return 1; + } + + iop->ofd = fileno(iop->ofp); + return 0; +} + +static void close_iop(struct io_info *iop) +{ + struct mmap_info *mip = &iop->mmap_info; + + if (mip->fs_buf) + munmap(mip->fs_buf, mip->fs_buf_len); + + if (!piped_output) { + if (ftruncate(fileno(iop->ofp), mip->fs_size) < 0) { + fprintf(stderr, + "Ignoring err: ftruncate(%s): %d/%s\n", + iop->ofn, errno, strerror(errno)); + } + } + + if (iop->ofp) + fclose(iop->ofp); + if (iop->obuf) + free(iop->obuf); +} + +static void close_ios(struct tracer *tp) +{ + while (tp->nios > 0) { + struct io_info *iop = &tp->ios[--tp->nios]; + + iop->dpp->drops = get_drops(iop->dpp); + if (iop->ifd >= 0) + close(iop->ifd); + + if (iop->ofp) + close_iop(iop); + else if (iop->ofd >= 0) { + struct devpath *dpp = iop->dpp; + + net_send_close(iop->ofd, dpp->buts_name, dpp->drops); + net_close_connection(&iop->ofd); + } + } + + free(tp->ios); + free(tp->pfds); +} + +static int open_ios(struct tracer *tp) +{ + struct pollfd *pfd; + struct io_info *iop; + struct list_head *p; + + tp->ios = calloc(ndevs, sizeof(struct io_info)); + memset(tp->ios, 0, ndevs * sizeof(struct io_info)); + + tp->pfds = calloc(ndevs, sizeof(struct pollfd)); + memset(tp->pfds, 0, ndevs * sizeof(struct pollfd)); + + tp->nios = 0; + iop = tp->ios; + pfd = tp->pfds; + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + iop->dpp = dpp; + iop->ofd = -1; + snprintf(iop->ifn, sizeof(iop->ifn), "%s/block/%s/trace%d", + debugfs_path, dpp->buts_name, tp->cpu); + + iop->ifd = my_open(iop->ifn, O_RDONLY | O_NONBLOCK); + if (iop->ifd < 0) { + fprintf(stderr, "Thread %d failed open %s: %d/%s\n", + tp->cpu, iop->ifn, errno, strerror(errno)); + return 1; + } + + init_mmap_info(&iop->mmap_info); + + pfd->fd = iop->ifd; + pfd->events = POLLIN; + + if (piped_output) + ; + else if (net_client_use_sendfile()) { + iop->ofd = net_setup_client(); + if (iop->ofd < 0) + goto err; + net_send_open(iop->ofd, tp->cpu, dpp->buts_name); + } else if (net_mode == Net_none) { + if (iop_open(iop, tp->cpu)) + goto err; + } else { + /* + * This ensures that the server knows about all + * connections & devices before _any_ closes + */ + net_send_open(cl_fds[tp->cpu], tp->cpu, dpp->buts_name); + } + + pfd++; + iop++; + tp->nios++; + } + + return 0; + +err: + close(iop->ifd); /* tp->nios _not_ bumped */ + close_ios(tp); + return 1; +} + +static int handle_pfds_file(struct tracer *tp, int nevs, int force_read) +{ + struct mmap_info *mip; + int i, ret, nentries = 0; + struct pollfd *pfd = tp->pfds; + struct io_info *iop = tp->ios; + + for (i = 0; nevs > 0 && i < ndevs; i++, pfd++, iop++) { + if (pfd->revents & POLLIN || force_read) { + mip = &iop->mmap_info; + + ret = setup_mmap(iop->ofd, buf_size, mip); + if (ret < 0) { + pfd->events = 0; + break; + } + + ret = read(iop->ifd, mip->fs_buf + mip->fs_off, + buf_size); + if (ret > 0) { + pdc_dr_update(iop->dpp, tp->cpu, ret); + mip->fs_size += ret; + mip->fs_off += ret; + nentries++; + } else if (ret == 0) { + /* + * Short reads after we're done stop us + * from trying reads. + */ + if (tp->is_done) + clear_events(pfd); + } else { + read_err(tp->cpu, iop->ifn); + if (errno != EAGAIN || tp->is_done) + clear_events(pfd); + } + nevs--; + } + } + + return nentries; +} + +static int handle_pfds_netclient(struct tracer *tp, int nevs, int force_read) +{ + struct stat sb; + int i, nentries = 0; + struct pdc_stats *sp; + struct pollfd *pfd = tp->pfds; + struct io_info *iop = tp->ios; + + for (i = 0; i < ndevs; i++, pfd++, iop++, sp++) { + if (pfd->revents & POLLIN || force_read) { + if (fstat(iop->ifd, &sb) < 0) { + perror(iop->ifn); + pfd->events = 0; + } else if (sb.st_size > (off_t)iop->data_queued) { + iop->ready = sb.st_size - iop->data_queued; + iop->data_queued = sb.st_size; + + if (!net_sendfile_data(tp, iop)) { + pdc_dr_update(iop->dpp, tp->cpu, + iop->ready); + nentries++; + } else + clear_events(pfd); + } + if (--nevs == 0) + break; + } + } + + if (nentries) + incr_entries(nentries); + + return nentries; +} + +static int handle_pfds_entries(struct tracer *tp, int nevs, int force_read) +{ + int i, nentries = 0; + struct trace_buf *tbp; + struct pollfd *pfd = tp->pfds; + struct io_info *iop = tp->ios; + + tbp = alloc_trace_buf(tp->cpu, buf_size); + for (i = 0; i < ndevs; i++, pfd++, iop++) { + if (pfd->revents & POLLIN || force_read) { + tbp->len = read(iop->ifd, tbp->buf, buf_size); + if (tbp->len > 0) { + pdc_dr_update(iop->dpp, tp->cpu, tbp->len); + add_trace_buf(iop->dpp, tp->cpu, &tbp); + nentries++; + } else if (tbp->len == 0) { + /* + * Short reads after we're done stop us + * from trying reads. + */ + if (tp->is_done) + clear_events(pfd); + } else { + read_err(tp->cpu, iop->ifn); + if (errno != EAGAIN || tp->is_done) + clear_events(pfd); + } + if (!piped_output && --nevs == 0) + break; + } + } + free(tbp); + + if (nentries) + incr_entries(nentries); + + return nentries; +} + +static void *thread_main(void *arg) +{ + int ret, ndone, to_val; + struct tracer *tp = arg; + + ret = lock_on_cpu(tp->cpu); + if (ret) + goto err; + + ret = open_ios(tp); + if (ret) + goto err; + + if (piped_output) + to_val = 50; /* Frequent partial handles */ + else + to_val = 500; /* 1/2 second intervals */ + + + tracer_signal_ready(tp, Th_running, 0); + tracer_wait_unblock(tp); + + while (!tp->is_done) { + ndone = poll(tp->pfds, ndevs, to_val); + if (ndone || piped_output) + (void)handle_pfds(tp, ndone, piped_output); + else if (ndone < 0 && errno != EINTR) + fprintf(stderr, "Thread %d poll failed: %d/%s\n", + tp->cpu, errno, strerror(errno)); + } + + /* + * Trace is stopped, pull data until we get a short read + */ + while (handle_pfds(tp, ndevs, 1) > 0) + ; + + close_ios(tp); + tracer_signal_ready(tp, Th_leaving, 0); + return NULL; + +err: + tracer_signal_ready(tp, Th_error, ret); + return NULL; +} + +static int start_tracer(int cpu) +{ + struct tracer *tp; + + tp = malloc(sizeof(*tp)); + memset(tp, 0, sizeof(*tp)); + + INIT_LIST_HEAD(&tp->head); + tp->status = 0; + tp->cpu = cpu; + + if (pthread_create(&tp->thread, NULL, thread_main, tp)) { + fprintf(stderr, "FAILED to start thread on CPU %d: %d/%s\n", + cpu, errno, strerror(errno)); + free(tp); + return 1; + } + + list_add_tail(&tp->head, &tracers); + return 0; +} + +static void start_tracers(void) +{ + int cpu; + struct list_head *p; + + for (cpu = 0; cpu < ncpus; cpu++) + if (start_tracer(cpu)) + break; + + wait_tracers_ready(cpu); + + __list_for_each(p, &tracers) { + struct tracer *tp = list_entry(p, struct tracer, head); + if (tp->status) + fprintf(stderr, + "FAILED to start thread on CPU %d: %d/%s\n", + tp->cpu, tp->status, strerror(tp->status)); + } +} + +static void stop_tracers(void) +{ + struct list_head *p; + + /* + * Stop the tracing - makes the tracer threads clean up quicker. + */ + __list_for_each(p, &devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + (void)ioctl(dpp->fd, BLKTRACESTOP); + } + + /* + * Tell each tracer to quit + */ + __list_for_each(p, &tracers) { + struct tracer *tp = list_entry(p, struct tracer, head); + tp->is_done = 1; + } +} + +static void del_tracers(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &tracers) { + struct tracer *tp = list_entry(p, struct tracer, head); + + list_del(&tp->head); + free(tp); + } +} + +static void wait_tracers(void) +{ + struct list_head *p; + + if (use_tracer_devpaths()) + process_trace_bufs(); + + wait_tracers_leaving(); + + __list_for_each(p, &tracers) { + int ret; + struct tracer *tp = list_entry(p, struct tracer, head); + + ret = pthread_join(tp->thread, NULL); + if (ret) + fprintf(stderr, "Thread join %d failed %d\n", + tp->cpu, ret); + } + + if (use_tracer_devpaths()) + clean_trace_bufs(); + + get_all_drops(); +} + +static void exit_tracing(void) +{ + signal(SIGINT, SIG_IGN); + signal(SIGHUP, SIG_IGN); + signal(SIGTERM, SIG_IGN); + signal(SIGALRM, SIG_IGN); + + stop_tracers(); + wait_tracers(); + del_tracers(); + rel_devpaths(); +} + +static void handle_sigint(__attribute__((__unused__)) int sig) +{ + done = 1; + stop_tracers(); +} + +static void show_stats(struct list_head *devpaths) +{ + FILE *ofp; + struct list_head *p; + unsigned long long nevents, data_read; + unsigned long long total_drops = 0; + unsigned long long total_events = 0; + + if (piped_output) + ofp = my_fopen("/dev/null", "w"); + else + ofp = stdout; + + __list_for_each(p, devpaths) { + int cpu; + struct pdc_stats *sp; + struct devpath *dpp = list_entry(p, struct devpath, head); + + if (net_mode == Net_server) + printf("server: end of run for %s:%s\n", + dpp->ch->hostname, dpp->buts_name); + + data_read = 0; + nevents = 0; + + fprintf(ofp, "=== %s ===\n", dpp->buts_name); + for (cpu = 0, sp = dpp->stats; cpu < dpp->ncpus; cpu++, sp++) { + /* + * Estimate events if not known... + */ + if (sp->nevents == 0) { + sp->nevents = sp->data_read / + sizeof(struct blk_io_trace); + } + + fprintf(ofp, + " CPU%3d: %20llu events, %8llu KiB data\n", + cpu, sp->nevents, (sp->data_read + 1023) >> 10); + + data_read += sp->data_read; + nevents += sp->nevents; + } + + fprintf(ofp, " Total: %20llu events (dropped %llu)," + " %8llu KiB data\n", nevents, + dpp->drops, (data_read + 1024) >> 10); + + total_drops += dpp->drops; + total_events += (nevents + dpp->drops); + } + + fflush(ofp); + if (piped_output) + fclose(ofp); + + if (total_drops) { + double drops_ratio = 1.0; + + if (total_events) + drops_ratio = (double)total_drops/(double)total_events; + + fprintf(stderr, "\nYou have %llu (%5.1lf%%) dropped events\n" + "Consider using a larger buffer size (-b) " + "and/or more buffers (-n)\n", + total_drops, 100.0 * drops_ratio); + } +} + +static int handle_args(int argc, char *argv[]) +{ + int c, i; + struct statfs st; + int act_mask_tmp = 0; + + while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) >= 0) { + switch (c) { + case 'a': + i = find_mask_map(optarg); + if (i < 0) { + fprintf(stderr, "Invalid action mask %s\n", + optarg); + return 1; + } + act_mask_tmp |= i; + break; + + case 'A': + if ((sscanf(optarg, "%x", &i) != 1) || + !valid_act_opt(i)) { + fprintf(stderr, + "Invalid set action mask %s/0x%x\n", + optarg, i); + return 1; + } + act_mask_tmp = i; + break; + + case 'd': + if (add_devpath(optarg) != 0) + return 1; + break; + + case 'I': { + char dev_line[256]; + FILE *ifp = my_fopen(optarg, "r"); + + if (!ifp) { + fprintf(stderr, + "Invalid file for devices %s\n", + optarg); + return 1; + } + + while (fscanf(ifp, "%s\n", dev_line) == 1) + if (add_devpath(dev_line) != 0) + return 1; + break; + } + + case 'r': + debugfs_path = optarg; + break; + + case 'o': + output_name = optarg; + break; + case 'k': + kill_running_trace = 1; + break; + case 'w': + stop_watch = atoi(optarg); + if (stop_watch <= 0) { + fprintf(stderr, + "Invalid stopwatch value (%d secs)\n", + stop_watch); + return 1; + } + break; + case 'V': + case 'v': + printf("%s version %s\n", argv[0], blktrace_version); + exit(0); + /*NOTREACHED*/ + case 'b': + buf_size = strtoul(optarg, NULL, 10); + if (buf_size <= 0 || buf_size > 16*1024) { + fprintf(stderr, "Invalid buffer size (%lu)\n", + buf_size); + return 1; + } + buf_size <<= 10; + break; + case 'n': + buf_nr = strtoul(optarg, NULL, 10); + if (buf_nr <= 0) { + fprintf(stderr, + "Invalid buffer nr (%lu)\n", buf_nr); + return 1; + } + break; + case 'D': + output_dir = optarg; + break; + case 'h': + net_mode = Net_client; + strcpy(hostname, optarg); + break; + case 'l': + net_mode = Net_server; + break; + case 'p': + net_port = atoi(optarg); + break; + case 's': + net_use_sendfile = 0; + break; + default: + show_usage(argv[0]); + exit(1); + /*NOTREACHED*/ + } + } + + while (optind < argc) + if (add_devpath(argv[optind++]) != 0) + return 1; + + if (net_mode != Net_server && ndevs == 0) { + show_usage(argv[0]); + return 1; + } + + if (statfs(debugfs_path, &st) < 0 || st.f_type != (long)DEBUGFS_TYPE) { + fprintf(stderr, "Invalid debug path %s: %d/%s\n", + debugfs_path, errno, strerror(errno)); + return 1; + } + + if (act_mask_tmp != 0) + act_mask = act_mask_tmp; + + if (net_mode == Net_client && net_setup_addr()) + return 1; + + /* + * Set up for appropriate PFD handler based upon output name. + */ + if (net_client_use_sendfile()) + handle_pfds = handle_pfds_netclient; + else if (net_client_use_send()) + handle_pfds = handle_pfds_entries; + else if (output_name && (strcmp(output_name, "-") == 0)) { + piped_output = 1; + handle_pfds = handle_pfds_entries; + pfp = stdout; + setvbuf(pfp, NULL, _IONBF, 0); + } else + handle_pfds = handle_pfds_file; + return 0; +} + +static void ch_add_connection(struct net_server_s *ns, struct cl_host *ch, + int fd) +{ + struct cl_conn *nc; + + nc = malloc(sizeof(*nc)); + memset(nc, 0, sizeof(*nc)); + + time(&nc->connect_time); + nc->ch = ch; + nc->fd = fd; + nc->ncpus = -1; + + list_add_tail(&nc->ch_head, &ch->conn_list); + ch->connects++; + + list_add_tail(&nc->ns_head, &ns->conn_list); + ns->connects++; + ns->pfds = realloc(ns->pfds, (ns->connects+1) * sizeof(struct pollfd)); +} + +static void ch_rem_connection(struct net_server_s *ns, struct cl_host *ch, + struct cl_conn *nc) +{ + net_close_connection(&nc->fd); + + list_del(&nc->ch_head); + ch->connects--; + + list_del(&nc->ns_head); + ns->connects--; + ns->pfds = realloc(ns->pfds, (ns->connects+1) * sizeof(struct pollfd)); + + free(nc); +} + +static struct cl_host *net_find_client_host(struct net_server_s *ns, + struct in_addr cl_in_addr) +{ + struct list_head *p; + + __list_for_each(p, &ns->ch_list) { + struct cl_host *ch = list_entry(p, struct cl_host, head); + + if (in_addr_eq(ch->cl_in_addr, cl_in_addr)) + return ch; + } + + return NULL; +} + +static struct cl_host *net_add_client_host(struct net_server_s *ns, + struct sockaddr_in *addr) +{ + struct cl_host *ch; + + ch = malloc(sizeof(*ch)); + memset(ch, 0, sizeof(*ch)); + + ch->ns = ns; + ch->cl_in_addr = addr->sin_addr; + list_add_tail(&ch->head, &ns->ch_list); + ns->nchs++; + + ch->hostname = strdup(inet_ntoa(addr->sin_addr)); + printf("server: connection from %s\n", ch->hostname); + + INIT_LIST_HEAD(&ch->conn_list); + INIT_LIST_HEAD(&ch->devpaths); + + return ch; +} + +static void device_done(struct devpath *dpp, int ncpus) +{ + int cpu; + struct io_info *iop; + + for (cpu = 0, iop = dpp->ios; cpu < ncpus; cpu++, iop++) + close_iop(iop); + + list_del(&dpp->head); + dpp_free(dpp); +} + +static void net_ch_remove(struct cl_host *ch, int ncpus) +{ + struct list_head *p, *q; + struct net_server_s *ns = ch->ns; + + list_for_each_safe(p, q, &ch->devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + device_done(dpp, ncpus); + } + + list_for_each_safe(p, q, &ch->conn_list) { + struct cl_conn *nc = list_entry(p, struct cl_conn, ch_head); + + ch_rem_connection(ns, ch, nc); + } + + list_del(&ch->head); + ns->nchs--; + + if (ch->hostname) + free(ch->hostname); + free(ch); +} + +static void net_add_connection(struct net_server_s *ns) +{ + int fd; + struct cl_host *ch; + socklen_t socklen = sizeof(ns->addr); + + fd = my_accept(ns->listen_fd, (struct sockaddr *)&ns->addr, &socklen); + if (fd < 0) { + /* + * This is OK: we just won't accept this connection, + * nothing fatal. + */ + perror("accept"); + } else { + ch = net_find_client_host(ns, ns->addr.sin_addr); + if (!ch) + ch = net_add_client_host(ns, &ns->addr); + + ch_add_connection(ns, ch, fd); + } +} + +static struct devpath *nc_add_dpp(struct cl_conn *nc, + struct blktrace_net_hdr *bnh, + time_t connect_time) +{ + int cpu; + struct io_info *iop; + struct devpath *dpp; + + dpp = malloc(sizeof(*dpp)); + memset(dpp, 0, sizeof(*dpp)); + + dpp->buts_name = strdup(bnh->buts_name); + dpp->path = strdup(bnh->buts_name); + dpp->fd = -1; + dpp->ch = nc->ch; + dpp->cl_id = bnh->cl_id; + dpp->cl_connect_time = connect_time; + dpp->ncpus = nc->ncpus; + dpp->stats = calloc(dpp->ncpus, sizeof(*dpp->stats)); + memset(dpp->stats, 0, dpp->ncpus * sizeof(*dpp->stats)); + + list_add_tail(&dpp->head, &nc->ch->devpaths); + nc->ch->ndevs++; + + dpp->ios = calloc(nc->ncpus, sizeof(*iop)); + memset(dpp->ios, 0, ndevs * sizeof(*iop)); + + for (cpu = 0, iop = dpp->ios; cpu < nc->ncpus; cpu++, iop++) { + iop->dpp = dpp; + iop->nc = nc; + init_mmap_info(&iop->mmap_info); + + if (iop_open(iop, cpu)) + goto err; + } + + return dpp; + +err: + /* + * Need to unravel what's been done... + */ + while (cpu >= 0) + close_iop(&dpp->ios[cpu--]); + dpp_free(dpp); + + return NULL; +} + +static struct devpath *nc_find_dpp(struct cl_conn *nc, + struct blktrace_net_hdr *bnh) +{ + struct list_head *p; + time_t connect_time = nc->connect_time; + + __list_for_each(p, &nc->ch->devpaths) { + struct devpath *dpp = list_entry(p, struct devpath, head); + + if (!strcmp(dpp->buts_name, bnh->buts_name)) + return dpp; + + if (dpp->cl_id == bnh->cl_id) + connect_time = dpp->cl_connect_time; + } + + return nc_add_dpp(nc, bnh, connect_time); +} + +static void net_client_read_data(struct cl_conn *nc, struct devpath *dpp, + struct blktrace_net_hdr *bnh) +{ + int ret; + struct io_info *iop = &dpp->ios[bnh->cpu]; + struct mmap_info *mip = &iop->mmap_info; + + if (setup_mmap(iop->ofd, bnh->len, &iop->mmap_info)) { + fprintf(stderr, "ncd(%s:%d): mmap failed\n", + nc->ch->hostname, nc->fd); + exit(1); + } + + ret = net_recv_data(nc->fd, mip->fs_buf + mip->fs_off, bnh->len); + if (ret > 0) { + pdc_dr_update(dpp, bnh->cpu, ret); + mip->fs_size += ret; + mip->fs_off += ret; + } else if (ret < 0) + exit(1); +} + +/* + * Returns 1 if we closed a host - invalidates other polling information + * that may be present. + */ +static int net_client_data(struct cl_conn *nc) +{ + int ret; + struct devpath *dpp; + struct blktrace_net_hdr bnh; + + ret = net_get_header(nc, &bnh); + if (ret == 0) + return 0; + + if (ret < 0) { + fprintf(stderr, "ncd(%d): header read failed\n", nc->fd); + exit(1); + } + + if (data_is_native == -1 && check_data_endianness(bnh.magic)) { + fprintf(stderr, "ncd(%d): received data is bad\n", nc->fd); + exit(1); + } + + if (!data_is_native) { + bnh.magic = be32_to_cpu(bnh.magic); + bnh.cpu = be32_to_cpu(bnh.cpu); + bnh.max_cpus = be32_to_cpu(bnh.max_cpus); + bnh.len = be32_to_cpu(bnh.len); + bnh.cl_id = be32_to_cpu(bnh.cl_id); + bnh.buf_size = be32_to_cpu(bnh.buf_size); + bnh.buf_nr = be32_to_cpu(bnh.buf_nr); + bnh.page_size = be32_to_cpu(bnh.page_size); + } + + if ((bnh.magic & 0xffffff00) != BLK_IO_TRACE_MAGIC) { + fprintf(stderr, "ncd(%s:%d): bad data magic\n", + nc->ch->hostname, nc->fd); + exit(1); + } + + if (nc->ncpus == -1) + nc->ncpus = bnh.max_cpus; + + /* + * len == 0 means the other end is sending us a new connection/dpp + * len == 1 means that the other end signalled end-of-run + */ + dpp = nc_find_dpp(nc, &bnh); + if (bnh.len == 0) { + /* + * Just adding in the dpp above is enough + */ + ack_open_close(nc->fd, dpp->buts_name); + nc->ch->cl_opens++; + } else if (bnh.len == 1) { + /* + * overload cpu count with dropped events + */ + dpp->drops = bnh.cpu; + + ack_open_close(nc->fd, dpp->buts_name); + if (--nc->ch->cl_opens == 0) { + show_stats(&nc->ch->devpaths); + net_ch_remove(nc->ch, nc->ncpus); + return 1; + } + } else + net_client_read_data(nc, dpp, &bnh); + + return 0; +} + +static void handle_client_data(struct net_server_s *ns, int events) +{ + struct cl_conn *nc; + struct pollfd *pfd; + struct list_head *p, *q; + + pfd = &ns->pfds[1]; + list_for_each_safe(p, q, &ns->conn_list) { + if (pfd->revents & POLLIN) { + nc = list_entry(p, struct cl_conn, ns_head); + + if (net_client_data(nc) || --events == 0) + break; + } + pfd++; + } +} + +static void net_setup_pfds(struct net_server_s *ns) +{ + struct pollfd *pfd; + struct list_head *p; + + ns->pfds[0].fd = ns->listen_fd; + ns->pfds[0].events = POLLIN; + + pfd = &ns->pfds[1]; + __list_for_each(p, &ns->conn_list) { + struct cl_conn *nc = list_entry(p, struct cl_conn, ns_head); + + pfd->fd = nc->fd; + pfd->events = POLLIN; + pfd++; + } +} + +static int net_server_handle_connections(struct net_server_s *ns) +{ + int events; + + printf("server: waiting for connections...\n"); + + while (!done) { + net_setup_pfds(ns); + events = poll(ns->pfds, ns->connects + 1, -1); + if (events < 0) { + if (errno != EINTR) { + perror("FATAL: poll error"); + return 1; + } + } else if (events > 0) { + if (ns->pfds[0].revents & POLLIN) { + net_add_connection(ns); + events--; + } + + if (events) + handle_client_data(ns, events); + } + } + + return 0; +} + +static int net_server(void) +{ + int fd, opt; + int ret = 1; + struct net_server_s net_server; + struct net_server_s *ns = &net_server; + + memset(ns, 0, sizeof(*ns)); + INIT_LIST_HEAD(&ns->ch_list); + INIT_LIST_HEAD(&ns->conn_list); + ns->pfds = malloc(sizeof(struct pollfd)); + + fd = my_socket(AF_INET, SOCK_STREAM, 0); + if (fd < 0) { + perror("server: socket"); + goto out; + } + + opt = 1; + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { + perror("setsockopt"); + goto out; + } + + memset(&ns->addr, 0, sizeof(ns->addr)); + ns->addr.sin_family = AF_INET; + ns->addr.sin_addr.s_addr = htonl(INADDR_ANY); + ns->addr.sin_port = htons(net_port); + + if (bind(fd, (struct sockaddr *) &ns->addr, sizeof(ns->addr)) < 0) { + perror("bind"); + goto out; + } + + if (listen(fd, 1) < 0) { + perror("listen"); + goto out; + } + + /* + * The actual server looping is done here: + */ + ns->listen_fd = fd; + ret = net_server_handle_connections(ns); + + /* + * Clean up and return... + */ +out: + free(ns->pfds); + return ret; +} + +static int run_tracers(void) +{ + atexit(exit_tracing); + if (net_mode == Net_client) + printf("blktrace: connecting to %s\n", hostname); + + setup_buts(); + + if (use_tracer_devpaths()) { + if (setup_tracer_devpaths()) + return 1; + + if (piped_output) + handle_list = handle_list_file; + else + handle_list = handle_list_net; + } + + start_tracers(); + if (nthreads_running == ncpus) { + unblock_tracers(); + start_buts(); + if (net_mode == Net_client) + printf("blktrace: connected!\n"); + if (stop_watch) + alarm(stop_watch); + } else + stop_tracers(); + + wait_tracers(); + if (nthreads_running == ncpus) + show_stats(&devpaths); + if (net_client_use_send()) + close_client_connections(); + del_tracers(); + + return 0; +} + +int main(int argc, char *argv[]) +{ + int ret = 0; + + setlocale(LC_NUMERIC, "en_US"); + pagesize = getpagesize(); + ncpus = sysconf(_SC_NPROCESSORS_ONLN); + if (ncpus < 0) { + fprintf(stderr, "sysconf(_SC_NPROCESSORS_ONLN) failed %d/%s\n", + errno, strerror(errno)); + ret = 1; + goto out; + } else if (handle_args(argc, argv)) { + ret = 1; + goto out; + } + + signal(SIGINT, handle_sigint); + signal(SIGHUP, handle_sigint); + signal(SIGTERM, handle_sigint); + signal(SIGALRM, handle_sigint); + signal(SIGPIPE, SIG_IGN); + + if (kill_running_trace) { + struct devpath *dpp; + struct list_head *p; + + __list_for_each(p, &devpaths) { + dpp = list_entry(p, struct devpath, head); + if (__stop_trace(dpp->fd)) { + fprintf(stderr, + "BLKTRACETEARDOWN %s failed: %d/%s\n", + dpp->path, errno, strerror(errno)); + } + } + } else if (net_mode == Net_server) { + if (output_name) { + fprintf(stderr, "-o ignored in server mode\n"); + output_name = NULL; + } + ret = net_server(); + } else + ret = run_tracers(); + +out: + if (pfp) + fclose(pfp); + rel_devpaths(); + return ret; +} diff --git a/blktrace.h b/blktrace.h new file mode 100644 index 0000000..8f33682 --- /dev/null +++ b/blktrace.h @@ -0,0 +1,149 @@ +#ifndef BLKTRACE_H +#define BLKTRACE_H + +#include <stdio.h> +#include <byteswap.h> +#include <endian.h> + +#include "blktrace_api.h" +#include "rbtree.h" + +#define MINORBITS 20 +#define MINORMASK ((1U << MINORBITS) - 1) +#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) +#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) + +#define SECONDS(x) ((unsigned long long)(x) / 1000000000) +#define NANO_SECONDS(x) ((unsigned long long)(x) % 1000000000) +#define DOUBLE_TO_NANO_ULL(d) ((unsigned long long)((d) * 1000000000)) + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +#define t_sec(t) ((t)->bytes >> 9) +#define t_kb(t) ((t)->bytes >> 10) + +typedef __u32 u32; +typedef __u8 u8; + +struct io_stats { + unsigned long qreads, qwrites, creads, cwrites, mreads, mwrites; + unsigned long ireads, iwrites, rrqueue, wrqueue; + unsigned long long qread_kb, qwrite_kb, cread_kb, cwrite_kb; + unsigned long long iread_kb, iwrite_kb; + unsigned long long mread_kb, mwrite_kb; + unsigned long qreads_pc, qwrites_pc, ireads_pc, iwrites_pc; + unsigned long rrqueue_pc, wrqueue_pc, creads_pc, cwrites_pc; + unsigned long long qread_kb_pc, qwrite_kb_pc, iread_kb_pc, iwrite_kb_pc; + unsigned long io_unplugs, timer_unplugs; +}; + +struct per_cpu_info { + unsigned int cpu; + unsigned int nelems; + + int fd; + int fdblock; + char fname[128]; + + struct io_stats io_stats; + + struct rb_root rb_last; + unsigned long rb_last_entries; + unsigned long last_sequence; + unsigned long smallest_seq_read; + + struct skip_info *skips_head; + struct skip_info *skips_tail; +}; + +extern FILE *ofp; +extern int data_is_native; +extern struct timespec abs_start_time; + +#define CHECK_MAGIC(t) (((t)->magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) +#define SUPPORTED_VERSION (0x07) + +#define __bswap_16 bswap_16 +#define __bswap_32 bswap_32 +#define __bswap_64 bswap_64 + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define be16_to_cpu(x) __bswap_16(x) +#define be32_to_cpu(x) __bswap_32(x) +#define be64_to_cpu(x) __bswap_64(x) +#define cpu_to_be16(x) __bswap_16(x) +#define cpu_to_be32(x) __bswap_32(x) +#define cpu_to_be64(x) __bswap_64(x) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define be16_to_cpu(x) (x) +#define be32_to_cpu(x) (x) +#define be64_to_cpu(x) (x) +#define cpu_to_be16(x) (x) +#define cpu_to_be32(x) (x) +#define cpu_to_be64(x) (x) +#else +#error "Bad arch" +#endif + +static inline int verify_trace(struct blk_io_trace *t) +{ + if (!CHECK_MAGIC(t)) { + fprintf(stderr, "bad trace magic %x\n", t->magic); + return 1; + } + if ((t->magic & 0xff) != SUPPORTED_VERSION) { + fprintf(stderr, "unsupported trace version %x\n", + t->magic & 0xff); + return 1; + } + + return 0; +} + +static inline void trace_to_cpu(struct blk_io_trace *t) +{ + if (data_is_native) + return; + + t->magic = be32_to_cpu(t->magic); + t->sequence = be32_to_cpu(t->sequence); + t->time = be64_to_cpu(t->time); + t->sector = be64_to_cpu(t->sector); + t->bytes = be32_to_cpu(t->bytes); + t->action = be32_to_cpu(t->action); + t->pid = be32_to_cpu(t->pid); + t->device = be32_to_cpu(t->device); + t->cpu = be16_to_cpu(t->cpu); + t->error = be16_to_cpu(t->error); + t->pdu_len = be16_to_cpu(t->pdu_len); +} + +/* + * check whether data is native or not + */ +static inline int check_data_endianness(u32 magic) +{ + if ((magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) { + data_is_native = 1; + return 0; + } + + magic = __bswap_32(magic); + if ((magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) { + data_is_native = 0; + return 0; + } + + return 1; +} + +extern void set_all_format_specs(char *); +extern int add_format_spec(char *); +extern void process_fmt(char *, struct per_cpu_info *, struct blk_io_trace *, + unsigned long long, int, unsigned char *); +extern int valid_act_opt(int); +extern int find_mask_map(char *); +extern char *find_process_name(pid_t); + +#endif diff --git a/blktrace_api.h b/blktrace_api.h new file mode 100644 index 0000000..ba9ee60 --- /dev/null +++ b/blktrace_api.h @@ -0,0 +1,136 @@ +#ifndef BLKTRACEAPI_H +#define BLKTRACEAPI_H + +#include <asm/types.h> + +/* + * Trace categories + */ +enum { + BLK_TC_READ = 1 << 0, /* reads */ + BLK_TC_WRITE = 1 << 1, /* writes */ + BLK_TC_BARRIER = 1 << 2, /* barrier */ + BLK_TC_SYNC = 1 << 3, /* sync */ + BLK_TC_QUEUE = 1 << 4, /* queueing/merging */ + BLK_TC_REQUEUE = 1 << 5, /* requeueing */ + BLK_TC_ISSUE = 1 << 6, /* issue */ + BLK_TC_COMPLETE = 1 << 7, /* completions */ + BLK_TC_FS = 1 << 8, /* fs requests */ + BLK_TC_PC = 1 << 9, /* pc requests */ + BLK_TC_NOTIFY = 1 << 10, /* special message */ + BLK_TC_AHEAD = 1 << 11, /* readahead */ + BLK_TC_META = 1 << 12, /* metadata */ + BLK_TC_DISCARD = 1 << 13, /* discard requests */ + BLK_TC_DRV_DATA = 1 << 14, /* binary driver data */ + + BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ +}; + +#define BLK_TC_SHIFT (16) +#define BLK_TC_ACT(act) ((act) << BLK_TC_SHIFT) + +/* + * Basic trace actions + */ +enum { + __BLK_TA_QUEUE = 1, /* queued */ + __BLK_TA_BACKMERGE, /* back merged to existing rq */ + __BLK_TA_FRONTMERGE, /* front merge to existing rq */ + __BLK_TA_GETRQ, /* allocated new request */ + __BLK_TA_SLEEPRQ, /* sleeping on rq allocation */ + __BLK_TA_REQUEUE, /* request requeued */ + __BLK_TA_ISSUE, /* sent to driver */ + __BLK_TA_COMPLETE, /* completed by driver */ + __BLK_TA_PLUG, /* queue was plugged */ + __BLK_TA_UNPLUG_IO, /* queue was unplugged by io */ + __BLK_TA_UNPLUG_TIMER, /* queue was unplugged by timer */ + __BLK_TA_INSERT, /* insert request */ + __BLK_TA_SPLIT, /* bio was split */ + __BLK_TA_BOUNCE, /* bio was bounced */ + __BLK_TA_REMAP, /* bio was remapped */ + __BLK_TA_ABORT, /* request aborted */ + __BLK_TA_DRV_DATA, /* binary driver data */ +}; + +/* + * Notify events. + */ +enum blktrace_notify { + __BLK_TN_PROCESS = 0, /* establish pid/name mapping */ + __BLK_TN_TIMESTAMP, /* include system clock */ + __BLK_TN_MESSAGE, /* Character string message */ +}; + +/* + * Trace actions in full. Additionally, read or write is masked + */ +#define BLK_TA_QUEUE (__BLK_TA_QUEUE | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_BACKMERGE (__BLK_TA_BACKMERGE | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_FRONTMERGE (__BLK_TA_FRONTMERGE | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_GETRQ (__BLK_TA_GETRQ | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_SLEEPRQ (__BLK_TA_SLEEPRQ | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_REQUEUE (__BLK_TA_REQUEUE | BLK_TC_ACT(BLK_TC_REQUEUE)) +#define BLK_TA_ISSUE (__BLK_TA_ISSUE | BLK_TC_ACT(BLK_TC_ISSUE)) +#define BLK_TA_COMPLETE (__BLK_TA_COMPLETE| BLK_TC_ACT(BLK_TC_COMPLETE)) +#define BLK_TA_PLUG (__BLK_TA_PLUG | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_UNPLUG_IO (__BLK_TA_UNPLUG_IO | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_UNPLUG_TIMER (__BLK_TA_UNPLUG_TIMER | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_INSERT (__BLK_TA_INSERT | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_SPLIT (__BLK_TA_SPLIT) +#define BLK_TA_BOUNCE (__BLK_TA_BOUNCE) +#define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE)) +#define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA)) + +#define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) +#define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY)) +#define BLK_TN_MESSAGE (__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY)) + +#define BLK_IO_TRACE_MAGIC 0x65617400 +#define BLK_IO_TRACE_VERSION 0x07 + +/* + * The trace itself + */ +struct blk_io_trace { + __u32 magic; /* MAGIC << 8 | version */ + __u32 sequence; /* event number */ + __u64 time; /* in nanoseconds */ + __u64 sector; /* disk offset */ + __u32 bytes; /* transfer length */ + __u32 action; /* what happened */ + __u32 pid; /* who did it */ + __u32 device; /* device identifier (dev_t) */ + __u32 cpu; /* on what cpu did it happen */ + __u16 error; /* completion error */ + __u16 pdu_len; /* length of data after this trace */ +}; + +/* + * The remap event + */ +struct blk_io_trace_remap { + __u32 device_from; + __u32 device_to; + __u64 sector_from; +}; + +/* + * User setup structure passed with BLKSTARTTRACE + */ +struct blk_user_trace_setup { + char name[32]; /* output */ + __u16 act_mask; /* input */ + __u32 buf_size; /* input */ + __u32 buf_nr; /* input */ + __u64 start_lba; + __u64 end_lba; + __u32 pid; +}; + +#define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup) +#define BLKTRACESTART _IO(0x12,116) +#define BLKTRACESTOP _IO(0x12,117) +#define BLKTRACETEARDOWN _IO(0x12,118) + +#endif @@ -0,0 +1,38 @@ +#!/bin/sh +# Copyright (c) 2005 Silicon Graphics, Inc. +# All rights reserved. +# +# Nathan Scott <nathans@sgi.com> +# 14 Sep 2005 Initial version +# + +TRACEOPTS="" +PARSEOPTS="-b100000" +USAGE="Usage: btrace [-s] [-t] [-w N] [-n N] [-b N] [-a <trace>...] [-r <dbg mnt>] <dev>..." +DIRNAME=`dirname $0` + +while getopts "a:w:n:b:r:sthv" c +do + case $c in + a) TRACEOPTS=$TRACEOPTS" -a "$OPTARG" ";; + w) TRACEOPTS=$TRACEOPTS" -w "$OPTARG" ";; + n) TRACEOPTS=$TRACEOPTS" -n "$OPTARG" ";; + b) TRACEOPTS=$TRACEOPTS" -b "$OPTARG" ";; + r) TRACEOPTS=$TRACEOPTS" -r "$OPTARG" ";; + s) PARSEOPTS=$PARSEOPTS" -s";; + t) PARSEOPTS=$PARSEOPTS" -t";; + h) PARSEOPTS=$PARSEOPTS" -h";; + v) PARSEOPTS=$PARSEOPTS" -v";; + \?) echo $USAGE 1>&2 + exit 2 + ;; + esac +done + +shift `expr $OPTIND - 1` +if [ $# -eq 0 ]; then + echo $USAGE 1>&2 + exit 2 +fi + +${DIRNAME}/blktrace ${TRACEOPTS} -o- $@ | ${DIRNAME}/blkparse ${PARSEOPTS} -i- diff --git a/btrace.spec b/btrace.spec new file mode 100644 index 0000000..90f88d8 --- /dev/null +++ b/btrace.spec @@ -0,0 +1,55 @@ +# +# spec file for package btrace (Version 1.0) +# +# Copyright (c) 2005 SUSE LINUX Products GmbH, Nuernberg, Germany. +# This file and all modifications and additions to the pristine +# package are under the same license as the package itself. +# +# Please submit bugfixes or comments via http://www.suse.de/feedback/ +# + +# norootforbuild +# neededforbuild tetex te_latex gcc + +Name: btrace +License: GPL +Group: foo +Version: 1.0 +Release: 1 +URL: http://brick.kernel.dk/snaps +Summary: Block IO tracer +Source0: %name-%version.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +btrace can show detailed info about what is happening on a block +device io queue. This is valuable for diagnosing and fixing +performance or application problems relating to block layer io. + + +Authors: +-------- + Jens Axboe <axboe@kernel.dk> + +%prep +%setup -q + +%build +make CFLAGS="$RPM_OPT_FLAGS" all docs + +%install +rm -rf $RPM_BUILD_ROOT +make dest=$RPM_BUILD_ROOT prefix=$RPM_BUILD_ROOT/%{_prefix} install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +%doc README doc/blktrace.pdf +/usr/bin/* +/usr/man/* + +%changelog -n btrace +* Mon Oct 10 2005 - axboe@suse.de +- Initial version diff --git a/btreplay/Makefile b/btreplay/Makefile new file mode 100644 index 0000000..d027afb --- /dev/null +++ b/btreplay/Makefile @@ -0,0 +1,45 @@ +# +# OCFLAGS: +# COUNT_IOS - Counts struct io's left at end +# DEBUG - Various and sundy debug asserts +# NDEBUG - Defined: no asserts, Undefined: asserts +# + +CC = gcc +CFLAGS = -Wall -W -O2 -g +INCS = -I. -I.. -I../btt +OCFLAGS = -UCOUNT_IOS -UDEBUG -DNDEBUG +XCFLAGS = -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +override CFLAGS += $(INCS) $(XCFLAGS) $(OCFLAGS) + +PROGS = btrecord btreplay +LIBS = -laio -lrt + +all: depend $(PROGS) + +$(PROGS): | depend + +docs: + $(MAKE) -C doc all + +docsclean: + $(MAKE) -C doc clean + +clean: docsclean + -rm -f *.o $(PROGS) .depend + +%.o: %.c + $(CC) $(CFLAGS) -c -o $*.o $< + +btrecord: btrecord.o + $(CC) $(CFLAGS) -o $@ $(filter %.o,$^) + +btreplay: btreplay.o + $(CC) $(CFLAGS) -o $@ $(filter %.o,$^) $(LIBS) + +depend: + @$(CC) -MM $(CFLAGS) *.c 1> .depend + +ifneq ($(wildcard .depend),) +include .depend +endif diff --git a/btreplay/btrecord.c b/btreplay/btrecord.c new file mode 100644 index 0000000..88ab806 --- /dev/null +++ b/btreplay/btrecord.c @@ -0,0 +1,789 @@ +/* + * Blktrace record utility - Convert binary trace data into bunches of IOs + * + * Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +static char build_date[] = __DATE__ " at "__TIME__; + +#include <assert.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <dirent.h> +#include <stdarg.h> + +#if !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif +#include <getopt.h> + +#include "list.h" +#include "btrecord.h" +#include "blktrace.h" + +/* + * Per input file information + * + * @head: Used to link up on input_files + * @devnm: Device name portion of this input file + * @file_name: Fully qualified name for this input file + * @cpu: CPU that this file was collected on + * @ifd: Input file descriptor (when opened) + * @tpkts: Total number of packets processed. + */ +struct ifile_info { + struct list_head head; + char *devnm, *file_name; + int cpu, ifd; + __u64 tpkts, genesis; +}; + +/* + * Per IO trace information + * + * @time: Time stamp when trace was emitted + * @sector: IO sector identifier + * @bytes: Number of bytes transferred + * @rw: Read (1) or write (0) + */ +struct io_spec { + __u64 time; + __u64 sector; + __u32 bytes; + int rw; +}; + +/* + * Per output file information + * + * @ofp: Output file + * @vfp: Verbose output file + * @file_name: Fully qualified name for this file + * @vfn: Fully qualified name for this file + * @cur: Current IO bunch being collected + * @iip: Input file this is associated with + * @start_time: Start time of th ecurrent bunch + * @last_time: Time of last packet put in + * @bunches: Number of bunches processed + * @pkts: Number of packets stored in bunches + */ +struct io_stream { + FILE *ofp, *vfp; + char *file_name, *vfn; + struct io_bunch *cur; + struct ifile_info *iip; + __u64 start_time, last_time, bunches, pkts; +}; + +int data_is_native; // Indicates whether to swap +static LIST_HEAD(input_files); // List of all input files +static char *idir = "."; // Input directory base +static char *odir = "."; // Output directory base +static char *obase = "replay"; // Output file base +static __u64 max_bunch_tm = (10 * 1000 * 1000); // 10 milliseconds +static __u64 max_pkts_per_bunch = 8; // Default # of pkts per bunch +static int verbose = 0; // Boolean: output stats +static int find_traces = 0; // Boolean: Find traces in dir + +static char usage_str[] = \ + "\n" \ + "\t[ -d <dir> : --input-directory=<dir> ] Default: .\n" \ + "\t[ -D <dir> : --output-directory=<dir>] Default: .\n" \ + "\t[ -F : --find-traces ] Default: Off\n" \ + "\t[ -h : --help ] Default: Off\n" \ + "\t[ -m <nsec> : --max-bunch-time=<nsec> ] Default: 10 msec\n" \ + "\t[ -M <pkts> : --max-pkts=<pkts> ] Default: 8\n" \ + "\t[ -o <base> : --output-base=<base> ] Default: replay\n" \ + "\t[ -v : --verbose ] Default: Off\n" \ + "\t[ -V : --version ] Default: Off\n" \ + "\t<dev>... Default: None\n" \ + "\n"; + +#define S_OPTS "d:D:Fhm:M:o:vV" +static struct option l_opts[] = { + { + .name = "input-directory", + .has_arg = required_argument, + .flag = NULL, + .val = 'd' + }, + { + .name = "output-directory", + .has_arg = required_argument, + .flag = NULL, + .val = 'D' + }, + { + .name = "find-traces", + .has_arg = no_argument, + .flag = NULL, + .val = 'F' + }, + { + .name = "help", + .has_arg = no_argument, + .flag = NULL, + .val = 'h' + }, + { + .name = "max-bunch-time", + .has_arg = required_argument, + .flag = NULL, + .val = 'm' + }, + { + .name = "max-pkts", + .has_arg = required_argument, + .flag = NULL, + .val = 'M' + }, + { + .name = "output-base", + .has_arg = required_argument, + .flag = NULL, + .val = 'o' + }, + { + .name = "verbose", + .has_arg = no_argument, + .flag = NULL, + .val = 'v' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'V' + }, + { + .name = NULL + } +}; + +#define ERR_ARGS 1 +#define ERR_SYSCALL 2 +static inline void fatal(const char *errstring, const int exitval, + const char *fmt, ...) +{ + va_list ap; + + if (errstring) + perror(errstring); + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + exit(exitval); + /*NOTREACHED*/ +} + +/** + * match - Return true if this trace is a proper QUEUE transaction + * @action: Action field from trace + */ +static inline int match(__u32 action) +{ + return ((action & 0xffff) == __BLK_TA_QUEUE) && + (action & BLK_TC_ACT(BLK_TC_QUEUE)); +} + +/** + * usage - Display usage string and version + */ +static void usage(void) +{ + fprintf(stderr, "Usage: btrecord -- version %s\n%s", + my_btversion, usage_str); +} + +/** + * write_file_hdr - Seek to and write btrecord file header + * @stream: Output file information + * @hdr: Header to write + */ +static void write_file_hdr(struct io_stream *stream, struct io_file_hdr *hdr) +{ + hdr->version = mk_btversion(btver_mjr, btver_mnr, btver_sub); + + if (verbose) { + fprintf(stderr, "\t%s: %llx %llx %llx %llx\n", + stream->file_name, + (long long unsigned)hdr->version, + (long long unsigned)hdr->genesis, + (long long unsigned)hdr->nbunches, + (long long unsigned)hdr->total_pkts); + } + + fseek(stream->ofp, 0, SEEK_SET); + if (fwrite(hdr, sizeof(*hdr), 1, stream->ofp) != 1) { + fatal(stream->file_name, ERR_SYSCALL, "Hdr write failed\n"); + /*NOTREACHED*/ + } +} + +/** + * io_bunch_create - Allocate & initialize an io_bunch + * @io_stream: IO stream being added to + * @pre_stall: Amount of time that this bunch should be delayed by + * @start_time: Records current start + */ +static inline void io_bunch_create(struct io_stream *stream, __u64 start_time) +{ + struct io_bunch *cur = malloc(sizeof(*cur)); + + memset(cur, 0, sizeof(*cur)); + + cur->hdr.npkts = 0; + cur->hdr.time_stamp = stream->start_time = start_time; + + stream->cur = cur; +} + +/** + * io_bunch_add - Add an IO to the current bunch of IOs + * @stream: Per-output file stream information + * @spec: IO trace specification + * + * Returns update bunch information + */ +static void io_bunch_add(struct io_stream *stream, struct io_spec *spec) +{ + struct io_bunch *cur = stream->cur; + struct io_pkt iop = { + .sector = spec->sector, + .nbytes = spec->bytes, + .rw = spec->rw + }; + + assert(cur != NULL); + assert(cur->hdr.npkts < BT_MAX_PKTS); + assert(stream->last_time == 0 || stream->last_time <= spec->time); + + cur->pkts[cur->hdr.npkts++] = iop; // Struct copy + stream->last_time = spec->time; +} + +/** + * rem_input_file - Release resources associated with an input file + * @iip: Per-input file information + */ +static void rem_input_file(struct ifile_info *iip) +{ + list_del(&iip->head); + + close(iip->ifd); + free(iip->file_name); + free(iip->devnm); + free(iip); +} + +/** + * __add_input_file - Allocate and initialize per-input file structure + * @cpu: CPU for this file + * @devnm: Device name for this file + * @file_name: Fully qualifed input file name + */ +static void __add_input_file(int cpu, char *devnm, char *file_name) +{ + struct ifile_info *iip = malloc(sizeof(*iip)); + + iip->cpu = cpu; + iip->tpkts = 0; + iip->genesis = 0; + iip->devnm = strdup(devnm); + iip->file_name = strdup(file_name); + iip->ifd = open(file_name, O_RDONLY); + if (iip->ifd < 0) { + fatal(file_name, ERR_ARGS, "Unable to open\n"); + /*NOTREACHED*/ + } + + list_add_tail(&iip->head, &input_files); +} + +/** + * add_input_file - Set up the input file name + * @devnm: Device name to use + */ +static void add_input_file(char *devnm) +{ + struct list_head *p; + int cpu, found = 0; + + __list_for_each(p, &input_files) { + struct ifile_info *iip = list_entry(p, struct ifile_info, head); + if (strcmp(iip->devnm, devnm) == 0) + return; + } + + for (cpu = 0; ; cpu++) { + char full_name[MAXPATHLEN]; + + sprintf(full_name, "%s/%s.blktrace.%d", idir, devnm, cpu); + if (access(full_name, R_OK) != 0) + break; + + __add_input_file(cpu, devnm, full_name); + found++; + } + + if (!found) { + fatal(NULL, ERR_ARGS, "No traces found for %s\n", devnm); + /*NOTREACHED*/ + } +} + +static void find_input_files(char *idir) +{ + struct dirent *ent; + DIR *dir = opendir(idir); + + if (dir == NULL) { + fatal(idir, ERR_ARGS, "Unable to open %s\n", idir); + /*NOTREACHED*/ + } + + while ((ent = readdir(dir)) != NULL) { + char *p, *dsf = malloc(256); + + if (strstr(ent->d_name, ".blktrace.") == NULL) + continue; + + dsf = strdup(ent->d_name); + p = index(dsf, '.'); + assert(p != NULL); + *p = '\0'; + add_input_file(dsf); + free(dsf); + } + + closedir(dir); +} + +/** + * handle_args - Parse passed in argument list + * @argc: Number of arguments in argv + * @argv: Arguments passed in + * + * Does rudimentary parameter verification as well. + */ +void handle_args(int argc, char *argv[]) +{ + int c; + + while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) != -1) { + switch (c) { + case 'd': + idir = optarg; + if (access(idir, R_OK | X_OK) != 0) { + fatal(idir, ERR_ARGS, + "Invalid input directory specified\n"); + /*NOTREACHED*/ + } + break; + + case 'D': + odir = optarg; + if (access(odir, R_OK | X_OK) != 0) { + fatal(odir, ERR_ARGS, + "Invalid output directory specified\n"); + /*NOTREACHED*/ + } + break; + + case 'F': + find_traces = 1; + break; + + case 'h': + usage(); + exit(0); + /*NOTREACHED*/ + + case 'm': + max_bunch_tm = (__u64)atoll(optarg); + if (max_bunch_tm < 1) { + fprintf(stderr, "Invalid bunch time %llu\n", + (unsigned long long)max_bunch_tm); + exit(ERR_ARGS); + /*NOTREACHED*/ + } + break; + + case 'M': + max_pkts_per_bunch = (__u64)atoll(optarg); + if (!((1 <= max_pkts_per_bunch) && + (max_pkts_per_bunch < 513))) { + fprintf(stderr, "Invalid max pkts %llu\n", + (unsigned long long)max_pkts_per_bunch); + exit(ERR_ARGS); + /*NOTREACHED*/ + } + break; + + case 'o': + obase = optarg; + break; + + case 'V': + fprintf(stderr, "btrecord -- version %s\n", + my_btversion); + fprintf(stderr, " Built on %s\n", build_date); + exit(0); + /*NOTREACHED*/ + + case 'v': + verbose++; + break; + + default: + usage(); + fatal(NULL, ERR_ARGS, "Invalid command line\n"); + /*NOTREACHED*/ + } + } + + while (optind < argc) + add_input_file(argv[optind++]); + + if (find_traces) + find_input_files(idir); + + if (list_len(&input_files) == 0) { + fatal(NULL, ERR_ARGS, "Missing required input file name(s)\n"); + /*NOTREACHED*/ + } +} + +/** + * next_io - Retrieve next Q trace from input stream + * @iip: Per-input file information + * @spec: IO specifier for trace + * + * Returns 0 on end of file, 1 if valid data returned. + */ +static int next_io(struct ifile_info *iip, struct io_spec *spec) +{ + ssize_t ret; + __u32 action; + __u16 pdu_len; + struct blk_io_trace t; + +again: + ret = read(iip->ifd, &t, sizeof(t)); + if (ret < 0) { + fatal(iip->file_name, ERR_SYSCALL, "Read failed\n"); + /*NOTREACHED*/ + } + else if (ret == 0) + return 0; + else if (ret < (ssize_t)sizeof(t)) { + fprintf(stderr, "WARNING: Short read on %s (%d)\n", + iip->file_name, (int)ret); + return 0; + } + + if (data_is_native == -1) + check_data_endianness(t.magic); + + assert(data_is_native >= 0); + if (data_is_native) { + spec->time = t.time; + spec->sector = t.sector; + spec->bytes = t.bytes; + action = t.action; + pdu_len = t.pdu_len; + } + else { + spec->time = be64_to_cpu(t.time); + spec->sector = be64_to_cpu(t.sector); + spec->bytes = be32_to_cpu(t.bytes); + action = be32_to_cpu(t.action); + pdu_len = be16_to_cpu(t.pdu_len); + } + + + if (pdu_len) { + char buf[pdu_len]; + + ret = read(iip->ifd, buf, pdu_len); + if (ret < 0) { + fatal(iip->file_name, ERR_SYSCALL, "Read PDU failed\n"); + /*NOTREACHED*/ + } + else if (ret < (ssize_t)pdu_len) { + fprintf(stderr, "WARNING: Short PDU read on %s (%d)\n", + iip->file_name, (int)ret); + return 0; + } + } + + iip->tpkts++; + if (!match(action)) + goto again; + + spec->rw = (action & BLK_TC_ACT(BLK_TC_READ)) ? 1 : 0; + if (verbose > 1) + fprintf(stderr, "%2d: %10llu+%10llu (%d) @ %10llx\n", + iip->cpu, (long long unsigned)spec->sector, + (long long unsigned)spec->bytes / 512LLU, + spec->rw, (long long unsigned)spec->time); + + if (iip->genesis == 0) { + iip->genesis = spec->time; + if (verbose > 1) + fprintf(stderr, "\tSetting new genesis: %llx(%d)\n", + (long long unsigned)iip->genesis, iip->cpu); + } + else if (iip->genesis > spec->time) + fatal(NULL, ERR_SYSCALL, + "Time inversion? %llu ... %llu\n", + (long long unsigned )iip->genesis, + (long long unsigned )spec->time); + + return 1; +} + +/** + * bunch_output_hdr - Output bunch header + */ +static inline void bunch_output_hdr(struct io_stream *stream) +{ + struct io_bunch_hdr *hdrp = &stream->cur->hdr; + + assert(0 < hdrp->npkts && hdrp->npkts <= BT_MAX_PKTS); + if (fwrite(hdrp, sizeof(struct io_bunch_hdr), 1, stream->ofp) != 1) { + fatal(stream->file_name, ERR_SYSCALL, "fwrite(hdr) failed\n"); + /*NOTREACHED*/ + } + + if (verbose) { + __u64 off = hdrp->time_stamp - stream->iip->genesis; + + assert(stream->vfp); + fprintf(stream->vfp, "------------------\n"); + fprintf(stream->vfp, "%4llu.%09llu %3llu\n", + (unsigned long long)off / (1000 * 1000 * 1000), + (unsigned long long)off % (1000 * 1000 * 1000), + (unsigned long long)hdrp->npkts); + fprintf(stream->vfp, "------------------\n"); + } +} + +/** + * bunch_output_pkt - Output IO packets + */ +static inline void bunch_output_pkts(struct io_stream *stream) +{ + struct io_pkt *p = stream->cur->pkts; + size_t npkts = stream->cur->hdr.npkts; + + assert(0 < npkts && npkts <= BT_MAX_PKTS); + if (fwrite(p, sizeof(struct io_pkt), npkts, stream->ofp) != npkts) { + fatal(stream->file_name, ERR_SYSCALL, "fwrite(pkts) failed\n"); + /*NOTREACHED*/ + } + + if (verbose) { + size_t i; + + assert(stream->vfp); + for (i = 0; i < npkts; i++, p++) + fprintf(stream->vfp, "\t%1d %10llu\t%10llu\n", + p->rw, + (unsigned long long)p->sector, + (unsigned long long)p->nbytes / 512); + } +} + +/** + * stream_flush - Flush current bunch of IOs out to the output stream + * @stream: Per-output file stream information + */ +static void stream_flush(struct io_stream *stream) +{ + struct io_bunch *cur = stream->cur; + + if (cur) { + if (cur->hdr.npkts) { + assert(cur->hdr.npkts <= BT_MAX_PKTS); + bunch_output_hdr(stream); + bunch_output_pkts(stream); + + stream->bunches++; + stream->pkts += cur->hdr.npkts; + } + free(cur); + } +} + +/** + * bunch_done - Returns true if current bunch is either full, or next IO is late + * @stream: Output stream information + * @spec: IO trace specification + */ +static inline int bunch_done(struct io_stream *stream, struct io_spec *spec) +{ + if (stream->cur->hdr.npkts >= max_pkts_per_bunch) + return 1; + + if ((spec->time - stream->start_time) > max_bunch_tm) + return 1; + + return 0; +} + +/** + * stream_add_io - Add an IO trace to the current stream + * @stream: Output stream information + * @spec: IO trace specification + */ +static void stream_add_io(struct io_stream *stream, struct io_spec *spec) +{ + + if (stream->cur == NULL) + io_bunch_create(stream, spec->time); + else if (bunch_done(stream, spec)) { + stream_flush(stream); + io_bunch_create(stream, spec->time); + } + + io_bunch_add(stream, spec); +} + +/** + * stream_open - Open output stream for specified input stream + * @iip: Per-input file information + */ +static struct io_stream *stream_open(struct ifile_info *iip) +{ + char ofile_name[MAXPATHLEN]; + struct io_stream *stream = malloc(sizeof(*stream)); + struct io_file_hdr io_file_hdr = { + .genesis = 0, + .nbunches = 0, + .total_pkts = 0 + }; + + memset(stream, 0, sizeof(*stream)); + + sprintf(ofile_name, "%s/%s.%s.%d", odir, iip->devnm, obase, iip->cpu); + stream->ofp = fopen(ofile_name, "w"); + if (!stream->ofp) { + fatal(ofile_name, ERR_SYSCALL, "Open failed\n"); + /*NOTREACHED*/ + } + + stream->iip = iip; + stream->cur = NULL; + stream->bunches = stream->pkts = 0; + stream->last_time = 0; + stream->file_name = strdup(ofile_name); + + write_file_hdr(stream, &io_file_hdr); + + if (verbose) { + char vfile_name[MAXPATHLEN]; + + sprintf(vfile_name, "%s/%s.%s.%d.rec", odir, iip->devnm, + obase, iip->cpu); + stream->vfp = fopen(vfile_name, "w"); + if (!stream->vfp) { + fatal(vfile_name, ERR_SYSCALL, "Open failed\n"); + /*NOTREACHED*/ + } + + stream->vfn = strdup(vfile_name); + } + + data_is_native = -1; + return stream; +} + +/** + * stream_close - Release resources associated with an output stream + * @stream: Stream to release + */ +static void stream_close(struct io_stream *stream) +{ + struct io_file_hdr io_file_hdr = { + .genesis = stream->iip->genesis, + .nbunches = stream->bunches, + .total_pkts = stream->pkts + }; + + stream_flush(stream); + write_file_hdr(stream, &io_file_hdr); + fclose(stream->ofp); + + if (verbose && stream->bunches) { + fprintf(stderr, + "%s:%d: %llu pkts (tot), %llu pkts (replay), " + "%llu bunches, %.1lf pkts/bunch\n", + stream->iip->devnm, stream->iip->cpu, + (unsigned long long)stream->iip->tpkts, + (unsigned long long)stream->pkts, + (unsigned long long)stream->bunches, + (double)(stream->pkts) / (double)(stream->bunches)); + + fclose(stream->vfp); + free(stream->vfn); + } + + free(stream->file_name); + free(stream); +} + +/** + * process - Process one input file to an output file + * @iip: Per-input file information + */ +static void process(struct ifile_info *iip) +{ + struct io_spec spec; + struct io_stream *stream; + + stream = stream_open(iip); + while (next_io(iip, &spec)) + stream_add_io(stream, &spec); + stream_close(stream); + + rem_input_file(iip); +} + +/** + * main - + * @argc: Number of arguments + * @argv: Array of arguments + */ +int main(int argc, char *argv[]) +{ + struct list_head *p, *q; + + handle_args(argc, argv); + list_for_each_safe(p, q, &input_files) + process(list_entry(p, struct ifile_info, head)); + + return 0; +} diff --git a/btreplay/btrecord.h b/btreplay/btrecord.h new file mode 100644 index 0000000..390e14c --- /dev/null +++ b/btreplay/btrecord.h @@ -0,0 +1,95 @@ +/* + * Blktrace record utility - Convert binary trace data into bunches of IOs + * + * Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#if !defined(__BTRECORD_H__) +#define __BTRECORD_H__ + +#include <asm/types.h> + +#define BT_MAX_PKTS 512 + +/* + * Header for each bunch + * + * @nkts: Number of IO packets to process + * @time_stamp: Time stamp for this bunch of IOs + */ +struct io_bunch_hdr { + __u64 npkts; + __u64 time_stamp; +}; + +/* + * IO specifer + * + * @sector: Sector number of IO + * @nbytes: Number of bytes to process + * @rw: IO direction: 0 = write, 1 = read + */ +struct io_pkt { + __u64 sector; + __u64 nbytes; + __u32 rw; +}; + +/* + * Shorthand notion of a bunch of IOs + * + * @hdr: Header describing stall and how many IO packets follow + * @pkts: Individual IOs are described here + */ +struct io_bunch { + struct io_bunch_hdr hdr; + struct io_pkt pkts[BT_MAX_PKTS]; +}; + +/* + * Header for each recorded file + * + * @version: Version information + * @genesis: Time stamp for earliest bunch + * @nbunches: Number of bunches put into the file + * @total_pkts: Number of packets to be processed + */ +struct io_file_hdr { + __u64 version; + __u64 genesis; + __u64 nbunches; + __u64 total_pkts; +}; + +static inline __u64 mk_btversion(int mjr, int mnr, int sub) +{ + return ((mjr & 0xff) << 16) | ((mnr & 0xff) << 8) | (sub & 0xff); +} + +static inline void get_btversion(__u64 version, int *mjr, int *mnr, int *sub) +{ + *mjr = (int)((version >> 16) & 0xff); + *mnr = (int)((version >> 8) & 0xff); + *sub = (int)((version >> 0) & 0xff); +} + +static char my_btversion[] = "1.0.0"; +static int btver_mjr = 1; +static int btver_mnr = 0; +static int btver_sub = 0; + +#endif diff --git a/btreplay/btreplay.c b/btreplay/btreplay.c new file mode 100644 index 0000000..2d122ca --- /dev/null +++ b/btreplay/btreplay.c @@ -0,0 +1,1627 @@ +/* + * Blktrace replay utility - Play traces back + * + * Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +static char build_date[] = __DATE__ " at "__TIME__; + +#include <assert.h> +#include <errno.h> +#include <fcntl.h> +#include <libaio.h> +#include <pthread.h> +#include <sched.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> +#include <dirent.h> +#include <stdarg.h> + +#if !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif +#include <getopt.h> + +#include "list.h" +#include "btrecord.h" + +/* + * ======================================================================== + * ==== STRUCTURE DEFINITIONS ============================================= + * ======================================================================== + */ + +/** + * Each device map has one of these: + * + * @head: Linked on to map_devs + * @from_dev: Device name as seen on recorded system + * @to_dev: Device name to be used on replay system + */ +struct map_dev { + struct list_head head; + char *from_dev, *to_dev; +}; + +/** + * Each device name specified has one of these (until threads are created) + * + * @head: Linked onto input_devs + * @devnm: Device name -- 'sd*' + */ +struct dev_info { + struct list_head head; + char *devnm; +}; + +/* + * Per input file information + * + * @head: Used to link up on input_files + * @free_iocbs: List of free iocb's available for use + * @used_iocbs: List of iocb's currently outstanding + * @mutex: Mutex used with condition variable to protect volatile values + * @cond: Condition variable used when waiting on a volatile value change + * @naios_out: Current number of AIOs outstanding on this context + * @naios_free: Number of AIOs on the free list (short cut for list_len) + * @send_wait: Boolean: When true, the sub thread is waiting on free IOCBs + * @reap_wait: Boolean: When true, the rec thread is waiting on used IOCBs + * @send_done: Boolean: When true, the sub thread has completed work + * @reap_done: Boolean: When true, the rec thread has completed work + * @sub_thread: Thread used to submit IOs. + * @rec_thread: Thread used to reclaim IOs. + * @ctx: IO context + * @devnm: Copy of the device name being managed by this thread + * @file_name: Full name of the input file + * @cpu: CPU this thread is pinned to + * @ifd: Input file descriptor + * @ofd: Output file descriptor + * @iterations: Remaining iterations to process + * @vfp: For verbose dumping of actions performed + */ +struct thr_info { + struct list_head head, free_iocbs, used_iocbs; + pthread_mutex_t mutex; + pthread_cond_t cond; + volatile long naios_out, naios_free; + volatile int send_wait, reap_wait, send_done, reap_done; + pthread_t sub_thread, rec_thread; + io_context_t ctx; + char *devnm, *file_name; + int cpu, ifd, ofd, iterations; + FILE *vfp; +}; + +/* + * Every Asynchronous IO used has one of these (naios per file/device). + * + * @iocb: IOCB sent down via io_submit + * @head: Linked onto file_list.free_iocbs or file_list.used_iocbs + * @tip: Pointer to per-thread information this IO is associated with + * @nbytes: Number of bytes in buffer associated with iocb + */ +struct iocb_pkt { + struct iocb iocb; + struct list_head head; + struct thr_info *tip; + int nbytes; +}; + +/* + * ======================================================================== + * ==== GLOBAL VARIABLES ================================================== + * ======================================================================== + */ + +static volatile int signal_done = 0; // Boolean: Signal'ed, need to quit + +static char *ibase = "replay"; // Input base name +static char *idir = "."; // Input directory base +static int cpus_to_use = -1; // Number of CPUs to use +static int def_iterations = 1; // Default number of iterations +static int naios = 512; // Number of AIOs per thread +static int ncpus = 0; // Number of CPUs in the system +static int verbose = 0; // Boolean: Output some extra info +static int write_enabled = 0; // Boolean: Enable writing +static __u64 genesis = ~0; // Earliest time seen +static __u64 rgenesis; // Our start time +static size_t pgsize; // System Page size +static int nb_sec = 512; // Number of bytes per sector +static LIST_HEAD(input_devs); // List of devices to handle +static LIST_HEAD(input_files); // List of input files to handle +static LIST_HEAD(map_devs); // List of device maps +static int nfiles = 0; // Number of files to handle +static int no_stalls = 0; // Boolean: Disable pre-stalls +static unsigned acc_factor = 1; // Int: Acceleration factor +static int find_records = 0; // Boolean: Find record files auto + +/* + * Variables managed under control of condition variables. + * + * n_reclaims_done: Counts number of reclaim threads that have completed. + * n_replays_done: Counts number of replay threads that have completed. + * n_replays_ready: Counts number of replay threads ready to start. + * n_iters_done: Counts number of replay threads done one iteration. + * iter_start: Starts an iteration for the replay threads. + */ +static volatile int n_reclaims_done = 0; +static pthread_mutex_t reclaim_done_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t reclaim_done_cond = PTHREAD_COND_INITIALIZER; + +static volatile int n_replays_done = 0; +static pthread_mutex_t replay_done_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t replay_done_cond = PTHREAD_COND_INITIALIZER; + +static volatile int n_replays_ready = 0; +static pthread_mutex_t replay_ready_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t replay_ready_cond = PTHREAD_COND_INITIALIZER; + +static volatile int n_iters_done = 0; +static pthread_mutex_t iter_done_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t iter_done_cond = PTHREAD_COND_INITIALIZER; + +static volatile int iter_start = 0; +static pthread_mutex_t iter_start_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t iter_start_cond = PTHREAD_COND_INITIALIZER; + +/* + * ======================================================================== + * ==== FORWARD REFERENECES =============================================== + * ======================================================================== + */ + +static void *replay_sub(void *arg); +static void *replay_rec(void *arg); +static char usage_str[]; + +/* + * ======================================================================== + * ==== INLINE ROUTINES =================================================== + * ======================================================================== + */ + +/* + * The 'fatal' macro will output a perror message (if errstring is !NULL) + * and display a string (with variable arguments) and then exit with the + * specified exit value. + */ +#define ERR_ARGS 1 +#define ERR_SYSCALL 2 +static inline void fatal(const char *errstring, const int exitval, + const char *fmt, ...) +{ + va_list ap; + + if (errstring) + perror(errstring); + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + exit(exitval); + /*NOTREACHED*/ +} + +static inline long long unsigned du64_to_sec(__u64 du64) +{ + return (long long unsigned)du64 / (1000 * 1000 * 1000); +} + +static inline long long unsigned du64_to_nsec(__u64 du64) +{ + return llabs((long long)du64) % (1000 * 1000 * 1000); +} + +/** + * min - Return minimum of two integers + */ +static inline int min(int a, int b) +{ + return a < b ? a : b; +} + +/** + * minl - Return minimum of two longs + */ +static inline long minl(long a, long b) +{ + return a < b ? a : b; +} + +/** + * usage - Display usage string and version + */ +static inline void usage(void) +{ + fprintf(stderr, "Usage: btreplay -- version %s\n%s", + my_btversion, usage_str); +} + +/** + * is_send_done - Returns true if sender should quit early + * @tip: Per-thread information + */ +static inline int is_send_done(struct thr_info *tip) +{ + return signal_done || tip->send_done; +} + +/** + * is_reap_done - Returns true if reaper should quit early + * @tip: Per-thread information + */ +static inline int is_reap_done(struct thr_info *tip) +{ + return tip->send_done && tip->naios_out == 0; +} + +/** + * ts2ns - Convert timespec values to a nanosecond value + */ +#define NS_TICKS ((__u64)1000 * (__u64)1000 * (__u64)1000) +static inline __u64 ts2ns(struct timespec *ts) +{ + return ((__u64)(ts->tv_sec) * NS_TICKS) + (__u64)(ts->tv_nsec); +} + +/** + * ts2ns - Convert timeval values to a nanosecond value + */ +static inline __u64 tv2ns(struct timeval *tp) +{ + return ((__u64)(tp->tv_sec)) + ((__u64)(tp->tv_usec) * (__u64)1000); +} + +/** + * touch_memory - Force physical memory to be allocating it + * + * For malloc()ed memory we need to /touch/ it to make it really + * exist. Otherwise, for write's (to storage) things may not work + * as planned - we see Linux just use a single area to /read/ from + * (as there isn't any memory that has been associated with the + * allocated virtual addresses yet). + */ +static inline void touch_memory(char *buf, size_t bsize) +{ +#if defined(PREP_BUFS) + memset(buf, 0, bsize); +#else + size_t i; + + for (i = 0; i < bsize; i += pgsize) + buf[i] = 0; +#endif +} + +/** + * buf_alloc - Returns a page-aligned buffer of the specified size + * @nbytes: Number of bytes to allocate + */ +static inline void *buf_alloc(size_t nbytes) +{ + void *buf; + + if (posix_memalign(&buf, pgsize, nbytes)) { + fatal("posix_memalign", ERR_SYSCALL, "Allocation failed\n"); + /*NOTREACHED*/ + } + + return buf; +} + +/** + * gettime - Returns current time + */ +static inline __u64 gettime(void) +{ + static int use_clock_gettime = -1; // Which clock to use + + if (use_clock_gettime < 0) { + use_clock_gettime = clock_getres(CLOCK_MONOTONIC, NULL) == 0; + if (use_clock_gettime) { + struct timespec ts = { + .tv_sec = 0, + .tv_nsec = 0 + }; + clock_settime(CLOCK_MONOTONIC, &ts); + } + } + + if (use_clock_gettime) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts2ns(&ts); + } + else { + struct timeval tp; + gettimeofday(&tp, NULL); + return tv2ns(&tp); + } +} + +/** + * setup_signal - Set up a signal handler for the specified signum + */ +static inline void setup_signal(int signum, sighandler_t handler) +{ + if (signal(signum, handler) == SIG_ERR) { + fatal("signal", ERR_SYSCALL, "Failed to set signal %d\n", + signum); + /*NOTREACHED*/ + } +} + +/* + * ======================================================================== + * ==== CONDITION VARIABLE ROUTINES ======================================= + * ======================================================================== + */ + +/** + * __set_cv - Increments a variable under condition variable control. + * @pmp: Pointer to the associated mutex + * @pcp: Pointer to the associated condition variable + * @vp: Pointer to the variable being incremented + * @mxv: Max value for variable (Used only when ASSERTS are on) + */ +static inline void __set_cv(pthread_mutex_t *pmp, pthread_cond_t *pcp, + volatile int *vp, + __attribute__((__unused__))int mxv) +{ + pthread_mutex_lock(pmp); + assert(*vp < mxv); + *vp += 1; + pthread_cond_signal(pcp); + pthread_mutex_unlock(pmp); +} + +/** + * __wait_cv - Waits for a variable under cond var control to hit a value + * @pmp: Pointer to the associated mutex + * @pcp: Pointer to the associated condition variable + * @vp: Pointer to the variable being incremented + * @mxv: Value to wait for + */ +static inline void __wait_cv(pthread_mutex_t *pmp, pthread_cond_t *pcp, + volatile int *vp, int mxv) +{ + pthread_mutex_lock(pmp); + while (*vp < mxv) + pthread_cond_wait(pcp, pmp); + *vp = 0; + pthread_mutex_unlock(pmp); +} + +static inline void set_reclaim_done(void) +{ + __set_cv(&reclaim_done_mutex, &reclaim_done_cond, &n_reclaims_done, + nfiles); +} + +static inline void wait_reclaims_done(void) +{ + __wait_cv(&reclaim_done_mutex, &reclaim_done_cond, &n_reclaims_done, + nfiles); +} + +static inline void set_replay_ready(void) +{ + __set_cv(&replay_ready_mutex, &replay_ready_cond, &n_replays_ready, + nfiles); +} + +static inline void wait_replays_ready(void) +{ + __wait_cv(&replay_ready_mutex, &replay_ready_cond, &n_replays_ready, + nfiles); +} + +static inline void set_replay_done(void) +{ + __set_cv(&replay_done_mutex, &replay_done_cond, &n_replays_done, + nfiles); +} + +static inline void wait_replays_done(void) +{ + __wait_cv(&replay_done_mutex, &replay_done_cond, &n_replays_done, + nfiles); +} + +static inline void set_iter_done(void) +{ + __set_cv(&iter_done_mutex, &iter_done_cond, &n_iters_done, + nfiles); +} + +static inline void wait_iters_done(void) +{ + __wait_cv(&iter_done_mutex, &iter_done_cond, &n_iters_done, + nfiles); +} + +/** + * wait_iter_start - Wait for an iteration to start + * + * This is /slightly/ different: we are waiting for a value to become + * non-zero, and then we decrement it and go on. + */ +static inline void wait_iter_start(void) +{ + pthread_mutex_lock(&iter_start_mutex); + while (iter_start == 0) + pthread_cond_wait(&iter_start_cond, &iter_start_mutex); + assert(1 <= iter_start && iter_start <= nfiles); + iter_start--; + pthread_mutex_unlock(&iter_start_mutex); +} + +/** + * start_iter - Start an iteration at the replay thread level + */ +static inline void start_iter(void) +{ + pthread_mutex_lock(&iter_start_mutex); + assert(iter_start == 0); + iter_start = nfiles; + pthread_cond_broadcast(&iter_start_cond); + pthread_mutex_unlock(&iter_start_mutex); +} + +/* + * ======================================================================== + * ==== CPU RELATED ROUTINES ============================================== + * ======================================================================== + */ + +/** + * get_ncpus - Sets up the global 'ncpus' value + */ +static void get_ncpus(void) +{ + cpu_set_t cpus; + + if (sched_getaffinity(getpid(), sizeof(cpus), &cpus)) { + fatal("sched_getaffinity", ERR_SYSCALL, "Can't get CPU info\n"); + /*NOTREACHED*/ + } + + /* + * XXX This assumes (perhaps wrongly) that there are no /holes/ + * XXX in the mask. + */ + for (ncpus = 0; ncpus < CPU_SETSIZE && CPU_ISSET(ncpus, &cpus); ncpus++) + ; + if (ncpus == 0) { + fatal(NULL, ERR_SYSCALL, "Insufficient number of CPUs\n"); + /*NOTREACHED*/ + } +} + +/** + * pin_to_cpu - Pin this thread to a specific CPU + * @tip: Thread information + */ +static void pin_to_cpu(struct thr_info *tip) +{ + cpu_set_t cpus; + + assert(0 <= tip->cpu && tip->cpu < ncpus); + + CPU_ZERO(&cpus); + CPU_SET(tip->cpu, &cpus); + if (sched_setaffinity(getpid(), sizeof(cpus), &cpus)) { + fatal("sched_setaffinity", ERR_SYSCALL, "Failed to pin CPU\n"); + /*NOTREACHED*/ + } + + if (verbose > 1) { + int i; + cpu_set_t now; + + (void)sched_getaffinity(getpid(), sizeof(now), &now); + fprintf(tip->vfp, "Pinned to CPU %02d ", tip->cpu); + for (i = 0; i < ncpus; i++) + fprintf(tip->vfp, "%1d", CPU_ISSET(i, &now)); + fprintf(tip->vfp, "\n"); + } +} + +/* + * ======================================================================== + * ==== INPUT DEVICE HANDLERS ============================================= + * ======================================================================== + */ + +/** + * add_input_dev - Add a device ('sd*') to the list of devices to handle + */ +static void add_input_dev(char *devnm) +{ + struct list_head *p; + struct dev_info *dip; + + __list_for_each(p, &input_devs) { + dip = list_entry(p, struct dev_info, head); + if (strcmp(dip->devnm, devnm) == 0) + return; + } + + dip = malloc(sizeof(*dip)); + dip->devnm = strdup(devnm); + list_add_tail(&dip->head, &input_devs); +} + +/** + * rem_input_dev - Remove resources associated with this device + */ +static void rem_input_dev(struct dev_info *dip) +{ + list_del(&dip->head); + free(dip->devnm); + free(dip); +} + +static void find_input_devs(char *idir) +{ + struct dirent *ent; + DIR *dir = opendir(idir); + + if (dir == NULL) { + fatal(idir, ERR_ARGS, "Unable to open %s\n", idir); + /*NOTREACHED*/ + } + + while ((ent = readdir(dir)) != NULL) { + char *p, *dsf = malloc(256); + + if (strstr(ent->d_name, ".replay.") == NULL) + continue; + + dsf = strdup(ent->d_name); + p = index(dsf, '.'); + assert(p != NULL); + *p = '\0'; + add_input_dev(dsf); + free(dsf); + } + + closedir(dir); +} + +/* + * ======================================================================== + * ==== MAP DEVICE INTERFACES ============================================= + * ======================================================================== + */ + +/** + * read_map_devs - Read in a set of device mapping from the provided file. + * @file_name: File containing device maps + * + * We support the notion of multiple such files being specifed on the cmd line + */ +static void read_map_devs(char *file_name) +{ + FILE *fp; + char *from_dev, *to_dev; + + fp = fopen(file_name, "r"); + if (!fp) { + fatal(file_name, ERR_SYSCALL, "Could not open map devs file\n"); + /*NOTREACHED*/ + } + + while (fscanf(fp, "%as %as", &from_dev, &to_dev) == 2) { + struct map_dev *mdp = malloc(sizeof(*mdp)); + + mdp->from_dev = from_dev; + mdp->to_dev = to_dev; + list_add_tail(&mdp->head, &map_devs); + } + + fclose(fp); +} + +/** + * release_map_devs - Release resources associated with device mappings. + */ +static void release_map_devs(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &map_devs) { + struct map_dev *mdp = list_entry(p, struct map_dev, head); + + list_del(&mdp->head); + + free(mdp->from_dev); + free(mdp->to_dev); + free(mdp); + } +} + +/** + * map_dev - Return the mapped device for that specified + * @from_dev: Device name as seen on recorded system + * + * Note: If there is no such mapping, we return the same name. + */ +static char *map_dev(char *from_dev) +{ + struct list_head *p; + + __list_for_each(p, &map_devs) { + struct map_dev *mdp = list_entry(p, struct map_dev, head); + + if (strcmp(from_dev, mdp->from_dev) == 0) + return mdp->to_dev; + } + + return from_dev; +} + +/* + * ======================================================================== + * ==== IOCB MANAGEMENT ROUTINES ========================================== + * ======================================================================== + */ + +/** + * iocb_init - Initialize the fields of an IOCB + * @tip: Per-thread information + * iocbp: IOCB pointer to update + */ +static void iocb_init(struct thr_info *tip, struct iocb_pkt *iocbp) +{ + iocbp->tip = tip; + iocbp->nbytes = 0; + iocbp->iocb.u.c.buf = NULL; +} + +/** + * iocb_setup - Set up an iocb with this AIOs information + * @iocbp: IOCB pointer to update + * @rw: Direction (0 == write, 1 == read) + * @n: Number of bytes to transfer + * @off: Offset (in bytes) + */ +static void iocb_setup(struct iocb_pkt *iocbp, int rw, int n, long long off) +{ + char *buf; + struct iocb *iop = &iocbp->iocb; + + assert(rw == 0 || rw == 1); + assert(0 < n && (n % nb_sec) == 0); + assert(0 <= off); + + if (iocbp->nbytes) { + if (iocbp->nbytes >= n) { + buf = iop->u.c.buf; + goto prep; + } + + assert(iop->u.c.buf); + free(iop->u.c.buf); + } + + buf = buf_alloc(n); + iocbp->nbytes = n; + +prep: + if (rw) + io_prep_pread(iop, iocbp->tip->ofd, buf, n, off); + else { + assert(write_enabled); + io_prep_pwrite(iop, iocbp->tip->ofd, buf, n, off); + touch_memory(buf, n); + } + + iop->data = iocbp; +} + +/* + * ======================================================================== + * ==== PER-THREAD SET UP & TEAR DOWN ===================================== + * ======================================================================== + */ + +/** + * tip_init - Per thread initialization function + */ +static void tip_init(struct thr_info *tip) +{ + int i; + + INIT_LIST_HEAD(&tip->free_iocbs); + INIT_LIST_HEAD(&tip->used_iocbs); + + pthread_mutex_init(&tip->mutex, NULL); + pthread_cond_init(&tip->cond, NULL); + + if (io_setup(naios, &tip->ctx)) { + fatal("io_setup", ERR_SYSCALL, "io_setup failed\n"); + /*NOTREACHED*/ + } + + tip->ofd = -1; + tip->naios_out = 0; + tip->send_done = tip->reap_done = 0; + tip->send_wait = tip->reap_wait = 0; + + memset(&tip->sub_thread, 0, sizeof(tip->sub_thread)); + memset(&tip->rec_thread, 0, sizeof(tip->rec_thread)); + + for (i = 0; i < naios; i++) { + struct iocb_pkt *iocbp = buf_alloc(sizeof(*iocbp)); + + iocb_init(tip, iocbp); + list_add_tail(&iocbp->head, &tip->free_iocbs); + } + tip->naios_free = naios; + + if (verbose > 1) { + char fn[MAXPATHLEN]; + + sprintf(fn, "%s/%s.%s.%d.rep", idir, tip->devnm, ibase, + tip->cpu); + tip->vfp = fopen(fn, "w"); + if (!tip->vfp) { + fatal(fn, ERR_SYSCALL, "Failed to open report\n"); + /*NOTREACHED*/ + } + + setlinebuf(tip->vfp); + } + + if (pthread_create(&tip->sub_thread, NULL, replay_sub, tip)) { + fatal("pthread_create", ERR_SYSCALL, + "thread create failed\n"); + /*NOTREACHED*/ + } + + if (pthread_create(&tip->rec_thread, NULL, replay_rec, tip)) { + fatal("pthread_create", ERR_SYSCALL, + "thread create failed\n"); + /*NOTREACHED*/ + } +} + +/** + * tip_release - Release resources associated with this thread + */ +static void tip_release(struct thr_info *tip) +{ + struct list_head *p, *q; + + assert(tip->send_done); + assert(tip->reap_done); + assert(list_len(&tip->used_iocbs) == 0); + assert(tip->naios_free == naios); + + if (pthread_join(tip->sub_thread, NULL)) { + fatal("pthread_join", ERR_SYSCALL, "pthread sub join failed\n"); + /*NOTREACHED*/ + } + if (pthread_join(tip->rec_thread, NULL)) { + fatal("pthread_join", ERR_SYSCALL, "pthread rec join failed\n"); + /*NOTREACHED*/ + } + + io_destroy(tip->ctx); + + list_splice(&tip->used_iocbs, &tip->free_iocbs); + list_for_each_safe(p, q, &tip->free_iocbs) { + struct iocb_pkt *iocbp = list_entry(p, struct iocb_pkt, head); + + list_del(&iocbp->head); + if (iocbp->nbytes) + free(iocbp->iocb.u.c.buf); + free(iocbp); + } + + pthread_cond_destroy(&tip->cond); + pthread_mutex_destroy(&tip->mutex); +} + +/** + * add_input_file - Allocate and initialize per-input file structure + * @cpu: CPU for this file + * @devnm: Device name for this file + * @file_name: Fully qualifed input file name + */ +static void add_input_file(int cpu, char *devnm, char *file_name) +{ + struct stat buf; + struct io_file_hdr hdr; + struct thr_info *tip = buf_alloc(sizeof(*tip)); + __u64 my_version = mk_btversion(btver_mjr, btver_mnr, btver_sub); + + assert(0 <= cpu && cpu < ncpus); + + memset(&hdr, 0, sizeof(hdr)); + memset(tip, 0, sizeof(*tip)); + tip->cpu = cpu % cpus_to_use; + tip->iterations = def_iterations; + + tip->ifd = open(file_name, O_RDONLY); + if (tip->ifd < 0) { + fatal(file_name, ERR_ARGS, "Unable to open\n"); + /*NOTREACHED*/ + } + if (fstat(tip->ifd, &buf) < 0) { + fatal(file_name, ERR_SYSCALL, "fstat failed\n"); + /*NOTREACHED*/ + } + if (buf.st_size < (off_t)sizeof(hdr)) { + if (verbose) + fprintf(stderr, "\t%s empty\n", file_name); + goto empty_file; + } + + if (read(tip->ifd, &hdr, sizeof(hdr)) != sizeof(hdr)) { + fatal(file_name, ERR_ARGS, "Header read failed\n"); + /*NOTREACHED*/ + } + + if (hdr.version != my_version) { + fprintf(stderr, "%llx %llx %llx %llx\n", + (long long unsigned)hdr.version, + (long long unsigned)hdr.genesis, + (long long unsigned)hdr.nbunches, + (long long unsigned)hdr.total_pkts); + fatal(NULL, ERR_ARGS, + "BT version mismatch: %lx versus my %lx\n", + (long)hdr.version, (long)my_version); + + } + + if (hdr.nbunches == 0) { +empty_file: + close(tip->ifd); + free(tip); + return; + } + + if (hdr.genesis < genesis) { + if (verbose > 1) + fprintf(stderr, "Setting genesis to %llu.%llu\n", + du64_to_sec(hdr.genesis), + du64_to_nsec(hdr.genesis)); + genesis = hdr.genesis; + } + + tip->devnm = strdup(devnm); + tip->file_name = strdup(file_name); + + list_add_tail(&tip->head, &input_files); + + if (verbose) + fprintf(stderr, "Added %s %llu\n", file_name, + (long long)hdr.genesis); +} + +/** + * rem_input_file - Release resources associated with an input file + * @tip: Per-input file information + */ +static void rem_input_file(struct thr_info *tip) +{ + list_del(&tip->head); + + tip_release(tip); + + close(tip->ofd); + close(tip->ifd); + free(tip->file_name); + free(tip->devnm); + free(tip); +} + +/** + * rem_input_files - Remove all input files + */ +static void rem_input_files(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &input_files) { + rem_input_file(list_entry(p, struct thr_info, head)); + } +} + +/** + * __find_input_files - Find input files associated with this device (per cpu) + */ +static void __find_input_files(struct dev_info *dip) +{ + int cpu = 0; + + for (;;) { + char full_name[MAXPATHLEN]; + + sprintf(full_name, "%s/%s.%s.%d", idir, dip->devnm, ibase, cpu); + if (access(full_name, R_OK) != 0) + break; + + add_input_file(cpu, dip->devnm, full_name); + cpu++; + } + + if (!cpu) { + fatal(NULL, ERR_ARGS, "No traces found for %s\n", dip->devnm); + /*NOTREACHED*/ + } + + rem_input_dev(dip); +} + + +/** + * find_input_files - Find input files for all devices + */ +static void find_input_files(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &input_devs) { + __find_input_files(list_entry(p, struct dev_info, head)); + } +} + +/* + * ======================================================================== + * ==== RECLAIM ROUTINES ================================================== + * ======================================================================== + */ + +/** + * reap_wait_aios - Wait for and return number of outstanding AIOs + * + * Will return 0 if we are done + */ +static int reap_wait_aios(struct thr_info *tip) +{ + int naios = 0; + + if (!is_reap_done(tip)) { + pthread_mutex_lock(&tip->mutex); + while (tip->naios_out == 0) { + tip->reap_wait = 1; + if (pthread_cond_wait(&tip->cond, &tip->mutex)) { + fatal("pthread_cond_wait", ERR_SYSCALL, + "nfree_current cond wait failed\n"); + /*NOTREACHED*/ + } + } + naios = tip->naios_out; + pthread_mutex_unlock(&tip->mutex); + } + assert(is_reap_done(tip) || naios > 0); + + return is_reap_done(tip) ? 0 : naios; +} + +/** + * reclaim_ios - Reclaim AIOs completed, recycle IOCBs + * @tip: Per-thread information + * @naios_out: Number of AIOs we have outstanding (min) + */ +static void reclaim_ios(struct thr_info *tip, long naios_out) +{ + long i, ndone; + struct io_event *evp, events[naios_out]; + +again: + assert(naios > 0); + for (;;) { + ndone = io_getevents(tip->ctx, 1, naios_out, events, NULL); + if (ndone > 0) + break; + + if (errno && errno != EINTR) { + fatal("io_getevents", ERR_SYSCALL, + "io_getevents failed\n"); + /*NOTREACHED*/ + } + } + assert(0 < ndone && ndone <= naios_out); + + pthread_mutex_lock(&tip->mutex); + for (i = 0, evp = events; i < ndone; i++, evp++) { + struct iocb_pkt *iocbp = evp->data; + + if (evp->res != iocbp->iocb.u.c.nbytes) { + fatal(NULL, ERR_SYSCALL, + "Event failure %ld/%ld\t(%ld + %ld)\n", + (long)evp->res, (long)evp->res2, + (long)iocbp->iocb.u.c.offset / nb_sec, + (long)iocbp->iocb.u.c.nbytes / nb_sec); + /*NOTREACHED*/ + } + + list_move_tail(&iocbp->head, &tip->free_iocbs); + } + + tip->naios_free += ndone; + tip->naios_out -= ndone; + naios_out = minl(naios_out, tip->naios_out); + + if (tip->send_wait) { + tip->send_wait = 0; + pthread_cond_signal(&tip->cond); + } + pthread_mutex_unlock(&tip->mutex); + + /* + * Short cut: If we /know/ there are some more AIOs, go handle them + */ + if (naios_out) + goto again; +} + +/** + * replay_rec - Worker thread to reclaim AIOs + * @arg: Pointer to thread information + */ +static void *replay_rec(void *arg) +{ + long naios_out; + struct thr_info *tip = arg; + + while ((naios_out = reap_wait_aios(tip)) > 0) + reclaim_ios(tip, naios_out); + + assert(tip->send_done); + tip->reap_done = 1; + set_reclaim_done(); + + return NULL; +} + +/* + * ======================================================================== + * ==== REPLAY ROUTINES =================================================== + * ======================================================================== + */ + +/** + * next_bunch - Retrieve next bunch of AIOs to process + * @tip: Per-thread information + * @bunch: Bunch information + * + * Returns TRUE if we recovered a bunch of IOs, else hit EOF + */ +static int next_bunch(struct thr_info *tip, struct io_bunch *bunch) +{ + size_t count, result; + + result = read(tip->ifd, &bunch->hdr, sizeof(bunch->hdr)); + if (result != sizeof(bunch->hdr)) { + if (result == 0) + return 0; + + fatal(tip->file_name, ERR_SYSCALL, "Short hdr(%ld)\n", + (long)result); + /*NOTREACHED*/ + } + assert(bunch->hdr.npkts <= BT_MAX_PKTS); + + count = bunch->hdr.npkts * sizeof(struct io_pkt); + result = read(tip->ifd, &bunch->pkts, count); + if (result != count) { + fatal(tip->file_name, ERR_SYSCALL, "Short pkts(%ld/%ld)\n", + (long)result, (long)count); + /*NOTREACHED*/ + } + + return 1; +} + +/** + * nfree_current - Returns current number of AIOs that are free + * + * Will wait for available ones... + * + * Returns 0 if we have some condition that causes us to exit + */ +static int nfree_current(struct thr_info *tip) +{ + int nfree = 0; + + pthread_mutex_lock(&tip->mutex); + while (!is_send_done(tip) && ((nfree = tip->naios_free) == 0)) { + tip->send_wait = 1; + if (pthread_cond_wait(&tip->cond, &tip->mutex)) { + fatal("pthread_cond_wait", ERR_SYSCALL, + "nfree_current cond wait failed\n"); + /*NOTREACHED*/ + } + } + pthread_mutex_unlock(&tip->mutex); + + return nfree; +} + +/** + * stall - Stall for the number of nanoseconds requested + * + * We may be late, in which case we just return. + */ +static void stall(struct thr_info *tip, long long oclock) +{ + struct timespec req; + long long dreal, tclock = gettime() - rgenesis; + + oclock /= acc_factor; + + if (verbose > 1) + fprintf(tip->vfp, " stall(%lld.%09lld, %lld.%09lld)\n", + du64_to_sec(oclock), du64_to_nsec(oclock), + du64_to_sec(tclock), du64_to_nsec(tclock)); + + while (!is_send_done(tip) && tclock < oclock) { + dreal = oclock - tclock; + req.tv_sec = dreal / (1000 * 1000 * 1000); + req.tv_nsec = dreal % (1000 * 1000 * 1000); + + if (verbose > 1) { + fprintf(tip->vfp, "++ stall(%lld.%09lld) ++\n", + (long long)req.tv_sec, + (long long)req.tv_nsec); + } + + if (nanosleep(&req, NULL) < 0 && signal_done) + break; + + tclock = gettime() - rgenesis; + } +} + +/** + * iocbs_map - Map a set of AIOs onto a set of IOCBs + * @tip: Per-thread information + * @list: List of AIOs created + * @pkts: AIOs to map + * @ntodo: Number of AIOs to map + */ +static void iocbs_map(struct thr_info *tip, struct iocb **list, + struct io_pkt *pkts, int ntodo) +{ + int i; + struct io_pkt *pkt; + + assert(0 < ntodo && ntodo <= naios); + + pthread_mutex_lock(&tip->mutex); + assert(ntodo <= list_len(&tip->free_iocbs)); + for (i = 0, pkt = pkts; i < ntodo; i++, pkt++) { + __u32 rw = pkt->rw; + struct iocb_pkt *iocbp; + + if (!pkt->rw && !write_enabled) + rw = 1; + + if (verbose > 1) + fprintf(tip->vfp, "\t%10llu + %10llu %c%c\n", + (unsigned long long)pkt->sector, + (unsigned long long)pkt->nbytes / nb_sec, + rw ? 'R' : 'W', + (rw == 1 && pkt->rw == 0) ? '!' : ' '); + + iocbp = list_entry(tip->free_iocbs.next, struct iocb_pkt, head); + iocb_setup(iocbp, rw, pkt->nbytes, pkt->sector * nb_sec); + + list_move_tail(&iocbp->head, &tip->used_iocbs); + list[i] = &iocbp->iocb; + } + + tip->naios_free -= ntodo; + assert(tip->naios_free >= 0); + pthread_mutex_unlock(&tip->mutex); +} + +/** + * process_bunch - Process a bunch of requests + * @tip: Per-thread information + * @bunch: Bunch to process + */ +static void process_bunch(struct thr_info *tip, struct io_bunch *bunch) +{ + __u64 i = 0; + struct iocb *list[bunch->hdr.npkts]; + + assert(0 < bunch->hdr.npkts && bunch->hdr.npkts <= BT_MAX_PKTS); + while (!is_send_done(tip) && (i < bunch->hdr.npkts)) { + long ndone; + int ntodo = min(nfree_current(tip), bunch->hdr.npkts - i); + + assert(0 < ntodo && ntodo <= naios); + iocbs_map(tip, list, &bunch->pkts[i], ntodo); + if (!no_stalls) + stall(tip, bunch->hdr.time_stamp - genesis); + + if (ntodo) { + if (verbose > 1) + fprintf(tip->vfp, "submit(%d)\n", ntodo); + ndone = io_submit(tip->ctx, ntodo, list); + if (ndone != (long)ntodo) { + fatal("io_submit", ERR_SYSCALL, + "%d: io_submit(%d:%ld) failed (%s)\n", + tip->cpu, ntodo, ndone, + strerror(labs(ndone))); + /*NOTREACHED*/ + } + + pthread_mutex_lock(&tip->mutex); + tip->naios_out += ndone; + assert(tip->naios_out <= naios); + if (tip->reap_wait) { + tip->reap_wait = 0; + pthread_cond_signal(&tip->cond); + } + pthread_mutex_unlock(&tip->mutex); + + i += ndone; + assert(i <= bunch->hdr.npkts); + } + } +} + +/** + * reset_input_file - Reset the input file for the next iteration + * @tip: Thread information + * + * We also do a dummy read of the file header to get us to the first bunch. + */ +static void reset_input_file(struct thr_info *tip) +{ + struct io_file_hdr hdr; + + lseek(tip->ifd, 0, 0); + + if (read(tip->ifd, &hdr, sizeof(hdr)) != sizeof(hdr)) { + fatal(tip->file_name, ERR_ARGS, "Header reread failed\n"); + /*NOTREACHED*/ + } +} + +/** + * replay_sub - Worker thread to submit AIOs that are being replayed + */ +static void *replay_sub(void *arg) +{ + char path[MAXPATHLEN]; + struct io_bunch bunch; + struct thr_info *tip = arg; + int oflags; + + pin_to_cpu(tip); + + sprintf(path, "/dev/%s", map_dev(tip->devnm)); + +#ifdef O_NOATIME + oflags = O_NOATIME; +#else + oflags = 0; +#endif + tip->ofd = open(path, O_RDWR | O_DIRECT | oflags); + if (tip->ofd < 0) { + fatal(path, ERR_SYSCALL, "Failed device open\n"); + /*NOTREACHED*/ + } + + set_replay_ready(); + while (!is_send_done(tip) && tip->iterations--) { + wait_iter_start(); + if (verbose > 1) + fprintf(tip->vfp, "\n=== %d ===\n", tip->iterations); + while (!is_send_done(tip) && next_bunch(tip, &bunch)) + process_bunch(tip, &bunch); + set_iter_done(); + reset_input_file(tip); + } + tip->send_done = 1; + set_replay_done(); + + return NULL; +} + +/* + * ======================================================================== + * ==== COMMAND LINE ARGUMENT HANDLING ==================================== + * ======================================================================== + */ + +static char usage_str[] = \ + "\n" \ + "\t[ -c <cpus> : --cpus=<cpus> ] Default: 1\n" \ + "\t[ -d <dir> : --input-directory=<dir> ] Default: .\n" \ + "\t[ -F : --find-records ] Default: Off\n" \ + "\t[ -h : --help ] Default: Off\n" \ + "\t[ -i <base> : --input-base=<base> ] Default: replay\n" \ + "\t[ -I <iters>: --iterations=<iters> ] Default: 1\n" \ + "\t[ -M <file> : --map-devs=<file> ] Default: None\n" \ + "\t[ -N : --no-stalls ] Default: Off\n" \ + "\t[ -x : --acc-factor ] Default: 1\n" \ + "\t[ -v : --verbose ] Default: Off\n" \ + "\t[ -V : --version ] Default: Off\n" \ + "\t[ -W : --write-enable ] Default: Off\n" \ + "\t<dev...> Default: None\n" \ + "\n"; + +#define S_OPTS "c:d:Fhi:I:M:Nx:t:vVW" +static struct option l_opts[] = { + { + .name = "cpus", + .has_arg = required_argument, + .flag = NULL, + .val = 'c' + }, + { + .name = "input-directory", + .has_arg = required_argument, + .flag = NULL, + .val = 'd' + }, + { + .name = "find-records", + .has_arg = no_argument, + .flag = NULL, + .val = 'F' + }, + { + .name = "help", + .has_arg = no_argument, + .flag = NULL, + .val = 'h' + }, + { + .name = "input-base", + .has_arg = required_argument, + .flag = NULL, + .val = 'i' + }, + { + .name = "iterations", + .has_arg = required_argument, + .flag = NULL, + .val = 'I' + }, + { + .name = "map-devs", + .has_arg = required_argument, + .flag = NULL, + .val = 'M' + }, + { + .name = "no-stalls", + .has_arg = no_argument, + .flag = NULL, + .val = 'N' + }, + { + .name = "acc-factor", + .has_arg = required_argument, + .flag = NULL, + .val = 'x' + }, + { + .name = "verbose", + .has_arg = no_argument, + .flag = NULL, + .val = 'v' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'V' + }, + { + .name = "write-enable", + .has_arg = no_argument, + .flag = NULL, + .val = 'W' + }, + { + .name = NULL + } +}; + +/** + * handle_args: Parse passed in argument list + * @argc: Number of arguments in argv + * @argv: Arguments passed in + * + * Does rudimentary parameter verification as well. + */ +static void handle_args(int argc, char *argv[]) +{ + int c; + int r; + + while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) != -1) { + switch (c) { + case 'c': + cpus_to_use = atoi(optarg); + if (cpus_to_use <= 0 || cpus_to_use > ncpus) { + fatal(NULL, ERR_ARGS, + "Invalid number of cpus %d (0<x<%d)\n", + cpus_to_use, ncpus); + /*NOTREACHED*/ + } + break; + + case 'd': + idir = optarg; + if (access(idir, R_OK | X_OK) != 0) { + fatal(idir, ERR_ARGS, + "Invalid input directory specified\n"); + /*NOTREACHED*/ + } + break; + + case 'F': + find_records = 1; + break; + + case 'h': + usage(); + exit(0); + /*NOTREACHED*/ + + case 'i': + ibase = optarg; + break; + + case 'I': + def_iterations = atoi(optarg); + if (def_iterations <= 0) { + fprintf(stderr, + "Invalid number of iterations %d\n", + def_iterations); + exit(ERR_ARGS); + /*NOTREACHED*/ + } + break; + + case 'M': + read_map_devs(optarg); + break; + + case 'N': + no_stalls = 1; + break; + + case 'x': + r = sscanf(optarg,"%u",&acc_factor); + if (r!=1) { + fprintf(stderr, + "Invalid acceleration factor\n"); + exit(ERR_ARGS); + /*NOTREACHED*/ + } + break; + + case 'V': + fprintf(stderr, "btreplay -- version %s\n", + my_btversion); + fprintf(stderr, " Built on %s\n", + build_date); + exit(0); + /*NOTREACHED*/ + + case 'v': + verbose++; + break; + + case 'W': + write_enabled = 1; + break; + + default: + usage(); + fatal(NULL, ERR_ARGS, + "Invalid command line argument %c\n", c); + /*NOTREACHED*/ + } + } + + while (optind < argc) + add_input_dev(argv[optind++]); + + if (find_records) + find_input_devs(idir); + + if (list_len(&input_devs) == 0) { + fatal(NULL, ERR_ARGS, "Missing required input dev name(s)\n"); + /*NOTREACHED*/ + } + + if (cpus_to_use < 0) + cpus_to_use = ncpus; +} + +/* + * ======================================================================== + * ==== MAIN ROUTINE ====================================================== + * ======================================================================== + */ + +/** + * set_signal_done - Signal handler, catches signals & sets signal_done + */ +static void set_signal_done(__attribute__((__unused__))int signum) +{ + signal_done = 1; +} + +/** + * main - + * @argc: Number of arguments + * @argv: Array of arguments + */ +int main(int argc, char *argv[]) +{ + int i; + struct list_head *p; + + pgsize = getpagesize(); + assert(pgsize > 0); + + setup_signal(SIGINT, set_signal_done); + setup_signal(SIGTERM, set_signal_done); + + get_ncpus(); + handle_args(argc, argv); + find_input_files(); + + nfiles = list_len(&input_files); + __list_for_each(p, &input_files) { + tip_init(list_entry(p, struct thr_info, head)); + } + + wait_replays_ready(); + for (i = 0; i < def_iterations; i++) { + rgenesis = gettime(); + start_iter(); + if (verbose) + fprintf(stderr, "I"); + wait_iters_done(); + } + + wait_replays_done(); + wait_reclaims_done(); + + if (verbose) + fprintf(stderr, "\n"); + + rem_input_files(); + release_map_devs(); + + return 0; +} diff --git a/btreplay/doc/Makefile b/btreplay/doc/Makefile new file mode 100644 index 0000000..e3b383e --- /dev/null +++ b/btreplay/doc/Makefile @@ -0,0 +1,18 @@ +DOCTMP = btreplay.log btreplay.aux btreplay.dvi btreplay.toc + +all: btreplay.dvi btreplay.pdf + +btreplay.tex: + @touch btreplay.tex + +btreplay.dvi: btreplay.tex abstract.tex + @latex btreplay.tex + @latex btreplay.tex + +btreplay.pdf: btreplay.dvi + @dvipdfm -p letter btreplay + +clean: + -rm -f $(DOCTMP) + -rm -f *.bak *.ps *.pdf + @rm -rf btreplay diff --git a/btreplay/doc/abstract.tex b/btreplay/doc/abstract.tex new file mode 100644 index 0000000..314d820 --- /dev/null +++ b/btreplay/doc/abstract.tex @@ -0,0 +1,34 @@ +% +% Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +% +% vi :set textwidth=75 +% +The \texttt{btrecord} and \texttt{btreplay} tools provide the ability to +record and replay IOs captured by the \texttt{blktrace} utility. Attempts +are made to maintain ordering, CPU mappings and time-separation of IOs. The +general workflow is expected to be: + +\begin{enumerate} + \item Initiate \texttt{blktrace} to capture traces + \item Generate traces\ldots + \item Stop \texttt{blktrace} + \item Run \texttt{btrecord} to convert traces into IO records + \item Utilize \texttt{btreplay} to replay IOs +\end{enumerate} + +This document will discuss the operating characteristics of +\texttt{btreplay} and provide detailed command line option descriptions. diff --git a/btreplay/doc/btreplay.tex b/btreplay/doc/btreplay.tex new file mode 100644 index 0000000..8b0ecf7 --- /dev/null +++ b/btreplay/doc/btreplay.tex @@ -0,0 +1,532 @@ +% +% Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +% +% vi :set textwidth=75 +% +\documentclass{article} +\usepackage{multirow,graphicx,placeins} + +\begin{document} +%--------------------- +\title{\texttt{btrecord} and \texttt{btreplay} User Guide} +\author{Alan D. Brunelle (Alan.Brunelle@hp.com)} +\date{\today} +\maketitle +\begin{abstract} +\input{abstract.tex} +\end{abstract} +\thispagestyle{empty}\newpage +%--------------------- +\tableofcontents\thispagestyle{empty}\newpage +%--------------------- +\section{Introduction} +\input{abstract.tex} + +\bigskip +This document presents the command line overview for +\texttt{btrecord} and \texttt{btreplay}, and shows some commonly used +example usages of it in everyday work here at OSLO's Scalability and +Performance Group. + +\subsection*{Build Note} + +To build these tools, one needs to +place the source directory next to a valid +\texttt{blktrace}\footnote{\texttt{git://git.kernel.dk/blktrace.git}} +directory, as it includes \texttt{../blktrace} in the \texttt{Makefile}. + + +%--------------------- +\newpage\section{\texttt{btrecord} and \texttt{btreplay} Operating Model} + +The \texttt{blktrace} utility provides the ability to collect detailed +traces from the kernel for each IO processed by the block IO layer. The +traces provide a complete timeline for each IO processed, including +detailed information concerning when an IO was first received by the block +IO layer -- indicating the device, CPU number, time stamp, IO direction, +sector number and IO size (number of sectors). Using this information, +one is able to \emph{replay} the IO again on the same machine or another +set up entirely. + +\subsection{Basic Workflow} +The basic operating work-flow to replay IOs would be something like: + +\begin{enumerate} + \item Run \texttt{blktrace} to collect traces. Here you specify the + device or devices that you wish to trace and later replay IOs upon. Note: + the only traces you are interested in are \emph{QUEUE} requests -- + thus, to save system resources (including storage for traces), one could + specify the \texttt{-a queue} command line option to \texttt{blktrace}. + + \item While \texttt{blktrace} is running, you run the workload that you + are interested in. + + \item When the work load has completed, you stop the \texttt{blktrace} + utility (thus saving all traces over the complete workload). + + \item You extract the pertinent IO information from the traces saved by + \texttt{blktrace} using the \texttt{btrecord} utility. This will parse + each trace file created by \texttt{blktrace}, and craft IO descriptions + to be used in the next phase of the workload processing. + + \item Once \texttt{btrecord} has successfully created a series of data + files to be processed, you can run the \texttt{btreplay} utility which + attempts to generate the same IOs seen during the sample workload phase. +\end{enumerate} + +\subsection{IO Stream Replay Characteristics} + The major characteristics of the IO stream that are kept intact include: + + \begin{description} + \item[Device] The IOs are replayed on the same device as was seen + during the sample workload. + + \item[IO direction] The same IO direction (read/write) is maintained. + + \item[IO offset] The same device offset is maintained. + + \item[IO size] The same number of sectors are transferred. + + \item[Time differential] The time stamps stored during the + \texttt{blktrace} run are used to determine the amount of time between + IOs during the sample workload. \texttt{btreplay} \emph{attempts} to + maintain the same time differential between IOs, but no guarantees as + to complete accuracy are provided by the utility. + + \item[Device IO Stream Ordering] All IOs on a device are submitted in + the precise order they were seen during the sample workload run. + \end{description} + + As noted above, the time between IOs may not be accurately maintained + during replays. In addition the actual ordering of IOs \emph{between} + devices is not necessarily maintained. (Each device with an IO stream + maintains its own concept of time, and thus there may be slippage of the + time kept between managing threads.) + + \begin{quotation} + We have prototyped a different approach, wherein a single managing + thread handles all IOs across all devices. This approach, while + guaranteeing correct ordering of IOs across all devices, resulted in + much worse timing on a per IO basis. + \end{quotation} + +\subsection{\texttt{btrecord/btreplay} Method of Operation} + +As noted above, \texttt{btrecord} extracts \texttt{QUEUE} operations from +\texttt{blktrace} output. These \texttt{QUEUE} operations indicate the +entrance of IOs into the block IO layer. In order to replay these IOs with +some accuracy in regards to ordering and timeliness, we decided to take +multiple sequential (in time) IOs and put them in a single \emph{bunch} of +IOs that will be processed as a single \emph{asynchronous IO} call to the +kernel\footnote{Attempts to do them individually resulted in too large of a +turnaround time penalty (user-space to kernel and back). Note that in a +number of workloads, the IOs are coming in from the page cache handling +code, and thus are submitted to the block IO layer with \emph{very small} +time intervals between issues.}. To manage the size of the \emph{bunches}, +the \texttt{btrecord} utility provides you with two controlling knobs: + +\begin{description} + \item[\texttt{--max-bunch-time}] This is the amount of time to encompass + in one bunch -- only IOs within the time specified are eligible + for \emph{bunching.} The default time is 10 milliseconds (10,000,000 + nanoseconds). Refer to section~\ref{sec:c-o-m} on page~\pageref{sec:c-o-m} + for more information. + + \item[\texttt{--max-pkts}] A \emph{bunch} size can be anywhere from + 1 to 512 packets in size and by default we max a bunch to contain no + more than 8 individual IOs. With this option, one can increase or + decrease the maximum \emph{bunch} size. Refer to section~\ref{sec:c-o-M} + on page~\pageref{sec:c-o-M} for more information. +\end{description} + +Each input data file (one per device per CPU) results in a new record +data file (again, one per device per CPU) which contains information +about \emph{bunches} of IOs to be replayed. \texttt{btreplay} operates on +these record data files by spawning a new pair of threads per file. One +thread manages the submitting of AIOs per bunch in the record data file, +while the other thread manages reclaiming AIOs completed\footnote{We +have found that having the same thread do both results in a further +reduction in replay timing accuracy.}. + +Each submitting thread simply reads the input file of \emph{bunches} +recorded by \texttt{btrecord}, and attempts to faithfully reproduce the +ordering and timing of IOs seen during the sample workload. The reclaiming +thread simply waits for AIO completions, freeing up resources for the +submitting thread to utilize to submit new AIOs. + +The number of CPUs being used on the replay system can be different from +the number on the recorded system. To help with mappings here the +\texttt{--cpus} option allows one to state how many CPUs on the replay +system to utilize. If the number of CPUs on the replay system is less than +on the recording system, we wrap CPU IDs. This \emph{may} result in an +overload of CPU processing capabilities on the replay system. (Refer to +section~\ref{sec:p-o-c} on page~\pageref{sec:p-o-c} for more details about the +\texttt{--cpus} option.) + +\newpage\subsection{Known Deficiencies and Proposed Possible Fixes} + +The overall known deficiencies with this current set of utilities is +outlined here, in some cases ideas on additions and/or improvements are +included as well. + +\begin{enumerate} + \item Lack of IO ordering across devices. + + \begin{quote} + \emph{We could institute the notion of global time across threads, + and thus ensure IO ordering across devices, with some reduction in + timing accuracy.} + \end{quote} + + \item Lack of IO timing accuracy -- additional time between IO bunches. + + \begin{quote} + \emph{This is the primary problem with any IO replay mechanism -- how + to guarantee per-IO timing accuracy with respect to other replayed IOs? + One idea to reduce errors in this area would be to push the IO replay + into the kernel, where you \emph{may} receive more responsive timings.} + \end{quote} + + \item Bunching of IOs results in reduced time amongst IOs within a bunch. + + \begin{quote} + \emph{The user has \emph{some} control over this (via the + \texttt{--max-pkts} option). One \emph{could} simply specify + \texttt{-max-pkts=1} and then each IO would be treated individually. Of + course, this would probably then run into the problem of excessive + inter-IO times.} + \end{quote} + + \item 1-to-1 mapping of devices -- for now the devices on the replay + machine must be the same as on the recording machine. + + \begin{quote} + \emph{It should be relatively trivial to add in the notion of + mapping -- simply include a file that is read which maps devices + on one machine to devices (with offsets and sizes) on the replay + machine\footnote{The notion of an offset and device size to replay on + could be used to both allow for a single device to masquerade as more + than one device, and could be utilized in case the replay device is + smaller than the recorded device.}.} + + \medskip\emph{One could also add in the notion of CPU mappings as well -- + device $D_{rec}$ managed by CPU $C_{rec}$ on the recorded system + shall be replayed on device $D_{rep}$ and CPU $C_{rep}$ on the + replay machine.} + + \bigskip + \begin{quote} + With version 0.9.1 we now support the \texttt{-M} option to do this + -- see section~\ref{sec:p-o-M} on page~\pageref{sec:p-o-M} for more + information on device mapping. + \end{quote} + \end{quote} + +\end{enumerate} + +%--------------------- +\newpage\section{\label{sec:command-line}Command Line Options} +\subsection{\texttt{btrecord} Command Line Options} +\begin{figure}[h!] +\begin{verbatim} +Usage: btrecord -- version 0.9.3 + + [ -d <dir> : --input-directory=<dir> ] Default: . + [ -D <dir> : --output-directory=<dir>] Default: . + [ -F : --find-traces ] Default: Off + [ -h : --help ] Default: Off + [ -m <nsec> : --max-bunch-time=<nsec> ] Default: 10 msec + [ -M <pkts> : --max-pkts=<pkts> ] Default: 8 + [ -o <base> : --output-base=<base> ] Default: replay + [ -v : --verbose ] Default: Off + [ -V : --version ] Default: Off + <dev>... Default: None +\end{verbatim} +\caption{\label{fig:btrecord--help}\texttt{btrecord --help} Output} +\end{figure} +\FloatBarrier + +\subsubsection{\label{sec:c-o-d}\texttt{-d} or +\texttt{--input-directory}\\Set Input Directory} + +The \texttt{-d} option requires a single parameter providing the directory +name for where input files are to be found. The default directory is the +current directory (\texttt{.}). + +\subsubsection{\label{sec:c-o-D}\texttt{-D} or +\texttt{--output-directory}\\Set Output Directory} + +The \texttt{-D} option requires a single parameter providing the directory +name for where output files are to be placed. The default directory is the +current directory (\texttt{.}). + +\subsubsection{\texttt{-F} or \texttt{--find-traces}\\Find Trace Files +Automatically} + +The \texttt{-F} option instructs \texttt{btrecord} to go find all the +trace files in the directory specified (either via the \texttt{-d} +option, or in the default directory '.'). + +\subsubsection{\texttt{-h} or \texttt{--help}\\Display Help Message} +\subsubsection{\texttt{-V} or \texttt{--version}\\Display +\texttt{btrecord}Version} + +The \texttt{-h} option displays the command line options and +defaults, as presented in figure~\ref{fig:btrecord--help} on +page~\pageref{fig:btrecord--help}. + +The \texttt{-V} option displays the \texttt{btreplay} version, as shown here: + +\begin{verbatim} +$ btrecord --version +btrecord -- version 0.9.0 +\end{verbatim} + +Both commands exit immediately after processing the option. + +\subsubsection{\label{sec:c-o-m}\texttt{-m} or +\texttt{--max-bunch-time}\\Set Maximum Time Per Bunch} + +The \texttt{-m} option requires a single parameter which specifies an +amount of time (in nanoseconds) to include in any one bunch of IOs that +are to be processed. The smaller the value, the smaller the number of +IOs processed at one time -- perhaps yielding in more realistic replay. +However, after a certain point the amount of overhead per bunch may result +in additional real replay time, thus yielding less accurate replay times. + +The default value is 10,000,000 nanoseconds (10 milliseconds). + +\subsubsection{\label{sec:c-o-M}\texttt{-M} or +\texttt{--max-pkts}\\Set Maximum Packets Per Bunch} + +The \texttt{-M} option requires a single parameter which specifies the +maximum number of IOs to store in a single bunch. As with the \texttt{-m} +option (section~\ref{sec:c-o-m}), smaller values \emph{may} or \emph{may not} +yield more accurate replay times. + +The default value is 8, with a maximum value of up to 512 being supported. + +\subsubsection{\label{sec:c-o-o}\texttt{-o} or +\texttt{--output-base}\\Set Base Name for Output Files} + +Each output file has 3 fields: + +\begin{enumerate} + \item Device identifier (taken directly from the device name of the + \texttt{blktrace} output file). + + \item \texttt{btrecord} base name -- by default ``replay''. + + \item And the CPU number (again, taken directly from the + \texttt{blktrace} output file name). +\end{enumerate} + +This option requires a single parameter that will override the default name +(replay), and replace it with the specified value. + +\subsubsection{\label{sec:c-o-v}\texttt{-v} or +\texttt{--verbose}\\Select Verbose Output} + +This option will output some simple statistics at the end of a successful +run. Figure~\ref{fig:verb-out} (page~\pageref{fig:verb-out}) shows +an example of some output, while figure~\ref{fig:verb-defs} +(page~\pageref{fig:verb-defs}) shows what the fields mean. + +\begin{figure}[h!] +\begin{verbatim} +sdab:0: 580661 pkts (tot), 126030 pkts (replay), 89809 bunches, 1.4 pkts/bunch +sdab:1: 2559775 pkts (tot), 430172 pkts (replay), 293029 bunches, 1.5 pkts/bunch +sdab:2: 653559 pkts (tot), 136522 pkts (replay), 102288 bunches, 1.3 pkts/bunch +sdab:3: 474773 pkts (tot), 117849 pkts (replay), 69572 bunches, 1.7 pkts/bunch +\end{verbatim} +\caption{\label{fig:verb-out}Verbose Output Example} +\end{figure} +\FloatBarrier + +\begin{figure}[h!] +\begin{description} + \item[Field 1] The first field contains the device name and CPU + identifier. Thus: \texttt{sdab:0:} means the device \texttt{sdab} and + traces on CPU 0. + + \item[Field 2] The second field contains the total number of packets + processed for each device file. + + \item[Field 3] The next field shows the number of packets eligible for + replay. + + \item[Field 4] The fourth field contains the total number of IO bunches. + + \item[Field 5] The last field shows the average number of IOs per bunch + recorded. +\end{description} +\caption{\label{fig:verb-defs}Verbose Field Definitions} +\end{figure} +\FloatBarrier + +%--------------------- +\newpage\subsection{\texttt{btreplay} Command Line Options} +\begin{figure}[h!] +\begin{verbatim} +Usage: btreplay -- version 0.9.3 + + [ -c <cpus> : --cpus=<cpus> ] Default: 1 + [ -d <dir> : --input-directory=<dir> ] Default: . + [ -F : --find-records ] Default: Off + [ -h : --help ] Default: Off + [ -i <base> : --input-base=<base> ] Default: replay + [ -I <iters>: --iterations=<iters> ] Default: 1 + [ -M <file> : --map-devs=<file> ] Default: None + [ -N : --no-stalls ] Default: Off + [ -x <int> : --acc-factor=<int> ] Default: 1 + [ -v : --verbose ] Default: Off + [ -V : --version ] Default: Off + [ -W : --write-enable ] Default: Off + <dev...> Default: None +\end{verbatim} +\caption{\label{fig:btreplay--help}\texttt{btreplay --help} Output} +\end{figure} +\FloatBarrier + +\subsubsection{\label{sec:p-o-c}\texttt{-c} or +\texttt{--cpus}\\Set Number of CPUs to Use} + +\subsubsection{\label{sec:p-o-d}\texttt{-d} or +\texttt{--input-directory}\\Set Input Directory} + +The \texttt{-d} option requires a single parameter providing the directory +name for where input files are to be found. The default directory is the +current directory (\texttt{.}). + +\subsubsection{\texttt{-F} or \texttt{--find-records}\\Find RecordFiles +Automatically} + +The \texttt{-F} option instructs \texttt{btreplay} to go find all the +record files in the directory specified (either via the \texttt{-d} +option, or in the default directory '.'). + +\subsubsection{\texttt{-h} or \texttt{--help}\\Display Help Message} +\subsubsection{\texttt{-V} or \texttt{--version}\\Display +\texttt{btreplay}Version} + +The \texttt{-h} option displays the command line options and +defaults, as presented in figure~\ref{fig:btreplay--help} on +page~\pageref{fig:btreplay--help}. + +The \texttt{-V} option displays the \texttt{btreplay} version, as show here: + +\begin{verbatim} +$ btreplay --version +btreplay -- version 0.9.0 +\end{verbatim} + +Both commands exit immediately after processing the option. + +\subsubsection{\label{sec:p-o-i}\texttt{-i} or +\texttt{--input-base}\\Set Base Name for Input Files} + +Each input file has 3 fields: + +\begin{enumerate} + \item Device identifier (taken directly from the device name of the + \texttt{blktrace} output file). + + \item \texttt{btrecord} base name -- by default ``replay''. + + \item And the CPU number (again, taken directly from the + \texttt{blktrace} output file name). +\end{enumerate} + +This option requires a single parameter that will override the default name +(replay), and replace it with the specified value. + +\subsubsection{\label{sec:p-o-I}\texttt{-I} or +\texttt{--iterations}\\Set Number of Iterations to Run} + +This option requires a single parameter which specifies the number of times +to run through the input files. The default value is 1. + +\subsubsection{\label{sec:p-o-M}\texttt{-M} or \texttt{map-devs}\\ +Specify Device Mappings} + +This option requires a single parameter which specifies the name of a +file containing device mappings. The file must be very simply managed, with +just two pieces of data per line: + +\begin{enumerate} + \item The device name on the recorded system (with the \texttt{'/dev/'} + removed). Example: \texttt{/dev/sda} would just be \texttt{sda}. + + \item The device name on the replay system to use (again, without the + \texttt{'/dev/'} path prepended). +\end{enumerate} + +An example file for when one would map devices \texttt{/dev/sda} and +\texttt{/dev/sdb} on the recorded system to \texttt{dev/sdg} and +\texttt{sdh} on the replay system would be: + +\begin{verbatim} +sda sdg +sdb sdh +\end{verbatim} + +The only entries in the file that are allowed are these two element lines +-- we do not (yet?) support the notion of blank lines, or comment lines, or +the like. + +The utility \emph{does} allow for multiple \texttt{-M} options to be +supplied on the command line. + +\subsubsection{\label{sec:o-N}\texttt{-N} or \texttt{--no-stalls}\\Disable +Pre-bunch Stalls} + +When specified on the command line, all pre-bunch stall indicators will be +ignored. IOs will be replayed without inter-bunch delays. + +\subsubsection{\label{sec:o-x}\texttt{-x} or \texttt{--acc-factor}\\Acceleration +Factor} + + While the \texttt{--no-stalls} option allows the traces to be replayed + with no waiting time, this option specifies some acceleration factor + to be used. If the value of two is used, then the stall time is + divided by half resulting in a reduction of the execution time by + this factor. Note that if this number is too high, the results will + be equivalent of not having stall. + +\subsubsection{\label{sec:p-o-v}\texttt{-v} or +\texttt{--verbose}\\Select Verbose Output} + +When specified on the command line, this option instructs \texttt{btreplay} +to store information concerning each \emph{stall} and IO operation +performed by \texttt{btreplay}. The name of each file so created will be +the input file name used with an extension of \texttt{.rep} appended onto +it. Thus, an input file of the name \texttt{sdab.replay.3} would generate a +verbose output file with the name \texttt{sdab.replay.3.rep} in the +directory specified for input files. + +In addition, \texttt{btreplay} will also output to \texttt{stderr} the +names of the input files being processed. + +\subsubsection{\label{sec:p-o-W}\texttt{-W} or +\texttt{--write-enable}\\Enable Writing During Replay} + +As a precautionary measure, by default \texttt{btreplay} will \emph{not} +process \emph{write} requests. In order to enable \texttt{btreplay} to +actually \emph{write} to devices one must explicitly specify the +\texttt{-W} option. + +\end{document} diff --git a/btt/.Android.mk.swp b/btt/.Android.mk.swp Binary files differnew file mode 100644 index 0000000..2c92d7b --- /dev/null +++ b/btt/.Android.mk.swp diff --git a/btt/Android.mk b/btt/Android.mk new file mode 100644 index 0000000..26a3b93 --- /dev/null +++ b/btt/Android.mk @@ -0,0 +1,23 @@ +ifneq ($(TARGET_SIMULATOR), true) + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := args.c bt_timeline.c devmap.c devs.c dip_rb.c iostat.c \ + latency.c misc.c output.c proc.c seek.c trace.c \ + trace_complete.c trace_im.c trace_issue.c \ + trace_queue.c trace_remap.c trace_requeue.c \ + ../rbtree.c mmap.c trace_plug.c bno_dump.c \ + unplug_hist.c q2d.c aqd.c plat.c + +LOCAL_C_INCLUDES := external/blktrace external/blktrace/btt + +LOCAL_CFLAGS := -O2 -g -W -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 \ + -D_ANDROID_ + +LOCAL_MODULE := btt +LOCAL_MODULE_TAGS := +LOCAL_SYSTEM_SHARED_LIBRARIES := libc +include $(BUILD_EXECUTABLE) + +endif diff --git a/btt/Makefile b/btt/Makefile new file mode 100644 index 0000000..1f6dacc --- /dev/null +++ b/btt/Makefile @@ -0,0 +1,45 @@ +# +# OCFLAGS: +# COUNT_IOS - Counts struct io's left at end +# DEBUG - Various and sundy debug asserts +# NDEBUG - Defined: no asserts, Undefined: asserts +# + +CC = gcc +CFLAGS = -Wall -W -O2 -g +INCS = -I. -I.. +XCFLAGS = -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +override CFLAGS += $(INCS) $(XCFLAGS) + +PROGS = btt +LIBS = $(PLIBS) $(ELIBS) +OBJS = args.o bt_timeline.o devmap.o devs.o dip_rb.o iostat.o latency.o \ + misc.o output.o proc.o seek.o trace.o trace_complete.o trace_im.o \ + trace_issue.o trace_queue.o trace_remap.o trace_requeue.o \ + ../rbtree.o mmap.o trace_plug.o bno_dump.o unplug_hist.o q2d.o \ + aqd.o plat.o + +all: depend $(PROGS) + +.PHONY : depend +depend: $(patsubst %.o,%.c,$(filter %.o,$(OBJS))) + @$(CC) -MM $(CFLAGS) -I.. $^ 1> .depend + +docs: + $(MAKE) -C doc all + +docsclean: + $(MAKE) -C doc clean + +clean: docsclean + -rm -f *.o $(PROGS) .depend + +%.o: %.c + $(CC) $(CFLAGS) -c -o $*.o $< + +btt: $(OBJS) + $(CC) $(CFLAGS) -o $@ $(filter %.o,$^) $(LIBS) + +ifneq ($(wildcard .depend),) +include .depend +endif diff --git a/btt/README b/btt/README new file mode 100644 index 0000000..c395a67 --- /dev/null +++ b/btt/README @@ -0,0 +1,17 @@ +blktrace Timeline +----------------- + +Alan D. Brunelle (initial version) + +Please refer to the documentation for details. + +Resources +--------- + +vger hosts a mailing list dedicated to btrace discussion and development. +The list is called linux-btrace@vger.kernel.org, subscribe by sending +a mail to majordomo@vger.kernel.org with 'subscribe linux-btrace' in +the mail body. + +2006-04-16, Alan D. Brunelle <Alan.Brunelle@hp.com> + diff --git a/btt/aqd.c b/btt/aqd.c new file mode 100644 index 0000000..3a45161 --- /dev/null +++ b/btt/aqd.c @@ -0,0 +1,80 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "globals.h" + +struct aqd_info { + FILE *fp; + int na; /* # active */ +}; + +void *aqd_alloc(char *str) +{ + char *oname; + struct aqd_info *ap; + + if (aqd_name == NULL) return NULL; + + ap = malloc(sizeof(*ap)); + ap->na = 0; + + oname = malloc(strlen(aqd_name) + strlen(str) + 32); + sprintf(oname, "%s_%s.dat", aqd_name, str); + if ((ap->fp = my_fopen(oname, "w")) == NULL) { + perror(oname); + return NULL; + } + add_file(ap->fp, oname); + + return ap; + +} + +void aqd_free(void *info) +{ + free(info); +} + +void aqd_issue(void *info, double ts) +{ + if (info) { + struct aqd_info *ap = info; + + fprintf(ap->fp, "%lf %d\n%lf %d\n", ts, ap->na, ts, ap->na + 1); + ap->na += 1; + } +} + +void aqd_complete(void *info, double ts) +{ + if (info) { + struct aqd_info *ap = info; + + if (ap->na > 0) { + fprintf(ap->fp, "%lf %d\n%lf %d\n", + ts, ap->na, ts, ap->na - 1); + ap->na -= 1; + } + } +} diff --git a/btt/args.c b/btt/args.c new file mode 100644 index 0000000..ed53b8b --- /dev/null +++ b/btt/args.c @@ -0,0 +1,414 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <getopt.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include "globals.h" + +#define SETBUFFER_SIZE (64 * 1024) + +#define S_OPTS "aAB:d:D:e:hi:I:l:L:m:M:o:p:P:q:Q:rs:S:t:T:u:VvXz:" +static struct option l_opts[] = { + { + .name = "seek-absolute", + .has_arg = no_argument, + .flag = NULL, + .val = 'a' + }, + { + .name = "all-data", + .has_arg = no_argument, + .flag = NULL, + .val = 'A' + }, + { + .name = "dump-blocknos", + .has_arg = required_argument, + .flag = NULL, + .val = 'B' + }, + { + .name = "range-delta", + .has_arg = required_argument, + .flag = NULL, + .val = 'd' + }, + { + .name = "devices", + .has_arg = required_argument, + .flag = NULL, + .val = 'D' + }, + { + .name = "exes", + .has_arg = required_argument, + .flag = NULL, + .val = 'e' + }, + { + .name = "help", + .has_arg = no_argument, + .flag = NULL, + .val = 'h' + }, + { + .name = "input-file", + .has_arg = required_argument, + .flag = NULL, + .val = 'i' + }, + { + .name = "iostat", + .has_arg = required_argument, + .flag = NULL, + .val = 'I' + }, + { + .name = "d2c-latencies", + .has_arg = required_argument, + .flag = NULL, + .val = 'l' + }, + { + .name = "periodic-latencies", + .has_arg = required_argument, + .flag = NULL, + .val = 'L' + }, + { + .name = "seeks-per-second", + .has_arg = required_argument, + .flag = NULL, + .val = 'm' + }, + { + .name = "dev-maps", + .has_arg = required_argument, + .flag = NULL, + .val = 'M' + }, + { + .name = "output-file", + .has_arg = required_argument, + .flag = NULL, + .val = 'o' + }, + { + .name = "per-io-dump", + .has_arg = required_argument, + .flag = NULL, + .val = 'p' + }, + { + .name = "per-io-trees", + .has_arg = required_argument, + .flag = NULL, + .val = 'P' + }, + { + .name = "q2c-latencies", + .has_arg = required_argument, + .flag = NULL, + .val = 'q' + }, + { + .name = "active-queue-depth", + .has_arg = required_argument, + .flag = NULL, + .val = 'Q' + }, + { + .name = "no-remaps", + .has_arg = no_argument, + .flag = NULL, + .val = 'r' + }, + { + .name = "seeks", + .has_arg = required_argument, + .flag = NULL, + .val = 's' + }, + { + .name = "iostat-interval", + .has_arg = required_argument, + .flag = NULL, + .val = 'S' + }, + { + .name = "time-start", + .has_arg = required_argument, + .flag = NULL, + .val = 't' + }, + { + .name = "time-end", + .has_arg = required_argument, + .flag = NULL, + .val = 'T' + }, + { + .name = "unplug-hist", + .has_arg = required_argument, + .flag = NULL, + .val = 'u' + }, + { + .name = "version", + .has_arg = no_argument, + .flag = NULL, + .val = 'V' + }, + { + .name = "verbose", + .has_arg = no_argument, + .flag = NULL, + .val = 'v' + }, + { + .name = "easy-parse-avgs", + .has_arg = no_argument, + .flag = NULL, + .val = 'X' + }, + { + .name = "q2d-latencies", + .has_arg = required_argument, + .flag = NULL, + .val = 'z' + }, + { + .name = NULL, + } +}; + +static char usage_str[] = \ + "\n[ -a | --seek-absolute ]\n" \ + "[ -A | --all-data ]\n" \ + "[ -B <output name> | --dump-blocknos=<output name> ]\n" \ + "[ -d <seconds> | --range-delta=<seconds> ]\n" \ + "[ -D <dev;...> | --devices=<dev;...> ]\n" \ + "[ -e <exe,...> | --exes=<exe,...> ]\n" \ + "[ -h | --help ]\n" \ + "[ -i <input name> | --input-file=<input name> ]\n" \ + "[ -I <output name> | --iostat=<output name> ]\n" \ + "[ -l <output name> | --d2c-latencies=<output name> ]\n" \ + "[ -L <freq> | --periodic-latencies=<freq> ]\n" \ + "[ -m <output name> | --seeks-per-second=<output name> ]\n" \ + "[ -M <dev map> | --dev-maps=<dev map>\n" \ + "[ -o <output name> | --output-file=<output name> ]\n" \ + "[ -p <output name> | --per-io-dump=<output name> ]\n" \ + "[ -P <output name> | --per-io-trees=<output name> ]\n" \ + "[ -q <output name> | --q2c-latencies=<output name> ]\n" \ + "[ -Q <output name> | --active-queue-depth=<output name> ]\n" \ + "[ -r | --no-remaps ]\n" \ + "[ -s <output name> | --seeks=<output name> ]\n" \ + "[ -S <interval> | --iostat-interval=<interval> ]\n" \ + "[ -t <sec> | --time-start=<sec> ]\n" \ + "[ -T <sec> | --time-end=<sec> ]\n" \ + "[ -u <output name> | --unplug-hist=<output name> ]\n" \ + "[ -V | --version ]\n" \ + "[ -v | --verbose ]\n" \ + "[ -X | --easy-parse-avgs ]\n" \ + "[ -z <output name> | --q2d-latencies=<output name> ]\n" \ + "\n"; + +static void usage(char *prog) +{ + fprintf(stderr, "Usage: %s %s %s", prog, bt_timeline_version, + usage_str); +} + +static FILE *setup_ofile(char *fname) +{ + if (fname) { + char *buf; + FILE *ofp = my_fopen(fname, "w"); + + if (!ofp) { + perror(fname); + exit(1); + } + + buf = malloc(SETBUFFER_SIZE); + setbuffer(ofp, buf, SETBUFFER_SIZE); + + add_file(ofp, fname); + add_buf(buf); + + return ofp; + } + + return NULL; +} + +static FILE *std_open(char *output_name, char *sfx, char *msg) +{ + FILE *fp; + char fname[strlen(output_name) + 32]; + + sprintf(fname, "%s.%s", output_name, sfx); + fp = my_fopen(fname, "w"); + if (fp == NULL) { + perror(fname); + exit(1); + } + if (verbose) + printf("Sending %s to %s\n", msg, fname); + + return fp; +} + +void handle_args(int argc, char *argv[]) +{ + int c; + + while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) != -1) { + switch (c) { + case 'a': + seek_absolute = 1; + break; + case 'A': + output_all_data = 1; + break; + case 'B': + bno_dump_name = optarg; + break; + case 'd': + sscanf(optarg, "%lf", &range_delta); + break; + case 'D': + devices = optarg; + break; + case 'e': + exes = optarg; + break; + case 'h': + usage(argv[0]); + exit(0); + case 'i': + input_name = optarg; + break; + case 'l': + d2c_name = optarg; + break; + case 'L': + plat_freq = atof(optarg); + break; + case 'I': + iostat_name = strdup(optarg); + break; + case 'm': + sps_name = optarg; + break; + case 'M': + if (dev_map_read(optarg)) + exit(1); + break; + case 'o': + output_name = optarg; + break; + case 'p': + per_io_name = strdup(optarg); + break; + case 'P': + per_io_trees = optarg; + break; + case 'q': + q2c_name = optarg; + break; + case 'Q': + aqd_name = optarg; + break; + case 'r': + ignore_remaps = 1; + break; + case 's': + seek_name = optarg; + break; + case 'S': { + unsigned int interval; + + sscanf(optarg, "%u", &interval); + iostat_interval = (__u64)interval * 1000000000LL; + break; + } + case 't': + sscanf(optarg, "%lf", &t_astart); + time_bounded = 1; + break; + case 'T': + sscanf(optarg, "%lf", &t_aend); + time_bounded = 1; + break; + case 'u': + unplug_hist_name = optarg; + break; + case 'v': + verbose = 1; + break; + case 'V': + printf("%s version %s\n", argv[0], bt_timeline_version); + exit(0); + case 'X': + easy_parse_avgs++; + break; + case 'z': + q2d_name = optarg; + break; + default: + usage(argv[0]); + exit(1); + } + } + + if (input_name == NULL) { + usage(argv[0]); + exit(1); + } + + if (sps_name && !seek_name) { + fprintf(stderr, "FATAL: -m option requires -s options\n"); + exit(1); + } + + setup_ifile(input_name); + + if (output_name == NULL) { + rngs_ofp = avgs_ofp = msgs_ofp = stdout; + easy_parse_avgs = 0; + } else { + rngs_ofp = std_open(output_name, "dat", "range data"); + avgs_ofp = std_open(output_name, "avg", "stats data"); + msgs_ofp = std_open(output_name, "msg", "K messages"); + if (easy_parse_avgs) { + xavgs_ofp = std_open(output_name, "xvg", + "EZ stats data"); + } + } + + iostat_ofp = setup_ofile(iostat_name); + per_io_ofp = setup_ofile(per_io_name); +} diff --git a/btt/bno_dump.c b/btt/bno_dump.c new file mode 100644 index 0000000..7365300 --- /dev/null +++ b/btt/bno_dump.c @@ -0,0 +1,82 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +struct bno_dump { + FILE *rfp, *wfp, *cfp; +}; + +static FILE *bno_dump_open(__u32 device, char rwc) +{ + FILE *fp; + char *oname; + int mjr, mnr; + + mjr = device >> MINORBITS; + mnr = device & ((1 << MINORBITS) - 1); + + oname = malloc(strlen(bno_dump_name) + 32); + sprintf(oname, "%s_%03d,%03d_%c.dat", bno_dump_name, mjr, mnr, rwc); + if ((fp = my_fopen(oname, "w")) == NULL) + perror(oname); + else + add_file(fp, oname); + return fp; +} + +static inline void bno_dump_write(FILE *fp, struct io *iop) +{ + fprintf(fp, "%15.9lf %lld %lld\n", BIT_TIME(iop->t.time), + (long long)BIT_START(iop), (long long)BIT_END(iop)); +} + +void *bno_dump_alloc(__u32 device) +{ + struct bno_dump *bdp; + + if (bno_dump_name == NULL) return NULL; + + bdp = malloc(sizeof(*bdp)); + bdp->rfp = bno_dump_open(device, 'r'); + bdp->wfp = bno_dump_open(device, 'w'); + bdp->cfp = bno_dump_open(device, 'c'); + + return bdp; +} + +void bno_dump_free(void *param) +{ + free(param); +} + +void bno_dump_add(void *handle, struct io *iop) +{ + struct bno_dump *bdp = handle; + + if (bdp) { + FILE *fp = IOP_READ(iop) ? bdp->rfp : bdp->wfp; + + if (fp) + bno_dump_write(fp, iop); + if (bdp->cfp) + bno_dump_write(bdp->cfp, iop); + } +} diff --git a/btt/bno_plot.py b/btt/bno_plot.py new file mode 100644 index 0000000..19dfdfd --- /dev/null +++ b/btt/bno_plot.py @@ -0,0 +1,127 @@ +#! /usr/bin/env python +# +# btt blkno plotting interface +# +# (C) Copyright 2008 Hewlett-Packard Development Company, L.P. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +""" +bno_plot.py + [ -h | --help ] + [ -K | --keys-below ] + [ -v | --verbose ] + [ <file...> ] + +Utilizes gnuplot to generate a 3D plot of the block number output +from btt. If no <files> are specified, it will utilize all files +generated after btt was run with -B blknos (meaning: all files of the +form blknos*[rw].dat). + +The -K option forces bno_plot.py to put the keys below the graph, +typically all keys for input files are put in the upper right corner +of the graph. If the number of devices exceed 10, then bno_plot.py will +automatically push the keys under the graph. + +To exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' prompt. +""" + +import getopt, glob, os, sys, tempfile + +verbose = 0 +cmds = """ +set title 'btt Generated Block Accesses' +set xlabel 'Time (secs)' +set ylabel 'Block Number' +set zlabel '# Blocks per IO' +set grid +""" + + +#----------------------------------------------------------------------------- +def parse_args(in_args): + global verbose + + keys_below = False + s_opts = 'hKv' + l_opts = [ 'help', 'keys-below', 'verbose' ] + + try: + (opts, args) = getopt.getopt(in_args, s_opts, l_opts) + except getopt.error, msg: + print >>sys.stderr, msg + print >>sys.stderr, __doc__ + sys.exit(1) + + for (o, a) in opts: + if o in ('-h', '--help'): + print __doc__ + sys.exit(0) + elif o in ('-v', '--verbose'): + verbose += 1 + elif o in ('-K', '--keys-below'): + keys_below = True + + if len(args) > 0: bnos = args + else: bnos = glob.glob('blknos*[rw].dat') + + return (bnos, keys_below) + +#----------------------------------------------------------------------------- +if __name__ == '__main__': + (bnos, keys_below) = parse_args(sys.argv[1:]) + + if verbose: + print 'Using files:', + for bno in bnos: print bno, + if keys_below: print '\nKeys are to be placed below graph' + else: print '' + + tmpdir = tempfile.mktemp() + os.mkdir(tmpdir) + + plot_cmd = None + for f in bnos: + t = '%s/%s' % (tmpdir, f) + + fo = open(t, 'w') + for line in open(f, 'r'): + fld = line.split(None) + print >>fo, fld[0], fld[1], int(fld[2])-int(fld[1]) + fo.close() + + t = t[t.rfind('/')+1:] + if plot_cmd == None: plot_cmd = "splot '%s'" % t + else: plot_cmd = "%s,'%s'" % (plot_cmd, t) + + fo = open('%s/plot.cmds' % tmpdir, 'w') + print >>fo, cmds + if len(bnos) > 10 or keys_below: print >>fo, 'set key below' + print >>fo, plot_cmd + fo.close() + + pid = os.fork() + if pid == 0: + cmd = '/usr/bin/gnuplot %s/plot.cmds -' % tmpdir + + if verbose: print 'Executing %s' % cmd + + cmd = cmd.split(None) + os.chdir(tmpdir) + os.execvp(cmd[0], cmd) + sys.exit(1) + + os.waitpid(pid, 0) + os.system('/bin/rm -rf ' + tmpdir) diff --git a/btt/bt_timeline.c b/btt/bt_timeline.c new file mode 100644 index 0000000..24dafc8 --- /dev/null +++ b/btt/bt_timeline.c @@ -0,0 +1,126 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/time.h> +#include <time.h> +#include "globals.h" + +char bt_timeline_version[] = "2.08"; + +char *devices, *exes, *input_name, *output_name, *seek_name, *bno_dump_name; +char *d2c_name, *q2c_name, *per_io_name, *unplug_hist_name; +char *sps_name, *aqd_name, *q2d_name, *per_io_trees; +FILE *rngs_ofp, *avgs_ofp, *xavgs_ofp, *per_io_ofp, *msgs_ofp; +int verbose, done, time_bounded, output_all_data, seek_absolute; +int easy_parse_avgs, ignore_remaps; +double t_astart, t_aend; +unsigned long n_traces; +struct avgs_info all_avgs; +unsigned int n_devs; +time_t genesis, last_vtrace; +LIST_HEAD(all_devs); +LIST_HEAD(all_procs); +LIST_HEAD(all_ios); +LIST_HEAD(free_ios); +LIST_HEAD(free_bilinks); +__u64 q_histo[N_HIST_BKTS], d_histo[N_HIST_BKTS]; + +double plat_freq = 0.0; +double range_delta = 0.1; +__u64 last_q = (__u64)-1; + +struct region_info all_regions = { + .qranges = LIST_HEAD_INIT(all_regions.qranges), + .cranges = LIST_HEAD_INIT(all_regions.cranges), +}; + +int process(void); + +int main(int argc, char *argv[]) +{ + handle_args(argc, argv); + + init_dev_heads(); + iostat_init(); + if (process() || output_avgs(avgs_ofp) || output_ranges(rngs_ofp)) + return 1; + + if (iostat_ofp) { + fprintf(iostat_ofp, "\n"); + iostat_dump_stats(iostat_last_stamp, 1); + } + + if (msgs_ofp != stdout) + fclose(msgs_ofp); + if (rngs_ofp != stdout) + fclose(rngs_ofp); + if (avgs_ofp != stdout) + fclose(avgs_ofp); + if (xavgs_ofp) + fclose(xavgs_ofp); + + dip_cleanup(); + dev_map_exit(); + dip_exit(); + pip_exit(); + io_free_all(); + region_exit(&all_regions); + clean_allocs(); + + return 0; +} + +static inline double tv2dbl(struct timeval *tv) +{ + return (double)tv->tv_sec + (((double)tv->tv_usec) / (1000.0 * 1000.0)); +} + +int process(void) +{ + int ret = 0; + struct io *iop = io_alloc(); + struct timeval tvs, tve; + + genesis = last_vtrace = time(NULL); + gettimeofday(&tvs, NULL); + while (!done && next_trace(&iop->t, &iop->pdu)) { + add_trace(iop); + iop = io_alloc(); + } + + io_release(iop); + gettimeofday(&tve, NULL); + + if (verbose) { + double tps, dt_input = tv2dbl(&tve) - tv2dbl(&tvs); + + tps = (double)n_traces / dt_input; + printf("\r " + " \r"); + printf("%10lu traces @ %.1lf Ktps in %.6lf seconds\n", + n_traces, tps/1000.0, + dt_input); + } + + return ret; +} diff --git a/btt/btt_plot.py b/btt/btt_plot.py new file mode 100755 index 0000000..b795cec --- /dev/null +++ b/btt/btt_plot.py @@ -0,0 +1,394 @@ +#! /usr/bin/env python +# +# btt_plot.py: Generate matplotlib plots for BTT generate data files +# +# (C) Copyright 2009 Hewlett-Packard Development Company, L.P. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +btt_plot.py: Generate matplotlib plots for BTT generated data files + +Files handled: + AQD - Average Queue Depth Running average of queue depths + + BNOS - Block numbers accessed Markers for each block + + Q2D - Queue to Issue latencies Running averages + D2C - Issue to Complete latencies Running averages + Q2C - Queue to Complete latencies Running averages + +Usage: + btt_plot_aqd.py equivalent to: btt_plot.py -t aqd <type>=aqd + btt_plot_bnos.py equivalent to: btt_plot.py -t bnos <type>=bnos + btt_plot_q2d.py equivalent to: btt_plot.py -t q2d <type>=q2d + btt_plot_d2c.py equivalent to: btt_plot.py -t d2c <type>=d2c + btt_plot_q2c.py equivalent to: btt_plot.py -t q2c <type>=q2c + +Arguments: + [ -A | --generate-all ] Default: False + [ -L | --no-legend ] Default: Legend table produced + [ -o <file> | --output=<file> ] Default: <type>.png + [ -T <string> | --title=<string> ] Default: Based upon <type> + [ -v | --verbose ] Default: False + <data-files...> + + The -A (--generate-all) argument is different: when this is specified, + an attempt is made to generate default plots for all 5 types (aqd, bnos, + q2d, d2c and q2c). It will find files with the appropriate suffix for + each type ('aqd.dat' for example). If such files are found, a plot for + that type will be made. The output file name will be the default for + each type. The -L (--no-legend) option will be obeyed for all plots, + but the -o (--output) and -T (--title) options will be ignored. +""" + +__author__ = 'Alan D. Brunelle <alan.brunelle@hp.com>' + +#------------------------------------------------------------------------------ + +import matplotlib +matplotlib.use('Agg') +import getopt, glob, os, sys +import matplotlib.pyplot as plt + +plot_size = [10.9, 8.4] # inches... + +add_legend = True +generate_all = False +output_file = None +title_str = None +type = None +verbose = False + +types = [ 'aqd', 'q2d', 'd2c', 'q2c', 'bnos' ] +progs = [ 'btt_plot_%s.py' % t for t in types ] + +get_base = lambda file: file[file.find('_')+1:file.rfind('_')] + +#------------------------------------------------------------------------------ +def fatal(msg): + """Generate fatal error message and exit""" + + print >>sys.stderr, 'FATAL: %s' % msg + sys.exit(1) + +#---------------------------------------------------------------------- +def get_data(files): + """Retrieve data from files provided. + + Returns a database containing: + 'min_x', 'max_x' - Minimum and maximum X values found + 'min_y', 'max_y' - Minimum and maximum Y values found + 'x', 'y' - X & Y value arrays + 'ax', 'ay' - Running average over X & Y -- + if > 10 values provided... + """ + #-------------------------------------------------------------- + def check(mn, mx, v): + """Returns new min, max, and float value for those passed in""" + + v = float(v) + if mn == None or v < mn: mn = v + if mx == None or v > mx: mx = v + return mn, mx, v + + #-------------------------------------------------------------- + def avg(xs, ys): + """Computes running average for Xs and Ys""" + + #------------------------------------------------------ + def _avg(vals): + """Computes average for array of values passed""" + + total = 0.0 + for val in vals: + total += val + return total / len(vals) + + #------------------------------------------------------ + if len(xs) < 1000: + return xs, ys + + axs = [xs[0]] + ays = [ys[0]] + _xs = [xs[0]] + _ys = [ys[0]] + + x_range = (xs[-1] - xs[0]) / 100 + for idx in range(1, len(ys)): + if (xs[idx] - _xs[0]) > x_range: + axs.append(_avg(_xs)) + ays.append(_avg(_ys)) + del _xs, _ys + + _xs = [xs[idx]] + _ys = [ys[idx]] + else: + _xs.append(xs[idx]) + _ys.append(ys[idx]) + + if len(_xs) > 1: + axs.append(_avg(_xs)) + ays.append(_avg(_ys)) + + return axs, ays + + #-------------------------------------------------------------- + global verbose + + db = {} + min_x = max_x = min_y = max_y = None + for file in files: + if not os.path.exists(file): + fatal('%s not found' % file) + elif verbose: + print 'Processing %s' % file + + xs = [] + ys = [] + for line in open(file, 'r'): + f = line.rstrip().split(None) + if line.find('#') == 0 or len(f) < 2: + continue + (min_x, max_x, x) = check(min_x, max_x, f[0]) + (min_y, max_y, y) = check(min_y, max_y, f[1]) + xs.append(x) + ys.append(y) + + db[file] = {'x':xs, 'y':ys} + if len(xs) > 10: + db[file]['ax'], db[file]['ay'] = avg(xs, ys) + else: + db[file]['ax'] = db[file]['ay'] = None + + db['min_x'] = min_x + db['max_x'] = max_x + db['min_y'] = min_y + db['max_y'] = max_y + return db + +#---------------------------------------------------------------------- +def parse_args(args): + """Parse command line arguments. + + Returns list of (data) files that need to be processed -- /unless/ + the -A (--generate-all) option is passed, in which case superfluous + data files are ignored... + """ + + global add_legend, output_file, title_str, type, verbose + global generate_all + + prog = args[0][args[0].rfind('/')+1:] + if prog == 'btt_plot.py': + pass + elif not prog in progs: + fatal('%s not a valid command name' % prog) + else: + type = prog[prog.rfind('_')+1:prog.rfind('.py')] + + s_opts = 'ALo:t:T:v' + l_opts = [ 'generate-all', 'type', 'no-legend', 'output', 'title', + 'verbose' ] + + try: + (opts, args) = getopt.getopt(args[1:], s_opts, l_opts) + except getopt.error, msg: + print >>sys.stderr, msg + fatal(__doc__) + + for (o, a) in opts: + if o in ('-A', '--generate-all'): + generate_all = True + elif o in ('-L', '--no-legend'): + add_legend = False + elif o in ('-o', '--output'): + output_file = a + elif o in ('-t', '--type'): + if not a in types: + fatal('Type %s not supported' % a) + type = a + elif o in ('-T', '--title'): + title_str = a + elif o in ('-v', '--verbose'): + verbose = True + + if type == None and not generate_all: + fatal('Need type of data files to process - (-t <type>)') + + return args + +#------------------------------------------------------------------------------ +def gen_title(fig, type, title_str): + """Sets the title for the figure based upon the type /or/ user title""" + + if title_str != None: + pass + elif type == 'aqd': + title_str = 'Average Queue Depth' + elif type == 'bnos': + title_str = 'Block Numbers Accessed' + elif type == 'q2d': + title_str = 'Queue (Q) To Issue (D) Average Latencies' + elif type == 'd2c': + title_str = 'Issue (D) To Complete (C) Average Latencies' + elif type == 'q2c': + title_str = 'Queue (Q) To Complete (C) Average Latencies' + + title = fig.text(.5, .95, title_str, horizontalalignment='center') + title.set_fontsize('large') + +#------------------------------------------------------------------------------ +def gen_labels(db, ax, type): + """Generate X & Y 'axis'""" + + #---------------------------------------------------------------------- + def gen_ylabel(ax, type): + """Set the Y axis label based upon the type""" + + if type == 'aqd': + str = 'Number of Requests Queued' + elif type == 'bnos': + str = 'Block Number' + else: + str = 'Seconds' + ax.set_ylabel(str) + + #---------------------------------------------------------------------- + xdelta = 0.1 * (db['max_x'] - db['min_x']) + ydelta = 0.1 * (db['max_y'] - db['min_y']) + + ax.set_xlim(db['min_x'] - xdelta, db['max_x'] + xdelta) + ax.set_ylim(db['min_y'] - ydelta, db['max_y'] + ydelta) + ax.set_xlabel('Runtime (seconds)') + ax.grid(True) + gen_ylabel(ax, type) + +#------------------------------------------------------------------------------ +def generate_output(type, db): + """Generate the output plot based upon the type and database""" + + #---------------------------------------------------------------------- + def color(idx, style): + """Returns a color/symbol type based upon the index passed.""" + + colors = [ 'b', 'g', 'r', 'c', 'm', 'y', 'k' ] + l_styles = [ '-', ':', '--', '-.' ] + m_styles = [ 'o', '+', '.', ',', 's', 'v', 'x', '<', '>' ] + + color = colors[idx % len(colors)] + if style == 'line': + style = l_styles[(idx / len(l_styles)) % len(l_styles)] + elif style == 'marker': + style = m_styles[(idx / len(m_styles)) % len(m_styles)] + + return '%s%s' % (color, style) + + #---------------------------------------------------------------------- + def gen_legends(a, legends): + leg = ax.legend(legends, 'best', shadow=True) + frame = leg.get_frame() + frame.set_facecolor('0.80') + for t in leg.get_texts(): + t.set_fontsize('xx-small') + + #---------------------------------------------------------------------- + global add_legend, output_file, title_str, verbose + + if output_file != None: + ofile = output_file + else: + ofile = '%s.png' % type + + if verbose: + print 'Generating plot into %s' % ofile + + fig = plt.figure(figsize=plot_size) + ax = fig.add_subplot(111) + + gen_title(fig, type, title_str) + gen_labels(db, ax, type) + + idx = 0 + if add_legend: + legends = [] + else: + legends = None + + keys = [] + for file in db.iterkeys(): + if not file in ['min_x', 'max_x', 'min_y', 'max_y']: + keys.append(file) + + keys.sort() + for file in keys: + dat = db[file] + if type == 'bnos': + ax.plot(dat['x'], dat['y'], color(idx, 'marker'), + markersize=1) + elif dat['ax'] == None: + continue # Don't add legend + else: + ax.plot(dat['ax'], dat['ay'], color(idx, 'line'), + linewidth=1.0) + if add_legend: + legends.append(get_base(file)) + idx += 1 + + if add_legend and len(legends) > 0: + gen_legends(ax, legends) + plt.savefig(ofile) + +#------------------------------------------------------------------------------ +def get_files(type): + """Returns the list of files for the -A option based upon type""" + + if type == 'bnos': + files = [] + for fn in glob.glob('*c.dat'): + for t in [ 'q2q', 'd2d', 'q2c', 'd2c' ]: + if fn.find(t) >= 0: + break + else: + files.append(fn) + else: + files = glob.glob('*%s.dat' % type) + return files + +#------------------------------------------------------------------------------ +if __name__ == '__main__': + files = parse_args(sys.argv) + + if generate_all: + output_file = title_str = type = None + for t in types: + files = get_files(t) + if len(files) == 0: + continue + elif t != 'bnos': + generate_output(t, get_data(files)) + continue + + for file in files: + base = get_base(file) + title_str = 'Block Numbers Accessed: %s' % base + output_file = 'bnos_%s.png' % base + generate_output(t, get_data([file])) + elif len(files) < 1: + fatal('Need data files to process') + else: + generate_output(type, get_data(files)) + sys.exit(0) diff --git a/btt/devmap.c b/btt/devmap.c new file mode 100644 index 0000000..9c0348b --- /dev/null +++ b/btt/devmap.c @@ -0,0 +1,92 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include "globals.h" + +struct devmap { + struct list_head head; + char device[32], devno[32]; +}; + +LIST_HEAD(all_devmaps); + +static int dev_map_add(char *line) +{ + struct devmap *dmp; + + if (strstr(line, "Device") != NULL) + return 1; + + dmp = malloc(sizeof(struct devmap)); + if (sscanf(line, "%s %s", dmp->device, dmp->devno) != 2) { + free(dmp); + return 1; + } + + list_add_tail(&dmp->head, &all_devmaps); + return 0; +} + +char *dev_map_find(__u32 device) +{ + char this[128]; + struct list_head *p; + + sprintf(this, "%u,%u", MAJOR(device), MINOR(device)); + __list_for_each(p, &all_devmaps) { + struct devmap *dmp = list_entry(p, struct devmap, head); + + if (!strcmp(this, dmp->devno)) + return dmp->device; + } + + return NULL; +} + +int dev_map_read(char *fname) +{ + char line[256]; + FILE *fp = my_fopen(fname, "r"); + + if (!fp) { + perror(fname); + return 1; + } + + while (fscanf(fp, "%255[a-zA-Z0-9 :.,/_-]\n", line) == 1) { + if (dev_map_add(line)) + break; + } + + return 0; +} + +void dev_map_exit(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &all_devmaps) { + struct devmap *dmp = list_entry(p, struct devmap, head); + + list_del(&dmp->head); + free(dmp); + } +} diff --git a/btt/devs.c b/btt/devs.c new file mode 100644 index 0000000..3578633 --- /dev/null +++ b/btt/devs.c @@ -0,0 +1,281 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include "globals.h" + +#define N_DEV_HASH 128 +#define DEV_HASH(dev) ((MAJOR(dev) ^ MINOR(dev)) & (N_DEV_HASH - 1)) +struct list_head dev_heads[N_DEV_HASH]; + +static inline void *dip_rb_mkhds(void) +{ + size_t len = N_IOP_TYPES * sizeof(struct rb_root); + return memset(malloc(len), 0, len); +} + +static void __destroy(struct rb_node *n) +{ + if (n) { + struct io *iop = rb_entry(n, struct io, rb_node); + + __destroy(n->rb_left); + __destroy(n->rb_right); + io_release(iop); + } +} + +static void __destroy_heads(struct rb_root *roots) +{ + int i; + + for (i = 0; i < N_IOP_TYPES; i++) + __destroy(roots[i].rb_node); + + free(roots); +} + +void init_dev_heads(void) +{ + int i; + for (i = 0; i < N_DEV_HASH; i++) + INIT_LIST_HEAD(&dev_heads[i]); +} + +struct d_info *__dip_find(__u32 device) +{ + struct d_info *dip; + struct list_head *p; + + __list_for_each(p, &dev_heads[DEV_HASH(device)]) { + dip = list_entry(p, struct d_info, hash_head); + if (device == dip->device) + return dip; + } + + return NULL; +} + +void __dip_exit(struct d_info *dip) +{ + list_del(&dip->all_head); + __destroy_heads(dip->heads); + region_exit(&dip->regions); + seeki_free(dip->seek_handle); + seeki_free(dip->q2q_handle); + aqd_free(dip->aqd_handle); + plat_free(dip->q2d_plat_handle); + plat_free(dip->q2c_plat_handle); + plat_free(dip->d2c_plat_handle); + bno_dump_free(dip->bno_dump_handle); + unplug_hist_free(dip->up_hist_handle); + if (output_all_data) + q2d_free(dip->q2d_priv); + if (dip->pit_fp) + fclose(dip->pit_fp); + free(dip); +} + +void dip_exit(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &all_devs) { + struct d_info *dip = list_entry(p, struct d_info, all_head); + __dip_exit(dip); + } +} + +static inline char *mkhandle(char *str, __u32 device, char *post) +{ + int mjr = device >> MINORBITS; + int mnr = device & ((1 << MINORBITS) - 1); + + sprintf(str, "%03d,%03d%s", mjr, mnr, post); + return str; +} + +static inline FILE *open_pit(char *str) +{ + FILE *fp = my_fopen(str, "w"); + + if (fp == NULL) + perror(str); + + return fp; +} + +struct d_info *dip_alloc(__u32 device, struct io *iop) +{ + struct d_info *dip = __dip_find(device); + + if (dip == NULL) { + char str[256]; + + dip = malloc(sizeof(struct d_info)); + memset(dip, 0, sizeof(*dip)); + dip->heads = dip_rb_mkhds(); + region_init(&dip->regions); + dip->device = device; + dip->last_q = (__u64)-1; + dip->devmap = dev_map_find(device); + dip->bno_dump_handle = bno_dump_alloc(device); + dip->up_hist_handle = unplug_hist_alloc(device); + dip->seek_handle = seeki_alloc(mkhandle(str, device, "_d2d")); + dip->q2q_handle = seeki_alloc(mkhandle(str, device, "_q2q")); + dip->aqd_handle = aqd_alloc(mkhandle(str, device, "_aqd")); + dip->q2d_plat_handle = + plat_alloc(mkhandle(str, device, "_q2d_plat")); + dip->q2c_plat_handle = + plat_alloc(mkhandle(str, device, "_q2c_plat")); + dip->d2c_plat_handle = + plat_alloc(mkhandle(str, device, "_d2c_plat")); + latency_alloc(dip); + list_add_tail(&dip->hash_head, &dev_heads[DEV_HASH(device)]); + list_add_tail(&dip->all_head, &all_devs); + dip->start_time = BIT_TIME(iop->t.time); + dip->pre_culling = 1; + if (output_all_data) + dip->q2d_priv = q2d_alloc(); + n_devs++; + if (per_io_trees) + dip->pit_fp = open_pit(mkhandle(per_io_trees, + device, "_pit.dat")); + } + + if (dip->pre_culling) { + if (iop->type == IOP_Q || iop->type == IOP_A) + dip->pre_culling = 0; + else + return NULL; + } + + iop->linked = dip_rb_ins(dip, iop); + dip->end_time = BIT_TIME(iop->t.time); + + return dip; +} + +void iop_rem_dip(struct io *iop) +{ + if (iop->linked) { + dip_rb_rem(iop); + iop->linked = 0; + } +} + +void dip_foreach(struct io *iop, enum iop_type type, + void (*fnc)(struct io *iop, struct io *this), int rm_after) +{ + if (rm_after) { + LIST_HEAD(head); + struct io *this; + struct list_head *p, *q; + + dip_rb_fe(iop->dip, type, iop, fnc, &head); + list_for_each_safe(p, q, &head) { + this = list_entry(p, struct io, f_head); + list_del(&this->f_head); + io_release(this); + } + } else + dip_rb_fe(iop->dip, type, iop, fnc, NULL); +} + +void dip_foreach_list(struct io *iop, enum iop_type type, struct list_head *hd) +{ + dip_rb_fe(iop->dip, type, iop, NULL, hd); +} + +struct io *dip_find_sec(struct d_info *dip, enum iop_type type, __u64 sec) +{ + return dip_rb_find_sec(dip, type, sec); +} + +void dip_foreach_out(void (*func)(struct d_info *, void *), void *arg) +{ + if (devices == NULL) { + struct list_head *p; + __list_for_each(p, &all_devs) + func(list_entry(p, struct d_info, all_head), arg); + } else { + int i; + struct d_info *dip; + unsigned int mjr, mnr; + char *p = devices; + + while (p && ((i = sscanf(p, "%u,%u", &mjr, &mnr)) == 2)) { + dip = __dip_find((__u32)((mjr << MINORBITS) | mnr)); + func(dip, arg); + p = strchr(p, ';'); + if (p) p++; + } + } +} + +void dip_plug(__u32 dev, double cur_time) +{ + struct d_info *dip = __dip_find(dev); + + if (dip && !dip->is_plugged) { + dip->is_plugged = 1; + dip->last_plug = cur_time; + } +} + +static inline void unplug(struct d_info *dip, double cur_time) +{ + dip->is_plugged = 0; + dip->plugged_time += (cur_time - dip->last_plug); +} + +void dip_unplug(__u32 dev, double cur_time, __u64 nios_up) +{ + struct d_info *dip = __dip_find(dev); + + if (dip && dip->is_plugged) { + dip->nplugs++; + dip->nios_up += nios_up; + unplug(dip, cur_time); + } +} + +void dip_unplug_tm(__u32 dev, double cur_time, __u64 nios_up) +{ + struct d_info *dip = __dip_find(dev); + + if (dip && dip->is_plugged) { + dip->nios_upt += nios_up; + dip->nplugs_t++; + unplug(dip, cur_time); + } +} + +void dip_cleanup(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &all_devs) { + struct d_info *dip = list_entry(p, struct d_info, all_head); + + if (dip->n_qs == 0 && dip->n_ds == 0) + __dip_exit(dip); + } +} diff --git a/btt/dip_rb.c b/btt/dip_rb.c new file mode 100644 index 0000000..867a97b --- /dev/null +++ b/btt/dip_rb.c @@ -0,0 +1,86 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include "globals.h" + +int rb_insert(struct rb_root *root, struct io *iop) +{ + struct io *__iop; + struct rb_node *parent = NULL; + struct rb_node **p = &root->rb_node; + __u64 __s, s = BIT_START(iop); + + while (*p) { + parent = *p; + __iop = rb_entry(parent, struct io, rb_node); + __s = BIT_START(__iop); + + if (s < __s) + p = &(*p)->rb_left; + else if (s > __s) + p = &(*p)->rb_right; + else + return 0; + } + + rb_link_node(&iop->rb_node, parent, p); + rb_insert_color(&iop->rb_node, root); + return 1; +} + +struct io *rb_find_sec(struct rb_root *root, __u64 sec) +{ + struct io *__iop; + struct rb_node *n = root->rb_node; + + while (n) { + __iop = rb_entry(n, struct io, rb_node); + if (sec < BIT_START(__iop)) + n = n->rb_left; + else if (sec >= BIT_END(__iop)) + n = n->rb_right; + else + return __iop; + } + + return NULL; +} + +void rb_foreach(struct rb_node *n, struct io *iop, + void (*fnc)(struct io *iop, struct io *this), + struct list_head *head) +{ + if (n) { + struct io *this = rb_entry(n, struct io, rb_node); + __u64 iop_s = BIT_START(iop), iop_e = BIT_END(iop); + __u64 this_s = BIT_START(this), this_e = BIT_END(this); + + if ((iop_s <= this_s) && (this_e <= iop_e)) { + if (fnc) fnc(iop, this); + if (head) + list_add_tail(&this->f_head, head); + } + if (iop_s < this_s) + rb_foreach(n->rb_left, iop, fnc, head); + if (this_e < iop_e) + rb_foreach(n->rb_right, iop, fnc, head); + } +} diff --git a/btt/doc/Makefile b/btt/doc/Makefile new file mode 100644 index 0000000..a81b557 --- /dev/null +++ b/btt/doc/Makefile @@ -0,0 +1,15 @@ +DOCTMP = btt.log btt.aux btt.dvi btt.toc btt.tex.bak + +all: btt.pdf + +btt.tex: activity.eps qhist.eps dhist.eps seek.eps + @touch btt.tex + +btt.pdf: btt.tex + @latex btt.tex + @latex btt.tex + @dvipdfm -p a4 btt + @rm -rf $(DOCTMP) + +clean: + -rm -f btt.pdf $(DOCTMP) diff --git a/btt/doc/activity.eps b/btt/doc/activity.eps new file mode 100644 index 0000000..034533f --- /dev/null +++ b/btt/doc/activity.eps @@ -0,0 +1,923 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 0 0 799 635 +%%LanguageLevel: 2 +%%Creator: Grace-5.1.20 +%%CreationDate: Thu Mar 1 14:50:45 2007 +%%DocumentData: Clean8Bit +%%Orientation: Portrait +%%Title: Untitled +%%For: adb +%%DocumentNeededResources: (atend) +%%EndComments +%%BeginProlog +/m {moveto} def +/l {lineto} def +/s {stroke} def +/n {newpath} def +/c {closepath} def +/RL {rlineto} def +/SLW {setlinewidth} def +/GS {gsave} def +/GR {grestore} def +/SC {setcolor} def +/SGRY {setgray} def +/SRGB {setrgbcolor} def +/SD {setdash} def +/SLC {setlinecap} def +/SLJ {setlinejoin} def +/SCS {setcolorspace} def +/FFSF {findfont setfont} def +/CC {concat} def +/PXL {n m 0 0 RL s} def +/Color0 {1.0000 1.0000 1.0000} def +/Color1 {0.0000 0.0000 0.0000} def +/Color2 {1.0000 0.0000 0.0000} def +/Color3 {0.0000 1.0000 0.0000} def +/Color4 {0.0000 0.0000 1.0000} def +/Color5 {1.0000 1.0000 0.0000} def +/Color6 {0.7373 0.5608 0.5608} def +/Color7 {0.8627 0.8627 0.8627} def +/Color8 {0.5804 0.0000 0.8275} def +/Color9 {0.0000 1.0000 1.0000} def +/Color10 {1.0000 0.0000 1.0000} def +/Color11 {1.0000 0.6471 0.0000} def +/Color12 {0.4471 0.1294 0.7373} def +/Color13 {0.4039 0.0275 0.2824} def +/Color14 {0.2510 0.8784 0.8157} def +/Color15 {0.0000 0.5451 0.0000} def +/PTRN { + /pat_bits exch def + << + /PaintType 2 + /PatternType 1 /TilingType 1 + /BBox[0 0 16 16] + /XStep 16 /YStep 16 + /PaintProc { + pop + 16 16 true [-1 0 0 -1 16 16] pat_bits imagemask + } + >> + [0.0016 0 0 0.0016 0 0] + makepattern +} def +/Pattern0 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern1 {<ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff> PTRN} bind def +/Pattern2 {<eeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffff> PTRN} bind def +/Pattern3 {<eeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbb> PTRN} bind def +/Pattern4 {<5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa> PTRN} bind def +/Pattern5 {<1111444411114444111144441111444411114444111144441111444411114444> PTRN} bind def +/Pattern6 {<1111000044440000111100004444000011110000444400001111000044440000> PTRN} bind def +/Pattern7 {<1010000000000000010100000000000010100000000000000101000000000000> PTRN} bind def +/Pattern8 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern9 {<1e1e0f0f8787c3c3e1e1f0f078783c3c1e1e0f0f8787c3c3e1e1f0f078783c3c> PTRN} bind def +/Pattern10 {<7878f0f0e1e1c3c387870f0f1e1e3c3c7878f0f0e1e1c3c387870f0f1e1e3c3c> PTRN} bind def +/Pattern11 {<3333333333333333333333333333333333333333333333333333333333333333> PTRN} bind def +/Pattern12 {<ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000> PTRN} bind def +/Pattern13 {<8181424224241818181824244242818181814242242418181818242442428181> PTRN} bind def +/Pattern14 {<8080404020201010080804040202010180804040202010100808040402020101> PTRN} bind def +/Pattern15 {<0101020204040808101020204040808001010202040408081010202040408080> PTRN} bind def +/Pattern16 {<2222222222222222222222222222222222222222222222222222222222222222> PTRN} bind def +/Pattern17 {<0000ffff000000000000ffff000000000000ffff000000000000ffff00000000> PTRN} bind def +/Pattern18 {<2222ffff222222222222ffff222222222222ffff222222222222ffff22222222> PTRN} bind def +/Pattern19 {<ffffffff33333333ffffffff33333333ffffffff33333333ffffffff33333333> PTRN} bind def +/Pattern20 {<0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f00f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0> PTRN} bind def +/Pattern21 {<ff00ff00ff00ff00ff00ff00ff00ff0000ff00ff00ff00ff00ff00ff00ff00ff> PTRN} bind def +/Pattern22 {<8001800180018001800180018001ffffffff8001800180018001800180018001> PTRN} bind def +/Pattern23 {<c003c003c003c003c003c003ffffffffffffffffc003c003c003c003c003c003> PTRN} bind def +/Pattern24 {<040404040404ffff404040404040ffff040404040404ffff404040404040ffff> PTRN} bind def +/Pattern25 {<180018001800180018001800ffffffff001800180018001800180018ffffffff> PTRN} bind def +/Pattern26 {<1111b8b87c7c3a3a1111a3a3c7c78b8b1111b8b87c7c3a3a1111a3a3c7c78b8b> PTRN} bind def +/Pattern27 {<101010102828c7c70101010182827c7c101010102828c7c70101010182827c7c> PTRN} bind def +/Pattern28 {<1c1c121211112121c1c12121111112121c1c121211112121c1c1212111111212> PTRN} bind def +/Pattern29 {<3e3e414180808080e3e31414080808083e3e414180808080e3e3141408080808> PTRN} bind def +/Pattern30 {<4848888884848383848488884848383848488888848483838484888848483838> PTRN} bind def +/Pattern31 {<03030404080808080c0c12122121c0c003030404080808080c0c12122121c0c0> PTRN} bind def +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/EARC { + ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y translate + xrad yrad scale + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def +/TL { + /kcomp exch def + /linewidth exch def + /offset exch def + GS + 0 offset rmoveto + linewidth SLW + dup stringwidth exch kcomp add exch RL s + GR +} def +/KINIT +{ + /kvector exch def + /kid 0 def +} def +/KPROC +{ + pop pop + kvector kid get + 0 rmoveto + /kid 1 kid add def +} def +/DefEncoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /acute + /mu + /paragraph + /periodcentered + /cedilla + /onesuperior + /ordmasculine + /guillemotright + /onequarter + /onehalf + /threequarters + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /ydieresis +] def +%%EndProlog +%%BeginSetup +%%EndSetup +612.00 612.00 scale +n +0.0000 0.0000 m +0.0000 1.0000 l +1.2941 1.0000 l +1.2941 0.0000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +[0.0015 0.0045 ] 0 SD +0.0015 SLW +0 SLC +0 SLJ +n +0.1667 0.1500 m +0.1667 0.8500 l +s +n +0.1833 0.1500 m +0.1833 0.8500 l +s +n +0.2000 0.1500 m +0.2000 0.8500 l +s +n +0.2167 0.1500 m +0.2167 0.8500 l +s +n +0.2333 0.1500 m +0.2333 0.8500 l +s +n +0.2667 0.1500 m +0.2667 0.8500 l +s +n +0.2833 0.1500 m +0.2833 0.8500 l +s +n +0.3000 0.1500 m +0.3000 0.8500 l +s +n +0.3167 0.1500 m +0.3167 0.8500 l +s +n +0.3333 0.1500 m +0.3333 0.8500 l +s +n +0.3667 0.1500 m +0.3667 0.8500 l +s +n +0.3833 0.1500 m +0.3833 0.8500 l +s +n +0.4000 0.1500 m +0.4000 0.8500 l +s +n +0.4167 0.1500 m +0.4167 0.8500 l +s +n +0.4333 0.1500 m +0.4333 0.8500 l +s +n +0.4667 0.1500 m +0.4667 0.8500 l +s +n +0.4833 0.1500 m +0.4833 0.8500 l +s +n +0.5000 0.1500 m +0.5000 0.8500 l +s +n +0.5167 0.1500 m +0.5167 0.8500 l +s +n +0.5333 0.1500 m +0.5333 0.8500 l +s +n +0.5667 0.1500 m +0.5667 0.8500 l +s +n +0.5833 0.1500 m +0.5833 0.8500 l +s +n +0.6000 0.1500 m +0.6000 0.8500 l +s +n +0.6167 0.1500 m +0.6167 0.8500 l +s +n +0.6333 0.1500 m +0.6333 0.8500 l +s +n +0.6667 0.1500 m +0.6667 0.8500 l +s +n +0.6833 0.1500 m +0.6833 0.8500 l +s +n +0.7000 0.1500 m +0.7000 0.8500 l +s +n +0.7167 0.1500 m +0.7167 0.8500 l +s +n +0.7333 0.1500 m +0.7333 0.8500 l +s +n +0.7667 0.1500 m +0.7667 0.8500 l +s +n +0.7833 0.1500 m +0.7833 0.8500 l +s +n +0.8000 0.1500 m +0.8000 0.8500 l +s +n +0.8167 0.1500 m +0.8167 0.8500 l +s +n +0.8333 0.1500 m +0.8333 0.8500 l +s +n +0.8667 0.1500 m +0.8667 0.8500 l +s +n +0.8833 0.1500 m +0.8833 0.8500 l +s +n +0.9000 0.1500 m +0.9000 0.8500 l +s +n +0.9167 0.1500 m +0.9167 0.8500 l +s +n +0.9333 0.1500 m +0.9333 0.8500 l +s +n +0.9667 0.1500 m +0.9667 0.8500 l +s +n +0.9833 0.1500 m +0.9833 0.8500 l +s +n +1.0000 0.1500 m +1.0000 0.8500 l +s +n +1.0167 0.1500 m +1.0167 0.8500 l +s +n +1.0333 0.1500 m +1.0333 0.8500 l +s +n +1.0667 0.1500 m +1.0667 0.8500 l +s +n +1.0833 0.1500 m +1.0833 0.8500 l +s +n +1.1000 0.1500 m +1.1000 0.8500 l +s +n +1.1167 0.1500 m +1.1167 0.8500 l +s +n +1.1333 0.1500 m +1.1333 0.8500 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1500 m +0.1500 0.8500 l +s +n +0.2500 0.1500 m +0.2500 0.8500 l +s +n +0.3500 0.1500 m +0.3500 0.8500 l +s +n +0.4500 0.1500 m +0.4500 0.8500 l +s +n +0.5500 0.1500 m +0.5500 0.8500 l +s +n +0.6500 0.1500 m +0.6500 0.8500 l +s +n +0.7500 0.1500 m +0.7500 0.8500 l +s +n +0.8500 0.1500 m +0.8500 0.8500 l +s +n +0.9500 0.1500 m +0.9500 0.8500 l +s +n +1.0500 0.1500 m +1.0500 0.8500 l +s +n +1.1500 0.1500 m +1.1500 0.8500 l +s +[0.0015 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1850 m +1.1500 0.1850 l +s +n +0.1500 0.5350 m +1.1500 0.5350 l +s +[/DeviceRGB] SCS +Color1 SC +[] 0 SD +0.0015 SLW +n +0.1500 0.1850 m +0.1500 0.4650 l +0.1624 0.4650 l +0.1624 0.1850 l +0.1832 0.1850 l +0.1832 0.4650 l +0.1832 0.4650 l +0.1832 0.1850 l +0.2105 0.1850 l +0.2105 0.4650 l +0.2323 0.4650 l +0.2323 0.1850 l +0.2801 0.1850 l +0.2801 0.4650 l +0.2808 0.4650 l +0.2808 0.1850 l +0.2917 0.1850 l +0.2917 0.4650 l +0.2917 0.4650 l +0.2917 0.1850 l +0.3313 0.1850 l +0.3313 0.4650 l +0.3456 0.4650 l +0.3456 0.1850 l +0.3912 0.1850 l +0.3912 0.4650 l +0.3912 0.4650 l +0.3912 0.1850 l +0.4073 0.1850 l +0.4073 0.4650 l +0.4083 0.4650 l +0.4083 0.1850 l +0.4248 0.1850 l +0.4248 0.4650 l +0.4329 0.4650 l +0.4329 0.1850 l +0.6819 0.1850 l +0.6819 0.4650 l +0.6873 0.4650 l +0.6873 0.1850 l +0.7791 0.1850 l +0.7791 0.4650 l +1.0873 0.4650 l +1.0873 0.1850 l +1.1122 0.1850 l +1.1122 0.4650 l +1.1139 0.4650 l +1.1139 0.1850 l +1.1496 0.1850 l +1.1496 0.4650 l +1.1496 0.4650 l +1.1496 0.1850 l +1.1501 0.1850 l +s +[/DeviceRGB] SCS +Color2 SC +n +0.1507 0.5350 m +0.1507 0.8150 l +0.1629 0.8150 l +0.1629 0.5350 l +0.1836 0.5350 l +0.1836 0.8150 l +0.1836 0.8150 l +0.1836 0.5350 l +0.2105 0.5350 l +0.2105 0.8150 l +0.2323 0.8150 l +0.2323 0.5350 l +0.2803 0.5350 l +0.2803 0.8150 l +0.2811 0.8150 l +0.2811 0.5350 l +0.2921 0.5350 l +0.2921 0.8150 l +0.2921 0.8150 l +0.2921 0.5350 l +0.3316 0.5350 l +0.3316 0.8150 l +0.3457 0.8150 l +0.3457 0.5350 l +0.3912 0.5350 l +0.3912 0.8150 l +0.3912 0.8150 l +0.3912 0.5350 l +0.4075 0.5350 l +0.4075 0.8150 l +0.4086 0.8150 l +0.4086 0.5350 l +0.4250 0.5350 l +0.4250 0.8150 l +0.4333 0.8150 l +0.4333 0.5350 l +0.6828 0.5350 l +0.6828 0.8150 l +0.6877 0.8150 l +0.6877 0.5350 l +0.7799 0.5350 l +0.7799 0.8150 l +1.0879 0.8150 l +1.0879 0.5350 l +1.1127 0.5350 l +1.1127 0.8150 l +1.1143 0.8150 l +1.1143 0.5350 l +1.1499 0.5350 l +1.1499 0.8150 l +1.1499 0.8150 l +1.1499 0.5350 l +1.1501 0.5350 l +s +/Times-Roman findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font32 exch definefont pop +/Font32 FFSF +[/DeviceRGB] SCS +Color6 SC +0.1447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.2455 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1) show +GR +/Font32 FFSF +0.3447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2) show +GR +/Font32 FFSF +0.4451 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(3) show +GR +/Font32 FFSF +0.5447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4) show +GR +/Font32 FFSF +0.6451 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5) show +GR +/Font32 FFSF +0.7447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(6) show +GR +/Font32 FFSF +0.8449 0.1251 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(7) show +GR +/Font32 FFSF +0.9451 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8) show +GR +/Font32 FFSF +1.0449 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(9) show +GR +/Font32 FFSF +1.1390 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(10) show +GR +/Font32 FFSF +0.5453 0.0951 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(Runtime \(seconds\)) show +GR +n +0.1500 0.1500 m +0.1500 0.8500 l +1.1500 0.8500 l +1.1500 0.1500 l +0.1500 0.1500 l +c +s +n +0.8500 0.8000 m +0.8500 0.7292 l +1.0190 0.7292 l +1.0190 0.8000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color1 SC +n +0.8500 0.8000 m +0.8500 0.7292 l +1.0190 0.7292 l +1.0190 0.8000 l +0.8500 0.8000 l +c +s +/Font32 FFSF +0.9208 0.7743 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(Q activity) show +GR +n +0.8608 0.7798 m +0.9008 0.7798 l +s +/Font32 FFSF +0.9208 0.7439 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(C activity) show +GR +[/DeviceRGB] SCS +Color2 SC +n +0.8608 0.7494 m +0.9008 0.7494 l +s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.4073 0.9190 m +GS +[0.0420 0.0000 0.0000 0.0420 0 0] CC +(BTT Sample Q & C Activity) show +GR +%%Trailer +%%DocumentNeededResources: font Times-Roman +%%EOF diff --git a/btt/doc/bno_plot.eps b/btt/doc/bno_plot.eps new file mode 100644 index 0000000..b18dd40 --- /dev/null +++ b/btt/doc/bno_plot.eps @@ -0,0 +1,7696 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: bno_plot.eps +%%CreationDate: Tue Feb 12 08:40:40 2008 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 1213 1564 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 1549 translate +1198 -1549 scale +% Image geometry +1198 1549 8 +% Transformation matrix +[ 1198 0 0 1549 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 1198 string def +/gstr 1198 string def +/bstr 1198 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 427315 ASCII Bytes +colorimage +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*Ws6]jel0eNNdI$u7qX4:^rpKddo'QJXo^2\ZJaS*WJaS*WddI,8J,~> +Ja.gOJa.gOs69Ral0A6JdHU]3qWe"Zrp'L`o'-2To]cDVJa.gOJa.gOdd$i4J,~> +J`_OGJ`_OGs5j:]l/qsFdH1E/qW@_VroX4\o&]oPo]?,RJ`_OGJ`_OGdcUQ0J,~> +JaS*WJaS*Ws6]jeqsFFar9aObp[/"]rpBadiU-[GoBlSYq<e=bmd:)SmJm7XmJm7[mK*CV!.jQh +mXaeWmaLV(!.Y~> +Ja.gOJa.gOs69Raqs".]r9=7^pZ__YrosI`iT^CCoBH;Uq<A%^lKSBKl2UhTl2UhWl2gtN!.jEd +l@J5OlI5%u!.Y~> +J`_OGJ`_OGs5j:]qrRkYr8mtZpZ;GUroO1\iT:+?oB$#Qq;qbZk2l[Cjo>DPjo>DSjoPPF!.j9` +k(2ZGk0rJm!.Y~> +JaS*WJaS*Ws6]jeqsFFar9aObp[/"]h<k7CoBlSYq<e=bmd:)SmJm7XmJm7\mJm7dmJm6<mXaeW +mXafUmf*9;~> +Ja.gOJa.gOs69Raqs".]r9=7^pZ__Yh<Ft?oBH;Uq<A%^lKSBKl2UhTl2UhXl2Uh`l2Ug8l@J5O +l@J6MlMgj7~> +J`_OGJ`_OGs5j:]qrRkYr8mtZpZ;GUh<"\;oB$#Qq;qbZk2l[Cjo>DPjo>DTjo>D\jo>C4k(2ZG +k(2[Ek5PF3~> +JaS*WJaS*Ws6fgcs6fgcs6fgcq<e4_qsOF`s6]shmJm7dmf!4dmK3IW!!*#drW)udr;cibrW)rc +r;cZ]!s%cW!<2Bd!<)?b!<2Ec!<;Hh!:K7Tq<e4_rpBgfmdC&SrpKacrpKacrpKacrpKacrpKac +rpKacJaS*WJaS*WrU0[cJ,~> +Ja.gOJa.gOs6BO_s6BO_s6BO_q<@q[qs+.\s69[dl2Uh`lM^e`l2q%O!!*#`rW)u`r;ci^rW)r_ +r;cZY!s%WO!<26`!<)3^!<29_!<;<d!:&hLq<@q[rosOblK\?Krp'I_rp'I_rp'I_rp'I_rp'I_ +rp'I_Ja.gOJa.gOrTaC_J,~> +J`_OGJ`_OGs5s7[s5s7[s5s7[q;qYWqr[kXs5jC`jo>D\k5GA\joYVG!!*#\rW)u\r;ciZrW)r[ +r;cZU!s%KG!<2*\!<)'Z!<2-[!<;0`!9WDDq;qYWroO7^k2uXCroX1[roX1[roX1[roX1[roX1[ +roX1[J`_OGJ`_OGrT=+[J,~> +JaS*WJaS*Ws6]jerpBjgmd:)QmJm7]mJm7bmJm7dmK`g\!!)HT!:BjdmKN[Z!!)HT!;u6e!:K7T +rU'XcrpBgfmK!7S!!)i_rW)ob!!*#d!!*#d!W_WgrpBmhmJuYTq!J+^rpBgfmK!7S!W_WgrpBgf +mK!7S!W_WgrpBgfmK!7S!W_WgrpBgfmK!7S!!%T<JaS*WJaWO*rr@Q~> +Ja.gOJa.gOs69RarosRclKSBIl2UhYl2Uh^l2Uh`l3ICT!!)<L!9sR`l377R!!)<L!;u*a!:&hL +rTX@_rosObl2^hK!!)i[rW)o^!!*#`!!*#`!W_KcrosUdl2^)Lq!%hZrosObl2^hK!W_KcrosOb +l2^hK!W_KcrosObl2^hK!W_KcrosObl2^hK!!%T8Ja.gOJa37"rr@Q~> +J`_OGJ`_OGs5j:]roO:_k2l[Ajo>DUjo>DZjo>D\jp1tL!!)0D!9O:\jothJ!!)0D!;ts]!9WDD +rT4([roO7^joGDC!!)iWrW)oZ!!*#\!!*#\!W_?_roO=`joFNDpuVPVroO7^joGDC!W_?_roO7^ +joGDC!W_?_roO7^joGDC!W_?_roO7^joGDC!!%T4J`_OGJ`csorr@Q~> +JaS*WJaS*Ws6]jerpBjgmd:)QmJm7]mKEUYmJm7Tqu?cc!<2Be!:Kab!U]sbmem.cmJm7cmed%c +mK!7S!!)i_!s%cW!<2Bd!<2Bd!<2Bf!:Bjbmf*:]med%cmK!1Q!!)rbquHcbrrE#crrE&dquHcb +rr@W<JaS*WJaWI(rr@Q~> +Ja.gOJa.gOs69RarosRclKSBIl2UhYl3.1Ql2UhLqu?c_!<26a!:'I^!U9[^lMU__l2Uh_lMLV_ +l2^hK!!)i[!s%WO!<26`!<26`!<26b!9sR^lMgkYlMLV_l2^bI!!)r^quHc^rrE#_rrE&`quHc^ +rr@W8Ja.gOJa30urr@Q~> +J`_OGJ`_OGs5j:]roO:_k2l[Ajo>DUjokbIjo>DDqu?c[!<2*]!9X1Z!TjCZk5>;[jo>D[k552[ +joGDC!!)iW!s%KG!<2*\!<2*\!<2*^!9O:Zk5PGUk552[joG>A!!)rZquHcZrrE#[rrE&\quHcZ +rr@W4J`_OGJ`cmmrr@Q~> +JaS*WJaS*Ws6]jerpBjgmd:)QmJm7]mJm7dmK*CV!;u6b!<2Bf!:BjbmJm7bmJm7dmK3IWmK!4R +!!)rb!!*#d!!)i_!s%cW!<2Bd!<2Bd!<2Bf!:BjbmK*CV!;Ps^!<2Bf!:BjbmJm7bmJm7_mJm7b +mK3IWmK!(N!!%T<JaS*WJaWL)rr@Q~> +Ja.gOJa.gOs69RarosRclKSBIl2UhYl2Uh`l2gtN!;u*^!<26b!9sR^l2Uh^l2Uh`l2q%Ol2^eJ +!!)r^!!*#`!!)i[!s%WO!<26`!<26`!<26b!9sR^l2gtN!;PgZ!<26b!9sR^l2Uh^l2Uh[l2Uh^ +l2q%Ol2^YF!!%T8Ja.gOJa34!rr@Q~> +J`_OGJ`_OGs5j:]roO:_k2l[Ajo>DUjo>D\joPPF!;tsZ!<2*^!9O:Zjo>DZjo>D\joYVGjoGAB +!!)rZ!!*#\!!)iW!s%KG!<2*\!<2*\!<2*^!9O:ZjoPPF!;P[V!<2*^!9O:Zjo>DZjo>DWjo>DZ +joYVGjoG5>!!%T4J`_OGJ`cpnrr@Q~> +JaS*WJaS*Ws6]jerpC0pmd:)CmJu\C!:K7TqX+=`rpBgfmK!7S!W_WgrpBgfmK!7S!W_Wgr9asn +md:&Tmd:)CmJuYTrpBgfmK!7S!!)i_!s%cW!<2Bd!<2Bd!<2Bf!:BjdmKEUY!:K7Tq<e4_rpBgf +mK!7S!W_WgrpBgfmK!7S!W_WgrpBgfmK!7S!W_WgrpBgfmK!7S!!%T<JaS*WJaWO*rr@Q~> +Ja.gOJa.gOs69RarosmllKSB7l2^,7!:&hLqW\%\rosObl2^hK!W_KcrosObl2^hK!W_Kcr9=[j +lKS?LlKSB7l2^)LrosObl2^hK!!)i[!s%WO!<26`!<26`!<26b!9sR`l3.1Q!:&hLq<@q[rosOb +l2^hK!W_KcrosObl2^hK!W_KcrosObl2^hK!W_KcrosObl2^hK!!%T8Ja.gOJa37"rr@Q~> +J`_OGJ`_OGs5j:]roOUhk2l[+joFQ+!9WDDqW7bXroO7^joGDC!W_?_roO7^joGDC!W_?_r8nCf +k2lXDk2l[+joFNDroO7^joGDC!!)iW!s%KG!<2*\!<2*\!<2*^!9O:\jokbI!9WDDq;qYWroO7^ +joGDC!W_?_roO7^joGDC!W_?_roO7^joGDC!W_?_roO7^joGDC!!%T4J`_OGJ`csorr@Q~> +JaS*WJaS*Ws6fgcrU0[crU0[cq!S+]rpKacs6]jerpBgfmdC&Ss6]jeqsOIa!U]semf*:dmf!4c +mem.^mem.bmf!4cmf!4cmf!4dmJm7dmJm7`mJm7dmK*CVmf!4cmf!4cmf!4cmf!4cmf!4cmf!4c +mf!3;mXaeWmXag)mf*9;~> +Ja.gOJa.gOs6BO_rTaC_rTaC_q!.hYrp'I_s69RarosOblK\?Ks69Raqs+1]!U9[alMgk`lM^e_ +lMU_ZlMU_^lM^e_lM^e_lM^e`l2Uh`l2Uh\l2Uh`l2gtNlM^e_lM^e_lM^e_lM^e_lM^e_lM^e_ +lM^d7l@J5Ol@J7!lMgj7~> +J`_OGJ`_OGs5s7[rT=+[rT=+[pu_PUroX1[s5j:]roO7^k2uXCs5j:]qr[nY!TjC]k5PG\k5GA[ +k5>;Vk5>;Zk5GA[k5GA[k5GA\jo>D\jo>DXjo>D\joPPFk5GA[k5GA[k5GA[k5GA[k5GA[k5GA[ +k5G@3k(2ZGk(2[nk5PF3~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)oarrE&d!!)$H!!)rb!!)ucrW)]\!!*#dquHcbrW)3N!!)TX +!!(^?!<9e$rr@Q~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)o]rrE&`!!)$D!!)r^!!)u_rW)]X!!*#`quHc^rW)3J!!)TT +!!(^;!!'aurr@Q~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)oYrrE&\!!)$@!!)rZ!!)u[rW)]T!!*#\quHcZrW)3F!!)TP +!!(^7!!'aqrr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)'I!W_WgrpBpimJu\C!<2Bd!;Z$a!:BjamK*CV +!<2Bd!:&tP!;Z$_!;l0a!86c?s1[q$!.Y~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)'E!W_KcrosXel2^,7!<26`!;Ym]!9sR]l2gtN +!<26`!:&hL!;Ym[!;l$]!86W;!5@au!.Y~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)'A!W_?_roO@ajoFQ+!<2*\!;YaY!9O:YjoPPF +!<2*\!:&\H!;YaW!;kmY!86K7!5@Uq!.Y~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)*J!!*#d!W_WgrpBgfmK!7S!!)l`!!*#d!!)uc +!s%cW!<2Bd!:&tP!;Z$_!;l0a!86c?s1[q$!.Y~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)*F!!*#`!W_KcrosObl2^hK!!)l\!!*#`!!)u_ +!s%WO!<26`!:&hL!;Ym[!;l$]!86W;!5@au!.Y~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)*B!!*#\!W_?_roO7^joGDC!!)lX!!*#\!!)u[ +!s%KG!<2*\!:&\H!;YaW!;kmY!86K7!5@Uq!.Y~> +JaS*WJaS*WJaS*WJaU2=r;cfa!!*#d#lsD]!:K7TmJm7dmf!4cmf!4^mJm7dmK*CV!<2Bf!:Bjd +mJm7`mJm7dmJm7dmJm7`mJm7`mK3IW!!)f^r;clcrW)udr;b@8!<9e$rr@Q~> +Ja.gOJa.gOJa.gOJa0o5r;cf]!!*#`#ls8U!:&hLl2Uh`lM^e_lM^eZl2Uh`l2gtN!<26b!9sR` +l2Uh\l2Uh`l2Uh`l2Uh\l2Uh\l2q%O!!)fZr;cl_rW)u`r;b@4!!'aurr@Q~> +J`_OGJ`_OGJ`_OGJ`aW-r;cfY!!*#\#ls,M!9WDDjo>D\k5GA[k5GAVjo>D\joPPF!<2*^!9O:\ +jo>DXjo>D\jo>D\jo>DXjo>DXjoYVG!!)fVr;cl[rW)u\r;b@0!!'aqrr@Q~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpKdds6]pgmK!7S!W_WgrpBadqX+=`rpBgf +mK!7S!W_ZVrW)c^!!*#d!W_ZVrW)la!!)i_rrE)e!!)l`!!*#d!!)rb!s%cW!7L98s1[q$!.Y~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_Kcrp'L`s69Xcl2^hK!W_KcrosI`qW\%\rosOb +l2^hK!W_NNrW)cZ!!*#`!W_NNrW)l]!!)i[rrE)a!!)l\!!*#`!!)r^!s%WO!7L-4!5@au!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roX4\s5j@_joGDC!W_?_roO1\qW7bXroO7^ +joGDC!W_BFrW)cV!!*#\!W_BFrW)lY!!)iWrrE)]!!)lX!!*#\!!)rZ!s%KG!7L!0!5@Uq!.Y~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#drrE#c!!*#d!W_WgrpBmhmd:&Tq!J+^rpBgfmK!7S +!W_WgrpBadqX+=`rpBadr9aObrpBadq!J+^p?hn\rpBgfmdC#Rs6]jefC&A4_s[O)J,~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`rrE#_!!*#`!W_KcrosUdlKS?Lq!%hZrosObl2^hK +!W_KcrosI`qW\%\rosI`r9=7^rosI`q!%hZp?DVXrosOblK\<Js69RafBW&0_s77%J,~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\rrE#[!!*#\!W_?_roO=`k2lXDpuVPVroO7^joGDC +!W_?_roO1\qW7bXroO1\r8mtZroO1\puVPVp>u>TroO7^k2uUBs5j:]fB2c,_rgt!J,~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpBadrpBgfmK!7S!!)uc!!)i_!!*#d!W_Wg +rpBgfmK!7S!!)l`!!*#d!!)rb!s%cW!;Gm]!;>g\!<2Bf!:BjdmK3IWmJt]'!<9e$rr@Q~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_KcrosI`rosObl2^hK!!)u_!!)i[!!*#`!W_Kc +rosObl2^hK!!)l\!!*#`!!)r^!s%WO!;GaY!;>[X!<26b!9sR`l2q%Ol2]8t!!'aurr@Q~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roO1\roO7^joGDC!!)u[!!)iW!!*#\!W_?_ +roO7^joGDC!!)lX!!*#\!!)rZ!s%KG!;GUU!;>OT!<2*^!9O:\joYVGjoEil!!'aqrr@Q~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d"p")Z!:K7TrpBgfmK!7S!W_WgrpBadq<e:amK!7S +"T[rjmd:)SmJm7dmf*:dmKEUY!:K7TrpBgfmJutK!!)l`!!*#d!!*#d$io\qmd:&Tmd:)CmJtf* +!<9e$rr@Q~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`"p!rR!:&hLrosObl2^hK!W_KcrosI`q<A"]l2^hK +"T[fflKSBKl2Uh`lMgk`l3.1Q!:&hLrosObl2^PC!!)l\!!*#`!!*#`$ioPmlKS?LlKSB7l2]B" +!!'aurr@Q~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\"p!fJ!9WDDroO7^joGDC!W_?_roO1\q;q_YjoGDC +"T[Zbk2l[Cjo>D\k5PG\jokbI!9WDDroO7^joG,;!!)lX!!*#\!!*#\$ioDik2lXDk2l[+joEro +!!'aqrr@Q~> +JaS*WJaS*WJaS*WJaU2=r;cibrW)ud!!*#d!W_WgrpBgfmdC&SrpKacp[/"]r9aObrU0XbrU'Xc +r9aObrU0Xbs6fdbqX+=`qsOF`rpK^bs6fme!U]semf*::mK!:$mf*9;~> +Ja.gOJa.gOJa.gOJa0o5r;ci^rW)u`!!*#`!W_KcrosOblK\?Krp'I_pZ__Yr9=7^rTa@^rTX@_ +r9=7^rTa@^s6BL^qW\%\qs+.\rp'F^s6BUa!U9[alMgk6l2UgulMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-r;ciZrW)u\!!*#\!W_?_roO7^k2uXCroX1[pZ;GUr8mtZrT=(ZrT4([ +r8mtZrT=(Zs5s4ZqW7bXqr[kXroX.Zs5s=]!TjC]k5PG2jo>Cqk5PF3~> +JaS*WJaS*WJaS*WJaSonquH-P!!)?QquHN[!!'k'!<9e$rr@Q~> +Ja.gOJa.gOJa.gOJa/WfquH-L!!)?MquHNW!!'k#!!'aurr@Q~> +J`_OGJ`_OGJ`_OGJ``?^quH-H!!)?IquHNS!!'jt!!'aqrr@Q~> +JaS*WJaS*WJaS*WJaS*WRI1(T^@)"$J,~> +Ja.gOJa.gOJa.gOJa.gORHabP^?Y^uJ,~> +J`_OGJ`_OGJ`_OGJ`_OGRH=JL^?5FqJ,~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)oarrE&d!!)$H!!)rb!!)ucrW)]\!!)rb!!)rb!!)6N!!)TX +!!(mD!!)f^!!'q)rr@Q~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)o]rrE&`!!)$D!!)r^!!)u_rW)]X!!)r^!!)r^!!)6J!!)TT +!!(m@!<;iZ!<9t%rr@Q~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)oYrrE&\!!)$@!!)rZ!!)u[rW)]T!!)rZ!!)rZ!!)6F!!)TP +!!(m<!!)fV!!'q!rr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)'I!W_WgrpBpimJu\C!<2Bd!;Z$a!:BjdmK*CV +!<2Bf!:BjOmJm7_mJm7amJm7CmJm7`mJm7(mf*9;~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)'E!W_KcrosXel2^,7!<26`!;Ym]!9sR`l2gtN +!<26b!9sRKl2Uh[l2Uh]l2Uh?l2^k\l2^k$lMgj7~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)'A!W_?_roO@ajoFQ+!<2*\!;YaY!9O:\joPPF +!<2*^!9O:Gjo>DWjo>DYjo>D;jo>DXjo>Cuk5PF3~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)*J!!*#d!W_WgrpBgfmK!7S!!)l`!!*#d!W_Wg +rpBgfmK!7S!!)<P!!)i_!!)oa!!(gB!!)rb!!'k'rr@Q~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)*F!!*#`!W_KcrosObl2^hK!!)l\!!*#`!W_Kc +rosObl2^hK!!)<L!!)i[!!)o]!!(g>!<;u^!<9n#rr@Q~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)*B!!*#\!W_?_roO7^joGDC!!)lX!!*#\!W_?_ +roO7^joGDC!!)<H!!)iW!!)oY!!(g:!!)rZ!!'jtrr@Q~> +JaS*WJaS*WJaS*WJaU2=r;cfa!!*#d#lsD]!:K7TmJm7dmf!4cmf!4^mJm7dmK*CV!<2Bf!:Bjd +mJm7`mJm7dmK*CV!<2Bf!:BjdmJm7`mK3IW!!)f^r;clcrW)udr;bF:!!*#d!!'h&rr@Q~> +Ja.gOJa.gOJa.gOJa0o5r;cf]!!*#`#ls8U!:&hLl2Uh`lM^e_lM^eZl2Uh`l2gtN!<26b!9sR` +l2Uh\l2Uh`l2gtN!<26b!9sR`l2Uh\l2q%O!!)fZr;cl_rW)u`r;bF6!<<&`!<9k"rr@Q~> +J`_OGJ`_OGJ`_OGJ`aW-r;cfY!!*#\#ls,M!9WDDjo>D\k5GA[k5GAVjo>D\joPPF!<2*^!9O:\ +jo>DXjo>D\joPPF!<2*^!9O:\jo>DXjoYVG!!)fVr;cl[rW)u\r;bF2!!*#\!!'gsrr@Q~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpKdds6]pgmK!7S!W_WgrpBadqX+=`rpBgf +mK!7S!W_ZVrW)c^!!*#d!W_WgrpBgfmK!7S!!)l`rrE)e!!)l`!!*#d!!)rb!s%cW!7U?;!:Bj% +mf*9;~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_Kcrp'L`s69Xcl2^hK!W_KcrosI`qW\%\rosOb +l2^hK!W_NNrW)cZ!!*#`!W_KcrosObl2^hK!!)l\rrE)a!!)l\!!*#`!!)r^!s%WO!7U37s6BX! +lMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roX4\s5j@_joGDC!W_?_roO1\qW7bXroO7^ +joGDC!W_BFrW)cV!!*#\!W_?_roO7^joGDC!!)lXrrE)]!!)lX!!*#\!!)rZ!s%KG!7U'3!9O9r +k5PF3~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#drrE#c!!*#d!W_WgrpBmhmd:&Tq!J+^rpBgfmK!7S +!W_WgrpBadqX+=`rpBgfmK!7S!W_WgrpBadqX+=`p?hn\rpBgfmdC#Rs6]jedd@)8^@)"$J,~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`rrE#_!!*#`!W_KcrosUdlKS?Lq!%hZrosObl2^hK +!W_KcrosI`qW\%\rosObl2^hK!W_KcrosI`qW\%\p?DVXrosOblK\<Js69Radcpi4^?Y^uJ,~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\rrE#[!!*#\!W_?_roO=`k2lXDpuVPVroO7^joGDC +!W_?_roO1\qW7bXroO7^joGDC!W_?_roO1\qW7bXp>u>TroO7^k2uUBs5j:]dcLN0^?5FqJ,~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpBadrpBgfmK!7S!!)uc!!)i_!!*#d!W_Wg +rpBgfmK!7S!!)l`!!*#d!W_WgrpBgfmK!7S!!)l`!!)`\!!*#d!W_WgrpBjgmd:)(mK*CV!5It% +!.Y~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_KcrosI`rosObl2^hK!!)u_!!)i[!!*#`!W_Kc +rosObl2^hK!!)l\!!*#`!W_KcrosObl2^hK!!)l\!!)`X!!*#`!W_KcrosRclKSAul2q"Ns1dk! +!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roO1\roO7^joGDC!!)u[!!)iW!!*#\!W_?_ +roO7^joGDC!!)lX!!*#\!W_?_roO7^joGDC!!)lX!!)`T!!*#\!W_?_roO:_k2lZmjoPPF!5I[r +!.Y~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d"p")Z!:K7TrpBgfmK!7S!W_WgrpBadq<e:amK!7S +"T[rjmd:)SmJm7dmf*:dmK*CV!<2Bf!:BjdmK*CV!;Z$_!;c*`!<2Bd!<2Bp!:BjTmJm7TmJu\C +!8$W=!<2Bd!5S%&!.Y~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`"p!rR!:&hLrosObl2^hK!W_KcrosI`q<A"]l2^hK +"T[fflKSBKl2Uh`lMgk`l2gtN!<26b!9sR`l2gtN!;Ym[!;bs\!<26`!<26l!9sRLl2UhLl2^,7 +!8$K9s8M9`s1mq"!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\"p!fJ!9WDDroO7^joGDC!W_?_roO1\q;q_YjoGDC +"T[Zbk2l[Cjo>D\k5PG\joPPF!<2*^!9O:\joPPF!;YaW!;bgX!<2*\!<2*h!9O:Djo>DDjoFQ+ +!8$?5!<2*\!5Ras!.Y~> +JaS*WJaS*WJaS*WJaU2=r;cibrW)ud!!*#d!W_WgrpBgfmdC&SrpKacp[/"]r9aObrU0XbrU'Xc +r9aObr9aObr9aObq!J+^qsOF`rpK^bs6fme!U]semf*:=mJm7bmJm7'mf*9;~> +Ja.gOJa.gOJa.gOJa0o5r;ci^rW)u`!!*#`!W_KcrosOblK\?Krp'I_pZ__Yr9=7^rTa@^rTX@_ +r9=7^r9=7^r9=7^q!%hZqs+.\rp'F^s6BUa!U9[alMgk9l2^k^l2^k#lMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-r;ciZrW)u\!!*#\!W_?_roO7^k2uXCroX1[pZ;GUr8mtZrT=(ZrT4([ +r8mtZr8mtZr8mtZpuVPVqr[kXroX.Zs5s=]!TjC]k5PG5jo>DZjo>Ctk5PF3~> +JaS*WJaS*WJaS*WJaSonquH-P!!)?QquHN[!!("+!!)l`!!'n(rr@Q~> +Ja.gOJa.gOJa.gOJa/WfquH-L!!)?MquHNW!!("'!<;o\!<9q$rr@Q~> +J`_OGJ`_OGJ`_OGJ``?^quH-H!!)?IquHNS!!("#!!)lX!!'murr@Q~> +JaS*WJaS*WJaS*WJaS*WT'cRYq!J+^_s[O)J,~> +Ja.gOJa.gOJa.gOJa.gOT'?=Uq!%kZ_s77%J,~> +J`_OGJ`_OGJ`_OGJ`_OGT&p"QpuVPV_rgt!J,~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)oarrE&d!!)$H!!)rb!!)ucrW)]\!!)rb!!)rb!!)6N!!)TX +!!(mD!!)uc!!)uc!!'q)rr@Q~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)o]rrE&`!!)$D!!)r^!!)u_rW)]X!!)r^!!)r^!!)6J!!)TT +!!(m@!!)u_!!)u_!!'q%rr@Q~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)oYrrE&\!!)$@!!)rZ!!)u[rW)]T!!)rZ!!)rZ!!)6F!!)TP +!!(m<!<<#[!<<#[!<9t!rr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)'I!W_WgrpBpimJu\C!<2Bd!;Z$a!:BjdmK*CV +!<2Bf!:BjOmJm7_mJm7amJm7CmJm7dmJm7dmJm7(mf*9;~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)'E!W_KcrosXel2^,7!<26`!;Ym]!9sR`l2gtN +!<26b!9sRKl2Uh[l2Uh]l2Uh?l2Uh`l2Uh`l2Uh$lMgj7~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)'A!W_?_roO@ajoFQ+!<2*\!;YaY!9O:\joPPF +!<2*^!9O:Gjo>DWjo>DYjo>D;joGG\joGG\joGFuk5PF3~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)*J!!*#d!W_WgrpBgfmK!7S!!)l`!!*#d!W_Wg +rpBgfmK!7S!!)<P!!)i_!!)oa!!(gB"p")Z!:K7T_=%='J,~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)*F!!*#`!W_KcrosObl2^hK!!)l\!!*#`!W_Kc +rosObl2^hK!!)<L!!)i[!!)o]!!(g>"p!rR!:&hL_<V%#J,~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)*B!!*#\!W_?_roO7^joGDC!!)lX!!*#\!W_?_ +roO7^joGDC!!)<H!!)iW!!)oY!!(g:#63iJs5rJD_<1atJ,~> +JaS*WJaS*WJaS*WJaU2=r;cfa!!*#d#lsD]!:K7TmJm7dmf!4cmf!4^mJm7dmK*CV!<2Bf!:Bjd +mJm7`mJm7dmK*CV!<2Bf!:BjdmJm7`mJm7dmJm7_mem.cmf!4dmem.:mK<OX!:Bj&mf*9;~> +Ja.gOJa.gOJa.gOJa0o5r;cf]!!*#`#ls8U!:&hLl2Uh`lM^e_lM^eZl2Uh`l2gtN!<26b!9sR` +l2Uh\l2Uh`l2gtN!<26b!9sR`l2Uh\l2Uh`l2Uh[lMU__lM^e`lMU_6l3%+P!9sR"lMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-r;cfY!!*#\#ls,M!9WDDjo>D\k5GA[k5GAVjo>D\joPPF!<2*^!9O:\ +jo>DXjo>D\joPPF!<2*^!9O:\jo>DXjo>D\jo>DWk5>;[k5GA\k5>;2jok_Hs5s?sk5PF3~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpKdds6]pgmK!7S!W_WgrpBadqX+=`rpBgf +mK!7S!W_ZVrW)c^!!*#d!W_WgrpBgfmK!7S!!)l`!!*#d!!)l`!!*#d!!)rb!s%cW!7UB8!5It% +!.Y~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_Kcrp'L`s69Xcl2^hK!W_KcrosI`qW\%\rosOb +l2^hK!W_NNrW)cZ!!*#`!W_KcrosObl2^hK!!)l\!!*#`!!)l\!!*#`!!)r^!s%WO!7U64!5Ih! +!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roX4\s5j@_joGDC!W_?_roO1\qW7bXroO7^ +joGDC!W_BFrW)cV!!*#\!W_?_roO7^joGDC!!)lX!!*#\!!)lX!!*#\!!)rZ!s%KG!7U*0s1d^r +!.Y~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#drrE#c!!*#d!W_WgrpBmhmd:&Tq!J+^rpBgfmK!7S +!W_WgrpBadqX+=`rpBgfmK!7S!W_WgrpBadqX+IdmJuYTqX+=`rpBgfmdC#Rs6]jefC&>4_s[O) +J,~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`rrE#_!!*#`!W_KcrosUdlKS?Lq!%hZrosObl2^hK +!W_KcrosI`qW\%\rosObl2^hK!W_KcrosI`qW\1`l2^)LqW\%\rosOblK\<Js69RafBW&0_s77% +J,~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\rrE#[!!*#\!W_?_roO=`k2lXDpuVPVroO7^joGDC +!W_?_roO1\qW7bXroO7^joGDC!W_?_roO1\qW7n\joFNDqW7bXroO7^k2uUBs5j:]fB2f,_rgt! +J,~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpBadrpBgfmK!7S!!)uc!!)i_!!*#d!W_Wg +rpBgfmK!7S!!)l`!!*#d!W_WgrpBgfmK!7S!!)l`"9@iimK!+O!!*#d!W_WgrpBjgmd:)(mf!4$ +mf*9;~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_KcrosI`rosObl2^hK!!)u_!!)i[!!*#`!W_Kc +rosObl2^hK!!)l\!!*#`!W_KcrosObl2^hK!!)l\"9@]el2^\G!!*#`!W_KcrosRclKSAulM^du +lMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roO1\roO7^joGDC!!)u[!!)iW!!*#\!W_?_ +roO7^joGDC!!)lX!!*#\!W_?_roO7^joGDC!!)lX"9@QajoG8?!!*#\!W_?_roO:_k2lZmk5PCq +k5PF3~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d"p")Z!:K7TrpBgfmK!7S!W_WgrpBadq<e:amK!7S +"T[rjmd:)SmJm7dmf*:dmK*CV!<2Bf!:BjdmK*CV!;Z$c!:BjT!<2Bd!<2Bd!<2Bp!:BjTmJm7T +mJu\C!8$WA!:BjT!5S%&!.Y~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`"p!rR!:&hLrosObl2^hK!W_KcrosI`q<A"]l2^hK +"T[fflKSBKl2Uh`lMgk`l2gtN!<26b!9sR`l2gtN!;Ym_!9sRL!<26`!<26`!<26l!9sRLl2UhL +l2^,7!8$K=!9sRL!5Rn"!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\"p!fJ!9WDDroO7^joGDC!W_?_roO1\q;q_YjoGDC +"T[Zbk2l[Cjo>D\k5PG\joPPF!<2*^!9O:\joPPF!;Ya[!9O:D!<2*\!<2*\!<2*h!9O:Djo>DD +joFQ+!8$?9s5s@Ds1mds!.Y~> +JaS*WJaS*WJaS*WJaU2=r;cibrW)ud!!*#d!W_WgrpBgfmdC&SrpKacp[/"]r9aObrU0XbrU'Xc +r9aObr9aObr9aObp[/(_mK!7SrW)rcr;clcrr<)f!<2Ed!8$WC!:K7Tmd:(kmf*9;~> +Ja.gOJa.gOJa.gOJa0o5r;ci^rW)u`!!*#`!W_KcrosOblK\?Krp'I_pZ__Yr9=7^rTa@^rTX@_ +r9=7^r9=7^r9=7^pZ_e[l2^hKrW)r_r;cl_rr<)b!<29`!8$K?!:&hLlKSAclMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-r;ciZrW)u\!!*#\!W_?_roO7^k2uXCroX1[pZ;GUr8mtZrT=(ZrT4([ +r8mtZr8mtZr8mtZpZ;MWjoGDCrW)r[r;cl[rr<)^!<2-\!8$?;s5rJDk2u][k5PF3~> +JaS*WJaS*WJaS*WJaSonquH-P!!)?QquHN[!!("+!!*#d!!*#d!!'n(rr@Q~> +Ja.gOJa.gOJa.gOJa/WfquH-L!!)?MquHNW!!("'!!*#`!!*#`!!'n$rr@Q~> +J`_OGJ`_OGJ`_OGJ``?^quH-H!!)?IquHNS!!("#!<<&\!<<&\!<9purr@Q~> +JaS*WJaS*WJaS*WJaS*WT'cRYrU'XcrU'Xc_s[O)J,~> +Ja.gOJa.gOJa.gOJa.gOT'?:UrTX@_rTX@__s77%J,~> +J`_OGJ`_OGJ`_OGJ`_OGT&p%QrT4+[rT4+[_rgt!J,~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)oarrE&d!!)$H!!)rb!!)ucrW)]\!!*#dquHcbrW)3N!!)TX +!!(mDpA`%urr@Q~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)o]rrE&`!!)$D!!)r^!!)u_rW)]X!!*#`quHc^rW)3J!!)TT +!!(m@p&N"qrr@Q~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)oYrrE&\!!)$@!!)rZ!!)u[rW)]T!!*#\quHcZrW)3F!!)TP +!!(m<pA`%mrr@Q~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)'I!W_WgrpBpimJu\C!<2Bd!;Z$a!:BjamK*CV +!<2Bd!:&tP!;Z$_!;l0a!8d,Ds7l!^s24:)!.Y~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)'E!W_KcrosXel2^,7!<26`!;Ym]!9sR]l2gtN +!<26`!:&hL!;Ym[!;l$]!8cu@!;PgZ!5n+%!.Y~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)'A!W_?_roO@ajoFQ+!<2*\!;YaY!9O:YjoPPF +!<2*\!:&\H!;YaW!;kmY!8ci<s7k^Vs24"!!.Y~> +JaS*WJaS*WJaS*WJaU>A!!*#d!!)l`!!*#d!!)*J!!*#d!W_WgrpBgfmK!7S!!)l`!!*#d!!)uc +!s%cW!<2Bd!:&tP!;Z$_!;l0a!8d,Ds7l!^s24:)!.Y~> +Ja.gOJa.gOJa.gOJa1&9!!*#`!!)l\!!*#`!!)*F!!*#`!W_KcrosObl2^hK!!)l\!!*#`!!)u_ +!s%WO!<26`!:&hL!;Ym[!;l$]!8cu@!;PgZ!5n+%!.Y~> +J`_OGJ`_OGJ`_OGJ`ac1!!*#\!!)lX!!*#\!!)*B!!*#\!W_?_roO7^joGDC!!)lX!!*#\!!)u[ +!s%KG!<2*\!:&\H!;YaW!;kmY!8ci<s7k^Vs24"!!.Y~> +JaS*WJaS*WJaS*WJaU2=r;cfa!!*#d#lsD]!:K7TmJm7dmf!4cmf!4^mJm7dmK*CV!<2Bf!:Bjd +mJm7`mJm7dmJm7dmJm7`mJm7`mJm7dmJm7_mem.cmf!4dmem.=mK!:^mK!:)mf*9;~> +Ja.gOJa.gOJa.gOJa0o5r;cf]!!*#`#ls8U!:&hLl2Uh`lM^e_lM^eZl2Uh`l2gtN!<26b!9sR` +l2Uh\l2Uh`l2Uh`l2Uh\l2Uh\l2Uh`l2Uh[lMU__lM^e`lMU_9l2UhZl2Uh%lMgj7~> +J`_OGJ`_OGJ`_OGJ`aW-r;cfY!!*#\#ls,M!9WDDjo>D\k5GA[k5GAVjo>D\joPPF!<2*^!9O:\ +jo>DXjo>D\jo>D\jo>DXjo>DXjo>D\jo>DWk5>;[k5GA\k5>;5joGGVjoGG!k5PF3~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpKdds6]pgmK!7S!W_WgrpBadqX+=`rpBgf +mK!7S!W_ZVrW)c^!!*#d!W_ZVrW)la!!)i_!!*#d!!)l`!!*#d!!)rb!s%cW!8$W=s7l!^s24:) +!.Y~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_Kcrp'L`s69Xcl2^hK!W_KcrosI`qW\%\rosOb +l2^hK!W_NNrW)cZ!!*#`!W_NNrW)l]!!)i[!!*#`!!)l\!!*#`!!)r^!s%WO!8$K9!;PgZ!5n+% +!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roX4\s5j@_joGDC!W_?_roO1\qW7bXroO7^ +joGDC!W_BFrW)cV!!*#\!W_BFrW)lY!!)iW!!*#\!!)lX!!*#\!!)rZ!s%KG!8$?5s7k^Vs24"! +!.Y~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#drrE#c!!*#d!W_WgrpBmhmd:&Tq!J+^rpBgfmK!7S +!W_WgrpBadqX+=`rpBadr9aObrpBadq!J7bmJuYTqX+=`rpBgfmdC#Rs6]jefBrY=rU'[crU'[c +_s[O)J,~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`rrE#_!!*#`!W_KcrosUdlKS?Lq!%hZrosObl2^hK +!W_KcrosI`qW\%\rosI`r9=7^rosI`q!%t^l2^)LqW\%\rosOblK\<Js69RafBN>9rTX@_rTX@_ +_s77%J,~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\rrE#[!!*#\!W_?_roO=`k2lXDpuVPVroO7^joGDC +!W_?_roO1\qW7bXroO1\r8mtZroO1\puV\ZjoFNDqW7bXroO7^k2uUBs5j:]fB*)5rT4+[rT4+[ +_rgt!J,~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d!W_WgrpBadrpBgfmK!7S!!)uc!!)i_!!*#d!W_Wg +rpBgfmK!7S!!)l`!!*#d!!)rb!s%cW!;Gma!:BjT!;c*`!<2Bf!:BjdmK3IWmJtl,!<;i^!<9t) +rr@Q~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`!W_KcrosI`rosObl2^hK!!)u_!!)i[!!*#`!W_Kc +rosObl2^hK!!)l\!!*#`!!)r^!s%WO!;Ga]!9sRL!;bs\!<26b!9sR`l2q%Ol2]H$!!)fZ!!'q% +rr@Q~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\!W_?_roO1\roO7^joGDC!!)u[!!)iW!!*#\!W_?_ +roO7^joGDC!!)lX!!*#\!!)rZ!s%KG!;GUY!9O:D!;bgX!<2*^!9O:\joYVGjoF#q!<;iV!<9t! +rr@Q~> +JaS*WJaS*WJaS*WJaU2=!!*#d!!*#d!!*#d"p")Z!:K7TrpBgfmK!7S!W_WgrpBadq<e:amK!7S +"T[rjmd:)SmJm7dmf*:dmKEUY!:K7TrpBgfmJutK"9@iimK!7S!!*#d!!*#d$io\qmd:&Tmd:)C +mJtu/!<;i^!<9t)rr@Q~> +Ja.gOJa.gOJa.gOJa0o5!!*#`!!*#`!!*#`"p!rR!:&hLrosObl2^hK!W_KcrosI`q<A"]l2^hK +"T[fflKSBKl2Uh`lMgk`l3.1Q!:&hLrosObl2^PC"9@]el2^hK!!*#`!!*#`$ioPmlKS?LlKSB7 +l2]Q'!!)fZ!!'q%rr@Q~> +J`_OGJ`_OGJ`_OGJ`aW-!!*#\!!*#\!!*#\"p!fJ!9WDDroO7^joGDC!W_?_roO1\q;q_YjoGDC +"T[Zbk2l[Cjo>D\k5PG\jokbI!9WDDroO7^joG,;"9@QajoGDC!!*#\!!*#\$ioDik2lXDk2l[+ +joF,t!<;iV!<9t!rr@Q~> +JaS*WJaS*WJaS*WJaU2=r;cibrW)ud!!*#d!W_WgrpBgfmdC&SrpKacp[/"]r9aObrU0XbrU'Xc +r9aObrU0Xbs6fdbq<e:amK!7SrW)rcr;clcrr<)f!<2Ed!86c?s7l!^s24:)!.Y~> +Ja.gOJa.gOJa.gOJa0o5r;ci^rW)u`!!*#`!W_KcrosOblK\?Krp'I_pZ__Yr9=7^rTa@^rTX@_ +r9=7^rTa@^s6BL^q<A"]l2^hKrW)r_r;cl_rr<)b!<29`!86W;!;PgZ!5n+%!.Y~> +J`_OGJ`_OGJ`_OGJ`aW-r;ciZrW)u\!!*#\!W_?_roO7^k2uXCroX1[pZ;GUr8mtZrT=(ZrT4([ +r8mtZrT=(Zs5s4Zq;q_YjoGDCrW)r[r;cl[rr<)^!<2-\!86K7s7k^Vs24"!!.Y~> +JaS*WJaS*WJaS*WJaSonquH-P!!)?QquHN[!!(%,!<;i^!<9t)rr@Q~> +Ja.gOJa.gOJa.gOJa/WfquH-L!!)?MquHNW!!(%(!!)fZ!!'q%rr@Q~> +J`_OGJ`_OGJ`_OGJ``?^quH-H!!)?IquHNS!!(%$!<;iV!<9t!rr@Q~> +JaS*WJaS*WJaS*WJaS*WT'l=P_s[O)J,~> +Ja.gOJa.gOJa.gOJa.gOT'H"L_s77%J,~> +J`_OGJ`_OGJ`_OGJ`_OGT'#bH_rgt!J,~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +NpZlIrU0XbrU'Xcr9aObJaS*WJaS*WJaS*WJaS*Wg[>(AJ,~> +Np6TErTa@^rTX@_r9=7^Ja.gOJa.gOJa.gOJa.gOgZne=J,~> +Nog<ArT=(ZrT4([r8mtZJ`_OGJ`_OGJ`_OGJ`_OGgZJM9J,~> +O7*#JrpBadrpBpimd:)C!<2Bf!:Bi<mXaeWmXaeWmXaeWmXaf]mf*9;~> +O6Z`FrosI`rosXelKSB7!<26b!9sQ8l@J5Ol@J5Ol@J5Ol@J6UlMgj7~> +O66HBroO1\roO@ak2l[+!<2*^!9O94k(2ZGk(2ZGk(2ZGk(2[Mk5PF3~> +OR</MmK!7S!!*#d!W_WgrpBgfmK!7S!!%T<JaS*WJaS*WJaS*WJaV@^rr@Q~> +OQllIl2^hK!!*#`!W_KcrosObl2^hK!!%T8Ja.gOJa.gOJa.gOJa2(Vrr@Q~> +OQHTEjoGDC!!*#\!W_?_roO7^joGDC!!%T4J`_OGJ`_OGJ`_OGJ`beNrr@Q~> +NpZlIqX+CbmK!7S!W_WgrpBadJaS*WJaS*WJaS*WJaS*Wh<t:CJ,~> +Np6TEqW\+^l2^hK!W_KcrosI`Ja.gOJa.gOJa.gOJa.gOh<P"?J,~> +Nog<AqW7hZjoGDC!W_?_roO1\J`_OGJ`_OGJ`_OGJ`_OGh<+_;J,~> +NpZlIqsFOdmd:)SmK*CV!<2Bd!:]FQ!.jQhmXaeWmXaeWmXaeWme-#J!.Y~> +Np6TEqs"7`lKSBKl2gtN!<26`!:]:M!.jEdl@J5Ol@J5Ol@J5OlLjHB!.Y~> +Nog<AqrRt\k2l[CjoPPF!<2*\!:].I!.j9`k(2ZGk(2ZGk(2ZGk4Rm:!.Y~> +NpZlIr9aObrpBadrpBgfmK!7S!!)QWq#H!6JaS*WJaS*WJaS*WJaW4!rr@Q~> +Np6TEr9=7^rosI`rosObl2^hK!!)QSq#H!2Ja.gOJa.gOJa.gOJa2pnrr@Q~> +Nog<Ar8mtZroO1\roO7^joGDC!!)QOq#H!.J`_OGJ`_OGJ`_OGJ`cXfrr@Q~> +NpZlIrU'XcrU'XcrpBgfmK!7S!!)QWrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Np6TErTX@_rTX@_rosObl2^hK!!)QSrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +Nog<ArT4([rT4([roO7^joGDC!!)QOrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +NpZlIrpBadqsFLcmK!7S!W_WgnF$;VJaS*WJaS*WJaS*WJaS*Wn*^2UJ,~> +Np6TErosI`qs"4_l2^hK!W_KcnEU#RJa.gOJa.gOJa.gOJa.gOn*9oQJ,~> +Nog<AroO1\qrRq[joGDC!W_?_nE0`NJ`_OGJ`_OGJ`_OGJ`_OGn)jWMJ,~> +ORE#H!:KabrpBadr9aObn*^2UJaS*WJaS*WJaS*WJaS*Wn*^2UJ,~> +OQu`D!:'I^rosI`r9=7^n*9oQJa.gOJa.gOJa.gOJa.gOn*9oQJ,~> +OQQH@!9X1ZroO1\r8mtZn)jWMJ`_OGJ`_OGJ`_OGJ`_OGn)jWMJ,~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WJaS*WJaS*WJaW!prr@Q~> +Ja2Lbrr@W8Ja.gOJa.gOJa.gOJa2^hrr@Q~> +J`c4Zrr@W4J`_OGJ`_OGJ`_OGJ`cF`rr@Q~> +JaVdjrr@W<JaS*WMs^QFrpKdds6fjds6fmerpBadJaS*WJaS*Wq!S.^J,~> +Ja2Lbrr@W8Ja.gOMs:9Brp'L`s6BR`s6BUarosI`Ja.gOJa.gOq!.kZJ,~> +J`c4Zrr@W4J`_OGMrk$>roX7\s5s=\s5s@]roO4\J`_OGJ`_OGpu_SVJ,~> +JaVdjrr@W<JaS*W[I+"prU'^emdC&Ss6fme"muBY!!)Hc!!)Hc!!)H8!<2Ed!<2Ed!.jQhmXaei +mf*9;~> +Ja2Lbrr@W8Ja.gO[H[_lrTXFalK\?Ks6BUa"mQ*Q!!)<_!!)<_!!)<4!<29`!<29`!.jEdl@J5a +lMgj7~> +J`c4Zrr@W4J`_OG[H7JhrT41]k2u[Cs5s@]"m5jIs8V6[rrD3[rrD30s8M0\s8M0\s+0<`k(2ZY +k5PF3~> +JaVdjrr@W<JaS*Wg$Sh?rpKddrpKacs6fgcs6fjd!:KL[!:I#j!:Kgds6fjds6fjdJaS*WJaT&r +rr@Q~> +Ja2Lbrr@W8Ja.gOg$/P;rp'L`rp'I_s6BO_s6BR`!:'4W!:$`f!:'O`s6BR`s6BR`Ja.gOJa/cj +rr@Q~> +J`c4Zrr@W4J`_OGg#`;7roX7\roX4[s5s:[s5s=\!9WtS!9UKb!9X:\s5s=\s5s=\J`_OGJ``Kb +rr@Q~> +JaVdjrr@W<JaSZg!!)uc!!)uc!!)ucrrE&drrE&drrE&dr;Zici;`lGM#[VF!!%T<JaS*WT'lUY +J,~> +Ja2Lbrr@W8Ja/B_!!)u_!!)u_!!)u_rrE&`rrE&`rrE&`r;Zi_i;`lCM#[VB!!%T8Ja.gOT'H=U +J,~> +J`c4Zrr@W4J``*W!<<#[!<<#[!<<#[s8W)\s8W)\s8W)\rVll[iVro?M>mY>s8RZ4J`_OGT'$%Q +J,~> +JaVdjrr@W<JaW=$rrE)eJH16$irB/K!!%T<JaS*WSaQLXJ,~> +Ja2Lbrr@W8Ja3$qrrE)aJH16$irB/G!!%T8Ja.gOSa-4TJ,~> +J`c4Zrr@W4J`cais8W,]JcC<$j8T2Cs8RZ4J`_OGS`]qPJ,~> +JaVdjrr@W<QgOhRrU0[cs6fO[!:GC<JH4:%!q$$gJaS*WJaT&rrr@Q~> +Ja2Lbrr@W8Qg+PNrTaC_s6B7W!:#+8JH4:%!pTacJa.gOJa/cjrr@Q~> +J`c4Zrr@W4Qf\;JrT=.[s5s"S!9Sk4JcF@%!p9O_J`_OGJ``Kbrr@Q~> +JaVdjrr@W<\*a4rrpKddrpKacs6fjds6fjds6fjd!:Kdc!:GC<JH3IcJaS*WJaT#qrr@Q~> +Ja2Lbrr@W8\*<qnrp'L`rp'I_s6BR`s6BR`s6BR`!:'L_!:#+8JH3IcJa.gOJa/`irr@Q~> +J`c4Zrr@W4\)m\jroX7\roX4[s5s=\s5s=\s5s=\!9X7[!9Sk4JcEOcJ`_OGJ``Harr@Q~> +JaVdjrrA&H!!)uc!!)uc!!)ucrrE&dr;ZicqZ$Waqu?`br;clcr;ZicJH16$JH5KGJaS*WJaT&r +rr@Q~> +Ja2LbrrA&D!!)u_!!)u_!!)u_rrE&`r;Zi_qZ$W]qu?`^r;cl_r;Zi_JH16$JH5KGJa.gOJa/cj +rr@Q~> +J`c4ZrrA&@!<<#[!<<#[!<<#[s8W)\rVll[qu6ZYr;QcZrVuo[rVll[JcC<$JcGQGJ`_OGJ``Kb +rr@Q~> +JaVdjrrCpDrrE&drrE&drr<)f!<)<j!:BjTmJuYTrU'Xcq<e4_rU($nmJu\C!:BjT!:K:S!<2Ed +!<2Ed!<;Kd!!)Hd!<;K`!!)G<!.b-$!6kLpmXaeWm[ikH!.Y~> +Ja2LbrrCp@rrE&`rrE&`rr<)b!<)0f!9sRLl2^)LrTX@_q<@q[rTXajl2^,7!9sRL!:&kK!<29` +!<29`!<;?`!!)<`!<;?\!!);8!.b-$!6kLpl@J5OlCR;@!.Y~> +J`c4ZrrCp<s8W)\s8W)\s8N,^s8D'bs5s@Dk5XTDrT4+[q;q\WrT4Lfk5XT+s5s@Ds5rJCs8M0\ +s8M0\s8V6\rrD3\s8V6XrrD24s+13$s3:Rpk(2ZGk+:`8!.Y~> +JaVdjrrD?PJH16$JH16$m/V_*JaS*WRdU1UJ,~> +Ja2LbrrD?LJH16$JH16$m/V_&Ja.gORd0nQJ,~> +J`c4ZrrD?HJcC<$JcC<$mJhb"J`_OGRcaVMJ,~> +JaVdjrrDTWJH5';!:GC<JH16$q>c*7JaS*WS*p:VJ,~> +Ja2LbrrDTSJH5';!:#+8JH16$q>c*3Ja.gOS*L"RJ,~> +J`c4ZrrDTOJcG-;!9Sk4JcC<$qYu-/J`_OGS*'_NJ,~> +JaVdjrrDf]JH16$JH16$h>i,pJaS*WSF6CWJ,~> +Ja2LbrrDfYJH16$JH16$h>i,lJa.gOSEg+SJ,~> +J`c4ZrrDfUJcC<$JcC<$hZ&/hJ`_OGSEBhOJ,~> +JaVdjrrE&dJH16$JH2/>!:Kdc!:Kgd!:KU^!:K[`!:JJ>JaS*WJaT)srr@Q~> +Ja2LbrrE&`JH16$JH2/>!:'L_!:'O`!:'=Z!:'C\!:&2:Ja.gOJa/fkrr@Q~> +J`c4ZrrE&\JcC<$JcD5>!9X7[!9X:\!9X(V!9X.X!9Vr6J`_OGJ``Ncrr@Q~> +JaVdjJH16$JH3mo!:JqK!q$'Vqu?`brW)udq>_#n!:BjT!:BjT!!)HT!:Kgd!:K[`!:Kdcs6]sh +mJu\S!<2Bf!:K:M!!)Hc!!)Hc!!)Hd!<2Ed!4qRu!<)<c!<)<c!.jQhmXafqmf*9;~> +Ja2LbJH16$JH3mo!:&YG!pTdNqu?`^rW)u`q>_#j!9sRL!9sRL!!)<L!:'O`!:'C\!:'L_s69[d +l2^,K!<26b!:&kE!!)<_!!)<_!!)<`!<29`!4qFq!<)0_!<)0_!.jEdl@J6ilMgj7~> +J`c4ZJcC<$JcEso!9WDC!p9OFr;QcZrr<#\qYq&fs5s@Ds5s@Ds8V6Ds5s=\!9X.X!9X7[s5jF` +k5XTCs8M-^s5rJ=rrD3[rrD3[rrD3\s8M0\s17=ms8D'[s8D'[s+0<`k(2[ak5PF3~> +JaVmmJH16$nGiRWJH4s8!:Kabs6fdbs6]pgmK!7SrW!#f!:Kgd!q$'Vqu?`bqu?lf!:BjTrW!&g +!:BjcmK3IW!:Kgds6^0nmJu\C!:BjT!<2Ec!!)HO!!)Ha!!_ikmJm7T!<)?a!64I,!!)HL!!)Hc +!!)Hc!!)Hd!<;Kd!<;Kd!<;Ke!<2Ed!<2Ed!<2Bd!.jQhm[<MC!.Y~> +Ja2UeJH16$nGiRSJH4s8!:'I^s6BL^s69Xcl2^hKrW!#b!:'O`!pTdNqu?`^qu?lb!9sRLrW!&c +!9sR_l2q%O!:'O`s69mjl2^,7!9sRL!<29_!!)<K!!)<]!!_]gl2UhL!<)3]!64=(!!)<H!!)<_ +!!)<_!!)<`!<;?`!<;?`!<;?a!<29`!<29`!<26`!.jEdlC$r;!.Y~> +J`c=]JcC<$nc&UOJcG$8!9X4Zs5s7Zs5jC_k5YGCrr3&^s5s=\!p9OFr;QcZr;Qo^s5s@Drr3)_ +s5s@[jobYGs5s=\s5jXfk5XT+s5s@Ds8M0[rrD3GrrD3Yrs%Wck5YJDs8D*Ys2O4$rrD3DrrD3[ +rrD3[rrD3\s8V6\s8V6\s8V6]s8M0\s8M0\s8M-\s+0<`k*bB3!.Y~> +JaVjlJH16$fDts>rW)ud#6=/lmJuYTmbRpDmdL2[mJm7T!:Kgd!:Kgd#jq]\!:K7TmdC#R"7?-h +mf!1jmJuYTmd:)SmJm7dmK*CV!<2Bd!<2Bf!:BjdmK*CVmf!1emK!7S!!)uch>mQCo`4[Qrr<&e +rW)ud!<DQe!;c-_!<2E[!!2KfrpKI[cgJIH!:Kgds6fmeJaS*WR-stSJ,~> +Ja2RdJH16$fDts:rW)u`#6=#hl2^)LlJ;L@lL4cWl2UhL!:'O`!:'O`#jMET!:&hLlK\<J"6ojd +lM^bfl2^)LlKSBKl2Uh`l2gtN!<26`!<26b!9sR`l2gtNlM^bal2^hK!!)u_h>mQ?o`4[Mrr<&a +rW)u`!<DEa!;c![!<29W!!2?brp'1Wcg&1D!:'O`s6BUaJa.gOR-O\OJ,~> +J`c:\JcC<$f`2!6rr<#\#QNrdk5XTDk2-+<k4&BSk5YJDs5s=\!9X:\#j20Ls5rJDk2uXB"6TX` +k5PAbk5XTDk2u^CjoGG\joYSFs8M-\s8M-^s5s@\joYSFk5PA]k5YGC!<<#[hZ*T;p&F^Is8N)] +rr<#\!WV<]s8(mWs8M0SrrM9^roWqScfVq@!9X:\s5s@]J`_OGR-+DKJ,~> +JaVgkJH16$o`,']!:Kgd!:Kgds6faas6fme!q$'VrVurdrW!)h!:BgerpK^bs6fmes6f^`"7?-h +meZtomJm7TmJm7T!:BjT!!)H_!!)Hd!!)Hd!!)Hd!!2KfrpBdemf!4dmJm7dmf*:emf!4dmf*:e +mK3IW!!)uc!!)uc!!)uc!!)uc!!)uc#QX8mmd:)C!!*#dli7%RquH`a!<DQe!;l0a!<2Be!:Kgd +o'QPZmdC&SrU'dgmJuYTr9a[fmJuYTrpBgfmdC&Ss6]jerpBadqsOF`i9gXHmd?tQ!q$$gJaS*W +QgXkRJ,~> +Ja2OcJH16$o`,'Y!:'O`!:'O`s6BI]s6BUa!pTdNrVur`rW!)d!9sOarp'F^s6BUas6BF\"6ojd +lMCPkl2UhLl2UhL!9sRL!!)<[!!)<`!!)<`!!)<`!!2?brosLalM^e`l2Uh`lMgkalM^e`lMgka +l2q%O!!)u_!!)u_!!)u_!!)u_!!)u_#QX,ilKSB7!!*#`li7%NquH`]!<DEa!;l$]!<26a!:'O` +o'-8VlK\?KrTXLcl2^)Lr9=Cbl2^)LrosOblK\?Ks69RarosI`qs+.\i9C@DlKY8I!pTacJa.gO +Qg4SNJ,~> +J`c7[JcC<$p&>*Us5s=\!9X:\s5s4Ys5s@]!p9OFrr2u\rr3,`s5s@]roX1Zs5s@]s5s1X"6TX` +k55/gk5YJDk5YJDs5s@Ds8V6WrrD3\rrD3\rrD3\rrM9^roO7]k5PD\joGG\k5YJ]k5PD\k5YJ] +jobYGs8W&[!<<#[!<<#[!<<#[!<<#[#lj&ek2u^+s8W)\m/I(Jr;ZcY!WV<]s81pYs8M-]s5s=\ +o&^#Rk2u[CrT47_k5XTDr8n.^k5XTDroO:^k2u[Cs5j=]roO4\qr[nXi8t+@k2rTA!p9O_J`_OG +Qfe;JJ,~> +JaVdjJH1l6rpKdds6fmes6fmes6^$jmd:&Tmf!1lmJm7TmJm7Tmed%bme?e^mf*:emf*7lmJu\C +!:K7TqsOIarpKdd!:KL[!:Kab"RZ6imdC&SrpKdd"muBYmJu\N!!)HR!<;He!<2Ed!<2Ed!<2Bd +!:fIW!<)<c!<)?c!<2Bd!<2Bd!;c-_!!)Hb!<2Bn!:BjT!:BjT!:Bjdmf!1emK!4R!!)ucrr</h +!:BjZme-Y\mK3IWmK!7S$39M^!:K7TmJu\CrW!)h!:BgerpBadrU'dgmJuYTna;P?JaS*WQL=bQ +J,~> +Ja2LbJH1l6rp'L`s6BUas6BUas69aflKS?LlM^bhl2UhLl2UhLlMLV^lM(AZlMgkalMghhl2^,7 +!:&hLqs+1]rp'L`!:'4W!:'I^"R5selK\?Krp'L`"mQ*Ql2^,F!!)<N!<;<a!<29`!<29`!<26` +!:f=S!<)0_!<)3_!<26`!<26`!;c![!!)<^!<26j!9sRL!9sRL!9sR`lM^bal2^eJ!!)u_rr</d +!9sRVlLk5Xl2q%Ol2^hK$39AV!:&hLl2^,7rW!)d!9sOarosI`rTXLcl2^)Ln`l8;Ja.gOQKnJM +J,~> +J`c4ZJcCr6roX7\s5s@]s5s@]s5jLbk2u^Dk5PAdk5YJDk5YJDk5>5Zk4nuVk5YJ]k5YGdk5XT+ +s5rJDqr[qYroX7\!9WtS!9X4Z"Qoaak2u[CroX7\"m5jIk5XT>rrD3Js8V3]s8M0\s8M0\s8M-\ +s7,4Os8D'[s8D*[s8M-\s8M-\s8(mWrrD3Zs8M-fs5s@Ds5s@Ds5s@\k5PA]k5YDB!<<#[s8N2` +s5s@Rk4\iTjobYGk5YGC$NK8Ns5rJDk5XT+rr3,`s5s@]roO4\rT47_k5XTDn`H#7J`_OGQKJ2I +J,~> +JaVdjJH3"V!:KX_"RZ9XmK!7SrVurdq#CWe!:BjTmK!4R"9@iimdC&S&afYe!!)EemJm7T!!)Ee +md:)Rmf*:emK`g\mJu\C!:BjdmKN[Z!:BjT!<2Bd!;5d[!!;Qgmed%bme-V]mK!(N!<DQ\!<2Be +!:KgdqX4=_g[5%ArpBadrpKddrU'XcrU'Xcr9j.V#4;HkmJm7ToDnaU"p")Z!:K7Tna?AVs6]je +rpBadrpBgfmK!7S!!*#d#lsD]!:K7Tmd:)MmKN[ZmJu\C!;,]A!.jQhmZm5?!.Y~> +Ja2LbJH3"V!:'@["R6!Pl2^hKrVur`q#CWa!9sRLl2^eJ"9@]elK\?K&aBA]!!)9al2UhL!!)9a +lKSBJlMgkal3ICTl2^,7!9sR`l377R!9sRL!<26`!;5XW!!;EclMLV^lLk2Yl2^YF!<DEX!<26a +!:'O`qWe%[gZeb=rosI`rp'L`rTX@_rTX@_r9EkR#3l0gl2UhLoDnaQ"p!rR!:&hLn`p)Rs69Ra +rosI`rosObl2^hK!!*#`#ls8U!:&hLlKSBEl377Rl2^,7!;,Q=!.jEdlBUZ7!.Y~> +J`c4ZJcE(V!9X+W"QoaHk5YGCrr2u\q>UZ]s5s@Dk5YDB"TRWak2u[C&a',Us8V6]k5YJDs8V6] +k2u^Bk5YJ]jp;"Lk5XT+s5s@\jp(kJs5s@Ds8M-\s7POSrrV?_k5>5Zk4\fUk5Y8>!WV<Ts8M-] +s5s=\qW@eWgZAM9roO4\roX7\rT4+[rT4+[r9!VN#3Psck5YJDo`+dM#63iJs5rJDn`KiNs5j=] +roO4\roO:^k5YGC!<<&\$30/Ms5rJDk2u^=jp(kJk5XT+s7GH9s+0<`k*>*/!.Y~> +JaVmmJH5QI!:Kdc!q$'Vqu?fd!:Kgd!:Kgd$17cnmd:)C!:K:S!!)H^!<2Bk!:BjT!:BjTpAb3] +rW)udo)SgY!<DQe!!)Hc!!)Hc!<)<c!8[&N!:K7T!:K7T!:K7TrU0[crpKddrU'Xcp[8%]s6^*l +mJuYTmJm7dmed%bmf!4^mJm7cmK!=Ur;cib!!)uc"9@iimK!1Q"9@iimJu#0"p")Z!:K7Tna6P\ +md:)Cmem.cmJm7dmL'$_!:BjT!:BjT!:KgdrpBadqsFFarpBadrpBadoBlb^mJuYT!<)<c!<)<c +!<)<c!<)?c!<2Bd!<2Bd!;c*`!<2Bd!<2Bd!;Go>!.jQhm[<MC!.Y~> +Ja2UeJH5QI!:'L_!pTdNqu?f`!:'O`!:'O`$0hKjlKSB7!:&kK!!)<Z!<26g!9sRL!9sRLpAb3Y +rW)u`o)SgU!<DEa!!)<_!!)<_!<)0_!8ZoJ!:&hL!:&hL!:&hLrTaC_rp'L`rTX@_pZhbYs69gh +l2^)Ll2Uh`lMLV^lM^eZl2Uh_l2^nMr;ci^!!)u_"9@]el2^bI"9@]el2]T("p!rR!:&hLn`g8X +lKSB7lMU__l2Uh`l3dUW!9sRL!9sRL!:'O`rosI`qs".]rosI`rosI`oBHJZl2^)L!<)0_!<)0_ +!<)0_!<)3_!<26`!<26`!;bs\!<26`!<26`!;Gc:!.jEdlC$r;!.Y~> +J`c=]JcGWI!9X7[!p9OFr;Qi\s5s=\!9X:\$0M9fk2u^+s5rJCrrD3Vs8M-cs5s@Ds5s@Dp\t6U +rr<#\oDejQ!WV<]rrD3[rrD3[s8D'[s4ufFs5rJDs5rJDs5rJDrT=.[roX7\rT4+[pZDMUs5jRd +k5XTDk5YJ\k5>5Zk5PDVjoGG[joPMErVulZ!<<#["TRWak5YAA"TRWak5X2u#63iJs5rJDn`C#T +k2u^+k5G>[joGG\jpV4Os5s@Ds5s@Ds5s=\roO4\qrRnYroO4\roO4\oB$5Vk5XTDs8D'[s8D'[ +s8D'[s8D*[s8M-\s8M-\s8(jXs8M-\s8M-\s7bZ6s+0<`k*bB3!.Y~> +NpZlIr9aObr9aObr9aObn*\d-s6f^`!:KX_$gmupmJu\C!:BgemeHh_mf!1imJuYT!:KX_!:Kdc +#jqZmmd:&TmdC&S!:Kdc!:Kgd!:Kgdr9jRbs6faa"RZ9X!:KabrpBadrpC'mmd:)C!:BgemeHk^ +mK!=UnGiRWo`4sY!!)uc!!*#d#lsD]!!)EemJm7?mL90amJuYTmd:)C!:K7Tl0\NOrU0[cs6fgc +rpBdeme-YTmK<OX!:Bj`mKN[ZmJu\C!<2Bj!:K7Tmd:)0mK<OX!:BjWmJm7dmL'$_!:BjT!:BjT +!:Kgds6fjds6]shmJu\S!<2Bd!<)<c!<)<c!<)<c!;5aa!:K7Tmd:)CmJm7cmJm7cmJm7bmJm7c +mJm7cmJm7]mYq3tmXaenmf*9;~> +Np6TEr9=7^r9=7^r9=7^n*8L)s6BF\!:'@[$gI]ll2^,7!9sOalM1D[lM^bel2^)L!:'@[!:'L_ +#jMBilKS?LlK\?K!:'L_!:'O`!:'O`r9F:^s6BI]"R6!P!:'I^rosI`rosdilKSB7!9sOalM1GZ +l2^nMnGiRSo`4sU!!)u_!!*#`#ls8U!!)9al2Uh;l4!aYl2^)LlKSB7!:&hLl086KrTaC_s6BO_ +rosLalLk5Pl3%+P!9sR\l377Rl2^,7!<26f!:&hLlKSB(l3%+P!9sRSl2Uh`l3dUW!9sRL!9sRL +!:'O`s6BR`s69[dl2^,K!<26`!<)0_!<)0_!<)0_!;5U]!:&hLlKSB;l2Uh_l2Uh_l2Uh^l2Uh_ +l2Uh_l2UhYlAYdpl@J5flMgj7~> +Nog<Ar8mtZr8mtZr8mtZn)aTMf`2!6qYpQXq>Uibs8V6]k2u^+s8V6WrrD3\rrqQbk5YJDq>UHW +rVm/cs8V6Ds8V6Drr2u\rVll[rr2u\rr;oYs8W,]qu6f]s5s@Dr;ZcY!<<&\$30/Ms5s@Ds8V6W +s8M-]s5rkO!9WtSrT4+[rT4+[roOOek2u^Dk5XTDs4QNDs5rJDk5XT+s5s@Dk5X].!<<#[s8W,] +rVulZ!WV<Us7bXYs5s@Ds8(j^s5rJDk2u^Cjp(kJk5XT+s4cZ=s5s@Ds7,4Os8M-gs5s@Ds5s@D +s5s@Drr<#\rr<#\"97N`k5PD[joGG[joGG[joGG[joGGSjp(kJk5XT+s6f"Ls8D'[s8D'[s8;!Z +s8D'[s8D'[s7bZ8s+0<`k*Y<2!.Y~> +O7*#JrU'^emK!7S!W_WgrpBgfmJubEj8f/H!W_ZVrW!2k!!)EemJu\S!!)H_!!_ikmd:&TmeQn` +mf!1dmem+cmem.cmf!1fmJu\S!!)H`!!)Hc!!)Hd!!)Hd!!)Hc!<;Ke!<)<c!<)<g!:BjTmdpJ[ +mK!4R!!)oap&OmUqZ-Zarr<&erVurdqu?ie!:Bj[mL'$_mJuYTmJu\C!!'4j!!*#d!!*#d#6=/l +md:)Cmem.XmKN[ZmJu\C!;u6b!<2Bd!<2Bf!:BjdmJm7dmJm7Amf!4VmJm7cmf*:emem.bmJm7\ +mKN[ZmJu\C!9EPJ!<2Bd!<2Bd!6OYl!!2KfJaS*WQL=bQJ,~> +O6Z`FrTXFal2^hK!W_KcrosObl2^>=j8f/D!W_NNrW!2g!!)9al2^,K!!)<[!!_]glKS?LlM:J\ +lM^b`lMU\_lMU__lM^bbl2^,K!!)<\!!)<_!!)<`!!)<`!!)<_!<;?a!<)0_!<)0c!9sRLlLY&W +l2^eJ!!)o]p&OmQqZ-Z]rr<&arVur`qu?ia!9sRWl3dUWl2^)Ll2^,7!!'4f!!*#`!!*#`#6=#h +lKSB7lMU_Tl377Rl2^,7!;u*^!<26`!<26b!9sR`l2Uh`l2Uh=lM^eRl2Uh_lMgkalMU_^l2UhX +l377Rl2^,7!9EDF!<26`!<26`!6OMh!!2?bJa.gOQKnJMJ,~> +O66HBrT4.]joGDC!W_?_roO7^joFo5jT#2@!rqEFrr35cs8V6]k5XTCrrD3Wrs%Wck2u^Dk5,)X +k5PA\k5G;[k5G>[k5PA^k5XTCrrD3XrrD3[rrD3\rrD3\rrD3[s8V6]s8D'[s8D'_s5s@Dk4JZS +k5YDB!<;rYpAapMqu?]Ys8N)]rr2u\r;Ql]s5s@SjpV4Ok5XTDk5XT+s8T:b!<<&\!<<&\#QNrd +k2u^+k5G>Pjp(kJk5XT+s8;!Zs8M-\s8M-^s5s@\joGG\joGG9k5PDNjoGG[k5YJ]k5G>ZjoGGT +jp(kJk5XT+s5`;Bs8M-\s8M-\s2jDdrrM9^J`_OGQKJ2IJ,~> +OR</MmK!7S!!*#d!W_WgrpBgfmK!7S!!)TXkQ(GH!W_ZVr;clcrr<&enGij_!:K7T!:BjTr;Zic +r;ZicrW)udo`,![p&OaQ"9@iimJuqJ!!*#d!!*#d!<DQe!:9.Q!;5a^!:BjTrW)udrrE)e!<DQb +!!M]imd:)ImJm7cmJm7cmJm6lmJm7cmJm7cmJm7dmK*CVmf!1emJutK!!*#d!!*#d!!*#d!!)uc +!!)uc!!)uc!!)uc!!(sFp&OUM!!*#d!!*#d!!)ZZ!!*#d!!*#d!!)0L!!)uc!!)uc!!(./OoPON +!.jQhm[*AA!.Y~> +OQllIl2^hK!!*#`!W_KcrosObl2^hK!!)TTkQ(GD!W_NNr;cl_rr<&anGij[!:&hL!9sRLr;Zi_ +r;Zi_rW)u`o`,!Wp&OaM"9@]el2^MB!!*#`!!*#`!<DEa!:9"M!;5UZ!9sRLrW)u`rrE)a!<DE^ +!!MQelKSBAl2Uh_l2Uh_l2Ughl2Uh_l2Uh_l2Uh`l2gtNlM^bal2^PC!!*#`!!*#`!!*#`!!)u_ +!!)u_!!)u_!!)u_!!(sBp&OUI!!*#`!!*#`!!)ZV!!*#`!!*#`!!)0H!!)u_!!)u_!!(.+OoPOJ +!.jEdlBgf9!.Y~> +OQHTEjoGDC!!*#\!W_?_roO7^joGDC!!)TPkl:J@!rqEFrVuo[s8N)]nc&mWs5rJDs5s@DrVll[ +rVll[rr<#\p&>$SpAadI"TRWak5Y,:!<<&\!<<&\!WV<]s6SnIs7PLVs5s@Drr<#\s8W,]!WV<Z +rrhKak2u^9joGG[joGG[joGFdjoGG[joGG[joGG\joYSFk5PA]k5Y/;!<<&\!<<&\!<<&\!<<#[ +!<<#[!<<#[!<<#[!<;!>pAaXE!<<&\!<<&\!<;]R!<<&\!<<&\!<;3D!<<#[!<<#[!<:1'P5bRF +s+0<`k*P61!.Y~> +NpZlIrpBadrpBgfmK!7S!W_WgrpBadoBu&In*U/UrpBadrpKdd#4;KZ!:BjTqZ$WarW!5l!:K7T +mJuYTqsFFarU'XcrU'^emdC&Sq!S+]n*^/Tp$Me[rU'XcrU'dgmJuYTmd:2XmJuYTp[/.amJm7T +qZ$]c!:Kgds6^!imd:&TrpBadOmW2LrU'pkmJu\C!:K7Tq!J+^rU'XcrU'Xc`U<^*mHsrSrU'Xc +rU'Xcp?hn\rU'XcrU'XcV='EF!U]r=mXaenmf*9;~> +Np6TErosI`rosObl2^hK!W_KcrosI`oBPcEn*0lQrosI`rp'L`#3l3R!9sRLqZ$W]rW!5h!:&hL +l2^)Lqs".]rTX@_rTXFalK\?Kq!.hYn*9lPp$)MWrTX@_rTXLcl2^)LmcjoTl2^)LpZ_k]l2UhL +qZ$]_!:'O`s69^elKS?LrosI`Om2oHrTXXgl2^,7!:&hLq!%hZrTX@_rTX@_`TmF&mHOZOrTX@_ +rTX@_p?DVXrTX@_rTX@_V<X-B!U9Z9l@J5flMgj7~> +Nog<AroO1\roO7^joGDC!W_?_roO1\oB,NAn)aWMroO4\roX7\#3PsJs5s@Dqu6ZYrr38ds5rJD +k5XTDqrRnYrT4+[rT41]k2u[Cpu_SUn)jWLp#Z8SrT4+[rT47_k5XTDmcFZPk5XTDpZ;VYk5YJD +qu6`[s5s=\s5jIak2u^DroO4\OlcZDrT4Cck5XT+s5rJDpuVSVrT4+[rT4+[`TI1"mH+EKrT4+[ +rT4+[p>uATrT4+[rT4+[V<3m>!TsE5k(2Z^k5PF3~> +NpZlIrpBadrpBgfmK!7S!W_WgrpBado^;;N!U]sTmJm7cmJm7dmeZtameHhgmJuYT!:BjTmf!4S +mK<OX!:Bj`mK<OX!:BjZme-YMmKN[ZmJu\C!:]C\!:K7Tmd:)NmKrs^!:BjT!:BjT!;u6f!:K7T +!<2Bd!<)<c!0$=G!<2Bd!<2Bd!42(r!:BjT!7pQ<!<)<c!<)<c!3,Co!!)H@!!2KfJaS*WRI:(T +J,~> +Np6TErosI`rosObl2^hK!W_KcrosI`o]l#J!U9[Pl2Uh_l2Uh`lMCP]lM1Dcl2^)L!9sRLlM^eO +l3%+P!9sR\l3%+P!9sRVlLk5Il377Rl2^,7!:]7X!:&hLlKSBFl3[OV!9sRL!9sRL!;u*b!:&hL +!<26`!<)0_!0$1C!<26`!<26`!41qn!9sRL!7pE8!<)0_!<)0_!3,7k!!)<<!!2?bJa.gORHjeP +J,~> +Nog<AroO1\roO7^joGDC!W_?_roO1\o]H,P!!)fo!TsFLjoGG[joGG\k55/Yk5##_k5XTDs5s@D +k5PDKjok_Hs5s@Xjok_Hs5s@Rk4\iEjp(kJk5XT+s7#.Ts5rJDk2u^>jpM.Ns5s@Ds5s@Ds8;!^ +s5rJDs8M-\s8D'[s,?(?s8M-\s8M-\s0Lhjs5s@Ds46<4s8D'[s8D'[s/G.grrD38rrM9^J`_OG +RHFMLJ,~> +NpZlIrpBadrpBgfmK!7S!W_WgrpBadna?2Q"muBY!:BjMme-V`mJu\C!;l3X!;#U_!:K7Tmd:)Q +mKN[ZmJu\C!:fLV!:B1S!<2Bd!<2Bd!:oOX!<2Bd!<2Bd!;l0m!:BjTmJuYTmd:)C!<2Bd!<)<c +!<)<c!/^+D!<)<c!<)<c!4D5!!:K7Tmd:)+mJm7dmJm7dmJm6_m`YY3mJunI!!*#drrE&drrE&d +rrE&drVurdrVurdr;clcrVurdr;clcrr@W<JaSonrr@Q~> +Np6TErosI`rosObl2^hK!W_KcrosI`n`ooM"mQ*Q!9sRIlLk2\l2^,7!;l'T!;#I[!:&hLlKSBI +l377Rl2^,7!:f@R!:B%O!<26`!<26`!:oCT!<26`!<26`!;l$i!9sRLl2^)LlKSB7!<26`!<)0_ +!<)0_!/]t@!<)0_!<)0_!4D(r!:&hLlKSB#l2Uh`l2Uh`l2Ug[lHB5/l2^JA!!*#`rrE&`rrE&` +rrE&`rVur`rVur`r;cl_rVur`r;cl_rr@W8Ja/Wfrr@Q~> +Nog<AroO1\roO7^joGDC!W_?_roO1\n`C8\rrE'!rrE)]s5s@Ds6&P<rrhKak2u^@k4\iHjp(kJ +k5XT+s8;!`s5rJDk2u^6k5PDJjoGG\joGG\joGGPjoGG\joGG\joGGYjp_:Ps5rJDk5XT+s5s@\ +joGG[joGG[joGF<joGG[joGG[joGFhjp(kJk5XT+s46<4s8M-\s8M-\s.nf$rrM9^o]?/RroX7\ +roX7\roX7\roX4[!9X:\!9X7[s5s=\!9X7[s5s@]J`_OGR-+DKJ,~> +NpZlIrpBadrpBgfmK!7S!W_WgrpBadna?AV$gmupmJuYT!:BjT!9ESI!!2KfrpBadrpBadq!S+] +nEp8VrpBadrpBadrpBadrpBadrpBadoBl_]mJuYTn*U/UrU'XcrU'Xco^2\ZrU'XcrU'XcJaNL< +rU'XcrU'Xco'QJXrU'XcrU'Xc\F'=srpBadrpBadf'W_Bmd:)CmJs'Nd/_bc$io\qmJuYTmJu\C +!!*#d!!%T<JaS]hrr@Q~> +Np6TErosI`rosObl2^hK!W_KcrosI`n`p)R$gI]ll2^)L!9sRL!9EGE!!2?brosI`rosI`q!.hY +nEKuRrosI`rosI`rosI`rosI`rosI`oBHGYl2^)Ln*0lQrTX@_rTX@_o]cDVrTX@_rTX@_Ja*48 +rTX@_rTX@_o'-2TrTX@_rTX@_\EX%orosI`rosI`f'3G>lKSB7l2[XFd/_b_$ioPml2^)Ll2^,7 +!!*#`!!%T8Ja/E`rr@Q~> +Nog<AroO1\roO7^joGDC!W_?_roO1\n`C>]!<;3]s5s@Ds8V6]k5XN)rr3#]s8M-\s8M-\s7kaU +s7#.Ns8M-\s8M-\s8M-\s8M-\s8M-\s7>@Us5s@Ds6o(Ms8D'[s8D'[s7GFRs8D'[s8D'[s+0;4 +s8D'[s8D'[s75:Ps8D'[s8D'[s1%1ks8M-\s8M-\s46<:s5rJDk2u]>k0a4[jp_:Ps5s@Ds5s@D +k5YJ\joGF4k(2ZXk5PF3~> +NpZlIrU'^emK!7S!W_WgrpBgfmJubErrC^>"9@iimK!4R!!)uc!!)l`"9@iimJuhG!!)uc!!)uc +!W_WgrU'XcrU'Xcp$N"amd:)CmJqh+bjGH2rpBadrpBadnEp8VrpBadrpBad\F'=srU'XcrU'Xc +o'QJXrU'XcrU'XcnEpDZmJuYTV!d1A`:!U)rU'XcrU'XcJaS*WO7*#JJ,~> +Np6TErTXFal2^hK!W_KcrosObl2^>=rrC^:"9@]el2^eJ!!)u_!!)l\"9@]el2^D?!!)u_!!)u_ +!W_KcrTX@_rTX@_p$)_]lKSB7l2ZD#bj#0.rosI`rosI`nEKuRrosI`rosI`\EX%orTX@_rTX@_ +o'-2TrTX@_rTX@_nEL,Vl2^)LV!?n=`9R=%rTX@_rTX@_Ja.gOO6Z`FJ,~> +Nog<ArT4.]joGDC!W_?_roO7^joFo5rrC^6"TRWak5YDB!<<#[!<;oX"TRWak5Y#7!<<#[!<<#[ +!rqE_rT4+[rT4+[p#ZJYk2u^+k5U"pbiSp*roO4\roO4\nE'`NroO4\roO4\\E3ekrT4+[rT4+[ +o&]rPrT4+[rT4+[nE'lRk5XTDUupY9`9.(!rT4+[rT4+[J`_OGO66HBJ,~> +ORE#HrpBadr9aObr9aObn*^2Ug$T%Emd:)CmJuhG"p")Z!:K7TdI$u7rpBadrpBadJaUbM"p")Z +!:K7Tmd:8Zmd:)CmJrdF!!*#d!!*#d!!)HTrW&b^o)Q2dp&K[3JaSB_rr@Q~> +OQu`DrosI`r9=7^r9=7^n*9oQg$/bAlKSB7l2^D?"p!rR!:&hLdHU]3rosI`rosI`Ja1JE"p!rR +!:&hLmcjuVlKSB7l2[@>!!*#`!!*#`!!)HPrW&bZo)Q2`p&K[/Ja/*Wrr@Q~> +OQQH@roO1\r8mtZr8mtZn)jWMg#`M=k2u^+k5Y#7#63iJs5rJDdH1H/roO4\roO4\J`b2=#63iJ +s5rJDmcF`Rk2u^+k5Ut6!<<&\!<<&\!<;KLrr8eVoDc5\pA]^+J`_gOrr@Q~> +JaVdjrrCd@!!*#d!!*#d!!)ZZ!!*#d!!*#d!!(L9!!)uc!!)uc!!(O:!!)uc!!)uc!!)WY!!)uc +!!)uc!!&SX"9@iimJuVA"9@iimJr^D"p")Z!:K7Tna?)NWUB`cs6fjds6fjdYO;AiJaS*WL$ns@ +J,~> +Ja2LbrrCd<!!*#`!!*#`!!)ZV!!*#`!!*#`!!(L5!!)u_!!)u_!!(O6!!)u_!!)u_!!)WU!!)u_ +!!)u_!!&ST"9@]el2^29"9@]el2[:<"p!rR!:&hLn`ofJWTsH_s6BR`s6BR`YNl)eJa.gOL$J[< +J,~> +J`c4ZrrCd8!<<&\!<<&\!<;]R!<<&\!<<&\!<:O1!<<#[!<<#[!<:R2!<<#[!<<#[!<;ZQ!<<#[ +!<<#[!<8VP"TRWak5Xf1"TRWak5Un4#63iJs5rJDn`KQFWTO3[s5s=\s5s=\YNGiaJ`_OGL$&C8 +J,~> +JaVdjrrCgA!!)uc!!)uc!!)`\!!)uc!!)uc!!&MV!!*#d!!*#d!!)QW!!*#d!!*#d!!&MVrW)6O +rW&>R"9@iimJuVArW%N;a6j'1mJuYTJaS*WL@5'AJ,~> +Ja2LbrrCg=!!)u_!!)u_!!)`X!!)u_!!)u_!!&MR!!*#`!!*#`!!)QS!!*#`!!*#`!!&MRrW)6K +rW&>N"9@]el2^29rW%N7a6Ed-l2^)LJa.gOL?ed=J,~> +J`c4ZrrCg9!<<#[!<<#[!<;cT!<<#[!<<#[!<8PN!<<&\!<<&\!<;TO!<<&\!<<&\!<8PNrr;9G +rr8AJ"TRWak5Xf1rr7Q3a6!O)k5XTDJ`_OGL?AL9J,~> +JaVdjrr@W<e*[D?md:)CmJu_D"p")Z!:K7TT'l:Po'Z2OS*p7Um-XuVmJuYTJaUYJ"p")Z!:K7T +JaS*WL[P0BJ,~> +Ja2Lbrr@W8e*7,;lKSB7l2^;<"p!rR!:&hLT'H"Lo'5oKS*KtQm-4]Rl2^)LJa1AB"p!rR!:&hL +Ja.gOL[+m>J,~> +J`c4Zrr@W4e)gl7k2u^+k5Xo4#63iJs5rJDT'#bHo&fZGS*'_Mm,eHNk5XTDJ`b):#63iJs5rJD +J`_OGLZ\U:J,~> +JaVdjrr@W<dd@5<mJuYTmHt)WmJuYTRI:%SlL+WOS*otMna6S]md:)CmJqh+bO,?1rpBadrpBad +JaS*WM!k9CJ,~> +Ja2Lbrr@W8dcpr8l2^)LmHOfSl2^)LRHjbOlK\?KS*K\In`g;YlKSB7l2ZD#bN]'-rosI`rosI` +Ja.gOM!G!?J,~> +J`c4Zrr@W4dcL]4k5XTDmH+QOk5XTDRHFMKlK8*GS*'GEn`C&Uk2u^+k5U"pbN8g)roO4\roO4\ +J`_OGM!"^;J,~> +JaVdjrr@W<dI-u6lgF`PRI11XmJuYTm-XuVmJuYTR-sqRmd:&TrpBadrpBadJaUeN!!)uc!!)uc +!!%T<JaSB_rr@Q~> +Ja2Lbrr@W8dH^]2lg"HLRHanTl2^)Lm-4]Rl2^)LR-OYNmcjcProsI`rosI`Ja1MF!!)u_!!)u_ +!!%T8Ja/*Wrr@Q~> +J`c4Zrr@W4dH:H.lfS3HRH=YPk5XTDm,eHNk5XTDR-+DJmcFNLroO4\roO4\J`b5>!<<#[!<<#[ +!<7W4J`_gOrr@Q~> +JaVdjrr@W<eaE,2oBu;PT'cd_md:)CmJu\C"p")Z!:K7TcL(Z4rU'XcrU'Xcf^8kBmJuYTnEp8V +rU'XcrU'Xcp?hn\rU'XcrU'XcJaS*WJaS*WiU6^GJ,~> +Ja2Lbrr@W8e`ui.oBQ#LT'?L[lKSB7l2^8;"p!rR!:&hLcKYB0rTX@_rTX@_f]iS>l2^)LnEKuR +rTX@_rTX@_p?DVXrTX@_rTX@_Ja.gOJa.gOiTgFCJ,~> +J`c4Zrr@W4e`QT*oB,cHT&p7Wk2u^+k5Xl3#63iJs5rJDcK5-,rT4+[rT4+[f]E>:k5XTDnE'`N +rT4+[rT4+[p>uATrT4+[rT4+[J`_OGJ`_OGiTC.?J,~> +JaVdjrrB1h!!)uc!!)uc!!'7krW)9PrW&GU!!*#d!!*#d!!)NV!!*#d!!*#d!!(=4!!*#d!!*#d +!!(gB!!*#drr<2i!:K7Tn*U/UrU'XcrU'Xcp[/"]rpBadrpBadJaS*WJaS*Wi9pUFJ,~> +Ja2LbrrB1d!!)u_!!)u_!!'7grW)9LrW&GQ!!*#`!!*#`!!)NR!!*#`!!*#`!!(=0!!*#`!!*#` +!!(g>!!*#`rr<2e!:&hLn*0lQrTX@_rTX@_pZ__YrosI`rosI`Ja.gOJa.gOi9L=BJ,~> +J`c4ZrrB1`!<<#[!<<#[!<9:crr;<Hrr8JM!<<&\!<<&\!<;QN!<<&\!<<&\!<:@,!<<&\!<<&\ +!<:j:!<<&\s8N5as5rJDn)aWMrT4+[rT4+[pZ;JUroO4\roO4\J`_OGJ`_OGi9(%>J,~> +JaVdjrrB.g!!*#d!!*#d!!'7k"9@iimJuYB"9@iimJrgG!!)uc!!)uc!!)TX!!)uc!!)uc!!(=4 +"p")Z!:K7Tg?o:JmJuYTmJuYTmJu_D!!*#d!!*#d!!)]["p")Z!:K7TJaS*WJaS*WhsULEJ,~> +Ja2LbrrB.c!!*#`!!*#`!!'7g"9@]el2^5:"9@]el2[C?!!)u_!!)u_!!)TT!!)u_!!)u_!!(=0 +"p!rR!:&hLg?K"Fl2^)Ll2^)Ll2^;<!!*#`!!*#`!!)]W"p!rR!:&hLJa.gOJa.gOhs14AJ,~> +J`c4ZrrB._!<<&\!<<&\!<9:c"TRWak5Xi2"TRWak5V"7!<<#[!<<#[!<;WP!<<#[!<<#[!<:@, +#63iJs5rJDg?&bBk5XTDk5XTDk5Xo4!<<&\!<<&\!<;`S#63iJs5rJDJ`_OGJ`_OGhraq=J,~> +JaVdjrrB+f"p")Z!:K7TYjM\qmd:)CmJu_D"p")Z!:K7TJaUMF"9@iimJto-"p")Z!:BgerpBad +n*UA[md:)CmJukH"9@iimJqh+JaS*WJaVC_rr@Q~> +Ja2LbrrB+b"p!rR!:&hLYj)DmlKSB7l2^;<"p!rR!:&hLJa15>"9@]el2]K%"p!rR!9sOarosI` +n*1)WlKSB7l2^G@"9@]el2ZD#Ja.gOJa2+Wrr@Q~> +J`c4ZrrB+^#63iJs5rJDYiZ/ik2u^+k5Xo4#63iJs5rJDJ`ar6"TRWak5X)r#63iJs5s@]roO4\ +n)aiSk2u^+k5Y&8"TRWak5U"pJ`_OGJ`bhOrr@Q~> +JaVdjrrB(e"9@iimJsKZ!!*#d!!*#d!!)QW!!*#d!!*#d!!%T<`U<^*f'WY@mJuYTl0\ZSmJuYT +na?AVJaS*WJaS*Wh<t:CJ,~> +Ja2LbrrB(a"9@]el2\'R!!*#`!!*#`!!)QS!!*#`!!*#`!!%T8`TmF&f'3A<l2^)Ll08BOl2^)L +n`p)RJa.gOJa.gOh<P"?J,~> +J`c4ZrrB(]"TRWak5V[J!<<&\!<<&\!<;TO!<<&\!<<&\!<7W4`TI1"f&d,8k5XTDl/i-Kk5XTD +n`KiNJ`_OGJ`_OGh<+_;J,~> +JaVdjrrB%drW'1j!!)uc!!)uc!!)WY!!)uc!!)uc!!%T<b3ns'g$\h>kO/<Lo^;DQJaS*WJaS*W +iU6^GJ,~> +Ja2LbrrB%`rW'1f!!)u_!!)u_!!)WU!!)u_!!)u_!!%T8b3J[#g$8P:kN`$Ho]l,MJa.gOJa.gO +iTgFCJ,~> +J`c4ZrrB%\rr94b!<<#[!<<#[!<;ZQ!<<#[!<<#[!<7W4b3&Etg#i;6kN;dDo]GlIJ`_OGJ`_OG +iTC.?J,~> +JaVdjrrB1hp&LNK!!)uc!!)uc!!%T<aR9$-g$\P6n*]lLo^;\YJaS*WJaS*Wh<t:CJ,~> +Ja2LbrrB1dp&LNG!!)u_!!)u_!!%T8aQia)g$882n*9THo]lDUJa.gOJa.gOh<P"?J,~> +J`c4ZrrB1`pA^QC!<<#[!<<#[!<7W4aQEL%g#i#.n)j?Do]H/QJ`_OGJ`_OGh<+_;J,~> +JaVdjrrB%drW&2N!!*#d!!*#d!!%T<aR002mJuYTf'`M;kO/<Lna6M[mJuYTJaS*WJaS*WhX:CD +J,~> +Ja2LbrrB%`rW&2J!!*#`!!*#`!!%T8aQ`m.l2^)Lf'<57kN`$Hn`g5Wl2^)LJa.gOJa.gOhWk+@ +J,~> +J`c4ZrrB%\rr85F!<<&\!<<&\!<7W4aQ<X*k5XTDf&lu3kN;dDn`BuSk5XTDJ`_OGJ`_OGhWFh< +J,~> +JaVdjrrB(e"9@iimJrL>"p")Z!:K7TJaUVI"p")Z!:K7Tf^8kBmJuYTl0\ZSmJuYToBle_md:)C +mJqh+JaS*WJaVF`rr@Q~> +Ja2LbrrB(a"9@]el2[(6"p!rR!:&hLJa1>A"p!rR!:&hLf]iS>l2^)Ll08BOl2^)LoBHM[lKSB7 +l2ZD#Ja.gOJa2.Xrr@Q~> +J`c4ZrrB(]"TRWak5U\.#63iJs5rJDJ`b&9#63iJs5rJDf]E>:k5XTDl/i-Kk5XTDoB$8Wk2u^+ +k5U"pJ`_OGJ`bkPrr@Q~> +JaVdjrrB+f"p")Z!:K7TPjSYSmJuYTJaUVI!!*#d!!*#d!!(a@"p")Z!:K7Tlg=rWmd:)CmJuqJ +!!*#d!!*#d!!%T<JaS*WJaVIarr@Q~> +Ja2LbrrB+b"p!rR!:&hLPj/AOl2^)LJa1>A!!*#`!!*#`!!(a<"p!rR!:&hLlfnZSlKSB7l2^MB +!!*#`!!*#`!!%T8Ja.gOJa21Yrr@Q~> +J`c4ZrrB+^#63iJs5rJDPi`,Kk5XTDJ`b&9!<<&\!<<&\!<:d8#63iJs5rJDlfJEOk2u^+k5Y,: +!<<&\!<<&\!<7W4J`_OGJ`bnQrr@Q~> +JaVjl"T[rj!:BjcmJm7%mJm7cmJm7cmK*CV!<2Bd!<2Bd!0lpN!.jRZmJm7cmJm7cmJm7BmJm7d +mJm7dmJm7SmJm7dmJm7dmJm7]mJm7cmJm7cmJm6<mXaeWmXafbmf*9;~> +Ja2Rd"T[ff!9sR_l2Uh!l2Uh_l2Uh_l2gtN!<26`!<26`!0ldJ!.jFVl2Uh_l2Uh_l2Uh>l2Uh` +l2Uh`l2UhOl2Uh`l2Uh`l2UhYl2Uh_l2Uh_l2Ug8l@J5Ol@J6ZlMgj7~> +J`c:\"om]b!9X=[joGFrjoGG[joGG[joYSFs8M-\s8M-\s-2[Fs+0=RjoGG[joGG[joGG:joGG\ +joGG\joGGKjoGG\joGG\joGGUjoGG[joGG[joGF4k(2ZGk(2[Rk5PF3~> +JaVgkrVuue!<2Bd!57e#!<2Bd!<2Bf!:BjcmJm7cmJm6Tme-Y\mJm7cmJm7cmJm6<mcj->!<)<c +!<)<c!6sp3!<)<c!<)<c!:T=U!<)<c!<)<c!.jQhmXaeWm`k2"!.Y~> +Ja2OcrVuua!<26`!57Xt!<26`!<26b!9sR_l2Uh_l2UgPlLk5Xl2Uh_l2Uh_l2Ug8lKRR6!<)0_ +!<)0_!6sd/!<)0_!<)0_!:T1Q!<)0_!<)0_!.jEdl@J5OlHSVo!.Y~> +J`c7["TJH%k5YGC!<9ap!<<&\!<<&\!rqE_rT4+[rT4+[RHF5Cs5j=]rT4+[rT4+[J`c4Z!<<#[ +!<<#[!<:=+!<<#[!<<#[!<;NM!<<#[!<<#[!<7W4J`_OGJ`b5>rr@Q~> +JaVdjrr<2i!:K7T_sRL)rU'slmd:)C!!)HT!/U(B!;c*`!<2Bd!<2Bd!.jS$mJm7dmJm7dmJm6< +mXaeWmXaeWmdTZE!.Y~> +Ja2Lbrr<2e!:&hL_s.4%rTX[hlKSB7!!)<L!/Tq>!;bs\!<26`!<26`!.jFul2Uh`l2Uh`l2Ug8 +l@J5Ol@J5OlL=*=!.Y~> +J`c4Z#6+\cs5rJD_r^t!rT4Fdk2u^+s8V6Ds+oh:s8(jXs8M-\s8M-\s+0=qjoGG\joGG\joGF4 +k(2ZGk(2ZGk4%O5!.Y~> +JaVdjrr</h!:BjKmJm7cmJm7cmJm7NmJm7dmJm7dmK<OX!:BiCmK<OX!:Bj`mKN[ZmJu\C!.jS" +mKN[ZmJu\C!.jQhmXaeWmXafpmf*9;~> +Ja2Lbrr</d!9sRGl2Uh_l2Uh_l2UhJl2Uh`l2Uh`l3%+P!9sQ?l3%+P!9sR\l377Rl2^,7!.jFs +l377Rl2^,7!.jEdl@J5Ol@J6hlMgj7~> +J`c4Z"T\Sbs5s@CjoGG[joGG[joGGFjoGG\joGG\jok_Hs5s?;jok_Hs5s@Xjp(kJk5XT+s+0=o +jp(kJk5XT+s+0<`k(2ZGk(2[`k5PF3~> +JaVdjquGdF!!*#d!!*#d!!)0L#6=2[!:K7Tmf!3ImJm7cmK`g\!:K7Tmd:)OmK<OX!:Bi<mc3^< +!:BjT!.jQhmXaeWmXafomf*9;~> +Ja2LbquGdB!!*#`!!*#`!!)0H#6=&S!:&hLlM^dEl2Uh_l3ICT!:&hLlKSBGl3%+P!9sQ8lJq.4 +!9sRL!.jEdl@J5Ol@J6glMgj7~> +J`c4ZrrE&uj5p@AroO4\roO4\k2lpKk2u^+k5XTCs,Z:Bs8D'cs5s@Dk5XT+s8(j\s5s@Ds+0=m +jok_Hs5s?4k(2ZGk(2ZGk3hC3!.Y~> +JaVjlp&O7C"p")Z!:K7TjR*$Kme$RCmJm7dmf*:emf*:dmJm7`mf!3FmJm7cmJm7cmJm7Gmf!3; +mXaeWmXaeWmd9HB!.Y~> +Ja2Rdp&O7?"p!rR!:&hLjQZaGlLb.?l2Uh`lMgkalMgk`l2Uh\lM^dBl2Uh_l2Uh_l2UhClM^d7 +l@J5Ol@J5OlL!m:!.Y~> +J`c:\pAa:;#63iJs5rJDjQ6LCk4Sb;joGG\k5YJ]k5YJ\joGGXk5PC>joGG[joGG[joGG?k5PC3 +k(2ZGk(2ZGk3_=2!.Y~> +JaVdjquG^D"9@iimJu87rW)rcrW%rG#QX;\!:K7TmK!4R!W_ZVp&L0A!!*#d!!*#d!!)*Jp&K[3 +JaS*WJaS*Wna?DWJ,~> +Ja2LbquG^@"9@]el2]i/rW)r_rW%rC#QX/T!:&hLl2^eJ!W_NNp&L0=!!*#`!!*#`!!)*Fp&K[/ +Ja.gOJa.gOn`p,SJ,~> +J`c4ZrrE&uiT::Ck5XTDio^7?roX4[NTLNHk2u^+k5XTDrT41]k2uC;O6-HBroO4\roO4\jQ?19 +J`_OGJ`_OGJ`cLbrr@Q~> +JaVdjrr</h!:BjGmf!4Jme$P\mJs'N!!)uc!!)uc!!)]["9@iimJukHrW%iD"p")Z!:K7ThsUID +JaS*WJaS*WJaVpnrr@Q~> +Ja2Lbrr</d!9sRClM^eFlLb,Xl2[XF!!)u_!!)u_!!)]W"9@]el2^G@rW%i@"p!rR!:&hLhs11@ +Ja.gOJa.gOJa2Xfrr@Q~> +J`c4Z"T\Sbs5s@?k5PDBk4S`Tk5V7>!<<#[!<<#[!<;`S"TRWak5Y&8rr7l<#63iJs5rJDhraq< +J`_OGJ`_OGJ`c@^rr@Q~> +JaVdjrr<2i!:K7Tk3hpCl0\NOrpKac#OVT[!!)HT!2T#_!<2Bd!<2Bd!;#XX!;#U]!:BjT!:B1S +!<)<c!<)<c!<)<c!<)<c!42(r!:BjT!8m2L!:BjT!:K7TrU'XcJaS*WJaS*WJaW7"rr@Q~> +Ja2Lbrr<2e!:&hLk3DX?l086Krp'I_#O2<S!!)<L!2Sl[!<26`!<26`!;#LT!;#IY!9sRL!:B%O +!<)0_!<)0_!<)0_!<)0_!41qn!9sRL!8m&H!9sRL!:&hLrTX@_Ja.gOJa.gOJa2sorr@Q~> +J`c4Z#6+\cs5rJDk2uC;l/i!GroX4[#Nl'Ks8V6Ds.ncWs8M-\s8M-\s7>CPs7>@Us5s@Ds6\qK +s8D'[s8D'[s8D'[s8D'[s0Lhjs5s@Ds52rDs5s@Ds5rJDrT4+[J`_OGJ`_OGJ`c[grr@Q~> +JaVgkrVuue!<2Bd!9<MH!9EPT!:BjT!:BjT!:BjdmJm6_mKN[ZmJu\C!;>jS!;Psd!:K7Tmd:)B +mJm7dmJm7dmK*CV!<2Bd!<2Bd!3ttk!8m2M!:K7T!:BjT!<2Bd!1N<U!<)<c!<)<c!.jQhmXaeW +mcX$<!.Y~> +Ja2OcrVuua!<26`!9<AD!9EDP!9sRL!9sRL!9sR`l2Ug[l377Rl2^,7!;>^O!;Pg`!:&hLlKSB: +l2Uh`l2Uh`l2gtN!<26`!<26`!3thg!8m&I!:&hL!9sRL!<26`!1N0Q!<)0_!<)0_!.jEdl@J5O +lK@I4!.Y~> +J`c7["TJH%k5YGC!<;*Arr;'A$NK8gk5XTDk5XTDroO4\Uuhm]k2u^+k5Y/;pAapM#63iJs5rJD +mH+EKroO4\roO:^k5YGC!<<&\!<9=drr:m<#lj&Ls8V6]k5YGC!<8MM!<<#[!<<#[!<7W4J`_OG +J`c.Xrr@Q~> +JaVjl"T[rj!:BjcmJm7KmK<OX!:BjJmKim]mJm7T!:K7TrU'XcV!\?cmJuYTna?AVp$Me[rpBad +rpBadmHt/Ymd:)CmK!7S"p")Z!:K7T[-mVfjR*!JrpC$lmJuYT!:K7TcL(Z4rU'XcrU'Xcf'WM< +rpBadrpBadJaS*WJaS*Wk3i6LJ,~> +Ja2Rd"T[ff!9sR_l2UhGl3%+P!9sRFl3RIUl2UhL!:&hLrTX@_V!8'_l2^)Ln`p)Rp$)MWrosI` +rosI`mHOlUlKSB7l2^hK"p!rR!:&hL[-I>bjQZ^Frosahl2^)L!:&hLcKYB0rTX@_rTX@_f'358 +rosI`rosI`Ja.gOJa.gOk3DsHJ,~> +J`c:\"om]b!9X=[joGGCjok_Hs5s@BjpD(Mk5YJDs5rJDrT4+[Uuhg[k5XTDn`KiNp#Z8SroO4\ +roO4\mH+WQk2u^+k5YGC#63iJs5rJD[-%)^jQ6IBroOLdk5XTDs5rJDcK5-,rT4+[rT4+[f&cu4 +roO4\roO4\J`_OGJ`_OGk2u[DJ,~> +JaVdjrrCsE"p")Z!:K7Tk3`KTmJuYTmJuYTSF6@Vna6M[mJuYTp[/"]rU'XcrU'XcmHt)WmJuYT +r9a[fmJuYTYO;AiiU-[GrU'pkmd:)C!:BgerU'Xcdd@)8rpBadrpBadeF!M@md:)CmJqh+JaS*W +JaVXfrr@Q~> +Ja2LbrrCsA"p!rR!:&hLk3<3Pl2^)Ll2^)LSEg(Rn`g5Wl2^)LpZ__YrTX@_rTX@_mHOfSl2^)L +r9=Cbl2^)LYNl)eiT^CCrTXXglKSB7!9sOarTX@_dcpf4rosI`rosI`eER5<lKSB7l2ZD#Ja.gO +Ja2@^rr@Q~> +J`c4ZrrCs=#63iJs5rJDk2lsLk5XTDk5XTDSEBhNn`BuSk5XTDpZ;JUrT4+[rT4+[mH+QOk5XTD +r8n.^k5XTDYNGiaiT:.?rT4Cck2u^+s5s@]rT4+[dcLQ0roO4\roO4\eE-u8k2u^+k5U"pJ`_OG +J`c(Vrr@Q~> +JaVdjrrD!F!!*#d!!*#d!!)6N!!*#drW)rc!!&_\p&OgS"p")Z!:K7Tf^A_=qX4=_YO2MnmJuYT +g$\h>!U]semJm76mKN[ZmJu\C!7L9<!:BjT!.jQhmXaeWmc<g9!.Y~> +Ja2LbrrD!B!!*#`!!*#`!!)6J!!*#`rW)r_!!&_Xp&OgO"p!rR!:&hLf]rG9qWe%[YNc5jl2^)L +g$8P:!U9[al2Uh2l377Rl2^,7!7L-8!9sRL!.jEdl@J5OlK%71!.Y~> +J`c4ZrrD!>!<<&\!<<&\!<;9F!<<&\rr;u[!<8bTpAajK#63iJs5rJDf]N25qW@eWYN>ufk5XTD +g#i;6!TsF]joGG.jp(kJk5XT+s3g$4s5s@Ds+0<`k(2ZGk2b\)!.Y~> +JaVdjrrD$G!!)uc!!)uc!!)9Op&LZOrW)QX!!*#d!!*#d!!(jCli=E\"p")Z!:K7ThX:%:cL(f8 +mJuYTd-gl5JaS*WJaS*Wj6lpIJ,~> +Ja2LbrrD$C!!)u_!!)u_!!)9Kp&LZKrW)QT!!*#`!!*#`!!(j?li=EX"p!rR!:&hLhWjb6cKYN4 +l2^)Ld-CT1Ja.gOJa.gOj6HXEJ,~> +J`c4ZrrD$?!<<#[!<<#[!<;<GpA^]Grr;TP!<<&\!<<&\!<:m;m/OHT#63iJs5rJDhWFM2cK590 +k5XTDd,t?-J`_OGJ`_OGj6$@AJ,~> +JaVdjrrBXurW&DT"9@iimJuqJ!!)uc!!)uc!!(a@rW)f_rW'4k!!*#d!!*#d!!(dArW!&g!:Bj2 +mf!48me-X3mXaeWmXafhmf*9;~> +Ja2LbrrBXqrW&DP"9@]el2^MB!!)u_!!)u_!!(a<rW)f[rW'4g!!*#`!!*#`!!(d=rW!&c!9sR. +lM^e4lLk4/l@J5Ol@J6`lMgj7~> +J`c4ZrrBXmrr8GL"TRWak5Y,:!<<#[!<<#[!<:d8rr;iWrr97c!<<&\!<<&\!<:g9rr3)_s5s@* +k5PD0k4\h+k(2ZGk(2[Xk5PF3~> +JaVdjrrB\!"9@iimJrdF"p")Z!:K7T`U3j/mJuYTr9a[fmJuYTrU'XcrU'XcrU'Xc_X7C(rU'Xc +rU'Xch<k@FmJu\S!71*,!7UB8!.jQhmXaeWmc3a8!.Y~> +Ja2LbrrB[r"9@]el2[@>"p!rR!:&hL`TdR+l2^)Lr9=Cbl2^)LrTX@_rTX@_rTX@__Wh+$rTX@_ +rTX@_h<G(Bl2^,K!70s(!7U64!.jEdl@J5OlJq10!.Y~> +J`c4ZrrB[n"TRWak5Ut6#63iJs5rJD`T@='k5XTDr8n.^k5XTDrT4+[rT4+[rT4+[_WCjurT4+[ +rT4+[h<"h>k5XTCs3Kj$s3p-0s+0<`k(2ZGk2YV(!.Y~> +JaVdjrrB_""p")Z!:K7TT'cRYrpBadrpBada6j-3md:)CmK!7S"p")Z!:K7TrU'XcrpBadrpBad +POA)Dg$Sh?rU'XcrU0Xbd-_#:mJuYTJaS*WJaS*WjR3$JJ,~> +Ja2LbrrB^s"p!rR!:&hLT'?:UrosI`rosI`a6Ej/lKSB7l2^hK"p!rR!:&hLrTX@_rosI`rosI` +PNqf@g$/P;rTX@_rTa@^d-:`6l2^)LJa.gOJa.gOjQcaFJ,~> +J`c4ZrrB^o#63iJs5rJDT&p%QroO4\roO4\a6!U+k2u^+k5YGC#63iJs5rJDrT4+[roO4\roO4\ +PNMQ<g#`;7rT4+[rT=+Zd,kK2k5XTDJ`_OGJ`_OGjQ?IBJ,~> +JaVdjrrBb#!!*#d!!*#d!!&\[!!)uc!!)uc!!(./!!*#d!!*#d!W_WgrpBadrpBadrU'jimd:)C +mJuD;!!)uc!!)uc!!'Rt!!*#d!<DQe!7^E:!<2Bd!<2Bh!:BjT!7L9>!:K7Tmd:(+meQ8N!<)<c +!<)<c!.jQhmXag$mf*9;~> +Ja2LbrrBat!!*#`!!*#`!!&\W!!)u_!!)u_!!(.+!!*#`!!*#`!W_KcrosI`rosI`rTXRelKSB7 +l2]u3!!)u_!!)u_!!'Rp!!*#`!<DEa!7^96!<26`!<26d!9sRL!7L-:!:&hLlKSA#lM9]F!<)0_ +!<)0_!.jEdl@J6qlMgj7~> +J`c4ZrrBap!<<&\!<<&\!<8_S!<<#[!<<#[!<:1'!<<&\!<<&\!rqE_roO4\roO4\rT4=ak2u^+ +k5XT+!<<#[!<<#[!<9Ul!<<&\!WV<]s4$02s8M-\s8M-`s5s@Ds3g$6s5rJDk2u\pk5"->s8D'[ +s8D'[s+0<`k(2[ik5PF3~> +JaVdjrrBe$!!)uc!!)uc!!'%e!!)uc!!)uc!!)0L!!)uc!!)uc!!)3M!!)uc!!)uc!!)uc!!)uc +!!)uc"9@iimJu>9!!*#d!!*#d!!'Rt!!)ucrr</h!:Bj:mL0*`mJu\C!:K7Tmd:)@mJm7cmJm7c +mJm7[mJm7dmJm7dmJm6<meQ8N!<2Bd!<2Bd!.jQhmXag#mf*9;~> +Ja2LbrrBdu!!)u_!!)u_!!'%a!!)u_!!)u_!!)0H!!)u_!!)u_!!)3I!!)u_!!)u_!!)u_!!)u_ +!!)u_"9@]el2]o1!!*#`!!*#`!!'Rp!!)u_rr</d!9sR6l3m[Xl2^,7!:&hLlKSB8l2Uh_l2Uh_ +l2UhWl2Uh`l2Uh`l2Ug8lM9]F!<26`!<26`!.jEdl@J6plMgj7~> +J`c4ZrrBdq!<<#[!<<#[!<9(]!<<#[!<<#[!<;3D!<<#[!<<#[!<;6E!<<#[!<<#[!<<#[!<<#[ +!<<#["TRWak5XN)!<<&\!<<&\!<9Ul!<<#[s8N2`s5s@2jp_:Pk5XT+s5rJDk2u^0joGG[joGG[ +joGGSjoGG\joGG\joGF4k5"->s8M-\s8M-\s+0<`k(2[hk5PF3~> +JaVdjrr@W<g[5%ArpBadrpBadjR*!JrpBadrpBadbjPH1ipI!Nmd:)CmJsT]"p")Z!:K7TeF!G> +mJuYTrpBadrpBadlg=`QrpBadrpBadp$Me[rU'XcrU'XcJaW@%"p")Z!:K7TJaS*WJaW7"rr@Q~> +Ja2Lbrr@W8gZeb=rosI`rosI`jQZ^FrosI`rosI`bj,0-ip$^JlKSB7l2\0U"p!rR!:&hLeER/: +l2^)LrosI`rosI`lfnHMrosI`rosI`p$)MWrTX@_rTX@_Ja3'r"p!rR!:&hLJa.gOJa2sorr@Q~> +J`c4Zrr@W4gZAM9roO4\roO4\jQ6IBroO4\roO4\bi\p)ioUIFk2u^+k5VdM#63iJs5rJDeE-o6 +k5XTDroO4\roO4\lfJ3IroO4\roO4\p#Z8SrT4+[rT4+[J`cdj#63iJs5rJDJ`_OGJ`c[grr@Q~> +JaVdjrr@W<g?o.Fmd:)CmJu87"p")Z!:K7TcgLK,jmE6OmJuYTZgIenrpBadrpBadeF*;9rU'Xc +rU'Xclg=rWmd:)CmJqh+i9g^JmJuYTJaS*WJaW4!rr@Q~> +Ja2Lbrr@W8g?JkBlKSB7l2]i/"p!rR!:&hLcg(3(jlusKl2^)LZg%MjrosI`rosI`eE[#5rTX@_ +rTX@_lfnZSlKSB7l2ZD#i9CFFl2^)LJa.gOJa2pnrr@Q~> +J`c4Zrr@W4g?&V>k2u^+k5XH'#63iJs5rJDcfXs$jlQ^Gk5XTDZfV8froO4\roO4\eE6c1rT4+[ +rT4+[lfJEOk2u^+k5U"pi8t1Bk5XTDJ`_OGJ`cXfrr@Q~> +h<t4ArpKddo'QJXfC&V<rpKacg$\k?JaV4Z"9@iimJu25"9@iimJtDtrW(mErW':m!!)uc!!)uc +!!(^?p&O1A"9@iimJqh+hX:@CJaS*WJaW0urr@Q~> +h<Oq=rp'L`o'-2TfBW>8rp'I_g$8S;Ja1qR"9@]el2]c-"9@]el2\ulrW(mArW':i!!)u_!!)u_ +!!(^;p&O1="9@]el2ZD#hWk(?Ja.gOJa2mmrr@Q~> +h<+Y9roX4\o&]oPfB3&4roX1[g#i;7J`bYJ"TRWak5XB%"TRWak5WTdrr:p=rr9=e!<<#[!<<#[ +!<:a7pAa49"TRWak5U"phWFh;J`_OGJ`cUerr@Q~> +kjAKPmK!%M!s%cW!<2Bd!:oOX!7pQ<!<2Bd!<2Bd!8?l@!.jRjmf!4Cmf!4/mK<OX!:BjKme-X3 +mJu\S!8m5D!.jRsme-Y\mJm7cmJm6<mXaeWmK2eV!.Y~> +kir3Ll2^VE!s%WO!<26`!:oCT!7pE8!<26`!<26`!8?`<!.jFflM^e?lM^e+l3%+P!9sRGlLk4/ +l2^,K!8m)@!.jFolLk5Xl2Uh_l2Ug8l@J5Ol2p5N!.Y~> +kiMpHjoG2=!s%KG!<2*\!:o7P!7p94!<2*\!<2*\!8?T8!.j:bk5PD;k5PD'jok_Hs5s@Ck4\h+ +joFQCs52u<s+0=kk4\iTjoGG[joGF4k(2ZGjoXZF!.Y~> +kjAKPmK!%M!s%cW!<2Bd!:oOX!7pQ<!<2Bd!<2Bd!8?l@!.jRnme-YCme-Y,mKN[ZmJu\C!93GG +!;c*`!<)<c!<)<c!0?ON!:BjT!9ESA!.jRsmf!4dmJm7dmJm7dmJm6<mXaeWmf2_T!.Y~> +kir3Ll2^VE!s%WO!<26`!:oCT!7pE8!<26`!<26`!8?`<!.jFjlLk5?lLk5(l377Rl2^,7!93;C +!;bs\!<)0_!<)0_!0?CJ!9sRL!9EG=!.jFolM^e`l2Uh`l2Uh`l2Ug8l@J5OlMp/L!.Y~> +kiMpHjoG2=!s%KG!<2*\!:o7P!7p94!<2*\!<2*\!8?T8!.j:fk4\i;k4\i$jp(kJk5XT+s5N2? +s8(jXs8D'[s8D'[s,Z:Fs5s@Ds5`>9s+0=kk5PD\joGG\joGG\joGF4k(2ZGk5XTD!.Y~> +l0eHLq<e=bmd:)SmJm7cmf!4cmf!4dmK3IWmK!7SrW)c^r;cibrW)ud!s%`h!;Gm]!<2Bd!<2Bd +!8?l@!.jRjmf!4Cmf!41mJm7dmJm7dmJm7JmK<OX!:Bj`mJm7dmJm7dmJm6OmJm7cmKN[ZmJuYT +!9*AF!.jRpmL90a!:BjTmJu\C!:K7TJaS*WJaWO*rr@Q~> +l0A0Hq<A%^lKSBKl2Uh_lM^e_lM^e`l2q%Ol2^hKrW)cZr;ci^rW)u`!s%Td!;GaY!<26`!<26` +!8?`<!.jFflM^e?lM^e-l2Uh`l2Uh`l2UhFl3%+P!9sR\l2Uh`l2Uh`l2UgKl2Uh_l377Rl2^)L +!9*5B!.jFll4!aY!9sRLl2^,7!:&hLJa.gOJa37"rr@Q~> +l/qmDq;qbZk2l[Cjo>D[k5GA[k5GA\joYVGjoGDCrW)cVr;ciZrW)u\!s%H`!;GUU!<2*\!<2*\ +!8?T8!.j:bk5PD;k5PD)joGG\joGG\joGGBjok_Hs5s@XjoGG\joGG\joGFGjoGG[jp(kJk5XTD +s5E,>s+0=hjph@Qs5s@Dk5XT+s5rJDJ`_OGJ`csorr@Q~> +kjAKPmK!%MrW)ob!!*#d!!*#d!W_WgrpBmhmJuYTrpBadrpBadqX+=`rpBgfmK!7S"p"&k!:K7T +q!J+^rpBadrpBadg@"t@JaV4Z"9@iimJu25"9@iimJtQ#!!)uc!!)uc!!)0L"p")Z!:K7TqX+Of +md:)CmJrF<$NTV_!!)HT!!)HT!9<JM!:BjT!.jRrmL90amJu\C!:K7TmJuYTJaS*WJaWL)rr@Q~> +kir3Ll2^VErW)o^!!*#`!!*#`!W_KcrosUdl2^)LrosI`rosI`qW\%\rosObl2^hK"p!og!:&hL +q!%hZrosI`rosI`g?S\<Ja1qR"9@]el2]c-"9@]el2],p!!)u_!!)u_!!)0H"p!rR!:&hLqW\7b +lKSB7l2["4$NTJW!!)<L!!)<L!9<>I!9sRL!.jFnl4!aYl2^,7!:&hLl2^)LJa.gOJa34!rr@Q~> +kiMpHjoG2=rW)oZ!!*#\!!*#\!W_?_roO=`joFNDroO1\roO1\qW7bXroO7^joGDC"p!cc!9WDD +puVPVroO1\roO1\g?/D8J`bYJ"TRWak5XB%"TRWak5W`h!<<#[!<<#[!<;3D#63iJs5rJDqW8"^ +k2u^+k5UV,$ifAOs8V6Ds8V6Ds5W5Es5s@Ds+0=jjph@Qk5XT+s5rJDk5XTDJ`_OGJ`cpnrr@Q~> +l0eHLq<e=bmd:)SmJm7dmJm7dmK*CV!;u9b!;u9b!;Ps^!<2Be!:Kab!U]s[mJm7dmJm7dmJm7@ +mf*9<mb7(5!:K7Tmd:)7mKN[ZmJu\C!35Ge!<2Bd!<2Bd!;c*d!:BjT!0HXK!!M]imd:)RmJm7c +mJm7cmJm7UmKN[ZmJu\C!.jRtmJm7dmJm7dmK*CVmf!3;mXaeWmelMQ!.Y~> +l0A0Hq<A%^lKSBKl2Uh`l2Uh`l2gtN!;u-^!;u-^!;PgZ!<26a!:'I^!U9[Wl2Uh`l2Uh`l2Uh< +lMgj8lItM-!:&hLlKSB/l377Rl2^,7!35;a!<26`!<26`!;bs`!9sRL!0HLG!!MQelKSBJl2Uh_ +l2Uh_l2UhQl377Rl2^,7!.jFpl2Uh`l2Uh`l2gtNlM^d7l@J5OlMTrI!.Y~> +l/qmDq;qbZk2l[Cjo>D\jo>D\joPPF!;u!Z!;u!Z!;P[V!<2*]!9X1Z!TjCSjo>D\jo>D\jo>D8 +k5PF4k1\r%s5rJDk2u^'jp(kJk5XT+s/P2]s8M-\s8M-\s8(j\s5s@Ds,cCCrrhKak2u^BjoGG[ +joGG[joGGMjp(kJk5XT+s+0=ljoGG\joGG\joYSFk5PC3k(2ZGk5=BA!.Y~> +kjAKPmK!%M!s%cW!<2Bd!<2Bd!<2Bf!:BjbmK*CV!;l0a!;Z$_!<2Bf!:BjbmJm7ZmJm7dmJm7d +mJm7@mf*9<mb@.0!<2Bd!<2Bd!9EPJ!<2Bd!<2Bd!3GSg!<)<c!<)<c!;c-_!6":*!<)<c!<)<c +!7pQ@!:BjT!;l0a!<2Bd!<2Bd!:T=U!<2Bd!<2Bd!.jS!mJm7cmK*CVme-X3mXaeWmK2eV!.Y~> +kir3Ll2^VE!s%WO!<26`!<26`!<26b!9sR^l2gtN!;l$]!;Ym[!<26b!9sR^l2UhVl2Uh`l2Uh` +l2Uh<lMgj8lJ(S(!<26`!<26`!9EDF!<26`!<26`!3GGc!<)0_!<)0_!;c![!6".&!<)0_!<)0_ +!7pE<!9sRL!;l$]!<26`!<26`!:T1Q!<26`!<26`!.jFrl2Uh_l2gtNlLk4/l@J5Ol2p5N!.Y~> +kiMpHjoG2=!s%KG!<2*\!<2*\!<2*^!9O:ZjoPPF!;kmY!;YaW!<2*^!9O:Zjo>DRjo>D\jo>D\ +jo>D8k5PF4k1f"us8M-\s8M-\s5`;Bs8M-\s8M-\s/b>_s8D'[s8D'[s8(mWs2=%"s8D'[s8D'[ +s46<8s5s@Ds81pYs8M-\s8M-\s6o(Ms8M-\s8M-\s+0=njoGG[joYSFk4\h+k(2ZGjoXZF!.Y~> +kjAKPmK!%M!s%cW!<2Bd!<2Bd!<2Bf!:BjdmK`g\!:K7Tmd:)SmJm7`mem.cmJm7dmK*CV!;,[Z +!<2Bd!<2Bd!8?l@!.jRnmJm7cmJm7cmJm7LmJm7cmJm7cmJm6Zme-Y\mJm7cmJm7cmJm7:mJm7d +mJm7dmJm7:mf!4^mKN[ZmJu\C!:T=U!<)<c!<)<c!.jRkmf!3;mXaeWmelMQ!.Y~> +kir3Ll2^VE!s%WO!<26`!<26`!<26b!9sR`l3ICT!:&hLlKSBKl2Uh\lMU__l2Uh`l2gtN!;,OV +!<26`!<26`!8?`<!.jFjl2Uh_l2Uh_l2UhHl2Uh_l2Uh_l2UgVlLk5Xl2Uh_l2Uh_l2Uh6l2Uh` +l2Uh`l2Uh6lM^eZl377Rl2^,7!:T1Q!<)0_!<)0_!.jFglM^d7l@J5OlMTrI!.Y~> +kiMpHjoG2=!s%KG!<2*\!<2*\!<2*^!9O:\jp1tL!9WDDk2l[Cjo>DXk5>;[jo>D\joPPF!;,CR +!<2*\!<2*\!8?T8!.j:fjoGG[joGG[joGGDjoGG[joGG[joGFRk4\iTjoGG[joGG[joGG2joGG\ +joGG\joGG2k5PDVjp(kJk5XT+s6o(Ms8D'[s8D'[s+0=ck5PC3k(2ZGk5=BA!.Y~> +h<t4ArpKacrpKacrpKacs6]jerpBgfmdC&Sq<e4_qsOF`s6]jep$VeZrpKacg$\k?JaS*W`U<^* +qX+=`rpBadrpBaddd@;>md:)CmJtl,p&P$Y"9@iimJqh+]^>n&mJuYTJaS*WJaWL)rr@Q~> +h<Oq=rp'I_rp'I_rp'I_s69RarosOblK\?Kq<@q[qs+.\s69Rap$2MVrp'I_g$8S;Ja.gO`TmF& +qW\%\rosI`rosI`dcq#:lKSB7l2]H$p&P$U"9@]el2ZD#]]oV"l2^)LJa.gOJa34!rr@Q~> +h<+Y9roX1[roX1[roX1[s5j:]roO7^k2uXCq;qYWqr[kXs5j:]p#c5RroX1[g#i;7J`_OG`TI1" +qW7eXroO4\roO4\dcLc6k2u^+k5X&qpAb'Q"TRWak5U"p]]K@sk5XTDJ`_OGJ`cpnrr@Q~> +ZgIen\F0@sJaS*W`pNs0mJuYTqX+Ofmd:)CmJtW%"9@iimJt]'rW)]\rW%N;]^>t(md:)CmJqh+ +JaS*WrpKddJ,~> +Zg%Mj\Ea(oJa.gO`p*[,l2^)LqW\7blKSB7l2]2r"9@]el2]8trW)]XrW%N7]]o\$lKSB7l2ZD# +Ja.gOrp'L`J,~> +ZfV5f\E<ekJ`_OG`o[F(k5XTDqW8"^k2u^+k5Wfj"TRWak5Wllrr;`Trr7Q3]]KFuk2u^+k5U"p +J`_OGroX4\J,~> +ZgIen\F0@sJaS*Wa6j-3md:)CmK!+O"9@iimJtQ#rW(C7"9@iimK!1Qp&K[3_<q:'rpBadrpBad +JaS*WJaWR+rr@Q~> +Zg%Mj\Ea(oJa.gOa6Ej/lKSB7l2^\G"9@]el2],prW(C3"9@]el2^bIp&K[/_<M"#rosI`rosI` +Ja.gOJa3:#rr@Q~> +ZfV5f\E<ekJ`_OGa6!U+k2u^+k5Y;?"TRWak5W`hrr:F/"TRWak5YAApA]^+_<(atroO4\roO4\ +J`_OGJ`d!prr@Q~> +JaVdjrr@W<JaUVI!!*#d!!*#d!!)l`rW(@6p&N_4"p")Z!:K7Tq<n4^JaU8?!!)uc!!)uc!!%T< +JaS*W!q$$gJ,~> +Ja2Lbrr@W8Ja1>A!!*#`!!*#`!!)l\rW(@2p&N_0"p!rR!:&hLq<IqZJa0u7!!)u_!!)u_!!%T8 +Ja.gO!pTacJ,~> +J`c4Zrr@W4J`b&9!<<&\!<<&\!<;oXrr:C.pA`b,#63iJs5rJDq<%\VJ`a]/!<<#[!<<#[!<7W4 +J`_OG!p0I_J,~> +JaVdjrr@W<JaUYJ!!)uc!!)uc!W_ZVp&NM.rW(I9!!*#d!!*#d!!)oa"9@iimJti+!!)uc!!)uc +!!%T<JaS*WJaVdjrr@Q~> +Ja2Lbrr@W8Ja1AB!!)u_!!)u_!W_NNp&NM*rW(I5!!*#`!!*#`!!)o]"9@]el2]E#!!)u_!!)u_ +!!%T8Ja.gOJa2Lbrr@Q~> +J`c4Zrr@W4J`b):!<<#[!<<#[!rqEFpA`P&rr:L1!<<&\!<<&\!<;rY"TRWak5X#p!<<#[!<<#[ +!<7W4J`_OGJ`c4Zrr@Q~> +JaVdjrr@W<JaU&9rW(73"9@iimJti+!!)uc!!)uc!!)uc"p")Z!:K7TlL"WPrU'XcrU'Xcq!J+^ +rpBadrpBadJaS*WJaS*WkjJHNJ,~> +Ja2Lbrr@W8Ja0c1rW(7/"9@]el2]E#!!)u_!!)u_!!)u_"p!rR!:&hLlKS?LrTX@_rTX@_q!%hZ +rosI`rosI`Ja.gOJa.gOkj&0JJ,~> +J`c4Zrr@W4J`aK)rr::+"TRWak5X#p!<<#[!<<#[!<<#[#63iJs5rJDlK/*HrT4+[rT4+[puVSV +roO4\roO4\J`_OGJ`_OGkiVmFJ,~> +JaVdjrr@W<JaU):"9@iimJtW%"p")Z!:K7TamK-/rpBadrpBadlL"WPrpBadrpBadp?i+bmd:)C +mJqh+JaS*WJaV^hrr@Q~> +Ja2Lbrr@W8Ja0f2"9@]el2]2r"p!rR!:&hLam&j+rosI`rosI`lKS?LrosI`rosI`p?Dh^lKSB7 +l2ZD#Ja.gOJa2F`rr@Q~> +J`c4Zrr@W4J`aN*"TRWak5Wfj#63iJs5rJDalWU'roO4\roO4\lK/*HroO4\roO4\p>uSZk2u^+ +k5U"pJ`_OGJ`c.Xrr@Q~> +JaVdjrr@W<JaU,;"p")Z!:K7Tdd@)8rpBadrpBadbO,?1rU'XcrU'XclL"iVmd:)CmJunI"9@ii +mJqh+JaS*WJaV[grr@Q~> +Ja2Lbrr@W8Ja0i3"p!rR!:&hLdcpf4rosI`rosI`bN]'-rTX@_rTX@_lKSQRlKSB7l2^JA"9@]e +l2ZD#Ja.gOJa2C_rr@Q~> +J`c4Zrr@W4J`aQ+#63iJs5rJDdcLQ0roO4\roO4\bN8g)rT4+[rT4+[lK/<Nk2u^+k5Y)9"TRWa +k5U"pJ`_OGJ`c+Wrr@Q~> +JaVdjrr@W<JaU/<!!*#d!!*#d!!)l`!!)uc!!)uc!!)0L!!)uc!!)uc!!'"d"9@iimJuhGrW%N; +JaS*WJaVXfrr@Q~> +Ja2Lbrr@W8Ja0l4!!*#`!!*#`!!)l\!!)u_!!)u_!!)0H!!)u_!!)u_!!'"`"9@]el2^D?rW%N7 +Ja.gOJa2@^rr@Q~> +J`c4Zrr@W4J`aT,!<<&\!<<&\!<;oX!<<#[!<<#[!<;3D!<<#[!<<#[!<9%\"TRWak5Y#7rr7Q3 +J`_OGJ`c(Vrr@Q~> +JaVdjrr@W<JaU2=!!)uc!!)uc!!)l`!!*#d!!*#d!!%T<rW)WZp&K[3JaS*WJaVdjrr@Q~> +Ja2Lbrr@W8Ja0o5!!)u_!!)u_!!)l\!!*#`!!*#`!!%T8rW)WVp&K[/Ja.gOJa2Lbrr@Q~> +J`c4Zrr@W4J`aW-!<<#[!<<#[!<;oX!<<&\!<<&\!<7W4rr;ZRpA]^+J`_OGJ`c4Zrr@Q~> +JaVdjrr@W<JaTN*"p")Z!:K7TK^SO6rU'Xcr9aRcmed(amf*:dmf*:dmJm7cmK*CV!<)<c!<)<c +!.jQhmXae\mf*9;~> +Ja2Lbrr@W8Ja06""p!rR!:&hLK^/72rTX@_r9=:_lMLY]lMgk`lMgk`l2Uh_l2gtN!<)0_!<)0_ +!.jEdl@J5TlMgj7~> +J`c4Zrr@W4J``ro#63iJs5rJDK]`".rT4+[r8n%[k5>8Yk5YJ\k5YJ\joGG[joYSFs8D'[s8D'[ +s+0<`k(2ZLk5PF3~> +JaVdjrr@W<i9gRFrU'XcrU'Xch<k7CrU'XcrU'XcKC/jBmJuYTM!b6CrpKdd!q$'Vr;[&i!!)Ee +mK!+O$39JomJuYTmJuYTrpKdd#OVT[!:K7T!<2Bd!<2Bd!<2Bd!.jQhmXae[mf*9;~> +Ja2Lbrr@W8i9C:BrTX@_rTX@_h<Ft?rTX@_rTX@_KB`R>l2^)LM!=s?rp'L`!pTdNr;[&e!!)9a +l2^\G$39>kl2^)Ll2^)Lrp'L`#O2<S!:&hL!<26`!<26`!<26`!.jEdl@J5SlMgj7~> +J`c4Zrr@W4i8t%>rT4+[rT4+[h<"_;rT4+[rT4+[KB<=:k5XTDLun^;roX7\!p9OFrVm)as8V6] +k5Y;?$NK8gk5XTDk5XTDroX7\#Nl'Ks5rJDs8M-\s8M-\s8M-\s+0<`k(2ZKk5PF3~> +JaVdjrrCa?!!)uc!!)uc!!&2M!!*#d!!*#d!!(dA!!*#d!!*#d!!%T<rW'Y"!!)uc!!)uc!!*#d +!!)uc!!)uc!!)'I!!*#d!W_ZVrW!2k!!)Ee!:Bj`mM>lk!!)Ee!:BjTmJu\C!:K7TmJm7TmK!7S +#QX8mmd:)CmJqh+JaS*WK^Sj?J,~> +Ja2LbrrCa;!!)u_!!)u_!!&2I!!*#`!!*#`!!(d=!!*#`!!*#`!!%T8rW'Xs!!)u_!!)u_!!*#` +!!)u_!!)u_!!)'E!!*#`!W_NNrW!2g!!)9a!9sR\l5'Hc!!)9a!9sRLl2^,7!:&hLl2UhLl2^hK +#QX,ilKSB7l2ZD#Ja.gOK^/R;J,~> +J`c4ZrrCa7!<<#[!<<#[!<85E!<<&\!<<&\!<:g9!<<&\!<<&\!<7W4rr9[o!<<#[!<<#[!<<&\ +!<<#[!<<#[!<;*A!<<&\!rqEFrr35cs8V6]s5s@Xjqn'[s8V6]s5s@Dk5XT+s5rJDk5YJDk5YGC +#lj&ek2u^+k5U"pJ`_OGK]`:7J,~> +JaVdjrrC^>!!*#d!!*#d!!&,K"p")Z!:K7Tg$T%Emd:)CmJsof!!)uc!!)uc!!([>!!*#do`,?e +!:K7TmJu\C!!*#drrE#c!!)l`!!)uc!!)uc!s%cW!<)<c!<)<c!<)<c!<)<j!:K7TmJuYTrpBad +r9aObrpBadrpBadiU-aImdBrP#4;HkmJuYTqX+=`rpC*nmJuYTmJuYTmK!4R#QX8mmJm7TmK!7S +"9@iimJqh+JaS*WKC8a>J,~> +Ja2LbrrC^:!!*#`!!*#`!!&,G"p!rR!:&hLg$/bAlKSB7l2\K^!!)u_!!)u_!!([:!!*#`o`,?a +!:&hLl2^,7!!*#`rrE#_!!)l\!!)u_!!)u_!s%WO!<)0_!<)0_!<)0_!<)0f!:&hLl2^)LrosI` +r9=7^rosI`rosI`iT^IElK\6H#3l0gl2^)LqW\%\rosgjl2^)Ll2^)Ll2^eJ#QX,il2UhLl2^hK +"9@]el2ZD#Ja.gOKBiI:J,~> +J`c4ZrrC^6!<<&\!<<&\!<8/C#63iJs5rJDg#`M=k2u^+k5W*V!<<#[!<<#[!<:^6!<<&\p&>B] +s5rJDk5XT+s8W)\s8W&[!<;oX!<<#[!<<#["97NGs8D'[s8D'[s8D'[s8D'bs5rJDk5XTDroO4\ +r8n"ZroO4\roO4\iT:4Ak2uR@#3Psck5XTDqW7eXroORfk5XTDk5XTDk5YDB#lj&ek5YJDk5YGC +"TRWak5U"pJ`_OGKBE16J,~> +JaVdjrrC[="p")Z!:BgerpBadrU'XcQgOtVmJuYTfBrbAmJuYTipHdHrU'XcrpKddrpBadrU'Xc +mHsrSrpBadrpBadiU-[GrU'XcrU0[cs6fmes6fjds6fme!:Kgd%.4)qmd:&TmJuYTmK!7S!!)f^ +!!*#d!!*#d!!)uc!!*#d!!*#d!!)oa!!*#d!!*#d"p")Z!:K7TqX+Ofmd:)CmJu/4!<DQe!!)Hc +!!)Hd!;c*`!<)?a!!;Qgmf!4`mf!1gmJuYTr9jOaJaS*WJaS-Xrr@Q~> +Ja2LbrrC[9"p!rR!9sOarosI`rTX@_Qg+\Rl2^)LfBNJ=l2^)Lip$LDrTX@_rp'L`rosI`rTX@_ +mHOZOrosI`rosI`iT^CCrTX@_rTaC_s6BUas6BR`s6BUa!:'O`%-dfmlKS?Ll2^)Ll2^hK!!)fZ +!!*#`!!*#`!!)u_!!*#`!!*#`!!)o]!!*#`!!*#`"p!rR!:&hLqW\7blKSB7l2]`,!<DEa!!)<_ +!!)<`!;bs\!<)3]!!;EclM^e\lM^bcl2^)Lr9F7]Ja.gOJa.jPrr@Q~> +J`c4ZrrC[5#63iJs5s@]roO4\rT4+[Qf\GNk5XTDfB*59k5XTDioU7@rT4+[roX7\roO4\rT4+[ +mH+EKroO4\roO4\iT:.?rT4+[rT=.[s5s@]s5s=\s5s@]!9X:\%-ITik2u^Dk5XTDk5YGC!<;iV +!<<&\!<<&\!<<#[!<<&\!<<&\!<;rY!<<&\!<<&\#63iJs5rJDqW8"^k2u^+k5X?$!WV<]rrD3[ +rrD3\s8(jXs8D*YrrV?_k5PDXk5PA_k5XTDr9""YJ`_OGJ`_RHrr@Q~> +JaVdjrrCX<"T[rjmJm7dmJm7dmJm6Pmf!4:mf!4[mJm7cmJm7cmf*:dmf*:dmf!4dmf*:dmf*:d +mJm7dmJm7QmKN[ZmJu\C!8m2E!<2Bd!<2Bk!:K7Tmd:)CrW!f'!:Bgemd:)CmJuYT!:BjTmJu\C +!:K7Tp?i+bmd:)CmK!.P"p")Z!:K7Tq<eXkmd:)CmJuYTmJuYTq!J7bmJuYTh<t7B!:KIZr9i_J +!:KO\JaS*WJaS9\rr@Q~> +Ja2LbrrCX8"T[ffl2Uh`l2Uh`l2UgLlM^e6lM^eWl2Uh_l2Uh_lMgk`lMgk`lM^e`lMgk`lMgk` +l2Uh`l2UhMl377Rl2^,7!8m&A!<26`!<26g!:&hLlKSB7rW!f#!9sOalKSB7l2^)L!9sRLl2^,7 +!:&hLp?Dh^lKSB7l2^_H"p!rR!:&hLq<A@glKSB7l2^)Ll2^)Lq!%t^l2^)Lh<Ot>!:'1Vr9EGF +!:'7XJa.gOJa/!Trr@Q~> +J`c4ZrrCX4"om`bk5YJ\joGG\joGFHk5PD2k5PDSjoGG[joGG[k5YJ\k5YJ\k5PD\k5YJ\k5YJ\ +joGG\joGGIjp(kJk5XT+s52r=s8M-\s8M-cs5rJDk2u^+rr3hts5s@]k2u^+k5XTDs5s@Dk5XT+ +s5rJDp>uSZk2u^+k5Y>@#63iJs5rJDq;r+ck2u^+k5XTDk5XTDpuV_Zk5XTDh<+_:!9WqRr9!2B +!9X"TJ`_OGJ`_^Lrr@Q~> +M=1?CrU'Xcr9aObn*^2UeaED:s6^'kmd:)CmJrXBp&OXNrrE&drrE&drrDl_o`,Wm!:K7Tmd:)C +!:BjTmJm7TmK!7S!!*#d&ch@f!!)Eemd:)CmJu\C!:K7Tl0\ZSmJuYTh<kIImd:)CmK!4R!<DQe +!!_ik!:BgemeZtmmJm7T!:BjT!:BjT!;,[^!:BjT!;Z$c!:BjT!;Gma!:BjT!<2Ec!;>j[!:B1S +!<)<c!<)<e!:K:D!;u6b!<)<d!:Kdcs6fjdr9j7Ys6fjdJaS*WJaS-Xrr@Q~> +M<b'?rTX@_r9=7^n*9oQea!,6s69dglKSB7l2[4:p&OXJrrE&`rrE&`rrDl[o`,Wi!:&hLlKSB7 +!9sRLl2UhLl2^hK!!*#`&ch4^!!)9alKSB7l2^,7!:&hLl08BOl2^)Lh<G1ElKSB7l2^eJ!<DEa +!!_]g!9sOalMCPil2UhL!9sRL!9sRL!;,OZ!9sRL!;Ym_!9sRL!;Ga]!9sRL!<29_!;>^W!:B%O +!<)0_!<)0a!:&k<!;u*^!<)0`!:'L_s6BR`r9EtUs6BR`Ja.gOJa.jPrr@Q~> +M<=d;rT4([r8mtZn)jWMe`Ql2s5jOck2u^+k5Uh2pAa[Fs8W)\s8W)\s8VoWp&>Zes5rJDk2u^+ +s5s@Dk5YJDk5YGC!<<&\'*%+Vs8V6]k2u^+k5XT+s5rJDl/i-Kk5XTDh<"qAk2u^+k5YDB!WV<] +rs%Wcs5s@]k55/ek5YJDs5s@Ds5s@Ds7GFVs5s@Ds7td[s5s@Ds7bXYs5s@Ds8M0[s7YUSs6\qK +s8D'[s8D']s5rJ4s8;!Zs8D'\s5s:[s5s=\r9!_Qs5s=\J`_OGJ`_RHrr@Q~> +MXCHErpBpimd:)C!<2Bf!:BjVmf*:?me-V_mJuYTl0\NOrpKddrpK^b"RZ9X!!*#drr<)f!<)<c +!<)<c!;l0a!<)<c!<)<f!:K7TrU'XcrU'Xcm-aiQm-alRs6fmes6fmeo^;\Y!U]semJm7dmf*:e +mf*7imJuYT!<)<r!:K7T!:Bgemd:&TmJuYTrU'dgmJuYTkO/<Lg[51EmJuYTqsOC_#4;KZ!:BjT +q>gQ`rW)rcrW)NWr;cfa!!)ucrW)WZo)SdXp&OUM!!*#d!!*#d!!)l`rVurdqZ$`d!:BjamJm7d +mf*7emf!1imJuYTmK!4R!s%`hmf!4amK<OX!:Bi<mXaeWmXss-!.Y~> +MWt0ArosXelKSB7!<26b!9sRRlMgk;lLk2[l2^)Ll086Krp'L`rp'F^"R6!P!!*#`rr<)b!<)0_ +!<)0_!;l$]!<)0_!<)0b!:&hLrTX@_rTX@_m-=QMm-=TNs6BUas6BUao]lDU!U9[al2Uh`lMgka +lMghel2^)L!<)0n!:&hL!9sOalKS?Ll2^)LrTXLcl2^)LkN`$HgZenAl2^)Lqs++[#3l3R!9sRL +q>gQ\rW)r_rW)NSr;cf]!!)u_rW)WVo)SdTp&OUI!!*#`!!*#`!!)l\rVur`qZ$``!9sR]l2Uh` +lMghalM^bel2^)Ll2^eJ!s%TdlM^e]l3%+P!9sQ8l@J5Ol@\C%!.Y~> +MWOm=roO@ak2l[+!<2*^!9O:Nk5PG7k4\fWk5XTDl/i!GroX7\roX1Z"QoaHs8W)\s8N,^s8D'[ +s8D'[s81pYs8D'[s8D'^s5rJDrT4+[rT4+[m,n<Im,n?Js5s@]s5s@]o]H/Q!TsF]joGG\k5YJ] +k5YGak5XTDs8D'js5rJDs5s@]k2u^Dk5XTDrT47_k5XTDkN;dDgZAY=k5XTDqr[kW#3PsJs5s@D +qZ$TXrr;u[rr;QOrVuiY!<<#[rr;ZRoDegPpAaXE!<<&\!<<&\!<;oXrr2u\qu6c\s5s@YjoGG\ +k5YG]k5PAak5XTDk5YDB"97N`k5PDYjok_Hs5s?4k(2ZGk(Dgr!.Y~> +MXCHErpBgfmK!7S!W_WgrpBadna?DWeaED:rU0Xbp?hn\rU0[crpKddrpKdds6^0nmJuYTmd:&T +mf!4dmf*:dmJm7dmJm7dmJm7_mJm7dmJm7dmJm7cmJm7dmJm7dmJm7RmK<OX!:BjRmf*7jmJm7T +!!)ZZ'*.G#mJm7TmJuYTmd:)C!!)Eemf!4`mKrs^!:BjT!:BjTmf!4`mf!4Ome-YZmJm7Imf!4c +me-V\mcXZIme-V\me$SYmdgGPmf!4PmKN[ZmJu\C!;c*e!:BjT!:Kdc"mu?jmd:)PmMZ)nmJu\C +!:K7Tmd:)CmJu\C!:K7T!:BjT!<2Bj!:K7Tmd:(+mXaeWmY($.!.Y~> +MWt0ArosObl2^hK!W_KcrosI`n`p,Sea!,6rTa@^p?DVXrTaC_rp'L`rp'L`s69mjl2^)LlKS?L +lM^e`lMgk`l2Uh`l2Uh`l2Uh[l2Uh`l2Uh`l2Uh_l2Uh`l2Uh`l2UhNl3%+P!9sRNlMghfl2UhL +!!)ZV'*.:tl2UhLl2^)LlKSB7!!)9alM^e\l3[OV!9sRL!9sRLlM^e\lM^eKlLk5Vl2UhElM^e_ +lLk2XlKA6ElLk2XlLb/UlLP#LlM^eLl377Rl2^,7!;bsa!9sRL!:'L_"mQ'flKSBHl5BZfl2^,7 +!:&hLlKSB7l2^,7!:&hL!9sRL!<26f!:&hLlKSA#l@J5Ol@eI&!.Y~> +MWOm=roO7^joGDC!W_?_roO1\n`KiOe`Ql2rT=+Zp>uATrT=.[roX7\roX7\s5jXfk5XTDk2u^D +k5PD\k5YJ\joGG\joGG\joGGWjoGG\joGG\joGG[joGG\joGG\joGGJjok_Hs5s@Jk5YGbk5YJD +s8V`R'E@4pk5YJDk5XTDk2u^+s8V6]k5PDXjpM.Ns5s@Ds5s@Dk5PDXk5PDGk4\iRjoGGAk5PD[ +k4\fTk32jAk4\fTk4ScQk4AWHk5PDHjp(kJk5XT+s8(j]s5s@Ds5s:["m5jbk2u^@jr49^k5XT+ +s5rJDk2u^+k5XT+s5rJDs5s@Ds8M-bs5rJDk2u\pk(2ZGk(Mms!.Y~> +MXCHErpBgfmK!7S!W_WgrpBadna?DWf'WV?mJu\K!;Z$_!<2Bj!:BjT!:Bjdmf*:emf*7imJm7T +mf!1imJm7T!!*#d#QX8mmd:)CmK!"L"p")Z!:K7TqsFXgmd:)CmJuVA"p")Z!:K7Tm-a`No^2tb +md:&TmJuYTrpBsjmJuYT!:Kdcq<n4^!:K.QlL+WOrpBadrpBadk3hpCrpK4T!:Kdc!q$'VrW)NW +rW)ud#6=2[!:K7Tmf!4Zmf!4cmK<OX!:Bj^mK<OX!:BjQmK<OX!:Bj`mL90amJm7T!!)Ee!:K7T +rpBadqsOF`#jqZmmJuYTmK!7SrrE&d#QX;\!!)EemK!7S!!*#d!!%T<JaS*WL$ns@J,~> +MWt0ArosObl2^hK!W_KcrosI`n`p,Sf'3>;l2^,C!;Ym[!<26f!9sRL!9sR`lMgkalMghel2UhL +lM^bel2UhL!!*#`#QX,ilKSB7l2^SD"p!rR!:&hLqs"@clKSB7l2^29"p!rR!:&hLm-=HJo]c\^ +lKS?Ll2^)Lros[fl2^)L!:'L_q<IqZ!:&kMlK\?KrosI`rosI`k3DX?rp&qP!:'L_!pTdNrW)NS +rW)u`#6=&S!:&hLlM^eVlM^e_l3%+P!9sRZl3%+P!9sRMl3%+P!9sR\l4!aYl2UhL!!)9a!:&hL +rosI`qs+.\#jMBil2^)Ll2^hKrrE&`#QX/T!!)9al2^hK!!*#`!!%T8Ja.gOL$J[<J,~> +MWOm=roO7^joGDC!W_?_roO1\n`KiOf&d)7k5XT;s7tdWs8M-bs5s@Ds5s@\k5YJ]k5YGak5YJD +k5PAak5YJDs8W)\#lj&ek2u^+k5Y2<#63iJs5rJDqrS+_k2u^+k5Xf1#63iJs5rJDm,n3Fo]?GZ +k2u^Dk5XTDroOFbk5XTDs5s:[q<%\V!9WVIlK8*GroO4\roO4\k2uC;roW\L!9X7[!p9OFrr;QO +rr<#\#QNrKs5rJDk5PDRk5PD[jok_Hs5s@Vjok_Hs5s@Ijok_Hs5s@Xjph@Qk5YJDs8V6]s5rJD +roO4\qr[nX#j20ek5XTDk5YGCs8W)\#lj&Ls8V6]k5YGC!<<&\!<7W4J`_OGL$&C8J,~> +M=1?Cs6]jerpBgfmK!7S!!)QWq#K7=#QX;\!:K7TmdC&So^3Rsmd:)CmJu\C!:K7Tmd:)C!:BjT +!:BgemeQq`mJm7dmK<OX!:Bj[mK<OX!:Bj_mK<OX!:BjRmJm7dmJm7dmJm7Rmem.XmJm7dmK!=U +rW)laiW/lDrW)-L$39JomJu\C!:K7TiU6[FqsFOdmJu\R!!)Hc!!)Hc!"A8q!:BjT!:BjT!:BjZ +mL]He!:BjTmJuYTmJuYTmJuYTp[/FimJuYTmJu\C!:K7TqX+Ofmd:)CmJuS@rW)f_!!*#d!W_ZV +rW!,i!!)Ee!<2Bd!;u9`!!;Qg!<2Ed!<2Ed!<;Ke!<;Hi!:BjT!<)<c!<)<c!.jQhmXae\mf*9;~> +M<b'?s69RarosObl2^hK!!)QSq#K79#QX/T!:&hLlK\?Ko]d:olKSB7l2^,7!:&hLlKSB7!9sRL +!9sOalM:M\l2Uh`l3%+P!9sRWl3%+P!9sR[l3%+P!9sRNl2Uh`l2Uh`l2UhNlMU_Tl2Uh`l2^nM +rW)l]iW/l@rW)-H$39>kl2^,7!:&hLiTgCBqs"7`l2^,J!!)<_!!)<_!"A,m!9sRL!9sRL!9sRV +l4F$]!9sRLl2^)Ll2^)Ll2^)LpZ`.el2^)Ll2^,7!:&hLqW\7blKSB7l2^/8rW)f[!!*#`!W_NN +rW!,e!!)9a!<26`!;u-\!!;Ec!<29`!<29`!<;?a!<;<e!9sRL!<)0_!<)0_!.jEdl@J5TlMgj7~> +M<=d;s5j:]roO7^joGDC!!)QOq#K75#lj&Ls5rJDk2u[Co]@%kk2u^+k5XT+s5rJDk2u^+s5s@D +s5s@]k5,,XjoGG\jok_Hs5s@Sjok_Hs5s@Wjok_Hs5s@JjoGG\joGG\joGGJk5G>PjoGG\joPME +rr;oYirAo<rr;0D$NK8gk5XT+s5rJDiTC.>qrS"\k5XTBrrD3[rrD3[rs\&is5s@Ds5s@Ds5s@R +jq7XUs5s@Dk5XTDk5XTDk5XTDpZ;nak5XTDk5XT+s5rJDqW8"^k2u^+k5Xc0rr;iW!<<&\!rqEF +rr3/as8V6]s8M-\s8;$XrrV?_s8M0\s8M0\s8V6]s8V3as5s@Ds8D'[s8D'[s+0<`k(2ZLk5PF3~> +MXCHErpBgfmK!7S!W_WgrpBadna?2QhX1@DrpBadrpKdd"7?0W!;,[d!:BjT!:BjT!:Bjcmf!1d +mf!1fmJu\Q!!DWhmK!1QrW)QXrW)]\rW)<Q!!)uc!!)uc!!)QWo`4gU!W_ZVkQ(PKrVurdrW)ud +"9@iimK!4R"9@iimJuM>$39M^!:K7TmJuYTiU-gKmJuYTrU'dgmd:)CrW!#f!:Kgd'(,bfmJuYT +!:BgemJu\C!:K7Tp?i1dmd:)CmJu\CrW!2k!:K7Tmd:)NmKN[ZmJu\C!<2Bd!<2Bd!;u6b!<2Bd +!<2Bd!:]FM!<;He!<2Ed!!;Qgmem+gmJuYT!<2Be!:KO\p[/"]rU'XcrU'Xcr9aObrU'XcrU'Xc +JaS*WJaSNcrr@Q~> +MWt0ArosObl2^hK!W_KcrosI`n`ooMhWb(@rosI`rp'L`"6omO!;,O`!9sRL!9sRL!9sR_lM^b` +lM^bbl2^,I!!DKdl2^bIrW)QTrW)]XrW)<M!!)u_!!)u_!!)QSo`4gQ!W_NNkQ(PGrVur`rW)u` +"9@]el2^eJ"9@]el2^)6$39AV!:&hLl2^)LiT^OGl2^)LrTXLclKSB7rW!#b!:'O`'']J^l2^)L +!9sOal2^,7!:&hLp?Dn`lKSB7l2^,7rW!2g!:&hLlKSBFl377Rl2^,7!<26`!<26`!;u*^!<26` +!<26`!:]:I!<;<a!<29`!!;EclMU\cl2^)L!<26a!:'7XpZ__YrTX@_rTX@_r9=7^rTX@_rTX@_ +Ja.gOJa/6[rr@Q~> +MWOm=roO7^joGDC!W_?_roO1\n`KWIhW=h<roO4\roX7\"6TXGs7GF\s5s@Ds5s@Ds5s@[k5PA\ +k5PA^k5XTArr_E`k5YAArr;TPrr;`Trr;?I!<<#[!<<#[!<;TOp&FjM!rqEFkl:SCrr2u\rr<#\ +"TRWak5YDB"TRWak5X].$NK8Ns5rJDk5XTDiT::Ck5XTDrT47_k2u^+rr3&^s5s=\''B5Vk5XTD +s5s@]k5XT+s5rJDp>uY\k2u^+k5XT+rr35cs5rJDk2u^>jp(kJk5XT+s8M-\s8M-\s8;!Zs8M-\ +s8M-\s7#1Es8V3]s8M0\rrV?_k5G;_k5XTDs8M-]s5s%TpZ;JUrT4+[rT4+[r8n"ZrT4+[rT4+[ +J`_OGJ`_sSrr@Q~> +MXCHErpBgfmK!7S!W_WgrpBadna?DWg$Sh?rU'XcrpKdd"RZ9XmJunIrW)rcrVurdl2UhPp&P!X +p&P-\p&O"<!!)uc#6=2[!:BjTme["Qmf!4amf!4dmem+emJm7bmMGrl!:BjT!:Bgemd:)CmJu\C +!:K7Tmd:)@mJm7dmJm7dmf!4FmKim]mJu\C!:K7TrpKdds6fme$gmupmd:&Tmd:&Tmf!1imJuYT +mK!7S!!)f^!!*#d!<DQ\!<2Bd!;l0a!<2Bk!:BjT!:K7TrU'XcrpBadrU'XcrU'XcmI'rRn*U/U +rpBadrpBadrpBgfmdC&Ss6]jejmE*KrpBadrpBadJaS*WJaSKbrr@Q~> +MWt0ArosObl2^hK!W_KcrosI`n`p,Sg$/P;rTX@_rp'L`"R6!Pl2^JArW)r_rVur`l2UhLp&P!T +p&P-Xp&O"8!!)u_#6=&S!9sRLlMCSMlM^e]lM^e`lMU\al2Uh^l50Nd!9sRL!9sOalKSB7l2^,7 +!:&hLlKSB8l2Uh`l2Uh`lM^eBl3RIUl2^,7!:&hLrp'L`s6BUa$gI]llKS?LlKS?LlM^bel2^)L +l2^hK!!)fZ!!*#`!<DEX!<26`!;l$]!<26g!9sRL!:&hLrTX@_rosI`rTX@_rTX@_mHXZNn*0lQ +rosI`rosI`rosOblK\?Ks69RajlugGrosI`rosI`Ja.gOJa/3Zrr@Q~> +MWOm=roO7^joGDC!W_?_roO1\n`KiOg#`;7rT4+[roX7\"QoaHk5Y)9rr;u[rr2u\lMgkHpAb$P +pAb0TpAa%4!<<#[#QNrKs5s@Dk552Ik5PDYk5PD\k5G;]k5YJZjr"-\s5s@Ds5s@]k2u^+k5XT+ +s5rJDk2u^0joGG\joGG\k5PD>jpD(Mk5XT+s5rJDroX7\s5s@]$g.Khk2u^Dk2u^Dk5PAak5XTD +k5YGC!<;iV!<<&\!WV<Ts8M-\s81pYs8M-cs5s@Ds5rJDrT4+[roO4\rT4+[rT4+[mH4EJn)aWM +roO4\roO4\roO:^k2u[Cs5j=]jlQRCroO4\roO4\J`_OGJ`_pRrr@Q~> +MXCHErpBpimd:)C!<2Bf!:BjVmf*:7mJm7dmJm7dmJm7_mdL2VmcslQmf!4Xmf!4\mf!4?mJm7d +mJm7dmJm7dme["RmK<OX!:BjdmK3IW!:Kdc"RZ9X!!)uc%05ha!!)Ee!:Bgemd:)Smf*:dmJm7d +mJm7SmJm7cme-YCmJm7dmJm7dmf*:cmJm7dmed%bmf!4dmeQq_mf*:cmJm7`mJm7cmJm7cmem.a +mJm7cmJm7cmf*:dmf*:dmf*:cmJm7cmJm7cmJm7OmK<OX!:BjUmKN[ZmJu\C!;u9b!!_ikmJm7T +!<)<c!<)<c!:T=[!:K7Tmd:(PmJm7cmJm7cmJm7cmJm7amJm7cmJm7cmJm6<mXae]mf*9;~> +MWt0ArosXelKSB7!<26b!9sRRlMgk3l2Uh`l2Uh`l2Uh[lL4cRlK\HMlM^eTlM^eXlM^e;l2Uh` +l2Uh`l2Uh`lMCSNl3%+P!9sR`l2q%O!:'L_"R6!P!!)u_%05\Y!!)9a!9sOalKSBKlMgk`l2Uh` +l2UhOl2Uh_lLk5?l2Uh`l2Uh`lMgk_l2Uh`lMLV^lM^e`lM:M[lMgk_l2Uh\l2Uh_l2Uh_lMU_] +l2Uh_l2Uh_lMgk`lMgk`lMgk_l2Uh_l2Uh_l2UhKl3%+P!9sRQl377Rl2^,7!;u-^!!_]gl2UhL +!<)0_!<)0_!:T1W!:&hLlKSAHl2Uh_l2Uh_l2Uh_l2Uh]l2Uh_l2Uh_l2Ug8l@J5UlMgj7~> +MWOm=roO@ak2l[+!<2*^!9O:Nk5PG/joGG\joGG\joGGWk4&BNk3N'Ik5PDPk5PDTk5PD7joGG\ +joGG\joGG\k552Jjok_Hs5s@\jobYGs5s:["QoaHs8W&[%KGSQs8V6]s5s@]k2u^Ck5YJ\joGG\ +joGGKjoGG[k4\i;joGG\joGG\k5YJ[joGG\k5>5Zk5PD\k5,,Wk5YJ[joGGXjoGG[joGG[k5G>Y +joGG[joGG[k5YJ\k5YJ\k5YJ[joGG[joGG[joGGGjok_Hs5s@Mjp(kJk5XT+s8;$Zrs%Wck5YJD +s8D'[s8D'[s6o(Ss5rJDk2u]@joGG[joGG[joGG[joGGYjoGG[joGG[joGF4k(2ZMk5PF3~> +M=1?CrU'Xcr9aObn*^2Udd@)8rU'XcrU'Xcp?qn[rpKacrU'mjmJuYTmJu\K!;u6f!:BjT!;5a_ +!:BjT!;Z$c!:BjT!8?iQ!:K7Tmd:)C!:BgemJm7T!!)TX%fl%c!:K7TmJu\C!:Bgemem.cmK3IW +mK!7S!!*#drrE)e!W_WgrpKddrpBadrU'Xcp[/"]rU'XcrU'XcqX4=_j6cmIrU'XcrU'XcrpBad +rpKdds6fjd!q$'Vp&O=E"9@iimJuhG!!*#d!!*#d!W_WgrpKdds6fmerpBadl0\`Umd:)CmJu_D +"p"&kmJuYTrU0[c#OVT[!!)HT!<2Bd!<2Bd!:B1W!:BjT!2T#_!<2Ed!<;Ke!<2Bd!;Z$_!<2Ed +!<;Hg!:BjcmJm7cmJm7cmJm6<mXaemmf*9;~> +M<b'?rTX@_r9=7^n*9oQdcpf4rTX@_rTX@_p?MVWrp'I_rTXUfl2^)Ll2^,C!;u*b!9sRL!;5U[ +!9sRL!;Ym_!9sRL!8?]M!:&hLlKSB7!9sOal2UhL!!)TT%fkn[!:&hLl2^,7!9sOalMU__l2q%O +l2^hK!!*#`rrE)a!W_Kcrp'L`rosI`rTX@_pZ__YrTX@_rTX@_qWe%[j6?UErTX@_rTX@_rosI` +rp'L`s6BR`!pTdNp&O=A"9@]el2^D?!!*#`!!*#`!W_Kcrp'L`s6BUarosI`l08HQlKSB7l2^;< +"p!ogl2^)LrTaC_#O2<S!!)<L!<26`!<26`!:B%S!9sRL!2Sl[!<29`!<;?a!<26`!;Ym[!<29` +!<;<c!9sR_l2Uh_l2Uh_l2Ug8l@J5elMgj7~> +M<=d;rT4([r8mtZn)jWMdcLQ0rT4+[rT4+[p?)ASroX4[rT4@bk5XTDk5XT;s8;!^s5s@Ds7PLW +s5s@Ds7td[s5s@Ds4ZTIs5rJDk2u^+s5s@]k5YJDs8VZP&-(eSs5rJDk5XT+s5s@]k5G>[jobYG +k5YGC!<<&\s8W,]!rqE_roX7\roO4\rT4+[pZ;JUrT4+[rT4+[qW@eWj5p@ArT4+[rT4+[roO4\ +roX7\s5s=\!p9OFpAa@="TRWak5Y#7!<<&\!<<&\!rqE_roX7\s5s@]roO4\l/i3Mk2u^+k5Xo4 +#63ick5XTDrT=.[#Nl'Ks8V6Ds8M-\s8M-\s6\qOs5s@Ds.ncWs8M0\s8V6]s8M-\s7tdWs8M0\ +s8V3_s5s@[joGG[joGG[joGF4k(2Z]k5PF3~> +JaVdjrrBb#&ch>"mJuYTmJuYTmd:)CmJm7Tq>^N`qu?cc!<2Bj!:K7Tmd:)LmKN[ZmJu\C!;l0g +!:K7Tmd:)/mK<OX!:Bjdmf!1jmJm7TmJm7ZmJm7dmJm7dmJm7dmdgGXmf*:dmf*:dmJm7MmJm7d +mJm7dmJm7`mK<OX!:Bj3mK`g\mJu\C!:K:S!9`bW!:BjTmJu\C!:BjZmKN[ZmJu\C!<2Bo!:K7T +mJm7T!:K7Tl0\NOrpBadrpBadn*^/TrpBpimd:&Tmf!4dmKim]mJu\C!:K7TlgF`P!U]semf*:d +mf*:dmf*9nmL'$_mJuYT!:BjTmK!"L#lsD]!:Bgemd:)SmK*CV!<2Bd!<2Bd!.jQhm[!;@!.Y~> +Ja2LbrrBat&ch1sl2^)Ll2^)LlKSB7l2UhLq>^N\qu?c_!<26f!:&hLlKSBDl377Rl2^,7!;l$c +!:&hLlKSB'l3%+P!9sR`lM^bfl2UhLl2UhVl2Uh`l2Uh`l2Uh`lLP#TlMgk`lMgk`l2UhIl2Uh` +l2Uh`l2Uh\l3%+P!9sR/l3ICTl2^,7!:&kK!9`VS!9sRLl2^,7!9sRVl377Rl2^,7!<26k!:&hL +l2UhL!:&hLl086KrosI`rosI`n*9lProsXelKS?LlM^e`l3RIUl2^,7!:&hLlg"HL!U9[alMgk` +lMgk`lMgjjl3dUWl2^)L!9sRLl2^SD#ls8U!9sOalKSBKl2gtN!<26`!<26`!.jEdlB^`8!.Y~> +J`c4ZrrBap'*%+ok5XTDk5XTDk2u^+k5YJDqYpQXr;Qf[s8M-bs5rJDk2u^<jp(kJk5XT+s81p_ +s5rJDk2u]tjok_Hs5s@\k5PAbk5YJDk5YJRjoGG\joGG\joGG\k4AWPk5YJ\k5YJ\joGGEjoGG\ +joGG\joGGXjok_Hs5s@+jp;"Lk5XT+s5rJCs6&MOs5s@Dk5XT+s5s@Rjp(kJk5XT+s8M-gs5rJD +k5YJDs5rJDl/i!GroO4\roO4\n)jWLroOCak2u^Dk5PD\jpD(Mk5XT+s5rJDlfS3H!TsF]k5YJ\ +k5YJ\k5YIfjpV4Ok5XTDs5s@Dk5Y2<$30/Ms5s@]k2u^CjoYSFs8M-\s8M-\s+0<`k*G00!.Y~> +JaVdjrrBe$%05ha!:K7Tmd:)CmJm7dmJm7dmK!=UrVurdrW)udrr</h!:BjdmJm7dmJm7_mJm7d +mJm7dmJm7cmJm7dmJm7dmJm7@mf!4cmeQq_mf*:\mJm7cmK`g\mJuYTmd:)Rmem+dmJtf*"p")Z +!:K7TrU('omd:)C!!)HT!!)EerU'XcrU'Xcg?o=KmJuYTmd:)C!:BjMmJm7dmLK<c!:BjTmJu\C +!:BjTmK!4R"9@iimK!1Q#lsAnmJm7T!:BjOmJm7cmJm7cmJm7ZmcjfPmK<OX!:BjbmJm7cmJm7c +mJm7dme-Y\mf*:emf*:emf*9lmKim]!:BgemJuYTp$N1fmJuYT!:K7Tmd:)SmKN[ZmJu\C!.jQh +mZm5?!.Y~> +Ja2LbrrBdu%05\Y!:&hLlKSB7l2Uh`l2Uh`l2^nMrVur`rW)u`rr</d!9sR`l2Uh`l2Uh[l2Uh` +l2Uh`l2Uh_l2Uh`l2Uh`l2Uh<lM^e_lM:M[lMgkXl2Uh_l3ICTl2^)LlKSBJlMU\`l2]B""p!rR +!:&hLrTXdklKSB7!!)<L!!)9arTX@_rTX@_g?K%Gl2^)LlKSB7!9sRIl2Uh`l43m[!9sRLl2^,7 +!9sRLl2^eJ"9@]el2^bI#ls5jl2UhL!9sRKl2Uh_l2Uh_l2UhVlKSBLl3%+P!9sR^l2Uh_l2Uh_ +l2Uh`lLk5XlMgkalMgkalMgjhl3RIU!9sOal2^)Lp$)nbl2^)L!:&hLlKSBKl377Rl2^,7!.jEd +lBUZ7!.Y~> +J`c4ZrrBdq%KGSQs5rJDk2u^+k5YJ\joGG\joPMErr2u\rr<#\s8N2`s5s@\joGG\joGGWjoGG\ +joGG\joGG[joGG\joGG\joGG8k5PD[k5,,Wk5YJTjoGG[jp;"Lk5XTDk2u^Bk5G;\k5Wuo#63iJ +s5rJDrT4Ogk2u^+s8V6Ds8V6]rT4+[rT4+[g?&eCk5XTDk2u^+s5s@EjoGG\jq%LSs5s@Dk5XT+ +s5s@Dk5YDB"TRWak5YAA$30/fk5YJDs5s@GjoGG[joGG[joGGRk3E!Hjok_Hs5s@ZjoGG[joGG[ +joGG\k4\iTk5YJ]k5YJ]k5YIdjpD(Ms5s@]k5XTDp#ZY^k5XTDs5rJDk2u^Cjp(kJk5XT+s+0<` +k*>*/!.Y~> +JaVdjrrBh%!!*#d&-2+umJuYTmd:&Tmd:&TmdBuQ#4;KZ!!)HTrVuue!<)<c!<)<c!;l0a!<)<c +!<)<f!:K7TrU'XcrU'XcrU'XcrU'mjmJu\C!:BjcmJm7[md:)KmJm7cmJm7cmJm7]mK<OX!:Bj9 +mKN[Z!:BjT!<)?c!<;Ke!<;Ke!<;Ke!<;Hl!:BjT!:K7TqsFFarU'XcrU'Xcm-aiQs6^'kmd:)C +mJuM>$io\qmd:)CmJuYTmK!7S!!*#d!!*#d!<DQe!;c-_!<;Kd!6jm1!;u6e!:BjTrW)f_rW)f_ +!!*#d!!*#d!!)i_rW)rc!W_ZVqZ$]c!!'4jrW)udrW)QXrW)ud"9@iimK!1Q"9@iimJqh+JaScj +rr@Q~> +Ja2LbrrBh!!!*#`&-1tql2^)LlKS?LlKS?LlK\9I#3l3R!!)<LrVuua!<)0_!<)0_!;l$]!<)0_ +!<)0b!:&hLrTX@_rTX@_rTX@_rTXUfl2^,7!9sR_l2UhWlL"ZGl2Uh_l2Uh_l2UhYl3%+P!9sR5 +l377R!9sRL!<)3_!<;?a!<;?a!<;?a!<;<h!9sRL!:&hLqs".]rTX@_rTX@_m-=QMs69dglKSB7 +l2^)6$ioPmlKSB7l2^)Ll2^hK!!*#`!!*#`!<DEa!;c![!<;?`!6ja-!;u*a!9sRLrW)f[rW)f[ +!!*#`!!*#`!!)i[rW)r_!W_NNqZ$]_!!'4frW)u`rW)QTrW)u`"9@]el2^bI"9@]el2ZD#Ja/Kb +rr@Q~> +J`c4ZrrBgr!<<&\&HCnmk5XTDk2u^Dk2u^Dk2uUA#3PsJs8V6Drr3#]s8D'[s8D'[s81pYs8D'[ +s8D'^s5rJDrT4+[rT4+[rT4+[rT4@bk5XT+s5s@[joGGSk3i9CjoGG[joGG[joGGUjok_Hs5s@1 +jp(kJs5s@Ds8D*[s8V6]s8V6]s8V6]s8V3ds5s@Ds5rJDqrRnYrT4+[rT4+[m,n<Is5jOck2u^+ +k5X].%0,Jik2u^+k5XTDk5YGC!<<&\!<<&\!WV<]s8(mWs8V6\s30X)s8;!]s5s@Drr;iWrr;iW +!<<&\!<<&\!<;lWrr;u[!rqEFqu6`[s8T:brr<#\rr;TPrr<#\"TRWak5YAA"TRWak5U"pJ``3Z +rr@Q~> +JaVdjrrBk&!!)ucrrE&drrE#c!!*#do`5$[!!)uc!s%cW!<)<c!<)<c!93DH!<2Bk!:K7T!:K7T +rpBadnF$8Ur9jOana6AWrpBadrpBadp[/4cmd:)CmJt`(rW)rc!!*#drrE)err<Vu!:K7Tmd:&T +mJuYT!:K7Tq<e4_rpBadrpBadn*]lL!U]semJm7MmLfNf!:BjT!:K7Tmd:)C!:K7TmcOStmK<OX +!:Bjbmf!1imJuYTmdBcKrU'jimd:)CmK!(N"9@iimK!7S!s%`hme[!imdU8XmK!4RoDnaUrW%N; +JaS`irr@Q~> +Ja2LbrrBk"!!)u_rrE&`rrE#_!!*#`o`5$W!!)u_!s%WO!<)0_!<)0_!938D!<26g!:&hL!:&hL +rosI`nETuQr9F7]n`g)SrosI`rosI`pZ_q_lKSB7l2];urW)r_!!*#`rrE)arr<Vq!:&hLlKS?L +l2^)L!:&hLq<@q[rosI`rosI`n*9TH!U9[al2UhIl4O*^!9sRL!:&hLlKSB7!:&hLlK8/pl3%+P +!9sR^lM^bel2^)LlK\'CrTXRelKSB7l2^YF"9@]el2^hK!s%TdlMCRelL=iTl2^eJoDnaQrW%N7 +Ja/Harr@Q~> +J`c4ZrrBjs!<<#[s8W)\s8W&[!<<&\p&G'S!<<#["97NGs8D'[s8D'[s5N/@s8M-cs5rJDs5rJD +roO4\nE0`Mr9""Yn`BiOroO4\roO4\pZ;\[k2u^+k5Womrr;u[!<<&\s8W,]s8NYms5rJDk2u^D +k5XTDs5rJDq;q\WroO4\roO4\n)j?D!TsF]joGGEjq@^Vs5s@Ds5rJDk2u^+s5rJDk3)cljok_H +s5s@Zk5PAak5XTDk2uC;rT4=ak2u^+k5Y8>"TRWak5YGC"97N`k551ak4/HPk5YDBo`+dMrr7Q3 +J``0Yrr@Q~> +JaVdjrrB"crW)KV!!*#d!!*#d!!(sF%05ha!:K7T!:K7Tmd:)EmK<OX!:BjdmK<OX!:BjWmf*7p +mJu\C!:BjTmJuYTrpBadrpBadrpBadf^AD4s6]mfmf!1emK!+OrW!)h!:K7Tp[/4cmd:)CmJuP? +r;cfa#6=/lmd:)C!<)<c!:K:S!<2Bh!:BjT!<2Bh!:BjT!<2Ec!;c-_!<;Kd!7(!9!:K7TmdB]I +r9jOaq!J7bmJuYTq<eFemd:)CmK!7SrVurdr;`tfrW)udrW!8m!:BjT!:K7T!<2EN!.jQhm[*AA +!.Y~> +Ja2LbrrB"_rW)KR!!*#`!!*#`!!(sB%05\Y!:&hL!:&hLlKSB=l3%+P!9sR`l3%+P!9sRSlMghl +l2^,7!9sRLl2^)LrosI`rosI`rosI`f]r,0s69UblM^bal2^\GrW!)d!:&hLpZ_q_lKSB7l2^,7 +r;cf]#6=#hlKSB7!<)0_!:K.O!<26d!9sRL!<26d!9sRL!<29_!;c![!<;?`!7'j5!:&hLlK\!A +r9F7]q!%t^l2^)Lq<A.alKSB7l2^hKrVur`r;`tbrW)u`rW!8i!9sRL!:&hL!<29J!.jEdlBgf9 +!.Y~> +J`c4ZrrB"[rr;NN!<<&\!<<&\!<;!>%KGSQs5rJDs5rJDk2u^5jok_Hs5s@\jok_Hs5s@Ok5YGh +k5XT+s5s@Dk5XTDroO4\roO4\roO4\f]Ml,s5j@^k5PA]k5Y;?rr3,`s5rJDpZ;\[k2u^+k5X`/ +rVuiY#QNrdk2u^+s8D'[s6f%Ks8M-`s5s@Ds8M-`s5s@Ds8M0[s8(mWs8V6\s3Ba1s5rJDk2u=9 +r9""YpuV_Zk5XTDq;qn]k2u^+k5YGCrr2u\rVs"^rr<#\rr3;es5s@Ds5rJDs8M0Fs+0<`k*P61 +!.Y~> +JaVdjrrB%d"9@iimJueF"p")Z!:K7ThsULE#OVT[!!)Eemf!4UmLB6bmJu\C!:BjTmJu\C!:fLS +!!VcjmJuYTrpBadrU'XcrU'XceaED:r9aXemJu\R!;Q!\!!2Kfp$Mq_mJuYTlL"cTmJuYTqX+=` +rpBadrpBadna>uKr9jOarpBmhmJuYTr9ajkmJuYT!:BjT!7:-6!<2Bd!<2Bd!<2Ec!!2KfrpBad +rpBmhmJuYTq!S+]q<e4_rpBgfmdBTFZL/;)mJuYT!:BjT!:BjT!!)HT!<2Ed!!VcjmJu\CrW)f_ +rW%N;JaS`irr@Q~> +Ja2LbrrB%`"9@]el2^A>"p!rR!:&hLhs14A#O2<S!!)9alM^eQl4*gZl2^,7!9sRLl2^,7!:f@O +!!VWfl2^)LrosI`rTX@_rTX@_ea!,6r9=@al2^,J!;PjX!!2?bp$)Y[l2^)LlKSKPl2^)LqW\%\ +rosI`rosI`n`o]Gr9F7]rosUdl2^)Lr9=Rgl2^)L!9sRL!7:!2!<26`!<26`!<29_!!2?brosI` +rosUdl2^)Lq!.hYq<@q[rosOblK[m>ZK`#%l2^)L!9sRL!9sRL!!)<L!<29`!!VWfl2^,7rW)f[ +rW%N7Ja/Harr@Q~> +J`c4ZrrB%\"TRWak5Xu6#63iJs5rJDhrat=#Nl'Ks8V6]k5PDMjpqFRk5XT+s5s@Dk5XT+s7,7K +rrqQbk5XTDroO4\rT4+[rT4+[e`Ql2r8n+]k5XTBs7kaTrrM9^p#ZDWk5XTDlK/6Lk5XTDqW7eX +roO4\roO4\n`KHCr9""YroO@`k5XTDr8n=ck5XTDs5s@Ds3Tm.s8M-\s8M-\s8M0[rrM9^roO4\ +roO@`k5XTDpu_SUq;q\WroO:^k2u46ZK;c!k5XTDs5s@Ds5s@Ds8V6Ds8M0\rrqQbk5XT+rr;iW +rr7Q3J``0Yrr@Q~> +JaVdjrrCC5!!)uc!!)uc!!)f^%05ha!:BjTmJuYTmd:)SmKim]mJm7T!:K7TrU'Xcq<e@cmJuYT +qX+=`rU'XcrU'Xcn*^&Qs6fjdnEp8VrpBadrpBadrpBadrpBadna?;T"RZ6imJukH!!)uc!!)uc +!!(sF"9@iimK!1Qp&G*\p&OdRrW)6O"p")Z!:K7TqX+Ofmd:)CmJuVAlMq(U!:K7TrpC-omd:)C +!!)Eemd:)'mJm7cmJm7cmKWa[!:BjT!!)uc#QX8mmd:)CmK!4Rp&P*[!!)uc!!)uc!<DQe!!)Hc +!3bf6!:K7TmJm7T!:K7TmJuYTmJm7TmJm7TmJu\C!!)EemK!1Q"9@iimJqh+JaScjrr@Q~> +Ja2LbrrCC1!!)u_!!)u_!!)fZ%05\Y!9sRLl2^)LlKSBKl3RIUl2UhL!:&hLrTX@_q<A(_l2^)L +qW\%\rTX@_rTX@_n*9cMs6BR`nEKuRrosI`rosI`rosI`rosI`n`p#P"R5sel2^G@!!)u_!!)u_ +!!(sB"9@]el2^bIp&G*Xp&OdNrW)6K"p!rR!:&hLqW\7blKSB7l2^29lMq(Q!:&hLrosjklKSB7 +!!)9alKSAtl2Uh_l2Uh_l3@=S!9sRL!!)u_#QX,ilKSB7l2^eJp&P*W!!)u_!!)u_!<DEa!!)<_ +!3bZ2!:&hLl2UhL!:&hLl2^)Ll2UhLl2UhLl2^,7!!)9al2^bI"9@]el2ZD#Ja/Kbrr@Q~> +J`c4ZrrCC-!<<#[!<<#[!<;iV%KGSQs5s@Dk5XTDk2u^CjpD(Mk5YJDs5rJDrT4+[q;qh[k5XTD +qW7eXrT4+[rT4+[n)jNIs5s=\nE'`NroO4\roO4\roO4\roO4\n`KcL"Qoaak5Y&8!<<#[!<<#[ +!<;!>"TRWak5YAApAY-TpAagJrr;9G#63iJs5rJDqW8"^k2u^+k5Xf1li.+Ms5rJDroOUgk2u^+ +s8V6]k2u]ljoGG[joGG[jp1qKs5s@Ds8W&[#lj&ek2u^+k5YDBpAb-S!<<#[!<<#[!WV<]rrD3[ +s0(Q.s5rJDk5YJDs5rJDk5XTDk5YJDk5YJDk5XT+s8V6]k5YAA"TRWak5U"pJ``3Zrr@Q~> +JaVdjrr<)f!<)<c!<)<c!8?i@!<2Bd!<2Bd!;>gg!:K7T!:K7T!:K7TrpBadrpBsjmJuYTmK!7S +!!)c]rW)`]!!*#d!!*#d!!)QWmf<%K!!)uc#QX;\!:BjTmK!4R!!)`\p&G-]!:fIW!<2Bd!<2Bd +!9W\L!<)?c!<;Ke!!)H[!;c-W!;l3X!:T=U!<2Bd!<2Bd!;c*d!:BjT!:9+V!:BjT!<2Ec!;u9a +!!2KfrpBadrpBgfmK!7SrrE)errE&d!!(+."p")Z!:K7Tr9aObrpBadrpBadqX4=_n*U8XmJu\P +!3tql!<2Ed!<;Ke!<2Be!:Kgd"RZ9X!!*#d#lsD]!!)Eemd:)SmKN[ZmJu\C!.jQhmZm5?!.Y~> +Ja2Lbrr<)b!<)0_!<)0_!8?]<!<26`!<26`!;>[c!:&hL!:&hL!:&hLrosI`ros[fl2^)Ll2^hK +!!)cYrW)`Y!!*#`!!*#`!!)QSmf<%G!!)u_#QX/T!9sRLl2^eJ!!)`Xp&G-Y!:f=S!<26`!<26` +!9WPH!<)3_!<;?a!!)<W!;c!S!;l'T!:T1Q!<26`!<26`!;bs`!9sRL!:8tR!9sRL!<29_!;u-] +!!2?brosI`rosObl2^hKrrE)arrE&`!!(+*"p!rR!:&hLr9=7^rosI`rosI`qWe%[n*0uTl2^,H +!3teh!<29`!<;?a!<26a!:'O`"R6!P!!*#`#ls8U!!)9alKSBKl377Rl2^,7!.jEdlBUZ7!.Y~> +J`c4Zrr<)^s8D'[s8D'[s4ZT8s8M-\s8M-\s7YR_s5rJDs5rJDs5rJDroO4\roOFbk5XTDk5YGC +!<;fUrr;cU!<<&\!<<&\!<;TOn,N(C!<<#[#lj&Ls5s@Dk5YDB!<;cTpAY0Us7,4Os8M-\s8M-\ +s5rGDs8D*[s8V6]rrD3Ss8(mOs81sPs6o(Ms8M-\s8M-\s8(j\s5s@Ds6SkNs5s@Ds8M0[s8;$Y +rrM9^roO4\roO:^k5YGCs8W,]s8W)\!<:.?iJs5rJDr8n"ZroO4\roO4\qW@eWn)a`Pk5XT@ +s0:\ds8M0\s8V6]s8M-]s5s=\"QoaHs8W)\$30/Ms8V6]k2u^Cjp(kJk5XT+s+0<`k*>*/!.Y~> +JaVdjrrE)e!!*#d!!*#d!!([>"p")Z!:K7To^3"cmd:)CmJu\C!<2Bd!<)<l!:K7TmJm7TmK!+O +p&P!X"p")Z!:K7Tm-aTJs6]jeddHo2n*UA[md:)CmK!(N!!)uc!!)uc!!)c]!!*#d!!*#d!!*#d +!!*#dr;Zrf!:Bj`mK!=Ur;cHWrW)<Q!!)uc!!)uc!!)l`rW)<Q$io_`!:K7TmJuYTmK!7S"9@ii +mK!4R!!)uc!!)uc!!)uc!!)uc!!(10!!*#d!!*#d!!*#d!!)uc!!)uc!!)rb"9@iimJueF!W_ZV +qZ$]c!!'@n!!)uc!!)uc!<DQ]!<)<i!:BjTmJm7dmK*CV!<2Bd!<2Bd!.jQhm[!;@!.Y~> +Ja2LbrrE)a!!*#`!!*#`!!([:"p!rR!:&hLo]c__lKSB7l2^,7!<26`!<)0h!:&hLl2UhLl2^\G +p&P!T"p!rR!:&hLm-=<Fs69Radd$W.n*1)WlKSB7l2^YF!!)u_!!)u_!!)cY!!*#`!!*#`!!*#` +!!*#`r;Zrb!9sR\l2^nMr;cHSrW)<M!!)u_!!)u_!!)l\rW)<M$ioSX!:&hLl2^)Ll2^hK"9@]e +l2^eJ!!)u_!!)u_!!)u_!!)u_!!(1,!!*#`!!*#`!!*#`!!)u_!!)u_!!)r^"9@]el2^A>!W_NN +qZ$]_!!'@j!!)u_!!)u_!<DEY!<)0e!9sRLl2Uh`l2gtN!<26`!<26`!.jEdlB^`8!.Y~> +J`c4ZrrE)]!<<&\!<<&\!<:^6#63iJs5rJDo]?J[k2u^+k5XT+s8M-\s8D'ds5rJDk5YJDk5Y;? +pAb$P#63iJs5rJDm,n'Bs5j=]dcUB*n)aiSk2u^+k5Y8>!<<#[!<<#[!<;fU!<<&\!<<&\!<<&\ +!<<&\rVlu^s5s@XjoPMErVuKOrr;?I!<<#[!<<#[!<;oXrr;?I%0,JPs5rJDk5XTDk5YGC"TRWa +k5YDB!<<#[!<<#[!<<#[!<<#[!<:4(!<<&\!<<&\!<<&\!<<#[!<<#[!<;uZ"TRWak5Xu6!rqEF +qu6`[s8TFf!<<#[!<<#[!WV<Us8D'as5s@Dk5YJ\joYSFs8M-\s8M-\s+0<`k*G00!.Y~> +JaVdjrrE&d"p")Z!:K7Tf'WY@mJuYTo'QMYmem+dmK!.P!!)uc!s%`hmem.amJm7amf!4[mK<OX +!:BjRmK!=UqZ$ce!:BgeddH`-o'QV\mJuYTp[/"]rpBadrpBadp$N%bmJm7TmJm7cmK3IW!:Kgd +"RZ9XmK!1Q"9@lX!:Kgdp$Mq_mJuYThsU1<na6AWrpBadrpC6rmd:)CmJuYTmd:)CmJsT]!!)uc +!!)uc!!)NV"p")Z!:K7ToBlSYrpKdds6fmes6fmeV=+$Ws6]jerU'XcrU'XcrU'XcrU'XcJaS*W +QgXkRJ,~> +Ja2LbrrE&`"p!rR!:&hLf'3A<l2^)Lo'-5UlMU\`l2^_H!!)u_!s%TdlMU_]l2Uh]lM^eWl3%+P +!9sRNl2^nMqZ$ca!9sOadd$H)o'->Xl2^)LpZ__YrosI`rosI`p$)b^l2UhLl2Uh_l2q%O!:'O` +"R6!Pl2^bI"9@`P!:'O`p$)Y[l2^)Lhs0n8n`g)SrosI`rossnlKSB7l2^)LlKSB7l2\0U!!)u_ +!!)u_!!)NR"p!rR!:&hLoBH;Urp'L`s6BUas6BUaV<[aSs69RarTX@_rTX@_rTX@_rTX@_Ja.gO +Qg4SNJ,~> +J`c4ZrrE&\#63iJs5rJDf&d,8k5XTDo&]uQk5G;\k5Y>@!<<#["97N`k5G>YjoGGYk5PDSjok_H +s5s@JjoPMEqu6f]s5s@]dcU3%o&^)Tk5XTDpZ;JUroO4\roO4\p#ZMZk5YJDk5YJ[jobYGs5s=\ +"QoaHk5YAA"TRWHs5s=\p#ZDWk5XTDhraY4n`BiOroO4\roO^jk2u^+k5XTDk2u^+k5VdM!<<#[ +!<<#[!<;QN#63iJs5rJDoB$&QroX7\s5s@]s5s@]V<7LOs5j=]rT4+[rT4+[rT4+[rT4+[J`_OG +Qfe;JJ,~> +JaVdjrrE#c"9@iimJtc)rW)HUqZ-H[!!*#d!W_ZVrVuue!<2Bd!;l0e!:BjT!;>j[!:9.F!7U?= +!:K7Tmed(Pmf!4ZmKN[ZmJu\C!;#U]!:BjT!;c*g!:K7Tmd:&TrpBadrpC'mmd:&TmJuYT!;Gmc +!:K7Tmd:)2mem+dmK!4R!!)][!!)uc#6=2[!:BjT!<2Bd!<2Bd!<2Bd!1E6T!<2Bd!<2Bd!;5a[ +!<2Ed!<2Ed!<2Ed!2f/d!:BjTrW%N;JaS*Wr9jRbJ,~> +Ja2LbrrE#_"9@]el2]?!rW)HQqZ-HW!!*#`!W_NNrVuua!<26`!;l$a!9sRL!;>^W!:9"B!7U39 +!:&hLlMLYLlM^eVl377Rl2^,7!;#IY!9sRL!;bsc!:&hLlKS?LrosI`rosdilKS?Ll2^)L!;Ga_ +!:&hLlKSB*lMU\`l2^eJ!!)]W!!)u_#6=&S!9sRL!<26`!<26`!<26`!1E*P!<26`!<26`!;5UW +!<29`!<29`!<29`!2f#`!9sRLrW%N7Ja.gOr9F:^J,~> +J`c4ZrrE#["TRWak5Wrnrr;KMqu?KS!<<&\!rqEFrr3#]s8M-\s81p]s5s@Ds7YUSs6Sn>s3p*5 +s5rJDk5>8Hk5PDRjp(kJk5XT+s7>@Us5s@Ds8(j_s5rJDk2u^DroO4\roOOek2u^Dk5XTDs7bX[ +s5rJDk2u^"k5G;\k5YDB!<;`S!<<#[#QNrKs5s@Ds8M-\s8M-\s8M-\s-`!Ls8M-\s8M-\s7PLS +s8M0\s8M0\s8M0\s/+o\s5s@Drr7Q3J`_OGr9""ZJ,~> +JaVdjrrE#cr;Zld!86f6!;Q!R!;u6c!:KL[qsFXgmd:)CmK!.Pp&OXN!!*#dqu?`brW)ud!!(R; +!!*#drr<&erVuue!;5a]!:K:K!;Psb!:BjT!:fLV!;c*d!:K7T!<2Bd!<)<p!:BjTmJuYTmJu\C +!!)i_!!*#d!!*#d!!(mDrW!#f!!*#d!!)ES!!)uc#QX;\!:BjTmK!4R!!&MV!!)uc!!)uc!!%uG +#QX;\!!)EemJqh+JaS*WrU0[cJ,~> +Ja2LbrrE#_r;Zl`!86Z2!;PjN!;u*_!:'4Wqs"@clKSB7l2^_Hp&OXJ!!*#`qu?`^rW)u`!!(R7 +!!*#`rr<&arVuua!;5UY!:&kC!;Pg^!9sRL!:f@R!;bs`!:&hL!<26`!<)0l!9sRLl2^)Ll2^,7 +!!)i[!!*#`!!*#`!!(m@rW!#b!!*#`!!)EO!!)u_#QX/T!9sRLl2^eJ!!&MR!!)u_!!)u_!!%uC +#QX/T!!)9al2ZD#Ja.gOrTaC_J,~> +J`c4Z!<E/uk5G;\k5X,spAapMoDeaN!WV<Ts81p_s5rJDk2u^@k4\iFjoGG\k5>5Zk5PD\joGG3 +joGG\k5YG]k5PA]k5Y,:!rqEFpAapM"TRWak5Xu6rr;iW"TRWHs8W)\!<<#[%KGSjk2u^+s5s@D +k5YJWjoGG\joGG\joGG<k5PA^k5YJ\joGGKjoGG[jp;"Lk5XTDk2u^BjoGFNjoGG[joGG[joGF? +jp;"Lk5YJDs5s?4k(2ZGk5FHB!.Y~> +JaVdjo)RD1rW)HUqZ-BY!s%`hmem+fmJuYTqsFFarpBadrpBadq!S+]md:&TrU0:XfBrV=rU'pk +mJm7T!!)Eep$Me[rpBdemf!4Xmf!4Yme-Y\mJm7cmJm7cmJm7`mJm7cmJm7cmJm7amJm7cmJm7c +mJm7FmKim]mJu\C!:K7TJaS*Wo^2\ZrpBsjmd:&TmJqh+JaS*WrpKddJ,~> +Ja2Lbo)RD-rW)HQqZ-BU!s%TdlMU\bl2^)Lqs".]rosI`rosI`q!.hYmcjcPrTa"TfBN>9rTXXg +l2UhL!!)9ap$)MWrosLalM^eTlM^eUlLk5Xl2Uh_l2Uh_l2Uh\l2Uh_l2Uh_l2Uh]l2Uh_l2Uh_ +l2UhBl3RIUl2^,7!:&hLJa.gOo]cDVros[flKS?Ll2ZD#Ja.gOrp'L`J,~> +J`c4ZrrD`lfB3)4nE0WJpZ;SXk5XTBrr_E`k5Y>@!<<&\!<<&\!<;iVrr;EK!<<#[o`*P*!<<#[ +#lj&es5s@]k5Y,:!<<&\!WV<]s7>CPs7GIIs8V3]s8D'[s8D'[s8(jXs8D'[s8D'[s81pYs8D'[ +s8D'[s5<#Gs5rJDk2u^+k5U"pJ`cUe!<<&\#63iJs8V6]J`_OGJ`csorr@Q~> +JaVdjrr</h!:K:R!7^E>!:BjT!:oOY!:Kdc!U]s^mem+emJu\S!;l0a!<)<c!<)<c!;c*d!:BjT +!:0(Q!!DWh!:KdccgD,?mJuYTmJuYTmJuqJ#QX;\!!)EemK!%Mp&OaQrW'(g!!*#drr<&erW%N; +JaW0u!!*#drrE)e"9@iimJqh+JaS*Ws6fmeJ,~> +Ja2Lbrr</d!:&kJ!7^9:!9sRL!:oCU!:'L_!U9[ZlMU\al2^,K!;l$]!<)0_!<)0_!;bs`!9sRL +!:/qM!!DKd!:'L_cfti;l2^)Ll2^)Ll2^MB#QX/T!!)9al2^VEp&OaMrW'(c!!*#`rr<&arW%N7 +Ja2mm!!*#`rrE)a"9@]el2ZD#Ja.gOs6BUaJ,~> +J`c4Zrr</`s5rJBs4$06s5s@Ds75:Qs5s:[!TsFVk5G;]k5XTCs81pYs8D'[s8D'[s8(j\s5s@D +s6JhIrr_E`s5s:[cfPT7k5XTDk5XTDk5Y,:#lj&Ls8V6]k5Y5=pAadIrr9+_!<<&\s8N)]rr7Q3 +J`cUe!<<&\s8W,]"TRWak5U"pJ`_OGs5s=]J,~> +JaVdjrrE)e"p"&kmJuYTf'W_Bmd:)CmJunI#lsD]!:K7Tmd:)QmdC/DmKN[ZmJu\C!:B4S!<;Ke +!!)Hd!!2KfdI%DCmJu\C!:BjTmJuYTp$N(cmJuYT!:K7Tp$VeZna6M[mJuYTYO2AjrU'[dmem-: +mXafrmJm7cmJm7cmJm6<mXaeWmK2eV!.Y~> +Ja2LbrrE)a"p!ogl2^)Lf'3G>lKSB7l2^JA#ls8U!:&hLlKSBIlL+`@l377Rl2^,7!:B(O!<;?a +!!)<`!!2?bdHV,?l2^,7!9sRLl2^)Lp$)e_l2^)L!:&hLp$2MVn`g5Wl2^)LYNc)frTXC`lMU^6 +l@J6jl2Uh_l2Uh_l2Ug8l@J5Ol2p5N!.Y~> +J`c4ZrrE)]#63ick5XTDf&d2:k2u^+k5Y)9$30/Ms5rJDk2u^Ak3r?<jp(kJk5XT+s6\tKs8V6] +rrD3\rrM9^dH1l;k5XT+s5s@Dk5XTDp#ZP[k5XTDs5rJDp#c8Rn`BuSk5XTDYN>ibrT4.\k5G=2 +k(2[bjoGG[joGG[joGF4k(2ZGjoXZF!.Y~> +JaVdjrrE&dr;clc!!([>!!*#d!!*#d!!)`\$NTV_!!)HT!!)HT!;Z'^!<;Hf!:Kgdlg=`QrpBad +rpBadn*^2UrpKacs6fme!U]rtmf!1emK!7S!!)c]"9@iimJukH"p")Z!:K7TXmYl_JaS*WJaS*W +JaVairr@Q~> +Ja2LbrrE&`r;cl_!!([:!!*#`!!*#`!!)`X$NTJW!!)<L!!)<L!;YpZ!<;<b!:'O`lfnHMrosI` +rosI`n*9oQrp'I_s6BUa!U9ZplM^bal2^hK!!)cY"9@]el2^G@"p!rR!:&hLXm5T[Ja.gOJa.gO +Ja2Iarr@Q~> +J`c4ZrrE&\rVuo[!<:^6!<<&\!<<&\!<;cT$ifAOs8V6Ds8V6Ds7tgVs8V3^s5s=\lfJ3IroO4\ +roO4\n)jZMroX4[s5s@]!TsElk5PA]k5YGC!<;fU"TRWak5Y&8#63iJs5rJDXlf?WJ`_OGJ`_OG +J`c1Yrr@Q~> +JaVdjoDmV5!!)uc!!)uc!!)f^%05ha!:BjTmJuYTmd:)Pmf!1lmJuYT!:BjT!:B1S!<)<c!<)<c +!:&tP!<2Bd!<2Bd!57go!<;He!;Z$e!:K7Tmd:)SmJm7cmJm7dmf*:emJm7dmJm6emf!3;mXaeW +mXaeWmc<g9!.Y~> +Ja2LboDmV1!!)u_!!)u_!!)fZ%05\Y!9sRLl2^)LlKSBHlM^bhl2^)L!9sRL!:B%O!<)0_!<)0_ +!:&hL!<26`!<26`!57[k!<;<a!;Yma!:&hLlKSBKl2Uh_l2Uh`lMgkal2Uh`l2UgalM^d7l@J5O +l@J5OlK%71!.Y~> +J`c4Z!!)]lg?&D8rT4+[rT4+[puW%ck2u^+s5rJDk5XT+s81sXrs7cek5YJDs5s@KjoGG[joGG[ +joGGHjoGG\joGG\joGFpk4\iTjoGGWjp(kJk5XT+s8M-\s8D'[s8M0\s8V3]s8M-\s/P5\s+0<` +k(2ZGk(2[Uk5PF3~> +JaVdjrr<,g!:KdcrU'Xc[-eA'md:)CmJm7TmJu\C!6sp3!<)<c!<)<c!4qUt!;#UY!<2Bd!<2Bd +!<2Bd!<2Bh!:K7T!<2Bd!<)<c!3GSk!:BjT!9!8F!<)<c!<)<c!.jQhmXaeWmZHr;!.Y~> +Ja2Lbrr<,c!:'L_rTX@_[-A)#lKSB7l2UhLl2^,7!6sd/!<)0_!<)0_!4qIp!;#IU!<26`!<26` +!<26`!<26d!:&hL!<26`!<)0_!3GGg!9sRL!9!,B!<)0_!<)0_!.jEdl@J5OlB1B3!.Y~> +J`c4Zrr<,_s5s:[rT4+[[,qhtk2u^+k5YJDk5XT+s39[+s8D'[s8D'[s17@ls7>@Qs8M-\s8M-\ +s8M-\s8M-`s5rJDs8M-\s8D'[s/b>cs5s@Ds5<#>s8D'[s8D'[s+0<`k(2ZGk)ng+!.Y~> +JaVdjrrE)e"9@iimJsKZ!!*#d#6=2[!!)HT!<2Bd!.jS:mK<OX!:Bj[mJm7cmJm7cmJm7dmKN[Z +mJu\C!2Jrd!:K7Tmd:)5mJm7dmJm7dmJm6<mXaeWmXaefmf*9;~> +Ja2LbrrE)a"9@]el2\'R!!*#`#6=&S!!)<L!<26`!.jG6l3%+P!9sRWl2Uh_l2Uh_l2Uh`l377R +l2^,7!2Jf`!:&hLlKSB-l2Uh`l2Uh`l2Ug8l@J5Ol@J5^lMgj7~> +J`c4ZrrE)]"TRWak5V[J!<<&\#QNrKs8V6Ds8M-\s+0>2jok_Hs5s@SjoGG[joGG[joGG\jp(kJ +k5XT+s.e]\s5rJDk2u^%joGG\joGG\joGF4k(2ZGk(2ZVk5PF3~> +JaVdjrr<;l!:K7Tmd:(\mJm7cmKWa[!:K7TmK!4R!!(41!!)uc!!)uc!!'h&"p")Z!:K7TkO&HQ +mJuYTU[A*^rpBadrpBadi9gdLmd:)CmJqh+JaS*WJaSTerr@Q~> +Ja2Lbrr<;h!:&hLlKSATl2Uh_l3@=S!:&hLl2^eJ!!(4-!!)u_!!)u_!!'h""p!rR!:&hLkNW0M +l2^)LUZqgZrosI`rosI`i9CLHlKSB7l2ZD#Ja.gOJa/<]rr@Q~> +J`c4Zrr<;ds5rJDk2u]LjoGG[jp1qKs5rJDk5YDB!<:7)!<<#[!<<#[!<9js#63iJs5rJDkN2pI +k5XTDUZMRVroO4\roO4\i8t7Dk2u^+k5U"pJ`_OGJ``$Urr@Q~> +JaVdjrW)rc!!*#d!!'%e!!)uc!!)uc!!(72!!*#d!!*#d!!'h&!!*#d!!*#d!!)3MrW&_]!!)uc +!!)uc!!(sF"9@iimJqh+JaS*WJaSQdrr@Q~> +Ja2LbrW)r_!!*#`!!'%a!!)u_!!)u_!!(7.!!*#`!!*#`!!'h"!!*#`!!*#`!!)3IrW&_Y!!)u_ +!!)u_!!(sB"9@]el2ZD#Ja.gOJa/9\rr@Q~> +J`c4Zrr<'!roO4\roO4\Woa<]rT4+[rT4+[biSp*roO4\roO4\^ubXsroO4\roO4\kN;dDUZMRV +rT4+[rT4+[i8t1Bk5XTDJ`_OGJ`_OGNop?AJ,~> +JaVdjrrE#c!!)uc!!'%e!!*#d!!*#d!!(10#6=/l!:K7T!<)<c!64F,!<)<c!<)<c!:9.I!.jS7 +mf!3;mXaeWmXaecmf*9;~> +Ja2LbrrE#_!!)u_!!'%a!!*#`!!*#`!!(1,#6=#h!:&hL!<)0_!64:(!<)0_!<)0_!:9"E!.jG3 +lM^d7l@J5Ol@J5[lMgj7~> +J`c4Z!<E/ujoGG[joGF]joGG\joGG\joGG(jp1qKs8V6Ds8W&[!<:($!<<#[!<<#[!<;EJpA]^+ +qW@eWJ`_OGJ`_OGNTU6@J,~> +JaVdjrrA\Z"p")Z!:K7TaR064mJuYTmK!7S!!'\"!!)uc!!)uc!!)QWrW%N;qX4%WJaS*WJaS*W +Om`5LJ,~> +Ja2LbrrA\V"p!rR!:&hLaQ`s0l2^)Ll2^hK!!'[s!!)u_!!)u_!!)QSrW%N7qWdbSJa.gOJa.gO +Om;rHJ,~> +J`c4ZrrA\R#63iJs5rJDaQ<^,k5XTDk5YGC!<9^o!<<#[!<<#[!<;TOrr7Q3qW@MOJ`_OGJ`_OG +OllZDJ,~> +JaVdjrrAYY"9@iimJt8prW)ud!s%cW!6=L-!<)<c!<)<f!:K7TrpBadrpBadna6M[mJuYTJaW:# +rW%N;JaS*WJaSNcrr@Q~> +Ja2LbrrAYU"9@]el2\ihrW)u`!s%WO!6=@)!<)0_!<)0b!:&hLrosI`rosI`n`g5Wl2^)LJa3!p +rW%N7Ja.gOJa/6[rr@Q~> +J`c4ZrrAYQ"TRWak5WH`rr<#\"97NGs2X7%s8D'[s8D'^s5rJDroO4\roO4\n`BuSk5XTDJ`c^h +rr7Q3J`_OGJ`_sSrr@Q~> +JaVdjrrAVXrW((.o`2u!!!*#d!!*#d!!)uc"p")Z!:K7Tna6S]md:)CmJqh+q<e@cmJuYTK^Jg? +rU'XcrU'XcJaS*WJaSilrr@Q~> +Ja2LbrrAVTrW((*o`2tr!!*#`!!*#`!!)u_"p!rR!:&hLn`g;YlKSB7l2ZD#q<A(_l2^)LK^&O; +rTX@_rTX@_Ja.gOJa/Qdrr@Q~> +J`c4ZrrAVPrr:+&p&E"n!<<&\!<<&\!<<#[#63iJs5rJDn`C&Uk2u^+k5U"pq;qh[k5XTDK]W:7 +rT4+[rT4+[J`_OGJ``9\rr@Q~> +JaVdjrrAb\p&N5&rVurdrW'k("p")Z!:K7TqsFRemJuYTna6AWrpBadrpBadJaWF'"p")Z!:K7T +K^Jg?rpBadrpBadJaS*WJaSfkrr@Q~> +Ja2LbrrAbXp&N5"rVur`rW'k$"p!rR!:&hLqs":al2^)Ln`g)SrosI`rosI`Ja3-t"p!rR!:&hL +K^&O;rosI`rosI`Ja.gOJa/Ncrr@Q~> +J`c4ZrrAbTpA`7srr2u\rr9mu#63iJs5rJDqrS%]k5XTDn`BiOroO4\roO4\J`cjl#63iJs5rJD +K]W:7roO4\roO4\J`_OGJ``6[rr@Q~> +JaVdjrrAVXrW't+o`3#""9@iimK!(NrW)KV!!)uc!!)uc!!&na!!)uc!!)uc!!)'I!!*#d!!*#d +!!(10!!)uc!!)uc!!(%,"p")Z!:K7TJaS*WJaScjrr@Q~> +Ja2LbrrAVTrW't'o`3"s"9@]el2^YFrW)KR!!)u_!!)u_!!&n]!!)u_!!)u_!!)'E!!*#`!!*#` +!!(1,!!)u_!!)u_!!(%("p!rR!:&hLJa.gOJa/Kbrr@Q~> +J`c4ZrrAVPrr:"#p&E%o"TRWak5Y8>rr;NN!<<#[!<<#[!<8qY!<<#[!<<#[!<;*A!<<&\!<<&\ +!<:4(!<<#[!<<#[!<:($#63iJs5rJDJ`_OGJ``3Zrr@Q~> +JaVdjrrAYY"9@iimJt>r"T[uY!:K:S!5\+&!;u9Y!06II!<2Bd!<2Bd!9<JI!<)<c!<)<c!;l0a +!<)<c!<)<c!8HoA!<2Bd!<2Bd!6":.!:BjT!.jQhmXaeimf*9;~> +Ja2LbrrAYU"9@]el2\oj"T[iQ!:&kK!5[t"!;u-U!06=E!<26`!<26`!9<>E!<)0_!<)0_!;l$] +!<)0_!<)0_!8Hc=!<26`!<26`!6".*!9sRL!.jEdl@J5alMgj7~> +J`c4ZrrAYQ"TRWak5WNb"om`Is5rJCs2!jss8;$Qs,Q4As8M-\s8M-\s5W5As8D'[s8D'[s81pY +s8D'[s8D'[s4cZ9s8M-\s8M-\s2=%&s5s@Ds+0<`k(2ZYk5PF3~> +JaVdjrrA\Z"p")Z!:K7Tb3f60rpBsjmJuYTmJt8pp&G-]!<2Eb!<)<c!<)<c!4_Fs!<)<c!<)<c +!9ihT!:K7Tmd:)%mJm7dmJm7dmJm7?mKN[ZmJu\C!5e1'!.jQhmXaehmf*9;~> +Ja2LbrrA\V"p!rR!:&hLb3As,ros[fl2^)Ll2\ihp&G-Y!<29^!<)0_!<)0_!4_:o!<)0_!<)0_ +!9i\P!:&hLlKSArl2Uh`l2Uh`l2Uh;l377Rl2^,7!5e%#!.jEdl@J5`lMgj7~> +J`c4ZrrA\R#63iJs5rJDb2r^(roOFbk5XTDk5WH`pAY0Us8M0Zs8D'[s8D'[s1%1ks8D'[s8D'[ +s6/SLs5rJDk2u]jjoGG\joGG\joGG7jp(kJk5XT+s2*pts+0<`k(2ZXk5PF3~> +JaVdjrrA_[!!*#d!!*#d!!(72!!)ucrrE)err<)f!6"='!<2Bd!<2Bi!:BjT!!*#d!!*#d!!'Iq +!!*#d!!*#d!!)0L"9@iimJtQ#"p")Z!:K7TfBrbAmJuYT`U<F"JaS*WJaSilrr@Q~> +Ja2LbrrA_W!!*#`!!*#`!!(7.!!)u_rrE)arr<)b!6"1#!<26`!<26e!9sRL!!*#`!!*#`!!'Im +!!*#`!!*#`!!)0H"9@]el2],p"p!rR!:&hLfBNJ=l2^)L`Tm-sJa.gOJa/Qdrr@Q~> +J`c4ZrrA_S!<<&\!<<&\!<::*!<<#[s8W,]s8N,^s2='ts8M-\s8M-as5s@Ds8W)\!<<&\!<9Li +!<<&\!<<&\!<;3D"TRWak5W`h#63iJs5rJDfB*59k5XTD`THmoJ`_OGJ``9\rr@Q~> +JaVdjrrAb\!!)uc!!)uc!!(+.!!*#d!!*#d!!("+rW!)h!:K7TrpC3qmd:)CmJm7TmJu\C!4;.u +!:K7Tmd:)9mf!41mK<OX!:Bj;mf!4%mf!3;mXaeWmZR#<!.Y~> +Ja2LbrrAbX!!)u_!!)u_!!(+*!!*#`!!*#`!!("'rW!)d!:&hLrospmlKSB7l2UhLl2^,7!4;"q +!:&hLlKSB1lM^e-l3%+P!9sR7lM^e!lM^d7l@J5OlB:H4!.Y~> +J`c4ZrrAbT!<<#[!<<#[!<:.&!<<&\!<<&\!<:%#rr3,`s5rJDroO[ik2u^+k5YJDk5XT+s0Unm +s5rJDk2u^)k5PD)jok_Hs5s@3k5PCrk5PC3k(2ZGk*"m,!.Y~> +JaVdjrr@W<hX1@DrU'XcrU'Xca6j'1md:)CrW)rc!!*#d!!*#drr</h!:BimmK<OX!:BjMme-Y, +mf!4=me-Y"mK<OX!:Bi<mXaeWmZ[)=!.Y~> +Ja2Lbrr@W8hWb(@rTX@_rTX@_a6Ed-lKSB7rW)r_!!*#`!!*#`rr</d!9sQil3%+P!9sRIlLk5( +lM^e9lLk4sl3%+P!9sQ8l@J5OlBCN5!.Y~> +J`c4Zrr@W4hW=h<rT4+[rT4+[a6!O)k2u^+rr;u[!<<&\!<<&\s8N2`s5s?ejok_Hs5s@Ek4\i$ +k5PD5k4\hojok_Hs5s?4k(2ZGk*+s-!.Y~> +JaVdjrr@W<RdL.UrpK[as6]jerU'XcrU0UaYjVJjipQdGcgLK,f^A_=_X7U.md:)CmJqh+JaS*W +Pj\POJ,~> +Ja2Lbrr@W8Rd'kQrp'C]s69RarTX@_rTa=]Yj22fip-LCcg(3(f]rG9_Wh=*lKSB7l2ZD#Ja.gO +Pj88KJ,~> +J`c4Zrr@W4RcXVMroX.Ys5j=]rT4+[rT=(YYibrbio^7?cfXs$f]N25_WD(&k2u^+k5U"pJ`_OG +PihuGJ,~> +JaVdjrr@W<S*g:Wme-YXme-Xjme-YDmK<OX!:Bj2mf!1emK!4R!!)uc!!)!G"9@iimJt2n!!*#d +!!*#d!!%T<JaS*WQ1"YPJ,~> +Ja2Lbrr@W8S*C"SlLk5TlLk4flLk5@l3%+P!9sR.lM^bal2^eJ!!)u_!!)!C"9@]el2\cf!!*#` +!!*#`!!%T8Ja.gOQ0SALJ,~> +J`c4Zrr@W4S)sbOk4\iPk4\hbk4\i<jok_Hs5s@*k5PA]k5YDB!<<#[!<;$?"TRWak5WB^!<<&\ +!<<&\!<7W4J`_OGQ0/)HJ,~> +JaVdjrr@W<Q1"VOoBuSXYjVJjjR*3Pmd:)CmJtQ#"p"&kmJuYTrpBadrpBadiU-mMmd:)CmJt8p +!!)uc!!)uc!!%T<JaS*WQL=bQJ,~> +Ja2Lbrr@W8Q0S>KoBQ;TYj22fjQZpLlKSB7l2],p"p!ogl2^)LrosI`rosI`iT^UIlKSB7l2\ih +!!)u_!!)u_!!%T8Ja.gOQKnJMJ,~> +J`c4Zrr@W4Q0/)GoB-&PYibrbjQ6[Hk2u^+k5W`h#63ick5XTDroO4\roO4\iT:@Ek2u^+k5WH` +!<<#[!<<#[!<7W4J`_OGQKJ2IJ,~> +JaVdjrr@W<QL4kUmJuYTp$Mq_mJuYTZL.hqmJuYTk3`3LrpBadrpBadd-_ADmd:)CmJuYTmd:)C +mJu56!!*#d!!*#d!!%T<JaS*WJaUqRrr@Q~> +Ja2Lbrr@W8QKeSQl2^)Lp$)Y[l2^)LZK_Pml2^)Lk3;pHrosI`rosI`d-;)@lKSB7l2^)LlKSB7 +l2]f.!!*#`!!*#`!!%T8Ja.gOJa1YJrr@Q~> +J`c4Zrr@W4QKA>Mk5XTDp#ZDWk5XTDZK;;ik5XTDk2l[DroO4\roO4\d,ki<k2u^+k5XTDk2u^+ +k5XE&!<<&\!<<&\!<7W4J`_OGJ`bABrr@Q~> +JaVdjrr@W<QgP%Xmd:)CmK!"L"p")Z!:K7T[-e+umd:)CmJuJ=!!)uc!!)uc!!(I8!!*#d!!*#d +"p"&kmJuYTiU-[GrU'XcrU'XcJaS*WJaS*WddI,8J,~> +Ja2Lbrr@W8Qg+bTlKSB7l2^SD"p!rR!:&hL[-@hqlKSB7l2^&5!!)u_!!)u_!!(I4!!*#`!!*#` +"p!ogl2^)LiT^CCrTX@_rTX@_Ja.gOJa.gOdd$i4J,~> +J`c4Zrr@W4Qf\MPk2u^+k5Y2<#63iJs5rJD[,qSmk2u^+k5XZ-!<<#[!<<#[!<:L0!<<&\!<<&\ +#63ick5XTDiT:.?rT4+[rT4+[J`_OGJ`_OGdcUQ0J,~> +JaVdjrr@W<R-jqSrpBadrpBadq<e4_rpBadrpBad[dF+qrpBadrpBadi9gRFrU'XcrU'Xcna6AW +rU'XcrU'Xcp[/"]rU'XcrU'[dmf!4EmJm7cmJm7cmJm6<mXaeWmXafSmf*9;~> +Ja2Lbrr@W8R-FYOrosI`rosI`q<@q[rosI`rosI`[d!hmrosI`rosI`i9C:BrTX@_rTX@_n`g)S +rTX@_rTX@_pZ__YrTX@_rTXC`lM^eAl2Uh_l2Uh_l2Ug8l@J5Ol@J6KlMgj7~> +J`c4Zrr@W4R-"DKroO4\roO4\q;q\WroO4\roO4\[cRSiroO4\roO4\i8t%>rT4+[rT4+[n`BiO +rT4+[rT4+[pZ;JUrT4+[rT4.\k5PD=joGG[joGG[joGF4k(2ZGk(2[Ck5PF3~> +JaVdjrr@W<RI1%TrU'XcrU'XcqsFFarU'XcrU'Xc\F'=srU'XcrU'Xci9gRFrpBadrpBadn*U/U +rpBadrpBadmdBcKj6cmIrpBadrpBadJaS*WJaS*WdI.#7J,~> +Ja2Lbrr@W8RHabPrTX@_rTX@_qs".]rTX@_rTX@_\EX%orTX@_rTX@_i9C:BrosI`rosI`n*0lQ +rosI`rosI`mcsKGj6?UErosI`rosI`Ja.gOJa.gOdH^`3J,~> +J`c4Zrr@W4RH=MLrT4+[rT4+[qrRnYrT4+[rT4+[\E3ekrT4+[rT4+[i8t%>roO4\roO4\n)aWM +roO4\roO4\mcO6Cj5p@AroO4\roO4\J`_OGJ`_OGdH:H/J,~> +JaVdjrr@W<JaS<]"p")Z!:K7TmHt/Ymd:)CmJuM>rW(gC"p")Z!:K7TJaS*WJaS*Wd-go6J,~> +Ja2Lbrr@W8Ja/$U"p!rR!:&hLmHOlUlKSB7l2^)6rW(g?"p!rR!:&hLJa.gOJa.gOd-CW2J,~> +J`c4Zrr@W4J`_aM#63iJs5rJDmH+WQk2u^+k5X].rr:j;#63iJs5rJDJ`_OGJ`_OGd,t?.J,~> +JaVdjrr@W<JaS9\"9@iimJuS@"9@iimJuM>"9@iimJu56$39M^!:BjT!:K7TJaS*WJaS*WddI,8 +J,~> +Ja2Lbrr@W8Ja/!T"9@]el2^/8"9@]el2^)6"9@]el2]f.$39AV!9sRL!:&hLJa.gOJa.gOdd$i4 +J,~> +J`c4Zrr@W4J`_^L"TRWak5Xc0"TRWak5X]."TRWak5XE&$NK8Ns5s@Ds5rJDJ`_OGJ`_OGdcUQ0 +J,~> +JaVdjrr@W<qsFFarU'XcrU'XcR-jqSrU'XcrU'XcMXLHDl0eNNl0\`Umd:)CmJu56!W_ZVrW)ud +!!%T<JaS*WJaUqRrr@Q~> +Ja2Lbrr@W8qs".]rTX@_rTX@_R-FYOrTX@_rTX@_MX(0@l0A6Jl08HQlKSB7l2]f.!W_NNrW)u` +!!%T8Ja.gOJa1YJrr@Q~> +J`c4Zrr@W4qrRnYrT4+[rT4+[R-"DKrT4+[rT4+[MWXp<l/r!Fl/i3Mk2u^+k5XE&!rqEFrr<#\ +!<7W4J`_OGJ`bABrr@Q~> +JaVdjrr@W<qX+=`rpBadrpBadQL4_QrpBadrpBadNUHK?oBlVZme-YKmJm7dmJm7dmJm7Ime-X3 +mXaeWmXafSmf*9;~> +Ja2Lbrr@W8qW\%\rosI`rosI`QKeGMrosI`rosI`NU$3;oBH>VlLk5Gl2Uh`l2Uh`l2UhElLk4/ +l@J5Ol@J6KlMgj7~> +J`c4Zrr@W4qW7eXroO4\roO4\QKA2IroO4\roO4\NTTs7oB$)Rk4\iCjoGG\joGG\joGGAk4\h+ +k(2ZGk(2[Ck5PF3~> +JaVdjrr@W<q<eFemd:)CmJrL>"p")Z!:K7TM!k6Bmd:&TrpK[am-XiRrU'XcrU'XciU6UDJaS*W +JaS*WcgLf5J,~> +Ja2Lbrr@W8q<A.alKSB7l2[(6"p!rR!:&hLM!Fs>mcjcPrp'C]m-4QNrTX@_rTX@_iTg=@Ja.gO +Ja.gOcg(N1J,~> +J`c4Zrr@W4q;qn]k2u^+k5U\.#63iJs5rJDM!"^:mcFNLroX.Ym,e<JrT4+[rT4+[iTC(<J`_OG +J`_OGcfY6-J,~> +JaVdjrr@W<q!J7bmJuYTP3rGQmJuYTM!bBGmJuYTmd:2Xmd:)CrW)`]!!)uc!!)uc!!(R;quD<9 +JaS*WJaUkPrr@Q~> +Ja2Lbrr@W8q!%t^l2^)LP3N/Ml2^)LM!>*Cl2^)LmcjoTlKSB7rW)`Y!!)u_!!)u_!!(R7quD<5 +Ja.gOJa1SHrr@Q~> +J`c4Zrr@W4puV_Zk5XTDP3)oIk5XTDLunj?k5XTDmcFZPk2u^+rr;cU!<<#[!<<#[!<:U3r;V?1 +J`_OGJ`b;@rr@Q~> +JaVdjrr@W<p[8"\ORE)JM!bHImd:)CmJu\CrW!)h!:K7Tq!J+^rpBadrpBadj6cmIrU'XcrU'[d +me-X3mXaeWmXafSmf*9;~> +Ja2Lbrr@W8pZh_XOQufFM!>0ElKSB7l2^8;rW!)d!:&hLq!%hZrosI`rosI`j6?UErTX@_rTXC` +lLk4/l@J5Ol@J6KlMgj7~> +J`c4Zrr@W4pZDJTOQQQBLunpAk2u^+k5Xl3rr3,`s5rJDpuVSVroO4\roO4\j5p@ArT4+[rT4.\ +k4\h+k(2ZGk(2[Ck5PF3~> +JaVdjrr@W<qsO.XR-sYJNU?cHrpBadrpBadn*^)RrpBadq!J=dmd:)CmJu56!!*#d!!*#d!!*#d +!W_ZVrW)ud!!%T<JaS*WJaUqRrr@Q~> +Ja2Lbrr@W8qs*kTR-OAFNTpKDrosI`rosI`n*9fNrosI`q!&%`lKSB7l2]f.!!*#`!!*#`!!*#` +!W_NNrW)u`!!%T8Ja.gOJa1YJrr@Q~> +J`c4Zrr@W4qr[VPR-+,BNTL6@roO4\roO4\n)jQJroO4\puVe\k2u^+k5XE&!<<&\!<<&\!<<&\ +!rqEFrr<#\!<7W4J`_OGJ`bABrr@Q~> +JaVdjrrAVX!!)uc!!)uc!!)0LrW&&JrW%iD!!)uc!!)uc!!)WYp&G-]!;Psb!:BjT!8m2K!:K7T +md:)SmKrs^mJuYTmJu\C!.jQhmXaeWmaCP'!.Y~> +Ja2LbrrAVT!!)u_!!)u_!!)0HrW&&FrW%i@!!)u_!!)u_!!)WUp&G-Y!;Pg^!9sRL!8m&G!:&hL +lKSBKl3[OVl2^)Ll2^,7!.jEdl@J5OlI+tt!.Y~> +J`c4ZrrAVP!<<#[!<<#[!<;3Drr8)Brr7l<!<<#[!<<#[!<;ZQpAY0Us7k^Zs5s@Ds52rCs5rJD +k2u^CjpM.Nk5XTDk5XT+s+0<`k(2ZGk0iDl!.Y~> +JaVdjrrASW!!*#d!!*#d!!)0L"9@iimJrF<"9@iimJr@:!!)uc!!)uc!!)<PrW)KVrW(dB"9@ii +mK!.P"p")Z!:K7TJaS*WJaS*Wd-go6J,~> +Ja2LbrrASS!!*#`!!*#`!!)0H"9@]el2["4"9@]el2Zq2!!)u_!!)u_!!)<LrW)KRrW(d>"9@]e +l2^_H"p!rR!:&hLJa.gOJa.gOd-CW2J,~> +J`c4ZrrASO!<<&\!<<&\!<;3D"TRWak5UV,"TRWak5UP*!<<#[!<<#[!<;?Hrr;NNrr:g:"TRWa +k5Y>@#63iJs5rJDJ`_OGJ`_OGd,t?.J,~> +JaVdjrrAPVrr<2i!:K7TrU'Xclg=rWmd:)CmJrL>"p")Z!:K7TOR<)KrpBadrpBadlL"cTmJuYT +p?qVSi9pREqsFFarpBadrpBadJaS*WJaS*WdI.#7J,~> +Ja2LbrrAPRrr<2e!:&hLrTX@_lfnZSlKSB7l2[(6"p!rR!:&hLOQlfGrosI`rosI`lKSKPl2^)L +p?M>Oi9L:Aqs".]rosI`rosI`Ja.gOJa.gOdH^`3J,~> +J`c4ZrrAPNs8N5as5rJDrT4+[lfJEOk2u^+k5U\.#63iJs5rJDOQHQCroO4\roO4\lK/6Lk5XTD +p?))Ki9(%=qrRnYroO4\roO4\J`_OGJ`_OGdH:H/J,~> +JaVdjrrC(,!!)uc!!)uc!!(sFrW!#f!!*#d!!)?Q!!*#d!!*#d!!'Y!!!)uc!!)uc!!)3M!!*#d +!!*#d!!&,K"p")Z!:K7TlL"iVmd:)CmJukHrW(mEp&G-]!<)<c!<)<c!.jQhmXaeWmaCP'!.Y~> +Ja2LbrrC((!!)u_!!)u_!!(sBrW!#b!!*#`!!)?M!!*#`!!*#`!!'Xr!!)u_!!)u_!!)3I!!*#` +!!*#`!!&,G"p!rR!:&hLlKSQRlKSB7l2^G@rW(mAp&G-Y!<)0_!<)0_!.jEdl@J5OlI+tt!.Y~> +J`c4ZrrC($!<<#[!<<#[!<;!>rr3&^s8W)\!<;BI!<<&\!<<&\!<9[n!<<#[!<<#[!<;6E!<<&\ +!<<&\!<8/C#63iJs5rJDlK/<Nk2u^+k5Y&8rr:p=pAY0Us8D'[s8D'[s+0<`k(2ZGk0iDl!.Y~> +JaVdjrrC%+!!*#d!!*#d!!(mDrW!)h!:K7Tlg=`QrU'XcrU'Xc]C#Y!rpBadrpBadkO&<MrU'Xc +rU'XcOR<5OmJuYTlL"WPrpBadrpBadp$Mq_mJuYTh<t7BJaS*WJaS*W_X@F(J,~> +Ja2LbrrC%'!!*#`!!*#`!!(m@rW!)d!:&hLlfnHMrTX@_rTX@_]BT@rrosI`rosI`kNW$IrTX@_ +rTX@_OQlrKl2^)LlKS?LrosI`rosI`p$)Y[l2^)Lh<Ot>Ja.gOJa.gO_Wq.$J,~> +J`c4ZrrC%#!<<&\!<<&\!<:p<rr3,`s5rJDlfJ3IrT4+[rT4+[]B0+nroO4\roO4\kN2dErT4+[ +rT4+[OQH]Gk5XTDlK/*HroO4\roO4\p#ZDWk5XTDh<+_:J`_OGJ`_OG_WLjuJ,~> +JaVdjrrC"*"p")Z!:K7TiU6C>R-k.Ymd:)CmJqh+l0eNNlL"WPrU'XcrU'Xcp[/4cmd:)CmJu/4 +"9@iimJqh+JaS*WJaUGDrr@Q~> +Ja2LbrrC"&"p!rR!:&hLiTg+:R-FkUlKSB7l2ZD#l0A6JlKS?LrTX@_rTX@_pZ_q_lKSB7l2]`, +"9@]el2ZD#Ja.gOJa1/<rr@Q~> +J`c4ZrrC""#63iJs5rJDiTBk6R-"VQk2u^+k5U"pl/r!FlK/*HrT4+[rT4+[pZ;\[k2u^+k5X?$ +"TRWak5U"pJ`_OGJ`al4rr@Q~> +JaVdjrrBt)"9@iimK!%M!!)uc!!)uc!!)NVqZ+V'!!)uc!!)uc!!(jC"9@iimJqh+m-aQIm-XiR +rU'XcrU'XcqX+=`rpBadrpBadiU-mMmd:)CmJqh+JaS*WJaUJErr@Q~> +Ja2LbrrBt%"9@]el2^VE!!)u_!!)u_!!)NRqZ+V#!!)u_!!)u_!!(j?"9@]el2ZD#m-=9Em-4QN +rTX@_rTX@_qW\%\rosI`rosI`iT^UIlKSB7l2ZD#Ja.gOJa12=rr@Q~> +J`c4ZrrBt!"TRWak5Y5=!<<#[!<<#[!<;QNqu=Xt!<<#[!<<#[!<:m;"TRWak5U"pm,n$Am,e<J +rT4+[rT4+[qW7eXroO4\roO4\iT:@Ek2u^+k5U"pJ`_OGJ`ao5rr@Q~> +JaVdjrrBq(rW)Z[!!*#d!!*#d!!)NVp&N2%!!*#d!!*#d!!(dArW(aA!!)uc!!)uc!!&ARrW)-L +!!*#d!!*#d!!)l`!!)uc!!)uc!!)'I!!*#d!!*#d!!%T<JaS*WJaUMFrr@Q~> +Ja2LbrrBq$rW)ZW!!*#`!!*#`!!)NRp&N2!!!*#`!!*#`!!(d=rW(a=!!)u_!!)u_!!&ANrW)-H +!!*#`!!*#`!!)l\!!)u_!!)u_!!)'E!!*#`!!*#`!!%T8Ja.gOJa15>rr@Q~> +J`c4ZrrBpurr;]S!<<&\!<<&\!<;QNpA`4r!<<&\!<<&\!<:g9rr:d9!<<#[!<<#[!<8DJrr;0D +!<<&\!<<&\!<;oX!<<#[!<<#[!<;*A!<<&\!<<&\!<7W4J`_OGJ`ar6rr@Q~> +JaVdjrrCgA!!)uc!!)uc!!)c]p&OpV"p")Z!:K7Tp$Me[rU'^emdBuQ!U]sdmJm70mKN[ZmJu\C +!8d/;!8m2E!<2Bd!<2Bd!13*V!:BjT!9`bS!:K7Tmd:)&mJm7cmJm7cmJm6<mXaeWmXafGmf*9;~> +Ja2LbrrCg=!!)u_!!)u_!!)cYp&OpR"p!rR!:&hLp$)MWrTXFalK\9I!U9[`l2Uh,l377Rl2^,7 +!8d#7!8m&A!<26`!<26`!12sR!9sRL!9`VO!:&hLlKSAsl2Uh_l2Uh_l2Ug8l@J5Ol@J6?lMgj7~> +J`c4ZrrCg9!<<#[!<<#[!<;fUpAasN#63iJs5rJDp#Z8SrT41]k2uUA!TsF\joGG(jp(kJk5XT+ +s5)o3s52r=s8M-\s8M-\s-MjNs5s@Ds6&MKs5rJDk2u]kjoGG[joGG[joGF4k(2ZGk(2[7k5PF3~> +JaVdjrrCd@!!*#d!!*#d!!)TXrW)TY"9@iimJukH"p")Z!!)HTq>gN_!!(+."9@iimJtr.rW([? +"p")Z!:K7TQgP%Xmd:)CmJuG<"9@iimJqh+JaS*WJaSE`rr@Q~> +Ja2LbrrCd<!!*#`!!*#`!!)TTrW)TU"9@]el2^G@"p!rR!!)<Lq>gN[!!(+*"9@]el2]N&rW([; +"p!rR!:&hLQg+bTlKSB7l2^#4"9@]el2ZD#Ja.gOJa/-Xrr@Q~> +J`c4ZrrCd8!<<&\!<<&\!<;WPrr;WQ"TRWak5Y&8#63iJs8V6DqZ$QW!<:.&"TRWak5X,srr:^7 +#63iJs5rJDQf\MPk2u^+k5XW,"TRWak5U"pJ`_OGJ`_jPrr@Q~> +JaVdjrrCa?"p")Z!:K7To'QV\mJuYTo^;\Yna?DW%IO5amJu\C!:Bgemd:(pmf!4>mK<OX!:Bj@ +mK<OX!:BiRmJm7dmJm7dmJm7Mmf!3;mXaeWmXae_mf*9;~> +Ja2LbrrCa;"p!rR!:&hLo'->Xl2^)Lo]lDUn`p,S%I*rYl2^,7!9sOalKSAhlM^e:l3%+P!9sR< +l3%+P!9sQNl2Uh`l2Uh`l2UhIlM^d7l@J5Ol@J5WlMgj7~> +J`c4ZrrCa7#63iJs5rJDo&^)Tk5XTDo]H/Qn`KlO%Hd]Qk5XT+s5s@]k2u]`k5PD6jok_Hs5s@8 +jok_Hs5s?JjoGG\joGG\joGGEk5PC3k(2ZGk(2ZOk5PF3~> +JaVdjrrD$G!!)uc!!*#drVuue!:oO^!:K7Tmd:)Nme-YQmK<OX!:Bjdmf*7emf!4ZmJm7cmJm7c +mJm7Fme-Y;mKN[ZmJu\C!8?l?!13*R!<)<c!<)<c!:9.I!.jQhmXaeWmZ$Z7!.Y~> +Ja2LbrrD$C!!)u_!!*#`rVuua!:oCZ!:&hLlKSBFlLk5Ml3%+P!9sR`lMghalM^eVl2Uh_l2Uh_ +l2UhBlLk57l377Rl2^,7!8?`;!12sN!<)0_!<)0_!:9"E!.jEdl@J5OlAb*/!.Y~> +J`c4ZrrD$?!<<#[!<<&\rr3#]s75:Vs5rJDk2u^>k4\iIjok_Hs5s@\k5YG]k5PDRjoGG[joGG[ +joGG>k4\i3jp(kJk5XT+s4ZW7s-MjJs8D'[s8D'[s6SnAs+0<`k(2ZGk)JO'!.Y~> +M=1?CrU'Xcr9aObn*^2Ui9gRFrpBadrpK^bo'QJXrpBadrpBadp?qn[n*^/TrU'[dmem.XmJm7d +mJm7dmJm7Amf!4JmJm7cmJm7cmJm7dmJm7dmJm7Eme-X3mK)_UrU'XcrpKacmd:&TrU'XcrU'Xc +qsFFarU'XcrU'XcJaUMF!!)uc!!)uc!!%T<JaS*Ws6fmeJ,~> +M<b'?rTX@_r9=7^n*9oQi9C:BrosI`rp'F^o'-2TrosI`rosI`p?MVWn*9lPrTXC`lMU_Tl2Uh` +l2Uh`l2Uh=lM^eFl2Uh_l2Uh_l2Uh`l2Uh`l2UhAlLk4/l2g/MrTX@_rp'I_mcjcPrTX@_rTX@_ +qs".]rTX@_rTX@_Ja15>!!)u_!!)u_!!%T8Ja.gOs6BUaJ,~> +M<=d;rT4([r8mtZn)jWMi8t%>roO4\roX1Zo&]rProO4\roO4\p?)ASn)jWLrT4.\k5G>PjoGG\ +joGG\joGG9k5PDBjoGG[joGG[joGG\joGG\joGG=k4\h+joOWErT4+[roX4[mcFNLrT4+[rT4+[ +qrRnYrT4+[rT4+[J`ar6!<<#[!<<#[!<7W4J`_OGs5s=]J,~> +MXCHErpBpimd:)C!<2Bf!:BjVmf*:EmK*CVme$SSmJm7cmJm7cmJm7^mK<OX!:BjZmd0uTmK!4R +!!)uc"p")Z!:K7Tg[51EmJuYTjmE*KrpBadrpBadrU'XcrU'Xch!Y.ArpBadrU'XcK^Jg?rpBgf +mdC&S!U]sUmJm7dmJm7dmJm7_mJm7dmJm7dmJm6`mJm7cmJm7cmJm6emJm7dmJm7dmJm6<mXaeW +mf)YS!.Y~> +MWt0ArosXelKSB7!<26b!9sRRlMgkAl2gtNlLb/Ol2Uh_l2Uh_l2UhZl3%+P!9sRVlKnQPl2^eJ +!!)u_"p!rR!:&hLgZenAl2^)LjlugGrosI`rosI`rTX@_rTX@_h!4k=rosI`rTX@_K^&O;rosOb +lK\?K!U9[Ql2Uh`l2Uh`l2Uh[l2Uh`l2Uh`l2Ug\l2Uh_l2Uh_l2Ugal2Uh`l2Uh`l2Ug8l@J5O +lMg)K!.Y~> +MWOm=roO@ak2l[+!<2*^!9O:Nk5PG=joYSFk4ScKjoGG[joGG[joGGVjok_Hs5s@Rk3`0Lk5YDB +!<<#[#63iJs5rJDgZAY=k5XTDjlQRCroO4\roO4\rT4+[rT4+[gueV9roO4\rT4+[K]W:7roO:^ +k2u[C!TsFMjoGG\joGG\joGGWjoGG\joGG\joGFXjoGG[joGG[joGF]joGG\joGG\joGF4k(2ZG +k5ONC!.Y~> +MXCHEr9aObrpBgfmK!7S!!)QWrrCpD"p"&kmJu\CrW)0M!!)uc#lsD]!:Bgemd:)Fmf!4`mf!4` +mJm7dmJm7dmKN[Z!:BjT!8HoG!:K7Tmd:):mKN[ZmJu\C!9rnO!<)<c!<)<c!;5a\!:Kgds6]je +rpBadK'j!Hmd:)C!!)Eemd:)CmKN[ZmJu\C!;Gmc!:K7Tmd:(MmJm7dmJm7dmJm6cmKN[ZmJu\C +!.jQhmXag)mf*9;~> +MWt0Ar9=7^rosObl2^hK!!)QSrrCp@"p!ogl2^,7rW)0I!!)u_#ls8U!9sOalKSB>lM^e\lM^e\ +l2Uh`l2Uh`l377R!9sRL!8HcC!:&hLlKSB2l377Rl2^,7!9rbK!<)0_!<)0_!;5UX!:'O`s69Ra +rosI`K'E^DlKSB7!!)9alKSB;l377Rl2^,7!;Ga_!:&hLlKSAEl2Uh`l2Uh`l2Ug_l377Rl2^,7 +!.jEdl@J7!lMgj7~> +MWOm=r8mtZroO7^joGDC!!)QOrrCp<#63ick5XT+rr;3E!<<#[$30/Ms5s@]k2u^6k5PDXk5PDX +joGG\joGG\jp(kJs5s@Ds4cZ?s5rJDk2u^*jp(kJk5XT+s68YGs8D'[s8D'[s7PLTs5s=\s5j=] +roO4\K'!I@k2u^+s8V6]k2u^3jp(kJk5XT+s7bX[s5rJDk2u]=joGG\joGG\joGF[jp(kJk5XT+ +s+0<`k(2[nk5PF3~> +MXCHEr9aObrpBgfmK!7S!!)QWrrCmCrW)ud"9@iimJuJ=!!*#d"p"&kmJuYTrpBadoBl_]mJuYT +rU'dgmJuYTqsFXgmd:)CmK!7SrW(^@!!*#d!!*#drrE#c!!)uc!!)NV"9@iimJuG<!!*#d!!*#d +!!)][$NTV_!:BgemJu\C!9NVK!<)<c!<)<c!2o5c!:Kgds6]jerpBadmd:2XmJuYTp$Mq_mJuYT +U$`*bmd:)CmJs-P"9@iimJqh+JaS*Wr9jRbJ,~> +MWt0Ar9=7^rosObl2^hK!!)QSrrCm?rW)u`"9@]el2^&5!!*#`"p!ogl2^)LrosI`oBHGYl2^)L +rTXLcl2^)Lqs"@clKSB7l2^hKrW(^<!!*#`!!*#`rrE#_!!)u_!!)NR"9@]el2^#4!!*#`!!*#` +!!)]W$NTJW!9sOal2^,7!9NJG!<)0_!<)0_!2o)_!:'O`s69RarosI`mcjoTl2^)Lp$)Y[l2^)L +U$;g^lKSB7l2[^H"9@]el2ZD#Ja.gOr9F:^J,~> +MWOm=r8mtZroO7^joGDC!!)QOrrCm;rr<#\"TRWak5XZ-!<<&\#63ick5XTDroO4\oB$2Uk5XTD +rT47_k5XTDqrS+_k2u^+k5YGCrr:a8!<<&\!<<&\s8W&[!<<#[!<;QN"TRWak5XW,!<<&\!<<&\ +!<;`S$ifAOs5s@]k5XT+s5iACs8D'[s8D'[s/4u[s5s=\s5j=]roO4\mcFZPk5XTDp#ZDWk5XTD +U#lRZk2u^+k5V=@"TRWak5U"pJ`_OGr9""ZJ,~> +MXLECs6]jerpBgfmK!7S!!)QWq#KUGo`5$[!!)6N#lsD]!!)Eemd:)RmJm7[mLfNfmJu\C!:Bge +md:&TmJu\C!<2Bg!:BjTo`3q<!!)uc!!)ucrrE&d!!*#d!!)HTrW)'J"p")Z!:K7Tp$Me[rpBgf +mdC&S!U]sJmJm7dmJm7dmJm6`mf!4cmJm7cmJm7Tmf!4Xmf!3YmK<OX!:Bi_mf!3;mXaeWmecGP +!.Y~> +MX(-?s69RarosObl2^hK!!)QSq#KUCo`5$W!!)6J#ls8U!!)9alKSBJl2UhWl4O*^l2^,7!9sOa +lKS?Ll2^,7!<26c!9sRLo`3q8!!)u_!!)u_rrE&`!!*#`!!)HPrW)'F"p!rR!:&hLp$)MWrosOb +lK\?K!U9[Fl2Uh`l2Uh`l2Ug\lM^e_l2Uh_l2UhPlM^eTlM^dUl3%+P!9sQ[lM^d7l@J5OlMKlH +!.Y~> +MWXj;s5j:]roO7^joGDC!!)QOq#KU?p&G'S!<;9F$30/Ms8V6]k2u^BjoGGSjq@^Vk5XT+s5s@] +k2u^Dk5XT+s8M-_s5s@Dp&Et4!<<#[!<<#[s8W)\!<<&\!<;KLrr;*B#63iJs5rJDp#Z8SroO:^ +k2u[C!TsFBjoGG\joGG\joGFXk5PD[joGG[joGGLk5PDPk5PCQjok_Hs5s?Wk5PC3k(2ZGk54<@ +!.Y~> +MXCHErpBgfmK!7S!W_WgrpBadna?2Qj6ljGrpBadrpBadkjAQRmJuYTmHsrSrpBgfmdC#R!:Kgd +s6fmer9jOar9jOad-_)<md:)CmJueFp&P*[!!)uc!!)QW"9@iimJuqJ!!)uc!!*#drW(pF"p")Z +!:K7TW:'?ZmI'ZJqsO.XU@/!\Vsa6YJaS*WJaWR+rr@Q~> +MWt0ArosObl2^hK!W_KcrosI`n`ooMj6HRCrosI`rosI`kir9Nl2^)LmHOZOrosOblK\<J!:'O` +s6BUar9F7]r9F7]d-:f8lKSB7l2^A>p&P*W!!)u_!!)QS"9@]el2^MB!!)u_!!*#`rW(pB"p!rR +!:&hLW9X'VmHXBFqs*kTU?_^XVs<sUJa.gOJa3:#rr@Q~> +MWOm=roO7^joGDC!W_?_roO1\n`KWIj6$=?roO4\roO4\kiN$Jk5XTDmH+EKroO:^k2uXB!9X:\ +s5s@]r9""Yr9""Yd,kQ4k2u^+k5Xu6pAb-S!<<#[!<;TO"TRWak5Y,:!<<#[!<<&\rr:s>#63iJ +s5rJDW93gRmH4-Bqr[VPU?;ITVrm^QJ`_OGJ`d!prr@Q~> +MXCHErpBgfmK!7S!W_WgrpBadna?DWhX1CEmf!4cmJm7cmJm7Nmf!4RmJm7cmJm7dmf*7emem+c +mf!1dmdgD]mJuYT!<2Ed!:B1S!<)<c!<)<c!;Gma!:BjT!:9.Q!<2Bd!<2Bd!<2Bd!:T@T!:T@L +!9EPN!:BjT!2Ju]!9NYJ!;#XX!2AoT!2o8a!.jQhmXag'mf*9;~> +MWt0ArosObl2^hK!W_KcrosI`n`p,ShWb+AlM^e_l2Uh_l2UhJlM^eNl2Uh_l2Uh`lMghalMU\_ +lM^b`lLOuYl2^)L!<29`!:B%O!<)0_!<)0_!;Ga]!9sRL!:9"M!<26`!<26`!<26`!:T4P!:T4H +!9EDJ!9sRL!2JiY!9NMF!;#LT!2AcP!2o,]!.jEdl@J6tlMgj7~> +MWOm=roO7^joGDC!W_?_roO1\n`KiOhW=k=k5PD[joGG[joGGFk5PDJjoGG[joGG\k5YG]k5G;[ +k5PA\k4ATUk5XTDs8M0\s6\qKs8D'[s8D'[s7bXYs5s@Ds6SnIs8M-\s8M-\s8M-\s6o+Ls6o+D +s5`;Fs5s@Ds.e`Us5iDBs7>CPs.\ZLs/5#Ys+0<`k(2[lk5PF3~> +MXCHErpBpimd:)C!<2Bf!:BjVmf*:EmKN[ZmJu\C!9ESA!9`bQ!:K7Tmf!4_mf!4cmKEUYmJm7T +rW)udrrDBQ!!*#d!!*#d!!)][rW)<Q"9@iimK!7S"p")Z!:K7Tq<e4_rU'[dme-YLmf!4Dmf!3] +mKWa[!:BjTmK!4R!!)uc!!)ZZ"9@iimJuqJ"9@iimJrmIrW&b^"9@iimJqh+JaS*Wr9jRbJ,~> +MWt0ArosXelKSB7!<26b!9sRRlMgkAl377Rl2^,7!9EG=!9`VM!:&hLlM^e[lM^e_l3.1Ql2UhL +rW)u`rrDBM!!*#`!!*#`!!)]WrW)<M"9@]el2^hK"p!rR!:&hLq<@q[rTXC`lLk5HlM^e@lM^dY +l3@=S!9sRLl2^eJ!!)u_!!)ZV"9@]el2^MB"9@]el2[IArW&bZ"9@]el2ZD#Ja.gOr9F:^J,~> +MWOm=roO@ak2l[+!<2*^!9O:Nk5PG=jp(kJk5XT+s5`>9s6&MIs5rJDk5PDWk5PD[joteIk5YJD +rr<#\s8VEI!<<&\!<<&\!<;`Srr;?I"TRWak5YGC#63iJs5rJDq;q\WrT4.\k4\iDk5PD<k5PCU +jp1qKs5s@Dk5YDB!<<#[!<;]R"TRWak5Y,:"TRWak5V(9rr8eV"TRWak5U"pJ`_OGr9""ZJ,~> +M=1?CrU'Xcr9aObn*^2Ui9gRFrpBadrpBadiU6[FipHgImem.^mKN[Z!:BjT!<2Ec!!Vcj!:Bge +l0\`Umd:)CmK!%Mp&OXN"p")Z!:K7TrpBmhmJuYTp[/"]rpBadrpBdemf!4QmK<OX!:BjJme-XZ +mKim]mJu\C!:K7TrpBadrpBado^2n`md:)CmK!"L"p")Z!:K7Tl0\NOrU'XcrU'Xcmd:&TrU'Xc +rU'XcipHpLmJuYTVX=Wgmd:)CmJqh+JaS*WrU0[cJ,~> +M<b'?rTX@_r9=7^n*9oQi9C:BrosI`rosI`iTgCBip$OElMU_Zl377R!9sRL!<29_!!VWf!9sOa +l08HQlKSB7l2^VEp&OXJ"p!rR!:&hLrosUdl2^)LpZ__YrosI`rosLalM^eMl3%+P!9sRFlLk4V +l3RIUl2^,7!:&hLrosI`rosI`o]cV\lKSB7l2^SD"p!rR!:&hLl086KrTX@_rTX@_mcjcPrTX@_ +rTX@_ip$XHl2^)LVWn?clKSB7l2ZD#Ja.gOrTaC_J,~> +M<=d;rT4([r8mtZn)jWMi8t%>roO4\roO4\iTC.>ioU:Ak5G>Vjp(kJs5s@Ds8M0[rrqQbs5s@] +l/i3Mk2u^+k5Y5=pAa[F#63iJs5rJDroO@`k5XTDpZ;JUroO4\roO7]k5PDIjok_Hs5s@Bk4\hR +jpD(Mk5XT+s5rJDroO4\roO4\o]?AXk2u^+k5Y2<#63iJs5rJDl/i!GrT4+[rT4+[mcFNLrT4+[ +rT4+[ioUCDk5XTDVWJ*_k2u^+k5U"pJ`_OGrT=+[J,~> +JaVdjrrD$G!!)uc!!)uc!!)'I"9@iimJu>9p&P-\"p")Z!:K7TrU'[dme["ImK<OX!:BjYmf!4S +mJm7dmJm7dmJm7dmf!4ZmL0*`mJu\C!:BjT!:BjTmKN[ZmJu\C!9*AF!2])`!<2Bd!<2Bm!:K7T +md:)CmK!"L$NTV_!:BjT!:K7T!;Z$_!<2Bd!<2Bd!9rnO!<2Bd!<2Bd!:9+R!<2Bd!<2Bd!93DN +!:K7Tmd:(RmJm7dmJm7dmJm6<mXaeWmf)YS!.Y~> +Ja2LbrrD$C!!)u_!!)u_!!)'E"9@]el2]o1p&P-X"p!rR!:&hLrTXC`lMCSEl3%+P!9sRUlM^eO +l2Uh`l2Uh`l2Uh`lM^eVl3m[Xl2^,7!9sRL!9sRPl377Rl2^,7!9*5B!2\r\!<26`!<26i!:&hL +lKSB7l2^SD$NTJW!9sRL!:&hL!;Ym[!<26`!<26`!9rbK!<26`!<26`!:8tN!<26`!<26`!938J +!:&hLlKSAJl2Uh`l2Uh`l2Ug8l@J5OlMg)K!.Y~> +J`c4ZrrD$?!<<#[!<<#[!<;*A"TRWak5XN)pAb0T#63iJs5rJDrT4.\k552Ajok_Hs5s@Qk5PDK +joGG\joGG\joGG\k5PDRjp_:Pk5XT+s5s@Ds5s@Ljp(kJk5XT+s5E,>s/"iXs8M-\s8M-es5rJD +k2u^+k5Y2<$ifAOs5s@Ds5rJDs7tdWs8M-\s8M-\s68YGs8M-\s8M-\s6SkJs8M-\s8M-\s5N/F +s5rJDk2u]BjoGG\joGG\joGF4k(2ZGk5ONC!.Y~> +JaVdjrrBUt"p")Z!:K7TkO/$DrpBadrpBadrpBadqsOC_jmN*JoBl_]mJuYTnEp8VrU'XcrpKI[ +q!JOjmJuYTmJu\C!:K7TnEp8VrpBadrpBadj6d$MmJuYTWU:E"mJu\C!:BjTmJuYTmd:)C!:Bj[ +mf*:emKWa[!:BjTmK!.P!!)uc!!)uc!!)9O"p")Z!:K7TlL"iVmd:)CmJu87!!*#d!!*#d!!'%e +!!)uc!!)uc!!%T<JaS*Ws6fmeJ,~> +Ja2LbrrBUp"p!rR!:&hLkN_a@rosI`rosI`rosI`qs++[jm)gFoBHGYl2^)LnEKuRrTX@_rp'1W +q!&7fl2^)Ll2^,7!:&hLnEKuRrosI`rosI`j6?aIl2^)LWTk,sl2^,7!9sRLl2^)LlKSB7!9sRW +lMgkal3@=S!9sRLl2^_H!!)u_!!)u_!!)9K"p!rR!:&hLlKSQRlKSB7l2]i/!!*#`!!*#`!!'%a +!!)u_!!)u_!!%T8Ja.gOs6BUaJ,~> +J`c4ZrrBUl#63iJs5rJDkN;L<roO4\roO4\roO4\qr[kWjlZRBoB$2Uk5XTDnE'`NrT4+[roWqS +puW"bk5XTDk5XT+s5rJDnE'`NroO4\roO4\j5pLEk5XTDWTFlok5XT+s5s@Dk5XTDk2u^+s5s@S +k5YJ]jp1qKs5s@Dk5Y>@!<<#[!<<#[!<;<G#63iJs5rJDlK/<Nk2u^+k5XH'!<<&\!<<&\!<9(] +!<<#[!<<#[!<7W4J`_OGs5s=]J,~> +JaVdjrrBXu!!*#d!!*#d!!)*Jr;Zld!<2Bd!<)<c!<)<d!:KL[s6]jenF#uMq!J=dmd:)CmJu>9 +rW)QXrVuue!<2Bd!<2Bd!;#XY!<2Ed!<2Ed!9NVQ!:K7Tmd:(imJm7cmJm7cmJm7\mJm7dmJm7d +mJm7amf!4XmKN[ZmJu\C!7U?=!:BjT!9ihR!:BjT!93DH!<)<c!<)<c!.jQhmXaetmf*9;~> +Ja2LbrrBXq!!*#`!!*#`!!)*Fr;Zl`!<26`!<)0_!<)0`!:'4Ws69RanET]Iq!&%`lKSB7l2]o1 +rW)QTrVuua!<26`!<26`!;#LU!<29`!<29`!9NJM!:&hLlKSAal2Uh_l2Uh_l2UhXl2Uh`l2Uh` +l2Uh]lM^eTl377Rl2^,7!7U39!9sRL!9i\N!9sRL!938D!<)0_!<)0_!.jEdl@J5llMgj7~> +J`c4ZrrBXm!<<&\!<<&\!<;-BrVlo\s8M-\s8D'[s8D'\s5s"Ss5j=]nE0HEpuVe\k2u^+k5XN) +rr;TPrr3#]s8M-\s8M-\s7>CQs8M0\s8M0\s5iAIs5rJDk2u]YjoGG[joGG[joGGTjoGG\joGG\ +joGGYk5PDPjp(kJk5XT+s3p*5s5s@Ds6/SJs5s@Ds5N/@s8D'[s8D'[s+0<`k(2Zdk5PF3~> +JaVdjrrB\!!!)uc!!)uc!!)0LrW!)h!:K7Tn*^,S!U]semJm7Qmf!4ZmJm7dmJm7dmJm7LmK<OX +!:Bj^me-V]mK!4R!!)WY!!*#drrE)e!W_WgrU'Xclg=`QrpBadrpBad^[;(%rpBadrpBado^2n` +md:)CmK!7Sp&OgS"9@iimJtZ&rW)*KrW%N;JaS*WJaW-trr@Q~> +Ja2LbrrB[r!!)u_!!)u_!!)0HrW!)d!:&hLn*9iO!U9[al2UhMlM^eVl2Uh`l2Uh`l2UhHl3%+P +!9sRZlLk2Yl2^eJ!!)WU!!*#`rrE)a!W_KcrTX@_lfnHMrosI`rosI`^Zke!rosI`rosI`o]cV\ +lKSB7l2^hKp&OgO"9@]el2]5srW)*GrW%N7Ja.gOJa2jlrr@Q~> +J`c4ZrrB[n!<<#[!<<#[!<;3Drr3,`s5rJDn)jTK!TsF]joGGIk5PDRjoGG\joGG\joGGDjok_H +s5s@Vk4\fUk5YDB!<;ZQ!<<&\s8W,]!rqE_rT4+[lfJ3IroO4\roO4\^ZGOrroO4\roO4\o]?AX +k2u^+k5YGCpAajK"TRWak5Wikrr;-Crr7Q3J`_OGJ`cRdrr@Q~> +JaVdjrrAAQrr<;l!:Bgemd:)FmeQq`mJm7QmK<OX!:Bj]mJm7cmJm7cmJm7NmKN[ZmJu\C!;5dZ +!9`bV!:K7TmJm7TmK!7S!!)?Q!!)uc!!)uc!!'e%"p")Z!:K7To'QV\mJuYTq<n4^na?AVeF*#1 +rpKddrpKddq!RhUs6]jerU'XcJaS*WJaS*Ws6fmeJ,~> +Ja2LbrrAAMrr<;h!9sOalKSB>lM:M\l2UhMl3%+P!9sRYl2Uh_l2Uh_l2UhJl377Rl2^,7!;5XV +!9`VR!:&hLl2UhLl2^hK!!)?M!!)u_!!)u_!!'e!"p!rR!:&hLo'->Xl2^)Lq<IqZn`p)ReEZ`- +rp'L`rp'L`q!.PQs69RarTX@_Ja.gOJa.gOs6BUaJ,~> +J`c4ZrrAAIs8N>ds5s@]k2u^6k5,,XjoGGIjok_Hs5s@UjoGG[joGG[joGGFjp(kJk5XT+s7POR +s6&MNs5rJDk5YJDk5YGC!<;BI!<<#[!<<#[!<9gr#63iJs5rJDo&^)Tk5XTDq<%\Vn`KiNeE6K) +roX7\roX7\pu_;Ms5j=]rT4+[J`_OGJ`_OGs5s=]J,~> +JaVdjrrADRrrE)e#6=/lmJu\C!;#XY!!)Hb!!2KfnEp8VrU'jimd:)C!!(R;!!*#d!!*#d!!)c] +"9@iimJuG<$NTSpmJm7TmJu\C!1`H[!:BjT!:]FU!;Z$c!:BjT!;>jR!<;He!<)<c!<)<e!:Bjc +mJm7cmLK<cmJuYTmd:)C!:K7TmK!4Rr;clcpAk6]rW)rcrrE&dq>gQ`rW)udrrE#c%05ha!:BjT +mJuYTmd:(+mXaeWmZHr;!.Y~> +Ja2LbrrADNrrE)a#6=#hl2^,7!;#LU!!)<^!!2?bnEKuRrTXRelKSB7!!(R7!!*#`!!*#`!!)cY +"9@]el2^#4$NTGll2UhLl2^,7!1`<W!9sRL!:]:Q!;Ym_!9sRL!;>^N!<;<a!<)0_!<)0a!9sR_ +l2Uh_l43m[l2^)LlKSB7!:&hLl2^eJr;cl_pAk6YrW)r_rrE&`q>gQ\rW)u`rrE#_%05\Y!9sRL +l2^)LlKSA#l@J5OlB1B3!.Y~> +J`c4ZrrADJs8W,]#QNrdk5XT+s7>CQrrD3ZrrM9^nE'`NrT4=ak2u^+s8UX3!<<&\!<<&\!<;fU +"TRWak5XW,$ifAhk5YJDk5XT+s.&3Ss5s@Ds7#1Ms7td[s5s@Ds7YUJs8V3]s8D'[s8D']s5s@[ +joGG[jq%LSk5XTDk2u^+s5rJDk5YDBrVuo[p](9Urr;u[s8W)\qZ$TXrr<#\s8W&[%KGSQs5s@D +k5XTDk2u\pk(2ZGk)ng+!.Y~> +JaVdjrrAGS!!)uc!!)uc!!)TXrrE)err<&erW)BS$NTV_!!)HT!!)HT!8$W=!<)<c!<)<c!;Z$e +!:K7Tmd:)<mf!4dmK<OX!:BiUmf!4ZmK!=Uo`5$["9@ii!:Kdc!:Kdc"7?-hme["amf*:dmf*:d +mf*:emK<OX!:BjdmJm7dmJm7cmKrs^!:BjT!:BjT!<)<j!:BjT!!)HTq#CE_rVuue!<2Ed!<2Bg +!:BjTr;[,k!!)HT!:K7TrpKdds6fme!:Kdc$17f]mJuYTmd:)RmJm6<mXaeWm[`eG!.Y~> +Ja2LbrrAGO!!)u_!!)u_!!)TTrrE)arr<&arW)BO$NTJW!!)<L!!)<L!8$K9!<)0_!<)0_!;Yma +!:&hLlKSB4lM^e`l3%+P!9sQQlM^eVl2^nMo`5$W"9@]e!:'L_!:'L_"6ojdlMCS]lMgk`lMgk` +lMgkal3%+P!9sR`l2Uh`l2Uh_l3[OV!9sRL!9sRL!<)0f!9sRL!!)<Lq#CE[rVuua!<29`!<26c +!9sRLr;[,g!!)<L!:&hLrp'L`s6BUa!:'L_$0hNUl2^)LlKSBJl2Ug8l@J5OlCI5?!.Y~> +J`c4ZrrAGK!<<#[!<<#[!<;WPs8W,]s8N)]rr;EK$ifAOs8V6Ds8V6Ds4?B5s8D'[s8D'[s7td] +s5rJDk2u^,k5PD\jok_Hs5s?Mk5PDRjoPMEp&G'S"TRWas5s:[!9X7["6TX`k552Yk5YJ\k5YJ\ +k5YJ]jok_Hs5s@\joGG\joGG[jpM.Ns5s@Ds5s@Ds8D'bs5s@Ds8V6Dq>UHWrr3#]s8M0\s8M-_ +s5s@DrVm/cs8V6Ds5rJDroX7\s5s@]!9X7[$0M9Mk5XTDk2u^BjoGF4k(2ZGk+1Z7!.Y~> +JaVdjrr@W<s6fmes6fR\na?DW"RZ9XmK!4R!!(%,!!*#d!!*#d!!)BRoDn[S!!)uc!!)uc!!)ZZ +!!)uc!!)uc!!)oa!!)uc!!)uc!!)uc!!)uc!!)uc!!)i_!!)uc!!)uc"T[uY!:K:I!<;Kd!<;K^ +!<;Kc!!)Hd!<;Ka!!)Hd!!)Hc!!)Hd!!;Qg!<2Bg!:BjTrW!&g!:BjdmKN[ZmJu\C!;l0i!:Bge +mJm7T!<)<k!:K7Tmd:&TmeHhtmJm7TmJu\C!:K7TmJm7T!!)Ee!:Kgd!U]sdmM>lkmJuYT!:BjT +mJu\C!!)HT!!)HT!!*#d!!%T<JaS*WSF6CWJ,~> +Ja2Lbrr@W8s6BUas6B:Xn`p,S"R6!Pl2^eJ!!(%(!!*#`!!*#`!!)BNoDn[O!!)u_!!)u_!!)ZV +!!)u_!!)u_!!)o]!!)u_!!)u_!!)u_!!)u_!!)u_!!)i[!!)u_!!)u_"T[iQ!:&kA!<;?`!<;?Z +!<;?_!!)<`!<;?]!!)<`!!)<_!!)<`!!;Ec!<26c!9sRLrW!&c!9sR`l377Rl2^,7!;l$e!9sOa +l2UhL!<)0g!:&hLlKS?LlM1Dpl2UhLl2^,7!:&hLl2UhL!!)9a!:'O`!U9[`l5'Hcl2^)L!9sRL +l2^,7!!)<L!!)<L!!*#`!!%T8Ja.gOSEg+SJ,~> +J`c4Zrr@W4s5s@]s5s%Tn`KlO"QoaHk5YDB!<:($!<<&\!<<&\!<;EJo`+^K!<<#[!<<#[!<;]R +!<<#[!<<#[!<;rY!<<#[!<<#[!<<#[!<<#[!<<#[!<;lW!<<#[!<<#["om`Is5rJ9s8V6\s8V6V +s8V6[rrD3\s8V6YrrD3\rrD3[rrD3\rrV?_s8M-_s5s@Drr3)_s5s@\jp(kJk5XT+s81pas5s@] +k5YJDs8D'cs5rJDk2u^Dk5##lk5YJDk5XT+s5rJDk5YJDs8V6]s5s=\!TsF\jqn'[k5XTDs5s@D +k5XT+s8V6Ds8V6Ds8W)\!<7W4J`_OGSEBhOJ,~> +JaVdjrr@W<p[8"\m-XuVmJuYT_<q:'rU'XcrU'Xco'Q__md:)C!:K:H!<)<i!:BjTmJm7dmJm7] +mJm7cmf*:emf!1qmJu\C!!)Eemd:)C!:K^a"7?0Wmf!4dmKrs^!:BjTmJu\C!<)<c!<2Ed!<;Kd +!<;Kd!!)H\!<;Ke!!;Qgmf!1fmJu\S!<2Ec!!)Hb!!DWh!:K[`"7?-hmf!1omJu\C!:K7Tmd:)C +rVuue!;u6f!:BjT!;Z$e!:BjT!:BjcmJm7dmJm7dme$P`mJuYTmK!4R#6=/lmJuYTme["]mKN[Z +!:BgemeZtmmJu\C!:BgemJu\C!.jQhmXaeqmf*9;~> +Ja2Lbrr@W8pZh_Xm-4]Rl2^)L_<M"#rTX@_rTX@_o'-G[lKSB7!:&k@!<)0e!9sRLl2Uh`l2UhY +l2Uh_lMgkalM^bml2^,7!!)9alKSB7!:'F]"6omOlM^e`l3[OV!9sRLl2^,7!<)0_!<29`!<;?` +!<;?`!!)<X!<;?a!!;EclM^bbl2^,K!<29_!!)<^!!DKd!:'C\"6ojdlM^bkl2^,7!:&hLlKSB7 +rVuua!;u*b!9sRL!;Yma!9sRL!9sR_l2Uh`l2Uh`lLb,\l2^)Ll2^eJ#6=#hl2^)LlMCSYl377R +!9sOalMCPil2^,7!9sOal2^,7!.jEdl@J5ilMgj7~> +J`c4Zrr@W4pZDJTm,eHNk5XTD_<(atrT4+[rT4+[o&^2Wk2u^+s5rJ8s8D'as5s@Dk5YJ\joGGU +joGG[k5YJ]k5PAik5XT+s8V6]k2u^+s5s4Y"6TXGk5PD\jpM.Ns5s@Dk5XT+s8D'[s8M0\s8V6\ +s8V6\rrD3Ts8V6]rrV?_k5PA^k5XTCs8M0[rrD3Zrr_E`s5s1X"6TX`k5PAgk5XT+s5rJDk2u^+ +rr3#]s8;!^s5s@Ds7td]s5s@Ds5s@[joGG\joGG\k4S`Xk5XTDk5YDB#QNrdk5XTDk552Ujp(kJ +s5s@]k55/ek5XT+s5s@]k5XT+s+0<`k(2Zak5PF3~> +JaVdjrrB=l!!)uc!!)uc!!(L9"9@iimJuVArW(73!!*#drrE&drr<5j!:BjTmf!4dmem+cmem+c +mem+cmf!1kmJm7T!!)HTrW!&g!:K:S!;Psf!:BjT!!)HT!;5a[!<2Ec!"J>rmJm7TmJu\C!:BjT +rW!/j!:BgemdC&S!:KU^s6]jerU'XcrpKdds6^'kmJm7TmK!7Srr<&er;Zicq>^N`rW!&g!!)Hb +!!DWh!:Kgd!:Kgd"7?-hmeQn`mem+emJu\S!"&&nmd:)C!:BjTrVuue!;c-_!;GpZ!<)<c!<)<c +!<2EZ!<;Kd!<)<d!:Kdcs6fR\rpKacs6f^`!:Kdc#4;HkmJuYTJaS*WJaSuprr@Q~> +Ja2LbrrB=h!!)u_!!)u_!!(L5"9@]el2^29rW(7/!!*#`rrE&`rr<5f!9sRLlM^e`lMU\_lMU\_ +lMU\_lM^bgl2UhL!!)<LrW!&c!:&kK!;Pgb!9sRL!!)<L!;5UW!<29_!"J2nl2UhLl2^,7!9sRL +rW!/f!9sOalK\?K!:'=Zs69RarTX@_rp'L`s69dgl2UhLl2^hKrr<&ar;Zi_q>^N\rW!&c!!)<^ +!!DKd!:'O`!:'O`"6ojdlM:J\lMU\al2^,K!"%ojlKSB7!9sRLrVuua!;c![!;GdV!<)0_!<)0_ +!<29V!<;?`!<)0`!:'L_s6B:Xrp'I_s6BF\!:'L_#3l0gl2^)LJa.gOJa/]hrr@Q~> +J`c4ZrrB=d!<<#[!<<#[!<:O1"TRWak5Xf1rr::+!<<&\s8W)\s8N8bs5s@Dk5PD\k5G;[k5G;[ +k5G;[k5PAck5YJDs8V6Drr3)_s5rJCs7k^^s5s@Ds8V6Ds7PLSs8M0[rse,jk5YJDk5XT+s5s@D +rr32bs5s@]k2u[C!9X(Vs5j=]rT4+[roX7\s5jOck5YJDk5YGCs8N)]rVll[qYpQXrr3)_s8V6Z +rr_E`s5s=\!9X:\"6TX`k5,)Xk5G;]k5XTCrs@ifk2u^+s5s@Drr3#]s8(mWs7b[Rs8D'[s8D'[ +s8M0Rs8V6\s8D'\s5s:[s5s%TroX4[s5s1X!9X7[#3Psck5XTDJ`_OGJ``E`rr@Q~> +JaVdjrrB:k!!*#d!!*#d!!(L9#QX;\!:K7TmK!4R!!)f^p&P$YrrE&drW)udrW)ob!!)l`rrE&d +rrE&drrE&d$NTV_!:BjT!:K7T!<2Bd!<2Be!:Kgd"7?-hmed%bmeZtcmJu\S!"SDsmJm7T!!)Ee +!:BjT!;Ps_!:Kgd!U]sZmK<OXmJu\S!!M]imd:)RmK<OX!!)Hb!!qummd:)C!!)Hc!!M]imd:)P +mK<OXmJu\S!!hol!:K7T!:Kab"7?-hmeZtamf!1hmJuYTmed%jmJuYTmJuYTmf!4dmcjcPme$P[ +me-Y\mdpMVm_Jo'mf!3;mXaeWm[<MC!.Y~> +Ja2LbrrB:g!!*#`!!*#`!!(L5#QX/T!:&hLl2^eJ!!)fZp&P$UrrE&`rW)u`rW)o^!!)l\rrE&` +rrE&`rrE&`$NTJW!9sRL!:&hL!<26`!<26a!:'O`"6ojdlMLV^lMCP_l2^,K!"S8ol2UhL!!)9a +!9sRL!;Pg[!:'O`!U9[Vl3%+Pl2^,K!!MQelKSBJl3%+P!!)<^!!qiilKSB7!!)<_!!MQelKSBH +l3%+Pl2^,K!!hch!:&hL!:'I^"6ojdlMCP]lM^bdl2^)LlMLVfl2^)Ll2^)LlM^e`lKS?LlLb,W +lLk5XlLY)RlG3K#lM^d7l@J5OlC$r;!.Y~> +J`c4ZrrB:c!<<&\!<<&\!<:O1#lj&Ls5rJDk5YDB!<;iVpAb'Qs8W)\rr<#\rr;rZ!<;oXs8W)\ +s8W)\s8W)\$ifAOs5s@Ds5rJDs8M-\s8M-]s5s=\"6TX`k5>5Zk55/[k5XTCrsn2kk5YJDs8V6] +s5s@Ds7k^Ws5s=\!TsFRjok_Hk5XTCrrhKak2u^Bjok_Hs8V6Zrs7cek2u^+s8V6[rrhKak2u^@ +jok_Hk5XTCrs.]ds5rJDs5s7Z"6TX`k55/Yk5PA`k5XTDk5>5bk5XTDk5XTDk5PD\k3DsHk4S`S +k4\iTk4J]Nk/%)tk5PC3k(2ZGk*bB3!.Y~> +JaVdjrrC71rrE&drrE&drrDTW"p")Z!:K7Tlg=`QrU'^emdC&S!:Kgd!:Kdc!:Kdc"muBY!!)Hc +!"&&n!:BjT!:K7TrU'^emdC&Ss6^*lmJm7T!:K:S!!DWh!:Kgd!U]semf*:cmJm7dmf*:emf*:e +mf*:cmf*:emf*7emed(bmLoTg!:K7Tmd:&TmJm7T!!)Ee!:K^a#4;HkmJm7Tr;[2m!:K7T!:BjT +mK!%M!<DQe!:fIZ!:BjTqu?cc!;l0d!:BjTr;cib!<DQd!!;Qgmem+dmK!(N!s%`hmem.cmKWa[ +!:BjT!:KU^!:Kgd!:Kgd!:KO\!:JnJ!:K=VrU0Xbp[7qZoBu>QrpKacqsOF`rpKX`"7?0W!<2Eb +!<;KQ!.jQhmXaesmf*9;~> +Ja2LbrrC7-rrE&`rrE&`rrDTS"p!rR!:&hLlfnHMrTXFalK\?K!:'O`!:'L_!:'L_"mQ*Q!!)<_ +!"%oj!9sRL!:&hLrTXFalK\?Ks69ghl2UhL!:&kK!!DKd!:'O`!U9[alMgk_l2Uh`lMgkalMgka +lMgk_lMgkalMghalMLY^l4X0_!:&hLlKS?Ll2UhL!!)9a!:'F]#3l0gl2UhLr;[2i!:&hL!9sRL +l2^VE!<DEa!:f=V!9sRLqu?c_!;l$`!9sRLr;ci^!<DE`!!;EclMU\`l2^YF!s%TdlMU__l3@=S +!9sRL!:'=Z!:'O`!:'O`!:'7X!:&VF!:'%RrTa@^pZhYVoBQ&Mrp'I_qs+.\rp'@\"6omO!<29^ +!<;?M!.jEdl@J5klMgj7~> +J`c4ZrrC7)s8W)\s8W)\s8VWO#63iJs5rJDlfJ3IrT41]k2u[C!9X:\!9X7[!9X7["m5jIs8V6[ +rs@ifs5s@Ds5rJDrT41]k2u[Cs5jRdk5YJDs5rJCrr_E`s5s=\!TsF]k5YJ[joGG\k5YJ]k5YJ] +k5YJ[k5YJ]k5YG]k5>8ZjqIdWs5rJDk2u^Dk5YJDs8V6]s5s4Y#3Psck5YJDrVm5es5rJDs5s@D +k5Y5=!WV<]s7,4Rs5s@Dr;Qf[s81p\s5s@DrVulZ!WV<\rrV?_k5G;\k5Y8>"97N`k5G>[jp1qK +s5s@Ds5s+V!9X:\!9X:\!9X"T!9WAB!9WeNrT=+ZpZDDRoB,fIroX4[qr[nXroX+X"6TXGs8M0Z +s8V6Is+0<`k(2Zck5PF3~> +JaVdjrrD-J!!*#drrE)erW)udrrE&d!!)rb"9@ii!:Kdc$gmupmJuYTmd:)C!<)<c!<2Ed!!;Qg +mf!4dmK*CV!<)?c!<2Ed!<;Kd!!)Hd!!;Qgmem+cmem+cme?bamJm7Tr;[/l!!)HT!!)HT!;l3a +!!)Hd!<;Hg!:K:S!!)Hd!!)Hb!<;Hk!:K7Tmd:)SmJm7dmf!1kmJm7T!!)EerpBsjmJuYT!:Kgd +"7?0W!<2Bi!:BjT!:K^a!q$'VqZ$lh!:BjT!:K:O!!Vcjmd:&TrpBadqsO.Xs6]jep[7_TqsNVI +q<kfo#4;KZ!:BgerpKac!q$'VrW)f_"9@iimK!(N"p"&kmJuYTp$VJQ"muBY!:BjcmKWa[!:BjT +!:K^a%.4)qmd:&TmJuYT!:Kdc!:K[`s6fjdJaS*WJaSrorr@Q~> +Ja2LbrrD-F!!*#`rrE)arW)u`rrE&`!!)r^"9@]e!:'L_$gI]ll2^)LlKSB7!<)0_!<29`!!;Ec +lM^e`l2gtN!<)3_!<29`!<;?`!!)<`!!;EclMU\_lMU\_lM(>]l2UhLr;[/h!!)<L!!)<L!;l'] +!!)<`!<;<c!:&kK!!)<`!!)<^!<;<g!:&hLlKSBKl2Uh`lM^bgl2UhL!!)9aros[fl2^)L!:'O` +"6omO!<26e!9sRL!:'F]!pTdNqZ$ld!9sRL!:&kG!!VWflKS?LrosI`qs*kTs69RapZhGPqs*>E +q<GNk#3l3R!9sOarp'I_!pTdNrW)f["9@]el2^YF"p!ogl2^)Lp$22M"mQ*Q!9sR_l3@=S!9sRL +!:'F]%-dfmlKS?Ll2^)L!:'L_!:'C\s6BR`Ja.gOJa/Zgrr@Q~> +J`c4ZrrD-B!<<&\s8W,]rr<#\s8W)\!<;uZ"TRWas5s:[$g.Khk5XTDk2u^+s8D'[s8M0\rrV?_ +k5PD\joYSFs8D*[s8M0\s8V6\rrD3\rrV?_k5G;[k5G;[k4nrYk5YJDrVm2ds8V6Ds8V6Ds81sY +rrD3\s8V3_s5rJCrrD3\rrD3Zs8V3cs5rJDk2u^CjoGG\k5PAck5YJDs8V6]roOFbk5XTDs5s=\ +"6TXGs8M-as5s@Ds5s4Y!p9OFqu6o`s5s@Ds5rJ?rrqQbk2u^DroO4\qr[VPs5j=]pZD2Lqr[)A +q<#9g#3PsJs5s@]roX4[!p9OFrr;iW"TRWak5Y8>#63ick5XTDp#brI"m5jIs5s@[jp1qKs5s@D +s5s4Y%-ITik2u^Dk5XTDs5s:[!9X.Xs5s=\J`_OGJ``B_rr@Q~> +JaVdjrrD*I!!*#d!!*#d!!*#d!!*#d!!)l`!<DQ[!!DWhmK!.P!!*#dquHcbrrE)e!!*#d!s%cW +!<2Bd!<2Ed!<;Ke!!)Hc!!DWh!:KL[#OVT[!:K7Tmem.cmK3IWmK!1Q#6=/l!:Bgemem.cmK<OX +!!)Ha!!VcjmJuYTrU'pkmd:)CmJu\CqZ-W`#6=2[!:K7Tmem+cmf!4amf!4cmem.bmeZtamdC,U +mf!4cmf*:dme-Y\mJm7`ma(t6maM4:mem+cmf!1dmf!1gmJm7Tq>^N`r;[/l!:Bgemd:)Cmf!1f +mJu\S!!2Kfr9aahmd:)CmK!.P#QX8m!:BgemK!"Lqu?ie!!)Hb!<;I6!:K7Tmd:)CmJu\C!:K7T +md:&TmJuYTmJm7TmJuYT!:BjTmJu\P!!_ik!:BjT!.jQhmXaepmf*9;~> +Ja2LbrrD*E!!*#`!!*#`!!*#`!!*#`!!)l\!<DEW!!DKdl2^_H!!*#`quHc^rrE)a!!*#`!s%WO +!<26`!<29`!<;?a!!)<_!!DKd!:'4W#O2<S!:&hLlMU__l2q%Ol2^bI#6=#h!9sOalMU__l3%+P +!!)<]!!VWfl2^)LrTXXglKSB7l2^,7qZ-W\#6=&S!:&hLlMU\_lM^e]lM^e_lMU_^lMCP]lL+]Q +lM^e_lMgk`lLk5Xl2Uh\lHfP2lI5e6lMU\_lM^b`lM^bcl2UhLq>^N\r;[/h!9sOalKSB7lM^bb +l2^,K!!2?br9=IdlKSB7l2^_H#QX,i!9sOal2^SDqu?ia!!)<^!<;=2!:&hLlKSB7l2^,7!:&hL +lKS?Ll2^)Ll2UhLl2^)L!9sRLl2^,H!!_]g!9sRL!.jEdl@J5hlMgj7~> +J`c4ZrrD*A!<<&\!<<&\!<<&\!<<&\!<;oX!WV<Srr_E`k5Y>@!<<&\r;ZfZs8W,]!<<&\"97NG +s8M-\s8M0\s8V6]rrD3[rr_E`s5s"S#Nl'Ks5rJDk5G>[jobYGk5YAA#QNrds5s@]k5G>[jok_H +s8V6YrrqQbk5XTDrT4Cck2u^+k5XT+qu?ZX#QNrKs5rJDk5G;[k5PDYk5PD[k5G>Zk55/Yk3r<M +k5PD[k5YJ\k4\iTjoGGXk0X/.k1'D2k5G;[k5PA\k5PA_k5YJDqYpQXrVm2ds5s@]k2u^+k5PA^ +k5XTCrrM9^r8n4`k2u^+k5Y>@#lj&es5s@]k5Y2<r;Ql]s8V6Zs8V4.s5rJDk2u^+k5XT+s5rJD +k2u^Dk5XTDk5YJDk5XTDs5s@Dk5XT@rs%Wcs5s@Ds+0<`k(2Z`k5PF3~> +JaVgkrW)udrrE&drrDBQ"T[uY!!)Hd!!Vcj!:K7Tq!J._mdpJ\mJm7cmK*CVme$S[mK3IWmK!4R +"T[uY!!)H\!<;KY!!_ik!:K7Tmem+cmem+dmK!+O!W_ZVrW!/j!!)HT!:Kdc!:KabrpKacqsFRe +mJuYTrU0Uar9aXemJu\#!!)Hd!<;He!<2Bd!;Z'^!!Vcj!:K7Tp$VbY!:Kdc!U]semK*CVmeHk_ +me?b^mem.[mem+hmJuYTmdC&S!:Kgd!:Kdc!q$'Vr;ZicrW!#f!:Kab!:Kgd#4;KZ!:BjTq#CE_ +q>^fh!!)EemJu\Cr;[2m!!)EemJm7TmK!7S!!*#d!!*#d!!)uc$39JomJuYTmJuYTq<mbQ!U]se +mf*:dmK3IW!:Kgds6fmes6fgcrpKdds6fmes6fjd%.4)qmJuYT!:BjTmJqh+JaS*WS*p:VJ,~> +Ja2OcrW)u`rrE&`rrDBM"T[iQ!!)<`!!VWf!:&hLq!%k[lLY&Xl2Uh_l2gtNlLb/Wl2q%Ol2^eJ +"T[iQ!!)<X!<;?U!!_]g!:&hLlMU\_lMU\`l2^\G!W_NNrW!/f!!)<L!:'L_!:'I^rp'I_qs":a +l2^)LrTa=]r9=@al2^+p!!)<`!<;<a!<26`!;YpZ!!VWf!:&hLp$2JU!:'L_!U9[al2gtNlM1G[ +lM(>ZlMU_WlMU\dl2^)LlK\?K!:'O`!:'L_!pTdNr;Zi_rW!#b!:'I^!:'O`#3l3R!9sRLq#CE[ +q>^fd!!)9al2^,7r;[2i!!)9al2UhLl2^hK!!*#`!!*#`!!)u_$39>kl2^)Ll2^)Lq<IJM!U9[a +lMgk`l2q%O!:'O`s6BUas6BO_rp'L`s6BUas6BR`%-dfml2^)L!9sRLl2ZD#Ja.gOS*L"RJ,~> +J`c7[s8N3%k2u^DroX7\lfJBNk2u^Dk5PAak5YJDk5Y5=!WV<SrrV?_s8D']s5rJ:s8V3`s5rJD +rT4:`k2u^Dk4\iTk4ATWk5YJDk5XTBrrD3[rrM9^qW7kZk2u[C#3Psck2u^+rVll[r;ZcYrr;lX +"TRWak5YDBrVufX"97N`k0Eu,k5PD\joGG\joGGWk5PAak5YJDk5Y,:rVll[rVlo\s8M-^s5rJ> +s8V6VrrD3[s7b[SrrqQbk5XT+rr2u\rr2u\rVlr]s5s:[!9X:\!p9OFr;QcZrr32bs5s@Ds5s.W +!9X.X#j20ek5XTDk2uXB$KhBgk5XTDs5rJDroO4\roO4\roO4\rT4Iek5XTDk5XTDk5Y8>nc&XP +s8M0\s8M-_s5s@Drr<#\s8W,]rVulZs8W,]s8W,]rr3Dhs8V6]k5YJDs5rJDJ`_OGJ``Harr@Q~> +JaVdjrrE)errE)errD<O$io\qmJuYTmJuYTmJutK!<DQd!!)Hc!!VcjmJuYTrpBadrU'[dmed%j +mJu\C!:BjT!;l0h!:BjT!:BjTq#CNb!:K:K!!DWhmdBWGrU'jimJuYT!:Kdc"7?0Wmd'oRmdC/U +mdgGVmf!4cmem.bmeZtamed(bmK!=Ur;[5n!!)Ee!:K7Tmd:)NmK!=UrW!&g!:Bj[mK!=UrW!#f +!:Kgd"muBYmJu\Q!!holmJm7T!:Kdc"muBY!!)Hd!;Z$`!:Kgd&+0GcmJm7T!:BjT!:Bgemem+c +med%bme-V\mf!1dmf!1dme$P[mf!1dmf!4dmf!1dmf!1imJm7T!:KgdrpBgfmK!4R!!)uc%fl%c +!:BjTmJuYTmd:)C!;l3a!<2Ec!<;Kc!!)Hc!"82pmJm7T!:BgemdC&Ss6fO[s6^'kmJu\C!:K[` +s6fmerpBadJaS*WJaT&rrr@Q~> +Ja2LbrrE)arrE)arrD<K$ioPml2^)Ll2^)Ll2^PC!<DE`!!)<_!!VWfl2^)LrosI`rTXC`lMLVf +l2^,7!9sRL!;l$d!9sRL!9sRLq#CN^!:&kC!!DKdlK[p?rTXRel2^)L!:'L_"6omOlKeKNlL+`Q +lLP#RlM^e_lMU_^lMCP]lMLY^l2^nMr;[5j!!)9a!:&hLlKSBFl2^nMrW!&c!9sRWl2^nMrW!#b +!:'O`"mQ*Ql2^,I!!hchl2UhL!:'L_"mQ*Q!!)<`!;Ym\!:'O`&*a/[l2UhL!9sRL!9sOalMU\_ +lMLV^lLk2XlM^b`lM^b`lLb,WlM^b`lM^e`lM^b`lM^bel2UhL!:'O`rosObl2^eJ!!)u_%fkn[ +!9sRLl2^)LlKSB7!;l']!<29_!<;?_!!)<_!"8&ll2UhL!9sOalK\?Ks6B7Ws69dgl2^,7!:'C\ +s6BUarosI`Ja.gOJa/cjrr@Q~> +J`c4Zs8W,]s8W,]s8V?G%0,Jik5XTDk5XTDk5Y/;!WV<\rrD3[rrqQbk5XTDroO4\rT4.\k5>5b +k5XT+s5s@Ds81p`s5s@Ds5s@Dq>UQZs5rJ;rr_E`k2u77rT4=ak5XTDs5s:["6TXGk3W*Jk3r?M +k4AWNk5PD[k5G>Zk55/Yk5>8ZjoPMErVm8fs8V6]s5rJDk2u^>joPMErr3)_s5s@SjoPMErr3&^ +s5s=\"m5jIk5XTArs.]dk5YJDs5s:["m5jIs8V6\s7tdXs5s=\&*EoSk5YJDs5s@Ds5s@]k5G;[ +k5>5Zk4\fTk5PA\k5PA\k4S`Sk5PA\k5PD\k5PA\k5PAak5YJDs5s=\roO:^k5YDB!<<#[&-(eS +s5s@Dk5XTDk2u^+s81sYs8M0[s8V6[rrD3[rsRuhk5YJDs5s@]k2u[Cs5s"Ss5jOck5XT+s5s1X +s5s@]roO4\J`_OGJ``Kbrr@Q~> +JaVdjrW!,i!!)Ee!9`eL!!)Hd!!)Hd!;GpO!<;Hh!:K7TqsO:\rU0Xbq<n4^!:J57!q$'VkQ(YN +rW)rcnGrUWoDf'_!:BjT!<2Bi!:BjT!:K^a!q$'VqZ%)n!:BjT!!)Ee!:Bgemf!4dmKWa[!:BjT +mK!4RrrE)err<&erW)WZ"T[uY!:K:R!!Vcj!:BjTqu?`br;ZicrW!#f!:K[`"RZ9X!!)oa&ch@f +!:K7T!:K7T!:BgemJm7Tr;ZicrW)udrr<&erVurdrVurdrVurdr;Zoe!!*#drr<&equ?`br;[2m +!!)EemJu\C!:Kgd"RZ9X!!*#drrE#c!!)ZZ!!)uc!!)uc!!)WY!!*#d!!*#d!W_WgrpBadrpBad +rU'XcrpBadrpBgfmdC&SqX+CbmdC&S!:KO\rpKddJaS*WJaT)srr@Q~> +Ja2LbrW!,e!!)9a!9`YH!!)<`!!)<`!;GdK!<;<d!:&hLqs+"XrTa@^q<IqZ!:%r3!pTdNkQ(YJ +rW)r_nGrUSoDf'[!9sRL!<26e!9sRL!:'F]!pTdNqZ%)j!9sRL!!)9a!9sOalM^e`l3@=S!9sRL +l2^eJrrE)arr<&arW)WV"T[iQ!:&kJ!!VWf!9sRLqu?`^r;Zi_rW!#b!:'C\"R6!P!!)o]&ch4^ +!:&hL!:&hL!9sOal2UhLr;Zi_rW)u`rr<&arVur`rVur`rVur`r;Zoa!!*#`rr<&aqu?`^r;[2i +!!)9al2^,7!:'O`"R6!P!!*#`rrE#_!!)ZV!!)u_!!)u_!!)WU!!*#`!!*#`!W_KcrosI`rosI` +rTX@_rosI`rosOblK\?KqW\+^lK\?K!:'7Xrp'L`Ja.gOJa/fkrr@Q~> +J`c4Z#QXo)k5YJDs8V9Err2u\rr2u\rr;`Tnc/XO"97NGs81sTs8D*Zs7tgVrrD3/rrV?_k32jF +k5PD[k4/KOk4JZWk5XTDk5YGC"om`bk5XT@rrV?_k55/fk5XTDk5YJDs8V6]s5s=\s5jRdk5XTD +k2u^Bk5YJ]k5YG]k5PDRjoteIk5XT+rVm&`s8V6]k5>5Zk5G;[k5PA^k5XT?rrhKak5YJYjq@^V +k5XT+s8V6Ds8V6]s5s@]k5G;[k5PD\k5YG]k5PA\k5PA\k5PA\k5G;]k5YJ\k5YG]k5>5Zk5G;e +k5YJDs5s@Dk5XTCrrhKak5YJ\k5YJ[joGGRjoGG[joGG[joGGQjoGG\joGG\joYSFs8M-\s8M-\ +s8D'[s8M-\s8M-^s5rJCs8(jZs5rJCrrD3Ts8M0\s+0<`k(2Zck5PF3~> +JaVdjq#K^JmK!1QlN$qP^&S0$q>^fh!!)EemJm7TqZ-T_o`,0`!:BjT!<2Bf!:K:Q!!)H`!;u9a +!!)Hd!#t>+!:Bgemd:)C!:K7Tmd:&TmJm7T!!)Ee!:K^a!:Kdc"7?-hme["`mf!4bmJm7dmK*CV +me-YZmK<OXmJu\B!!M]imJu\O!!)H_!<;Ke!<)<g!:K7T!<2Bp!:BjTmJm7T!:Bgemem+fmJm7T +rW)udmJm7Tr;Zicr;cibrrDo`p&O=E!!*#d!!*#d!!)l`!!)ucrrE)er;clcrrE)e"p")Z!:K7T +qsFmnmd:)CmJu\C!:BjT!;c*g!:K7T!:BjTqZ$Zb!<2Bd!5%Y!!<)<c!<)<c!.jQhmXafmmf*9;~> +Ja2Lbq#K^FmK!1MlN$qL^&S/uq>^fd!!)9al2UhLqZ-T[o`,0\!9sRL!<26b!:&kI!!)<\!;u-] +!!)<`!#t2'!9sOalKSB7!:&hLlKS?Ll2UhL!!)9a!:'F]!:'L_"6ojdlMCS\lM^e^l2Uh`l2gtN +lLk5Vl3%+Pl2^,:!!MQel2^,G!!)<[!<;?a!<)0c!:&hL!<26l!9sRLl2UhL!9sOalMU\bl2UhL +rW)u`mJm7Pr;Zi_r;ci^rrDo\p&O=A!!*#`!!*#`!!)l\!!)u_rrE)ar;cl_rrE)a"p!rR!:&hL +qs"UjlKSB7l2^,7!9sRL!;bsc!:&hL!9sRLqZ$Z^!<26`!5%Lr!<)0_!<)0_!.jEdl@J6elMgj7~> +J`c4ZrrDrrlK7O7r9!>FroUrp!9X.X#j20ek5XTDs5s4YrT<eQ"m5jIs5s@\joYSFk5>5Zk5,,U +k5PA\k5PB"k5YJDs8V6Ds5s@Dk5XT+s8V6]s5s@]k5YJDqu6ZYrVlu^s8V6Ys8M0[s8D'[s8M-^ +s5rJ;s8D'_s5rJDk3`0Ok5XTDk5,)Xk5#&Wk5YJ[jok_Hk5YJ\jp_:Ps5rJDs5s@Ds8V6[rr_E` +s5s=\s5rbL!9X7[!9X7[roX7\qW@MOkiMmFroO4\roO4\qW7eXrT=.[s5s:[s5s@]s5jOck2u^+ +k5Y>@%KGSQs5rJDk2u^+s5s@Xjp1qKk5YJDs5s4Y!TsF]joGFnjoGG[joGG[joGF4k(2ZGk3V71 +!.Y~> +JaVdjrr<&er;bsIrVurdrVurdr;cfa!!)uc!W_ZVoDemZrW)rc!!*#dp]1<]rW)c^rVurdrVurd +q#LH_oDngWoDnpZnc/aZ!:K^a$gmupmJm7TmJu\C!<2E\!!Vcj!:BgerpC3qmJuYT!:BjT!!)HT +!<2Bd!<2Be!:Kgd"7?-hmed%bmeZtamf!1fmJu\D!!VcjmJm7TrW)udrW)`]rrE)e!<DQa!!)HO +!!_ikmJm7T!<)<f!:K7TrU'XcrpKddrpKddrpKddrpBmhmJm7Tr;Zicr;clcpAb6^!<2Bk!:K7T +!:K7TrpBado^;\Ym-XiRrU'XcrpKdd"RZ9X!!*#d!!)rb!!*#d!s%`hmem+emJm7cmK<OX!:Bj_ +mf!1dmem+cmf!1dmem.bmf*:emK!=Uq#CQc!:K7T\aBFtrpBadrpKddrU'XcrU'XcrpBadrpKac +s6fjds6]pgmJqh+JaSE`rr@Q~> +Ja2Lbrr<&ar;bsErVur`rVur`r;cf]!!)u_!W_NNoDemVrW)r_!!*#`p]1<YrW)cZrVur`rVur` +q#LH[oDngSoDnpVnc/aV!:'F]$gI]ll2UhLl2^,7!<29X!!VWf!9sOarospml2^)L!9sRL!!)<L +!<26`!<26a!:'O`"6ojdlMLV^lMCP]lM^bbl2^,<!!VWfl2UhLrW)u`rW)`YrrE)a!<DE]!!)<K +!!_]gl2UhL!<)0b!:&hLrTX@_rp'L`rp'L`rp'L`rosUdl2UhLr;Zi_r;cl_pAb6Z!<26g!:&hL +!:&hLrosI`o]lDUm-4QNrTX@_rp'L`"R6!P!!*#`!!)r^!!*#`!s%TdlMU\al2Uh_l3%+P!9sR[ +lM^b`lMU\_lM^b`lMU_^lMgkal2^nMq#CQ_!:&hL\`s.prosI`rp'L`rTX@_rTX@_rosI`rp'I_ +s6BR`s69Xcl2ZD#Ja/-Xrr@Q~> +J`c4Zrr<&]rVu!Arr2u\rr2u\rVuiY!<<#[!rqEFo`"pRrr;u[!<<&\q#C?Urr;fVrr2u\rr2u\ +q>^KWo`+jOo`+sRo)AdRs5s4Y$g.Khk5YJDk5XT+s8M0TrrqQbs5s@]roO[ik5XTDs5s@Ds8V6D +s8M-\s8M-]s5s=\"6TX`k5>5Zk55/Yk5PA^k5XT4rrqQbk5YJDrr<#\rr;cUs8W,]!WV<YrrD3G +rs%Wck5YJDs8D'^s5rJDrT4+[roX7\roX7\roX7\roO@`k5YJDrVll[rVuo[p\t9Vs8M-cs5rJD +s5rJDroO4\o]H/Qm,e<JrT4+[roX7\"QoaHs8W)\!<;uZ!<<&\"97N`k5G;]k5YJ[jok_Hs5s@W +k5PA\k5G;[k5PA\k5G>Zk5YJ]joPMEq>UT[s5rJD\`NnlroO4\roX7\rT4+[rT4+[roO4\roX4[ +s5s=\s5jC_k5U"pJ`_jPrr@Q~> +JaVgko`4:F%05ermJuYTmJuYTmJm7dmJm7dmK*CVmcslQmf*7smJuYTmJuYT!:BjT!:BjamKWa[ +!:BjT!:K^a!:Kab!:KR]!q$'Vo`,0`!!)Eemed%bmed(bmKN[Z!:K7TmeQn`mf!1emK!7S!W_ZV +p]1?^rrE)err</h!:K:R!!)Hd!"/,omJm7T!:BjTmf!4dmem+cmem+cmem+cmem+cme-Y[mf!4` +mK<OX!:BjdmK<OX!:Bj^mL90amJu\C!!)EemJuYTrpK[as6]jerpBdemf!4dmJm7dmJm7RmJm7d +mJm7dmJm7_mf*7lmJuYT!:K7TrpKCY%IO2rmd:&TmJm7TmJm7cmK<OX!:K:K!<2Ed!<)<e!:Bjc +mK3IW!:Kgds6fjd!:KgdrpBadqX+Rgmd:&TmJu\Q!;l3`!;Gp\!!M]i!:K:S!!)Hd!!holmJuYT +!:KFYrU'Xc]^?4/md:&TmJuYT!:K7T!<2Bd!;u6b!<2Bn!:BjT!:BjT!:Bi<mXae_mf*9;~> +Ja2Oco`4:B%05Ynl2^)Ll2^)Ll2Uh`l2Uh`l2gtNlK\HMlMghol2^)Ll2^)L!9sRL!9sR]l3@=S +!9sRL!:'F]!:'I^!:':Y!pTdNo`,0\!!)9alMLV^lMLY^l377R!:&hLlM:J\lM^bal2^hK!W_NN +p]1?ZrrE)arr</d!:&kJ!!)<`!".ukl2UhL!9sRLlM^e`lMU\_lMU\_lMU\_lMU\_lLk5WlM^e\ +l3%+P!9sR`l3%+P!9sRZl4!aYl2^,7!!)9al2^)Lrp'C]s69RarosLalM^e`l2Uh`l2UhNl2Uh` +l2Uh`l2Uh[lMghhl2^)L!:&hLrp'+U%I*onlKS?Ll2UhLl2Uh_l3%+P!:&kC!<29`!<)0a!9sR_ +l2q%O!:'O`s6BR`!:'O`rosI`qW\:clKS?Ll2^,I!;l'\!;GdX!!MQe!:&kK!!)<`!!hchl2^)L +!:'.UrTX@_]]oq+lKS?Ll2^)L!:&hL!<26`!;u*^!<26j!9sRL!9sRL!9sQ8l@J5WlMgj7~> +J`c7[p&F=>%KGSjk5XTDk5XTDk5YJ\joGG\joYSFk3N'Ik5YGkk5XTDk5XTDs5s@Ds5s@Yjp1qK +s5s@Ds5s4Y!9X4Z!9X%U!p9OFp&>3Xs8V6]k5>5Zk5>8Zjp(kJs5rJDk5,)Xk5PA]k5YGC!rqEF +q#CBVs8W,]s8N2`s5rJBrrD3\rsIogk5YJDs5s@Dk5PD\k5G;[k5G;[k5G;[k5G;[k4\iSk5PDX +jok_Hs5s@\jok_Hs5s@Vjph@Qk5XT+s8V6]k5XTDroX.Ys5j=]roO7]k5PD\joGG\joGGJjoGG\ +joGG\joGGWk5YGdk5XTDs5rJDroWkQ%Hd]jk2u^Dk5YJDk5YJ[jok_Hs5rJ;s8M0\s8D']s5s@[ +jobYGs5s=\s5s=\!9X:\roO4\qW8%_k2u^Dk5XTAs81sXs7b[TrrhKas5rJCrrD3\rs.]dk5XTD +s5rqQrT4+[]]K\'k2u^Dk5XTDs5rJDs8M-\s8;!Zs8M-fs5s@Ds5s@Ds5s?4k(2ZOk5PF3~> +JaVdjrr<&er;c$K"T[uY!!)Hd!"nW!!:K7T!:K7Tmd:)CmJm7Tr;Zicr;Zrf!!)Hd!!2KfrU(6t +md:&TmJm7TmJm7TmJu\C!<)<h!:K7T!:KO\"7?-hmeHhhmJm7TmJuYT!:K.Q!:Kgds6]pgmdBoO +!:Kgds6fjdrpK:VrpKddrpBadrpKacrpKddrU'XcrpBadrpBgfmdC&Ss6^*lmJu\C!:BjdmJm7d +meZtimJu\C!:BjT!;l3_!<;Hk!:K7Tmd:)MmLTBd!:Bgemd:&TmJm7T!!)Hc!!qum!:K7TmJu\S +!!M]imd:)?mKWa[!!)HT!!)uc!!)ucrVurdqu?`bnGig^!:BjTmJu\O!!Vcjmd:&TrpBdemf!1l +mJm7T!:BjT!<2Bd!<2Bd!<2Bf!:K:R!<;Hg!:K:R!<;He!;Psa!:BjTli@(Ro)K'a!!)Eemd:)C +mf<@T!!'Uu%fl"tmJu\C!:BgemJu\C!;c*l!:K7T!:BgemJm7T!.jQhmYL<2!.Y~> +Ja2Lbrr<&ar;c$G"T[iQ!!)<`!"nJr!:&hL!:&hLlKSB7l2UhLr;Zi_r;Zrb!!)<`!!2?brTXsp +lKS?Ll2UhLl2UhLl2^,7!<)0d!:&hL!:'7X"6ojdlM1Ddl2UhLl2^)L!:&kM!:'O`s69XclK\3G +!:'O`s6BR`rp'"Rrp'L`rosI`rp'I_rp'L`rTX@_rosI`rosOblK\?Ks69ghl2^,7!9sR`l2Uh` +lMCPel2^,7!9sRL!;l'[!<;<g!:&hLlKSBEl4<s\!9sOalKS?Ll2UhL!!)<_!!qii!:&hLl2^,K +!!MQelKSB7l3@=S!!)<L!!)u_!!)u_rVur`qu?`^nGigZ!9sRLl2^,G!!VWflKS?LrosLalM^bh +l2UhL!9sRL!<26`!<26`!<26b!:&kJ!<;<c!:&kJ!<;<a!;Pg]!9sRLli@(No)K']!!)9alKSB7 +mf<@P!!'Uq%fkkpl2^,7!9sOal2^,7!;bsh!:&hL!9sOal2UhL!.jEdlA4a*!.Y~> +J`c4Zrr<&]rVu'C"om`Is8V6\rt4Dns5rJDs5rJDk2u^+k5YJDrVll[rVlu^s8V6\rrM9^rT4^l +k2u^Dk5YJDk5YJDk5XT+s8D'`s5rJDs5s%T"6TX`k5##`k5YJDk5XTDs5rYI!9X:\s5jC_k2uO? +!9X:\s5s=\roWbNroX7\roO4\roX4[roX7\rT4+[roO4\roO:^k2u[Cs5jRdk5XT+s5s@\joGG\ +k55/ak5XT+s5s@Ds81sWs8V3cs5rJDk2u^=jq.RTs5s@]k2u^Dk5YJDs8V6[rs7ces5rJDk5XTC +rrhKak2u^/jp1qKs8V6Ds8W&[!<<#[rr2u\r;QcZnc&jVs5s@Dk5XT?rrqQbk2u^DroO7]k5PAd +k5YJDs5s@Ds8M-\s8M-\s8M-^s5rJBs8V3_s5rJBs8V3]s7k^Ys5s@Dm/R+JoD]*Ys8V6]k2u^+ +n,NCL!<9Xm&-(elk5XT+s5s@]k5XT+s8(jds5rJDs5s@]k5YJDs+0<`k(r1"!.Y~> +JaVdjq#K[I!!*#d!!*#d!!*#d!!*#drr<>m!:BjTmJm7To`,']!:KgdrU'XcrpBadrpC!kmd:&T +md:)SmK3IWmK!7S!!*#drW!&g!!)HT!<;KJ!!)H`!!)Hc!!)Hc!;c-`!<;K_!;c*`!<)<c!<)<e +!:BjdmJm7dmJm7bmL]HemJu\C!!)EemJuYTmJuYTr9aUdmdBrP!:Kgds6^!imJm7Tp&P-\#6=/l +mJm7T!<)<d!:Kabs6fjd!:Kgds6]mfmed%gmJuYTmdBlNs6fgc"RZ9X!!)ucrrE#c"p")Z!:BjT +r;clcrrE&d!<DQd!!M]imJu\S!!)Hd!!)Hd!!)H^!<;Ka!"&&n!:K7T!:BjTrVurdrW!;n!:K7T +md:)CmK!1Q$39M^!:K7T!:BjTp&OjTrW!#f!:KdcqX4=_rpBadrpBgfmdB]I"RZ9X!:K.Q\F0=r +$LRo^!:BgemJuYTq!JIhmJuYTmJuYTmJqh+JaS<]rr@Q~> +Ja2Lbq#K[E!!*#`!!*#`!!*#`!!*#`rr<>i!9sRLl2UhLo`,'Y!:'O`rTX@_rosI`ros^glKS?L +lKSBKl2q%Ol2^hK!!*#`rW!&c!!)<P!<;?F!!)<\!!)<_!!)<_!;c!\!<;?[!;bs\!<)0_!<)0a +!9sR`l2Uh`l2Uh^l4F$]l2^,7!!)9al2^)Ll2^)Lr9==`lK\6H!:'O`s69^el2UhLp&P-X#6=#h +l2UhL!<)0`!:'I^s6BR`!:'O`s69UblMLVcl2^)LlK\0Fs6BO_"R6!P!!)u_rrE#_"p!rR!9sRL +r;cl_rrE&`!<DE`!!MQel2^,K!!)<`!!)<`!!)<Z!<;?]!"%oj!:&hL!9sRLrVur`rW!;j!:&hL +lKSB7l2^bI$39AV!:&hL!9sRLp&OjPrW!#b!:'L_qWe%[rosI`rosOblK\!A"R6!P!:&kM\Ea%n +$L.WV!9sOal2^)Lq!&1dl2^)Ll2^)Ll2ZD#Ja/$Urr@Q~> +J`c4ZrrDrrl/i!GroO4\roO4\roO4\roX7\#j20Ls5rJDs5s"S!p9OFrr;rZ!<<&\!<<&\#QNrK +s8V6Ds8M-_s5rJDroO4\roX4["6TX`k3i9Lk2cOBk5,)Xk5G;[k5G>Vk5YJ]k5#&RjoGG[joGG[ +joYSFs8M-\s8M-\s8;!ks5rJDk2u^Dk5XTDk5XTDk5YAA!rqEFqu6ZYrr<#\"TRWas5s%Ts5jRd +k5XTDs5s@[joPMEr;ZfZrr2u\rr<#\!WV<[rrqQbk5XT+q>^KWrVm#_s5s@]rT=.[rT4=ak2u^+ +s5s:[s5s@]roO7]k5G;_k5XTDk5PA\k5PA\k5PA\k4nuVk55/bk5YJDk5YJDs5s=\!9X:\$KhBN +k5XT+s5rJDr8n@dk2u^+k5YJDs5s%TpZDJT!p9OFrVu`Vrr;u[!<<&\!rqEFo`#'Vs5s@Dli4KW +rr3>fs5s@Ds8V6]k5Y5=$NK8gk5XTDk5XTDJ`_OGLZ\U:J,~> +JaVdjrW!,i!!)Ee!:0%Q!<2Ed!!)Hc!!)Hd!<;Kb!<;Hs!:K7TmJu\C!:BjTmJu\K!<2Ed!<2Ec +!<;Hg!:Bjcmf*:dmf*7emem+cmf!4dmf!1fmJu\I!<;KX!<;Hf!:KL[s6^3omJuYTmJuYTmK!"L +!s%`hmeQqZmJm7dmJm7dmJm7dmKN[ZmJu\C!;c*e!:BjT!:KX_"RZ6imK!7SoDnpZrrE)e"9@ii +mdBoOs6fme!:Kgd"7?0WmdpJZmf!1dme$P[mf!1dmed%mmJuYTmJuYTmJuYTrpBjgmd:)SmJm7d +mf!4dmK!=Ur;Zico)SgYjT#;Kr;clcrVurdq#CTd!:BjT!;c*f!:BjT!:K:S!!;Qgme["[mdL5U +mK<OX!:BjdmK<OXmJu\S!!)H_!<;Kd!<2E_!!_ikmd:)Cmem+dmJsleo`5$[rW)la!!)ucr;Zic +quD<9JaS9\rr@Q~> +Ja2LbrW!,e!!)9a!:/nM!<29`!!)<_!!)<`!<;?^!<;<o!:&hLl2^,7!9sRLl2^,C!<29`!<29_ +!<;<c!9sR_lMgk`lMghalMU\_lM^e`lM^bbl2^,A!<;?T!<;<b!:'4Ws69pkl2^)Ll2^)Ll2^SD +!s%TdlM:MVl2Uh`l2Uh`l2Uh`l377Rl2^,7!;bsa!9sRL!:'@["R5sel2^hKoDnpVrrE)a"9@]e +lK\3Gs6BUa!:'O`"6omOlLY&VlM^b`lLb,WlM^b`lMLVil2^)Ll2^)Ll2^)LrosRclKSBKl2Uh` +lM^e`l2^nMr;Zi_o)SgUjT#;Gr;cl_rVur`q#CT`!9sRL!;bsb!9sRL!:&kK!!;EclMCSWlL4fQ +l3%+P!9sR`l3%+Pl2^,K!!)<[!<;?`!<29[!!_]glKSB7lMU\`l2\H]o`5$WrW)l]!!)u_r;Zi_ +quD<5Ja/!Trr@Q~> +J`c4Z#QXo)k5YJDs8VEI!<<&\s8N)]rVll[rr<#\r;ZfZ%fb\Rs5s@Dk5XTDk2u^+pAb-Ss8W)\ +rr<#\!rqE_rT=.[roX7\!9X7[!9X:\s5s=\!p9OFo`+sRo)JaP!WV<Ts8V3gs5s@Ds5s@Ds5s@U +jobYGs5s1Xq;q\WroO4\roO4\roOFbk2u^+k5Y;?"om`bk5XT>rrhKas5s@\k4J]Rk5YJ]jok_H +s5rJ?s8V6]rrD3\rr_E`k2u=9!9X:\!9WtS!9X:\!9X4Z$g.KOs5s@Ds5s@Ds8M-_s5rJDroO4\ +roX4[s5j@^k5G;[k4AWQk2lUCk5G>[k5PA\k5##\k5XTDk5Y;?#63ick5XT+rr3&^s5s4Yq<%2H +roO@`k5XTDroO@`k2u^+rr2u\q>^KWrr;u[qYpc^s5rJDk2uXB!TsEok4ScSk5PDYjoGG[k5G;[ +k5>71k(2ZLk5PF3~> +JaVdjrrE)errE)errDER!!)uc#lsD]!:BjT!:K:K!<2Bd!<)<c!<)<c!<2Ec!!2KflL"WPrpBad +rpKdds6^6pmJuYTmd:&TmJu\S!!)Hc!!2KfrU'^emdBQE!:K^as6^<rmJu\C!:BgemJm7T!;5a\ +!:Kgd!:Kab!q$$grU0[cs6fgcrpBjgmJu\S!;Q!]!<2E]!!2Kfr9jF^!:Kgd$LRlomJu\C!:BjT +o`5$[rrE)e!s%cW!<2Ec!<2ED!"/,o!:BjTmJu\C!<)<e!:K:G!!;QgmdC,Umf!1dmf!1dmem+c +me6\dmJm7T!:BjTrW!&g!:K:S!<2Ec!;Q!J!<)?MrrMNfrpBdemc+9OmJuYTmJu\R!4hM!!:K:D +!!)HT!<;Ho!:BjTmJuYTmd:(+mXaenmf*9;~> +Ja2LbrrE)arrE)arrDEN!!)u_#ls8U!9sRL!:&kC!<26`!<)0_!<)0_!<29_!!2?blKS?LrosI` +rp'L`s69sll2^)LlKS?Ll2^,K!!)<_!!2?brTXFalK[j=!:'F]s6:$nl2^,7!9sOal2UhL!;5UX +!:'O`!:'I^!pTacrTaC_s6BO_rosRcl2^,K!;PjY!<29Y!!2?br9F.Z!:'O`$L.Tkl2^,7!9sRL +o`5$WrrE)a!s%WO!<29_!<29@!".uk!9sRLl2^,7!<)0a!:&k?!!;EclL+]QlM^b`lM^b`lMU\_ +lLt8`l2UhL!9sRLrW!&c!:&kK!<29_!;PjF!<)3I!!2?brosLalJhjKl2^)Ll2^,J!4h@r!:&k< +!!)<P!<;<k!9sRLl2^)LlKSA#l@J5flMgj7~> +J`c4Zs8W,]s8W,]s8VHJ!<<#[$30/Ms5s@Ds5rJ;s8M-\s8D'[s8D'[s8M0[rrM9^lK/*HroO4\ +roX7\s5j^hk5XTDk2u^Dk5XTCrrD3[rrM9^rT41]k2u15!9X1Ys5jdjk5XT+s5s@]k5YJDs7PLT +s5s=\!9X4Z!p9O_rT=.[s5s:[roO=_k5XTCs7kaUs8M0UrrM9^r9!nV!9X:\$KhBgk5XT+s5s@D +p&G'Ss8W,]"97NGs8M0[s8M0<rsIogs5s@Dk5XT+s8D']s5rJ7rrV?_k3r<Mk5PA\k5PA\k5G;[ +k4el\k5YJDs5s@Drr3)_s5rJCs8M0[s7kaBs8D*ErrM9^roO7]k2ZIGk5XTDk5XTBs1.7ns5rJ4 +rrD3Ls8V3gs5s@Dk5XTDk2u\pk(2Z^k5PF3~> +JaVgkrW)udrrE&drrDER!!*#d!!*#d"p")Z!:K7TrpKacq<e4_rpBadrpBadrpKac"7?0W!:&te +!:K7Tmd:)C!!)EemJm7TmJuYT!:KX_"muBY!:K:D!!DWh!:Kdc"muBY!:Bjcmd^AVmK!=UrVurd +rVurdqZ-Zarr<Jq!:BjT!!)EemJu\CrW)i`mf3CV!<2EY!!)Hc!!2KfrU0[c!:Kdc!:Kdc#jq]\ +mJuYTmK!7S"9@iimK!7SqZ$]c!:Kdc!:Kdc"mu?jmJu\Q!"J>rmJuYTmJuYTmJuYTqsFUfmJuYT +mf!1dmem+cmf!4cmK!=Uq#CNb!:K:P!!)Hd!!;Qgmem+cmcjeEs69Tsmf*7gmJu\Q!!)Hc!;u6e +!:BjTqu?`bquH`a#6=/l!:Bgemf!4dmJm6<mXaemmf*9;~> +Ja2OcrW)u`rrE&`rrDEN!!*#`!!*#`"p!rR!:&hLrp'I_q<@q[rosI`rosI`rp'I_"6omO!:&ha +!:&hLlKSB7!!)9al2UhLl2^)L!:'@["mQ*Q!:&k<!!DKd!:'L_"mQ*Q!9sR_lLFrRl2^nMrVur` +rVur`qZ-Z]rr<Jm!9sRL!!)9al2^,7rW)i\mf3CR!<29U!!)<_!!2?brTaC_!:'L_!:'L_#jMET +l2^)Ll2^hK"9@]el2^hKqZ$]_!:'L_!:'L_"mQ'fl2^,I!"J2nl2^)Ll2^)Ll2^)Lqs"=bl2^)L +lM^b`lMU\_lM^e_l2^nMq#CN^!:&kH!!)<`!!;EclMU\_l@As*!5.Us!!;EclMLV^lMU_\l2q%O +!:'I^!:'I^ros^gl2UhL!!)<`!<;<a!.jEdlBgf9!.Y~> +J`c7[s8N3%k2u^DroX7\m,e<JroO4\roOFbk2u^+k5YGCrr;fV!<<&\!<<&\!<<&\rr3)_s5s@H +jq[pYk5XT+s5s@]k5XTDs5rJDk5YJDq>UW\s5s@Dk3r<Pk5YJDrVm&`s5s@Ds8D*Ns8D'\s5s=\ +!9X:\!9X1Ys5s@]%-ITPs5s@]k5XTDk2u[Cqr[AI!TsF]k4JZRk5G;\k5YDBs8N)]rVll[rVm/c +s5rJDk5XTDroO@`k5XTDroX+X!p9OFrVll[rVm&`s8V6]k5>5gk5XTDk5XTDk5XTDk5Y>@"om`b +k5XTCrrD3[rrD3\s8M-]s5s.W"6TXGk55/Yk5PA^k5XTBrrD24s7--%k5YG_k5XTArrD3[s8;!] +s5s@Dr;QcZr;ZcY#QNrds5s@]k5PD\joGF4k(2Z]k5PF3~> +JaVdjrrD'H$io_`!:K7TmJuYTmK!7S#QX8mmJu\C!!*#dp]1?^r;clc!!)uc!!)uc!!)uc!!)c] +"p"&kmJu\Cr;[#h!!)Eemd^AXmK!=UrVurdo`,3a!:BjT!:KabrpBadrpKCY!U]semK*CVmem+c +mf!1dmem+imJm7T!:K:S!<;KZ!;l3`!!)HZ!;l3^!!DWhmdBrPrU'^emdC#R!:K^arU0XbrpBmh +md:)Cp&G*\rW!&g!!)Hc!<;K^!!)Hb!<2Ec!;Z'^!!)H>!.k1:s17Xu!!)Ha!!_ik!:BjT!<)?c +!!)Hd!!;Qgmf!1dmf!1emK!7Srr<;l!:Bgemd:(+mXaelmf*9;~> +Ja2LbrrD'D$ioSX!:&hLl2^)Ll2^hK#QX,il2^,7!!*#`p]1?Zr;cl_!!)u_!!)u_!!)u_!!)cY +"p!ogl2^,7r;[#d!!)9alLFrTl2^nMrVur`o`,3]!9sRL!:'I^rosI`rp'+U!U9[al2gtNlMU\_ +lM^b`lMU\el2UhL!:&kK!<;?V!;l'\!!)<V!;l'Z!!DKdlK\6HrTXFalK\<J!:'F]rTa@^rosUd +lKSB7p&G*XrW!&c!!)<_!<;?Z!!)<^!<29_!;YpZ!!);8!5efJlMghalMCPcl2UhL!9sR_lMgha +lM^bbl2^,K!!)<`!!2?brp'L`#O2<S!!)<L!.jEdlB^`8!.Y~> +J`c4ZrrD'@%0,JPs5rJDk5XTDk5YGC#lj&ek5XT+s8W)\q#CBVrVuo[!<<#[!<<#[!<<#[!<;fU +#63ick5XT+rVm&`s8V6]k48QPjoPMErr2u\p&>6Ys5s@Ds5s7ZroO4\roWkQ!TsF]joYSFk5G;[ +k5PA\k5G;ak5YJDs5rJCs8V6Rs81sXrrD3Rs81sVrr_E`k2uR@rT41]k2uXB!9X1YrT=+ZroO@` +k2u^+pAY-Trr3)_s8V6[s8V6VrrD3Zs8M0[s7tgVrrD24s24lJk5YG]k55/_k5YJDs5s@[k5YG] +k5PA^k5XTCrrD3\rrM9^roX7\#Nl'Ks8V6Ds+0<`k*G00!.Y~> +JaVdjrrD$G"9@iimK!7SrW)rc$NTV_!:K7T!:Bgeme6\]mf!1emK!7S!!)uc!!*#d!!*#d!!)][ +rW)obq>^Zd!!)HTp](Nd!:BgemdAL's6]pgmdB]I!:Kgd!:KIZ!:K^aq!J7bmJuYTrU0O_q<e=b +mJu\-!<;He!<2Be!:Kgd!:JYCJcDkP_sRR+mdC#R!:Kab$gn#_!!)Ee!:K7Tmed%bmed%emJuYT +rpKX`!U]r=mXaekmf*9;~> +Ja2LbrrD$C"9@]el2^hKrW)r_$NTJW!:&hL!9sOalLt8YlM^bal2^hK!!)u_!!*#`!!*#`!!)]W +rW)o^q>^Z`!!)<Lp](N`!9sOalKZdts69XclK\!A!:'O`!:'1V!:'F]q!%t^l2^)LrTa7[q<A%^ +l2^,%!<;<a!<26a!:'O`!:#+8M#bHY!W_NNr;Zi_qu@,i!9sOal2UhLl2^,I!!)<^!!DKdl2^hK +qZ$Z^!.jEdlBUZ7!.Y~> +J`c4ZrrD$?"TRWak5YGCrr;u[$ifAOs5rJDs5s@]k4elUk5PA]k5YGC!<<#[!<<&\!<<&\!<;`S +rr;rZqYp]\s8V6Dq#:Q\s5s@]k2t+ls5jC_k2u=9!9X:\!9WqR!9X1YpuV_Zk5XTDrT="Wq;qeZ +k5XSrs8V3]s8M-]s5s=\!9Sk4M>tKU!rqEFrVll[r;R/es5s@]k5YJDk5XTArrD3Zrr_E`k5YGC +qu6]Zs+0<`k*>*/!.Y~> +JaVdjrrD!Fo)SgY!!*#drr<&equ?`brVurdquHcb!!)uc!!)uc"p")Z!:K7Tq!Qo;rU'[dmeZta +mem.cmKN[Z!:BjTmem+dmK!7S!<DQ]!!VcjmJuYTr9jOa!:Kgd!q$'VrW)udrVurdrW!#f!:Kab +"7?0W!;c*e!:K7Tmd>Z+JcEIa`:!9us6fme"muBY!!)H[!!)Hd!!2Kfr9jF^JaS*WPj\POJ,~> +Ja2LbrrD!Bo)SgU!!*#`rr<&aqu?`^rVur`quHc^!!)u_!!)u_"p!rR!:&hLq!-W7rTXC`lMCP] +lMU__l377R!9sRLlMU\`l2^hK!<DEY!!VWfl2^)Lr9F7]!:'O`!pTdNrW)u`rVur`rW!#b!:'I^ +"6omO!;bsa!:&hLlKWp#JH3Ca`9R!qs6BUa"mQ*Q!!)<W!!)<`!!2?br9F.ZJa.gOPj88KJ,~> +J`c4ZrrD!>oDejQ!<<&\s8N)]r;QcZrr2u\r;ZfZ!<<#[!<<#[#63iJs5rJDpu^B3rT4.\k55/Y +k5G>[jp(kJs5s@Dk5G;\k5YGC!WV<UrrqQbk5XTDr9""Y!9X:\!p9OFrr<#\rr2u\rr3&^s5s7Z +"6TXGs8(j]s5rJDk2q6pJcEIa`9-ams5s@]"m5jIs8V6SrrD3\rrM9^r9!nVJ`_OGPihuGJ,~> +JaVdjrrD-Jo)JgZ!<)<c!<)?c!!)HZ!;Gm]!<2Ec!!DWhmJuqJrW)rcp&P*[p&P$Y!<DQ]!!DWh +mdC&SrpBmhmJuYTr9jL`!:K^arpKacr9ibKJcC<$VuOR#o`,![gAlfmJaSonrr@Q~> +Ja2LbrrD-Fo)JgV!<)0_!<)3_!!)<V!;GaY!<29_!!DKdl2^MBrW)r_p&P*Wp&P$U!<DEY!!DKd +lK\?KrosUdl2^)Lr9F4\!:'F]rp'I_r9Ah5JH1]1_!:Rm!:&;=Ja.gOR-O\OJ,~> +J`c4ZrrD-BoD\jRs8D'[s8D*[rrD3Rs7bXUs8M0[rr_E`k5Y,:rr;u[pAb-SpAb'Q!WV<Urr_E` +k2u[CroO@`k5XTDr9!tX!9X1YroX4[r8rS1JcCc1^uk=i!9W&9J`_OGR-+DKJ,~> +JaVdjrrD!FrW)rc"9@iimJuqJ!<DQ]!;5a[!<2Ec!!2Kfp$Mq_mJuYTrpBdemed(ama_@?mJu\C +o`0RCJcC<$s8Tq'!s%`hmem.cmK!=Ur;c`_rW!#f!:Kgd!:Kgdr9j7YJaS*WQgXkRJ,~> +Ja2LbrrD!BrW)r_"9@]el2^MB!<DEY!;5UW!<29_!!2?bp$)Y[l2^)LrosLalMLY]lIGq;l2^,7 +JH16$JH59A_<M+&l2^,J!<;<b!:'L_qs+.\!pTdNrVur`rW)l]p&K[/Ja/Terr@Q~> +J`c4ZrrD!>rr;u["TRWak5Y,:!WV<Us7PLSs8M0[rrM9^p#ZDWk5XTDroO7]k5>8Yk19P7k5XT+ +JcC<$JcG?A_<(k"k5XTBs8V3^s5s:[qr[nX!p9OFrr2u\rr;oYpA]^+J``<]rr@Q~> +JaVdjrrD$G$io\qmJuYTmd:)CmK!%MmK!(Np&OmU!<DP=s+13$s0MaBmK<OXmJu\S!!)H[!!;Qg +mf!1hmJuYTmf!1emK!1Q!<DQd!!2KfJaS*WQ1"YPJ,~> +Ja2LbrrD$C$ioPml2^)LlKSB7l2^VEmK!(Jp&OmQ!<DD9!.b-$!4)[Bl3%+Pl2^,K!!)<W!!;Ec +lM^bdl2^)LlM^bal2^bI!<DE`!!2?bJa.gOQ0SALJ,~> +J`c4ZrrD$?%0,Jik5XTDk2u^+k5Y5=mf3+FpAapM!WV;5s+13$s0MaBjok_Hk5XTCrrD3SrrV?_ +k5PA`k5XTDk5PA]k5YAA!WV<\rrM9^J`_OGQ0/)HJ,~> +JaVmmJcC<$JcC<$a8a'F!!*#drrE)eo`5$["T[uY!!)H[!<;Hi!:K7Tmf!1emJqh+JaSilrr@Q~> +Ja2UeJH16$JH16$`rO$B!!*#`rrE)ao`5$W"T[iQ!!)<W!<;<e!:&hLlM^bal2ZD#Ja/Qdrr@Q~> +J`c=]JcC<$JcC<$a8a'>!<<&\s8W,]p&G'S"om`Is8V6Ss8V3as5rJDk5PA]k5U"pJ``9\rr@Q~> +JaVmmJcC<$JcC<$a8a*G!!)uc!!*#drrE)equ?lf!:K7TrpKac"RZ9X!:KgdrpC!kmJu\C!!)Hc +!!2KfJaS*WQgXkRJ,~> +Ja2UeJH16$JH16$`rO'C!!)u_!!*#`rrE)aqu?lb!:&hLrp'I_"R6!P!:'O`ros^gl2^,7!!)<_ +!!2?bJa.gOQg4SNJ,~> +J`c=]JcC<$JcC<$a8a*?!<<#[!<<&\s8W,]r;Qo^s5rJDroX4["QoaHs5s=\roOIck5XT+s8V6[ +rrM9^J`_OGQfe;JJ,~> +JaVmmJcC<$JcC<$\c9tC!!)uc!!*#drW!,i!:K7T!<)?c!<2Ec!!)Hd!<2Bq!:K7TmJuYT!:Bge +mJqh+JaSonrr@Q~> +Ja2UeJH16$JH16$\H'q?!!)u_!!*#`rW!,e!:&hL!<)3_!<29_!!)<`!<26m!:&hLl2^)L!9sOa +l2ZD#Ja/Wfrr@Q~> +J`c=]JcC<$JcC<$\c9t;!<<#[!<<&\rr3/as5rJDs8D*[s8M0[rrD3\s8M-is5rJDk5XTDs5s@] +k5U"pJ``?^rr@Q~> +JaVmmJcC<$JcC`0!:HN[eF*>:#OVT[!!)HT!;Gmc!:K7Tmd:)RmJm7cmJm7cmJm6<mXaemmf*9;~> +Ja2UeJH16$JH1Z0!:$3WeE[&6#O2<S!!)<L!;Ga_!:&hLlKSBJl2Uh_l2Uh_l2Ug8l@J5elMgj7~> +J`c=]JcC<$JcC`0!9TsSeE6f2#Nl'Ks8V6Ds7bX[s5rJDk2u^BjoGG[joGG[joGF4k(2Z]k5PF3~> +JaVmmJcC<$JcE=]rU'XcbjGZ8md:)CmK!"LWW25NrrE)e#6=/lmJu\C!;Z$_!<2Bd!<2Bd!.jQh +mYUB3!.Y~> +Ja2UeJH16$JH37]rTX@_bj#B4lKSB7l2^SDW;u2JrrE)a#6=#hl2^,7!;Ym[!<26`!<26`!.jEd +lA=g+!.Y~> +J`c=]JcC<$JcE=]rT4+[biT-0k2u^+k5Y2<WW25Fs8W,]#QNrdk5XT+s7tdWs8M-\s8M-\s+0<` +k)&7#!.Y~> +JaVmmJcC<$JcFF'o^2h^mJuYTq<e4_rpBadrpBadb3fB4mJuYTipNoJqsFFarU'XcrU'Xcq!J+^ +rU'XcrU'XcJaS*WMXLKEJ,~> +Ja2UeJH16$JH4@'o]cPZl2^)Lq<@q[rosI`rosI`b3B*0l2^)Lip*TFqs".]rTX@_rTX@_q!%hZ +rTX@_rTX@_Ja.gOMX(3AJ,~> +J`c=]JcC<$JcFF'o]?;Vk5XTDq;q\WroO4\roO4\b2rj,k5XTDio[?BqrRnYrT4+[rT4+[puVSV +rT4+[rT4+[J`_OGMWXp=J,~> +JaVmmJcC<$NrK7M!:K7Tj6d$MmJuYTrpBadrpBadrpBado'ZJWp[/4cmd:)CmJt>rrW(^@"9@ii +mK!.PUAof4JaS*W!q$$gJ,~> +Ja2UeJH16$NW94I!:&hLj6?aIl2^)LrosI`rosI`rosI`o'62SpZ_q_lKSB7l2\ojrW(^<"9@]e +l2^_HU&]c0Ja.gO!pTacJ,~> +J`c=]JcC<$NrK7Es5rJDj5pLEk5XTDroO4\roO4\roO4\o&frOpZ;\[k2u^+k5WNbrr:a8"TRWa +k5Y>@UAof,J`_OG!p0I_J,~> +JaVmmJcC<$rr30&md:)CmK!4R"p")Z!:K7TmHtPdmJuYTmJuYT!:BjT!:BjT!8$Z;!<2Bd!<2Bj +!:BjT!:BjGmf!4cmJm7cmJm7cmJm7]me-YWmK<OX!:BjJmJm7cmJm7cmJm7Yme-Y=mKN[ZmJu\C +!;u8Bs+0Thm[3GB!.Y~> +Ja2UeJH16$r;cl_!s%WO!<)0e!:&hLlKSB:l4F$]!9sRL!9sOal2^)Ll2^)LfBW;7rosI`ros[f +l2^)Ll2]f.rW)r_!!)u_!!)u_!!)cYp&OsS"9@]el2]o1!!)u_!!)u_!!)WUp&O%9"p!rR!:&hL +r9B.>Ja.gOR-O\OJ,~> +J`c=]JcC<$rVuo["97NGs8D'as5rJDk2u^2jq7XUs5s@Ds5s@]k5XTDk5XTDfB3&3roO4\roOFb +k5XTDk5XE&rr;u[!<<#[!<<#[!<;fUpAb!O"TRWak5XN)!<<#[!<<#[!<;ZQpAa(5#63iJs5rJD +r8rn:J`_OGR-+DKJ,~> +JaVmmJcD&9q<e4_rU'XcrU'XcrU'XcrpBadrpBadrU'dgmJuYTlgF`P!:KdcrpKacrpBadg$Sk@ +mf!4cmJm7cmK!=UrW)$Ip&O@FrW)WZrW(sG!!*#d!!*#d!!)HTrW(dB!!*#d!!*#d!!)ucK)^Di +JaT3!rr@Q~> +Ja2UeJH1u9q<@q[rTX@_rTX@_rTX@_rosI`rosI`rTXLcl2^)Llg"HL!:'L_rp'I_rosI`g$/S< +lM^e_l2Uh_l2^nMrW)$Ep&O@BrW)WVrW(sC!!*#`!!*#`!!)HPrW(d>!!*#`!!*#`!!)u_JcLAe +Ja/onrr@Q~> +J`c=]JcD&9q;q\WrT4+[rT4+[rT4+[roO4\roO4\rT47_k5XTDlfS3H!9X7[roX4[roO4\g#`>8 +k5PD[joGG[joPMErr;'ApAaC>rr;ZRrr;!?!<<&\!<<&\!<;KLrr:g:!<<&\!<<&\!<<#[K)^Da +J``Wfrr@Q~> +JaVmmJcEC_dd@)8rpBadrpBadrU'XcrU'XcrU'XcrU0Xbr9aObrU'XcrU'XcrpK(P!U]sdmJm7c +mJm7LmKN[ZmJu\C!;u9Y!9ESI!9W\P!:BjT!;c-W!9NVQ!:K7Tmd:)CmK<OX!:BjEmJm7cmJm7c +mJm7dmXkIimXaf!mf*9;~> +Ja2UeJH3=_dcpf4rosI`rosI`rTX@_rTX@_rTX@_rTa@^r9=7^rTX@_rTX@_rp&eL!U9[`l2Uh_ +l2UhHl377Rl2^,7!;u-U!9EGE!9WPL!9sRL!;c!S!9NJM!:&hLlKSB;l3%+P!9sRAl2Uh_l2Uh_ +l2Uh`l@K"el@J5nlMgj7~> +J`c=]JcEC_dcLQ0roO4\roO4\rT4+[rT4+[rT4+[rT=+Zr8n"ZrT4+[rT4+[roWPH!TsF\joGG[ +joGGDjp(kJk5XT+s8;$Qs5`>As5rGHs5s@Ds8(mOs5iAIs5rJDk2u^3jok_Hs5s@=joGG[joGG[ +joGG\k(<Vak(2Zfk5PF3~> +JaVmmM?!)5!<DQe!!2Kfq<e@cmJuYTo^2h^mJuYT]C#k'md:)CmJueFp&P-\!!*#d!!*#d!!)i_ +rVurdrW)obrW)i`!!*#d!!*#d!!)0L!!*#d!!*#d!!)i_rW(pF"9@iimJuVA!!*#drr<2i!:K7T +p[8"\s6]jerU'XckjAQRmJuYTmd:8Zmd:)CmJt]'K)^DiJaT3!rr@Q~> +Ja2UeM#d&1!<DEa!!2?bq<A(_l2^)Lo]cPZl2^)L]BTS#lKSB7l2^A>p&P-X!!*#`!!*#`!!)i[ +rVur`rW)o^rW)i\!!*#`!!*#`!!)0H!!*#`!!*#`!!)i[rW(pB"9@]el2^29!!*#`rr<2e!:&hL +pZh_Xs69RarTX@_kir9Nl2^)LmcjuVlKSB7l2]8tJcLAeJa/onrr@Q~> +J`c=]M?!)-!WV<]rrM9^q;qh[k5XTDo]?;Vk5XTD]B0=tk2u^+k5Xu6pAb0T!<<&\!<<&\!<;lW +rr2u\rr;rZrr;lX!<<&\!<<&\!<;3D!<<&\!<<&\!<;lWrr:s>"TRWak5Xf1!<<&\s8N5as5rJD +pZDJTs5j=]rT4+[kiN$Jk5XTDmcF`Rk2u^+k5WllK)^DaJ``Wfrr@Q~> +JaVgkrVurdrW!&g!:BjHmJm7cmJm7cmJm7cmKN[ZmJu\C!7U?=!:BjT!:9+S!:Kgdp[8"\o'ZJW +\aBS#mJuYTm-aiQqX+Ofmd:)CmK!(N!<DQe!"/,omJu\C!:BjT!;l0g!:K7Tmd:);mJm7cmJm7c +mJm7amK<OX!:BjImK`g\mJu\C!:BjcmJm7YmKrs^!:BjT!:BjT!;Z$e!:BjT!:BjdmJm7Lmf!4V +mL'$_mJuYTmJu\C!!(O:JcC;hJaT3!rr@Q~> +Ja2OcrVur`rW!&c!9sRDl2Uh_l2Uh_l2Uh_l377Rl2^,7!7U39!9sRL!:8tO!:'O`pZh_Xo'62S +\`s:tl2^)Lm-=QMqW\7blKSB7l2^YF!<DEa!".ukl2^,7!9sRL!;l$c!:&hLlKSB3l2Uh_l2Uh_ +l2Uh]l3%+P!9sREl3ICTl2^,7!9sR_l2UhUl3[OV!9sRL!9sRL!;Yma!9sRL!9sR`l2UhHlM^eR +l3dUWl2^)Ll2^,7!!(O6JH18dJa/onrr@Q~> +J`c7["9/B$k5PA_k5XTDioU7@rT4+[rT4+[rT4=ak2u^+k5Wom"TRWak5Xf1!WV<]s7b[Ts75=O +s1.7ps5s@Ds6SnIs8(j^s5rJDk2u^>joPMErr3>fs5s@Dk5XTDk5Y>@#63iJs5rJDk2l[DrT4+[ +rT4+[qrS%]k5XTDj5pXIk2u^+k5XTDrT4+[oB$D[k5XTDk5XTDk5Y8>#63ick5XTDroO4\k2u[C +n`C5Zk2u^+s5s@Dk5YJ2k(3P`k(2Zfk5PF3~> +JaVjl"9@ii!:Kgds6]pgmJu87!!*#d!!*#d!!)uc!!*#d!!*#d!!(L9rW)?Rp&P-\p&OsWp&Mbn +rW)<Q"9@iimK!+O"9@iimK!(N!W_ZVqu?`bqZ-Za!!)oa"9@iimJtf*"p")Z!:K7TjmE*KrpKdd +s6fmerpBadna6S]md:)C!!*#d!!)oa$39M^!!)Ee!:K7Tl0e6Fo^;_Zs6^*lmJuYTmd:)DmJm7c +mJm7cmJm7XmXbChmXaf!mf*9;~> +Ja2Rd"9@]e!:'O`s69Xcl2]i/!!*#`!!*#`!!)u_!!*#`!!*#`!!(L5rW)?Np&P-Xp&OsSp&Mbj +rW)<M"9@]el2^\G"9@]el2^YF!W_NNqu?`^qZ-Z]!!)o]"9@]el2]B""p!rR!:&hLjlugGrp'L` +s6BUarosI`n`g;YlKSB7!!*#`!!)o]$39AV!!)9a!:&hLl0@sBo]lGVs69ghl2^)LlKSB<l2Uh_ +l2Uh_l2UhTl@Aqdl@J5nlMgj7~> +J`c:\"TRWa!9X:\s5jC_k5XH'!<<&\!<<&\!<<#[!<<&\!<<&\!<:O1rr;BJpAb0TpAb!OpA_ef +rr;?I"TRWak5Y;?"TRWak5Y8>!rqEFr;QcZqu?]Y!<;rY"TRWak5Wuo#63iJs5rJDjlQRCroX7\ +s5s@]roO4\n`C&Uk2u^+s8W)\!<;rY$NK8Ns8V6]s5rJDl/q^>o]H2Rs5jRdk5XTDk2u^4joGG[ +joGG[joGGPk(3P`k(2Zfk5PF3~> +JaVgkrW)ud!!)uc!!(sF"p")Z!:K7TrU'XcrU'XcrU'Xcf^AG5o'Z2OqX4=_o'ZJW]^GInna6S] +md:)CmK!+OrW)c^!!*#d!W_ZVq>^]e!:BjT!;l3`!7gK;!<2Bd!<2Bd!9`bM!<)<n!:BjTmJu\C +!:K7TrU'XcrU'Xcr9a[fmJuYTp[/"]rpBsjmJuYTmJu>9rW)ET"p")Z!:K7TlL"WPrpBadrpBad +na6DWqsK:?JaS*WT^Mg[J,~> +Ja2OcrW)u`!!)u_!!(sB"p!rR!:&hLrTX@_rTX@_rTX@_f]r/1o'5oKqWe%[o'62S]^#1jn`g;Y +lKSB7l2^\GrW)cZ!!*#`!W_NNq>^]a!9sRL!;l'\!7g?7!<26`!<26`!9`VI!<)0j!9sRLl2^,7 +!:&hLrTX@_rTX@_r9=Cbl2^)LpZ__Yros[fl2^)Ll2]o1rW)EP"p!rR!:&hLlKS?LrosI`rosI` +n`g)Sqs&t;Ja.gOT^)OWJ,~> +J`c7["oeQ&k2u^BjoGG>jp(kJk5XT+s8D'[s8D'[s8D'[s4HK-s75=Gs8(mWs75=Os1ILfs7,4U +s5rJDk2u^?k5PDVjoGG\joYSFk5,)]k5XTDk5Y>@rr:O2!<<&\!<<&\!<;6E!<<#[$ifAhk2u^+ +k5XT+s8D'[s8D'[s8;!^s5s@Ds7bXUs8M-bs5s@Ds5s@Bk5PDLjp(kJk5XT+s6A_Hs8M-\s8M-\ +s7,4Os81r7s+0<`k+Ll:!.Y~> +JaVdjrrC[="p"&kmJuYTrpBadrpBadcL1Z3lL+WO!U]s`mK<OX!:BjZmKEUY!:BgerU'XcrU'Xc +`:!U)md:&TrpBadrpBgfmdBcKrpBadrpKddrpKac"mu?jmJm7dmK!=Up&Nh7!!)uc!!)uc!!)0L +!!)ucrr</h!:BjcmJm7dmJm7dmJm7`mf!4\mJm7cmK*CVmf!4ImK<OX!:BjcmJm7cmJm7_mK<OX +!:BjNmKN[ZmJu\C!:]CVs7l!^s7brIs+0Thm\'"J!.Y~> +Ja2LbrrC[9"p!ogl2^)LrosI`rosI`cKbB/lK\?K!U9[\l3%+P!9sRVl3.1Q!9sOarTX@_rTX@_ +`9R=%mcjcProsI`rosOblK\'CrosI`rp'L`rp'I_"mQ'fl2Uh`l2^nMp&Nh3!!)u_!!)u_!!)0H +!!)u_rr</d!9sR_l2Uh`l2Uh`l2Uh\lM^eXl2Uh_l2gtNlM^eEl3%+P!9sR_l2Uh_l2Uh[l3%+P +!9sRJl377Rl2^,7!:]7R!;PgZ!;GcE!.jEdlCdGB!.Y~> +J`c4ZrrC[5#63ick5XTDroO4\roO4\cK>-+lK8*G!TsFXjok_Hs5s@RjoteIs5s@]rT4+[rT4+[ +`9.(!mcFNLroO4\roO:^k2uC;roO4\roX7\roX4["m5jbk5YJ\joPMEpA`k/!<<#[!<<#[!<;3D +!<<#[s8N2`s5s@[joGG\joGG\joGGXk5PDTjoGG[joYSFk5PDAjok_Hs5s@[joGG[joGGWjok_H +s5s@Fjp(kJk5XT+s7#.Ns7k^Vs7bZAs+0<`k+Ll:!.Y~> +JaVdjrrCX<rW)rc"p")Z!:K7TcL(f8mJuYTm-XlSmf!1emK!.P#6=/l!:K7T!<)<c!;u6i!:K7T +md:&TrpBadrpBad`9ma.mJuYTnEp8VrU'XcrU'Xcr9jOas6]jerU'Xcq!S+]"7?0W!;Gp\!3bej +!<2Be!:KgdqsFXgmd:)CmK!4Rp&OjTp&O@F"p")Z!:K7TrpBadrpBadp[8"\lL"WPrpKac"7?0W +!:fIWs7l!^s5WOIs+0Thm\'"J!.Y~> +Ja2LbrrCX8rW)r_"p!rR!:&hLcKYN4l2^)Lm-4TOlM^bal2^_H#6=#h!:&hL!<)0_!;u*e!:&hL +lKS?LrosI`rosI``9II*l2^)LnEKuRrTX@_rTX@_r9F7]s69RarTX@_q!.hY"6omO!;GdX!3bYf +!<26a!:'O`qs"@clKSB7l2^eJp&OjPp&O@B"p!rR!:&hLrosI`rosI`pZh_XlKS?Lrp'I_"6omO +!:f=S!;PgZ!9<@E!.jEdlCdGB!.Y~> +J`c4ZrrCX4rr;u[#63iJs5rJDcK590k5XTDm,e?Kk5PA]k5Y>@#QNrds5rJDs8D'[s8;!as5rJD +k2u^DroO4\roO4\`9%4&k5XTDnE'`NrT4+[rT4+[r9""Ys5j=]rT4+[pu_SU"6TXGs7b[Ts0(Pb +s8M-]s5s=\qrS+_k2u^+k5YDBpAamLpAaC>#63iJs5rJDroO4\roO4\pZDJTlK/*HroX4["6TXG +s7,4Os7k^Vs5W7As+0<`k+Ll:!.Y~> +JaVdjrrCd@o`,*^!:Bj=mJm7cmJm7dmf*7imJuYT!<2Bd!;Ps^!<)?c!<;Ke!!DWhmK!4R!!*#d +!!*#d!!*#d!!)rb!!*#d!!*#drrE)e!s%cW!6FR.!<2Ed!!M]imd:)7mKN[Z!:BjT!<2Bd!;l3X +!;Psb!:BjT!3bh`!<2Bh!:BjT!;Q!]!:T@T!9W\L!<2Bd!<2Bj!:K7Tmd:)Ome-YJmJm7dmf!1e +mJubE!<<#c!<<#c!<:L8]DmHMJaT3!rr@Q~> +Ja2LbrrCd<o`,*Z!9sR9l2Uh_l2Uh`lMghel2^)L!<26`!;PgZ!<)3_!<;?a!!DKdl2^eJ!!*#` +!!*#`!!*#`!!)r^!!*#`!!*#`rrE)a!s%WO!6FF*!<29`!!MQelKSB/l377R!9sRL!<26`!;l'T +!;Pg^!9sRL!3b\\!<26d!9sRL!;PjY!:T4P!9WPH!<26`!<26f!:&hLlKSBGlLk5Fl2Uh`lM^ba +l2^>=!!)u_!!)u_!!(I4])[EIJa/onrr@Q~> +J`c4ZrrCd8p&>-Vs5s@5joGG[joGG\k5YGak5XTDs8M-\s7k^Vs8D*[s8V6]rr_E`k5YDB!<<&\ +!<<&\!<<&\!<;uZ!<<&\!<<&\s8W,]"97NGs2a=&s8M0\rrhKak2u^'jp(kJs5s@Ds8M-\s81sP +s7k^Zs5s@Ds0(SXs8M-`s5s@Ds7kaUs6o+Ls5rGDs8M-\s8M-bs5rJDk2u^?k4\iBjoGG\k5PA] +k5Xr5!<<#[!<<#[!<:L0]DmHEJ``Wfrr@Q~> +JaVdjrrCd@!!*#drW)rc!<DQe!7gK;!<2Bf!:K:S!!holmJuYTmJutK!!*#d!!*#drrE)e"T[rj +md:)Rmf*:emf*7fmK!1Q!!)uc!!)ucrr</h!:Bj,mKrs^!:BjT!:BjT!9EPT!:K7T!:Bgemd:)L +me-YYmKN[ZmJu\C!3bem!:BjTrW)c^rW)`]"9@iimJueF"9@iimJuJ=!!)uc!!)uc"9@iimJuqJ +rW)3Np&O[O!<;i^!<9Orf)L<hJaT3!rr@Q~> +Ja2LbrrCd<!!*#`rW)r_!<DEa!7g?7!<26b!:&kK!!hchl2^)Ll2^PC!!*#`!!*#`rrE)a"T[ff +lKSBJlMgkalMghbl2^bI!!)u_!!)u_rr</d!9sR(l3[OV!9sRL!9sRL!9EDP!:&hL!9sOalKSBD +lLk5Ul377Rl2^,7!3bYi!9sRLrW)cZrW)`Y"9@]el2^A>"9@]el2^&5!!)u_!!)u_"9@]el2^MB +rW)3Jp&O[K!!)fZ!!'Lnec:9dJa/onrr@Q~> +J`c4ZrrCd8!<<&\rr;u[!WV<]s4-63s8M-^s5rJCrs.]dk5XTDk5Y/;!<<&\!<<&\s8W,]"om`b +k2u^Bk5YJ]k5YG^k5YAA!<<#[!<<#[s8N2`s5s@$jpM.Ns5s@Ds5s@Ds5`;Ls5rJDs5s@]k2u^< +k4\iQjp(kJk5XT+s0(Pes5s@Drr;fVrr;cU"TRWak5Xu6"TRWak5XZ-!<<#[!<<#["TRWak5Y,: +rr;6FpAa^G!<;iV!<9Ojf)L<`J``Wfrr@Q~> +JaVdjrrCa?"T[rjmJu\J!8-]M!:K7TmJm7TmJm7T!:K7To^2qamJm7TmJm7cmJm7]mK<OX!:BjU +mf!4)mKN[ZmJuYT!<2Bd!;Ps^!<)<c!<)<c!;c*`!<2Bj!:BjT!:Bj\mK3IW!:Kgdq<e4_rpBad +rpBadYO;Ai"7?0W!<2E[!<)<i!:K7Tmd:)HmKN[ZmJu\C!8d/C!;5a_!:BjT!9ihO!:Kgdmd:)T +q!J.^TC2.IJaS*WT^Mg[J,~> +Ja2LbrrCa;"T[ffl2^,B!8-QI!:&hLl2UhLl2UhL!:&hLo]cY]l2UhLl2Uh_l2UhYl3%+P!9sRQ +lM^e%l377Rl2^)L!<26`!;PgZ!<)0_!<)0_!;bs\!<26f!9sRL!9sRXl2q%O!:'O`q<@q[rosI` +rosI`YNl)e"6omO!<29W!<)0e!:&hLlKSB@l377Rl2^,7!8d#?!;5U[!9sRL!9i\K!:'O`mcjcP +q!%hZTBbhEJa.gOT^)OWJ,~> +J`c4ZrrCa7"om`bk5XT:s4HHEs5rJDk5YJDk5YJDs5rJDo]?DYk5YJDk5YJ[joGGUjok_Hs5s@M +k5PD!jp(kJk5XTDs8M-\s7k^Vs8D'[s8D'[s8(jXs8M-bs5s@Ds5s@TjobYGs5s=\q;q\WroO4\ +roO4\YNGia"6TXGs8M0Ss8D'as5rJDk2u^8jp(kJk5XT+s5)o;s7PLWs5s@Ds6/SGs5s=\mcFNL +puVSVTB>SAJ`_OGT]Z7SJ,~> +JaVjl"T[rj!:BjcmJm7NmJm7cmf*:emem.cmf*:emf!48mK<OX!:BjcmK<OX!:BjXmK<OX!:BjU +mf!4Wme-Y$mK<OX!:BjXmJm7dmJm7dmJm7`mJm7cmK*CVmf!4[mK`g\mJm7T!:BjamJm7cmJm7c +mJm6ome$SWmf!4_mJm7dmJm7dmJm7[mJm7dmJm7dmJm7Ime-YWmKN[ZmJu\C!9ikM!!2Kfn*U2U +q!J.^T^Dd[rU'XcrU'XcJaS*WQgXkRJ,~> +Ja2Rd"T[ff!9sR_l2UhJl2Uh_lMgkalMU__lMgkalM^e4l3%+P!9sR_l3%+P!9sRTl3%+P!9sRQ +lM^eSlLk4ul3%+P!9sRTl2Uh`l2Uh`l2Uh\l2Uh_l2gtNlM^eWl3ICTl2UhL!9sR]l2Uh_l2Uh_ +l2UgklLb/SlM^e[l2Uh`l2Uh`l2UhWl2Uh`l2Uh`l2UhElLk5Sl377Rl2^,7!9i_I!!2?bn*0lQ +q!%hZT]uLWrTX@_rTX@_Ja.gOQg4SNJ,~> +J`c:\"om]b!9X=[joGGFjoGG[k5YJ]k5G>[k5YJ]k5PD0jok_Hs5s@[jok_Hs5s@Pjok_Hs5s@M +k5PDOk4\hqjok_Hs5s@PjoGG\joGG\joGGXjoGG[joYSFk5PDSjp;"Lk5YJDs5s@YjoGG[joGG[ +joGFgk4ScOk5PDWjoGG\joGG\joGGSjoGG\joGG\joGGAk4\iOjp(kJk5XT+s6/VErrM9^n)aWM +puVSVT]Q7SrT4+[rT4+[J`_OGQfe;JJ,~> +JaVgkrVuue!<2Bd!9W\L!<2Be!:K^a!:Kgd"muBY!:Bj9mf!4`mf!4Umf!4Wme-YVmJm7cmK!=U +r;cZ]!!)uc!!)uc!!(U<rW)HU"p")Z!:K7Tp$VMRqsFFarpBsjmd:&TmJu;8!!)uc!!)uc!!(./ +rVuue!<2Bd!<)<g!:BjT!;u6b!<)<c!<)<c!;Gm]!<)<c!<)<e!:BjcmJm7cmJm7Rmf!4\mJm7d +mJm7dmJm7Sme-YNmK!:^mK!9<mXaeWm]5dU!.Y~> +Ja2OcrVuua!<26`!9WPH!<26a!:'F]!:'O`"mQ*Q!9sR5lM^e\lM^eQlM^eSlLk5Rl2Uh_l2^nM +r;cZY!!)u_!!)u_!!(U8rW)HQ"p!rR!:&hLp$25Nqs".]ros[flKS?Ll2]l0!!)u_!!)u_!!(.+ +rVuua!<26`!<)0c!9sRL!;u*^!<)0_!<)0_!;GaY!<)0_!<)0a!9sR_l2Uh_l2UhNlM^eXl2Uh` +l2Uh`l2UhOlLk5Jl2UhZl2Ug8l@J5OlDs4M!.Y~> +J`c7["TJH%k5YGC!<;3D!<<&\!WV<ZrrD3\rrqQbk5XTDe)pZ0qr[nXnE0`Mo&fZGq;q\WrT4.\ +k5G>UjoGG[joGG[joGG4k5PDMjp(kJk5XT+s7POJs81pYs8M-bs5rJDs5s@AjoGG[joGG[joGG' +k5PA]k5YGC!<<#["TRWak5YAA!<<#[!<<#[!<;fU!<<#[!<<#[!rqE_rT4+[rT4+[m,n<IpZ;JU +roO4\roO4\mH4-Bn`BiOpuVSVJ`_OGJ`a#qrr@Q~> +JaVdjrr<2i!:K7TjR*9Rmd:)C!!)HTr;clc"p")Z!:K7Tf^A,,q!RhUo'ZJWo^2\ZrpKdd!:Kgd +q!J+^rpBadrpBadg$\P6oBl_]mJuYTnF$8Uq!J+^rpKdds6^!imJuYTj6cmIrpBadrpBadbO,H4 +mJu\R!<;Hs!:BjTmJu\C!!)Eemd:)RmJm7VmJm7cmJm7cmK3IWmK!7S!!*#d!!)BR"9@iimK!(N +!!)uc!!)uc!!)BR!<DQe!<2Bd!:fLNs+0ThmXaf,mf*9;~> +Ja2Lbrr<2e!:&hLjQ[!NlKSB7!!)<Lr;cl_"p!rR!:&hLf]qi(q!.PQo'62So]cDVrp'L`!:'O` +q!%hZrosI`rosI`g$882oBHGYl2^)LnETuQq!%hZrp'L`s69^el2^)Lj6?UErosI`rosI`bN]00 +l2^,J!<;<o!9sRLl2^,7!!)9alKSBJl2UhRl2Uh_l2Uh_l2q%Ol2^hK!!*#`!!)BN"9@]el2^YF +!!)u_!!)u_!!)BN!<DEa!<26`!:f@J!.jEdl@J6$lMgj7~> +J`c4Z#6+\cs5rJDjQ6aJk2u^+s8V6DrVuo[#63iJs5rJDf]MT$pu_;Mo&frOo]?/RroX7\!9X:\ +puVSVroO4\roO4\g#i#.oB$2Uk5XTDnE0`MpuVSVroX7\s5jIak5XTDj5p@AroO4\roO4\bN8p, +k5XTBs8V3ks5s@Dk5XT+s8V6]k2u^BjoGGNjoGG[joGG[jobYGk5YGC!<<&\!<;EJ"TRWak5Y8> +!<<#[!<<#[!<;EJ!WV<]s8M-\s7,7Fs+0<`k(2Zqk5PF3~> +JaVdjrr</h!:BjHmK3IW!:KO\s6]jerpBadeaED:qsOF`nF$8Un*U;YmJuYTo^3"cmd:)CmJu\C +!;Psd!:K7Tmd:))mf!4Smf!4UmK<OX!:Bj\mJm7cmJm7cmJm7ImKN[ZmJu\C!6OX7!:K7T!:BjT +!<)<c!<2Bj!:BjT!:BjdmJm7TmJm7dmJm7dmJm7cmKN[ZmJu\C!:9+X!:K7Tmd:)0mK3IW!:Kgd +rpBadJaS*WJaSZgrr@Q~> +Ja2Lbrr</d!9sRDl2q%O!:'7Xs69RarosI`ea!,6qs+.\nETuQn*1#Ul2^)Lo]c__lKSB7l2^,7 +!;Pg`!:&hLlKSB!lM^eOlM^eQl3%+P!9sRXl2Uh_l2Uh_l2UhEl377Rl2^,7!6OL3!:&hL!9sRL +!<)0_!<26f!9sRL!9sR`l2UhPl2Uh`l2Uh`l2Uh_l377Rl2^,7!:8tT!:&hLlKSB(l2q%O!:'O` +rosI`Ja.gOJa/B_rr@Q~> +J`c4Z"T\Sbs5s@@jobYGs5s%Ts5j=]roO4\e`Ql2qr[nXnE0`Mn)acQk5XTDo]?J[k2u^+k5XT+ +s7k^\s5rJDk2u]nk5PDKk5PDMjok_Hs5s@TjoGG[joGG[joGGAjp(kJk5XT+s2jC/s5rJDs5s@D +s8D'[s8M-bs5s@Ds5s@\joGGLjoGG\joGG\joGG[jp(kJk5XT+s6SkPs5rJDk2u]ujobYGs5s=\ +roO4\J`_OGJ``*Wrr@Q~> +JaVdjquG[CrW)rcr;Zld!<)<c!<)<c!8$WA!:BjT!<)<g!:BjT!:oO\!:BjT!:fI]!:K7Tmd:)I +mf!1fmJm7dmf*:cmJm7dmf!1emJtc)"9@iimJukHp&OdR"p")Z!:K7Tc0b]7mJuYTamKE7mJuYT +!:K7TrU'XcrU'slmd:)C!!)HT!:9+X!:K7Tmd:)PmK<OX!:BjRmJm7dmJm7dmJm7NmJm7cmJm7c +mL0*`!!)HT!!)Eemd:(+mXaeWmZHr;!.Y~> +Ja2LbquG[?rW)r_r;Zl`!<)0_!<)0_!8$K=!9sRL!<)0c!9sRL!:oCX!9sRL!:f=Y!:&hLlKSBA +lM^bbl2Uh`lMgk_l2Uh`lM^bal2]?!"9@]el2^G@p&OdN"p!rR!:&hLc0>E3l2^)Lam'-3l2^)L +!:&hLrTX@_rTX[hlKSB7!!)<L!:8tT!:&hLlKSBHl3%+P!9sRNl2Uh`l2Uh`l2UhJl2Uh_l2Uh_ +l3m[X!!)<L!!)9alKSA#l@J5OlB1B3!.Y~> +J`c4ZrrE&ui9(%=roX1Z!TsF\joGG[joGG5jok_Hs5s@[jok_Hs5s@Pjok_Hs5s@Ojp(kJk5XT+ +s7GIQrrV?_s8M0\s8D'[s8M0[rrM9^eE-o6k5XTDoB,cHp#ZJYk2u^+k5W]g"TRWak5WQc#lj&e +k5YJDk5YDB!<<#[$30/Ms5s@]k2u^1jp(kJk5XT+s81p]s5s@Ds6SkJs8M-\s8M-\s6/SFs8D'[ +s8D'gs5s@]k2u^Dk5XT+s+0<`k(2ZWk5PF3~> +JaVjlp&O=En,Uf&%fl%c!:K7Tmd:)CmJu\C!;,[`!:K7Tmd:)HmJm7dmJm7dmJm7[mem+dmK!4R +rrE&d!!*#dr;b@8"p")Z!:K7TnF$8Uo'QJXrpBadrpBadc0kQ2amK-/rpKac"7?0W!;5a_!:BjT +!:&tT!:BjT!;Z'^!:9+R!<)<c!<)<c!9ihN!<2Bd!<2Bp!:K7T!:K7T!:K7T!0Q[L!<)<c!<)<c +!.jQhmYgN5!.Y~> +Ja2Rdp&O=An,Uf"%fkn[!:&hLlKSB7l2^,7!;,O\!:&hLlKSB@l2Uh`l2Uh`l2UhWlMU\`l2^eJ +rrE&`!!*#`r;b@4"p!rR!:&hLnETuQo'-2TrosI`rosI`c0G9.am&j+rp'I_"6omO!;5U[!9sRL +!:&hP!9sRL!;YpZ!:8tN!<)0_!<)0_!9i\J!<26`!<26l!:&hL!:&hL!:&hL!0QOH!<)0_!<)0_ +!.jEdlAOs-!.Y~> +J`c:\pAa@=nGghs&-(eSs5rJDk2u^+k5XT+s7GFXs5rJDk2u^8joGG\joGG\joGGSk5G;\k5YDB +s8W)\!<<&\rVtC0#63iJs5rJDnE0`Mo&]rProO4\roO4\c0#$*alWU'roX4["6TXGs7PLWs5s@D +s6A_Ls5s@Ds7tgVs6SkJs8D'[s8D'[s6/SFs8M-\s8M-hs5rJDs5rJDs5rJDs,lFDs8D'[s8D'[ +s+0<`k)8C%!.Y~> +JaVdjquG[CrW)udr;clc!!)`\!!)uc!!)uc!!)-K!!*#d!!*#drrE&d!!*#d!!)`\!!*#d!!*#d +!!)][!!)uc!!)uc!!)i_p&P'Z!W_ZVo`3\5!!*#d!!*#d!!)TX"9@iimJunI!!)uc!!)uc!!(I8 +p&N8'!<DQd!<)<c!;Gp\!9ikM!;u9Y!6adD!:K7Tmd:)CmJu\C!:Bgemd:&TOR<)KrpBadrpBad +JaS*WMXLKEJ,~> +Ja2LbquG[?rW)u`r;cl_!!)`X!!)u_!!)u_!!)-G!!*#`!!*#`rrE&`!!*#`!!)`X!!*#`!!*#` +!!)]W!!)u_!!)u_!!)i[p&P'V!W_NNo`3\1!!*#`!!*#`!!)TT"9@]el2^JA!!)u_!!)u_!!(I4 +p&N8#!<DE`!<)0_!;GdX!9i_I!;u-U!6aX@!:&hLlKSB7l2^,7!9sOalKS?LOQlfGrosI`rosI` +Ja.gOMX(3AJ,~> +J`c4ZrrE&ui9(%=s5s:[s5j=]p>uATrT4+[rT4+[jlQRCroO4\roX7\roO4\roO4\p>uATroO4\ +roO4\p#Z8SrT4+[rT4+[q<%DNrT41]k2u@:g#`;7roO4\roO4\o&^)Tk5XTDo]?/RrT4+[rT4+[ +dcU9'b2ra)k5G>YjoGGUk5PDEk5PDYk4\hujqIdWk5XT+s5rJDk2u^+s8V6Ds8S2C!<<&\!<<&\ +!<7W4J`_jPrr@Q~> +JaVdjrr</h!:BjHmK3IW!:Kgd!:Kgds6]jep?hn\rpBadrpBadjmE*KrU'XcrpKddrpBadrU'Xc +q!J+^rU'XcrU'XchsUIDq!J=dmJuYTmdC&Sf'WM<rU'XcrU'Xco^2qamd:)CmJm7cmJm7cmJm7( +mf!4-me$SVme-YMme-YYmf!4+mK<OX!:Bj`mK<OX!:BiHmKN[ZmJu\C!.jQhmYUB3!.Y~> +Ja2Lbrr</d!9sRDl2q%O!:'O`!:'O`s69Rap?DVXrosI`rosI`jlugGrTX@_rp'L`rosI`rTX@_ +q!%hZrTX@_rTX@_hs11@q!&%`l2^)LlK\?Kf'358rTX@_rTX@_o]cY]lKSB7l2Uh_l2Uh_l2Uh$ +lM^e)lLb/RlLk5IlLk5UlM^e'l3%+P!9sR\l3%+P!9sQDl377Rl2^,7!.jEdlA=g+!.Y~> +J`c4Z"T\Sbs5s@@jobYGs5s=\!9X:\s5j=]p>uATroO4\roO4\jlQRCrT4+[roX7\roO4\rT4+[ +puVSVrT4+[rT4+[hraq<puVe\k5XTDk2u[Cf&cu4rT4+[rT4+[o]?DYk2u^+k5YJ[joGG[joGFu +k5PD%k4ScNk4\iEk4\iQk5PD#jok_Hs5s@Xjok_Hs5s?@jp(kJk5XT+s+0<`k)&7#!.Y~> +JaVdjrr<2i!:K7TjR*NYmd:)C!!)HT!!)Eemd:)KmKN[ZmJu\C!1WBZ!:BjT!;Q!]!<;Hi!:BjT +!6=L-!<)<i!:BjTmJm7dmf*:dmJm7dmJm7(mK<OX!:Bj0mJm7cmem+emJm7[mf!4Mmf!4^mK<OX +!:Bj,mf!4]mf!3EmK<OX!:Bi<mXae^mf*9;~> +Ja2Lbrr<2e!:&hLjQ[6UlKSB7!!)<L!!)9alKSBCl377Rl2^,7!1W6V!9sRL!;PjY!<;<e!9sRL +!6=@)!<)0e!9sRLl2Uh`lMgk`l2Uh`l2Uh$l3%+P!9sR,l2Uh_lMU\al2UhWlM^eIlM^eZl3%+P +!9sR(lM^eYlM^dAl3%+P!9sQ8l@J5VlMgj7~> +J`c4Z#6+\cs5rJDjQ7!Qk2u^+s8V6Ds8V6]k2u^;jp(kJk5XT+s-r-Rs5s@Ds7kaUs8V3as5s@D +s2X7%s8D'as5s@Dk5YJ\k5YJ\joGG\joGFujok_Hs5s@(joGG[k5G;]k5YJSk5PDEk5PDVjok_H +s5s@$k5PDUk5PC=jok_Hs5s?4k(2ZNk5PF3~> +L[G-BrU'Xcr9aObnF$8U!U]semJm7LmJm7dmKN[Z!:BjT!<2Bd!;#U]!:BjT!1WB\!:K7Tmd:)R +me$S[mJm7-mJm7dmf*:emK*CV!<)?c!<;Hh!:K7Tm-XiRrU'XcrU'XcipI!Nmd:)CmJtDt!W_ZV +rVurdrW)WZ"9@iimJuP?"9@iimK!.P"p")Z!:K7Tp$Me[rU'XcrU'XcipQL?!:KO\NpclHJaS*W +L[P0BJ,~> +L["j>rTX@_r9=7^nETuQ!U9[al2UhHl2Uh`l377R!9sRL!<26`!;#IY!9sRL!1W6X!:&hLlKSBJ +lLb/Wl2Uh)l2Uh`lMgkal2gtN!<)3_!<;<d!:&hLm-4QNrTX@_rTX@_ip$^JlKSB7l2\ul!W_NN +rVur`rW)WV"9@]el2^,7"9@]el2^_H"p!rR!:&hLp$)MWrTX@_rTX@_ip-4;!:'7XNp?TDJa.gO +L[+m>J,~> +LZSR:rT4([r8mtZnE'lR!!)0]roO4\k2l[DroOFbk5XTDk5YGC!<;ZQ"TRWak5Uq5#63iJs5rJD +rT<eQs5j=]a6!C%roX7\s5jC_k5YDBs8W,]"97NGs6SkJs8D'[s8D'[s5N/Fs5rJDk2u]djoYSF +k5PA\k5PDRjok_Hs5s@Hjok_Hs5s@Yjp(kJk5XT+s7PLSs8D'[s8D'[s5N27rrD3Ts,Q7@s+0<` +k(i+!!.Y~> +L[G-BrpBgfmK!7S!W_Wgo'QY]mJm7T!<)<c!9ihN!<)?c!<2Ed!<)<c!;#XX!8[&C!<)<c!<)<c +!:9+R!<)<c!<)<c!<2Bd!<)<c!<)<c!;Z'_!<2Bd!<2Ed!;l3_!<2Bd!<2Ed!6FR4!:K7Tmd:)M +mK<OX!:BjPmJm7dmJm7dmJm7HmJm7dmJm7dmJm70mf*7emed(XmKN[ZmJu\C!:9+X!:K7Tmd:)R +mJm7dmJm7dmJm7[mJm7dmJm7dmJm7Cmf!4]mf!3Hme-X3mXaeamf*9;~> +L["j>rosObl2^hK!W_Kco'-AYl2UhL!<)0_!9i\J!<)3_!<29`!<)0_!;#LT!8Zo?!<)0_!<)0_ +!:8tN!<)0_!<)0_!<26`!<)0_!<)0_!;Yp[!<26`!<29`!;l'[!<26`!<29`!6FF0!:&hLlKSBE +l3%+P!9sRLl2Uh`l2Uh`l2UhDl2Uh`l2Uh`l2Uh,lMghalMLYTl377Rl2^,7!:8tT!:&hLlKSBJ +l2Uh`l2Uh`l2UhWl2Uh`l2Uh`l2Uh?lM^eYlM^dDlLk4/l@J5YlMgj7~> +LZSR:roO7^joGDC!W_?_o&^,Ujo>DDs8D'[s6/SFs8D*[s8M0\s8D'[s7>CPs4uf;s8D'[s8D'[ +s6SkJs8D'[s8D'[s8M-\s8D'[s8D'[s7tgWs8M-\s8M0\s81sWs8M-\s8M0\s2a=,s5rJDk2u^= +jok_Hs5s@HjoGG\joGG\joGG@joGG\joGG\joGG(k5YG]k5>8Pjp(kJk5XT+s6SkPs5rJDk2u^B +joGG\joGG\joGGSjoGG\joGG\joGG;k5PDUk5PC@k4\h+k(2ZQk5PF3~> +M!k9Cs6]jerpBgfmK!7S!!)QWrrC(,p&O.@$NTV_!:BjT!:K7T!:&tP!<2Bd!<2Bd!;u6b!<2Bd +!<2Bd!;Q!^!<2Bd!<2Ed!;u6c!:KgdrpBadrpKdda6j'1mJuYTp?qn[kjAWTmd:)CmJu87!!)uc +!!)uc!!(R;!!)uc!!)uco`4jV!!*#d!!*#d!!)HT!!*#d!!*#d!s%cW!<)<c!<)<c!;5aa!:K7T +md:)2mK<OX!:Bj`mK<OX!:BjRme6[]mf!4`mJm7cmJm7cmJm6<mXaenmf*9;~> +M!G!?s69RarosObl2^hK!!)QSrrC((p&O.<$NTJW!9sRL!:&hL!:&hL!<26`!<26`!;u*^!<26` +!<26`!;PjZ!<26`!<29`!;u*_!:'O`rosI`rp'L`a6Ed-l2^)Lp?MVWkir?PlKSB7l2]i/!!)u_ +!!)u_!!(R7!!)u_!!)u_o`4jR!!*#`!!*#`!!)HP!!*#`!!*#`!s%WO!<)0_!<)0_!;5U]!:&hL +lKSB*l3%+P!9sR\l3%+P!9sRNlLk4YlM^e\l2Uh_l2Uh_l2Ug8l@J5flMgj7~> +M!"^;s5j:]roO7^joGDC!!)QOrrC($pAa18$ifAOs5s@Ds5rJDs6A_Hs8M-\s8M-\s8;!Zs8M-\ +s8M-\s7kaVs8M-\s8M0\s8;![s5s=\roO4\roX7\a6!O)k5XTDp?)ASkiN*Lk2u^+k5XH'!<<#[ +!<<#[!<:U3!<<#[!<<#[p&FmN!<<&\!<<&\!<;KL!<<&\!<<&\"97NGs8D'[s8D'[s7PLYs5rJD +k2u^"jok_Hs5s@Xjok_Hs5s@Jk4\hUk5PDXjoGG[joGG[joGF4k(2Z^k5PF3~> +M=(NImJu\C!<2Bf!:BjdmJm7Wmf*:(mf!4CmKim]mJm7T!:BgekjAWTmd:)CmK!+O"p")Z!:K7T +p$N"amd:)CmK!.P$io_`!:K7Tmd:)CmJt2nrW)c^p&OFH"9@iimJs6S!!*#d!!*#d!W_ZVqZ$Zb +!;Z$_!<)<c!<)<c!:]CV!<)<c!<)<c!9ihR!:BjT!8[&I!:K7Tmd:)QmKN[ZmJu\C!:B1Ss7l!^ +s/bVk!:BjT!;l0a!<2Bd!<2Bd!.jQhm[*AA!.Y~> +M<Y6El2^,7!<26b!9sR`l2UhSlMgk$lM^e?l3RIUl2UhL!9sOakir?PlKSB7l2^\G"p!rR!:&hL +p$)_]lKSB7l2^_H$ioSX!:&hLlKSB7l2\cfrW)cZp&OFD"9@]el2[gK!!*#`!!*#`!W_NNqZ$Z^ +!;Ym[!<)0_!<)0_!:]7R!<)0_!<)0_!9i\N!9sRL!8ZoE!:&hLlKSBIl377Rl2^,7!:B%O!;PgZ +!3GGg!9sRL!;l$]!<26`!<26`!.jEdlBgf9!.Y~> +M<4sAjoFQ+!<2*^!9O:\jo>DOk5PFuk5PD;jpD(Mk5YJDs5s@]kiN*Lk2u^+k5Y;?#63iJs5rJD +p#ZJYk2u^+k5Y>@%0,JPs5rJDk2u^+k5WB^rr;fVpAaI@"TRWak5VFC!<<&\!<<&\!rqEFqu6]Z +s7tdWs8D'[s8D'[s7#.Ns8D'[s8D'[s6/SJs5s@Ds4ufAs5rJDk2u^Ajp(kJk5XT+s6\qKs7k^V +s/b>cs5s@Ds81pYs8M-\s8M-\s+0<`k*P61!.Y~> +M=(NImJu\C!<2Bf!:BjdmJm7WmeHk)mK<OX!:BjDmK<OXmJu\S!9W\P!:BjT!;Psb!:BjT!;#U] +!:BjT!;l0a!<2Bd!<2Bh!:BjT!6=O$!;Z'^!9W_K!2o5g!:K7TmdBcKrpBadrU'XcrU'Xc`U<^* +h<k7CrpBadrpBadrpBadrpBadrpBadmd:)Tq!J.^XmQAnmd:)CmK!.P"p")Z!:K7TJaS*WQL=bQ +J,~> +M<Y6El2^,7!<26b!9sR`l2UhSlM1G%l3%+P!9sR@l3%+Pl2^,K!9WPL!9sRL!;Pg^!9sRL!;#IY +!9sRL!;l$]!<26`!<26d!9sRL!6=Bu!;YpZ!9WSG!2o)c!:&hLlK\'CrosI`rTX@_rTX@_`TmF& +h<Ft?rosI`rosI`rosI`rosI`rosI`mcjcPq!%hZXm-)jlKSB7l2^_H"p!rR!:&hLJa.gOQKnJM +J,~> +M<4sAjoFQ+!<2*^!9O:\jo>DOk4o#!jok_Hs5s@<jok_Hk5XTCs5rGHs5s@Ds7k^Zs5s@Ds7>@U +s5s@Ds81pYs8M-\s8M-`s5s@Ds2X9qs7tgVs5rJCs/4u_s5rJDk2uC;roO4\rT4+[rT4+[`TI1" +h<"_;roO4\roO4\roO4\roO4\roO4\mcFNLpuVSVXl]ifk2u^+k5Y>@#63iJs5rJDJ`_OGQKJ2I +J,~> +MXCZKmd:)CmK!7S!W_WgrpBadna?2Qb3fQ9md:)CmJu\C!<)<c!<)<c!:0%R!:KdcjR3!Ip?qn[ +na?AVqsFFarU'XcrU0Xb_X@C'p?i%`mJuYTlgFHHkjAENrU'XcrU'XciU-[GrU'XcrU'Xcq<e@c +mJuYTrU0Xb"RZ9XmK!7S!!*#d!!*#d!!(+.p&O+?!!)uc!!)uc!W_WgrU'XcrU'Xcn*U2Uq!J.^ +Y3l8irpBadrpBadqsFRemJuYTJaS*WQ1"YPJ,~> +MWtBGlKSB7l2^hK!W_KcrosI`n`ooMb3B95lKSB7l2^,7!<)0_!<)0_!:/nN!:'L_jQc^Ep?MVW +n`p)Rqs".]rTX@_rTa@^_Wq+#p?Db\l2^)Llg"0Dkir-JrTX@_rTX@_iT^CCrTX@_rTX@_q<A(_ +l2^)LrTa@^"R6!Pl2^hK!!*#`!!*#`!!(+*p&O+;!!)u_!!)u_!W_KcrTX@_rTX@_n*0lQq!%hZ +Y3GuerosI`rosI`qs":al2^)LJa.gOQ0SALJ,~> +MWP*Ck2l[+joGDC!W_?_roO1\n`KWIb2s$1k2u^+k5XT+s8D'[s8D'[s6JeJs5s:[jQ?IAp?)AS +n`KiNqrRnYrT4+[rT=+Z_WLjtp>uMXk5XTDlfRp@kiMmFrT4+[rT4+[iT:.?rT4+[rT4+[q;qh[ +k5XTDrT=+Z"QoaHk5YGC!<<&\!<<&\!<:.&pAa.7!<<#[!<<#[!rqE_rT4+[rT4+[n)aWMpuVSV +Y3#`aroO4\roO4\qrS%]k5XTDJ`_OGQ0/)HJ,~> +MXLBB!U]semK*CV!<2Bd!:fLW!6+@+!<2Bd!<2Bg!:K7TrpBadrpBadlgFHHm-aQIrpKI[q<mqV +q<mqVa6j'1mJuYTq!J=dmd:)CmJuJ=rW)!H!!*#d!!*#d!!(pE!!*#d!!*#d!!)c]rW)obrW!#f +!!*#d!!*#d"p")Z!:K7T_s[L([I+%pq!J.^YO2AjrU'XcrU'XcqsOF`JaS*WPj\POJ,~> +MX(*>!U9[al2gtN!<26`!:f@S!6+4'!<26`!<26c!:&hLrosI`rosI`lg"0Dm-=9Erp'1Wq<IYR +q<IYRa6Ed-l2^)Lq!&%`lKSB7l2^&5rW)!D!!*#`!!*#`!!(pA!!*#`!!*#`!!)cYrW)o^rW!#b +!!*#`!!*#`"p!rR!:&hL_s74$[H[_lq!%hZYNc)frTX@_rTX@_qs+.\Ja.gOPj88KJ,~> +MWXg:!TjC]joPPF!<2*\!:f4O!6+(#s8M-\s8M-_s5rJDroO4\roO4\lfRp@m,n$AroWqSq<%DN +q<%DNa6!O)k5XTDpuVe\k2u^+k5XZ-rr;$@!<<&\!<<&\!<:s=!<<&\!<<&\!<;fUrr;rZrr3&^ +s8W)\!<<&\#63iJs5rJD_rgsu[H7JhpuVSVYN>ibrT4+[rT4+[qr[nXJ`_OGPihuGJ,~> +L[G-BrpBgfmK!7S!W_WgnF$;V`pNg,rU'XcrU'slmd:)CmJu\C!:9.I!<;He!9rqN!;>j[!:fLV +!:fLV!6":0!:K7Tmd:)OmJm7dmJm7dmJm7PmK<OX!:BjImKN[ZmJu\C!8[&I!:K7Tmd:)Ome$P_ +mJu\C!<)<c!<2Bu!:BjT!!)Eemd:)C!:K7TmJtW%"9@iimJs]`!<<#c!<<#c!<9b#!!)uc!!)uc +!!)QWp&K[3JaSonrr@Q~> +L["j>rosObl2^hK!W_KcnEU#R`p*O(rTX@_rTX[hlKSB7l2^,7!:9"E!<;<a!9reJ!;>^W!:f@R +!:f@R!6".,!:&hLlKSBGl2Uh`l2Uh`l2UhLl3%+P!9sREl377Rl2^,7!8ZoE!:&hLlKSBGlLb,[ +l2^,7!<)0_!<26q!9sRL!!)9alKSB7!:&hLl2]2r"9@]el2\9X!!)u_!!)u_!!'^t!!)u_!!)u_ +!!)QSp&K[/Ja/Wfrr@Q~> +LZSR:roO7^joGDC!W_?_nE0`N`o[:$rT4+[rT4Fdk2u^+k5XT+s6SnAs8V3]s68\Fs7YUSs7,7N +s7,7Ns2=%(s5rJDk2u^?joGG\joGG\joGGHjok_Hs5s@Ajp(kJk5XT+s4ufAs5rJDk2u^?k4S`W +k5XT+s8D'[s8M-ms5s@Ds8V6]k2u^+s5rJDk5Wfj"TRWak5VmP!<<#[!<<#[!<9ap!<<#[!<<#[ +!<;TOpA]^+J``?^rr@Q~> +L[G-BrU'Xcr9aObn*^2Uc0bQ3rU'XcrU'Xcp[/.amJuYTkO/3Is6]jel0\ZSmJuYTq!J7bmJuYT +oBl_]mJuYToBl_]mJuYT`pNg,rpBadrpBadr9aObrU'XcrU'Xcp?hn\rU'XcrU'jimd:)CmJu;8 +"9@iimJuVA!!)uc!!)uc!!)oa"9@iimJuqJrW)ud!!*#d!!*#d!!)i_rW)ud$39JomJuYTmJuYT +d-_)<md:)C!!*#d!!)uc!!(X=!!)uc!!)uc!!)][!<;i^!<9_"!!*#d!!*#d!!)BRrW%N;JaScj +rr@Q~> +L["j>rTX@_r9=7^n*9oQc0>9/rTX@_rTX@_pZ_k]l2^)LkN_pEs69Ral08BOl2^)Lq!%t^l2^)L +oBHGYl2^)LoBHGYl2^)L`p*O(rosI`rosI`r9=7^rTX@_rTX@_p?DVXrTX@_rTXRelKSB7l2]l0 +"9@]el2^29!!)u_!!)u_!!)o]"9@]el2^MBrW)u`!!*#`!!*#`!!)i[rW)u`$39>kl2^)Ll2^)L +d-:f8lKSB7!!*#`!!)u_!!(X9!!)u_!!)u_!!)]W!!)fZ!!'[s!!*#`!!*#`!!)BNrW%N7Ja/Kb +rr@Q~> +LZSR:rT4([r8mtZn)jWMc/o$+rT4+[rT4+[pZ;VYk5XTDkN;[As5j=]l/i-Kk5XTDpuV_Zk5XTD +oB$2Uk5XTDoB$2Uk5XTD`o[:$roO4\roO4\r8n"ZrT4+[rT4+[p>uATrT4+[rT4=ak2u^+k5XK( +"TRWak5Xf1!<<#[!<<#[!<;rY"TRWak5Y,:rr<#\!<<&\!<<&\!<;lWrr<#\$NK8gk5XTDk5XTD +d,kQ4k2u^+s8W)\!<<#[!<:[5!<<#[!<<#[!<;`S!<;iV!<9^o!<<&\!<<&\!<;EJrr7Q3J``3Z +rr@Q~> +JaVdjrrC:2!!*#d!!*#d!!)][rW)-LrW!,i!!)Ee!9rnU!:K7Tmd:)OmKN[ZmJu\C!;5aa!:K7T +md:)JmKN[ZmJu\C!6FR.!<)<c!<)<c!9W\L!<2Bd!<2Bd!<2Bd!<2Bd!9<MH!:&tP!<2Bd!<2Bd +!;Z'^!;5a`!:BjT!!)uc!!)uc!!*#dp&G?c!!)Ee!:Bj\mJm7cmJm7cmJm7LmJm7dmKWa[mJm7T +mK!7S!!(R;!!*#d!!*#d!!)ZZ!<;i^!<9\!"p")Z!:K7Tm-XuVmJuYTJaS*WQ1"YPJ,~> +Ja2LbrrC:.!!*#`!!*#`!!)]WrW)-HrW!,e!!)9a!9rbQ!:&hLlKSBGl377Rl2^,7!;5U]!:&hL +lKSBBl377Rl2^,7!6FF*!<)0_!<)0_!9WPH!<26`!<26`!<26`!<26`!9<AD!:&hL!<26`!<26` +!;YpZ!;5U\!9sRL!!)u_!!)u_!!*#`p&G?_!!)9a!9sRXl2Uh_l2Uh_l2UhHl2Uh`l3@=Sl2UhL +l2^hK!!(R7!!*#`!!*#`!!)ZV!!)fZ!!'Xr"p!rR!:&hLm-4]Rl2^)LJa.gOQ0SALJ,~> +J`c4ZrrC:*!<<&\!<<&\!<;`Srr;0Drr3/as8V6]s68YMs5rJDk2u^?jp(kJk5XT+s7PLYs5rJD +k2u^:jp(kJk5XT+s2a=&s8D'[s8D'[s5rGDs8M-\s8M-\s8M-\s8M-\s5W8@s6A_Hs8M-\s8M-\ +s7tgVs7PLXs5s@Ds8W&[!<<#[!<<&\pAYB[s8V6]s5s@TjoGG[joGG[joGGDjoGG\jp1qKk5YJD +k5YGC!<:U3!<<&\!<<&\!<;]R!<;iV!<9[n#63iJs5rJDm,eHNk5XTDJ`_OGQ0/)HJ,~> +JaVdjrrC71"p")Z!:K7Tq!RhUm-alR!:Kdc!q$$glL"WPrpBadrpBadr9aObrpBadrpBadp[/"] +rpBadrpBadp[/"]rpBadrpBadbjGH2rU'XcrU'XcipI!Nmd:)CmK!4R!!)uc!!)6Np&OLJ"p")Z +!:K7Tr9j7YrpBadrpBsjmd:)CmJubErW!>o!:K7TmJuYTmJm7cmJm7`mJm7dmJm7dmJm7LmJm7c +mJm7dmf*7imJu\C!7U??!:K7Tmd:)HmK!:^mK!:#mKrs^mJuYTmJu\C!:T=[!:K7Tmd:(+mXael +mf*9;~> +Ja2LbrrC7-"p!rR!:&hLq!.PQm-=TN!:'L_!pTaclKS?LrosI`rosI`r9=7^rosI`rosI`pZ__Y +rosI`rosI`pZ__YrosI`rosI`bj#0.rTX@_rTX@_ip$^JlKSB7l2^eJ!!)u_!!)6Jp&OLF"p!rR +!:&hLr9EtUrosI`ros[flKSB7l2^>=rW!>k!:&hLl2^)Ll2Uh_l2Uh\l2Uh`l2Uh`l2UhHl2Uh_ +l2Uh`lMghel2^,7!7U3;!:&hLlKSB@l2UhZl2Ugtl3[OVl2^)Ll2^,7!:T1W!:&hLlKSA#l@J5d +lMgj7~> +J`c4ZrrC7)#63iJs5rJDpu_;Mm,n?J!9X7[!p9O_lK/*HroO4\roO4\r8n"ZroO4\roO4\pZ;JU +roO4\roO4\pZ;JUroO4\roO4\biSp*rT4+[rT4+[ioUIFk2u^+k5YDB!<<#[!<;9FpAaOB#63iJ +s5rJDr9!_QroO4\roOFbk2u^+k5Xr5rr3Ags5rJDk5XTDk5YJ[joGGXjoGG\joGG\joGGDjoGG[ +joGG\k5YGak5XT+s3p*7s5rJDk2u^8joGGVjoGFpjpM.Nk5XTDk5XT+s6o(Ss5rJDk2u\pk(2Z\ +k5PF3~> +JaVdjrrC40"9@iimJukHrW)3NrrE)e!<DQe!<;He!:9+R!<)<c!<)<c!<2Bd!<)<c!<)<c!;Z$_ +!<)<c!<)<c!;Z$_!<)<c!<)<c!6jj2!<2Bd!<2Bd!;5a[!<2Ed!<2Ed!<2Bd!;l3`!"/,omJuYT +md:)C!<)<c!9`eL!9ihU!:BjT!:K7TrU'^emdC&Ss6]jerpBadrpBadrpBadrpBado'Qb`mJuYT +mJu\Cq>gN_!!)f^"p")Z!:K7Tg[51EmJuYTdI%,;mJuYTo'QMXq!J.^]^>h$mdC&Ss6]jen*U/U +rpBadrpBadJaS*WQgXkRJ,~> +Ja2LbrrC4,"9@]el2^G@rW)3JrrE)a!<DEa!<;<a!:8tN!<)0_!<)0_!<26`!<)0_!<)0_!;Ym[ +!<)0_!<)0_!;Ym[!<)0_!<)0_!6j^.!<26`!<26`!;5UW!<29`!<29`!<26`!;l'\!".ukl2^)L +lKSB7!<)0_!9`YH!9i\Q!9sRL!:&hLrTXFalK\?Ks69RarosI`rosI`rosI`rosI`o'-J\l2^)L +l2^,7q>gN[!!)fZ"p!rR!:&hLgZenAl2^)LdHUi7l2^)Lo'-2Tq!%hZ]]oOulK\?Ks69Ran*0lQ +rosI`rosI`Ja.gOQg4SNJ,~> +J`c4ZrrC4("TRWak5Y&8rr;6Fs8W,]!WV<]s8V3]s6SkJs8D'[s8D'[s8M-\s8D'[s8D'[s7tdW +s8D'[s8D'[s7tdWs8D'[s8D'[s30U*s8M-\s8M-\s7PLSs8M0\s8M0\s8M-\s81sXrsIogk5XTD +k2u^+s8D'[s6&PDs6/SMs5s@Ds5rJDrT41]k2u[Cs5j=]roO4\roO4\roO4\roO4\o&^5Xk5XTD +k5XT+qZ$QW!<;iV#63iJs5rJDgZAY=k5XTDdH1T3k5XTDo&]rPpuVSV]]K:qk2u[Cs5j=]n)aWM +roO4\roO4\J`_OGQfe;JJ,~> +JaVdjrrC1/rW)QX"9@iimJuS@!W_ZVp&K[3q!J=dmd:)CmJukH!!*#d!!*#d!!*#d!!)i_rW)ud +#6=2[!!)HT!<2Bd!9`bQ!:BjT!9ikM!<2Bd!<2Bh!:K7Tmf!1hmJu\C!<2Bd!<)<c!<)<c!;,[_ +!:K7TmdBZHp?i%`mJuYTg$\h>cgLc4na?,N^$bRona6AWrU'XcrU'XcJaS*WR-stSJ,~> +Ja2LbrrC1+rW)QT"9@]el2^/8!W_NNp&K[/q!&%`lKSB7l2^G@!!*#`!!*#`!!*#`!!)i[rW)u` +#6=&S!!)<L!<26`!9`VM!9sRL!9i_I!<26`!<26d!:&hLlM^bdl2^,7!<26`!<)0_!<)0_!;,O[ +!:&hLlK[s@p?Db\l2^)Lg$8P:cg(K0n`ofJ^$>:kn`g)SrTX@_rTX@_Ja.gOR-O\OJ,~> +J`c4ZrrC1'rr;TP"TRWak5Xc0!rqEFpA]^+puVe\k2u^+k5Y&8!<<&\!<<&\!<<&\!<;lWrr<#\ +#QNrKs8V6Ds8M-\s6&MIs5s@Ds6/VEs8M-\s8M-`s5rJDk5PA`k5XT+s8M-\s8D'[s8D'[s7GFW +s5rJDk2u:8p>uMXk5XTDg#i;6cfY6,n`KQF^#o%gn`BiOrT4+[rT4+[J`_OGR-+DKJ,~> +JaVdjrrC=3p&P'Z!!)uc"p")Z!:BgejmN*JL[G-BrU'XcrU'Xcq!J7bmJuYTna6_amd:&TmJm7T +mK!1Qp&GBd!!)HT!:K7TkO&NSmd:)CmJuYBp&P-\#6=2[!:K7Tmf!1emJuD;!!*#d!!*#d!<DQb +!!DWhmJunIrW(aAp&N_4p&LuX!W_ZVquHcb!!%T<JaS*WrU0[cJ,~> +Ja2LbrrC=/p&P'V!!)u_"p!rR!9sOajm)gFL["j>rTX@_rTX@_q!%t^l2^)Ln`gG]lKS?Ll2UhL +l2^bIp&GB`!!)<L!:&hLkNW6OlKSB7l2^5:p&P-X#6=&S!:&hLlM^bal2]u3!!*#`!!*#`!<DE^ +!!DKdl2^JArW(a=p&N_0p&LuT!W_NNquHc^!!%T8Ja.gOrTaC_J,~> +J`c4ZrrC=+pAb*R!<<#[#63iJs5s@]jlZRBLZSU:rT4+[rT4+[puV_Zk5XTDn`C2Yk2u^Dk5YJD +k5YAApAYE\s8V6Ds5rJDkN3!Kk2u^+k5Xi2pAb0T#QNrKs5rJDk5PA]k5XT+!<<&\!<<&\!WV<Z +rr_E`k5Y)9rr:d9pA`b,pA_#P!rqEFr;ZfZ!<7W4J`_OGrT=+[J,~> +JaVdjrrC1/rW)`]$NTV_!!)HT!!)HT!9`bQ!:BjT!/KtB!<2Bd!<2Bd!;>j[!:T=]!:BjT!:BjT +!;Gp[!"/,omJu\C!:BjT!9`bM!<2Bd!<2Bd!:'"O!!qummJuYTmd:)SmK*CVmf!4KmJm7cmJm7c +meZtamf!4\me-YWmJm7cmJm7cmJm7Tmf!44mf!3[mK!=Uqu?cc!.jQhmXag(mf*9;~> +Ja2LbrrC1+rW)`Y$NTJW!!)<L!!)<L!9`VM!9sRL!/Kh>!<26`!<26`!;>^W!:T1Y!9sRL!9sRL +!;GdW!".ukl2^,7!9sRL!9`VI!<26`!<26`!:&kK!!qiil2^)LlKSBKl2gtNlM^eGl2Uh_l2Uh_ +lMCP]lM^eXlLk5Sl2Uh_l2Uh_l2UhPlM^e0lM^dWl2^nMqu?c_!.jEdl@J6ulMgj7~> +J`c4ZrrC1'rr;cU$ifAOs8V6Ds8V6Ds6&MIs5s@Ds+f_:s8M-\s8M-\s7YUSs6o(Us5s@Ds5s@D +s7b[SrsIogk5XT+s5s@Ds6&MEs8M-\s8M-\s6AbGrs7cek5XTDk2u^CjoYSFk5PDCjoGG[joGG[ +k55/Yk5PDTk4\iOjoGG[joGG[joGGLk5PD,k5PCSjoPMEr;Qf[s+0<`k(2[mk5PF3~> +JaVdjrrCL8!!)uc#6=2[!:BjT!;Q!^!!M]imd:)RmJm7OmKN[ZmJu\C!/KtH!:K7Tmd:)Nme-YO +mf!1dmf!4\mK3IW!:KdcrU0XbkO&<MrU'XcrU'Xcm-Y#WmJuYTmf!4dmJm7dme-Y?mdU;Omf!4Z +mJm7dmJm7dmJm7TmK<OX!:Bj7mK<OX!:Bi^me-X3mXaeWmeuSR!.Y~> +Ja2LbrrCL4!!)u_#6=&S!9sRL!;PjZ!!MQelKSBJl2UhKl377Rl2^,7!/KhD!:&hLlKSBFlLk5K +lM^b`lM^eXl2q%O!:'L_rTa@^kNW$IrTX@_rTX@_m-4`Sl2^)LlM^e`l2Uh`lLk5;lL=lKlM^eV +l2Uh`l2Uh`l2UhPl3%+P!9sR3l3%+P!9sQZlLk4/l@J5OlM^#J!.Y~> +J`c4ZrrCL0!<<#[#QNrKs5s@Ds7kaVrrhKak2u^BjoGGGjp(kJk5XT+s+f_@s5rJDk2u^>k4\iG +k5PA\k5PDTjobYGs5s:[rT=+ZkN2dErT4+[rT4+[m,eKOk5XTDk5PD\joGG\k4\i7k4/KGk5PDR +joGG\joGG\joGGLjok_Hs5s@/jok_Hs5s?Vk4\h+k(2ZGk5FHB!.Y~> +JaVdjrrCI7!!*#d#QX8mmJm7TmK!%M"9@iimJu>9!!*#d!!*#d!!%fB"9@iimJunIrW)NWnc8UU +!<DQV!<;He!<)<c!7^E<!:K:K!;l3`!8[&D!:Kab!:Kgdo^2h^mJuYTp$N"amd:)CmJu\C#QX;\ +!:K7TmK!4R!!)uc!!(pE"p")Z!:K7TU[A-_med%cmK!7S!!)uc!!)uc!!%T<JaSE`rr@Q~> +Ja2LbrrCI3!!*#`#QX,il2UhLl2^VE"9@]el2]o1!!*#`!!*#`!!%f>"9@]el2^JArW)NSnc8UQ +!<DER!<;<a!<)0_!7^98!:&kC!;l'\!8Zo@!:'I^!:'O`o]cPZl2^)Lp$)_]lKSB7l2^8;#QX/T +!:&hLl2^eJ!!)u_!!(pA"p!rR!:&hLUZqj[lMLV_l2^hK!!)u_!!)u_!!%T8Ja/-Xrr@Q~> +J`c4ZrrCI/!<<&\#lj&ek5YJDk5Y5="TRWak5XN)!<<&\!<<&\!<7i:"TRWak5Y)9rr;QOo)JXM +!WV<Ns8V3]s8D'[s4$04s5rJ;s81sXs4uf<s5s7Z!9X:\o]?;Vk5XTDp#ZJYk2u^+k5Xl3#lj&L +s5rJDk5YDB!<<#[!<:s=#63iJs5rJDUZMUWk5>5[k5YGC!<<#[!<<#[!<7W4J`_jPrr@Q~> +JaVdjrrCF6#QX;\!!)EemK!7S!!)f^rW)$I!!)uc!!)uc!!%fBrW)TY"9@iimJu_DrVurdrW)c^ +!!*#d!W_ZVrW)obrW)ud!!*#d!!*#d!!(O:!!*#d!!*#drW)`]"9@iimJu/4$io\q!:BjT!!)Ee +mJutK"p")Z!:K7Tp$Mq_mJuYTmd:&TrpBadrpBgfmK!7S!!*#d!!(pE!!*#d!!*#d!!&k`!W_ZV +quHcb!!*#d!!*#d!!*#d!!%T<JaSB_rr@Q~> +Ja2LbrrCF2#QX/T!!)9al2^hK!!)fZrW)$E!!)u_!!)u_!!%f>rW)TU"9@]el2^;<rVur`rW)cZ +!!*#`!W_NNrW)o^rW)u`!!*#`!!*#`!!(O6!!*#`!!*#`rW)`Y"9@]el2]`,$ioPm!9sRL!!)9a +l2^PC"p!rR!:&hLp$)Y[l2^)LmcjcProsI`rosObl2^hK!!*#`!!(pA!!*#`!!*#`!!&k\!W_NN +quHc^!!*#`!!*#`!!*#`!!%T8Ja/*Wrr@Q~> +J`c4ZrrCF.#lj&Ls8V6]k5YGC!<;iVrr;'A!<<#[!<<#[!<7i:rr;WQ"TRWak5Xo4rr2u\rr;fV +!<<&\!rqEFrr;rZrr<#\!<<&\!<<&\!<:R2!<<&\!<<&\rr;cU"TRWak5X?$%0,Jis5s@Ds8V6] +k5Y/;#63iJs5rJDp#ZDWk5XTDmcFNLroO4\roO:^k5YGC!<<&\!<:s=!<<&\!<<&\!<8nX!rqEF +r;ZfZ!<<&\!<<&\!<<&\!<7W4J`_gOrr@Q~> +JaVdjrrCC5#6=/lmJu\C!<)<c!<)?Y!.jS%me-YZmJm7dmf*7imJu\C!:fI_!:BjT!:BjT!;l0a +!<)<f!:BjTrW)ud%05ermJu\C!:K7Tmd:))mJm7cmKWa[mJuYTmK!+O"p")Z!:K7Ti9h$SmJu\C +!:BgemJu\C!;Ps^!<2Bd!<2Bd!;5dZ!:K7T!<)<c!<)<k!:BjTmJu\C!8m2E!<)<c!<)<c!2f2X +!<)<i!:K7Tmd:(+mXae^mf*9;~> +Ja2LbrrCC1#6=#hl2^,7!<)0_!<)3U!.jG!lLk5Vl2Uh`lMghel2^,7!:f=[!9sRL!9sRL!;l$] +!<)0b!9sRLrW)u`%05Ynl2^,7!:&hLlKSB!l2Uh_l3@=Sl2^)Ll2^\G"p!rR!:&hLi9CaOl2^,7 +!9sOal2^,7!;PgZ!<26`!<26`!;5XV!:K+P!<)0_!<)0g!9sRLl2^,7!8m&A!<)0_!<)0_!2f&T +!<)0e!:&hLlKSA#l@J5VlMgj7~> +J`c4ZrrCC-#QNrdk5XT+s8D'[s8D*Qs+0=rk4\iRjoGG\k5YGak5XT+s7,4Ws5s@Ds5s@Ds81pY +s8D'^s5s@Drr<#\%KGSjk5XT+s5rJDk2u]njoGG[jp1qKk5XTDk5Y;?#63iJs5rJDi8tLKk5XT+ +s5s@]k5XT+s7k^Vs8M-\s8M-\s7PORs6f"Ls8D'[s8D'cs5s@Dk5XT+s52r=s8D'[s8D'[s/+rP +s8D'as5rJDk2u\pk(2ZNk5PF3~> +JaVdjrrC@4rW)NW!<DQe!<2Bd!.jRumf!4bmJm7dmKWa[mJm7TmK!7S!!)WY$39M^!!)Ee!:K7T +p?i[rmd:)CmJm7TmJu\C!:K7TmJuYTmK!4R!!)uc!!([>"p")Z!:K7Tr9aObrpBadrpBadnEp8V +rU'XcrU'Xcr9aObrpKdds6fmerpBadqX+=`rU'XcrU'XcqX4%WjmE6OmJuYTJaW:#!W_ZVrW)ud +!!)oa"9@iimJqh+JaS<]rr@Q~> +Ja2LbrrC@0rW)NS!<DEa!<26`!.jFqlM^e^l2Uh`l3@=Sl2UhLl2^hK!!)WU$39AV!!)9a!:&hL +p?ECnlKSB7l2UhLl2^,7!:&hLl2^)Ll2^eJ!!)u_!!([:"p!rR!:&hLr9=7^rosI`rosI`nEKuR +rTX@_rTX@_r9=7^rp'L`s6BUarosI`qW\%\rTX@_rTX@_qWdbSjlusKl2^)LJa3!p!W_NNrW)u` +!!)o]"9@]el2ZD#Ja/$Urr@Q~> +J`c4ZrrC@,rr;QO!WV<]s8M-\s+0=mk5PDZjoGG\jp1qKk5YJDk5YGC!<;ZQ$NK8Ns8V6]s5rJD +p?!.jk2u^+k5YJDk5XT+s5rJDk5XTDk5YDB!<<#[!<:^6#63iJs5rJDr8n"ZroO4\roO4\nE'`N +rT4+[rT4+[r8n"ZroX7\s5s@]roO4\qW7eXrT4+[rT4+[qW@MOjlQ^Gk5XTDJ`c^h!rqEFrr<#\ +!<;rY"TRWak5U"pJ`_aMrr@Q~> +JaVdjrrCL8p&OdR!<DQe!!2KfJaVRd"9@iimK!4R"p")Z!:BgerpBadrU'Xcr9aObrU0Xbs6fme +rpKdds6]jeq!J+^rpC!kmd:&Tmd:)SmK*CVmf!4cmJm7dmJm7dmJm7>mJm7dmJm7dmJm7dmJm7c +mJm7cmJm7VmJm7dmJm7dmJm7bmKrs^!:K7Tmd:)C!<)<c!9NYJ!9!;E!.jS4mKrs^mJuYTmJu\C +!;l3`!.jQhmY:00!.Y~> +Ja2LbrrCL4p&OdN!<DEa!!2?bJa2:\"9@]el2^eJ"p!rR!9sOarosI`rTX@_r9=7^rTa@^s6BUa +rp'L`s69Raq!%hZros^glKS?LlKSBKl2gtNlM^e_l2Uh`l2Uh`l2Uh:l2Uh`l2Uh`l2Uh`l2Uh_ +l2Uh_l2UhRl2Uh`l2Uh`l2Uh^l3[OV!:&hLlKSB7!<)0_!9NMF!9!/A!.jG0l3[OVl2^)Ll2^,7 +!;l'\!.jEdlA"U(!.Y~> +J`c4ZrrCL0pAagJ!WV<]rrM9^J`c"T"TRWak5YDB#63iJs5s@]roO4\rT4+[r8n"ZrT=+Zs5s@] +roX7\s5j=]puVSVroOIck2u^Dk2u^CjoYSFk5PD[joGG\joGG\joGG6joGG\joGG\joGG\joGG[ +joGG[joGGNjoGG\joGG\joGGZjpM.Ns5rJDk2u^+s8D'[s5iDBs5<&=s+0>,jpM.Nk5XTDk5XT+ +s81sXs+0<`k(`$u!.Y~> +JaVdjrrC@4rW)NW!<DQe!!2KfJaVRd"p")Z!:K7TrU'dgmJuYTna6AWrpKac!:KgdrpKddrpBad +qX+=`rU'slmJu\C!:BjTme$S[mK3IWmJto-!!)uc!!)uc!!)$H"p")Z!:K7Tq!J7bmJuYThX1LH +mJuYTjmMgBJaW@%"p")Z!:K7TrU0@ZJaS*WMXLKEJ,~> +Ja2LbrrC@0rW)NS!<DEa!!2?bJa2:\"p!rR!:&hLrTXLcl2^)Ln`g)Srp'I_!:'O`rp'L`rosI` +qW\%\rTX[hl2^,7!9sRLlLb/Wl2q%Ol2]K%!!)u_!!)u_!!)$D"p!rR!:&hLq!%t^l2^)LhWb4D +l2^)Ljm)O>Ja3'r"p!rR!:&hLrTa(VJa.gOMX(3AJ,~> +J`c4ZrrC@,rr;QO!WV<]rrM9^J`c"T#63iJs5rJDrT47_k5XTDn`BiOroX4[!9X:\roX7\roO4\ +qW7eXrT4Fdk5XT+s5s@Dk4ScSjobYGk5X)r!<<#[!<<#[!<;'@#63iJs5rJDpuV_Zk5XTDhW=t@ +k5XTDjlZ::J`cdj#63iJs5rJDrT<hRJ`_OGMWXp=J,~> +JaVdjrrCC5"9@iimJunI!!*#drVuue!6FR.!<)<c!<)<c!6+@+!<)<c!<)<c!:]CV!<2Bd!<2Bd +!<)?b!:T=a!:K7Tmd:)CmJu\C!9*AF!;u6f!:BjT!:&tP!<)<c!<)<c!7(!8!:BjT!;>j[!8d,J +!:K7Tmd:)7mf!3;me6&K!<2Bd!<2Bd!;c-_!.jQhmY:00!.Y~> +Ja2LbrrCC1"9@]el2^JA!!*#`rVuua!6FF*!<)0_!<)0_!6+4'!<)0_!<)0_!:]7R!<26`!<26` +!<)3^!:T1]!:&hLlKSB7l2^,7!9*5B!;u*b!9sRL!:&hL!<)0_!<)0_!7'j4!9sRL!;>^W!8cuF +!:&hLlKSB/lM^d7lLsKC!<26`!<26`!;c![!.jEdlA"U(!.Y~> +J`c4ZrrCC-"TRWak5Y)9!<<&\rr3#]s2a=&s8D'[s8D'[s2F+#s8D'[s8D'[s7#.Ns8M-\s8M-\ +s8D*Zs6o(Ys5rJDk2u^+k5XT+s5E,>s8;!^s5s@Ds6A_Hs8D'[s8D'[s3Ba0s5s@Ds7YUSs5)lB +s5rJDk2u^'k5PC3k4[p;s8M-\s8M-\s8(mWs+0<`k(`$u!.Y~> +JaVdjrrCF6"p")Z!:K7Tp?qSRr9aObrU'XcrU'Xcp$Me[rU'XcrU'XcnEp8VrpBadrpBad_sRL) +rpBadrpBadnEp8VrU'XcrU0@Zo'QhbmJuYTmJuYTmJu56"9@iimK!1QrW)0M!!*#d!!*#d!!(72 +rW)c^p&O.@!!*#d!!*#d!!)*J"9@iimJqh+q!J+^rU'XcrU'Xcr9a[fmJuYTJaS*WL[P0BJ,~> +Ja2LbrrCF2"p!rR!:&hLp?M;Nr9=7^rTX@_rTX@_p$)MWrTX@_rTX@_nEKuRrosI`rosI`_s.4% +rosI`rosI`nEKuRrTX@_rTa(Vo'-P^l2^)Ll2^)Ll2]f."9@]el2^bIrW)0I!!*#`!!*#`!!(7. +rW)cZp&O.<!!*#`!!*#`!!)*F"9@]el2ZD#q!%hZrTX@_rTX@_r9=Cbl2^)LJa.gOL[+m>J,~> +J`c4ZrrCF.#63iJs5rJDp?)&Jr8n"ZrT4+[rT4+[p#Z8SrT4+[rT4+[nE'`NroO4\roO4\_r^t! +roO4\roO4\nE'`NrT4+[rT<hRo&^;Zk5XTDk5XTDk5XE&"TRWak5YAArr;3E!<<&\!<<&\!<::* +rr;fVpAa18!<<&\!<<&\!<;-B"TRWak5U"ppuVSVrT4+[rT4+[r8n.^k5XTDJ`_OGLZ\U:J,~> +JaVdjrrCI7!!*#d!!*#d!!)TXrW)]\!!*#d!!*#d!!)WY!!*#d!!*#d!!)HT"p")Z!:K7T_<qL- +md:)CmJueF!!)uc!!)uc!!)rbrW)?RrW)rcrW(pF"T[uY!:K:J!:0%W!:K7Tmd:)$me-YVmf!4E +mJm7cmJm7cmJm7LmKN[ZmJu\C!.jS'mKN[ZmJu\C!.jQhmYL<2!.Y~> +Ja2LbrrCI3!!*#`!!*#`!!)TTrW)]X!!*#`!!*#`!!)WU!!*#`!!*#`!!)HP"p!rR!:&hL_<M4) +lKSB7l2^A>!!)u_!!)u_!!)r^rW)?NrW)r_rW(pB"T[iQ!:&kB!:/nS!:&hLlKSAqlLk5RlM^eA +l2Uh_l2Uh_l2UhHl377Rl2^,7!.jG#l377Rl2^,7!.jEdlA4a*!.Y~> +J`c4ZrrCI/!<<&\!<<&\!<;WPrr;`T!<<&\!<<&\!<;ZQ!<<&\!<<&\!<;KL#63iJs5rJD_<(t% +k2u^+k5Xu6!<<#[!<<#[!<;uZrr;BJrr;u[rr:s>"om`Is5rJ:s6JeOs5rJDk2u]ik4\iNk5PD= +joGG[joGG[joGGDjp(kJk5XT+s+0=tjp(kJk5XT+s+0<`k(r1"!.Y~> +JaVdjrrCL8!!)uc!!)uc!!)ZZ"9@iimK!"L"p")Z!:K7Tna6S]md:)CmJuVA"9@iimJuVA!!)uc +!!)uc!!(pE"9@iimJu_D!!*#d!!*#d!!)rb"9@iimJuhGn,W.L!!)uc!!)uc!!)uc!!*#d!!*#d +!!*#drW)*K"9@iimJtDtrW)Z["9@iimJsof!!*#d!!*#d!!%T<m-XiRrpBadrpBadJaS*WM=1BD +J,~> +Ja2LbrrCL4!!)u_!!)u_!!)ZV"9@]el2^SD"p!rR!:&hLn`g;YlKSB7l2^29"9@]el2^29!!)u_ +!!)u_!!(pA"9@]el2^;<!!*#`!!*#`!!)r^"9@]el2^D?n,W.H!!)u_!!)u_!!)u_!!*#`!!*#` +!!*#`rW)*G"9@]el2\ulrW)ZW"9@]el2\K^!!*#`!!*#`!!%T8m-4QNrosI`rosI`Ja.gOM<b*@ +J,~> +J`c4ZrrCL0!<<#[!<<#[!<;]R"TRWak5Y2<#63iJs5rJDn`C&Uk2u^+k5Xf1"TRWak5Xf1!<<#[ +!<<#[!<:s="TRWak5Xo4!<<&\!<<&\!<;uZ"TRWak5Y#7nGi1D!<<#[!<<#[!<<#[!<<&\!<<&\ +!<<&\rr;-C"TRWak5WTdrr;]S"TRWak5W*V!<<&\!<<&\!<7W4m,e<JroO4\roO4\J`_OGM<=g< +J,~> +JaVdjrrB\!"p")Z!:K7Tp[/.amJuYTn*U;YmJuYTlL+WOlL"WPrpBadrpBadh<t7BmHt/Ymd:)C +mK!1Q"p")Z!:K7Tn*^/TrpKacnEp8VrpBadrpBadrU'XcrU'XcrU'jimJuYTmJuD;rW(+/"9@ii +mK!%M"p")Z!:K7T^?tt$rU'XcrU'XcJaW:#!!)uc!!*#drrE&d!!)uc!!%T<JaSE`rr@Q~> +Ja2LbrrB[r"p!rR!:&hLpZ_k]l2^)Ln*1#Ul2^)LlK\?KlKS?LrosI`rosI`h<Ot>mHOlUlKSB7 +l2^bI"p!rR!:&hLn*9lPrp'I_nEKuRrosI`rosI`rTX@_rTX@_rTXRel2^)Ll2]u3rW(++"9@]e +l2^VE"p!rR!:&hL^?P[urTX@_rTX@_Ja3!p!!)u_!!*#`rrE&`!!)u_!!%T8Ja/-Xrr@Q~> +J`c4ZrrB[n#63iJs5rJDpZ;VYk5XTDn)acQk5XTDlK8*GlK/*HroO4\roO4\h<+_:mH+WQk2u^+ +k5YAA#63iJs5rJDn)jWLroX4[nE'`NroO4\roO4\rT4+[rT4+[rT4=ak5XTDk5XT+rr:.'"TRWa +k5Y5=#63iJs5rJD^?,FqrT4+[rT4+[J`c^h!<<#[!<<&\s8W)\!<<#[!<7W4J`_jPrr@Q~> +JaVdjrrB_"!!*#d!!*#d!!)c]rW)?RrW)?Rp&OLJ"p")Z!:K7Ti9p:=nEpDZmJuYTr9aObrpBad +rpBadna6_amJuYTmJuYTmJubE"p")Z!:K7Tna6S]md:)CmJuS@p&NG,"p")Z!:K7TqX+=`rpBad +rpBadJaTN*!!*#d!!*#d!!%T<JaS*W!q$$gJ,~> +Ja2LbrrB^s!!*#`!!*#`!!)cYrW)?NrW)?Np&OLF"p!rR!:&hLi9L"9nEL,Vl2^)Lr9=7^rosI` +rosI`n`gG]l2^)Ll2^)Ll2^>="p!rR!:&hLn`g;YlKSB7l2^/8p&NG("p!rR!:&hLqW\%\rosI` +rosI`Ja06"!!*#`!!*#`!!%T8Ja.gO!pTacJ,~> +J`c4ZrrB^o!<<&\!<<&\!<;fUrr;BJrr;BJpAaOB#63iJs5rJDi9'b5nE'lRk5XTDr8n"ZroO4\ +roO4\n`C2Yk5XTDk5XTDk5Xr5#63iJs5rJDn`C&Uk2u^+k5Xc0pA`J$#63iJs5rJDqW7eXroO4\ +roO4\J``ro!<<&\!<<&\!<7W4J`_OG!p0I_J,~> +JaVdjrrBb#!!)uc!!)uc!!)rbp&OdRp&OLJrW)rc!!)uc!!)uc!!)`\"9@iimJu#0rW)9PrW)la +!!)uc!!)uc!!)WY$io_`!:K7Tmd:)CmJubE"9@iimJueF!!*#d!!*#d!!)6NrW)Z[!!)uc!!)uc +!!)$H!!*#d!!*#d!!)rb!!)uc!!)uc!!%T<WU9rjmd:)CmJqh+JaS*Ws6fmeJ,~> +Ja2LbrrBat!!)u_!!)u_!!)r^p&OdNp&OLFrW)r_!!)u_!!)u_!!)`X"9@]el2]T(rW)9LrW)l] +!!)u_!!)u_!!)WU$ioSX!:&hLlKSB7l2^>="9@]el2^A>!!*#`!!*#`!!)6JrW)ZW!!)u_!!)u_ +!!)$D!!*#`!!*#`!!)r^!!)u_!!)u_!!%T8WTjZflKSB7l2ZD#Ja.gOs6BUaJ,~> +J`c4ZrrBap!<<#[!<<#[!<;uZpAagJpAaOBrr;u[!<<#[!<<#[!<;cT"TRWak5X2urr;<Hrr;oY +!<<#[!<<#[!<;ZQ%0,JPs5rJDk2u^+k5Xr5"TRWak5Xu6!<<&\!<<&\!<;9Frr;]S!<<#[!<<#[ +!<;'@!<<&\!<<&\!<;uZ!<<#[!<<#[!<7W4WTFEbk2u^+k5U"pJ`_OGs5s=]J,~> +JaVdjrrB%drW)?RrW)6O"9@iimK!7S!!*#d!!*#d!!)ZZrW(^@"9@iimJubEp&P-\!!)?Q!!*#d +"p"&kmJuYTrpBadnF$8Una6AWrU'XcrU'XclL"cTmJuYTp?hn\rpBadrpBadipHdHrU'XcrU'Xc +JaSro"9@iimJqh+JaS*WrpKddJ,~> +Ja2LbrrB%`rW)?NrW)6K"9@]el2^hK!!*#`!!*#`!!)ZVrW(^<"9@]el2^>=p&P-X!!)?M!!*#` +"p!ogl2^)LrosI`nETuQn`g)SrTX@_rTX@_lKSKPl2^)Lp?DVXrosI`rosI`ip$LDrTX@_rTX@_ +Ja/Zg"9@]el2ZD#Ja.gOrp'L`J,~> +J`c4ZrrB%\rr;BJrr;9G"TRWak5YGC!<<&\!<<&\!<;]Rrr:a8"TRWak5Xr5pAb0T!<;BI!<<&\ +#63ick5XTDroO4\nE0`Mn`BiOrT4+[rT4+[lK/6Lk5XTDp>uATroO4\roO4\ioU7@rT4+[rT4+[ +J``B_"TRWak5U"pJ`_OGroX4\J,~> +JaVdjrrB(e"9@iimJu_D"9@iimJuVA"p")Z!:K7TrpBsjmd:)CmK!"Lp&O%="p")Z!:K7TmI'rR +!U]semJm7QmJm7cmf*7pmJuYT!:BjTmJuYTp[7_TeF!M@md:)CmK!.P!!)uc#QX;\!:BgemK!4R +!!%T<qX+=`rU'XcrU'XcL@5$@JaS*WJaWL)rr@Q~> +Ja2LbrrB(a"9@]el2^;<"9@]el2^29"p!rR!:&hLros[flKSB7l2^SDp&O%9"p!rR!:&hLmHXZN +!U9[al2UhMl2Uh_lMghll2^)L!9sRLl2^)LpZhGPeER5<lKSB7l2^_H!!)u_#QX/T!9sOal2^eJ +!!%T8qW\%\rTX@_rTX@_L?ea<Ja.gOJa34!rr@Q~> +J`c4ZrrB(]"TRWak5Xo4"TRWak5Xf1#63iJs5rJDroOFbk2u^+k5Y2<pAa(5#63iJs5rJDmH4EJ +!TsF]joGGIjoGG[k5YGhk5XTDs5s@Dk5XTDpZD2LeE-u8k2u^+k5Y>@!<<#[#lj&Ls5s@]k5YDB +!<7W4qW7eXrT4+[rT4+[L?AL8J`_OGJ`cpnrr@Q~> +JaVdjrrB+f"p")Z!:K7Tna6S]md:)CmJu\C!!*#d!!*#d!!*#d"9@iimJuhGrW)ob!!)uc!!)uc +!!)BR!!*#d!!*#d!!)KU#QX8mmJm7TmJutK!!)uc!!)uc!!)c]!!*#d!!*#d!!)TXrW(@6!!*#d +!!*#d!!)oa!!*#drr<&erW)ud!!*#d!!'Uu!!)uc!!)uc!!(10!!*#d!!*#d!!)NV!!)uc!!)uc +!!&k`p&K[3JaS*Wrr@Q~> +Ja2LbrrB+b"p!rR!:&hLn`g;YlKSB7l2^8;!!*#`!!*#`!!*#`"9@]el2^D?rW)o^!!)u_!!)u_ +!!)BN!!*#`!!*#`!!)KQ#QX,il2UhLl2^PC!!)u_!!)u_!!)cY!!*#`!!*#`!!)TTrW(@2!!*#` +!!*#`!!)o]!!*#`rr<&arW)u`!!*#`!!'Uq!!)u_!!)u_!!(1,!!*#`!!*#`!!)NR!!)u_!!)u_ +!!&k\p&K[/Ja.gOrr@Q~> +J`c4ZrrB+^#63iJs5rJDn`C&Uk2u^+k5Xl3!<<&\!<<&\!<<&\"TRWak5Y#7rr;rZ!<<#[!<<#[ +!<;EJ!<<&\!<<&\!<;NM#lj&ek5YJDk5Y/;!<<#[!<<#[!<;fU!<<&\!<<&\!<;WPrr:C.!<<&\ +!<<&\!<;rY!<<&\s8N)]rr<#\!<<&\!<9Xm!<<#[!<<#[!<:4(!<<&\!<<&\!<;QN!<<#[!<<#[ +!<8nXpA]^+J`_OGrr@Q~> +JaVdjrrB.g!!*#d!!*#d!!)WY!!*#d!!*#d!!)NV!!)uc!!)uc!!*#drW)NW"9@iimK!4R!!*#d +!!*#d!!)BR!!)uc!!)uc!!)QW#QX;\!!)EemJunI!!*#d!!*#d!!)]["p")Z!:K7To'QV\mJuYT +e*[29rU'XcrU'XcqsFRemd:)Cr;clc!s%cW!4_Fs!<2Bd!<2Bd!9*>G!<)?c!<2Ed!<2Ed!<2Bd +!<)<i!:K7Tmd:)CmJm7dmJm7dmJm6[mf!3;mXaeWmeuSR!.Y~> +Ja2LbrrB.c!!*#`!!*#`!!)WU!!*#`!!*#`!!)NR!!)u_!!)u_!!*#`rW)NS"9@]el2^eJ!!*#` +!!*#`!!)BN!!)u_!!)u_!!)QS#QX/T!!)9al2^JA!!*#`!!*#`!!)]W"p!rR!:&hLo'->Xl2^)L +e*6o5rTX@_rTX@_qs":alKSB7r;cl_!s%WO!4_:o!<26`!<26`!9*2C!<)3_!<29`!<29`!<26` +!<)0e!:&hLlKSB;l2Uh`l2Uh`l2UgWlM^d7l@J5OlM^#J!.Y~> +J`c4ZrrB._!<<&\!<<&\!<;ZQ!<<&\!<<&\!<;QN!<<#[!<<#[!<<&\rr;QO"TRWak5YDB!<<&\ +!<<&\!<;EJ!<<#[!<<#[!<;TO#lj&Ls8V6]k5Y)9!<<&\!<<&\!<;`S#63iJs5rJDo&^)Tk5XTD +e)gZ1rT4+[rT4+[qrS%]k2u^+rVuo["97NGs1%1ks8M-\s8M-\s5E)?s8D*[s8M0\s8M0\s8M-\ +s8D'as5rJDk2u^3joGG\joGG\joGFSk5PC3k(2ZGk5FHB!.Y~> +JaVdjrrB1h!!)uc!!)uc!!)][!!)uc!!)uc!!)3Mp&OjT"p")Z!:K7TrU'jimd:)CmJtZ&!!*#d +!<DQe!:oO^!:K7Tmd:)HmK<OX!:BjXmKN[ZmJu\C!5e0t!!2Kf[dF>"md:)C!!*#d!!)uc!!)][ +!!)ucrrE)erW!>o!!)Ee!:BjT!:BjdmJm7dmJm7amKEUY!:BgerU0[crU'XcrU'XcrU'jimd:)C +mJrpJ"9@iimJqh+JaS*WrpKddJ,~> +Ja2LbrrB1d!!)u_!!)u_!!)]W!!)u_!!)u_!!)3Ip&OjP"p!rR!:&hLrTXRelKSB7l2]5s!!*#` +!<DEa!:oCZ!:&hLlKSB@l3%+P!9sRTl377Rl2^,7!5e$p!!2?b[d"%slKSB7!!*#`!!)u_!!)]W +!!)u_rrE)arW!>k!!)9a!9sRL!9sR`l2Uh`l2Uh]l3.1Q!9sOarTaC_rTX@_rTX@_rTXRelKSB7 +l2[LB"9@]el2ZD#Ja.gOrp'L`J,~> +J`c4ZrrB1`!<<#[!<<#[!<;`S!<<#[!<<#[!<;6EpAamL#63iJs5rJDrT4=ak2u^+k5Wik!<<&\ +!WV<]s75:Vs5rJDk2u^8jok_Hs5s@Pjp(kJk5XT+s2*plrrM9^[cReok2u^+s8W)\!<<#[!<;`S +!<<#[s8W,]rr3Ags8V6]s5s@Ds5s@\joGG\joGGYjoteIs5s@]rT=.[rT4+[rT4+[rT4=ak2u^+ +k5V+:"TRWak5U"pJ`_OGroX4\J,~> +JaVdjrr@W<p$Me[rU'^emdC&So^2\ZrpBadrpBadrU'dgmJuYTdI%&9mdBcKp$Mq_mJuYTna?AV +o'QJXrpBadrpBad_X@:$s6fjdbO,?1rU'XcrU'Xcp$Mt`mJuYT!<2Bd!<2Bd!;#UY!<2Bg!:BjT +rW)udrr<Ps!!)Eemd:&TmJm7TmK!(NrVuue!<2Bg!:K7TrpC*nmd:&Tmd:&TmdC&S"7?0W!2Alc +!:K7Tmd:(+mXaeWmf2_T!.Y~> +Ja2Lbrr@W8p$)MWrTXFalK\?Ko]cDVrosI`rosI`rTXLcl2^)LdHUc5lK\'Cp$)Y[l2^)Ln`p)R +o'-2TrosI`rosI`_Wq!us6BR`bN]'-rTX@_rTX@_p$)\\l2^)L!<26`!<26`!;#IU!<26c!9sRL +rW)u`rr<Po!!)9alKS?Ll2UhLl2^YFrVuua!<26c!:&hLrosgjlKS?LlKS?LlK\?K"6omO!2A`_ +!:&hLlKSA#l@J5OlMp/L!.Y~> +J`c4Zrr@W4p#Z8SrT41]k2u[Co]?/RroO4\roO4\rT47_k5XTDdH1N1k2uC;p#ZDWk5XTDn`KiN +o&]rProO4\roO4\_WLaqs5s=\bN8g)rT4+[rT4+[p#ZGXk5XTDs8M-\s8M-\s7>@Qs8M-_s5s@D +rr<#\s8NSks8V6]k2u^Dk5YJDk5Y8>rr3#]s8M-_s5rJDroORfk2u^Dk2u^Dk2u[C"6TXGs.\W[ +s5rJDk2u\pk(2ZGk5XTD!.Y~> +JaVdjrrB(e!!)uc#6=/lmd:)C!<)<c!8[&C!<2Bj!:BjT!:Bj\mJm7cmJm7cmJm7cmf!4/mem+d +mK!4R!!)c]rW)TYp&P!X!!*#drrE&drr<8k!:BjTmK!4R!!)3M!!)uc!!)uc!!)ZZmJukH!!)uc% +fl%c!:BjTmJuYTmd:)C!<)?c!<2Ed!<2Ec!<;Ke!<2Bd!;#XX!<;Hk!:K7Tmd:)FmMc/omJu\C! +:K7Tmd:&TmJuYTmJuYTmJuYTmK!1Qo`4sY#6=2[!:K7T!<2Bd!<2Ec!!2KfXR6&grU'XcrU'Xcr +pBadrpBadJaS*WJaNU-!!%N~> +Ja2LbrrB(a!!)u_#6=#hlKSB7!<)0_!8Zo?!<26f!9sRL!9sRXl2Uh_l2Uh_l2Uh_lM^e+lMU\` +l2^eJ!!)cYrW)TUp&P!T!!*#`rrE&`rr<8g!9sRLl2^eJ!!)3I!!)u_!!)u_!!)ZVmJukD!!)u_% +fkn[!9sRLl2^)LlKSB7!<)3_!<29`!<29_!<;?a!<26`!;#LT!<;<g!:&hLlKSB>l5K`gl2^,7! +:&hLlKS?Ll2^)Ll2^)Ll2^)Ll2^bIo`4sU#6=&S!:&hL!<26`!<29_!!2?bXQfccrTX@_rTX@_r +osI`rosI`Ja.gOJa*=%!!%N~> +J`c4ZrrB(]!<<#[#QNrdk2u^+s8D'[s4uf;s8M-bs5s@Ds5s@TjoGG[joGG[joGG[k5PD'k5G;\ +k5YDB!<;fUrr;WQpAb$P!<<&\s8W)\s8N;cs5s@Dk5YDB!<;6E!<<#[!<<#[!<;]Rmf2n@!<<#[ +&-(eSs5s@Dk5XTDk2u^+s8D*[s8M0\s8M0[s8V6]s8M-\s7>CPs8V3cs5rJDk2u^6jr=?_k5XT+ +s5rJDk2u^Dk5XTDk5XTDk5XTDk5YAAp&G!Q#QNrKs5rJDs8M-\s8M0[rrM9^XQBN_rT4+[rT4+[ +roO4\roO4\J`_OGJ`[$r!!%N~> +JaVdjrrB%d!!*#d#6=2[!!)HT!<2Bd!8HoN!:K7T!:Bgemd:)CmK!4R!!)uc!!)i_p&ND+rW!#f +!!*#d!!)l`p&P$Y!!)uc!W_ZVrW)ud&HM5!mJm7T!:Bgemd:&Tmd:)Smf*:emKWa[!:BjTmK!.P +!!)uc!!)uc!!)rb$NTV_!:BjT!:K7T!:T@T!!DWhmdC#Rmd:&TrpBadrpBadrpC!kmd:&Tmd:)S +mK3IWmK!7S!!*#d#lsD]!!)Eemd:)Kme-V_mJuYTn*UD\mJuYTmJu\R!!)Hd!<2Ec!!)Hd!;Gp\ +!!DWhmK!.P#lsAnmJu\C!:K:K!3PYh!<2Bd!<2Bd!<)<c!<)<c!.jQhmXag+!.Y~> +Ja2LbrrB%`!!*#`#6=&S!!)<L!<26`!8HcJ!:&hL!9sOalKSB7l2^eJ!!)u_!!)i[p&ND'rW!#b +!!*#`!!)l\p&P$U!!)u_!W_NNrW)u`&HM(rl2UhL!9sOalKS?LlKSBKlMgkal3@=S!9sRLl2^_H +!!)u_!!)u_!!)r^$NTJW!9sRL!:&hL!:T4P!!DKdlK\<JmcjcProsI`rosI`ros^glKS?LlKSBK +l2q%Ol2^hK!!*#`#ls8U!!)9alKSBClLk2[l2^)Ln*1,Xl2^)Ll2^,J!!)<`!<29_!!)<`!;GdX +!!DKdl2^_H#ls5jl2^,7!:&kC!3PMd!<26`!<26`!<)0_!<)0_!.jEdl@J7#!.Y~> +J`c4ZrrB%\!<<&\#QNrKs8V6Ds8M-\s4cZFs5rJDs5s@]k2u^+k5YDB!<<#[!<;lWpA`G#rr3&^ +s8W)\!<;oXpAb'Q!<<#[!rqEFrr<#\&c_"nk5YJDs5s@]k2u^Dk2u^Ck5YJ]jp1qKs5s@Dk5Y>@ +!<<#[!<<#[!<;uZ$ifAOs5s@Ds5rJDs6o+Lrr_E`k2uXBmcFNLroO4\roO4\roOIck2u^Dk2u^C +jobYGk5YGC!<<&\$30/Ms8V6]k2u^;k4\fWk5XTDn)alTk5XTDk5XTBrrD3\s8M0[rrD3\s7b[T +rr_E`k5Y>@$30/fk5XT+s5rJ;s/kD`s8M-\s8M-\s8D'[s8D'[s+0<`k(2[p!.Y~> +JaVdjrrCL8!!)uc!!)uc!!)$H%05ha!:K7T!:K7Tmd:)4mJm7cmf*7jmJuYTmK!7S!s%cW!<2Bd +!<2Bd!;,^Y!6ad:!:K7Tmd:)CmJuqJrW)]\!!*#d(]`t(mJuYTmd:&Tmd:&Tmd:&Tmd:)CmK!1Q +rr<;l!:Bgemd:)NmJm7dmJm7dmJm7`mKim]mJm7T!:Bgen*^/T"RZ6imdC&S!U]sUmM,`imJu\C +!:BjTmJu\C!!)HT!:K7TrU(0rmd:&TmJm7TmJm7T!:BjWmf!4bmf!4Rmf!4cmcjfMmK3IW!:Kgd +q<n4^rU'ghmJuYTmf!3bmK`g\mJu\C!:BjcmJm6<mXaeWmeuSR!.Y~> +Ja2LbrrCL4!!)u_!!)u_!!)$D%05\Y!:&hL!:&hLlKSB,l2Uh_lMghfl2^)Ll2^hK!s%WO!<26` +!<26`!;,RU!6aX6!:&hLlKSB7l2^MBrW)]X!!*#`(]`h$l2^)LlKS?LlKS?LlKS?LlKSB7l2^bI +rr<;h!9sOalKSBFl2Uh`l2Uh`l2Uh\l3RIUl2UhL!9sOan*9lP"R5selK\?K!U9[Ql4j<al2^,7 +!9sRLl2^,7!!)<L!:&hLrTXmnlKS?Ll2UhLl2UhL!9sRSlM^e^lM^eNlM^e_lKSBIl2q%O!:'O` +q<IqZrTXOdl2^)LlM^d^l3ICTl2^,7!9sR_l2Ug8l@J5OlM^#J!.Y~> +J`c4ZrrCL0!<<#[!<<#[!<;'@%KGSQs5rJDs5rJDk2u^$joGG[k5YGbk5XTDk5YGC"97NGs8M-\ +s8M-\s7GIQs3'O2s5rJDk2u^+k5Y,:rr;`T!<<&\)#rauk5XTDk2u^Dk2u^Dk2u^Dk2u^+k5YAA +s8N>ds5s@]k2u^>joGG\joGG\joGGXjpD(Mk5YJDs5s@]n)jWL"Qoaak2u[C!TsFMjq[pYk5XT+ +s5s@Dk5XT+s8V6Ds5rJDrT4Xjk2u^Dk5YJDk5YJDs5s@Ok5PDZk5PDJk5PD[k3E!EjobYGs5s=\ +q<%\VrT4:`k5XTDk5PCZjp;"Lk5XT+s5s@[joGF4k(2ZGk5FHB!.Y~> +JaVdjrrCI7!!*#d!!*#d!!(sF$NTSpmJu\C!:BjT!8[&C!<2Be!:Kgds6]jerU'slmd:)CmJu\C +!;,[^!:BjT!;Ps^!<)<c!<)<c!;Psj!:BjTmJuYTmd:)C!;c*i!:K7TmJuYT!:Kgdp$Mq_mJuYT +p[/armd:&TmJm7TmJu\C!:K7T!:Bgemf!1hmJu\C!<)?`!<;Ke!<)<c!<)<i!:K7Tmd:)MmK<OX +mJu\S!:T@U!"A8qmd:)C!:K7Tmd:)CmK<OX!:BjdmL'$_!:BjTmJuYTmK!.P$39JomJuYTmJu\C +rW)KV!s%`hme-YRmd'oRmf!1dmf!4^mcjcPmf!1dmf!1emJs3R!<DQe!<;He!<2Bd!.jQhmXag( +mf*9;~> +Ja2LbrrCI3!!*#`!!*#`!!(sB$NTGll2^,7!9sRL!8Zo?!<26a!:'O`s69RarTX[hlKSB7l2^,7 +!;,OZ!9sRL!;PgZ!<)0_!<)0_!;Pgf!9sRLl2^)LlKSB7!;bse!:&hLl2^)L!:'O`p$)Y[l2^)L +pZ`InlKS?Ll2UhLl2^,7!:&hL!9sOalM^bdl2^,7!<)3\!<;?a!<)0_!<)0e!:&hLlKSBEl3%+P +l2^,K!:T4Q!"A,mlKSB7!:&hLlKSB;l3%+P!9sR`l3dUW!9sRLl2^)Ll2^_H$39>kl2^)Ll2^,7 +rW)KR!s%TdlLk5NlKeKNlM^b`lM^eZlKS?LlM^b`lM^bal2[dJ!<DEa!<;<a!<26`!.jEdl@J6u +lMgj7~> +J`c4ZrrCI/!<<&\!<<&\!<;!>$ifAhk5XT+s5s@Ds4uf;s8M-]s5s=\s5j=]rT4Fdk2u^+k5XT+ +s7GFVs5s@Ds7k^Vs8D'[s8D'[s7k^bs5s@Dk5XTDk2u^+s8(jas5rJDk5XTDs5s=\p#ZDWk5XTD +pZ<4jk2u^Dk5YJDk5XT+s5rJDs5s@]k5PA`k5XT+s8D*Xs8V6]s8D'[s8D'as5rJDk2u^=jok_H +k5XTCs6o+Mrs\&ik2u^+s5rJDk2u^3jok_Hs5s@\jpV4Os5s@Dk5XTDk5Y>@$NK8gk5XTDk5XT+ +rr;NN"97N`k4\iJk3W*Jk5PA\k5PDVk3DsHk5PA\k5PA]k5VCB!WV<]s8V3]s8M-\s+0<`k(2[m +k5PF3~> +JaVdjrrCF6"p")Z!:K7ThX:@CrU0Xbg[=\6s6fjd!:Kab!q$$gqsFFarpKdd"RZ9XmK!7S!!)uc +rrE&d!!*#d!!)`\$39JomJuYTmJuYTq!S.^s6]shmJu\R!;>gb!:K7Tmd:)LmKN[Z!:BjT!<2Be +!:Kdc"RZ9X!:KdcrpBadrpBdemem+fmJuYTrpBadqsFRemJuYTp?hq]mem.SmJm7dmJm7dmJm7d +mJm7dmJm7Tmf!4amf!4bmf!4^mf!1dmdpMYmJm7cmf*7mmJuYT!:Bgemem.bmJm7Wmf!4dmeQnm +mJuYTmJuYTmJuYTmK!.P"T[rjmJu\S!<2Bd!<)?b!!)HX!3,Db!<;Hh!:K7TJaS*WJaWF'rr@Q~> +Ja2LbrrCF2"p!rR!:&hLhWk(?rTa@^gZnD2s6BR`!:'I^!pTacqs".]rp'L`"R6!Pl2^hK!!)u_ +rrE&`!!*#`!!)`X$39>kl2^)Ll2^)Lq!.kZs69[dl2^,J!;>[^!:&hLlKSBDl377R!9sRL!<26a +!:'L_"R6!P!:'L_rosI`rosLalMU\bl2^)LrosI`qs":al2^)Lp?DYYlMU_Ol2Uh`l2Uh`l2Uh` +l2Uh`l2UhPlM^e]lM^e^lM^eZlM^b`lLY)Ul2Uh_lMghil2^)L!9sOalMU_^l2UhSlM^e`lM:Ji +l2^)Ll2^)Ll2^)Ll2^_H"T[ffl2^,K!<26`!<)3^!!)<T!3,8^!<;<d!:&hLJa.gOJa3-trr@Q~> +J`c4ZrrCF.#63iJs5rJDhWFh;rT=+ZgZJ/.s5s=\!9X4Z!p9O_qrRnYroX7\"QoaHk5YGC!<<#[ +s8W)\!<<&\!<;cT$NK8gk5XTDk5XTDpu_VVs5jF`k5XTBs7YRZs5rJDk2u^<jp(kJs5s@Ds8M-] +s5s:["QoaHs5s:[roO4\roO7]k5G;^k5XTDroO4\qrS%]k5XTDp>uDUk5G>KjoGG\joGG\joGG\ +joGG\joGGLk5PDYk5PDZk5PDVk5PA\k4J]QjoGG[k5YGek5XTDs5s@]k5G>ZjoGGOk5PD\k5,)e +k5XTDk5XTDk5XTDk5Y>@"om`bk5XTCs8M-\s8D*ZrrD3Ps/G/Zs8V3`s5rJDJ`_OGJ`cjlrr@Q~> +JaVdjrrD!F!!)uc!!)ucrrE#crr<2i!:BgerU'Xcq!JRkmd:)C!:K7TmJu\C!<2ET!<;He!<)<c +!<)<c!<)<c!<)<c!<)<c!;c*c!:BjTrW)ud!<DQe!!)Hd!!)Ha!<;He!;u6l!:BjT!:BjT!:Bjd +mJm7dmK`g\!:Bgemd:)ImK`g\!!)Ee!:Bj\mK*CVme-YWmJm7dmJm7dmJm7]mf!4dmJm7cmeZta +mca`OmJm7_mf!4[me-YQmJm7cmK`g\mJuYTmd:)RmJm7Yma_C6mJm7dmK`g\!:BjT!:K:S!!Vcj +mJuYTna6DXmf!1fmJu\N!"82pmd:&TmJm7TmK!4R!!*#drW!,i!:BjT!<)<g!:BjT!<)?b!!)Hd +!<2Bd!<)<c!4)%d!!2KfJaS*WJaWC&rr@Q~> +Ja2LbrrD!B!!)u_!!)u_rrE#_rr<2e!9sOarTX@_q!&:glKSB7!:&hLl2^,7!<29P!<;<a!<)0_ +!<)0_!<)0_!<)0_!<)0_!;bs_!9sRLrW)u`!<DEa!!)<`!!)<]!<;<a!;u*h!9sRL!9sRL!9sR` +l2Uh`l3ICT!9sOalKSBAl3ICT!!)9a!9sRXl2gtNlLk5Sl2Uh`l2Uh`l2UhYlM^e`l2Uh_lMCP] +lKJ<Kl2Uh[lM^eWlLk5Ml2Uh_l3ICTl2^)LlKSBJl2UhUlIGt2l2Uh`l3ICT!9sRL!:&kK!!VWf +l2^)Ln`g,TlM^bbl2^,F!"8&llKS?Ll2UhLl2^eJ!!*#`rW!,e!9sRL!<)0c!9sRL!<)3^!!)<` +!<26`!<)0_!4(n`!!2?bJa.gOJa3*srr@Q~> +J`c4ZrrD!>!<<#[!<<#[s8W&[s8N5as5s@]rT4+[puW%ck2u^+s5rJDk5XT+s8M0Ls8V3]s8D'[ +s8D'[s8D'[s8D'[s8D'[s8(j[s5s@Drr<#\!WV<]rrD3\rrD3Ys8V3]s8;!ds5s@Ds5s@Ds5s@\ +joGG\jp;"Ls5s@]k2u^9jp;"Ls8V6]s5s@TjoYSFk4\iOjoGG\joGG\joGGUk5PD\joGG[k55/Y +k3;pGjoGGWk5PDSk4\iIjoGG[jp;"Lk5XTDk2u^BjoGGQk19S.joGG\jp;"Ls5s@Ds5rJCrrqQb +k5XTDn`BlPk5PA^k5XT>rsRuhk2u^Dk5YJDk5YDB!<<&\rr3/as5s@Ds8D'_s5s@Ds8D*ZrrD3\ +s8M-\s8D'[s0Ce\rrM9^J`_OGJ`cgkrr@Q~> +JaVdjrrCsE!!*#d!!*#d!s%cW!<2Be!:Kgd!U]semJm7\mK*CVmf!1imJm7T!!*#d!!)ucrW)ob +rW)f_!!*#d!!*#d!!)oa!!*#d!!*#d!!)f^rVurdrW!/j!:K7T!:KL[qX+Ofmd:)C!!*#d!!*#d +$39M^!:K7TmJuYTo'Q\^mJuYTmJunI"T[rjmJu\S!;Gm]!<)<c!<)<c!;u9H!!_ikmJuYTme$SX +me-YYme-V]mK!7SrrE&drrE&d!!)ZZ!!)uc!!)uc!!)][rW)larW)obrW)rc!!*#dq#LH_"9@ii +mK!(N$NTV_!!)Eemd:)Cmf!1hmJu\C!:fI[!:K7Tmf!1fmJu\S!"82pmJuYTmJuYTmK!7S!!)i_ +"p")Z!:K7TrU(-qmd:)CmJu\C!:BjT!:Kgds6fmes6]jeXmZ/gs6fjdJaS*WJaW@%rr@Q~> +Ja2LbrrCsA!!*#`!!*#`!s%WO!<26a!:'O`!U9[al2UhXl2gtNlM^bel2UhL!!*#`!!)u_rW)o^ +rW)f[!!*#`!!*#`!!)o]!!*#`!!*#`!!)fZrVur`rW!/f!:&hL!:'4WqW\7blKSB7!!*#`!!*#` +$39AV!:&hLl2^)Lo'-DZl2^)Ll2^JA"T[ffl2^,K!;GaY!<)0_!<)0_!;u-D!!_]gl2^)LlLb/T +lLk5UlLk2Yl2^hKrrE&`rrE&`!!)ZV!!)u_!!)u_!!)]WrW)l]rW)o^rW)r_!!*#`q#LH["9@]e +l2^YF$NTJW!!)9alKSB7lM^bdl2^,7!:f=W!:&hLlM^bbl2^,K!"8&ll2^)Ll2^)Ll2^hK!!)i[ +"p!rR!:&hLrTXjmlKSB7l2^,7!9sRL!:'O`s6BUas69RaXm5lcs6BR`Ja.gOJa3'rrr@Q~> +J`c4ZrrCs=!<<&\!<<&\"97NGs8M-]s5s=\!TsF]joGGTjoYSFk5PAak5YJDs8W)\!<<#[rr;rZ +rr;iW!<<&\!<<&\!<;rY!<<&\!<<&\!<;iVrr2u\rr32bs5rJDs5s"SqW8"^k2u^+s8W)\!<<&\ +$NK8Ns5rJDk5XTDo&^/Vk5XTDk5Y)9"om`bk5XTCs7bXUs8D'[s8D'[s8;$@rs%Wck5XTDk4ScP +k4\iQk4\fUk5YGCs8W)\s8W)\!<;]R!<<#[!<<#[!<;`Srr;oYrr;rZrr;u[!<<&\q>^KW"TRWa +k5Y8>$ifAOs8V6]k2u^+k5PA`k5XT+s7,4Ss5rJDk5PA^k5XTCrsRuhk5XTDk5XTDk5YGC!<;lW +#63iJs5rJDrT4Uik2u^+k5XT+s5s@Ds5s=\s5s@]s5j=]XlfW_s5s=\J`_OGJ`cdjrr@Q~> +JaVdjrrE#c!!)uc!!)6N"p")Z!:K7TrU0:Xo^3"cmd:)C!!)HT!<2Bd!<)<n!:BjT!:K7TmJuYT +qX+Ofmd:)CmK!(N"p")Z!:K7TqsO(V!q$'VpAk6]!!)f^"9@iimK!%M"T[rjmJu\S!:]FS!:oRW +!!VcjmJuYTjR3!Is6]shmJu\O!!)Hc!!)Hd!!)Hd!<2Be!:Kdc!:Kgdp[8"\o^;YX!U]semJm7d +mJm7dmJm7dmJm7XmJm7dmJm7dmJm7[mK<OX!:BjdmL'$_!:BjTmJuYTmK!7S"9@lX!:Kgd!:Kdc +s6]shmd:)NmLoTg!:BjT!:BjT!!)EemJuYTmJukH!!*#d!<DQb!!)Hb!<2Ec!<;Ke!<2Bd!;l0l +!:BjT!:BjT!:K7TrpBadrpKdds6fme$LRlomJm7T!:K7TXmQ2ime-X3mXaeWmeuSR!.Y~> +Ja2LbrrE#_!!)u_!!)6J"p!rR!:&hLrTa"To]c__lKSB7!!)<L!<26`!<)0j!9sRL!:&hLl2^)L +qW\7blKSB7l2^YF"p!rR!:&hLqs*eR!pTdNpAk6Y!!)fZ"9@]el2^VE"T[ffl2^,K!:]:O!:oFS +!!VWfl2^)LjQc^Es69[dl2^,G!!)<_!!)<`!!)<`!<26a!:'L_!:'O`pZh_Xo]lAT!U9[al2Uh` +l2Uh`l2Uh`l2UhTl2Uh`l2Uh`l2UhWl3%+P!9sR`l3dUW!9sRLl2^)Ll2^hK"9@`P!:'O`!:'L_ +s69[dlKSBFl4X0_!9sRL!9sRL!!)9al2^)Ll2^G@!!*#`!<DE^!!)<^!<29_!<;?a!<26`!;l$h +!9sRL!9sRL!:&hLrosI`rp'L`s6BUa$L.Tkl2UhL!:&hLXm,oelLk4/l@J5OlM^#J!.Y~> +J`c4Z!<E/ujoGG[joGGFjp(kJk5XT+s8D*Ps7GF[s5rJDk5YJDk5YGC!<<#[$ifAhk5XT+s5s@D +s8(j^s5rJDk2u^>jp(kJk5XT+s81sNrrV?_k4eoUjoGGVjok_Hs5s@VjoteIs5s@Drr;KMr;Z?M +rr3/as5s@Ds5`>As8V3`s5s@DqYpQXrVll[rr2u\rr;u[!WV<\rrD3\s7b[Ts7GIPrrM9^roO4\ +roO4\roO4\roO4\o&]rProO4\roO4\p#ZDWk5XTDroOUgk5XTDk2u^+s5s@\jok_Hk5XTCrrD3[ +s8V3`s5rJDq;r@jk5XTDk5XTDk5YJDs5s@Ds5s@QjoGG\joPMEqu6ZYr;ZcYrr<#\s8W)\!<;rY +$ifAhk5XTDk5XT+s8M-\s8M0\s8V6]rsIogs5s@]k5XT+s/kDas5s%TJ`_OGJ`cpnrr@Q~> +JaVdjrW)rc!!*#d!!)0L"9@iimK!.P!s%`hmf!1gmJuYTo'QMYmem+hmJm7TmK!4R%05ha!:K7T +!:K7Tmd:)OmK<OX!:Bj]mK<OX!:Bj\mf!1gmJu\CrW)rcp](?_!;>j[!;>jR!;Q!S!<;He!<)?Z +!<;He!<)<c!<)<c!<)<c!;5ac!:BjT!:K7Tme?b^md^>Xme$SXmK<OX!:Bj\mf!1hmJu\C!<2Bn +!:K7T!:Bgemd:)EmKN[ZmJu\C!;5ah!:K7Tmd:)C!:K7TmdC&S"RZ9XmK!7SrW!&g!!)Hb!!;Qg +!<2Bd!;Z'^!<2Eb!<2Ec!<2Bd!<)<c!<)<i!:K7TmJu\;!<2Bd!<2Ed!<;Kd!<2Ed!<)<c!<2Ed +!<;He!<2Bf!:K:S!!2KfXmQ>mmd:)Cmem-:mXaeWmeQ;N!.Y~> +Ja2LbrW)r_!!*#`!!)0H"9@]el2^_H!s%TdlM^bcl2^)Lo'-5UlMU\dl2UhLl2^eJ%05\Y!:&hL +!:&hLlKSBGl3%+P!9sRYl3%+P!9sRXlM^bcl2^,7rW)r_p](?[!;>^W!;>^N!;PjO!<;<a!<)3V +!<;<a!<)0_!<)0_!<)0_!;5U_!9sRL!:&hLlM(>ZlLFoTlLb/Tl3%+P!9sRXlM^bdl2^,7!<26j +!:&hL!9sOalKSB=l377Rl2^,7!;5Ud!:&hLlKSB7!:&hLlK\?K"R6!Pl2^hKrW!&c!!)<^!!;Ec +!<26`!;YpZ!<29^!<29_!<26`!<)0_!<)0e!:&hLl2^,3!<26`!<29`!<;?`!<29`!<)0_!<29` +!<;<a!<26b!:&kK!!2?bXm-&ilKSB7lMU^6l@J5OlM9`F!.Y~> +J`c4Zrr<'!roO4\roO4\k2lgHk5XTDqrS"\k5XTCrr_E`k5Y#7!WV<\rrqQbs5rJDrT4Rhk2u^+ +k5YJDk5XT+s8(j\s5s@Ds7bXYs5s@Ds7YUSrr_E`k2u[CroX"U!TsFUk5PDSk4ScLk4J]RjoGG[ +k4\iTjoGG[joGG[joGG[joGGSjp;"Ls5s@Dk5XT=rrD3PrrD3Ss8;!^s5s@Ds7YUSrrhKak2u^C +jpM.Nk5YJDs8V6Ds7#.Ts5rJDk2u^:jph@Qk5XT+s5s@Dk5XT+rr3,`s5rJDroX4["6TX`k5>5\ +k5YJ\joGGWk5PD[k5G>Zk5PD[joGG[joGG[jp(kJk5XTDk2u^CjoGG\k5YJ]k5PD[k5YJ[joGG\ +k5YJ]joGG\joYSFk5PA]k5VRG"om`Is5rJBs+0<`k(2[jk5PF3~> +JaVdjrr<;l!:K7TmJm7dmJm7Nmf!4^mf!1fmJu\S!:]FR!!DWhmK!4R!!*#d#6=2[!!)HT!<2Bd +!;c-_!;5dZ!<)<c!<)<h!:BjT!:K.QqsO.XrpKFZ!U]sYmed(]mJm7dmJm7dmf!4cmJm7dmJm7c +mJm7dmJm7dmJm7[mK`g\mJu\C!:K:S!!;Qgmf!1hmJm7Tmem+cmf!1lmJu\C!!)Eemem.]mKN[Z +mJu\C!;Q!^!!holmJm7TmK!7S#QX8mmJuYTmJu\C"9@iimJuqJ!!*#d!!*#d!!*#d%05ha!!)Ee +!:K7T!:K:Q!"SDsmJm7T!!)EemJu\C!<2EN!;u6f!:K7T!<2Bj!:K7TmJu\S!<2EZ!<2Ed!<2Bd +!<2E[!;Z$_!<2Ed!<2Ed!<;Kd!3PYh!<2Bf!:K:S!!2KfJaS*WJaWC&rr@Q~> +Ja2Lbrr<;h!:&hLl2Uh`l2UhJlM^eZlM^bbl2^,K!:]:N!!DKdl2^eJ!!*#`#6=&S!!)<L!<26` +!;c![!;5XV!<)0_!<)0d!9sRL!:&kMqs*kTrp'.V!U9[UlMLYYl2Uh`l2Uh`lM^e_l2Uh`l2Uh_ +l2Uh`l2Uh`l2UhWl3ICTl2^,7!:&kK!!;EclM^bdl2UhLlMU\_lM^bhl2^,7!!)9alMU_Yl377R +l2^,7!;PjZ!!hchl2UhLl2^hK#QX,il2^)Ll2^8;"9@]el2^MB!!*#`!!*#`!!*#`%05\Y!!)9a +!:&hL!:&kI!"S8ol2UhL!!)9al2^,7!<29J!;u*b!:&hL!<26f!:&hLl2^,K!<29V!<29`!<26` +!<29W!;Ym[!<29`!<29`!<;?`!3PMd!<26b!:&kK!!2?bJa.gOJa3*srr@Q~> +J`c4Zrr<;ds5rJDk5YJ\joGGFk5PDVk5PA^k5XTCs7#1Jrr_E`k5YDB!<<&\#QNrKs8V6Ds8M-\ +s8(mWs7PORs8D'[s8D'`s5s@Ds5rYIqr[VProWnR!TsFQk5>8UjoGG\joGG\k5PD[joGG\joGG[ +joGG\joGG\joGGSjp;"Lk5XT+s5rJCrrV?_k5PA`k5YJDk5G;[k5PAdk5XT+s8V6]k5G>Ujp(kJ +k5XT+s7kaVrs.]dk5YJDk5YGC#lj&ek5XTDk5Xl3"TRWak5Y,:!<<&\!<<&\!<<&\%KGSQs8V6] +s5rJDs5rJArsn2kk5YJDs8V6]k5XT+s8M0Fs8;!^s5rJDs8M-bs5rJDk5XTCs8M0Rs8M0\s8M-\ +s8M0Ss7tdWs8M0\s8M0\s8V6\s/kD`s8M-^s5rJCrrM9^J`_OGJ`cgkrr@Q~> +JaVdjrrE)e"9@iimK!7S!!)?QjT,8I!!)uco)SdXrrE)er;Zicr;Zicr;clco`5!Zo`5!Z$39Jo +md:)CmJu\CrW)rco)S^V!W_ZVrW)ud!!)i_rW!,i!:BjT!:oO^!:BjT!:Bj`mf*7pmJu\C!:BjT +!!)EerU'XcrU'jimd:)CmJuqJ!!*#d!!*#d!<DQb!!)HW!<;Hj!:BjT!:Kgd!U]sbmJm7dmJm7d +mJm7`mf*:emKWa[!:BjTmK!7SrVurdrW)<QrW)]\%KPnsmd:)C!:K7TmJu\CrW)udrW)udo)Js^ +!:BjT!;>j[!<2Ec!<)?b!;Gmd!:K7Tmd:&TrpC'mmJuYTmJuYTmf!1fmJu\S!"J>rmd:)CmJu\C +!:K7TrU0Xbm-aQIZL.\mrU'pkmJu\C!:K7TJaS*WJaWF'rr@Q~> +Ja2LbrrE)a"9@]el2^hK!!)?MjT,8E!!)u_o)SdTrrE)ar;Zi_r;Zi_r;cl_o`5!Vo`5!V$39>k +lKSB7l2^,7rW)r_o)S^R!W_NNrW)u`!!)i[rW!,e!9sRL!:oCZ!9sRL!9sR\lMghll2^,7!9sRL +!!)9arTX@_rTXRelKSB7l2^MB!!*#`!!*#`!<DE^!!)<S!<;<f!9sRL!:'O`!U9[^l2Uh`l2Uh` +l2Uh\lMgkal3@=S!9sRLl2^hKrVur`rW)<MrW)]X%KPbolKSB7!:&hLl2^,7rW)u`rW)u`o)JsZ +!9sRL!;>^W!<29_!<)3^!;Ga`!:&hLlKS?Lrosdil2^)Ll2^)LlM^bbl2^,K!"J2nlKSB7l2^,7 +!:&hLrTa@^m-=9EZK_DirTXXgl2^,7!:&hLJa.gOJa3-trr@Q~> +J`c4ZrrE)]"TRWak5YGC!<;BIjo>;A!<<#[oDegPs8W,]rVll[rVll[rVuo[p&G$Rp&G$R$NK8g +k2u^+k5XT+rr;u[oDeaN!rqEFrr<#\!<;lWrr3/as5s@Ds75:Vs5s@Ds5s@Xk5YGhk5XT+s5s@D +s8V6]rT4+[rT4=ak2u^+k5Y,:!<<&\!<<&\!WV<ZrrD3Os8V3bs5s@Ds5s=\!TsFZjoGG\joGG\ +joGGXk5YJ]jp1qKs5s@Dk5YGCrr2u\rr;?Irr;`T%fb\kk2u^+s5rJDk5XT+rr<#\rr<#\oD]!V +s5s@Ds7YUSs8M0[s8D*Zs7bX\s5rJDk2u^DroOOek5XTDk5XTDk5PA^k5XTCrse,jk2u^+k5XT+ +s5rJDrT=+Zm,n$AZK;/erT4Cck5XT+s5rJDJ`_OGJ`cjlrr@Q~> +JaVdjrrE&dr;clc!!)0LrW)c^rW!#f!:KgdrpBadrpBadq!R_R(@D1jmJm7TmJm7TmJu\C!!)HT +!!)HTr;cib!!*#d!!*#drW!8m!:K7Tmd:)C!<2Bd!<2Ed!!)Hd!!)H\!!2Kfq<n7_"RZ9X!!)i_ +$39JomJm7T!!)Eeo^2tbmJm7T!!)EeqX4=_#OVQlmJuYT!;5a_!:BjT!;5a[!<)<e!:K:E!!)Hd +!<;Hi!:K7T!<)?c!<;Ke!!2KfrU'XcrU'XcrU'Xcr9apmmJm7T!:BgemJu\F!<)<c!<)?c!!)H\ +!<)<f!:K7TrpBadrpBadqX+=`rpC$lmJuYTmJu\CrW)ud!<DQd!<;He!;>gm!:BjT!:BjT!:BjT +mJuYTmK!7S!!)uc!s%`hmf!1tmJu\C!:BjTmJu\C!:Bgemed%dmJu\S!<)<h!:BjT!!*#drW!&g +!:BjcmJm7Vmf!3bmJm7dmJm7dmJm7dmJm7cmJm7cmJm6<mXae`mf*9;~> +Ja2LbrrE&`r;cl_!!)0HrW)cZrW!#b!:'O`rosI`rosI`q!.GN(?tnbl2UhLl2UhLl2^,7!!)<L +!!)<Lr;ci^!!*#`!!*#`rW!8i!:&hLlKSB7!<26`!<29`!!)<`!!)<X!!2?bq<It["R6!P!!)i[ +$39>kl2UhL!!)9ao]c\^l2UhL!!)9aqWe%[#O29hl2^)L!;5U[!9sRL!;5UW!<)0a!:&k=!!)<` +!<;<e!:&hL!<)3_!<;?a!!2?brTX@_rTX@_rTX@_r9=Xil2UhL!9sOal2^,>!<)0_!<)3_!!)<X +!<)0b!:&hLrosI`rosI`qW\%\rosahl2^)Ll2^,7rW)u`!<DE`!<;<a!;>[i!9sRL!9sRL!9sRL +l2^)Ll2^hK!!)u_!s%TdlM^bpl2^,7!9sRLl2^,7!9sOalMLV`l2^,K!<)0d!9sRL!!*#`rW!&c +!9sR_l2UhRlM^d^l2Uh`l2Uh`l2Uh`l2Uh_l2Uh_l2Ug8l@J5XlMgj7~> +J`c4ZrrE&\rVuo[!<;3Drr;fVrr3&^s5s=\roO4\roO4\pu_2J(?YYZk5YJDk5YJDk5XT+s8V6D +s8V6DrVulZ!<<&\!<<&\rr3;es5rJDk2u^+s8M-\s8M0\rrD3\rrD3TrrM9^q<%_W"QoaHs8VoW +$NK8gk5YJDs8V6]o]?GZk5YJDs8V6]qW@eW#Nl'dk5XTDs7PLWs5s@Ds7PLSs8D']s5rJ5rrD3\ +s8V3as5rJDs8D*[s8V6]rrM9^rT4+[rT4+[rT4+[r8nCek5YJDs5s@]k5XT6s8D'[s8D*[rrD3T +s8D'^s5rJDroO4\roO4\qW7eXroOLdk5XTDk5XT+rr<#\!WV<\s8V3]s7YRes5s@Ds5s@Ds5s@D +k5XTDk5YGC!<<#["97N`k5PAlk5XT+s5s@Dk5XT+s5s@]k5>5\k5XTCs8D'`s5s@Ds8W)\rr3)_ +s5s@[joGGNk5PCZjoGG\joGG\joGG\joGG[joGG[joGF4k(2ZPk5PF3~> +JaVdjo`41C"9@iimK!.P!s%`hmf!1mmJuYTmd:)CmK!%M!<DQd!!)Hd!<2Bd!<2Bm!:K7Tmd:)C +mK!4Rrr</h!!)Hd!!qum!:K7Tmd:)SmL0*`!:BjT!:BjT!:BjcmJm7dmf*7gmJu\L!!)Hd!;Q!^ +!!M]imJm7`mK`g\mJm7T!:BjdmJm7\mKrs^!:BjT!:BjT!;c-_!!holmJm7TmK!4R"p"&kmd:)C +r;Zld!:'"F!!holmJuYTmK!7S!!)uc!!*#d!!*#d!!)ES"9@ii!:Kdc!:Kdc!:KX_rU'XcrpBad +rpBjgmd:)Smed(bmJm7dmJm7cmKN[ZmJu\C!;Psc!:K7TmdBlN!:KO\p[/Chmd:&TmJu\C!:K:S +!!M]imd:)SmJm7dmK*CVmem+emJu\S!"/,omJuYTmJuYTmed%bmed(_mf!1omJu\C!!)Eemd:&T +rpBadnEpDZmJuYTWpTierU'XcrU'XcrpBadrpBadrpBadJaS*WM=1BDJ,~> +Ja2Lbo`41?"9@]el2^_H!s%TdlM^bil2^)LlKSB7l2^VE!<DE`!!)<`!<26`!<26i!:&hLlKSB7 +l2^eJrr</d!!)<`!!qii!:&hLlKSBKl3m[X!9sRL!9sRL!9sR_l2Uh`lMghcl2^,D!!)<`!;PjZ +!!MQel2Uh\l3ICTl2UhL!9sR`l2UhXl3[OV!9sRL!9sRL!;c![!!hchl2UhLl2^eJ"p!oglKSB7 +r;Zl`!:&kB!!hchl2^)Ll2^hK!!)u_!!*#`!!*#`!!)EO"9@]e!:'L_!:'L_!:'@[rTX@_rosI` +rosRclKSBKlMLY^l2Uh`l2Uh_l377Rl2^,7!;Pg_!:&hLlK\0F!:'7XpZ`+dlKS?Ll2^,7!:&kK +!!MQelKSBKl2Uh`l2gtNlMU\al2^,K!".ukl2^)Ll2^)LlMLV^lMLY[lM^bkl2^,7!!)9alKS?L +rosI`nEL,Vl2^)LWp0QarTX@_rTX@_rosI`rosI`rosI`Ja.gOM<b*@J,~> +J`c4Z!!)`mkN2pIk5XTDqrS"\k5XTCrs@ifk5XT+s5rJDpuVVWk5G;[k5PD[joGG\jpD(Mk5XT+ +s5rJDrT=.["6TX`k5PAdk5YJDk5XT+s8M-hs5s@Ds5s@Ds5s@Ds8D'[s8M0\rrV?_k4elUk5PDU +k5YGak5XTDs8(j`s5rJDs5s@Ds8M-\s7YR^s5s@Ds5s@Ds5s@Xk5PAck5XTDs5rJDrT4=ak5XT+ +s5s:[!TsFIk4S`Zk5XTDk5XTDroO4\rT4+[roO4\roO4\mH+QOk5YJDrVll[rVll[q>^EU!<<&\ +!<<&\"97NGs8M0Ys8V3]s8M-\s8D'as5rJDk2u^=joteIk5XT+q>UHWpAamL$ifAOs8V6]k2u^+ +k5PA`k5XT+s8M-\s8M-^s5rJBrrV?_k5PAfk5XTDk5XTDk5XTArrD3Zs8;$YrsRuhk2u^Dk5XT+ +s8W)\!<;QN"TRWak5VID!<<#[!<<#[!<<&\!<<&\!<<&\!<7W4J`_gOrr@Q~> +JaVdjrrE&dquGmI"p")Z!:K7TrU(3smd:)CmJu\C!:K7TmJuYTrU'XcrU'dgmd:)CrVurdrVuue +!;u6c!:Kdc!U]sbmeZtjmJu\C!!)EemK!7S#6=2[!:K7Tmf!4\mJm7dmK!=UqZ-Zarr<&er;c]^ +!W_ZVrW)ud!!)rb!!*#d!<DQd!<)<c!;Psl!:BgemJuYT!:BjT!!)H\!<;Hg!:BjdmK*CVme$SI +mKEUY!:BjTrW!>o!!)EemJm7TmJm7cmK3IWmK!4R!!)uc!!)i_!!)uc!!)uc!s%`hmed%imJm7T +mJm7TrVurdrW)la"p")Z!:K7TrU'dgmd:)CrW)ud!s%cW!;l0e!:BjT!;>jQ!!M]i!:K:Q!;>g\ +!<2Bq!:BjT!:BjTmJm7TmK!7S!!*#d!<DQ]!!2KfrpKac!q$'VjoGGLrrE)e!s%cW!:]C\!:K7T +md:(FmKN[ZmJu\C!.jQhmYL<2!.Y~> +Ja2LbrrE&`quGmE"p!rR!:&hLrTXpolKSB7l2^,7!:&hLl2^)LrTX@_rTXLclKSB7rVur`rVuua +!;u*_!:'L_!U9[^lMCPfl2^,7!!)9al2^hK#6=&S!:&hLlM^eXl2Uh`l2^nMqZ-Z]rr<&ar;c]Z +!W_NNrW)u`!!)r^!!*#`!<DE`!<)0_!;Pgh!9sOal2^)L!9sRL!!)<X!<;<c!9sR`l2gtNlLb/E +l3.1Q!9sRLrW!>k!!)9al2UhLl2Uh_l2q%Ol2^eJ!!)u_!!)i[!!)u_!!)u_!s%TdlMLVel2UhL +l2UhLrVur`rW)l]"p!rR!:&hLrTXLclKSB7rW)u`!s%WO!;l$a!9sRL!;>^M!!MQe!:&kI!;>[X +!<26m!9sRL!9sRLl2UhLl2^hK!!*#`!<DEY!!2?brp'I_!pTdNjoGGHrrE)a!s%WO!:]7X!:&hL +lKSA>l377Rl2^,7!.jEdlA4a*!.Y~> +J`c4ZrrE&\r;YpA#63iJs5rJDrT4[kk2u^+k5XT+s5rJDk5XTDrT4+[rT47_k2u^+rr2u\rr3#] +s8;![s5s:[!TsFZk55/bk5XT+s8V6]k5YGC#QNrKs5rJDk5PDTjoGG\joPMEqu?]Ys8N)]rVu`V +!rqEFrr<#\!<;uZ!<<&\!WV<\s8D'[s7k^ds5s@]k5XTDs5s@Ds8V6Ts8V3_s5s@\joYSFk4ScA +joteIs5s@Drr3Ags8V6]k5YJDk5YJ[jobYGk5YDB!<<#[!<;lW!<<#[!<<#["97N`k5>5ak5YJD +k5YJDrr2u\rr;oY#63iJs5rJDrT47_k2u^+rr<#\"97NGs81p]s5s@Ds7YUIrrhKas5rJAs7YRT +s8M-is5s@Ds5s@Dk5YJDk5YGC!<<&\!WV<UrrM9^roX4[!p9OFk5YJDs8W,]"97NGs7#.Ts5rJD +k2u]6jp(kJk5XT+s+0<`k(r1"!.Y~> +JaVdjrr<&ep&OFH!!*#d!!*#d!s%cW!<2Bj!:BjT!:Bjdmf!4`mKEUYmJm7TrVurdqu?cc!;c-\ +!;Z']!<;He!<2Eb!<2Bd!<2EZ!;u6b!<)?b!!)Hc!!)Hb!!)Hd!;u9Y!<2Bf!:K:K!;>g\!<2Ed +!<;Hi!:BjT!;l3]!<;He!<2Bm!:K7Tmd:&TmdC#RlL"lWmJm7T!!)Hd!!_ik!:BjT!<2Bd!9W\L +!<2Bd!<2Bd!<2Be!:K[`s6fme!:Kabs6^!imJu\Cr;Zld!;u9`!!qummd:)C!:Bj_mf!4Ymf!1d +med%bmf!4dme-YXmJm7cmf*7pmJuYT!:BgemJuYTrU'XcrpBjgmJu\<!<;Kc!;l3`!!)Hd!<2Bg +!:BjTrW)HU!!*#d!!*#d!!&PW"9@iimJqh+JaS<]rr@Q~> +Ja2Lbrr<&ap&OFD!!*#`!!*#`!s%WO!<26f!9sRL!9sR`lM^e\l3.1Ql2UhLrVur`qu?c_!;c!X +!;YpY!<;<a!<29^!<26`!<29V!;u*^!<)3^!!)<_!!)<^!!)<`!;u-U!<26b!:&kC!;>[X!<29` +!<;<e!9sRL!;l'Y!<;<a!<26i!:&hLlKS?LlK\<JlKSTSl2UhL!!)<`!!_]g!9sRL!<26`!9WPH +!<26`!<26`!<26a!:'C\s6BUa!:'I^s69^el2^,7r;Zl`!;u-\!!qiilKSB7!9sR[lM^eUlM^b` +lMLV^lM^e`lLk5Tl2Uh_lMghll2^)L!9sOal2^)LrTX@_rosRcl2^,4!<;?_!;l'\!!)<`!<26c +!9sRLrW)HQ!!*#`!!*#`!!&PS"9@]el2ZD#Ja/$Urr@Q~> +J`c4Zrr<&]pAaI@!<<&\!<<&\"97NGs8M-bs5s@Ds5s@\k5PDXjoteIk5YJDrr2u\r;Qf[s8(mT +s7tgUs8V3]s8M0Zs8M-\s8M0Rs8;!Zs8D*ZrrD3[rrD3ZrrD3\s8;$Qs8M-^s5rJ;s7YRTs8M0\ +s8V3as5s@Ds81sUs8V3]s8M-es5rJDk2u^Dk2uXBlK/?Ok5YJDs8V6\rs%Wcs5s@Ds8M-\s5rGD +s8M-\s8M-\s8M-]s5s1Xs5s@]!9X4Zs5jIak5XT+rVlo\s8;$Xrs7cek2u^+s5s@Wk5PDQk5PA\ +k5>5Zk5PD\k4\iPjoGG[k5YGhk5XTDs5s@]k5XTDrT4+[roO=_k5XT,s8V6[s81sXrrD3\s8M-_ +s5s@Drr;KM!<<&\!<<&\!<8SO"TRWak5U"pJ`_aMrr@Q~> +JaVdjrr</h!:K:R!9ihN!<)<c!<)?c!<)?c!<2EZ!<2Ed!!qum!:BjT!!)Hc!!DWhmdAm2#OVT[ +!:K7Tmf!4dmJm7cmJm7ame-Y\mJm7cmJm7_mf!4Xmf!4VmJm7dmKN[ZmJm7T!;l3X!<2Bl!:BjT +!!)Eemed%emJuYTrU'Xcp$Mn^mJu\S!!)H_!<;He!<)<c!9W\R!:K7Tmd:)QmK!=Ur;clcrVurd +rVurdrVurdrW!#f!:KdcqX47]rpKacr9j7Yr9inO!:Kdcq<e4_rU'XcrU0[c"7?0W!;#XW!!;Qg +mem+gmJuYTmf!4cmeZtamf!1gmJuYTrU'afmJu\S!;c-_!<2Bd!<)<c!<)<c!<2Bd!<)<c!<)<c +!4D4p!<)<c!<)<c!;#XX!.jQhmY:00!.Y~> +Ja2Lbrr</d!:&kJ!9i\J!<)0_!<)3_!<)3_!<29V!<29`!!qii!9sRL!!)<_!!DKdlK[1*#O2<S +!:&hLlM^e`l2Uh_l2Uh]lLk5Xl2Uh_l2Uh[lM^eTlM^eRl2Uh`l377Rl2UhL!;l'T!<26h!9sRL +!!)9alMLVal2^)LrTX@_p$)VZl2^,K!!)<[!<;<a!<)0_!9WPN!:&hLlKSBIl2^nMr;cl_rVur` +rVur`rVur`rW!#b!:'L_qWdtYrp'I_r9EtUr9EVK!:'L_q<@q[rTX@_rTaC_"6omO!;#LS!!;Ec +lMU\cl2^)LlM^e_lMCP]lM^bcl2^)LrTXIbl2^,K!;c![!<26`!<)0_!<)0_!<26`!<)0_!<)0_ +!4D(l!<)0_!<)0_!;#LT!.jEdlA"U(!.Y~> +J`c4Zrr</`s5rJBs6/SFs8D'[s8D*[s8D*[s8M0Rs8M0\rs7ces5s@Ds8V6[rr_E`k2tM"#Nl'K +s5rJDk5PD\joGG[joGGYk4\iTjoGG[joGGWk5PDPk5PDNjoGG\jp(kJk5YJDs81sPs8M-ds5s@D +s8V6]k5>5]k5XTDrT4+[p#ZAVk5XTCrrD3Ws8V3]s8D'[s5rGJs5rJDk2u^AjoPMErVuo[rr2u\ +rr2u\rr2u\rr3&^s5s:[qW@_UroX4[r9!_Qr9!AG!9X7[q;q\WrT4+[rT=.["6TXGs7>COrrV?_ +k5G;_k5XTDk5PD[k55/Yk5PA_k5XTDrT44^k5XTCs8(mWs8M-\s8D'[s8D'[s8M-\s8D'[s8D'[ +s0^ths8D'[s8D'[s7>CPs+0<`k(`$u!.Y~> +JaVdjrW)rc"9@iimJt]'!W_ZVrW)ud!!)rb"T[rjmJu\I!<;K_!;u6c!:Kdcs6fmerpKac!U]se +mJm7dmL0*`!:BjT!:BjTmJm7dmJm7cmK*CVmf!4SmKWa[!:BjTmK!4R!!)uc"9@iimJueF!W_ZV +r;[2m!:BgemJuYT!:K[`rU'[dmem+emJu\R!!Vcj!:K7TrpBadp$Mq_mJu\CrW)udq>f@>"9@ii +mK!4Rmf3@Ur;ZicirK#FrW)ob!!)uc!!*#drW)udr;ZicrVuue!<2Bh!:BjT!;Z$_!<2Bd!<2Bf +!:K:S!;>jP!!)Hd!!qummJuYTmJu\Q!"/,o!:K7Tmd:)CmcjfOmJm7dmJm7TmJm7cmJm7cmJm7. +mJm7cmJm7dmf*7gmJm7dmJm7cmK*CVme-V]mJqh+JaSKbrr@Q~> +Ja2LbrW)r_"9@]el2]8t!W_NNrW)u`!!)r^"T[ffl2^,A!<;?[!;u*_!:'L_s6BUarp'I_!U9[a +l2Uh`l3m[X!9sRL!9sRLl2Uh`l2Uh_l2gtNlM^eOl3@=S!9sRLl2^eJ!!)u_"9@]el2^A>!W_NN +r;[2i!9sOal2^)L!:'C\rTXC`lMU\al2^,J!!VWf!:&hLrosI`p$)Y[l2^,7rW)u`q>f@:"9@]e +l2^eJmf3@Qr;Zi_irK#BrW)o^!!)u_!!*#`rW)u`r;Zi_rVuua!<26d!9sRL!;Ym[!<26`!<26b +!:&kK!;>^L!!)<`!!qiil2^)Ll2^,I!".uk!:&hLlKSB7lKSBKl2Uh`l2UhPl2Uh_l2Uh_l2Uh* +l2Uh_l2Uh`lMghcl2Uh`l2Uh_l2gtNlLk2Yl2ZD#Ja/3Zrr@Q~> +J`c4Zrr<'!roO@`k5XTDdcLW2k2u[Cs5j=]r8n1_k5XTDk4J]Rk5#&TjoPMErVuo[s8W)\rr3#] +s8M-\s8M-hs5s@Ds5s@Ds5rJDs8M-\s8D']s5rJCs6f"Ss5s@Ds5rJDrT4+[rT47_k5XTDn`BoQ +k2uXB$KhBNs8V6]k5YJDqZ$NV!WV<\rrV?_k5G;`k5YJDk5YGC!<;`S"TRWak2u[Cs5s1Xh<"k? +k5XTDrT<SK!9X7[!9W>Ar9""YrT4+[rT4+[roX4[s5s:[!9X:\!TsF]jok_Hs5s@WjoGG\joGG\ +joYSFk5PDSk4ATQk5PAdk5XTDk5XTDk5>5dk5YJDk5XT+s5rJ/s8M-\s8M-\s6f"Ls8D'[s8D'[ +s2a=&s8D'[s8M0\rrV?_s8M-\s8D']s5rJ;rrM9^J`_OGN9:-?J,~> +JaVdjrrE&drr<2i!:K7TddI,8"RZ9X!!)l`rW)f_rW)rc"T[rjmJu\P!;l3\!<;Hf!:Kgd(@D1j +!:K7Tmd:)C!:K7T!:Bgemd:&TrpBadrpC!kmd:)C!:BjcmJm7cmJm7`mK`g\mJm7T!:Bjdmf*:d +mf*7imJuYT!<2Bd!;5a^!:BjTrW)ud#6=/lmJuYTmeZtcmJu\C!!M]imd:)KmJm7cmK<OX!:K:J +!!;Qg!<2Ed!9`eL!<)?M!!VcjmJu\CrW)c^r;Zoe!:Kgdq<e@cmJuYTrpBadrpBadrpC6rmJuYT +mJuYTmJuYTmK!7Srr<2i!:K7Tq<eCdmd:)Cme-YSmf!4dmdpMZmKEUYmJm7Tr;Zrf!:Bjdmf*:d +mK!=UrW)f_rW)la"p")Z!:K7Tm-XiRrpBadrpBad`pNg,rpKdds6]pgmdC&Ss6^0nmJuYTmJm7T +me["`mJm6<mXaeamf*9;~> +Ja2LbrrE&`rr<2e!:&hLdd$i4"R6!P!!)l\rW)f[rW)r_"T[ffl2^,H!;l'X!<;<b!:'O`(?tnb +!:&hLlKSB7!:&hL!9sOalKS?LrosI`ros^glKSB7!9sR_l2Uh_l2Uh\l3ICTl2UhL!9sR`lMgk` +lMghel2^)L!<26`!;5UZ!9sRLrW)u`#6=#hl2^)LlMCP_l2^,;!!MQelKSBCl2Uh_l3%+P!:&kB +!!;Ec!<29`!9`YH!<)3I!!VWfl2^,7rW)cZr;Zoa!:'O`q<A(_l2^)LrosI`rosI`rossnl2^)L +l2^)Ll2^)Ll2^hKrr<2e!:&hLq<A+`lKSB7lLk5OlM^e`lLY)Vl3.1Ql2UhLr;Zrb!9sR`lMgk` +l2^nMrW)f[rW)l]"p!rR!:&hLm-4QNrosI`rosI``p*O(rp'L`s69XclK\?Ks69mjl2^)Ll2UhL +lMCS\l2Ug8l@J5YlMgj7~> +J`c4Z!<E0!k5YGak5XT+s3g'0rrhKak5YJXk5PDWk5PD[joteIs5s@Dqu?QUqZ$TX!WV<]rtabs +k5XT+s5rJDk5XT+s8V6]s5rJDs8M-\s8M-cs5rJDk5XTDrT4+[rT4+[qW8(`k2u^Dk5XTDroX7\ +roX7\"QoaHs8W)\!<;`S"97N`k5PD\jp1qKs5s@Ds5s4Y!p9OFmf*FPs5rJDp>uATrT47_k5XT+ +p&>*Us8W)\s8V9Err;rZl2LqLs5s@Dk5PDVk5G;]k5XTCs7td[s5s@Ds8M-\s8M-\s8M-js5s@D +s5s@Ds5s@Ds5s@\k5YGak5XT+s7td\s5rJDk2uC;p?)ASs5rtRs5jLbk2u^Dk5G;^k5XTDroX7\ +roO7]k5PDWk5PDYjp(kJk5XT+s6SkJs8M-\s8M-\s2O1$s8M0\s8V3_s5rJCs8V3fs5s@Ds5s@] +k2uR@roO4\J`_OGMrt$>J,~> +JaVdjrrE)e!!*#d!!*#d!!(L9rr<2i!:BgerpKI[s6^!imJuYTrpBdemed%jmJm7T!:K7Tmed%d +mJm7dmK!=UrW!/j!:BjT!:KgdrpBjgmJu\S!<;I'!:K7Tmd:)CmJu\C!:K7TmJuYTmd:&TqX4@` +s6^['mJuYT!:Bgemd:)C!:BjT!:BjT!:BjZme-V^mJu\J!<;Hf!:Kgds6]mfmed(bmf!1emK!(N +!!)uc!!*#drrE)e"T[rjmJu\S!"/,o!:K7T!:K7T!:'"G!<)?_!<;Kd!!)Hd!<2Ea!<;Hi!:BjT +!;l0b!:Kdc"muBY!:BjamL0*`mJu\C!:K7Tmd:)SmLfNf!!)HT!!)Ee!:Bgemd:)C!<2Bd!<2Bd +!;Z$c!:BjT!<)?b!;#XV!!DWh!:K^as6fme!q$'VrVurdr;cibrrE&drrE&drr</h!:BjbmK<OX +!:BjbmK<OX!:BjPmKN[ZmJu\C!6":.!:K7Tmf!1tmJu\C!!)EemJm7TmJm7Tmem+gmJu\C!.jQh +mY^H4!.Y~> +Ja2LbrrE)a!!*#`!!*#`!!(L5rr<2e!9sOarp'1Ws69^el2^)LrosLalMLVfl2UhL!:&hLlMLV` +l2Uh`l2^nMrW!/f!9sRL!:'O`rosRcl2^,K!<;=#!:&hLlKSB7l2^,7!:&hLl2^)LlKS?LqWe(\ +s6:C#l2^)L!9sOalKSB7!9sRL!9sRL!9sRVlLk2Zl2^,B!<;<b!:'O`s69UblMLY^lM^bal2^YF +!!)u_!!*#`rrE)a"T[ffl2^,K!".uk!:&hL!:&hL!:&kC!<)3[!<;?`!!)<`!<29]!<;<e!9sRL +!;l$^!:'L_"mQ*Q!9sR]l3m[Xl2^,7!:&hLlKSBKl4O*^!!)<L!!)9a!9sOalKSB7!<26`!<26` +!;Ym_!9sRL!<)3^!;#LR!!DKd!:'F]s6BUa!pTdNrVur`r;ci^rrE&`rrE&`rr</d!9sR^l3%+P +!9sR^l3%+P!9sRLl377Rl2^,7!6".*!:&hLlM^bpl2^,7!!)9al2UhLl2UhLlMU\cl2^,7!.jEd +lAFm,!.Y~> +J`c4ZrrE)]!<<&\!<<&\!<:O1s8N5as5s@]roWqSs5jIak5XTDroO7]k5>5bk5YJDs5rJDk5>5\ +k5YJ\joPMErr32bs5s@Ds5s=\roO=_k5XTCs8V3ts5rJDk2u^+k5XT+s5rJDk5XTDk2u^DqW@hX +s5k-tk5XTDs5s@]k2u^+s5s@Ds5s@Ds5s@Rk4\fVk5XT:s8V3^s5s=\s5j@^k5>8Zk5PA]k5Y8> +!<<#[!<<&\s8W,]"om`bk5XTCrsIogs5rJDs5rJDs6Ab?s8D*Ws8V6\rrD3\s8M0Ys8V3as5s@D +s81pZs5s:["m5jIs5s@Yjp_:Pk5XT+s5rJDk2u^Cjq@^Vs8V6Ds8V6]s5s@]k2u^+s8M-\s8M-\ +s7td[s5s@Ds8D*Zs7>CNrr_E`s5s4Ys5s@]!p9OFrr2u\rVulZs8W)\s8W)\s8N2`s5s@Zjok_H +s5s@Zjok_Hs5s@Hjp(kJk5XT+s2=%&s5rJDk5PAlk5XT+s8V6]k5YJDk5YJDk5G;_k5XT+s+0<` +k)/=$!.Y~> +JaVdjrr<)f!<)<c!<)<c!7gK=!:K:S!<;He!;l3`!<2Bo!:BjTmJuYT!:BjTqu?`brW)udrr</h +!!)Hc!!Vcj!:BjTr;clcq#LE^!W_ZVrW)ob#6=/lmJu\C!<2Ed!<;Ke!!M]imJm7`mKim]mJuYT +mJm7TrW)ob!W_ZVquHcb!!)`\p&G<b!:BjT!:Kgd!:Kgds6]shmJu\R!!Vcjmd:)CrW)obrW)]\ +!!*#drrE)e!s%cW!<2Ec!"A8qmJuYT!:BgemJm7Kmf!4_med%bmf!1hmJuYTmd^AXmJm7cme-Y\ +mJm7cmJm7dmJm7dmK<OX!:BjdmJm7dmKN[Z!:BjT!<2Bd!<2Bd!<)<c!<)<c!;Z'^!<)<g!:BjT +!;5aq!:K7TmJm7T!:K7T!:BjT!!)Ee!:K:K!;Gmc!:K7Tmd:)SmKN[ZmJu\C!;u9a!9ihR!:BjT +!5e.+!:BjTr;cfarW!Dq!:K7Tmd:)C!:Bgemf!3;mXae_mf*9;~> +Ja2Lbrr<)b!<)0_!<)0_!7g?9!:&kK!<;<a!;l'\!<26k!9sRLl2^)L!9sRLqu?`^rW)u`rr</d +!!)<_!!VWf!9sRLr;cl_q#LEZ!W_NNrW)o^#6=#hl2^,7!<29`!<;?a!!MQel2Uh\l3RIUl2^)L +l2UhLrW)o^!W_NNquHc^!!)`Xp&G<^!9sRL!:'O`!:'O`s69[dl2^,J!!VWflKSB7rW)o^rW)]X +!!*#`rrE)a!s%WO!<29_!"A,ml2^)L!9sOal2UhGlM^e[lMLV^lM^bdl2^)LlLFrTl2Uh_lLk5X +l2Uh_l2Uh`l2Uh`l3%+P!9sR`l2Uh`l377R!9sRL!<26`!<26`!<)0_!<)0_!;YpZ!<)0c!9sRL +!;5Um!:&hLl2UhL!:&hL!9sRL!!)9a!:&kC!;Ga_!:&hLlKSBKl377Rl2^,7!;u-]!9i\N!9sRL +!5e"'!9sRLr;cf]rW!Dm!:&hLlKSB7!9sOalM^d7l@J5WlMgj7~> +J`c4Zrr<)^s8D'[s8D'[s4-65s5rJCs8V3]s81sXs8M-gs5s@Dk5XTDs5s@Dr;QcZrr<#\s8N2` +s8V6[rrqQbs5s@DrVuo[q>^HV!rqEFrr;rZ#QNrdk5XT+s8M0\s8V6]rrhKak5YJXjpD(Mk5XTD +k5YJDrr;rZ!rqEFr;ZfZ!<;cTpAY?Zs5s@Ds5s=\!9X:\s5jF`k5XTBrrqQbk2u^+rr;rZrr;`T +!<<&\s8W,]"97NGs8M0[rs\&ik5XTDs5s@]k5YJCk5PDWk5>5Zk5PA`k5XTDk48QPjoGG[k4\iT +joGG[joGG\joGG\jok_Hs5s@\joGG\jp(kJs5s@Ds8M-\s8M-\s8D'[s8D'[s7tgVs8D'_s5s@D +s7PLis5rJDk5YJDs5rJDs5s@Ds8V6]s5rJ;s7bX[s5rJDk2u^Cjp(kJk5XT+s8;$Ys6/SJs5s@D +s2*n#s5s@DrVuiYrr3Gis5rJDk2u^+s5s@]k5PC3k(2ZOk5PF3~> +JaVdjrrC40p&P'Z"9@iimK!7S$NTSpmJuYTmJuYTmaqL>me-V\mf!4dmJm7cmKN[Z!:K7Tmem.c +mKEUY!:K7TrpKdd!q$'VrW)ud!!*#drW!,i!:BjT!:fLV!!;Qgmem.bmed%imJuYTmd:)CrW!&g +!:K:D!;c*d!:K7Tmf!1dmdpJZmeQq^mJm7^mJm7cmJm7cmKWa[mJuYTmK!1Qrr<&eoDf!]!!)Ha +!"/,omJu\C!!)HT!<2Ea!<;He!<2Bg!:K7TrU'XcrU0XbrpBadrU0[crpKddrpKddrpBado^;DQ +s6]shmd:)LmJm7dmK*CVmf!1dmf!1hmJuYT!;Q!]!;,[Z!<2Bd!<2Bf!:BjdmJm7dme$SGmf!4% +me-V\mem+dmK!4RrVurdquD<9JaSB_rr@Q~> +Ja2LbrrC4,p&P'V"9@]el2^hK$NTGll2^)Ll2^)LlIZ(:lLk2XlM^e`l2Uh_l377R!:&hLlMU__ +l3.1Q!:&hLrp'L`!pTdNrW)u`!!*#`rW!,e!9sRL!:f@R!!;EclMU_^lMLVel2^)LlKSB7rW!&c +!:&k<!;bs`!:&hLlM^b`lLY&VlM:MZl2UhZl2Uh_l2Uh_l3@=Sl2^)Ll2^bIrr<&aoDf!Y!!)<] +!".ukl2^,7!!)<L!<29]!<;<a!<26c!:&hLrTX@_rTa@^rosI`rTaC_rp'L`rp'L`rosI`o]l,M +s69[dlKSBDl2Uh`l2gtNlM^b`lM^bdl2^)L!;PjY!;,OV!<26`!<26b!9sR`l2Uh`lLb/ClM^e! +lLk2XlMU\`l2^eJrVur`quD<5Ja/*Wrr@Q~> +J`c4ZrrC4(pAb*R"TRWak5YGC$ifAhk5XTDk5XTDk1K\6k4\fTk5PD\joGG[jp(kJs5rJDk5G>[ +joteIs5rJDroX7\!p9OFrr<#\!<<&\rr3/as5s@Ds7,7NrrV?_k5G>Zk5>5ak5XTDk2u^+rr3)_ +s5rJ4s8(j\s5rJDk5PA\k4JZRk5,,VjoGGVjoGG[joGG[jp1qKk5XTDk5YAAs8N)]o`#$Us8V6Y +rsIogk5XT+s8V6Ds8M0Ys8V3]s8M-_s5rJDrT4+[rT=+ZroO4\rT=.[roX7\roX7\roO4\o]GlI +s5jF`k2u^<joGG\joYSFk5PA\k5PA`k5XTDs7kaUs7GFRs8M-\s8M-^s5s@\joGG\k4Sc?k5PCr +k4\fTk5G;\k5YDBrr2u\r;V?1J`_gOrr@Q~> +JaVdjrrC(,rW)f_%KPqb!:K7TmJuYTmJm7TnGid]!:K7TmdC&SqsOF`s6]mfmem.amK3IW!:Kdc +!:KO\qsFIbmem+dmK!7S!!*#d!!*#do`5!ZrVurdrW)KV!s%`hmbn0Gmf!1gmJu\CrW)WZ!s%`h +mem.`med(bmf*7emem+dmK!7S!!)`\!!*#d!!*#d#lsD]!:K7Tmd:)Smf*:emf!1fmJu\S!"/,o +mJm7TmJuYTmf!1mmJuYTmJu\C!!)uc#6=/lmJm7T!<)<c!;c-W!8R#A!<;He!<2Bd!<2Bd!;Z$_ +!<)<c!<2Eb!<;Kd!<;He!;c*d!:BjT!;>g\!<)<c!<)<c!<)<c!<)<c!<2Ec!:0(H!6FU%!!)HM +!.jQhmYpT6!.Y~> +Ja2LbrrC((rW)f[%KPeZ!:&hLl2^)Ll2UhLnGidY!:&hLlK\?Kqs+.\s69UblMU_]l2q%O!:'L_ +!:'7Xqs"1^lMU\`l2^hK!!*#`!!*#`o`5!VrVur`rW)KR!s%TdlJVaClM^bcl2^,7rW)WV!s%Td +lMU_\lMLY^lMghalMU\`l2^hK!!)`X!!*#`!!*#`#ls8U!:&hLlKSBKlMgkalM^bbl2^,K!".uk +l2UhLl2^)LlM^bil2^)Ll2^,7!!)u_#6=#hl2UhL!<)0_!;c!S!8Ql=!<;<a!<26`!<26`!;Ym[ +!<)0_!<29^!<;?`!<;<a!;bs`!9sRL!;>[X!<)0_!<)0_!<)0_!<)0_!<29_!:/qD!6FI!!!)<I +!.jEdlAY$.!.Y~> +J`c4ZrrC($rr;iW%fb\Rs5rJDk5XTDk5YJDnc&gUs5rJDk2u[Cqr[nXs5j@^k5G>YjobYGs5s:[ +!9X"TqrRqZk5G;\k5YGC!<<&\!<<&\p&G$Rrr2u\rr;NN"97N`k2H@?k5PA_k5XT+rr;ZR"97N` +k5G>Xk5>8Zk5YG]k5G;\k5YGC!<;cT!<<&\!<<&\$30/Ms5rJDk2u^Ck5YJ]k5PA^k5XTCrsIog +k5YJDk5XTDk5PAek5XTDk5XT+s8W&[#QNrdk5YJDs8D'[s8(mOs4lc9s8V3]s8M-\s8M-\s7tdW +s8D'[s8M0Zs8V6\s8V3]s8(j\s5s@Ds7YRTs8D'[s8D'[s8D'[s8D'[s8M0[s6Jh@s2a?rrrD3E +s+0<`k)AI&!.Y~> +JaVdjrrC+-"9@iimK!1Q!!*#d!!*#d!!*#d"p"&kmJuYTrpKL\$LRo^!:K7TmJuYTrU'jimJuYT +mdC#R!U]sdmem+fmJuYTrU0Xbq!ReT$17f]mJu\C!:K:P!<2EW!;>gd!:Bgemd:)Cmf!4cmed%c +mK!7S!<DQd!!VcjmJu\Cr;[,k!:BgemJuYTp$VJQ"muBY!!)HZ!<)<c!;Z$h!:K7Tmd:)CmK!7S +!!*#d!W_WgrU'^emdC&S(%)&%mJuYT!:BjT!!)Ee!:Bgemd:)NmKN[ZmJu\C!:T@T!86cD!:BjT +!!)uc!!)uc!!)][n,WCS"p")Z!:K7Ti9g^JmJuYTkjJEM_!_.$"muBY!:K:K!!)Hd!<;Kd!.jQh +mYL<2!.Y~> +Ja2LbrrC+)"9@]el2^bI!!*#`!!*#`!!*#`"p!ogl2^)Lrp'4X$L.WV!:&hLl2^)LrTXRel2^)L +lK\<J!U9[`lMU\bl2^)LrTa@^q!.MP$0hNUl2^,7!:&kH!<29S!;>[`!9sOalKSB7lM^e_lMLV_ +l2^hK!<DE`!!VWfl2^,7r;[,g!9sOal2^)Lp$22M"mQ*Q!!)<V!<)0_!;Ymd!:&hLlKSB7l2^hK +!!*#`!W_KcrTXFalK\?K($Yc!l2^)L!9sRL!!)9a!9sOalKSBFl377Rl2^,7!:T4P!86W@!9sRL +!!)u_!!)u_!!)]Wn,WCO"p!rR!:&hLi9CFFl2^)Lkj&-I_!:ju"mQ*Q!:&kC!!)<`!<;?`!.jEd +lA4a*!.Y~> +J`c4ZrrC+%"TRWak5YAA!<<&\!<<&\!<<&\#63ick5XTDroWtT$KhBNs5rJDk5XTDrT4=ak5XTD +k2uXB!TsF\k5G;^k5XTDrT=+Zpu_8L$0M9Mk5XT+s5rJ@s8M0Os7YR\s5s@]k2u^+k5PD[k5>5[ +k5YGC!WV<\rrqQbk5XT+rVm/cs5s@]k5XTDp#brI"m5jIs8V6Rs8D'[s7td`s5rJDk2u^+k5YGC +!<<&\!rqE_rT41]k2u[C($>Prk5XTDs5s@Ds8V6]s5s@]k2u^>jp(kJk5XT+s6o+Ls4QN<s5s@D +s8W&[!<<#[!<;`SnGiFK#63iJs5rJDi8t1Bk5XTDkiVmE^ukUq"m5jIs5rJ;rrD3\s8V6\s+0<` +k(r1"!.Y~> +JaVdjrrC.."p")Z!:K7TrpBadrU'XcrU'XcrpK[arpBdeme$S[mL'$_mJu\C!:K7TmdBB@#jq]\ +mJuYTmK!.Pp&G-]!<2Bg!:BjTp&P'Z!<DQe!!)Hd!;#U_!:BjT!:K:S!!)Hd!!qummJuYTmJm7c +mf*7hmJuYTr9b!omd:)CmJm7TmJu\C!;c-W!<2Bn!:K7Tmd:&TmJu\O!!;Qg!<2Bd!;Gmd!:BjT +!:K7TrU'XcrU'XcrU0:Xs6^9qmJuYTmJuYTmJuYTq<e4_rpBadrpBadna6M[mJuYTg[5:HmJm7T +mJm7cmJm7dmJm7cmJm7cmJm7amf!4cmf!4^mJm7dmJm7dmJm7HmKN[ZmJu\C!:&tT!:BjT!5e.) +!:Kgd#jq]\mJu\C!:KdcrU'slmJuYT!:BjT!.jQhmYUB3!.Y~> +Ja2LbrrC.*"p!rR!:&hLrosI`rTX@_rTX@_rp'C]rosLalLb/Wl3dUWl2^,7!:&hLlK[[8#jMET +l2^)Ll2^_Hp&G-Y!<26c!9sRLp&P'V!<DEa!!)<`!;#I[!9sRL!:&kK!!)<`!!qiil2^)Ll2Uh_ +lMghdl2^)Lr9=^klKSB7l2UhLl2^,7!;c!S!<26j!:&hLlKS?Ll2^,G!!;Ec!<26`!;Ga`!9sRL +!:&hLrTX@_rTX@_rTa"Ts6:!ml2^)Ll2^)Ll2^)Lq<@q[rosI`rosI`n`g5Wl2^)LgZf"Dl2UhL +l2Uh_l2Uh`l2Uh_l2Uh_l2Uh]lM^e_lM^eZl2Uh`l2Uh`l2UhDl377Rl2^,7!:&hP!9sRL!5e"% +!:'O`#jMETl2^,7!:'L_rTX[hl2^)L!9sRL!.jEdlA=g+!.Y~> +J`c4ZrrC.?iJs5rJDroO4\rT4+[rT4+[roX.YroO7]k4ScSjpV4Ok5XT+s5rJDk2u"0#j20L +k5XTDk5Y>@pAY0Us8M-_s5s@DpAb*R!WV<]rrD3\s7>@Ws5s@Ds5rJCrrD3\rs7cek5XTDk5YJ[ +k5YG`k5XTDr8nIgk2u^+k5YJDk5XT+s8(mOs8M-fs5rJDk2u^Dk5XT?rrV?_s8M-\s7bX\s5s@D +s5rJDrT4+[rT4+[rT<bPs5jaik5XTDk5XTDk5XTDq;q\WroO4\roO4\n`BuSk5XTDgZAb@k5YJD +k5YJ[joGG\joGG[joGG[joGGYk5PD[k5PDVjoGG\joGG\joGG@jp(kJk5XT+s6A_Ls5s@Ds2*n! +s5s=\#j20Lk5XT+s5s:[rT4Fdk5XTDs5s@Ds+0<`k)&7#!.Y~> +JaVdjrrD!F!!)uc!!)ucrrE#c!!)uc!W_WgrpBadrpBadp$Ui?!U]semf*:dmJm7dmed(amK*CV +mf!4dmJm7dmf*:emK3IW!!)f^r;ZicrW)larW)obrW!)h!:K7TrU0Xb"muBY!:Bj[mJm7cmJm7d +mf*7qmJu\C!:BgemJm7T!<)<i!:K7Tmd:)SmJm7dmKWa[mJm7TmK!7S!!)c]r;[#h!:BjT!<2Bd +!<2EZ!!M]imd:)Jmf!4PmdpMZmK<OX!:K:S!;Z$_!<)<c!<)<c!;#U_!:K7Tmd:)2mJm7dmJm7d +mJm7dmJm7bmJm7dmJm7dmJm7amKrs^!:BjT!:BjT!;l0a!<)<c!<)<c!9EPJ!<2Bd!<2Bd!:9+X +!:K7Tmd:(nmKWa[mJu\C!!*#drrE)e!<DQe!<;Hp!:K7TmJm7T!:K7TJaS*WMXLKEJ,~> +Ja2LbrrD!B!!)u_!!)u_rrE#_!!)u_!W_KcrosI`rosI`p$1Q;!U9[alMgk`l2Uh`lMLY]l2gtN +lM^e`l2Uh`lMgkal2q%O!!)fZr;Zi_rW)l]rW)o^rW!)d!:&hLrTa@^"mQ*Q!9sRWl2Uh_l2Uh` +lMghml2^,7!9sOal2UhL!<)0e!:&hLlKSBKl2Uh`l3@=Sl2UhLl2^hK!!)cYr;[#d!9sRL!<26` +!<29V!!MQelKSBBlM^eLlLY)Vl3%+P!:&kK!;Ym[!<)0_!<)0_!;#I[!:&hLlKSB*l2Uh`l2Uh` +l2Uh`l2Uh^l2Uh`l2Uh`l2Uh]l3[OV!9sRL!9sRL!;l$]!<)0_!<)0_!9EDF!<26`!<26`!:8tT +!:&hLlKSAfl3@=Sl2^,7!!*#`rrE)a!<DEa!<;<l!:&hLl2UhL!:&hLJa.gOMX(3AJ,~> +J`c4ZrrD!>!<<#[!<<#[s8W&[!<<#[!rqE_roO4\roO4\p#b<7!TsF]k5YJ\joGG\k5>8YjoYSF +k5PD\joGG\k5YJ]jobYGs8VlVrVll[rr;oYrr;rZrr3,`s5rJDrT=+Z"m5jIs5s@SjoGG[joGG\ +k5YGik5XT+s5s@]k5YJDs8D'as5rJDk2u^CjoGG\jp1qKk5YJDk5YGC!<;fUrVm&`s5s@Ds8M-\ +s8M0RrrhKak2u^:k5PDHk4J]Rjok_Hs5rJCs7tdWs8D'[s8D'[s7>@Ws5rJDk2u^"joGG\joGG\ +joGG\joGGZjoGG\joGG\joGGYjpM.Ns5s@Ds5s@Ds81pYs8D'[s8D'[s5`;Bs8M-\s8M-\s6SkP +s5rJDk2u]^jp1qKk5XT+s8W)\s8W,]!WV<]s8V3hs5rJDk5YJDs5rJDJ`_OGMWXp=J,~> +JaVdjrrCsE!!*#d!!*#d!s%cW!<2Bd!<2Bf!:BjcmJm7cmJm7Xmed%bmf!1dmeQn`med(`mJm7d +mf*:dmK*CVmem+dmK!4Rr;[Ar!:Bgemd:&Tmd:&Tmd:)OmcjcRmJm7dme-Y\mJm7TmJm7dmLK<c +!:BjT!:BjT!:BjTmK!7S!!*#d!W_WgrU'mjmJu\C!:BjcmJm7_mK!=UrW!)h!:K7TrU0%Qq!RhU +nEpJ\mJuYTmdC&SqX4%WjmE*KrpBadrpBadhsLIErU0[cs6fme!U]samKN[ZmJu\C!;l0m!:K7T +md:)CmJu\C!;#UY!<)<c!<)<c!:K7T!<)<c!<)<c!:K7T!<2Bd!<2Bd!64F0!:K7T!<2Bd!<2Ed +!!Vcj!:BjTrW)rcrrE)errE&d!!%T<JaSHarr@Q~> +Ja2LbrrCsA!!*#`!!*#`!s%WO!<26`!<26b!9sR_l2Uh_l2UhTlMLV^lM^b`lM:J\lMLY\l2Uh` +lMgk`l2gtNlMU\`l2^eJr;[An!9sOalKS?LlKS?LlKSBGlKS?Nl2Uh`lLk5Xl2UhPl2Uh`l43m[ +!9sRL!9sRL!9sRLl2^hK!!*#`!W_KcrTXUfl2^,7!9sR_l2Uh[l2^nMrW!)d!:&hLrT`bMq!.PQ +nEL2Xl2^)LlK\?KqWdbSjlugGrosI`rosI`hs(1ArTaC_s6BUa!U9[]l377Rl2^,7!;l$i!:&hL +lKSB7l2^,7!;#IU!<)0_!<)0_!:K+P!<)0_!<)0_!:K+P!<26`!<26`!64:,!:&hL!<26`!<29` +!!VWf!9sRLrW)r_rrE)arrE&`!!%T8Ja/0Yrr@Q~> +J`c4ZrrCs=!<<&\!<<&\"97NGs8M-\s8M-^s5s@[joGG[joGGPk5>5Zk5PA\k5,)Xk5>8XjoGG\ +k5YJ\joYSFk5G;\k5YDBrVmDjs5s@]k2u^Dk2u^Dk2u^?k3DsJk5YJ\k4\iTjoGGLjoGG\jq%LS +s5s@Ds5s@Ds5s@Dk5YGC!<<&\!rqE_rT4@bk5XT+s5s@[joGGWjoPMErr3,`s5rJDrT<MIpu_;M +nE'rTk5XTDk2u[CqW@MOjlQRCroO4\roO4\hrXq=rT=.[s5s@]!TsFYjp(kJk5XT+s81pes5rJD +k2u^+k5XT+s7>@Qs8D'[s8D'[s6f"Ls8D'[s8D'[s6f"Ls8M-\s8M-\s2O1(s5rJDs8M-\s8M0\ +rrqQbs5s@Drr;u[s8W,]s8W)\!<7W4J`_mQrr@Q~> +JaVdjrrCpD"p")Z!:K7TrU'jimd:)CmJuD;!s%`hmf!1imJu\C!:KU^!U]sXmKN[ZmJu\C!<2C( +!:K7Tmd:)CmJm7T!:K7Tmd:)C!:K7TmdC#R!:K^arU0Xbs6fme"RZ9XmK!4Rrr<&erW)rc!!*#d +!!)NV!!)ucrr<Jq!:BgemJu\C!:BgerU'XcrU'XcmHsrSrU'dgmd:)CrW)rc!!)i_rW)udrr<&e +qZ-6UrW)?R$NTV_!:K7T!:BjT!;Gp\!93DH!<)<c!<)<c!86cC!:BjT!;Psb!:BjT!;l0a!<2Bj +!:BjT!:BjdmJm7YmJm7dmJm7dmJm76mJm7cmJm7cmJm7.mJm7cmJm7cmL90a!:K7TmJuYTmd:&T +rpBadrU'XcrU'XcJaS*WN:-]GJ,~> +Ja2LbrrCp@"p!rR!:&hLrTXRelKSB7l2]u3!s%TdlM^bel2^,7!:'=Z!U9[Tl377Rl2^,7!<27$ +!:&hLlKSB7l2UhL!:&hLlKSB7!:&hLlK\<J!:'F]rTa@^s6BUa"R6!Pl2^eJrr<&arW)r_!!*#` +!!)NR!!)u_rr<Jm!9sOal2^,7!9sOarTX@_rTX@_mHOZOrTXLclKSB7rW)r_!!)i[rW)u`rr<&a +qZ-6QrW)?N$NTJW!:&hL!9sRL!;GdX!938D!<)0_!<)0_!86W?!9sRL!;Pg^!9sRL!;l$]!<26f +!9sRL!9sR`l2UhUl2Uh`l2Uh`l2Uh2l2Uh_l2Uh_l2Uh*l2Uh_l2Uh_l4!aY!:&hLl2^)LlKS?L +rosI`rTX@_rTX@_Ja.gON9^ECJ,~> +J`c4ZrrCp<#63iJs5rJDrT4=ak2u^+k5XT+"97N`k5PAak5XT+s5s+V!TsFPjp(kJk5XT+s8M-u +s5rJDk2u^+k5YJDs5rJDk2u^+s5rJDk2uXB!9X1YrT=+Zs5s@]"QoaHk5YDBs8N)]rr;u[!<<&\ +!<;QN!<<#[s8NMis5s@]k5XT+s5s@]rT4+[rT4+[mH+EKrT47_k2u^+rr;u[!<;lWrr<#\s8N)] +qu?9Mrr;BJ$ifAOs5rJDs5s@Ds7b[Ts5N/@s8D'[s8D'[s4QN;s5s@Ds7k^Zs5s@Ds81pYs8M-b +s5s@Ds5s@\joGGQjoGG\joGG\joGG.joGG[joGG[joGG&joGG[joGG[jph@Qs5rJDk5XTDk2u^D +roO4\rT4+[rT4+[J`_OGN9:-?J,~> +JaVdjrrCmC"9@iimK!.P"9@iimJuD;"9@ii!:Kab&+0Gc!!)EemJm7TmJu\C!;#UY!<2Bd!<2Bf +!:BjdmJm7dmKWa[mJuYTmK!4R!!*#d!<DQe!!;Qgmem+dmK!7S"T[rjmJm7dmJm7dmJm7dmK3IW +!:Kgds6fmerpBad^?u.)md:&Tmf!4dmJm7cmJm7amf!1fmJu\I!;Psb!:BjT!:T=U!<2Bm!:K7T +!:BjTmK!(N"9@iimJsHYrW)Z[rW)i`!!)ucrrE&drrE#c!!)WY"p")Z!:K7TK^Jg?rU'mjmJu\C +!:Bjcmf*:cmJm7cmJm6<mXae`mf*9;~> +Ja2LbrrCm?"9@]el2^_H"9@]el2]u3"9@]e!:'I^&*a/[!!)9al2UhLl2^,7!;#IU!<26`!<26b +!9sR`l2Uh`l3@=Sl2^)Ll2^eJ!!*#`!<DEa!!;EclMU\`l2^hK"T[ffl2Uh`l2Uh`l2Uh`l2q%O +!:'O`s6BUarosI`^?Pk%lKS?LlM^e`l2Uh_l2Uh]lM^bbl2^,A!;Pg^!9sRL!:T1Q!<26i!:&hL +!9sRLl2^YF"9@]el2\$QrW)ZWrW)i\!!)u_rrE&`rrE#_!!)WU"p!rR!:&hLK^&O;rTXUfl2^,7 +!9sR_lMgk_l2Uh_l2Ug8l@J5XlMgj7~> +J`c4ZrrCm;"TRWak5Y>@"TRWak5XT+"TRWas5s7Z&*EoSs8V6]k5YJDk5XT+s7>@Qs8M-\s8M-^ +s5s@\joGG\jp1qKk5XTDk5YDB!<<&\!WV<]rrV?_k5G;\k5YGC"om`bk5YJ\joGG\joGG\jobYG +s5s=\s5s@]roO4\^?,V!k2u^Dk5PD\joGG[joGGYk5PA^k5XT9s7k^Zs5s@Ds6o(Ms8M-es5rJD +s5s@Dk5Y8>"TRWak5VXIrr;]Srr;lX!<<#[s8W)\s8W&[!<;ZQ#63iJs5rJDK]W:7rT4@bk5XT+ +s5s@[k5YJ[joGG[joGF4k(2ZPk5PF3~> +JaVdjrrCjBrW)c^rW)*K#6=/lmJuYTmem+rmJm7TmJuYTmJuYT!:K7Tp$Me[rU'XcrU'XcrU'Xc +rU'^emdC&SqsG=%md:&TmJu\C!:BjT!!)Ee!:BjTmJuYT!<2Bd!<)<c!<2Bj!:K7Tmd:(`mf*7i +mJu\C!<)<c!;Psj!:K7Tmd:)C!:K7Tmf!4ZmKN[ZmJu\C!:fIW!<)<i!:BjTmJm7dmJm7amKN[Z +mJu\C!4;1f!<2E[!8m2I!:BjT!.sV=!<2Bd!<2Bd!;Ps^!<2Bd!<2Bd!.jQhmYUB3!.Y~> +Ja2LbrrCj>rW)cZrW)*G#6=#hl2^)LlMU\nl2UhLl2^)Ll2^)L!:&hLp$)MWrTX@_rTX@_rTX@_ +rTXFalK\?Kqs#%!lKS?Ll2^,7!9sRL!!)9a!9sRLl2^)L!<26`!<)0_!<26f!:&hLlKSAXlMghe +l2^,7!<)0_!;Pgf!:&hLlKSB7!:&hLlM^eVl377Rl2^,7!:f=S!<)0e!9sRLl2Uh`l2Uh]l377R +l2^,7!4;%b!<29W!8m&E!9sRL!.sJ9!<26`!<26`!;PgZ!<26`!<26`!.jEdlA=g+!.Y~> +J`c4ZrrCj:rr;fVrr;-C#QNrdk5XTDk5G;jk5YJDk5XTDk5XTDs5rJDp#Z8SrT4+[rT4+[rT4+[ +rT41]k2u[CqrSdrk2u^Dk5XT+s5s@Ds8V6]s5s@Dk5XTDs8M-\s8D'[s8M-bs5rJDk2u]Pk5YGa +k5XT+s8D'[s7k^bs5rJDk2u^+s5rJDk5PDRjp(kJk5XT+s7,4Os8D'as5s@Dk5YJ\joGGYjp(kJ +k5XT+s0Uq^s8M0Ss52rAs5s@Ds+9A5s8M-\s8M-\s7k^Vs8M-\s8M-\s+0<`k)&7#!.Y~> +JaVdjrrD!FlN$8="9@iimdB`J!q$$grpKddrU'Xcp?hn\rU'XcrU'Xcq<mqVrpBmhmJuYTrU'Xc +rpBmhmJuYTrpBadrpBadp[/"]rpBadrpBad[dF7umJuYToBlSYrpBadrpBadrpKdd!:Kgdp[/"] +rpBadrpBadm-XiRrU'XcrU'XcrU'XcrpBadrpBadZ0qSkp?qn[g@"q?JaNd2!:K7Tmd:)KmKN[Z +mJu\C!.jQhmYL<2!.Y~> +Ja2LbrrD!BlN$89"9@]elK\$B!pTacrp'L`rTX@_p?DVXrTX@_rTX@_q<IYRrosUdl2^)LrTX@_ +rosUdl2^)LrosI`rosI`pZ__YrosI`rosI`[d!tql2^)LoBH;UrosI`rosI`rp'L`!:'O`pZ__Y +rosI`rosI`m-4QNrTX@_rTX@_rTX@_rosI`rosI`Z0M;gp?MVWg?SY;Ja*L*!:&hLlKSBCl377R +l2^,7!.jEdlA4a*!.Y~> +J`c4ZrrD!>li6;5"TRWak2u@:!p9O_roX7\rT4+[p>uATrT4+[rT4+[q<%DNroO@`k5XTDrT4+[ +roO@`k5XTDroO4\roO4\pZ;JUroO4\roO4\[cR_mk5XTDoB$&QroO4\roO4\roX7\!9X:\pZ;JU +roO4\roO4\m,e<JrT4+[rT4+[rT4+[roO4\roO4\Z0)&cp?)ASg?/D7J`[4"s5rJDk2u^;jp(kJ +k5XT+s+0<`k(r1"!.Y~> +JaVdjrrCjBr;cfa!W_ZVrW(dBrW)$I!!*#d!!*#d!!)ZZrW)c^rW)ob!!)ucr;Zug!:K7TrU'Xc +q<e4_rU'XcrU'Xc[dO+poBlSYrU(-qmd:)C!:K7Tmd:)C!!)i_!!)uc!!)uc!!(pE!!)uc!!)uc +!!'@n"9@iimK!%M"9@iimJuA:!!)uco`0X4('*b&mJm7T!:K7TmJu\C!:K7TmJuYTJaS*WL[P0B +J,~> +Ja2LbrrCj>r;cf]!W_NNrW(d>rW)$E!!*#`!!*#`!!)ZVrW)cZrW)o^!!)u_r;Zuc!:&hLrTX@_ +q<@q[rTX@_rTX@_[d*hloBH;UrTXjmlKSB7!:&hLlKSB7!!)i[!!)u_!!)u_!!(pA!!)u_!!)u_ +!!'@j"9@]el2^VE"9@]el2]r2!!)u_o`0X0('*V"l2UhL!:&hLl2^,7!:&hLl2^)LJa.gOL[+m> +J,~> +J`c4ZrrCj:rVuiY!rqEFrr:g:rr;'A!<<&\!<<&\!<;]Rrr;fVrr;rZ!<<#[rVm#_s5rJDrT4+[ +q;q\WrT4+[rT4+[[c[ShoB$&QrT4Uik2u^+s5rJDk2u^+s8VoW!<<#[!<<#[!<:s=!<<#[!<<#[ +!<9Cf"TRWak5Y5="TRWak5XQ*!<<#[p&B[,(B<Osk5YJDs5rJDk5XT+s5rJDk5XTDJ`_OGLZ\U: +J,~> +JaVdjrrCmC"T[rjmJm7dmKN[Z!:BjT!8m2I!:BjT!9EPP!:K7Tmd:)ImK<OX!:Bjdme-Y\me-XS +me-YHmJm7dmJm7dmK3IWmK!4R!!)uc!!%iC"9@iimdC&S"RZ6imK!+O"p")Z!:K7TjmE*KrpBad +rpK^bJaWO*rW)udrrE)errE)e!!)ucrW%N;JaS9\rr@Q~> +Ja2LbrrCm?"T[ffl2Uh`l377R!9sRL!8m&E!9sRL!9EDL!:&hLlKSBAl3%+P!9sR`lLk5XlLk4O +lLk5Dl2Uh`l2Uh`l2q%Ol2^eJ!!)u_!!%i?"9@]elK\?K"R5sel2^\G"p!rR!:&hLjlugGrosI` +rp'F^Ja37"rW)u`rrE)arrE)a!!)u_rW%N7Ja/!Trr@Q~> +J`c4ZrrCm;"om`bk5YJ\jp(kJs5s@Ds52rAs5s@Ds5`;Hs5rJDk2u^9jok_Hs5s@\k4\iTk4\hK +k4\i@joGG\joGG\jobYGk5YDB!<<#[!<7l;"TRWak2u[C"Qoaak5Y;?#63iJs5rJDjlQRCroO4\ +roX1ZJ`csorr<#\s8W,]s8W,]!<<#[rr7Q3J`_^Lrr@Q~> +JaVdjrrCpD&HM7e!:K7T!:K7T!:Bgemd:)6mKN[ZmJu\C!9EPN!:BjT!;,[`!:K7Tmd:)Pmf!4\ +mf!3Smf!4MmJm7cmJm7cmK3IWmK!7S!!*#d!!&5N!!)uc!!)uc%fl%c!:BjT!:BjT!:BjT!;u6b +!<2Bd!<2Bd!9NVV!:K7Tmd:&TmJuYTKC8F5s6^!imd:)Cp&K[3JaSE`rr@Q~> +Ja2LbrrCp@&HM+]!:&hL!:&hL!9sOalKSB.l377Rl2^,7!9EDJ!9sRL!;,O\!:&hLlKSBHlM^eX +lM^dOlM^eIl2Uh_l2Uh_l2q%Ol2^hK!!*#`!!&5J!!)u_!!)u_%fkn[!9sRL!9sRL!9sRL!;u*^ +!<26`!<26`!9NJR!:&hLlKS?Ll2^)LKBi.1s69^elKSB7p&K[/Ja/-Xrr@Q~> +J`c4ZrrCp<&c_"Us5rJDs5rJDs5s@]k2u^&jp(kJk5XT+s5`;Fs5s@Ds7GFXs5rJDk2u^@k5PDT +k5PCKk5PDEjoGG[joGG[jobYGk5YGC!<<&\!<88F!<<#[!<<#[&-(eSs5s@Ds5s@Ds5s@Ds8;!Z +s8M-\s8M-\s5iANs5rJDk2u^Dk5XTDKBDn-s5jIak2u^+pA]^+J`_jPrr@Q~> +M=1?CrU'Xcr9aObn*^2UhsLIErpBadrpKdd"muBY!:BjdmJm7VmJm7cmJm7cmK3IWmK!7S!!*#d +!!)*JrW)TY!!*#d!!*#d!!)uc"9@iimK!(N"9@iimJt/m!!)uc!!)uc!!)*J"9@iimJuYB!!)uc +!!)uc!!)l`"p")Z!:K7TrU'XcrU'XcrU'XcT^Dd[rpBadrpBadrU'dgmJm7Tr;cib!!*#d!!)uc +!!)uc!!)-K$NTSpmJm7TmJu\C!.jP<mf!1fmJu\R!!M]imd:)Smf!4`mJm7cmJm7cmJm6<mXaem +mf*9;~> +M<b'?rTX@_r9=7^n*9oQhs(1ArosI`rp'L`"mQ*Q!9sR`l2UhRl2Uh_l2Uh_l2q%Ol2^hK!!*#` +!!)*FrW)TU!!*#`!!*#`!!)u_"9@]el2^YF"9@]el2\`e!!)u_!!)u_!!)*F"9@]el2^5:!!)u_ +!!)u_!!)l\"p!rR!:&hLrTX@_rTX@_rTX@_T]uLWrosI`rosI`rTXLcl2UhLr;ci^!!*#`!!)u_ +!!)u_!!)-G$NTGll2UhLl2^,7!.jD8lM^bbl2^,J!!MQelKSBKlM^e\l2Uh_l2Uh_l2Ug8l@J5e +lMgj7~> +M<=d;rT4([r8mtZn)jWMhrXq=roO4\roX7\"m5jIs5s@\joGGNjoGG[joGG[jobYGk5YGC!<<&\ +!<;-Brr;WQ!<<&\!<<&\!<<#["TRWak5Y8>"TRWak5W?]!<<#[!<<#[!<;-B"TRWak5Xi2!<<#[ +!<<#[!<;oX#63iJs5rJDrT4+[rT4+[rT4+[T]Q7SroO4\roO4\rT47_k5YJDrVulZ!<<&\!<<#[ +!<<#[!<;0C$ifAhk5YJDk5XT+s+0;4k5PA^k5XTBrrhKak2u^Ck5PDXjoGG[joGG[joGF4k(2Z] +k5PF3~> +MXCHErpBpimd:)C!<2Bf!:BjVmf*:FmJm7cmJm7cmem.cmJm7cmJm7VmJm7dmJm7dmK3IWmK!4R +!!)uc!!)9Op&OpV!!)uc!!)uc#lsD]!:K7Tmd:)PmKN[ZmJu\C!5n4)!<2Bd!<2Bd!9EPP!:K7T +md:)BmJm7dmJm7dmJm7^mK<OX!:BjamJm7dmJm7dmJm6YmKN[ZmJu\C!;l0g!:BjT!:Bj7mem.b +mJm7dmJm6=mKEUY!:BjTqZ-Za!!*#d"9@iimK!.P!!*#d!!*#d!!%T<JaSilrr@Q~> +MWt0ArosXelKSB7!<26b!9sRRlMgkBl2Uh_l2Uh_lMU__l2Uh_l2UhRl2Uh`l2Uh`l2q%Ol2^eJ +!!)u_!!)9Kp&OpR!!)u_!!)u_#ls8U!:&hLlKSBHl377Rl2^,7!5n(%!<26`!<26`!9EDL!:&hL +lKSB:l2Uh`l2Uh`l2UhZl3%+P!9sR]l2Uh`l2Uh`l2UgUl377Rl2^,7!;l$c!9sRL!9sR3lMU_^ +l2Uh`l2Ug9l3.1Q!9sRLqZ-Z]!!*#`"9@]el2^_H!!*#`!!*#`!!%T8Ja/Qdrr@Q~> +MWOm=roO@ak2l[+!<2*^!9O:Nk5PG>joGG[joGG[k5G>[joGG[joGGNjoGG\joGG\jobYGk5YDB +!<<#[!<;<GpAasN!<<#[!<<#[$30/Ms5rJDk2u^@jp(kJk5XT+s23t!s8M-\s8M-\s5`;Hs5rJD +k2u^2joGG\joGG\joGGVjok_Hs5s@YjoGG\joGG\joGFQjp(kJk5XT+s81p_s5s@Ds5s@/k5G>Z +joGG\joGF5joteIs5s@Dqu?]Y!<<&\"TRWak5Y>@!<<&\!<<&\!<7W4J``9\rr@Q~> +MXCHErpBgfmK!7S!W_WgrpBadna?DWg$\P6!U]sdmJm7cmJm7]mKN[ZmJu\C!8$Z<!9rnO!<2Bd +!<2Bd!<)<c!<2Bd!<2Bd!5n4/!:K7Tmd:)9mJm7dmJm7dmJm7SmKN[ZmJu\C!;>j[!;Z$e!:K7T +md:(FmK<OX!:Bj_med(7me$SYmJm6?mK*CVmdU;WmK3IWmK!.P"p")Z!:K7TJaS*WQ1"YPJ,~> +MWt0ArosObl2^hK!W_KcrosI`n`p,Sg$882!U9[`l2Uh_l2UhYl377Rl2^,7!8$N8!9rbK!<26` +!<26`!<)0_!<26`!<26`!5n(+!:&hLlKSB1l2Uh`l2Uh`l2UhOl377Rl2^,7!;>^W!;Yma!:&hL +lKSA>l3%+P!9sR[lMLY3lLb/Ul2Ug;l2gtNlL=lSl2q%Ol2^_H"p!rR!:&hLJa.gOQ0SALJ,~> +MWOm=roO7^joGDC!W_?_roO1\n`KiOg#i#.!TsF\joGG[joGGUjp(kJk5XT+s4?E4s68YGs8M-\ +s8M-\s8D'[s8M-\s8M-\s23t's5rJDk2u^)joGG\joGG\joGGKjp(kJk5XT+s7YUSs7td]s5rJD +k2u]6jok_Hs5s@Wk5>8/k4ScQjoGF7joYSFk4/KOjobYGk5Y>@#63iJs5rJDJ`_OGQ0/)HJ,~> +L@,*CmK!7S!W_WgrpBadna?DWeaED:qsFFarpBadrpBadp$Mq_mJuYTfBrbAmJuYTlg=`QrU'Xc +rU'afmd:)RmJm7cmJm7)mK<OX!:BjJmJm7cmJm7cmJm7SmK<OX!:Bj_me-YYmK<OX!:BiUmf!4a +mdpM/mf!4TmJm7cmJm7cmJm6SmJm7dmJm7dmeQq`mf*:dmJm7dmJm7amK<OX!:Bi<mXaejmf*9;~> +L?\g?l2^hK!W_KcrosI`n`p,Sea!,6qs".]rosI`rosI`p$)Y[l2^)LfBNJ=l2^)LlfnHMrTX@_ +rTXIblKSBJl2Uh_l2Uh%l3%+P!9sRFl2Uh_l2Uh_l2UhOl3%+P!9sR[lLk5Ul3%+P!9sQQlM^e] +lLY)+lM^ePl2Uh_l2Uh_l2UgOl2Uh`l2Uh`lM:M\lMgk`l2Uh`l2Uh]l3%+P!9sQ8l@J5blMgj7~> +L?8O;joGDC!W_?_roO1\n`KiOe`Ql2qrRnYroO4\roO4\p#ZDWk5XTDfB*59k5XTDlfJ3IrT4+[ +rT44^k2u^BjoGG[joGG!jok_Hs5s@BjoGG[joGG[joGGKjok_Hs5s@Wk4\iQjok_Hs5s?Mk5PDY +k4J]'k5PDLjoGG[joGG[joGFKjoGG\joGG\k5,,Xk5YJ\joGG\joGGYjok_Hs5s?4k(2ZZk5PF3~> +L[G6Emd:)SmK*CV!<2Bd!:fLQ!8QuF!:BjT!;l0g!:K7Tmd:)Hmf!4<mKN[ZmJu\C!1!!O!5n7( +!;,^Y!;Gp\!1iQO!;u9_!7C3;!:BjT!:T=U!<2Bd!<2Bd!1<0S!<)<g!:K7TmeZtcmJm7cmJm7c +mJm7amf!3;mXaeimf*9;~> +L["sAlKSBKl2gtN!<26`!:f@M!8QiB!9sRL!;l$c!:&hLlKSB@lM^e8l377Rl2^,7!0ujK!5n+$ +!;,RU!;GdX!1iEK!;u-[!7C'7!9sRL!:T1Q!<26`!<26`!1<$O!<)0c!:&hLlMCP_l2Uh_l2Uh_ +l2Uh]lM^d7l@J5alMgj7~> +LZS[=k2l[CjoPPF!<2*\!:f4I!8Q]>s5s@Ds81p_s5rJDk2u^8k5PD4jp(kJk5XT+s-;aGs24!u +s7GIQs7b[Ts./<Gs8;$Ws3]s3s5s@Ds6o(Ms8M-\s8M-\s-VpKs8D'_s5rJDk55/[k5YJ[joGG[ +joGGYk5PC3k(2ZYk5PF3~> +M!b6CrpBadrpBgfmK!7S!!)QWq#K7="p")Z!:K7TqsFRemJuYTp?qVSh!P.BrpBadrpBadRdTkL +bO5'(!U]sdmK3IW!:Kgdr9j7YSaQIWq<eFemJuYTmJt`("p")Z!:K7Tn*UA[md:)CmJr@:o`4[Q +p&K[3JaSlmrr@Q~> +M!=s?rosI`rosObl2^hK!!)QSq#K79"p!rR!:&hLqs":al2^)Lp?M>Oh!+k>rosI`rosI`Rd0SH +bNed$!U9[`l2q%O!:'O`r9EtUSa-1Sq<A.al2^)Ll2];u"p!rR!:&hLn*1)WlKSB7l2Zq2o`4[M +p&K[/Ja/Terr@Q~> +Lun[;roO1\roO7^joGDC!!)QOq#K75#63iJs5rJDqrS%]k5XTDp?))Kgu\V:roO4\roO4\Rca>D +bNANu!TsF\jobYGs5s=\r9!_QS`]qOq;qn]k5XTDk5Wom#63iJs5rJDn)aiSk2u^+k5UP*p&F^I +pA]^+J``<]rr@Q~> +M=(?DrU'XcrpBgfmK!7S!!)QWrrC^>!!*#d!!*#d!!)oarW)KVrW(X>!!)uc!!)uc!!&ARrW'k( +rW)i`!!*#drrE)e!s%cW!;Z'^!1N<Y!:BjT!;l0i!:BgemJm7T!:fIW!<)<c!<)<c!:]CV!<2Bd +!<2Bd!:T=Y!:BjT!0HUP!:K7T!:Kdc!U]sWmf!3;mXaeimf*9;~> +M<Y'@rTX@_rosObl2^hK!!)QSrrC^:!!*#`!!*#`!!)o]rW)KRrW(X:!!)u_!!)u_!!&ANrW'k$ +rW)i\!!*#`rrE)a!s%WO!;YpZ!1N0U!9sRL!;l$e!9sOal2UhL!:f=S!<)0_!<)0_!:]7R!<26` +!<26`!:T1U!9sRL!0HIL!:&hL!:'L_!U9[SlM^d7l@J5alMgj7~> +M<4d<rT4([roO7^joGDC!!)QOrrC^6!<<&\!<<&\!<;rYrr;NNrr:[6!<<#[!<<#[!<8DJrr9mu +rr;lX!<<&\s8W,]"97NGs7tgVs-i'Qs5s@Ds81pas5s@]k5YJDs7,4Os8D'[s8D'[s7#.Ns8M-\ +s8M-\s6o(Qs5s@Ds,c@Hs5rJDs5s:[!TsFOk5PC3k(2ZYk5PF3~> +MXCHEqsFLcmK!7S!W_WgnF$;Vg$Sh?rU'XcrU'[dme-YSmK<OX!:Bi<mcNp?!:BjT!6+@/!:BjT +!;l0h!:K7Tmd:&TrpBadqsFRemJuYTSF-R]md:)CmK!4R!s%`hmf!1gmJuYTna6AWrpBadrpBad +nEp8VrU'XcrU'Xcn*^/TOR</MmdB`JoBl_]mJuYTJaS*WPj\POJ,~> +MWt0Aqs"4_l2^hK!W_KcnEU#Rg$/P;rTX@_rTXC`lLk5Ol3%+P!9sQ8lK7@7!9sRL!6+4+!9sRL +!;l$d!:&hLlKS?LrosI`qs":al2^)LSE^:YlKSB7l2^eJ!s%TdlM^bcl2^)Ln`g)SrosI`rosI` +nEKuRrTX@_rTX@_n*9lPOQllIlK\$BoBHGYl2^)LJa.gOPj88KJ,~> +MWOm=qrRq[joGDC!W_?_nE0`Ng#`;7rT4+[rT4.\k4\iKjok_Hs5s?4k2te/s5s@Ds2F+'s5s@D +s81p`s5rJDk2u^DroO4\qrS%]k5XTDSE:%Uk2u^+k5YDB"97N`k5PA_k5XTDn`BiOroO4\roO4\ +nE'`NrT4+[rT4+[n)jWLOQHWEk2u@:oB$2Uk5XTDJ`_OGPihuGJ,~> +MXLBBrpBadr9aObn*^2UamT-.oBle_md:)CmJqh+kjAWTmd:)CmJt;q"p")Z!:K7TqsOF`"7?0W +!<)<c!<)<i!:K7Tmd:(HmJm7dmJm7dmK*CVmf!4dmKWa[!:K7TmJueF"p")Z!:K7Tf'`53O7!&L +mdC#R!U]sdmJm7cmJm7cmKN[ZmJu\C!.jQhmZm5?!.Y~> +MX(*>rosI`r9=7^n*9oQam/j*oBHM[lKSB7l2ZD#kir?PlKSB7l2\li"p!rR!:&hLqs+.\"6omO +!<)0_!<)0e!:&hLlKSA@l2Uh`l2Uh`l2gtNlM^e`l3@=S!:&hLl2^A>"p!rR!:&hLf';r/O6QcH +lK\<J!U9[`l2Uh_l2Uh_l377Rl2^,7!.jEdlBUZ7!.Y~> +MWXg:roO1\r8mtZn)jWMal`U&oB$8Wk2u^+k5U"pkiN*Lk2u^+k5WKa#63iJs5rJDqr[nX"6TXG +s8D'[s8D'as5rJDk2u]8joGG\joGG\joYSFk5PD\jp1qKs5rJDk5Xu6#63iJs5rJDf&l]+O6-ND +k2uXB!TsF\joGG[joGG[jp(kJk5XT+s+0<`k*>*/!.Y~> +JaVdjrrC40"9@iimJuqJ!!*#d!!*#d!!'.h!!)uc!!)uc!!)0L!!)uc!!)uc!!)KU!!*#d!!*#d +!!(./!!*#d!!*#d!!)oarW)Z[!!*#d!!*#d!s%cW!<)<c!<)<c!3PYh!<)<c!<)<i!:K7Tmd:)M +mJm7cmJm7cmJm7bmK<OX!:Bj7mf!3FmK*CVmf!1hmJm7T!<2Bd!<2Bd!<)<c!<2Bd!<2Bd!.jQh +m[!;@!.Y~> +Ja2LbrrC4,"9@]el2^MB!!*#`!!*#`!!'.d!!)u_!!)u_!!)0H!!)u_!!)u_!!)KQ!!*#`!!*#` +!!(.+!!*#`!!*#`!!)o]rW)ZW!!*#`!!*#`!s%WO!<)0_!<)0_!3PMd!<)0_!<)0e!:&hLlKSBE +l2Uh_l2Uh_l2Uh^l3%+P!9sR3lM^dBl2gtNlM^bdl2UhL!<26`!<26`!<)0_!<26`!<26`!.jEd +lB^`8!.Y~> +J`c4ZrrC4("TRWak5Y,:!<<&\!<<&\!<91`!<<#[!<<#[!<;3D!<<#[!<<#[!<;NM!<<&\!<<&\ +!<:1'!<<&\!<<&\!<;rYrr;]S!<<&\!<<&\"97NGs8D'[s8D'[s/kD`s8D'[s8D'as5rJDk2u^= +joGG[joGG[joGGZjok_Hs5s@/k5PC>joYSFk5PA`k5YJDs8M-\s8M-\s8D'[s8M-\s8M-\s+0<` +k*G00!.Y~> +JaVdjrrC71"p")Z!:K7TqX+dmmd:)C!:K7TmJu\C!3PYh!<2Bd!<2Bd!9EPJ!<2Bd!<2Bd!:T=U +!<)<c!<)<c!6ad1!<)<c!<)<d!:KO\qsFFarU'XcrU'afmd:)SmJm7dmJm6\mK<OX!:Bj\mJm7d +mJm7dmJm7`mf!46mK<OX!:BiImLfNfmJuYT!:K7T!:BjTmJu\C!<)<c!<)<c!<)<c!.jQhm[*AA +!.Y~> +Ja2LbrrC7-"p!rR!:&hLqW\LilKSB7!:&hLl2^,7!3PMd!<26`!<26`!9EDF!<26`!<26`!:T1Q +!<)0_!<)0_!6aX-!<)0_!<)0`!:'7Xqs".]rTX@_rTXIblKSBKl2Uh`l2UgXl3%+P!9sRXl2Uh` +l2Uh`l2Uh\lM^e2l3%+P!9sQEl4O*^l2^)L!:&hL!9sRLl2^,7!<)0_!<)0_!<)0_!.jEdlBgf9 +!.Y~> +J`c4ZrrC7)#63iJs5rJDqW87ek2u^+s5rJDk5XT+s/kD`s8M-\s8M-\s5`;Bs8M-\s8M-\s6o(M +s8D'[s8D'[s3'O)s8D'[s8D'\s5s%TqrRnYrT4+[rT44^k2u^CjoGG\joGFTjok_Hs5s@TjoGG\ +joGG\joGGXk5PD.jok_Hs5s?Ajq@^Vk5XTDs5rJDs5s@Dk5XT+s8D'[s8D'[s8D'[s+0<`k*P61 +!.Y~> +JaVdjrrC:2!!*#d!!*#d!!)l`!!*#d!!*#d!!&tc"p")Z!:K7TipI!Nmd:)CmJs<U!!)uc!!)uc +!!*#drW)3N"p")Z!:K7TTC2[Yo^2n`md:)CmK!4Rp&N\3"p")Z!:K7TNU?cHrpBadrpC!kmd:)C +!:Bi<mXae]mf*9;~> +Ja2LbrrC:.!!*#`!!*#`!!)l\!!*#`!!*#`!!&t_"p!rR!:&hLip$^JlKSB7l2[mM!!)u_!!)u_ +!!*#`rW)3J"p!rR!:&hLTBcCUo]cV\lKSB7l2^eJp&N\/"p!rR!:&hLNTpKDrosI`ros^glKSB7 +!9sQ8l@J5UlMgj7~> +J`c4ZrrC:*!<<&\!<<&\!<;oX!<<&\!<<&\!<9"[#63iJs5rJDioUIFk2u^+k5VLE!<<#[!<<#[ +!<<&\rr;6F#63iJs5rJDTB?.Qo]?AXk2u^+k5YDBpA`_+#63iJs5rJDNTL6@roO4\roOIck2u^+ +s5s?4k(2ZMk5PF3~> +JaVdjrrC=3!!)uc!!)uc!!)l`"p")Z!:K7TVX=QemJuYTi9g^JmJuYTf^8_>rU'XcrU'XcrU'Xc +rU'XcrU'Xcm-XiRrpBadrpBadrpBmhmJuYTl0\ZSmJuYTU@.^Tp[/.amJuYTq!S+]e*[29rpBad +rpBadO6uuJrU'XcrU'^emdC&SJaS*WL@5'AJ,~> +Ja2LbrrC=/!!)u_!!)u_!!)l\"p!rR!:&hLVWn9al2^)Li9CFFl2^)Lf]iG:rTX@_rTX@_rTX@_ +rTX@_rTX@_m-4QNrosI`rosI`rosUdl2^)Ll08BOl2^)LU?_FPpZ_k]l2^)Lq!.hYe*6o5rosI` +rosI`O6Q]FrTX@_rTXFalK\?KJa.gOL?ed=J,~> +J`c4ZrrC=+!<<#[!<<#[!<;oX#63iJs5rJDVWJ$]k5XTDi8t1Bk5XTDf]E26rT4+[rT4+[rT4+[ +rT4+[rT4+[m,e<JroO4\roO4\roO@`k5XTDl/i-Kk5XTDU?;1LpZ;VYk5XTDpu_SUe)gZ1roO4\ +roO4\O6-HBrT4+[rT41]k2u[CJ`_OGL?AL9J,~> +JaVdjrrBXu"9@iimJuG<!!)uc!!)uc!!(./rW(gCrW(O;!!*#d!!*#d!!)oa!!*#d!!*#d!!)<P +&ch@f!:K7TmJuYTmd:)CmJuYTlgF`Pg$Sh?rU'XcrU'Xcd-gl5o'ZJWq!J7bmJuYTea<D;rU'Xc +rU'Xcj6lX@YjV2bJaS*WMXLKEJ,~> +Ja2LbrrBXq"9@]el2^#4!!)u_!!)u_!!(.+rW(g?rW(O7!!*#`!!*#`!!)o]!!*#`!!*#`!!)<L +&ch4^!:&hLl2^)LlKSB7l2^)Llg"HLg$/P;rTX@_rTX@_d-CT1o'62Sq!%t^l2^)Le`m,7rTX@_ +rTX@_j6H=<Yj1o^Ja.gOMX(3AJ,~> +J`c4ZrrBXm"TRWak5XW,!<<#[!<<#[!<:1'rr:j;rr:R3!<<&\!<<&\!<;rY!<<&\!<<&\!<;?H +'*%+Vs5rJDk5XTDk2u^+k5XTDlfS3Hg#`;7rT4+[rT4+[d,t?-o&frOpuV_Zk5XTDe`Hl3rT4+[ +rT4+[j6$(8YibZZJ`_OGMWXp=J,~> +JaVdjrrBUtrW)'J!!*#d!!*#d!!(72p&O7Cp&Ne6"p")Z!:K7Tq<eFemd:)CmJuJ="9@iimK!7S +!!*#d!!*#d!!)HTp&Nn9!!*#d!!*#d!!(C6"9@iimK!"Lp&P'Z"p")Z!:K7To^2\ZrU'XcrU'Xc +`U3a+q!J.^XR?&fJaS*WL@5'AJ,~> +Ja2LbrrBUprW)'F!!*#`!!*#`!!(7.p&O7?p&Ne2"p!rR!:&hLq<A.alKSB7l2^&5"9@]el2^hK +!!*#`!!*#`!!)HPp&Nn5!!*#`!!*#`!!(C2"9@]el2^SDp&P'V"p!rR!:&hLo]cDVrTX@_rTX@_ +`TdF'q!%hZXQocbJa.gOL?ed=J,~> +J`c4ZrrBUlrr;*B!<<&\!<<&\!<::*pAa:;pA`h.#63iJs5rJDq;qn]k2u^+k5XZ-"TRWak5YGC +!<<&\!<<&\!<;KLpA`q1!<<&\!<<&\!<:F."TRWak5Y2<pAb*R#63iJs5rJDo]?/RrT4+[rT4+[ +`T@1#puVSVXQKN^J`_OGL?AL9J,~> +JaVdjrrBb#p&O=E"p")Z!:K7Ta6rp,hX:@CeF!G>mJuYTp[/.amJuYTk3i3KrpC*nmJu\C!:K7T +mJuS@rW(R<"p")Z!:K7Td-_)<md:)CmJunIrW)f_!!*#d!!*#d!!)ZZ!!*#d!!*#d!!'t*!<;i^ +!<91h"9@iimJqh+JaS<]rr@Q~> +Ja2LbrrBatp&O=A"p!rR!:&hLa6NX(hWk(?eER/:l2^)LpZ_k]l2^)Lk3DpGrosgjl2^,7!:&hL +l2^/8rW(R8"p!rR!:&hLd-:f8lKSB7l2^JArW)f[!!*#`!!*#`!!)ZV!!*#`!!*#`!!'t&!!)fZ +!!'.d"9@]el2ZD#Ja/$Urr@Q~> +J`c4ZrrBappAa@=#63iJs5rJDa6*C$hWFh;eE-o6k5XTDpZ;VYk5XTDk2u[CroORfk5XT+s5rJD +k5Xc0rr:U4#63iJs5rJDd,kQ4k2u^+k5Y)9rr;iW!<<&\!<<&\!<;]R!<<&\!<<&\!<:""!<;iV +!<91`"TRWak5U"pJ`_aMrr@Q~> +JaVdjrrBn'!!)uc!W_ZVrW)!H"9@iimJt;q"9@iimJuVA!!)uc!!)uc"p"&kmJuYTeF*;9p$VeZ +l0e6Fs6^!imJuYTl0\ZSmJuYTkO&<MrU'XcrU'Xcr9a^gmJuYT!<)<c!<)<c!8HoA!<2Bd!<2Bd +!;>g`!:BjT!;u6b!<)<c!<)<c!;,[`!:K7Tmd:(mmK!:^mK!9imKN[ZmJu\C!.jQhmYL<2!.Y~> +Ja2LbrrBn#!!)u_!W_NNrW)!D"9@]el2\li"9@]el2^29!!)u_!!)u_"p!ogl2^)LeE[#5p$2MV +l0@sBs69^el2^)Ll08BOl2^)LkNW$IrTX@_rTX@_r9=Fcl2^)L!<)0_!<)0_!8Hc=!<26`!<26` +!;>[\!9sRL!;u*^!<)0_!<)0_!;,O\!:&hLlKSAel2UhZl2Ugel377Rl2^,7!.jEdlA4a*!.Y~> +J`c4ZrrBmt!<<#[!rqEFrr;$@"TRWak5WKa"TRWak5Xf1!<<#[!<<#[#63ick5XTDeE6c1p#c8R +l/q^>s5jIak5XTDl/i-Kk5XTDkN2dErT4+[rT4+[r8n1_k5XTDs8D'[s8D'[s4cZ9s8M-\s8M-\ +s7YRXs5s@Ds8;!Zs8D'[s8D'[s7GFXs5rJDk2u]]joGGVjoGFajp(kJk5XT+s+0<`k(r1"!.Y~> +JaVdjrrBk&!!*#d"p"&kmJuYTj6lmHa6j-3md:)CmJuVA!!*#d!!*#d#QX8mmd:)CmJtr.p&P'Z +p&P*[!!)ESrW)f_rW)?R!!*#drr<2i!:K7TkO&<MrpBadrpBadqX4=_s6]jerpBadrpBadg[5%A +rU'XcrU'Xcq!J=dmd:)CmK!1Q!!)uc!!)uc!!)ZZ"9@iimJt,l!<;i^!<97j!!*#d!!*#d!!%T< +JaSB_rr@Q~> +Ja2LbrrBk"!!*#`"p!ogl2^)Lj6HUDa6Ej/lKSB7l2^29!!*#`!!*#`#QX,ilKSB7l2]N&p&P'V +p&P*W!!)EOrW)f[rW)?N!!*#`rr<2e!:&hLkNW$IrosI`rosI`qWe%[s69RarosI`rosI`gZeb= +rTX@_rTX@_q!&%`lKSB7l2^bI!!)u_!!)u_!!)ZV"9@]el2\]d!!)fZ!!'4f!!*#`!!*#`!!%T8 +Ja/*Wrr@Q~> +J`c4ZrrBjs!<<&\#63ick5XTDj6$@@a6!U+k2u^+k5Xf1!<<&\!<<&\#lj&ek2u^+k5X,spAb*R +pAb-S!<;HKrr;iWrr;BJ!<<&\s8N5as5rJDkN2dEroO4\roO4\qW@eWs5j=]roO4\roO4\gZAM9 +rT4+[rT4+[puVe\k2u^+k5YAA!<<#[!<<#[!<;]R"TRWak5W<\!<;iV!<97b!<<&\!<<&\!<7W4 +J`_gOrr@Q~> +JaVdjrrBh%$39M^!!)Ee!:K7TkjJ-EbjGH2rpBadrpBadm-Y,Zmd:)CmJuYTrpBadrpBadk3`3L +rU'XcrU'Xcr9jOap$VeZs6]jerpBadmHt/YmJuYTmdBcKnEpV`mJuYTmJuYTmJuG<"p")Z!:K7T +rU0@Zs6]shmd:(qmJm7dmJm7dmJm7bmJm7dmJm7dmJm7Xmf!4&mK!:cmK!:cmK!:#mJm7cmJm7c +mK3IWmK!4R!!)uc!!%T<JaSE`rr@Q~> +Ja2LbrrBh!$39AV!!)9a!:&hLkj%jAbj#0.rosI`rosI`m-4iVlKSB7l2^)LrosI`rosI`k3;pH +rTX@_rTX@_r9F7]p$2MVs69RarosI`mHOlUl2^)LlK\'CnEL>\l2^)Ll2^)Ll2^#4"p!rR!:&hL +rTa(Vs69[dlKSAil2Uh`l2Uh`l2Uh^l2Uh`l2Uh`l2UhTlM^e"l2Uh_l2Uh_l2Ugtl2Uh_l2Uh_ +l2q%Ol2^eJ!!)u_!!%T8Ja/-Xrr@Q~> +J`c4ZrrBgr$NK8Ns8V6]s5rJDkiVU=biSp*roO4\roO4\m,eTRk2u^+k5XTDroO4\roO4\k2l[D +rT4+[rT4+[r9""Yp#c8Rs5j=]roO4\mH+WQk5XTDk2uC;nE()Xk5XTDk5XTDk5XW,#63iJs5rJD +rT<hRs5jF`k2u]ajoGG\joGG\joGGZjoGG\joGG\joGGPk5PCsjoGG[joGG[joGFpjoGG[joGG[ +jobYGk5YDB!<<#[!<7W4J`_jPrr@Q~> +JaVdjrrBe$$39JomJuYTmd:&TrpBadrU'XcmdC&SamK-/rU'XcrU'Xcm-Y&XmJuYTmK!4R!!)uc +!!)0L!!*#d!!*#d!!)rb"9@iimK!"L!<DQe!!M]imd:)BmKN[ZmJu\C!;u9a!:0%W!:K7TmJm7d +mJm7MmK<OX!:Bj^mf!4bmK<OX!:Bj-mJm7cmJm7cmJm7bmKN[ZmJu\C!;5dR!6+@+s7l!^s1Ib" +!<2Bd!<2Bd!.jQhmXag(mf*9;~> +Ja2LbrrBdu$39>kl2^)LlKS?LrosI`rTX@_mcscOam&j+rTX@_rTX@_m-4cTl2^)Ll2^eJ!!)u_ +!!)0H!!*#`!!*#`!!)r^"9@]el2^SD!<DEa!!MQelKSB:l377Rl2^,7!;u-]!:/nS!:&hLl2Uh` +l2UhIl3%+P!9sRZlM^e^l3%+P!9sR)l2Uh_l2Uh_l2Uh^l377Rl2^,7!;5XN!6+4'!;PgZ!5.Rs +!<26`!<26`!.jEdl@J6ulMgj7~> +J`c4ZrrBdq$NK8gk5XTDk2u^DroO4\rT4+[mcONKalWU'rT4+[rT4+[m,eNPk5XTDk5YDB!<<#[ +!<;3D!<<&\!<<&\!<;uZ"TRWak5Y2<!WV<]rrhKak2u^2jp(kJk5XT+s8;$Ys6JeOs5rJDk5YJ\ +joGGEjok_Hs5s@Vk5PDZjok_Hs5s@%joGG[joGG[joGGZjp(kJk5XT+s7POJs2F+#s7k^Vs1IIo +s8M-\s8M-\s+0<`k(2[mk5PF3~> +JaVdjrrBb#rW)ud!!*#drrE)e!!*#d!!)HT"9@iimJs6SrW(U="p")Z!:K7Tr9aahmd:)CmK!(N +"9@lX!:Kgd!U]sTmJm7dmJm7dmJm7dmK<OX!:BjQmK<OX!:BjGmf!4]mK<OX!:Bjcmf!3omK<OX +!:BjVmf!4CmJm7cmJm7cmJm7UmK!:^mK!:!mKN[ZmJu\C!.jQhmXag'mf*9;~> +Ja2LbrrBatrW)u`!!*#`rrE)a!!*#`!!)HP"9@]el2[gKrW(U9"p!rR!:&hLr9=IdlKSB7l2^YF +"9@`P!:'O`!U9[Pl2Uh`l2Uh`l2Uh`l3%+P!9sRMl3%+P!9sRClM^eYl3%+P!9sR_lM^dkl3%+P +!9sRRlM^e?l2Uh_l2Uh_l2UhQl2UhZl2Ugrl377Rl2^,7!.jEdl@J6tlMgj7~> +J`c4ZrrBaprr<#\!<<&\s8W,]!<<&\!<;KL"TRWak5VFCrr:X5#63iJs5rJDr8n4`k2u^+k5Y8> +"TRWHs5s=\!TsFLjoGG\joGG\joGG\jok_Hs5s@Ijok_Hs5s@?k5PDUjok_Hs5s@[k5PCgjok_H +s5s@Nk5PD;joGG[joGG[joGGMjoGGVjoGFnjp(kJk5XT+s+0<`k(2[lk5PF3~> +JaVdjrrBn'p&P*["p")Z!:K7Tmd:>\md:)CmJuYTrU'Xc[I3_gg[51EmJuYTr9aObrpBadrpBad +qsFFarpBgfmdC&SmHsrSrU'XcrU'pkmJu\C!:K7TlgF`PjR2^ArU'ghmd:)Cme-Xjmf!4UmK<OX +!:BjDmJm7dmJm7dmJm7TmK!:^mK!9umK<OX!:Bi<mXaeWmeZAO!.Y~> +Ja2LbrrBn#p&P*W"p!rR!:&hLmck&XlKSB7l2^)LrTX@_[HdGcgZenAl2^)Lr9=7^rosI`rosI` +qs".]rosOblK\?KmHOZOrTX@_rTXXgl2^,7!:&hLlg"HLjQcF=rTXOdlKSB7lLk4flM^eQl3%+P +!9sR@l2Uh`l2Uh`l2UhPl2UhZl2Ugql3%+P!9sQ8l@J5OlMBfG!.Y~> +J`c4ZrrBmtpAb-S#63iJs5rJDmcFfTk2u^+k5XTDrT4+[[H@2_gZAY=k5XTDr8n"ZroO4\roO4\ +qrRnYroO:^k2u[CmH+EKrT4+[rT4Cck5XT+s5rJDlfS3HjQ?19rT4:`k2u^+k4\hbk5PDMjok_H +s5s@<joGG\joGG\joGGLjoGGVjoGFmjok_Hs5s?4k(2ZGk5+6?!.Y~> +JaVdjrrBb#rW)c^"9@iimJu\C!!*#drrE)errE&d!!'7krW)ob!!)uc!!)uc!!)-KrW)la!!)uc +!!)uc!!)uc!!*#dp&O:DrrE&d!!*#drrDTWp&O1ArW)f_!!*#d!!*#d!W_ZVrW'Irp&OdR"p")Z +!:K7ThX1RJmd:)CmJuYB!<;i^!<9UtrW%N;JaS*Wq<n7_J,~> +Ja2LbrrBatrW)cZ"9@]el2^8;!!*#`rrE)arrE&`!!'7grW)o^!!)u_!!)u_!!)-GrW)l]!!)u_ +!!)u_!!)u_!!*#`p&O:@rrE&`!!*#`rrDTSp&O1=rW)f[!!*#`!!*#`!W_NNrW'Inp&OdN"p!rR +!:&hLhWb:FlKSB7l2^5:!!)fZ!!'RprW%N7Ja.gOq<It[J,~> +J`c4ZrrBaprr;fV"TRWak5Xl3!<<&\s8W,]s8W)\!<9:crr;rZ!<<#[!<<#[!<;0Crr;oY!<<#[ +!<<#[!<<#[!<<&\pAa=<s8W)\!<<&\s8VWOpAa49rr;iW!<<&\!<<&\!rqEFrr9LjpAagJ#63iJ +s5rJDhW>%Bk2u^+k5Xi2!<;iV!<9Ulrr7Q3J`_OGq<%\WJ,~> +JaVdjrrBe$"9@iimK!(NrW)BS!!)uc#QX8mmd:)CmJsKZ"9@iimK!4R!!*#d!!*#d!!)6Np&O@F +rW)!HrrE&d!!*#drrDHSrW(pF"9@iimK!1Q!!)uc!!)ucrr</h!:Bipmf!4WmJm7dmJm7dmJm7D +mK<OX!:BjRme6[ome-X3mXaeWmeuSR!.Y~> +Ja2LbrrBdu"9@]el2^YFrW)BO!!)u_#QX,ilKSB7l2\'R"9@]el2^eJ!!*#`!!*#`!!)6Jp&O@B +rW)!DrrE&`!!*#`rrDHOrW(pB"9@]el2^bI!!)u_!!)u_rr</d!9sQllM^eSl2Uh`l2Uh`l2Uh@ +l3%+P!9sRNlLk4klLk4/l@J5OlM^#J!.Y~> +J`c4ZrrBdq"TRWak5Y8>rr;EK!<<#[#lj&ek2u^+k5V[J"TRWak5YDB!<<&\!<<&\!<;9FpAaC> +rr;$@s8W)\!<<&\s8VKKrr:s>"TRWak5YAA!<<#[!<<#[s8N2`s5s?hk5PDOjoGG\joGG\joGG< +jok_Hs5s@Jk4\hgk4\h+k(2ZGk5FHB!.Y~> +JaVdjrrBh%"p")Z!:BgerpKI[o'QJXrU'mjmd:)C!:BikmKN[ZmJu\C!<)<i!:K7Tmd:)8mf!4K +mK<OX!:BjHmKN[ZmJu\C!:9+V!:BjT!9<JO!:K7Tmd:)HmKN[ZmJu\C!4VA!!:BjT!;,[Z!<)<c +!<)<c!8d/C!28f\!<)<c!<2Ec!.jQhmXag%mf*9;~> +Ja2LbrrBh!"p!rR!9sOarp'1Wo'-2TrTXUflKSB7!9sQgl377Rl2^,7!<)0e!:&hLlKSB0lM^eG +l3%+P!9sRDl377Rl2^,7!:8tR!9sRL!9<>K!:&hLlKSB@l377Rl2^,7!4V4r!9sRL!;,OV!<)0_ +!<)0_!8d#?!28ZX!<)0_!<29_!.jEdl@J6rlMgj7~> +J`c4ZrrBgr#63iJs5s@]roWqSo&]rPrT4@bk2u^+s5s?cjp(kJk5XT+s8D'as5rJDk2u^(k5PDC +jok_Hs5s@@jp(kJk5XT+s6SkNs5s@Ds5W5Gs5rJDk2u^8jp(kJk5XT+s0q+ns5s@Ds7GFRs8D'[ +s8D'[s5)o;s.SQTs8D'[s8M0[s+0<`k(2[jk5PF3~> +JaVdjrrBk&$39JomJuYTmJuYTrU0XbmHsrSrpBadrpKacYjMJkrpBadrpBadrU'dgmJuYTrU'Xc +rU'XcmHt)WmJuYToBlSYrU'XcrU0[cs6]shmd:)7mK<OX!:BjRmKN[ZmJuYT!<2Bd!9rnS!:K7T +!<2Bd!<)<c!;c*`!<2Bd!<2Bd!4hM%!:K7Tmd:(ume-YUme6[jmJm7dmK*CVmf!1emJqh+JaS*W +qX4@`J,~> +Ja2LbrrBk"$39>kl2^)Ll2^)LrTa@^mHOZOrosI`rp'I_Yj)2grosI`rosI`rTXLcl2^)LrTX@_ +rTX@_mHOfSl2^)LoBH;UrTX@_rTaC_s69[dlKSB/l3%+P!9sRNl377Rl2^)L!<26`!9rbO!:&hL +!<26`!<)0_!;bs\!<26`!<26`!4hA!!:&hLlKSAmlLk5QlLk4fl2Uh`l2gtNlM^bal2ZD#Ja.gO +qWe(\J,~> +J`c4ZrrBjs$NK8gk5XTDk5XTDrT=+ZmH+EKroO4\roX4[YiYrcroO4\roO4\rT47_k5XTDrT4+[ +rT4+[mH+QOk5XTDoB$&QrT4+[rT=.[s5jF`k2u^'jok_Hs5s@Jjp(kJk5XTDs8M-\s68YKs5rJD +s8M-\s8D'[s8(jXs8M-\s8M-\s1.7rs5rJDk2u]ek4\iMk4\hbjoGG\joYSFk5PA]k5U"pJ`_OG +qW@eXJ,~> +JaVdjrrBn'!!*#drr<2i!:K7TrU'dgmJuYTmHt#UmdBcK[I+"prU'XcrU'XcrU0Xb!U]semJm7d +mJm7SmKN[ZmJu\C!;#UY!<2Bd!<2Ed!<2Bd!<2Bd!93GG!:9+\!:BjT!:BjT!:BjOmJm7cmJm7d +mf*:emJm7`mJm7cmJm7cmJm7HmJm7cmJm7cmJm7KmJm7dmJm7dmJm7.mf!4YmK!:^mK!9rmL'$_ +mJuYT!:BjTmJqh+JaS*WqsOIaJ,~> +Ja2LbrrBn#!!*#`rr<2e!:&hLrTXLcl2^)LmHO`QlK\'C[H[_lrTX@_rTX@_rTa@^!U9[al2Uh` +l2UhOl377Rl2^,7!;#IU!<26`!<29`!<26`!<26`!93;C!:8tX!9sRL!9sRL!9sRKl2Uh_l2Uh` +lMgkal2Uh\l2Uh_l2Uh_l2UhDl2Uh_l2Uh_l2UhGl2Uh`l2Uh`l2Uh*lM^eUl2UhZl2Ugnl3dUW +l2^)L!9sRLl2ZD#Ja.gOqs+1]J,~> +J`c4ZrrBmt!<<&\s8N5as5rJDrT47_k5XTDmH+KMk2uC;[H7JhrT4+[rT4+[rT=+Z!TsF]joGG\ +joGGKjp(kJk5XT+s7>@Qs8M-\s8M0\s8M-\s8M-\s5N2?s6SkTs5s@Ds5s@Ds5s@GjoGG[joGG\ +k5YJ]joGGXjoGG[joGG[joGG@joGG[joGG[joGGCjoGG\joGG\joGG&k5PDQjoGGVjoGFjjpV4O +k5XTDs5s@Dk5U"pJ`_OGqr[nYJ,~> +JaVdjrrD$G!!)uc!!)uc!!)3M"9@iimK!4R"p")Z!:K7TmHt,XmJuYTmf!3`me-V`mJuYT!<2Bd +!:fIW!<2Bd!<2Bd!;#U`!:K7Tmd:&TrU'XcrU'XckO/$Dna6AWrpKdd"RZ9XmJu87"p")Z!:K7T +dI%ABmd:)C!:BjTmJm7KmJm7cmJm7cmJm70mK<OX!:Bj[mK!:^mK!9qmK!=UrW)ud!!*#drrDTW +!!)uc!!)uc!!%T<JaSonrr@Q~> +Ja2LbrrD$C!!)u_!!)u_!!)3I"9@]el2^eJ"p!rR!:&hLmHOiTl2^)LlM^d\lLk2\l2^)L!<26` +!:f=S!<26`!<26`!;#I\!:&hLlKS?LrTX@_rTX@_kN_a@n`g)Srp'L`"R6!Pl2]i/"p!rR!:&hL +dHV)>lKSB7!9sRLl2UhGl2Uh_l2Uh_l2Uh,l3%+P!9sRWl2UhZl2Ugml2^nMrW)u`!!*#`rrDTS +!!)u_!!)u_!!%T8Ja/Wfrr@Q~> +J`c4ZrrD$?!<<#[!<<#[!<;6E"TRWak5YDB#63iJs5rJDmH+TPk5XTDk5PCXk4\fXk5XTDs8M-\ +s7,4Os8M-\s8M-\s7>@Xs5rJDk2u^DrT4+[rT4+[kN;L<n`BiOroX7\"QoaHk5XH'#63iJs5rJD +dH1i:k2u^+s5s@Dk5YJCjoGG[joGG[joGG(jok_Hs5s@SjoGGVjoGFijoPMErr<#\!<<&\s8VWO +!<<#[!<<#[!<7W4J``?^rr@Q~> +JaVdjrrD!F!!*#d!!*#d!!)-KrW)ob!!*#d!!*#d!!)ESrW!,i!:BjT!2Ju]!<2Bh!:BjT!<2Bd +!:fIW!<)<c!<)<c!;#U]!:BjT!8$Z<!9ihR!:BjT!9!8J!:BjT!71'>!:K7T!:BjT!!)TX!!)uc +!!*#drrE&d!!)uc!!(%,"p")Z!:K7Tp?hq\q!J.^[I4"orpBadrpKddnEp8VrpBadrpBadJaS*W +QgXkRJ,~> +Ja2LbrrD!B!!*#`!!*#`!!)-GrW)o^!!*#`!!*#`!!)EOrW!,e!9sRL!2JiY!<26d!9sRL!<26` +!:f=S!<)0_!<)0_!;#IY!9sRL!8$N8!9i\N!9sRL!9!,F!9sRL!70p:!:&hL!9sRL!!)TT!!)u_ +!!*#`rrE&`!!)u_!!(%("p!rR!:&hLp?DVXq!%hZ[Hd_krosI`rp'L`nEKuRrosI`rosI`Ja.gO +Qg4SNJ,~> +J`c4ZrrD!>!<<&\!<<&\!<;0Crr;rZ!<<&\!<<&\!<;HKrr3/as5s@Ds.e`Us8M-`s5s@Ds8M-\ +s7,4Os8D'[s8D'[s7>@Us5s@Ds4?E4s6/SJs5s@Ds5<#Bs5s@Ds3Kg6s5rJDs5s@Ds8VZP!<<#[ +!<<&\s8W)\!<<#[!<:($#63iJs5rJDp>uATpuVSV[H@JgroO4\roX7\nE'`NroO4\roO4\J`_OG +Qfe;JJ,~> +JaVdjrrCsE"p")Z!:K7TqsFFarU'XcrU'Xcq<mqV$17f]mJuYTmd:)Gme-Y\mJm6`mK<OX!:Bjd +mem.cmJm7<mf!4<mK<OX!:BjNmf!4Cmf!42mK<OXmJu\S!:]CV!<2Bd!<2Ed!<2Bd!<2Bd!64F, +!<2Bd!<2Bd!;Gm]s7l!^s1.Rk!<;He!:B1Y!:K7Tmd:(+mXaelmf*9;~> +Ja2LbrrCsA"p!rR!:&hLqs".]rTX@_rTX@_q<IYR$0hNUl2^)LlKSB?lLk5Xl2Ug\l3%+P!9sR` +lMU__l2Uh8lM^e8l3%+P!9sRJlM^e?lM^e.l3%+Pl2^,K!:]7R!<26`!<29`!<26`!<26`!64:( +!<26`!<26`!;GaY!;PgZ!4hCg!<;<a!:B%U!:&hLlKSA#l@J5dlMgj7~> +J`c4ZrrCs=#63iJs5rJDqrRnYrT4+[rT4+[q<%DN$0M9Mk5XTDk2u^7k4\iTjoGFXjok_Hs5s@\ +k5G>[joGG4k5PD4jok_Hs5s@Fk5PD;k5PD*jok_Hk5XTCs7#.Ns8M-\s8M0\s8M-\s8M-\s2O1$ +s8M-\s8M-\s7bXUs7k^Vs1.:cs8V3]s6\qQs5rJDk2u\pk(2Z\k5PF3~> +JaVdjrrCpD"9@iimK!(N!!*#d!!*#d!!)ZZrVuue!<2Bd!<2Bd!:B1U!:K:S!<;Ke!<2Bd!2o5f +!:K7Tme-Y7me-Y9mKN[ZmJu\C!:B4J!9W_C!7:-7!:Kdcmd:Vdmd:)CmJu\C!:K7Tmd:)Ci;`$/ +!!)uc!!)uc!!)f^!<<#c!<<#c!<9Ipqu?ie!:BjcmJm7VmK<OX!:Bi<mXaekmf*9;~> +Ja2LbrrCp@"9@]el2^YF!!*#`!!*#`!!)ZVrVuua!<26`!<26`!:B%Q!:&kK!<;?a!<26`!2o)b +!:&hLlLk53lLk55l377Rl2^,7!:B(F!9WS?!7:!3!:'L_mck>`lKSB7l2^,7!:&hLlKSB7huN!+ +!!)u_!!)u_!!)fZ!!)u_!!)u_!!'Flqu?ia!9sR_l2UhRl3%+P!9sQ8l@J5clMgj7~> +J`c4ZrrCp<"TRWak5Y8>!<<&\!<<&\!<;]Rrr3#]s8M-\s8M-\s6\qMs5rJCs8V6]s8M-\s/4u^ +s5rJDk4\i/k4\i1jp(kJk5XT+s6\tBs5rJ;s3Tm/s5s:[mcG)\k2u^+k5XT+s5rJDk2u^+i;`$' +!<<#[!<<#[!<;iV!<<#[!<<#[!<9Ihr;Ql]s5s@[joGGNjok_Hs5s?4k(2Z[k5PF3~> +JaVdjrrCmCrW)]\"p")Z!:K7To^3+fmJuYTmJu\C!:K7TlgFcQ#4;KZ!!)EerU'XcamK-/rU'Xc +rU'Xcm-XiRrpBadrpBdemed(7mf!4>mJm7dmJm7dmJm7Pmf!4Cmf!47mZRV@mK!:^mK!9qmK3IW +!:K^arpBadmdC&SJaS*WPj\POJ,~> +Ja2LbrrCm?rW)]X"p!rR!:&hLo]chbl2^)Ll2^,7!:&hLlg"KM#3l3R!!)9arTX@_am&j+rTX@_ +rTX@_m-4QNrosI`rosLalMLY3lM^e:l2Uh`l2Uh`l2UhLlM^e?lM^e3lB2/<l2UhZl2Ugml2q%O +!:'F]rosI`mcscOJa.gOPj88KJ,~> +J`c4ZrrCm;rr;`T#63iJs5rJDo]?S^k5XTDk5XT+s5rJDlfS6I#3PsJs8V6]rT4+[alWU'rT4+[ +rT4+[m,e<JroO4\roO7]k5>8/k5PD6joGG\joGG\joGGHk5PD;k5PD/k*#c8joGGVjoGFijobYG +s5s4YroO4\mcONKJ`_OGPihuGJ,~> +JaVdjrrD$Gp&P'Z$39M^!:BjT!:K7Tp[/Fimd:)CmJuYTmJuYTlL+ZP"RZ9X!!'k'!!*#d!!*#d +!!)BR!!)uc!!*#dp&Ne6"9@iimJu#0!!)uc!!)uc!!)BR"9@iimJu25"9@iimJu\CJcFd1r9aRb +\*a:tmdBcKrpBadrU'XcrU'^emdBcKJaS*WR-stSJ,~> +Ja2LbrrD$Cp&P'V$39AV!9sRL!:&hLpZ`.elKSB7l2^)Ll2^)LlK\BL"R6!P!!'k#!!*#`!!*#` +!!)BN!!)u_!!*#`p&Ne2"9@]el2]T(!!)u_!!)u_!!)BN"9@]el2]c-"9@]el2^8;JH4^1r9=7^ +\*="plK\'CrosI`rTX@_rTXFalK\'CJa.gOR-O\OJ,~> +J`c4ZrrD$?pAb*R$NK8Ns5s@Ds5rJDpZ;nak2u^+k5XTDk5XTDlK8-H"QoaHs8Tpt!<<&\!<<&\ +!<;EJ!<<#[!<<&\pA`h."TRWak5X2u!<<#[!<<#[!<;EJ"TRWak5XB%"TRWak5Xl3JcFd1r8n"Z +\)mblk2uC;roO4\rT4+[rT41]k2uC;J`_OGR-+DKJ,~> +JaVdjrrCmCrW)`]!W_ZVrW)ud!!)c]!!*#d!!*#d!<DQe!:&tR!:K:S!<;He!5\(-!:K7Tmd:)F +mJm7cmJm7cmJm7cmK*CVmem.:mKEUYmJu\Chu<`F!;l0a!<)<c!<)<c!:fIY!:K9+s.TJ&mJm7d +mJm7dmem+dmK!1Q!!*#d!!*#d!!)l`rW%N;JaScjrr@Q~> +Ja2LbrrCm?rW)`Y!W_NNrW)u`!!)cY!!*#`!!*#`!<DEa!:&hN!:&kK!<;<a!5[q)!:&hLlKSB> +l2Uh_l2Uh_l2Uh_l2gtNlMU_6l3.1Ql2^,7hZ*]B!;l$]!<)0_!<)0_!:f=U!:&j#!20D&l2Uh` +l2Uh`lMU\`l2^bI!!*#`!!*#`!!)l\rW%N7Ja/Kbrr@Q~> +J`c4ZrrCm;rr;cU!rqEFrr<#\!<;fU!<<&\!<<&\!WV<]s6A_Js5rJCs8V3]s2!h%s5rJDk2u^6 +joGG[joGG[joGG[joYSFk5G>2joteIk5XT+hu<`>s81pYs8D'[s8D'[s7,4Qs5rHps.TJ&joGG\ +joGG\k5G;\k5YAA!<<&\!<<&\!<;oXrr7Q3J``3Zrr@Q~> +JaVdjrrCpD"9@iimK!+Op&OpV!!)uc!<DQ]!:T@L!5\(+!:BjT!:T=U!<2Bd!<2Bd!<)<c!<2Bh +!:BjT!;5c2s+13Xs1.Ot!<)<g!:K7Tmem.^mKN[ZmJu\C!;c*d!:BjT!.jQhmZm5?!.Y~> +Ja2LbrrCp@"9@]el2^\Gp&OpR!!)u_!<DEY!:T4H!5[q'!9sRL!:T1Q!<26`!<26`!<)0_!<26d +!9sRL!;5W.!.b-X!4h@p!<)0c!:&hLlMU_Zl377Rl2^,7!;bs`!9sRL!.jEdlBUZ7!.Y~> +J`c4ZrrCp<"TRWak5Y;?pAasN!<<#[!WV<Us6o+Ds2!h#s5s@Ds6o(Ms8M-\s8M-\s8D'[s8M-` +s5s@Ds7PN*s+13Xs1.7ls8D'_s5rJDk5G>Vjp(kJk5XT+s8(j\s5s@Ds+0<`k*>*/!.Y~> +JaVjl"T[rj!:BjcmJm7LmKN[ZmJuYT!<2Bd!<)?_!;Ps^!<)<c!<)<e!:K:S!9`eL!5.b!!:B1Y +!:K7Tmd:)RmK*CVmXbChs.]P#mK!=Up&P'Z"9@iimK!+O"T[uY!:K:Ks+0Thm\'"J!.Y~> +Ja2Rd"T[ff!9sR_l2UhHl377Rl2^)L!<26`!<)3[!;PgZ!<)0_!<)0a!:&kK!9`YH!5.Ur!:B%U +!:&hLlKSBJl2gtNl@Aqd!29J#l2^nMp&P'V"9@]el2^\G"T[iQ!:&kC!.jEdlCdGB!.Y~> +J`c:\"om]b!9X=[joGGDjp(kJk5XTDs8M-\s8D*Ws7k^Vs8D'[s8D']s5rJCs6&PDs1ILns6\qQ +s5rJDk2u^BjoYSFk(3P`s.]P#joPMEpAb*R"TRWak5Y;?"om`Is5rJ;s+0<`k+Ll:!.Y~> +JaVgkrVuue!<2Bd!9W\L!<2Bk!:K7T!:K7TrpBdemed(ZmJm7dmJm7dmKWa[mJuYTmJuM>"9@ii +mJt>rJcC<$JcG?AZL.\mrpK[aq<n4^qX+=`rpBmhmdC)Tq<e7_JaS*WT^Mg[J,~> +Ja2OcrVuua!<26`!9WPH!<26g!:&hL!:&hLrosLalMLYVl2Uh`l2Uh`l3@=Sl2^)Ll2^)6"9@]e +l2\ojJH16$JH59AZK_Dirp'C]q<IqZqW\%\rosUdlKS?Lq<@q[Ja.gOT^)OWJ,~> +J`c7["TJH%k5YGC!<;3D!<<&\#QNrKs8V6Ds8M-]s5s7ZpZ;JUroO4\roOIck2u^+s5s@Gjok_H +s5s@&k(3P`s+14As0Cbes8M0Ys7tgVs8(jXs8M-`s5rJDs7tdWs+0<`k+Ll:!.Y~> +JaVdjrr<2i!:K7Tk3`3LrU'XcrpKdd"7?0Wme-YVmLK<cmJu\C!:K7Tmd:)CmJutKJcC<$JcD_L +ZgJ"tmJu\C!:KdcrpKI[s6]jerU'ghmdC,C!;c*`s+0Thm\'"J!.Y~> +Ja2Lbrr<2e!:&hLk3;pHrTX@_rp'L`"6omOlLk5Rl43m[l2^,7!:&hLlKSB7l2^PCJH16$JH2YL +Zg%_pl2^,7!:'L_rp'1Ws69RarTXOdlKSB7!;bs\!.jEdlCdGB!.Y~> +J`c4Z#6+\cs5rJDk2l[DrT4+[roX7\"6TXGk4\iNjq%LSk5XT+s5rJDk2u^+k5Y/;JcC<$JcD_L +ZfVJlk5XT+s5s:[roWqSs5j=]rT4:`k2u^+s8(jXs+0<`k+Ll:!.Y~> +JaVjlJcC<$JcC<$aT&L4rW!)h!:K7TqX4=_oBlVYq!J.^JaS*WT^Mg[J,~> +Ja2RdJH16$JH16$a8iI0rW!)d!:&hLqWe%[oBH;Uq!%hZJa.gOT^)OWJ,~> +J`c:\JcC<$JcC<$aT&L,rr3,`s5rJDqW@eWoB$&QpuVSVJ`_OGT]Z7SJ,~> +JaVjlJcC<$JcC<$aT&L4quH`a!!)rb"9@iimK!4R!!)uc!!*#d!WN/qmK!9<mXaf!mf*9;~> +Ja2RdJH16$JH16$a8iI0quH`]!!)r^"9@]el2^eJ!!)u_!!*#`rrDl[!!%T8Ja/onrr@Q~> +J`c:\JcC<$JcC<$aT&L,r;ZcY!<;uZ"TRWak5YDB!<<#[!<<&\s8VoW!<7W4J``Wfrr@Q~> +JaVjlJcC<$JcC<$\,XD7p&G-]!<2Bj!:K7Tmd:)RmJm7dmJm7dmK!:cmK!:cmK!9<mXaf!mf*9;~> +Ja2RdJH16$JH16$[fFA3p&G-Y!<26f!:&hLlKSBJl2Uh`l2Uh`l2Uh_l2Uh_l2Ug8l@J5nlMgj7~> +J`c:\JcC<$JcC<$\,XD/pAY0Us8M-bs5rJDk2u^BjoGG\joGG\joGG[joGG[joGF4k(2Zfk5PF3~> +JaVmmJcC<$JcD#8s6^'kmd:)CmK!7SRfCn*rW)c^!!*#d!!*#d!!)uc#6=2[!:K7Ts7l!^s+0Th +m\'"J!.Y~> +Ja2UeJH16$JH1r8s69dglKSB7l2^hKRK1k&rW)cZ!!*#`!!*#`!!)u_#6=&S!:&hL!;PgZ!.jEd +lCdGB!.Y~> +J`c=]JcC<$JcD#8s5jOck2u^+k5YGCRfCn"rr;fV!<<&\!<<&\!<<#[#QNrKs5rJDs7k^Vs+0<` +k+Ll:!.Y~> +JaVmmJcC<$JcE^ho`4LL"9@iimJuhG!!*#d!!*#d!!)`\"p")Z!:K7To'WUZipHpLmJuYTqsFFa +rU'XcrU'XcrU'jimJuYTmf3(M!<7W<JaT3!rr@Q~> +Ja2UeJH16$JH34\nEL,Vl2^)Lo'-2TrosI`rosI`p?Dh^lKSB7l2^D?X8q8F"9@]el2^_H!!)u_ +!!)u_!!)u_"p!ogl2^)Lq!%hZJa.gOT^)OWJ,~> +J`c=]JcC<$JcE:\nE'lRk5XTDo&]rProO4\roO4\p>uSZk2u^+k5Y#7XT.;B"TRWak5Y>@!<<#[ +!<<#[!<<#[#63ick5XTDpuVSVJ`_OGT]Z7SJ,~> +JaVmmJcC<$JcFX-kjJEMrpKaclgF`Po'QJXrU'XcrU'Xcp?i%`mJuYTh<qKHo^2n`md:)CmJuVA +rW)ud!<;i^!<7W<JaT3!rr@Q~> +Ja2UeJH16$JH4R-kj&-Irp'I_lg"HLo'-2TrTX@_rTX@_p?Db\l2^)Lh<M0Do]cV\lKSB7l2^29 +rW)u`!!)fZ!!%T8Ja/onrr@Q~> +J`c=]JcC<$JcFX-kiVmEroX4[lfS3Ho&]rPrT4+[rT4+[p>uMXk5XTDh<(p@o]?AXk2u^+k5Xf1 +rr<#\!<;iV!<7W4J``Wfrr@Q~> +JaVmmJcC<$jSoJQ!:K7Tmd:)Pm`,8.!:BikmKrs^!:BjT!:BjT!:]FM!8m5D!7:06rrDJRs7u]r +rrDl_!<7W<JaT3!rr@Q~> +Ja2UeJH16$j8]GM!:&hLlKSBHlGW`(l2\'R$39>kl2^)Ll2^)LnET]Ihs11@d-CW2!:#REq<@q[ +Ja.gOT^)OWJ,~> +J`c=]JcC<$jSoJIs5rJDk2u^@k/I?$k5V[J$NK8gk5XTDk5XTDnE0HEhraq<d,tB.!9T=Aq;q\W +J`_OGT]Z7SJ,~> +JaVmmJcCQ+s6]jei9gRFrpBadrpBadq!J7bmJuYTrpBadrpBadrpBadmI'rRrpKacq<n4^YjMo" +md:)CmJu\C!:K7TmI'rRhsU1<eF*A:!:GR@JaS*WT^Mg[J,~> +Ja2UeJH1K+s69Rai9C:BrosI`rosI`q!%t^l2^)LrosI`rosI`rosI`mHXZNrp'I_q<IqZYj)Vs +lKSB7l2^,7!:&hLmHXZNhs0n8eE[&6!:#7<Ja.gOT^)OWJ,~> +J`c=]JcCQ+s5j=]i8t%>roO4\roO4\puV_Zk5XTDroO4\roO4\roO4\mH4EJroX4[q<%\VYiZAo +k2u^+k5XT+s5rJDmH4EJhraY4eE6f2!9T"8J`_OGT]Z7SJ,~> +JaVmmJcD5>bO,?1rU'XcrU'XcqX+Ofmd:)CmK!7S"p")Z!:K7TnF#rL!U]seme-XgmJm7dmKN[Z +!:BjT!<2Bd!:T=Y!:BjT!8R#A!7:06rrDJ@s+0Thm\'"J!.Y~> +Ja2UeJH2/>bN]'-rTX@_rTX@_qW\7blKSB7l2^hK"p!rR!:&hLnETZH!U9[alLk4cl2Uh`l377R +!9sRL!<26`!:T1U!9sRL!8Ql=!7:$2!!);<!.jEdlCdGB!.Y~> +J`c=]JcD5>bN8g)rT4+[rT4+[qW8"^k2u^+k5YGC#63iJs5rJDnE0ED!TsF]k4\h_joGG\jp(kJ +s5s@Ds8M-\s6o(Qs5s@Ds4lc9s3Tp.rrD28s+0<`k+Ll:!.Y~> +JaVmmJcEmmrU'XcnEpDZmJuYTVX=EarpBadrpBadrpBmhmJuYTlgF`P$LRlomJuYT!:K7TrpKac +ZL.\mrU0[crpKddrU'Xcna6S]md:)CmJu,3"9@iimJtZ&s8N)eL&Z_lJaT3!rr@Q~> +Ja2UeJH3gmrTX@_nEL,Vl2^)LVWn-]rosI`rosI`rosUdl2^)Llg"HL$L.Tkl2^)L!:&hLrp'I_ +ZK_DirTaC_rp'L`rTX@_n`g;YlKSB7l2]]+"9@]el2]5srr<&aK`H\hJa/onrr@Q~> +J`c=]JcEmmrT4+[nE'lRk5XTDVWImYroO4\roO4\roO@`k5XTDlfS3H$KhBgk5XTDs5rJDroX4[ +ZK;/erT=.[roX7\rT4+[n`C&Uk2u^+k5X<#"TRWak5Wiks8N)]L&Z_dJ``Wfrr@Q~> +JaVmmQ2eqn!!*#d!!*#d!!)uc!!*#d!!*#d!!)HTrW&h`!!)uc!!)uc!!*#drW)9P%05ermJu\C +!!)EemJm7dmK<OX!:BiNmJm7dmJm7dmJm7FmKN[ZmJu\C!7L<8rrDJ@s+0Thm\'"J!.Y~> +Ja2UePlSnj!!*#`!!*#`!!)u_!!*#`!!*#`!!)HPrW&h\!!)u_!!)u_!!*#`rW)9L%05Ynl2^,7 +!!)9al2Uh`l3%+P!9sQJl2Uh`l2Uh`l2UhBl377Rl2^,7!7L04!!);<!.jEdlCdGB!.Y~> +J`c=]Q2eqf!<<&\!<<&\!<<#[!<<&\!<<&\!<;KLrr8kX!<<#[!<<#[!<<&\rr;<H%KGSjk5XT+ +s8V6]k5YJ\jok_Hs5s?FjoGG\joGG\joGG>jp(kJk5XT+s3g'0rrD28s+0<`k+Ll:!.Y~> +JaVmms8W&u!U]semf3=EmKN[ZmJu\C!:&tP!<2Ed!<;Hg!:BimmKN[ZmJu\C!;l0g!:K7Tmd:)F +me-XRme-YMmM>lkmJm7T!:K7TmJuYT!:K7Tmd:)CmJrO?!!)uc!!)uc!!)$H!!*#d!!*#d!!(L9 +s8N)eL&Z_lJaT3!rr@Q~> +Ja2Uequ?c_!<29`!8m&G!:&hLlKSB7l2Uh`lMgkal2gtN!4(ko!:&hLlKSBHl377Rl2^,7!:f@J +!2/WN!:]7i!:&hL!9sRLl2^)Ll2UhLl2^,7!:&hLQ0J>LrTX@_rTX@_ip$LDrosI`rosI`e*?r5 +!:#7<Ja.gOT^)OWJ,~> +J`c=]rr;uu!TsF]k5YJ=jp(kJk5XT+s6A_Hs8M0\s8V3_s5s?ejp(kJk5XT+s81p_s5rJDk2u^6 +k4\hJk4\iEjqn'[k5YJDs5rJDk5XTDs5rJDk2u^+k5U_/!<<#[!<<#[!<;'@!<<&\!<<&\!<:O1 +s8N)]L&Z_dJ``Wfrr@Q~> +JaVmms8N5i!!)EerpKgdi9gRFrpBadrpBadm-Y&XmJu\C!!*#d!!'7k"9@iimK!(N"9@iimJuVA +rW&>RrW)HU%05ha!:BjT!:K7T!:K:S!<2Bd!<2Bd!<2Bd!1<0S!<)<c!<)<c!9*>G!<)<c!<)<c +!7^Fgs+0Thm\'"J!.Y~> +Ja2Uerr<2e!!)9arp'L`i9C:BrosI`rosI`m-4cTl2^,7!!*#`!!'7g"9@]el2^YF"9@]el2^29 +rW&>NrW)HQ%05\Y!9sRL!:&hL!:&kK!<26`!<26`!<26`!1<$O!<)0_!<)0_!9*2C!<)0_!<)0_ +!7^:c!.jEdlCdGB!.Y~> +J`c=]s8N5a!!)0]roX7\i8t%>roO4\roO4\m,eNPk5XT+s8W)\!<9:c"TRWak5Y8>"TRWak5Xf1 +rr8AJrr;KM%KGSQs5s@Ds5rJDs5rJCs8M-\s8M-\s8M-\s-VpKs8D'[s8D'[s5E)?s8D'[s8D'[ +s4$1_s+0<`k+Ll:!.Y~> +JaVmmmf2M=!!)uc!!)uc!!)<P"p")Z!:K7TY3u8hp[8"\m-XuVmJuYTRdL:YmJuYTnF$;Vs6]sh +mJu\J!<2Bd!<)<c!1<0S!<2Bd!<2Bd!9NVK!<)<c!<)<c!71'5s7l#@s+0Thm\'"J!.Y~> +Ja2UemJuJ9!!)u_!!)u_!!)<L"p!rR!:&hLY3PudpZh_Xm-4]Rl2^)LRd("Ul2^)LnEU#Rs69[d +l2^,B!<26`!<)0_!1<$O!<26`!<26`!9NJG!<)0_!<)0_!70p1!;Pi<!.jEdlCdGB!.Y~> +J`c=]mf2M5!<<#[!<<#[!<;?H#63iJs5rJDY3,``pZDJTm,eHNk5XTDRcXbQk5XTDnE0cNs5jF` +k5XT:s8M-\s8D'[s-VpKs8M-\s8M-\s5iACs8D'[s8D'[s3Kg-s7k`8s+0<`k+Ll:!.Y~> +JaVdjrrE&d!<;i^!<:%+"9@iimJsN[p&P-\p&OXN"p")Z!:K7T\F'=srU'XcrU'XcnEpJ\md:)C +mJubE"p")Z!:K7TrU0Ua!U]sbmJm7cmJm7cmJm6XmKN[ZmJu\C!<)<c!<)<c!<)?c!<)?c!<2Ed +!"SDsmJm7T!!)EemJu\C!<)<c!7pQ<s7l!^s6f<Js+0Thm\'"J!.Y~> +Ja2LbrrE&`!!)fZ!!("'"9@]el2\*Sp&P-Xp&OXJ"p!rR!:&hL\EX%orTX@_rTX@_nEL2XlKSB7 +l2^>="p!rR!:&hLrTa=]!U9[^l2Uh_l2Uh_l2UgTl377Rl2^,7!<)0_!<)0_!<)3_!<)3_!<29` +!"S8ol2UhL!!)9al2^,7!<)0_!7pE8!;PgZ!:K-F!.jEdlCdGB!.Y~> +J`c4ZrrE&\!<;iV!<:%#"TRWak5V^KpAb0TpAa[F#63iJs5rJD\E3ekrT4+[rT4+[nE'rTk2u^+ +k5Xr5#63iJs5rJDrT=(Y!TsFZjoGG[joGG[joGFPjp(kJk5XT+s8D'[s8D'[s8D*[s8D*[s8M0\ +rsn2kk5YJDs8V6]k5XT+s8D'[s46<4s7k^Vs6f$Bs+0<`k+Ll:!.Y~> +JaVdjrrE&d!<;i^!<:"*rW'%frW)c^!<DQd!<)<c!;,[Z!<2Bd!<2Bd!7^E:!<)<c!<)<c!:]CV +!<2Bd!<2Bd!:]CV!<2Bd!<2Bd!:]C\!:BjT!:BjdmK<OX!:Bj_mJm7dmJm7dmJm6smf*:dmd'oR +meHk_mKEUY!!)HTrW)ud%fl"t!:BjT!:BjT!:BjTmf!1imJm7TmK!7S!!*#d#lsAnmd:)C!:K:S +!<;Kd!<2Ed!<2Ed!<)<c!<)<c!;c-Ws5NIJs+0Thm\'"J!.Y~> +Ja2LbrrE&`!!)fZ!!'t&rW'%brW)cZ!<DE`!<)0_!;,OV!<26`!<26`!7^96!<)0_!<)0_!:]7R +!<26`!<26`!:]7R!<26`!<26`!:]7X!9sRL!9sR`l3%+P!9sR[l2Uh`l2Uh`l2UgolMgk`lKeKN +lM1G[l3.1Q!!)<LrW)u`%fkkp!9sRL!9sRL!9sRLlM^bel2UhLl2^hK!!*#`#ls5jlKSB7!:&kK +!<;?`!<29`!<29`!<)0_!<)0_!;c!S!93:F!.jEdlCdGB!.Y~> +J`c4ZrrE&\!<;iV!<:""rr9(^rr;fV!WV<\s8D'[s7GFRs8M-\s8M-\s4$02s8D'[s8D'[s7#.N +s8M-\s8M-\s7#.Ns8M-\s8M-\s7#.Ts5s@Ds5s@\jok_Hs5s@WjoGG\joGG\joGFkk5YJ\k3W*J +k5#&WjoteIs8V6Drr<#\&-(els5s@Ds5s@Ds5s@Dk5PAak5YJDk5YGC!<<&\$30/fk2u^+s5rJC +s8V6\s8M0\s8M0\s8D'[s8D'[s8(mOs5N1Bs+0<`k+Ll:!.Y~> +JaVdjrrE&d!<;i^!<:..p&MAc"9@iimK!(N"9@iimK!7S!!)ZZ!!)uc!!)uc!!(O:!!*#d!!*#d +!!)HT"p")Z!:K7TnEp8VrU'XcrU'XcnF$8UrpC$lmJm7T!!)Eeq<eFemd:)CmJuVA!!)uc!!)uc +!!)HT!!)uc"9@iimdC&SrpKacs6]mfmf!4dmdL2Vmf!1dmeQnhmJm7T!!)EemeQndmJm7Tmem.c +med%bmed%bmeQn`mf!4dmf*7emeZtdmJm7TrW)rc!s%cW!<2Bd!<2Bd!57g7s+0Thm\'"J!.Y~> +Ja2LbrrE&`!!)fZ!!(+*p&MA_"9@]el2^YF"9@]el2^hK!!)ZV!!)u_!!)u_!!(O6!!*#`!!*#` +!!)HP"p!rR!:&hLnEKuRrTX@_rTX@_nETuQrosahl2UhL!!)9aq<A.alKSB7l2^29!!)u_!!)u_ +!!)HP!!)u_"9@]elK\?Krp'I_s69UblM^e`lL4cRlM^b`lM:Jdl2UhL!!)9alM:J`l2UhLlMU__ +lMLV^lMLV^lM:J\lM^e`lMghalMCP`l2UhLrW)r_!s%WO!<26`!<26`!57[3!.jEdlCdGB!.Y~> +J`c4ZrrE&\!<;iV!<:.&pA_D["TRWak5Y8>"TRWak5YGC!<;]R!<<#[!<<#[!<:R2!<<&\!<<&\ +!<;KL#63iJs5rJDnE'`NrT4+[rT4+[nE0`MroOLdk5YJDs8V6]q;qn]k2u^+k5Xf1!<<#[!<<#[ +!<;KL!<<#["TRWak2u[CroX4[s5j@^k5PD\k4&BNk5PA\k5,)`k5YJDs8V6]k5,)\k5YJDk5G>[ +k5>5Zk5>5Zk5,)Xk5PD\k5YG]k55/\k5YJDrr;u["97NGs8M-\s8M-\s1RR/s+0<`k+Ll:!.Y~> +JaVdjrrE&d!<;i^!<:"*rW'+h"p")Z!:K7TqsFglmJm7T!!)Eemd:)RmJm7(mKN[ZmJu\C!;#XY +!<2Ec!!)Hd!"&&nmJuYT!:BjTrW)ud"p"&k!:BjTr;Zicr;[#h!:Bgemem+cme$PbmJuYTmd:&T +rpKddrpKac!q$$grpKdds6fmerpKddrpKddrpKdds6]jerpBadm-XiRrpC3qmd:&Tmd:)CmJm7T +mf!1fmJu\Q!!)H1!!)H[!!)HI!!)Hc!!M]imd:(LmK<OX!:Bj_mcFJ"mXaf!mf*9;~> +Ja2LbrrE&`!!)fZ!!'t&rW'+d"p!rR!:&hLqs"Ohl2UhL!!)9alKSBJl2Uh$l377Rl2^,7!;#LU +!<29_!!)<`!"%ojl2^)L!9sRLrW)u`"p!og!9sRLr;Zi_r;[#d!9sOalMU\_lLb,^l2^)LlKS?L +rp'L`rp'I_!pTacrp'L`s6BUarp'L`rp'L`rp'L`s69RarosI`m-4QNrospmlKS?LlKSB7l2UhL +lM^bbl2^,I!!)<-!!)<W!!)<E!!)<_!!MQelKSADl3%+P!9sR[lK&"sl@J5nlMgj7~> +J`c4ZrrE&\!<;iV!<:""rr9.`#63iJs5rJDqrS:dk5YJDs8V6]k2u^BjoGFujp(kJk5XT+s7>CQ +s8M0[rrD3\rs@ifk5XTDs5s@Drr<#\#63ics5s@DrVll[rVm&`s5s@]k5G;[k4S`Zk5XTDk2u^D +roX7\roX4[!p9O_roX7\s5s@]roX7\roX7\roX7\s5j=]roO4\m,e<JroO[ik2u^Dk2u^+k5YJD +k5PA^k5XTArrD3)rrD3SrrD3ArrD3[rrhKak2u]<jok_Hs5s@Wk2lVok(2Zfk5PF3~> +JaVdjrrE&d!<<#c!<<#c!<:%+"9@iimK!4R!!)uc!!)uc!!)f^!!)uc!!)uc!!(L9!!*#d!!*#d +!!)uc!!*#d"9@iimK!7S!!*#d!!'h&!<DQe!<;Ke!<2Ed!!M]imJu\N!!)Hc!!)Hd!<;Ke!<;Ke +!!)Hd!!qummJuYTmJu\J!!)Hd!!)Hd!!)Hd!<2E`!!;QgmeZtameZtbmK!7S!!*#drrE&d#QX8m +mJuYTmdC&Ss6^$jmd:)C!<)<p!:BjTmJuYTmJm7T!:Kdc!:I2o!:J26!:Kdc!:KdcrpBadVsaNa +mI'KDJaS*WT^Mg[J,~> +Ja2LbrrE&`!!)u_!!)u_!!("'"9@]el2^eJ!!)u_!!)u_!!)fZ!!)u_!!)u_!!(L5!!*#`!!*#` +!!)u_!!*#`"9@]el2^hK!!*#`!!'h"!<DEa!<;?a!<29`!!MQel2^,F!!)<_!!)<`!<;?a!<;?a +!!)<`!!qiil2^)Ll2^,B!!)<`!!)<`!!)<`!<29\!!;EclMCP]lMCP^l2^hK!!*#`rrE&`#QX,i +l2^)LlK\?Ks69aflKSB7!<)0l!9sRLl2^)Ll2UhL!:'L_!:$ok!:%o2!:'L_!:'L_rosI`Vs=6] +mHX0@Ja.gOT^)OWJ,~> +J`c4ZrrE&\!<<#[!<<#[!<:%#"TRWak5YDB!<<#[!<<#[!<;iV!<<#[!<<#[!<:O1!<<&\!<<&\ +!<<#[!<<&\"TRWak5YGC!<<&\!<9js!WV<]s8V6]s8M0\rrhKak5XT>rrD3[rrD3\s8V6]s8V6] +rrD3\rs7cek5XTDk5XT:rrD3\rrD3\rrD3\s8M0XrrV?_k55/Yk55/Zk5YGC!<<&\s8W)\#lj&e +k5XTDk2u[Cs5jLbk2u^+s8D'hs5s@Dk5XTDk5YJDs5s:[!9UZg!9VZ.!9X7[!9X7[roO4\Vrn!Y +mH3p<J`_OGT]Z7SJ,~> +JaVdjrrE&dpA`V0!!)uc!!)uc#lsD]!:K7Tmd:)RmJm7dmJm7dmJm7\mJm7dmJm7dmJm79mJm7c +mJm7cmK3IWmK!4Rr;[)j!:K7Tmd:)-mJm7cmJm7cmJm7Xmem.bmJm7dmJm7dmJm7dmK!=Uli7%R +r;Zicp&G*\aoDP3!!)Hb!!)H\!!)HU!!)Hd!!)GT!!)HS!!)Hc!!)H^!!2KfWp]Q\rU'XcrU'Xc +JaS*WM=1BDJ,~> +Ja2LbrrE&`p&NS,!!)u_!!)u_#ls8U!:&hLlKSBJl2Uh`l2Uh`l2UhXl2Uh`l2Uh`l2Uh5l2Uh_ +l2Uh_l2q%Ol2^eJr;[)f!:&hLlKSB%l2Uh_l2Uh_l2UhTlMU_^l2Uh`l2Uh`l2Uh`l2^nMli7%N +r;Zi_p&G*XaoDP/!!)<^!!)<X!!)<Q!!)<`!!);P!!)<O!!)<_!!)<Z!!2?bWp99XrTX@_rTX@_ +Ja.gOM<b*@J,~> +J`c4ZrrE&\pA`V(!<<#[!<<#[$30/Ms5rJDk2u^BjoGG\joGG\joGGTjoGG\joGG\joGG1joGG[ +joGG[jobYGk5YDBrVm,bs5rJDk2u]rjoGG[joGG[joGGPk5G>ZjoGG\joGG\joGG\joPMEm/I(J +rVll[pAY-Tb5VS+s8V6ZrrD3TrrD3MrrD3\rrD2LrrD3KrrD3[rrD3Xs8N'"k5VIDpAb*R!<<#[ +!<7W4J`_gOrr@Q~> +JaVdjrrE&d!<;i^!<:L8!!*#d!!*#d!s%cW!<2Bd!<2Bd!<)<i!:K7Tmd:)ImKN[ZmJu\C!7:-6 +!<)<c!<)?c!!)H[!!)Hc!!)Hb!"82pmJm7T!:K7TmK!4R!!)f^$io\qmd:)C!!)EemK!7SrrE#c +"p")Z!:BjTh>dQDoDemZU]:D_p&G*\o)JdYUAt;^g&Ru;rW)ob!!*#d!!*#d!!%T<JaS?^rr@Q~> +Ja2LbrrE&`!!)fZ!!(I4!!*#`!!*#`!s%WO!<26`!<26`!<)0e!:&hLlKSBAl377Rl2^,7!7:!2 +!<)0_!<)3_!!)<W!!)<_!!)<^!"8&ll2UhL!:&hLl2^eJ!!)fZ$ioPmlKSB7!!)9al2^hKrrE#_ +"p!rR!9sRLh>dQ@oDemVU]:D[p&G*Xo)JdUUAt;Zg&Ru7rW)o^!!*#`!!*#`!!%T8Ja/'Vrr@Q~> +J`c4ZrrE&\!<;iV!<:L0!<<&\!<<&\"97NGs8M-\s8M-\s8D'as5rJDk2u^9jp(kJk5XT+s3Tm. +s8D'[s8D*[rrD3SrrD3[rrD3ZrsRuhk5YJDs5rJDk5YDB!<;iV%0,Jik2u^+s8V6]k5YGCs8W&[ +#63iJs5s@DhZ!T<o`"pRV#LGWpAY-ToD\gQU]1>Vh#@BTs/"lWs8D'[s8M-\s8M-\s+0<`k(r1" +!.Y~> +JaVdjrrE&d!<;i^!<;<O$io\qmd:)C!:K7TmJutK$39M^!:Bgemd:&TrpKddrpC0pmJu\C!:BjT +!:K7TqsFFarU0[c"7?0W!;l0a!<)<c!<)<c!;c*`!<)<c!<)<i!:BjT!:K:S!<;Kd!<;Kd!!DWh +mdC&S"7?-hmeZtamed%fmJuYTmf!1dmf!1dmeHk_mf*:dmf!4cmf!1dmdgDYmcFKLmXYB;!!DWh +!:K^a!:GC<oDes\!:KdcW9scgmJuYTrU'jimd:)CmJqh+JaS<]rr@Q~> +Ja2LbrrE&`!!)fZ!!)9K$ioPmlKSB7!:&hLl2^PC$39AV!9sOalKS?Lrp'L`rosmll2^,7!9sRL +!:&hLqs".]rTaC_"6omO!;l$]!<)0_!<)0_!;bs\!<)0_!<)0e!9sRL!:&kK!<;?`!<;?`!!DKd +lK\?K"6ojdlMCP]lMLVbl2^)LlM^b`lM^b`lM1G[lMgk`lM^e_lM^b`lLOuUlK/'Hl@As7!!DKd +!:'F]!:#+8oDesX!:'L_W9OKcl2^)LrTXRelKSB7l2ZD#Ja/$Urr@Q~> +J`c4ZrrE&\!<;iV!<;<G%0,Jik2u^+s5rJDk5Y/;$NK8Ns5s@]k2u^DroX7\roOXhk5XT+s5s@D +s5rJDqrRnYrT=.["6TXGs81pYs8D'[s8D'[s8(jXs8D'[s8D'as5s@Ds5rJCs8V6\s8V6\rr_E` +k2u[C"6TX`k55/Yk5>5^k5XTDk5PA\k5PA\k5#&Wk5YJ\k5PD[k5PA\k4ATQk2u[Dk(3R3rr_E` +s5s4Y!9Sk4o`#$Us5s@\!3##_s5s@Ds8D'as5rJDk2u\pk(2ZMk5PF3~> +JaVdjrrE&d!<;i^!<;QVrrE&dr;Zicqu?`bqu?`br;[/l!!)EemJuYTmf!4dmL'$_!:BjTmJuYT +mdBoO"RZ9XmK!4RrrE&d!<DQe!;Z$_!<2Bd!<2Bd!;Ps^!<2Bd!<2Bd!<2Bp!:BjT!:BjT!:BjT +mf!1dmf!1hmJuYTmed%bmb@dBmbn-GmXYB5!!)H^!!)HU!!)G<!;?Hnmem-cmKN[ZmJu\C!<)<g +!:BjT!.jQhmY:00!.Y~> +Ja2LbrrE&`!!)fZ!!)NRrrE&`r;Zi_qu?`^qu?`^r;[/h!!)9al2^)LlM^e`l3dUW!9sRLl2^)L +lK\3G"R6!Pl2^eJrrE&`!<DEa!;Ym[!<26`!<26`!;PgZ!<26`!<26`!<26l!9sRL!9sRL!9sRL +lM^b`lM^bdl2^)LlMLV^lJ)@>lJV^Cl@As1!!)<Z!!)<Q!!);8!;?HnlMU^_l377Rl2^,7!<)0c +!9sRL!.jEdlA"U(!.Y~> +J`c4ZrrE&\!<;iV!<;QNs8W)\rVll[r;QcZr;QcZrVm2ds8V6]k5XTDk5PD\jpV4Os5s@Dk5XTD +k2uO?"QoaHk5YDBs8W)\!WV<]s7tdWs8M-\s8M-\s7k^Vs8M-\s8M-\s8M-hs5s@Ds5s@Ds5s@D +k5PA\k5PA`k5XTDk5>5Zk1ot:k2H=?k(3R-rrD3VrrD3MrrD24s7cNnk5>:[jp(kJk5XT+s8D'_ +s5s@Ds+0<`k(`$u!.Y~> +JaVdjrrE&dpAaULrrE)err<&eo`,![rVurdrVuue!<2Ec!<;Ke!"82pmJm7T!!)HT!:KL[!:Kgd +!q$'Vo`,-_!!)HTU]:Sd!!)Eemc"3HmYLoDmXYB-!!)H=!35Ge!<2Bd!<2Bd!<)?b!.jQhmY1*/ +!.Y~> +Ja2LbrrE&`p&ORHrrE)arr<&ao`,!WrVur`rVuua!<29_!<;?a!"8&ll2UhL!!)<L!:'4W!:'O` +!pTdNo`,-[!!)<LU]:S`!!)9alJ_dDlA5K@l@As)!!)<9!35;a!<26`!<26`!<)3^!.jEdl@nO' +!.Y~> +J`c4ZrrE&\pAaUDs8W,]s8N)]p&>$Srr2u\rr3#]s8M0[s8V6]rsRuhk5YJDs8V6Ds5s"S!9X:\ +!p9OFp&>0Ws8V6DV#LV\s8V6]k2QC@k)'*<k(3R%rrD35s/P2]s8M-\s8M-\s8D*Zs+0<`k(Vst +!.Y~> +JaVdjrrE&d!<<#c!<<#c!<;TW!W_ZVp](<^ci=(6p&G*\q#CE_nGiRWrVurdL]@GCJH2;B!:KCX +!q$'Vnc/[Xo)JdYrVurdo)JdYrW)rcrrB4i$NTSpmd:)C!:K7Tme-X3mXae_mf*9;~> +Ja2LbrrE&`!!)u_!!)u_!!)QS!W_NNp](<Zci=(2p&G*Xq#CE[nGiRSrVur`L]@G?JH2;B!:'+T +!pTdNnc/[To)JdUrVur`o)JdUrW)r_rrB4e$NTGllKSB7!:&hLlLk4/l@J5WlMgj7~> +J`c4ZrrE&\!<<#[!<<#[!<;TO!rqEFq#:?Vd/O+.pAY-Tq>UHWnc&UOrr2u\M#RJ;JcDAB!9WkP +!p9OFo)A^PoD\gQrr2u\oD\gQrr;u[rrB4a$ifAhk2u^+s5rJDk4\h+k(2ZOk5PF3~> +JaVso!!)ucrrE&d!<;i^!<;QV!W_ZVqZ$Wa]`8'#QiI-SJH16$qZ$Wamf3@UmJm@W!!)HH!!)Hd +!<2Ed!3Y_i!<2Bd!<2Bd!;l3`!.jQhmY1*/!.Y~> +Ja2[g!<<#_rrE&`!!)fZ!!)NR!W_NNqZ$W]]`8&tQiI-OJH16$qZ$W]mf3@QmJm@S!!)<D!!)<` +!<29`!3YSe!<26`!<26`!;l'\!.jEdl@nO'!.Y~> +J`cC_!!)u[rrE&\!<;iV!<;QN!rqEFqu6ZY^&J)pR/[0KJcC<$qu6ZYn,ECMmf*COs8V6Krr<&n +rrD3\s8M0\!3YGas8M-\s8M-\s81sXs+0<`k(Vst!.Y~> +JaVpn!!*#drrE)e!<E/pmK!:UmK*CVm^)romcFNCs+(0h!!)HJ!!)HV!!)HE!!)H<!!)HU!!;Qg +mf!1dme-Y\mf!1dmdC,UmcOTMmJm7dmf*:(mJm7dmf*:dmf*:dmJm7cmf*:emK3IWmK!.P"9@ii +mJqh+JaS9\rr@Q~> +Ja2Xf!<<&`rrE)a!WN/pl2UhQl2gtNlEgNkl@Ar-!!)<F!!)<R!!)<A!!)<8!!)<Q!!;EclM^b` +lLk5XlM^b`lL+]QlK80Il2Uh`lMgk$l2Uh`lMgk`lMgk`l2Uh_lMgkal2q%Ol2^_H"9@]el2ZD# +Ja/!Trr@Q~> +J`c@^!!*#\rrE)]!<E/pjoGGMjoYSFk-Y-gk(3Q)rrD3BrrD3NrrD3=rrD34rrD3MrrV?_k5PA\ +k4\iTk5PA\k3r<Mk55/Y!:KmejoGG\k5PFujoGG\k5YJ\k5YJ\joGG[k5YJ]jobYGk5Y>@"TRWa +k5U"pJ`_^Lrr@Q~> +JaVmm#QX;\!!)Eemf3(M!<;QVPQ1^`p](<oNW9(IfDkp>])Vj!n,NRY!!)HJ!!)HW!!)H9!!)Hc +!!)Ha!!)Hc!<;Ke!!)Hd!!)HR!!)Hc!!)Hd!!)Hd!<2Bf!:K:S!7UB9!!)HO!<;Ke!<2Bn!:K7T +mJuYTmd:)SmK*CVmem.cmf*:dmf*:dmJm6<mXaejmf*9;~> +Ja2Ue#lj2T!!)<al2^VE!!)NRJH1u9!:&2:!:%/r!:'%R"6ojdlJqpFlL=iSlI,_5lMU\_lMCP] +lMU__lMghalM^b`lKeKNlMU\_lM^b`lM^e_l2gtNlM^e4lMghalKJ<KlMgk`l3[OVl2^)Ll2^,7 +!<26b!:&kJ!<;?a!<29`!<26`!.jEdlBLT6!.Y~> +J`c=]#QX#L!!)-]k5Y5=!<;QNJcD&9!9Vr6!9Uon!9WeN"6TX`k2cOBk4/HOk0s>1k5G;[k55/Y +k5G>[k5YG]k5PA\k4/HO!<)otk5G;[k5PA\k5PD[joYSFk5GA0k5YG]k3;pGk5YJ\jpM.Nk5XTD +k5XT+s8M-^s5rJBs8V6]s8M0\s8M-\s+0<`k*5$.!.Y~> +JaVso"9@lX!:Kgd%.4,qmJuYTmd:)C!<;HSQN.$cp](<oRK*?Uh>dZG!!)HL!!)H^!!)H\!!)Hc +!!)HB!!)Hd!<;K\!!)Hd!!DWh!:K7T!:KCX!:Kab!:K^a!:Kgds6^$jmJu\C!<)<c!6jm.!<)<e +!:K:S!<;Kd!<;Kd!<2Bf!:K:S!8?l"!!)Hb!!)Hc!!)Hc!!Vcjmd:&TrpBdemf!1dmeZtamf!4d +mJm6<mXaelmf*9;~> +Ja2[g"TRcPs6BR`%-dfml2^)LlKSB7!!)EOJH2MH!:&D@"6ojdlK/'HlM(>ZlLk2XlMU\_lJ)@> +lM^e`lLk2XlM^bcl2UhLmJm7Pnc/[Tqu?`^qZ$W]rW)u`"T[fflKSBJl2Uh.lMCS[l2gtNlM^e` +lM^e`lM^e_l2gtNlM^e;lJV^ClMLV^lMU\_lMU\dl2^,7!!*#`!<DEa!!)<]!!)<`!<;<a!.jEd +lB^`8!.Y~> +J`cC_'EI:X!9O7]s5s@]k5XTDk2u^+s8VKKJcDSH!9W/<"6TX`k2u[Dk4nrVk4\fTk5G;[k1ot: +k5PD\k4\fTk5PA_k5YJDmf*:Lo)A^Pr;QcZqu6ZYrr<#\"om`bk2u^BjoGG*jokbb!<3'!rT41] +k2u[Cs5s=\s5s=\roO:^k2uXCg?.Ao!9X4Z!9X7[!9X7["m5jIk5YJ\joPMErr2u\qu6ZYrr<#\ +!<7W4J``9\rr@Q~> +JaVpn!<DQd!!;Qg!;?H_mZRVNs7cQos60L`maM4:maD.9me6\]mf!1gmJm7Tn,NIVqu?`bqZ$Wa +rVurdhuEcFmf3@UpAbBb!:Bgemf!4dmd^>Xmf!4dmf!4dmf!4cmJm6ZmeQqFmf!4Tm^N8smK<OX +!:K:M!!Vcj!:K7TJaS*WQ1"YPJ,~> +Ja2Xf#lj/irrE)a!<;`mn`kZ*n,NIRe,TL6df9C5pAb3YrW!&c!!)<R!!)<^!!)<]!!)<`!!)<B +!!)<Q!!)<Y!!VWfl2UhLrW)u`nc/[TrW)u`rW)u`rW)r_!!&YVq>fXBrW)EP\,cQo"9@]elK\-E +"mQ'flKSA#l@J5clMgj7~> +J`c@^#QX#e!<3&]rrDcmn`GE&nG`LNeGfO2e,KF1p\t6Urr3)_s8V6NrrD3ZrrD3YrrD3\rrD3> +rrD3MrrD3UrrqQbk5YJDrr<#\o)A^Prr<#\rr<#\rr;u[!<8\Rr;cisjlZOBn)h.[s5jIak5XT+ +q#:N[s8V6Ds+0<`k*>*/!.Y~> +JaWI(!!)TXp&G$l!U]sRm_Af&med%bmbRpDs7cQos0r%/mca]OmeZtamc+9Imem+cmeHh_me-V\ +mem.cmf!1dmd:&VmJu\R!!)H_!!)Hc!!)Hc!!)Hd!<;Kd!<;Hl!:BjTmJuYTrU'XcrU'XcO6uuJ +q!J._mdgGBmf!1dm]$6emf!4dmf!1dmdpMZmK*CV!.jQhm[<MC!.Y~> +Ja30u!!)TTo)JgV!:/pc!!)<^!!);A!!)<K!!)<]!!)<E!!)<_!!)<[!!)<X!!)<_!<;?`!!)<P +!!;EclMU\_lM1D[lMU\_lMU\_lM^e`lM^e`l3@=S!:&hLl2^eJ!!)u_!!&)F!<;iZ!WVHV!9i_I +!!);a!!)<`!<;?`!!)<V!<;<c!9sQ8l@J5glMgj7~> +J`cmm!!)TPoD\jRs6Jg_rrD3ZrrD2=rrD3GrrD3YrrD3ArrD3[rrD3WrrD3TrrD3[s8V6\rrD3L +rrV?_k5G;[k5##Wk5G;[k5G;[k5PD\k5PD\jp1qKs5rJDk5YDB!<<#[!<8,B!!)fV!<D9]!;?HV +k5G>\k,SF]k5PD\k5PA\k4J]RjoYSFs+0<`k*bB3!.Y~> +JaWL)!W_WgoBuYYq#LHp!W_WglgFcQ!:K[`!:J26!:J88!<;ut!<;ut!<:XN!:Kdc!:KU^!:Kgd +"7?-hmca]OmdpJZmf!1dmem+imJuYTmd:(+mZ-]8!;c-\!<)?b!9<LF!!)H_!!)HZ!!)Hd!.jQh +m[3GB!.Y~> +Ja34!!W_KcoBQ>U!ri9#q#CH\!:/qM!!)<\!!)<2!!);T!!)<_!!)<Z!!)<`!!DKd!:&eK!:'1V +!:'O`!:'L_#3l3R!:&hLJa/9\!<;o\!<;rsrTa@^j6ENB!:'@[!:'1V!:'O`Ja.gOR-O\OJ,~> +J`cpn!W_?_oB-)Q!W`6#q>UKXs6JhIrrD3XrrD3.rrD2PrrD3[rrD3VrrD3\rr_E`s5rSG!9WqR +!9X:\!9X7[#3PsJs5rJDJ``!T!!)lXqZ-TWrr;$@!!&tt!9X+W!9WqR!9X:\J`_OGR-+DKJ,~> +JaWO*!!*#d!!)ZZs8Vlps8W*!lgFcQs6dGu"7?-hmeHh_md'oRs7cQos763jm_]#)mf!4dmf!4c +mJm6<mXafqmJm7cme["^mK<OX!:BjLme6[H!.jQhm[*AA!.Y~> +Ja37"!!*#`!!)ZVo)S+ArrE)a\c;it!!)<[!!)<5!!)<%!!)<`!<;?`!<26`!.jEdlL='=s8D3` +!<;utr9=Cbl2^)Lk3@j)Ja.gOQg4SNJ,~> +J`cso!!*#\!!)ZRrr2rup]'RAs8W,]])Mlps8V6WrrD31rrD3!rrD3\s8V6\s8M-\s+0<`k4%L5 +!<)'W!;ts^s5s@Ds5rI%s+0<`k*P61!.Y~> +JaWO*!!*#d!!)ZZs8N)eq>gQqqZ-*Q#lsD]!!)HT!!)Hd!!)Hd!!)Hd!!)H>!!)HY!!M]i!:K:S +!!)Hc!!)HV!!*&o!!*&S!!)Hc!!;Qgmem.cmf!4dmf!1omJu\C!:BjTmJuYTJaS*Wh!P1Cmed(] +mKN[ZmJu\C!:0(O!!*&o!!*%c!.jQhm[!;@!.Y~> +Ja37"!!*#`!!)ZVrr<&anc8.D#ls8U!!)<L!!)<`!!)<`!!)<`!!)<:!!)<U!!MQe!:&kK!!)<_ +!!)<"!!)<_!!;EclMU__lM^e`lM^bkl2^,7!9sRLl2^)LJa.gOh!,+Dl2Uha!!)l\"p!rR!:&hL +lfs9+Ja.gOQKnJMJ,~> +J`cso!!*#\!!)ZRs8N/_rrD]kn)arVk2u^Dk2u^Dk5PA\k5PA\k5PA\k1K\6k4ATUk5YJDk5PA\ +k5G;[k.pusk5G;]k5XTBs8V6\s8V6\rsRuhk2u^+s5rJDk5U"pJ`bbM!<D9[!;bg^s5rJDk2u^0 +k(s%gk(2Z\k5PF3~> +JaWO*!!*#d!!)][!W`9#q#LHprrDER!W_ZVrW)udr;Zicr;ZiceGoU;qZ$WarW)udrVurdr;Zic +rVurdrVurdq>gQ`rrE&d!!*#d!WN/umJm7dmK*=fJaS*WQgX_Nq<e4_rpBadrpBadmdC)T!:Kgd +!<;fo!<8DdJaS*WQ1"YPJ,~> +Ja37"!!*#`!!)]W!<;Wjm-4WPlK\?Ks6BO_!:'L_!:&)7!:'F]!:'O`s6BR`!:'L_!:'O`!:'O` +!:'C\s6BUarosI`rp'L`rTX@_rp'L`Ja.gOQg4SN"9/B$!;Ym[!<26`!<26`!:K.P!!);A!.jEd +lBUZ7!.Y~> +J`cso!!*#\!!)]S!!)Wjm,eBLk2u[Cs5s:[!9X7[!9Vi3!9X1Y!9X:\s5s=\!9X7[!9X:\!9X:\ +!9X.Xs5s@]roO4\roX7\rT4+[roX7\J`_OGQfe/Fq;q\WroO4\roO4\mcOQL!9T1=J`_OGQ0/)H +J,~> +JaWO*!!*#d!!)`\!s%chs8E#us8E#urrN2g!.jS<mK!:^mK!9<mXaenme["ZmJm7cmJm7cmJm7Y +mem+cmed%bs7cQos-*M7mXaeomf*9;~> +Ja37"!!*#`!!)`X!WVHW!!2?bJa3:#!!)fZ!!%T8Ja/Wfqu?`sq!%hZrTX@_rTX@_oBQ8S!:#4; +Ja.gORHjePJ,~> +J`cso!!*#\!!)`T!<D9SrrM9^J`d!p!<;iV!<7W4J``?^qZ-ER!<<#[!<<#[!<;ZQrVll[K`?Vc +J``B_rr@Q~> +JaWO*!!*#d!!)ZZs8N)eq>gQqrr<)f!.jP<me6[3mXaeqmeZtdmJuYTj6lmH!:KU^!<;fo!<8>b +JaS*WQgXkRJ,~> +Ja37"!!*#`!!)ZVrr<&ap&G-Y!.jD8lLk4/l@J5ilMCP`lMp/Lj6HUD!:#.9Ja.gOQg4SNJ,~> +J`cso!!*#\!!)ZRs8N,^!;HKok5U"p!9X"TJ`_OGS*'SJ"6KUG!9<5@rrD25s+0<`k*P61!.Y~> +JaWL)!W_Wgo^2e]s8VN`!<<'%!:BjT!.jQhmXaehmed(amJm7dmJm7Lmd^>Xs8;ots8;ots2"a9 +mahGimXaelmf*9;~> +Ja34!!W_Kco]cPY!!)<Y!!DKdl2ZD#Ja.gOP3VrFrosL`rosL`k3AlF!:&/9Ja.gOQKnJMJ,~> +J`cpn!W_?_o]?;Ws8V6]!;ZWsk5XTDJ`_OGJ``-XquH`Y!!*#\!!)0DW;ck[fDgEaJ``9\rr@Q~> +JaWI(!!)ZZ!s%chs7u^$mf3:emd:)C!.jQhmXaelmed(_mJm7bmJm7Qmem+cmdgDYs7cQos3^lJ +mK!.PrrE)eec5^<r;_E:JaSlmrr@Q~> +Ja30u!!)ZV!WVH[!!)<`!<;<c!9sQ8l@J5OlB^`5!;u*^s8;-^s6JtK!!);p!!2?bqs+1]s6A/8 +!:'L_Ja.gOQg4SNJ,~> +J`cmm!!)ZR!<D9]rr<&srrD3\s8V3_s5s?4k(2ZGk*G0-!;tsZ!;tsZ!:/eGrrD2lrrM9^qr[qY +s5qo4!9X7[J`_OGQfe;JJ,~> +JaVmms8N)eq>gQq!U]r=mXaeWmZd/;!;l0a!;c*`!:fLA!!*&o!!*&O!;,^Z!<2Ed!<;Kc!!)HZ +!!)H_!!)Hc!!)Hc!!)Hb!!2KfJaS*WR-stSJ,~> +Ja2Uerr<&ap](?[!.jEdl@J5blMLYZl2^k\l2^kSlEpWalMgk`lMgkalMU\_lLY&VlM1D[lMU\_ +lMU\_lMLV_l2ZD#Ja/Wfrr@Q~> +J`c=]s8N/_rrDoq!TsE5k(2ZGk*5$+!;kmY!;bgX!:f3Zs7GIRs8M0\s8V6[rrD3RrrD3WrrD3[ +rrD3[rrD3ZrrM9^J`_OGR-+DKJ,~> +JaVmmp&>!lJaS*WJaSilquHQ\!!)f^!!)WYkPtV_p](<om/Z&3!!)uc!!*#drrE&drW)udrVurd +r;ZicrW)udrW)udrVurdrVurdr;Zug!!)EeJaS*WRI:(TJ,~> +Ja2UeoDjI-Ja.gOQKnAJq<@t[q!%kZoBOEths(1ArTX@_rp'L`rp'I_s6BR`!:'L_!:'O`s6BR` +s6BR`!:'O`!:'L_"R5sel2ZD#Ja/Zgrr@Q~> +J`c=]o`'L)J`_OGQKJ)Fq;qYWpuVPVoB+0phrXq=rT4+[roX7\roX4[s5s=\!9X7[!9X:\s5s=\ +s5s=\!9X:\!9X7["Qoaak5U"pJ``B_rr@Q~> +JaVdjrr@W<JaS*WORE#HiU6[F!:K(O!<;fo!<;rsX6orfrU'XcrU'XcrU'XcJaS*WQgXkRJ,~> +Ja2Lbrr@W8Ja.gOOQu`DiTgCB!:&5;X6KZbrTX@_rTX@_rTX@_Ja.gOQg4SNJ,~> +J`c4Zrr@W4J`_OGOQQH@iTC.>!9Vu7X6'E^rT4+[rT4+[rT4+[J`_OGQfe;JJ,~> +JaVdjrr@W<JaS*WPOA>KiU6[F!:JtLpAb'kJaS*WJaTc1rr@Q~> +Ja2Lbrr@W8Ja.gOPNr&GiTgCB!:&/9Ja.gOJa0K)rr@Q~> +J`c4Zrr@W4J`_OGPNMcCiTC.>!9Vr6!!%T4J`_OGYibrcJ,~> +JaVdjrr@W<JaS*WQ1"PMiU5G#!:KdcrpKacJaS*WJaTf2rr@Q~> +Ja2Lbrr@W8Ja.gOQ0S8IiTf.t!:'L_rp'I_Ja.gOJa0N*rr@Q~> +J`c4Zrr@W4J`_OGQ0.uEiTAnp!9X7[roX1[J`_OGJ`a6"rr@Q~> +JaVdjrr@W<JaS*WR-skPiU6[F!:J\D!q$$gq<n4^JaS*WJaTi3rr@Q~> +Ja2Lbrr@W8Ja.gOR-OSLiTgCB!:&D@!pTacq<IqZJa.gOJa0Q+rr@Q~> +J`c4Zrr@W4J`_OGR-+;HiTC.>!9W/<!p9O_q<%YVJ`_OGJ`a9#rr@Q~> +JaVdjrr@W<JaS*WWpTierU'XcrU'Xcr9jI_ipPP$!:Kdcp?qq\JaS*WJaTi3rr@Q~> +Ja2Lbrr@W8Ja.gOWp0QarTX@_rTX@_r9F1[ip,7u!:'L_p?MYXJa.gOJa0Q+rr@Q~> +J`c4Zrr@W4J`_OGWoa<]rT4+[rT4+[r9!nWio]"q!9X7[p?)ATJ`_OGJ`a9#rr@Q~> +JaVdjrr@W<JaS*WWU9`drpBadrpBadrpK[ai9o7una?DWJaS*WJaTl4rr@Q~> +Ja2Lbrr@W8Ja.gOWTjH`rosI`rosI`rp'C]i9Jtqn`p,SJa.gOJa0T,rr@Q~> +J`c4Zrr@W4J`_OGWTF3\roO4\roO4\roX+Yi9&_mn`KiOJ`_OGJ`a<$rr@Q~> +JaVdjrr@W<JaS*WW9sljmd:)CmJu\P!9*AF!!)HF!!)Hd!:K:T!.jQhmXaf5mf*9;~> +Ja2Lbrr@W8Ja.gOW9OTflKSB7l2^,H!9*5B!!)<B!!)<`!:K.P!.jEdl@J6-lMgj7~> +J`c4Zrr@W4J`_OGW9+?bk2u^+k5XT@!9*)>rrD3>rrD3\s6f%L!.j9`k(2[%k5PF3~> +JaVdjrr@W<JaS*WVsXWemJu\P!93GF!!)HG!!)Hc!:0(P!.jQhmXaf6mf*9;~> +Ja2Lbrr@W8Ja.gOVs4?al2^,H!93;B!!)<C!!)<_!:/qL!.jEdl@J6.lMgj7~> +J`c4Zrr@W4J`_OGVre-^k5XTDquGa=rVll[iVro?rVu3GrW%N3J`_OG[H@JhJ,~> +JaVdjrr@W<JaS*WVXF9\ipPJ"k3i3KJaS*WJaTu7rr@Q~> +Ja2Lbrr@W8Ja.gOVX"!Xip,1sk3DpGJa.gOJa0]/rr@Q~> +J`c4Zrr@W4J`_OGVWRmXr;bj>g&L3srW%N3J`_OG[c[SiJ,~> +JaVdjrr@W<JaS*WWp]Q\k3h")!q$$giU6[FJaS*WJaU#8rr@Q~> +Ja2Lbrr@W8Ja.gOWp99Xk3C_%!pTaciTgCBJa.gOJa0`0rr@Q~> +J`c4Zrr@W4J`_OGWoj$Tk2tJ!!p9O_iTC+>J`_OGJ`aH(rr@Q~> +JaVdjrr@W<JaS*WWp]]`jmLn(!:KgdhX:@CJaS*WJaU&9rr@Q~> +Ja2Lbrr@W8Ja.gOWp9E\jm(V$!:'O`hWk(?Ja.gOJa0c1rr@Q~> +J`c4Zrr@W4J`_OGWoj6[rr;*Bh#@B:rr:j;rW%N3J`_OG\E<ekJ,~> +JaVdjrr@W<JaS*W\*a4rq!RtY!:KgdkjI+(g@"q?JaS*WJaU):rr@Q~> +Ja2Lbrr@W8Ja.gO\*<tnq!%kZqZ$W]rW)0If`9akrW%N7Ja.gO\a'1pJ,~> +J`c4Zrr@W4J`_OG\)mYjpu_GR"TRWa!<;9Fg&KdgrW%N3J`_OG\`WnlJ,~> +JaVdjrr@W<JaS*W[dF+qqsO=]"7?0Wmem.Pmf!1dmbe'Fmf!4<mf!3;mXaeWm^hid!.Y~> +Ja2Lbrr@W8Ja.gO[d!kmqs"1^s8;p"l2^,7r;c3LrVur`huEcBrW(R8rW%N7Ja.gO]'B:qJ,~> +J`c4Zrr@W4J`_OG[cRPiqr[bU#Nl'Kk5PD]s6SnIrrD3>rrD3\s4?E4!.j9`k(2[+k5PF3~> +JaVdjrr@W<JaS*W[I+"prpK[arpBadrpK[ana?>U!:JVBe*d28JaS*WJaU/<rr@Q~> +Ja2Lbrr@W8Ja.gO[H[blrp'L`!ri6#rosI`rp'C]n`p&Q!:&>>e*?o4Ja.gOJa0l4rr@Q~> +J`c4Zrr@W4J`_OG[H7GhroX+YroO4\roO4\rVurun`KfM!9W):e)pW0J`_OGJ`aT,rr@Q~> +JaVdjrr@W<JaS*W[-mekrU'XcrU'ghmJm7T!;,^2!7:05!.jQhmXaf=mf*9;~> +Ja2Lbrr@W8Ja.gO[-@YkrW!!!!<)0_!<)0d!9sOal2^JAf)X1_rW%N7Ja.gO]^#LsJ,~> +J`c4Zrr@W4J`_OG[-%5crT4+[rT4:`jo>DDs7GI*s3Tp-!.j9`k(2[-k5PF3~> +JaVdjrr@W<JaS*W[dO"mk3gq'!q$$gbjPK2JaS*WJaU2=rr@Q~> +Ja2Lbrr@W8Ja.gO[d*hl!ri9#k3CY#!pTacbj,3.Ja.gOJa0o5rr@Q~> +J`c4Zrr@W4J`_OG[c[Gek2tCt!p9O_bi\p*J`_OGJ`aW-rr@Q~> +JaVdjrr@W<JaS*W\aK=p!U]sOmb.X@mf!4.mf*9<mXaeWm_/&g!.Y~> +Ja2Lbrr@W8Ja.gO\a'%l!UB^KlIl4<lM^e*lMgj8l@J5OlFlK_!.Y~> +J`c4Zrr@W4J`_OG\`Wbh!TjCGk1]h8k5PD&k5PF4k(2ZGk.TpW!.Y~> +JaVdjrr@W<JaS*W]C,RsrpBgfmJuS@rr<&eg&T+[rr@W<JaS*W^@)"$J,~> +Ja2Lbrr@W8Ja.gO]B]:orosRblMp28rr<&ag&T+Wrr@W8Ja.gO^?Y^uJ,~> +J`c4Zrr@W4J`_OG]B9"kroO7^joF`0s8N)]gAf.Srr@W4J`_OG^?5FqJ,~> +JaVdjrr@W<JaS*W^@(jurU'XcrpBadnF$5T!:JSA_X@C'JaS*WJaU;@rr@Q~> +Ja2Lbrr@W8Ja.gO^?YRqrTXC_rosL`nETrP!:&;=_Wq+#Ja.gOJa1#8rr@Q~> +J`c4Zrr@W4J`_OG^?5:mrT4([roO1\nE0]L!9W&9_WLgtJ`_OGJ`a`0rr@Q~> +JaVdjrr@W<JaS*W_!_+#qsFFar9aObo^:60_=%4$JaS*WJaU>Arr@Q~> +Ja2Lbrr@W8Ja.gO_!:gtqs"1]r9=:^o]js,_<UpuJa.gOJa1&9rr@Q~> +J`c4Zrr@W4J`_OG^ukOpqrRkYr8mtZo]F^(_<1XqJ`_OGJ`ac1rr@Q~> +JaVdjrr@W<JaS*W_s[C%qX+=`qX+=`p[6W5^[CmtJaS*WJaUABrr@Q~> +Ja2Lbrr@W8Ja.gO_s7+!qW\(\qW\(\pZg?1^ZtUpJa.gOJa1):rr@Q~> +J`c4Zrr@W4J`_OG_rggrqW7bXqW7bXpZC*-^ZP=lJ`_OGJ`af2rr@Q~> +JaVdjrr@W<JaS*W`U<X(q!J+^q!J+^qsN2=!:Kgd^[D""rU0XbJaS*WJaUDCrr@Q~> +Ja2Lbrr@W8Ja.gO`Tm@$q!%kZq!%kZqs)o9!:'O`^Zt^srTa@^Ja.gOJa1,;rr@Q~> +J`c4Zrr@W4J`_OG`TI'upuVPVpuVPVqrZZ5!9X:\^ZPForT=(ZJ`_OGJ`ai3rr@Q~> +JaVdjrr@W<JaS*WaR8p*kjJEM!:J_E!:Kgd^@(n!qX4=_JaS*WJaUGDrr@Q~> +Ja2Lbrr@W8Ja.gOaQiX&kj&-I!:&GA!:'O`^?YUrqWe%[Ja.gOJa1/<rr@Q~> +J`c4Zrr@W4J`_OGaQE@"kiVmE!9W2=!9X:\^?5=nqW@bWJ`_OGJ`al4rr@Q~> +JaVdjrr@W<JaS*Wb3o0-kO-t&]C,Xup[8"\JaS*WJaUJErr@Q~> +Ja2Lbrr@W8Ja.gOb3Jm)kN^\"]B]@qpZh_XJa.gOJa12=rr@Q~> +J`c4Zrr@W4J`_OGb3&U%kN:Fs]B9(mpZDGTJ`_OGJ`ao5rr@Q~> +JaVdjrr@W<JaS*Wc0kH/l0eKM!:JVB^$Yk#n*^/TJaS*WJaUMFrr@Q~> +Ja2Lbrr@W8Ja.gOc0G0+l0A3I!:&>>^$5Rtn*9lPJa.gOJa15>rr@Q~> +J`c4Zrr@W4J`_OGc0"m'l/qsE!9W):^#f:pn)jTLJ`_OGJ`ar6rr@Q~> +JaVdjrr@W<JaS*WcgL]2l0d+&VsaNaJaS*WJaUPGrr@Q~> +Ja2Lbrr@W8Ja.gOcg(E.l0?h"Vs=6]Ja.gOJa18?rr@Q~> +J`c4Zrr@W4J`_OGcfY-*l/pRsVrmsYJ`_OGJ`au7rr@Q~> +JaVdjrr@W<JaS*WddHu4lL+WO!:J_E!:KdcU[J-^JaS*WJaUPGrr@Q~> +Ja2Lbrr@W8Ja.gOdd$]0lK\?K!:&GA!:'L_U[%jZJa.gOJa18?rr@Q~> +J`c4Zrr@W4J`_OGdcUE,lK8*G!9W2=!9X7[UZVRVJ`_OGJ`au7rr@Q~> +JaVdjrr@W<JaS*WeF*57lL+WO!:J\D!q$$g]']Ouk3i6LJaS*WJaUSHrr@Q~> +Ja2Lbrr@W8Ja.gOeEZr3lK\?K!:&D@!pTac]'97qk3DsHJa.gOJa1;@rr@Q~> +J`c4Zrr@W4J`_OGeE6Z/lK8*G!9W/<!p9O_]&itmk2u[DJ`_OGJ`b#8rr@Q~> +JaVdjrr@W<JaS*WfC&M9lL*7(S*p:VJaS*WJaUVIrr@Q~> +Ja2Lbrr@W8Ja.gOfBW55lKZt$S*L"RJa.gOJa1>Arr@Q~> +J`c4Zrr@W4J`_OGfB2r1lK6^uS*'_NJ`_OGJ`b&9rr@Q~> +JaVdjrr@W<JaS*Wg$\b<m-`C(R-sqRJaS*WJaUYJrr@Q~> +Ja2Lbrr@W8Ja.gOg$8J8m-<+$R-OYNJa.gOJa1ABrr@Q~> +J`c4Zrr@W4J`_OGg#i24m,ljuR-+AJJ`_OGJ`b):rr@Q~> +JaVdjrr@W<JaS*Wh!Y%>m-`F)\aBFth<t7BJaS*WJaU\Krr@Q~> +Ja2Lbrr@W8Ja.gOh!4b:m-<.%\`s.ph<Ot>Ja.gOJa1DCrr@Q~> +J`c4Zrr@W4J`_OGgueJ6m,ln!\`Nklh<+\:J`_OGJ`b,;rr@Q~> +JaVdjrr@W<JaS*WhX::Am-`R-!:KdcOm`2KJaS*WJaU_Lrr@Q~> +Ja2Lbrr@W8Ja.gOhWk"=m-<:)!:'L_Om;oGJa.gOJa1GDrr@Q~> +J`c4Zrr@W4J`_OGhWF_9m,m%%!9X7[OllWCJ`_OGJ`b/<rr@Q~> +JaVdjrr@W<JaS*WiU6RCmI&O*]'fRueaED:JaS*WJaUbMrr@Q~> +Ja2Lbrr@W8Ja.gOiTg:?mHW7&]'B:qea!,6Ja.gOJa1JErr@Q~> +J`c4Zrr@W4J`_OGiTC";mH3""]&s"me`Qi2J`_OGJ`b2=rr@Q~> +JaVdjrr@W<JaS*Wj6lgFm-alR!:JYC!:KgdM=1?CJaS*WJaUeNrr@Q~> +Ja2Lbrr@W8Ja.gOj6HOBm-=TN!:&A?!:'O`M<b'?Ja.gOJa1MFrr@Q~> +J`c4Zrr@W4J`_OGj6$7>m,n?J!9W,;!9X:\M<=d;J`_OGJ`b5>rr@Q~> +JaVdjrr@W<JaS*Wk3i*HmdC#R!:JP@L$np?JaS*WJaUhOrr@Q~> +Ja2Lbrr@W8Ja.gOk3DgDmcs`N!:&8<L$JX;Ja.gOJa1PGrr@Q~> +J`c4Zrr@W4J`_OGk2uO@mcOKJ!9W#8L$&@7J`_OGJ`b8?rr@Q~> +JaVdjrr@W<JaS*WkjJ?KmdAd/!:Kdcm-XiRcL(Z4bO5?0JaS*WJaUkPrr@Q~> +Ja2Lbrr@W8Ja.gOkj&'GmcrL+!:'L_m-4QNcKYB0bNf',Ja.gOJa1SHrr@Q~> +J`c4Zrr@W4J`_OGkiVdCmcN7'!9X7[m,e9JcK5*,bNAd(J`_OGJ`b;@rr@Q~> +JaVdjrr@W<JaS*WlgFWMmdAg0!:KgdJaWI(rr@W<JaS*WcgLf5J,~> +Ja2Lbrr@W8Ja.gOlg"?ImcrO,!:'O`Ja30urr@W8Ja.gOcg(N1J,~> +J`c4Zrr@W4J`_OGlfS'EmcN:(!9X:\J`cmmrr@W4J`_OGcfY6-J,~> +JaVdjrr@W<JaS*WmI'lPmdA[,JaW=$rr@W<JaS*Wd-go6J,~> +Ja2Lbrr@W8Ja.gOmHXTLmcrC(Ja3$qrr@W8Ja.gOd-CW2J,~> +J`c4Zrr@W4J`_OGmH4<HmcN.$J`cairr@W4J`_OGd,t?.J,~> +JaVdjrr@W<JaS*WnF$/RnF$5T!:J\D!:KgdJaW4!rr@W<JaS*WdI.#7J,~> +Ja2Lbrr@W8Ja.gOnETlNnETrP!:&D@!:'O`Ja2pnrr@W8Ja.gOdH^`3J,~> +J`c4Zrr@W4J`_OGnE0TJnE0]L!9W/<!9X:\J`cXfrr@W4J`_OGdH:H/J,~> +JaVdjrr@W<JaS*Wo'ZDUn*\a,JaW'rrr@W<JaS*WddI,8J,~> +Ja2Lbrr@W8Ja.gOo'6,Qn*8I(Ja2djrr@W8Ja.gOdd$i4J,~> +J`c4Zrr@W4J`_OGo&fiMn)i4$J`cLbrr@W4J`_OGdcUQ0J,~> +JaVdjrr@W<JaS*Wp$V\WnF"m.fBrV=i9gRF]'fOtJaS*WJaV"Trr@Q~> +Ja2Lbrr@W8Ja.gOp$2DSnESU*fBN>9i9C:B]'B7pJa.gOJa1_Lrr@Q~> +J`c4Zrr@W4J`_OGp#c,OnE/@&fB*&5i8t">]&rtlJ`_OGJ`bGDrr@Q~> +JaVdjrr@W<JaS*Wp[7qZnF$8U!:JP@JaVgkrW%N;JaS*WeF*>:J,~> +Ja2Lbrr@W8Ja.gOpZhYVnETuQ!:&8<Ja2OcrW%N7Ja.gOeE[&6J,~> +J`c4Zrr@W4J`_OGpZDARnE0`M!9W#8J`c7[rW%N3J`_OGeE6c2J,~> +JaVdjrr@W<JaS*WqX4.Zo'ZMX!:J_E!:KdcJaV[grW%N;JaS*WeaEG;J,~> +Ja2Lbrr@W8Ja.gOqWdkVo'65T!:&GA!:'L_Ja2C_rW%N7Ja.gOea!/7J,~> +J`c4Zrr@W4J`_OGqW@SRo&fuP!9W2=!9X7[J`c+WrW%N3J`_OGe`Ql3J,~> +JaVdjrr@W<JaS*Wr9jI_rpKacp[7t[!:J_E!q$$gJaVLbrW%N;JaS*Wf'`P<J,~> +Ja2Lbrr@W8Ja.gOr9F1[rp'I_pZh\W!:&GA!pTacJa24ZrW%N7Ja.gOf'<88J,~> +J`c4Zrr@W4J`_OGr9!nWroX1[pZDGS!9W2=!p9O_J`bqRrW%N3J`_OGf&lu4J,~> +JaVdjrr@W<JaS*Ws6fdbqX4=_qsN#8JaVC_rW%N;JaS*WfC&Y=J,~> +Ja2Lbrr@W8Ja.gOs6BL^qWe%[qs)`4Ja2+WrW%N7Ja.gOfBWA9J,~> +J`c4Zrr@W4J`_OGs5s4ZqW@bWqrZK0J`bhOrW%N3J`_OGfB3)5J,~> +JaVdjrr@W<JaS*WquHKZ!!)rbf)WeXrrDWX!!&tcrW%N;JaS*Wf^Ab>J,~> +Ja2Lbrr@W8Ja.gOquHKV!!)r^f)WeTrrDWT!!&t_rW%N7Ja.gOf]rJ:J,~> +J`c4Zrr@W4J`_OGquHKR!!)rZfDihPrrDWP!!&t[rW%N3J`_OGf]N26J,~> +JaVdjrr@W<JaS3ZquH?V!<DQ>!.jRhmf!3;mXaeWmb.%.!.Y~> +Ja2Lbrr@W8Ja.pRquH?R!<DE:!.jFdlM^d7l@J5OlIkJ&!.Y~> +J`c4Zrr@W4J`_XJquH?N!<D96s+0=`k5G@3k(2ZGk1Sns!.Y~> +JaVdjrr@W<JaS9\quH?Vr;ZichZ*ZEr;_E:e*d59JaS*WJaV4Zrr@Q~> +Ja2Lbrr@W8Ja/!TquH?Rr;Zi_hZ*ZAr;_E6e*?r5Ja.gOJa1qRrr@Q~> +J`c4Zrr@W4J`_^LquH?NrVll[hu<]=rVqH2e)pZ1J`_OGJ`bYJrr@Q~> +JaVdjrr@W<JaSB_quH<Uf)W)D!!&YZrr@W<JaS*Wg@"t@J,~> +Ja2Lbrr@W8Ja/*WquH<Qf)W)@!!&YVrr@W8Ja.gOg?S\<J,~> +J`c4Zrr@W4J`_gOquH<MfDi,<!!&YRrr@W4J`_OGg?/D8J,~> +JaVdjrr@W<JaSKbqZ-6Uf)UBib3o90JaS*WJaV:\rr@Q~> +Ja2Lbrr@W8Ja/3ZqZ-6Qf)UBeb3K!,Ja.gOJa2"Trr@Q~> +J`c4Zrr@W4J`_pRqZ-6MfDgEab3&^(J`_OGJ`b_Lrr@Q~> +JaVdjrr@W<JaSQdquH?VrVurdhZ*ZEr;a1lrrAGSrW%N;JaS*Wh!Y1BJ,~> +Ja2Lbrr@W8Ja/9\quH?RrVur`hZ*ZAr;a1hrrAGOrW%N7Ja.gOh!4n>J,~> +J`c4Zrr@W4J``!TquH?Nrr2u\hu<]=rVs4drrAGKrW%N3J`_OGgueV:J,~> +JaVdjrr@W<JaSZgqZ-6Urr<&ehZ*ZErW%N;_s[L(JaS*WJaV@^rr@Q~> +Ja2Lbrr@W8Ja/B_qZ-6Qrr<&ahZ*ZArW%N7_s74$Ja.gOJa2(Vrr@Q~> +J`c4Zrr@W4J``*WqZ-6Ms8N)]hu<]=rr7Q3_rgpuJ`_OGJ`beNrr@Q~> +JaVdjrr@W<JaS`iquHBWr;ZichZ*`G!!%T<^[D($JaS*WJaVC_rr@Q~> +Ja2Lbrr@W8Ja/HaquHBSr;Zi_hZ*`C!!%T8^ZtduJa.gOJa2+Wrr@Q~> +J`c4Zrr@W4J``0YquHBOrVll[hu<c?s8RZ4^ZPLqJ`_OGJ`bhOrr@Q~> +JaVdjrr@W<JaSilqZ-<Wec;rB!!&&IrW%N;JaS*WhsULEJ,~> +Ja2Lbrr@W8Ja/QdqZ-<Sec;r>!!&&ErW%N7Ja.gOhs14AJ,~> +J`c4Zrr@W4J``9\qZ-<Of)Mu:!!&&ArW%N3J`_OGhraq=J,~> +JaVdjrr@W<JaSonquHBWf)UBi\F0=rJaS*WJaVIarr@Q~> +Ja2Lbrr@W8Ja/WfquHBSf)UBe\Ea%nJa.gOJa21Yrr@Q~> +J`c4Zrr@W4J``?^quHBOfDgEa\E<bjJ`_OGJ`bnQrr@Q~> +JaVdjrr@W<JaT#qqZ-<Wf)W)D!!)KU!!&DSrW%N;JaS*WiU6^GJ,~> +Ja2Lbrr@W8Ja/`iqZ-<Sf)W)@!!)KQ!!&DOrW%N7Ja.gOiTgFCJ,~> +J`c4Zrr@W4J``HaqZ-<OfDi,<!!)KM!!&DKrW%N3J`_OGiTC.?J,~> +JaVdjrr@W<JaUDC!!)uc!!)uc!!)3MquHEXrVurdhZ*ZEr;a%h!!%]?rW%N;JaS*WipQgHJ,~> +Ja2Lbrr@W8Ja1,;!!)u_!!)u_!!)3IquHETrVur`hZ*ZAr;a%d!!%];rW%N7Ja.gOip-ODJ,~> +J`c4Zrr@W4J`ai3!<<#[!<<#[!<;6EquHEPrr2u\hu<]=rVs(`!!%]7rW%N3J`_OGio^7@J,~> +JaVdjrr@W<JaUAB!!*#d!!*#d!!)9OqZ-<Wrr<&egAlfmXR?&fJaS*WJaVRdrr@Q~> +Ja2Lbrr@W8Ja1):!!*#`!!*#`!!)9KqZ-<Srr<&agAlfiXQocbJa.gOJa2:\rr@Q~> +J`c4Zrr@W4J`af2!<<&\!<<&\!<;<GqZ-<Os8N)]g])ieXQKK^J`_OGJ`c"Trr@Q~> +JaVdjrr@W<JaU>A"p")Z!:K7TlL+QMp$VeZ!:JVBYO;DjJaWI(rr@W<JaS*Wj6lpIJ,~> +Ja2Lbrr@W8Ja1&9"p!rR!:&hLlK\9Ip$2MV!:&>>YNl,fJa30urr@W8Ja.gOj6HXEJ,~> +J`c4Zrr@W4J`ac1#63iJs5rJDlK8!Ep#c8R!9W):YNGibJ`cmmrr@W4J`_OGj6$@AJ,~> +JaVdjrr@W<JaU;@"9@iimJuVAqZ-BYr;ZichuEcFr;_E:V=+?`JaS*WJaVUerr@Q~> +Ja2Lbrr@W8Ja1#8"9@]el2^29qZ-BUr;Zi_huEcBr;_E6V<\'\Ja.gOJa2=]rr@Q~> +J`c4Zrr@W4J`a`0"TRWak5Xf1qZ-BQrVll[i;Wf>rVqH2V<7dXJ`_OGJ`c%Urr@Q~> +JaVdjrr@W<qsFFarU'XcrU'XcJaUkPrW)?RquHHYg].?BrW%N;U[J$[JaS*WJaVXfrr@Q~> +Ja2Lbrr@W8qs".]rTX@_rTX@_Ja1SHrW)?NquHHUg].?>rW%N7U[%aWJa.gOJa2@^rr@Q~> +J`c4Zrr@W4qrRnYrT4+[rT4+[J`b;@rr;BJquHHQh#@B:rr7Q3UZVISJ`_OGJ`c(Vrr@Q~> +JaVdjrr@W<qX+=`rpBadrpBadJaUtSp&OaQqZ-BYgAh<C!!'+g!!%T<q!RqXJaS*WJaV[grr@Q~> +Ja2Lbrr@W8qW\%\rosI`rosI`Ja1\Kp&OaMqZ-BUgAh<?!!'+c!!%T8q!.YTJa.gOJa2C_rr@Q~> +J`c4Zrr@W4qW7eXroO4\roO4\J`bDCpAadIqZ-BQg]%?;s8T1_!!%T4pu_APJ`_OGJ`c+Wrr@Q~> +JaVdjrr@W<q<eFemd:)CmJqh+c0kQ2o'ZDUp[8"\!:JSAJaT<$quH]`rW%N;JaS*WkO/?MJ,~> +Ja2Lbrr@W8q<A.alKSB7l2ZD#c0G9.o'6,QpZh_X!:&;=Ja0#qquH]\rW%N7Ja.gOkN`'IJ,~> +J`c4Zrr@W4q;qn]k2u^+k5U"pc0#$*o&fiMpZDJT!9W&9J```iquH]XrW%N3J`_OGkN;dEJ,~> +JaVdjrr@W<q!J7bmJuYTJaUeN"9@iimJutKqZ-BYfDr)B!!%T<p?qhYqX4=_JaS*WJaVairr@Q~> +Ja2Lbrr@W8q!%t^l2^)LJa1MF"9@]el2^PCqZ-BUfDr)>!!%T8p?MPUqWe%[Ja.gOJa2Iarr@Q~> +J`c4Zrr@W4puV_Zk5XTDJ`b5>"TRWak5Y/;qZ-BQf`/,:!!%T4p?)8QqW@bWJ`_OGJ`c1Yrr@Q~> +JaVdjrr@W<p[8"\JaUeN"p")Z!:K7Tq<n.\p[6Z6JaT/urW)]\rW%N;JaS*Wl0eQOJ,~> +Ja2Lbrr@W8pZh_XJa1MF"p!rR!:&hLq<IkXpZgB2Ja/lmrW)]XrW%N7Ja.gOl0A9KJ,~> +J`c4Zrr@W4pZDJTJ`b5>#63iJs5rJDq<%STpZC-.J``TerW)]TrW%N3J`_OGl/r!GJ,~> +JaVdjrr@W<qsO.XJaUtS!!*#d!!*#d!!)ucqZ-EZrVurdhuEcFr;_E:U@&!]n*^/TJaS*WJaVgk +rr@Q~> +Ja2Lbrr@W8qs*kTJa1\K!!*#`!!*#`!!)u_qZ-EVrVur`huEcBr;_E6U?V^Yn*9lPJa.gOJa2Oc +rr@Q~> +J`c4Zrr@W4qr[VPJ`bDC!<<&\!<<&\!<<#[qZ-ERrr2u\i;Wf>rVqH2U?2FUn)jTLJ`_OGJ`c7[ +rr@Q~> +JaVdjrr@W<p[8"\JaUkP!!)uc!!)uc!<DQc!;Q!]!!)HF!!)Hd!3>Mf!.jRsmf!3;mXaeWmd'<@ +!.Y~> +Ja2Lbrr@W8pZh_XJa1SH!!)u_!!)u_!<DE_!;PjY!!)<B!!)<`!3>Ab!.jFolM^d7l@J5OlKda8 +!.Y~> +J`c4Zrr@W4pZDJTJ`b;@!<<#[!<<#[!WV<[!;P^UrrD3>rrD3\s/Y8^!.j:kk5G@3k(2ZGk3M10 +!.Y~> +JaVdjrr@W<q!J7bmJuYTJaUSHqZ-H[gAh<C!!(jC!!%T<X7#reJaS*WJaVmmrr@Q~> +Ja2Lbrr@W8q!%t^l2^)LJa1;@qZ-HWgAh<?!!(j?!!%T8X6TZaJa.gOJa2Uerr@Q~> +J`c4Zrr@W4puV_Zk5XTDJ`b#8qZ-HSg]%?;s8Up;!!%T4X60B]J`_OGJ`c=]rr@Q~> +JaVdjrr@W<q<eFemd:)CmJqh+b3o0-q<lu;!:KgdJaT/u!!)0LrW%N;JaS*WmI'uSJ,~> +Ja2Lbrr@W8q<A.alKSB7l2ZD#b3Jm)q<H]7!:'O`Ja/lm!!)0HrW%N7Ja.gOmHX]OJ,~> +J`c4Zrr@W4q;qn]k2u^+k5U"pb3&U%q<$H3!9X:\J``Te!!)0DrW%N3J`_OGmH4EKJ,~> +JaVdjrr@W<qX+=`rpBadrpBadJaV7[!!)f^!<DQb!;Z'_!!)HA!.jQhmf2_T!.jQhmXafnmf*9;~> +Ja2Lbrr@W8qW\%\rosI`rosI`Ja1tS!<;iZ!WVH^!;Yp[!!)<=!.jEdlMp/L!.jEdl@J6flMgj7~> +J`c4Zrr@W4qW7eXroO4\roO4\J`b\K!!)fV!<D9Z!;YdWrrD39s+0<`k5XTD!.j9`k(2[^k5PF3~> +JaVdjrr@W<qsFFarU'XcrU'XcJaV7[!!)l`qZ-H[rVurdg]2onJaWF'rr@W<JaS*WmdC)TJ,~> +Ja2Lbrr@W8qs".]rTX@_rTX@_Ja1tS!<;o\!<;rsq<IqZ!:&>>Ja.gOqs+1]Ja.gOJa2[grr@Q~> +J`c4Zrr@W4qrRnYrT4+[rT4+[J`b\K!!)lXqZ-HSrr2u\h#DrfJ`cjlrr@W4J`_OGmcONLJ,~> +JaVdjrr@W<JaUVI!!)ucqZ-N]r;ZichuEcFr;`nd!!'Uu!!'_#!!(gBrr@W<JaS*Wn*^2UJ,~> +Ja2Lbrr@W8Ja1>A!<<#_!<E/u!;l'[!!)<B!!)<_!3>Ab!4qFq!57Xt!8Ql>!.jEdl@J6hlMgj7~> +J`c4Zrr@W4J`b&9!!)u[qZ-NUrVll[i;Wf>rVrq\!!'Um!!'^p!!(g:rr@W4J`_OGn)jWMJ,~> +JaVdjrr@W<JaUSH!<DQc!;c-9!6X^0!.jR>mf!3;mXaeWmdTZE!.Y~> +Ja2Lbrr@W8Ja1;@#63rg!<3$!qWc]5b3As,Ja0?%rW%N7Ja.gOnEU#RJ,~> +J`c4Zrr@W4J`b#8!<D9[!;bj1s2sI(!.j:6k5G@3k(2ZGk4%O5!.Y~> +JaVdjrr@W<JaUVIqZ-N]f)UBiTC2^ZeaED:JaS*WJaW'rrr@Q~> +Ja2Lbrr@W8Ja1>Arr<0$!<3&rlIQ#elC[AA!7gB6!.jEdl@J6jlMgj7~> +J`c4Zrr@W4J`b&9qZ-NUfDgEaTB?.Re`Qi2J`_OGJ`cLbrr@Q~> +JaVdjrr@W<JaU\Kq#LE^gAh6Ar;`hb!!%T<a6rp,JaS*WJaW*srr@Q~> +Ja2Lbrr@W8Ja1DCqu?fu!!*#`gAh6=r;`h^!!%T8a6NX(Ja.gOJa2gkrr@Q~> +J`c4Zrr@W4J`b,;q#LEVg]%99rVrkZ!!%T4a6*@$J`_OGJ`cOcrr@Q~> +JaVdjrr@W<JaW=$!!)uc!!)uc!!)!GqZ$]c!:Kab!:J_E!:KgdJaS*Wl0eNNJaS*WJaW-trr@Q~> +Ja2Lbrr@W8Ja3$q!!)u_!!)u_!!)!CqZ$``s6BX_!!)<A!!)<`!.jEdlKRU5!.jEdl@J6llMgj7~> +J`c4Zrr@W4J`cai!<<#[!<<#[!<;$?qZ$][!9X7\s8N)]hu<]=rr7Q3J`c4ZrW%N3J`_OGoB-&Q +J,~> +JaVdjrr@W<JaW:#!!*#d!!*#d!!)$HquH`a!<DQ>!3,Ad!3#;c!71'5!6ag0!.jQhmXafumf*9;~> +Ja2Lbrr@W8Ja3!p!!*#`!!*#`!!)$DquH`]!WVH:!3,5`!3#/_!70p1!6a[,!.jEdl@J6mlMgj7~> +J`c4Zrr@W4J`c^h!<<&\!<<&\!<;'@quH`Y!<D9\rr<&Ss/G,\!3##[!70d-!6aO(!.j9`k(2[e +k5PF3~> +JaVdjrr@W<JaW7""p")Z!:K7TjR2mFrU/5:\aKItJaTW-rW%N;JaS*Wp$Vh[J,~> +Ja2Lbrr@W8Ja2so"p!rR!:&hLjQcUBrT_r6\a'1pJa0?%rW%N7Ja.gOp$2PWJ,~> +J`c4Zrr@W4J`c[g#63iJs5rJDjQ?=>rT;]2\`WnlJ`a&rrW%N3J`_OGp#c8SJ,~> +JaVdjrr@W<JaW4!"9@iimJuA:quHZ_g].?Br;_E:JaVC_rW%N;JaS*Wp?qq\J,~> +Ja2Lbrr@W8Ja2pn"9@]el2]r2quHZ[g].?>r;_E6Ja2+WrW%N7Ja.gOp?MYXJ,~> +J`c4Zrr@W4J`cXf"TRWak5XQ*quHZWh#@B:rVqH2J`bhOrW%N3J`_OGp?)ATJ,~> +JaVdjrr@W<JaW0urW)-LqZ-T_gAh<C!!&na!!%T<[I4"oJaS*WJaW:#rr@Q~> +Ja2Lbrr@W8Ja2mmrW)-HqZ-T[gAh<?!!&n]!!%T8[Hd_kJa.gOJa3!prr@Q~> +J`c4Zrr@W4J`cUerr;0DqZ-TWg]%?;s8StY!!%T4[H@GgJ`_OGJ`c^hrr@Q~> +JaVdjrr@W<JaW=$p&OLJquH`ar;ZichZ*ZErW%N;JaV+Wrr@W<JaS*Wp[8%]J,~> +Ja2Lbrr@W8Ja3$qp&OLFquH`]r;Zi_hZ*ZArW%N7Ja1hOrr@W8Ja.gOpZhbYJ,~> +J`c4Zrr@W4J`caipAaOBquH`YrVll[hu<]=rr7Q3J`bPGrr@W4J`_OGpZDJUJ,~> +JaVdjrr@W<JaW0urW)<QqZ-W`f)Vc;!!&ARrrD$G!!'Rtrr@W<JaS*Wq!S.^J,~> +Ja2Lbrr@W8Ja2mmrW)<MqZ-W\f)Vc7!!&ANrrD$C!!'Rprr@W8Ja.gOq!.kZJ,~> +J`c4Zrr@W4J`cUerr;?IqZ-WXfDhf3!!&AJrrD$?!!'Rlrr@W4J`_OGpu_SVJ,~> +JaVdjrr@W<JaW4!"9@iimJu_DquH`af)VZ8!!%T<X7#ufJaS*WJaW@%rr@Q~> +Ja2Lbrr@W8Ja2pn"9@]el2^;<quH`]f)VZ4!!%T8X6T]bJa.gOJa3'rrr@Q~> +J`c4Zrr@W4J`cXf"TRWak5Xo4quH`YfDh]0!!%T4X60E^J`_OGJ`cdjrr@Q~> +JaVdjrr@W<JaW7""p")Z!:K7ToBsm(JaS*WbjPH1JaS*WJaWC&rr@Q~> +Ja2Lbrr@W8Ja2so"p!rR!:&hLoBOU$Ja.gObj,0-Ja.gOJa3*srr@Q~> +J`c4Zrr@W4J`c[g#63iJs5rJDoB,oMeGk*^J`b2=rW%N3J`_OGqW@eXJ,~> +JaVdjrr@W<JaW:#!!*#d!!*#d!!)`\q#CE_h#IHCr;`b`rr@W<V!e3^JaS*WJaWF'rr@Q~> +Ja2Lbrr@W8Ja3!p!!*#`!!*#`!!)`Xq#CE[h#IH?r;`b\rr@W8V!@pZJa.gOJa3-trr@Q~> +J`c4Zrr@W4J`c^h!<<&\!<<&\!<;cTquH`r!9W,;!9X7[Vrn!ZJ``cjrW%N3J`_OGqr[nYJ,~> +JaVdjrr@W<JaW=$!!)uc!!)uc!!)l`q#CE_g].ED!!%T<JaUGDrW%N;JaS*Wr9jRbJ,~> +Ja2Lbrr@W8Ja3$q!!)u_!!)u_!!)l\q#CE[g].E@!!%T8Ja1/<rW%N7Ja.gOr9F:^J,~> +J`c4Zrr@W4J`cai!<<#[!<<#[!<;oXquH`r!9W):!p9O_J`_OG_rgpuJ`_OGJ`cmmrr@Q~> +JaVdjrr@W<p$VPRJaWR+ciAXbWpTieo'QJXW:'WbJaS*WJaWL)rr@Q~> +Ja2Lbrr@W8p$25NJa3:#ciAX^Wp0Qao'-2TW9X?^Ja.gOJa34!rr@Q~> +J`c4Zrr@W4p#buJJ`d!pr;b@IJ``up!!)TP!!&t[rW%N3J`_OGrT=+[J,~> +JaVdjrr@W<p$Mh[q!J.^K'rO:!:JD<V!\3_nEp8VJaTW-rW%N;JaS*WrpKddJ,~> +Ja2Lbrr@W8p$)MWq!%hZK'N76!:&,8V!7p[nEKuRJa0?%rW%N7Ja.gOrp'L`J,~> +J`c4Zrr@W4p#Z8SpuVSVK')t2!9Vl4UuhXWnE']NJ`a&rrW%N3J`_OGroX4\J,~> +JaVdjrr@W<p$Mh[q!J.^K^SX9!:JP@qsFFaJaS*W^[D($JaS*WJaWR+rr@Q~> +Ja2Lbrr@W8p$)MWq!%hZK^/@5!:&8<qs".]Ja.gO^ZtduJa.gOJa3:#rr@Q~> +J`c4Zrr@W4p#Z8SpuVSVK]`14rr2u\gAh'4!!%T4J`a`0rW%N3J`_OGs5s=]J,~> +JaVdjrr@W<p$Mh[q!J.^L[Os<!:J\D!:KdcVX=EaJaW0u!!&YZrW%N;JaS*W!q$$gJ,~> +Ja2Lbrr@W8p$)MWq!%hZL[+[8!:&D@!:'L_VWn-]Ja2mm!!&YVrW%N7Ja.gO!pTacJ,~> +J`c4Zrr@W4p#Z8SpuVSVLZ\L7rr2u\hZ!T<rVrbW!!%T4o]?,RTB?+QJ`_OGJ`[$r!!%N~> +JaVdjrr@W<p$Mh[q!J.^Q0nVPq!J._meQn`mb.YlmXaf1mf!3;mXaeWmf*9;~> +Ja2Lbrr@W8p$)MWq!%hZQ0JALq!%n[lM:J\lIl5hl@J6)lM^d7l@J5OlMgj7~> +J`c4Zrr@W4p#Z8SpuVSVQ0&&HpuVSWk5>;ZrrD38s+0<`k-4"I!.j9`k(2[p!.Y~> +JaVdjrr@W<p$Mh[rU'[crU'[cPjSMOqX41[!:JP@JaSon!W_WgR-stSJaS*WJaWO<J,~> +Ja2Lbrr@W8p$)MWrTX@_rTX@_Pj/8KqW\(\qZ$W]g&Q]hR-F_Ql2[4:rr@W8Ja.gOrr@Q~> +J`c4Zrr@W4p#Z8SrT4+[rT4+[Pi_rGqW@\Us8N)]gAc`dR-"GMjoCe2rr@W4J`_OGrr@Q~> +JaVdjrr@W<p$Mh[q!J.^PO8DNrU/8;!:KdcU[A*^JaW-t!!&ARrr@W<JaS-Xrr@Q~> +Ja2Lbrr@W8p$)MWq!%hZPNi/JrTXC`s4IAPlMU^Xl2Ug8lLX9@!13!N!.jEdl@S=$!.Y~> +J`c4Zrr@W4p#Z8SpuVSVPNDiFrT=%Yg]%99rVrYT!!%T4oB$#QQfe;JJ`_OGK'*(5J,~> +JaVdjrr@W<p$Mh[q!J.^P4$`ukO&<MJaS*W^[D+%JaS*WKC8a>J,~> +Ja2Lbrr@W8p$)MWq!%hZP3N&IdfARr!!%T8Ja1#8rr@W8Ja.mQrr@Q~> +J`c4Zrr@W4p#Z8SpuVSVP32`Dec4gp!!%T4J`a`0rr@W4J`_UIrr@Q~> +JaVdjrr@W<p$Mh[q!J.^Pj[3)!:KgdJaS`i!!&&IrW%N;JaS3Zrr@Q~> +Ja2Lbrr@W8p$)MWq!%hZPj6p%!:'O`Ja/Ha!!&&ErW%N7Ja.pRrr@Q~> +J`c4Zrr@W4p#Z8SpuVSVPihrFh#@B:rr7Q3PNDiFNop<@J`_OGK]`:7J,~> +JaVdjrr@W<p$Mh[q!J.^QL<<(JaS*WS*p7UJaS*WL$ns@J,~> +Ja2Lbrr@W8p$)MWq!%hZQKm$$Ja.gOS*KtQJa.gOL$J[<J,~> +J`c4Zrr@W4p#Z8SpuVSVQKJ2If`-NbJ``HarW%N3J`_[Krr@Q~> +JaVdjrr@W<p$VPRcgCc5rU'XcrU'Xcf'_&gJaSfk!!%`@rW%N;JaS9\rr@Q~> +Ja2Lbrr@W8p$25NcftK1rTX@_rTX@_f':ccJa/Nc!!%`<rW%N7Ja/!Trr@Q~> +J`c4Zrr@W4p#buJcfP6-rT4+[rT4+[f&lu4fDgEaQ0&&HL$&@7J`_OGL?AL9J,~> +JaVdjrr@W<\*a4rrpBadrpBadfC%;l!q$$gTC)[ZJaW4!!!)HT!!&DSrW%N;JaS<]rr@Q~> +Ja2Lbrr@W8\*<qnrosI`rosI`fBV#h!pTacTBZCVJa2pn!!)HP!!&DOrW%N7Ja/$Urr@Q~> +J`c4Zrr@W4\)m\jroO4\roO4\fB3)5s8N'!hZ!Z>s8S_R!!%T4p#Z5SmcFKLR-+AJJ`_OGLZ\U: +J,~> +JaVdjrr@W<[dF>"md:)CmJtr.f`2$?rW(F8!!%T<JaU>ArW%N;JaS?^rr@Q~> +Ja2Lbrr@W8[d"%slKSB7l2]N&f`2$;rW(F4!!%T8Ja1&9rW%N7Ja/'Vrr@Q~> +J`c4Zrr@W4[cReok2u^+k5X,s!!)ut!!(pV!9X:\e)gW1J`_OG^ukUrJ`_OGM!"^;J,~> +JaVdjrr@W<[I+.tmJuYTg@!Yp!:KgdJaScjrr@W<r9jOaJaS*WM=1BDJ,~> +Ja2Lbrr@W8[H[kpl2^)Lg?RAl!:'O`Ja/Kbrr@W8r9F7]Ja.gOM<b*@J,~> +J`c4Zrr@W4[H7Vlk5XTDg?.,h!9X:\J``3Zrr@W4r9!tYJ`_OGM<=g<J,~> +JaVdjrr@W<[-mnnh!Wkr!:KgdJaS*WM=1?CJaS*WMXLKEJ,~> +Ja2Lbrr@W8[-IVjh!3Sn!:'O`Ja.gOM<b'?Ja.gOMX(3AJ,~> +J`c4Zrr@W4[-%Afgu\S:g]%99rr7Q3J`_gOrW%N3J`_jPrr@Q~> +JaVdjrr@W<\F0%jipPCuJaS*WM=16@JaS*WMXLKEJ,~> +Ja2Lbrr@W8\E`bfip,+qJa.gOM<as<Ja.gOMX(3AJ,~> +J`c4Zrr@W4\E<Mbio^7?!!(dRJ`_OGM<=[8J`_OGMWXp=J,~> +JaVdjrr@W<[-mnniU5D"!:KdcT^Dd[JaW4!!!(jC!!&YZqZ-Zarr@W<JaSHarr@Q~> +Ja2Lbrr@W8[-IVjiTf+s!:'L_T]uLWJa2pn!!(j?!!&YVqZ-Z]rr@W8Ja/0Yrr@Q~> +J`c4Zrr@W4[-%AfiTC.>!!(mU!9X7[T]Q4SJ`cXf!!(j;!!&YRqZ-ZYrr@W4J`_mQrr@Q~> +JaVdjrr@W<[I+.tmJuYTjR1V"_<q:'QL4_QJaU#8qZ-N]rr@W<JaSKbrr@Q~> +Ja2Lbrr@W8[H[kpl2^)LjQb=s_<M"#QKeGMJa0`0qZ-NYrr@W8Ja/3Zrr@Q~> +J`c4Zrr@W4[H7Vlk5XTDjQ?LB!!(aQ_<(^tQKA/IJ`aH(qZ-NUrr@W4J`_pRrr@Q~> +JaVdjrr@W<[dF>"md:)CmJuM>f)UBiP3r;MJaW7"rW)]\rr@W<JaSNcrr@Q~> +Ja2Lbrr@W8[d"%slKSB7l2^)6f)UBeP3N#IJa2sorW)]Xrr@W8Ja/6[rr@Q~> +J`c4Zrr@W4[cReok2u^+k5X].fDgEaP3)`EJ`c[grW)]Trr@W4J`_sSrr@Q~> +JaVdjrr@W<d-^l6rU'XcrU'XcoBlSYrpBadrpBadmI&O*SF-@WJaS*Wh<t7BJaS*WNpcoIJ,~> +Ja2Lbrr@W8d-:T2rTX@_rTX@_oBH;UrosI`rosI`mHW7&SE^(SJa.gOh<Ot>Ja.gONp?WEJ,~> +J`c4Zrr@W4d,k?.rT4+[rT4+[oB$&QroO4\roO4\mH3""SE9eOJ`_OGh<+\:J`_OGNop?AJ,~> +JaVdjrr@W<cgCc5rpBadrpBadoBlSYrU'XcrU'XcnF#'3!:KdcJaS*WL@,$An*^/TJaS*WO7*#J +J,~> +Ja2Lbrr@W8cftK1rosI`rosI`oBH;UrTX@_rTX@_nESd/!:'L_Ja.gOL?\a=n*9lPJa.gOO6Z`F +J,~> +J`c4Zrr@W4cfP6-roO4\roO4\oB$&QrT4+[rT4+[nE0cN!!(pV!9X7[J`_OGL?8I9n)jTLJ`_OG +O66HBJ,~> +JaVdjrr@W<cL(l:md:)CmJtr.gAh<C!!&PW!!%T<p$Me[bO,?1R-sqRJaS*WORE,KJ,~> +Ja2Lbrr@W8cKYT6lKSB7l2]N&gAh<?!!&PS!!%T8p$)MWbN]'-R-OYNJa.gOOQuiGJ,~> +J`c4Zrr@W4cK5?2k2u^+k5X,srr2ruhu<c?s8SVO!!%T4p#Z5SbN8d)R-+AJJ`_OGOQQQCJ,~> +JaVdjrr@W<c0b]7mJuYTh!W_nXmQ/hQL4_QJaTW-rW%N;JaSZgrr@Q~> +Ja2Lbrr@W8c0>E3l2^)Lh!3GjXm,ldQKeGMJa0?%rW%N7Ja/B_rr@Q~> +J`c4Zrr@W4c/o0/k5XTDgueS8!!(dRXl]T`QKA/IJ`a&rrW%N3J``*Wrr@Q~> +JaVdjrr@W<bjPH1hX:@C!:JP@WpTieJaS*Wg[5%Ak3i3KJaS*WP4&>MJ,~> +Ja2Lbrr@W8bj,0-hWk(?!:&8<Wp0QaJa.gOgZeb=k3DpGJa.gOP3W&IJ,~> +J`c4Zrr@W4bi\p)hWFh;!9W#8Woa9]J`_OGgZAJ9k2uXCJ`_OGP32cEJ,~> +JaVdjrr@W<iU-[GrU'XcrU'XcqsO.Xk3i0J!:J\D!:KgdS*p:VJaS*WbO5?0JaS*WPOAGNJ,~> +Ja2Lbrr@W8iT^CCrTX@_rTX@_qs*kTk3DmF!:&D@!:'O`S*L"RJa.gObNf',Ja.gOPNr/JJ,~> +J`c4Zrr@W4iT:.?rT4+[rT4+[qr[VPk2uXB!9W/<!9X:\S*'_NJ`_OGbNAd(J`_OGPNMlFJ,~> +JaVdjrr@W<i9gRFrpBadrpBadp?qn[jmN*J!:JYC!:KgdJaS*WJaVF`rW%N;JaScjrr@Q~> +Ja2Lbrr@W8i9C:BrosI`rosI`p?MVWjm)gF!:&A?!:'O`Ja.gOJa2.XrW%N7Ja/Kbrr@Q~> +J`c4Zrr@W4i8t%>roO4\roO4\p?)ASjlZRB!9W,;!9X:\J`_OGJ`bkPrW%N3J``3Zrr@Q~> +JaVdjrr@W<hsL[Kmd:)CmJutK"9@iimJuM>rVurdh#IHCrW%N;NpZlI\aBFt^?tt$h!Y1BJaS*W +Pj\POJ,~> +Ja2Lbrr@W8hs(CGlKSB7l2^PC"9@]el2^)6rVur`h#IH?rW%N7Np6TE\`s.p^?P[uh!4n>Ja.gO +Pj88KJ,~> +J`c4Zrr@W4hrY.Ck2u^+k5Y/;"TRWak5X].rr2u\h>[K;rr7Q3Nog<A\`Nkl^?,CqgueV:J`_OG +PihuGJ,~> +JaVdjrr@W<hX1LHmJuYTp?i+bmd:)CmJuYBeGu!)!!&DSrr@W<XR?)gJaS*WQ1"YPJ,~> +Ja2Lbrr@W8hWb4Dl2^)Lp?Dh^lKSB7l2^5:eGu!%!!&DOrr@W8XQofcJa.gOQ0SALJ,~> +J`c4Zrr@W4hW=t@k5XTDp>uSZk2u^+k5Xi2ec2$!!!&DKrr@W4XQKN_J`_OGQ0/)HJ,~> +JaVdjrr@W<h<t7Bp?hn\rpBadrpBadp[/"]r9i#6R-jqSJaS*WmdC)TeF*>:JaS*WQL=bQJ,~> +Ja2Lbrr@W8h<Ot>p?DVXrosI`rosI`pZ_bYr9D`2R-FYOJa.gOmcsfPeE[&6Ja.gOQKnJMJ,~> +J`c4Zrr@W4h<+_:p>uATroO4\roO4\pZ;GUr8uK.R-"AKJ`_OGmcONLeE6c2J`_OGQKJ2IJ,~> +JaVdjrr@W<mdC)TrpKddrpKdd!:KO\qsFFarU'XcrU'Xcp[/(_mdAd/!:KdcRdL.UJaW0u!!%T< +a6rp,JaS*WQgXkRJ,~> +Ja2Lbrr@W8mcsfPrp'L`rp'L`!:'7Xqs".]rTX@_rTX@_pZ_h[lK[('!:'L_Rd'kQJa2mm!!%T8 +a6NX(Ja.gOQg4SNJ,~> +J`c4Zrr@W4mcOQLroX7\roX7\!9X"TqrRnYrT4+[rT4+[pZ;MWk2tCt!9X7[RcXSMJ`cUe!!%T4 +a6*@$J`_OGQfe;JJ,~> +JaVdjrr@W<mI'uSs6fmes6fmeqsOF`ipQdG!:JYC!q$$gJaS*WJaUbMrW&/M!<7W<L[P0BJ,~> +Ja2Lbrr@W8mHX]Os6BUas6BUaqs+.\ip-LC!:&A?!pTacJa.gOJa1JErW&/I!!%T8L[+m>J,~> +J`c4Zrr@W4mH4HKs5s@]s5s@]qr[nXio^7?!9W,;!p9O_J`_OGJ`b2=rW&/E!!%T4LZ\U:J,~> +JaVdjrr@W<m-alR"mu?jmJm7amK<OX!:BjLmb%R?mf!3;mZ$W7!.jS2mJm71mf!3NmK!9<mYC61 +!.Y~> +Ja2Lbrr@W8m-=TN"mQ'fl2Uh]l3%+P!9sRHlIc.;lM^d7lAb'/!.jG.l2Uh-lM^dJl2Ug8lA+[) +!.Y~> +J`c4Zrr@W4m,n?J"m5jbk5YJYjok_Hs5s@Dk1Tb7k5PC3k)JL'!.j;*jo>D)k5G@Fjo>C4k(i+! +!.Y~> +JaVdjrr@W<p?hn\rU'XcrU0L^qsFXgmd:)CmJuM>rr<&eh>dQDr;`2P!!%cA!!%T<XR?&fQ0nYP +JaS<]rr@Q~> +Ja2Lbrr@W8p?DVXrTX@_rTa4Zqs"@clKSB7l2^)6rr<&ah>dQ@r;`2L!!%c=!!%T8XQocbQ0J>L +Ja/$Urr@Q~> +J`c4Zrr@W4p>uATrT4+[rT<tVqrS+_k2u^+k5X].s8N)]hZ!T<rVr5H!!%c9!!%T4XQKK^Q0&&H +J`_aMrr@Q~> +JaVdjrr@W<q!S.^!q$'VrW)udrrE)er;c`_!!*#d!!*#d!!)HTr;ZichZ*ZErW)BS!!&ARrr@W< +JaU>ArW&8P!<7W<L[P0BJ,~> +Ja2Lbrr@W8q!.kZ!pTdNrW)u`rrE)ar;c`[!!*#`!!*#`!!)HPr;Zi_hZ*ZArW)BO!!&ANrr@W8 +Ja1&9rW&8L!!%T8L[+m>J,~> +J`c4Zrr@W4pu_VV!p9OFrr<#\s8W,]rVucW!<<&\!<<&\!<;KLrVll[hu<]=rr;EK!!&AJrr@W4 +J`ac1rW&8H!!%T4LZ\U:J,~> +JaVdjrr@W<qX+CbmdBEA!U]sdmJm7cmJm7Wmb@dBmem-:mYU?3!.jRGmf!3QmK!9<mYC61!.Y~> +Ja2Lbrr@W8qW\+^lK[^9!U9[`l2Uh_l2UhSlJ)@>lMU^6lA=d+!.jFClM^dMl2Ug8lA+[)!.Y~> +J`c4Zrr@W4qW7kZk2u%1!TsF\joGG[joGGOk1ot:k5G=2k)&4#!.j:?k5G@Ijo>C4k(i+!!.Y~> +JaVdjrr@W<q<eCdmd:&Tmed(`mem.Gmf*7embe'Fmf!3;mXaeWm^MW`!1iQOs+0Tsmf*9;~> +Ja2Lbrr@W8q<A+`lKS?LlMLY\lMU_ClMghalJMXBlM^d7l@J5OlF6'X!1iEK!.jEolMgj7~> +J`c4Zrr@W4q;qk\k2u^Dk5>8Xk5G>?k5YG]k2?7>k5PC3k(2ZGk-sLP!1i9G!.j9kk5PF3~> +JaVdjrr@W<q!J1`mdBrPrU0O_kO/<L!:JYCJaSB_!!%T<p$Me[\aKFsRI1(TJaS<]rr@Q~> +Ja2Lbrr@W8q!%n\lK\6HrTa7[kN`$H!:&A?Ja/*W!!%T8p$)MW\a'.oRHabPJa/$Urr@Q~> +J`c4Zrr@W4puVYXk2uR@rT="WkN;dD!9W,;J`_gO!!%T4p#Z5S\`WkkRH=JLJ`_aMrr@Q~> +JaVdjrr@W<p[7YR"mu?jmJm7VmJm7cmf!1dmb@f,mJm6<me-#J!13*R!13-R!1E6Ts+0Tnmf*9;~> +Ja2Lbrr@W8pZhAN"mQ'fl2UhRl2^k_lM^b`lJ)B(l2Ug8lLjHB!12sN!13!N!1E*P!.jEjlMgj7~> +J`c4Zrr@W4pZD,J"m5jbk5YJNjo>D[k5PA\k1p!$jo>C4k4Rm:!12gJ!12jJ!1DsL!.j9fk5PF3~> +JaVdjrr@W<q!RbSs6fmes6fmenEp;Wmb%SkmdKQD!1*$Q!.jR=mf*9UmK!9<mYC61!.Y~> +Ja2Lbrr@W8q!.JOs6BUas6BUanEL&SlIc/glL4!<!1)mM!.jF9lMgjQl2Ug8lA+[)!.Y~> +J`c4Zrr@W4pu_5Ks5s@]s5s@]nE'`Ok1Tcck3qF4!1)aI!.j:5k5PFMjo>C4k(i+!!.Y~> +JaVdjrr@W<qX3qTrpKddrpKddoBlVZmbRpDmf!3;mYL<2!.jR5mf*9VmK!9<mYC61!.Y~> +Ja2Lbrr@W8qWdYPrp'L`rp'L`oBH>VlJ;L@lM^d7lA4a*!.jF1lMgjRl2Ug8lA+[)!.Y~> +J`c4Zrr@W4qW@DLroX7\roX7\oB$)Rk2-+<k5PC3k(r1"!.j:-k5PFNjo>C4k(i+!!.Y~> +JaVdjrr@W<p?qbW!U]sTmK!=UfDpKjJaS*WV=+<_SF-CWJaS<]rr@Q~> +Ja2Lbrr@W8p?MJS!U9[Pl2^nMfDpKfJa.gOV<\$[SE^(SJa/$Urr@Q~> +J`c4Zrr@W4p?)5O!TsFLjoPMEf`-NbJ`_OGV<7aWSE9eOJ`_aMrr@Q~> +JaVdjrr@W<p[8"\!:Kab!U]sXmb.X@mem-:mXaeWmelJQ!3#>b!.jQhm\9.L!.Y~> +Ja2Lbrr@W8pZh_X!:'I^!U9[TlIl4<lMU^6l@J5OlMToI!3#2^!.jEdlD!SD!.Y~> +J`c4Zrr@W4pZDJT!9X4Z!TsFPk1]h8k5G=2k(2ZGk5=?A!3#&Z!.j9`k+_#<!.Y~> +JaVdjrr@W<qsFLcmdC#R!:Kgd"RZ6imJuqJf`2*A!!&2M!!%T<p$Me[K^Jg?R-sqRJaS*WU[J-^ +J,~> +Ja2Lbrr@W8qs"4_lK\<J!:'O`"R5sel2^MBf`2*=!!&2I!!%T8p$)MWK^&O;R-OYNJa.gOU[%jZ +J,~> +J`c4Zrr@W4qrRt[k2uXB!9X:\"Qoaak5Y,:g&D-9s8S8E!!%T4p#Z5SK]W77R-+AJJ`_OGUZVRV +J,~> +JaVdjrr@W<qX44\!:Kgds6fmep[6Q3JaV=]!!&>Q!!%T<XR?&fJaS*WV!e6_J,~> +Ja2Lbrr@W8qWdqX!:'O`s6BUapZg9/Ja2%U!!&>M!!%T8XQocbJa.gOV!@s[J,~> +J`c4Zrr@W4qW@\T!9X:\s5s@]pZC$+J`bbM!!&>I!!%T4XQKK^J`_OGUuq[WJ,~> +JaVdjrr@W<qX4@`s6fme"RZ9XmJuqJ!<DQD!!)Hd!6+@+!.jRVmJm6<me#oI!2&]Y!.jQhm\T@O +!.Y~> +Ja2Lbrr@W8qWe(\s6BUa"R6!Pl2^MB!<DE@!!)<`!6+4'!.jFRl2Ug8lLa?A!2&QU!.jEdlD<eG +!.Y~> +J`c4Zrr@W4qW@hXs5s@]"QoaHk5Y,:!WV<<rrD3\s2F+#!.j:Njo>C4k4Id9!2&EQ!.j9`k,%5? +!.Y~> +JaVdjrr@W<q!J7bmJuYTp$VbY!:J\D!q$$gOR<)KJaS*WK^Sg>JaS*WVXFHaJ,~> +Ja2Lbrr@W8q!%t^l2^)Lp$2JU!:&D@!pTacOQlfGJa.gOK^/O:Ja.gOVX"0]J,~> +J`c4Zrr@W4puV_Zk5XTDp#c5Q!9W/<!p9O_OQHNCJ`_OGK]`76J`_OGVWRmYJ,~> +JaVdjrr@W<p[8"\p[6]7!:KgdJaS*WJaWF'!!&>QrW%N;JaTH(rr@Q~> +Ja2Lbrr@W8pZh_XpZgE3!:'O`Ja.gOJa3-t!!&>MrW%N7Ja0/urr@Q~> +J`c4Zrr@W4pZDJTpZC0/!9X:\J`_OGJ`cjl!!&>IrW%N3J``lmrr@Q~> +JaVdjrr@W<qsO.XrU/5:P3r;MJaW4!!!%T<oBuVYR-sqRJaS*WW:'ZcJ,~> +Ja2Lbrr@W8qs*kTrT_r6P3N#IJa2pn!!%T8oBQ>UR-OYNJa.gOW9XB_J,~> +J`c4Zrr@W4qr[VPrT;]2P3)`EJ`cXf!!%T4oB-&QR-+AJJ`_OGW94*[J,~> +JaVdjrr@W<p[8"\r9i)8JaS*WhsLIEJaTT,rr@W<JaTK)rr@Q~> +Ja2Lbrr@W8pZh_Xr9=:^ec:9dJa2.X!!%T8X6T]bJa.gOW9XB_J,~> +J`c4Zrr@W4pZDJTr8mtZf)L<`J`bkP!!%T4X60E^J`_OGW94*[J,~> +JaVdjrr@W<q!J:cmJuYTmaqL>mf!3nmJm6<mXafImJm6Hmf*9<mXaf*mf*9;~> +Ja2Lbrr@W8q!&"_l2^)LlMU\_s4mYTlM^djl2Ug8l@J6Al2UgDlMgj8l@J6"lMgj7~> +J`c4Zrr@W4puVb[k5XTDk5G;[!8[YTk5PCfjo>C4k(2[9jo>C@k5PF4k(2Zok5PF3~> +JaVdjrr@W<q<eCdmd:)CmaqL?mJrF<rr@W<JaS*Wo'ZMXJaS*WWp]leJ,~> +Ja2Lbrr@W8q<A+`lKSB7lIZ(;l2["4rr@W8Ja.gOo'65TJa.gOWp9TaJ,~> +J`c4Zrr@W4q;qk\k2u^+k1K\7k5UV,rr@W4J`_OGo&frPJ`_OGWoj<]J,~> +JaVdjrr@W<qX+=`rpKac!:JVBJaS*WJaW@%!!%`@rW%N;JaTT,rr@Q~> +Ja2Lbrr@W8qW\%\rp'I_!:&>>Ja.gOJa3'r!!%`<rW%N7Ja0<$rr@Q~> +J`c4Zrr@W4qW7eXroX4[!9W):J`_OGJ`cdj!!%`8rW%N3J`a#qrr@Q~> +JaVdjrr@W<qsFIbmb%SkmXjj,!.jS2mJm7TmJm6Smf!3;mXaf-mf*9;~> +Ja2Lbrr@W8qs"1^lIc/gl@S:$!.jG.l2UhPl2UgOlM^d7l@J6%lMgj7~> +J`c4Zrr@W4qrRqZk1Tcck(;^q!.j;*jo>DLjo>CKk5G@3k(2Zrk5PF3~> +JaVdjrr@W<r9aXemJu\7!!)Hc!0$=G!.jRQmJm6<m]>jU!.jQhm]GpW!.Y~> +Ja2Lbrr@W8r9=Cal2^,/!!)<_!0$1C!.jFMl2Ug8lE':M!.jEdlE0@O!.Y~> +J`c4Zrr@W4r8n(]k5XT'rrD3[s,?(?!.j:Ijo>C4k,d_E!.j9`k,meG!.Y~> +JaVdjrr@W<rU'ghmJuYTmc4?KmJrgGrrADR!!%T<`pWj,JaWI(rW%N;JaT]/rr@Q~> +Ja2Lbrr@W8rTXRdlMp,LlJqpGl2[C?rrADN!!%T8`p3R(Ja30urW%N7Ja0E'rr@Q~> +J`c4Zrr@W4rT47`joFQDk2cOCk5V"7rrADJ!!%T4`od:$J`cmmrW%N3J`a,trr@Q~> +JaVdjrr@W<r9a^gmJuYTmc4A.mJm6<mXaeWmbmO4!.jQhm]Z'Y!.Y~> +Ja2Lbrr@W8r9=IclMp,LlJqr*l2Ug8l@J5OlJUt,!.jEdlEBLQ!.Y~> +J`c4Zrr@W4r8n._joFQDk2cQ&jo>C4k(2ZGk2>D$!.j9`k-*qI!.Y~> +JaVdjrr@W<qsOF`!:JtLJaS*WJaS*Wm-a]MJaS*WYjVMkJ,~> +Ja2Lbrr@W8qs+1]!WVHI!.jEdl@J5OlKmg4!.jEdlEKRR!.Y~> +J`c4Zrr@W4qr[qY!<D9Es+0<`k(2ZGk3V7,!.j9`k-4"J!.Y~> +JaVdjrr@W<qX3JGJaS*W!!%T<p$Me[h!P.BT^M[Ws6fjdJaS*WZ0qVlJ,~> +Ja2Lbrr@W8qWd2CJa.gO!!%T8p$)MWh!+k>T^)CSs6BR`Ja.gOZ0M>hJ,~> +J`c4Zrr@W4qW?r?J`_OG!!%T4p#Z5Sgu\S:T]Z+Os5s:\J`_OGZ0)&dJ,~> +JaVdjrr@W<qX3PIN:$ZGJaTZ.!!&AR!!&e^qZ-N]rW%N;JaTi3rr@Q~> +Ja2Lbrr@W8qWdDI!<<#uN9UBCJa0B&!!&AN!!&eZqZ-NYrW%N7Ja0Q+rr@Q~> +J`c4Zrr@W4qW@/E!!*#uN91*?J`a)s!!&AJ!!&eVqZ-NUrW%N3J`a9#rr@Q~> +JaVdjrr@W<rU/kLN:$ZGQL4_QJaV1Y!!%T<p?qn[p[8%]JaS*WZL7_mJ,~> +Ja2Lbrr@W8rT`SHN9UBCQKeGMJa1nQ!!%T8p?MVWpZhbYJa.gOZKhGiJ,~> +J`c4Zrr@W4rT="XmJi.-!!&>I!!%T4f]E/6J`c[grW)]Trr@W4J`a9#rr@Q~> +JaVdjrr@W<s6fdb!q$'VoDes\!!)][!!%T<N:$ZGJaS*Wh!Y1BJaS*WZgRhnJ,~> +Ja2Lbrr@W8s6BL^!p]gNoDesX!!)]W!!%T8N9UBCJa.gOh!4n>Ja.gOZg.PjJ,~> +J`c4Zrr@W4s5s4Z!p0LFo`#!Ts8VcS!!%T4N91*?J`_OGgueV:J`_OGZf_8fJ,~> +JaVdjrr@Z=qZ$Wao)JdYrW%N;JaS*WJaVgk!!)HTrr@W<JaTo5rr@Q~> +Ja2Lbrr@Z9qZ$W]o)JdUrW%N7Ja.gOJa2Oc!!)HPrr@W8Ja0W-rr@Q~> +J`c4Zrr@Z5qZ$WYoD\gQrr7Q3J`_OGJ`c7[!!)HLrr@W4J`a?%rr@Q~> +JaVdjrr@`?quH]`!<DQ_!!)Hd!.jQhmJm6<me,uJ!.jRsmf!3;mXaf6mf*9;~> +Ja2Lbrr@`;quH]\!WVH[!!)<`!.jEdl2Ug8lLjEB!.jFolM^d7l@J6.lMgj7~> +J`c4Zrr@`7quH]X!<D9WrrD3\s+0<`jo>C4k4Rj:!.j:kk5G@3k(2[&k5PF3~> +JaVdjrr@iBqZ-Q^!s%`hmeQnamJr15!!%T<JaS*W`pWg+JaS*W[dO.qJ,~> +Ja2Lbrr@i>qZ-QZ"97WdlMCP_s69TBl2Ug8l@J5OlGi,g!.jEdlF-!X!.Y~> +J`c4Zrr@i:qZ-QV!s%K`k55/[!9X<>jo>C4k(2ZGk/QQ_!.j9`k-jFP!.Y~> +JaVdjrr@oDquHT]!!*#drr<5j!!)Ee!.jS7mJm6Rmf*9<mXaf]mJm7Lmf!3;mXaf8mf*9;~> +Ja2Lbrr@o@quHTY!<<&`rr<5f!!)9a!.jG3l2UgNlMgj8l@J6Ul2UhHlM^d7l@J60lMgj7~> +J`c4Zrr@o<quHTU!!*#\s8N8bs8V6]s+0>/jo>CJk5PF4k(2[Mjo>DDk5G@3k(2[(k5PF3~> +JaVdjrrA#GqZ-<WrrE)errE)errD6M!!%T<TC2^ZJaS*WbO5?0JaS*W\F0@sJ,~> +Ja2LbrrA#CqZ-<SrrE)arrE)arrD6I!!%T8TBcFVJa.gObNf',Ja.gO\Ea(oJ,~> +J`c4ZrrA#?qZ-<Os8W,]s8W,]s8V9E!!%T4TB?.RJ`_OGbNAd(J`_OG\E<ekJ,~> +JaVdjrrA)IquH?VrrE&drrE&drr@W<JaS*WJaW'r!!(jCrW%N;JaU):rr@Q~> +Ja2LbrrA)EquH?RrrE&`rrE&`rr@W8Ja.gOJa2dj!!(j?rW%N7Ja0f2rr@Q~> +J`c4ZrrA)AquH?Ns8W)\s8W)\s8RZ4J`_OGJ`cLb!!(j;rW%N3J`aN*rr@Q~> +JaVdjrrA2LqZ)38JaS*WipHdHJaUkPrW%N;JaU,;rr@Q~> +Ja2LbrrA2HqZ)34Ja.gOip$LDJa1SHrW%N7Ja0i3rr@Q~> +J`c4ZrrA2DqZ)30J`_OGioU4@J`b;@rW%N3J`aQ+rr@Q~> +JaVdjrrA8NquD<9q<e4_JaW4!!!%T<XR6&gQgXhQJaS*W]C,\!J,~> +Ja2LbrrA8JquD<5q<@q[Ja2pn!!%T8XQfccQg4PMJa.gO]B]CrJ,~> +J`c4ZrrA8FquD<1q;qYWJ`cXf!!%T4XQBK_Qfe8IJ`_OG]B9+nJ,~> +JaVdjrrAAQqZ)38JaVjl!!&>Q!!%T<g$Sh?eF*>:JaS*W]C,\!J,~> +Ja2LbrrAAMqZ)34Ja2Rd!!&>M!!%T8g$/P;eE[&6Ja.gO]B]CrJ,~> +J`c4ZrrAAIqZ)30J`c:\!!&>I!!%T4g#`87eE6c2J`_OG]B9+nJ,~> +JaVdjrrAGSquD<9JaVso!!%T<o^2\ZJaUPGrr@W<JaU2=rr@Q~> +Ja2LbrrAGOquD<5Ja2[g!!%T8o]cDVJa18?rr@W8Ja0o5rr@Q~> +J`c4ZrrAGKquD<1J`cC_!!%T4o]?,RJ`au7rr@W4J`aW-rr@Q~> +JaVdjrrAPVqZ)38q!J+^JaS*WJaTT,rr@W<JaU5>rr@Q~> +Ja2LbrrAPRqZ)34q!%hZJa.gOJa0<$rr@W8Ja0r6rr@Q~> +J`c4ZrrAPNqZ)30puVPVJ`_OGJ`a#qrr@W4J`aZ.rr@Q~> +JaVdjrrAVXquD<9JaS*WipHdHJaW4!!!(10rr@W<JaU8?rr@Q~> +Ja2LbrrAVTquD<5Ja.gOip$LDJa2pn!!(1,rr@W8Ja0u7rr@Q~> +J`c4ZrrAVPquD<1J`_OGioU4@J`cXf!!(1(rr@W4J`a]/rr@Q~> +JaVdjrrA_[qZ)38qX+=`JaW4!!!%T<RdL.UR-sqRJaS*W^[D+%J,~> +Ja2LbrrA_WqZ)34qW\%\Ja2pn!!%T8Rd'kQR-OYNJa.gO^Zth!J,~> +J`c4ZrrA_SqZ)30qW7bXJ`cXf!!%T4RcXSMR-+AJJ`_OG^ZPOrJ,~> +JaVdjrrAe]quD<9JaV4Z!!&>Q!!%T<lg=`Q_s[L(JaS*W_!_4&J,~> +Ja2LbrrAeYquD<5Ja1qR!!&>M!!%T8lfnHM_s74$Ja.gO_!:q"J,~> +J`c4ZrrAeUquD<1J`bYJ!!&>I!!%T4lfJ0I_rgpuJ`_OG^ukXsJ,~> +JaVdjrrAn`qZ)38JaV.X!!%uG!!%T<[I4"oJaS*W_=%='J,~> +Ja2LbrrAn\qZ)34Ja1kP!!%uC!!%T8[Hd_kJa.gO_<V%#J,~> +J`c4ZrrAnXqZ)30J`bSH!!%u?!!%T4[H@GgJ`_OG_<1atJ,~> +JaVdjrrAtbquEhd!!(@5rr@W<JaS*WRdU.TJaS*W_X@F(J,~> +Ja2LbrrAt^quEh`!!(@1rr@W8Ja.gORd0kPJa.gO_Wq.$J,~> +J`c4ZrrAtZquEh\!!(@-rr@W4J`_OGRcaSLJ`_OG_WLjuJ,~> +JaVdjrrB(eqZ)38JaS*Wj6cmIJaW4!!!'RtrW%N;JaUGDrr@Q~> +Ja2LbrrB(aqZ)34Ja.gOj6?UEJa2pn!!'RprW%N7Ja1/<rr@Q~> +J`c4ZrrB(]qZ)30J`_OGj5p=AJ`cXf!!'RlrW%N3J`al4rr@Q~> +JaVdjrrB.gquD<9qX+=`JaW4!!!%T<p$Me[Q0nVPR-sqRJaS*W`:!X*J,~> +Ja2LbrrB.cquD<5qW\%\Ja2pn!!%T8p$)MWQ0J>LR-OYNJa.gO`9R@&J,~> +J`c4ZrrB._quD<1qW7bXJ`cXf!!%T4p#Z5SQ0&&HR-+AJJ`_OG`9.("J,~> +JaVdjrrB7jqZ)38q!J+^JaS*WkO/?MJaWL)!!':lrW%N;JaUMFrr@Q~> +Ja2LbrrB7fqZ)34q!%hZJa.gOkN`'IJa34!!!':hrW%N7Ja15>rr@Q~> +J`c4ZrrB7bqZ)30puVPVJ`_OGkN;dEJ`cpn!!':drW%N3J`ar6rr@Q~> +JaVdjrrB=lquD<9Z0hSlJaTl4rr@W<U[J-^JaS*W`U<a+J,~> +Ja2LbrrB=hquD<5Z0D;hJa0T,rr@W8U[%jZJa.gO`TmI'J,~> +J`c4ZrrB=dquD<1Z/u#dJ`a<$rr@W4UZVRVJ`_OG`TI1#J,~> +JaVdjrrBFoqZ*,R!!)!G!!%T<JaS*WL[P0BJaS*W`pWj,J,~> +Ja2LbrrBFkqZ*,N!!)!C!!%T8Ja.gOL[+m>Ja.gO`p3R(J,~> +J`c4ZrrBFgqZ*,J!!)!?!!%T4J`_OGLZ\U:J`_OG`od:$J,~> +JaVdjrrBLqqZ)38JaS*WJaV.X!!&qbrr@W<JaUSHrr@Q~> +Ja2LbrrBLmqZ)34Ja.gOJa1kP!!&q^rr@W8Ja1;@rr@Q~> +J`c4ZrrBLiqZ)30J`_OGJ`bSH!!&qZrr@W4J`b#8rr@Q~> +JaVdjrrBUtqZ$]c!!%T<JaW'r!!%T<p$Me[JaSrorr@W<JaUVIrr@Q~> +Ja2LbrrBUpqZ$]_!!%T8Ja2dj!!%T8p$)MWJa/Zgrr@W8Ja1>Arr@Q~> +J`c4ZrrBUlqZ$][!!%T4J`cLb!!%T4p#Z5SJ``B_rr@W4J`b&9rr@Q~> +JaVdjrrB\!quHZ_rr@W<s6]jeJaS*Wea<D;NpZlIT^MdZJaS*WamT0/J,~> +Ja2LbrrB[rquHZ[rr@W8s69RaJa.gOe`m,7Np6TET^)LVJa.gOam/m+J,~> +J`c4ZrrB[nquHZWrr@W4s5j:]J`_OGe`Hi3Nog<AT]Z4RJ`_OGal`U'J,~> +JaVdjrrBe$qZ-K\rW%N;WpTieQgOhRYjMJkJaSZgrW%N;JaU\Krr@Q~> +Ja2LbrrBduqZ-KXrW%N7Wp0QaQg+PNYj)2gJa/B_rW%N7Ja1DCrr@Q~> +J`c4ZrrBdqqZ-KTrW%N3Woa9]Qf\8JYiYocJ``*WrW%N3J`b,;rr@Q~> +JaVdjrrBk&quHHY!W_WgR-stSoBlSYJaW0u!!%T<JaS3ZrW%N;JaU_Lrr@Q~> +Ja2LbrrBk"quHHU!W_KcR-O\OoBH;UJa2mm!!%T8Ja.pRrW%N7Ja1GDrr@Q~> +J`c4ZrrBjsquHHQ!W_?_R-+DKoB$#QJ`cUe!!%T4J`_XJrW%N3J`b/<rr@Q~> +JaVdjrrBt)quD<9JaS*WJaV+W!!&>QrW%N;JaUbMrr@Q~> +Ja2LbrrBt%quD<5Ja.gOJa1hO!!&>MrW%N7Ja1JErr@Q~> +J`c4ZrrBt!quD<1J`_OGJ`bPG!!&>IrW%N3J`b2=rr@Q~> +JaVdjrrC%+quD<9JaVso!!%T<p$Me[JaW*s!!&DSrW%N;JaUeNrr@Q~> +Ja2LbrrC%'quD<5Ja2[g!!%T8p$)MWJa2gk!!&DOrW%N7Ja1MFrr@Q~> +J`c4ZrrC%#quD<1J`cC_!!%T4p#Z5SJ`cOc!!&DKrW%N3J`b5>rr@Q~> +JaVdjrrC..quD<9q!J+^JaS*W_sRL)QgOhRQgXhQJaS*WcL1]4J,~> +Ja2LbrrC.*quD<5q!%hZJa.gO_s.4%Qg+PNQg4PMJa.gOcKbE0J,~> +J`c4ZrrC.&quD<1puVPVJ`_OG_r^q!Qf\8JQfe8IJ`_OGcK>-,J,~> +JaVdjrrC40quD<9O7*#JQgOhRQL4_QT^Dd[NUHcGJaS*WcgLf5J,~> +Ja2LbrrC4,quD<5O6Z`FQg+PNQKeGMT]uLWNU$KCJa.gOcg(N1J,~> +J`c4ZrrC4(quD<1O66HBQf\8JQKA/IT]Q4SNTU3?J`_OGcfY6-J,~> +JaVdjrrC=3quD<9q!J+^JaW:#rr@W<JaS*Wo'ZMXJaS*WcgLf5J,~> +Ja2LbrrC=/quD<5q!%hZJa3!prr@W8Ja.gOo'65TJa.gOcg(N1J,~> +J`c4ZrrC=+quD<1puVPVJ`c^hrr@W4J`_OGo&frPJ`_OGcfY6-J,~> +JaVdjrrCC5quD<9JaS*WJaV.X!!%]?rr@W<JaUnQrr@Q~> +Ja2LbrrCC1quD<5Ja.gOJa1kP!!%];rr@W8Ja1VIrr@Q~> +J`c4ZrrCC-quD<1J`_OGJ`bSH!!%]7rr@W4J`b>Arr@Q~> +JaVdjrrCL8quD<9JaS*WiU-[GJaS*Wp?qq\JaS*WdI.#7J,~> +Ja2LbrrCL4quD<5Ja.gOiT^CCJa.gOp?MYXJa.gOdH^`3J,~> +J`c4ZrrCL0quD<1J`_OGiT:+?J`_OGp?)ATJ`_OGdH:H/J,~> +JaVdjrrCR:quD<9q<e4_JaW4!!!%T<JaV"T!!&DSrW%N;JaUtSrr@Q~> +Ja2LbrrCR6quD<5q<@q[Ja2pn!!%T8Ja1_L!!&DOrW%N7Ja1\Krr@Q~> +J`c4ZrrCR2quD<1q;qYWJ`cXf!!%T4J`bGD!!&DKrW%N3J`bDCrr@Q~> +JaVdjrrC[=quD<9JaWL)!!&>Q!!%T<`pNg,JaWI(rW%N;JaV"Trr@Q~> +Ja2LbrrC[9quD<5Ja34!!!&>M!!%T8`p*O(Ja30urW%N7Ja1_Lrr@Q~> +J`c4ZrrC[5quD<1J`cpn!!&>I!!%T4`o[7$J`cmmrW%N3J`bGDrr@Q~> +JaVdjrrCd@qZ)38kO&<MM=(?DJaS*WJaVIarW%N;JaV%Urr@Q~> +Ja2LbrrCd<qZ)34kNW$IM<Y'@Ja.gOJa21YrW%N7Ja1bMrr@Q~> +J`c4ZrrCd8qZ)30kN2aEM<4d<J`_OGJ`bnQrW%N3J`bJErr@Q~> +JaVdjrrCjBquG(2!!'%e!!%T<JaS*WipHdHJaW:#q>c*7JaV(Vrr@Q~> +Ja2LbrrCj>quG(.!!'%a!!%T8Ja.gOip$LDJa3!pq>c*3Ja1eNrr@Q~> +J`c4ZrrCj:quG(*!!'%]!!%T4J`_OGioU4@J`c^hq>c*/J`bMFrr@Q~> +JaVdjrrCsEqZ)38JaS*WipHdHJaS*WmI'iOs6fjdJaS*Wf'`P<J,~> +Ja2LbrrCsAqZ)34Ja.gOip$LDJa.gOmHXQKs6BR`Ja.gOf'<88J,~> +J`c4ZrrCs=qZ)30J`_OGioU4@J`_OGmH49Gs5s:\J`_OGf&lu4J,~> +JaVdjrrD$GquD<9q<e4_JaW4!!!%T<JaUAB!!&h_qZ-N]rW%N;JaV.Xrr@Q~> +Ja2LbrrD$CquD<5q<@q[Ja2pn!!%T8Ja1):!!&h[qZ-NYrW%N7Ja1kPrr@Q~> +J`c4ZrrD$?quD<1q;qYWJ`cXf!!%T4J`af2!!&hWqZ-NUrW%N3J`bSHrr@Q~> +JaVdjrrD-JqZ)38JaVmm!!%T<X6orf_sRL)JaW:#rW)]\rW%N;JaV1Yrr@Q~> +Ja2LbrrD-FqZ)34Ja2Ue!!%T8X6KZb_s.4%Ja3!prW)]XrW%N7Ja1nQrr@Q~> +J`c4ZrrD-BqZ)30J`c=]!!%T4X6'B^_r^q!J`c^hrW)]TrW%N3J`bVIrr@Q~> +JaVdjrrD3LquD<9JaVdj!!%T<q<e4_JaS*Wh!Y.AJaS*Wg$\k?J,~> +Ja2LbrrD3HquD<5Ja2Lb!!%T8q<@q[Ja.gOh!4k=Ja.gOg$8S;J,~> +J`c4ZrrD3DquD<1J`c4Z!!%T4q;qYWJ`_OGgueS9J`_OGg#i;7J,~> +JaVdjrrD<OqZ+@u!!'_#rr@W<JaS*WJaV(V!!)HTrr@W<JaV4Zrr@Q~> +Ja2LbrrD<KqZ+@q!!'^trr@W8Ja.gOJa1eN!!)HPrr@W8Ja1qRrr@Q~> +J`c4ZrrD<GqZ+@m!!'^prr@W4J`_OGJ`bMF!!)HLrr@W4J`bYJrr@Q~> +JaVdjrrDBQquD<9JaS*WipHdHJaW4!!!%T<i9pUFJaS*Wg@"t@J,~> +Ja2LbrrDBMquD<5Ja.gOip$LDJa2pn!!%T8i9L=BJa.gOg?S\<J,~> +J`c4ZrrDBIquD<1J`_OGioU4@J`cXf!!%T4i9(%>J`_OGg?/D8J,~> +JaVdjrrDKTqZ)38qX+=`JaW4!!!%T<JaTc1!!&ARrr@W<JaV:\rr@Q~> +Ja2LbrrDKPqZ)34qW\%\Ja2pn!!%T8Ja0K)!!&ANrr@W8Ja2"Trr@Q~> +J`c4ZrrDKLqZ)30qW7bXJ`cXf!!%T4J`a3!!!&AJrr@W4J`b_Lrr@Q~> +JaVdjrrDQVquD<9p[/"]JaS*WNpZlIea<D;JaW4!!!)0LrW%N;JaV=]rr@Q~> +Ja2LbrrDQRquD<5pZ__YJa.gONp6TEe`m,7Ja2pn!!)0HrW%N7Ja2%Urr@Q~> +J`c4ZrrDQNquD<1pZ;GUJ`_OGNog<Ae`Hi3J`cXf!!)0DrW%N3J`bbMrr@Q~> +JaVdjrrDZYqZ)38JaV1Y!!&AR!!)c]rr@W<JaU_LrW%N;JaV@^rr@Q~> +Ja2LbrrDZUqZ)34Ja1nQ!!&AN!!)cYrr@W8Ja1GDrW%N7Ja2(Vrr@Q~> +J`c4ZrrDZQqZ)30J`bVI!!&AJ!!)cUrr@W4J`b/<rW%N3J`beNrr@Q~> +JaVdjrrD`[quEhd!!(@5!!%T<JaS*WJaT`0rW%N;JaVC_rr@Q~> +Ja2LbrrD`WquEh`!!(@1!!%T8Ja.gOJa0H(rW%N7Ja2+Wrr@Q~> +J`c4ZrrD`SquEh\!!(@-!!%T4J`_OGJ`a/urW%N3J`bhOrr@Q~> +JaVdjrrDi^qZ)38JaS*WJaV+W!!%T<p$Me[h!Y.AJaS*WhsULEJ,~> +Ja2LbrrDiZqZ)34Ja.gOJa1hO!!%T8p$)MWh!4k=Ja.gOhs14AJ,~> +J`c4ZrrDiVqZ)30J`_OGJ`bPG!!%T4p#Z5SgueS9J`_OGhraq=J,~> +JaVdjrrDo`quD<9fBrV=rU'XcrU'XcU@&!]JaW4!!!%T<X6orfR-sqRJaS*Wi9pUFJ,~> +Ja2LbrrDo\quD<5fBN>9rTX@_rTX@_U?V^YJa2pn!!%T8X6KZbR-OYNJa.gOi9L=BJ,~> +J`c4ZrrDoXquD<1fB*)5rT4+[rT4+[U?2FUJ`cXf!!%T4X6'B^R-+AJJ`_OGi9(%>J,~> +JaVdjrrE#cqZ)38q!J+^hX1@DrpBadrpBadJaS*WW9sWckO&<MJaW7"rrCR:rW%N;JaVLbrr@Q~> +Ja2LbrrE#_qZ)34q!%hZhWb(@rosI`rosI`Ja.gOW9O?_kNW$IJa2sorrCR6rW%N7Ja24Zrr@Q~> +J`c4ZrrE#[qZ)30puVPVhW=h<roO4\roO4\J`_OGW9+'[kN2aEJ`c[grrCR2rW%N3J`bqRrr@Q~> +JaVdjrrE)equD<9d-_)<md:)CmJqh+s6]jeSaHIXqsFFaJaS*W^[D($JaS*WipQgHJ,~> +Ja2LbrrE)aquD<5d-:f8lKSB7l2ZD#s69RaSa$1Tqs".]Ja.gO^ZtduJa.gOip-ODJ,~> +J`c4ZrrE)]quD<1d,kQ4k2u^+k5U"ps5j:]S`TnPqrRkYJ`_OG^ZPLqJ`_OGio^7@J,~> +JaVdjq>d&R!!(sF!!(R;"9@iimJuP?!!'_#!!%T<JaS*WX7#reJaS*Wj6lpIJ,~> +Ja2Lbq>d&N!!(sB!!(R7"9@]el2^,7!!'^t!!%T8Ja.gOX6TZaJa.gOj6HXEJ,~> +J`c4Zq>d&J!!(s>!!(R3"TRWak5X`/!!'^p!!%T4J`_OGX60B]J`_OGj6$@AJ,~> +JaVairW%N;amT-.JaS*WOmW2LJaW4!!!(10rr@W<JaVRdrr@Q~> +Ja2IarW%N7am/j*Ja.gOOm2oHJa2pn!!(1,rr@W8Ja2:\rr@Q~> +J`c1YrW%N3al`U&J`_OGOlcWDJ`cXf!!(1(rr@W4J`c"Trr@Q~> +JaVairW%N;c0k9*YO2AjJaW4!!!%T<RI1%TR-stSJaS*WjR3$JJ,~> +Ja2IarW%N7c0G!&YNc)fJa2pn!!%T8RHabPR-O\OJa.gOjQcaFJ,~> +J`c1YrW%N3c0"a"YN>fbJ`cXf!!%T4RH=JLR-+DKJ`_OGjQ?IBJ,~> +JaV^hrW%N;rpBadcL1Z3JaS*WQgOhRJaTr6rr@W<JaVXfrr@Q~> +Ja2F`rW%N7rosI`cKbB/Ja.gOQg+PNJa0Z.rr@W8Ja2@^rr@Q~> +J`c.XrW%N3roO1\cK>-+J`_OGQf\8JJ`aB&rr@W4J`c(Vrr@Q~> +JaV[grW%N;bjGT6mJuYTJaW@%!!&ARrr@W<JaU>ArW%N;JaV[grr@Q~> +Ja2C_rW%N7bj#<2l2^)LJa3'r!!&ANrr@W8Ja1&9rW%N7Ja2C_rr@Q~> +J`c+WrW%N3biT'.k5XTDJ`cdj!!&AJrr@W4J`ac1rW%N3J`c+Wrr@Q~> +JaVXfrrAAQ!!'Rt"p")Z!:K7Tk3`3Ld-go6JaS*WJaSuprW%N;JaV^hrr@Q~> +Ja2@^rrAAM!!'Rp"p!rR!:&hLk3;pHd-CW2Ja.gOJa/]hrW%N7Ja2F`rr@Q~> +J`c(VrrAAI!!'Rl#63iJs5rJDk2lXDd,t?.J`_OGJ``E`rW%N3J`c.Xrr@Q~> +JaVUerrADR!!'Uu!!*#d!!*#d!!%T<JaT6"!!%T<p$Me[\aKFsJaS*WkjJHNJ,~> +Ja2=]rrADN!!'Uq!!*#`!!*#`!!%T8Ja/ro!!%T8p$)MW\a'.oJa.gOkj&0JJ,~> +J`c%UrrADJ!!'Um!<<&\!<<&\!<7W4J``Zg!!%T4p#Z5S\`WkkJ`_OGkiVmFJ,~> +JaVRdrr@W<dI$u7rU'XcrU'Xc]^>b"JaW4!!!%T<JaT,trW%N;JaVdjrr@Q~> +Ja2:\rr@W8dHU]3rTX@_rTX@_]]oIsJa2pn!!%T8Ja/ilrW%N7Ja2Lbrr@Q~> +J`c"Trr@W4dH1H/rT4+[rT4+[]]K1oJ`cXf!!%T4J``QdrW%N3J`c4Zrr@Q~> +JaVOcrrA,J!!%T<p$Me[JaS*Wk3`3LJaTW-rW%N;JaVgkrr@Q~> +Ja27[rrA,F!!%T8p$)MWJa.gOk3;pHJa0?%rW%N7Ja2Ocrr@Q~> +J`btSrrA,B!!%T4p#Z5SJ`_OGk2lXDJ`a&rrW%N3J`c7[rr@Q~> +JaW:#!!)ESrW%N;JaU8?!!&AR!!&VY!!)l`!!%T<X7#reJaS*WlgFcQJ,~> +Ja3!p!!)EOrW%N7Ja0u7!!&AN!!&VU!!)l\!!%T8X6TZaJa.gOlg"KMJ,~> +J`c^h!!)EKrW%N3J`a]/!!&AJ!!&VQ!!)lX!!%T4X60B]J`_OGlfS3IJ,~> +JaW=$!W_WgmI'rRJaTW-rrD'H!!%T<JaS*WL[P-AJaS*Wm-alRJ,~> +Ja3$q!W_KcmHXZNJa0?%rrD'D!!%T8Ja.gOL[+j=Ja.gOm-=TNJ,~> +J`cai!W_?_mH4BJJ`a&rrrD'@!!%T4J`_OGLZ\R9J`_OGm,n<JJ,~> +JaW@%!!*#d!!)ESrW&;Q!!%T<JaS*Wj6cmIJaW4!!!&qbrW%N;JaVpnrr@Q~> +Ja3'r!!*#`!!)EOrW&;M!!%T8Ja.gOj6?UEJa2pn!!&q^rW%N7Ja2Xfrr@Q~> +J`cdj!!*#\!!)EKrW&;I!!%T4J`_OGj5p=AJ`cXf!!&qZrW%N3J`c@^rr@Q~> +JaW@%!!*#d!!)BRrW%N;JaS9\!!%T<JaSKbrr@W<JaVpnrr@Q~> +Ja3'r!!*#`!!)BNrW%N7Ja/!T!!%T8Ja/3Zrr@W8Ja2Xfrr@Q~> +J`cdj!!*#\!!)BJrW%N3J`_^L!!%T4J`_pRrr@W4J`c@^rr@Q~> +JaW@%!!*#d!!)?QrW&Y[!!%T<p$Me[JaS*WJaVdj!!&ARrr@W<JaVsorr@Q~> +Ja3'r!!*#`!!)?MrW&YW!!%T8p$)MWJa.gOJa2Lb!!&ANrr@W8Ja2[grr@Q~> +J`cdj!!*#\!!)?IrW&YS!!%T4p#Z5SJ`_OGJ`c4Z!!&AJrr@W4J`cC_rr@Q~> +JaW@%!!*#d!!)<PrW%N;JaS*We*[29YjMJkkjAENO6uuJT'lUYJaS*Wn*^2UJ,~> +Ja3'r!!*#`!!)<LrW%N7Ja.gOe*6o5Yj)2gkir-JO6Q]FT'H=UJa.gOn*9oQJ,~> +J`cdj!!*#\!!)<HrW%N3J`_OGe)gW1YiYockiMjFO6-EBT'$%QJ`_OGn)jWMJ,~> +JaW@%!!*#d!!)9OrW%N;XR6&goBlSYJaW0u!!%T<JaS3ZrW%N;JaW$qrr@Q~> +Ja3'r!!*#`!!)9KrW%N7XQfccoBH;UJa2mm!!%T8Ja.pRrW%N7Ja2airr@Q~> +J`cdj!!*#\!!)9GrW%N3XQBK_oB$#QJ`cUe!!%T4J`_XJrW%N3J`cIarr@Q~> +JaW=$!W_WgkO/?MWp]lenF$;VJaS*WJaW4!!!%T<p$Me[QL=_PJaS*Wna?DWJ,~> +Ja3$q!W_KckN`'IWp9TanEU#RJa.gOJa2pn!!%T8p$)MWQKnGLJa.gOn`p,SJ,~> +J`cai!W_?_kN;dEWoj<]nE0`NJ`_OGJ`cXf!!%T4p#Z5SQKJ/HJ`_OGn`KiOJ,~> +JaW:#!!)-Krr@W<JaSlm!!%T<p$Me[JaS?^rW%N;JaW*srr@Q~> +Ja3!p!!)-Grr@W8Ja/Te!!%T8p$)MWJa/'VrW%N7Ja2gkrr@Q~> +J`c^h!!)-Crr@W4J``<]!!%T4p#Z5SJ`_dNrW%N3J`cOcrr@Q~> +JaV4ZrrB@m!!%T<p$Me[JaS*WJaV.X!!&DSrW%N;JaW-trr@Q~> +Ja1qRrrB@i!!%T8p$)MWJa.gOJa1kP!!&DOrW%N7Ja2jlrr@Q~> +J`bYJrrB@e!!%T4p#Z5SJ`_OGJ`bSH!!&DKrW%N3J`cRdrr@Q~> +JaV4ZrW%N;JaS*WP3r;Mf'WM<U$_m\NUHcGJaS*Wo^;_ZJ,~> +Ja1qRrW%N7Ja.gOP3N#If'358U$;UXNU$KCJa.gOo]lGVJ,~> +J`bYJrW%N3J`_OGP3)`Ef&cr4U#l=TNTU3?J`_OGo]H/RJ,~> +JaV1YrW%N;X6orfQL4_QjR3$JJaS*WJaW*srW%N;JaW4!rr@Q~> +Ja1nQrW%N7X6KZbQKeGMjQcaFJa.gOJa2gkrW%N7Ja2pnrr@Q~> +J`bVIrW%N3X6'B^QKA/IjQ?IBJ`_OGJ`cOcrW%N3J`cXfrr@Q~> +JaV.XrW'V!!!(jC!!&AR!!%T<JaS*WjR*!JK^Sg>JaS*Wp?qq\J,~> +Ja1kPrW'Ur!!(j?!!&AN!!%T8Ja.gOjQZ^FK^/O:Ja.gOp?MYXJ,~> +J`bSHrW'Un!!(j;!!&AJ!!%T4J`_OGjQ6FBK]`76J`_OGp?)ATJ,~> +JaV+WrW%N;JaS*WSF-@WJaW4!!!%Z>rr@W<JaW7"rr@Q~> +Ja1hOrW%N7Ja.gOSE^(SJa2pn!!%Z:rr@W8Ja2sorr@Q~> +J`bPGrW%N3J`_OGSE9eOJ`cXf!!%Z6rr@W4J`c[grr@Q~> +JaV(VrW%N;\*a4rJaW4!!!%T<JaV"TrrAGSrr@W<JaW:#rr@Q~> +Ja1eNrW%N7\*<qnJa2pn!!%T8Ja1_LrrAGOrr@W8Ja3!prr@Q~> +J`bMFrW%N3\)mYjJ`cXf!!%T4J`bGDrrAGKrr@W4J`c^hrr@Q~> +JaV%UrW'q*!!%T<JaS*WiU-[G`U3^+ZgRhnJaWF'rr@W<JaW=$rr@Q~> +Ja1bMrW'q&!!%T8Ja.gOiT^CC`TdF'Zg.PjJa3-trr@W8Ja3$qrr@Q~> +J`bJErW'q"!!%T4J`_OGiT:+?`T@.#Zf_8fJ`cjlrr@W4J`cairr@Q~> +JaV"TrW%N;JaU;@!!)`\!!%T<JaS*Wi9pREJaS*Wq<n7_J,~> +Ja1_LrW%N7Ja1#8!!)`X!!%T8Ja.gOi9L:AJa.gOq<It[J,~> +J`bGDrW%N3J`a`0!!)`T!!%T4J`_OGi9("=J`_OGq<%\WJ,~> +JaUtSrW(73!!(41!!'(f!!)HT!!%T<JaS*WJaVjlq>c*7JaWC&rr@Q~> +Ja1\KrW(7/!!(4-!!'(b!!)HP!!%T8Ja.gOJa2Rdq>c*3Ja3*srr@Q~> +J`bDCrW(7+!!(4)!!'(^!!)HL!!%T4J`_OGJ`c:\q>c*/J`cgkrr@Q~> +JaUqRrr@W<JaS*WXmQ/hJaW4!!!%T<qX44\s6fjdJaS*WqsOIaJ,~> +Ja1YJrr@W8Ja.gOXm,ldJa2pn!!%T8qWdqXs6BR`Ja.gOqs+1]J,~> +J`bABrr@W4J`_OGXl]T`J`cXf!!%T4qW@YTs5s:\J`_OGqr[nYJ,~> +JaUnQrr@W<aR0$.JaW4!!!%T<JaUAB!!&h_qZ-N]rW%N;JaWI(rr@Q~> +Ja1VIrr@W8aQ`a*Ja2pn!!%T8Ja1):!!&h[qZ-NYrW%N7Ja30urr@Q~> +J`b>Arr@W4aQ<I&J`cXf!!%T4J`af2!!&hWqZ-NUrW%N3J`cmmrr@Q~> +JaUkPrrCX<!!%T<JaS*WiU-[GZgIen`U3^+JaW7"rW)]\rW%N;JaWL)rr@Q~> +Ja1SHrrCX8!!%T8Ja.gOiT^CCZg%Mj`TdF'Ja2sorW)]XrW%N7Ja34!rr@Q~> +J`b;@rrCX4!!%T4J`_OGiT:+?ZfV5f`T@.#J`c[grW)]TrW%N3J`cpnrr@Q~> +JaUkPrW%N;JaU;@rrADR!!%T<JaU;@rW%N;JaWO*rr@Q~> +Ja1SHrW%N7Ja1#8rrADN!!%T8Ja1#8rW%N7Ja37"rr@Q~> +J`b;@rW%N3J`a`0rrADJ!!%T4J`a`0rW%N3J`csorr@Q~> +JaUhOrW%N;ddI,8h<k7CJaS*WJaS*WqX+=`mdC&SJaS*Ws6fmeJ,~> +Ja1PGrW%N7dd$i4h<Ft?Ja.gOJa.gOqW\%\mcscOJa.gOs6BUaJ,~> +J`b8?rW%N3dcUQ0h<"\;J`_OGJ`_OGqW7bXmcOKKJ`_OGs5s=]J,~> +JaUeNrW%N;JaS*W^[;(%JaW4!!!%T<i9pREJaS*W!q$$gJ,~> +Ja1MFrW%N7Ja.gO^Zke!Ja2pn!!%T8i9L:AJa.gO!pTacJ,~> +J`b5>rW%N3J`_OG^ZGLrJ`cXf!!%T4i9("=J`_OG!p0I_J,~> +JaUbMrW%N;g?nq@JaW4!!!%T<JaT`0!!&DSrr@W<JaNU-!!%N~> +Ja1JErW%N7g?JY<Ja2pn!!%T8Ja0H(!!&DOrr@W8Ja*=%!!%N~> +J`b2=rW%N3g?&A8J`cXf!!%T4J`a/u!!&DKrr@W4J`[$r!!%N~> +JaU_LrW)0M!!%T<p$Me[JaS*Wmd:&TU$_m\QgOhR[-dnojmN-KJaS*Wrr@Q~> +Ja1GDrW)0I!!%T8p$)MWJa.gOmcjcPU$;UXQg+PN[-@Vkjm)jGJa.gOrr@Q~> +J`b/<rW)0E!!%T4p#Z5SJ`_OGmcFKLU#l=TQf\8J[,q>gjlZRCJ`_OGrr@Q~> +JaU\KrW%N;JaU;@!!&>Q!!%T<JaU;@rr@W<K'rX=J,~> +Ja1DCrW%N7Ja1#8!!&>M!!%T8Ja1#8rr@W8K'N@9J,~> +J`b,;rW%N3J`a`0!!&>I!!%T4J`a`0rr@W4K'*(5J,~> +JaUYJrW%N;jR*!Jb3f60JaS*WJaSKb!!(jCrW%N;KC8a>J,~> +Ja1ABrW%N7jQZ^Fb3As,Ja.gOJa/3Z!!(j?rW%N7KBiI:J,~> +J`b):rW%N3jQ6FBb2r[(J`_OGJ`_pR!!(j;rW%N3KBE16J,~> +JaUVIrW)]\rrAk_!!%T<JaU/<!!%T<p$Me[JaUkPrW%N;K^Sj?J,~> +Ja1>ArW)]XrrAk[!!%T8Ja0l4!!%T8p$)MWJa1SHrW%N7K^/R;J,~> +J`b&9rW)]TrrAkW!!%T4J`aT,!!%T4p#Z5SJ`b;@rW%N3K]`:7J,~> +JaUSHrrDl_quD<9JaVjl!!%T<JaS*W[-mnnJaS6[rr@Q~> +Ja1;@rrDl[quD<5Ja2Rd!!%T8Ja.gO[-IVjJa.sSrr@Q~> +J`b#8rrDlWquD<1J`c:\!!%T4J`_OG[-%>fJ`_[Krr@Q~> +JaUPGrrDubquD<9p?hn\JaS*WJaSWf!!(%,!!(O:rW%N;L@5'AJ,~> +Ja18?rrDu^quD<5p?DVXJa.gOJa/?^!!(%(!!(O6rW%N7L?ed=J,~> +J`au7rrDuZquD<1p>u>TJ`_OGJ``'V!!(%$!!(O2rW%N3L?AL9J,~> +JaUMFrrE)equD<9JaUMF!!&SX!!)rb!!%T<qsFFaJaUPGrW%N;L[P0BJ,~> +Ja15>rrE)aquD<5Ja15>!!&ST!!)r^!!%T8qs".]Ja18?rW%N7L[+m>J,~> +J`ar6rrE)]quD<1J`ar6!!&SP!!)rZ!!%T4qrRkYJ`au7rW%N3LZ\U:J,~> +JaUMFq>c*7q<e4_\F'=s^?tt$g?nq@JaS*WJaV"TrW%N;M!k9CJ,~> +Ja15>q>c*3q<@q[\EX%o^?P[ug?JY<Ja.gOJa1_LrW%N7M!G!?J,~> +J`ar6q>c*/q;qYW\E3bk^?,Cqg?&A8J`_OGJ`bGDrW%N3M!"^;J,~> +JaUJEr;`5Q!!%T<JaUeN!!%T<p$Me[JaW4!!!(10rW%N;M=1BDJ,~> +Ja12=r;`5M!!%T8Ja1MF!!%T8p$)MWJa2pn!!(1,rW%N7M<b*@J,~> +J`ao5r;`5I!!%T4J`b5>!!%T4p#Z5SJ`cXf!!(1(rW%N3M<=g<J,~> +JaUGDrW%N;JaW$q!!%T<JaS*WU@/!\JaSE`rr@Q~> +Ja1/<rW%N7Ja2ai!!%T8Ja.gOU?_^XJa/-Xrr@Q~> +J`al4rW%N3J`cIa!!%T4J`_OGU?;FTJ`_jPrr@Q~> +JaUDCrW%N;rpBadJaS*WJaS*Ws6]jefBrV=_X@F(JaSE`rr@Q~> +Ja1,;rW%N7rosI`Ja.gOJa.gOs69RafBN>9_Wq.$Ja/-Xrr@Q~> +J`ai3rW%N3roO1\J`_OGJ`_OGs5j:]fB*&5_WLjuJ`_jPrr@Q~> +JaUABrW%N;JaS*Wlg=`QlL"WPQL4_Qq<e4_JaTo5rr@W<MsgTFJ,~> +Ja1):rW%N7Ja.gOlfnHMlKS?LQKeGMq<@q[Ja0W-rr@W8MsC<BJ,~> +J`af2rW%N3J`_OGlfJ0IlK/'HQKA/Iq;qYWJ`a?%rr@W4Mrt$>J,~> +JaU>ArW%N;JaWC&rr@W<JaS*WRI:(TJaSKbrr@Q~> +Ja1&9rW%N7Ja3*srr@W8Ja.gORHjePJa/3Zrr@Q~> +J`ac1rW%N3J`cgkrr@W4J`_OGRHFMLJ`_pRrr@Q~> +JaU;@rW&>Rrr@W<JaVF`!!%T<p$Me[JaW4!!!'RtrW%N;NUHfHJ,~> +Ja1#8rW&>Nrr@W8Ja2.X!!%T8p$)MWJa2pn!!'RprW%N7NU$NDJ,~> +J`a`0rW&>Jrr@W4J`bkP!!%T4p#Z5SJ`cXf!!'RlrW%N3NTU6@J,~> +JaU8?rW%N;K'iU=JaW4!!!%T<p$Me[JaTT,rW%N;NpcoIJ,~> +Ja0u7rW%N7K'E=9Ja2pn!!%T8p$)MWJa0<$rW%N7Np?WEJ,~> +J`a]/rW%N3K'!%5J`cXf!!%T4p#Z5SJ`a#qrW%N3Nop?AJ,~> +JaU5>rrA,J!!%T<p$Me[JaS*WJaWC&!!)9O!!':lrW%N;O7*#JJ,~> +Ja0r6rrA,F!!%T8p$)MWJa.gOJa3*s!!)9K!!':hrW%N7O6Z`FJ,~> +J`aZ.rrA,B!!%T4p#Z5SJ`_OGJ`cgk!!)9G!!':drW%N3O66HBJ,~> +JaV%UquH0Qrr@W<JaS*Wr9aObJaW7"rrDl_!!%T<XR?&fJaSWfrr@Q~> +Ja1bMquH0Mrr@W8Ja.gOr9=7^Ja2sorrDl[!!%T8XQocbJa/?^rr@Q~> +J`bJEquH0Irr@W4J`_OGr8mtZJ`c[grrDlW!!%T4XQKK^J``'Vrr@Q~> +JaV%U!!)9Orr@W<Ms^QF[dF+qQL4_QJaS*W^[D($JaSZgrr@Q~> +Ja1bM!!)9Krr@W8Ms:9B[d!hmQKeGMJa.gO^ZtduJa/B_rr@Q~> +J`bJE!!)9Grr@W4Mrk!>[cRPiQKA/IJ`_OG^ZPLqJ``*Wrr@Q~> +JaV%U!!)9OrW&;Q!!&AR!!%T<JaS*W_<q:'VsaNaJaS]hrr@Q~> +Ja1bM!!)9KrW&;M!!&AN!!%T8Ja.gO_<M"#Vs=6]Ja/E`rr@Q~> +J`bJE!!)9GrW&;I!!&AJ!!%T4J`_OG_<(^tVrmsYJ``-Xrr@Q~> +JaV%U!s%`h!:0(P!.jQhmY:-0!.jS2mJm6<m[<MB!.jR%mf*9;~> +Ja1bM!s%Td!:/qL!.jEdlA"R(!.jG.l2Ug8lC$r:!.jF!lMgj7~> +J`bJE!s%H`!:/eH!.j9`k(`!u!.j;*jo>C4k*bB2!.j9rk5PF3~> +JaV%UrrE)e!!)?QrW&Y[!!%T<p$Me[JaS*WJaVai!!)oa!!&YZrW%N;Pj\POJ,~> +Ja1bMrrE)a!!)?MrW&YW!!%T8p$)MWJa.gOJa2Ia!!)o]!!&YVrW%N7Pj88KJ,~> +J`bJErrE)]!!)?IrW&YS!!%T4p#Z5SJ`_OGJ`c1Y!!)oY!!&YRrW%N3PihuGJ,~> +JaUnQ!!)<PrW%N;JaSQd!!%T<p?hn\kO/?MJaTW-rr@W<Pj\POJ,~> +Ja1VI!!)<LrW%N7Ja/9\!!%T8p?DVXkN`'IJa0?%rr@W8Pj88KJ,~> +J`b>A!!)<HrW%N3J``!T!!%T4p>u>TkN;dEJ`a&rrr@W4PihuGJ,~> +JaUnQ!!)9OrW%N;SaHIXV!\3_QL4_QJaS*W^[D+%JaSfkrr@Q~> +Ja1VI!!)9KrW%N7Sa$1TV!7p[QKeGMJa.gO^Zth!Ja/Ncrr@Q~> +J`b>A!!)9GrW%N3S`TnPUuhXWQKA/IJ`_OG^ZPOrJ``6[rr@Q~> +JaV%U!!*#d!!)6NrW'"errDNU!!&AR!!%T<JaS*We*[29Q1"YPJaSilrr@Q~> +Ja1bM!!*#`!!)6JrW'"arrDNQ!!&AN!!%T8Ja.gOe*6o5Q0SALJa/Qdrr@Q~> +J`bJE!!*#\!!)6FrW'"]rrDNM!!&AJ!!%T4J`_OGe)gW1Q0/)HJ``9\rr@Q~> +JaV"TrW)*KrW&>R!!%T<K'iU=JaW4!!!%T<M!k6BJaSlmrr@Q~> +Ja1_LrW)*GrW&>N!!%T8K'E=9Ja2pn!!%T8M!Fs>Ja/Terr@Q~> +J`bGDrW)*CrW&>J!!%T4K'!%5J`cXf!!%T4M!"[:J``<]rr@Q~> +JaTo5rrB@m!!%T<p$Me[JaS*WJaS*WmI'rRJaSonrr@Q~> +Ja0W-rrB@i!!%T8p$)MWJa.gOJa.gOmHXZNJa/Wfrr@Q~> +J`a?%rrB@e!!%T4p#Z5SJ`_OGJ`_OGmH4BJJ``?^rr@Q~> +JaTl4rr@W<JaT/u!!%T<amK-/U$_m\NUHcGJaSrorr@Q~> +Ja0T,rr@W8Ja/lm!!%T8am&j+U$;UXNU$KCJa/Zgrr@Q~> +J`a<$rr@W4J``Te!!%T4alWR'U#l=TNTU3?J``B_rr@Q~> +JaTi3rr@W<JaU8?!!&AR!!%T<JaU;@rW%N;RdU1UJ,~> +Ja0Q+rr@W8Ja0u7!!&AN!!%T8Ja1#8rW%N7Rd0nQJ,~> +J`a9#rr@W4J`a]/!!&AJ!!%T4J`a`0rW%N3RcaVMJ,~> +JaTf2rrB_"!!%T<o'ZMXJaS*WJaVXf!!%]?rW%N;S*p:VJ,~> +Ja0N*rrB^s!!%T8o'65TJa.gOJa2@^!!%];rW%N7S*L"RJ,~> +J`a6"rrB^o!!%T4o&frPJ`_OGJ`c(V!!%]7rW%N3S*'_NJ,~> +JaTf2rW%N;JaTN*!!%T<p$Me[JaS*Wp?qn[JaT&rrr@Q~> +Ja0N*rW%N7Ja06"!!%T8p$)MWJa.gOp?MVWJa/cjrr@Q~> +J`a6"rW%N3J``ro!!%T4p#Z5SJ`_OGp?)>SJ``Kbrr@Q~> +JaTc1rW%N;\*a4rJaS*WJaS*Wg[>%@JaT)srr@Q~> +Ja0K)rW%N7\*<qnJa.gOJa.gOgZnb<Ja/fkrr@Q~> +J`a3!rW%N3\)mYjJ`_OGJ`_OGgZJJ8J``Ncrr@Q~> +JaT`0rW'q*!!%T<JaS*WU[A*^ZgIenk3`3LQgXhQJaT,trr@Q~> +Ja0H(rW'q&!!%T8Ja.gOUZqgZZg%Mjk3;pHQg4PMJa/ilrr@Q~> +J`a/urW'q"!!%T4J`_OGUZMOVZfV5fk2lXDQfe8IJ``Qdrr@Q~> +JaT]/rW%N;JaS*We*[29QL4_QJaTW-rW%N;T'lUYJ,~> +Ja0E'rW%N7Ja.gOe*6o5QKeGMJa0?%rW%N7T'H=UJ,~> +J`a,trW%N3J`_OGe)gW1QKA/IJ`a&rrW%N3T'$%QJ,~> +JaTZ.rW(73!!%T<o^2\Zmd:&TJaS*WJaW7"!!%T<p[7kXJaT/urr@Q~> +Ja0B&rW(7/!!%T8o]cDVmcjcPJa.gOJa2so!!%T8pZhSTJa/lmrr@Q~> +J`a)srW(7+!!%T4o]?,RmcFKLJ`_OGJ`c[g!!%T4pZD;PJ``Terr@Q~> +JaTW-rW&>R!!%T<V="<`JaW4!!!%T<JaVmmquH`arr@W<T^Mg[J,~> +Ja0?%rW&>N!!%T8V<S$\Ja2pn!!%T8Ja2UequH`]rr@W8T^)OWJ,~> +J`a&rrW&>J!!%T4V<.aXJ`cXf!!%T4J`c=]quH`Yrr@W4T]Z7SJ,~> +JaTT,rW%N;amK-/JaS*WJaS*WeaE;7r9jOaJaT6"rr@Q~> +Ja0<$rW%N7am&j+Ja.gOJa.gOea!#3r9F7]Ja/rorr@Q~> +J`a#qrW%N3alWR'J`_OGJ`_OGe`Q`/r9!tYJ``Zgrr@Q~> +JaTQ+rrCX<!!%T<JaS*WJaV%U!!(O:!!&h_rW)`]rW%N;U@/$]J,~> +Ja09#rrCX8!!%T8Ja.gOJa1bM!!(O6!!&h[rW)`YrW%N7U?_aYJ,~> +J``uprrCX4!!%T4J`_OGJ`bJE!!(O2!!&hWrW)`UrW%N3U?;IUJ,~> +JaTN*rr@W<JaUGD!!)uc!!%T<qX+=`ZL.\mJaTW-rW%N;U[J-^J,~> +Ja06"rr@W8Ja1/<!!)u_!!%T8qW\%\ZK_DiJa0?%rW%N7U[%jZJ,~> +J``rorr@W4J`al4!!)u[!!%T4qW7bXZK;,eJ`a&rrW%N3UZVRVJ,~> +JaTK)rr@W<ddI,8h!P.BQL4_QJaS*WJaV^h!!)HTrW%N;V!e6_J,~> +Ja03!rr@W8dd$i4h!+k>QKeGMJa.gOJa2F`!!)HPrW%N7V!@s[J,~> +J``onrr@W4dcUQ0gu\S:QKA/IJ`_OGJ`c.X!!)HLrW%N3Uuq[WJ,~> +JaTK)rW&;Q!!&AR!!&b]!!%T<p$Me[JaW4!!!%T<i9pREJaTB&rr@Q~> +Ja03!rW&;M!!&AN!!&bY!!%T8p$)MWJa2pn!!%T8i9L:AJa0)srr@Q~> +J``onrW&;I!!&AJ!!&bU!!%T4p#Z5SJ`cXf!!%T4i9("=J``fkrr@Q~> +JaTH(rW%N;g?nq@JaS*WJaS*W\F0=rJaTE'rr@Q~> +Ja0/urW%N7g?JY<Ja.gOJa.gO\Ea%nJa0,trr@Q~> +J``lmrW%N3g?&A8J`_OGJ`_OG\E<bjJ``ilrr@Q~> +JaTE'rW)0M!!%T<p$Me[JaS*WJaVLb!!'q)rrBIp!!)-KrW%N;VsaQbJ,~> +Ja0,trW)0I!!%T8p$)MWJa.gOJa24Z!!'q%rrBIl!!)-GrW%N7Vs=9^J,~> +J``ilrW)0E!!%T4p#Z5SJ`_OGJ`bqR!!'q!rrBIh!!)-CrW%N3Vrn!ZJ,~> +JaTB&rW%N;JaV(V!!%T<p?qq\U$_m\JaTT,rW%N;W:'ZcJ,~> +Ja0)srW%N7Ja1eN!!%T8p?MYXU$;UXJa0<$rW%N7W9XB_J,~> +J``fkrW%N3J`bMF!!%T4p?)ATU#l=TJ`a#qrW%N3W94*[J,~> +JaT?%rW%N;jR*!JJaV@^!!%T<JaS*Wq<e4_h!Y1BJaTK)rr@Q~> +Ja0&rrW%N7jQZ^FJa2(V!!%T8Ja.gOq<@q[h!4n>Ja03!rr@Q~> +J``cjrW%N3jQ6FBJ`beN!!%T4J`_OGq;qYWgueV:J``onrr@Q~> +JaT<$rW&;Q!!%T<JaS*WYO2AjJaUhOrr@W<WUBcdJ,~> +Ja0#qrW&;M!!%T8Ja.gOYNc)fJa1PGrr@W8WTsK`J,~> +J```irW&;I!!%T4J`_OGYN>fbJ`b8?rr@W4WTO3\J,~> +JaT9#rW)`]rr@W<JaVgk!!%T<p$Me[JaS*W_!_4&JaTQ+rr@Q~> +Ja/uprW)`Yrr@W8Ja2Oc!!%T8p$)MWJa.gO_!:q"Ja09#rr@Q~> +J``]hrW)`Urr@W4J`c7[!!%T4p#Z5SJ`_OG^ukXsJ``uprr@Q~> +JaT6"rW)laqZ)38q!J+^JaS*WJaVLb!!':l!!(%,!!(O:rW%N;X7#ufJ,~> +Ja/rorW)l]qZ)34q!%hZJa.gOJa24Z!!':h!!(%(!!(O6rW%N7X6T]bJ,~> +J``ZgrW)lYqZ)30puVPVJ`_OGJ`bqR!!':d!!(%$!!(O2rW%N3X60E^J,~> +JaT3!rrE&dquD<9JaVso!!%T<p?hn\NpZlIJaTW-rW%N;XR?)gJ,~> +Ja/onrrE&`quD<5Ja2[g!!%T8p?DVXNp6TEJa0?%rW%N7XQofcJ,~> +J``WfrrE&\quD<1J`cC_!!%T4p>u>TNog<AJ`a&rrW%N3XQKN_J,~> +JaT/uq>c*7qX+=`JaU_L!!&AR!!%T<JaU;@rW%N;XmZ2hJ,~> +Ja/lmq>c*3qW\%\Ja1GD!!&AN!!%T8Ja1#8rW%N7Xm5odJ,~> +J``Teq>c*/qW7bXJ`b/<!!&AJ!!%T4J`a`0rW%N3XlfW`J,~> +JaT,trW%N;XmQ/hJaS*WX6orfJaW4!!!(10rW%N;Y3u;iJ,~> +Ja/ilrW%N7Xm,ldJa.gOX6KZbJa2pn!!(1,rW%N7Y3Q#eJ,~> +J``QdrW%N3Xl]T`J`_OGX6'B^J`cXf!!(1(rW%N3Y3,`aJ,~> +JaT,trW%N;JaW$q!!%T<p$Me[JaS*WYO;AiJaT`0rr@Q~> +Ja/ilrW%N7Ja2ai!!%T8p$)MWJa.gOYNl)eJa0H(rr@Q~> +J``QdrW%N3J`cIa!!%T4p#Z5SJ`_OGYNGfaJ`a/urr@Q~> +JaT)srW%N;rpBadJaS*WJaVLb!!&YZ!!([>!!'n(rW%N;YjVMkJ,~> +Ja/fkrW%N7rosI`Ja.gOJa24Z!!&YV!!([:!!'n$rW%N7Yj25gJ,~> +J``NcrW%N3roO1\J`_OGJ`bqR!!&YR!!([6!!'murW%N3YibrcJ,~> +JaT&rrW%N;JaW@%rr@W<JaW$q!!%T<XR?&fJaTf2rr@Q~> +Ja/cjrW%N7Ja3'rrr@W8Ja2ai!!%T8XQocbJa0N*rr@Q~> +J``KbrW%N3J`cdjrr@W4J`cIa!!%T4XQKK^J`a6"rr@Q~> +JaT#qrW%N;JaU;@!!&>Q!!%T<JaU;@rr@W<Z0qVlJ,~> +Ja/`irW%N7Ja1#8!!&>M!!%T8Ja1#8rr@W8Z0M>hJ,~> +J``HarW%N3J`a`0!!&>I!!%T4J`a`0rr@W4Z0)&dJ,~> +JaSuprW%N;XR6&gJaS*W^$Yk#JaW4!!!'Osrr@W<ZL7_mJ,~> +Ja/]hrW%N7XQfccJa.gO^$5RtJa2pn!!'Oorr@W8ZKhGiJ,~> +J``E`rW%N3XQBK_J`_OG^#f:pJ`cXf!!'Okrr@W4ZKD/eJ,~> +JaSrorW&>R!!%T<m-XiRJaW4!!!%T<JaT)srr@W<ZgRhnJ,~> +Ja/ZgrW&>N!!%T8m-4QNJa2pn!!%T8Ja/fkrr@W8Zg.PjJ,~> +J``B_rW&>J!!%T4m,e9JJ`cXf!!%T4J``Ncrr@W4Zf_8fJ,~> +JaSonrW&&J!!%T<JaS*WJaV%U!!'7krr@W<[-mqoJ,~> +Ja/WfrW&&F!!%T8Ja.gOJa1bM!!'7grr@W8[-IYkJ,~> +J``?^rW&&B!!%T4J`_OGJ`bJE!!'7crr@W4[-%AgJ,~> +JaTl4!!)rb!!)BRrW%N;JaS*WJaW$q!!%T<U[J*]JaTr6rr@Q~> +Ja0T,!!)r^!!)BNrW%N7Ja.gOJa2ai!!%T8U[%gYJa0Z.rr@Q~> +J`a<$!!)rZ!!)BJrW%N3J`_OGJ`cIa!!%T4UZVOUJ`aB&rr@Q~> +JaTo5rrE#c!W_Wgm-alRJaS*W^?tt$QgOhRJaS*W^[D($JaTu7rr@Q~> +Ja0W-rrE#_!W_Kcm-=TNJa.gO^?P[uQg+PNJa.gO^ZtduJa0]/rr@Q~> +J`a?%rrE#[!W_?_m,n<JJ`_OG^?,CqQf\8JJ`_OG^ZPLqJ`aE'rr@Q~> +JaTr6!W_WgrpBadrpBadm-alRJaTT,!!%T<JaUkP!!%T<p$Me[VsaNaJaU#8rr@Q~> +Ja0Z.!W_KcrosI`rosI`m-=TNJa0<$!!%T8Ja1SH!!%T8p$)MWVs=6]Ja0`0rr@Q~> +J`aB&!W_?_roO1\roO1\m,n<JJ`a#q!!%T4J`b;@!!%T4p#Z5SVrmsYJ`aH(rr@Q~> +JaTl4!!*#d!!*#d!!)?QrrADR!!%T<rpBadJaW4!!!%T<JaSKbrW%N;\F0@sJ,~> +Ja0T,!!*#`!!*#`!!)?MrrADN!!%T8rosI`Ja2pn!!%T8Ja/3ZrW%N7\Ea(oJ,~> +J`a<$!!*#\!!*#\!!)?IrrADJ!!%T4roO1\J`cXf!!%T4J`_pRrW%N3\E<ekJ,~> +JaTl4!!*#d!!*#d!!)?QrW&Y[!!%T<JaS*WJaV%U!!&YZrW%N;\aKItJ,~> +Ja0T,!!*#`!!*#`!!)?MrW&YW!!%T8Ja.gOJa1bM!!&YVrW%N7\a'1pJ,~> +J`a<$!!*#\!!*#\!!)?IrW&YS!!%T4J`_OGJ`bJE!!&YRrW%N3\`WnlJ,~> +JaTl4!!*#d!!*#d!!)<PrW%N;JaS*WJaNL<JaWI(!!&ARrW%N;]'fRuJ,~> +Ja0T,!!*#`!!*#`!!)<LrW%N7Ja.gOJa*48Ja30u!!&ANrW%N7]'B:qJ,~> +J`a<$!!*#\!!*#\!!)<HrW%N3J`_OGJ`Zq4J`cmm!!&AJrW%N3]&s"mJ,~> +JaTl4!!*#d!!*#d!!)9OrW%N;JaU8?!!(L9!!(%,!!&>Q!!%T<X7#reJaU/<rr@Q~> +Ja0T,!!*#`!!*#`!!)9KrW%N7Ja0u7!!(L5!!(%(!!&>M!!%T8X6TZaJa0l4rr@Q~> +J`a<$!!*#\!!*#\!!)9GrW%N3J`a]/!!(L1!!(%$!!&>I!!%T4X60B]J`aT,rr@Q~> +JaTl4!!)uc!W_WgkO/<LX7#ufJaS*WJaVOc!!%T<p$Me[Q1"YPJaU/<rr@Q~> +Ja0T,!!)u_!W_KckN`$HX6T]bJa.gOJa27[!!%T8p$)MWQ0SALJa0l4rr@Q~> +J`a<$!!)u[!W_?_kN;aDX60E^J`_OGJ`btS!!%T4p#Z5SQ0/)HJ`aT,rr@Q~> +JaTr6quH`a!!)-KrW&>RrrA/K!!%T<p$Me[JaW4!!!%T<L[P0BJaU2=rr@Q~> +Ja0Z.quH`]!!)-GrW&>NrrA/G!!%T8p$)MWJa2pn!!%T8L[+m>Ja0o5rr@Q~> +J`aB&quH`Y!!)-CrW&>JrrA/C!!%T4p#Z5SJ`cXf!!%T4LZ\U:J`aW-rr@Q~> +JaSTerW':m!!%T<JaS*WJaS*WhsULEJaU5>rr@Q~> +Ja/<]rW':i!!%T8Ja.gOJa.gOhs14AJa0r6rr@Q~> +J``$UrW':e!!%T4J`_OGJ`_OGhraq=J`aZ.rr@Q~> +JaSQdrW%N;JaS*WPO8DNJaW4!!!)c]!!&DSrW%N;^@)"$J,~> +Ja/9\rW%N7Ja.gOPNi,JJa2pn!!)cY!!&DOrW%N7^?Y^uJ,~> +J``!TrW%N3J`_OGPNDiFJ`cXf!!)cU!!&DKrW%N3^?5FqJ,~> +JaSNcrW%N;Y3l8iJaW7"rrBFo!!&>Q!!%T<XR?&fJaU;@rr@Q~> +Ja/6[rW%N7Y3GueJa2sorrBFk!!&>M!!%T8XQocbJa1#8rr@Q~> +J`_sSrW%N3Y3#]aJ`c[grrBFg!!&>I!!%T4XQKK^J`a`0rr@Q~> +JaSKbrrB_"!!%T<na6AWJaTQ+!!%T<^$Yk#K^Sg>JaU>Arr@Q~> +Ja/3ZrrB^s!!%T8n`g)SJa09#!!%T8^$5RtK^/O:Ja1&9rr@Q~> +J`_pRrrB^o!!%T4n`BfOJ``up!!%T4^#f:pK]`76J`ac1rr@Q~> +JaSHarrADR!!&_\!!)f^!!%T<JaW*s!!%T<JaW7"rW%N;_=%='J,~> +Ja/0YrrADN!!&_X!!)fZ!!%T8Ja2gk!!%T8Ja2sorW%N7_<V%#J,~> +J`_mQrrADJ!!&_T!!)fV!!%T4J`cOc!!%T4J`c[grW%N3_<1atJ,~> +JaSE`rr@W<JaTQ+!!%T<JaS*WkjJEMJaUDCrr@Q~> +Ja/-Xrr@W8Ja09#!!%T8Ja.gOkj&-IJa1,;rr@Q~> +J`_jPrr@W4J``up!!%T4J`_OGkiVjEJ`ai3rr@Q~> +JaSE`rW'q*!!%T<JaS*WiU-[GJaW4!!!)-K!!&DSrW%N;_s[O)J,~> +Ja/-XrW'q&!!%T8Ja.gOiT^CCJa2pn!!)-G!!&DOrW%N7_s77%J,~> +J`_jPrW'q"!!%T4J`_OGiT:+?J`cXf!!)-C!!&DKrW%N3_rgt!J,~> +JaSB_rW%N;^[;(%JaW7"!!%T<[dO.qJaTZ.r;_E:`:!X*J,~> +Ja/*WrW%N7^Zke!Ja2so!!%T8[d*kmJa0B&r;_E6`9R@&J,~> +J`_gOrW%N3^ZGLrJ`c[g!!%T4[c[SiJ`a)sr;_E2`9.("J,~> +JaS?^rW(73!!%T<JaW-t!!%T<JaVRd!!%T<p[7hWJaUMFrr@Q~> +Ja/'VrW(7/!!%T8Ja2jl!!%T8Ja2:\!!%T8pZhPSJa15>rr@Q~> +J`_dNrW(7+!!%T4J`cRd!!%T4J`c"T!!%T4pZD8OJ`ar6rr@Q~> +JaS<]rW&;Q!!&AR!!%T<K^Jg?JaS*Wm-acOrpKddJaUMFrr@Q~> +Ja/$UrW&;M!!&AN!!%T8K^&O;Ja.gOm-=KKrp'L`Ja15>rr@Q~> +J`_aMrW&;I!!&AJ!!%T4K]W77J`_OGm,n3GroX4\J`ar6rr@Q~> +JaS9\rW%N;amK-/JaW4!!!%T<JaS*WipQ[DqsOIaJaUPGrr@Q~> +Ja/!TrW%N7am&j+Ja2pn!!%T8Ja.gOip-C@qs+1]Ja18?rr@Q~> +J`_^LrW%N3alWR'J`cXf!!%T4J`_OGio^+<qr[nYJ`au7rr@Q~> +JaS6[rW(R<!!%T<JaS*WiU-[GJaW4!!!%T<p?qn[p[8%]JaUSHrr@Q~> +Ja.sSrW(R8!!%T8Ja.gOiT^CCJa2pn!!%T8p?MVWpZhbYJa1;@rr@Q~> +J`_[KrW(R4!!%T4J`_OGiT:+?J`cXf!!%T4p?)>SpZDJUJ`b#8rr@Q~> +JaS3ZrW%N;ddI,8JaS*WR-jqSJaTW-rW%N;aR9'.J,~> +Ja.pRrW%N7dd$i4Ja.gOR-FYOJa0?%rW%N7aQid*J,~> +J`_XJrW%N3dcUQ0J`_OGR-"AKJ`a&rrW%N3aQEL&J,~> +JaS0YrW%N;JaU;@!!&AR!!%T<JaV"T!!)HTrW%N;amT0/J,~> +Ja.mQrW%N7Ja1#8!!&AN!!%T8Ja1_L!!)HPrW%N7am/m+J,~> +J`_UIrW%N3J`a`0!!&AJ!!%T4J`bGD!!)HLrW%N3al`U'J,~> +JaS-Xrr@W<X6orfJaSil!!%T<p$Me[JaVIarW%N;b3o90J,~> +Ja.jPrr@W8X6KZbJa/Qd!!%T8p$)MWJa21YrW%N7b3K!,J,~> +J`_RHrr@W4X6'B^J``9\!!%T4p#Z5SJ`bnQrW%N3b3&^(J,~> +JaS*Wrr@W<g?nq@JaW4!!!%T<JaS*W`U<^*JaU_Lrr@Q~> +Ja.gOrr@W8g?JY<Ja2pn!!%T8Ja.gO`TmF&Ja1GDrr@Q~> +J`_OGrr@W4g?&A8J`cXf!!%T4J`_OG`TI."J`b/<rr@Q~> +JaS*W!q$$gkjAENJaS*WJaVLb!!%T<p$Me[_X7C([I+"pjmN*JJaUbMrr@Q~> +Ja.gO!pTackir-JJa.gOJa24Z!!%T8p$)MW_Wh+$[H[_ljm)gFJa1JErr@Q~> +J`_OG!p0I_kiMjFJ`_OGJ`bqR!!%T4p#Z5S_WCgu[H7GhjlZOBJ`b2=rr@Q~> +JaS*W!:KgdJaVRd!!%T<JaS6[!!%T<XR?&fJaUeNrr@Q~> +Ja.gO!:'O`Ja2:\!!%T8Ja.sS!!%T8XQocbJa1MFrr@Q~> +J`_OG!9X7\J`c"T!!%T4J`_[K!!%T4XQKK^J`b5>rr@Q~> +JaS*Ws6fjdJaS*W^[D+%QgOhRJaS*WjmE*Kh!Y.AJaUhOrr@Q~> +Ja.gOs6BR`Ja.gO^Zth!Qg+PNJa.gOjlugGh!4k=Ja1PGrr@Q~> +J`_OGs5s:\J`_OG^ZPOrQf\8JJ`_OGjlQOCgueS9J`b8?rr@Q~> +JaS*WrpKacp?qq\JaV(V!!)f^!!)NV!!%T<VsXNbJaW4!!!%T<cL1Z3JaUkPrr@Q~> +Ja.gOrp'I_p?MYXJa1eN!<;iZ!<;QR!!%T8Vs46^Ja2pn!!%T8cKbB/Ja1SHrr@Q~> +J`_OGroX1[p?)ATJ`bMF!!)fV!!)NN!!%T4VrdsZJ`cXf!!%T4cK>*+J`b;@rr@Q~> +JaS*WrU0Xbq<n.\JaW@%!!(pErrE&d!!*#drrAe]!!%T<JaS*WZgRhnJaUkPrr@Q~> +Ja.gOrTa@^q<IkXJa3'r!!(pA!<E0!l2Uh`l2gnbU?V^YJa.gOJa0T,rr@W8cg(N1J,~> +J`_OGrT=(Zq<%STJ`cdj!!(p=!WN0!joGG\joGJ^U?2FUJ`_OGJ`a<$rr@W4cfY6-J,~> +JaS*Wr9jOar9jI_JaV"TrrE)e"9@lX!!%T<JaSNc!!'7k!!((-!!(L9rr@W<d-go6J,~> +Ja.gOr9F7]r9F1[Ja1_L#QXnil2^,7rr@W8Ja/6[!!'7g!!(()!!(L5rr@W8d-CW2J,~> +J`_OGr9!tYr9!nWJ`bGD#lanek5XT+!<7W4J`_sS!!'7c!!((%!!(L1rr@W4d,t?.J,~> +JaS*WqsOF`!:KabJaUqR$39Jo!:BjT!!)EeJaT#q!!%T<U[A*^QgXkRJaUqRrr@Q~> +Ja.gOqs+.\!:'I^Ja1YJ$NKAks69ULrrD?aJa/`i!!%T8UZqgZQg4SNJa1YJrr@Q~> +J`_OGqr[kX!9X1ZJ`bAB$395g!9X=D!<;0]J``Ha!!%T4UZMOVQfe;JJ`bABrr@Q~> +JaS*WqX44\JaUhO!<DQc!!2KfVsXNbg$Sh?QL4_QJaS*W_!_1%JaUtSrr@Q~> +Ja.gOqWdqXJa1PG#lj/irrE'!lMmdI!!(^;!!&>M!!%T8Ja1&9rW%N7dd$i4J,~> +J`_OGqW@YTJ`b8?#QX#e!<3'!joD=A!!(^7!!&>I!!%T4J`ac1rW%N3dcUQ0J,~> +JaS*Wq<n4^JaU_L!<DQe!!2Kfl0\NOJaU):!!%T<p$Me[JaW4!!!(10rW%N;e*d59J,~> +Ja.gOq<IqZJa1GD!WVHa!!2Bbl086KJa0f2!!%T8p$)MWJa2pn!!(1,rW%N7e*?r5J,~> +J`_OGq<%YVJ`b/<!<D9]rrM6^l/hsGJ`aN*!!%T4p#Z5SJ`cXf!!(1(rW%N3e)pZ1J,~> +JaS*Wq!S.^QgOhRkjAENddHf/YO2AjJaS*WJaT9#rW%N;eF*>:J,~> +Ja.gOq!.kZQg+PNkir-Jdd$N+YNc)fJa.gOJa/uprW%N7eE[&6J,~> +J`_OGpu_SVQf\8JkiMjFdcU9'YN>fbJ`_OGJ``]hrW%N3eE6c2J,~> +JaS*Wp[8%]JaU_LquD<9JaSon!!%T<p$Me[_X@C'JaV(Vrr@Q~> +Ja.gOpZhbYJa1GD!<<#u!<7W8Ja/Wf!!%T8p$)MW_Wq+#Ja1eNrr@Q~> +J`_OGpZDJUJ`b/<!!*#u!!%T4J``?^!!%T4p#Z5S_WLgtJ`bMFrr@Q~> +JaS*Wp?qq\JaUeNrr<2i!:BgeJaTE'!!%T<OmW2LR-sqRJaV+Wrr@Q~> +Ja.gOp?MYXJa1MF#6+\g!9sRaJa0,t!!%T8Om2oHR-OYNJa1hOrr@Q~> +J`_OGp?)ATJ`b5>"p"\cs5s=]J``il!!%T4OlcWDR-+AJJ`bPGrr@Q~> +JaS*Wp?qn[JaUkPrr<&erW!#f!!)i_!!'b$rrC+-!!%T<X6orfJaTT,rW%N;fC&Y=J,~> +Ja.gOp?MVWJa1SH#lanirrE)a!<;l[!<9durrC+)!!%T8X6KZbJa0<$rW%N7fBWA9J,~> +J`_OGp?)>SJ`b;@#QXne!<3&]rrDlW!!'aqrrC+%!!%T4X6'B^J`a#qrW%N3fB3)5J,~> +JaS*Wp$VeZJaUqRrr<>m!:BjT!:BgeqsFFamHsrSQL4_Q\*a4rJaW4!!!%T<p$Me[\F0=rJaV1Y +rr@Q~> +Ja.gOp$2MVJa1YJ$NC+ks69ULs69Uaqs"1]mHOZOQKeGM\*<qnJa2pn!!%T8p$)MW\Ea%nJa1nQ +rr@Q~> +J`_OGp#c5RJ`bAB$3:+g!9X=D!9X:]qrRkYmH+BKQKA/I\)mYjJ`cXf!!%T4p#Z5S\E<bjJ`bVI +rr@Q~> +JaS*Wo^;\YQgOhRqX+=``U4'5mJu\C!:K7TmK!1Q!!'n(!!%T<p$Me[JaS*WSaQIWJaV4Zrr@Q~> +Ja.gOo]lDUQg+PNqW\%\`Tdd1lMp/7!:&kLl2^bI!<9q$!!%T8p$)MWJa.gOSa-1SJa1qRrr@Q~> +J`_OGo]H,QQf\8JqW7bX`T@O-joFQ+s5rGDk5YAA!!'mu!!%T4p#Z5SJ`_OGS`]nOJ`bYJrr@Q~> +JaS*WoBuSXJaUtS!!)l`!W_WgrpBad_<q:'JaS*WJaVLb!!'7krr@W<g$\k?J,~> +Ja.gOoBQ;TJa1\K!<;o\!rqQcrosL`_<M"#Ja.gOJa24Z!!'7grr@W8g$8S;J,~> +J`_OGoB-#PJ`bDC!!)lX!W_?_roO1\_<(^tJ`_OGJ`bqR!!'7crr@W4g#i;7J,~> +JaSQd!!*#dquH0QrW%N;eF!;:q!J7bmJuYTJaU):!!%T<p$Me[NUHfHR-stSJaV7[rr@Q~> +Ja/9\!!*#`quH0MrW%N7eER&6q!&"^lMp/LJa0f2!!%T8p$)MWNU$NDR-O\OJa1tSrr@Q~> +J``!T!!*#\quH0IrW%N3eE-`2puV\ZjoFNDJ`aN*!!%T4p#Z5SNTU6@R-+DKJ`b\Krr@Q~> +JaSTerrE&d!!)9OrW&>R!!'=m!!(%,!!%T<amK-/QL4_QJaTT,rr@W<g[>(AJ,~> +Ja/<]rrE&`!!)9KrW&>N!!'=i!<:((!!%T8am&j+QKeGMJa0<$rr@W8gZne=J,~> +J``$UrrE&\!!)9GrW&>J!!'=e!!(%$!!%T4alWR'QKA/IJ`a#qrr@W4gZJM9J,~> +JaSWf!W_WgrpBadkjJEMJaU\K!W_WgJaW@%!!&AR!!&qb!!%T<p$Me[VsaNaJaV=]rr@Q~> +Ja/?^!W_KcrosI`kj&-IJa1DC!rqQcJa3'r!!&AN!!&q^!!%T8p$)MWVs=6]Ja2%Urr@Q~> +J``'V!W_?_roO1\kiVjEJ`b,;!W_?_J`cdj!!&AJ!!&qZ!!%T4p#Z5SVrmsYJ`bbMrr@Q~> +JaSQd!!*#d!s%`h!:'"P!2/`[!;Z$_!4M:q!<2Bd!.jRSmJm6<mXaebmf!3;mbR=2!.Y~> +Ja/9\!!*#`!s%Td!:&kL!2/TW!;Ym[!4M.ms8M9`s+0IOl2Ug8l@J5ZlM^d7lJ:b*!.Y~> +J``!T!!*#\!s%H`!:&_H!2/HS!;YaW!4M"i!<2*\!.j:Kjo>C4k(2ZRk5G@3k2#2"!.Y~> +JaSQd!!*#drrE)e!!)<Prr@W<c0bQ3r9aObcgCc5JaS*WJaVLb!!&YZrW%N;hX:CDJ,~> +Ja/9\!!*#`rrE)a!!)<Lrr@W8c0></r9=:^cftK1Ja.gOJa24Z!!&YVrW%N7hWk+@J,~> +J``!T!!*#\rrE)]!!)<Hrr@W4c/o!+r8mtZcfP3-J`_OGJ`bqR!!&YRrW%N3hWFh<J,~> +JaSQd!!)l`!!)9Orr@W<cgCc5qX+=`JaUYJ!!%T<p$Me[JaWF'!!&DSrW%N;hsULEJ,~> +Ja/9\!!)l\!!)9Krr@W8cftN1qW\(\Ja1AB!!%T8p$)MWJa3-t!!&DOrW%N7hs14AJ,~> +J``!T!!)lX!!)9Grr@W4cfP3-qW7bXJ`b):!!%T4p#Z5SJ`cjl!!&DKrW%N3hraq=J,~> +JaSQd!!)l`!!)9OrW&tdrrB(e!!)f^!!([>!!%T<JaU_L!!%T<XR?&fJaVIarr@Q~> +Ja/9\!!)l\!!)9KrW&t`rrB(a!<;iZ!<:^:!!%T8Ja1GD!!%T8XQocbJa21Yrr@Q~> +J``!T!!)lX!!)9GrW&t\rrB(]!!)fV!!([6!!%T4J`b/<!!%T4XQKK^J`bnQrr@Q~> +JaSQd!!*#d!!*#d!!)6NrW%N;JaU;@!!&>Q!!'Rt!!%T<p$Me[Q1"VOJaVLbrr@Q~> +Ja/9\!!*#`!!*#`!!)6JrW%N7Ja1#8!!&>M!!'Rp!!%T8p$)MWQ0S>KJa24Zrr@Q~> +J``!T!!*#\!!*#\!!)6FrW%N3J`a`0!!&>I!!'Rl!!%T4p#Z5SQ0/&GJ`bqRrr@Q~> +JaSWfquHcbrW)*KrW&;Q!!&AR!!%T<md:&TJaW4!!!%T<L[P-AJaVOcrr@Q~> +Ja/?^quHc^rW)*GrW&;M!!&AN!!%T8mcjcPJa2pn!!%T8L[+j=Ja27[rr@Q~> +J``'VquHcZrW)*CrW&;I!!&AJ!!%T4mcFKLJ`cXf!!%T4LZ\R9J`btSrr@Q~> +JaS*WlL+WOZgIenJaW4!!!%T<JaS*WJaVmmrr@W<ipQgHJ,~> +Ja.gOlK\?KZg%MjJa2pn!!%T8Ja.gOJa2Uerr@W8ip-ODJ,~> +J`_OGlK8'GZfV5fJ`cXf!!%T4J`_OGJ`c=]rr@W4io^7@J,~> +JaS*Wl0eNNJaS*WT^Dd[JaW4!!!%T<p$Me[p?hn\R-stSJaVRdrr@Q~> +Ja.gOl0A6JJa.gOT]uLWJa2pn!!%T8p$)MWp?DVXR-O\OJa2:\rr@Q~> +J`_OGl/qsFJ`_OGT]Q4SJ`cXf!!%T4p#Z5Sp>u>TR-+DKJ`c"Trr@Q~> +JaS*WkjJEM]^>b"O6uuJrU'XcrU'XcJaS*WJaS*We*d28JaVXfrr@Q~> +Ja.gOkj&-I]]oIsO6Q]FrTX@_rTX@_Ja.gOJa.gOe*?o4Ja2@^rr@Q~> +J`_OGkiVjE]]K1oO6-HBrT4+[rT4+[J`_OGJ`_OGe)pW0J`c(Vrr@Q~> +JaS*WkO/<LJaUYJ!!*#d!!*#d!!%T<!U]rSmf*9<m_8)h!/'_=!.jS#mf*9;~> +Ja.gOkN`$HJa1AB!!*#`!!*#`!!%T8!U9ZOlMgj8lFuN`!/'S9!.jFtlMgj7~> +J`_OGkN;aDJ`b):!<<&\!<<&\!<7W4!TjBKk5PF4k.]sX!/'G5!.j:pk5PF3~> +JaS*Wk3i3KJaUYJ"p")Z!:K7Tlg=`QJaNR,!.jS2mJm6<mXag"mf!3;mcNs;!.Y~> +Ja.gOk3DpGJa1AB"p!rR!:&hLlfnHMJa*:$!.jG.l2Ug8l@J6olM^d7lK7C3!.Y~> +J`_OGk2uXCJ`b):#63iJs5rJDlfJ0IJ`[!q!.j;*jo>C4k(2[gk5G@3k2th+!.Y~> +JaS*WjmN-K`9mU*ea<D;ZgIqrmJuYTp$Me[JaS*WJaS*Wg[>%@JaV^hrr@Q~> +Ja.gOjm)jG`9I=&e`m,7Zg%Ynl2^)Lp$)MWJa.gOJa.gOgZnb<Ja2F`rr@Q~> +J`_OGjlZRC`9%%"e`Hi3ZfVDjk5XTDp#Z5SJ`_OGJ`_OGgZJJ8J`c.Xrr@Q~> +JaS*WjR3$JJaUVIrW%N;JaVIa!!%T<p$Me[JaWF'rW%N;kjJHNJ,~> +Ja.gOjQcaFJa1>ArW%N7Ja21Y!!%T8p$)MWJa3-trW%N7kj&0JJ,~> +J`_OGjQ?IBJ`b&9rr7Q3J`bnQ!!%T4p#Z5SJ`cjlrW%N3kiVmFJ,~> +JaS*Wj6lpIc0bQ3K'r=4JaS*WV="<`JaTZ.rr@W<kO/?MJ,~> +Ja.gOj6HXEc0>9/K'N%0Ja.gOV<S$\Ja0B&rr@W8kN`'IJ,~> +J`_OGj6$@Ac/o!+K')e,J`_OGV<.aXJ`a)srr@W4kN;dEJ,~> +JaS*Wj6lmHJaU\KrW)f_!!%T<!U]rSmJm6<ma(;$!.jS4me[!8mca*=!.Y~> +Ja.gOj6HUDJa1DCrW)f[!!%T8!U9ZOl2Ug8lHe_q!.jG0lMCR4lKIO5!.Y~> +J`_OGj6$=@J`b,;rr;iW!!%T4!TjBKjo>C4k0N/i!.j;,k5,.0k31t-!.Y~> +JaS*WipQdGJaUbM"9@iimJuD;rrA5M!!%T<p$Me[JaS*Wm-acOJaVXfrr@Q~> +Ja.gOip-LCJa1JE"9@]el2]u3rrA5I!!%T8p$)MWJa.gOm-=KKJa2@^rr@Q~> +J`_OGio^4?J`b2="TRWak5XT+rrA5E!!%T4p#Z5SJ`_OGm,n3GJ`c(Vrr@Q~> +JaS*WiU6[Ff'WM<_sRL)\aBY%md:)C!!%T<JaS*WJaV+WqZ)38j6lpIJ,~> +Ja.gOiTgCBf'358_s.4%\`sA!lKSB7!!%T8Ja.gOJa1hOqZ)34j6HXEJ,~> +J`_OGiTC+>f&cr4_r^q!\`O+rk2u^+!<7W4J`_OGJ`bPGqZ)30j6$@AJ,~> +JaS*Wi9pREJaUnQ!!*#d!!*#d!!%T<JaW$q!!%T<p$Me[JaW=$quD<9i9pUFJ,~> +Ja.gOi9L:AJa1VI!!*#`!!*#`!!%T8Ja2ai!!%T8p$)MWJa3$qquD<5i9L=BJ,~> +J`_OGi9("=J`b>A!<<&\!<<&\!<7W4J`cIa!!%T4p#Z5SJ`caiquD<1i9(%>J,~> +JaS*WhsUIDJaUtS!!)uc!!)uc!!%T<rpBadJaT?%!!&AR!!'%eqZ)38hX:CDJ,~> +Ja.gOhs11@Ja1\K!!)u_!!)u_!!%T8rosI`Ja0&r!!&AN!!'%aqZ)34hWk+@J,~> +J`_OGhran<J`bDC!<<#[!<<#[!<7W4roO1\J``cj!!&AJ!!'%]qZ)30hWFh<J,~> +JaS*WhX:@CJaV"Trr@W<KC/^>QL4_QJaUABquD<9g[>(AJ,~> +Ja.gOhWk(?Ja1_Lrr@W8KB`F:QKeGMJa1):quD<5gZne=J,~> +J`_OGhWFe;J`bGDrr@W4KB<.6QKA/IJ`af2quD<1gZJM9J,~> +JaS*Wh<t7BJaTW-!!&e^!!%T<p$Me[JaW4!!!%T<q<n+[JaV4Zrr@Q~> +Ja.gOh<Ot>Ja0?%!!&eZ!!%T8p$)MWJa2pn!!%T8q<IhWJa1qRrr@Q~> +J`_OGh<+\:J`a&r!!&eV!!%T4p#Z5SJ`cXf!!%T4q<%PSJ`bYJrr@Q~> +JaS*Wh!Y.AkjAENZL.\m`U3^+JaS*WJaS*WeF*57JaV+Wrr@Q~> +Ja.gOh!4k=kir-JZK_Di`TdF'Ja.gOJa.gOeEZr3Ja1hOrr@Q~> +J`_OGgueS9kiMjFZK;,e`T@.#J`_OGJ`_OGeE6Z/J`bPGrr@Q~> +JaS*Wg[>(AJaV:\!!%T<JaVso!!%T<p$Me[JaW=$qZ)38eF*>:J,~> +Ja.gOgZne=Ja2"T!!%T8Ja2[g!!%T8p$)MWJa3$qqZ)34eE[&6J,~> +J`_OGgZJM9J`b_L!!%T4J`cC_!!%T4p#Z5SJ`caiqZ)30eE6c2J,~> +JaS*Wg@"t@JaS*Wea<D;JaS*WVsXNb]C,RsJaUqRrr@Q~> +Ja.gOg?S\<Ja.gOe`m,7Ja.gOVs46^]B]:oJa1YJrr@Q~> +J`_OGg?/D8J`_OGe`Hi3J`_OGVrdsZ]B9"kJ`bABrr@Q~> +JaS*Wg$\k?JaVUe!!%T<JaS3Z!!%T<e*d)5JaUkPrr@Q~> +Ja.gOg$8S;Ja2=]!!%T8Ja.pR!!%T8e*?f1Ja1SHrr@Q~> +J`_OGg#i;7J`c%U!!%T4J`_XJ!!%T4e)pN-J`b;@rr@Q~> +JaS*Wg$\h>p?qq\JaU&9!!&>Q!!&8O!!%T<p$Me[JaW=$quD<9bjPK2J,~> +Ja.gOg$8P:p?MYXJa0c1!!&>M!!&8K!!%T8p$)MWJa3$qquD<5bj,3.J,~> +J`_OGg#i86p?)ATJ`aK)!!&>I!!&8G!!%T4p#Z5SJ`caiquD<1bi\p*J,~> +JaS*Wf^A_=qX44\V!\3_QgOhR[I+"pJaS*WJaVLbqZ)38b3o90J,~> +Ja.gOf]rG9qWdqXV!7p[Qg+PN[H[_lJa.gOJa24ZqZ)34b3K!,J,~> +J`_OGf]N/5qW@YTUuhXWQf\8J[H7GhJ`_OGJ`bqRqZ)30b3&^(J,~> +JaS*WfC&V<rpKX`JaW7"!!%T<JaS*WiU-[GJaW:#quH'N!!)][!!)QW!!)ucrW%T=rr@Q~> +Ja.gOfBW>8rp'@\Ja2so!!%T8Ja.gOiT^CCJa3!pquH'J!!)]W!!)QS!!)u_rW%T9rr@Q~> +J`_OGfB3&4roX(XJ`c[g!!%T4J`_OGiT:+?J`c^hquH'F!!)]S!!)QO!!)u[rW%T5rr@Q~> +JaS*Wf'`>6JaS*Wm-XiRJaW4!!!%T<U[J-^c0kH/lL+ZPp$Me[o'QY]mJu\C!<2Bd!/0e?!.Y~> +Ja.gOf'<&2Ja.gOm-4QNJa2pn!!%T8U[%jZc0G0+lK\BLp$)MWo'-AYl2^,7!<26`!/0Y;!.Y~> +J`_OGf&lc.J`_OGm,e9JJ`cXf!!%T4UZVRVc0"m'lK8*Hp#Z5So&^)UjoFQ+!<2*\!/0M7!.Y~> +JaS*WeaEA9JaW:#!!%T<JaS*WoBuVYJaVUequGsK!W_Wgp?qq\p[/"]rpBadrpBgfmK!7S!!%]? +rr@Q~> +Ja.gOea!)5Ja3!p!!%T8Ja.gOoBQ>UJa2=]quGsG!W_Kcp?MYXpZ__YrosI`rosObl2^hK!!%]; +rr@Q~> +J`_OGe`Qf1J`c^h!!%T4J`_OGoB-&QJ`c%UquGsC!W_?_p?)ATpZ;GUroO1\roO7^joGDC!!%]7 +rr@Q~> +JaS*WeF*;9JaS*W^[;(%VX=EaoBlSYK^Jg?JaW=$qZ,^F!!)c]!W_WgrpKacrU'XcrpBadrpBgf +mK!7S!!%]?rr@Q~> +Ja.gOeE[#5Ja.gO^Zke!VWn-]oBH;UK^&O;Ja3$qqZ,^B!!)cY!W_Kcrp'I_rTX@_rosI`rosOb +l2^hK!!%];rr@Q~> +J`_OGeE6`1J`_OG^ZGLrVWIjYoB$#QK]W77J`caiqZ,^>!!)cU!W_?_roX1[rT4([roO1\roO7^ +joGDC!!%]7rr@Q~> +JaS*We*d28JaTW-!!((-!!%T<JaS*Wi9pLCiU-[Gp[/1bmJu\C!<2Be!:Kab!U]semK*CVmf!3= +mf*9;~> +Ja.gOe*?o4Ja0?%!!(()!!%T8Ja.gOi9L4?iT^CCpZ_n^l2^,7!<26a!:'I^!U9[al2gtNlM^d9 +lMgj7~> +J`_OGe)pW0J`a&r!!((%!!%T4J`_OGi9'q;iT:+?pZ;VZjoFQ+!<2*]!9X1Z!TjC]joPPFk5G@5 +k5PF3~> +JaS*WddI)7JaWR+!!%T<JaS*WiU-[GJaW:#quGUA!!)f^"T[uY!:K:Q!<2Bd!<2Bd!<2Bf!:Bjd +mJm6?mf*9;~> +Ja.gOdd$f3Ja3:#!!%T8Ja.gOiT^CCJa3!pquGU=!!)fZ"T[iQ!:&kI!<26`!<26`!<26b!9sR` +l2Ug;lMgj7~> +J`_OGdcUN/J`d!p!!%T4J`_OGiT:+?J`c^hquGU9!!)fV"T[]I!9WGA!<2*\!<2*\!<2*^!9O:\ +jo>C7k5PF3~> +JaS*WdI.#7JaS*Wq<n7_JaW4!!!%T<OmW2Lh<t1@h!P.Bq!S%[!U]samJm7dmJm7dmK*CV!<2Bd +!/0e?!.Y~> +Ja.gOdH^`3Ja.gOq<It[Ja2pn!!%T8Om2oHh<On<h!+k>q!.bW!U9[]l2Uh`l2Uh`l2gtN!<26` +!/0Y;!.Y~> +J`_OGdH:H/J`_OGq<%\WJ`cXf!!%T4OlcWDh<+V8gu\S:pu_JS!TjCYjo>D\jo>D\joPPF!<2*\ +!/0M7!.Y~> +JaS*Wd-go6JaS*WJaS*Wk3`3LJaW4!quGF<!!)rb!!)oa!s%cW!<2Bd!;Z$d!:BjTmK!7S!!%]? +rr@Q~> +Ja.gOd-CW2Ja.gOJa.gOk3;pHJa2pnquGF8!!)r^!!)o]!s%WO!<26`!;Ym`!9sRLl2^hK!!%]; +rr@Q~> +J`_OGd,t?.J`_OGJ`_OGk2lXDJ`cXfquGF4!!)rZ!!)oY!s%KG!<2*\!;Ya\!9O:DjoGDC!!%]7 +rr@Q~> +JaS*WcgLf5JaS*W^[D+%\F'=siU-[GQL4_QJaW:#quGF<quHcbrW)la!!*#drW)]\!!)ucrW%T= +rr@Q~> +Ja.gOcg(N1Ja.gO^Zth!\EX%oiT^CCQKeGMJa3!pquGF8quHc^rW)l]!!*#`rW)]X!!)u_rW%T9 +rr@Q~> +J`_OGcfY6-J`_OG^ZPOr\E3bkiT:+?QKA/IJ`c^hquGF4quHcZrW)lY!!*#\rW)]T!!)u[rW%T5 +rr@Q~> +JaS*WcgLc4JaTW-!!([>!!%T<p$Me[JaS*WmI'lPcL(Z4JaVUerr@Q~> +Ja.gOcg(K0Ja0?%!!([:!!%T8p$)MWJa.gOmHXTLcKYB0Ja2=]rr@Q~> +J`_OGcfY3,J`a&r!!([6!!%T4p#Z5SJ`_OGmH4<HcK5*,J`c%Urr@Q~> +JaS*WlL+WOrU'XcmI'rROR<)KJaS*WJaS*WeaE>8JaT]/rr@Q~> +Ja.gOlK\?KrTX@_mHXZNOQlfGJa.gOJa.gOea!&4Ja0E'rr@Q~> +J`_OGlK8'GrT4([mH4BJOQHNCJ`_OGJ`_OGe`Qc0J`a,trr@Q~> +JaS*Wlg=`QrpBpimd:)C!:B4R!.jQhmXag)mJm6<me,uJ!0$=G!:T@R!.jR=mf*9;~> +Ja.gOlfnHMrosXelKSB7!:B(N!.jEdl@J7!l2Ug8lLjEB!0$1C!:T4N!.jF9lMgj7~> +J`_OGlfJ0IroO@ak2l[+!:AqJ!.j9`k(2[njo>C4k4Rj:!0$%?!:T(J!.j:5k5PF3~> +JaS*Wlg=`QrpBgfmK!7S!!)ESrW%N;JaS*WJaV[g!!&AR!!)QWquD<9WUBcdJ,~> +Ja.gOlfnHMrosObl2^hK!!)EOrW%N7Ja.gOJa2C_!!&AN!!)QSquD<5WTsK`J,~> +J`_OGlfJ0IroO7^joGDC!!)EKrW%N3J`_OGJ`c+W!!&AJ!!)QOquD<1WTO3\J,~> +JaS*WkO&BOmK!7S!!)BRrW%N;JaU;@!!&>Q!!&tc!!%]?rrDc\quD<9VXFHaJ,~> +Ja.gOkNW*Kl2^hK!!)BNrW%N7Ja1#8!!&>M!!&t_!!%];rrDcXquD<5VX"0]J,~> +J`_OGkN2gGjoGDC!!)BJrW%N3J`a`0!!&>I!!&t[!!%]7rrDcTquD<1VWRmYJ,~> +JaS*WkjANQmd:)SmJm7Qmf!3;m]>gV!:&tP!.jS2mJm6<mXag#mf!4_me[!8m\K:N!.Y~> +Ja.gOkir6MlKSBKl2UhMlM^d7lE'7N!:&hL!.jG.l2Ug8l@J6plM^e[lMCR4lD3_F!.Y~> +J`_OGkiMsIk2l[Cjo>DIk5G@3k,d\F!:&\H!.j;*jo>C4k(2[hk5GAWk5,.0k+q/>!.Y~> +JaS*Wl0\NOrpBadrpBadlL+WOU@&!]q!J+^JaS*WJaS*Wk3i3KrU0R`JaT6"rr@Q~> +Ja.gOl086KrosI`rosI`lK\?KU?V^Yq!%hZJa.gOJa.gOk3DpGrTa:\Ja/rorr@Q~> +J`_OGl/hsGroO1\roO1\lK8'GU?2FUpuVPVJ`_OGJ`_OGk2uXCrT="XJ``Zgrr@Q~> +JaS*WlL"WPrU'XcrpBadl0eQOJaS*WNpZlIJaW4!!!%T<r9j=[JaT/urr@Q~> +Ja.gOlKS?LrTX@_rosI`l0A9KJa.gONp6TEJa2pn!!%T8r9F%WJa/lmrr@Q~> +J`_OGlK/'HrT4([roO1\l/r!GJ`_OGNog<AJ`cXf!!%T4r9!bSJ``Terr@Q~> +JaS*Wlg=`QqsFLcmJuG<rr@W<JaS*WJaS*WqsO@^JaT&rrr@Q~> +Ja.gOlfnHMqs"4_l2^#4rr@W8Ja.gOJa.gOqs+(ZJa/cjrr@Q~> +J`_OGlfJ0IqrRq[joFT,rr@W4J`_OGJ`_OGqr[eVJ``Kbrr@Q~> +JaS*WlgFZNrpBadjmN-KX7#ufJaSil!!&AR!!'Rt!!%T<p[7nYJaSuprr@Q~> +Ja.gOlg"BJrosI`jm)jGX6T]bJa/Qd!!&AN!!'Rp!!%T8pZhVUJa/]hrr@Q~> +J`_OGlfS*FroO1\jlZRCX60E^J``9\!!&AJ!!'Rl!!%T4pZD>QJ``E`rr@Q~> +JaS*W`U<a+JaTT,!!)rb!!%T<p$Me[JaW4!!!%T<q<n.\JaSlmrr@Q~> +Ja.gO`TmI'Ja0<$!!)r^!!%T8p$)MWJa2pn!!%T8q<IkXJa/Terr@Q~> +J`_OG`TI1#J`a#q!!)rZ!!%T4p#Z5SJ`cXf!!%T4q<%STJ``<]rr@Q~> +JaS*W`U<^*ZgIenk3`3LJaS*WJaS*Wna?8SJaSfkrr@Q~> +Ja.gO`TmF&Zg%Mjk3;pHJa.gOJa.gOn`ouOJa/Ncrr@Q~> +J`_OG`TI."ZfV5fk2lXDJ`_OGJ`_OGn`K]KJ``6[rr@Q~> +JaS*W`:!U)JaS*WT^Dd[JaW4!!!%T<q!S%[JaS]hrr@Q~> +Ja.gO`9R=%Ja.gOT]uLWJa2pn!!%T8q!.bWJa/E`rr@Q~> +J`_OG`9.%!J`_OGT]Q4SJ`cXf!!%T4pu_JSJ``-Xrr@Q~> +JaS*W_s[L(JaT]/!!%T<JaS*WiU6RCJaSWfrr@Q~> +Ja.gO_s74$Ja0E'!!%T8Ja.gOiTg:?Ja/?^rr@Q~> +J`_OG_rgpuJ`a,t!!%T4J`_OGiTC";J``'Vrr@Q~> +JaS*W_X@C'^$Yk#JaS*WR-jqSQL4_QX7#lcJaSNcrr@Q~> +Ja.gO_Wq+#^$5RtJa.gOR-FYOQKeGMX6TT_Ja/6[rr@Q~> +J`_OG_WLgt^#f:pJ`_OGR-"AKQKA/IX60<[J`_sSrr@Q~> +JaS*W_=%:&JaU#8!!%T<p$Me[XR6&gbO,?1JaW@%qZ)38MsgTFJ,~> +Ja.gO_<V""Ja0`0!!%T8p$)MWXQfccbN]'-Ja3'rqZ)34MsC<BJ,~> +J`_OG_<1^sJ`aH(!!%T4p#Z5SXQBK_bN8d)J`cdjqZ)30Mrt$>J,~> +JaS*W_!_1%R-jqSJaS*WJaS*WquD<9M!k9CJ,~> +Ja.gO_!:n!R-FYOJa.gOJa.gOquD<5M!G!?J,~> +J`_OG^ukUrR-"AKJ`_OGJ`_OGquD<1M!"^;J,~> +JaS*W^[D($`pNg,JaS*WJaVLb!!%T<q!S"ZJaS9\rr@Q~> +Ja.gO^Ztdu`p*O(Ja.gOJa24Z!!%T8q!._VJa/!Trr@Q~> +J`_OG^ZPLq`o[7$J`_OGJ`bqR!!%T4pu_GRJ`_^Lrr@Q~> +JaS*W^@)"$JaU;@!!%T<JaS*Wi9pLCJaS0Yrr@Q~> +Ja.gO^?Y^uJa1#8!!%T8Ja.gOi9L4?Ja.mQrr@Q~> +J`_OG^?5FqJ`a`0!!%T4J`_OGi9'q;J`_UIrr@Q~> +JaS*W^$bn#cL(Z4JaS*WJaSup!!'_#qZ)38JaWO<J,~> +Ja.gO^$>UtcKYB0Ja.gOJa/]h!!'^tqZ)34Ja378J,~> +J`_OG^#o=pcK5*,J`_OGJ``E`!!'^pqZ)30J`ct4J,~> +JaS*W]^Ge"JaS*W^[;(%rpBadRdL.Uh<k7CJaW=$quD<9JaWO*rr@Q~> +Ja.gO]^#LsJa.gO^Zke!rosI`Rd'kQh<Ft?Ja3$qquD<5Ja37"rr@Q~> +J`_OG]]T4oJ`_OG^ZGLrroO1\RcXSMh<"\;J`caiquD<1J`csorr@Q~> +JaS*W]C,\!QgOhR[-dnojmE*KJaS*WJaWO*qZ)38JaWI(rr@Q~> +Ja.gO]B]CrQg+PN[-@VkjlugGJa.gOJa37"qZ)34Ja30urr@Q~> +J`_OG]B9+nQf\8J[,q>gjlQOCJ`_OGJ`csoqZ)30J`cmmrr@Q~> +JaS*W]C,XufBrV=JaS*WJaVLb!!%T<p[7qZJaS*Wq<n7_J,~> +Ja.gO]B]@qfBN>9Ja.gOJa24Z!!%T8pZhYVJa.gOq<It[J,~> +J`_OG]B9(mfB*&5J`_OGJ`bqR!!%T4pZDARJ`_OGq<%\WJ,~> +JaS*W]'fOtJaUtSrr@W<p$Me[JaS*WmI'iOlL"WPp[8"\na6AWrU0XbJaTo5rr@Q~> +Ja.gO]'B7pJa1\Krr@W8p$)MWJa.gOmHXQKlKS?LpZh_Xn`g)SrTa@^Ja0W-rr@Q~> +J`_OG]&rtlJ`bDCrr@W4p#Z5SJ`_OGmH49GlK/'HpZDGTn`BfOrT=(ZJ`a?%rr@Q~> +JaS*W\aKFsJaS*WJaS*WkO/?McL1T1kjJHNq!J+^rpBadoBlb^mJu\C!<2Bd!.jRGmf*9;~> +Ja.gO\a'.oJa.gOJa.gOkN`'IcKb<-kj&0Jq!%hZrosI`oBHJZl2^,7!<26`!.jFClMgj7~> +J`_OG\`WkkJ`_OGJ`_OGkN;dEcK>$)kiVmFpuVPVroO1\oB$2VjoFQ+!<2*\!.j:?k5PF3~> +JaS*W\F0=rJaS*Wc0bQ3o^2\ZQgXkRn*U/UJaW=$qZ,gI!W_Wgq!J+^rpBadq!J+^rpBadrpBgf +mK!7S!!%T<[I4%pJ,~> +Ja.gO\Ea%nJa.gOc0>9/o]cDVQg4SNn*0lQJa3$qqZ,gE!W_Kcq!%hZrosI`q!%hZrosI`rosOb +l2^hK!!%T8[HdblJ,~> +J`_OG\E<bjJ`_OGc/o!+o]?,RQfe;Jn)aTMJ`caiqZ,gA!W_?_puVPVroO1\puVPVroO1\roO7^ +joGDC!!%T4[H@JhJ,~> +JaS*W\*j4qQgOhR`pNg,e*[29JaS*WO7)oGipHdHo^2b\mdC&SrU'XcrpBadrpBgfmK!7S!!%T< +[I4%pJ,~> +Ja.gO\*EqmQg+PN`p*O(e*6o5Ja.gOO6ZWCip$LDo]cJXlK\?KrTX@_rosI`rosObl2^hK!!%T8 +[HdblJ,~> +J`_OG\*!YiQf\8J`o[7$e)gW1J`_OGO66??ioU4@o]?2Tk2uXCrT4([roO1\roO7^joGDC!!%T4 +[H@JhJ,~> +JaS*W[dO+pl0\NOZ0hSlJaS*WZL.\mJaW:#qZ,RB!!)][!s%cW!<2Be!:Kab!U]semK*CVmf!3; +m^2E^!.Y~> +Ja.gO[d*hll086KZ0D;hJa.gOZK_DiJa3!pqZ,R>!!)]W!s%WO!<26a!:'I^!U9[al2gtNlM^d7 +lEojV!.Y~> +J`_OG[c[Phl/hsGZ/u#dJ`_OGZK;,eJ`c^hqZ,R:!!)]S!s%KG!<2*]!9X1Z!TjC]joPPFk5G@3 +k-X:N!.Y~> +JaS*W[I4"oJaVUe!!%T<o^2\ZJaS*Wm-acOh<k7Cp?hn\rpK[arpBadrpBadrpBgfmK!7S!!%T< +[I4%pJ,~> +Ja.gO[Hd_kJa2=]!!%T8o]cDVJa.gOm-=KKh<Ft?p?DVXrp'C]rosI`rosI`rosObl2^hK!!%T8 +[HdblJ,~> +J`_OG[H@GgJ`c%U!!%T4o]?,RJ`_OGm,n3Gh<"\;p>u>TroX+YroO1\roO1\roO7^joGDC!!%T4 +[H@JhJ,~> +JaS*W[-mqoJaS*WJaS*Wk3`3LhsU@Ag[5%Ap[/"]rU'XcqX+=`rpBadrpBgfmK!7S!!%T<[I4%p +J,~> +Ja.gO[-IYkJa.gOJa.gOk3;pHhs1(=gZeb=pZ__YrTX@_qW\%\rosI`rosObl2^hK!!%T8[Hdbl +J,~> +J`_OG[-%AgJ`_OGJ`_OGk2lXDhrae9gZAJ9pZ;GUrT4([qW7bXroO1\roO7^joGDC!!%T4[H@Jh +J,~> +JaS*WZgRhnp?qq\JaS*WbO,?1QgOnTmJqh+p[7qZf^8_>r9aObrpBadr9aObrpBadq<eCdmJu\C +!<2Bd!.jRGmf*9;~> +Ja.gOZg.Pjp?MYXJa.gObN]'-Qg+VPl2ZD#pZhYVf]iG:r9=7^rosI`r9=7^rosI`q<A+`l2^,7 +!<26`!.jFClMgj7~> +J`_OGZf_8fp?)ATJ`_OGbN8d)Qf\>LjoBtppZDARf]E/6r8mtZroO1\r8mtZroO1\q;qh\joFQ+ +!<2*\!.j:?k5PF3~> +JaS*WZL7_mq<n.\JaW@%!!'n(rrBLq!!%T<JaVpnqZ,::quHcbrW)udquHcbrW)]\!!)ucrW%N; +[-mqoJ,~> +Ja.gOZKhGiq<IkXJa3'r!!'n$rrBLm!!%T8Ja2XfqZ,:6quHc^rW)u`quHc^rW)]X!!)u_rW%N7 +[-IYkJ,~> +J`_OGZKD/eq<%STJ`cdj!!'murrBLi!!%T4J`c@^qZ,:2quHcZrW)u\quHcZrW)]T!!)u[rW%N3 +[-%AgJ,~> +JaS*WZL7\lr9jI_JaS*WJaS*WfC&P:c0bQ3JaSfkrr@Q~> +Ja.gOZKhDhr9F1[Ja.gOJa.gOfBW86c0>9/Ja/Ncrr@Q~> +J`_OGZKD,dr9!nWJ`_OGJ`_OGfB2u2c/o!+J``6[rr@Q~> +JaS*WZ0qSk!:KabJaS*WmHsrSJaW4!!!%T<q<n+[JaS*WhX:CDJ,~> +Ja.gOZ0M;g!:'I^Ja.gOmHOZOJa2pn!!%T8q<IhWJa.gOhWk+@J,~> +J`_OGZ0)#c!9X1ZJ`_OGmH+BKJ`cXf!!%T4q<%PSJ`_OGhWFh<J,~> +JaS*WYjVAgJaS*WJaS*Wl0\NOnF$2SJaS*Wg[>(AJ,~> +Ja.gOYj2)cJa.gOJa.gOl086KnEToOJa.gOgZne=J,~> +J`_OGYibf_J`_OGJ`_OGl/hsGnE0WKJ`_OGgZJM9J,~> +JaS*WYO;AiJaS*WJaVRd!!)TX!!&>Q!!)WYqZ)38JaV4Zrr@Q~> +Ja.gOYNl)eJa.gOJa2:\!!)TT!!&>M!!)WUqZ)34Ja1qRrr@Q~> +J`_OGYNGfaJ`_OGJ`c"T!!)TP!!&>I!!)WQqZ)30J`bYJrr@Q~> +JaS*WY3u8hJaWO*!!'7k!!((-!!%T<JaW=$rrDf]quD<9JaV+Wrr@Q~> +Ja.gOY3PudJa37"!!'7g!!(()!!%T8Ja3$qrrDfYquD<5Ja1hOrr@Q~> +J`_OGY3,]`J`cso!!'7c!!((%!!%T4J`cairrDfUquD<1J`bPGrr@Q~> +JaS*WXmZ/gR-jqSJaS*WJaUtSrW)i`qZ)38JaV%Urr@Q~> +Ja.gOXm5lcR-FYOJa.gOJa1\KrW)i\qZ)34Ja1bMrr@Q~> +J`_OGXlfT_R-"AKJ`_OGJ`bDCrW)iXqZ)30J`bJErr@Q~> +JaS*WXR?&fJaS*WqX4@`JaW4!!!%T<rpKacrpK[aJaS*WdI.#7J,~> +Ja.gOXQocbJa.gOqWe(\Ja2pn!!%T8rp'I_rp'C]Ja.gOdH^`3J,~> +J`_OGXQKK^J`_OGqW@eXJ`cXf!!%T4roX1[roX+YJ`_OGdH:H/J,~> +JaS*WX7#reJaS*WJaS*WkjJ6HJaS*WcgLf5J,~> +Ja.gOX6TZaJa.gOJa.gOkj%sDJa.gOcg(N1J,~> +J`_OGX60B]J`_OGJ`_OGkiV[@J`_OGcfY6-J,~> +JaS*WWp]leJaS*W^?tt$\F'=sJaW7"quD<9JaUbMrr@Q~> +Ja.gOWp9TaJa.gO^?P[u\EX%oJa2soquD<5Ja1JErr@Q~> +J`_OGWoj<]J`_OG^?,Cq\E3bkJ`c[gquD<1J`b2=rr@Q~> +JaS*WWUBcdO6uuJT'cRYg$Sh?JaW4!!!%T<q<n.\JaS*WamT0/J,~> +Ja.gOWTsK`O6Q]FT'?:Ug$/P;Ja2pn!!%T8q<IkXJa.gOam/m+J,~> +J`_OGWTO3\O6-EBT&p"Qg#`87J`cXf!!%T4q<%STJ`_OGal`U'J,~> +JaS*WW:'ZcQgOhRJaS*WJaV7[quD<9JaUSHrr@Q~> +Ja.gOW9XB_Qg+PNJa.gOJa1tSquD<5Ja1;@rr@Q~> +J`_OGW94*[Qf\8JJ`_OGJ`b\KquD<1J`b#8rr@Q~> +JaS*W`:!U)s6fdbn*^/TJaS*WJaWL)!!%T<q!S%[JaS*W`:!X*J,~> +Ja.gO`9R=%s6BL^n*9lPJa.gOJa34!!!%T8q!.bWJa.gO`9R@&J,~> +J`_OG`9.%!s5s4Zn)jTLJ`_OGJ`cpn!!%T4pu_JSJ`_OG`9.("J,~> +JaS*W`U3^+rpBgfmJuP?rW&>R!!%T<JaS*Wi9pLCJaS*W_X@F(J,~> +Ja.gO`TdF'rosObl2^,7rW&>N!!%T8Ja.gOi9L4?Ja.gO_Wq.$J,~> +J`_OG`T@.#roO7^joF]/rW&>J!!%T4J`_OGi9'q;J`_OG_WLjuJ,~> +JaS*W`U3^+rpBgfmJuM>rW%N;JaU8?!!%T<^@(n!JaS*W^[D+%J,~> +Ja.gO`TdF'rosObl2^)6rW%N7Ja0u7!!%T8^?YUrJa.gO^Zth!J,~> +J`_OG`T@.#roO7^joFZ.rW%N3J`a]/!!%T4^?5=nJ`_OG^ZPOrJ,~> +JaS*W_<qI,mJuYT!:0(P!28f\!.jS2mJm6hmJm70mJm75mJm6fmed'9mXaf>mf*9;~> +Ja.gO_<M1(l2^)L!:/qL!28ZX!.jG.l2Ugdl2Uh,l2Uh1l2UgblMLX5l@J66lMgj7~> +J`_OG_<(n$joFND!:/eH!28NT!.j;*jo>C`jo>D(jo>D-jo>C^k5541k(2[.k5PF3~> +JaS*W_X7X/md:&Tmd:)@mf!3QmJm6<mXaeWmd0B>!.jQhm^hid!.Y~> +Ja.gO_Wh@+lKS?LlKSB8lM^dMl2Ug8l@J5OlKmg6!.jEdlFQ9\!.Y~> +J`_OG_WD('k2lXDk2l[0k5G@Ijo>C4k(2ZGk3V7.!.j9`k.9^T!.Y~> +JaS*W_sRL)qX+=`lL+WOJaS*WO6uuJJaW=$qZ)38JaU&9rr@Q~> +Ja.gO_s.4%qW\%\lK\?KJa.gOO6Q]FJa3$qqZ)34Ja0c1rr@Q~> +J`_OG_r^q!qW7bXlK8'GJ`_OGO6-EBJ`caiqZ)30J`aK)rr@Q~> +JaS*W`9mU*q<e4_l0eNNX7#ufJaS*WJaVIaquD<9JaTr6rr@Q~> +Ja.gO`9I=&q<@q[l0A6JX6T]bJa.gOJa21YquD<5Ja0Z.rr@Q~> +J`_OG`9%%"q;qYWl/qsFX60E^J`_OGJ`bnQquD<1J`aB&rr@Q~> +JaS*W`U3^+r9aObrpBadkjJEMJaS*WJaSKbqZ)38JaTl4rr@Q~> +Ja.gO`TdF'r9=7^rosI`kj&-IJa.gOJa/3ZqZ)34Ja0T,rr@Q~> +J`_OG`T@.#r8mtZroO1\kiVjEJ`_OGJ`_pRqZ)30J`a<$rr@Q~> +JaS*W`U<X(s6fjdk3i6LJaTB&!!&MV!!(gB!!'_#!!'_#quD<9JaTc1rr@Q~> +Ja.gO`Tm@$s6BR`k3DsHJa0)s!!&MR!!(g>!!'^t!!'^tquD<5Ja0K)rr@Q~> +J`_OG`TI'us5s:\k2u[DJ``fk!!&MN!!(g:!!'^p!!'^pquD<1J`a3!rr@Q~> +JaS*WTC2^ZZgIenJaWF'!!%T<JaVaiqZ)38JaT]/rr@Q~> +Ja.gOTBcFVZg%MjJa3-t!!%T8Ja2IaqZ)34Ja0E'rr@Q~> +J`_OGTB?.RZfV5fJ`cjl!!%T4J`c1YqZ)30J`a,trr@Q~> +JaS*WT'lUYJaS*WT^Dd[JaW:#quD<9JaTT,rr@Q~> +Ja.gOT'H=UJa.gOT]uLWJa3!pquD<5Ja0<$rr@Q~> +J`_OGT'$%QJ`_OGT]Q4SJ`c^hquD<1J`a#qrr@Q~> +JaS*WT'lRX]^>b"JaW0u!!%T<JaVpnqZ)38JaTN*rr@Q~> +Ja.gOT'H:T]]oIsJa2mm!!%T8Ja2XfqZ)34Ja06"rr@Q~> +J`_OGT'$"P]]K1oJ`cUe!!%T4J`c@^qZ)30J``rorr@Q~> +JaS*WSaQIWJaS*WJaT&rquGdF!!)NV!!)ucrW%N;JaVC_rr@Q~> +Ja.gOSa-1SJa.gOJa/cjquGdB!!)NR!!)u_rW%N7Ja2+Wrr@Q~> +J`_OGS`]nOJ`_OGJ``KbquGd>!!)NN!!)u[rW%N3J`bhOrr@Q~> +JaS*WSF6@VJaU#8!!%oErrDKT!!'+grrCC5qZ,XDrrDTW"T[rjmd:)SmJm6<mXaf`mf*9;~> +Ja.gOSEg(RJa0`0!!%oArrDKP!!'+crrCC1qZ,X@rrDTS"T[fflKSBKl2Ug8l@J6XlMgj7~> +J`_OGSEBeNJ`aH(!!%o=rrDKL!!'+_rrCC-qZ,X<rrDTO"T[Zbk2l[Cjo>C4k(2[Pk5PF3~> +JaS*WS*p7U`U3^+eF!;:QgOhRJaS*Wq<n.\i9gXHmJutK!!*#d!!*#d!W_WgrpBadJaS*WhsULE +J,~> +Ja.gOS*KtQ`TdF'eER#6Qg+PNJa.gOq<IkXi9C@Dl2^PC!!*#`!!*#`!W_KcrosI`Ja.gOhs14A +J,~> +J`_OGS*'\M`T@.#eE-`2Qf\8JJ`_OGq<%STi8t(@joG,;!!*#\!!*#\!W_?_roO1\J`_OGhraq= +J,~> +JaS*WRdU.TR-jqSJaS*WOm`)Hh!P.BrU0XbrU'XcrpBadrpBgfmK!7S!!%T<JaVF`rr@Q~> +Ja.gORd0kPR-FYOJa.gOOm;fDh!+k>rTa@^rTX@_rosI`rosObl2^hK!!%T8Ja2.Xrr@Q~> +J`_OGRcaSLR-"AKJ`_OGOllN@gu\S:rT=(ZrT4([roO1\roO7^joGDC!!%T4J`bkPrr@Q~> +JaS*WRI:%ScL(Z4JaW0u!!%T<JaVmmquGF<!!*#d!!*#d!<DQc!!2KfrpBgfmdC&SJaS*WhX:CD +J,~> +Ja.gORHjbOcKYB0Ja2mm!!%T8Ja2UequGF8!!*#`!!*#`!<DE_!!2?brosOblK\?KJa.gOhWk+@ +J,~> +J`_OGRHFJKcK5*,J`cUe!!%T4J`c=]quGF4!!*#\!!*#\!<D9[!!23^roO7^k2uXCJ`_OGhWFh< +J,~> +JaS*WR-sqRJaS*WJaT]/qZ,79!!*#dquH`a!!*#d!!*#d!W_WgrpBadJaS*WhsULEJ,~> +Ja.gOR-OYNJa.gOJa0E'qZ,75!!*#`quH`]!!*#`!!*#`!W_KcrosI`Ja.gOhs14AJ,~> +J`_OGR-+AJJ`_OGJ`a,tqZ,71!!*#\quH`Y!!*#\!!*#\!W_?_roO1\J`_OGhraq=J,~> +JaS*WQgXhQJaS*W^[;1(md:(DmJm7Emed(7mJm7dmJm7`mJm7dmJm7dmK*CV!<2Bd!.jQhmbdI4 +!.Y~> +Ja.gOQg4PMJa.gO^Zkn$lKSA<l2UhAlMLY3l2Uh`l2Uh\l2Uh`l2Uh`l2gtN!<26`!.jEdlJLn, +!.Y~> +J`_OGQfe8IJ`_OG^ZGUuk2lZ4jo>D=k555/jo>D\jo>DXjo>D\jo>D\joPPF!<2*\!.j9`k25>$ +!.Y~> +JaS*WQL=bQf'WM<JaW4!!!)*J!!%T<MsgHBdd@)8rpBadrpBadq<eCdmJu\C!<2Bd!.jQhmbdI4 +!.Y~> +Ja.gOQKnJMf'358Ja2pn!!)*F!!%T8MsC0>dcpf4rosI`rosI`q<A+`l2^,7!<26`!.jEdlJLn, +!.Y~> +J`_OGQKJ2If&cr4J`cXf!!)*B!!%T4Mrsm:dcLN0roO1\roO1\q;qh\joFQ+!<2*\!.j9`k25>$ +!.Y~> +JaUbM!!)0L!!%T<kO/?MQgOhRJaS*WU@.pZdI-o4s6fjdp[/"]rU0XbJaS*WhX:CDJ,~> +Ja1JE!!)0H!!%T8kN`'IQg+PNJa.gOU?_XVdH^W0s6BR`pZ__YrTa@^Ja.gOhWk+@J,~> +J`b2=!!)0D!!%T4kN;dEQf\8JJ`_OGU?;@RdH:?,s5s:\pZ;GUrT=(ZJ`_OGhWFh<J,~> +JaVpnquGmI!!)*J!!%T<kO/?MJaUtSrr@W<p$Me[JaW@%qZ)38JaSWfrr@Q~> +Ja2XfquGmE!!)*F!!%T8kN`'IJa1\Krr@W8p$)MWJa3'rqZ)34Ja/?^rr@Q~> +J`c@^quGmA!!)*B!!%T4kN;dEJ`bDCrr@W4p#Z5SJ`cdjqZ)30J``'Vrr@Q~> +JaVjl!!)rb!!)<P!!)*J!!%T<kO/<LJaS*WJaU8?quD<9JaSNcrr@Q~> +Ja2Rd!!)r^!!)<L!!)*F!!%T8kN`$HJa.gOJa0u7quD<5Ja/6[rr@Q~> +J`c:\!!)rZ!!)<H!!)*B!!%T4kN;aDJ`_OGJ`a]/quD<1J`_sSrr@Q~> +JaVjl!!)-K!!)$H!!%T<kO/<LJaS*Wc0bQ3oBlSYQgOhRna?8SJaS*WMsgTFJ,~> +Ja2Rd!!)-G!!)$D!!%T8kN`$HJa.gOc0>9/oBH;UQg+PNn`ouOJa.gOMsC<BJ,~> +J`c:\!!)-C!!)$@!!%T4kN;aDJ`_OGc/o!+oB$#QQf\8Jn`K]KJ`_OGMrt$>J,~> +JaVjl!!)ucrrE&drr<)f!<2Ec!;Ps^!;u9a!<2Ec!<2Ec!<2Ec!;u6b!.jS#mf!4MmJm6<me,uJ +!.jQhmecGO!;5dX!.jQhmYL<2!.Y~> +Ja2Rd!!)u_rrE&`rr<)b!<29_!;PgZ!;u-]!<29_!<29_!<29_!;u*^!.jFtlM^eIl2Ug8lLjEB +!.jEdlMKlG!;5XT!.jEdlA4a*!.Y~> +J`c:\!!)u[rrE&\rr<)^!<2-[!;P[V!;u!Y!<2-[!<2-[!<2-[!;tsZ!.j:pk5GAEjo>C4k4Rj: +!.j9`k54<?!;5LP!.j9`k(r1"!.Y~> +JaVjl!!)rb!!*#d"p"&kmJuYTrpBadq<e4_rU'XcrpBgfmK!7S!W_WgrpBgfmK!7S!!)uc!!%T< +jmN*JR-stSJaS*W^[D($q<n+[JaS*WL@5'AJ,~> +Ja2Rd!!)r^!!*#`"p!ogl2^)LrosI`q<@q[rTX@_rosObl2^hK!W_KcrosObl2^hK!!)u_!!%T8 +jm)gFR-O\OJa.gO^Ztduq<IhWJa.gOL?ed=J,~> +J`c:\!!)rZ!!*#\"p!ccjoFNDroO1\q;qYWrT4([roO7^joGDC!W_?_roO7^joGDC!!)u[!!%T4 +jlZOBR-+DKJ`_OG^ZPLqq<%PSJ`_OGL?AL9J,~> +JaVjl!!)rb!!*#d"T[rjmJu\Q!;Z$_!;u9b!<2Ea!!2KfqsOIaqsFFaJaVUerW%N;jR*!JJaW0u +!!%T<!q$$gqsO@^JaS*WKC8a>J,~> +Ja2Rd!!)r^!!*#`"T[ffl2^,I!;Ym[!;u-^!<29]!!2?bqs+1]qs".]Ja2=]rW%N7jQZ^FJa2mm +!!%T8!pTacqs+(ZJa.gOKBiI:J,~> +J`c:\!!)rZ!!*#\"T[ZbjoFQA!;YaW!;u!Z!<2-Y!!23^qr[nYqrRkYJ`c%UrW%N3jQ6FBJ`cUe +!!%T4!p0I_qr[eVJ`_OGKBE16J,~> +JaVjl!!)rb!!*#d"p"&kmJuYTp$Me[qX+Fcmd:)QmJm7_mJm7bmJm6<mc3a7!.jQhmXafUmf*:e +me[!8mXaeWmf*9;~> +Ja2Rd!!)r^!!*#`"p!ogl2^)Lp$)MWqW\._lKSBIl2Uh[l2Uh^l2Ug8lJq1/!.jEdl@J6MlMgka +lMCR4l@J5OlMgj7~> +J`c:\!!)rZ!!*#\"p!ccjoFNDp#Z5SqW7k[k2l[Ajo>DWjo>DZjo>C4k2YV'!.j9`k(2[Ek5PG] +k5,.0k(2ZGk5PF3~> +JaVjl!!)rb!!*#d"p"&kmJuYTrpBadq!J+^rpBadrpBgfmK!7S!W_WgrpBgfmK!7S!!*#d!!%T< +iU6[Fp[8%]JaS*WJaVLbq>c*7JaS*WrpKddJ,~> +Ja2Rd!!)r^!!*#`"p!ogl2^)LrosI`q!%hZrosI`rosObl2^hK!W_KcrosObl2^hK!!*#`!!%T8 +iTgCBpZhbYJa.gOJa24Zq>c*3Ja.gOrp'L`J,~> +J`c:\!!)rZ!!*#\"p!ccjoFNDroO1\puVPVroO1\roO7^joGDC!W_?_roO7^joGDC!!*#\!!%T4 +iTC+>pZDJUJ`_OGJ`bqRq>c*/J`_OGroX4\J,~> +JaVjl!!)ucrW)ud!!*#d!W_ZVrW)]\!!)ucrW)rcrW)rcrW)rcrW)ob!!%T<i9pUFqX44\JaW@% +!!'k'!!'Iq!!%T<q<n+[JaS*WJaWI(rr@Q~> +Ja2Rd!!)u_rW)u`!!*#`!W_NNrW)]X!!)u_rW)r_rW)r_rW)r_rW)o^!!%T8i9L=BqWdqXJa3'r +!!'k#!!'Im!!%T8q<IhWJa.gOJa30urr@Q~> +J`c:\!!)u[rW)u\!!*#\!W_BFrW)]T!!)u[rW)r[rW)r[rW)r[rW)oZ!!%T4i9(%>qW@YTJ`cdj +!!'jt!!'Ii!!%T4q<%PSJ`_OGJ`cmmrr@Q~> +JaUbM!!)0L!!%T<hX:CDrpKX`T^Dd[JaS*W`:!O'JaS*WJaW@%rr@Q~> +Ja1JE!!)0H!!%T8hWk+@rp'@\T]uLWJa.gO`9R7#Ja.gOJa3'rrr@Q~> +J`b2=!!)0D!!%T4hWFh<roX(XT]Q4SJ`_OG`9-stJ`_OGJ`cdjrr@Q~> +JaS*WMsgEAJaS*Wm-XiRJaW=$qZ)38JaS*Wp[8%]J,~> +Ja.gOMsC-=Ja.gOm-4QNJa3$qqZ)34Ja.gOpZhbYJ,~> +J`_OGMrsj9J`_OGm,e9JJ`caiqZ)30J`_OGpZDJUJ,~> +JaS*WMXLHDJaS*WJaVLbquD<9JaS*Wo^;_ZJ,~> +Ja.gOMX(0@Ja.gOJa24ZquD<5Ja.gOo]lGVJ,~> +J`_OGMWXm<J`_OGJ`bqRquD<1J`_OGo]H/RJ,~> +JaS*WMXLHDJaS*WJaVUeqZ)38JaS*Wo'ZMXJ,~> +Ja.gOMX(0@Ja.gOJa2=]qZ)34Ja.gOo'65TJ,~> +J`_OGMWXm<J`_OGJ`c%UqZ)30J`_OGo&frPJ,~> +JaS*WM=1?CJaWO*!!'4j!!(+.!!(C6!!'%equD<9JaS*Wn*^2UJ,~> +Ja.gOM<b'?Ja37"!!'4f!!(+*!!(C2!!'%aquD<5Ja.gOn*9oQJ,~> +J`_OGM<=d;J`cso!!'4b!!(+&!!(C.!!'%]quD<1J`_OGn)jWMJ,~> +JaS*WM!k6BQgOhRQgOhRJaUABqZ)38JaS*WmI'uSJ,~> +Ja.gOM!Fs>Qg+PNQg+PNJa1):qZ)34Ja.gOmHX]OJ,~> +J`_OGM!"[:Qf\8JQf\8JJ`af2qZ)30J`_OGmH4EKJ,~> +JaS*WL[P-AJaS*WqX4@`JaW:#quD<9JaS*WlL+ZPJ,~> +Ja.gOL[+j=Ja.gOqWe(\Ja3!pquD<5Ja.gOlK\BLJ,~> +J`_OGLZ\R9J`_OGqW@eXJ`c^hquD<1J`_OGlK8*HJ,~> +JaS*WL@5$@JaS*WJaW*sqZ)38JaS*WkjJHNJ,~> +Ja.gOL?ea<Ja.gOJa2gkqZ)34Ja.gOkj&0JJ,~> +J`_OGL?AI8J`_OGJ`cOcqZ)30J`_OGkiVmFJ,~> +JaS*WL$np?JaS*WJaW4!quD<9JaS*WjmN-KJ,~> +Ja.gOL$JX;Ja.gOJa2pnquD<5Ja.gOjm)jGJ,~> +J`_OGL$&@7J`_OGJ`cXfquD<1J`_OGjlZRCJ,~> +JaS*WK^Sg>OR<)KJaW4!!!'b$!!'\"qZ)38JaS*Wj6lpIJ,~> +Ja.gOK^/O:OQlfGJa2pn!!'au!!'[sqZ)34Ja.gOj6HXEJ,~> +J`_OGK]`76OQHNCJ`cXf!!'aq!!'[oqZ)30J`_OGj6$@AJ,~> +JaS*WT^M^XrpBadmI'uSJaTT,!!%T<ddI#5JaS*WJaVIarr@Q~> +Ja.gOT^)FTrosI`mHX]OJa0<$!!%T8dd$`1Ja.gOJa21Yrr@Q~> +J`_OGT]Z.ProO1\mH4EKJ`a#q!!%T4dcUH-J`_OGJ`bnQrr@Q~> +JaS*WSF-O\md:)C!:B4S!.jQhmXag+med'9mXaeWmbR=2!.Y~> +Ja.gOSE^7XlKSB7!:B(O!.jEdl@J7#lMLX5l@J5OlJ:b*!.Y~> +J`_OGSE9tTk2l[+!:AqK!.j9`k(2[pk5541k(2ZGk2#2"!.Y~> +JaS*WSaHR[md:)SmJm7Smf*9SmJm6<mXafmmed'9mXaeWmb@10!.Y~> +Ja.gOSa$:WlKSBKl2UhOlMgjOl2Ug8l@J6elMLX5l@J5OlJ(V(!.Y~> +J`_OGS`U"Sk2l[Cjo>DKk5PFKjo>C4k(2[]k5541k(2ZGk1f%u!.Y~> +JaS*WT'cRYrpBadrpBadmI'rRJaS*WL@4s>jmN*Jna6AWrpK[aJaS*WORE,KJ,~> +Ja.gOT'?:UrosI`rosI`mHXZNJa.gOL?e[:jm)gFn`g)Srp'C]Ja.gOOQuiGJ,~> +J`_OGT&p"QroO1\roO1\mH4BJJ`_OGL?AC6jlZOBn`BfOroX+YJ`_OGOQQQCJ,~> +JaS*WTC2[Ys6]jerpBadm-aiQU$_m\JaW4!!!'.hrrC=3quGgG!!*#d!!)WY!W_WgqsFFaJaS*W +ORE,KJ,~> +Ja.gOTBcCUs69RarosI`m-=QMU$;UXJa2pn!!'.drrC=/quGgC!!*#`!!)WU!W_Kcqs".]Ja.gO +OQuiGJ,~> +J`_OGTB?+Qs5j:]roO1\m,n9IU#l=TJ`cXf!!'.`rrC=+quGg?!!*#\!!)WQ!W_?_qrRkYJ`_OG +OQQQCJ,~> +JaS*WSF-FYmK!7S!!)?QrW%N;XR?)gJaVUequG^D!!*#d!!)f^!!*#d!!*#d!!)uc!!%T<JaSTe +rr@Q~> +Ja.gOSE^.Ul2^hK!!)?MrW%N7XQofcJa2=]quG^@!!*#`!!)fZ!!*#`!!*#`!!)u_!!%T8Ja/<] +rr@Q~> +J`_OGSE9kQjoGDC!!)?IrW%N3XQKN_J`c%UquG^<!!*#\!!)fV!!*#\!!*#\!!)u[!!%T4J``$U +rr@Q~> +JaS*WSF-FYmK!7S!!)<PrW&>R!!%T<JaWC&quGXB!!*#d!W_ZVrW)ob!!*#d!!*#d!!)uc!!%T< +JaSTerr@Q~> +Ja.gOSE^.Ul2^hK!!)<LrW&>N!!%T8Ja3*squGX>!!*#`!W_NNrW)o^!!*#`!!*#`!!)u_!!%T8 +Ja/<]rr@Q~> +J`_OGSE9kQjoGDC!!)<HrW&>J!!%T4J`cgkquGX:!!*#\!W_BFrW)oZ!!*#\!!*#\!!)u[!!%T4 +J``$Urr@Q~> +JaS*WT^Dd[rpBpimd:)C!9ikM!3>Pf!.jQhmd0B>!8Hr@!<;He!<2Be!:Kab!U]semJm7dmJm6< +mXaedmf*9;~> +Ja.gOT]uLWrosXelKSB7!9i_I!3>Db!.jEdlKmg6!8Hf<!<;<a!<26a!:'I^!U9[al2Uh`l2Ug8 +l@J5\lMgj7~> +J`_OGT]Q4SroO@ak2l[+!9iSE!3>8^!.j9`k3V7.!8HZ8!<;0]!<2*]!9X1Z!TjC]jo>D\jo>C4 +k(2ZTk5PF3~> +JaS*WTC2[YrU'Xck3i3KJaS*WQgXbOg?nq@rpBdemed(amJm7dmJm7dmJm7dmJm6<mXaedmf*9;~> +Ja.gOTBcCUrTX@_k3DpGJa.gOQg4JKg?JY<rosLalMLY]l2Uh`l2Uh`l2Uh`l2Ug8l@J5\lMgj7~> +J`_OGTB?+QrT4([k2uXCJ`_OGQfe2Gg?&A8roO4]k555Yjo>D\jo>D\jo>D\jo>C4k(2ZTk5PF3~> +JaS*WJaWF'rW%N;VX=EaS*g7VhX::AfBrV=rpBgfmK!+O!!*#d!!*#d!s%cW!.jQhmZ$Z7!.Y~> +Ja.gOJa3-trW%N7VWn-]S*BtRhWk"=fBN>9rosObl2^\G!!*#`!!*#`!s%WO!.jEdlAb*/!.Y~> +J`_OGJ`cjlrW%N3VWIjYS)s\NhWF_9fB*&5roO7^joG8?!!*#\!!*#\!s%KG!.j9`k)JO'!.Y~> +JaS*WJaWC&rW'=n!!%T<qX+=`JaW4!qZ,17!!*#d!W_WgrpBadq<e:amK!7S!!%T<JaSNcrr@Q~> +Ja.gOJa3*srW'=j!!%T8qW\%\Ja2pnqZ,13!!*#`!W_KcrosI`q<A"]l2^hK!!%T8Ja/6[rr@Q~> +J`_OGJ`cgkrW'=f!!%T4qW7bXJ`cXfqZ,1/!!*#\!W_?_roO1\q;q_YjoGDC!!%T4J`_sSrr@Q~> +JaS*WJaW@%rrADR!!%T<N:-TDdI-u6rpKacp[/"]rU'XcJaS*WNUHfHJ,~> +Ja.gOJa3'rrrADN!!%T8N9^<@dH^]2rp'I_pZ__YrTX@_Ja.gONU$NDJ,~> +J`_OGJ`cdjrrADJ!!%T4N9:$<dH:E.roX1[pZ;GUrT4([J`_OGNTU6@J,~> +JaS*WJaW=$rrB_"!!%T<o^2\ZJaW@%qZ)38JaS*W_X@F(J,~> +Ja.gOJa3$qrrB^s!!%T8o]cDVJa3'rqZ)34Ja.gO_Wq.$J,~> +J`_OGJ`cairrB^o!!%T4o]?,RJ`cdjqZ)30J`_OG_WLjuJ,~> +JaS*WJaW:#rr@W<JaTK)quD<9JaS*W^[D+%J,~> +Ja.gOJa3!prr@W8Ja03!quD<5Ja.gO^Zth!J,~> +J`_OGJ`c^hrr@W4J``onquD<1J`_OG^ZPOrJ,~> +JaS*WJaW:#rW%N;\*a4rM=(?DnF$/RJaS*WJaU5>rr@Q~> +Ja.gOJa3!prW%N7\*<qnM<Y'@nETlNJa.gOJa0r6rr@Q~> +J`_OGJ`c^hrW%N3\)mYjM<4d<nE0TJJ`_OGJ`aZ.rr@Q~> +JaS*WJaW7"rW'q*!!%T<kjAENQL4_Qo'ZDUJaS*WJaU,;rr@Q~> +Ja.gOJa2sorW'q&!!%T8kir-JQKeGMo'6,QJa.gOJa0i3rr@Q~> +J`_OGJ`c[grW'q"!!%T4kiMjFQKA/Io&fiMJ`_OGJ`aQ+rr@Q~> +JaS*WJaW4!rW&;Q!!%T<Wp]lep[7nYJaS*WJaU&9rr@Q~> +Ja.gOJa2pnrW&;M!!%T8Wp9TapZhVUJa.gOJa0c1rr@Q~> +J`_OGJ`cXfrW&;I!!%T4Woj<]pZD>QJ`_OGJ`aK)rr@Q~> +JaS*WJaW0urW(73!!%T<o^2\ZK'rU<qX47]JaS*WJaTr6rr@Q~> +Ja.gOJa2mmrW(7/!!%T8o]cDVK'N=8qWdtYJa.gOJa0Z.rr@Q~> +J`_OGJ`cUerW(7+!!%T4o]?,RK'*%4qW@\UJ`_OGJ`aB&rr@Q~> +JaS*WJaW-trW%N;JaU>ArW)rcqZ)38JaS*WZgRhnJ,~> +Ja.gOJa2jlrW%N7Ja1&9rW)r_qZ)34Ja.gOZg.PjJ,~> +J`_OGJ`cRdrW%N3J`ac1rW)r[qZ)30J`_OGZf_8fJ,~> +JaS*WJaW*srW%N;JaU>Aq#H!6JaS*WYjVMkJ,~> +Ja.gOJa2gkrW%N7Ja1&9q#H!2Ja.gOYj25gJ,~> +J`_OGJ`cOcrW%N3J`ac1q#H!.J`_OGYibrcJ,~> +JaS*WJaW'rrW(R<!!%T<p$Me[JaW@%qZ)38JaS*WY3u;iJ,~> +Ja.gOJa2djrW(R8!!%T8p$)MWJa3'rqZ)34Ja.gOY3Q#eJ,~> +J`_OGJ`cLbrW(R4!!%T4p#Z5SJ`cdjqZ)30J`_OGY3,`aJ,~> +JaS*WJaW$qrW&>R!!%T<Y3u2fJaS*WJaTT,rr@Q~> +Ja.gOJa2airW&>N!!%T8Y3PobJa.gOJa0<$rr@Q~> +J`_OGJ`cIarW&>J!!%T4Y3,W^J`_OGJ`a#qrr@Q~> +JaS*WJaW!prr@W<ddI,8JaW=$qZ)38JaS*WWUBcdJ,~> +Ja.gOJa2^hrr@W8dd$i4Ja3$qqZ)34Ja.gOWTsK`J,~> +J`_OGJ`cF`rr@W4dcUQ0J`caiqZ)30J`_OGWTO3\J,~> +JaS*WJaVsorr@W<JaU\KquD<9JaS*WVXFHaJ,~> +Ja.gOJa2[grr@W8Ja1DCquD<5Ja.gOVX"0]J,~> +J`_OGJ`cC_rr@W4J`b,;quD<1J`_OGVWRmYJ,~> +JaS*WJaVpnrr@W<JaUhOqZ)38JaS*WV!e6_J,~> +Ja.gOJa2Xfrr@W8Ja1PGqZ)34Ja.gOV!@s[J,~> +J`_OGJ`c@^rr@W4J`b8?qZ)30J`_OGUuq[WJ,~> +JaS*WJaVpnrW)0M!!%T<p$Me[JaW=$quD<9JaS*WU$hp\J,~> +Ja.gOJa2XfrW)0I!!%T8p$)MWJa3$qquD<5Ja.gOU$DXXJ,~> +J`_OGJ`c@^rW)0E!!%T4p#Z5SJ`caiquD<1J`_OGU#u@TJ,~> +JaS*WJaVmmrW&;Q!!&AR!!'(fqZ)38JaS*WTC2^ZJ,~> +Ja.gOJa2UerW&;M!!&AN!!'(bqZ)34Ja.gOTBcFVJ,~> +J`_OGJ`c=]rW&;I!!&AJ!!'(^qZ)30J`_OGTB?.RJ,~> +JaS*WJaVjlrW&>R!!(=4!!%T<p?qhYJaS*WJaT&rrr@Q~> +Ja.gOJa2RdrW&>N!!(=0!!%T8p?MPUJa.gOJa/cjrr@Q~> +J`_OGJ`c:\rW&>J!!(=,!!%T4p?)8QJ`_OGJ``Kbrr@Q~> +JaS*WJaVgkrW%N;JaV=]qZ)38JaS*WRdU1UJ,~> +Ja.gOJa2OcrW%N7Ja2%UqZ)34Ja.gORd0nQJ,~> +J`_OGJ`c7[rW%N3J`bbMqZ)30J`_OGRcaVMJ,~> +JaS*WJaVdjrW)]\rr@W<JaVjlquD<9JaS*WQgXkRJ,~> +Ja.gOJa2LbrW)]Xrr@W8Ja2RdquD<5Ja.gOQg4SNJ,~> +J`_OGJ`c4ZrW)]Trr@W4J`c:\quD<1J`_OGQfe;JJ,~> +JaS*WJaVairW)i`qZ)38q<e4_JaW=$qZ)38JaS*WQ1"YPJ,~> +Ja.gOJa2IarW)i\qZ)34q<@q[Ja3$qqZ)34Ja.gOQ0SALJ,~> +J`_OGJ`c1YrW)iXqZ)30q;qYWJ`caiqZ)30J`_OGQ0/)HJ,~> +JaS*WJaV^hrW)udqZ)38[-dno]^G[tJaS*WJaS]hrr@Q~> +Ja.gOJa2F`rW)u`qZ)34[-@Vk]^#CpJa.gOJa/E`rr@Q~> +J`_OGJ`c.XrW)u\qZ)30[,q>g]]T+lJ`_OGJ``-Xrr@Q~> +JaS*WJaV[gq>d&R!!%T<eF*26JaS*WJaSWfrr@Q~> +Ja.gOJa2C_q>d&N!!%T8eEZo2Ja.gOJa/?^rr@Q~> +J`_OGJ`c+Wq>d&J!!%T4eE6W.J`_OGJ``'Vrr@Q~> +JaS*WJaVXfrW%N;JaVpnquD<9JaS*WNUHfHJ,~> +Ja.gOJa2@^rW%N7Ja2XfquD<5Ja.gONU$NDJ,~> +J`_OGJ`c(VrW%N3J`c@^quD<1J`_OGNTU6@J,~> +JaS*WJaVUerr@W<JaW$qqZ)38JaS*WMsgTFJ,~> +Ja.gOJa2=]rr@W8Ja2aiqZ)34Ja.gOMsC<BJ,~> +J`_OGJ`c%Urr@W4J`cIaqZ)30J`_OGMrt$>J,~> +JaS*WJaVRdrr@W<rpBadJaW:#quGjHrW)KV!!*#dquD<9JaS*W_!_4&J,~> +Ja.gOJa2:\rr@W8rosI`Ja3!pquGjDrW)KR!!*#`quD<5Ja.gO_!:q"J,~> +J`_OGJ`c"Trr@W4roO1\J`c^hquGj@rW)KN!!*#\quD<1J`_OG^ukXsJ,~> +JaS*WJaVRdrW%N;XR?)gcL1Q0jR*!JrpBadoBlY[mK!.P!!%T<JaS*W_!_4&J,~> +Ja.gOJa2:\rW%N7XQofccKb9,jQZ^FrosI`oBHAWl2^_H!!%T8Ja.gO_!:q"J,~> +J`_OGJ`c"TrW%N3XQKN_cK>!(jQ6FBroO1\oB$)SjoG;@!!%T4J`_OG^ukXsJ,~> +JaS*WJaVOcrW&>Rrr@W<jmN$HiU-[Go^2\ZrpBadrpBadrU'XcJaS*WJaU;@rr@Q~> +Ja.gOJa27[rW&>Nrr@W8jm)aDiT^CCo]cDVrosI`rosI`rTX@_Ja.gOJa1#8rr@Q~> +J`_OGJ`btSrW&>Jrr@W4jlZI@iT:+?o]?,RroO1\roO1\rT4([J`_OGJ`a`0rr@Q~> +JaS*WJaVLbrW%N;JaWO*qZ,OA!!)oarW)ob!!*#d!!*#d!!)uc!!%T<JaS*W^[D+%J,~> +Ja.gOJa24ZrW%N7Ja37"qZ,O=!!)o]rW)o^!!*#`!!*#`!!)u_!!%T8Ja.gO^Zth!J,~> +J`_OGJ`bqRrW%N3J`csoqZ,O9!!)oYrW)oZ!!*#\!!*#\!!)u[!!%T4J`_OG^ZPOrJ,~> +JaS*WJaVIarW%N;JaWF9h!Y+@s6]jerpBdemed%cmK!7S!!*#d!!%T<JaS*W^@)"$J,~> +Ja.gOJa21YrW%N7Ja3.5h!4h<s69RarosLalMLV_l2^hK!!*#`!!%T8Ja.gO^?Y^uJ,~> +J`_OGJ`bnQrW%N3J`ck1gueP8s5j:]roO4]k552[joGDC!!*#\!!%T4J`_OG^?5FqJ,~> +JaS*WJaVF`rW&&J!!%T<p[7nYg?nq@rpBdemed(amJm7dmJm7dmJm7dmJm6<mXaeWm_8,h!.Y~> +Ja.gOJa2.XrW&&F!!%T8pZhVUg?JY<rosLalMLY]l2Uh`l2Uh`l2Uh`l2Ug8l@J5OlFuQ`!.Y~> +J`_OGJ`bkPrW&&B!!%T4pZD>Qg?&A8roO4]k555Yjo>D\jo>D\jo>D\jo>C4k(2ZGk.^!X!.Y~> +JaS*WJaWF'qu?`bquH3RrW%N;XR6&ghX::AfBrV=rpBgfmK!+O!!*#d!!*#d!s%cW!.jQhmXaf> +mf*9;~> +Ja.gOJa3-tqu?`^quH3NrW%N7XQfcchWk"=fBN>9rosObl2^\G!!*#`!!*#`!s%WO!.jEdl@J66 +lMgj7~> +J`_OGJ`cjlqu?`ZquH3JrW%N3XQBK_hWF_9fB*&5roO7^joG8?!!*#\!!*#\!s%KG!.j9`k(2[. +k5PF3~> +JaS*WJaW:#!W_WglL+WOR-jqSJaW7"qZ,17!!*#d!W_WgrpBadq<e:amK!7S!!%T<JaS*W^$bn# +J,~> +Ja.gOJa3!p!W_KclK\?KR-FYOJa2soqZ,13!!*#`!W_KcrosI`q<A"]l2^hK!!%T8Ja.gO^$>Ut +J,~> +J`_OGJ`c^h!W_?_lK8'GR-"AKJ`c[gqZ,1/!!*#\!W_?_roO1\q;q_YjoGDC!!%T4J`_OG^#o=p +J,~> +JaS*WJaW=$!s%cW!9rqN!1E6T!.jS5med(4mf!4cmf!4\mJm7cmJm6<mXaeWm_/&g!.Y~> +Ja.gOJa3$q!s%WO!9reJ!1E*P!.jG1lMLY0lM^e_lM^eXl2Uh_l2Ug8l@J5OlFlK_!.Y~> +J`_OGJ`cai!s%KG!9rYF!1DsL!.j;-k555,k5GA[k5GATjo>D[jo>C4k(2ZGk.TpW!.Y~> +JaS*WJaW@%!!*#d!s%`h!:0(Q!.jR$me[!8mXaeWmXafsmf*9;~> +Ja.gOJa3'r!!*#`!s%Td!:/qM!.jEulMCR4l@J5Ol@J6klMgj7~> +J`_OGJ`cdj!!*#\!s%H`!:/eI!.j9qk5,.0k(2ZGk(2[ck5PF3~> +JaS*WJaWC&rW)udrrE)e!!)?QrrAb\!!%T<p?qhYJaS*WJaS*Wn*^2UJ,~> +Ja.gOJa3*srW)u`rrE)a!!)?MrrAbX!!%T8p?MPUJa.gOJa.gOn*9oQJ,~> +J`_OGJ`cgkrW)u\rrE)]!!)?IrrAbT!!%T4p?)8QJ`_OGJ`_OGn)jWMJ,~> +JaS*WJaW:#!!)rb!!)<Prr@W<X6orfnF$2SJaS*WJaS*Wm-alRJ,~> +Ja.gOJa3!p!!)r^!!)<Lrr@W8X6KZbnEToOJa.gOJa.gOm-=TNJ,~> +J`_OGJ`c^h!!)rZ!!)<Hrr@W4X6'B^nE0WKJ`_OGJ`_OGm,n<JJ,~> +JaS*WJaW:#!!)rb!!)<PrW&;Q!!&ARrW)TYquD<9JaS*WJaVgkrr@Q~> +Ja.gOJa3!p!!)r^!!)<LrW&;M!!&ANrW)TUquD<5Ja.gOJa2Ocrr@Q~> +J`_OGJ`c^h!!)rZ!!)<HrW&;I!!&AJrW)TQquD<1J`_OGJ`c7[rr@Q~> +JaS*WJaWF'!!*#d!W_WgrpBadl0eNNX7#ufK^Sg>q!S%[JaS*WJaS*WkO/?MJ,~> +Ja.gOJa3-t!!*#`!W_KcrosI`l0A6JX6T]bK^/O:q!.bWJa.gOJa.gOkN`'IJ,~> +J`_OGJ`cjl!!*#\!W_?_roO1\l/qsFX60E^K]`76pu_JSJ`_OGJ`_OGkN;dEJ,~> +JaS*WJaWC&rW)rcrW)-LrW%N;XR?)gqX47]JaS*WJaS*WjmN-KJ,~> +Ja.gOJa3*srW)r_rW)-HrW%N7XQofcqWdtYJa.gOJa.gOjm)jGJ,~> +J`_OGJ`cgkrW)r[rW)-DrW%N3XQKN_qW@\UJ`_OGJ`_OGjlZRCJ,~> +JaS*WJaV+WrW%N;XR?)grpK[aJaS*WJaS*WipQgHJ,~> +Ja.gOJa1hOrW%N7XQofcrp'C]Ja.gOJa.gOip-ODJ,~> +J`_OGJ`bPGrW%N3XQKN_roX+YJ`_OGJ`_OGio^7@J,~> +JaS*WJaV(VrW'=n!!%T<qsO7[JaS*WJaS*Wi9pUFJ,~> +Ja.gOJa1eNrW'=j!!%T8qs*tWJa.gOJa.gOi9L=BJ,~> +J`_OGJ`bMFrW'=f!!%T4qr[\SJ`_OGJ`_OGi9(%>J,~> +JaS*WJaV%UrW%N;Y3u2fJaS*WJaS*Wh<t:CJ,~> +Ja.gOJa1bMrW%N7Y3PobJa.gOJa.gOh<P"?J,~> +J`_OGJ`bJErW%N3Y3,W^J`_OGJ`_OGh<+_;J,~> +JaS*WJaV"TrW'Y"!!%T<p[7nYJaS*WJaS*Wg[>(AJ,~> +Ja.gOJa1_LrW'Xs!!%T8pZhVUJa.gOJa.gOgZne=J,~> +J`_OGJ`bGDrW'Xo!!%T4pZD>QJ`_OGJ`_OGgZJM9J,~> +JaS*WJaUtSrr@W<[-mhlJaS*WJaS*Wf^Ab>J,~> +Ja.gOJa1\Krr@W8[-IPhJa.gOJa.gOf]rJ:J,~> +J`_OGJ`bDCrr@W4[-%8dJ`_OGJ`_OGf]N26J,~> +JaS*WJaUqRrr@W<\F04oJaS*WJaS*Wf'`P<J,~> +Ja.gOJa1YJrr@W8\E`qkJa.gOJa.gOf'<88J,~> +J`_OGJ`bABrr@W4\E<YgJ`_OGJ`_OGf&lu4J,~> +JaS*WJaUnQrrC%+!!%T<q!S%[JaS*WJaS*We*d59J,~> +Ja.gOJa1VIrrC%'!!%T8q!.bWJa.gOJa.gOe*?r5J,~> +J`_OGJ`b>ArrC%#!!%T4pu_JSJ`_OGJ`_OGe)pZ1J,~> +JaS*WJaUkPrr@W<^[Ct!JaS*WJaS*WdI.#7J,~> +Ja.gOJa1SHrr@W8^Zt[rJa.gOJa.gOdH^`3J,~> +J`_OGJ`b;@rr@W4^ZPCnJ`_OGJ`_OGdH:H/J,~> +JaS*WJaUkPrW(73!!(72!!'+gquD<9JaS*WJaUhOrr@Q~> +Ja.gOJa1SHrW(7/!!(7.!!'+cquD<5Ja.gOJa1PGrr@Q~> +J`_OGJ`b;@rW(7+!!(7*!!'+_quD<1J`_OGJ`b8?rr@Q~> +JaS*WJaUhOrW%N;`pW^(JaS*WJaS*WbjPK2J,~> +Ja.gOJa1PGrW%N7`p3F$Ja.gOJa.gObj,3.J,~> +J`_OGJ`b8?rW%N3`od-uJ`_OGJ`_OGbi\p*J,~> +JaS*WJaUeNrW%N;amT',JaS*WJaS*WamT0/J,~> +Ja.gOJa1MFrW%N7am/d(Ja.gOJa.gOam/m+J,~> +J`_OGJ`b5>rW%N3al`L$J`_OGJ`_OGal`U'J,~> +JaS*WJaUbMrW(R<!!%T<q!S"ZJaS*WJaS*Wa6rs-J,~> +Ja.gOJa1JErW(R8!!%T8q!._VJa.gOJa.gOa6N[)J,~> +J`_OGJ`b2=rW(R4!!%T4pu_GRJ`_OGJ`_OGa6*C%J,~> +JaS*WJaU_LrW%N;d-gf3JaS*WJaS*W`:!X*J,~> +Ja.gOJa1GDrW%N7d-CN/Ja.gOJa.gO`9R@&J,~> +J`_OGJ`b/<rW%N3d,t6+J`_OGJ`_OG`9.("J,~> +JaS*WJaU\KrW&>R!!'b$qZ)38JaS*WJaUDCrr@Q~> +Ja.gOJa1DCrW&>N!!'auqZ)34Ja.gOJa1,;rr@Q~> +J`_OGJ`b,;rW&>J!!'aqqZ)30J`_OGJ`ai3rr@Q~> +JaS*WJaUYJrW%N;fC&P:JaS*WJaS*W^[D+%J,~> +Ja.gOJa1ABrW%N7fBW86Ja.gOJa.gO^Zth!J,~> +J`_OGJ`b):rW%N3fB2u2J`_OGJ`_OG^ZPOrJ,~> +JaS*WJaUVIrr@W<g@"h<JaS*WJaS*W^$bn#J,~> +Ja.gOJa1>Arr@W8g?SP8Ja.gOJa.gO^$>UtJ,~> +J`_OGJ`b&9rr@W4g?/84J`_OGJ`_OG^#o=pJ,~> +JaS*WJaUSHrrD9N!!%T<p[7qZJaS*WJaS*W]'fRuJ,~> +Ja.gOJa1;@rrD9J!!%T8pZhYVJa.gOJa.gO]'B:qJ,~> +J`_OGJ`b#8rrD9F!!%T4pZDARJ`_OGJ`_OG]&s"mJ,~> +JaS*WJaUPGrr@W<iU6RCipHdHna6AWrpK[aJaS*WJaS*Wna?DWJ,~> +Ja.gOJa18?rr@W8iTg:?ip$LDn`g)Srp'C]Ja.gOJa.gOn`p,SJ,~> +J`_OGJ`au7rr@W4iTC";ioU4@n`BfOroX+YJ`_OGJ`_OGn`KiOJ,~> +JaS*WJaUPGrW&>RrrCC5quGXB!!)TX!W_WgqsFFaJaS*WJaS*Wna?DWJ,~> +Ja.gOJa18?rW&>NrrCC1quGX>!!)TT!W_Kcqs".]Ja.gOJa.gOn`p,SJ,~> +J`_OGJ`au7rW&>JrrCC-quGX:!!)TP!W_?_qrRkYJ`_OGJ`_OGn`KiOJ,~> +JaS*WJaUMFrW%N;kjJ<JhX:CDp[/"]rpBadrpBadrU'XcJaS*WJaS*WnF$;VJ,~> +Ja.gOJa15>rW%N7kj&$FhWk+@pZ__YrosI`rosI`rTX@_Ja.gOJa.gOnEU#RJ,~> +J`_OGJ`ar6rW%N3kiVaBhWFh<pZ;GUroO1\roO1\rT4([J`_OGJ`_OGnE0`NJ,~> +JaS*WJaUJErW)]\rr@W<p[7qZh!P4DmK!7SrW)ob!!*#d!!*#d!!)uc!!%T<JaS*WJaW$qrr@Q~> +Ja.gOJa12=rW)]Xrr@W8pZhYVh!+q@l2^hKrW)o^!!*#`!!*#`!!)u_!!%T8Ja.gOJa2airr@Q~> +J`_OGJ`ao5rW)]Trr@W4pZDARgu\Y<joGDCrW)oZ!!*#\!!*#\!!)u[!!%T4J`_OGJ`cIarr@Q~> +JaS*WJaUGDrW)i`qZ)38qsO=]g?o+EmJu\C!<2Be!:Kab!U]semJm7dmJm6<mXaeWmXafpmf*9;~> +Ja.gOJa1/<rW)i\qZ)34qs+%Yg?JhAl2^,7!<26a!:'I^!U9[al2Uh`l2Ug8l@J5Ol@J6hlMgj7~> +J`_OGJ`al4rW)iXqZ)30qr[bUg?&P=joFQ+!<2*]!9X1Z!TjC]jo>D\jo>C4k(2ZGk(2[`k5PF3~> +JaS*WJaUDCrW)udqZ)38qX47]f^8nCmd:)Cmed(amJm7dmJm7dmJm7dmJm6<mXaeWmXafpmf*9;~> +Ja.gOJa1,;rW)u`qZ)34qWdtYf]iV?lKSB7lMLY]l2Uh`l2Uh`l2Uh`l2Ug8l@J5Ol@J6hlMgj7~> +J`_OGJ`ai3rW)u\qZ)30qW@\Uf]E>;k2l[+k555Yjo>D\jo>D\jo>D\jo>C4k(2ZGk(2[`k5PF3~> +JaS*WJaUABq>d&R!!(sFqZ,48qu?cc!;c*`!<2Bd!<2Bg!:K7TJaS*WJaS*WmdC)TJ,~> +Ja.gOJa1):q>d&N!!(sBqZ,44qu?c_!;bs\!<26`!<26c!:&hLJa.gOJa.gOmcsfPJ,~> +J`_OGJ`af2q>d&J!!(s>qZ,40qu?c[!;bgX!<2*\!<2*_!9WDDJ`_OGJ`_OGmcONLJ,~> +JaS*WJaU>ArW%N;q<n.\d-^u9md:)SmJm7_mK*CV!<2Bd!.jQhmXaeWmdBNC!.Y~> +Ja.gOJa1&9rW%N7q<IkXd-:]5lKSBKl2Uh[l2gtN!<26`!.jEdl@J5OlL*s;!.Y~> +J`_OGJ`ac1rW%N3q<%STd,kE1k2l[Cjo>DWjoPPF!<2*\!.j9`k(2ZGk3hC3!.Y~> +JaS*WJaU;@rW%N;rU0O_cL(Z4rpKacp[/"]rU'XcJaS*WJaS*WmdC)TJ,~> +Ja.gOJa1#8rW%N7rTa7[cKYB0rp'I_pZ__YrTX@_Ja.gOJa.gOmcsfPJ,~> +J`_OGJ`a`0rW%N3rT<tWcK5*,roX1[pZ;GUrT4([J`_OGJ`_OGmcONLJ,~> +JaS*WJaU8?rr@W<s6fdbJaS*WJaS*WU$hp\J,~> +Ja.gOJa0u7rr@W8s6BL^Ja.gOJa.gOU$DXXJ,~> +J`_OGJ`a]/rr@W4s5s4ZJ`_OGJ`_OGU#u@TJ,~> +JaS*WJaU5>rr@]>qZ)38JaS*WJaT/urr@Q~> +Ja.gOJa0r6rr@]:qZ)34Ja.gOJa/lmrr@Q~> +J`_OGJ`aZ.rr@]6qZ)30J`_OGJ``Terr@Q~> +JaS*WJaU2=rrADR!!)QWquD<9JaS*WJaT&rrr@Q~> +Ja.gOJa0o5rrADN!!)QSquD<5Ja.gOJa/cjrr@Q~> +J`_OGJ`aW-rrADJ!!)QOquD<1J`_OGJ``Kbrr@Q~> +JaS*WJaU2=rW&>RrW)Z[qZ)38JaS*WJaSuprr@Q~> +Ja.gOJa0o5rW&>NrW)ZWqZ)34Ja.gOJa/]hrr@Q~> +J`_OGJ`aW-rW&>JrW)ZSqZ)30J`_OGJ``E`rr@Q~> +JaS*WJaU/<rW&>RrW)c^quD<9JaS*WJaSlmrr@Q~> +Ja.gOJa0l4rW&>NrW)cZquD<5Ja.gOJa/Terr@Q~> +J`_OGJ`aT,rW&>JrW)cVquD<1J`_OGJ``<]rr@Q~> +JaS*WJaU,;rW&>RrrDubqZ)38JaS*WJaSfkrr@Q~> +Ja.gOJa0i3rW&>NrrDu^qZ)34Ja.gOJa/Ncrr@Q~> +J`_OGJ`aQ+rW&>JrrDuZqZ)30J`_OGJ``6[rr@Q~> +JaS*WJaV"T!!)uc!!)ESrW&>RrrE)equD<9JaS*WJaS]hrr@Q~> +Ja.gOJa1_L!!)u_!!)EOrW&>NrrE)aquD<5Ja.gOJa/E`rr@Q~> +J`_OGJ`bGD!!)u[!!)EKrW&>JrrE)]quD<1J`_OGJ``-Xrr@Q~> +JaS*WJaV"T!!*#d!W_WgmI'rRRI9nOJaS*WJaS*WORE,KJ,~> +Ja.gOJa1_L!!*#`!W_KcmHXZNRHjVKJa.gOJa.gOOQuiGJ,~> +J`_OGJ`bGD!!*#\!W_?_mH4BJRHF>GJ`_OGJ`_OGOQQQCJ,~> +JaS*WJaV%UrrE)e!!*#d!!)ESrW&GUquD<9JaS*WJaSNcrr@Q~> +Ja.gOJa1bMrrE)a!!*#`!!)EOrW&GQquD<5Ja.gOJa/6[rr@Q~> +J`_OGJ`bJErrE)]!!*#\!!)EKrW&GMquD<1J`_OGJ`_sSrr@Q~> +JaS*WJaV(V"T[rjmd:)SmJm7Rmf!3Yme[!8mXaeWmXaeamf*9;~> +Ja.gOJa1eN"T[fflKSBKl2UhNlM^dUlMCR4l@J5Ol@J5YlMgj7~> +J`_OGJ`bMF"T[Zbk2l[Cjo>DJk5G@Qk5,.0k(2ZGk(2ZQk5PF3~> +JaS*WJaV(V"T[rjmd:)SmJm7Qmf!3\med'9mXaeWmXae^mf*9;~> +Ja.gOJa1eN"T[fflKSBKl2UhMlM^dXlMLX5l@J5Ol@J5VlMgj7~> +J`_OGJ`bMF"T[Zbk2l[Cjo>DIk5G@Tk5541k(2ZGk(2ZNk5PF3~> +JaS*WJaV+W"p")Z!:K7TrpBadlL+ZPV=+3\JaS*WJaS*WL@5'AJ,~> +Ja.gOJa1hO"p!rR!:&hLrosI`lK\BLV<[pXJa.gOJa.gOL?ed=J,~> +J`_OGJ`bPG"p!fJ!9WDDroO1\lK8*HV<7XTJ`_OGJ`_OGL?AL9J,~> +JaS*WJaV+Wqu?cc!<2Bd!9rqO!3#>`!.jQhmXaeWmXss-!.Y~> +Ja.gOJa1hOqu?c_!<26`!9reK!3#2\!.jEdl@J5Ol@\C%!.Y~> +J`_OGJ`bPGqu?c[!<2*\!9rYG!3#&X!.j9`k(2ZGk(Dgr!.Y~> +JaS*WJaV"T!!*#d!W_WgkO/?MXR>udJaS*WJaS*WJaNU-!!%N~> +Ja.gOJa1_L!!*#`!W_KckN`'IXQo]`Ja.gOJa.gOJa*=%!!%N~> +J`_OGJ`bGD!!*#\!W_?_kN;dEXQKE\J`_OGJ`_OGJ`[$r!!%N~> +JaS*WJaV"T!!)uc!!)0LrW'.iquD<9JaS*WJaS*WrpKddJ,~> +Ja.gOJa1_L!!)u_!!)0HrW'.equD<5Ja.gOJa.gOrp'L`J,~> +J`_OGJ`bGD!!)u[!!)0DrW'.aquD<1J`_OGJ`_OGroX4\J,~> +JaS*WJaTf2rW':mquD<9JaS*WJaS*WqsOIaJ,~> +Ja.gOJa0N*rW':iquD<5Ja.gOJa.gOqs+1]J,~> +J`_OGJ`a6"rW':equD<1J`_OGJ`_OGqr[nYJ,~> +JaS*WJaTc1rW'CpquD<9JaW@%r;cibrrDWX!!)`\!!*#d!!)ZZ!!%T<JaU&9rr@Q~> +Ja.gOJa0K)rW'ClquD<5Ja3'rr;ci^rrDWT!!)`X!!*#`!!)ZV!!%T8Ja0c1rr@Q~> +J`_OGJ`a3!rW'ChquD<1J`cdjr;ciZrrDWP!!)`T!!*#\!!)ZR!!%T4J`aK)rr@Q~> +JaS*WJaT`0rW'OtquD<9JaW4!!s%cW!<2Bd!:oOX!;>j\!<;He!;,[Z!.jQhm^V]b!.Y~> +Ja.gOJa0H(rW'OpquD<5Ja2pn!s%WO!<26`!:oCT!;>^X!<;<a!;,OV!.jEdlF?-Z!.Y~> +J`_OGJ`a/urW'OlquD<1J`cXf!s%KG!<2*\!:o7P!;>RT!<;0]!;,CR!.j9`k.'RR!.Y~> +JaS*WJaT]/rW'Y"quD<9JaW-t!s%cW!<2Bd!:oOX!;>j\!<;He!;,[Z!.jQhm^V]b!.Y~> +Ja.gOJa0E'rW'XsquD<5Ja2jl!s%WO!<26`!:oCT!;>^X!<;<a!;,OV!.jEdlF?-Z!.Y~> +J`_OGJ`a,trW'XoquD<1J`cRd!s%KG!<2*\!:o7P!;>RT!<;0]!;,CR!.j9`k.'RR!.Y~> +JaS*WJaTZ.rW'e&quD<9JaW$q!s%cW!<2Bd!<)?b!<2Ec!<;Hh!:K7Tq<eFemJuYTmK!7S#6=/l +!:BjTmem.bmf!4dmK3IW!!%T<JaUSHrr@Q~> +Ja.gOJa0B&rW'e"quD<5Ja2ai!s%WO!<26`!<)3^!<29_!<;<d!:&hLq<A.al2^)Ll2^hK#6=#h +!9sRLlMU_^lM^e`l2q%O!!%T8Ja1;@rr@Q~> +J`_OGJ`a)srW'dsquD<1J`cIa!s%KG!<2*\!<)'Z!<2-[!<;0`!9WDDq;qk]joFNDjoGDC#6<ld +!9O:Dk5>;Zk5GA\joYVG!!%T4J`b#8rr@Q~> +JaS*WJaTW-rW'n)quD<9JaVsorW)ob!!*#d!!*#d!W_WgrpBmhmJuYTq!J=dmJuYTmK!7S#QX8m +mJuYTmK!7S!W_WgrpBsjmJm7TmJqh+JaUVIrr@Q~> +Ja.gOJa0?%rW'n%quD<5Ja2[grW)o^!!*#`!!*#`!W_KcrosUdl2^)Lq!&%`l2^)Ll2^hK#QX,i +l2^)Ll2^hK!W_Kcros[fl2UhLl2ZD#Ja1>Arr@Q~> +J`_OGJ`a&rrW'n!quD<1J`cC_rW)oZ!!*#\!!*#\!W_?_roO=`joFNDpuVb\joFNDjoGDC#QWue +joFNDjoGDC!W_?_roOCbjo>DDjoBtpJ`b&9rr@Q~> +JaS*WJaTT,rW(%-quD<9JaVjl!s%cW!<2Bd!<2Bd!<2Bf!:Bjbmf*:]mKN[ZmJm7T!<2Bl!:BjT +!:BjT!<2Be!:Kab!U]r=mXafEmf*9;~> +Ja.gOJa0<$rW(%)quD<5Ja2Rd!s%WO!<26`!<26`!<26b!9sR^lMgkYl377Rl2UhL!<26h!9sRL +!9sRL!<26a!:'I^!U9Z9l@J6=lMgj7~> +J`_OGJ`a#qrW(%%quD<1J`c:\!s%KG!<2*\!<2*\!<2*^!9O:Zk5PGUjothJjo>DD!<2*d!9O:D +!9O:D!<2*]!9X1Z!TjB5k(2[5k5PF3~> +JaS*WJaTQ+rrC71qZ,aGrW)KV!!*#dquD<9U$`!_md:)SmJm7dmJm7dmK*CV!;u6d!:Bj^mKN[Z +mJm7T!<2Bl!:BjT!:BjT!<2Bf!:BjbmJm6<mXafEmf*9;~> +Ja.gOJa09#rrC7-qZ,aCrW)KR!!*#`quD<5U$;^[lKSBKl2Uh`l2Uh`l2gtN!;u*`!9sRZl377R +l2UhL!<26h!9sRL!9sRL!<26b!9sR^l2Ug8l@J6=lMgj7~> +J`_OGJ``uprrC7)qZ,a?rW)KN!!*#\quD<1U#lFWk2l[Cjo>D\jo>D\joPPF!;ts\!9O:VjothJ +jo>DD!<2*d!9O:D!9O:D!<2*^!9O:Zjo>C4k(2[5k5PF3~> +JaS*WJaTN*rrC@4quGdF!!*#d!!)WY!W_WgqsFFaJaT6"!s%cW!<2Bd!<2Bd!<2Bf!:BjdmKEUY +!:K7Tq<e4_rpC6rmJu\C!!)EemJuYTmK!7S!W_WgrpBgfmJqh+JaUJErr@Q~> +Ja.gOJa06"rrC@0quGdB!!*#`!!)WU!W_Kcqs".]Ja/ro!s%WO!<26`!<26`!<26b!9sR`l3.1Q +!:&hLq<@q[rossnl2^,7!!)9al2^)Ll2^hK!W_KcrosObl2ZD#Ja12=rr@Q~> +J`_OGJ``rorrC@,quGd>!!*#\!!)WQ!W_?_qrRkYJ``Zg!s%KG!<2*\!<2*\!<2*^!9O:\jokbI +!9WDDq;qYWroO[jjoFQ+!!)-]joFNDjoGDC!W_?_roO7^joBtpJ`ao5rr@Q~> +JaS*WJaTK)rrCL8qZ,UC!!*#d!!)f^!!*#d!!*#d!!)uc!!%T<U$hjZrpKacrpKacrpKacs6]je +rpBadqX+=`rpC$lmd:&TmJuYTrpBdemem.bmf!4dmJm6<mXafEmf*9;~> +Ja.gOJa03!rrCL4qZ,U?!!*#`!!)fZ!!*#`!!*#`!!)u_!!%T8U$DRVrp'I_rp'I_rp'I_s69Ra +rosI`qW\%\rosahlKS?Ll2^)LrosLalMU_^lM^e`l2Ug8l@J6=lMgj7~> +J`_OGJ``onrrCL0qZ,U;!!*#\!!)fV!!*#\!!*#\!!)u[!!%T4U#u:RroX1[roX1[roX1[s5j:] +roO1\qW7bXroOIdk2lXDjoFNDroO4]k5>;Zk5GA\jo>C4k(2[5k5PF3~> +JaS*WJaTK)rW(L:quGI=!W_ZVrW)ob!!*#d!!*#d!!)uc!!%T<JaS*WJaT6"rr@Q~> +Ja.gOJa03!rW(L6quGI9!W_NNrW)o^!!*#`!!*#`!!)u_!!%T8Ja.gOJa/rorr@Q~> +J`_OGJ``onrW(L2quGI5!W_BFrW)oZ!!*#\!!*#\!!)u[!!%T4J`_OGJ``Zgrr@Q~> +JaS*WJaTH(rW(X>qZ,=;!s%cW!<2Be!:Kab!U]semJm7dmJm6<mXaeWmXaf!mf*9;~> +Ja.gOJa0/urW(X:qZ,=7!s%WO!<26a!:'I^!U9[al2Uh`l2Ug8l@J5Ol@J5nlMgj7~> +J`_OGJ``lmrW(X6qZ,=3!s%KG!<2*]!9X1Z!TjC]jo>D\jo>C4k(2ZGk(2Zfk5PF3~> +JaS*WJaTE'rW(aAquG@:!!*#dquH`a!!*#d!!*#d!!*#d!!%T<JaS*WJaT3!rr@Q~> +Ja.gOJa0,trW(a=quG@6!!*#`quH`]!!*#`!!*#`!!*#`!!%T8Ja.gOJa/onrr@Q~> +J`_OGJ``ilrW(a9quG@2!!*#\quH`Y!!*#\!!*#\!!*#\!!%T4J`_OGJ``Wfrr@Q~> +JaS*WJaTB&rW(mEqZ,48!!)uc!!)l`!!*#d!!*#d!s%cW!.jQhmXaeWm[rqI!.Y~> +Ja.gOJa0)srW(mAqZ,44!!)u_!!)l\!!*#`!!*#`!s%WO!.jEdl@J5OlC[AA!.Y~> +J`_OGJ``fkrW(m=qZ,40!!)u[!!)lX!!*#\!!*#\!s%KG!.j9`k(2ZGk+Cf9!.Y~> +JaS*WJaT?%rW)!HquG77!!)rb!!*#d!!)i_!W_WgrpBadJaS*WJaS*WTC2^ZJ,~> +Ja.gOJa0&rrW)!DquG73!!)r^!!*#`!!)i[!W_KcrosI`Ja.gOJa.gOTBcFVJ,~> +J`_OGJ``cjrW)!@quG7/!!)rZ!!*#\!!)iW!W_?_roO1\J`_OGJ`_OGTB?.RJ,~> +JaS*WJaT<$rW)-LqZ,(4quHcbrW)]\!!)uc!!%T<JaS*WJaT/urr@Q~> +Ja.gOJa0#qrW)-HqZ,(0quHc^rW)]X!!)u_!!%T8Ja.gOJa/lmrr@Q~> +J`_OGJ```irW)-DqZ,(,quHcZrW)]T!!)u[!!%T4J`_OGJ``Terr@Q~> +JaS*WJaT9#rW)6OquD<9JaS*WJaS*We*d59J,~> +Ja.gOJa/uprW)6KquD<5Ja.gOJa.gOe*?r5J,~> +J`_OGJ``]hrW)6GquD<1J`_OGJ`_OGe)pZ1J,~> +JaS*WJaT6"rrDHSqZ)38JaS*WJaS*WdI.#7J,~> +Ja.gOJa/rorrDHOqZ)34Ja.gOJa.gOdH^`3J,~> +J`_OGJ``ZgrrDHKqZ)30J`_OGJ`_OGdH:H/J,~> +JaS*WJaT3!rrDQVquD<9JaS*WJaS*WcL1]4J,~> +Ja.gOJa/onrrDQRquD<5Ja.gOJa.gOcKbE0J,~> +J`_OGJ``WfrrDQNquD<1J`_OGJ`_OGcK>-,J,~> +JaS*WJaT/urrD]ZqZ)38JaS*WJaS*WbjPK2J,~> +Ja.gOJa/lmrrD]VqZ)34Ja.gOJa.gObj,3.J,~> +J`_OGJ``TerrD]RqZ)30J`_OGJ`_OGbi\p*J,~> +JaS*WJaT/urW)]\quD<9JaS*WJaS*WamT0/J,~> +Ja.gOJa/lmrW)]XquD<5Ja.gOJa.gOam/m+J,~> +J`_OGJ``TerW)]TquD<1J`_OGJ`_OGal`U'J,~> +JaS*WJaT/ur;c`_qZ)38JaS*WJaS*Wa6rs-J,~> +Ja.gOJa/lmr;c`[qZ)34Ja.gOJa.gOa6N[)J,~> +J`_OGJ``Ter;c`WqZ)30J`_OGJ`_OGa6*C%J,~> +JaS*WJaT,tr;cibquD<9JaS*WJaS*W`:!X*J,~> +Ja.gOJa/ilr;ci^quD<5Ja.gOJa.gO`9R@&J,~> +J`_OGJ``Qdr;ciZquD<1J`_OGJ`_OG`9.("J,~> +JaS*WJaT&rq#H!6JaS*WJaS*W_X@F(J,~> +Ja.gOJa/cjq#H!2Ja.gOJa.gO_Wq.$J,~> +J`_OGJ``Kbq#H!.J`_OGJ`_OG_WLjuJ,~> +JaS*WJaT#qr;_E:JaS*WJaS*W^[D+%J,~> +Ja.gOJa/`ir;_E6Ja.gOJa.gO^Zth!J,~> +J`_OGJ``Har;_E2J`_OGJ`_OG^ZPOrJ,~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaT]/!W_ZVquD<9JaS*WJaS*WYjVMkJ,~> +Ja.gOJa0E'!W_NNquD<5Ja.gOJa.gOYj25gJ,~> +J`_OGJ`a,t!W_BFquD<1J`_OGJ`_OGYibrcJ,~> +JaS*WJaT]/!s%cW!.jQhmXaeWmXaf-mf*9;~> +Ja.gOJa0E'!s%WO!.jEdl@J5Ol@J6%lMgj7~> +J`_OGJ`a,t!s%KG!.j9`k(2ZGk(2Zrk5PF3~> +JaS*WJaT`0rrE)e!!%T<JaS*WJaS*WXR?)gJ,~> +Ja.gOJa0H(rrE)a!!%T8Ja.gOJa.gOXQofcJ,~> +J`_OGJ`a/urrE)]!!%T4J`_OGJ`_OGXQKN_J,~> +JaS*WJaTc1#QX8mmd:)C!!%T<JaS*WJaS*WYO;DjJ,~> +Ja.gOJa0K)#QX,ilKSB7!!%T8Ja.gOJa.gOYNl,fJ,~> +J`_OGJ`a3!#QWuek2l[+!!%T4J`_OGJ`_OGYNGibJ,~> +JaS*WJaTc1#lsAnmd:&Tmd:(+mXaeWmXaeWm]c-Z!.Y~> +Ja.gOJa0K)#ls5jlKS?LlKSA#l@J5Ol@J5OlEKRR!.Y~> +J`_OGJ`a3!#ls)fk2lXDk2lYpk(2ZGk(2ZGk-4"J!.Y~> +JaS*WJaTf2!s%cW!;l0a!.jQhmXaeWmXaf1mf*9;~> +Ja.gOJa0N*!s%WO!;l$]!.jEdl@J5Ol@J6)lMgj7~> +J`_OGJ`a6"!s%KG!;kmY!.j9`k(2ZGk(2[!k5PF3~> +JaS*WJaTf2quHZ_!!%T<JaS*WJaS*WYjVMkJ,~> +Ja.gOJa0N*quHZ[!!%T8Ja.gOJa.gOYj25gJ,~> +J`_OGJ`a6"quHZW!!%T4J`_OGJ`_OGYibrcJ,~> +JaS*WJaT]/!s%cW!<2Bd!:K7T!.jQhmXaeWmXafEmf*9;~> +Ja.gOJa0E'!s%WO!<26`!:K+P!.jEdl@J5Ol@J6=lMgj7~> +J`_OGJ`a,t!s%KG!<2*\!:JtL!.j9`k(2ZGk(2[5k5PF3~> +JaS*WJaT]/!!*#drW)BS!W_WgJaS*WJaS*WJaUMFrr@Q~> +Ja.gOJa0E'!!*#`rW)BO!W_KcJa.gOJa.gOJa15>rr@Q~> +J`_OGJ`a,t!!*#\rW)BK!W_?_J`_OGJ`_OGJ`ar6rr@Q~> +JaS*WJaSfk!!*#d!!%T<JaS*WJaS*W`pWj,J,~> +Ja.gOJa/Nc!!*#`!!%T8Ja.gOJa.gO`p3R(J,~> +J`_OGJ``6[!!*#\!!%T4J`_OGJ`_OG`od:$J,~> +JaS*WJaSfk!!*#d!!%T<JaS*WJaS*W`pWj,J,~> +Ja.gOJa/Nc!!*#`!!%T8Ja.gOJa.gO`p3R(J,~> +J`_OGJ``6[!!*#\!!%T4J`_OGJ`_OG`od:$J,~> +JaS*WJaSfk!!*#d!!%T<JaS*WJaS*W`pWj,J,~> +Ja.gOJa/Nc!!*#`!!%T8Ja.gOJa.gO`p3R(J,~> +J`_OGJ``6[!!*#\!!%T4J`_OGJ`_OG`od:$J,~> +JaS*WJaSfk!!*#d!!%T<JaS*WJaS*W`pWj,J,~> +Ja.gOJa/Nc!!*#`!!%T8Ja.gOJa.gO`p3R(J,~> +J`_OGJ``6[!!*#\!!%T4J`_OGJ`_OG`od:$J,~> +JaS*WJaSfk!!*#d!!%T<JaS*WJaS*W`pWj,J,~> +Ja.gOJa/Nc!!*#`!!%T8Ja.gOJa.gO`p3R(J,~> +J`_OGJ``6[!!*#\!!%T4J`_OGJ`_OG`od:$J,~> +JaS*WJaScj!W_WgJaS*WJaS*WJaUMFrr@Q~> +Ja.gOJa/Kb!W_KcJa.gOJa.gOJa15>rr@Q~> +J`_OGJ``3Z!W_?_J`_OGJ`_OGJ`ar6rr@Q~> +JaS*WJaS`i!!%T<JaS*WJaS*W`:!X*J,~> +Ja.gOJa/Ha!!%T8Ja.gOJa.gO`9R@&J,~> +J`_OGJ``0Y!!%T4J`_OGJ`_OG`9.("J,~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +JaS*WJaS*WJaS*WJaS*WJaV(Vrr@Q~> +Ja.gOJa.gOJa.gOJa.gOJa1eNrr@Q~> +J`_OGJ`_OGJ`_OGJ`_OGJ`bMFrr@Q~> +f'`G9!:Kabq!J+^r9aObr9aObr9aObm-acOs6fjdp[/"]r9aObr9aObr9aObg$\k?jR*!Jp?hn\ +r9aObr9aObr9aObr9aOblL"WPp?hn\r9aObr9aObr9aObr9aObJaS*WJaS*WJaS*WMsgTFJ,~> +f'</5!:'I^q!%hZr9=7^r9=7^r9=7^m-=KKs6BR`pZ__Yr9=7^r9=7^r9=7^g$8S;jQZ^Fp?DVX +r9=7^r9=7^r9=7^r9=7^lKS?Lp?DVXr9=7^r9=7^r9=7^r9=7^Ja.gOJa.gOJa.gOMsC<BJ,~> +f&ll1!9X1ZpuVPVr8mtZr8mtZr8mtZm,n3Gs5s:\pZ;GUr8mtZr8mtZr8mtZg#i;7jQ6FBp>u>T +r8mtZr8mtZr8mtZr8mtZlK/'Hp>u>Tr8mtZr8mtZr8mtZr8mtZJ`_OGJ`_OGJ`_OGMrt$>J,~> +q!J+^i9gRFr9aObp$Mk]mK!7S!W_WgrpBgfmK!7S!W_WgmHsrSr9aObrpBadq<e:amK!7S!W_Wg +rpBgfmK!7S!W_Wgg$Sh?jmN-Kp[/(_mK!7S!W_WgrpBgfmK!7S!W_WgrpBgfmJuVArrDf]!W_Wg +rpBgfmK!7S!W_WgrpBgfmK!7S!W_WgJaS*WJaS*WJaS*WN:-]GJ,~> +q!%hZi9C:Br9=7^p$)SYl2^hK!W_KcrosObl2^hK!W_KcmHOZOr9=7^rosI`q<A"]l2^hK!W_Kc +rosObl2^hK!W_Kcg$/P;jm)jGpZ_e[l2^hK!W_KcrosObl2^hK!W_KcrosObl2^29rrDfY!W_Kc +rosObl2^hK!W_KcrosObl2^hK!W_KcJa.gOJa.gOJa.gON9^ECJ,~> +puVPVi8t">r8mtZp#Z;UjoGDC!W_?_roO7^joGDC!W_?_mH+BKr8mtZroO1\q;q_YjoGDC!W_?_ +roO7^joGDC!W_?_g#`87jlZRCpZ;MWjoGDC!W_?_roO7^joGDC!W_?_roO7^joFc1rrDfU!W_?_ +roO7^joGDC!W_?_roO7^joGDC!W_?_J`_OGJ`_OGJ`_OGN9:-?J,~> +k3`3Lo'QJXr9aObp?hn\rpBgfmK!7S!W_WgrpBgfmK!7S!!)HT!!)rb!!*#d!!)l`!!*#d!W_Wg +rpBgfmK!7S!W_WgrpBadg?nq@p?hn\o'QPZmK!%M!!*#d!W_WgrpBgfmK!7S!W_WgrpBgfmK!7S +!!)HT!W_Wgq!J+^rpBgfmK!7S!W_WgrpBgfmK!7S!W_WgrpBadJaS*WJaS*WJaS*WNUHfHJ,~> +k3;pHo'-2Tr9=7^p?DVXrosObl2^hK!W_KcrosObl2^hK!!)HP!!)r^!!*#`!!)l\!!*#`!W_Kc +rosObl2^hK!W_KcrosI`g?JY<p?DVXo'-8Vl2^VE!!*#`!W_KcrosObl2^hK!W_KcrosObl2^hK +!!)HP!W_Kcq!%hZrosObl2^hK!W_KcrosObl2^hK!W_KcrosI`Ja.gOJa.gOJa.gONU$NDJ,~> +k2lXDo&]oPr8mtZp>u>TroO7^joGDC!W_?_roO7^joGDC!!)HL!!)rZ!!*#\!!)lX!!*#\!W_?_ +roO7^joGDC!W_?_roO1\g?&A8p>u>To&]uRjoG2=!!*#\!W_?_roO7^joGDC!W_?_roO7^joGDC +!!)HL!W_?_puVPVroO7^joGDC!W_?_roO7^joGDC!W_?_roO1\J`_OGJ`_OGJ`_OGNTU6@J,~> +!U]semK<OXmJm7cmf!4dmJm7dmK*CVmf!4XmKim]!!)HT!:Bgeq<e4_rpBgfmK!7S!W_WgrpBgf +mK!7S!!)HT"p"&k!:K7TrpBadqX+=`rpBgfmK!7S!W_WgrpBgfmK!7S!!)ESrW)rcrW)rcrW)ob +!!)ucrW)rcrW)KV!!)f^!!*#d!W_WgrpBgfmK!7S!W_WgrpBgfmK!7S!!)BR!!)f^!!*#d!W_Wg +rpBgfmK!7S!W_WgrpBgfmK!7S!!%T<JaS*WJaS*WJaSNcrr@Q~> +!U9[al3%+Pl2Uh_lM^e`l2Uh`l2gtNlM^eTl3RIU!!)<L!9sOaq<@q[rosObl2^hK!W_KcrosOb +l2^hK!!)HP"p!og!:&hLrosI`qW\%\rosObl2^hK!W_KcrosObl2^hK!!)EOrW)r_rW)r_rW)o^ +!!)u_rW)r_rW)KR!!)fZ!!*#`!W_KcrosObl2^hK!W_KcrosObl2^hK!!)BN!!)fZ!!*#`!W_Kc +rosObl2^hK!W_KcrosObl2^hK!!%T8Ja.gOJa.gOJa/6[rr@Q~> +!TjC]job\Hjo>D[k5GA\jo>D\joPPFk5GAPjp;%M!!)0D!9O7]q;qYWroO7^joGDC!W_?_roO7^ +joGDC!!)HL"p!cc!9WDDroO1\qW7bXroO7^joGDC!W_?_roO7^joGDC!!)EKrW)r[rW)r[rW)oZ +!!)u[rW)r[rW)KN!!)fV!!*#\!W_?_roO7^joGDC!W_?_roO7^joGDC!!)BJ!!)fV!!*#\!W_?_ +roO7^joGDC!W_?_roO7^joGDC!!%T4J`_OGJ`_OGJ`_sSrr@Q~> +!UTmdli7%bli7%bli7%bliI1R!<2<b!<2<b!:oLV!<;Bi!:0[cm-F`Kli7%bliI1R!<2<d!:0^b +liI1R!<2<b!:K4R!<;Be!:9(N!;c$^!<2<d!:0^bliI1R!<2<d!:0^bli7%Rli7%bliI1R!<2<b +!;u0`!<2<b!<2<b!<2<b!<2<b!:]=T!;Pm\!<2<d!:0^bliI1R!<2<d!:0^bliI1R!<2<b!:9%P +!;Pm\!<2<d!:0^bliI1R!<2<d!:0^bliI1R!<2<b!.jKfm"+MSm"+MSm#UK8mHafQJ,~> +!U0U`kPtV^kPtV^kPtV^kQ1bJ!<20^!<20^!:o@R!<;6e!9aC_ki`$CkPtV^kQ1bJ!<20`!9aF^ +kQ1bJ!<20^!:K(N!<;6a!9iYF!;bmZ!<20`!9aF^kQ1bJ!<20`!9aF^kPtVNkPtV^kQ1bJ!<20^ +!;u$\!<20^!<20^!<20^!<20^!:]1P!;PaX!<20`!9aF^kQ1bJ!<20`!9aF^kQ1bJ!<20^!:8nL +!;PaX!<20`!9aF^kQ1bJ!<20`!9aF^kQ1bJ!<20^!.j?bk^hrKk^hrKk`=p0l0&*IJ,~> +!Ta=\j8]2Zj8]2Zj8]2Zj8o>B!<2$Z!<2$Z!:o4N!<;*a!9=+[jQ$=;j8]2Zj8o>B!<2$\!9=.Z +j8o>B!<2$Z!:JqJ!<;*]!9E5>!;baV!<2$\!9=.Zj8o>B!<2$\!9=.Zj8]2Jj8]2Zj8o>B!<2$Z +!;tmX!<2$Z!<2$Z!<2$Z!<2$Z!:]%L!;PUT!<2$\!9=.Zj8o>B!<2$\!9=.Zj8o>B!<2$Z!:8bH +!;PUT!<2$\!9=.Zj8o>B!<2$\!9=.Zj8o>B!<2$Z!.j3^jFQBCjFQBCjH&@(jl?CAJ,~> +!UBabl2Uh`kl:__l21MbklBrJklC#5!!)r]!!)l[!!*#_!W_HbrojIaklC_I!W_HbrojC_lKJ9K +r941]qWRt[rojIaklC_I!W_HbrojIaklC_I!!)ENrrE&_!!)o\r;ci]!!*#_quH*J!!)fY!!*#_ +!W_HbrojIaklC_I!W_HbrojIaklC_I!!)BM!!)fY!!*#_!W_HbrojIaklC_I!W_HbrojIaklC_I +!!%T7Ja%aMJa%aMJa&B_rp'OJ!pTacJ,~> +!TsI^jo>D\jT#;[jno)^jT+BBjT+T-!!)rY!!)lW!!*#[!W_<^roF1]jT,;A!W_<^roF+[lK&!G +r8dnYqW.\WroF1]jT,;A!W_<^roF1]jT,;A!!)EJrrE&[!!)oXr;ciY!!*#[quH*F!!)fU!!*#[ +!W_<^roF1]jT,;A!W_<^roF1]jT,;A!!)BI!!)fU!!*#[!W_<^roF1]jT,;A!W_<^roF1]jT,;A +!!%T3J`VIEJ`VIEJ`W*WroX7B!p0I_J,~> +!TO1ZiW&uXi;`lWiVWZZi;hg:i;i0%!!)rU!!)lS!!*#W!W_0Zro!nYi;il9!W_0Zro!hWlJV^C +r8@VUqV_DSro!nYi;il9!W_0Zro!nYi;il9!!)EFrrE&W!!)oTr;ciU!!*#WquH*B!!)fQ!!*#W +!W_0Zro!nYi;il9!W_0Zro!nYi;il9!!)BE!!)fQ!!*#W!W_0Zro!nYi;il9!W_0Zro!nYi;il9 +!!%T/J`21=J`21=J`2gOro3t:!oa1[J,~> +"R,"Kk5bJD!!*#]!!)r["9@Tbk5af1!!)r[!!)lY!!*#]!W_B`roX=_k5bME!W_B`roX7]lK8-I +r9"%[qW@hYroX=_k5bME!W_B`roX=_k5bME!!)?J!s%NI!;u![!<2-]!<2-]!<2-]!9iSG!;P^W +!<2-_!9X@]k5kYH!<2-_!9X@]k5kYH!<2-]!:8kK!;P^W!<2-_!9X@]k5kYH!<2-_!9X@]k5kYH +!<2-]!.j<akCMfIkCMfIkE>$+k5PF3~> +s5X4]j8f/=!!*#Y!!)rW"9@H^irJB)!!)rW!!)lU!!*#Y!W_6\ro4%[irK)=!W_6\ro3tYlJhjE +r8RbWqVqPUro4%[irK)=!W_6\ro4%[irK)=!!)?F!s%BA!;tjW!<2!Y!<2!Y!<2!Y!9iGC!;PRS +!<2![!94(YirT5@!<2![!94(YirT5@!<2!Y!:8_G!;PRS!<2![!94(YirT5@!<2![!94(YirT5@ +!<2!Y!.j0]j+66Aj+66Aj-&F,ioB(YirB(0~> +"QA8=huN`5!!*#U!!)rS"9@<ZhZ2s!!!)rS!!)lQ!!*#U!W_*XrndbWhZ3Z5!W_*Xrnd\UlJDRA +r8.JSqVM8QrndbWhZ3Z5!W_*XrndbWhZ3Z5!!)?B!s%69!;t^S!<1jU!<1jU!<1jU!9i;?!;PFO +!<1jW!8deUhZ<f8!<1jW!8deUhZ<f8!<1jU!:8SC!;PFO!<1jW!8deUhZ<f8!<1jW!8deUhZ<f8 +!<1jU!.j$Yhgs[9hgs[9hick$hV[5IhZ*Y,~> +s5a:^irK&;!!*#X!!*#X"p!W_iW.s<ro*nXo&9WLro*tZiW/u;!!*#X!!)uW!W_3[ro*tZiW/u; +!W_3[ro*tZiW/r:rrDZM!!*#X!W_3[ro*nXro*nXrSdkYiW/u;!W_3[ro*tZiW/u;!W_3[mG\*G +ro*tZiW/u;"p!W_io0q<ro*nXro*nXro*nXro*nXnDXEJr8I\VrSdkYiW/u;!W_3[ro*tZiW/u; +!W_3[ro*tZiW/r:rrDTK!!)rV!!)uW!W_3[ro*tZiW/u;!W_3[ro*tZiW/u;!W_3[J`;7?J`;7? +J`;7?Ol?B"ro+"<!!%N~> +s5="ZhZ3W3!!*#T!!*#T"p!K[h>lC4rn[VTo%j?Hrn[\Vh>mQ3!!*#T!!)uS!W_'Wrn[\Vh>mQ3 +!W_'Wrn[\Vh>mN2rrDZI!!*#T!W_'Wrn[VTrn[VTrS@SUh>mQ3!W_'Wrn[\Vh>mQ3!W_'WmG7gC +rn[\Vh>mQ3"p!K[hVJ54rn[VTrn[VTrn[VTrn[VTnD4-Fr8%DRrS@SUh>mQ3!W_'Wrn[\Vh>mQ3 +!W_'Wrn[\Vh>mN2rrDTG!!)rR!!)uS!W_'Wrn[\Vh>mQ3!W_'Wrn[\Vh>mQ3!W_'WJ_kt7J_kt7 +J_kt7Okp)orn[_4!!%N~> +s4m_VgAq3+!!*#P!!*#P"p!?Wg&Th,rn7>Po%F'Drn7DRg&V-+!!*#P!!)uO!W^pSrn7DRg&V-+ +!W^pSrn7DRg&V**rrDZE!!*#P!W^pSrn7>Prn7>PrRq;Qg&V-+!W^pSrn7DRg&V-+!W^pSmFhO? +rn7DRg&V-+"p!?Wg=cN,rn7>Prn7>Prn7>Prn7>PnCdjBr7V,NrRq;Qg&V-+!W^pSrn7DRg&V-+ +!W^pSrn7DRg&V**rrDTC!!)rN!!)uO!W^pSrn7DRg&V-+!W^pSrn7DRg&V-+!W^pSJ_G\/J_G\/ +J_G\/OkKfgrn7G,!!%N~> +#N=Ut!8QAag\q3Pg\q3PgB%B0!<1aP!:nnD!<1aP!<1aP!<(XP!;tRO!;tRO!;tRO!;tRO!:ehC +!<1aP!<1aP!<(XP!;tRO!;tRO!;tRO!:/D=!<1aP!<1aQ!!CsUgY;]-rnIDPrnIDPo@s0Cs4dMQ +rS%;Pr7_2Or7_2Or7_2Or7_2Or7_2Oo%X'Bs4dMQrS%;Pr7_2Or7_2Or7_2Or7_2OJ_Pb1J_Pb1 +J_Pb1NS=QjgAh5(~> +#Mn1h!86&Xf_tmMf_tmMfE)'*!<1XM!:neA!<1XM!<1XM!<(OM!;tIL!;tIL!;tIL!;tIL!:e_@ +!<1XM!<1XM!<(OM!;tIL!;tIL!;tIL!:/;:!<1XM!<1XN!!CjRf\$0'rn.2Mrn.2Mo@Ws@s4I;N +rR_)Mr7CuLr7CuLr7CuLr7CuLr7CuLo%<j?s4I;NrR_)Mr7CuLr7CuLr7CuLr7CuLJ_5P+J_5P+ +J_5P+N7\3`!!%N~> +#MIb]!7fWLeG]IIeG]IIe,fX"!<1LI!:nY=!<1LI!<1LI!<(CI!;t=H!;t=H!;t=H!;t=H!:eS< +!<1LI!<1LI!<(CI!;t=H!;t=H!;t=H!://6!<1LI!<1LJ!!C^NeC=Htrm^oIrm^oIo@3[<s4%#J +rR:fIr6t]Hr6t]Hr6t]Hr6t]Hr6t]Ho$mR;s4%#JrR:fIr6t]Hr6t]Hr6t]Hr6t]HJ^f8#J^f8# +J^f8#NR\!Yrr@Q~> +"P_V_f@K9<!!)*1!!)-2!!)'0!!'CV!!)<7!!(p,!!)96!!%T#J^o>%J^o>%J^o>%o@<ii"P)#P +!!%N~> +"PD;Ue'dR0!!)*-!!)-.!!)',!!'CR!!)<3!!(p(!!)92!!%StJ^K%rJ^K%rJ^K%ro?mQa"OYTD +!!%N~> +"OtlIcd1q&!!)**!!)-+!!)')!!'CO!!)<0!!(p%!!)9/!!%SqJ^/hlJ^/hlJ^/hlo?R?[rm(ND +J,~> +JH16$JH16$JH16$JH16$JH4.!J,~> +JH16$JH16$JH16$JH16$JH4.!J,~> +JH16$JH16$JH16$JH16$JH4.!J,~> +JH16$JH16$JH16$JH16$JH4.!J,~> +JH16$JH16$JH16$JH16$JH4.!J,~> +JH16$JH16$JH16$JH16$JH4.!J,~> +"dP73NJraGM1LM7M1LM7M1LM7M1LM7M;O0gM?/WoJ,~> +"cA+iK7\Z*J:W6%J:W6%J:W6%J:W6%JDu(ZJ,OotJcC=P~> +"b;#JH$FOaG(FgfG(FgfG(FgfG(FgfG2dZFFoHR_G5ul<~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/btt/doc/btt.tex b/btt/doc/btt.tex new file mode 100644 index 0000000..2907554 --- /dev/null +++ b/btt/doc/btt.tex @@ -0,0 +1,1176 @@ +\documentclass{article} +\usepackage{epsfig,placeins} + +% +% Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +% +% vi :set textwidth=75 + +\title{\texttt{btt} User Guide} +\author{Alan D. Brunelle (Alan.Brunelle@hp.com)} +\date{30 October 2008} + +\begin{document} +\maketitle +%-------------- +\section{\label{sec:intro}Introduction} + +\texttt{btt} is a post-processing tool for the block layer IO tracing +tool called blktrace. As noted in its Users Guide, blktrace + + \begin{quotation} + is a block layer IO tracing mechanism which provides detailed + information about request queue operations up to user space. + \end{quotation} + +blktrace is capable of producing tremendous amounts of output in the +form of multiple individual traces per IO executed during the traced +run. It is also capable of producing some general statistics concerning +IO rates and the like. \texttt{btt} goes further and produces a variety +of overall statistics about each of the individual handling of IOs, and +provides data we believe is useful to plot to provide visual comparisons +for evaluation. + +This document will discuss \texttt{btt} usage, provide some sample output, +and also show some interesting plots generated from the data provided +by the \texttt{btt} utility. + +\bigskip +A short note on the ordering of this document -- the actual +command-line usage section occurs relatively late in the document (see +section~\ref{sec:cmd-line}), as we felt that discussing some of the +capabilities and output formats would make the parameter discussion +easier. + +\bigskip + This document refers to the output formats generated by \texttt{btt} + version 2.00. However, the descriptions are general enough to cover + output formats prior to that. + +\newpage\tableofcontents + +\newpage\section{\label{sec:getting-started}Getting Started} + + The simple pipeline to get going with \texttt{btt} is to perform the + following steps: + + \begin{enumerate} + \item Run \texttt{blktrace}, specifying whatever devices and other + parameters you want. You must save the traces to disk in this step, + btt does not work in live mode. + + \item After tracing completes, run \texttt{blkrawverify}, specifying + all devices that were traced (or at least on all devices that you + will use \texttt{btt} with -- section~\ref{sec:o-D} shows how you + can dictate which devices to use with btt). If blkrawverify finds + errors in the trace streams saved, it is best to recapture the data + -- utilizing \texttt{btt} on \emph{unclean} trace files produces + inconsistent results. + + While this step is optional, we have found that performing this + helps to ensure data coming from \texttt{btt} makes the most sense. + + \item Run \texttt{blkparse} with the \texttt{-d} option specifying + a file to store the combined binary stream. (e.g.: \texttt{blkparse + -d bp.bin ...}). + + \texttt{blktrace} produces a series of binary files + containing parallel trace streams -- one file per CPU per + device. \texttt{blkparse} provides the ability to combine all the + files into one time-ordered stream of traces for all devices. + + \item Run \texttt{btt} specifying the file produced by + \texttt{blkparse} utilizing the \texttt{-i} option (e.g.: \texttt{btt + -i bp.bin ...}). + + \end{enumerate} + +\newpage\section{\label{sec:output-overview}Output Overview} + + The major default areas of output provided by \texttt{btt} + include\label{tl-defs}: + +\begin{description} + \item[average component times across all IOs] The time line of each IO + is broken down into 3 major regions: + + \begin{enumerate} + \item Time needed to insert or merge an incoming IO onto the request + queue. This is the average time from when the IO enters the block + IO layer (queue trace) until it is inserted (insert trace). + + This is denoted as \emph{Q2I} time. + + This is also broken down into two component times\footnote{On + occasion there are also some time spent \emph{sleeping} waiting + for a request. That occurs between the Q and G operations. You + will see these listed as \texttt{S2G} times.}: + + \begin{description} + \item[Q2G] Time needed to \emph{get} a request (get request + trace). + + \item[G2I] Time needed to put that request onto the request + queue (insert trace). + \end{description} + + For \emph{merged} requests -- an incoming request that is merged + with a previously submitted request -- we calculate \emph{Q2M}, the + amount of time between the queue trace and the merge trace. + + \item Time spent on the request queue. The average time from when + the IO is inserted or merged onto the request queue, until it is + issued (issue trace) to the lower level driver. + + Referred to as \emph{I2D} time\footnote{The \emph{issue} trace + is represented by a D in the blkparse output, hence its usage in + btt to refer to issue traces. Note that an I is used to refer to + \emph{insert} traces.}. + + \item Driver and device time -- the average time from when the + actual IO was issued to the driver until is completed (completion + trace) back to the block IO layer. + + This is referred to as the \emph{D2C} time\ + \end{enumerate} + + Two other sets of results are presented in this section: + + \begin{enumerate} + \item \emph{Q2Q} which measures the time between queue traces + in the system. This provides some idea as to how quickly IOs are + being handed to the block IO layer. + + \item \emph{Q2C} which measures the times for the complete life cycle + of IOs during the run\footnote{One of the areas that needs some + work in \texttt{btt} is to better understand the multiplex nature of + IOs during a run. In theory, one would like ${Q2I} + {I2D} + {D2C} + = {Q2C}$ however, typically there are multiple queue traces that + are combined via merges into a single IO issued and completed. We + currently average the queue-to-insert and queue-to-merge times, + and thus tend to be quite close to the expected equation.} + + \end{enumerate} + + For each row in this output, we provide a minimum, average, maximum + (which are all presented in seconds), and overall count. As an + example\footnote{As with this display, the author has taken some liberty + in reformatting the output for better display on the printed page.}: + +\begin{verbatim} +ALL MIN AVG MAX N +---- ------------- ------------- ------------- ----------- +Q2Q 0.000000058 0.000012761 9.547941661 2262310 +Q2I 0.000000272 0.000005995 0.104588839 2262311 +I2D 0.000001446 0.094992714 0.239636864 2262311 +D2C 0.000193721 0.030406554 1.634221408 2262311 +Q2C 0.000207665 0.125405263 1.830917198 2262311 +\end{verbatim} + + When tracking \emph{device mapper} devices, we also break down the + \emph{Q2A} and \emph{Q2C} times for those IOs. + + \item[Device Overhead] + + Using the data from the previous chart, we can then provide some idea + as to where IO spend most of the time on average. The following output + shows the percentage of time spent in each of the phases of an +IO\footnote{It should be noted that incoming requests either go through: + +\begin{enumerate} + \item Q2G + Q2I + + or + + \item Q2M +\end{enumerate} + before proceeding to I2D and D2C.} + +\begin{verbatim} + DEV | Q2G G2I Q2M I2D D2C +---------- | --------- --------- --------- --------- --------- + ( 8, 80) | 0.0013% 0.0004% 0.0006% 88.5005% 11.4988% +---------- | --------- --------- --------- --------- --------- + Overall | 0.0003% 0.0001% 0.0041% 21.4998% 78.4958% +\end{verbatim} + + \item[Device Merge Information] + + A key measurement when making changes in the system (software \emph{or} + hardware) is to understand the block IO layer ends up merging incoming + requests into fewer, but larger, IOs to the underlying driver. In this + section, we show the number of incoming requests (Q), the number of + issued requests (D) and the resultant ratio. We also provide values + for the minimum, average and maximum IOs generated. + + Looking at the following example: + +\begin{verbatim} + DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total +---------- | ------- ----- ----- | ------ ------ ------ ------- + ( 68, 64) | 2262311 18178 124.5 | 2 124 128 2262382 +\end{verbatim} + + we see that (on average) the block IO layer is combining upwards of + 125 incoming requests into a single request down the IO stack. The + resultant average IO size is 124 blocks. + + \item[Device Seek Information] + + Another useful measure is the variability in the sector distances + between consecutively \emph{received -- queued} and \emph{submitted + -- issued} IOs. The next two sections provides some rudimentary + statistics to gauge the general nature of the sector differences + between IOs. Values provided include the number of seeks (number of IOs + submitted to lower level drivers), the \emph{mean} distance between + IOs, the \emph{median} value for all seeks, and the \emph{mode} - + the value(s) and the counts are provided for the latter. + + The first of the two sections displays values for Q2Q seek distances -- + providing a set of indicators showing how close incoming IO requests + are to each other. The second section shows D2D seek distances -- + providing a set of indicators showing how close the IO requests are + that are handled by underlying drivers. + +\begin{verbatim} + DEV | NSEEKS MEAN MEDIAN | MODE +--------- | ------ ------- ------ | ------- +( 68, 64) | 18178 19611.3 0 | 0(17522) +\end{verbatim} + + We have almost exclusively seen median and mode values of 0, indicating + that seeks tend to have an equal amount of forward and backwards + seeks. The larger the count for the mode in comparison to the total + number of seeks is indicative as to how many IOs are coming out of + the block IO layer in adjacent sectors. (Obviously, the higher this + percentage, the better the underlying subsystems can handle them.) + + \item[Request Queue Plug Information] + + During normal operation, requests queues are \emph{plugged} and during + such times the IO request queue elements are not able to be processed + by underlying drivers. The next section shows how often the request + queue was in such a state. + +\begin{verbatim} + DEV | # Plugs # Timer Us | % Time Q Plugged +--------- | ------- ---------- | ---------------- +( 68, 64) | 833( 0) | 0.356511895% +\end{verbatim} + + There are two major reasons why request queues are unplugged, and both + are represented in the above table. + + \begin{enumerate} + \item Explicit unplug request from some subsystem in the kernel. + + \item Timed unplugs, due to a request queue exceeding some temporal + limit for being plugged. + \end{enumerate} + + The total number of unplugs is equal to the number of plugs less the + ones due to timer unplugs. + + \item[IOs per Unplug \& Unplugs-due-to-timeout] + + In this subsection one can see the average number of IOs on the request + queue at the time of an unplug or unplug due to a timeout. The following + sample shows a sample of both unplug sections: + +\begin{verbatim} +==================== Plug Information ==================== + + DEV | # Plugs # Timer Us | % Time Q Plugged +---------- | ---------- ---------- | ---------------- + ( 8, 0) | 1171( 123) | 0.280946640% + ( 8, 32) | 4( 0) | 0.000325469% +---------- | ---------- ---------- | ---------------- + Overall | # Plugs # Timer Us | % Time Q Plugged + Average | 587( 61) | 0.140636055% + + DEV | IOs/Unp IOs/Unp(to) +---------- | ---------- ---------- + ( 8, 0) | 9.2 8.8 + ( 8, 32) | 2.5 0.0 +---------- | ---------- ---------- + DEV | IOs/Unp IOs/Unp(to) + Overall | 9.2 8.8 +\end{verbatim} + + This table and the preceding one have to be considered together -- + in the sample output in the immediately preceding table one can see + how the larger number of data values for device (8,0) dominates in + the overall average. + + \item[Active Requests At Q Information] + + An important consideration when analyzing block IO schedulers is to + know how many requests the scheduler has to work with. The metric + provided in this section details how many requests (on average) were + being held by the IO scheduler when an incoming IO request was being + handled. To determine this, \texttt{btt} keeps track of how many Q + requests came in, and subtracts requests that have been issued (D). + + Here is a sample output of this sections: + +\begin{verbatim} +==================== Active Requests At Q Information ==================== + + DEV | Avg Reqs @ Q +---------- | ------------- + ( 65, 80) | 12.0 + ( 65,240) | 16.9 +... + ( 66,112) | 44.2 +---------- | ------------- + Overall | Avgs Reqs @ Q + Average | 17.4 +\end{verbatim} + +\end{description} + +\newpage +\subsection*{\label{sec:detailed-data}Detailed Data} + + In addition to the default sections output, if one supplies the + \texttt{--all-data} or \texttt{-A} argument (see section~\ref{sec:o-A}) + to \texttt{btt} further sections are output: + +\begin{description} + \item[Per Process] As traces are emitted, they are tagged with the + process ID of the currently running thread in the kernel. The process + names are also preserved, and mapped to the ID. For each of the parts + of the time line discussed above on page~\pageref{tl-defs}, a chart is + provided which breaks down the traces according to process ID (name). + + One must be aware, however, that the process ID may not have anything + to do with the originating IO. For example, if an application is + doing buffered IO, then the actual submitted IOs will most likely + come from some page buffer management daemon thread (like pdflush, + or kjournald for example). Similarly, completion traces are rarely + (if ever?) going to be associated with the process which submitted + the IO in the first place. + + Here is a sample portion of this type of chart, showing Q2Q times + per process: + +\begin{verbatim} + Q2Q MIN AVG MAX N +------------- ----------- ----------- ----------- ------- +mkfs.ext3 0.000000778 0.000009074 1.797176188 1899371 +mount 0.000000885 0.000672513 0.030638128 73 +pdflush 0.000000790 0.000006752 0.247231307 179791 +\end{verbatim} + + \item[Per Process Averages] The average columns from the above charts, + are also presented in their own chart. + + \item[Per Device] Similar to the per-process display, \texttt{btt} + will also break down the various parts of an IOs time line based upon a + per-device criteria. Here's a portion of this area, displayed showing + the issued to complete times (D2C). + +\begin{verbatim} + D2C MIN AVG MAX N +--------- ----------- ----------- ----------- ------ +( 65, 80) 0.000140488 0.001076906 0.149739869 169112 +( 65, 96) 0.000142762 0.001215221 0.173263182 155488 +( 65,112) 0.000145221 0.001254966 0.124929936 165726 +( 65,128) 0.000141896 0.001159596 0.775231052 169015 +( 65,144) 0.000140832 0.001290985 0.211384698 210661 +( 65,160) 0.000139915 0.001175554 0.073512063 133973 +( 65,176) 0.000141254 0.001104870 0.073231310 145764 +( 65,192) 0.000141453 0.001234460 0.167622507 140618 +... +\end{verbatim} + + \item[Per Device Averages] The average columns from the above charts, + are also presented in their own chart. + + \item[Q2D Histogram] A display of histogram buckets for the Q to D times + -- basically, from where an IO enters the block IO layer for a given + device, and when it is dispatched. The buckets are arranged via the + time in seconds, as in: + +\begin{verbatim} +==================== Q2D Histogram ==================== + + DEV | <.005 <.010 <.025 <.050 <.075 <.100 <.250 <.500 < 1.0 >=1.0 + --------- | ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== + ( 66, 80) | 61.2 7.9 12.1 7.9 3.0 1.4 1.5 0.2 0.0 4.6 + ( 65,192) | 42.3 5.0 8.7 30.0 8.9 3.0 1.8 0.1 0.0 0.1 + ( 65,128) | 34.3 5.3 8.9 32.0 9.7 3.7 5.3 0.6 0.0 0.1 +... + ( 65, 64) | 59.9 4.2 6.0 24.6 4.2 0.8 0.1 0.0 0.0 0.1 + ( 66, 64) | 62.6 8.1 12.7 7.9 2.4 0.6 0.1 0.0 0.0 5.4 +========== | ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== + AVG | 52.9 6.2 10.0 20.1 5.3 1.7 1.4 0.2 0.0 2.1 +\end{verbatim} + +\end{description} + +\newpage\section{\label{sec:data-files}Data Files Output} + + Besides the averages output by default, the following 3 files are also + created with data points which may be plotted. + +\begin{description} + \item[\emph{file}.dat] This file provides a notion of \emph{activity} + for the system, devices and processes. The details of this file are + provided in section~\ref{sec:activity}. + + \item[\emph{file}\_qhist.dat] Provides histogram data for the size of + incoming IO requests, for more information see section~\ref{sec:qhist}. + + \item[\emph{file}\_dhist.dat] Provides histogram data for the size + of IO requests submitted to lower layer drivers, for more information + see section~\ref{sec:dhist}. + +\end{description} + + In addition to the default data files output, there are optional data + files which can be generated by btt. These include: + + \begin{description} + \item[subset of \texttt{.avg} data, easily parsed ] When the + \texttt{-X} option is specified \emph{and} the \texttt{-o} has also + been specified, then a subset of the data produced by default is + copied to another file that is \emph{more easily parsed.} Refer to + section~\ref{sec:o-X} for full details. + + \item[iostat] iostat-like data can be distilled by btt, and is + described in section~\ref{sec:iostat}. + + \item[per IO detail] Each and every IO traced can be output in a form + that shows each of the IO components on consecutive lines (rather + than grepping through a blkparse output file for example). The + details on this file is included in section~\ref{sec:per-io}. + + \item[iostat] Latency information -- both Q2d, D2c and Q2C -- + on a per-IO basis can be generated. These are described in + section~\ref{sec:lat}. + + \item[seek details] A set of data files containing all IO-to-IO + sector differences can be output, with details found in + section~\ref{sec:seek}. + + \item[unplug histogram details] A data file per device containing + histogram output for the amount of IOs released at unplug time. + Section~\ref{sec:o-u} has more details. + \end{description} + +\newpage\section{\label{sec:activity}Activity Data File} + + The activity data file contains a series of data values that indicate + those periods of time when queue and complete traces are being + processed. The values happen to be in a format easily handled by + xmgrace\footnote{\texttt{http://plasma-gate.weizmann.ac.il/Grace/} + ``Grace is a WYSIWYG 2D plotting tool for the X Window System and + M*tif.''}, but is easy to parse for other plotting and/or analysis + programs. + + The file is split into pairs of sets of data points, where each pair + contains a set of queue activity and a set of completion activity. The + points are presented with the first column (X values) being the time + (in seconds), and the second column (Y values) providing an on/off + type of setting. For each pair, the Y values have two settings off + (low) and on (high). For example, here is a snippet of a file showing + some Q activity: + +\begin{verbatim} +# Total System +# Total System : q activity +0.000000000 0.0 +0.000000000 0.4 +0.000070381 0.4 +0.000070381 0.0 +1.023482637 0.0 +1.023482637 0.4 +6.998746618 0.4 +6.998746618 0.0 +7.103336799 0.0 +7.103336799 0.4 +17.235419786 0.4 +17.235419786 0.0 +26.783361447 0.0 +26.783361447 0.4 +26.832454929 0.4 +26.832454929 0.0 +28.870431266 0.0 +28.870431266 0.4 +28.870431266 0.4 +28.870431266 0.0 +\end{verbatim} + + What this indicates is that there was q activity for the system + from 0.000000000 through 0.000070381, but was inactive from there to + 1.023482637, and so on. Section~\ref{sec:o-d} contains details on how + to adjust btt's notion of what constitutes activity. + + The pairs are arranged as follows: + + \begin{itemize} + \item First there is the total system activity -- meaning activity + in either queue or completion traces across all devices. + + \item Next comes per-device activity information -- for each device + being traced, that request queues Q and C traces are presented. + + \item Last we present pairs per-process. + \end{itemize} + + Using this, one is then able to plot regions of activity versus + inactivity -- and one can gather a sense of deltas between the queueing + of IOs and when they are completed. Figure~\ref{fig:activity} shows + a very simplistic chart showing some activity: + + \begin{figure}[hb] + \leavevmode\centering + \epsfig{file=activity.eps,width=4.5in} + \caption{\label{fig:activity}Simple Activity Chart} + \end{figure} + + When the black line (system Q activity) is \emph{high}, then the system + is seeing relatively continuous incoming queues. Conversely, when it is + low, it represents an extended period of time where no queue requests + were coming in. Similarly for the red line and C activity. + +\newpage\section{\label{sec:hist}Histogram Data Files} + + The histogram data files provide information concerning incoming and + outgoing IO sizes (in blocks). For simplicity, the histogram buckets + are one-for-one for sizes up to 1,024 blocks in the IO, and then a + single bucket for all sizes greater than or equal to 1,024 blocks. + + The files are again in grace-friendly format, with the first set + containing data for the first 1,023 buckets, and a separate set + representing sizes $\ge 1024$ blocks. (This is done so that one can + easily use a separate formatting specification for the latter set.) + + The first column (X values) is the various IO sizes, and the second + column (Y values) represents the number of IOs of that size. + +\subsection*{\label{sec:qhist}Q Histogram Data File} + + Figure~\ref{fig:qhist} is a sample graph generated from data used during + some real-world analysis\footnote{Note the logarithmic nature of the + Y axis for this chart.}. With the visual representation provided by + this, one can quickly discern some different characteristics between + the 3 runs -- in particular, one can see that there is only a single + red point (representing 8 blocks per IO), whereas the other two had + multiple data points greater than 8 blocks. + + \begin{figure}[hb] + \leavevmode\centering + \epsfig{file=qhist.eps,width=4.5in} + \caption{\label{fig:qhist}Q Histogram} + \end{figure} + +\subsection*{\label{sec:dhist}D Histogram Data File} + + Figure~\ref{fig:dhist} is a sample graph generated from data used during + some real-world analysis\footnote{Note the logarithmic nature of the + Y axis for this chart.}. Again, visually, one can see that the black + and blue dots are somewhat similar below about 192 blocks per IO going + out. And then one can make the broad generalization of higher reds, + lower blues and blacks in the middle. + + \begin{figure}[hb] + \leavevmode\centering + \epsfig{file=dhist.eps,width=4.5in} + \caption{\label{fig:dhist}D Histogram} + \end{figure} + +\newpage\section{\label{sec:iostat}iostat Data File} + \texttt{btt} attempts to produce the results from running an + \texttt{iostat -x} command in parallel with the system as it is being + traced. The fields (columns) generated by the \texttt{--iostat} or + \texttt{-I} option can be seen from the following output snippet -- + note that the line has been split to fit on the printed page: + +\begin{verbatim} +Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s + rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util Stamp +... +( 8, 16) 0.00 0.00 0.00 1005.30 0.00 152806.36 + 0.00 76403.18 152.00 31.00 0.00 0.00 0.00 71.79 +... +( 8, 16) 1.02 5.80 0.34 1.07 4.03 55.62 + 2.02 27.81 42.13 0.61 0.00 21.90 0.00 TOTAL +\end{verbatim} + + Note that the STAMP field contains the runtime (in seconds) for that + line of data. + +\newpage\section{\label{sec:per-io}Per-IO Data File} + + \texttt{btt} can produce a text file containing time line data for each + IO processed. The time line data contains rudimentary information for + the following stages: + + \begin{itemize} + \item queue traces + \item get request traces + \item insert traces + \item merge traces + \item issue traces + \item completion traces + \item remap traces + \end{itemize} + + The \emph{--per-io-dump} or \emph{-p} option triggers this behavior, + and will produce a file containing streams of IOs (separated by blank + spaces). As an example, here is a snippet of 4 IOs that were merged + together, you will note there are 3 merged IOs, and 1 inserted in the + stream. The issue and completion traces are replicated per IO. + +\begin{verbatim} + 66,0 : 0.763283556 Q 6208+8 + 0.763300157 I 6208+8 + 0.763296365 G 6208+8 + 0.763338848 D 6208+32 + 0.763705760 C 6208+32 + + 66,0 : 0.763314550 Q 6224+8 + 0.763315341 M 6224+8 + 0.763338848 D 6208+32 + 0.763705760 C 6208+32 + + 66,0 : 0.763321010 Q 6232+8 + 0.763321775 M 6232+8 + 0.763338848 D 6208+32 + 0.763705760 C 6208+32 + + 65,240: 0.763244173 Q 6216+8 + 0.763244974 M 6216+8 + 0.763374288 D 6208+32 + 0.763826610 C 6208+32 +\end{verbatim} + + The columns provide the following information: + + \begin{enumerate} + \item Device major/minor. + + \item Time of the trace (seconds from the start of the run) + + \item Trace type + + \item start block + number of blocks + \end{enumerate} + +\newpage\section{\label{sec:lat}\label{sec:lat-q2d}\label{sec:lat-q2c}\label{sec:lat-d2c}Latency Data Files} + + The latency data files which can be optionally produced by \texttt{btt} + provide per-IO latency information, one for queue time (Q2D), one + for total IO time (Q2C) and one for latencies induced by lower layer + drivers and devices (D2C). + + In both cases, the first column (X values) represent runtime (seconds), + while the second column (Y values) shows the actual latency for a + command at that time (either Q2D, D2C or Q2C). + +\newpage\section{\label{sec:seek}Seek Data Files} + + \texttt{btt} can also produce two data files containing all IO-to-IO sector + deltas, providing seek information which can then be plotted. The + produced data file contains 3 sets of data: + + \begin{enumerate} + \item Combined data -- all read and write IOs + + \item Read data -- just seek deltas for reads + + \item Write data -- just seek deltas for writes + \end{enumerate} + + The format of the output file names is to have the name generated by + the following fields separated by underscores (\texttt{\_}): + + \begin{itemize} + \item The prefix provided as the argument to the \texttt{-s} option. + \item The major and minor numbers of the device separated by a comma. + \item The string \texttt{q2q} or \texttt{d2d}, indicating the Q2Q or + D2D seeks, respectively. + \item One of the following characters: + \begin{description} + \item[r] For read (device to system) IOs + \item[w] For write (system to device) IOs + \item[c] Combined -- both read and write IOs + \end{description} + \end{itemize} + + An example name would be after specifying \texttt{-s seek} would be: + \texttt{seek\_065,048\_q2q\_w.dat}. + + The format of the data is to have the runtime values (seconds since + the start of the run) in column 1 (X values); and the difference in + sectors from the previous IO in column 2 (Y values). Here is a snippet + of the first few items from a file: + +\begin{verbatim} +# Combined + 0.000034733 35283790.0 + 0.000106453 35283790.0 + 0.005239009 35283950.0 + 0.006968575 35283886.0 + 0.007218709 35283694.0 + 0.012145393 35283566.0 + 0.014980835 -35848914.0 + 0.024239323 -35848914.0 + 0.024249402 -35848914.0 + 0.025707095 -35849072.0 + ... +\end{verbatim} + + Figure~\ref{fig:seek} shows a simple graph that can be produced which + provides visual details concerning seek patterns. + + \begin{figure}[h!] + \leavevmode\centering + \epsfig{file=seek.eps,width=4.5in} + \caption{\label{fig:seek}Seek Chart} + \end{figure} + \FloatBarrier + + The seek difference is calculated in one of two ways: + + \begin{description} + \item[default] By default, the seek distance is calculated as the + \emph{closest} distance between the previous IO and this IO. The + concept of \emph{closeness} means that it could either be the + \emph{end} of the previous IO and the beginning of the next, or the + end of this IO and the start of the next. + + \item[\texttt{-a}] If the \texttt{-a} or \texttt{--seek-absolute} + option is specified, then the seek distance is simply the difference + between the end of the previous IO and the start of this IO. + \end{description} + +\newpage\subsection{\label{sec:sps-spec}Seeks Per Second} + + When the \texttt{-m} option provides a name, Q2Q and/or D2D seeks + will trigger \texttt{btt} to output seeks-per-second information. The + first column will contain a time value (seconds), and the second column + will indicate the number of seeks per second at that point. + + When there is only a single data point within a 1-second window, + \texttt{btt} will just output the time value for the point, and the + value 1.0 in the second column. If there is no perceived difference + in the times present for the current sample, then the second columns + value is the number of seeks present at that time. + + Otherwise, if $\alpha$ and $\Omega$ are the first and last times + seen within a 1-second window, and $\nu$ are the number of seeks seen + in that time frame, then: + + \begin{description} + \item[column 1] Midway point in time for this span, or: \hfill$\alpha + + {{(\Omega - \alpha)} / 2}$ + + \item[column 2] Average seeks per second over this span, or: \hfill$\nu / + {(\Omega - \alpha)}$ + \end{description} + + Figure~\ref{fig:sps} shows a simple pair of graphs generated from + \texttt{-m} output: + + \begin{figure}[h!] + \leavevmode\centering + \epsfig{file=sps.eps,width=4.5in} + \caption{\label{fig:sps}Seeks-per-second Chart} + \end{figure} + \FloatBarrier + +\newpage\section{\label{sec:cmd-line}Command Line} + +\begin{verbatim} +Usage: btt 2.08 +[ -a | --seek-absolute ] +[ -A | --all-data ] +[ -B <output name> | --dump-blocknos=<output name> ] +[ -d <seconds> | --range-delta=<seconds> ] +[ -D <dev;...> | --devices=<dev;...> ] +[ -e <exe,...> | --exes=<exe,...> ] +[ -h | --help ] +[ -i <input name> | --input-file=<input name> ] +[ -I <output name> | --iostat=<output name> ] +[ -l <output name> | --d2c-latencies=<output name> ] +[ -L <freq> | --periodic-latencies=<freq> ] +[ -m <output name> | --seeks-per-second=<output name> ] +[ -M <dev map> | --dev-maps=<dev map> +[ -o <output name> | --output-file=<output name> ] +[ -p <output name> | --per-io-dump=<output name> ] +[ -P <output name> | --per-io-trees=<output name> ] +[ -q <output name> | --q2c-latencies=<output name> ] +[ -Q <output name> | --active-queue-depth=<output name> ] +[ -r | --no-remaps ] +[ -s <output name> | --seeks=<output name> ] +[ -S <interval> | --iostat-interval=<interval> ] +[ -t <sec> | --time-start=<sec> ] +[ -T <sec> | --time-end=<sec> ] +[ -u <output name> | --unplug-hist=<output name> ] +[ -V | --version ] +[ -v | --verbose ] +[ -X | --easy-parse-avgs ] +[ -z <output name> | --q2d-latencies=<output name> ] +\end{verbatim} + +\subsection{\label{sec:o-a}\texttt{--seek-absolute}/\texttt{-a}} + + When specified on the command line, this directs btt to calculate + seek distances based solely upon the ending block address of one IO, + and the start of the next. By default \texttt{btt} uses the concept + of the closeness to either the beginning or end of the previous IO. See + section~\ref{sec:seek} for more details about seek distances. + +\subsection{\label{sec:o-A}\texttt{--all-data}/\texttt{-A}} + + Normally \texttt{btt} will not print out verbose information + concerning per-process and per-device data (as outlined in + section~\ref{sec:detailed-data}). If you desire that level of + detail you can specify this option. + +\subsection{\label{sec:o-B}\texttt{--dump-blocknos}/\texttt{-B}} + + This option will output absolute block numbers to three files prefixed + by the specified output name: + + \begin{description} + \item[\emph{prefix}\_\emph{device}\_r.dat] All read block numbers are + output, first column is time (seconds), second is the block number, + and the third column is the ending block number. + + \item[\emph{prefix}\_\emph{device}\_w.dat] All write block numbers are + output, first column is time (seconds), second is the block number, + and the third column is the ending block number. + + \item[\emph{prefix}\_\emph{device}\_c.dat] All block numbers (read + and write) are output, first column is time (seconds), second is + the block number, and the third column is the ending block number. + \end{description} + +\subsection{\label{sec:o-d}\texttt{--range-delta}/\texttt{-d}} + + Section~\ref{sec:activity} discussed how \texttt{btt} outputs a file + containing Q and C activity, the notion of \emph{active} traces simply + means that there are Q or C traces occurring within a certain period + of each other. The default values is 0.1 seconds; with this option + allowing one to change that granularity. The smaller the value, the + more data points provided. + +\subsection{\label{sec:o-D}\texttt{--devices}/\texttt{-D}} + + Normally, \texttt{btt} will produce data for all devices detected in + the traces parsed. With this option, one can reduce the analysis to + one or more devices provided in the string passed to this option. The + device identifiers are the major and minor number of each device, and + each device identifier is separated by a colon (:). A valid specifier + for devices 8,0 and 8,8 would then be: \texttt{"8,0:8,8"}. + +\subsection{\label{sec:o-e}\texttt{--exes}/\texttt{-e}} + + Likewise, \texttt{btt} will produce data for all processes (executables) + found in the traces. With this option, one can specify which processes + you want displayed in the output. The format of the string passed is + a list of executable \emph{names} separated by commas (,). An example + would be \texttt{"-e mkfs.ext3,mount"}. + +\subsection{\label{sec:o-h}\texttt{--help}/\texttt{-h}} + + Prints out the simple help information, as seen at the top of + section~\ref{sec:cmd-line}. + +\subsection{\label{sec:o-i}\texttt{--input-file}/\texttt{-i}} + + Specifies the binary input file that \texttt{btt} will interpret traces + in. See section~\ref{sec:getting-started} for information concerning + binary trace files. + +\subsection{\label{sec:o-I}\texttt{--iostat}/\texttt{-I}} + + This option triggers \texttt{btt} to generate iostat-like output to the + file specified. Refer to section~\ref{sec:iostat} for more information + on the output produced. + +\subsection{\label{sec:o-l}\texttt{--d2c-latencies}/\texttt{-l}} + + This option instructs \texttt{btt} to generate the D2C latency file + discussed in section~\ref{sec:lat-d2c}. + +\subsection{\label{sec:o-L}\texttt{--periodic-latencies}/\texttt{-L}} + + When given a value greater than 0, this option will create two data + files (q2c \& d2c) per device containing a periodic timestamp \& + average latency over that period. + +\subsection{\label{sec:o-m}\texttt{--seeks-per-second}\texttt{-m}} + + Tells \texttt{btt} to output seeks per second information. Each device + being measured can have up to 2 files output: One with Q2Q information + and one with D2D seek information. Information on the output produced + can be found in section~\ref{sec:sps-spec}. + + \begin{quote} + \textbf{Note: This requires seek output to be selected -- see + section~\ref{sec:seek}.} + \end{quote} + +\subsection{\label{sec:o-M}\texttt{--dev-maps}/\texttt{-M}} + + Internal option, still under construction. + +\subsection{\label{sec:o-o}\texttt{--output-file}/\texttt{-o}} + + Normally \texttt{btt} sends the statistical output (covered in + section~\ref{sec:output-overview}) to standard out, if you specify + this option this data is redirected to the file specified. + +\subsection{\label{sec:o-p}\texttt{--per-io-dump}/\texttt{-p}} + + This option tells \texttt{btt} to generate the per IO dump file as + discussed in section~\ref{sec:per-io}. + +\subsection{\label{sec:o-P}\texttt{--per-io-tress}/\texttt{-P}} + +The \texttt{-P} option will generate a file that contains a list of all IO +"sequences" - showing only the Q, D \& C operation times. The D \& C +time values are separated from the Q time values with a vertical bar. + +\subsection{\label{sec:o-q}\texttt{--q2c-latencies}/\texttt{-q}} + + This option instructs \texttt{btt} to generate the Q2C latency file + discussed in section~\ref{sec:lat-q2c}. + +\subsection{\label{sec:o-Q}\texttt{--active-queue-depth}/\texttt{-Q}} + + This option tells \texttt{btt} to generate a data file (using the given + name as a base) which contains: A time stamp in the first column, + and then the number of \emph{active} requests issued to the device + driver. (The value is incremented when an \emph{issue} is performend, + and decremented when a \emph{complete} is performed. + +\subsection{\label{sec:o-r}\texttt{--no-remaps}/\texttt{-r}} + + Ignore remap traces; older kernels did not implement the full remap PDU. + +\subsection{\label{sec:o-s}\texttt{--seeks}/\texttt{-s}} + + This option instructs \texttt{btt} to generate the seek data file + discussed in section~\ref{sec:seek}. + +\subsection{\label{sec:o-S}\texttt{--iostat-interval}/\texttt{-S}} + + The normal \texttt{iostat} command allows one to specify the snapshot + interval, likewise, \texttt{btt} allows one to specify how many seconds + between its generation of snapshots of the data via this option. Details + about the iostat-like capabilities of \texttt{btt} may be found in + section~\ref{sec:iostat}. + +\subsection{\label{sec:o-tT}\texttt{--time-start}/\texttt{-t} and +\texttt{--time-end}/\texttt{T}} + + \begin{quote} + \emph{This \texttt{btt} capability is still under construction, results are + not always consistent at this point in time.} + \end{quote} + + These options allow one to dictate to \texttt{btt} when to start and stop + parsing of trace data in terms of seconds since the start of the run. The + trace chosen will be between the start time (or 0.0 if not + specified) and end time (or the end of the run) specified. + +\subsection{\label{sec:o-u}\texttt{--unplug-hist}/\texttt{-u}} + + This option instructs \texttt{btt} to generate a data file containing + histogram information for \emph{unplug} traces on a per device + basis. It shows how many times an unplug was hit with a specified + number of IOs released. There are 21 output values into the file, as + follows: + + \medskip + \begin{tabular}{ll} +\textbf{X value} & \textbf{Representing Counts} \\\hline +0 & 0\dots\/4 \\ +1 & 5\dots\/9 \\ +2 & 10\dots\/14 \\ +\dots & \dots\dots\\ +19 & 95\dots\/99 \\ +20 & 100+ \\ + \end{tabular} + + \medskip + The file name(s) generated use the text string passed as an argument for + the prefix, followed by the device identifier in \texttt{major,minor} + form, with a \texttt{.dat} extension (as an example, with \texttt{-u + up\_hist} specified on the command line: \texttt{up\_hist\_008,032.dat}. + +\subsection{\label{sec:o-V}\texttt{--version}/\texttt{-V}} + + Prints out the \texttt{btt} version, and exits. + +\subsection{\label{sec:o-v}\texttt{--verbose}/\texttt{-v}} + + While \texttt{btt} is processing data, it will put out periodic (1-second + granularity) values describing the progress it is making through the + input trace stream. The value describes how many traces have been + processed. At the end of the run, the overall number of traces, trace + rate (number of thousands of traces per second), and the real time for + trace processing and output are displayed. Example (note: the interim + trace counts are put out with carriage returns, hence, they overwrite + each time): + +\begin{verbatim} +# btt -i bp.bin -o btt -v +Sending range data to bttX.dat +Sending stats data to bttX.avg + 287857 t +1414173 t +1691581 t +... +4581291 traces @ 279.7 Ktps +16.379036+0.000005=16.379041 +\end{verbatim} + +\subsection{\label{sec:o-X}\texttt{--easy-parse-avgs}/\texttt{-X}} + + \emph{Some} of the data produced by default can also be shipped + simultaneously to another file in an easy to parse form. When + the \texttt{-o} option is selected (thus producing a file with a + \texttt{.avg} exentsion), \emph{and} the \texttt{-X} flag is present, + then \texttt{btt} will generate this file. + + The format is space-delimited values starting with a 3-character + \emph{record} indicator, then the device information (either major,minor + or the device name when \texttt{-M} is specified), and then a number of + fields representing data values. The following table shows the record + identifiers and the fields provided: + + \bigskip + \begin{tabular}{|l|l|}\hline + \textbf{Record} & \textbf{Description}\\\hline + \texttt{DMI} & Device Merge Information:\\ + & \#Q \#D Ratio BLKmin BLKavg BLKmax Total\\\hline + \texttt{QSK} & Device Q2Q Seek Information:\\ + & NSEEKS MEAN MEDIAN MODE N-MODE mode\ldots\\\hline + \texttt{DSK} & Device D2D Seek Information:\\ + & NSEEKS MEAN MEDIAN MODE N-MODE mode\ldots\\\hline + \texttt{PLG} & Plug Information:\\ + & \#Plugs \#TimerUnplugs \%TimeQPlugged\\\hline + \texttt{UPG} & Unplug Information:\\ + & IOsPerUnplug IOsPerUnplugTimeout\\\hline + \texttt{ARQ} & Active Requests at Q Information:\\ + & AvgReqs@Q\\\hline\hline + \texttt{Q2Q} & Queue-to-Queue times:\\ + \texttt{Q2G} & Queue-to-GetRequest times:\\ + \texttt{S2G} & Sleep-to-GetRequest times:\\ + \texttt{G2I} & GetRequest-to-Insert times:\\ + \texttt{Q2M} & Queue-to-Merge times:\\ + \texttt{I2D} & Insert-to-Issue times:\\ + \texttt{M2D} & Merge-to-Issue times:\\ + \texttt{D2C} & Issue-to-Complete times:\\ + \texttt{Q2C} & Queue-to-Complete times:\\ + & MIN AVG MAX N\\\hline + \end{tabular} + + \bigskip + A sample output file would look like: + + \begin{verbatim} +Q2Q 0.000000001 0.003511356 9.700000000 309906 +Q2G 0.000000001 0.774586535 805.300000000 106732 +S2G 0.000000001 0.072525952 0.370000000 578 +G2I 0.000000001 0.000001125 0.010000000 106732 +Q2M 0.000000001 0.730763626 751.820000000 204040 +I2D 0.000000001 1.270720538 612.880000000 106948 +M2D 0.000000001 0.992355230 428.930000000 203114 +D2C 0.000000001 0.008681311 137.020000000 307343 +Q2C 0.000000001 1.304370794 805.660000000 308921 +DMI 8,16 309907 106729 2.903681286 8 182 1024 19504768 +QSK 8,16 309907 167200.935561314 0 0 235708 +DSK 8,16 106729 433247.436563633 0 0 33974 +PLG 8,16 40824 382 0.008881420 +UPG 8,16 1.993361748 1.866492147 +ARQ 8,16 12.938165321 + \end{verbatim} + +\subsection{\label{sec:o-z}\texttt{--q2d-latencies}/\texttt{-l}} + + This option instructs \texttt{btt} to generate the Q2D latency file + discussed in section~\ref{sec:lat-q2d}. + +\newpage\section{\label{sec:bno_plot}bno\_plot.py} + +Included with the distribution is a simple 3D plotting utility based +upon the block numbers output when \texttt{-B} is specified (see +section~\ref{sec:o-B} for more details about the \texttt{-B option}). The +display will display \emph{each} IO generated, with the time (seconds) +along the X-axis, the block number (start) along the Y-axis and the +number of blocks transferred in the IO represented along the Z-axis. + +The script requires Python\footnote{\texttt{www.python.org}} and +gnuplot\footnote{\texttt{www.gnuplot.info}}, and will enter interactive +mode after the image is produced. In this interactive mode one can enter +gnuplot commands at the \texttt{'gnuplot>'} prompt, and/or can change +the viewpoint within the 3D image by \emph{left-click-hold} and moving +the mouse. A sample screen shot can be seen in figure~\ref{fig:bno_plot} on +page~\pageref{fig:bno_plot}. + +\subsection*{\texttt{bno\_plot.py} Command Line Options} + +\begin{quotation} +\begin{verbatim} + +$ bno_plot.py --help + +bno_plot.py + [ -h | --help ] + [ -K | --keys-below ] + [ -v | --verbose ] + [ <file...> ] + +Utilizes gnuplot to generate a 3D plot of the block number +output from btt. If no <files> are specified, it will +utilize all files generated after btt was run with -B +blknos (meaning: all files of the form blknos*[rw].dat). + +The -K option forces bno_plot.py to put the keys below the +graph, typically all keys for input files are put in the +upper right corner of the graph. If the number of devices +exceed 10, then bno_plot.py will automatically push the +keys under the graph. + +To exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' +prompt. +\end{verbatim} +\end{quotation} + +\begin{figure}[b] +\leavevmode\centering +\epsfig{file=bno_plot.eps,width=5.5in} +\caption{\label{fig:bno_plot}Sample \texttt{bno\_plot.py} Screen Shot} +\end{figure} + +\clearpage +\newpage\section{\label{sec:appendix}Sample \texttt{btt} +Output} + Here is a complete output file from a btt run, illustrating a lot of the + capabilities of btt. +\input{sample-btt-output.tex} + +\end{document} +\subsection{\label{sec:o-B}\texttt{--dump-blocknos}/\texttt{-B}} diff --git a/btt/doc/dhist.eps b/btt/doc/dhist.eps new file mode 100644 index 0000000..623741d --- /dev/null +++ b/btt/doc/dhist.eps @@ -0,0 +1,2513 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 0 0 799 635 +%%LanguageLevel: 2 +%%Creator: Grace-5.1.20 +%%CreationDate: Wed Feb 28 15:09:40 2007 +%%DocumentData: Clean8Bit +%%Orientation: Portrait +%%Title: Untitled +%%For: adb +%%DocumentNeededResources: (atend) +%%EndComments +%%BeginProlog +/m {moveto} def +/l {lineto} def +/s {stroke} def +/n {newpath} def +/c {closepath} def +/RL {rlineto} def +/SLW {setlinewidth} def +/GS {gsave} def +/GR {grestore} def +/SC {setcolor} def +/SGRY {setgray} def +/SRGB {setrgbcolor} def +/SD {setdash} def +/SLC {setlinecap} def +/SLJ {setlinejoin} def +/SCS {setcolorspace} def +/FFSF {findfont setfont} def +/CC {concat} def +/PXL {n m 0 0 RL s} def +/Color0 {1.0000 1.0000 1.0000} def +/Color1 {0.0000 0.0000 0.0000} def +/Color2 {1.0000 0.0000 0.0000} def +/Color3 {0.0000 1.0000 0.0000} def +/Color4 {0.0000 0.0000 1.0000} def +/Color5 {1.0000 1.0000 0.0000} def +/Color6 {0.7373 0.5608 0.5608} def +/Color7 {0.8627 0.8627 0.8627} def +/Color8 {0.5804 0.0000 0.8275} def +/Color9 {0.0000 1.0000 1.0000} def +/Color10 {1.0000 0.0000 1.0000} def +/Color11 {1.0000 0.6471 0.0000} def +/Color12 {0.4471 0.1294 0.7373} def +/Color13 {0.4039 0.0275 0.2824} def +/Color14 {0.2510 0.8784 0.8157} def +/Color15 {0.0000 0.5451 0.0000} def +/PTRN { + /pat_bits exch def + << + /PaintType 2 + /PatternType 1 /TilingType 1 + /BBox[0 0 16 16] + /XStep 16 /YStep 16 + /PaintProc { + pop + 16 16 true [-1 0 0 -1 16 16] pat_bits imagemask + } + >> + [0.0016 0 0 0.0016 0 0] + makepattern +} def +/Pattern0 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern1 {<ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff> PTRN} bind def +/Pattern2 {<eeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffff> PTRN} bind def +/Pattern3 {<eeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbb> PTRN} bind def +/Pattern4 {<5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa> PTRN} bind def +/Pattern5 {<1111444411114444111144441111444411114444111144441111444411114444> PTRN} bind def +/Pattern6 {<1111000044440000111100004444000011110000444400001111000044440000> PTRN} bind def +/Pattern7 {<1010000000000000010100000000000010100000000000000101000000000000> PTRN} bind def +/Pattern8 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern9 {<1e1e0f0f8787c3c3e1e1f0f078783c3c1e1e0f0f8787c3c3e1e1f0f078783c3c> PTRN} bind def +/Pattern10 {<7878f0f0e1e1c3c387870f0f1e1e3c3c7878f0f0e1e1c3c387870f0f1e1e3c3c> PTRN} bind def +/Pattern11 {<3333333333333333333333333333333333333333333333333333333333333333> PTRN} bind def +/Pattern12 {<ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000> PTRN} bind def +/Pattern13 {<8181424224241818181824244242818181814242242418181818242442428181> PTRN} bind def +/Pattern14 {<8080404020201010080804040202010180804040202010100808040402020101> PTRN} bind def +/Pattern15 {<0101020204040808101020204040808001010202040408081010202040408080> PTRN} bind def +/Pattern16 {<2222222222222222222222222222222222222222222222222222222222222222> PTRN} bind def +/Pattern17 {<0000ffff000000000000ffff000000000000ffff000000000000ffff00000000> PTRN} bind def +/Pattern18 {<2222ffff222222222222ffff222222222222ffff222222222222ffff22222222> PTRN} bind def +/Pattern19 {<ffffffff33333333ffffffff33333333ffffffff33333333ffffffff33333333> PTRN} bind def +/Pattern20 {<0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f00f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0> PTRN} bind def +/Pattern21 {<ff00ff00ff00ff00ff00ff00ff00ff0000ff00ff00ff00ff00ff00ff00ff00ff> PTRN} bind def +/Pattern22 {<8001800180018001800180018001ffffffff8001800180018001800180018001> PTRN} bind def +/Pattern23 {<c003c003c003c003c003c003ffffffffffffffffc003c003c003c003c003c003> PTRN} bind def +/Pattern24 {<040404040404ffff404040404040ffff040404040404ffff404040404040ffff> PTRN} bind def +/Pattern25 {<180018001800180018001800ffffffff001800180018001800180018ffffffff> PTRN} bind def +/Pattern26 {<1111b8b87c7c3a3a1111a3a3c7c78b8b1111b8b87c7c3a3a1111a3a3c7c78b8b> PTRN} bind def +/Pattern27 {<101010102828c7c70101010182827c7c101010102828c7c70101010182827c7c> PTRN} bind def +/Pattern28 {<1c1c121211112121c1c12121111112121c1c121211112121c1c1212111111212> PTRN} bind def +/Pattern29 {<3e3e414180808080e3e31414080808083e3e414180808080e3e3141408080808> PTRN} bind def +/Pattern30 {<4848888884848383848488884848383848488888848483838484888848483838> PTRN} bind def +/Pattern31 {<03030404080808080c0c12122121c0c003030404080808080c0c12122121c0c0> PTRN} bind def +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/EARC { + ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y translate + xrad yrad scale + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def +/TL { + /kcomp exch def + /linewidth exch def + /offset exch def + GS + 0 offset rmoveto + linewidth SLW + dup stringwidth exch kcomp add exch RL s + GR +} def +/KINIT +{ + /kvector exch def + /kid 0 def +} def +/KPROC +{ + pop pop + kvector kid get + 0 rmoveto + /kid 1 kid add def +} def +/DefEncoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /acute + /mu + /paragraph + /periodcentered + /cedilla + /onesuperior + /ordmasculine + /guillemotright + /onequarter + /onehalf + /threequarters + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /ydieresis +] def +%%EndProlog +%%BeginSetup +%%EndSetup +612.00 612.00 scale +n +0.0000 0.0000 m +0.0000 1.0000 l +1.2941 1.0000 l +1.2941 0.0000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +[0.0075 0.0045 ] 0 SD +0.0015 SLW +0 SLC +0 SLJ +n +0.1500 0.1500 m +1.1500 0.1500 l +s +n +0.1500 0.1825 m +1.1500 0.1825 l +s +n +0.1500 0.2151 m +1.1500 0.2151 l +s +n +0.1500 0.2476 m +1.1500 0.2476 l +s +n +0.1500 0.2801 m +1.1500 0.2801 l +s +n +0.1500 0.3127 m +1.1500 0.3127 l +s +n +0.1500 0.3452 m +1.1500 0.3452 l +s +n +0.1500 0.3777 m +1.1500 0.3777 l +s +n +0.1500 0.4103 m +1.1500 0.4103 l +s +n +0.1500 0.4428 m +1.1500 0.4428 l +s +n +0.1500 0.4753 m +1.1500 0.4753 l +s +n +0.1500 0.5079 m +1.1500 0.5079 l +s +n +0.1500 0.5404 m +1.1500 0.5404 l +s +n +0.1500 0.5729 m +1.1500 0.5729 l +s +n +0.1500 0.6055 m +1.1500 0.6055 l +s +n +0.1500 0.6380 m +1.1500 0.6380 l +s +n +0.1500 0.6705 m +1.1500 0.6705 l +s +n +0.1500 0.7031 m +1.1500 0.7031 l +s +n +0.1500 0.7356 m +1.1500 0.7356 l +s +n +0.1500 0.7681 m +1.1500 0.7681 l +s +n +0.1500 0.8007 m +1.1500 0.8007 l +s +n +0.1500 0.8332 m +1.1500 0.8332 l +s +n +0.1578 0.8362 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color1 SC +fill +[] 0 SD +0.0015 SLW +n 0.1578 0.8362 0.0033 0.0033 0 360 EARC s +n +0.1656 0.5982 0.0033 0.0033 0 360 EARC c +fill +n 0.1656 0.5982 0.0033 0.0033 0 360 EARC s +n +0.1734 0.5267 0.0033 0.0033 0 360 EARC c +fill +n 0.1734 0.5267 0.0033 0.0033 0 360 EARC s +n +0.1812 0.5134 0.0033 0.0033 0 360 EARC c +fill +n 0.1812 0.5134 0.0033 0.0033 0 360 EARC s +n +0.1891 0.5507 0.0033 0.0033 0 360 EARC c +fill +n 0.1891 0.5507 0.0033 0.0033 0 360 EARC s +n +0.1969 0.5503 0.0033 0.0033 0 360 EARC c +fill +n 0.1969 0.5503 0.0033 0.0033 0 360 EARC s +n +0.2047 0.5640 0.0033 0.0033 0 360 EARC c +fill +n 0.2047 0.5640 0.0033 0.0033 0 360 EARC s +n +0.2125 0.5805 0.0033 0.0033 0 360 EARC c +fill +n 0.2125 0.5805 0.0033 0.0033 0 360 EARC s +n +0.2203 0.5857 0.0033 0.0033 0 360 EARC c +fill +n 0.2203 0.5857 0.0033 0.0033 0 360 EARC s +n +0.2281 0.5876 0.0033 0.0033 0 360 EARC c +fill +n 0.2281 0.5876 0.0033 0.0033 0 360 EARC s +n +0.2359 0.5845 0.0033 0.0033 0 360 EARC c +fill +n 0.2359 0.5845 0.0033 0.0033 0 360 EARC s +n +0.2437 0.5805 0.0033 0.0033 0 360 EARC c +fill +n 0.2437 0.5805 0.0033 0.0033 0 360 EARC s +n +0.2516 0.5688 0.0033 0.0033 0 360 EARC c +fill +n 0.2516 0.5688 0.0033 0.0033 0 360 EARC s +n +0.2594 0.5528 0.0033 0.0033 0 360 EARC c +fill +n 0.2594 0.5528 0.0033 0.0033 0 360 EARC s +n +0.2672 0.5314 0.0033 0.0033 0 360 EARC c +fill +n 0.2672 0.5314 0.0033 0.0033 0 360 EARC s +n +0.2750 0.5132 0.0033 0.0033 0 360 EARC c +fill +n 0.2750 0.5132 0.0033 0.0033 0 360 EARC s +n +0.2828 0.4884 0.0033 0.0033 0 360 EARC c +fill +n 0.2828 0.4884 0.0033 0.0033 0 360 EARC s +n +0.2906 0.4625 0.0033 0.0033 0 360 EARC c +fill +n 0.2906 0.4625 0.0033 0.0033 0 360 EARC s +n +0.2984 0.4328 0.0033 0.0033 0 360 EARC c +fill +n 0.2984 0.4328 0.0033 0.0033 0 360 EARC s +n +0.3062 0.4179 0.0033 0.0033 0 360 EARC c +fill +n 0.3062 0.4179 0.0033 0.0033 0 360 EARC s +n +0.3141 0.3935 0.0033 0.0033 0 360 EARC c +fill +n 0.3141 0.3935 0.0033 0.0033 0 360 EARC s +n +0.3219 0.3816 0.0033 0.0033 0 360 EARC c +fill +n 0.3219 0.3816 0.0033 0.0033 0 360 EARC s +n +0.3297 0.3833 0.0033 0.0033 0 360 EARC c +fill +n 0.3297 0.3833 0.0033 0.0033 0 360 EARC s +n +0.3375 0.3823 0.0033 0.0033 0 360 EARC c +fill +n 0.3375 0.3823 0.0033 0.0033 0 360 EARC s +n +0.3453 0.3574 0.0033 0.0033 0 360 EARC c +fill +n 0.3453 0.3574 0.0033 0.0033 0 360 EARC s +n +0.3531 0.3345 0.0033 0.0033 0 360 EARC c +fill +n 0.3531 0.3345 0.0033 0.0033 0 360 EARC s +n +0.3609 0.3381 0.0033 0.0033 0 360 EARC c +fill +n 0.3609 0.3381 0.0033 0.0033 0 360 EARC s +n +0.3687 0.3647 0.0033 0.0033 0 360 EARC c +fill +n 0.3687 0.3647 0.0033 0.0033 0 360 EARC s +n +0.3766 0.3336 0.0033 0.0033 0 360 EARC c +fill +n 0.3766 0.3336 0.0033 0.0033 0 360 EARC s +n +0.3844 0.3372 0.0033 0.0033 0 360 EARC c +fill +n 0.3844 0.3372 0.0033 0.0033 0 360 EARC s +n +0.3922 0.3355 0.0033 0.0033 0 360 EARC c +fill +n 0.3922 0.3355 0.0033 0.0033 0 360 EARC s +n +0.4000 0.4158 0.0033 0.0033 0 360 EARC c +fill +n 0.4000 0.4158 0.0033 0.0033 0 360 EARC s +n +0.4078 0.3195 0.0033 0.0033 0 360 EARC c +fill +n 0.4078 0.3195 0.0033 0.0033 0 360 EARC s +n +0.4156 0.3182 0.0033 0.0033 0 360 EARC c +fill +n 0.4156 0.3182 0.0033 0.0033 0 360 EARC s +n +0.4234 0.3182 0.0033 0.0033 0 360 EARC c +fill +n 0.4234 0.3182 0.0033 0.0033 0 360 EARC s +n +0.4312 0.3501 0.0033 0.0033 0 360 EARC c +fill +n 0.4312 0.3501 0.0033 0.0033 0 360 EARC s +n +0.4391 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 0.4391 0.3011 0.0033 0.0033 0 360 EARC s +n +0.4469 0.3169 0.0033 0.0033 0 360 EARC c +fill +n 0.4469 0.3169 0.0033 0.0033 0 360 EARC s +n +0.4547 0.3096 0.0033 0.0033 0 360 EARC c +fill +n 0.4547 0.3096 0.0033 0.0033 0 360 EARC s +n +0.4625 0.3445 0.0033 0.0033 0 360 EARC c +fill +n 0.4625 0.3445 0.0033 0.0033 0 360 EARC s +n +0.4703 0.3080 0.0033 0.0033 0 360 EARC c +fill +n 0.4703 0.3080 0.0033 0.0033 0 360 EARC s +n +0.4781 0.3080 0.0033 0.0033 0 360 EARC c +fill +n 0.4781 0.3080 0.0033 0.0033 0 360 EARC s +n +0.4859 0.3169 0.0033 0.0033 0 360 EARC c +fill +n 0.4859 0.3169 0.0033 0.0033 0 360 EARC s +n +0.4937 0.3514 0.0033 0.0033 0 360 EARC c +fill +n 0.4937 0.3514 0.0033 0.0033 0 360 EARC s +n +0.5016 0.3169 0.0033 0.0033 0 360 EARC c +fill +n 0.5016 0.3169 0.0033 0.0033 0 360 EARC s +n +0.5094 0.2929 0.0033 0.0033 0 360 EARC c +fill +n 0.5094 0.2929 0.0033 0.0033 0 360 EARC s +n +0.5172 0.2992 0.0033 0.0033 0 360 EARC c +fill +n 0.5172 0.2992 0.0033 0.0033 0 360 EARC s +n +0.5250 0.3429 0.0033 0.0033 0 360 EARC c +fill +n 0.5250 0.3429 0.0033 0.0033 0 360 EARC s +n +0.5328 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.5328 0.2625 0.0033 0.0033 0 360 EARC s +n +0.5406 0.3080 0.0033 0.0033 0 360 EARC c +fill +n 0.5406 0.3080 0.0033 0.0033 0 360 EARC s +n +0.5484 0.3182 0.0033 0.0033 0 360 EARC c +fill +n 0.5484 0.3182 0.0033 0.0033 0 360 EARC s +n +0.5562 0.3372 0.0033 0.0033 0 360 EARC c +fill +n 0.5562 0.3372 0.0033 0.0033 0 360 EARC s +n +0.5641 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.5641 0.2951 0.0033 0.0033 0 360 EARC s +n +0.5719 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.5719 0.2951 0.0033 0.0033 0 360 EARC s +n +0.5797 0.2972 0.0033 0.0033 0 360 EARC c +fill +n 0.5797 0.2972 0.0033 0.0033 0 360 EARC s +n +0.5875 0.3327 0.0033 0.0033 0 360 EARC c +fill +n 0.5875 0.3327 0.0033 0.0033 0 360 EARC s +n +0.5953 0.2739 0.0033 0.0033 0 360 EARC c +fill +n 0.5953 0.2739 0.0033 0.0033 0 360 EARC s +n +0.6031 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.6031 0.3047 0.0033 0.0033 0 360 EARC s +n +0.6109 0.2992 0.0033 0.0033 0 360 EARC c +fill +n 0.6109 0.2992 0.0033 0.0033 0 360 EARC s +n +0.6187 0.3265 0.0033 0.0033 0 360 EARC c +fill +n 0.6187 0.3265 0.0033 0.0033 0 360 EARC s +n +0.6266 0.3029 0.0033 0.0033 0 360 EARC c +fill +n 0.6266 0.3029 0.0033 0.0033 0 360 EARC s +n +0.6344 0.2972 0.0033 0.0033 0 360 EARC c +fill +n 0.6344 0.2972 0.0033 0.0033 0 360 EARC s +n +0.6422 0.3064 0.0033 0.0033 0 360 EARC c +fill +n 0.6422 0.3064 0.0033 0.0033 0 360 EARC s +n +0.6500 0.3751 0.0033 0.0033 0 360 EARC c +fill +n 0.6500 0.3751 0.0033 0.0033 0 360 EARC s +n +0.6578 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.6578 0.2906 0.0033 0.0033 0 360 EARC s +n +0.6656 0.2739 0.0033 0.0033 0 360 EARC c +fill +n 0.6656 0.2739 0.0033 0.0033 0 360 EARC s +n +0.6734 0.2666 0.0033 0.0033 0 360 EARC c +fill +n 0.6734 0.2666 0.0033 0.0033 0 360 EARC s +n +0.6812 0.3155 0.0033 0.0033 0 360 EARC c +fill +n 0.6812 0.3155 0.0033 0.0033 0 360 EARC s +n +0.6891 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.6891 0.2951 0.0033 0.0033 0 360 EARC s +n +0.6969 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 0.6969 0.2882 0.0033 0.0033 0 360 EARC s +n +0.7047 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 0.7047 0.3011 0.0033 0.0033 0 360 EARC s +n +0.7125 0.3182 0.0033 0.0033 0 360 EARC c +fill +n 0.7125 0.3182 0.0033 0.0033 0 360 EARC s +n +0.7203 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.7203 0.2906 0.0033 0.0033 0 360 EARC s +n +0.7281 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.7281 0.2625 0.0033 0.0033 0 360 EARC s +n +0.7359 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.7359 0.2951 0.0033 0.0033 0 360 EARC s +n +0.7437 0.3080 0.0033 0.0033 0 360 EARC c +fill +n 0.7437 0.3080 0.0033 0.0033 0 360 EARC s +n +0.7516 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.7516 0.2801 0.0033 0.0033 0 360 EARC s +n +0.7594 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 0.7594 0.2771 0.0033 0.0033 0 360 EARC s +n +0.7672 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 0.7672 0.2882 0.0033 0.0033 0 360 EARC s +n +0.7750 0.3064 0.0033 0.0033 0 360 EARC c +fill +n 0.7750 0.3064 0.0033 0.0033 0 360 EARC s +n +0.7828 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.7828 0.2704 0.0033 0.0033 0 360 EARC s +n +0.7906 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 0.7906 0.2771 0.0033 0.0033 0 360 EARC s +n +0.7984 0.2739 0.0033 0.0033 0 360 EARC c +fill +n 0.7984 0.2739 0.0033 0.0033 0 360 EARC s +n +0.8062 0.3195 0.0033 0.0033 0 360 EARC c +fill +n 0.8062 0.3195 0.0033 0.0033 0 360 EARC s +n +0.8141 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.8141 0.2951 0.0033 0.0033 0 360 EARC s +n +0.8219 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.8219 0.2341 0.0033 0.0033 0 360 EARC s +n +0.8297 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.8297 0.2951 0.0033 0.0033 0 360 EARC s +n +0.8375 0.2929 0.0033 0.0033 0 360 EARC c +fill +n 0.8375 0.2929 0.0033 0.0033 0 360 EARC s +n +0.8453 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 0.8453 0.2771 0.0033 0.0033 0 360 EARC s +n +0.8531 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.8531 0.2476 0.0033 0.0033 0 360 EARC s +n +0.8609 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.8609 0.2625 0.0033 0.0033 0 360 EARC s +n +0.8687 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.8687 0.2906 0.0033 0.0033 0 360 EARC s +n +0.8766 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.8766 0.2581 0.0033 0.0033 0 360 EARC s +n +0.8844 0.2255 0.0033 0.0033 0 360 EARC c +fill +n 0.8844 0.2255 0.0033 0.0033 0 360 EARC s +n +0.8922 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.8922 0.2906 0.0033 0.0033 0 360 EARC s +n +0.9000 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 0.9000 0.3011 0.0033 0.0033 0 360 EARC s +n +0.9078 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.9078 0.2413 0.0033 0.0033 0 360 EARC s +n +0.9156 0.2531 0.0033 0.0033 0 360 EARC c +fill +n 0.9156 0.2531 0.0033 0.0033 0 360 EARC s +n +0.9234 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.9234 0.2704 0.0033 0.0033 0 360 EARC s +n +0.9312 0.3029 0.0033 0.0033 0 360 EARC c +fill +n 0.9312 0.3029 0.0033 0.0033 0 360 EARC s +n +0.9391 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.9391 0.2476 0.0033 0.0033 0 360 EARC s +n +0.9469 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.9469 0.2581 0.0033 0.0033 0 360 EARC s +n +0.9547 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.9547 0.2801 0.0033 0.0033 0 360 EARC s +n +0.9625 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 0.9625 0.2882 0.0033 0.0033 0 360 EARC s +n +0.9703 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.9703 0.2625 0.0033 0.0033 0 360 EARC s +n +0.9781 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.9781 0.2951 0.0033 0.0033 0 360 EARC s +n +0.9859 0.2972 0.0033 0.0033 0 360 EARC c +fill +n 0.9859 0.2972 0.0033 0.0033 0 360 EARC s +n +0.9937 0.3029 0.0033 0.0033 0 360 EARC c +fill +n 0.9937 0.3029 0.0033 0.0033 0 360 EARC s +n +1.0016 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 1.0016 0.2581 0.0033 0.0033 0 360 EARC s +n +1.0094 0.2666 0.0033 0.0033 0 360 EARC c +fill +n 1.0094 0.2666 0.0033 0.0033 0 360 EARC s +n +1.0172 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 1.0172 0.2906 0.0033 0.0033 0 360 EARC s +n +1.0250 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 1.0250 0.2951 0.0033 0.0033 0 360 EARC s +n +1.0328 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 1.0328 0.2704 0.0033 0.0033 0 360 EARC s +n +1.0406 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 1.0406 0.2625 0.0033 0.0033 0 360 EARC s +n +1.0484 0.3080 0.0033 0.0033 0 360 EARC c +fill +n 1.0484 0.3080 0.0033 0.0033 0 360 EARC s +n +1.0562 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 1.0562 0.2951 0.0033 0.0033 0 360 EARC s +n +1.0641 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 1.0641 0.2704 0.0033 0.0033 0 360 EARC s +n +1.0719 0.2992 0.0033 0.0033 0 360 EARC c +fill +n 1.0719 0.2992 0.0033 0.0033 0 360 EARC s +n +1.0797 0.3127 0.0033 0.0033 0 360 EARC c +fill +n 1.0797 0.3127 0.0033 0.0033 0 360 EARC s +n +1.0875 0.3398 0.0033 0.0033 0 360 EARC c +fill +n 1.0875 0.3398 0.0033 0.0033 0 360 EARC s +n +1.0953 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 1.0953 0.2801 0.0033 0.0033 0 360 EARC s +n +1.1031 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 1.1031 0.2413 0.0033 0.0033 0 360 EARC s +n +1.1109 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 1.1109 0.2801 0.0033 0.0033 0 360 EARC s +n +1.1187 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 1.1187 0.2882 0.0033 0.0033 0 360 EARC s +n +1.1266 0.2739 0.0033 0.0033 0 360 EARC c +fill +n 1.1266 0.2739 0.0033 0.0033 0 360 EARC s +n +1.1344 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 1.1344 0.2951 0.0033 0.0033 0 360 EARC s +n +1.1422 0.3096 0.0033 0.0033 0 360 EARC c +fill +n 1.1422 0.3096 0.0033 0.0033 0 360 EARC s +n +1.1500 0.5306 0.0033 0.0033 0 360 EARC c +fill +n 1.1500 0.5306 0.0033 0.0033 0 360 EARC s +n +0.1578 0.8316 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color2 SC +fill +n 0.1578 0.8316 0.0033 0.0033 0 360 EARC s +n +0.1656 0.5625 0.0033 0.0033 0 360 EARC c +fill +n 0.1656 0.5625 0.0033 0.0033 0 360 EARC s +n +0.1734 0.5294 0.0033 0.0033 0 360 EARC c +fill +n 0.1734 0.5294 0.0033 0.0033 0 360 EARC s +n +0.1812 0.5167 0.0033 0.0033 0 360 EARC c +fill +n 0.1812 0.5167 0.0033 0.0033 0 360 EARC s +n +0.1891 0.4866 0.0033 0.0033 0 360 EARC c +fill +n 0.1891 0.4866 0.0033 0.0033 0 360 EARC s +n +0.1969 0.4664 0.0033 0.0033 0 360 EARC c +fill +n 0.1969 0.4664 0.0033 0.0033 0 360 EARC s +n +0.2047 0.4573 0.0033 0.0033 0 360 EARC c +fill +n 0.2047 0.4573 0.0033 0.0033 0 360 EARC s +n +0.2125 0.4571 0.0033 0.0033 0 360 EARC c +fill +n 0.2125 0.4571 0.0033 0.0033 0 360 EARC s +n +0.2203 0.4405 0.0033 0.0033 0 360 EARC c +fill +n 0.2203 0.4405 0.0033 0.0033 0 360 EARC s +n +0.2281 0.4298 0.0033 0.0033 0 360 EARC c +fill +n 0.2281 0.4298 0.0033 0.0033 0 360 EARC s +n +0.2359 0.4243 0.0033 0.0033 0 360 EARC c +fill +n 0.2359 0.4243 0.0033 0.0033 0 360 EARC s +n +0.2437 0.4573 0.0033 0.0033 0 360 EARC c +fill +n 0.2437 0.4573 0.0033 0.0033 0 360 EARC s +n +0.2516 0.4078 0.0033 0.0033 0 360 EARC c +fill +n 0.2516 0.4078 0.0033 0.0033 0 360 EARC s +n +0.2594 0.3932 0.0033 0.0033 0 360 EARC c +fill +n 0.2594 0.3932 0.0033 0.0033 0 360 EARC s +n +0.2672 0.4001 0.0033 0.0033 0 360 EARC c +fill +n 0.2672 0.4001 0.0033 0.0033 0 360 EARC s +n +0.2750 0.4099 0.0033 0.0033 0 360 EARC c +fill +n 0.2750 0.4099 0.0033 0.0033 0 360 EARC s +n +0.2828 0.3932 0.0033 0.0033 0 360 EARC c +fill +n 0.2828 0.3932 0.0033 0.0033 0 360 EARC s +n +0.2906 0.3777 0.0033 0.0033 0 360 EARC c +fill +n 0.2906 0.3777 0.0033 0.0033 0 360 EARC s +n +0.2984 0.3735 0.0033 0.0033 0 360 EARC c +fill +n 0.2984 0.3735 0.0033 0.0033 0 360 EARC s +n +0.3062 0.3982 0.0033 0.0033 0 360 EARC c +fill +n 0.3062 0.3982 0.0033 0.0033 0 360 EARC s +n +0.3141 0.3921 0.0033 0.0033 0 360 EARC c +fill +n 0.3141 0.3921 0.0033 0.0033 0 360 EARC s +n +0.3219 0.3715 0.0033 0.0033 0 360 EARC c +fill +n 0.3219 0.3715 0.0033 0.0033 0 360 EARC s +n +0.3297 0.3858 0.0033 0.0033 0 360 EARC c +fill +n 0.3297 0.3858 0.0033 0.0033 0 360 EARC s +n +0.3375 0.3913 0.0033 0.0033 0 360 EARC c +fill +n 0.3375 0.3913 0.0033 0.0033 0 360 EARC s +n +0.3453 0.3715 0.0033 0.0033 0 360 EARC c +fill +n 0.3453 0.3715 0.0033 0.0033 0 360 EARC s +n +0.3531 0.3580 0.0033 0.0033 0 360 EARC c +fill +n 0.3531 0.3580 0.0033 0.0033 0 360 EARC s +n +0.3609 0.3539 0.0033 0.0033 0 360 EARC c +fill +n 0.3609 0.3539 0.0033 0.0033 0 360 EARC s +n +0.3687 0.3852 0.0033 0.0033 0 360 EARC c +fill +n 0.3687 0.3852 0.0033 0.0033 0 360 EARC s +n +0.3766 0.3514 0.0033 0.0033 0 360 EARC c +fill +n 0.3766 0.3514 0.0033 0.0033 0 360 EARC s +n +0.3844 0.3507 0.0033 0.0033 0 360 EARC c +fill +n 0.3844 0.3507 0.0033 0.0033 0 360 EARC s +n +0.3922 0.3520 0.0033 0.0033 0 360 EARC c +fill +n 0.3922 0.3520 0.0033 0.0033 0 360 EARC s +n +0.4000 0.3657 0.0033 0.0033 0 360 EARC c +fill +n 0.4000 0.3657 0.0033 0.0033 0 360 EARC s +n +0.4078 0.3363 0.0033 0.0033 0 360 EARC c +fill +n 0.4078 0.3363 0.0033 0.0033 0 360 EARC s +n +0.4156 0.3254 0.0033 0.0033 0 360 EARC c +fill +n 0.4156 0.3254 0.0033 0.0033 0 360 EARC s +n +0.4234 0.3287 0.0033 0.0033 0 360 EARC c +fill +n 0.4234 0.3287 0.0033 0.0033 0 360 EARC s +n +0.4312 0.3601 0.0033 0.0033 0 360 EARC c +fill +n 0.4312 0.3601 0.0033 0.0033 0 360 EARC s +n +0.4391 0.3389 0.0033 0.0033 0 360 EARC c +fill +n 0.4391 0.3389 0.0033 0.0033 0 360 EARC s +n +0.4469 0.3307 0.0033 0.0033 0 360 EARC c +fill +n 0.4469 0.3307 0.0033 0.0033 0 360 EARC s +n +0.4547 0.3422 0.0033 0.0033 0 360 EARC c +fill +n 0.4547 0.3422 0.0033 0.0033 0 360 EARC s +n +0.4625 0.3774 0.0033 0.0033 0 360 EARC c +fill +n 0.4625 0.3774 0.0033 0.0033 0 360 EARC s +n +0.4703 0.3345 0.0033 0.0033 0 360 EARC c +fill +n 0.4703 0.3345 0.0033 0.0033 0 360 EARC s +n +0.4781 0.3307 0.0033 0.0033 0 360 EARC c +fill +n 0.4781 0.3307 0.0033 0.0033 0 360 EARC s +n +0.4859 0.3336 0.0033 0.0033 0 360 EARC c +fill +n 0.4859 0.3336 0.0033 0.0033 0 360 EARC s +n +0.4937 0.3735 0.0033 0.0033 0 360 EARC c +fill +n 0.4937 0.3735 0.0033 0.0033 0 360 EARC s +n +0.5016 0.3096 0.0033 0.0033 0 360 EARC c +fill +n 0.5016 0.3096 0.0033 0.0033 0 360 EARC s +n +0.5094 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 0.5094 0.2882 0.0033 0.0033 0 360 EARC s +n +0.5172 0.3195 0.0033 0.0033 0 360 EARC c +fill +n 0.5172 0.3195 0.0033 0.0033 0 360 EARC s +n +0.5250 0.3526 0.0033 0.0033 0 360 EARC c +fill +n 0.5250 0.3526 0.0033 0.0033 0 360 EARC s +n +0.5328 0.3276 0.0033 0.0033 0 360 EARC c +fill +n 0.5328 0.3276 0.0033 0.0033 0 360 EARC s +n +0.5406 0.3141 0.0033 0.0033 0 360 EARC c +fill +n 0.5406 0.3141 0.0033 0.0033 0 360 EARC s +n +0.5484 0.3182 0.0033 0.0033 0 360 EARC c +fill +n 0.5484 0.3182 0.0033 0.0033 0 360 EARC s +n +0.5562 0.3507 0.0033 0.0033 0 360 EARC c +fill +n 0.5562 0.3507 0.0033 0.0033 0 360 EARC s +n +0.5641 0.3243 0.0033 0.0033 0 360 EARC c +fill +n 0.5641 0.3243 0.0033 0.0033 0 360 EARC s +n +0.5719 0.3141 0.0033 0.0033 0 360 EARC c +fill +n 0.5719 0.3141 0.0033 0.0033 0 360 EARC s +n +0.5797 0.3276 0.0033 0.0033 0 360 EARC c +fill +n 0.5797 0.3276 0.0033 0.0033 0 360 EARC s +n +0.5875 0.4070 0.0033 0.0033 0 360 EARC c +fill +n 0.5875 0.4070 0.0033 0.0033 0 360 EARC s +n +0.5953 0.3220 0.0033 0.0033 0 360 EARC c +fill +n 0.5953 0.3220 0.0033 0.0033 0 360 EARC s +n +0.6031 0.3207 0.0033 0.0033 0 360 EARC c +fill +n 0.6031 0.3207 0.0033 0.0033 0 360 EARC s +n +0.6109 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.6109 0.3047 0.0033 0.0033 0 360 EARC s +n +0.6187 0.3389 0.0033 0.0033 0 360 EARC c +fill +n 0.6187 0.3389 0.0033 0.0033 0 360 EARC s +n +0.6266 0.3096 0.0033 0.0033 0 360 EARC c +fill +n 0.6266 0.3096 0.0033 0.0033 0 360 EARC s +n +0.6344 0.3220 0.0033 0.0033 0 360 EARC c +fill +n 0.6344 0.3220 0.0033 0.0033 0 360 EARC s +n +0.6422 0.3155 0.0033 0.0033 0 360 EARC c +fill +n 0.6422 0.3155 0.0033 0.0033 0 360 EARC s +n +0.6500 0.3494 0.0033 0.0033 0 360 EARC c +fill +n 0.6500 0.3494 0.0033 0.0033 0 360 EARC s +n +0.6578 0.3141 0.0033 0.0033 0 360 EARC c +fill +n 0.6578 0.3141 0.0033 0.0033 0 360 EARC s +n +0.6656 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.6656 0.3047 0.0033 0.0033 0 360 EARC s +n +0.6734 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.6734 0.2906 0.0033 0.0033 0 360 EARC s +n +0.6812 0.3466 0.0033 0.0033 0 360 EARC c +fill +n 0.6812 0.3466 0.0033 0.0033 0 360 EARC s +n +0.6891 0.3064 0.0033 0.0033 0 360 EARC c +fill +n 0.6891 0.3064 0.0033 0.0033 0 360 EARC s +n +0.6969 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.6969 0.3047 0.0033 0.0033 0 360 EARC s +n +0.7047 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 0.7047 0.3011 0.0033 0.0033 0 360 EARC s +n +0.7125 0.3307 0.0033 0.0033 0 360 EARC c +fill +n 0.7125 0.3307 0.0033 0.0033 0 360 EARC s +n +0.7203 0.2929 0.0033 0.0033 0 360 EARC c +fill +n 0.7203 0.2929 0.0033 0.0033 0 360 EARC s +n +0.7281 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.7281 0.2704 0.0033 0.0033 0 360 EARC s +n +0.7359 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 0.7359 0.3011 0.0033 0.0033 0 360 EARC s +n +0.7437 0.3336 0.0033 0.0033 0 360 EARC c +fill +n 0.7437 0.3336 0.0033 0.0033 0 360 EARC s +n +0.7516 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.7516 0.3047 0.0033 0.0033 0 360 EARC s +n +0.7594 0.2531 0.0033 0.0033 0 360 EARC c +fill +n 0.7594 0.2531 0.0033 0.0033 0 360 EARC s +n +0.7672 0.2830 0.0033 0.0033 0 360 EARC c +fill +n 0.7672 0.2830 0.0033 0.0033 0 360 EARC s +n +0.7750 0.3526 0.0033 0.0033 0 360 EARC c +fill +n 0.7750 0.3526 0.0033 0.0033 0 360 EARC s +n +0.7828 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.7828 0.3047 0.0033 0.0033 0 360 EARC s +n +0.7906 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 0.7906 0.2771 0.0033 0.0033 0 360 EARC s +n +0.7984 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.7984 0.2906 0.0033 0.0033 0 360 EARC s +n +0.8062 0.3459 0.0033 0.0033 0 360 EARC c +fill +n 0.8062 0.3459 0.0033 0.0033 0 360 EARC s +n +0.8141 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 0.8141 0.2857 0.0033 0.0033 0 360 EARC s +n +0.8219 0.2992 0.0033 0.0033 0 360 EARC c +fill +n 0.8219 0.2992 0.0033 0.0033 0 360 EARC s +n +0.8297 0.2929 0.0033 0.0033 0 360 EARC c +fill +n 0.8297 0.2929 0.0033 0.0033 0 360 EARC s +n +0.8375 0.3231 0.0033 0.0033 0 360 EARC c +fill +n 0.8375 0.3231 0.0033 0.0033 0 360 EARC s +n +0.8453 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.8453 0.2951 0.0033 0.0033 0 360 EARC s +n +0.8531 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.8531 0.2951 0.0033 0.0033 0 360 EARC s +n +0.8609 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 0.8609 0.2857 0.0033 0.0033 0 360 EARC s +n +0.8687 0.3254 0.0033 0.0033 0 360 EARC c +fill +n 0.8687 0.3254 0.0033 0.0033 0 360 EARC s +n +0.8766 0.3029 0.0033 0.0033 0 360 EARC c +fill +n 0.8766 0.3029 0.0033 0.0033 0 360 EARC s +n +0.8844 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.8844 0.2801 0.0033 0.0033 0 360 EARC s +n +0.8922 0.3155 0.0033 0.0033 0 360 EARC c +fill +n 0.8922 0.3155 0.0033 0.0033 0 360 EARC s +n +0.9000 0.3557 0.0033 0.0033 0 360 EARC c +fill +n 0.9000 0.3557 0.0033 0.0033 0 360 EARC s +n +0.9078 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.9078 0.2625 0.0033 0.0033 0 360 EARC s +n +0.9156 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 0.9156 0.2771 0.0033 0.0033 0 360 EARC s +n +0.9234 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.9234 0.2906 0.0033 0.0033 0 360 EARC s +n +0.9312 0.3398 0.0033 0.0033 0 360 EARC c +fill +n 0.9312 0.3398 0.0033 0.0033 0 360 EARC s +n +0.9391 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.9391 0.2906 0.0033 0.0033 0 360 EARC s +n +0.9469 0.2666 0.0033 0.0033 0 360 EARC c +fill +n 0.9469 0.2666 0.0033 0.0033 0 360 EARC s +n +0.9547 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.9547 0.2951 0.0033 0.0033 0 360 EARC s +n +0.9625 0.3047 0.0033 0.0033 0 360 EARC c +fill +n 0.9625 0.3047 0.0033 0.0033 0 360 EARC s +n +0.9703 0.3080 0.0033 0.0033 0 360 EARC c +fill +n 0.9703 0.3080 0.0033 0.0033 0 360 EARC s +n +0.9781 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 0.9781 0.2882 0.0033 0.0033 0 360 EARC s +n +0.9859 0.3155 0.0033 0.0033 0 360 EARC c +fill +n 0.9859 0.3155 0.0033 0.0033 0 360 EARC s +n +0.9937 0.3254 0.0033 0.0033 0 360 EARC c +fill +n 0.9937 0.3254 0.0033 0.0033 0 360 EARC s +n +1.0016 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 1.0016 0.2882 0.0033 0.0033 0 360 EARC s +n +1.0094 0.2666 0.0033 0.0033 0 360 EARC c +fill +n 1.0094 0.2666 0.0033 0.0033 0 360 EARC s +n +1.0172 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 1.0172 0.2882 0.0033 0.0033 0 360 EARC s +n +1.0250 0.3706 0.0033 0.0033 0 360 EARC c +fill +n 1.0250 0.3706 0.0033 0.0033 0 360 EARC s +n +1.0328 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 1.0328 0.2951 0.0033 0.0033 0 360 EARC s +n +1.0406 0.2666 0.0033 0.0033 0 360 EARC c +fill +n 1.0406 0.2666 0.0033 0.0033 0 360 EARC s +n +1.0484 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 1.0484 0.2801 0.0033 0.0033 0 360 EARC s +n +1.0562 0.3195 0.0033 0.0033 0 360 EARC c +fill +n 1.0562 0.3195 0.0033 0.0033 0 360 EARC s +n +1.0641 0.2531 0.0033 0.0033 0 360 EARC c +fill +n 1.0641 0.2531 0.0033 0.0033 0 360 EARC s +n +1.0719 0.2666 0.0033 0.0033 0 360 EARC c +fill +n 1.0719 0.2666 0.0033 0.0033 0 360 EARC s +n +1.0797 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 1.0797 0.2951 0.0033 0.0033 0 360 EARC s +n +1.0875 0.3195 0.0033 0.0033 0 360 EARC c +fill +n 1.0875 0.3195 0.0033 0.0033 0 360 EARC s +n +1.0953 0.3689 0.0033 0.0033 0 360 EARC c +fill +n 1.0953 0.3689 0.0033 0.0033 0 360 EARC s +n +1.1031 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 1.1031 0.2882 0.0033 0.0033 0 360 EARC s +n +1.1109 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 1.1109 0.2801 0.0033 0.0033 0 360 EARC s +n +1.1187 0.3141 0.0033 0.0033 0 360 EARC c +fill +n 1.1187 0.3141 0.0033 0.0033 0 360 EARC s +n +1.1266 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 1.1266 0.2704 0.0033 0.0033 0 360 EARC s +n +1.1344 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 1.1344 0.2906 0.0033 0.0033 0 360 EARC s +n +1.1422 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 1.1422 0.2857 0.0033 0.0033 0 360 EARC s +n +1.1500 0.5504 0.0033 0.0033 0 360 EARC c +fill +n 1.1500 0.5504 0.0033 0.0033 0 360 EARC s +n +0.1578 0.8442 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color4 SC +fill +n 0.1578 0.8442 0.0033 0.0033 0 360 EARC s +n +0.1656 0.6034 0.0033 0.0033 0 360 EARC c +fill +n 0.1656 0.6034 0.0033 0.0033 0 360 EARC s +n +0.1734 0.5166 0.0033 0.0033 0 360 EARC c +fill +n 0.1734 0.5166 0.0033 0.0033 0 360 EARC s +n +0.1812 0.4847 0.0033 0.0033 0 360 EARC c +fill +n 0.1812 0.4847 0.0033 0.0033 0 360 EARC s +n +0.1891 0.5596 0.0033 0.0033 0 360 EARC c +fill +n 0.1891 0.5596 0.0033 0.0033 0 360 EARC s +n +0.1969 0.5532 0.0033 0.0033 0 360 EARC c +fill +n 0.1969 0.5532 0.0033 0.0033 0 360 EARC s +n +0.2047 0.5740 0.0033 0.0033 0 360 EARC c +fill +n 0.2047 0.5740 0.0033 0.0033 0 360 EARC s +n +0.2125 0.5921 0.0033 0.0033 0 360 EARC c +fill +n 0.2125 0.5921 0.0033 0.0033 0 360 EARC s +n +0.2203 0.6025 0.0033 0.0033 0 360 EARC c +fill +n 0.2203 0.6025 0.0033 0.0033 0 360 EARC s +n +0.2281 0.6048 0.0033 0.0033 0 360 EARC c +fill +n 0.2281 0.6048 0.0033 0.0033 0 360 EARC s +n +0.2359 0.5996 0.0033 0.0033 0 360 EARC c +fill +n 0.2359 0.5996 0.0033 0.0033 0 360 EARC s +n +0.2437 0.5923 0.0033 0.0033 0 360 EARC c +fill +n 0.2437 0.5923 0.0033 0.0033 0 360 EARC s +n +0.2516 0.5816 0.0033 0.0033 0 360 EARC c +fill +n 0.2516 0.5816 0.0033 0.0033 0 360 EARC s +n +0.2594 0.5600 0.0033 0.0033 0 360 EARC c +fill +n 0.2594 0.5600 0.0033 0.0033 0 360 EARC s +n +0.2672 0.5367 0.0033 0.0033 0 360 EARC c +fill +n 0.2672 0.5367 0.0033 0.0033 0 360 EARC s +n +0.2750 0.5154 0.0033 0.0033 0 360 EARC c +fill +n 0.2750 0.5154 0.0033 0.0033 0 360 EARC s +n +0.2828 0.4899 0.0033 0.0033 0 360 EARC c +fill +n 0.2828 0.4899 0.0033 0.0033 0 360 EARC s +n +0.2906 0.4724 0.0033 0.0033 0 360 EARC c +fill +n 0.2906 0.4724 0.0033 0.0033 0 360 EARC s +n +0.2984 0.4409 0.0033 0.0033 0 360 EARC c +fill +n 0.2984 0.4409 0.0033 0.0033 0 360 EARC s +n +0.3062 0.4129 0.0033 0.0033 0 360 EARC c +fill +n 0.3062 0.4129 0.0033 0.0033 0 360 EARC s +n +0.3141 0.3927 0.0033 0.0033 0 360 EARC c +fill +n 0.3141 0.3927 0.0033 0.0033 0 360 EARC s +n +0.3219 0.3466 0.0033 0.0033 0 360 EARC c +fill +n 0.3219 0.3466 0.0033 0.0033 0 360 EARC s +n +0.3297 0.3539 0.0033 0.0033 0 360 EARC c +fill +n 0.3297 0.3539 0.0033 0.0033 0 360 EARC s +n +0.3375 0.3445 0.0033 0.0033 0 360 EARC c +fill +n 0.3375 0.3445 0.0033 0.0033 0 360 EARC s +n +0.3453 0.3207 0.0033 0.0033 0 360 EARC c +fill +n 0.3453 0.3207 0.0033 0.0033 0 360 EARC s +n +0.3531 0.2972 0.0033 0.0033 0 360 EARC c +fill +n 0.3531 0.2972 0.0033 0.0033 0 360 EARC s +n +0.3609 0.2830 0.0033 0.0033 0 360 EARC c +fill +n 0.3609 0.2830 0.0033 0.0033 0 360 EARC s +n +0.3687 0.3141 0.0033 0.0033 0 360 EARC c +fill +n 0.3687 0.3141 0.0033 0.0033 0 360 EARC s +n +0.3766 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 0.3766 0.2857 0.0033 0.0033 0 360 EARC s +n +0.3844 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.3844 0.2476 0.0033 0.0033 0 360 EARC s +n +0.3922 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 0.3922 0.2771 0.0033 0.0033 0 360 EARC s +n +0.4000 0.3243 0.0033 0.0033 0 360 EARC c +fill +n 0.4000 0.3243 0.0033 0.0033 0 360 EARC s +n +0.4078 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.4078 0.2704 0.0033 0.0033 0 360 EARC s +n +0.4156 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.4156 0.2581 0.0033 0.0033 0 360 EARC s +n +0.4234 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.4234 0.2801 0.0033 0.0033 0 360 EARC s +n +0.4312 0.2929 0.0033 0.0033 0 360 EARC c +fill +n 0.4312 0.2929 0.0033 0.0033 0 360 EARC s +n +0.4391 0.2739 0.0033 0.0033 0 360 EARC c +fill +n 0.4391 0.2739 0.0033 0.0033 0 360 EARC s +n +0.4469 0.2531 0.0033 0.0033 0 360 EARC c +fill +n 0.4469 0.2531 0.0033 0.0033 0 360 EARC s +n +0.4547 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.4547 0.2704 0.0033 0.0033 0 360 EARC s +n +0.4625 0.2972 0.0033 0.0033 0 360 EARC c +fill +n 0.4625 0.2972 0.0033 0.0033 0 360 EARC s +n +0.4703 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.4703 0.2625 0.0033 0.0033 0 360 EARC s +n +0.4781 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.4781 0.2341 0.0033 0.0033 0 360 EARC s +n +0.4859 0.2531 0.0033 0.0033 0 360 EARC c +fill +n 0.4859 0.2531 0.0033 0.0033 0 360 EARC s +n +0.4937 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 0.4937 0.3011 0.0033 0.0033 0 360 EARC s +n +0.5016 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.5016 0.2413 0.0033 0.0033 0 360 EARC s +n +0.5094 0.2830 0.0033 0.0033 0 360 EARC c +fill +n 0.5094 0.2830 0.0033 0.0033 0 360 EARC s +n +0.5172 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.5172 0.2581 0.0033 0.0033 0 360 EARC s +n +0.5250 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.5250 0.2801 0.0033 0.0033 0 360 EARC s +n +0.5328 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.5328 0.2581 0.0033 0.0033 0 360 EARC s +n +0.5406 0.2255 0.0033 0.0033 0 360 EARC c +fill +n 0.5406 0.2255 0.0033 0.0033 0 360 EARC s +n +0.5484 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.5484 0.2413 0.0033 0.0033 0 360 EARC s +n +0.5562 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.5562 0.2704 0.0033 0.0033 0 360 EARC s +n +0.5641 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.5641 0.2704 0.0033 0.0033 0 360 EARC s +n +0.5719 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.5719 0.2413 0.0033 0.0033 0 360 EARC s +n +0.5797 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.5797 0.2581 0.0033 0.0033 0 360 EARC s +n +0.5875 0.3276 0.0033 0.0033 0 360 EARC c +fill +n 0.5875 0.3276 0.0033 0.0033 0 360 EARC s +n +0.5953 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.5953 0.2625 0.0033 0.0033 0 360 EARC s +n +0.6031 0.1825 0.0033 0.0033 0 360 EARC c +fill +n 0.6031 0.1825 0.0033 0.0033 0 360 EARC s +n +0.6109 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.6109 0.2341 0.0033 0.0033 0 360 EARC s +n +0.6187 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.6187 0.2801 0.0033 0.0033 0 360 EARC s +n +0.6266 0.2704 0.0033 0.0033 0 360 EARC c +fill +n 0.6266 0.2704 0.0033 0.0033 0 360 EARC s +n +0.6344 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.6344 0.2476 0.0033 0.0033 0 360 EARC s +n +0.6422 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.6422 0.2625 0.0033 0.0033 0 360 EARC s +n +0.6500 0.2739 0.0033 0.0033 0 360 EARC c +fill +n 0.6500 0.2739 0.0033 0.0033 0 360 EARC s +n +0.6578 0.2255 0.0033 0.0033 0 360 EARC c +fill +n 0.6578 0.2255 0.0033 0.0033 0 360 EARC s +n +0.6656 0.2255 0.0033 0.0033 0 360 EARC c +fill +n 0.6656 0.2255 0.0033 0.0033 0 360 EARC s +n +0.6734 0.2531 0.0033 0.0033 0 360 EARC c +fill +n 0.6734 0.2531 0.0033 0.0033 0 360 EARC s +n +0.6812 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 0.6812 0.2857 0.0033 0.0033 0 360 EARC s +n +0.6891 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.6891 0.2341 0.0033 0.0033 0 360 EARC s +n +0.6969 0.2151 0.0033 0.0033 0 360 EARC c +fill +n 0.6969 0.2151 0.0033 0.0033 0 360 EARC s +n +0.7047 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.7047 0.2413 0.0033 0.0033 0 360 EARC s +n +0.7125 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.7125 0.2801 0.0033 0.0033 0 360 EARC s +n +0.7203 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.7203 0.2413 0.0033 0.0033 0 360 EARC s +n +0.7359 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.7359 0.2341 0.0033 0.0033 0 360 EARC s +n +0.7437 0.2830 0.0033 0.0033 0 360 EARC c +fill +n 0.7437 0.2830 0.0033 0.0033 0 360 EARC s +n +0.7516 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.7516 0.2625 0.0033 0.0033 0 360 EARC s +n +0.7594 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.7594 0.2341 0.0033 0.0033 0 360 EARC s +n +0.7672 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.7672 0.2581 0.0033 0.0033 0 360 EARC s +n +0.7750 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.7750 0.2476 0.0033 0.0033 0 360 EARC s +n +0.7828 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.7828 0.2581 0.0033 0.0033 0 360 EARC s +n +0.7906 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.7906 0.2476 0.0033 0.0033 0 360 EARC s +n +0.7984 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.7984 0.2625 0.0033 0.0033 0 360 EARC s +n +0.8062 0.3112 0.0033 0.0033 0 360 EARC c +fill +n 0.8062 0.3112 0.0033 0.0033 0 360 EARC s +n +0.8141 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 0.8141 0.2413 0.0033 0.0033 0 360 EARC s +n +0.8219 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.8219 0.2341 0.0033 0.0033 0 360 EARC s +n +0.8297 0.2151 0.0033 0.0033 0 360 EARC c +fill +n 0.8297 0.2151 0.0033 0.0033 0 360 EARC s +n +0.8375 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.8375 0.2341 0.0033 0.0033 0 360 EARC s +n +0.8453 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.8453 0.2625 0.0033 0.0033 0 360 EARC s +n +0.8531 0.2151 0.0033 0.0033 0 360 EARC c +fill +n 0.8531 0.2151 0.0033 0.0033 0 360 EARC s +n +0.8609 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 0.8609 0.2581 0.0033 0.0033 0 360 EARC s +n +0.8687 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.8687 0.2801 0.0033 0.0033 0 360 EARC s +n +0.8766 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.8766 0.2476 0.0033 0.0033 0 360 EARC s +n +0.8844 0.1500 0.0033 0.0033 0 360 EARC c +fill +n 0.8844 0.1500 0.0033 0.0033 0 360 EARC s +n +0.8922 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.8922 0.2341 0.0033 0.0033 0 360 EARC s +n +0.9000 0.2906 0.0033 0.0033 0 360 EARC c +fill +n 0.9000 0.2906 0.0033 0.0033 0 360 EARC s +n +0.9078 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.9078 0.2476 0.0033 0.0033 0 360 EARC s +n +0.9156 0.1825 0.0033 0.0033 0 360 EARC c +fill +n 0.9156 0.1825 0.0033 0.0033 0 360 EARC s +n +0.9234 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 0.9234 0.2476 0.0033 0.0033 0 360 EARC s +n +0.9312 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 0.9312 0.2857 0.0033 0.0033 0 360 EARC s +n +0.9391 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 0.9391 0.2625 0.0033 0.0033 0 360 EARC s +n +0.9469 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.9469 0.2341 0.0033 0.0033 0 360 EARC s +n +0.9547 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.9547 0.2341 0.0033 0.0033 0 360 EARC s +n +0.9625 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 0.9625 0.2341 0.0033 0.0033 0 360 EARC s +n +0.9703 0.2801 0.0033 0.0033 0 360 EARC c +fill +n 0.9703 0.2801 0.0033 0.0033 0 360 EARC s +n +0.9781 0.2255 0.0033 0.0033 0 360 EARC c +fill +n 0.9781 0.2255 0.0033 0.0033 0 360 EARC s +n +0.9859 0.3112 0.0033 0.0033 0 360 EARC c +fill +n 0.9859 0.3112 0.0033 0.0033 0 360 EARC s +n +0.9937 0.2951 0.0033 0.0033 0 360 EARC c +fill +n 0.9937 0.2951 0.0033 0.0033 0 360 EARC s +n +1.0016 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 1.0016 0.2581 0.0033 0.0033 0 360 EARC s +n +1.0094 0.2151 0.0033 0.0033 0 360 EARC c +fill +n 1.0094 0.2151 0.0033 0.0033 0 360 EARC s +n +1.0172 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 1.0172 0.2625 0.0033 0.0033 0 360 EARC s +n +1.0250 0.3220 0.0033 0.0033 0 360 EARC c +fill +n 1.0250 0.3220 0.0033 0.0033 0 360 EARC s +n +1.0328 0.2625 0.0033 0.0033 0 360 EARC c +fill +n 1.0328 0.2625 0.0033 0.0033 0 360 EARC s +n +1.0406 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 1.0406 0.2581 0.0033 0.0033 0 360 EARC s +n +1.0484 0.2581 0.0033 0.0033 0 360 EARC c +fill +n 1.0484 0.2581 0.0033 0.0033 0 360 EARC s +n +1.0562 0.4060 0.0033 0.0033 0 360 EARC c +fill +n 1.0562 0.4060 0.0033 0.0033 0 360 EARC s +n +1.0641 0.3096 0.0033 0.0033 0 360 EARC c +fill +n 1.0641 0.3096 0.0033 0.0033 0 360 EARC s +n +1.0719 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 1.0719 0.2413 0.0033 0.0033 0 360 EARC s +n +1.0797 0.3011 0.0033 0.0033 0 360 EARC c +fill +n 1.0797 0.3011 0.0033 0.0033 0 360 EARC s +n +1.0875 0.2771 0.0033 0.0033 0 360 EARC c +fill +n 1.0875 0.2771 0.0033 0.0033 0 360 EARC s +n +1.0953 0.3265 0.0033 0.0033 0 360 EARC c +fill +n 1.0953 0.3265 0.0033 0.0033 0 360 EARC s +n +1.1031 0.2413 0.0033 0.0033 0 360 EARC c +fill +n 1.1031 0.2413 0.0033 0.0033 0 360 EARC s +n +1.1109 0.2857 0.0033 0.0033 0 360 EARC c +fill +n 1.1109 0.2857 0.0033 0.0033 0 360 EARC s +n +1.1187 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 1.1187 0.2882 0.0033 0.0033 0 360 EARC s +n +1.1266 0.2476 0.0033 0.0033 0 360 EARC c +fill +n 1.1266 0.2476 0.0033 0.0033 0 360 EARC s +n +1.1344 0.2341 0.0033 0.0033 0 360 EARC c +fill +n 1.1344 0.2341 0.0033 0.0033 0 360 EARC s +n +1.1422 0.2882 0.0033 0.0033 0 360 EARC c +fill +n 1.1422 0.2882 0.0033 0.0033 0 360 EARC s +n +1.1500 0.5349 0.0033 0.0033 0 360 EARC c +fill +n 1.1500 0.5349 0.0033 0.0033 0 360 EARC s +/Times-Roman findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font32 exch definefont pop +/Font32 FFSF +[/DeviceRGB] SCS +Color6 SC +0.1447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.2015 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(64) show +GR +/Font32 FFSF +0.2589 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(128) show +GR +/Font32 FFSF +0.3210 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(192) show +GR +/Font32 FFSF +0.3835 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(256) show +GR +/Font32 FFSF +0.4460 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(320) show +GR +/Font32 FFSF +0.5085 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(384) show +GR +/Font32 FFSF +0.5714 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(448) show +GR +/Font32 FFSF +0.6335 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(512) show +GR +/Font32 FFSF +0.6960 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(576) show +GR +/Font32 FFSF +0.7585 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(640) show +GR +/Font32 FFSF +0.8210 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(704) show +GR +/Font32 FFSF +0.8839 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(768) show +GR +/Font32 FFSF +0.9460 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(832) show +GR +/Font32 FFSF +1.0085 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(896) show +GR +/Font32 FFSF +1.0710 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(960) show +GR +/Font32 FFSF +1.1278 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1024) show +GR +/Font32 FFSF +0.5720 0.0951 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(Blocks per IO) show +GR +/Font32 FFSF +0.1310 0.1424 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1) show +GR +/Font32 FFSF +1.1600 0.1424 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1) show +GR +/Font32 FFSF +0.1294 0.1749 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2) show +GR +/Font32 FFSF +1.1600 0.1749 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2) show +GR +/Font32 FFSF +0.1294 0.2074 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4) show +GR +/Font32 FFSF +1.1600 0.2074 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4) show +GR +/Font32 FFSF +0.1302 0.2401 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8) show +GR +/Font32 FFSF +1.1600 0.2401 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8) show +GR +/Font32 FFSF +0.1180 0.2727 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16) show +GR +/Font32 FFSF +1.1600 0.2727 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16) show +GR +/Font32 FFSF +0.1180 0.3052 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32) show +GR +/Font32 FFSF +1.1600 0.3052 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32) show +GR +/Font32 FFSF +0.1180 0.3377 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(64) show +GR +/Font32 FFSF +1.1600 0.3377 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(64) show +GR +/Font32 FFSF +0.1078 0.3703 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(128) show +GR +/Font32 FFSF +1.1600 0.3703 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(128) show +GR +/Font32 FFSF +0.1071 0.4028 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(256) show +GR +/Font32 FFSF +1.1600 0.4028 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(256) show +GR +/Font32 FFSF +0.1071 0.4353 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(512) show +GR +/Font32 FFSF +1.1600 0.4353 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(512) show +GR +/Font32 FFSF +0.0957 0.4679 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1024) show +GR +/Font32 FFSF +1.1600 0.4679 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1024) show +GR +/Font32 FFSF +0.0965 0.5004 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2048) show +GR +/Font32 FFSF +1.1600 0.5004 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2048) show +GR +/Font32 FFSF +0.0957 0.5329 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4096) show +GR +/Font32 FFSF +1.1600 0.5329 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4096) show +GR +/Font32 FFSF +0.0957 0.5655 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8192) show +GR +/Font32 FFSF +1.1600 0.5655 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8192) show +GR +/Font32 FFSF +0.0847 0.5980 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16384) show +GR +/Font32 FFSF +1.1600 0.5980 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16384) show +GR +/Font32 FFSF +0.0855 0.6305 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32768) show +GR +/Font32 FFSF +1.1600 0.6305 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32768) show +GR +/Font32 FFSF +0.0847 0.6631 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(65536) show +GR +/Font32 FFSF +1.1600 0.6631 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(65536) show +GR +/Font32 FFSF +0.0733 0.6956 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(131072) show +GR +/Font32 FFSF +1.1600 0.6956 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(131072) show +GR +/Font32 FFSF +0.0733 0.7281 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(262144) show +GR +/Font32 FFSF +1.1600 0.7281 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(262144) show +GR +/Font32 FFSF +0.0741 0.7607 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(524288) show +GR +/Font32 FFSF +1.1600 0.7607 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(524288) show +GR +/Font32 FFSF +0.0624 0.7932 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1048576) show +GR +/Font32 FFSF +1.1600 0.7932 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1048576) show +GR +/Font32 FFSF +0.0624 0.8257 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2097152) show +GR +/Font32 FFSF +1.1600 0.8257 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2097152) show +GR +/Font32 FFSF +0.0461 0.3829 m +GS +[0.0000 0.0280 -0.0280 0.0000 0 0] CC +(Number of IOS \(log\)) show +GR +n +0.1500 0.1500 m +0.1500 0.8500 l +1.1500 0.8500 l +1.1500 0.1500 l +0.1500 0.1500 l +c +s +n +0.7000 0.8000 m +0.7000 0.7035 l +0.9060 0.7035 l +0.9060 0.8000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color1 SC +n +0.7000 0.8000 m +0.7000 0.7035 l +0.9060 0.7035 l +0.9060 0.8000 l +0.7000 0.8000 l +c +s +/Font32 FFSF +0.7650 0.7747 m +GS +[0.0221 0.0000 0.0000 0.0221 0 0] CC +(2.6.20) show +GR +n +0.7300 0.7822 0.0033 0.0033 0 360 EARC c +fill +n 0.7300 0.7822 0.0033 0.0033 0 360 EARC s +/Font32 FFSF +0.7650 0.7490 m +GS +[0.0221 0.0000 0.0000 0.0221 0 0] CC +(2.6.20-plug) show +GR +n +0.7300 0.7541 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color2 SC +fill +n 0.7300 0.7541 0.0033 0.0033 0 360 EARC s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.7650 0.7186 m +GS +[0.0221 0.0000 0.0000 0.0221 0 0] CC +(2.6.20-plug-np) show +GR +n +0.7300 0.7237 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color4 SC +fill +n 0.7300 0.7237 0.0033 0.0033 0 360 EARC s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.3484 0.9190 m +GS +[0.0420 0.0000 0.0000 0.0420 0 0] CC +(D Histogram Chart - AIM7 FServer) show +GR +/Times-Italic findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font31 exch definefont pop +/Font31 FFSF +0.3727 0.8759 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(4-way IA64 + 4xMSA1000 \(w/ 12 disks per MSA\)) show +GR +%%Trailer +%%DocumentNeededResources: font Times-Italic +%%+ font Times-Roman +%%EOF diff --git a/btt/doc/qhist.eps b/btt/doc/qhist.eps new file mode 100644 index 0000000..8f45674 --- /dev/null +++ b/btt/doc/qhist.eps @@ -0,0 +1,1289 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 0 0 799 635 +%%LanguageLevel: 2 +%%Creator: Grace-5.1.20 +%%CreationDate: Wed Feb 28 15:09:40 2007 +%%DocumentData: Clean8Bit +%%Orientation: Portrait +%%Title: Untitled +%%For: adb +%%DocumentNeededResources: (atend) +%%EndComments +%%BeginProlog +/m {moveto} def +/l {lineto} def +/s {stroke} def +/n {newpath} def +/c {closepath} def +/RL {rlineto} def +/SLW {setlinewidth} def +/GS {gsave} def +/GR {grestore} def +/SC {setcolor} def +/SGRY {setgray} def +/SRGB {setrgbcolor} def +/SD {setdash} def +/SLC {setlinecap} def +/SLJ {setlinejoin} def +/SCS {setcolorspace} def +/FFSF {findfont setfont} def +/CC {concat} def +/PXL {n m 0 0 RL s} def +/Color0 {1.0000 1.0000 1.0000} def +/Color1 {0.0000 0.0000 0.0000} def +/Color2 {1.0000 0.0000 0.0000} def +/Color3 {0.0000 1.0000 0.0000} def +/Color4 {0.0000 0.0000 1.0000} def +/Color5 {1.0000 1.0000 0.0000} def +/Color6 {0.7373 0.5608 0.5608} def +/Color7 {0.8627 0.8627 0.8627} def +/Color8 {0.5804 0.0000 0.8275} def +/Color9 {0.0000 1.0000 1.0000} def +/Color10 {1.0000 0.0000 1.0000} def +/Color11 {1.0000 0.6471 0.0000} def +/Color12 {0.4471 0.1294 0.7373} def +/Color13 {0.4039 0.0275 0.2824} def +/Color14 {0.2510 0.8784 0.8157} def +/Color15 {0.0000 0.5451 0.0000} def +/PTRN { + /pat_bits exch def + << + /PaintType 2 + /PatternType 1 /TilingType 1 + /BBox[0 0 16 16] + /XStep 16 /YStep 16 + /PaintProc { + pop + 16 16 true [-1 0 0 -1 16 16] pat_bits imagemask + } + >> + [0.0016 0 0 0.0016 0 0] + makepattern +} def +/Pattern0 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern1 {<ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff> PTRN} bind def +/Pattern2 {<eeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffff> PTRN} bind def +/Pattern3 {<eeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbb> PTRN} bind def +/Pattern4 {<5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa> PTRN} bind def +/Pattern5 {<1111444411114444111144441111444411114444111144441111444411114444> PTRN} bind def +/Pattern6 {<1111000044440000111100004444000011110000444400001111000044440000> PTRN} bind def +/Pattern7 {<1010000000000000010100000000000010100000000000000101000000000000> PTRN} bind def +/Pattern8 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern9 {<1e1e0f0f8787c3c3e1e1f0f078783c3c1e1e0f0f8787c3c3e1e1f0f078783c3c> PTRN} bind def +/Pattern10 {<7878f0f0e1e1c3c387870f0f1e1e3c3c7878f0f0e1e1c3c387870f0f1e1e3c3c> PTRN} bind def +/Pattern11 {<3333333333333333333333333333333333333333333333333333333333333333> PTRN} bind def +/Pattern12 {<ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000> PTRN} bind def +/Pattern13 {<8181424224241818181824244242818181814242242418181818242442428181> PTRN} bind def +/Pattern14 {<8080404020201010080804040202010180804040202010100808040402020101> PTRN} bind def +/Pattern15 {<0101020204040808101020204040808001010202040408081010202040408080> PTRN} bind def +/Pattern16 {<2222222222222222222222222222222222222222222222222222222222222222> PTRN} bind def +/Pattern17 {<0000ffff000000000000ffff000000000000ffff000000000000ffff00000000> PTRN} bind def +/Pattern18 {<2222ffff222222222222ffff222222222222ffff222222222222ffff22222222> PTRN} bind def +/Pattern19 {<ffffffff33333333ffffffff33333333ffffffff33333333ffffffff33333333> PTRN} bind def +/Pattern20 {<0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f00f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0> PTRN} bind def +/Pattern21 {<ff00ff00ff00ff00ff00ff00ff00ff0000ff00ff00ff00ff00ff00ff00ff00ff> PTRN} bind def +/Pattern22 {<8001800180018001800180018001ffffffff8001800180018001800180018001> PTRN} bind def +/Pattern23 {<c003c003c003c003c003c003ffffffffffffffffc003c003c003c003c003c003> PTRN} bind def +/Pattern24 {<040404040404ffff404040404040ffff040404040404ffff404040404040ffff> PTRN} bind def +/Pattern25 {<180018001800180018001800ffffffff001800180018001800180018ffffffff> PTRN} bind def +/Pattern26 {<1111b8b87c7c3a3a1111a3a3c7c78b8b1111b8b87c7c3a3a1111a3a3c7c78b8b> PTRN} bind def +/Pattern27 {<101010102828c7c70101010182827c7c101010102828c7c70101010182827c7c> PTRN} bind def +/Pattern28 {<1c1c121211112121c1c12121111112121c1c121211112121c1c1212111111212> PTRN} bind def +/Pattern29 {<3e3e414180808080e3e31414080808083e3e414180808080e3e3141408080808> PTRN} bind def +/Pattern30 {<4848888884848383848488884848383848488888848483838484888848483838> PTRN} bind def +/Pattern31 {<03030404080808080c0c12122121c0c003030404080808080c0c12122121c0c0> PTRN} bind def +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/EARC { + ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y translate + xrad yrad scale + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def +/TL { + /kcomp exch def + /linewidth exch def + /offset exch def + GS + 0 offset rmoveto + linewidth SLW + dup stringwidth exch kcomp add exch RL s + GR +} def +/KINIT +{ + /kvector exch def + /kid 0 def +} def +/KPROC +{ + pop pop + kvector kid get + 0 rmoveto + /kid 1 kid add def +} def +/DefEncoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /acute + /mu + /paragraph + /periodcentered + /cedilla + /onesuperior + /ordmasculine + /guillemotright + /onequarter + /onehalf + /threequarters + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /ydieresis +] def +%%EndProlog +%%BeginSetup +%%EndSetup +612.00 612.00 scale +n +0.0000 0.0000 m +0.0000 1.0000 l +1.2941 1.0000 l +1.2941 0.0000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +[0.0075 0.0045 ] 0 SD +0.0015 SLW +0 SLC +0 SLJ +n +0.1500 0.1500 m +1.1500 0.1500 l +s +n +0.1500 0.1805 m +1.1500 0.1805 l +s +n +0.1500 0.2111 m +1.1500 0.2111 l +s +n +0.1500 0.2416 m +1.1500 0.2416 l +s +n +0.1500 0.2721 m +1.1500 0.2721 l +s +n +0.1500 0.3026 m +1.1500 0.3026 l +s +n +0.1500 0.3332 m +1.1500 0.3332 l +s +n +0.1500 0.3637 m +1.1500 0.3637 l +s +n +0.1500 0.3942 m +1.1500 0.3942 l +s +n +0.1500 0.4247 m +1.1500 0.4247 l +s +n +0.1500 0.4553 m +1.1500 0.4553 l +s +n +0.1500 0.4858 m +1.1500 0.4858 l +s +n +0.1500 0.5163 m +1.1500 0.5163 l +s +n +0.1500 0.5468 m +1.1500 0.5468 l +s +n +0.1500 0.5774 m +1.1500 0.5774 l +s +n +0.1500 0.6079 m +1.1500 0.6079 l +s +n +0.1500 0.6384 m +1.1500 0.6384 l +s +n +0.1500 0.6689 m +1.1500 0.6689 l +s +n +0.1500 0.6995 m +1.1500 0.6995 l +s +n +0.1500 0.7300 m +1.1500 0.7300 l +s +n +0.1500 0.7605 m +1.1500 0.7605 l +s +n +0.1500 0.7910 m +1.1500 0.7910 l +s +n +0.1500 0.8216 m +1.1500 0.8216 l +s +n +0.1578 0.8176 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color1 SC +fill +[] 0 SD +0.0015 SLW +n 0.1578 0.8176 0.0033 0.0033 0 360 EARC s +n +0.1734 0.2357 0.0033 0.0033 0 360 EARC c +fill +n 0.1734 0.2357 0.0033 0.0033 0 360 EARC s +n +0.1812 0.3644 0.0033 0.0033 0 360 EARC c +fill +n 0.1812 0.3644 0.0033 0.0033 0 360 EARC s +n +0.1891 0.1500 0.0033 0.0033 0 360 EARC c +fill +n 0.1891 0.1500 0.0033 0.0033 0 360 EARC s +n +0.2125 0.3012 0.0033 0.0033 0 360 EARC c +fill +n 0.2125 0.3012 0.0033 0.0033 0 360 EARC s +n +0.2437 0.3040 0.0033 0.0033 0 360 EARC c +fill +n 0.2437 0.3040 0.0033 0.0033 0 360 EARC s +n +0.2516 0.2209 0.0033 0.0033 0 360 EARC c +fill +n 0.2516 0.2209 0.0033 0.0033 0 360 EARC s +n +0.2750 0.2416 0.0033 0.0033 0 360 EARC c +fill +n 0.2750 0.2416 0.0033 0.0033 0 360 EARC s +n +0.3062 0.2514 0.0033 0.0033 0 360 EARC c +fill +n 0.3062 0.2514 0.0033 0.0033 0 360 EARC s +n +0.3375 0.2773 0.0033 0.0033 0 360 EARC c +fill +n 0.3375 0.2773 0.0033 0.0033 0 360 EARC s +n +0.3687 0.2289 0.0033 0.0033 0 360 EARC c +fill +n 0.3687 0.2289 0.0033 0.0033 0 360 EARC s +n +0.4000 0.4140 0.0033 0.0033 0 360 EARC c +fill +n 0.4000 0.4140 0.0033 0.0033 0 360 EARC s +n +0.1578 0.8079 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color2 SC +fill +n 0.1578 0.8079 0.0033 0.0033 0 360 EARC s +n +0.1578 0.8245 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color4 SC +fill +n 0.1578 0.8245 0.0033 0.0033 0 360 EARC s +n +0.1734 0.1805 0.0033 0.0033 0 360 EARC c +fill +n 0.1734 0.1805 0.0033 0.0033 0 360 EARC s +n +0.1812 0.2773 0.0033 0.0033 0 360 EARC c +fill +n 0.1812 0.2773 0.0033 0.0033 0 360 EARC s +n +0.2125 0.2594 0.0033 0.0033 0 360 EARC c +fill +n 0.2125 0.2594 0.0033 0.0033 0 360 EARC s +n +0.2437 0.2111 0.0033 0.0033 0 360 EARC c +fill +n 0.2437 0.2111 0.0033 0.0033 0 360 EARC s +n +0.2516 0.1500 0.0033 0.0033 0 360 EARC c +fill +n 0.2516 0.1500 0.0033 0.0033 0 360 EARC s +n +0.2750 0.1984 0.0033 0.0033 0 360 EARC c +fill +n 0.2750 0.1984 0.0033 0.0033 0 360 EARC s +n +0.3062 0.1500 0.0033 0.0033 0 360 EARC c +fill +n 0.3062 0.1500 0.0033 0.0033 0 360 EARC s +n +0.3375 0.2594 0.0033 0.0033 0 360 EARC c +fill +n 0.3375 0.2594 0.0033 0.0033 0 360 EARC s +n +0.4000 0.2935 0.0033 0.0033 0 360 EARC c +fill +n 0.4000 0.2935 0.0033 0.0033 0 360 EARC s +/Times-Roman findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font32 exch definefont pop +/Font32 FFSF +[/DeviceRGB] SCS +Color6 SC +0.1447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.2015 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(64) show +GR +/Font32 FFSF +0.2589 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(128) show +GR +/Font32 FFSF +0.3210 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(192) show +GR +/Font32 FFSF +0.3835 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(256) show +GR +/Font32 FFSF +0.4460 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(320) show +GR +/Font32 FFSF +0.5085 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(384) show +GR +/Font32 FFSF +0.5714 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(448) show +GR +/Font32 FFSF +0.6335 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(512) show +GR +/Font32 FFSF +0.6960 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(576) show +GR +/Font32 FFSF +0.7585 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(640) show +GR +/Font32 FFSF +0.8210 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(704) show +GR +/Font32 FFSF +0.8839 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(768) show +GR +/Font32 FFSF +0.9460 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(832) show +GR +/Font32 FFSF +1.0085 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(896) show +GR +/Font32 FFSF +1.0710 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(960) show +GR +/Font32 FFSF +1.1278 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1024) show +GR +/Font32 FFSF +0.5720 0.0951 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(Blocks per IO) show +GR +[/DeviceRGB] SCS +Color1 SC +n +0.1500 0.1500 m +0.1500 0.8500 l +s +n +1.1500 0.1500 m +1.1500 0.8500 l +s +[/DeviceRGB] SCS +Color6 SC +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1500 m +0.1700 0.1500 l +s +n +1.1500 0.1500 m +1.1300 0.1500 l +s +n +0.1500 0.1805 m +0.1700 0.1805 l +s +n +1.1500 0.1805 m +1.1300 0.1805 l +s +n +0.1500 0.2111 m +0.1700 0.2111 l +s +n +1.1500 0.2111 m +1.1300 0.2111 l +s +n +0.1500 0.2416 m +0.1700 0.2416 l +s +n +1.1500 0.2416 m +1.1300 0.2416 l +s +n +0.1500 0.2721 m +0.1700 0.2721 l +s +n +1.1500 0.2721 m +1.1300 0.2721 l +s +n +0.1500 0.3026 m +0.1700 0.3026 l +s +n +1.1500 0.3026 m +1.1300 0.3026 l +s +n +0.1500 0.3332 m +0.1700 0.3332 l +s +n +1.1500 0.3332 m +1.1300 0.3332 l +s +n +0.1500 0.3637 m +0.1700 0.3637 l +s +n +1.1500 0.3637 m +1.1300 0.3637 l +s +n +0.1500 0.3942 m +0.1700 0.3942 l +s +n +1.1500 0.3942 m +1.1300 0.3942 l +s +n +0.1500 0.4247 m +0.1700 0.4247 l +s +n +1.1500 0.4247 m +1.1300 0.4247 l +s +n +0.1500 0.4553 m +0.1700 0.4553 l +s +n +1.1500 0.4553 m +1.1300 0.4553 l +s +n +0.1500 0.4858 m +0.1700 0.4858 l +s +n +1.1500 0.4858 m +1.1300 0.4858 l +s +n +0.1500 0.5163 m +0.1700 0.5163 l +s +n +1.1500 0.5163 m +1.1300 0.5163 l +s +n +0.1500 0.5468 m +0.1700 0.5468 l +s +n +1.1500 0.5468 m +1.1300 0.5468 l +s +n +0.1500 0.5774 m +0.1700 0.5774 l +s +n +1.1500 0.5774 m +1.1300 0.5774 l +s +n +0.1500 0.6079 m +0.1700 0.6079 l +s +n +1.1500 0.6079 m +1.1300 0.6079 l +s +n +0.1500 0.6384 m +0.1700 0.6384 l +s +n +1.1500 0.6384 m +1.1300 0.6384 l +s +n +0.1500 0.6689 m +0.1700 0.6689 l +s +n +1.1500 0.6689 m +1.1300 0.6689 l +s +n +0.1500 0.6995 m +0.1700 0.6995 l +s +n +1.1500 0.6995 m +1.1300 0.6995 l +s +n +0.1500 0.7300 m +0.1700 0.7300 l +s +n +1.1500 0.7300 m +1.1300 0.7300 l +s +n +0.1500 0.7605 m +0.1700 0.7605 l +s +n +1.1500 0.7605 m +1.1300 0.7605 l +s +n +0.1500 0.7910 m +0.1700 0.7910 l +s +n +1.1500 0.7910 m +1.1300 0.7910 l +s +n +0.1500 0.8216 m +0.1700 0.8216 l +s +n +1.1500 0.8216 m +1.1300 0.8216 l +s +/Font32 FFSF +0.1310 0.1424 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1) show +GR +/Font32 FFSF +1.1600 0.1424 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1) show +GR +/Font32 FFSF +0.1294 0.1729 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2) show +GR +/Font32 FFSF +1.1600 0.1729 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2) show +GR +/Font32 FFSF +0.1294 0.2034 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4) show +GR +/Font32 FFSF +1.1600 0.2034 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4) show +GR +/Font32 FFSF +0.1302 0.2341 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8) show +GR +/Font32 FFSF +1.1600 0.2341 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8) show +GR +/Font32 FFSF +0.1180 0.2647 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16) show +GR +/Font32 FFSF +1.1600 0.2647 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16) show +GR +/Font32 FFSF +0.1180 0.2952 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32) show +GR +/Font32 FFSF +1.1600 0.2952 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32) show +GR +/Font32 FFSF +0.1180 0.3257 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(64) show +GR +/Font32 FFSF +1.1600 0.3257 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(64) show +GR +/Font32 FFSF +0.1078 0.3562 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(128) show +GR +/Font32 FFSF +1.1600 0.3562 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(128) show +GR +/Font32 FFSF +0.1071 0.3868 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(256) show +GR +/Font32 FFSF +1.1600 0.3868 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(256) show +GR +/Font32 FFSF +0.1071 0.4173 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(512) show +GR +/Font32 FFSF +1.1600 0.4173 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(512) show +GR +/Font32 FFSF +0.0957 0.4478 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1024) show +GR +/Font32 FFSF +1.1600 0.4478 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1024) show +GR +/Font32 FFSF +0.0965 0.4783 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2048) show +GR +/Font32 FFSF +1.1600 0.4783 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2048) show +GR +/Font32 FFSF +0.0957 0.5089 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4096) show +GR +/Font32 FFSF +1.1600 0.5089 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4096) show +GR +/Font32 FFSF +0.0957 0.5394 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8192) show +GR +/Font32 FFSF +1.1600 0.5394 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8192) show +GR +/Font32 FFSF +0.0847 0.5699 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16384) show +GR +/Font32 FFSF +1.1600 0.5699 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16384) show +GR +/Font32 FFSF +0.0855 0.6004 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32768) show +GR +/Font32 FFSF +1.1600 0.6004 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(32768) show +GR +/Font32 FFSF +0.0847 0.6310 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(65536) show +GR +/Font32 FFSF +1.1600 0.6310 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(65536) show +GR +/Font32 FFSF +0.0733 0.6615 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(131072) show +GR +/Font32 FFSF +1.1600 0.6615 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(131072) show +GR +/Font32 FFSF +0.0733 0.6920 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(262144) show +GR +/Font32 FFSF +1.1600 0.6920 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(262144) show +GR +/Font32 FFSF +0.0741 0.7225 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(524288) show +GR +/Font32 FFSF +1.1600 0.7225 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(524288) show +GR +/Font32 FFSF +0.0624 0.7531 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1048576) show +GR +/Font32 FFSF +1.1600 0.7531 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1048576) show +GR +/Font32 FFSF +0.0624 0.7836 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2097152) show +GR +/Font32 FFSF +1.1600 0.7836 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2097152) show +GR +/Font32 FFSF +0.0624 0.8141 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4194304) show +GR +/Font32 FFSF +1.1600 0.8141 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4194304) show +GR +/Font32 FFSF +0.0461 0.3853 m +GS +[0.0000 0.0280 -0.0280 0.0000 0 0] CC +(Number of IOs \(log\)) show +GR +[] 0 SD +0.0015 SLW +n +0.1500 0.1500 m +0.1500 0.8500 l +1.1500 0.8500 l +1.1500 0.1500 l +0.1500 0.1500 l +c +s +n +0.7000 0.8000 m +0.7000 0.7035 l +0.9043 0.7035 l +0.9043 0.8000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color1 SC +n +0.7000 0.8000 m +0.7000 0.7035 l +0.9043 0.7035 l +0.9043 0.8000 l +0.7000 0.8000 l +c +s +/Font32 FFSF +0.7633 0.7747 m +GS +[0.0221 0.0000 0.0000 0.0221 0 0] CC +(2.6.20) show +GR +n +0.7300 0.7822 0.0033 0.0033 0 360 EARC c +fill +n 0.7300 0.7822 0.0033 0.0033 0 360 EARC s +/Font32 FFSF +0.7633 0.7490 m +GS +[0.0221 0.0000 0.0000 0.0221 0 0] CC +(2.6.20-plug) show +GR +n +0.7300 0.7541 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color2 SC +fill +n 0.7300 0.7541 0.0033 0.0033 0 360 EARC s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.7633 0.7186 m +GS +[0.0221 0.0000 0.0000 0.0221 0 0] CC +(2.6.20-plug-np) show +GR +n +0.7300 0.7237 0.0033 0.0033 0 360 EARC c +[/DeviceRGB] SCS +Color4 SC +fill +n 0.7300 0.7237 0.0033 0.0033 0 360 EARC s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.3484 0.9190 m +GS +[0.0420 0.0000 0.0000 0.0420 0 0] CC +(Q Histogram Chart - AIM7 FServer) show +GR +/Times-Italic findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font31 exch definefont pop +/Font31 FFSF +0.3727 0.8759 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(4-way IA64 + 4xMSA1000 \(w/ 12 disks per MSA\)) show +GR +%%Trailer +%%DocumentNeededResources: font Times-Italic +%%+ font Times-Roman +%%EOF diff --git a/btt/doc/sample-btt-output.tex b/btt/doc/sample-btt-output.tex new file mode 100644 index 0000000..24fa9f5 --- /dev/null +++ b/btt/doc/sample-btt-output.tex @@ -0,0 +1,95 @@ +\begin{verbatim} +==================== All Devices ==================== + + ALL MIN AVG MAX N +--------------- ------------- ------------- ------------- ----------- +Q2Qdm 0.000001260 0.000078915 14.504199709 491531 +Q2Adm 0.000000398 0.001184212 43.228889856 491566 + +Q2Q 0.000000455 0.000009032 1.811181609 491566 +Q2G 0.000000466 0.002396857 0.203392940 8756 +G2I 0.000000142 0.000000461 0.000096257 8756 +Q2M 0.000000230 0.000000433 0.000173083 482810 +I2D 0.000000999 0.407286973 0.982146009 8756 +M2D 0.000001251 0.356512650 0.982143260 482810 +D2C 0.000057729 0.037337508 2.011319687 491566 +Q2C 0.000060550 0.394797701 2.035625308 491566 + +==================== Device Overhead ==================== + + DEV | Q2G G2I Q2M I2D D2C +---------- | --------- --------- --------- --------- --------- + ( 8, 0) | 0.3104% 0.0004% 0.0003% 58.9079% 41.0914% + ( 8, 32) | 0.5858% 0.0001% 0.0001% 98.3852% 1.6146% +---------- | --------- --------- --------- --------- --------- + Overall | 0.0957% 0.0000% 0.0010% 16.2534% 83.6500% + +\end{verbatim} +\newpage +\begin{verbatim} + +==================== Device Merge Information ==================== + + DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total +---------- | -------- -------- ------- | -------- -------- -------- -------- + ( 8, 0) | 246812 3970 62.2 | 2 497 1024 1974490 + ( 8, 32) | 244754 4786 51.1 | 8 409 488 1958032 +---------- | -------- -------- ------- | -------- -------- -------- -------- + DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total + TOTAL | 491566 8756 56.1 | 2 449 1024 3932522 + +==================== Device Q2Q Seek Information ==================== + + DEV | NSEEKS MEAN MEDIAN | MODE +---------- | --------------- --------------- --------------- | --------------- + ( 9, 0) | 491532 2693.5 0 | 0(489746) + ( 8, 0) | 246812 2682.4 0 | 0(245021) + ( 8, 32) | 244754 1355.3 0 | 0(243795) +---------- | --------------- --------------- --------------- | --------------- + Overall | NSEEKS MEAN MEDIAN | MODE + Average | 983098 2357.6 0 | 0(978562) + +==================== Device D2D Seek Information ==================== + + DEV | NSEEKS MEAN MEDIAN | MODE +---------- | --------------- --------------- --------------- | --------------- + ( 8, 0) | 3970 219326.9 0 | 0(2177) + ( 8, 32) | 4786 69254.5 0 | 0(3828) +---------- | --------------- --------------- --------------- | --------------- + Overall | NSEEKS MEAN MEDIAN | MODE + Average | 8756 137297.8 0 | 0(6005) + +\end{verbatim} +\newpage +\begin{verbatim} + +==================== Plug Information ==================== + + DEV | # Plugs # Timer Us | % Time Q Plugged +---------- | ---------- ---------- | ---------------- + ( 8, 0) | 1152( 137) | 0.107460846% + ( 8, 32) | 5( 0) | 0.000175916% +---------- | ---------- ---------- | ---------------- + Overall | # Plugs # Timer Us | % Time Q Plugged + Average | 578( 68) | 0.053818381% + +==================== Active Requests At Q Information ==================== + + DEV | Avg Reqs @ Q +---------- | ------------- + ( 8, 0) | 11.1 + ( 8, 32) | 133.0 +---------- | ------------- + Overall | Avgs Reqs @ Q + Average | 71.8 + +==================== Q2D Histogram ==================== + + DEV | <.005 <.010 <.025 <.050 <.075 <.100 <.250 <.500 < 1.0 >=1.0 + --------- | ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== + ( 8, 0) | 80.5 3.5 1.0 1.0 0.7 0.6 4.0 5.3 3.4 0.0 + ( 8, 32) | 0.3 0.0 0.3 0.2 0.2 0.2 1.7 2.0 95.2 0.0 +========== | ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== + AVG | 40.5 1.8 0.6 0.6 0.4 0.4 2.8 3.7 49.1 0.0 + +\end{verbatim} diff --git a/btt/doc/seek.eps b/btt/doc/seek.eps new file mode 100644 index 0000000..676fb5f --- /dev/null +++ b/btt/doc/seek.eps @@ -0,0 +1,5628 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 0 0 799 635 +%%LanguageLevel: 2 +%%Creator: Grace-5.1.20 +%%CreationDate: Thu Mar 1 16:34:45 2007 +%%DocumentData: Clean8Bit +%%Orientation: Portrait +%%Title: Untitled +%%For: adb +%%DocumentNeededResources: (atend) +%%EndComments +%%BeginProlog +/m {moveto} def +/l {lineto} def +/s {stroke} def +/n {newpath} def +/c {closepath} def +/RL {rlineto} def +/SLW {setlinewidth} def +/GS {gsave} def +/GR {grestore} def +/SC {setcolor} def +/SGRY {setgray} def +/SRGB {setrgbcolor} def +/SD {setdash} def +/SLC {setlinecap} def +/SLJ {setlinejoin} def +/SCS {setcolorspace} def +/FFSF {findfont setfont} def +/CC {concat} def +/PXL {n m 0 0 RL s} def +/Color0 {1.0000 1.0000 1.0000} def +/Color1 {0.0000 0.0000 0.0000} def +/Color2 {1.0000 0.0000 0.0000} def +/Color3 {0.0000 1.0000 0.0000} def +/Color4 {0.0000 0.0000 1.0000} def +/Color5 {1.0000 1.0000 0.0000} def +/Color6 {0.7373 0.5608 0.5608} def +/Color7 {0.8627 0.8627 0.8627} def +/Color8 {0.5804 0.0000 0.8275} def +/Color9 {0.0000 1.0000 1.0000} def +/Color10 {1.0000 0.0000 1.0000} def +/Color11 {1.0000 0.6471 0.0000} def +/Color12 {0.4471 0.1294 0.7373} def +/Color13 {0.4039 0.0275 0.2824} def +/Color14 {0.2510 0.8784 0.8157} def +/Color15 {0.0000 0.5451 0.0000} def +/PTRN { + /pat_bits exch def + << + /PaintType 2 + /PatternType 1 /TilingType 1 + /BBox[0 0 16 16] + /XStep 16 /YStep 16 + /PaintProc { + pop + 16 16 true [-1 0 0 -1 16 16] pat_bits imagemask + } + >> + [0.0016 0 0 0.0016 0 0] + makepattern +} def +/Pattern0 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern1 {<ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff> PTRN} bind def +/Pattern2 {<eeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffff> PTRN} bind def +/Pattern3 {<eeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbb> PTRN} bind def +/Pattern4 {<5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa> PTRN} bind def +/Pattern5 {<1111444411114444111144441111444411114444111144441111444411114444> PTRN} bind def +/Pattern6 {<1111000044440000111100004444000011110000444400001111000044440000> PTRN} bind def +/Pattern7 {<1010000000000000010100000000000010100000000000000101000000000000> PTRN} bind def +/Pattern8 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern9 {<1e1e0f0f8787c3c3e1e1f0f078783c3c1e1e0f0f8787c3c3e1e1f0f078783c3c> PTRN} bind def +/Pattern10 {<7878f0f0e1e1c3c387870f0f1e1e3c3c7878f0f0e1e1c3c387870f0f1e1e3c3c> PTRN} bind def +/Pattern11 {<3333333333333333333333333333333333333333333333333333333333333333> PTRN} bind def +/Pattern12 {<ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000> PTRN} bind def +/Pattern13 {<8181424224241818181824244242818181814242242418181818242442428181> PTRN} bind def +/Pattern14 {<8080404020201010080804040202010180804040202010100808040402020101> PTRN} bind def +/Pattern15 {<0101020204040808101020204040808001010202040408081010202040408080> PTRN} bind def +/Pattern16 {<2222222222222222222222222222222222222222222222222222222222222222> PTRN} bind def +/Pattern17 {<0000ffff000000000000ffff000000000000ffff000000000000ffff00000000> PTRN} bind def +/Pattern18 {<2222ffff222222222222ffff222222222222ffff222222222222ffff22222222> PTRN} bind def +/Pattern19 {<ffffffff33333333ffffffff33333333ffffffff33333333ffffffff33333333> PTRN} bind def +/Pattern20 {<0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f00f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0> PTRN} bind def +/Pattern21 {<ff00ff00ff00ff00ff00ff00ff00ff0000ff00ff00ff00ff00ff00ff00ff00ff> PTRN} bind def +/Pattern22 {<8001800180018001800180018001ffffffff8001800180018001800180018001> PTRN} bind def +/Pattern23 {<c003c003c003c003c003c003ffffffffffffffffc003c003c003c003c003c003> PTRN} bind def +/Pattern24 {<040404040404ffff404040404040ffff040404040404ffff404040404040ffff> PTRN} bind def +/Pattern25 {<180018001800180018001800ffffffff001800180018001800180018ffffffff> PTRN} bind def +/Pattern26 {<1111b8b87c7c3a3a1111a3a3c7c78b8b1111b8b87c7c3a3a1111a3a3c7c78b8b> PTRN} bind def +/Pattern27 {<101010102828c7c70101010182827c7c101010102828c7c70101010182827c7c> PTRN} bind def +/Pattern28 {<1c1c121211112121c1c12121111112121c1c121211112121c1c1212111111212> PTRN} bind def +/Pattern29 {<3e3e414180808080e3e31414080808083e3e414180808080e3e3141408080808> PTRN} bind def +/Pattern30 {<4848888884848383848488884848383848488888848483838484888848483838> PTRN} bind def +/Pattern31 {<03030404080808080c0c12122121c0c003030404080808080c0c12122121c0c0> PTRN} bind def +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/EARC { + ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y translate + xrad yrad scale + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def +/TL { + /kcomp exch def + /linewidth exch def + /offset exch def + GS + 0 offset rmoveto + linewidth SLW + dup stringwidth exch kcomp add exch RL s + GR +} def +/KINIT +{ + /kvector exch def + /kid 0 def +} def +/KPROC +{ + pop pop + kvector kid get + 0 rmoveto + /kid 1 kid add def +} def +/DefEncoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /acute + /mu + /paragraph + /periodcentered + /cedilla + /onesuperior + /ordmasculine + /guillemotright + /onequarter + /onehalf + /threequarters + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /ydieresis +] def +%%EndProlog +%%BeginSetup +%%EndSetup +612.00 612.00 scale +n +0.0000 0.0000 m +0.0000 1.0000 l +1.2941 1.0000 l +1.2941 0.0000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +[0.0015 0.0045 ] 0 SD +0.0015 SLW +0 SLC +0 SLJ +n +0.1955 0.1500 m +0.1955 0.8500 l +s +n +0.2409 0.1500 m +0.2409 0.8500 l +s +n +0.2864 0.1500 m +0.2864 0.8500 l +s +n +0.3318 0.1500 m +0.3318 0.8500 l +s +n +0.4227 0.1500 m +0.4227 0.8500 l +s +n +0.4682 0.1500 m +0.4682 0.8500 l +s +n +0.5136 0.1500 m +0.5136 0.8500 l +s +n +0.5591 0.1500 m +0.5591 0.8500 l +s +n +0.6500 0.1500 m +0.6500 0.8500 l +s +n +0.6955 0.1500 m +0.6955 0.8500 l +s +n +0.7409 0.1500 m +0.7409 0.8500 l +s +n +0.7864 0.1500 m +0.7864 0.8500 l +s +n +0.8773 0.1500 m +0.8773 0.8500 l +s +n +0.9227 0.1500 m +0.9227 0.8500 l +s +n +0.9682 0.1500 m +0.9682 0.8500 l +s +n +1.0136 0.1500 m +1.0136 0.8500 l +s +n +1.1045 0.1500 m +1.1045 0.8500 l +s +n +1.1500 0.1500 m +1.1500 0.8500 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1500 m +0.1500 0.8500 l +s +n +0.3773 0.1500 m +0.3773 0.8500 l +s +n +0.6045 0.1500 m +0.6045 0.8500 l +s +n +0.8318 0.1500 m +0.8318 0.8500 l +s +n +1.0591 0.1500 m +1.0591 0.8500 l +s +[0.0015 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1640 m +1.1500 0.1640 l +s +n +0.1500 0.1920 m +1.1500 0.1920 l +s +n +0.1500 0.2480 m +1.1500 0.2480 l +s +n +0.1500 0.2760 m +1.1500 0.2760 l +s +n +0.1500 0.3040 m +1.1500 0.3040 l +s +n +0.1500 0.3320 m +1.1500 0.3320 l +s +n +0.1500 0.3880 m +1.1500 0.3880 l +s +n +0.1500 0.4160 m +1.1500 0.4160 l +s +n +0.1500 0.4440 m +1.1500 0.4440 l +s +n +0.1500 0.4720 m +1.1500 0.4720 l +s +n +0.1500 0.5280 m +1.1500 0.5280 l +s +n +0.1500 0.5560 m +1.1500 0.5560 l +s +n +0.1500 0.5840 m +1.1500 0.5840 l +s +n +0.1500 0.6120 m +1.1500 0.6120 l +s +n +0.1500 0.6680 m +1.1500 0.6680 l +s +n +0.1500 0.6960 m +1.1500 0.6960 l +s +n +0.1500 0.7240 m +1.1500 0.7240 l +s +n +0.1500 0.7520 m +1.1500 0.7520 l +s +n +0.1500 0.8080 m +1.1500 0.8080 l +s +n +0.1500 0.8360 m +1.1500 0.8360 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.2200 m +1.1500 0.2200 l +s +n +0.1500 0.3600 m +1.1500 0.3600 l +s +n +0.1500 0.5000 m +1.1500 0.5000 l +s +n +0.1500 0.6400 m +1.1500 0.6400 l +s +n +0.1500 0.7800 m +1.1500 0.7800 l +s +[/DeviceRGB] SCS +Color2 SC +[] 0 SD +0.0015 SLW +n 0.1536 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1538 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1541 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1544 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1545 0.3918 0.0008 0.0008 0 360 EARC s +n 0.1548 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1548 0.3919 0.0008 0.0008 0 360 EARC s +n 0.1552 0.3919 0.0008 0.0008 0 360 EARC s +n 0.1552 0.3919 0.0008 0.0008 0 360 EARC s +n 0.1554 0.3919 0.0008 0.0008 0 360 EARC s +n 0.1556 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1576 0.3919 0.0008 0.0008 0 360 EARC s +n 0.1576 0.3919 0.0008 0.0008 0 360 EARC s +n 0.1577 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1577 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1578 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1578 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1579 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1579 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1579 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1579 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1580 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1580 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1581 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1582 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1585 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1585 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1586 0.3920 0.0008 0.0008 0 360 EARC s +n 0.1587 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1587 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1587 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1588 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1588 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1589 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1589 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1610 0.3815 0.0008 0.0008 0 360 EARC s +n 0.1610 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1610 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1611 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1612 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1615 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1616 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1616 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1616 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1621 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1621 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1622 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1622 0.3921 0.0008 0.0008 0 360 EARC s +n 0.1622 0.3922 0.0008 0.0008 0 360 EARC s +n 0.1625 0.3922 0.0008 0.0008 0 360 EARC s +n 0.1626 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1626 0.3922 0.0008 0.0008 0 360 EARC s +n 0.1629 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1629 0.3922 0.0008 0.0008 0 360 EARC s +n 0.1630 0.3922 0.0008 0.0008 0 360 EARC s +n 0.1630 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1650 0.3922 0.0008 0.0008 0 360 EARC s +n 0.1651 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1653 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1654 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1655 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1655 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1655 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1656 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1656 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1656 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1657 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1658 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1658 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1660 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1661 0.3923 0.0008 0.0008 0 360 EARC s +n 0.1662 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1684 0.3924 0.0008 0.0008 0 360 EARC s +n 0.1685 0.3924 0.0008 0.0008 0 360 EARC s +n 0.1686 0.3924 0.0008 0.0008 0 360 EARC s +n 0.1688 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1688 0.3924 0.0008 0.0008 0 360 EARC s +n 0.1689 0.3924 0.0008 0.0008 0 360 EARC s +n 0.1690 0.3925 0.0008 0.0008 0 360 EARC s +n 0.1690 0.3925 0.0008 0.0008 0 360 EARC s +n 0.1691 0.3925 0.0008 0.0008 0 360 EARC s +n 0.1691 0.3925 0.0008 0.0008 0 360 EARC s +n 0.1692 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1693 0.3925 0.0008 0.0008 0 360 EARC s +n 0.1695 0.3925 0.0008 0.0008 0 360 EARC s +n 0.1717 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1720 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1724 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1724 0.3926 0.0008 0.0008 0 360 EARC s +n 0.1725 0.3926 0.0008 0.0008 0 360 EARC s +n 0.1726 0.3926 0.0008 0.0008 0 360 EARC s +n 0.1727 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1727 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1727 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1750 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1750 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1752 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1752 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1752 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1755 0.3927 0.0008 0.0008 0 360 EARC s +n 0.1755 0.3928 0.0008 0.0008 0 360 EARC s +n 0.1757 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1758 0.3928 0.0008 0.0008 0 360 EARC s +n 0.1759 0.3928 0.0008 0.0008 0 360 EARC s +n 0.1778 0.3928 0.0008 0.0008 0 360 EARC s +n 0.1780 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1781 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1781 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1781 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1781 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1782 0.4101 0.0008 0.0008 0 360 EARC s +n 0.1783 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1783 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1783 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1786 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1788 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1788 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1810 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1810 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1811 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1812 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1812 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1812 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1816 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1816 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1817 0.3929 0.0008 0.0008 0 360 EARC s +n 0.1817 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1818 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1819 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1820 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1820 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1824 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1824 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1824 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1824 0.3814 0.0008 0.0008 0 360 EARC s +n 0.1824 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1824 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1825 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1825 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1841 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1842 0.3930 0.0008 0.0008 0 360 EARC s +n 0.1842 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1843 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1843 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1845 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1845 0.4102 0.0008 0.0008 0 360 EARC s +n 0.1847 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1850 0.4103 0.0008 0.0008 0 360 EARC s +n 0.1852 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1869 0.4104 0.0008 0.0008 0 360 EARC s +n 0.1869 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1871 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1872 0.4104 0.0008 0.0008 0 360 EARC s +n 0.1873 0.4104 0.0008 0.0008 0 360 EARC s +n 0.1873 0.4104 0.0008 0.0008 0 360 EARC s +n 0.1873 0.4105 0.0008 0.0008 0 360 EARC s +n 0.1874 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1874 0.4105 0.0008 0.0008 0 360 EARC s +n 0.1876 0.4105 0.0008 0.0008 0 360 EARC s +n 0.1877 0.4105 0.0008 0.0008 0 360 EARC s +n 0.1877 0.4105 0.0008 0.0008 0 360 EARC s +n 0.1877 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1878 0.4105 0.0008 0.0008 0 360 EARC s +n 0.1889 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1896 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1913 0.4107 0.0008 0.0008 0 360 EARC s +n 0.1915 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1917 0.4107 0.0008 0.0008 0 360 EARC s +n 0.1918 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1919 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1920 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1920 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1921 0.3998 0.0008 0.0008 0 360 EARC s +n 0.1922 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1924 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1924 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1924 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1925 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1925 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1925 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1925 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1926 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1926 0.4108 0.0008 0.0008 0 360 EARC s +n 0.1928 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1941 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1941 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1941 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1941 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1942 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1943 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1944 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1944 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1944 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1945 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1946 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1946 0.4109 0.0008 0.0008 0 360 EARC s +n 0.1950 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1950 0.4110 0.0008 0.0008 0 360 EARC s +n 0.1951 0.4110 0.0008 0.0008 0 360 EARC s +n 0.1953 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1953 0.4110 0.0008 0.0008 0 360 EARC s +n 0.1954 0.4110 0.0008 0.0008 0 360 EARC s +n 0.1955 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1971 0.4111 0.0008 0.0008 0 360 EARC s +n 0.1972 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1972 0.4111 0.0008 0.0008 0 360 EARC s +n 0.1972 0.4111 0.0008 0.0008 0 360 EARC s +n 0.1974 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1976 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1977 0.4111 0.0008 0.0008 0 360 EARC s +n 0.1979 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1980 0.4112 0.0008 0.0008 0 360 EARC s +n 0.1982 0.4112 0.0008 0.0008 0 360 EARC s +n 0.1982 0.3997 0.0008 0.0008 0 360 EARC s +n 0.1982 0.4112 0.0008 0.0008 0 360 EARC s +n 0.1983 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2000 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2001 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2002 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2003 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2003 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2005 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2005 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2006 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2006 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2007 0.4113 0.0008 0.0008 0 360 EARC s +n 0.2008 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2008 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2008 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2009 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2009 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2026 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2026 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2028 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2028 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2030 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2030 0.4114 0.0008 0.0008 0 360 EARC s +n 0.2030 0.3997 0.0008 0.0008 0 360 EARC s +n 0.2031 0.4115 0.0008 0.0008 0 360 EARC s +n 0.2033 0.4115 0.0008 0.0008 0 360 EARC s +n 0.2033 0.4115 0.0008 0.0008 0 360 EARC s +n 0.2034 0.4181 0.0008 0.0008 0 360 EARC s +n 0.2035 0.4284 0.0008 0.0008 0 360 EARC s +n 0.2038 0.4181 0.0008 0.0008 0 360 EARC s +n 0.2039 0.4181 0.0008 0.0008 0 360 EARC s +n 0.2039 0.4284 0.0008 0.0008 0 360 EARC s +n 0.2039 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2044 0.4467 0.0008 0.0008 0 360 EARC s +n 0.2046 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2048 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2048 0.4467 0.0008 0.0008 0 360 EARC s +n 0.2048 0.4467 0.0008 0.0008 0 360 EARC s +n 0.2052 0.4467 0.0008 0.0008 0 360 EARC s +n 0.2053 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2053 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2054 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2056 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2056 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2056 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2056 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2070 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2070 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2070 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2070 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2070 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2071 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2072 0.4468 0.0008 0.0008 0 360 EARC s +n 0.2074 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2075 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2075 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2078 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2078 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2079 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2079 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2079 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2079 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2079 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2079 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2080 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2080 0.4469 0.0008 0.0008 0 360 EARC s +n 0.2081 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2081 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2098 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2099 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2100 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2100 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2101 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2101 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2101 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2101 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2102 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2103 0.4470 0.0008 0.0008 0 360 EARC s +n 0.2105 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2106 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2108 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2108 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2109 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2109 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2109 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2109 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2110 0.4364 0.0008 0.0008 0 360 EARC s +n 0.2110 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2114 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2114 0.4471 0.0008 0.0008 0 360 EARC s +n 0.2114 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2115 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2117 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2118 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2118 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2128 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2130 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2130 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2130 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2131 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2131 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2131 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2134 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2134 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2134 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2134 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2134 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2134 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2135 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2135 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2137 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2138 0.4651 0.0008 0.0008 0 360 EARC s +n 0.2138 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2141 0.4652 0.0008 0.0008 0 360 EARC s +n 0.2141 0.4652 0.0008 0.0008 0 360 EARC s +n 0.2142 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2161 0.4652 0.0008 0.0008 0 360 EARC s +n 0.2162 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2167 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2168 0.4653 0.0008 0.0008 0 360 EARC s +n 0.2168 0.4653 0.0008 0.0008 0 360 EARC s +n 0.2169 0.4653 0.0008 0.0008 0 360 EARC s +n 0.2169 0.4653 0.0008 0.0008 0 360 EARC s +n 0.2169 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2169 0.4653 0.0008 0.0008 0 360 EARC s +n 0.2171 0.4653 0.0008 0.0008 0 360 EARC s +n 0.2172 0.4654 0.0008 0.0008 0 360 EARC s +n 0.2172 0.4654 0.0008 0.0008 0 360 EARC s +n 0.2187 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2190 0.4654 0.0008 0.0008 0 360 EARC s +n 0.2191 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2191 0.4654 0.0008 0.0008 0 360 EARC s +n 0.2195 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2195 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2195 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2195 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2195 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2197 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2197 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2198 0.4731 0.0008 0.0008 0 360 EARC s +n 0.2200 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2202 0.4731 0.0008 0.0008 0 360 EARC s +n 0.2203 0.4731 0.0008 0.0008 0 360 EARC s +n 0.2203 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2204 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2205 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2205 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2205 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2215 0.4731 0.0008 0.0008 0 360 EARC s +n 0.2216 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2217 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2217 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2218 0.4655 0.0008 0.0008 0 360 EARC s +n 0.2220 0.4656 0.0008 0.0008 0 360 EARC s +n 0.2221 0.4656 0.0008 0.0008 0 360 EARC s +n 0.2222 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2224 0.4656 0.0008 0.0008 0 360 EARC s +n 0.2246 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2246 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2247 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2249 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2249 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2251 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2253 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2253 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2254 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2254 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2254 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2254 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2257 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2257 0.4657 0.0008 0.0008 0 360 EARC s +n 0.2257 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2258 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2272 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2272 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2273 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2275 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2276 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2276 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2276 0.4658 0.0008 0.0008 0 360 EARC s +n 0.2280 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2280 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2281 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2281 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2282 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2283 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2283 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2286 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2287 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2288 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2288 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2303 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2303 0.4659 0.0008 0.0008 0 360 EARC s +n 0.2303 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2305 0.4660 0.0008 0.0008 0 360 EARC s +n 0.2307 0.4660 0.0008 0.0008 0 360 EARC s +n 0.2308 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2311 0.4660 0.0008 0.0008 0 360 EARC s +n 0.2311 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2311 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2313 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2314 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2328 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2329 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2330 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2331 0.4661 0.0008 0.0008 0 360 EARC s +n 0.2333 0.4662 0.0008 0.0008 0 360 EARC s +n 0.2353 0.4663 0.0008 0.0008 0 360 EARC s +n 0.2354 0.4663 0.0008 0.0008 0 360 EARC s +n 0.2355 0.4663 0.0008 0.0008 0 360 EARC s +n 0.2375 0.4664 0.0008 0.0008 0 360 EARC s +n 0.2377 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2377 0.4664 0.0008 0.0008 0 360 EARC s +n 0.2381 0.4664 0.0008 0.0008 0 360 EARC s +n 0.2381 0.4664 0.0008 0.0008 0 360 EARC s +n 0.2381 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2383 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2385 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2385 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2385 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2389 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2389 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2389 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2399 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2399 0.4547 0.0008 0.0008 0 360 EARC s +n 0.2400 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2400 0.4665 0.0008 0.0008 0 360 EARC s +n 0.2400 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2401 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2401 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2402 0.4730 0.0008 0.0008 0 360 EARC s +n 0.2405 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2405 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2406 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2406 0.4914 0.0008 0.0008 0 360 EARC s +n 0.2410 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2411 0.4914 0.0008 0.0008 0 360 EARC s +n 0.2414 0.4914 0.0008 0.0008 0 360 EARC s +n 0.2414 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2414 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2414 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2414 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2414 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2414 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2415 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2415 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2415 0.4914 0.0008 0.0008 0 360 EARC s +n 0.2415 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2415 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2415 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2419 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2420 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2420 0.5017 0.0008 0.0008 0 360 EARC s +n 0.2421 0.4914 0.0008 0.0008 0 360 EARC s +n 0.2421 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2423 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2423 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2425 0.4730 0.0008 0.0008 0 360 EARC s +n 0.2425 0.4835 0.0008 0.0008 0 360 EARC s +n 0.2429 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2432 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2434 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2434 0.4914 0.0008 0.0008 0 360 EARC s +n 0.2434 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2437 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2438 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2438 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2438 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2438 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2438 0.5018 0.0008 0.0008 0 360 EARC s +n 0.2438 0.5097 0.0008 0.0008 0 360 EARC s +n 0.2439 0.5200 0.0008 0.0008 0 360 EARC s +n 0.2441 0.5097 0.0008 0.0008 0 360 EARC s +n 0.2444 0.5097 0.0008 0.0008 0 360 EARC s +n 0.2444 0.5200 0.0008 0.0008 0 360 EARC s +n 0.2445 0.5200 0.0008 0.0008 0 360 EARC s +n 0.2445 0.5200 0.0008 0.0008 0 360 EARC s +n 0.2445 0.5097 0.0008 0.0008 0 360 EARC s +n 0.2467 0.5097 0.0008 0.0008 0 360 EARC s +n 0.2468 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2470 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2471 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2471 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2471 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2471 0.5097 0.0008 0.0008 0 360 EARC s +n 0.2472 0.4834 0.0008 0.0008 0 360 EARC s +n 0.2472 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2474 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2474 0.5202 0.0008 0.0008 0 360 EARC s +n 0.2474 0.5280 0.0008 0.0008 0 360 EARC s +n 0.2475 0.5384 0.0008 0.0008 0 360 EARC s +n 0.2477 0.5280 0.0008 0.0008 0 360 EARC s +n 0.2480 0.5280 0.0008 0.0008 0 360 EARC s +n 0.2481 0.5384 0.0008 0.0008 0 360 EARC s +n 0.2481 0.5384 0.0008 0.0008 0 360 EARC s +n 0.2481 0.5384 0.0008 0.0008 0 360 EARC s +n 0.2481 0.5384 0.0008 0.0008 0 360 EARC s +n 0.2481 0.5280 0.0008 0.0008 0 360 EARC s +n 0.2482 0.5384 0.0008 0.0008 0 360 EARC s +n 0.2482 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2486 0.5567 0.0008 0.0008 0 360 EARC s +n 0.2488 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2489 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2489 0.5567 0.0008 0.0008 0 360 EARC s +n 0.2490 0.5567 0.0008 0.0008 0 360 EARC s +n 0.2494 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2512 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2513 0.5568 0.0008 0.0008 0 360 EARC s +n 0.2515 0.5568 0.0008 0.0008 0 360 EARC s +n 0.2516 0.5568 0.0008 0.0008 0 360 EARC s +n 0.2516 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2516 0.5569 0.0008 0.0008 0 360 EARC s +n 0.2518 0.5569 0.0008 0.0008 0 360 EARC s +n 0.2519 0.5569 0.0008 0.0008 0 360 EARC s +n 0.2519 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2519 0.5569 0.0008 0.0008 0 360 EARC s +n 0.2520 0.5464 0.0008 0.0008 0 360 EARC s +n 0.2520 0.5569 0.0008 0.0008 0 360 EARC s +n 0.2521 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2522 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2524 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2525 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2525 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2526 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2526 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2526 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2526 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2526 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2539 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2539 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2539 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2540 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2540 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2541 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2541 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2542 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2542 0.5751 0.0008 0.0008 0 360 EARC s +n 0.2543 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2545 0.5647 0.0008 0.0008 0 360 EARC s +n 0.2546 0.5752 0.0008 0.0008 0 360 EARC s +n 0.2547 0.5831 0.0008 0.0008 0 360 EARC s +n 0.2549 0.5934 0.0008 0.0008 0 360 EARC s +n 0.2551 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2552 0.6117 0.0008 0.0008 0 360 EARC s +n 0.2552 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2555 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2556 0.6117 0.0008 0.0008 0 360 EARC s +n 0.2556 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2556 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2556 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2556 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2557 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2561 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2562 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2562 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2565 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2565 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2565 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2565 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2565 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2577 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2578 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2578 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2578 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2578 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2578 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2579 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2581 0.6118 0.0008 0.0008 0 360 EARC s +n 0.2581 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2582 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2582 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2582 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2582 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2582 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2585 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2585 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2585 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2585 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2586 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2586 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2586 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2587 0.6119 0.0008 0.0008 0 360 EARC s +n 0.2590 0.6120 0.0008 0.0008 0 360 EARC s +n 0.2605 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2607 0.6120 0.0008 0.0008 0 360 EARC s +n 0.2608 0.6120 0.0008 0.0008 0 360 EARC s +n 0.2609 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2611 0.6121 0.0008 0.0008 0 360 EARC s +n 0.2613 0.6121 0.0008 0.0008 0 360 EARC s +n 0.2614 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2614 0.6121 0.0008 0.0008 0 360 EARC s +n 0.2626 0.6121 0.0008 0.0008 0 360 EARC s +n 0.2627 0.6121 0.0008 0.0008 0 360 EARC s +n 0.2627 0.6121 0.0008 0.0008 0 360 EARC s +n 0.2628 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2629 0.6122 0.0008 0.0008 0 360 EARC s +n 0.2632 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2633 0.6122 0.0008 0.0008 0 360 EARC s +n 0.2637 0.6123 0.0008 0.0008 0 360 EARC s +n 0.2654 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2657 0.6123 0.0008 0.0008 0 360 EARC s +n 0.2659 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2659 0.6124 0.0008 0.0008 0 360 EARC s +n 0.2680 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2680 0.6124 0.0008 0.0008 0 360 EARC s +n 0.2681 0.6124 0.0008 0.0008 0 360 EARC s +n 0.2682 0.6124 0.0008 0.0008 0 360 EARC s +n 0.2683 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2683 0.6124 0.0008 0.0008 0 360 EARC s +n 0.2687 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2687 0.6125 0.0008 0.0008 0 360 EARC s +n 0.2687 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2690 0.6125 0.0008 0.0008 0 360 EARC s +n 0.2691 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2691 0.6125 0.0008 0.0008 0 360 EARC s +n 0.2694 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2695 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2697 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2700 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2700 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2701 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2701 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2701 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2701 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2706 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2706 0.6125 0.0008 0.0008 0 360 EARC s +n 0.2706 0.6125 0.0008 0.0008 0 360 EARC s +n 0.2707 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2707 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2719 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2720 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2720 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2721 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2721 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2723 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2724 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2725 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2725 0.6126 0.0008 0.0008 0 360 EARC s +n 0.2726 0.6127 0.0008 0.0008 0 360 EARC s +n 0.2728 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2729 0.6127 0.0008 0.0008 0 360 EARC s +n 0.2729 0.6127 0.0008 0.0008 0 360 EARC s +n 0.2746 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2747 0.6127 0.0008 0.0008 0 360 EARC s +n 0.2748 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2749 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2750 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2752 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2752 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2752 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2753 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2754 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2754 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2754 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2754 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2754 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2768 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2770 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2770 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2770 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2770 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2771 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2771 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2771 0.6128 0.0008 0.0008 0 360 EARC s +n 0.2772 0.6129 0.0008 0.0008 0 360 EARC s +n 0.2772 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2772 0.6129 0.0008 0.0008 0 360 EARC s +n 0.2774 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2774 0.6129 0.0008 0.0008 0 360 EARC s +n 0.2775 0.6129 0.0008 0.0008 0 360 EARC s +n 0.2776 0.6129 0.0008 0.0008 0 360 EARC s +n 0.2776 0.6129 0.0008 0.0008 0 360 EARC s +n 0.2778 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2797 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2798 0.6130 0.0008 0.0008 0 360 EARC s +n 0.2802 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2802 0.6131 0.0008 0.0008 0 360 EARC s +n 0.2803 0.6131 0.0008 0.0008 0 360 EARC s +n 0.2804 0.6131 0.0008 0.0008 0 360 EARC s +n 0.2805 0.6301 0.0008 0.0008 0 360 EARC s +n 0.2805 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2820 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2821 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2822 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2822 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2822 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2823 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2826 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2830 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2845 0.6132 0.0008 0.0008 0 360 EARC s +n 0.2847 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2848 0.6133 0.0008 0.0008 0 360 EARC s +n 0.2851 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2853 0.6133 0.0008 0.0008 0 360 EARC s +n 0.2853 0.6133 0.0008 0.0008 0 360 EARC s +n 0.2854 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2855 0.6134 0.0008 0.0008 0 360 EARC s +n 0.2857 0.6134 0.0008 0.0008 0 360 EARC s +n 0.2871 0.6134 0.0008 0.0008 0 360 EARC s +n 0.2871 0.6134 0.0008 0.0008 0 360 EARC s +n 0.2872 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2872 0.6134 0.0008 0.0008 0 360 EARC s +n 0.2872 0.6134 0.0008 0.0008 0 360 EARC s +n 0.2876 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2878 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2880 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2880 0.6014 0.0008 0.0008 0 360 EARC s +n 0.2880 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2884 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2884 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2884 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2884 0.6135 0.0008 0.0008 0 360 EARC s +n 0.2884 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2884 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2885 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2885 0.6197 0.0008 0.0008 0 360 EARC s +n 0.2886 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2886 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2886 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2897 0.6302 0.0008 0.0008 0 360 EARC s +n 0.2897 0.6380 0.0008 0.0008 0 360 EARC s +n 0.2898 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2900 0.6380 0.0008 0.0008 0 360 EARC s +n 0.2902 0.6380 0.0008 0.0008 0 360 EARC s +n 0.2902 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2902 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2902 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2902 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2903 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2907 0.6380 0.0008 0.0008 0 360 EARC s +n 0.2907 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2910 0.6484 0.0008 0.0008 0 360 EARC s +n 0.2910 0.6564 0.0008 0.0008 0 360 EARC s +n 0.2912 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2915 0.6564 0.0008 0.0008 0 360 EARC s +n 0.2916 0.6564 0.0008 0.0008 0 360 EARC s +n 0.2916 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2916 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2916 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2917 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2917 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2921 0.6564 0.0008 0.0008 0 360 EARC s +n 0.2921 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2925 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2925 0.6667 0.0008 0.0008 0 360 EARC s +n 0.2925 0.6747 0.0008 0.0008 0 360 EARC s +n 0.2927 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2929 0.6747 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6747 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6851 0.0008 0.0008 0 360 EARC s +n 0.2931 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2935 0.7034 0.0008 0.0008 0 360 EARC s +n 0.2937 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2938 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2939 0.7034 0.0008 0.0008 0 360 EARC s +n 0.2939 0.7034 0.0008 0.0008 0 360 EARC s +n 0.2942 0.7034 0.0008 0.0008 0 360 EARC s +n 0.2944 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2944 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2946 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2946 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2947 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2947 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2948 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2949 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2949 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2949 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2949 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2949 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2950 0.7035 0.0008 0.0008 0 360 EARC s +n 0.2952 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2968 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2968 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2968 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2969 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2969 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2971 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2971 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2971 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2974 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2975 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2975 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2975 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2975 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2975 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2975 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2975 0.7036 0.0008 0.0008 0 360 EARC s +n 0.2976 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2977 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2979 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2979 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2979 0.6931 0.0008 0.0008 0 360 EARC s +n 0.2979 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2982 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2982 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2983 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2983 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2983 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2983 0.7037 0.0008 0.0008 0 360 EARC s +n 0.2983 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3000 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3003 0.7038 0.0008 0.0008 0 360 EARC s +n 0.3005 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3005 0.7038 0.0008 0.0008 0 360 EARC s +n 0.3008 0.7038 0.0008 0.0008 0 360 EARC s +n 0.3009 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3009 0.7038 0.0008 0.0008 0 360 EARC s +n 0.3009 0.7039 0.0008 0.0008 0 360 EARC s +n 0.3023 0.7039 0.0008 0.0008 0 360 EARC s +n 0.3023 0.7039 0.0008 0.0008 0 360 EARC s +n 0.3024 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3024 0.7039 0.0008 0.0008 0 360 EARC s +n 0.3025 0.7039 0.0008 0.0008 0 360 EARC s +n 0.3025 0.7039 0.0008 0.0008 0 360 EARC s +n 0.3027 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3029 0.7040 0.0008 0.0008 0 360 EARC s +n 0.3049 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3051 0.7040 0.0008 0.0008 0 360 EARC s +n 0.3053 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3053 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3055 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3056 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3056 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3056 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3057 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3057 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3057 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3058 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3059 0.7041 0.0008 0.0008 0 360 EARC s +n 0.3062 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3062 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3077 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3078 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3081 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3081 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3084 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3084 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3084 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3085 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3085 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3085 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3085 0.7042 0.0008 0.0008 0 360 EARC s +n 0.3086 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3086 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3086 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3088 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3088 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3088 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3089 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3092 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3092 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3092 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3092 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3092 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3093 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3093 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3093 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3093 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3093 0.7043 0.0008 0.0008 0 360 EARC s +n 0.3094 0.6931 0.0008 0.0008 0 360 EARC s +n 0.3094 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3096 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3096 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3096 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3096 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3099 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3099 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3115 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3117 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3117 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3118 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3119 0.7044 0.0008 0.0008 0 360 EARC s +n 0.3120 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3120 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3120 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3123 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3123 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3129 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3129 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3129 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3130 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3132 0.7045 0.0008 0.0008 0 360 EARC s +n 0.3133 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3155 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3155 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3157 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3157 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3157 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3160 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3160 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3160 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3160 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3161 0.7046 0.0008 0.0008 0 360 EARC s +n 0.3161 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3161 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3161 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3161 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3161 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3162 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3162 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3163 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3163 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3166 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3181 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3182 0.7047 0.0008 0.0008 0 360 EARC s +n 0.3183 0.7048 0.0008 0.0008 0 360 EARC s +n 0.3184 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3186 0.7048 0.0008 0.0008 0 360 EARC s +n 0.3188 0.7048 0.0008 0.0008 0 360 EARC s +n 0.3189 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3190 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3204 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3205 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3205 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3206 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3206 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3207 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3208 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3211 0.7049 0.0008 0.0008 0 360 EARC s +n 0.3213 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3213 0.7050 0.0008 0.0008 0 360 EARC s +n 0.3231 0.7050 0.0008 0.0008 0 360 EARC s +n 0.3233 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3233 0.7051 0.0008 0.0008 0 360 EARC s +n 0.3237 0.7051 0.0008 0.0008 0 360 EARC s +n 0.3238 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3240 0.7051 0.0008 0.0008 0 360 EARC s +n 0.3257 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3257 0.7052 0.0008 0.0008 0 360 EARC s +n 0.3258 0.7052 0.0008 0.0008 0 360 EARC s +n 0.3260 0.7052 0.0008 0.0008 0 360 EARC s +n 0.3261 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3263 0.7053 0.0008 0.0008 0 360 EARC s +n 0.3265 0.7053 0.0008 0.0008 0 360 EARC s +n 0.3265 0.7053 0.0008 0.0008 0 360 EARC s +n 0.3280 0.7053 0.0008 0.0008 0 360 EARC s +n 0.3280 0.7053 0.0008 0.0008 0 360 EARC s +n 0.3283 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3288 0.7054 0.0008 0.0008 0 360 EARC s +n 0.3289 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3307 0.7054 0.0008 0.0008 0 360 EARC s +n 0.3307 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3308 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3309 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3310 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3311 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3312 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3313 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3314 0.7055 0.0008 0.0008 0 360 EARC s +n 0.3315 0.7056 0.0008 0.0008 0 360 EARC s +n 0.3334 0.7056 0.0008 0.0008 0 360 EARC s +n 0.3335 0.7056 0.0008 0.0008 0 360 EARC s +n 0.3336 0.7056 0.0008 0.0008 0 360 EARC s +n 0.3338 0.7056 0.0008 0.0008 0 360 EARC s +n 0.3340 0.7056 0.0008 0.0008 0 360 EARC s +n 0.3340 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3342 0.7057 0.0008 0.0008 0 360 EARC s +n 0.3343 0.7057 0.0008 0.0008 0 360 EARC s +n 0.3343 0.7057 0.0008 0.0008 0 360 EARC s +n 0.3360 0.7057 0.0008 0.0008 0 360 EARC s +n 0.3362 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3363 0.7058 0.0008 0.0008 0 360 EARC s +n 0.3365 0.7058 0.0008 0.0008 0 360 EARC s +n 0.3366 0.7058 0.0008 0.0008 0 360 EARC s +n 0.3366 0.7058 0.0008 0.0008 0 360 EARC s +n 0.3367 0.7058 0.0008 0.0008 0 360 EARC s +n 0.3384 0.7058 0.0008 0.0008 0 360 EARC s +n 0.3385 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3387 0.7059 0.0008 0.0008 0 360 EARC s +n 0.3390 0.7059 0.0008 0.0008 0 360 EARC s +n 0.3391 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3392 0.7059 0.0008 0.0008 0 360 EARC s +n 0.3395 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3410 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3411 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3412 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3414 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3414 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3416 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3417 0.7060 0.0008 0.0008 0 360 EARC s +n 0.3419 0.7061 0.0008 0.0008 0 360 EARC s +n 0.3420 0.7061 0.0008 0.0008 0 360 EARC s +n 0.3436 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3437 0.7061 0.0008 0.0008 0 360 EARC s +n 0.3438 0.7062 0.0008 0.0008 0 360 EARC s +n 0.3440 0.7062 0.0008 0.0008 0 360 EARC s +n 0.3442 0.7062 0.0008 0.0008 0 360 EARC s +n 0.3442 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3458 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3463 0.7063 0.0008 0.0008 0 360 EARC s +n 0.3465 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3466 0.7064 0.0008 0.0008 0 360 EARC s +n 0.3468 0.7064 0.0008 0.0008 0 360 EARC s +n 0.3484 0.7064 0.0008 0.0008 0 360 EARC s +n 0.3486 0.7064 0.0008 0.0008 0 360 EARC s +n 0.3488 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3489 0.7065 0.0008 0.0008 0 360 EARC s +n 0.3490 0.7065 0.0008 0.0008 0 360 EARC s +n 0.3492 0.7065 0.0008 0.0008 0 360 EARC s +n 0.3492 0.7065 0.0008 0.0008 0 360 EARC s +n 0.3493 0.7065 0.0008 0.0008 0 360 EARC s +n 0.3493 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3512 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3512 0.7066 0.0008 0.0008 0 360 EARC s +n 0.3516 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3517 0.7066 0.0008 0.0008 0 360 EARC s +n 0.3518 0.7066 0.0008 0.0008 0 360 EARC s +n 0.3518 0.7066 0.0008 0.0008 0 360 EARC s +n 0.3536 0.7067 0.0008 0.0008 0 360 EARC s +n 0.3538 0.7067 0.0008 0.0008 0 360 EARC s +n 0.3539 0.7067 0.0008 0.0008 0 360 EARC s +n 0.3539 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3539 0.7067 0.0008 0.0008 0 360 EARC s +n 0.3543 0.7068 0.0008 0.0008 0 360 EARC s +n 0.3544 0.7068 0.0008 0.0008 0 360 EARC s +n 0.3562 0.7068 0.0008 0.0008 0 360 EARC s +n 0.3563 0.7068 0.0008 0.0008 0 360 EARC s +n 0.3564 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3565 0.7068 0.0008 0.0008 0 360 EARC s +n 0.3568 0.7069 0.0008 0.0008 0 360 EARC s +n 0.3570 0.7069 0.0008 0.0008 0 360 EARC s +n 0.3571 0.7069 0.0008 0.0008 0 360 EARC s +n 0.3571 0.7069 0.0008 0.0008 0 360 EARC s +n 0.3572 0.7069 0.0008 0.0008 0 360 EARC s +n 0.3572 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3591 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3592 0.7070 0.0008 0.0008 0 360 EARC s +n 0.3595 0.7070 0.0008 0.0008 0 360 EARC s +n 0.3596 0.7071 0.0008 0.0008 0 360 EARC s +n 0.3597 0.7071 0.0008 0.0008 0 360 EARC s +n 0.3613 0.7071 0.0008 0.0008 0 360 EARC s +n 0.3614 0.7071 0.0008 0.0008 0 360 EARC s +n 0.3617 0.7071 0.0008 0.0008 0 360 EARC s +n 0.3619 0.7072 0.0008 0.0008 0 360 EARC s +n 0.3620 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3621 0.7072 0.0008 0.0008 0 360 EARC s +n 0.3622 0.7072 0.0008 0.0008 0 360 EARC s +n 0.3639 0.7072 0.0008 0.0008 0 360 EARC s +n 0.3640 0.7073 0.0008 0.0008 0 360 EARC s +n 0.3641 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3645 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3647 0.7073 0.0008 0.0008 0 360 EARC s +n 0.3648 0.7073 0.0008 0.0008 0 360 EARC s +n 0.3648 0.7073 0.0008 0.0008 0 360 EARC s +n 0.3649 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3664 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3664 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3665 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3665 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3666 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3667 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3667 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3668 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3670 0.7074 0.0008 0.0008 0 360 EARC s +n 0.3670 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3671 0.7075 0.0008 0.0008 0 360 EARC s +n 0.3672 0.7075 0.0008 0.0008 0 360 EARC s +n 0.3672 0.7075 0.0008 0.0008 0 360 EARC s +n 0.3688 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3689 0.7075 0.0008 0.0008 0 360 EARC s +n 0.3694 0.7076 0.0008 0.0008 0 360 EARC s +n 0.3695 0.7076 0.0008 0.0008 0 360 EARC s +n 0.3696 0.7076 0.0008 0.0008 0 360 EARC s +n 0.3698 0.7076 0.0008 0.0008 0 360 EARC s +n 0.3698 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3712 0.7076 0.0008 0.0008 0 360 EARC s +n 0.3715 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3718 0.7077 0.0008 0.0008 0 360 EARC s +n 0.3719 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3720 0.7077 0.0008 0.0008 0 360 EARC s +n 0.3722 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3722 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3722 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3722 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3740 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3740 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3742 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3742 0.7078 0.0008 0.0008 0 360 EARC s +n 0.3744 0.7079 0.0008 0.0008 0 360 EARC s +n 0.3745 0.7079 0.0008 0.0008 0 360 EARC s +n 0.3746 0.7079 0.0008 0.0008 0 360 EARC s +n 0.3748 0.7079 0.0008 0.0008 0 360 EARC s +n 0.3748 0.6930 0.0008 0.0008 0 360 EARC s +n 0.3768 0.7113 0.0008 0.0008 0 360 EARC s +n 0.3769 0.7216 0.0008 0.0008 0 360 EARC s +n 0.3771 0.7113 0.0008 0.0008 0 360 EARC s +n 0.3773 0.7113 0.0008 0.0008 0 360 EARC s +n 0.3773 0.7216 0.0008 0.0008 0 360 EARC s +n 0.3773 0.7216 0.0008 0.0008 0 360 EARC s +n 0.3774 0.7216 0.0008 0.0008 0 360 EARC s +n 0.3775 0.7217 0.0008 0.0008 0 360 EARC s +n 0.3776 0.7113 0.0008 0.0008 0 360 EARC s +n 0.3777 0.7217 0.0008 0.0008 0 360 EARC s +n 0.3779 0.7217 0.0008 0.0008 0 360 EARC s +n 0.3794 0.7217 0.0008 0.0008 0 360 EARC s +n 0.3795 0.7217 0.0008 0.0008 0 360 EARC s +n 0.3796 0.7217 0.0008 0.0008 0 360 EARC s +n 0.3797 0.7218 0.0008 0.0008 0 360 EARC s +n 0.3799 0.7218 0.0008 0.0008 0 360 EARC s +n 0.3799 0.7218 0.0008 0.0008 0 360 EARC s +n 0.3799 0.7218 0.0008 0.0008 0 360 EARC s +n 0.3800 0.7218 0.0008 0.0008 0 360 EARC s +n 0.3802 0.7113 0.0008 0.0008 0 360 EARC s +n 0.3802 0.7218 0.0008 0.0008 0 360 EARC s +n 0.3818 0.7219 0.0008 0.0008 0 360 EARC s +n 0.3820 0.7219 0.0008 0.0008 0 360 EARC s +n 0.3820 0.7296 0.0008 0.0008 0 360 EARC s +n 0.3823 0.7399 0.0008 0.0008 0 360 EARC s +n 0.3824 0.7296 0.0008 0.0008 0 360 EARC s +n 0.3826 0.7296 0.0008 0.0008 0 360 EARC s +n 0.3827 0.7400 0.0008 0.0008 0 360 EARC s +n 0.3828 0.7296 0.0008 0.0008 0 360 EARC s +n 0.3828 0.7400 0.0008 0.0008 0 360 EARC s +n 0.3832 0.7400 0.0008 0.0008 0 360 EARC s +n 0.3833 0.7401 0.0008 0.0008 0 360 EARC s +n 0.3848 0.7296 0.0008 0.0008 0 360 EARC s +n 0.3848 0.7401 0.0008 0.0008 0 360 EARC s +n 0.3849 0.7401 0.0008 0.0008 0 360 EARC s +n 0.3855 0.7401 0.0008 0.0008 0 360 EARC s +n 0.3856 0.7296 0.0008 0.0008 0 360 EARC s +n 0.3856 0.7402 0.0008 0.0008 0 360 EARC s +n 0.3873 0.7402 0.0008 0.0008 0 360 EARC s +n 0.3874 0.7402 0.0008 0.0008 0 360 EARC s +n 0.3874 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3876 0.7583 0.0008 0.0008 0 360 EARC s +n 0.3878 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3879 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3880 0.7583 0.0008 0.0008 0 360 EARC s +n 0.3880 0.7583 0.0008 0.0008 0 360 EARC s +n 0.3885 0.7583 0.0008 0.0008 0 360 EARC s +n 0.3885 0.7583 0.0008 0.0008 0 360 EARC s +n 0.3885 0.7583 0.0008 0.0008 0 360 EARC s +n 0.3885 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3886 0.7584 0.0008 0.0008 0 360 EARC s +n 0.3888 0.7584 0.0008 0.0008 0 360 EARC s +n 0.3889 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3904 0.7584 0.0008 0.0008 0 360 EARC s +n 0.3906 0.7584 0.0008 0.0008 0 360 EARC s +n 0.3906 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3907 0.7584 0.0008 0.0008 0 360 EARC s +n 0.3910 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3910 0.7585 0.0008 0.0008 0 360 EARC s +n 0.3913 0.7585 0.0008 0.0008 0 360 EARC s +n 0.3914 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3914 0.7585 0.0008 0.0008 0 360 EARC s +n 0.3918 0.7585 0.0008 0.0008 0 360 EARC s +n 0.3918 0.7585 0.0008 0.0008 0 360 EARC s +n 0.3931 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3932 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3932 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3933 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3933 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3934 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3936 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3936 0.7586 0.0008 0.0008 0 360 EARC s +n 0.3937 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3938 0.7587 0.0008 0.0008 0 360 EARC s +n 0.3940 0.7587 0.0008 0.0008 0 360 EARC s +n 0.3954 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3955 0.7587 0.0008 0.0008 0 360 EARC s +n 0.3957 0.7588 0.0008 0.0008 0 360 EARC s +n 0.3958 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3958 0.7588 0.0008 0.0008 0 360 EARC s +n 0.3979 0.7589 0.0008 0.0008 0 360 EARC s +n 0.3980 0.7480 0.0008 0.0008 0 360 EARC s +n 0.3984 0.7589 0.0008 0.0008 0 360 EARC s +n 0.3986 0.7590 0.0008 0.0008 0 360 EARC s +n 0.3987 0.7480 0.0008 0.0008 0 360 EARC s +n 0.4002 0.7590 0.0008 0.0008 0 360 EARC s +n 0.4005 0.7480 0.0008 0.0008 0 360 EARC s +n 0.4005 0.7590 0.0008 0.0008 0 360 EARC s +n 0.4006 0.7590 0.0008 0.0008 0 360 EARC s +n 0.4010 0.7480 0.0008 0.0008 0 360 EARC s +n 0.4011 0.7591 0.0008 0.0008 0 360 EARC s +n 0.4012 0.7591 0.0008 0.0008 0 360 EARC s +n 0.4013 0.7591 0.0008 0.0008 0 360 EARC s +n 0.4029 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4030 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4031 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4032 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4033 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4034 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4034 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4035 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4036 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4037 0.7592 0.0008 0.0008 0 360 EARC s +n 0.4040 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4040 0.7593 0.0008 0.0008 0 360 EARC s +n 0.4041 0.7593 0.0008 0.0008 0 360 EARC s +n 0.4058 0.7593 0.0008 0.0008 0 360 EARC s +n 0.4059 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4062 0.7593 0.0008 0.0008 0 360 EARC s +n 0.4064 0.7593 0.0008 0.0008 0 360 EARC s +n 0.4064 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4066 0.7594 0.0008 0.0008 0 360 EARC s +n 0.4083 0.7594 0.0008 0.0008 0 360 EARC s +n 0.4084 0.7594 0.0008 0.0008 0 360 EARC s +n 0.4085 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4086 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4086 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4088 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4088 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4089 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4089 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4089 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4090 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4090 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4092 0.7595 0.0008 0.0008 0 360 EARC s +n 0.4092 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4092 0.7596 0.0008 0.0008 0 360 EARC s +n 0.4109 0.7596 0.0008 0.0008 0 360 EARC s +n 0.4110 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4112 0.7596 0.0008 0.0008 0 360 EARC s +n 0.4114 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4116 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4133 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4135 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4136 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4136 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4137 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4140 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4140 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4141 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4142 0.7598 0.0008 0.0008 0 360 EARC s +n 0.4142 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4158 0.7599 0.0008 0.0008 0 360 EARC s +n 0.4160 0.7599 0.0008 0.0008 0 360 EARC s +n 0.4160 0.7599 0.0008 0.0008 0 360 EARC s +n 0.4162 0.7599 0.0008 0.0008 0 360 EARC s +n 0.4164 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4165 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4167 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4167 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4168 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4183 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4183 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4184 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4185 0.7600 0.0008 0.0008 0 360 EARC s +n 0.4187 0.7601 0.0008 0.0008 0 360 EARC s +n 0.4188 0.7601 0.0008 0.0008 0 360 EARC s +n 0.4190 0.7601 0.0008 0.0008 0 360 EARC s +n 0.4190 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4190 0.7601 0.0008 0.0008 0 360 EARC s +n 0.4193 0.7601 0.0008 0.0008 0 360 EARC s +n 0.4194 0.7602 0.0008 0.0008 0 360 EARC s +n 0.4209 0.7602 0.0008 0.0008 0 360 EARC s +n 0.4211 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4211 0.7602 0.0008 0.0008 0 360 EARC s +n 0.4214 0.7602 0.0008 0.0008 0 360 EARC s +n 0.4214 0.7602 0.0008 0.0008 0 360 EARC s +n 0.4215 0.7602 0.0008 0.0008 0 360 EARC s +n 0.4215 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4218 0.7603 0.0008 0.0008 0 360 EARC s +n 0.4219 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4219 0.7603 0.0008 0.0008 0 360 EARC s +n 0.4233 0.7603 0.0008 0.0008 0 360 EARC s +n 0.4237 0.7604 0.0008 0.0008 0 360 EARC s +n 0.4239 0.7604 0.0008 0.0008 0 360 EARC s +n 0.4240 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4242 0.7604 0.0008 0.0008 0 360 EARC s +n 0.4258 0.7604 0.0008 0.0008 0 360 EARC s +n 0.4258 0.7605 0.0008 0.0008 0 360 EARC s +n 0.4260 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4260 0.7605 0.0008 0.0008 0 360 EARC s +n 0.4263 0.7605 0.0008 0.0008 0 360 EARC s +n 0.4265 0.7605 0.0008 0.0008 0 360 EARC s +n 0.4265 0.7605 0.0008 0.0008 0 360 EARC s +n 0.4266 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4267 0.7606 0.0008 0.0008 0 360 EARC s +n 0.4284 0.7606 0.0008 0.0008 0 360 EARC s +n 0.4286 0.7606 0.0008 0.0008 0 360 EARC s +n 0.4288 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4289 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4290 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4307 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4308 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4308 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4308 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4308 0.7607 0.0008 0.0008 0 360 EARC s +n 0.4310 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4310 0.7608 0.0008 0.0008 0 360 EARC s +n 0.4313 0.7608 0.0008 0.0008 0 360 EARC s +n 0.4315 0.7608 0.0008 0.0008 0 360 EARC s +n 0.4317 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4333 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4334 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4335 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4336 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4338 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4338 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4339 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4339 0.7609 0.0008 0.0008 0 360 EARC s +n 0.4339 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4340 0.7610 0.0008 0.0008 0 360 EARC s +n 0.4342 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4359 0.7610 0.0008 0.0008 0 360 EARC s +n 0.4361 0.7610 0.0008 0.0008 0 360 EARC s +n 0.4361 0.7610 0.0008 0.0008 0 360 EARC s +n 0.4362 0.7611 0.0008 0.0008 0 360 EARC s +n 0.4362 0.7611 0.0008 0.0008 0 360 EARC s +n 0.4363 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4363 0.7611 0.0008 0.0008 0 360 EARC s +n 0.4368 0.7611 0.0008 0.0008 0 360 EARC s +n 0.4369 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4387 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4390 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4390 0.7612 0.0008 0.0008 0 360 EARC s +n 0.4391 0.7612 0.0008 0.0008 0 360 EARC s +n 0.4392 0.7612 0.0008 0.0008 0 360 EARC s +n 0.4395 0.7613 0.0008 0.0008 0 360 EARC s +n 0.4395 0.7613 0.0008 0.0008 0 360 EARC s +n 0.4396 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4396 0.7613 0.0008 0.0008 0 360 EARC s +n 0.4396 0.7632 0.0008 0.0008 0 360 EARC s +n 0.4412 0.7613 0.0008 0.0008 0 360 EARC s +n 0.4414 0.7613 0.0008 0.0008 0 360 EARC s +n 0.4416 0.7613 0.0008 0.0008 0 360 EARC s +n 0.4417 0.7614 0.0008 0.0008 0 360 EARC s +n 0.4418 0.7614 0.0008 0.0008 0 360 EARC s +n 0.4420 0.7614 0.0008 0.0008 0 360 EARC s +n 0.4421 0.7614 0.0008 0.0008 0 360 EARC s +n 0.4422 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4422 0.7614 0.0008 0.0008 0 360 EARC s +n 0.4441 0.7615 0.0008 0.0008 0 360 EARC s +n 0.4442 0.7615 0.0008 0.0008 0 360 EARC s +n 0.4444 0.7615 0.0008 0.0008 0 360 EARC s +n 0.4446 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4446 0.7615 0.0008 0.0008 0 360 EARC s +n 0.4464 0.7616 0.0008 0.0008 0 360 EARC s +n 0.4466 0.7616 0.0008 0.0008 0 360 EARC s +n 0.4467 0.7616 0.0008 0.0008 0 360 EARC s +n 0.4469 0.7617 0.0008 0.0008 0 360 EARC s +n 0.4470 0.7617 0.0008 0.0008 0 360 EARC s +n 0.4470 0.7617 0.0008 0.0008 0 360 EARC s +n 0.4486 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4487 0.7617 0.0008 0.0008 0 360 EARC s +n 0.4489 0.7617 0.0008 0.0008 0 360 EARC s +n 0.4490 0.7618 0.0008 0.0008 0 360 EARC s +n 0.4492 0.7618 0.0008 0.0008 0 360 EARC s +n 0.4494 0.7618 0.0008 0.0008 0 360 EARC s +n 0.4495 0.7618 0.0008 0.0008 0 360 EARC s +n 0.4495 0.7618 0.0008 0.0008 0 360 EARC s +n 0.4511 0.7618 0.0008 0.0008 0 360 EARC s +n 0.4512 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4513 0.7619 0.0008 0.0008 0 360 EARC s +n 0.4514 0.7619 0.0008 0.0008 0 360 EARC s +n 0.4514 0.7619 0.0008 0.0008 0 360 EARC s +n 0.4516 0.7619 0.0008 0.0008 0 360 EARC s +n 0.4535 0.7620 0.0008 0.0008 0 360 EARC s +n 0.4536 0.7620 0.0008 0.0008 0 360 EARC s +n 0.4536 0.7620 0.0008 0.0008 0 360 EARC s +n 0.4537 0.7620 0.0008 0.0008 0 360 EARC s +n 0.4540 0.7620 0.0008 0.0008 0 360 EARC s +n 0.4541 0.7621 0.0008 0.0008 0 360 EARC s +n 0.4543 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4543 0.7621 0.0008 0.0008 0 360 EARC s +n 0.4546 0.7621 0.0008 0.0008 0 360 EARC s +n 0.4560 0.7621 0.0008 0.0008 0 360 EARC s +n 0.4561 0.7621 0.0008 0.0008 0 360 EARC s +n 0.4564 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4565 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4565 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4566 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4567 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4568 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4568 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4569 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4586 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4587 0.7622 0.0008 0.0008 0 360 EARC s +n 0.4590 0.7623 0.0008 0.0008 0 360 EARC s +n 0.4590 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4591 0.7623 0.0008 0.0008 0 360 EARC s +n 0.4593 0.7623 0.0008 0.0008 0 360 EARC s +n 0.4593 0.7623 0.0008 0.0008 0 360 EARC s +n 0.4596 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4611 0.7624 0.0008 0.0008 0 360 EARC s +n 0.4613 0.7624 0.0008 0.0008 0 360 EARC s +n 0.4614 0.7624 0.0008 0.0008 0 360 EARC s +n 0.4616 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4616 0.7624 0.0008 0.0008 0 360 EARC s +n 0.4619 0.7625 0.0008 0.0008 0 360 EARC s +n 0.4620 0.7625 0.0008 0.0008 0 360 EARC s +n 0.4637 0.7625 0.0008 0.0008 0 360 EARC s +n 0.4638 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4639 0.7625 0.0008 0.0008 0 360 EARC s +n 0.4640 0.7625 0.0008 0.0008 0 360 EARC s +n 0.4643 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4645 0.7626 0.0008 0.0008 0 360 EARC s +n 0.4646 0.7626 0.0008 0.0008 0 360 EARC s +n 0.4646 0.7626 0.0008 0.0008 0 360 EARC s +n 0.4647 0.7626 0.0008 0.0008 0 360 EARC s +n 0.4665 0.7627 0.0008 0.0008 0 360 EARC s +n 0.4668 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4668 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4671 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4671 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4686 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4687 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4688 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4689 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4689 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4690 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4691 0.7628 0.0008 0.0008 0 360 EARC s +n 0.4692 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4693 0.7629 0.0008 0.0008 0 360 EARC s +n 0.4695 0.7629 0.0008 0.0008 0 360 EARC s +n 0.4696 0.7629 0.0008 0.0008 0 360 EARC s +n 0.4713 0.7629 0.0008 0.0008 0 360 EARC s +n 0.4717 0.7630 0.0008 0.0008 0 360 EARC s +n 0.4719 0.7630 0.0008 0.0008 0 360 EARC s +n 0.4720 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4721 0.7765 0.0008 0.0008 0 360 EARC s +n 0.4723 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4725 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4725 0.7765 0.0008 0.0008 0 360 EARC s +n 0.4725 0.7765 0.0008 0.0008 0 360 EARC s +n 0.4736 0.7766 0.0008 0.0008 0 360 EARC s +n 0.4737 0.7766 0.0008 0.0008 0 360 EARC s +n 0.4738 0.7766 0.0008 0.0008 0 360 EARC s +n 0.4740 0.7766 0.0008 0.0008 0 360 EARC s +n 0.4740 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4740 0.7766 0.0008 0.0008 0 360 EARC s +n 0.4744 0.7766 0.0008 0.0008 0 360 EARC s +n 0.4745 0.7767 0.0008 0.0008 0 360 EARC s +n 0.4761 0.7767 0.0008 0.0008 0 360 EARC s +n 0.4763 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4764 0.7767 0.0008 0.0008 0 360 EARC s +n 0.4766 0.7767 0.0008 0.0008 0 360 EARC s +n 0.4767 0.7767 0.0008 0.0008 0 360 EARC s +n 0.4768 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4768 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4770 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4770 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4770 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4771 0.7630 0.0008 0.0008 0 360 EARC s +n 0.4788 0.7630 0.0008 0.0008 0 360 EARC s +n 0.4789 0.7630 0.0008 0.0008 0 360 EARC s +n 0.4790 0.7631 0.0008 0.0008 0 360 EARC s +n 0.4792 0.7631 0.0008 0.0008 0 360 EARC s +n 0.4793 0.7631 0.0008 0.0008 0 360 EARC s +n 0.4795 0.7631 0.0008 0.0008 0 360 EARC s +n 0.4796 0.7631 0.0008 0.0008 0 360 EARC s +n 0.4813 0.7632 0.0008 0.0008 0 360 EARC s +n 0.4814 0.7479 0.0008 0.0008 0 360 EARC s +n 0.4814 0.7632 0.0008 0.0008 0 360 EARC s +n 0.4816 0.7632 0.0008 0.0008 0 360 EARC s +n 0.4818 0.7632 0.0008 0.0008 0 360 EARC s +n 0.4818 0.7632 0.0008 0.0008 0 360 EARC s +n 0.4836 0.7633 0.0008 0.0008 0 360 EARC s +n 0.4838 0.7633 0.0008 0.0008 0 360 EARC s +n 0.4839 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4839 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4839 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4840 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4841 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4842 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4842 0.7768 0.0008 0.0008 0 360 EARC s +n 0.4843 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4845 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4846 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4861 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4862 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4862 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4863 0.7769 0.0008 0.0008 0 360 EARC s +n 0.4865 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4866 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4867 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4868 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4869 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4870 0.7633 0.0008 0.0008 0 360 EARC s +n 0.4887 0.7633 0.0008 0.0008 0 360 EARC s +n 0.4888 0.7634 0.0008 0.0008 0 360 EARC s +n 0.4890 0.7634 0.0008 0.0008 0 360 EARC s +n 0.4890 0.7634 0.0008 0.0008 0 360 EARC s +n 0.4891 0.7634 0.0008 0.0008 0 360 EARC s +n 0.4892 0.7634 0.0008 0.0008 0 360 EARC s +n 0.4892 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4892 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4893 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4894 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4911 0.7770 0.0008 0.0008 0 360 EARC s +n 0.4913 0.7771 0.0008 0.0008 0 360 EARC s +n 0.4914 0.7771 0.0008 0.0008 0 360 EARC s +n 0.4915 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4917 0.7771 0.0008 0.0008 0 360 EARC s +n 0.4922 0.7772 0.0008 0.0008 0 360 EARC s +n 0.4937 0.7772 0.0008 0.0008 0 360 EARC s +n 0.4939 0.7772 0.0008 0.0008 0 360 EARC s +n 0.4940 0.7662 0.0008 0.0008 0 360 EARC s +n 0.4941 0.7772 0.0008 0.0008 0 360 EARC s +n 0.4942 0.7772 0.0008 0.0008 0 360 EARC s +n 0.4944 0.7773 0.0008 0.0008 0 360 EARC s +n 0.4945 0.7773 0.0008 0.0008 0 360 EARC s +n 0.4946 0.7773 0.0008 0.0008 0 360 EARC s +n 0.4961 0.7661 0.0008 0.0008 0 360 EARC s +n 0.4962 0.7773 0.0008 0.0008 0 360 EARC s +n 0.4963 0.7773 0.0008 0.0008 0 360 EARC s +n 0.4965 0.7774 0.0008 0.0008 0 360 EARC s +n 0.4966 0.7774 0.0008 0.0008 0 360 EARC s +n 0.4969 0.7774 0.0008 0.0008 0 360 EARC s +n 0.4986 0.7661 0.0008 0.0008 0 360 EARC s +n 0.4986 0.7774 0.0008 0.0008 0 360 EARC s +n 0.4990 0.7775 0.0008 0.0008 0 360 EARC s +n 0.4991 0.7775 0.0008 0.0008 0 360 EARC s +n 0.4993 0.7775 0.0008 0.0008 0 360 EARC s +n 0.4993 0.7775 0.0008 0.0008 0 360 EARC s +n 0.4996 0.7776 0.0008 0.0008 0 360 EARC s +n 0.5012 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5013 0.7776 0.0008 0.0008 0 360 EARC s +n 0.5013 0.7776 0.0008 0.0008 0 360 EARC s +n 0.5015 0.7776 0.0008 0.0008 0 360 EARC s +n 0.5017 0.7777 0.0008 0.0008 0 360 EARC s +n 0.5019 0.7777 0.0008 0.0008 0 360 EARC s +n 0.5021 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5038 0.7777 0.0008 0.0008 0 360 EARC s +n 0.5039 0.7777 0.0008 0.0008 0 360 EARC s +n 0.5040 0.7777 0.0008 0.0008 0 360 EARC s +n 0.5041 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5043 0.7778 0.0008 0.0008 0 360 EARC s +n 0.5044 0.7778 0.0008 0.0008 0 360 EARC s +n 0.5046 0.7778 0.0008 0.0008 0 360 EARC s +n 0.5047 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5047 0.7778 0.0008 0.0008 0 360 EARC s +n 0.5050 0.7778 0.0008 0.0008 0 360 EARC s +n 0.5050 0.7778 0.0008 0.0008 0 360 EARC s +n 0.5065 0.7779 0.0008 0.0008 0 360 EARC s +n 0.5066 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5068 0.7779 0.0008 0.0008 0 360 EARC s +n 0.5070 0.7779 0.0008 0.0008 0 360 EARC s +n 0.5088 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5089 0.7780 0.0008 0.0008 0 360 EARC s +n 0.5089 0.7780 0.0008 0.0008 0 360 EARC s +n 0.5090 0.7780 0.0008 0.0008 0 360 EARC s +n 0.5091 0.7780 0.0008 0.0008 0 360 EARC s +n 0.5092 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5097 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5114 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5115 0.7781 0.0008 0.0008 0 360 EARC s +n 0.5117 0.7781 0.0008 0.0008 0 360 EARC s +n 0.5117 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5117 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5118 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5121 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5121 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5121 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5122 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5125 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5126 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5126 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5126 0.7782 0.0008 0.0008 0 360 EARC s +n 0.5127 0.7783 0.0008 0.0008 0 360 EARC s +n 0.5128 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5143 0.7783 0.0008 0.0008 0 360 EARC s +n 0.5146 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5149 0.7784 0.0008 0.0008 0 360 EARC s +n 0.5151 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5153 0.7784 0.0008 0.0008 0 360 EARC s +n 0.5167 0.7784 0.0008 0.0008 0 360 EARC s +n 0.5170 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5172 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5172 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5175 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5176 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5177 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5177 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5179 0.7785 0.0008 0.0008 0 360 EARC s +n 0.5196 0.7786 0.0008 0.0008 0 360 EARC s +n 0.5196 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5196 0.7786 0.0008 0.0008 0 360 EARC s +n 0.5198 0.7786 0.0008 0.0008 0 360 EARC s +n 0.5199 0.7786 0.0008 0.0008 0 360 EARC s +n 0.5202 0.7787 0.0008 0.0008 0 360 EARC s +n 0.5202 0.7787 0.0008 0.0008 0 360 EARC s +n 0.5202 0.7787 0.0008 0.0008 0 360 EARC s +n 0.5219 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5220 0.7787 0.0008 0.0008 0 360 EARC s +n 0.5220 0.7807 0.0008 0.0008 0 360 EARC s +n 0.5222 0.7787 0.0008 0.0008 0 360 EARC s +n 0.5222 0.7787 0.0008 0.0008 0 360 EARC s +n 0.5223 0.7788 0.0008 0.0008 0 360 EARC s +n 0.5224 0.7788 0.0008 0.0008 0 360 EARC s +n 0.5226 0.7788 0.0008 0.0008 0 360 EARC s +n 0.5227 0.7788 0.0008 0.0008 0 360 EARC s +n 0.5228 0.7788 0.0008 0.0008 0 360 EARC s +n 0.5246 0.7788 0.0008 0.0008 0 360 EARC s +n 0.5248 0.7789 0.0008 0.0008 0 360 EARC s +n 0.5248 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5249 0.7789 0.0008 0.0008 0 360 EARC s +n 0.5250 0.7789 0.0008 0.0008 0 360 EARC s +n 0.5253 0.7789 0.0008 0.0008 0 360 EARC s +n 0.5253 0.7789 0.0008 0.0008 0 360 EARC s +n 0.5254 0.7790 0.0008 0.0008 0 360 EARC s +n 0.5270 0.7790 0.0008 0.0008 0 360 EARC s +n 0.5277 0.7791 0.0008 0.0008 0 360 EARC s +n 0.5292 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5292 0.7791 0.0008 0.0008 0 360 EARC s +n 0.5293 0.7791 0.0008 0.0008 0 360 EARC s +n 0.5294 0.7791 0.0008 0.0008 0 360 EARC s +n 0.5295 0.7791 0.0008 0.0008 0 360 EARC s +n 0.5295 0.7791 0.0008 0.0008 0 360 EARC s +n 0.5299 0.7792 0.0008 0.0008 0 360 EARC s +n 0.5301 0.7792 0.0008 0.0008 0 360 EARC s +n 0.5301 0.7792 0.0008 0.0008 0 360 EARC s +n 0.5318 0.7793 0.0008 0.0008 0 360 EARC s +n 0.5319 0.7793 0.0008 0.0008 0 360 EARC s +n 0.5321 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5321 0.7793 0.0008 0.0008 0 360 EARC s +n 0.5322 0.7793 0.0008 0.0008 0 360 EARC s +n 0.5324 0.7793 0.0008 0.0008 0 360 EARC s +n 0.5341 0.7794 0.0008 0.0008 0 360 EARC s +n 0.5345 0.7794 0.0008 0.0008 0 360 EARC s +n 0.5346 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5347 0.7794 0.0008 0.0008 0 360 EARC s +n 0.5350 0.7795 0.0008 0.0008 0 360 EARC s +n 0.5351 0.7795 0.0008 0.0008 0 360 EARC s +n 0.5367 0.7795 0.0008 0.0008 0 360 EARC s +n 0.5367 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5368 0.7795 0.0008 0.0008 0 360 EARC s +n 0.5369 0.7795 0.0008 0.0008 0 360 EARC s +n 0.5371 0.7796 0.0008 0.0008 0 360 EARC s +n 0.5373 0.7796 0.0008 0.0008 0 360 EARC s +n 0.5375 0.7796 0.0008 0.0008 0 360 EARC s +n 0.5376 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5376 0.7796 0.0008 0.0008 0 360 EARC s +n 0.5393 0.7796 0.0008 0.0008 0 360 EARC s +n 0.5394 0.7796 0.0008 0.0008 0 360 EARC s +n 0.5395 0.7797 0.0008 0.0008 0 360 EARC s +n 0.5397 0.7797 0.0008 0.0008 0 360 EARC s +n 0.5399 0.7797 0.0008 0.0008 0 360 EARC s +n 0.5400 0.7797 0.0008 0.0008 0 360 EARC s +n 0.5402 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5418 0.7798 0.0008 0.0008 0 360 EARC s +n 0.5419 0.7798 0.0008 0.0008 0 360 EARC s +n 0.5421 0.7798 0.0008 0.0008 0 360 EARC s +n 0.5422 0.7798 0.0008 0.0008 0 360 EARC s +n 0.5423 0.7798 0.0008 0.0008 0 360 EARC s +n 0.5426 0.7799 0.0008 0.0008 0 360 EARC s +n 0.5442 0.7799 0.0008 0.0008 0 360 EARC s +n 0.5443 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5443 0.7799 0.0008 0.0008 0 360 EARC s +n 0.5443 0.7799 0.0008 0.0008 0 360 EARC s +n 0.5445 0.7799 0.0008 0.0008 0 360 EARC s +n 0.5445 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5447 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5448 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5449 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5449 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5450 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5451 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5451 0.7800 0.0008 0.0008 0 360 EARC s +n 0.5469 0.7801 0.0008 0.0008 0 360 EARC s +n 0.5471 0.7801 0.0008 0.0008 0 360 EARC s +n 0.5471 0.7801 0.0008 0.0008 0 360 EARC s +n 0.5473 0.7801 0.0008 0.0008 0 360 EARC s +n 0.5474 0.7801 0.0008 0.0008 0 360 EARC s +n 0.5475 0.7801 0.0008 0.0008 0 360 EARC s +n 0.5477 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5478 0.7802 0.0008 0.0008 0 360 EARC s +n 0.5494 0.7802 0.0008 0.0008 0 360 EARC s +n 0.5497 0.7802 0.0008 0.0008 0 360 EARC s +n 0.5498 0.7802 0.0008 0.0008 0 360 EARC s +n 0.5499 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5499 0.7803 0.0008 0.0008 0 360 EARC s +n 0.5502 0.7803 0.0008 0.0008 0 360 EARC s +n 0.5502 0.7803 0.0008 0.0008 0 360 EARC s +n 0.5503 0.7803 0.0008 0.0008 0 360 EARC s +n 0.5518 0.7803 0.0008 0.0008 0 360 EARC s +n 0.5519 0.7804 0.0008 0.0008 0 360 EARC s +n 0.5520 0.7804 0.0008 0.0008 0 360 EARC s +n 0.5521 0.7804 0.0008 0.0008 0 360 EARC s +n 0.5523 0.7804 0.0008 0.0008 0 360 EARC s +n 0.5524 0.7804 0.0008 0.0008 0 360 EARC s +n 0.5525 0.7804 0.0008 0.0008 0 360 EARC s +n 0.5525 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5544 0.7805 0.0008 0.0008 0 360 EARC s +n 0.5546 0.7805 0.0008 0.0008 0 360 EARC s +n 0.5547 0.7805 0.0008 0.0008 0 360 EARC s +n 0.5548 0.7805 0.0008 0.0008 0 360 EARC s +n 0.5549 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5550 0.7806 0.0008 0.0008 0 360 EARC s +n 0.5552 0.7806 0.0008 0.0008 0 360 EARC s +n 0.5569 0.7806 0.0008 0.0008 0 360 EARC s +n 0.5571 0.7806 0.0008 0.0008 0 360 EARC s +n 0.5573 0.7806 0.0008 0.0008 0 360 EARC s +n 0.5574 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5576 0.7807 0.0008 0.0008 0 360 EARC s +n 0.5579 0.7807 0.0008 0.0008 0 360 EARC s +n 0.5580 0.7807 0.0008 0.0008 0 360 EARC s +n 0.5597 0.7807 0.0008 0.0008 0 360 EARC s +n 0.5598 0.7807 0.0008 0.0008 0 360 EARC s +n 0.5599 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5600 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5600 0.7077 0.0008 0.0008 0 360 EARC s +n 0.5603 0.7077 0.0008 0.0008 0 360 EARC s +n 0.5604 0.7077 0.0008 0.0008 0 360 EARC s +n 0.5604 0.6927 0.0008 0.0008 0 360 EARC s +n 0.5607 0.7077 0.0008 0.0008 0 360 EARC s +n 0.5608 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5608 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5608 0.7078 0.0008 0.0008 0 360 EARC s +n 0.5626 0.7078 0.0008 0.0008 0 360 EARC s +n 0.5626 0.7078 0.0008 0.0008 0 360 EARC s +n 0.5628 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5629 0.6927 0.0008 0.0008 0 360 EARC s +n 0.5630 0.7078 0.0008 0.0008 0 360 EARC s +n 0.5631 0.7078 0.0008 0.0008 0 360 EARC s +n 0.5633 0.7079 0.0008 0.0008 0 360 EARC s +n 0.5652 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5652 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5652 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5652 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5654 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5655 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5655 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5658 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5658 0.7808 0.0008 0.0008 0 360 EARC s +n 0.5675 0.7809 0.0008 0.0008 0 360 EARC s +n 0.5677 0.7809 0.0008 0.0008 0 360 EARC s +n 0.5678 0.7809 0.0008 0.0008 0 360 EARC s +n 0.5678 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5678 0.7809 0.0008 0.0008 0 360 EARC s +n 0.5681 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5681 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5682 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5684 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5685 0.7661 0.0008 0.0008 0 360 EARC s +n 0.5685 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5687 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5702 0.7810 0.0008 0.0008 0 360 EARC s +n 0.5703 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5704 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5705 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5705 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5706 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5708 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5709 0.7811 0.0008 0.0008 0 360 EARC s +n 0.5710 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5712 0.7947 0.0008 0.0008 0 360 EARC s +n 0.5713 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5715 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5716 0.7947 0.0008 0.0008 0 360 EARC s +n 0.5728 0.7947 0.0008 0.0008 0 360 EARC s +n 0.5732 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5734 0.7948 0.0008 0.0008 0 360 EARC s +n 0.5736 0.7948 0.0008 0.0008 0 360 EARC s +n 0.5737 0.7949 0.0008 0.0008 0 360 EARC s +n 0.5737 0.7949 0.0008 0.0008 0 360 EARC s +n 0.5752 0.7949 0.0008 0.0008 0 360 EARC s +n 0.5753 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5756 0.7949 0.0008 0.0008 0 360 EARC s +n 0.5757 0.7950 0.0008 0.0008 0 360 EARC s +n 0.5758 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5758 0.7950 0.0008 0.0008 0 360 EARC s +n 0.5776 0.7950 0.0008 0.0008 0 360 EARC s +n 0.5797 0.7952 0.0008 0.0008 0 360 EARC s +n 0.5820 0.7953 0.0008 0.0008 0 360 EARC s +n 0.5822 0.7953 0.0008 0.0008 0 360 EARC s +n 0.5823 0.7953 0.0008 0.0008 0 360 EARC s +n 0.5825 0.7953 0.0008 0.0008 0 360 EARC s +n 0.5826 0.7953 0.0008 0.0008 0 360 EARC s +n 0.5826 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5826 0.7953 0.0008 0.0008 0 360 EARC s +n 0.5843 0.7954 0.0008 0.0008 0 360 EARC s +n 0.5844 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5845 0.7954 0.0008 0.0008 0 360 EARC s +n 0.5846 0.7954 0.0008 0.0008 0 360 EARC s +n 0.5846 0.7955 0.0008 0.0008 0 360 EARC s +n 0.5848 0.7955 0.0008 0.0008 0 360 EARC s +n 0.5850 0.7955 0.0008 0.0008 0 360 EARC s +n 0.5851 0.7955 0.0008 0.0008 0 360 EARC s +n 0.5864 0.7955 0.0008 0.0008 0 360 EARC s +n 0.5865 0.7956 0.0008 0.0008 0 360 EARC s +n 0.5866 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5867 0.7956 0.0008 0.0008 0 360 EARC s +n 0.5888 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5888 0.7957 0.0008 0.0008 0 360 EARC s +n 0.5890 0.7957 0.0008 0.0008 0 360 EARC s +n 0.5891 0.7957 0.0008 0.0008 0 360 EARC s +n 0.5893 0.7958 0.0008 0.0008 0 360 EARC s +n 0.5910 0.7958 0.0008 0.0008 0 360 EARC s +n 0.5912 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5916 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5916 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5917 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5918 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5921 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5921 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5921 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5936 0.7959 0.0008 0.0008 0 360 EARC s +n 0.5938 0.7960 0.0008 0.0008 0 360 EARC s +n 0.5940 0.7960 0.0008 0.0008 0 360 EARC s +n 0.5941 0.7960 0.0008 0.0008 0 360 EARC s +n 0.5942 0.7960 0.0008 0.0008 0 360 EARC s +n 0.5942 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5944 0.7960 0.0008 0.0008 0 360 EARC s +n 0.5945 0.7960 0.0008 0.0008 0 360 EARC s +n 0.5945 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5956 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5957 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5957 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5958 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5959 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5959 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5960 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5961 0.7961 0.0008 0.0008 0 360 EARC s +n 0.5961 0.7962 0.0008 0.0008 0 360 EARC s +n 0.5981 0.7962 0.0008 0.0008 0 360 EARC s +n 0.5982 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5985 0.7963 0.0008 0.0008 0 360 EARC s +n 0.5987 0.7963 0.0008 0.0008 0 360 EARC s +n 0.5987 0.7844 0.0008 0.0008 0 360 EARC s +n 0.5987 0.7963 0.0008 0.0008 0 360 EARC s +n 0.5990 0.7963 0.0008 0.0008 0 360 EARC s +n 0.5990 0.7963 0.0008 0.0008 0 360 EARC s +n 0.5991 0.7963 0.0008 0.0008 0 360 EARC s +n 0.5999 0.7963 0.0008 0.0008 0 360 EARC s +n 0.6001 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6002 0.7844 0.0008 0.0008 0 360 EARC s +n 0.6002 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6005 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6005 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6005 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6006 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6006 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6007 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6009 0.7964 0.0008 0.0008 0 360 EARC s +n 0.6010 0.7965 0.0008 0.0008 0 360 EARC s +n 0.6010 0.7965 0.0008 0.0008 0 360 EARC s +n 0.6026 0.7965 0.0008 0.0008 0 360 EARC s +n 0.6028 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6028 0.7965 0.0008 0.0008 0 360 EARC s +n 0.6030 0.7965 0.0008 0.0008 0 360 EARC s +n 0.6030 0.7965 0.0008 0.0008 0 360 EARC s +n 0.6030 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6032 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6034 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6034 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6049 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6050 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6050 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6052 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6054 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6054 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6057 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6057 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6057 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6057 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6058 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6072 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6077 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6081 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6100 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6101 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6102 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6102 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6102 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6103 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6105 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6105 0.8027 0.0008 0.0008 0 360 EARC s +n 0.6106 0.8130 0.0008 0.0008 0 360 EARC s +n 0.6108 0.8027 0.0008 0.0008 0 360 EARC s +n 0.6112 0.8027 0.0008 0.0008 0 360 EARC s +n 0.6112 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6113 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6113 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6114 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6130 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6133 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6134 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6136 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6136 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6137 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6137 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6139 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6141 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6157 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6159 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6159 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6160 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6162 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6164 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6183 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6183 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6184 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6185 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6186 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6186 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6187 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6187 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6188 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6188 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6189 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6189 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6191 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6192 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6194 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6194 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6210 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6210 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6211 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6212 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6214 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6216 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6217 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6220 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6220 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6221 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6237 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6238 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6239 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6240 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6240 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6242 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6242 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6244 0.7977 0.0008 0.0008 0 360 EARC s +n 0.6246 0.7977 0.0008 0.0008 0 360 EARC s +n 0.6246 0.7843 0.0008 0.0008 0 360 EARC s +n 0.6255 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6366 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6366 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6383 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6384 0.7966 0.0008 0.0008 0 360 EARC s +n 0.6386 0.8119 0.0008 0.0008 0 360 EARC s +n 0.6388 0.8015 0.0008 0.0008 0 360 EARC s +n 0.6390 0.8119 0.0008 0.0008 0 360 EARC s +n 0.6392 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6393 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6397 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6398 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6412 0.7967 0.0008 0.0008 0 360 EARC s +n 0.6413 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6413 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6413 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6414 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6415 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6416 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6416 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6420 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6420 0.7968 0.0008 0.0008 0 360 EARC s +n 0.6420 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6420 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6421 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6436 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6437 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6437 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6437 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6439 0.7969 0.0008 0.0008 0 360 EARC s +n 0.6441 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6444 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6460 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6460 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6461 0.7970 0.0008 0.0008 0 360 EARC s +n 0.6462 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6463 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6465 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6466 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6467 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6468 0.7971 0.0008 0.0008 0 360 EARC s +n 0.6484 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6485 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6486 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6486 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6487 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6487 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6489 0.7972 0.0008 0.0008 0 360 EARC s +n 0.6490 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6490 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6493 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6508 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6511 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6512 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6513 0.7973 0.0008 0.0008 0 360 EARC s +n 0.6516 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6516 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6518 0.7974 0.0008 0.0008 0 360 EARC s +n 0.6528 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6531 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6536 0.7975 0.0008 0.0008 0 360 EARC s +n 0.6554 0.7976 0.0008 0.0008 0 360 EARC s +n 0.6573 0.7978 0.0008 0.0008 0 360 EARC s +n 0.6592 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6592 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6593 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6593 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6594 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6595 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6596 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6612 0.7979 0.0008 0.0008 0 360 EARC s +n 0.6613 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6614 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6616 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6616 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6621 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6622 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6622 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6623 0.7980 0.0008 0.0008 0 360 EARC s +n 0.6623 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6624 0.7981 0.0008 0.0008 0 360 EARC s +n 0.6637 0.7981 0.0008 0.0008 0 360 EARC s +n 0.6639 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6639 0.7981 0.0008 0.0008 0 360 EARC s +n 0.6640 0.7981 0.0008 0.0008 0 360 EARC s +n 0.6641 0.7981 0.0008 0.0008 0 360 EARC s +n 0.6644 0.7832 0.0008 0.0008 0 360 EARC s +n 0.6644 0.7982 0.0008 0.0008 0 360 EARC s +n 0.6646 0.7982 0.0008 0.0008 0 360 EARC s +n 0.6695 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6750 0.8108 0.0008 0.0008 0 360 EARC s +n 0.6758 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6759 0.8108 0.0008 0.0008 0 360 EARC s +n 0.6762 0.8108 0.0008 0.0008 0 360 EARC s +n 0.6763 0.8108 0.0008 0.0008 0 360 EARC s +n 0.6767 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6767 0.8108 0.0008 0.0008 0 360 EARC s +n 0.6769 0.7821 0.0008 0.0008 0 360 EARC s +n 0.6772 0.8108 0.0008 0.0008 0 360 EARC s +n 0.6775 0.8109 0.0008 0.0008 0 360 EARC s +n 0.6776 0.8109 0.0008 0.0008 0 360 EARC s +n 0.6780 0.8109 0.0008 0.0008 0 360 EARC s +n 0.6791 0.8109 0.0008 0.0008 0 360 EARC s +n 0.6792 0.8109 0.0008 0.0008 0 360 EARC s +n 0.6795 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6796 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6797 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6797 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6800 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6800 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6815 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6816 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6816 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6817 0.8110 0.0008 0.0008 0 360 EARC s +n 0.6819 0.8111 0.0008 0.0008 0 360 EARC s +n 0.6819 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6820 0.8111 0.0008 0.0008 0 360 EARC s +n 0.6822 0.8111 0.0008 0.0008 0 360 EARC s +n 0.6823 0.8111 0.0008 0.0008 0 360 EARC s +n 0.6823 0.8111 0.0008 0.0008 0 360 EARC s +n 0.6824 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6824 0.8111 0.0008 0.0008 0 360 EARC s +n 0.6828 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6840 0.8112 0.0008 0.0008 0 360 EARC s +n 0.6841 0.8112 0.0008 0.0008 0 360 EARC s +n 0.6842 0.8112 0.0008 0.0008 0 360 EARC s +n 0.6843 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6843 0.8112 0.0008 0.0008 0 360 EARC s +n 0.6846 0.8112 0.0008 0.0008 0 360 EARC s +n 0.6847 0.8112 0.0008 0.0008 0 360 EARC s +n 0.6847 0.8113 0.0008 0.0008 0 360 EARC s +n 0.6847 0.8113 0.0008 0.0008 0 360 EARC s +n 0.6863 0.8113 0.0008 0.0008 0 360 EARC s +n 0.6865 0.8113 0.0008 0.0008 0 360 EARC s +n 0.6866 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6868 0.8114 0.0008 0.0008 0 360 EARC s +n 0.6870 0.8114 0.0008 0.0008 0 360 EARC s +n 0.6871 0.8114 0.0008 0.0008 0 360 EARC s +n 0.6872 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6872 0.8114 0.0008 0.0008 0 360 EARC s +n 0.6889 0.8115 0.0008 0.0008 0 360 EARC s +n 0.6890 0.8115 0.0008 0.0008 0 360 EARC s +n 0.6891 0.8115 0.0008 0.0008 0 360 EARC s +n 0.6893 0.8115 0.0008 0.0008 0 360 EARC s +n 0.6895 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6895 0.8116 0.0008 0.0008 0 360 EARC s +n 0.6896 0.8116 0.0008 0.0008 0 360 EARC s +n 0.6912 0.8116 0.0008 0.0008 0 360 EARC s +n 0.6912 0.8116 0.0008 0.0008 0 360 EARC s +n 0.6914 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6915 0.8116 0.0008 0.0008 0 360 EARC s +n 0.6916 0.8116 0.0008 0.0008 0 360 EARC s +n 0.6916 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6918 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6918 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6921 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6933 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6936 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6936 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6936 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6940 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6940 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6940 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6941 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6941 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6941 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6941 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6942 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6942 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6942 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6943 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6943 0.8118 0.0008 0.0008 0 360 EARC s +n 0.6947 0.8119 0.0008 0.0008 0 360 EARC s +n 0.6947 0.8004 0.0008 0.0008 0 360 EARC s +n 0.6948 0.8119 0.0008 0.0008 0 360 EARC s +n 0.6948 0.8119 0.0008 0.0008 0 360 EARC s +n 0.6971 0.7997 0.0008 0.0008 0 360 EARC s +n 0.7060 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7061 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7061 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7061 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7064 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7064 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7067 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7068 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7068 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7068 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7082 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7083 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7084 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7087 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7087 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7088 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7088 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7088 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7089 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7089 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7090 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7090 0.8111 0.0008 0.0008 0 360 EARC s +n 0.7092 0.8111 0.0008 0.0008 0 360 EARC s +n 0.7093 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7093 0.8111 0.0008 0.0008 0 360 EARC s +n 0.7096 0.8111 0.0008 0.0008 0 360 EARC s +n 0.7096 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7097 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7097 0.8112 0.0008 0.0008 0 360 EARC s +n 0.7108 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7108 0.8112 0.0008 0.0008 0 360 EARC s +n 0.7109 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7110 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7110 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7111 0.8112 0.0008 0.0008 0 360 EARC s +n 0.7112 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7113 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7113 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7114 0.8113 0.0008 0.0008 0 360 EARC s +n 0.7115 0.8113 0.0008 0.0008 0 360 EARC s +n 0.7115 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7116 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7116 0.8113 0.0008 0.0008 0 360 EARC s +n 0.7119 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7119 0.8114 0.0008 0.0008 0 360 EARC s +n 0.7121 0.8114 0.0008 0.0008 0 360 EARC s +n 0.7122 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7122 0.8114 0.0008 0.0008 0 360 EARC s +n 0.7129 0.8114 0.0008 0.0008 0 360 EARC s +n 0.7130 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7130 0.8114 0.0008 0.0008 0 360 EARC s +n 0.7134 0.8115 0.0008 0.0008 0 360 EARC s +n 0.7134 0.7994 0.0008 0.0008 0 360 EARC s +n 0.7135 0.8115 0.0008 0.0008 0 360 EARC s +n 0.7135 0.8115 0.0008 0.0008 0 360 EARC s +n 0.7136 0.7993 0.0008 0.0008 0 360 EARC s +n 0.7136 0.8115 0.0008 0.0008 0 360 EARC s +n 0.7136 0.8116 0.0008 0.0008 0 360 EARC s +n 0.7137 0.8116 0.0008 0.0008 0 360 EARC s +n 0.7153 0.7993 0.0008 0.0008 0 360 EARC s +n 0.7154 0.7993 0.0008 0.0008 0 360 EARC s +n 0.7166 0.7981 0.0008 0.0008 0 360 EARC s +n 0.7268 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7269 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7271 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7272 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7273 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7274 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7288 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7288 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7288 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7291 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7292 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7294 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7295 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7295 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7296 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7297 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7298 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7299 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7299 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7301 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7301 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7301 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7301 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7304 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7305 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7305 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7305 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7305 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7306 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7307 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7308 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7322 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7325 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7325 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7326 0.8108 0.0008 0.0008 0 360 EARC s +n 0.7328 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7329 0.8108 0.0008 0.0008 0 360 EARC s +n 0.7330 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7331 0.8108 0.0008 0.0008 0 360 EARC s +n 0.7334 0.8108 0.0008 0.0008 0 360 EARC s +n 0.7335 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7335 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7350 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7351 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7351 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7351 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7351 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7351 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7352 0.8109 0.0008 0.0008 0 360 EARC s +n 0.7352 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7353 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7353 0.8110 0.0008 0.0008 0 360 EARC s +n 0.7355 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7356 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7357 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7357 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7358 0.7980 0.0008 0.0008 0 360 EARC s +n 0.7368 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7455 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7456 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7456 0.8102 0.0008 0.0008 0 360 EARC s +n 0.7458 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7472 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7473 0.8103 0.0008 0.0008 0 360 EARC s +n 0.7473 0.8108 0.0008 0.0008 0 360 EARC s +n 0.7476 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7476 0.8103 0.0008 0.0008 0 360 EARC s +n 0.7478 0.8103 0.0008 0.0008 0 360 EARC s +n 0.7480 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7482 0.8103 0.0008 0.0008 0 360 EARC s +n 0.7489 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7489 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7492 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7492 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7493 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7493 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7493 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7493 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7493 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7506 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7506 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.8104 0.0008 0.0008 0 360 EARC s +n 0.7507 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7508 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7508 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7508 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7508 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7508 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7508 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7509 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7510 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7510 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7510 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7510 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7510 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7510 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7510 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7511 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7512 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7513 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7516 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7516 0.8105 0.0008 0.0008 0 360 EARC s +n 0.7517 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7517 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7517 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7534 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7534 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7535 0.8106 0.0008 0.0008 0 360 EARC s +n 0.7536 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7536 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7537 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7538 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7538 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7539 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7541 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7541 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7541 0.8107 0.0008 0.0008 0 360 EARC s +n 0.7542 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7543 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7558 0.7971 0.0008 0.0008 0 360 EARC s +n 0.7559 0.8108 0.0008 0.0008 0 360 EARC s +n 0.7572 0.7963 0.0008 0.0008 0 360 EARC s +n 0.7614 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7619 0.8097 0.0008 0.0008 0 360 EARC s +n 0.7659 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7660 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7661 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7662 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7678 0.8098 0.0008 0.0008 0 360 EARC s +n 0.7680 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7680 0.8098 0.0008 0.0008 0 360 EARC s +n 0.7684 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7685 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7686 0.8099 0.0008 0.0008 0 360 EARC s +n 0.7688 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7689 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7703 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7704 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7704 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7705 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7706 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7706 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7706 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7709 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7709 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7710 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7710 0.8100 0.0008 0.0008 0 360 EARC s +n 0.7710 0.8101 0.0008 0.0008 0 360 EARC s +n 0.7710 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7711 0.8101 0.0008 0.0008 0 360 EARC s +n 0.7711 0.8101 0.0008 0.0008 0 360 EARC s +n 0.7711 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7712 0.8101 0.0008 0.0008 0 360 EARC s +n 0.7713 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7714 0.8101 0.0008 0.0008 0 360 EARC s +n 0.7717 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7718 0.8101 0.0008 0.0008 0 360 EARC s +n 0.7718 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7719 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7720 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7720 0.8102 0.0008 0.0008 0 360 EARC s +n 0.7722 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7735 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7736 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7737 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7738 0.7959 0.0008 0.0008 0 360 EARC s +n 0.7739 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7740 0.8245 0.0008 0.0008 0 360 EARC s +n 0.7742 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7744 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7744 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7745 0.8245 0.0008 0.0008 0 360 EARC s +n 0.7750 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7751 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7752 0.8141 0.0008 0.0008 0 360 EARC s +n 0.7780 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7855 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7858 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7858 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7859 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7860 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7867 0.8236 0.0008 0.0008 0 360 EARC s +n 0.7869 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7869 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7870 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7871 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7871 0.8237 0.0008 0.0008 0 360 EARC s +n 0.7873 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7873 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7874 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7875 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7876 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7876 0.8238 0.0008 0.0008 0 360 EARC s +n 0.7891 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7892 0.8238 0.0008 0.0008 0 360 EARC s +n 0.7892 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7893 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7893 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7893 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7893 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7896 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7896 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7896 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7896 0.8241 0.0008 0.0008 0 360 EARC s +n 0.7896 0.8244 0.0008 0.0008 0 360 EARC s +n 0.7896 0.8248 0.0008 0.0008 0 360 EARC s +n 0.7901 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7902 0.8239 0.0008 0.0008 0 360 EARC s +n 0.7902 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7903 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7903 0.8240 0.0008 0.0008 0 360 EARC s +n 0.7920 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7921 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7923 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7923 0.8241 0.0008 0.0008 0 360 EARC s +n 0.7925 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7927 0.8241 0.0008 0.0008 0 360 EARC s +n 0.7928 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7928 0.8242 0.0008 0.0008 0 360 EARC s +n 0.7946 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7947 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7949 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7951 0.8131 0.0008 0.0008 0 360 EARC s +n 0.7951 0.8243 0.0008 0.0008 0 360 EARC s +n 0.7984 0.8124 0.0008 0.0008 0 360 EARC s +n 0.8040 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8043 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8045 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8045 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8048 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8049 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8049 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8050 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8050 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8051 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8051 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8052 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8052 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8055 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8056 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8060 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8060 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8062 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8073 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8073 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8075 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8075 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8077 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8078 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8079 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8080 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8084 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8097 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8099 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8101 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8102 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8104 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8104 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8104 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8105 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8107 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8107 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8123 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8123 0.8239 0.0008 0.0008 0 360 EARC s +n 0.8123 0.8239 0.0008 0.0008 0 360 EARC s +n 0.8125 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8127 0.8240 0.0008 0.0008 0 360 EARC s +n 0.8129 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8129 0.8240 0.0008 0.0008 0 360 EARC s +n 0.8133 0.8240 0.0008 0.0008 0 360 EARC s +n 0.8133 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8133 0.8240 0.0008 0.0008 0 360 EARC s +n 0.8133 0.8240 0.0008 0.0008 0 360 EARC s +n 0.8134 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8150 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8150 0.8241 0.0008 0.0008 0 360 EARC s +n 0.8153 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8153 0.8241 0.0008 0.0008 0 360 EARC s +n 0.8156 0.8304 0.0008 0.0008 0 360 EARC s +n 0.8157 0.8407 0.0008 0.0008 0 360 EARC s +n 0.8159 0.8304 0.0008 0.0008 0 360 EARC s +n 0.8160 0.8304 0.0008 0.0008 0 360 EARC s +n 0.8161 0.8407 0.0008 0.0008 0 360 EARC s +n 0.8161 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8161 0.8241 0.0008 0.0008 0 360 EARC s +n 0.8162 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8165 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8166 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8166 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8169 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8181 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8181 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8182 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8183 0.8242 0.0008 0.0008 0 360 EARC s +n 0.8184 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8185 0.8243 0.0008 0.0008 0 360 EARC s +n 0.8188 0.8121 0.0008 0.0008 0 360 EARC s +n 0.8188 0.8243 0.0008 0.0008 0 360 EARC s +n 0.8247 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8299 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8304 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8304 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8306 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8307 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8307 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8308 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8309 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8310 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8310 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8326 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8327 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8330 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8330 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8331 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8333 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8334 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8335 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8353 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8355 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8356 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8356 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8357 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8357 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8359 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8376 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8377 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8378 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8379 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8380 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8380 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8382 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8382 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8383 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8384 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8384 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8402 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8404 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8405 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8407 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8408 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8410 0.8390 0.0008 0.0008 0 360 EARC s +n 0.8411 0.8391 0.0008 0.0008 0 360 EARC s +n 0.8412 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8412 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8412 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8413 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8427 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8428 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8429 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8429 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8433 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8433 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8433 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8433 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8434 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8434 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8434 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8436 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8436 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8452 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8452 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8454 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8454 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8456 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8456 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8457 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8457 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8458 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8458 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8459 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8459 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8477 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8477 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8477 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8480 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8483 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8483 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8483 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8483 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8484 0.8104 0.0008 0.0008 0 360 EARC s +n 0.8484 0.8238 0.0008 0.0008 0 360 EARC s +n 0.8486 0.8239 0.0008 0.0008 0 360 EARC s +n 0.8557 0.8223 0.0008 0.0008 0 360 EARC s +n 0.8583 0.8223 0.0008 0.0008 0 360 EARC s +n 0.8584 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8586 0.8224 0.0008 0.0008 0 360 EARC s +n 0.8587 0.8224 0.0008 0.0008 0 360 EARC s +n 0.8589 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8603 0.8224 0.0008 0.0008 0 360 EARC s +n 0.8604 0.8225 0.0008 0.0008 0 360 EARC s +n 0.8605 0.8225 0.0008 0.0008 0 360 EARC s +n 0.8606 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8609 0.8225 0.0008 0.0008 0 360 EARC s +n 0.8610 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8627 0.8226 0.0008 0.0008 0 360 EARC s +n 0.8628 0.8226 0.0008 0.0008 0 360 EARC s +n 0.8629 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8630 0.8226 0.0008 0.0008 0 360 EARC s +n 0.8632 0.8226 0.0008 0.0008 0 360 EARC s +n 0.8634 0.8227 0.0008 0.0008 0 360 EARC s +n 0.8634 0.8227 0.0008 0.0008 0 360 EARC s +n 0.8635 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8653 0.8227 0.0008 0.0008 0 360 EARC s +n 0.8654 0.8227 0.0008 0.0008 0 360 EARC s +n 0.8655 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8656 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8658 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8660 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8660 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8664 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8664 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8664 0.8228 0.0008 0.0008 0 360 EARC s +n 0.8675 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8676 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8677 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8678 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8679 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8679 0.8229 0.0008 0.0008 0 360 EARC s +n 0.8681 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8682 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8682 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8683 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8683 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8695 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8696 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8699 0.8230 0.0008 0.0008 0 360 EARC s +n 0.8700 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8702 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8703 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8718 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8720 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8720 0.8231 0.0008 0.0008 0 360 EARC s +n 0.8724 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8724 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8725 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8725 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8725 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8725 0.8232 0.0008 0.0008 0 360 EARC s +n 0.8727 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8728 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8745 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8746 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8749 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8751 0.8233 0.0008 0.0008 0 360 EARC s +n 0.8752 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8753 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8771 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8771 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8771 0.8234 0.0008 0.0008 0 360 EARC s +n 0.8772 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8776 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8778 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8778 0.8235 0.0008 0.0008 0 360 EARC s +n 0.8795 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8797 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8798 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8798 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8799 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8799 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8799 0.8236 0.0008 0.0008 0 360 EARC s +n 0.8802 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8802 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8802 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8803 0.8088 0.0008 0.0008 0 360 EARC s +n 0.8804 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8807 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8807 0.8237 0.0008 0.0008 0 360 EARC s +n 0.8819 0.8222 0.0008 0.0008 0 360 EARC s +n 0.8863 0.8072 0.0008 0.0008 0 360 EARC s +n 0.8906 0.8222 0.0008 0.0008 0 360 EARC s +n 0.8910 0.8222 0.0008 0.0008 0 360 EARC s +n 0.8912 0.8222 0.0008 0.0008 0 360 EARC s +n 0.8914 0.8072 0.0008 0.0008 0 360 EARC s +n 0.8918 0.8222 0.0008 0.0008 0 360 EARC s +n 0.8922 0.8222 0.0008 0.0008 0 360 EARC s +n 0.8922 0.8223 0.0008 0.0008 0 360 EARC s +n 0.8922 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8924 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8925 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8927 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8928 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8938 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8938 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8939 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8940 0.8359 0.0008 0.0008 0 360 EARC s +n 0.8940 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8941 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8942 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8942 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8945 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8945 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8946 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8946 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8946 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8946 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8946 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8947 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8947 0.8360 0.0008 0.0008 0 360 EARC s +n 0.8947 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8947 0.8361 0.0008 0.0008 0 360 EARC s +n 0.8960 0.8361 0.0008 0.0008 0 360 EARC s +n 0.8961 0.8361 0.0008 0.0008 0 360 EARC s +n 0.8962 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8963 0.8361 0.0008 0.0008 0 360 EARC s +n 0.8964 0.8361 0.0008 0.0008 0 360 EARC s +n 0.8965 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8965 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8965 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8965 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8966 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8967 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8982 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8983 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8984 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8984 0.8362 0.0008 0.0008 0 360 EARC s +n 0.8985 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8985 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8985 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8986 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8988 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8988 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8988 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8988 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8990 0.8255 0.0008 0.0008 0 360 EARC s +n 0.8990 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8993 0.8363 0.0008 0.0008 0 360 EARC s +n 0.8993 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9002 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9002 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9004 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9004 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9005 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9005 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9007 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9008 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9008 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9009 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9026 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9027 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9028 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9028 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9029 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9029 0.8366 0.0008 0.0008 0 360 EARC s +n 0.9032 0.8366 0.0008 0.0008 0 360 EARC s +n 0.9032 0.8366 0.0008 0.0008 0 360 EARC s +n 0.9034 0.8366 0.0008 0.0008 0 360 EARC s +n 0.9049 0.8366 0.0008 0.0008 0 360 EARC s +n 0.9049 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9050 0.8367 0.0008 0.0008 0 360 EARC s +n 0.9050 0.8367 0.0008 0.0008 0 360 EARC s +n 0.9052 0.8367 0.0008 0.0008 0 360 EARC s +n 0.9054 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9055 0.8368 0.0008 0.0008 0 360 EARC s +n 0.9071 0.8368 0.0008 0.0008 0 360 EARC s +n 0.9073 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9073 0.8368 0.0008 0.0008 0 360 EARC s +n 0.9077 0.8368 0.0008 0.0008 0 360 EARC s +n 0.9080 0.8369 0.0008 0.0008 0 360 EARC s +n 0.9095 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9097 0.8369 0.0008 0.0008 0 360 EARC s +n 0.9097 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9099 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9100 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9102 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9102 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9104 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9104 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9104 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9108 0.8370 0.0008 0.0008 0 360 EARC s +n 0.9118 0.8371 0.0008 0.0008 0 360 EARC s +n 0.9118 0.8371 0.0008 0.0008 0 360 EARC s +n 0.9120 0.8371 0.0008 0.0008 0 360 EARC s +n 0.9120 0.8255 0.0008 0.0008 0 360 EARC s +n 0.9121 0.8371 0.0008 0.0008 0 360 EARC s +n 0.9122 0.8371 0.0008 0.0008 0 360 EARC s +n 0.9123 0.8372 0.0008 0.0008 0 360 EARC s +n 0.9180 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9217 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9217 0.8357 0.0008 0.0008 0 360 EARC s +n 0.9219 0.8357 0.0008 0.0008 0 360 EARC s +n 0.9220 0.8357 0.0008 0.0008 0 360 EARC s +n 0.9220 0.8357 0.0008 0.0008 0 360 EARC s +n 0.9220 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9221 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9222 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9222 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9222 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9223 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9223 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9224 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9224 0.8358 0.0008 0.0008 0 360 EARC s +n 0.9227 0.8359 0.0008 0.0008 0 360 EARC s +n 0.9240 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9241 0.8359 0.0008 0.0008 0 360 EARC s +n 0.9242 0.8359 0.0008 0.0008 0 360 EARC s +n 0.9243 0.8359 0.0008 0.0008 0 360 EARC s +n 0.9244 0.8359 0.0008 0.0008 0 360 EARC s +n 0.9245 0.8359 0.0008 0.0008 0 360 EARC s +n 0.9246 0.8360 0.0008 0.0008 0 360 EARC s +n 0.9246 0.8360 0.0008 0.0008 0 360 EARC s +n 0.9248 0.8360 0.0008 0.0008 0 360 EARC s +n 0.9260 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9260 0.8360 0.0008 0.0008 0 360 EARC s +n 0.9262 0.8360 0.0008 0.0008 0 360 EARC s +n 0.9263 0.8360 0.0008 0.0008 0 360 EARC s +n 0.9264 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9264 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9265 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9267 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9267 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9270 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9270 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9281 0.8361 0.0008 0.0008 0 360 EARC s +n 0.9282 0.8362 0.0008 0.0008 0 360 EARC s +n 0.9283 0.8362 0.0008 0.0008 0 360 EARC s +n 0.9284 0.8362 0.0008 0.0008 0 360 EARC s +n 0.9285 0.8362 0.0008 0.0008 0 360 EARC s +n 0.9287 0.8362 0.0008 0.0008 0 360 EARC s +n 0.9288 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9289 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9291 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9302 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9302 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9303 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9303 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9304 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9306 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9306 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9307 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9307 0.8363 0.0008 0.0008 0 360 EARC s +n 0.9308 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9309 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9309 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9310 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9324 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9325 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9325 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9325 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9325 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9326 0.8364 0.0008 0.0008 0 360 EARC s +n 0.9327 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9327 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9329 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9329 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9330 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9330 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9331 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9331 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9332 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9335 0.8365 0.0008 0.0008 0 360 EARC s +n 0.9335 0.8240 0.0008 0.0008 0 360 EARC s +n 0.9336 0.8366 0.0008 0.0008 0 360 EARC s +[/DeviceRGB] SCS +Color4 SC +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6247 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6248 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6249 0.3910 0.0008 0.0008 0 360 EARC s +n 0.6249 0.4010 0.0008 0.0008 0 360 EARC s +n 0.6249 0.4090 0.0008 0.0008 0 360 EARC s +n 0.6249 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6249 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6252 0.4009 0.0008 0.0008 0 360 EARC s +n 0.6253 0.4090 0.0008 0.0008 0 360 EARC s +n 0.6255 0.4090 0.0008 0.0008 0 360 EARC s +n 0.6256 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6256 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6257 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6257 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6257 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6258 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6258 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6258 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6259 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6259 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6260 0.3829 0.0008 0.0008 0 360 EARC s +n 0.6260 0.3902 0.0008 0.0008 0 360 EARC s +n 0.6260 0.3902 0.0008 0.0008 0 360 EARC s +n 0.6263 0.3902 0.0008 0.0008 0 360 EARC s +n 0.6264 0.3902 0.0008 0.0008 0 360 EARC s +n 0.6266 0.3903 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3903 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3903 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3904 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3905 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3905 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3905 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3905 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3905 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3905 0.0008 0.0008 0 360 EARC s +n 0.6310 0.3907 0.0008 0.0008 0 360 EARC s +n 0.6313 0.3907 0.0008 0.0008 0 360 EARC s +n 0.6315 0.3907 0.0008 0.0008 0 360 EARC s +n 0.6316 0.3907 0.0008 0.0008 0 360 EARC s +n 0.6316 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6317 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6319 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6319 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6320 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6322 0.4002 0.0008 0.0008 0 360 EARC s +n 0.6322 0.4082 0.0008 0.0008 0 360 EARC s +n 0.6324 0.4082 0.0008 0.0008 0 360 EARC s +n 0.6325 0.4082 0.0008 0.0008 0 360 EARC s +n 0.6325 0.4082 0.0008 0.0008 0 360 EARC s +n 0.6663 0.4001 0.0008 0.0008 0 360 EARC s +n 0.6663 0.4081 0.0008 0.0008 0 360 EARC s +n 0.6663 0.4082 0.0008 0.0008 0 360 EARC s +n 0.6663 0.4082 0.0008 0.0008 0 360 EARC s +n 0.6663 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6663 0.4001 0.0008 0.0008 0 360 EARC s +n 0.6663 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6663 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6663 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6663 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3909 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4081 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3828 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.3908 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6664 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6665 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4081 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6666 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4081 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6667 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6668 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6695 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6695 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6695 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6696 0.4000 0.0008 0.0008 0 360 EARC s +n 0.6696 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6696 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6696 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6696 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6696 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4078 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6707 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6708 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6709 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6948 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6948 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6948 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6948 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6948 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6949 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6949 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6949 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6949 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6949 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6949 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6949 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6950 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6950 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4079 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6950 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6950 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6951 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4080 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4249 0.0008 0.0008 0 360 EARC s +n 0.6951 0.3999 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4169 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4433 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6951 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4433 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4433 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4433 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6952 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4352 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4430 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6971 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6972 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6976 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6976 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6978 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6979 0.4431 0.0008 0.0008 0 360 EARC s +n 0.6981 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6982 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6982 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6982 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6983 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6983 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6983 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6986 0.4432 0.0008 0.0008 0 360 EARC s +n 0.6986 0.4531 0.0008 0.0008 0 360 EARC s +n 0.6986 0.4531 0.0008 0.0008 0 360 EARC s +n 0.6987 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6987 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6988 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6988 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6988 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6989 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6989 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6989 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6990 0.4610 0.0008 0.0008 0 360 EARC s +n 0.6990 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6992 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6993 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6993 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6994 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6994 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6996 0.4611 0.0008 0.0008 0 360 EARC s +n 0.6998 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7154 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7154 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4613 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4613 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4710 0.0008 0.0008 0 360 EARC s +n 0.7155 0.4790 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4790 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4790 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4790 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4710 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4710 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4790 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4531 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4710 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7156 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7157 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4612 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7158 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7159 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7159 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7159 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7160 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7160 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7161 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7161 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7163 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7166 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7166 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7167 0.4605 0.0008 0.0008 0 360 EARC s +n 0.7167 0.4605 0.0008 0.0008 0 360 EARC s +n 0.7167 0.4605 0.0008 0.0008 0 360 EARC s +n 0.7169 0.4605 0.0008 0.0008 0 360 EARC s +n 0.7170 0.4605 0.0008 0.0008 0 360 EARC s +n 0.7170 0.4605 0.0008 0.0008 0 360 EARC s +n 0.7170 0.4606 0.0008 0.0008 0 360 EARC s +n 0.7171 0.4606 0.0008 0.0008 0 360 EARC s +n 0.7171 0.4606 0.0008 0.0008 0 360 EARC s +n 0.7172 0.4606 0.0008 0.0008 0 360 EARC s +n 0.7172 0.4606 0.0008 0.0008 0 360 EARC s +n 0.7172 0.4607 0.0008 0.0008 0 360 EARC s +n 0.7173 0.4607 0.0008 0.0008 0 360 EARC s +n 0.7173 0.4608 0.0008 0.0008 0 360 EARC s +n 0.7174 0.4610 0.0008 0.0008 0 360 EARC s +n 0.7176 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7176 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7177 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4530 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4611 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4699 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4780 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4780 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4780 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4780 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4699 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4699 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4780 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7359 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4963 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4779 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4699 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4779 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4779 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4882 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.4962 0.0008 0.0008 0 360 EARC s +n 0.7360 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5064 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5064 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5064 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5064 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7361 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7362 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7363 0.5064 0.0008 0.0008 0 360 EARC s +n 0.7363 0.5064 0.0008 0.0008 0 360 EARC s +n 0.7364 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7364 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7364 0.4696 0.0008 0.0008 0 360 EARC s +n 0.7365 0.5144 0.0008 0.0008 0 360 EARC s +n 0.7365 0.5245 0.0008 0.0008 0 360 EARC s +n 0.7366 0.5325 0.0008 0.0008 0 360 EARC s +n 0.7366 0.5325 0.0008 0.0008 0 360 EARC s +n 0.7366 0.5326 0.0008 0.0008 0 360 EARC s +n 0.7367 0.5326 0.0008 0.0008 0 360 EARC s +n 0.7367 0.5326 0.0008 0.0008 0 360 EARC s +n 0.7368 0.5429 0.0008 0.0008 0 360 EARC s +n 0.7368 0.5429 0.0008 0.0008 0 360 EARC s +n 0.7369 0.5429 0.0008 0.0008 0 360 EARC s +n 0.7369 0.5507 0.0008 0.0008 0 360 EARC s +n 0.7369 0.5507 0.0008 0.0008 0 360 EARC s +n 0.7370 0.5507 0.0008 0.0008 0 360 EARC s +n 0.7370 0.5508 0.0008 0.0008 0 360 EARC s +n 0.7371 0.5508 0.0008 0.0008 0 360 EARC s +n 0.7371 0.5508 0.0008 0.0008 0 360 EARC s +n 0.7371 0.5508 0.0008 0.0008 0 360 EARC s +n 0.7372 0.5508 0.0008 0.0008 0 360 EARC s +n 0.7373 0.5509 0.0008 0.0008 0 360 EARC s +n 0.7373 0.5610 0.0008 0.0008 0 360 EARC s +n 0.7374 0.5610 0.0008 0.0008 0 360 EARC s +n 0.7375 0.5610 0.0008 0.0008 0 360 EARC s +n 0.7376 0.5689 0.0008 0.0008 0 360 EARC s +n 0.7377 0.5689 0.0008 0.0008 0 360 EARC s +n 0.7377 0.5689 0.0008 0.0008 0 360 EARC s +n 0.7377 0.5689 0.0008 0.0008 0 360 EARC s +n 0.7378 0.5689 0.0008 0.0008 0 360 EARC s +n 0.7379 0.5689 0.0008 0.0008 0 360 EARC s +n 0.7379 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7380 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7381 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7382 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7383 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7383 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7384 0.5690 0.0008 0.0008 0 360 EARC s +n 0.7384 0.5976 0.0008 0.0008 0 360 EARC s +n 0.7385 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7385 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7386 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7386 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7387 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7387 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7389 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7390 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7390 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7390 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7391 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7391 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7561 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7561 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7561 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7562 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7563 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7563 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7563 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7563 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7563 0.6057 0.0008 0.0008 0 360 EARC s +n 0.7563 0.6057 0.0008 0.0008 0 360 EARC s +n 0.7563 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7563 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7564 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6056 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6151 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6231 0.0008 0.0008 0 360 EARC s +n 0.7564 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6151 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6231 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6231 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6231 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6231 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6231 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6151 0.0008 0.0008 0 360 EARC s +n 0.7564 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7564 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7572 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7572 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7572 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7572 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7572 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7573 0.5975 0.0008 0.0008 0 360 EARC s +n 0.7573 0.6052 0.0008 0.0008 0 360 EARC s +n 0.7575 0.6052 0.0008 0.0008 0 360 EARC s +n 0.7576 0.6052 0.0008 0.0008 0 360 EARC s +n 0.7576 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7577 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7577 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7577 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7578 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7578 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7578 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7579 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7579 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7579 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7580 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7580 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7581 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7583 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7583 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7584 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7584 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7584 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7585 0.6147 0.0008 0.0008 0 360 EARC s +n 0.7585 0.6227 0.0008 0.0008 0 360 EARC s +n 0.7585 0.6227 0.0008 0.0008 0 360 EARC s +n 0.7586 0.6227 0.0008 0.0008 0 360 EARC s +n 0.7752 0.5974 0.0008 0.0008 0 360 EARC s +n 0.7752 0.5974 0.0008 0.0008 0 360 EARC s +n 0.7752 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7752 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7752 0.6055 0.0008 0.0008 0 360 EARC s +n 0.7752 0.5974 0.0008 0.0008 0 360 EARC s +n 0.7752 0.5974 0.0008 0.0008 0 360 EARC s +n 0.7752 0.5974 0.0008 0.0008 0 360 EARC s +n 0.7752 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7752 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7752 0.6225 0.0008 0.0008 0 360 EARC s +n 0.7753 0.6225 0.0008 0.0008 0 360 EARC s +n 0.7753 0.6225 0.0008 0.0008 0 360 EARC s +n 0.7753 0.6225 0.0008 0.0008 0 360 EARC s +n 0.7753 0.6144 0.0008 0.0008 0 360 EARC s +n 0.7753 0.6144 0.0008 0.0008 0 360 EARC s +n 0.7753 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7753 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7753 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7754 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7754 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7754 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7754 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7755 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7755 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6053 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7755 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7755 0.5973 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6054 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6141 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6221 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6221 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6221 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6221 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6141 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6141 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6221 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6221 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6403 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6403 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6403 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6403 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6322 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6322 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6402 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6403 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6403 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6506 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7755 0.6322 0.0008 0.0008 0 360 EARC s +n 0.7756 0.6506 0.0008 0.0008 0 360 EARC s +n 0.7756 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6505 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6586 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6689 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6769 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6769 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6769 0.0008 0.0008 0 360 EARC s +n 0.7780 0.6769 0.0008 0.0008 0 360 EARC s +n 0.7781 0.6769 0.0008 0.0008 0 360 EARC s +n 0.7781 0.6769 0.0008 0.0008 0 360 EARC s +n 0.7783 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7783 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7783 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7784 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7786 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7786 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7787 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7787 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7788 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7788 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7788 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7789 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7789 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7789 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7790 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7791 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7791 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7791 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7792 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7792 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7794 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7794 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7795 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7795 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7796 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7797 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7797 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7798 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7798 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7799 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7799 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7800 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7953 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6953 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6953 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7954 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6953 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6953 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7955 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6953 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7956 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6953 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6872 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7957 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7958 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7984 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7984 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7984 0.6871 0.0008 0.0008 0 360 EARC s +n 0.7984 0.6871 0.0008 0.0008 0 360 EARC s +n 0.7984 0.6871 0.0008 0.0008 0 360 EARC s +n 0.7984 0.6871 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6871 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6871 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6949 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7985 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6950 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6951 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6952 0.0008 0.0008 0 360 EARC s +n 0.7998 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8002 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8002 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8002 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8004 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8188 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8189 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8190 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8191 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8192 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8192 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8192 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8192 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8192 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8192 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8247 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8263 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8263 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8487 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8487 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8487 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8487 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8487 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8488 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8489 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6871 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8490 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6953 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8491 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8557 0.6952 0.0008 0.0008 0 360 EARC s +n 0.8557 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6951 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7089 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8808 0.6870 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7007 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7007 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7087 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7089 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7089 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7007 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7007 0.0008 0.0008 0 360 EARC s +n 0.8808 0.7007 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7007 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7188 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7268 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7268 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7269 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7188 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7188 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7188 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7188 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7188 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7268 0.0008 0.0008 0 360 EARC s +n 0.8809 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8810 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7449 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7450 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8811 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8812 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8812 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8812 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8812 0.7448 0.0008 0.0008 0 360 EARC s +n 0.8812 0.7369 0.0008 0.0008 0 360 EARC s +n 0.8812 0.7369 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9124 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9125 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9126 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7450 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9127 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7450 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9128 0.7450 0.0008 0.0008 0 360 EARC s +n 0.9179 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9179 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9179 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9180 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9180 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9180 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7447 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9353 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7450 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9354 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7466 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9355 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7449 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7450 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7450 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9356 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9429 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7448 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9430 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9458 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7368 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7436 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7437 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7437 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7439 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7439 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7440 0.0008 0.0008 0 360 EARC s +n 0.9482 0.7441 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7442 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9491 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9492 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9494 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9495 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9495 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9496 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9496 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9496 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9497 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9497 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9497 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9500 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9500 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9500 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9501 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9503 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9503 0.7513 0.0008 0.0008 0 360 EARC s +n 0.9504 0.7513 0.0008 0.0008 0 360 EARC s +n 0.9504 0.7513 0.0008 0.0008 0 360 EARC s +n 0.9505 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9507 0.7508 0.0008 0.0008 0 360 EARC s +n 0.9507 0.7508 0.0008 0.0008 0 360 EARC s +n 0.9508 0.7508 0.0008 0.0008 0 360 EARC s +n 0.9508 0.7508 0.0008 0.0008 0 360 EARC s +n 0.9508 0.7503 0.0008 0.0008 0 360 EARC s +n 0.9511 0.7503 0.0008 0.0008 0 360 EARC s +n 0.9511 0.7503 0.0008 0.0008 0 360 EARC s +n 0.9512 0.7503 0.0008 0.0008 0 360 EARC s +n 0.9512 0.7498 0.0008 0.0008 0 360 EARC s +n 0.9513 0.7498 0.0008 0.0008 0 360 EARC s +n 0.9514 0.7498 0.0008 0.0008 0 360 EARC s +n 0.9514 0.7498 0.0008 0.0008 0 360 EARC s +n 0.9515 0.7493 0.0008 0.0008 0 360 EARC s +n 0.9525 0.7493 0.0008 0.0008 0 360 EARC s +n 0.9525 0.7493 0.0008 0.0008 0 360 EARC s +n 0.9526 0.7493 0.0008 0.0008 0 360 EARC s +n 0.9529 0.7506 0.0008 0.0008 0 360 EARC s +n 0.9540 0.7506 0.0008 0.0008 0 360 EARC s +n 0.9540 0.7506 0.0008 0.0008 0 360 EARC s +n 0.9540 0.7539 0.0008 0.0008 0 360 EARC s +n 0.9543 0.7488 0.0008 0.0008 0 360 EARC s +n 0.9553 0.7501 0.0008 0.0008 0 360 EARC s +n 0.9553 0.7501 0.0008 0.0008 0 360 EARC s +n 0.9553 0.7501 0.0008 0.0008 0 360 EARC s +n 0.9556 0.7538 0.0008 0.0008 0 360 EARC s +n 0.9567 0.7484 0.0008 0.0008 0 360 EARC s +n 0.9567 0.7484 0.0008 0.0008 0 360 EARC s +n 0.9568 0.7484 0.0008 0.0008 0 360 EARC s +n 0.9571 0.6768 0.0008 0.0008 0 360 EARC s +n 0.9577 0.6768 0.0008 0.0008 0 360 EARC s +n 0.9580 0.6847 0.0008 0.0008 0 360 EARC s +n 0.9580 0.7481 0.0008 0.0008 0 360 EARC s +n 0.9599 0.7535 0.0008 0.0008 0 360 EARC s +n 0.9599 0.7536 0.0008 0.0008 0 360 EARC s +n 0.9599 0.6765 0.0008 0.0008 0 360 EARC s +n 0.9599 0.6765 0.0008 0.0008 0 360 EARC s +n 0.9599 0.7536 0.0008 0.0008 0 360 EARC s +n 0.9602 0.7537 0.0008 0.0008 0 360 EARC s +n 0.9603 0.7538 0.0008 0.0008 0 360 EARC s +n 0.9603 0.7539 0.0008 0.0008 0 360 EARC s +n 0.9604 0.7539 0.0008 0.0008 0 360 EARC s +n 0.9604 0.7540 0.0008 0.0008 0 360 EARC s +n 0.9605 0.7542 0.0008 0.0008 0 360 EARC s +n 0.9605 0.7544 0.0008 0.0008 0 360 EARC s +n 0.9606 0.7544 0.0008 0.0008 0 360 EARC s +n 0.9607 0.7544 0.0008 0.0008 0 360 EARC s +n 0.9607 0.7544 0.0008 0.0008 0 360 EARC s +n 0.9611 0.7545 0.0008 0.0008 0 360 EARC s +n 0.9612 0.7545 0.0008 0.0008 0 360 EARC s +n 0.9612 0.7545 0.0008 0.0008 0 360 EARC s +n 0.9613 0.7547 0.0008 0.0008 0 360 EARC s +n 0.9613 0.7499 0.0008 0.0008 0 360 EARC s +n 0.9614 0.7547 0.0008 0.0008 0 360 EARC s +n 0.9614 0.7547 0.0008 0.0008 0 360 EARC s +n 0.9615 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9616 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9616 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9617 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9618 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9618 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9619 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9619 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9620 0.7549 0.0008 0.0008 0 360 EARC s +n 0.9620 0.7550 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7551 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7551 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7552 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7553 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7554 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7554 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7554 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7557 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7558 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7561 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7561 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7562 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7562 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7562 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7564 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7565 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7567 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7567 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7568 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7570 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7571 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7572 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7574 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7574 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7575 0.0008 0.0008 0 360 EARC s +n 0.9753 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7576 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7577 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7577 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7577 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7577 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7578 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9754 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9756 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9757 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9757 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9758 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9758 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9758 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9759 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9759 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9761 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9762 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9762 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9763 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9763 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9763 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9764 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9764 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9764 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9765 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9765 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9766 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9766 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9767 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9767 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9768 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9768 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9769 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9769 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9769 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9770 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9771 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9773 0.7635 0.0008 0.0008 0 360 EARC s +n 0.9773 0.7642 0.0008 0.0008 0 360 EARC s +n 0.9774 0.7642 0.0008 0.0008 0 360 EARC s +n 0.9774 0.7642 0.0008 0.0008 0 360 EARC s +n 0.9775 0.7690 0.0008 0.0008 0 360 EARC s +n 0.9775 0.7638 0.0008 0.0008 0 360 EARC s +n 0.9776 0.7638 0.0008 0.0008 0 360 EARC s +n 0.9776 0.7638 0.0008 0.0008 0 360 EARC s +n 0.9777 0.7638 0.0008 0.0008 0 360 EARC s +n 0.9777 0.7633 0.0008 0.0008 0 360 EARC s +n 0.9778 0.7633 0.0008 0.0008 0 360 EARC s +n 0.9779 0.7633 0.0008 0.0008 0 360 EARC s +n 0.9779 0.7633 0.0008 0.0008 0 360 EARC s +n 0.9780 0.3570 0.0008 0.0008 0 360 EARC s +n 0.9780 0.7629 0.0008 0.0008 0 360 EARC s +n 0.9781 0.7629 0.0008 0.0008 0 360 EARC s +n 0.9782 0.7629 0.0008 0.0008 0 360 EARC s +n 0.9782 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9783 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3569 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7686 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3568 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3567 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3567 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3567 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3567 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7686 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3567 0.0008 0.0008 0 360 EARC s +n 0.9888 0.3567 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7686 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7690 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7690 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7690 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7691 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7695 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9888 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7696 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7696 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7697 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7697 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7700 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7700 0.0008 0.0008 0 360 EARC s +n 0.9889 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9891 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9891 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9897 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9898 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9900 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9901 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9901 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9903 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9904 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9904 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9910 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9910 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9913 0.7641 0.0008 0.0008 0 360 EARC s +n 0.9923 0.7641 0.0008 0.0008 0 360 EARC s +n 0.9923 0.7641 0.0008 0.0008 0 360 EARC s +n 0.9923 0.7690 0.0008 0.0008 0 360 EARC s +n 0.9926 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9927 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9928 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9928 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9929 0.7687 0.0008 0.0008 0 360 EARC s +n 0.9930 0.7631 0.0008 0.0008 0 360 EARC s +n 0.9933 0.7631 0.0008 0.0008 0 360 EARC s +n 0.9937 0.7631 0.0008 0.0008 0 360 EARC s +n 0.9938 0.7686 0.0008 0.0008 0 360 EARC s +n 0.9939 0.7687 0.0008 0.0008 0 360 EARC s +n 0.9939 0.7688 0.0008 0.0008 0 360 EARC s +n 0.9939 0.7688 0.0008 0.0008 0 360 EARC s +n 0.9940 0.7688 0.0008 0.0008 0 360 EARC s +n 0.9940 0.7689 0.0008 0.0008 0 360 EARC s +n 0.9941 0.7689 0.0008 0.0008 0 360 EARC s +n 0.9942 0.7690 0.0008 0.0008 0 360 EARC s +n 0.9942 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9948 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9949 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9952 0.7636 0.0008 0.0008 0 360 EARC s +n 0.9953 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9953 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9955 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9956 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9956 0.7692 0.0008 0.0008 0 360 EARC s +n 0.9956 0.7693 0.0008 0.0008 0 360 EARC s +n 0.9957 0.7693 0.0008 0.0008 0 360 EARC s +n 0.9958 0.7693 0.0008 0.0008 0 360 EARC s +n 0.9958 0.7780 0.0008 0.0008 0 360 EARC s +n 0.9959 0.7780 0.0008 0.0008 0 360 EARC s +n 0.9959 0.7780 0.0008 0.0008 0 360 EARC s +n 0.9960 0.7850 0.0008 0.0008 0 360 EARC s +n 0.9960 0.7775 0.0008 0.0008 0 360 EARC s +n 0.9961 0.7775 0.0008 0.0008 0 360 EARC s +n 0.9974 0.7775 0.0008 0.0008 0 360 EARC s +n 0.9974 0.7775 0.0008 0.0008 0 360 EARC s +n 0.9974 0.7770 0.0008 0.0008 0 360 EARC s +n 0.9977 0.7770 0.0008 0.0008 0 360 EARC s +n 0.9978 0.7770 0.0008 0.0008 0 360 EARC s +n 0.9979 0.7770 0.0008 0.0008 0 360 EARC s +n 0.9986 0.7708 0.0008 0.0008 0 360 EARC s +n 0.9986 0.7708 0.0008 0.0008 0 360 EARC s +n 0.9989 0.7709 0.0008 0.0008 0 360 EARC s +n 0.9992 0.7766 0.0008 0.0008 0 360 EARC s +n 0.9993 0.7701 0.0008 0.0008 0 360 EARC s +n 1.0000 0.7701 0.0008 0.0008 0 360 EARC s +n 1.0000 0.7702 0.0008 0.0008 0 360 EARC s +n 1.0003 0.7706 0.0008 0.0008 0 360 EARC s +n 1.0007 0.7687 0.0008 0.0008 0 360 EARC s +n 1.0008 0.7688 0.0008 0.0008 0 360 EARC s +n 1.0009 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0009 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0009 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0019 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0019 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0019 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0022 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0023 0.7691 0.0008 0.0008 0 360 EARC s +n 1.0023 0.7691 0.0008 0.0008 0 360 EARC s +n 1.0024 0.7691 0.0008 0.0008 0 360 EARC s +n 1.0024 0.7691 0.0008 0.0008 0 360 EARC s +n 1.0025 0.7692 0.0008 0.0008 0 360 EARC s +n 1.0025 0.7693 0.0008 0.0008 0 360 EARC s +n 1.0026 0.7693 0.0008 0.0008 0 360 EARC s +n 1.0027 0.7693 0.0008 0.0008 0 360 EARC s +n 1.0027 0.7693 0.0008 0.0008 0 360 EARC s +n 1.0027 0.7694 0.0008 0.0008 0 360 EARC s +n 1.0028 0.7695 0.0008 0.0008 0 360 EARC s +n 1.0029 0.7777 0.0008 0.0008 0 360 EARC s +n 1.0029 0.7777 0.0008 0.0008 0 360 EARC s +n 1.0030 0.7777 0.0008 0.0008 0 360 EARC s +n 1.0030 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0031 0.7765 0.0008 0.0008 0 360 EARC s +n 1.0031 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0032 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0036 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0039 0.7695 0.0008 0.0008 0 360 EARC s +n 1.0046 0.7695 0.0008 0.0008 0 360 EARC s +n 1.0047 0.7696 0.0008 0.0008 0 360 EARC s +n 1.0050 0.7762 0.0008 0.0008 0 360 EARC s +n 1.0051 0.7779 0.0008 0.0008 0 360 EARC s +n 1.0051 0.7779 0.0008 0.0008 0 360 EARC s +n 1.0051 0.7779 0.0008 0.0008 0 360 EARC s +n 1.0052 0.7839 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7688 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7688 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7689 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7690 0.0008 0.0008 0 360 EARC s +n 1.0095 0.7691 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7692 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7692 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7773 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7773 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7773 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7773 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7773 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7773 0.0008 0.0008 0 360 EARC s +n 1.0096 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0099 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0099 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0100 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0100 0.7833 0.0008 0.0008 0 360 EARC s +n 1.0101 0.7833 0.0008 0.0008 0 360 EARC s +n 1.0101 0.7833 0.0008 0.0008 0 360 EARC s +n 1.0102 0.7834 0.0008 0.0008 0 360 EARC s +n 1.0102 0.7834 0.0008 0.0008 0 360 EARC s +n 1.0103 0.7834 0.0008 0.0008 0 360 EARC s +n 1.0103 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0104 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0104 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0108 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0111 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0125 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0125 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0125 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0125 0.7775 0.0008 0.0008 0 360 EARC s +n 1.0126 0.7775 0.0008 0.0008 0 360 EARC s +n 1.0138 0.7775 0.0008 0.0008 0 360 EARC s +n 1.0138 0.7829 0.0008 0.0008 0 360 EARC s +n 1.0138 0.7829 0.0008 0.0008 0 360 EARC s +n 1.0138 0.7829 0.0008 0.0008 0 360 EARC s +n 1.0141 0.7830 0.0008 0.0008 0 360 EARC s +n 1.0142 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0142 0.7829 0.0008 0.0008 0 360 EARC s +n 1.0142 0.7829 0.0008 0.0008 0 360 EARC s +n 1.0143 0.7829 0.0008 0.0008 0 360 EARC s +n 1.0143 0.7830 0.0008 0.0008 0 360 EARC s +n 1.0144 0.7830 0.0008 0.0008 0 360 EARC s +n 1.0144 0.7834 0.0008 0.0008 0 360 EARC s +n 1.0144 0.7834 0.0008 0.0008 0 360 EARC s +n 1.0145 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0145 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0146 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0146 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0147 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0147 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0148 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0148 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0148 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0149 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0149 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0150 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0150 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0154 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0161 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0161 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0164 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0168 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0173 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0175 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0175 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0176 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0177 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0177 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0178 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0178 0.7836 0.0008 0.0008 0 360 EARC s +n 1.0178 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0179 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0179 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0179 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0180 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0180 0.7838 0.0008 0.0008 0 360 EARC s +n 1.0181 0.7838 0.0008 0.0008 0 360 EARC s +n 1.0181 0.7838 0.0008 0.0008 0 360 EARC s +n 1.0181 0.7839 0.0008 0.0008 0 360 EARC s +n 1.0182 0.7839 0.0008 0.0008 0 360 EARC s +n 1.0182 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0183 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0183 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0184 0.7841 0.0008 0.0008 0 360 EARC s +n 1.0184 0.7841 0.0008 0.0008 0 360 EARC s +n 1.0184 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0185 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0185 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0188 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0188 0.7777 0.0008 0.0008 0 360 EARC s +n 1.0189 0.7777 0.0008 0.0008 0 360 EARC s +n 1.0189 0.7777 0.0008 0.0008 0 360 EARC s +n 1.0190 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0190 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0191 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0191 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0191 0.7772 0.0008 0.0008 0 360 EARC s +n 1.0192 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0197 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0199 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0201 0.5722 0.0008 0.0008 0 360 EARC s +n 1.0201 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0202 0.7835 0.0008 0.0008 0 360 EARC s +n 1.0211 0.7837 0.0008 0.0008 0 360 EARC s +n 1.0211 0.7838 0.0008 0.0008 0 360 EARC s +n 1.0214 0.7838 0.0008 0.0008 0 360 EARC s +n 1.0215 0.7839 0.0008 0.0008 0 360 EARC s +n 1.0215 0.7839 0.0008 0.0008 0 360 EARC s +n 1.0216 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0216 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0217 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0217 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0218 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0218 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0219 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0219 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0220 0.7841 0.0008 0.0008 0 360 EARC s +n 1.0220 0.7842 0.0008 0.0008 0 360 EARC s +n 1.0220 0.7842 0.0008 0.0008 0 360 EARC s +n 1.0221 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0221 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0222 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0224 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0224 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0225 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0225 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0226 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0226 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0226 0.7774 0.0008 0.0008 0 360 EARC s +n 1.0227 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0228 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0228 0.7840 0.0008 0.0008 0 360 EARC s +n 1.0228 0.7841 0.0008 0.0008 0 360 EARC s +n 1.0229 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0229 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0230 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0230 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0231 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0232 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0232 0.7843 0.0008 0.0008 0 360 EARC s +n 1.0233 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0235 0.7846 0.0008 0.0008 0 360 EARC s +n 1.0235 0.7847 0.0008 0.0008 0 360 EARC s +n 1.0236 0.7847 0.0008 0.0008 0 360 EARC s +n 1.0236 0.7847 0.0008 0.0008 0 360 EARC s +n 1.0237 0.7845 0.0008 0.0008 0 360 EARC s +n 1.0237 0.7845 0.0008 0.0008 0 360 EARC s +n 1.0237 0.7846 0.0008 0.0008 0 360 EARC s +n 1.0240 0.7846 0.0008 0.0008 0 360 EARC s +n 1.0240 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0241 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7845 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0262 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0265 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0268 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0268 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0269 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0269 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0270 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0270 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0270 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0271 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0271 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0272 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0274 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0274 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0274 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0277 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0277 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0277 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0278 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0278 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0279 0.7844 0.0008 0.0008 0 360 EARC s +n 1.0279 0.7847 0.0008 0.0008 0 360 EARC s +n 1.0280 0.7848 0.0008 0.0008 0 360 EARC s +n 1.0280 0.7848 0.0008 0.0008 0 360 EARC s +n 1.0280 0.7850 0.0008 0.0008 0 360 EARC s +n 1.0281 0.7851 0.0008 0.0008 0 360 EARC s +n 1.0281 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0281 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0282 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0282 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0283 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0283 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0284 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0284 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0285 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0285 0.7852 0.0008 0.0008 0 360 EARC s +n 1.0286 0.7853 0.0008 0.0008 0 360 EARC s +n 1.0286 0.7853 0.0008 0.0008 0 360 EARC s +n 1.0286 0.7853 0.0008 0.0008 0 360 EARC s +n 1.0287 0.7854 0.0008 0.0008 0 360 EARC s +n 1.0287 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0288 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0288 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0289 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0289 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0290 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0290 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0291 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0291 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0292 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0293 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0294 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0308 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0308 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0308 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0308 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0309 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0311 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0312 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0319 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0319 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0322 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0323 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0339 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0339 0.7924 0.0008 0.0008 0 360 EARC s +n 1.0339 0.7924 0.0008 0.0008 0 360 EARC s +n 1.0339 0.7924 0.0008 0.0008 0 360 EARC s +n 1.0339 0.7978 0.0008 0.0008 0 360 EARC s +n 1.0342 0.7920 0.0008 0.0008 0 360 EARC s +n 1.0343 0.7920 0.0008 0.0008 0 360 EARC s +n 1.0344 0.7920 0.0008 0.0008 0 360 EARC s +n 1.0350 0.7920 0.0008 0.0008 0 360 EARC s +n 1.0353 0.7915 0.0008 0.0008 0 360 EARC s +n 1.0354 0.7915 0.0008 0.0008 0 360 EARC s +n 1.0363 0.7915 0.0008 0.0008 0 360 EARC s +n 1.0363 0.7915 0.0008 0.0008 0 360 EARC s +n 1.0363 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0367 0.7910 0.0008 0.0008 0 360 EARC s +n 1.0379 0.7910 0.0008 0.0008 0 360 EARC s +n 1.0379 0.7910 0.0008 0.0008 0 360 EARC s +n 1.0379 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0382 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0394 0.7975 0.0008 0.0008 0 360 EARC s +n 1.0394 0.7907 0.0008 0.0008 0 360 EARC s +n 1.0394 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0398 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0398 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0399 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0399 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0400 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0400 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0401 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0409 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0409 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0412 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0413 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0414 0.7917 0.0008 0.0008 0 360 EARC s +n 1.0415 0.7968 0.0008 0.0008 0 360 EARC s +n 1.0416 0.7968 0.0008 0.0008 0 360 EARC s +n 1.0417 0.7968 0.0008 0.0008 0 360 EARC s +n 1.0418 0.7968 0.0008 0.0008 0 360 EARC s +n 1.0418 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0419 0.7970 0.0008 0.0008 0 360 EARC s +n 1.0419 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0420 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0421 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0421 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0422 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0422 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0423 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0424 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0424 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0425 0.7974 0.0008 0.0008 0 360 EARC s +n 1.0425 0.7975 0.0008 0.0008 0 360 EARC s +n 1.0426 0.7975 0.0008 0.0008 0 360 EARC s +n 1.0427 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0427 0.7977 0.0008 0.0008 0 360 EARC s +n 1.0428 0.7977 0.0008 0.0008 0 360 EARC s +n 1.0429 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0430 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0430 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0431 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0431 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0437 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0439 0.7919 0.0008 0.0008 0 360 EARC s +n 1.0440 0.7919 0.0008 0.0008 0 360 EARC s +n 1.0441 0.7919 0.0008 0.0008 0 360 EARC s +n 1.0441 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0442 0.7914 0.0008 0.0008 0 360 EARC s +n 1.0442 0.7914 0.0008 0.0008 0 360 EARC s +n 1.0443 0.7914 0.0008 0.0008 0 360 EARC s +n 1.0443 0.7914 0.0008 0.0008 0 360 EARC s +n 1.0444 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0444 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0445 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0445 0.7970 0.0008 0.0008 0 360 EARC s +n 1.0446 0.7970 0.0008 0.0008 0 360 EARC s +n 1.0446 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0447 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0448 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0449 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0450 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0451 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0453 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0453 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0454 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0454 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0454 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0455 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0455 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0456 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0456 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0457 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0457 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0458 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0458 0.7916 0.0008 0.0008 0 360 EARC s +n 1.0459 0.8053 0.0008 0.0008 0 360 EARC s +n 1.0466 0.8053 0.0008 0.0008 0 360 EARC s +n 1.0466 0.8053 0.0008 0.0008 0 360 EARC s +n 1.0469 0.8132 0.0008 0.0008 0 360 EARC s +n 1.0470 0.7995 0.0008 0.0008 0 360 EARC s +n 1.0470 0.7995 0.0008 0.0008 0 360 EARC s +n 1.0471 0.7995 0.0008 0.0008 0 360 EARC s +n 1.0472 0.7995 0.0008 0.0008 0 360 EARC s +n 1.0473 0.7994 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7994 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7994 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7994 0.0008 0.0008 0 360 EARC s +n 1.0536 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7993 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7993 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7994 0.0008 0.0008 0 360 EARC s +n 1.0536 0.7990 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7992 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7992 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7992 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7989 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7989 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7989 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7989 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7988 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7988 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7989 0.0008 0.0008 0 360 EARC s +n 1.0537 0.7989 0.0008 0.0008 0 360 EARC s +n 1.0540 0.7986 0.0008 0.0008 0 360 EARC s +n 1.0557 0.7987 0.0008 0.0008 0 360 EARC s +n 1.0557 0.7987 0.0008 0.0008 0 360 EARC s +n 1.0557 0.7987 0.0008 0.0008 0 360 EARC s +n 1.0557 0.7967 0.0008 0.0008 0 360 EARC s +n 1.0557 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0558 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0560 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0561 0.7970 0.0008 0.0008 0 360 EARC s +n 1.0561 0.7970 0.0008 0.0008 0 360 EARC s +n 1.0562 0.7971 0.0008 0.0008 0 360 EARC s +n 1.0562 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0562 0.7972 0.0008 0.0008 0 360 EARC s +n 1.0563 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0563 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0563 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0564 0.7973 0.0008 0.0008 0 360 EARC s +n 1.0564 0.7975 0.0008 0.0008 0 360 EARC s +n 1.0566 0.7975 0.0008 0.0008 0 360 EARC s +n 1.0567 0.7975 0.0008 0.0008 0 360 EARC s +n 1.0567 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0567 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0568 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0568 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0569 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0569 0.7976 0.0008 0.0008 0 360 EARC s +n 1.0569 0.7977 0.0008 0.0008 0 360 EARC s +n 1.0570 0.7977 0.0008 0.0008 0 360 EARC s +n 1.0570 0.7977 0.0008 0.0008 0 360 EARC s +n 1.0570 0.7978 0.0008 0.0008 0 360 EARC s +n 1.0571 0.7978 0.0008 0.0008 0 360 EARC s +n 1.0571 0.7978 0.0008 0.0008 0 360 EARC s +n 1.0572 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0572 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0572 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0573 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0573 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0574 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0574 0.7979 0.0008 0.0008 0 360 EARC s +n 1.0575 0.7981 0.0008 0.0008 0 360 EARC s +n 1.0575 0.7981 0.0008 0.0008 0 360 EARC s +n 1.0575 0.7984 0.0008 0.0008 0 360 EARC s +n 1.0576 0.7984 0.0008 0.0008 0 360 EARC s +n 1.0576 0.7985 0.0008 0.0008 0 360 EARC s +n 1.0576 0.8066 0.0008 0.0008 0 360 EARC s +n 1.0577 0.8066 0.0008 0.0008 0 360 EARC s +n 1.0577 0.8066 0.0008 0.0008 0 360 EARC s +n 1.0578 0.8129 0.0008 0.0008 0 360 EARC s +n 1.0580 0.8062 0.0008 0.0008 0 360 EARC s +n 1.0580 0.8062 0.0008 0.0008 0 360 EARC s +n 1.0581 0.8062 0.0008 0.0008 0 360 EARC s +n 1.0583 0.8062 0.0008 0.0008 0 360 EARC s +n 1.0583 0.8057 0.0008 0.0008 0 360 EARC s +n 1.0584 0.8057 0.0008 0.0008 0 360 EARC s +n 1.0584 0.8057 0.0008 0.0008 0 360 EARC s +n 1.0585 0.8057 0.0008 0.0008 0 360 EARC s +n 1.0587 0.8052 0.0008 0.0008 0 360 EARC s +n 1.0587 0.8052 0.0008 0.0008 0 360 EARC s +n 1.0588 0.8052 0.0008 0.0008 0 360 EARC s +n 1.0588 0.8052 0.0008 0.0008 0 360 EARC s +n 1.0589 0.8047 0.0008 0.0008 0 360 EARC s +n 1.0590 0.8047 0.0008 0.0008 0 360 EARC s +n 1.0590 0.8047 0.0008 0.0008 0 360 EARC s +n 1.0591 0.8047 0.0008 0.0008 0 360 EARC s +n 1.0591 0.8042 0.0008 0.0008 0 360 EARC s +n 1.0601 0.8042 0.0008 0.0008 0 360 EARC s +n 1.0601 0.8042 0.0008 0.0008 0 360 EARC s +n 1.0601 0.8042 0.0008 0.0008 0 360 EARC s +n 1.0605 0.8058 0.0008 0.0008 0 360 EARC s +n 1.0608 0.8058 0.0008 0.0008 0 360 EARC s +n 1.0611 0.8058 0.0008 0.0008 0 360 EARC s +n 1.0612 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0612 0.8054 0.0008 0.0008 0 360 EARC s +n 1.0620 0.8054 0.0008 0.0008 0 360 EARC s +n 1.0621 0.8054 0.0008 0.0008 0 360 EARC s +n 1.0624 0.8054 0.0008 0.0008 0 360 EARC s +n 1.0624 0.3607 0.0008 0.0008 0 360 EARC s +n 1.0625 0.3791 0.0008 0.0008 0 360 EARC s +n 1.0627 0.3974 0.0008 0.0008 0 360 EARC s +n 1.0628 0.7968 0.0008 0.0008 0 360 EARC s +n 1.0632 0.7968 0.0008 0.0008 0 360 EARC s +n 1.0635 0.7969 0.0008 0.0008 0 360 EARC s +n 1.0636 0.3424 0.0008 0.0008 0 360 EARC s +n 1.0637 0.8051 0.0008 0.0008 0 360 EARC s +n 1.0638 0.8114 0.0008 0.0008 0 360 EARC s +n 1.0638 0.8114 0.0008 0.0008 0 360 EARC s +n 1.0639 0.8114 0.0008 0.0008 0 360 EARC s +n 1.0640 0.8114 0.0008 0.0008 0 360 EARC s +n 1.0644 0.8114 0.0008 0.0008 0 360 EARC s +n 1.0722 0.8114 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8115 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8116 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8116 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8116 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0723 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0724 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0724 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0724 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0724 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0724 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0724 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0726 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0737 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0737 0.4157 0.0008 0.0008 0 360 EARC s +n 1.0737 0.4340 0.0008 0.0008 0 360 EARC s +n 1.0741 0.4523 0.0008 0.0008 0 360 EARC s +n 1.0741 0.4707 0.0008 0.0008 0 360 EARC s +n 1.0743 0.7643 0.0008 0.0008 0 360 EARC s +n 1.0744 0.7826 0.0008 0.0008 0 360 EARC s +n 1.0744 0.8009 0.0008 0.0008 0 360 EARC s +n 1.0744 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0745 0.7091 0.0008 0.0008 0 360 EARC s +n 1.0745 0.7275 0.0008 0.0008 0 360 EARC s +n 1.0745 0.7458 0.0008 0.0008 0 360 EARC s +n 1.0748 0.7641 0.0008 0.0008 0 360 EARC s +n 1.0750 0.6356 0.0008 0.0008 0 360 EARC s +n 1.0750 0.6540 0.0008 0.0008 0 360 EARC s +n 1.0751 0.6723 0.0008 0.0008 0 360 EARC s +n 1.0753 0.6906 0.0008 0.0008 0 360 EARC s +n 1.0753 0.5622 0.0008 0.0008 0 360 EARC s +n 1.0754 0.5805 0.0008 0.0008 0 360 EARC s +n 1.0754 0.5989 0.0008 0.0008 0 360 EARC s +n 1.0756 0.6172 0.0008 0.0008 0 360 EARC s +n 1.0756 0.4888 0.0008 0.0008 0 360 EARC s +n 1.0757 0.5071 0.0008 0.0008 0 360 EARC s +n 1.0757 0.5255 0.0008 0.0008 0 360 EARC s +n 1.0758 0.5438 0.0008 0.0008 0 360 EARC s +n 1.0758 0.8116 0.0008 0.0008 0 360 EARC s +n 1.0759 0.8116 0.0008 0.0008 0 360 EARC s +n 1.0759 0.8116 0.0008 0.0008 0 360 EARC s +n 1.0760 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0760 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0761 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0761 0.8117 0.0008 0.0008 0 360 EARC s +n 1.0761 0.8118 0.0008 0.0008 0 360 EARC s +n 1.0764 0.8119 0.0008 0.0008 0 360 EARC s +n 1.0764 0.8122 0.0008 0.0008 0 360 EARC s +n 1.0765 0.8122 0.0008 0.0008 0 360 EARC s +n 1.0765 0.8122 0.0008 0.0008 0 360 EARC s +n 1.0766 0.8123 0.0008 0.0008 0 360 EARC s +n 1.0768 0.8123 0.0008 0.0008 0 360 EARC s +n 1.0768 0.8124 0.0008 0.0008 0 360 EARC s +n 1.0768 0.8124 0.0008 0.0008 0 360 EARC s +n 1.0769 0.8125 0.0008 0.0008 0 360 EARC s +n 1.0769 0.8125 0.0008 0.0008 0 360 EARC s +n 1.0770 0.8125 0.0008 0.0008 0 360 EARC s +n 1.0770 0.8125 0.0008 0.0008 0 360 EARC s +n 1.0771 0.8126 0.0008 0.0008 0 360 EARC s +n 1.0771 0.8127 0.0008 0.0008 0 360 EARC s +n 1.0772 0.8128 0.0008 0.0008 0 360 EARC s +n 1.0772 0.8129 0.0008 0.0008 0 360 EARC s +n 1.0774 0.8129 0.0008 0.0008 0 360 EARC s +n 1.0775 0.8129 0.0008 0.0008 0 360 EARC s +n 1.0775 0.8130 0.0008 0.0008 0 360 EARC s +n 1.0776 0.8130 0.0008 0.0008 0 360 EARC s +n 1.0777 0.8130 0.0008 0.0008 0 360 EARC s +n 1.0777 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0778 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0778 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0778 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0779 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0779 0.8131 0.0008 0.0008 0 360 EARC s +n 1.0780 0.8132 0.0008 0.0008 0 360 EARC s +n 1.0780 0.8132 0.0008 0.0008 0 360 EARC s +n 1.0781 0.8132 0.0008 0.0008 0 360 EARC s +n 1.0781 0.8132 0.0008 0.0008 0 360 EARC s +n 1.0784 0.8132 0.0008 0.0008 0 360 EARC s +n 1.0785 0.8133 0.0008 0.0008 0 360 EARC s +/Times-Roman findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font32 exch definefont pop +/Font32 FFSF +[/DeviceRGB] SCS +Color6 SC +0.1447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.3724 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5) show +GR +/Font32 FFSF +0.5936 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(10) show +GR +/Font32 FFSF +0.8212 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(15) show +GR +/Font32 FFSF +1.0481 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(20) show +GR +/Font32 FFSF +0.5453 0.0951 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(Runtime \(seconds\)) show +GR +/Font32 FFSF +0.1337 0.4088 m +GS +[0.0000 0.0280 -0.0280 0.0000 0 0] CC +(Seek Magnitude) show +GR +n +0.1500 0.1500 m +0.1500 0.8500 l +1.1500 0.8500 l +1.1500 0.1500 l +0.1500 0.1500 l +c +s +n +0.3000 0.3000 m +0.3000 0.2382 l +0.4388 0.2382 l +0.4388 0.3000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color1 SC +n +0.3000 0.3000 m +0.3000 0.2382 l +0.4388 0.2382 l +0.4388 0.3000 l +0.3000 0.3000 l +c +s +/Font32 FFSF +0.3700 0.2747 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(Reads) show +GR +[/DeviceRGB] SCS +Color2 SC +n 0.3300 0.2822 0.0008 0.0008 0 360 EARC s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.3700 0.2486 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(Writes) show +GR +[/DeviceRGB] SCS +Color4 SC +n 0.3300 0.2563 0.0008 0.0008 0 360 EARC s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.4237 0.9190 m +GS +[0.0420 0.0000 0.0000 0.0420 0 0] CC +(BTT Sample Seek Patterns) show +GR +%%Trailer +%%DocumentNeededResources: font Times-Roman +%%EOF diff --git a/btt/doc/sps.eps b/btt/doc/sps.eps new file mode 100644 index 0000000..cfb0ec7 --- /dev/null +++ b/btt/doc/sps.eps @@ -0,0 +1,5377 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: (atend) +%%LanguageLevel: 2 +%%Creator: Grace-5.1.21 +%%CreationDate: Wed May 21 10:39:20 2008 +%%DocumentData: Clean8Bit +%%Orientation: Portrait +%%Title: Untitled +%%For: adb +%%DocumentNeededResources: (atend) +%%EndComments +%%BeginProlog +/m {moveto} def +/l {lineto} def +/s {stroke} def +/n {newpath} def +/c {closepath} def +/RL {rlineto} def +/SLW {setlinewidth} def +/GS {gsave} def +/GR {grestore} def +/SC {setcolor} def +/SGRY {setgray} def +/SRGB {setrgbcolor} def +/SD {setdash} def +/SLC {setlinecap} def +/SLJ {setlinejoin} def +/SCS {setcolorspace} def +/FFSF {findfont setfont} def +/CC {concat} def +/PXL {n m 0 0 RL s} def +/Color0 {1.0000 1.0000 1.0000} def +/Color1 {0.0000 0.0000 0.0000} def +/Color2 {1.0000 0.0000 0.0000} def +/Color3 {0.0000 1.0000 0.0000} def +/Color4 {0.0000 0.0000 1.0000} def +/Color5 {1.0000 1.0000 0.0000} def +/Color6 {0.7373 0.5608 0.5608} def +/Color7 {0.8627 0.8627 0.8627} def +/Color8 {0.5804 0.0000 0.8275} def +/Color9 {0.0000 1.0000 1.0000} def +/Color10 {1.0000 0.0000 1.0000} def +/Color11 {1.0000 0.6471 0.0000} def +/Color12 {0.4471 0.1294 0.7373} def +/Color13 {0.4039 0.0275 0.2824} def +/Color14 {0.2510 0.8784 0.8157} def +/Color15 {0.0000 0.5451 0.0000} def +/PTRN { + /pat_bits exch def + << + /PaintType 2 + /PatternType 1 /TilingType 1 + /BBox[0 0 16 16] + /XStep 16 /YStep 16 + /PaintProc { + pop + 16 16 true [-1 0 0 -1 16 16] pat_bits imagemask + } + >> + [0.0016 0 0 0.0016 0 0] + makepattern +} def +/Pattern0 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern1 {<ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff> PTRN} bind def +/Pattern2 {<eeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffffeeeeffffbbbbffff> PTRN} bind def +/Pattern3 {<eeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbb> PTRN} bind def +/Pattern4 {<5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa5555aaaa> PTRN} bind def +/Pattern5 {<1111444411114444111144441111444411114444111144441111444411114444> PTRN} bind def +/Pattern6 {<1111000044440000111100004444000011110000444400001111000044440000> PTRN} bind def +/Pattern7 {<1010000000000000010100000000000010100000000000000101000000000000> PTRN} bind def +/Pattern8 {<0000000000000000000000000000000000000000000000000000000000000000> PTRN} bind def +/Pattern9 {<1e1e0f0f8787c3c3e1e1f0f078783c3c1e1e0f0f8787c3c3e1e1f0f078783c3c> PTRN} bind def +/Pattern10 {<7878f0f0e1e1c3c387870f0f1e1e3c3c7878f0f0e1e1c3c387870f0f1e1e3c3c> PTRN} bind def +/Pattern11 {<3333333333333333333333333333333333333333333333333333333333333333> PTRN} bind def +/Pattern12 {<ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000> PTRN} bind def +/Pattern13 {<8181424224241818181824244242818181814242242418181818242442428181> PTRN} bind def +/Pattern14 {<8080404020201010080804040202010180804040202010100808040402020101> PTRN} bind def +/Pattern15 {<0101020204040808101020204040808001010202040408081010202040408080> PTRN} bind def +/Pattern16 {<2222222222222222222222222222222222222222222222222222222222222222> PTRN} bind def +/Pattern17 {<0000ffff000000000000ffff000000000000ffff000000000000ffff00000000> PTRN} bind def +/Pattern18 {<2222ffff222222222222ffff222222222222ffff222222222222ffff22222222> PTRN} bind def +/Pattern19 {<ffffffff33333333ffffffff33333333ffffffff33333333ffffffff33333333> PTRN} bind def +/Pattern20 {<0f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f00f0f0f0f0f0f0f0ff0f0f0f0f0f0f0f0> PTRN} bind def +/Pattern21 {<ff00ff00ff00ff00ff00ff00ff00ff0000ff00ff00ff00ff00ff00ff00ff00ff> PTRN} bind def +/Pattern22 {<8001800180018001800180018001ffffffff8001800180018001800180018001> PTRN} bind def +/Pattern23 {<c003c003c003c003c003c003ffffffffffffffffc003c003c003c003c003c003> PTRN} bind def +/Pattern24 {<040404040404ffff404040404040ffff040404040404ffff404040404040ffff> PTRN} bind def +/Pattern25 {<180018001800180018001800ffffffff001800180018001800180018ffffffff> PTRN} bind def +/Pattern26 {<1111b8b87c7c3a3a1111a3a3c7c78b8b1111b8b87c7c3a3a1111a3a3c7c78b8b> PTRN} bind def +/Pattern27 {<101010102828c7c70101010182827c7c101010102828c7c70101010182827c7c> PTRN} bind def +/Pattern28 {<1c1c121211112121c1c12121111112121c1c121211112121c1c1212111111212> PTRN} bind def +/Pattern29 {<3e3e414180808080e3e31414080808083e3e414180808080e3e3141408080808> PTRN} bind def +/Pattern30 {<4848888884848383848488884848383848488888848483838484888848483838> PTRN} bind def +/Pattern31 {<03030404080808080c0c12122121c0c003030404080808080c0c12122121c0c0> PTRN} bind def +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/EARC { + ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y translate + xrad yrad scale + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def +/TL { + /kcomp exch def + /linewidth exch def + /offset exch def + GS + 0 offset rmoveto + linewidth SLW + dup stringwidth exch kcomp add exch RL s + GR +} def +/KINIT +{ + /kvector exch def + /kid 0 def +} def +/KPROC +{ + pop pop + kvector kid get + 0 rmoveto + /kid 1 kid add def +} def +/DefEncoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /acute + /mu + /paragraph + /periodcentered + /cedilla + /onesuperior + /ordmasculine + /guillemotright + /onequarter + /onehalf + /threequarters + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /ydieresis +] def +%%EndProlog +%%BeginSetup +%%EndSetup +612.00 612.00 scale +n +0.0000 0.0000 m +0.0000 1.0000 l +1.2941 1.0000 l +1.2941 0.0000 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +[0.0015 0.0045 ] 0 SD +0.0015 SLW +0 SLC +0 SLJ +n +0.1641 0.5318 m +0.1641 0.8500 l +s +n +0.1781 0.5318 m +0.1781 0.8500 l +s +n +0.1922 0.5318 m +0.1922 0.8500 l +s +n +0.2203 0.5318 m +0.2203 0.8500 l +s +n +0.2343 0.5318 m +0.2343 0.8500 l +s +n +0.2484 0.5318 m +0.2484 0.8500 l +s +n +0.2765 0.5318 m +0.2765 0.8500 l +s +n +0.2906 0.5318 m +0.2906 0.8500 l +s +n +0.3046 0.5318 m +0.3046 0.8500 l +s +n +0.3327 0.5318 m +0.3327 0.8500 l +s +n +0.3468 0.5318 m +0.3468 0.8500 l +s +n +0.3609 0.5318 m +0.3609 0.8500 l +s +n +0.3890 0.5318 m +0.3890 0.8500 l +s +n +0.4030 0.5318 m +0.4030 0.8500 l +s +n +0.4171 0.5318 m +0.4171 0.8500 l +s +n +0.4452 0.5318 m +0.4452 0.8500 l +s +n +0.4593 0.5318 m +0.4593 0.8500 l +s +n +0.4733 0.5318 m +0.4733 0.8500 l +s +n +0.5014 0.5318 m +0.5014 0.8500 l +s +n +0.5155 0.5318 m +0.5155 0.8500 l +s +n +0.5295 0.5318 m +0.5295 0.8500 l +s +n +0.5576 0.5318 m +0.5576 0.8500 l +s +n +0.5717 0.5318 m +0.5717 0.8500 l +s +n +0.5858 0.5318 m +0.5858 0.8500 l +s +n +0.6139 0.5318 m +0.6139 0.8500 l +s +n +0.6279 0.5318 m +0.6279 0.8500 l +s +n +0.6420 0.5318 m +0.6420 0.8500 l +s +n +0.6701 0.5318 m +0.6701 0.8500 l +s +n +0.6842 0.5318 m +0.6842 0.8500 l +s +n +0.6982 0.5318 m +0.6982 0.8500 l +s +n +0.7263 0.5318 m +0.7263 0.8500 l +s +n +0.7404 0.5318 m +0.7404 0.8500 l +s +n +0.7544 0.5318 m +0.7544 0.8500 l +s +n +0.7826 0.5318 m +0.7826 0.8500 l +s +n +0.7966 0.5318 m +0.7966 0.8500 l +s +n +0.8107 0.5318 m +0.8107 0.8500 l +s +n +0.8388 0.5318 m +0.8388 0.8500 l +s +n +0.8528 0.5318 m +0.8528 0.8500 l +s +n +0.8669 0.5318 m +0.8669 0.8500 l +s +n +0.8950 0.5318 m +0.8950 0.8500 l +s +n +0.9091 0.5318 m +0.9091 0.8500 l +s +n +0.9231 0.5318 m +0.9231 0.8500 l +s +n +0.9512 0.5318 m +0.9512 0.8500 l +s +n +0.9653 0.5318 m +0.9653 0.8500 l +s +n +0.9794 0.5318 m +0.9794 0.8500 l +s +n +1.0075 0.5318 m +1.0075 0.8500 l +s +n +1.0215 0.5318 m +1.0215 0.8500 l +s +n +1.0356 0.5318 m +1.0356 0.8500 l +s +n +1.0637 0.5318 m +1.0637 0.8500 l +s +n +1.0778 0.5318 m +1.0778 0.8500 l +s +n +1.0918 0.5318 m +1.0918 0.8500 l +s +n +1.1199 0.5318 m +1.1199 0.8500 l +s +n +1.1340 0.5318 m +1.1340 0.8500 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.5318 m +0.1500 0.8500 l +s +n +0.2062 0.5318 m +0.2062 0.8500 l +s +n +0.2625 0.5318 m +0.2625 0.8500 l +s +n +0.3187 0.5318 m +0.3187 0.8500 l +s +n +0.3749 0.5318 m +0.3749 0.8500 l +s +n +0.4311 0.5318 m +0.4311 0.8500 l +s +n +0.4874 0.5318 m +0.4874 0.8500 l +s +n +0.5436 0.5318 m +0.5436 0.8500 l +s +n +0.5998 0.5318 m +0.5998 0.8500 l +s +n +0.6560 0.5318 m +0.6560 0.8500 l +s +n +0.7123 0.5318 m +0.7123 0.8500 l +s +n +0.7685 0.5318 m +0.7685 0.8500 l +s +n +0.8247 0.5318 m +0.8247 0.8500 l +s +n +0.8810 0.5318 m +0.8810 0.8500 l +s +n +0.9372 0.5318 m +0.9372 0.8500 l +s +n +0.9934 0.5318 m +0.9934 0.8500 l +s +n +1.0496 0.5318 m +1.0496 0.8500 l +s +n +1.1059 0.5318 m +1.1059 0.8500 l +s +[0.0015 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.5636 m +1.1433 0.5636 l +s +n +0.1500 0.6273 m +1.1433 0.6273 l +s +n +0.1500 0.6909 m +1.1433 0.6909 l +s +n +0.1500 0.7545 m +1.1433 0.7545 l +s +n +0.1500 0.8182 m +1.1433 0.8182 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.5318 m +1.1433 0.5318 l +s +n +0.1500 0.5955 m +1.1433 0.5955 l +s +n +0.1500 0.6591 m +1.1433 0.6591 l +s +n +0.1500 0.7227 m +1.1433 0.7227 l +s +n +0.1500 0.7864 m +1.1433 0.7864 l +s +n +0.1500 0.8500 m +1.1433 0.8500 l +s +n +0.1500 0.5392 m +0.1580 0.7320 l +0.1589 0.7266 l +0.1599 0.6516 l +0.1652 0.6757 l +0.1661 0.6878 l +0.1670 0.6660 l +0.1680 0.7634 l +0.1694 0.6348 l +0.1704 0.5723 l +0.1714 0.5393 l +0.1725 0.5336 l +0.1744 0.6140 l +0.1753 0.6132 l +0.1763 0.5785 l +0.1772 0.5963 l +0.1783 0.6109 l +0.1792 0.6014 l +0.1801 0.5850 l +0.1811 0.5346 l +0.1822 0.5842 l +0.1831 0.5471 l +0.1841 0.5332 l +0.1850 0.5325 l +0.1860 0.5343 l +0.1871 0.5330 l +0.1881 0.5326 l +0.1891 0.5324 l +0.1902 0.5325 l +0.1912 0.5346 l +0.1922 0.5323 l +0.1932 0.5344 l +0.1943 0.5338 l +0.1952 0.5335 l +0.1962 0.5329 l +0.1972 0.5327 l +0.1983 0.5323 l +0.1995 0.5341 l +0.2006 0.5352 l +0.2016 0.5323 l +0.2026 0.5322 l +0.2036 0.5325 l +0.2046 0.5348 l +0.2056 0.6288 l +0.2066 0.5557 l +0.2075 0.5343 l +0.2086 0.5323 l +0.2096 0.5332 l +0.2107 0.5334 l +0.2116 0.5325 l +0.2129 0.5325 l +0.2138 0.5329 l +0.2149 0.5325 l +0.2159 0.5327 l +0.2170 0.5325 l +0.2183 0.5325 l +0.2193 0.5324 l +0.2202 0.5335 l +0.2212 0.5334 l +0.2221 0.5324 l +0.2236 0.5319 l +0.2248 0.5331 l +0.2260 0.6155 l +0.2271 0.5943 l +0.2280 0.5787 l +0.2289 0.6189 l +0.2299 0.5783 l +0.2308 0.6239 l +0.2317 0.7085 l +0.2327 0.6504 l +0.2338 0.5650 l +0.2348 0.5881 l +0.2357 0.5729 l +0.2366 0.5631 l +0.2376 0.5735 l +0.2385 0.5630 l +0.2395 0.5527 l +0.2404 0.5479 l +0.2414 0.5451 l +0.2424 0.5526 l +0.2434 0.5486 l +0.2443 0.5514 l +0.2453 0.5458 l +0.2462 0.6004 l +0.2472 0.5975 l +0.2482 0.6033 l +0.2492 0.5736 l +0.2501 0.6625 l +0.2511 0.6248 l +0.2520 0.6165 l +0.2530 0.6244 l +0.2539 0.6472 l +0.2549 0.5909 l +0.2558 0.5542 l +0.2567 0.5546 l +0.2577 0.6066 l +0.2586 0.6610 l +0.2596 0.7084 l +0.2605 0.7041 l +0.2615 0.7072 l +0.2624 0.7142 l +0.2633 0.7032 l +0.2643 0.7193 l +0.2652 0.5935 l +0.2662 0.5715 l +0.2671 0.5456 l +0.2681 0.5328 l +0.2704 0.5915 l +0.2713 0.5946 l +0.2722 0.5902 l +0.2732 0.5739 l +0.2741 0.5917 l +0.2751 0.6343 l +0.2760 0.6083 l +0.2770 0.5547 l +0.2779 0.5386 l +0.2789 0.5475 l +0.2798 0.5705 l +0.2808 0.5431 l +0.2818 0.5325 l +0.2827 0.5325 l +0.2837 0.5369 l +0.2848 0.5341 l +0.2857 0.5324 l +0.2867 0.5324 l +0.2877 0.5327 l +0.2888 0.5329 l +0.2897 0.5322 l +0.2907 0.5323 l +0.2916 0.5324 l +0.2926 0.5329 l +0.2935 0.5332 l +0.2945 0.5336 l +0.2955 0.5335 l +0.2965 0.5334 l +0.2976 0.5326 l +0.2987 0.5336 l +0.3001 0.5322 l +0.3011 0.5326 l +0.3020 0.5322 l +0.3031 0.5322 l +0.3041 0.5323 l +0.3054 0.5321 l +0.3064 0.5701 l +0.3073 0.5967 l +0.3085 0.5327 l +0.3095 0.5329 l +0.3105 0.5331 l +0.3116 0.5326 l +0.3128 0.5323 l +0.3140 0.5326 l +0.3151 0.5323 l +0.3160 0.5341 l +0.3171 0.5323 l +0.3181 0.5347 l +0.3191 0.5324 l +0.3202 0.5333 l +0.3212 0.5322 l +0.3228 0.5341 l +0.3240 0.6006 l +0.3251 0.5955 l +0.3261 0.5649 l +0.3270 0.6039 l +0.3280 0.5766 l +0.3289 0.5728 l +0.3298 0.5787 l +0.3308 0.5912 l +0.3317 0.5523 l +0.3327 0.5798 l +0.3336 0.5778 l +0.3346 0.5852 l +0.3356 0.5803 l +0.3365 0.5692 l +0.3375 0.5568 l +0.3384 0.5497 l +0.3394 0.5481 l +0.3403 0.5550 l +0.3413 0.5504 l +0.3422 0.5544 l +0.3432 0.5398 l +0.3442 0.5998 l +0.3453 0.6158 l +0.3463 0.6987 l +0.3473 0.6729 l +0.3482 0.6695 l +0.3492 0.5681 l +0.3501 0.5713 l +0.3511 0.6052 l +0.3520 0.5817 l +0.3530 0.5518 l +0.3540 0.5541 l +0.3550 0.6462 l +0.3559 0.6965 l +0.3568 0.6913 l +0.3578 0.6677 l +0.3587 0.6511 l +0.3597 0.6913 l +0.3606 0.7355 l +0.3615 0.6887 l +0.3625 0.6773 l +0.3634 0.5739 l +0.3645 0.5737 l +0.3655 0.5361 l +0.3666 0.5337 l +0.3685 0.5902 l +0.3694 0.5803 l +0.3703 0.5969 l +0.3713 0.5693 l +0.3722 0.5925 l +0.3732 0.5998 l +0.3741 0.6172 l +0.3750 0.5567 l +0.3760 0.5468 l +0.3771 0.5385 l +0.3786 0.5775 l +0.3795 0.5490 l +0.3804 0.5390 l +0.3814 0.5327 l +0.3826 0.5332 l +0.3835 0.5369 l +0.3845 0.5328 l +0.3854 0.5322 l +0.3864 0.5326 l +0.3874 0.5324 l +0.3885 0.5325 l +0.3895 0.5322 l +0.3905 0.5325 l +0.3914 0.5322 l +0.3924 0.5335 l +0.3934 0.5330 l +0.3944 0.5354 l +0.3953 0.5341 l +0.3963 0.5383 l +0.3976 0.5323 l +0.3986 0.5321 l +0.3997 0.5333 l +0.4007 0.6141 l +0.4016 0.5530 l +0.4026 0.5323 l +0.4036 0.5326 l +0.4047 0.5323 l +0.4056 0.5332 l +0.4066 0.5355 l +0.4076 0.5348 l +0.4086 0.5322 l +0.4098 0.5334 l +0.4108 0.5324 l +0.4118 0.5324 l +0.4130 0.5322 l +0.4140 0.5332 l +0.4150 0.5332 l +0.4160 0.5324 l +0.4170 0.5324 l +0.4180 0.5342 l +0.4189 0.5326 l +0.4199 0.5321 l +0.4218 0.5332 l +0.4230 0.6223 l +0.4240 0.5670 l +0.4249 0.5782 l +0.4260 0.5861 l +0.4269 0.5899 l +0.4279 0.5754 l +0.4288 0.5697 l +0.4297 0.5686 l +0.4307 0.5862 l +0.4317 0.5827 l +0.4327 0.5732 l +0.4336 0.5856 l +0.4346 0.5801 l +0.4355 0.5750 l +0.4365 0.5638 l +0.4374 0.5521 l +0.4384 0.5496 l +0.4393 0.5503 l +0.4403 0.5504 l +0.4412 0.5462 l +0.4422 0.5514 l +0.4431 0.5801 l +0.4441 0.7010 l +0.4450 0.6765 l +0.4460 0.6616 l +0.4469 0.5743 l +0.4479 0.5518 l +0.4488 0.5638 l +0.4498 0.5598 l +0.4507 0.5955 l +0.4516 0.5873 l +0.4526 0.5569 l +0.4535 0.5579 l +0.4545 0.6343 l +0.4555 0.6676 l +0.4564 0.6833 l +0.4574 0.6721 l +0.4583 0.6863 l +0.4593 0.6946 l +0.4602 0.7148 l +0.4612 0.7269 l +0.4621 0.6609 l +0.4630 0.6254 l +0.4641 0.5589 l +0.4651 0.5749 l +0.4660 0.5327 l +0.4671 0.5382 l +0.4686 0.5939 l +0.4695 0.5808 l +0.4705 0.5898 l +0.4714 0.5721 l +0.4725 0.5934 l +0.4734 0.5982 l +0.4743 0.6144 l +0.4753 0.5579 l +0.4762 0.5528 l +0.4772 0.5394 l +0.4781 0.5461 l +0.4791 0.5660 l +0.4800 0.5478 l +0.4809 0.5342 l +0.4819 0.5327 l +0.4829 0.5363 l +0.4839 0.5350 l +0.4848 0.5322 l +0.4858 0.5325 l +0.4867 0.5326 l +0.4878 0.5324 l +0.4889 0.5324 l +0.4899 0.5325 l +0.4909 0.5340 l +0.4921 0.5341 l +0.4932 0.5349 l +0.4943 0.5330 l +0.4953 0.5324 l +0.4964 0.5323 l +0.4975 0.5352 l +0.4985 0.5327 l +0.4996 0.5322 l +0.5006 0.5882 l +0.5016 0.5737 l +0.5027 0.5323 l +0.5038 0.5322 l +0.5048 0.5349 l +0.5057 0.5325 l +0.5067 0.5328 l +0.5076 0.5326 l +0.5086 0.5341 l +0.5095 0.5323 l +0.5106 0.5337 l +0.5116 0.5326 l +0.5126 0.5323 l +0.5136 0.5326 l +0.5148 0.5323 l +0.5158 0.5323 l +0.5168 0.5324 l +0.5177 0.5331 l +0.5189 0.5325 l +0.5199 0.5345 l +0.5210 0.5321 l +0.5226 0.5331 l +0.5238 0.6037 l +0.5249 0.5964 l +0.5258 0.5647 l +0.5267 0.5890 l +0.5277 0.5885 l +0.5286 0.5726 l +0.5296 0.5726 l +0.5305 0.5647 l +0.5314 0.5853 l +0.5325 0.5776 l +0.5335 0.5784 l +0.5344 0.5750 l +0.5354 0.5715 l +0.5363 0.5694 l +0.5373 0.5668 l +0.5382 0.5500 l +0.5392 0.5444 l +0.5401 0.5477 l +0.5411 0.5465 l +0.5420 0.5505 l +0.5430 0.5459 l +0.5439 0.5483 l +0.5448 0.5860 l +0.5458 0.6003 l +0.5467 0.5932 l +0.5477 0.5926 l +0.5486 0.6422 l +0.5496 0.6395 l +0.5505 0.6167 l +0.5515 0.6160 l +0.5524 0.6340 l +0.5533 0.5967 l +0.5543 0.5719 l +0.5552 0.5523 l +0.5562 0.5533 l +0.5572 0.6363 l +0.5581 0.6881 l +0.5590 0.6723 l +0.5600 0.6654 l +0.5609 0.7319 l +0.5619 0.6608 l +0.5628 0.6778 l +0.5638 0.6751 l +0.5647 0.6114 l +0.5657 0.5526 l +0.5666 0.5715 l +0.5676 0.5329 l +0.5686 0.5382 l +0.5701 0.5852 l +0.5711 0.5783 l +0.5720 0.5915 l +0.5730 0.5764 l +0.5740 0.5870 l +0.5749 0.5995 l +0.5759 0.5982 l +0.5768 0.5596 l +0.5777 0.5462 l +0.5787 0.5403 l +0.5796 0.5411 l +0.5806 0.5710 l +0.5815 0.5503 l +0.5825 0.5339 l +0.5835 0.5330 l +0.5846 0.5358 l +0.5855 0.5334 l +0.5866 0.5324 l +0.5877 0.5323 l +0.5887 0.5326 l +0.5897 0.5326 l +0.5908 0.5324 l +0.5921 0.5322 l +0.5930 0.5349 l +0.5940 0.5324 l +0.5950 0.5366 l +0.5961 0.5333 l +0.5971 0.5367 l +0.5981 0.5323 l +0.5991 0.5323 l +0.6002 0.5323 l +0.6012 0.5328 l +0.6024 0.6027 l +0.6034 0.5611 l +0.6046 0.5334 l +0.6056 0.5323 l +0.6067 0.5334 l +0.6076 0.5348 l +0.6086 0.5342 l +0.6096 0.5325 l +0.6111 0.5326 l +0.6123 0.5334 l +0.6133 0.5323 l +0.6143 0.5323 l +0.6153 0.5323 l +0.6163 0.5321 l +0.6174 0.5324 l +0.6186 0.5330 l +0.6195 0.5344 l +0.6204 0.5327 l +0.6214 0.5324 l +0.6234 0.5332 l +0.6246 0.6296 l +0.6257 0.5753 l +0.6266 0.5698 l +0.6276 0.5823 l +0.6285 0.5820 l +0.6295 0.5801 l +0.6304 0.5682 l +0.6314 0.5693 l +0.6323 0.5995 l +0.6333 0.5811 l +0.6342 0.5701 l +0.6352 0.5834 l +0.6362 0.5711 l +0.6371 0.5767 l +0.6381 0.5609 l +0.6390 0.5525 l +0.6399 0.5474 l +0.6409 0.5513 l +0.6418 0.5479 l +0.6428 0.5490 l +0.6437 0.5451 l +0.6447 0.5539 l +0.6456 0.5506 l +0.6466 0.6073 l +0.6475 0.5773 l +0.6485 0.5994 l +0.6494 0.5856 l +0.6504 0.6389 l +0.6513 0.6435 l +0.6523 0.6162 l +0.6532 0.6159 l +0.6542 0.6345 l +0.6551 0.5905 l +0.6561 0.5566 l +0.6571 0.5526 l +0.6580 0.6082 l +0.6590 0.6645 l +0.6599 0.6692 l +0.6609 0.6717 l +0.6618 0.7087 l +0.6627 0.6723 l +0.6637 0.6602 l +0.6646 0.6397 l +0.6656 0.5758 l +0.6665 0.5506 l +0.6674 0.5698 l +0.6685 0.5328 l +0.6709 0.5854 l +0.6718 0.5809 l +0.6727 0.5919 l +0.6737 0.5835 l +0.6748 0.5903 l +0.6757 0.5972 l +0.6767 0.6007 l +0.6776 0.5540 l +0.6786 0.5454 l +0.6796 0.5366 l +0.6810 0.5812 l +0.6819 0.5469 l +0.6829 0.5346 l +0.6839 0.5323 l +0.6850 0.5385 l +0.6859 0.5325 l +0.6869 0.5324 l +0.6880 0.5329 l +0.6889 0.5326 l +0.6901 0.5325 l +0.6911 0.5323 l +0.6920 0.5329 l +0.6930 0.5324 l +0.6940 0.5335 l +0.6949 0.5326 l +0.6959 0.5333 l +0.6969 0.5362 l +0.6979 0.5366 l +0.6989 0.5321 l +0.6999 0.5323 l +0.7010 0.5327 l +0.7021 0.5324 l +0.7032 0.6069 l +0.7042 0.5598 l +0.7056 0.5324 l +0.7066 0.5349 l +0.7076 0.5330 l +0.7085 0.5333 l +0.7095 0.5331 l +0.7104 0.5331 l +0.7114 0.5323 l +0.7125 0.5323 l +0.7136 0.5336 l +0.7147 0.5325 l +0.7157 0.5322 l +0.7168 0.5321 l +0.7180 0.5324 l +0.7191 0.5328 l +0.7200 0.5331 l +0.7209 0.5334 l +0.7220 0.5323 l +0.7241 0.5331 l +0.7253 0.6090 l +0.7264 0.5961 l +0.7273 0.5640 l +0.7283 0.5998 l +0.7292 0.5800 l +0.7301 0.5751 l +0.7311 0.5730 l +0.7321 0.5681 l +0.7330 0.5814 l +0.7339 0.5819 l +0.7350 0.5799 l +0.7359 0.5799 l +0.7369 0.5730 l +0.7378 0.5655 l +0.7388 0.5588 l +0.7397 0.5487 l +0.7407 0.5523 l +0.7418 0.5458 l +0.7428 0.5520 l +0.7437 0.5428 l +0.7447 0.5525 l +0.7456 0.5828 l +0.7466 0.7379 l +0.7475 0.6763 l +0.7485 0.6548 l +0.7494 0.5436 l +0.7504 0.5472 l +0.7513 0.5705 l +0.7522 0.5731 l +0.7532 0.5992 l +0.7541 0.5789 l +0.7551 0.5510 l +0.7560 0.5520 l +0.7570 0.6209 l +0.7579 0.6777 l +0.7589 0.6655 l +0.7598 0.6804 l +0.7608 0.6777 l +0.7617 0.6955 l +0.7626 0.6892 l +0.7636 0.7899 l +0.7645 0.6083 l +0.7655 0.5784 l +0.7665 0.5747 l +0.7676 0.5541 l +0.7686 0.5693 l +0.7697 0.5328 l +0.7720 0.5944 l +0.7729 0.5854 l +0.7738 0.5888 l +0.7748 0.5830 l +0.7760 0.5841 l +0.7769 0.6160 l +0.7778 0.6082 l +0.7788 0.5476 l +0.7797 0.5470 l +0.7807 0.5403 l +0.7822 0.5741 l +0.7831 0.5492 l +0.7841 0.5348 l +0.7850 0.5325 l +0.7860 0.5362 l +0.7870 0.5345 l +0.7882 0.5325 l +0.7892 0.5325 l +0.7902 0.5324 l +0.7912 0.5328 l +0.7922 0.5324 l +0.7932 0.5329 l +0.7943 0.5325 l +0.7953 0.5338 l +0.7964 0.5340 l +0.7973 0.5353 l +0.7983 0.5331 l +0.7994 0.5328 l +0.8004 0.5351 l +0.8016 0.5322 l +0.8026 0.5328 l +0.8035 0.5330 l +0.8045 0.6166 l +0.8054 0.5528 l +0.8065 0.5323 l +0.8076 0.5322 l +0.8086 0.5331 l +0.8097 0.5351 l +0.8107 0.5343 l +0.8118 0.5322 l +0.8128 0.5322 l +0.8137 0.5334 l +0.8147 0.5332 l +0.8158 0.5325 l +0.8168 0.5325 l +0.8181 0.5324 l +0.8191 0.5342 l +0.8201 0.5323 l +0.8211 0.5325 l +0.8221 0.5322 l +0.8231 0.5333 l +0.8240 0.5339 l +0.8257 0.5330 l +0.8269 0.6251 l +0.8280 0.5828 l +0.8289 0.5662 l +0.8299 0.5825 l +0.8309 0.5879 l +0.8318 0.5837 l +0.8327 0.5674 l +0.8337 0.5679 l +0.8346 0.5871 l +0.8357 0.5895 l +0.8367 0.5654 l +0.8376 0.5743 l +0.8386 0.5679 l +0.8395 0.5709 l +0.8405 0.5597 l +0.8415 0.5603 l +0.8424 0.5479 l +0.8434 0.5433 l +0.8443 0.5458 l +0.8453 0.5481 l +0.8462 0.5506 l +0.8472 0.5440 l +0.8481 0.5519 l +0.8491 0.5802 l +0.8500 0.5992 l +0.8510 0.5933 l +0.8519 0.6376 l +0.8528 0.6617 l +0.8538 0.6212 l +0.8548 0.5878 l +0.8557 0.5779 l +0.8567 0.5981 l +0.8576 0.5882 l +0.8586 0.5600 l +0.8595 0.5549 l +0.8605 0.6190 l +0.8614 0.6856 l +0.8624 0.6639 l +0.8633 0.6623 l +0.8642 0.7367 l +0.8652 0.6969 l +0.8661 0.6983 l +0.8671 0.6822 l +0.8680 0.5987 l +0.8689 0.5657 l +0.8699 0.5590 l +0.8709 0.5328 l +0.8732 0.5884 l +0.8741 0.5852 l +0.8751 0.5917 l +0.8760 0.5777 l +0.8770 0.5897 l +0.8779 0.6134 l +0.8788 0.6012 l +0.8798 0.5510 l +0.8807 0.5417 l +0.8816 0.5374 l +0.8829 0.5807 l +0.8839 0.5473 l +0.8848 0.5356 l +0.8859 0.5327 l +0.8868 0.5352 l +0.8878 0.5344 l +0.8888 0.5323 l +0.8897 0.5328 l +0.8907 0.5326 l +0.8919 0.5324 l +0.8930 0.5330 l +0.8941 0.5324 l +0.8954 0.5326 l +0.8965 0.5346 l +0.8976 0.5345 l +0.8986 0.5342 l +0.8996 0.5330 l +0.9006 0.5348 l +0.9016 0.5324 l +0.9025 0.5329 l +0.9036 0.5324 l +0.9046 0.5677 l +0.9056 0.6026 l +0.9067 0.5328 l +0.9080 0.5324 l +0.9090 0.5323 l +0.9102 0.5357 l +0.9113 0.5341 l +0.9123 0.5327 l +0.9134 0.5321 l +0.9144 0.5329 l +0.9154 0.5325 l +0.9163 0.5324 l +0.9173 0.5323 l +0.9186 0.5324 l +0.9200 0.5332 l +0.9210 0.5324 l +0.9220 0.5324 l +0.9229 0.5341 l +0.9239 0.5331 l +0.9250 0.5319 l +0.9263 0.5324 l +0.9274 0.6164 l +0.9284 0.5835 l +0.9293 0.5614 l +0.9302 0.5801 l +0.9312 0.5931 l +0.9321 0.5780 l +0.9331 0.5739 l +0.9340 0.5656 l +0.9350 0.5850 l +0.9359 0.5818 l +0.9368 0.5652 l +0.9378 0.5688 l +0.9388 0.5708 l +0.9397 0.5747 l +0.9407 0.5701 l +0.9417 0.5556 l +0.9426 0.5486 l +0.9436 0.5516 l +0.9445 0.5421 l +0.9455 0.5516 l +0.9464 0.5473 l +0.9475 0.5512 l +0.9485 0.5691 l +0.9494 0.5727 l +0.9504 0.6002 l +0.9514 0.6135 l +0.9523 0.5775 l +0.9533 0.6313 l +0.9542 0.6263 l +0.9552 0.6232 l +0.9561 0.6292 l +0.9570 0.6639 l +0.9580 0.5918 l +0.9589 0.5620 l +0.9599 0.5540 l +0.9608 0.5656 l +0.9618 0.6906 l +0.9627 0.7006 l +0.9636 0.6790 l +0.9646 0.7133 l +0.9655 0.6578 l +0.9665 0.6487 l +0.9674 0.6598 l +0.9684 0.6683 l +0.9694 0.5670 l +0.9704 0.5760 l +0.9713 0.5367 l +0.9725 0.5336 l +0.9743 0.5853 l +0.9752 0.5751 l +0.9762 0.5870 l +0.9771 0.5842 l +0.9781 0.5838 l +0.9790 0.5724 l +0.9800 0.6073 l +0.9809 0.5864 l +0.9820 0.5557 l +0.9830 0.5381 l +0.9839 0.5348 l +0.9849 0.5800 l +0.9858 0.5495 l +0.9867 0.5352 l +0.9877 0.5322 l +0.9887 0.5353 l +0.9897 0.5343 l +0.9907 0.5325 l +0.9916 0.5323 l +0.9926 0.5325 l +0.9936 0.5327 l +0.9946 0.5324 l +0.9957 0.5323 l +0.9967 0.5325 l +0.9976 0.5321 l +0.9986 0.5337 l +0.9995 0.5335 l +1.0005 0.5354 l +1.0016 0.5335 l +1.0026 0.5365 l +1.0038 0.5321 l +1.0049 0.5329 l +1.0060 0.5327 l +1.0070 0.6021 l +1.0079 0.5716 l +1.0089 0.5325 l +1.0099 0.5323 l +1.0109 0.5332 l +1.0119 0.5347 l +1.0129 0.5331 l +1.0139 0.5331 l +1.0150 0.5338 l +1.0160 0.5323 l +1.0170 0.5325 l +1.0181 0.5323 l +1.0192 0.5328 l +1.0202 0.5327 l +1.0212 0.5325 l +1.0222 0.5325 l +1.0232 0.5323 l +1.0245 0.5327 l +1.0255 0.5325 l +1.0265 0.5336 l +1.0284 0.5331 l +1.0296 0.6292 l +1.0306 0.5897 l +1.0316 0.5627 l +1.0325 0.5921 l +1.0334 0.5838 l +1.0344 0.5762 l +1.0353 0.5768 l +1.0363 0.5651 l +1.0372 0.5971 l +1.0382 0.5735 l +1.0392 0.5670 l +1.0402 0.5692 l +1.0411 0.5791 l +1.0420 0.5779 l +1.0430 0.5661 l +1.0439 0.5485 l +1.0449 0.5504 l +1.0458 0.5480 l +1.0467 0.5532 l +1.0477 0.5447 l +1.0487 0.5562 l +1.0496 0.6647 l +1.0505 0.6930 l +1.0515 0.6757 l +1.0524 0.5999 l +1.0534 0.5461 l +1.0544 0.5652 l +1.0553 0.5689 l +1.0563 0.5949 l +1.0572 0.5961 l +1.0582 0.5590 l +1.0591 0.5548 l +1.0600 0.6106 l +1.0610 0.6874 l +1.0619 0.6918 l +1.0629 0.6658 l +1.0638 0.6892 l +1.0647 0.6797 l +1.0657 0.6864 l +1.0666 0.7203 l +1.0676 0.7486 l +1.0686 0.6802 l +1.0700 0.5568 l +1.0710 0.5855 l +1.0719 0.5353 l +1.0730 0.5403 l +1.0745 0.5934 l +1.0755 0.5857 l +1.0764 0.5853 l +1.0774 0.5738 l +1.0783 0.5924 l +1.0792 0.5910 l +1.0802 0.5942 l +1.0811 0.5745 l +1.0821 0.5529 l +1.0830 0.5388 l +1.0841 0.5407 l +1.0850 0.5717 l +1.0860 0.5490 l +1.0869 0.5345 l +1.0880 0.5326 l +1.0889 0.5360 l +1.0898 0.5339 l +1.0908 0.5323 l +1.0918 0.5329 l +1.0928 0.5324 l +1.0939 0.5325 l +1.0949 0.5322 l +1.0958 0.5327 l +1.0968 0.5323 l +1.0977 0.5343 l +1.0988 0.5324 l +1.0998 0.5367 l +1.1010 0.5330 l +1.1021 0.5331 l +1.1032 0.5351 l +1.1044 0.5322 l +1.1055 0.5329 l +1.1064 0.5751 l +1.1074 0.5955 l +1.1083 0.5324 l +1.1094 0.5324 l +1.1105 0.5326 l +1.1116 0.5350 l +1.1126 0.5335 l +1.1135 0.5338 l +1.1146 0.5324 l +1.1159 0.5322 l +1.1168 0.5336 l +1.1178 0.5332 l +1.1189 0.5325 l +1.1199 0.5325 l +1.1209 0.5324 l +1.1219 0.5324 l +1.1228 0.5326 l +1.1238 0.5327 l +1.1247 0.5343 l +1.1259 0.5323 l +1.1272 0.5319 l +1.1284 0.5334 l +1.1296 0.6069 l +1.1307 0.6039 l +1.1317 0.5663 l +1.1326 0.5847 l +1.1335 0.5837 l +1.1345 0.5775 l +1.1354 0.5756 l +1.1364 0.5720 l +1.1373 0.5801 l +1.1383 0.5573 l +1.1383 0.5318 l +0.1500 0.5318 l +c +[/DeviceRGB] SCS +Color4 SC +fill +[] 0 SD +0.0015 SLW +n +0.1500 0.5392 m +0.1580 0.7320 l +0.1589 0.7266 l +0.1599 0.6516 l +0.1652 0.6757 l +0.1661 0.6878 l +0.1670 0.6660 l +0.1680 0.7634 l +0.1694 0.6348 l +0.1704 0.5723 l +0.1714 0.5393 l +0.1725 0.5336 l +0.1744 0.6140 l +0.1753 0.6132 l +0.1763 0.5785 l +0.1772 0.5963 l +0.1783 0.6109 l +0.1792 0.6014 l +0.1801 0.5850 l +0.1811 0.5346 l +0.1822 0.5842 l +0.1831 0.5471 l +0.1841 0.5332 l +0.1850 0.5325 l +0.1860 0.5343 l +0.1871 0.5330 l +0.1881 0.5326 l +0.1891 0.5324 l +0.1902 0.5325 l +0.1912 0.5346 l +0.1922 0.5323 l +0.1932 0.5344 l +0.1943 0.5338 l +0.1952 0.5335 l +0.1962 0.5329 l +0.1972 0.5327 l +0.1983 0.5323 l +0.1995 0.5341 l +0.2006 0.5352 l +0.2016 0.5323 l +0.2026 0.5322 l +0.2036 0.5325 l +0.2046 0.5348 l +0.2056 0.6288 l +0.2066 0.5557 l +0.2075 0.5343 l +0.2086 0.5323 l +0.2096 0.5332 l +0.2107 0.5334 l +0.2116 0.5325 l +0.2129 0.5325 l +0.2138 0.5329 l +0.2149 0.5325 l +0.2159 0.5327 l +0.2170 0.5325 l +0.2183 0.5325 l +0.2193 0.5324 l +0.2202 0.5335 l +0.2212 0.5334 l +0.2221 0.5324 l +0.2236 0.5319 l +0.2248 0.5331 l +0.2260 0.6155 l +0.2271 0.5943 l +0.2280 0.5787 l +0.2289 0.6189 l +0.2299 0.5783 l +0.2308 0.6239 l +0.2317 0.7085 l +0.2327 0.6504 l +0.2338 0.5650 l +0.2348 0.5881 l +0.2357 0.5729 l +0.2366 0.5631 l +0.2376 0.5735 l +0.2385 0.5630 l +0.2395 0.5527 l +0.2404 0.5479 l +0.2414 0.5451 l +0.2424 0.5526 l +0.2434 0.5486 l +0.2443 0.5514 l +0.2453 0.5458 l +0.2462 0.6004 l +0.2472 0.5975 l +0.2482 0.6033 l +0.2492 0.5736 l +0.2501 0.6625 l +0.2511 0.6248 l +0.2520 0.6165 l +0.2530 0.6244 l +0.2539 0.6472 l +0.2549 0.5909 l +0.2558 0.5542 l +0.2567 0.5546 l +0.2577 0.6066 l +0.2586 0.6610 l +0.2596 0.7084 l +0.2605 0.7041 l +0.2615 0.7072 l +0.2624 0.7142 l +0.2633 0.7032 l +0.2643 0.7193 l +0.2652 0.5935 l +0.2662 0.5715 l +0.2671 0.5456 l +0.2681 0.5328 l +0.2704 0.5915 l +0.2713 0.5946 l +0.2722 0.5902 l +0.2732 0.5739 l +0.2741 0.5917 l +0.2751 0.6343 l +0.2760 0.6083 l +0.2770 0.5547 l +0.2779 0.5386 l +0.2789 0.5475 l +0.2798 0.5705 l +0.2808 0.5431 l +0.2818 0.5325 l +0.2827 0.5325 l +0.2837 0.5369 l +0.2848 0.5341 l +0.2857 0.5324 l +0.2867 0.5324 l +0.2877 0.5327 l +0.2888 0.5329 l +0.2897 0.5322 l +0.2907 0.5323 l +0.2916 0.5324 l +0.2926 0.5329 l +0.2935 0.5332 l +0.2945 0.5336 l +0.2955 0.5335 l +0.2965 0.5334 l +0.2976 0.5326 l +0.2987 0.5336 l +0.3001 0.5322 l +0.3011 0.5326 l +0.3020 0.5322 l +0.3031 0.5322 l +0.3041 0.5323 l +0.3054 0.5321 l +0.3064 0.5701 l +0.3073 0.5967 l +0.3085 0.5327 l +0.3095 0.5329 l +0.3105 0.5331 l +0.3116 0.5326 l +0.3128 0.5323 l +0.3140 0.5326 l +0.3151 0.5323 l +0.3160 0.5341 l +0.3171 0.5323 l +0.3181 0.5347 l +0.3191 0.5324 l +0.3202 0.5333 l +0.3212 0.5322 l +0.3228 0.5341 l +0.3240 0.6006 l +0.3251 0.5955 l +0.3261 0.5649 l +0.3270 0.6039 l +0.3280 0.5766 l +0.3289 0.5728 l +0.3298 0.5787 l +0.3308 0.5912 l +0.3317 0.5523 l +0.3327 0.5798 l +0.3336 0.5778 l +0.3346 0.5852 l +0.3356 0.5803 l +0.3365 0.5692 l +0.3375 0.5568 l +0.3384 0.5497 l +0.3394 0.5481 l +0.3403 0.5550 l +0.3413 0.5504 l +0.3422 0.5544 l +0.3432 0.5398 l +0.3442 0.5998 l +0.3453 0.6158 l +0.3463 0.6987 l +0.3473 0.6729 l +0.3482 0.6695 l +0.3492 0.5681 l +0.3501 0.5713 l +0.3511 0.6052 l +0.3520 0.5817 l +0.3530 0.5518 l +0.3540 0.5541 l +0.3550 0.6462 l +0.3559 0.6965 l +0.3568 0.6913 l +0.3578 0.6677 l +0.3587 0.6511 l +0.3597 0.6913 l +0.3606 0.7355 l +0.3615 0.6887 l +0.3625 0.6773 l +0.3634 0.5739 l +0.3645 0.5737 l +0.3655 0.5361 l +0.3666 0.5337 l +0.3685 0.5902 l +0.3694 0.5803 l +0.3703 0.5969 l +0.3713 0.5693 l +0.3722 0.5925 l +0.3732 0.5998 l +0.3741 0.6172 l +0.3750 0.5567 l +0.3760 0.5468 l +0.3771 0.5385 l +0.3786 0.5775 l +0.3795 0.5490 l +0.3804 0.5390 l +0.3814 0.5327 l +0.3826 0.5332 l +0.3835 0.5369 l +0.3845 0.5328 l +0.3854 0.5322 l +0.3864 0.5326 l +0.3874 0.5324 l +0.3885 0.5325 l +0.3895 0.5322 l +0.3905 0.5325 l +0.3914 0.5322 l +0.3924 0.5335 l +0.3934 0.5330 l +0.3944 0.5354 l +0.3953 0.5341 l +0.3963 0.5383 l +0.3976 0.5323 l +0.3986 0.5321 l +0.3997 0.5333 l +0.4007 0.6141 l +0.4016 0.5530 l +0.4026 0.5323 l +0.4036 0.5326 l +0.4047 0.5323 l +0.4056 0.5332 l +0.4066 0.5355 l +0.4076 0.5348 l +0.4086 0.5322 l +0.4098 0.5334 l +0.4108 0.5324 l +0.4118 0.5324 l +0.4130 0.5322 l +0.4140 0.5332 l +0.4150 0.5332 l +0.4160 0.5324 l +0.4170 0.5324 l +0.4180 0.5342 l +0.4189 0.5326 l +0.4199 0.5321 l +0.4218 0.5332 l +0.4230 0.6223 l +0.4240 0.5670 l +0.4249 0.5782 l +0.4260 0.5861 l +0.4269 0.5899 l +0.4279 0.5754 l +0.4288 0.5697 l +0.4297 0.5686 l +0.4307 0.5862 l +0.4317 0.5827 l +0.4327 0.5732 l +0.4336 0.5856 l +0.4346 0.5801 l +0.4355 0.5750 l +0.4365 0.5638 l +0.4374 0.5521 l +0.4384 0.5496 l +0.4393 0.5503 l +0.4403 0.5504 l +0.4412 0.5462 l +0.4422 0.5514 l +0.4431 0.5801 l +0.4441 0.7010 l +0.4450 0.6765 l +0.4460 0.6616 l +0.4469 0.5743 l +0.4479 0.5518 l +0.4488 0.5638 l +0.4498 0.5598 l +0.4507 0.5955 l +0.4516 0.5873 l +0.4526 0.5569 l +0.4535 0.5579 l +0.4545 0.6343 l +0.4555 0.6676 l +0.4564 0.6833 l +0.4574 0.6721 l +0.4583 0.6863 l +0.4593 0.6946 l +0.4602 0.7148 l +0.4612 0.7269 l +0.4621 0.6609 l +0.4630 0.6254 l +0.4641 0.5589 l +0.4651 0.5749 l +0.4660 0.5327 l +0.4671 0.5382 l +0.4686 0.5939 l +0.4695 0.5808 l +0.4705 0.5898 l +0.4714 0.5721 l +0.4725 0.5934 l +0.4734 0.5982 l +0.4743 0.6144 l +0.4753 0.5579 l +0.4762 0.5528 l +0.4772 0.5394 l +0.4781 0.5461 l +0.4791 0.5660 l +0.4800 0.5478 l +0.4809 0.5342 l +0.4819 0.5327 l +0.4829 0.5363 l +0.4839 0.5350 l +0.4848 0.5322 l +0.4858 0.5325 l +0.4867 0.5326 l +0.4878 0.5324 l +0.4889 0.5324 l +0.4899 0.5325 l +0.4909 0.5340 l +0.4921 0.5341 l +0.4932 0.5349 l +0.4943 0.5330 l +0.4953 0.5324 l +0.4964 0.5323 l +0.4975 0.5352 l +0.4985 0.5327 l +0.4996 0.5322 l +0.5006 0.5882 l +0.5016 0.5737 l +0.5027 0.5323 l +0.5038 0.5322 l +0.5048 0.5349 l +0.5057 0.5325 l +0.5067 0.5328 l +0.5076 0.5326 l +0.5086 0.5341 l +0.5095 0.5323 l +0.5106 0.5337 l +0.5116 0.5326 l +0.5126 0.5323 l +0.5136 0.5326 l +0.5148 0.5323 l +0.5158 0.5323 l +0.5168 0.5324 l +0.5177 0.5331 l +0.5189 0.5325 l +0.5199 0.5345 l +0.5210 0.5321 l +0.5226 0.5331 l +0.5238 0.6037 l +0.5249 0.5964 l +0.5258 0.5647 l +0.5267 0.5890 l +0.5277 0.5885 l +0.5286 0.5726 l +0.5296 0.5726 l +0.5305 0.5647 l +0.5314 0.5853 l +0.5325 0.5776 l +0.5335 0.5784 l +0.5344 0.5750 l +0.5354 0.5715 l +0.5363 0.5694 l +0.5373 0.5668 l +0.5382 0.5500 l +0.5392 0.5444 l +0.5401 0.5477 l +0.5411 0.5465 l +0.5420 0.5505 l +0.5430 0.5459 l +0.5439 0.5483 l +0.5448 0.5860 l +0.5458 0.6003 l +0.5467 0.5932 l +0.5477 0.5926 l +0.5486 0.6422 l +0.5496 0.6395 l +0.5505 0.6167 l +0.5515 0.6160 l +0.5524 0.6340 l +0.5533 0.5967 l +0.5543 0.5719 l +0.5552 0.5523 l +0.5562 0.5533 l +0.5572 0.6363 l +0.5581 0.6881 l +0.5590 0.6723 l +0.5600 0.6654 l +0.5609 0.7319 l +0.5619 0.6608 l +0.5628 0.6778 l +0.5638 0.6751 l +0.5647 0.6114 l +0.5657 0.5526 l +0.5666 0.5715 l +0.5676 0.5329 l +0.5686 0.5382 l +0.5701 0.5852 l +0.5711 0.5783 l +0.5720 0.5915 l +0.5730 0.5764 l +0.5740 0.5870 l +0.5749 0.5995 l +0.5759 0.5982 l +0.5768 0.5596 l +0.5777 0.5462 l +0.5787 0.5403 l +0.5796 0.5411 l +0.5806 0.5710 l +0.5815 0.5503 l +0.5825 0.5339 l +0.5835 0.5330 l +0.5846 0.5358 l +0.5855 0.5334 l +0.5866 0.5324 l +0.5877 0.5323 l +0.5887 0.5326 l +0.5897 0.5326 l +0.5908 0.5324 l +0.5921 0.5322 l +0.5930 0.5349 l +0.5940 0.5324 l +0.5950 0.5366 l +0.5961 0.5333 l +0.5971 0.5367 l +0.5981 0.5323 l +0.5991 0.5323 l +0.6002 0.5323 l +0.6012 0.5328 l +0.6024 0.6027 l +0.6034 0.5611 l +0.6046 0.5334 l +0.6056 0.5323 l +0.6067 0.5334 l +0.6076 0.5348 l +0.6086 0.5342 l +0.6096 0.5325 l +0.6111 0.5326 l +0.6123 0.5334 l +0.6133 0.5323 l +0.6143 0.5323 l +0.6153 0.5323 l +0.6163 0.5321 l +0.6174 0.5324 l +0.6186 0.5330 l +0.6195 0.5344 l +0.6204 0.5327 l +0.6214 0.5324 l +0.6234 0.5332 l +0.6246 0.6296 l +0.6257 0.5753 l +0.6266 0.5698 l +0.6276 0.5823 l +0.6285 0.5820 l +0.6295 0.5801 l +0.6304 0.5682 l +0.6314 0.5693 l +0.6323 0.5995 l +0.6333 0.5811 l +0.6342 0.5701 l +0.6352 0.5834 l +0.6362 0.5711 l +0.6371 0.5767 l +0.6381 0.5609 l +0.6390 0.5525 l +0.6399 0.5474 l +0.6409 0.5513 l +0.6418 0.5479 l +0.6428 0.5490 l +0.6437 0.5451 l +0.6447 0.5539 l +0.6456 0.5506 l +0.6466 0.6073 l +0.6475 0.5773 l +0.6485 0.5994 l +0.6494 0.5856 l +0.6504 0.6389 l +0.6513 0.6435 l +0.6523 0.6162 l +0.6532 0.6159 l +0.6542 0.6345 l +0.6551 0.5905 l +0.6561 0.5566 l +0.6571 0.5526 l +0.6580 0.6082 l +0.6590 0.6645 l +0.6599 0.6692 l +0.6609 0.6717 l +0.6618 0.7087 l +0.6627 0.6723 l +0.6637 0.6602 l +0.6646 0.6397 l +0.6656 0.5758 l +0.6665 0.5506 l +0.6674 0.5698 l +0.6685 0.5328 l +0.6709 0.5854 l +0.6718 0.5809 l +0.6727 0.5919 l +0.6737 0.5835 l +0.6748 0.5903 l +0.6757 0.5972 l +0.6767 0.6007 l +0.6776 0.5540 l +0.6786 0.5454 l +0.6796 0.5366 l +0.6810 0.5812 l +0.6819 0.5469 l +0.6829 0.5346 l +0.6839 0.5323 l +0.6850 0.5385 l +0.6859 0.5325 l +0.6869 0.5324 l +0.6880 0.5329 l +0.6889 0.5326 l +0.6901 0.5325 l +0.6911 0.5323 l +0.6920 0.5329 l +0.6930 0.5324 l +0.6940 0.5335 l +0.6949 0.5326 l +0.6959 0.5333 l +0.6969 0.5362 l +0.6979 0.5366 l +0.6989 0.5321 l +0.6999 0.5323 l +0.7010 0.5327 l +0.7021 0.5324 l +0.7032 0.6069 l +0.7042 0.5598 l +0.7056 0.5324 l +0.7066 0.5349 l +0.7076 0.5330 l +0.7085 0.5333 l +0.7095 0.5331 l +0.7104 0.5331 l +0.7114 0.5323 l +0.7125 0.5323 l +0.7136 0.5336 l +0.7147 0.5325 l +0.7157 0.5322 l +0.7168 0.5321 l +0.7180 0.5324 l +0.7191 0.5328 l +0.7200 0.5331 l +0.7209 0.5334 l +0.7220 0.5323 l +0.7241 0.5331 l +0.7253 0.6090 l +0.7264 0.5961 l +0.7273 0.5640 l +0.7283 0.5998 l +0.7292 0.5800 l +0.7301 0.5751 l +0.7311 0.5730 l +0.7321 0.5681 l +0.7330 0.5814 l +0.7339 0.5819 l +0.7350 0.5799 l +0.7359 0.5799 l +0.7369 0.5730 l +0.7378 0.5655 l +0.7388 0.5588 l +0.7397 0.5487 l +0.7407 0.5523 l +0.7418 0.5458 l +0.7428 0.5520 l +0.7437 0.5428 l +0.7447 0.5525 l +0.7456 0.5828 l +0.7466 0.7379 l +0.7475 0.6763 l +0.7485 0.6548 l +0.7494 0.5436 l +0.7504 0.5472 l +0.7513 0.5705 l +0.7522 0.5731 l +0.7532 0.5992 l +0.7541 0.5789 l +0.7551 0.5510 l +0.7560 0.5520 l +0.7570 0.6209 l +0.7579 0.6777 l +0.7589 0.6655 l +0.7598 0.6804 l +0.7608 0.6777 l +0.7617 0.6955 l +0.7626 0.6892 l +0.7636 0.7899 l +0.7645 0.6083 l +0.7655 0.5784 l +0.7665 0.5747 l +0.7676 0.5541 l +0.7686 0.5693 l +0.7697 0.5328 l +0.7720 0.5944 l +0.7729 0.5854 l +0.7738 0.5888 l +0.7748 0.5830 l +0.7760 0.5841 l +0.7769 0.6160 l +0.7778 0.6082 l +0.7788 0.5476 l +0.7797 0.5470 l +0.7807 0.5403 l +0.7822 0.5741 l +0.7831 0.5492 l +0.7841 0.5348 l +0.7850 0.5325 l +0.7860 0.5362 l +0.7870 0.5345 l +0.7882 0.5325 l +0.7892 0.5325 l +0.7902 0.5324 l +0.7912 0.5328 l +0.7922 0.5324 l +0.7932 0.5329 l +0.7943 0.5325 l +0.7953 0.5338 l +0.7964 0.5340 l +0.7973 0.5353 l +0.7983 0.5331 l +0.7994 0.5328 l +0.8004 0.5351 l +0.8016 0.5322 l +0.8026 0.5328 l +0.8035 0.5330 l +0.8045 0.6166 l +0.8054 0.5528 l +0.8065 0.5323 l +0.8076 0.5322 l +0.8086 0.5331 l +0.8097 0.5351 l +0.8107 0.5343 l +0.8118 0.5322 l +0.8128 0.5322 l +0.8137 0.5334 l +0.8147 0.5332 l +0.8158 0.5325 l +0.8168 0.5325 l +0.8181 0.5324 l +0.8191 0.5342 l +0.8201 0.5323 l +0.8211 0.5325 l +0.8221 0.5322 l +0.8231 0.5333 l +0.8240 0.5339 l +0.8257 0.5330 l +0.8269 0.6251 l +0.8280 0.5828 l +0.8289 0.5662 l +0.8299 0.5825 l +0.8309 0.5879 l +0.8318 0.5837 l +0.8327 0.5674 l +0.8337 0.5679 l +0.8346 0.5871 l +0.8357 0.5895 l +0.8367 0.5654 l +0.8376 0.5743 l +0.8386 0.5679 l +0.8395 0.5709 l +0.8405 0.5597 l +0.8415 0.5603 l +0.8424 0.5479 l +0.8434 0.5433 l +0.8443 0.5458 l +0.8453 0.5481 l +0.8462 0.5506 l +0.8472 0.5440 l +0.8481 0.5519 l +0.8491 0.5802 l +0.8500 0.5992 l +0.8510 0.5933 l +0.8519 0.6376 l +0.8528 0.6617 l +0.8538 0.6212 l +0.8548 0.5878 l +0.8557 0.5779 l +0.8567 0.5981 l +0.8576 0.5882 l +0.8586 0.5600 l +0.8595 0.5549 l +0.8605 0.6190 l +0.8614 0.6856 l +0.8624 0.6639 l +0.8633 0.6623 l +0.8642 0.7367 l +0.8652 0.6969 l +0.8661 0.6983 l +0.8671 0.6822 l +0.8680 0.5987 l +0.8689 0.5657 l +0.8699 0.5590 l +0.8709 0.5328 l +0.8732 0.5884 l +0.8741 0.5852 l +0.8751 0.5917 l +0.8760 0.5777 l +0.8770 0.5897 l +0.8779 0.6134 l +0.8788 0.6012 l +0.8798 0.5510 l +0.8807 0.5417 l +0.8816 0.5374 l +0.8829 0.5807 l +0.8839 0.5473 l +0.8848 0.5356 l +0.8859 0.5327 l +0.8868 0.5352 l +0.8878 0.5344 l +0.8888 0.5323 l +0.8897 0.5328 l +0.8907 0.5326 l +0.8919 0.5324 l +0.8930 0.5330 l +0.8941 0.5324 l +0.8954 0.5326 l +0.8965 0.5346 l +0.8976 0.5345 l +0.8986 0.5342 l +0.8996 0.5330 l +0.9006 0.5348 l +0.9016 0.5324 l +0.9025 0.5329 l +0.9036 0.5324 l +0.9046 0.5677 l +0.9056 0.6026 l +0.9067 0.5328 l +0.9080 0.5324 l +0.9090 0.5323 l +0.9102 0.5357 l +0.9113 0.5341 l +0.9123 0.5327 l +0.9134 0.5321 l +0.9144 0.5329 l +0.9154 0.5325 l +0.9163 0.5324 l +0.9173 0.5323 l +0.9186 0.5324 l +0.9200 0.5332 l +0.9210 0.5324 l +0.9220 0.5324 l +0.9229 0.5341 l +0.9239 0.5331 l +0.9250 0.5319 l +0.9263 0.5324 l +0.9274 0.6164 l +0.9284 0.5835 l +0.9293 0.5614 l +0.9302 0.5801 l +0.9312 0.5931 l +0.9321 0.5780 l +0.9331 0.5739 l +0.9340 0.5656 l +0.9350 0.5850 l +0.9359 0.5818 l +0.9368 0.5652 l +0.9378 0.5688 l +0.9388 0.5708 l +0.9397 0.5747 l +0.9407 0.5701 l +0.9417 0.5556 l +0.9426 0.5486 l +0.9436 0.5516 l +0.9445 0.5421 l +0.9455 0.5516 l +0.9464 0.5473 l +0.9475 0.5512 l +0.9485 0.5691 l +0.9494 0.5727 l +0.9504 0.6002 l +0.9514 0.6135 l +0.9523 0.5775 l +0.9533 0.6313 l +0.9542 0.6263 l +0.9552 0.6232 l +0.9561 0.6292 l +0.9570 0.6639 l +0.9580 0.5918 l +0.9589 0.5620 l +0.9599 0.5540 l +0.9608 0.5656 l +0.9618 0.6906 l +0.9627 0.7006 l +0.9636 0.6790 l +0.9646 0.7133 l +0.9655 0.6578 l +0.9665 0.6487 l +0.9674 0.6598 l +0.9684 0.6683 l +0.9694 0.5670 l +0.9704 0.5760 l +0.9713 0.5367 l +0.9725 0.5336 l +0.9743 0.5853 l +0.9752 0.5751 l +0.9762 0.5870 l +0.9771 0.5842 l +0.9781 0.5838 l +0.9790 0.5724 l +0.9800 0.6073 l +0.9809 0.5864 l +0.9820 0.5557 l +0.9830 0.5381 l +0.9839 0.5348 l +0.9849 0.5800 l +0.9858 0.5495 l +0.9867 0.5352 l +0.9877 0.5322 l +0.9887 0.5353 l +0.9897 0.5343 l +0.9907 0.5325 l +0.9916 0.5323 l +0.9926 0.5325 l +0.9936 0.5327 l +0.9946 0.5324 l +0.9957 0.5323 l +0.9967 0.5325 l +0.9976 0.5321 l +0.9986 0.5337 l +0.9995 0.5335 l +1.0005 0.5354 l +1.0016 0.5335 l +1.0026 0.5365 l +1.0038 0.5321 l +1.0049 0.5329 l +1.0060 0.5327 l +1.0070 0.6021 l +1.0079 0.5716 l +1.0089 0.5325 l +1.0099 0.5323 l +1.0109 0.5332 l +1.0119 0.5347 l +1.0129 0.5331 l +1.0139 0.5331 l +1.0150 0.5338 l +1.0160 0.5323 l +1.0170 0.5325 l +1.0181 0.5323 l +1.0192 0.5328 l +1.0202 0.5327 l +1.0212 0.5325 l +1.0222 0.5325 l +1.0232 0.5323 l +1.0245 0.5327 l +1.0255 0.5325 l +1.0265 0.5336 l +1.0284 0.5331 l +1.0296 0.6292 l +1.0306 0.5897 l +1.0316 0.5627 l +1.0325 0.5921 l +1.0334 0.5838 l +1.0344 0.5762 l +1.0353 0.5768 l +1.0363 0.5651 l +1.0372 0.5971 l +1.0382 0.5735 l +1.0392 0.5670 l +1.0402 0.5692 l +1.0411 0.5791 l +1.0420 0.5779 l +1.0430 0.5661 l +1.0439 0.5485 l +1.0449 0.5504 l +1.0458 0.5480 l +1.0467 0.5532 l +1.0477 0.5447 l +1.0487 0.5562 l +1.0496 0.6647 l +1.0505 0.6930 l +1.0515 0.6757 l +1.0524 0.5999 l +1.0534 0.5461 l +1.0544 0.5652 l +1.0553 0.5689 l +1.0563 0.5949 l +1.0572 0.5961 l +1.0582 0.5590 l +1.0591 0.5548 l +1.0600 0.6106 l +1.0610 0.6874 l +1.0619 0.6918 l +1.0629 0.6658 l +1.0638 0.6892 l +1.0647 0.6797 l +1.0657 0.6864 l +1.0666 0.7203 l +1.0676 0.7486 l +1.0686 0.6802 l +1.0700 0.5568 l +1.0710 0.5855 l +1.0719 0.5353 l +1.0730 0.5403 l +1.0745 0.5934 l +1.0755 0.5857 l +1.0764 0.5853 l +1.0774 0.5738 l +1.0783 0.5924 l +1.0792 0.5910 l +1.0802 0.5942 l +1.0811 0.5745 l +1.0821 0.5529 l +1.0830 0.5388 l +1.0841 0.5407 l +1.0850 0.5717 l +1.0860 0.5490 l +1.0869 0.5345 l +1.0880 0.5326 l +1.0889 0.5360 l +1.0898 0.5339 l +1.0908 0.5323 l +1.0918 0.5329 l +1.0928 0.5324 l +1.0939 0.5325 l +1.0949 0.5322 l +1.0958 0.5327 l +1.0968 0.5323 l +1.0977 0.5343 l +1.0988 0.5324 l +1.0998 0.5367 l +1.1010 0.5330 l +1.1021 0.5331 l +1.1032 0.5351 l +1.1044 0.5322 l +1.1055 0.5329 l +1.1064 0.5751 l +1.1074 0.5955 l +1.1083 0.5324 l +1.1094 0.5324 l +1.1105 0.5326 l +1.1116 0.5350 l +1.1126 0.5335 l +1.1135 0.5338 l +1.1146 0.5324 l +1.1159 0.5322 l +1.1168 0.5336 l +1.1178 0.5332 l +1.1189 0.5325 l +1.1199 0.5325 l +1.1209 0.5324 l +1.1219 0.5324 l +1.1228 0.5326 l +1.1238 0.5327 l +1.1247 0.5343 l +1.1259 0.5323 l +1.1272 0.5319 l +1.1284 0.5334 l +1.1296 0.6069 l +1.1307 0.6039 l +1.1317 0.5663 l +1.1326 0.5847 l +1.1335 0.5837 l +1.1345 0.5775 l +1.1354 0.5756 l +1.1364 0.5720 l +1.1373 0.5801 l +1.1383 0.5573 l +s +n +0.1500 0.5318 m +1.1383 0.5318 l +s +/Times-Roman findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font32 exch definefont pop +/Font32 FFSF +[/DeviceRGB] SCS +Color6 SC +0.1294 0.5244 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +1.1533 0.5244 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.0957 0.5880 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1000) show +GR +/Font32 FFSF +1.1533 0.5880 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1000) show +GR +/Font32 FFSF +0.0957 0.6516 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2000) show +GR +/Font32 FFSF +1.1533 0.6516 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2000) show +GR +/Font32 FFSF +0.0957 0.7153 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(3000) show +GR +/Font32 FFSF +1.1533 0.7153 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(3000) show +GR +/Font32 FFSF +0.0957 0.7789 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4000) show +GR +/Font32 FFSF +1.1533 0.7789 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4000) show +GR +/Font32 FFSF +0.0957 0.8425 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5000) show +GR +/Font32 FFSF +1.1533 0.8425 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5000) show +GR +n +0.1500 0.5318 m +0.1500 0.8500 l +1.1433 0.8500 l +1.1433 0.5318 l +0.1500 0.5318 l +c +s +n +1.0000 0.8450 m +1.0000 0.8058 l +1.1388 0.8058 l +1.1388 0.8450 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +n +1.0000 0.8450 m +1.0000 0.8058 l +1.1388 0.8058 l +1.1388 0.8450 l +1.0000 0.8450 l +c +s +/Font32 FFSF +1.0708 0.8197 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(Queue) show +GR +[/DeviceRGB] SCS +Color4 SC +n +1.0108 0.8254 m +1.0508 0.8254 l +s +/Font32 FFSF +[/DeviceRGB] SCS +Color1 SC +0.3579 0.9175 m +GS +[0.0420 0.0000 0.0000 0.0420 0 0] CC +(Kernel Make Runs: BTRFS \(0.14\)) show +GR +/Times-Italic findfont +dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding DefEncoding def + currentdict +end +/Font31 exch definefont pop +/Font31 FFSF +[/DeviceRGB] SCS +Color6 SC +0.2518 0.8759 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(10 passes \(untar, make config+all+clean\), Linux 2.6.25.4, SATA driv\ +e) show +GR +[0.0015 0.0045 ] 0 SD +0.0015 SLW +n +0.1641 0.1500 m +0.1641 0.4682 l +s +n +0.1781 0.1500 m +0.1781 0.4682 l +s +n +0.1922 0.1500 m +0.1922 0.4682 l +s +n +0.2203 0.1500 m +0.2203 0.4682 l +s +n +0.2343 0.1500 m +0.2343 0.4682 l +s +n +0.2484 0.1500 m +0.2484 0.4682 l +s +n +0.2765 0.1500 m +0.2765 0.4682 l +s +n +0.2906 0.1500 m +0.2906 0.4682 l +s +n +0.3046 0.1500 m +0.3046 0.4682 l +s +n +0.3327 0.1500 m +0.3327 0.4682 l +s +n +0.3468 0.1500 m +0.3468 0.4682 l +s +n +0.3609 0.1500 m +0.3609 0.4682 l +s +n +0.3890 0.1500 m +0.3890 0.4682 l +s +n +0.4030 0.1500 m +0.4030 0.4682 l +s +n +0.4171 0.1500 m +0.4171 0.4682 l +s +n +0.4452 0.1500 m +0.4452 0.4682 l +s +n +0.4593 0.1500 m +0.4593 0.4682 l +s +n +0.4733 0.1500 m +0.4733 0.4682 l +s +n +0.5014 0.1500 m +0.5014 0.4682 l +s +n +0.5155 0.1500 m +0.5155 0.4682 l +s +n +0.5295 0.1500 m +0.5295 0.4682 l +s +n +0.5576 0.1500 m +0.5576 0.4682 l +s +n +0.5717 0.1500 m +0.5717 0.4682 l +s +n +0.5858 0.1500 m +0.5858 0.4682 l +s +n +0.6139 0.1500 m +0.6139 0.4682 l +s +n +0.6279 0.1500 m +0.6279 0.4682 l +s +n +0.6420 0.1500 m +0.6420 0.4682 l +s +n +0.6701 0.1500 m +0.6701 0.4682 l +s +n +0.6842 0.1500 m +0.6842 0.4682 l +s +n +0.6982 0.1500 m +0.6982 0.4682 l +s +n +0.7263 0.1500 m +0.7263 0.4682 l +s +n +0.7404 0.1500 m +0.7404 0.4682 l +s +n +0.7544 0.1500 m +0.7544 0.4682 l +s +n +0.7826 0.1500 m +0.7826 0.4682 l +s +n +0.7966 0.1500 m +0.7966 0.4682 l +s +n +0.8107 0.1500 m +0.8107 0.4682 l +s +n +0.8388 0.1500 m +0.8388 0.4682 l +s +n +0.8528 0.1500 m +0.8528 0.4682 l +s +n +0.8669 0.1500 m +0.8669 0.4682 l +s +n +0.8950 0.1500 m +0.8950 0.4682 l +s +n +0.9091 0.1500 m +0.9091 0.4682 l +s +n +0.9231 0.1500 m +0.9231 0.4682 l +s +n +0.9512 0.1500 m +0.9512 0.4682 l +s +n +0.9653 0.1500 m +0.9653 0.4682 l +s +n +0.9794 0.1500 m +0.9794 0.4682 l +s +n +1.0075 0.1500 m +1.0075 0.4682 l +s +n +1.0215 0.1500 m +1.0215 0.4682 l +s +n +1.0356 0.1500 m +1.0356 0.4682 l +s +n +1.0637 0.1500 m +1.0637 0.4682 l +s +n +1.0778 0.1500 m +1.0778 0.4682 l +s +n +1.0918 0.1500 m +1.0918 0.4682 l +s +n +1.1199 0.1500 m +1.1199 0.4682 l +s +n +1.1340 0.1500 m +1.1340 0.4682 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1500 m +0.1500 0.4682 l +s +n +0.2062 0.1500 m +0.2062 0.4682 l +s +n +0.2625 0.1500 m +0.2625 0.4682 l +s +n +0.3187 0.1500 m +0.3187 0.4682 l +s +n +0.3749 0.1500 m +0.3749 0.4682 l +s +n +0.4311 0.1500 m +0.4311 0.4682 l +s +n +0.4874 0.1500 m +0.4874 0.4682 l +s +n +0.5436 0.1500 m +0.5436 0.4682 l +s +n +0.5998 0.1500 m +0.5998 0.4682 l +s +n +0.6560 0.1500 m +0.6560 0.4682 l +s +n +0.7123 0.1500 m +0.7123 0.4682 l +s +n +0.7685 0.1500 m +0.7685 0.4682 l +s +n +0.8247 0.1500 m +0.8247 0.4682 l +s +n +0.8810 0.1500 m +0.8810 0.4682 l +s +n +0.9372 0.1500 m +0.9372 0.4682 l +s +n +0.9934 0.1500 m +0.9934 0.4682 l +s +n +1.0496 0.1500 m +1.0496 0.4682 l +s +n +1.1059 0.1500 m +1.1059 0.4682 l +s +[0.0015 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1818 m +1.1433 0.1818 l +s +n +0.1500 0.2455 m +1.1433 0.2455 l +s +n +0.1500 0.3091 m +1.1433 0.3091 l +s +n +0.1500 0.3727 m +1.1433 0.3727 l +s +n +0.1500 0.4364 m +1.1433 0.4364 l +s +[0.0075 0.0045 ] 0 SD +0.0015 SLW +n +0.1500 0.1500 m +1.1433 0.1500 l +s +n +0.1500 0.2136 m +1.1433 0.2136 l +s +n +0.1500 0.2773 m +1.1433 0.2773 l +s +n +0.1500 0.3409 m +1.1433 0.3409 l +s +n +0.1500 0.4045 m +1.1433 0.4045 l +s +n +0.1500 0.4682 m +1.1433 0.4682 l +s +n +0.1500 0.1574 m +0.1580 0.1692 l +0.1589 0.1639 l +0.1599 0.1643 l +0.1608 0.1667 l +0.1652 0.2345 l +0.1661 0.2806 l +0.1670 0.1932 l +0.1680 0.1643 l +0.1689 0.1781 l +0.1699 0.1647 l +0.1708 0.1572 l +0.1718 0.1513 l +0.1729 0.1585 l +0.1744 0.1850 l +0.1753 0.1967 l +0.1763 0.1701 l +0.1772 0.1643 l +0.1783 0.1906 l +0.1792 0.2010 l +0.1801 0.1796 l +0.1811 0.1521 l +0.1822 0.1635 l +0.1831 0.1574 l +0.1841 0.1512 l +0.1850 0.1507 l +0.1860 0.1514 l +0.1871 0.1508 l +0.1881 0.1507 l +0.1891 0.1505 l +0.1902 0.1507 l +0.1912 0.1510 l +0.1922 0.1505 l +0.1932 0.1507 l +0.1943 0.1510 l +0.1952 0.1509 l +0.1962 0.1506 l +0.1972 0.1507 l +0.1983 0.1505 l +0.1995 0.1507 l +0.2006 0.1509 l +0.2016 0.1505 l +0.2026 0.1504 l +0.2036 0.1507 l +0.2046 0.1507 l +0.2056 0.1936 l +0.2066 0.1665 l +0.2075 0.1507 l +0.2086 0.1505 l +0.2096 0.1506 l +0.2107 0.1512 l +0.2116 0.1507 l +0.2129 0.1507 l +0.2138 0.1506 l +0.2149 0.1507 l +0.2159 0.1508 l +0.2170 0.1507 l +0.2183 0.1505 l +0.2193 0.1505 l +0.2202 0.1513 l +0.2212 0.1515 l +0.2221 0.1506 l +0.2236 0.1501 l +0.2248 0.1512 l +0.2260 0.1953 l +0.2269 0.1684 l +0.2279 0.1622 l +0.2288 0.1748 l +0.2298 0.1691 l +0.2308 0.1828 l +0.2317 0.2305 l +0.2326 0.1769 l +0.2336 0.1739 l +0.2345 0.1721 l +0.2355 0.1794 l +0.2364 0.1860 l +0.2373 0.1825 l +0.2383 0.1755 l +0.2392 0.1670 l +0.2402 0.1627 l +0.2412 0.1645 l +0.2421 0.1612 l +0.2430 0.1597 l +0.2440 0.1593 l +0.2450 0.1640 l +0.2460 0.1610 l +0.2469 0.1644 l +0.2478 0.1665 l +0.2488 0.1682 l +0.2497 0.1683 l +0.2507 0.1787 l +0.2516 0.1796 l +0.2526 0.1755 l +0.2535 0.1879 l +0.2544 0.1712 l +0.2554 0.1708 l +0.2563 0.1645 l +0.2573 0.1651 l +0.2583 0.2449 l +0.2593 0.3151 l +0.2602 0.3236 l +0.2611 0.3166 l +0.2621 0.3251 l +0.2630 0.3184 l +0.2639 0.2222 l +0.2649 0.1790 l +0.2662 0.1639 l +0.2671 0.1585 l +0.2681 0.1508 l +0.2704 0.1862 l +0.2713 0.2073 l +0.2722 0.1992 l +0.2732 0.1738 l +0.2741 0.1812 l +0.2751 0.2412 l +0.2760 0.2061 l +0.2770 0.1611 l +0.2779 0.1565 l +0.2789 0.1618 l +0.2798 0.1810 l +0.2808 0.1587 l +0.2818 0.1507 l +0.2827 0.1507 l +0.2837 0.1534 l +0.2848 0.1510 l +0.2857 0.1506 l +0.2867 0.1506 l +0.2877 0.1508 l +0.2888 0.1509 l +0.2897 0.1504 l +0.2907 0.1505 l +0.2916 0.1506 l +0.2926 0.1507 l +0.2935 0.1514 l +0.2945 0.1517 l +0.2955 0.1517 l +0.2965 0.1515 l +0.2976 0.1508 l +0.2987 0.1519 l +0.3001 0.1506 l +0.3011 0.1509 l +0.3020 0.1504 l +0.3031 0.1505 l +0.3041 0.1507 l +0.3054 0.1504 l +0.3064 0.1585 l +0.3073 0.1825 l +0.3083 0.1566 l +0.3093 0.1511 l +0.3103 0.1515 l +0.3114 0.1506 l +0.3124 0.1507 l +0.3135 0.1506 l +0.3144 0.1506 l +0.3156 0.1507 l +0.3166 0.1506 l +0.3178 0.1506 l +0.3188 0.1529 l +0.3198 0.1512 l +0.3210 0.1504 l +0.3228 0.1521 l +0.3240 0.1923 l +0.3250 0.1653 l +0.3259 0.1621 l +0.3269 0.1803 l +0.3278 0.1770 l +0.3288 0.1779 l +0.3297 0.1699 l +0.3307 0.1868 l +0.3316 0.1717 l +0.3327 0.1708 l +0.3336 0.1905 l +0.3346 0.1970 l +0.3356 0.1921 l +0.3365 0.1808 l +0.3375 0.1727 l +0.3384 0.1646 l +0.3394 0.1630 l +0.3403 0.1682 l +0.3413 0.1603 l +0.3422 0.1670 l +0.3432 0.1566 l +0.3442 0.1638 l +0.3452 0.1742 l +0.3462 0.1824 l +0.3471 0.1768 l +0.3481 0.1748 l +0.3491 0.1792 l +0.3500 0.1771 l +0.3510 0.1657 l +0.3519 0.1656 l +0.3528 0.1642 l +0.3538 0.1644 l +0.3547 0.1852 l +0.3557 0.3125 l +0.3566 0.3197 l +0.3575 0.2984 l +0.3585 0.2708 l +0.3594 0.3007 l +0.3603 0.2711 l +0.3613 0.2368 l +0.3622 0.2333 l +0.3632 0.2093 l +0.3641 0.1735 l +0.3650 0.1796 l +0.3661 0.1509 l +0.3685 0.2043 l +0.3694 0.1964 l +0.3703 0.2120 l +0.3713 0.1798 l +0.3722 0.1754 l +0.3732 0.2111 l +0.3741 0.2314 l +0.3750 0.1677 l +0.3760 0.1607 l +0.3771 0.1557 l +0.3786 0.1846 l +0.3795 0.1647 l +0.3804 0.1571 l +0.3814 0.1508 l +0.3826 0.1513 l +0.3835 0.1538 l +0.3845 0.1509 l +0.3854 0.1504 l +0.3864 0.1508 l +0.3874 0.1506 l +0.3885 0.1507 l +0.3895 0.1504 l +0.3905 0.1507 l +0.3914 0.1504 l +0.3924 0.1515 l +0.3934 0.1512 l +0.3944 0.1526 l +0.3953 0.1519 l +0.3963 0.1555 l +0.3976 0.1505 l +0.3986 0.1503 l +0.3997 0.1515 l +0.4007 0.1832 l +0.4016 0.1672 l +0.4026 0.1505 l +0.4036 0.1507 l +0.4047 0.1505 l +0.4056 0.1512 l +0.4066 0.1526 l +0.4076 0.1530 l +0.4086 0.1504 l +0.4098 0.1515 l +0.4108 0.1506 l +0.4118 0.1506 l +0.4130 0.1504 l +0.4140 0.1514 l +0.4150 0.1513 l +0.4160 0.1506 l +0.4170 0.1506 l +0.4180 0.1523 l +0.4189 0.1508 l +0.4199 0.1503 l +0.4218 0.1514 l +0.4230 0.1923 l +0.4240 0.1642 l +0.4249 0.1650 l +0.4259 0.1756 l +0.4269 0.1815 l +0.4278 0.1748 l +0.4288 0.1695 l +0.4297 0.1822 l +0.4306 0.1807 l +0.4316 0.1688 l +0.4325 0.1833 l +0.4335 0.1959 l +0.4344 0.1910 l +0.4354 0.1886 l +0.4363 0.1794 l +0.4372 0.1661 l +0.4382 0.1665 l +0.4392 0.1620 l +0.4401 0.1650 l +0.4410 0.1592 l +0.4420 0.1671 l +0.4429 0.1638 l +0.4439 0.1697 l +0.4448 0.1782 l +0.4458 0.1708 l +0.4467 0.1717 l +0.4477 0.1623 l +0.4486 0.1732 l +0.4496 0.1713 l +0.4505 0.1972 l +0.4515 0.1956 l +0.4524 0.1727 l +0.4534 0.1699 l +0.4543 0.1771 l +0.4553 0.2824 l +0.4562 0.3086 l +0.4571 0.3076 l +0.4581 0.2876 l +0.4590 0.3125 l +0.4600 0.2786 l +0.4609 0.2516 l +0.4618 0.2120 l +0.4628 0.2118 l +0.4641 0.1734 l +0.4651 0.1735 l +0.4660 0.1508 l +0.4671 0.1564 l +0.4686 0.2000 l +0.4695 0.1969 l +0.4705 0.2021 l +0.4714 0.1821 l +0.4724 0.1717 l +0.4734 0.2061 l +0.4743 0.2255 l +0.4753 0.1693 l +0.4762 0.1612 l +0.4771 0.1565 l +0.4781 0.1612 l +0.4791 0.1773 l +0.4800 0.1638 l +0.4809 0.1521 l +0.4819 0.1509 l +0.4829 0.1537 l +0.4839 0.1524 l +0.4848 0.1504 l +0.4858 0.1507 l +0.4867 0.1508 l +0.4878 0.1506 l +0.4889 0.1506 l +0.4899 0.1507 l +0.4909 0.1517 l +0.4921 0.1520 l +0.4932 0.1520 l +0.4943 0.1511 l +0.4953 0.1506 l +0.4964 0.1505 l +0.4975 0.1521 l +0.4985 0.1509 l +0.4996 0.1504 l +0.5006 0.1706 l +0.5016 0.1768 l +0.5027 0.1505 l +0.5038 0.1505 l +0.5048 0.1520 l +0.5057 0.1507 l +0.5067 0.1507 l +0.5076 0.1508 l +0.5086 0.1523 l +0.5095 0.1504 l +0.5106 0.1515 l +0.5116 0.1509 l +0.5126 0.1505 l +0.5136 0.1508 l +0.5148 0.1505 l +0.5158 0.1505 l +0.5168 0.1506 l +0.5177 0.1513 l +0.5189 0.1507 l +0.5199 0.1528 l +0.5210 0.1503 l +0.5226 0.1513 l +0.5238 0.1913 l +0.5249 0.1695 l +0.5258 0.1646 l +0.5267 0.1800 l +0.5277 0.1779 l +0.5286 0.1725 l +0.5296 0.1663 l +0.5305 0.1807 l +0.5314 0.1759 l +0.5325 0.1679 l +0.5334 0.1868 l +0.5344 0.1894 l +0.5353 0.1868 l +0.5363 0.1832 l +0.5372 0.1764 l +0.5381 0.1652 l +0.5391 0.1609 l +0.5400 0.1629 l +0.5410 0.1624 l +0.5420 0.1621 l +0.5429 0.1584 l +0.5439 0.1612 l +0.5448 0.1625 l +0.5458 0.1674 l +0.5467 0.1677 l +0.5477 0.1666 l +0.5486 0.1751 l +0.5496 0.1836 l +0.5505 0.1754 l +0.5514 0.1752 l +0.5524 0.1912 l +0.5533 0.2012 l +0.5543 0.1783 l +0.5552 0.1657 l +0.5562 0.1638 l +0.5572 0.2070 l +0.5581 0.3169 l +0.5590 0.2994 l +0.5600 0.2873 l +0.5609 0.2292 l +0.5618 0.2302 l +0.5628 0.2834 l +0.5637 0.2996 l +0.5647 0.2724 l +0.5656 0.1817 l +0.5666 0.1813 l +0.5675 0.1530 l +0.5686 0.1564 l +0.5701 0.1963 l +0.5711 0.1927 l +0.5720 0.2055 l +0.5730 0.1830 l +0.5740 0.1737 l +0.5749 0.2144 l +0.5759 0.2206 l +0.5768 0.1699 l +0.5777 0.1605 l +0.5787 0.1575 l +0.5796 0.1575 l +0.5806 0.1875 l +0.5815 0.1680 l +0.5825 0.1521 l +0.5835 0.1511 l +0.5846 0.1539 l +0.5855 0.1514 l +0.5866 0.1506 l +0.5877 0.1505 l +0.5887 0.1508 l +0.5897 0.1507 l +0.5908 0.1506 l +0.5921 0.1503 l +0.5930 0.1530 l +0.5940 0.1506 l +0.5950 0.1544 l +0.5961 0.1514 l +0.5971 0.1545 l +0.5981 0.1505 l +0.5991 0.1505 l +0.6002 0.1505 l +0.6012 0.1510 l +0.6024 0.1803 l +0.6034 0.1711 l +0.6046 0.1517 l +0.6056 0.1505 l +0.6067 0.1514 l +0.6076 0.1527 l +0.6086 0.1524 l +0.6096 0.1508 l +0.6106 0.1503 l +0.6116 0.1508 l +0.6126 0.1514 l +0.6135 0.1504 l +0.6145 0.1506 l +0.6157 0.1505 l +0.6168 0.1505 l +0.6178 0.1506 l +0.6187 0.1520 l +0.6198 0.1521 l +0.6208 0.1512 l +0.6222 0.1501 l +0.6234 0.1514 l +0.6246 0.1949 l +0.6255 0.1649 l +0.6265 0.1662 l +0.6274 0.1713 l +0.6284 0.1755 l +0.6293 0.1765 l +0.6303 0.1722 l +0.6312 0.1843 l +0.6321 0.1770 l +0.6331 0.1701 l +0.6340 0.1753 l +0.6350 0.1881 l +0.6359 0.1881 l +0.6369 0.1886 l +0.6378 0.1789 l +0.6387 0.1713 l +0.6397 0.1640 l +0.6407 0.1644 l +0.6418 0.1624 l +0.6428 0.1623 l +0.6437 0.1587 l +0.6447 0.1655 l +0.6456 0.1586 l +0.6466 0.1672 l +0.6475 0.1662 l +0.6485 0.1650 l +0.6494 0.1679 l +0.6504 0.1852 l +0.6513 0.1854 l +0.6523 0.1801 l +0.6532 0.1848 l +0.6542 0.2064 l +0.6551 0.1986 l +0.6561 0.1692 l +0.6571 0.1668 l +0.6580 0.1847 l +0.6590 0.2886 l +0.6599 0.3022 l +0.6609 0.2971 l +0.6618 0.2518 l +0.6627 0.2163 l +0.6637 0.2662 l +0.6646 0.2424 l +0.6656 0.1857 l +0.6665 0.1723 l +0.6674 0.1771 l +0.6685 0.1508 l +0.6709 0.1888 l +0.6718 0.1794 l +0.6727 0.1825 l +0.6737 0.1825 l +0.6746 0.1717 l +0.6756 0.2029 l +0.6765 0.2048 l +0.6775 0.1686 l +0.6784 0.1616 l +0.6794 0.1545 l +0.6805 0.1711 l +0.6814 0.1669 l +0.6824 0.1601 l +0.6834 0.1512 l +0.6845 0.1514 l +0.6854 0.1515 l +0.6864 0.1508 l +0.6876 0.1507 l +0.6885 0.1507 l +0.6896 0.1505 l +0.6906 0.1506 l +0.6917 0.1509 l +0.6926 0.1505 l +0.6938 0.1517 l +0.6949 0.1508 l +0.6959 0.1511 l +0.6969 0.1516 l +0.6979 0.1520 l +0.6989 0.1505 l +0.6999 0.1504 l +0.7010 0.1505 l +0.7021 0.1506 l +0.7032 0.1824 l +0.7042 0.1721 l +0.7056 0.1506 l +0.7066 0.1528 l +0.7076 0.1511 l +0.7085 0.1511 l +0.7095 0.1513 l +0.7104 0.1511 l +0.7114 0.1504 l +0.7124 0.1505 l +0.7133 0.1514 l +0.7143 0.1509 l +0.7155 0.1505 l +0.7166 0.1504 l +0.7177 0.1506 l +0.7187 0.1506 l +0.7197 0.1513 l +0.7208 0.1514 l +0.7218 0.1512 l +0.7229 0.1501 l +0.7241 0.1513 l +0.7253 0.1966 l +0.7263 0.1666 l +0.7272 0.1629 l +0.7282 0.1784 l +0.7291 0.1721 l +0.7300 0.1687 l +0.7310 0.1681 l +0.7319 0.1833 l +0.7328 0.1790 l +0.7338 0.1684 l +0.7347 0.1875 l +0.7357 0.1879 l +0.7366 0.1868 l +0.7376 0.1792 l +0.7385 0.1763 l +0.7395 0.1620 l +0.7404 0.1604 l +0.7413 0.1607 l +0.7423 0.1629 l +0.7433 0.1601 l +0.7442 0.1584 l +0.7451 0.1683 l +0.7461 0.1708 l +0.7471 0.1749 l +0.7480 0.1728 l +0.7490 0.1657 l +0.7499 0.1601 l +0.7509 0.1691 l +0.7518 0.1738 l +0.7528 0.2051 l +0.7537 0.1811 l +0.7547 0.1693 l +0.7557 0.1655 l +0.7566 0.1670 l +0.7575 0.2742 l +0.7585 0.3076 l +0.7594 0.2930 l +0.7604 0.2999 l +0.7613 0.3038 l +0.7622 0.3130 l +0.7632 0.2624 l +0.7641 0.1652 l +0.7651 0.1797 l +0.7660 0.1874 l +0.7670 0.1599 l +0.7681 0.1669 l +0.7691 0.1538 l +0.7701 0.1514 l +0.7720 0.1842 l +0.7729 0.1942 l +0.7738 0.1967 l +0.7748 0.1729 l +0.7758 0.1711 l +0.7768 0.2054 l +0.7777 0.2122 l +0.7787 0.1644 l +0.7796 0.1601 l +0.7805 0.1542 l +0.7815 0.1552 l +0.7824 0.1639 l +0.7834 0.1586 l +0.7844 0.1518 l +0.7853 0.1513 l +0.7863 0.1511 l +0.7872 0.1522 l +0.7882 0.1507 l +0.7892 0.1506 l +0.7902 0.1506 l +0.7912 0.1510 l +0.7922 0.1506 l +0.7932 0.1511 l +0.7943 0.1507 l +0.7953 0.1508 l +0.7964 0.1510 l +0.7973 0.1511 l +0.7983 0.1509 l +0.7994 0.1508 l +0.8004 0.1513 l +0.8016 0.1504 l +0.8026 0.1506 l +0.8035 0.1508 l +0.8045 0.1884 l +0.8054 0.1656 l +0.8065 0.1506 l +0.8075 0.1506 l +0.8086 0.1509 l +0.8097 0.1507 l +0.8107 0.1525 l +0.8118 0.1504 l +0.8128 0.1504 l +0.8137 0.1509 l +0.8147 0.1510 l +0.8158 0.1506 l +0.8168 0.1507 l +0.8181 0.1506 l +0.8191 0.1524 l +0.8201 0.1505 l +0.8211 0.1507 l +0.8221 0.1504 l +0.8231 0.1515 l +0.8240 0.1504 l +0.8257 0.1512 l +0.8269 0.1951 l +0.8278 0.1670 l +0.8288 0.1678 l +0.8298 0.1717 l +0.8307 0.1751 l +0.8316 0.1770 l +0.8326 0.1674 l +0.8335 0.1777 l +0.8344 0.1767 l +0.8354 0.1710 l +0.8363 0.1773 l +0.8373 0.1818 l +0.8383 0.1862 l +0.8392 0.1778 l +0.8401 0.1795 l +0.8411 0.1729 l +0.8420 0.1638 l +0.8429 0.1642 l +0.8439 0.1615 l +0.8449 0.1591 l +0.8458 0.1650 l +0.8467 0.1629 l +0.8477 0.1653 l +0.8486 0.1621 l +0.8496 0.1645 l +0.8505 0.1647 l +0.8515 0.1661 l +0.8524 0.1783 l +0.8534 0.1746 l +0.8543 0.1732 l +0.8553 0.1772 l +0.8562 0.1749 l +0.8572 0.1703 l +0.8581 0.1690 l +0.8591 0.1670 l +0.8600 0.1651 l +0.8609 0.2649 l +0.8619 0.3107 l +0.8628 0.2696 l +0.8637 0.2814 l +0.8647 0.2310 l +0.8656 0.2629 l +0.8666 0.3241 l +0.8675 0.2852 l +0.8685 0.1794 l +0.8694 0.1829 l +0.8703 0.1531 l +0.8713 0.1514 l +0.8732 0.1966 l +0.8741 0.1983 l +0.8751 0.2067 l +0.8760 0.1798 l +0.8769 0.1796 l +0.8779 0.2203 l +0.8788 0.2257 l +0.8798 0.1575 l +0.8807 0.1592 l +0.8816 0.1535 l +0.8829 0.1962 l +0.8839 0.1649 l +0.8848 0.1538 l +0.8859 0.1508 l +0.8868 0.1532 l +0.8878 0.1526 l +0.8888 0.1505 l +0.8897 0.1509 l +0.8907 0.1508 l +0.8919 0.1506 l +0.8930 0.1511 l +0.8941 0.1506 l +0.8954 0.1508 l +0.8965 0.1526 l +0.8976 0.1526 l +0.8986 0.1523 l +0.8996 0.1512 l +0.9006 0.1529 l +0.9016 0.1506 l +0.9025 0.1510 l +0.9036 0.1505 l +0.9046 0.1625 l +0.9056 0.1840 l +0.9065 0.1554 l +0.9074 0.1512 l +0.9084 0.1507 l +0.9094 0.1523 l +0.9105 0.1516 l +0.9116 0.1526 l +0.9127 0.1506 l +0.9139 0.1505 l +0.9149 0.1513 l +0.9158 0.1506 l +0.9168 0.1505 l +0.9179 0.1504 l +0.9189 0.1507 l +0.9200 0.1514 l +0.9210 0.1506 l +0.9220 0.1506 l +0.9229 0.1523 l +0.9239 0.1513 l +0.9250 0.1501 l +0.9262 0.1512 l +0.9274 0.1918 l +0.9284 0.1694 l +0.9293 0.1635 l +0.9303 0.1769 l +0.9312 0.1809 l +0.9322 0.1769 l +0.9331 0.1728 l +0.9341 0.1828 l +0.9350 0.1766 l +0.9360 0.1698 l +0.9370 0.1775 l +0.9379 0.1830 l +0.9389 0.1829 l +0.9398 0.1870 l +0.9407 0.1787 l +0.9417 0.1713 l +0.9426 0.1646 l +0.9436 0.1640 l +0.9445 0.1593 l +0.9455 0.1652 l +0.9464 0.1587 l +0.9475 0.1657 l +0.9485 0.1631 l +0.9494 0.1595 l +0.9504 0.1717 l +0.9514 0.1691 l +0.9523 0.1675 l +0.9533 0.1783 l +0.9542 0.1787 l +0.9552 0.1747 l +0.9561 0.1839 l +0.9570 0.2014 l +0.9580 0.2027 l +0.9589 0.1732 l +0.9599 0.1667 l +0.9608 0.1675 l +0.9618 0.2893 l +0.9627 0.3256 l +0.9636 0.3032 l +0.9646 0.2303 l +0.9655 0.2337 l +0.9664 0.2597 l +0.9674 0.2803 l +0.9683 0.2790 l +0.9693 0.1901 l +0.9704 0.1777 l +0.9713 0.1549 l +0.9725 0.1515 l +0.9743 0.1987 l +0.9752 0.1909 l +0.9762 0.2018 l +0.9771 0.1938 l +0.9781 0.1709 l +0.9790 0.1900 l +0.9800 0.2314 l +0.9809 0.2136 l +0.9820 0.1641 l +0.9830 0.1563 l +0.9839 0.1526 l +0.9849 0.1942 l +0.9858 0.1666 l +0.9867 0.1533 l +0.9877 0.1504 l +0.9887 0.1532 l +0.9897 0.1522 l +0.9909 0.1506 l +0.9919 0.1507 l +0.9929 0.1509 l +0.9938 0.1506 l +0.9949 0.1505 l +0.9959 0.1505 l +0.9970 0.1508 l +0.9982 0.1515 l +0.9993 0.1517 l +1.0002 0.1530 l +1.0013 0.1520 l +1.0022 0.1547 l +1.0032 0.1507 l +1.0042 0.1503 l +1.0052 0.1511 l +1.0061 0.1508 l +1.0072 0.1913 l +1.0082 0.1600 l +1.0093 0.1506 l +1.0103 0.1505 l +1.0112 0.1515 l +1.0123 0.1524 l +1.0132 0.1515 l +1.0141 0.1509 l +1.0152 0.1513 l +1.0162 0.1504 l +1.0171 0.1507 l +1.0181 0.1505 l +1.0192 0.1509 l +1.0202 0.1509 l +1.0212 0.1507 l +1.0222 0.1507 l +1.0232 0.1505 l +1.0245 0.1510 l +1.0255 0.1504 l +1.0265 0.1521 l +1.0284 0.1513 l +1.0296 0.1973 l +1.0306 0.1676 l +1.0316 0.1648 l +1.0325 0.1767 l +1.0335 0.1775 l +1.0344 0.1753 l +1.0353 0.1732 l +1.0363 0.1819 l +1.0372 0.1800 l +1.0382 0.1679 l +1.0392 0.1786 l +1.0402 0.1828 l +1.0411 0.1913 l +1.0420 0.1896 l +1.0430 0.1769 l +1.0439 0.1636 l +1.0449 0.1657 l +1.0458 0.1628 l +1.0467 0.1655 l +1.0477 0.1593 l +1.0487 0.1685 l +1.0496 0.1673 l +1.0505 0.1654 l +1.0515 0.1736 l +1.0524 0.1681 l +1.0534 0.1614 l +1.0544 0.1748 l +1.0553 0.1764 l +1.0562 0.2068 l +1.0572 0.2025 l +1.0581 0.1750 l +1.0591 0.1680 l +1.0600 0.2192 l +1.0610 0.3104 l +1.0619 0.3128 l +1.0629 0.2829 l +1.0638 0.3009 l +1.0647 0.2999 l +1.0657 0.3040 l +1.0666 0.1875 l +1.0676 0.1651 l +1.0685 0.2618 l +1.0694 0.1704 l +1.0705 0.1675 l +1.0714 0.1581 l +1.0726 0.1514 l +1.0745 0.1945 l +1.0755 0.1941 l +1.0764 0.1979 l +1.0774 0.1766 l +1.0783 0.1778 l +1.0792 0.2066 l +1.0802 0.2136 l +1.0811 0.1899 l +1.0821 0.1608 l +1.0830 0.1567 l +1.0841 0.1568 l +1.0850 0.1809 l +1.0860 0.1650 l +1.0869 0.1525 l +1.0880 0.1508 l +1.0889 0.1536 l +1.0898 0.1515 l +1.0908 0.1505 l +1.0918 0.1510 l +1.0928 0.1506 l +1.0939 0.1507 l +1.0949 0.1504 l +1.0958 0.1509 l +1.0968 0.1505 l +1.0977 0.1519 l +1.0988 0.1506 l +1.0998 0.1537 l +1.1010 0.1509 l +1.1021 0.1512 l +1.1032 0.1522 l +1.1044 0.1503 l +1.1055 0.1510 l +1.1064 0.1660 l +1.1074 0.1878 l +1.1084 0.1506 l +1.1094 0.1505 l +1.1105 0.1508 l +1.1116 0.1521 l +1.1126 0.1514 l +1.1135 0.1519 l +1.1146 0.1506 l +1.1159 0.1504 l +1.1168 0.1514 l +1.1178 0.1513 l +1.1189 0.1507 l +1.1199 0.1506 l +1.1209 0.1505 l +1.1219 0.1506 l +1.1228 0.1510 l +1.1238 0.1510 l +1.1247 0.1523 l +1.1259 0.1506 l +1.1272 0.1501 l +1.1284 0.1516 l +1.1296 0.1923 l +1.1306 0.1683 l +1.1315 0.1652 l +1.1325 0.1782 l +1.1334 0.1740 l +1.1344 0.1746 l +1.1353 0.1683 l +1.1363 0.1837 l +1.1372 0.1776 l +1.1382 0.1648 l +1.1382 0.1500 l +0.1500 0.1500 l +c +[/DeviceRGB] SCS +Color2 SC +fill +[] 0 SD +0.0015 SLW +n +0.1500 0.1574 m +0.1580 0.1692 l +0.1589 0.1639 l +0.1599 0.1643 l +0.1608 0.1667 l +0.1652 0.2345 l +0.1661 0.2806 l +0.1670 0.1932 l +0.1680 0.1643 l +0.1689 0.1781 l +0.1699 0.1647 l +0.1708 0.1572 l +0.1718 0.1513 l +0.1729 0.1585 l +0.1744 0.1850 l +0.1753 0.1967 l +0.1763 0.1701 l +0.1772 0.1643 l +0.1783 0.1906 l +0.1792 0.2010 l +0.1801 0.1796 l +0.1811 0.1521 l +0.1822 0.1635 l +0.1831 0.1574 l +0.1841 0.1512 l +0.1850 0.1507 l +0.1860 0.1514 l +0.1871 0.1508 l +0.1881 0.1507 l +0.1891 0.1505 l +0.1902 0.1507 l +0.1912 0.1510 l +0.1922 0.1505 l +0.1932 0.1507 l +0.1943 0.1510 l +0.1952 0.1509 l +0.1962 0.1506 l +0.1972 0.1507 l +0.1983 0.1505 l +0.1995 0.1507 l +0.2006 0.1509 l +0.2016 0.1505 l +0.2026 0.1504 l +0.2036 0.1507 l +0.2046 0.1507 l +0.2056 0.1936 l +0.2066 0.1665 l +0.2075 0.1507 l +0.2086 0.1505 l +0.2096 0.1506 l +0.2107 0.1512 l +0.2116 0.1507 l +0.2129 0.1507 l +0.2138 0.1506 l +0.2149 0.1507 l +0.2159 0.1508 l +0.2170 0.1507 l +0.2183 0.1505 l +0.2193 0.1505 l +0.2202 0.1513 l +0.2212 0.1515 l +0.2221 0.1506 l +0.2236 0.1501 l +0.2248 0.1512 l +0.2260 0.1953 l +0.2269 0.1684 l +0.2279 0.1622 l +0.2288 0.1748 l +0.2298 0.1691 l +0.2308 0.1828 l +0.2317 0.2305 l +0.2326 0.1769 l +0.2336 0.1739 l +0.2345 0.1721 l +0.2355 0.1794 l +0.2364 0.1860 l +0.2373 0.1825 l +0.2383 0.1755 l +0.2392 0.1670 l +0.2402 0.1627 l +0.2412 0.1645 l +0.2421 0.1612 l +0.2430 0.1597 l +0.2440 0.1593 l +0.2450 0.1640 l +0.2460 0.1610 l +0.2469 0.1644 l +0.2478 0.1665 l +0.2488 0.1682 l +0.2497 0.1683 l +0.2507 0.1787 l +0.2516 0.1796 l +0.2526 0.1755 l +0.2535 0.1879 l +0.2544 0.1712 l +0.2554 0.1708 l +0.2563 0.1645 l +0.2573 0.1651 l +0.2583 0.2449 l +0.2593 0.3151 l +0.2602 0.3236 l +0.2611 0.3166 l +0.2621 0.3251 l +0.2630 0.3184 l +0.2639 0.2222 l +0.2649 0.1790 l +0.2662 0.1639 l +0.2671 0.1585 l +0.2681 0.1508 l +0.2704 0.1862 l +0.2713 0.2073 l +0.2722 0.1992 l +0.2732 0.1738 l +0.2741 0.1812 l +0.2751 0.2412 l +0.2760 0.2061 l +0.2770 0.1611 l +0.2779 0.1565 l +0.2789 0.1618 l +0.2798 0.1810 l +0.2808 0.1587 l +0.2818 0.1507 l +0.2827 0.1507 l +0.2837 0.1534 l +0.2848 0.1510 l +0.2857 0.1506 l +0.2867 0.1506 l +0.2877 0.1508 l +0.2888 0.1509 l +0.2897 0.1504 l +0.2907 0.1505 l +0.2916 0.1506 l +0.2926 0.1507 l +0.2935 0.1514 l +0.2945 0.1517 l +0.2955 0.1517 l +0.2965 0.1515 l +0.2976 0.1508 l +0.2987 0.1519 l +0.3001 0.1506 l +0.3011 0.1509 l +0.3020 0.1504 l +0.3031 0.1505 l +0.3041 0.1507 l +0.3054 0.1504 l +0.3064 0.1585 l +0.3073 0.1825 l +0.3083 0.1566 l +0.3093 0.1511 l +0.3103 0.1515 l +0.3114 0.1506 l +0.3124 0.1507 l +0.3135 0.1506 l +0.3144 0.1506 l +0.3156 0.1507 l +0.3166 0.1506 l +0.3178 0.1506 l +0.3188 0.1529 l +0.3198 0.1512 l +0.3210 0.1504 l +0.3228 0.1521 l +0.3240 0.1923 l +0.3250 0.1653 l +0.3259 0.1621 l +0.3269 0.1803 l +0.3278 0.1770 l +0.3288 0.1779 l +0.3297 0.1699 l +0.3307 0.1868 l +0.3316 0.1717 l +0.3327 0.1708 l +0.3336 0.1905 l +0.3346 0.1970 l +0.3356 0.1921 l +0.3365 0.1808 l +0.3375 0.1727 l +0.3384 0.1646 l +0.3394 0.1630 l +0.3403 0.1682 l +0.3413 0.1603 l +0.3422 0.1670 l +0.3432 0.1566 l +0.3442 0.1638 l +0.3452 0.1742 l +0.3462 0.1824 l +0.3471 0.1768 l +0.3481 0.1748 l +0.3491 0.1792 l +0.3500 0.1771 l +0.3510 0.1657 l +0.3519 0.1656 l +0.3528 0.1642 l +0.3538 0.1644 l +0.3547 0.1852 l +0.3557 0.3125 l +0.3566 0.3197 l +0.3575 0.2984 l +0.3585 0.2708 l +0.3594 0.3007 l +0.3603 0.2711 l +0.3613 0.2368 l +0.3622 0.2333 l +0.3632 0.2093 l +0.3641 0.1735 l +0.3650 0.1796 l +0.3661 0.1509 l +0.3685 0.2043 l +0.3694 0.1964 l +0.3703 0.2120 l +0.3713 0.1798 l +0.3722 0.1754 l +0.3732 0.2111 l +0.3741 0.2314 l +0.3750 0.1677 l +0.3760 0.1607 l +0.3771 0.1557 l +0.3786 0.1846 l +0.3795 0.1647 l +0.3804 0.1571 l +0.3814 0.1508 l +0.3826 0.1513 l +0.3835 0.1538 l +0.3845 0.1509 l +0.3854 0.1504 l +0.3864 0.1508 l +0.3874 0.1506 l +0.3885 0.1507 l +0.3895 0.1504 l +0.3905 0.1507 l +0.3914 0.1504 l +0.3924 0.1515 l +0.3934 0.1512 l +0.3944 0.1526 l +0.3953 0.1519 l +0.3963 0.1555 l +0.3976 0.1505 l +0.3986 0.1503 l +0.3997 0.1515 l +0.4007 0.1832 l +0.4016 0.1672 l +0.4026 0.1505 l +0.4036 0.1507 l +0.4047 0.1505 l +0.4056 0.1512 l +0.4066 0.1526 l +0.4076 0.1530 l +0.4086 0.1504 l +0.4098 0.1515 l +0.4108 0.1506 l +0.4118 0.1506 l +0.4130 0.1504 l +0.4140 0.1514 l +0.4150 0.1513 l +0.4160 0.1506 l +0.4170 0.1506 l +0.4180 0.1523 l +0.4189 0.1508 l +0.4199 0.1503 l +0.4218 0.1514 l +0.4230 0.1923 l +0.4240 0.1642 l +0.4249 0.1650 l +0.4259 0.1756 l +0.4269 0.1815 l +0.4278 0.1748 l +0.4288 0.1695 l +0.4297 0.1822 l +0.4306 0.1807 l +0.4316 0.1688 l +0.4325 0.1833 l +0.4335 0.1959 l +0.4344 0.1910 l +0.4354 0.1886 l +0.4363 0.1794 l +0.4372 0.1661 l +0.4382 0.1665 l +0.4392 0.1620 l +0.4401 0.1650 l +0.4410 0.1592 l +0.4420 0.1671 l +0.4429 0.1638 l +0.4439 0.1697 l +0.4448 0.1782 l +0.4458 0.1708 l +0.4467 0.1717 l +0.4477 0.1623 l +0.4486 0.1732 l +0.4496 0.1713 l +0.4505 0.1972 l +0.4515 0.1956 l +0.4524 0.1727 l +0.4534 0.1699 l +0.4543 0.1771 l +0.4553 0.2824 l +0.4562 0.3086 l +0.4571 0.3076 l +0.4581 0.2876 l +0.4590 0.3125 l +0.4600 0.2786 l +0.4609 0.2516 l +0.4618 0.2120 l +0.4628 0.2118 l +0.4641 0.1734 l +0.4651 0.1735 l +0.4660 0.1508 l +0.4671 0.1564 l +0.4686 0.2000 l +0.4695 0.1969 l +0.4705 0.2021 l +0.4714 0.1821 l +0.4724 0.1717 l +0.4734 0.2061 l +0.4743 0.2255 l +0.4753 0.1693 l +0.4762 0.1612 l +0.4771 0.1565 l +0.4781 0.1612 l +0.4791 0.1773 l +0.4800 0.1638 l +0.4809 0.1521 l +0.4819 0.1509 l +0.4829 0.1537 l +0.4839 0.1524 l +0.4848 0.1504 l +0.4858 0.1507 l +0.4867 0.1508 l +0.4878 0.1506 l +0.4889 0.1506 l +0.4899 0.1507 l +0.4909 0.1517 l +0.4921 0.1520 l +0.4932 0.1520 l +0.4943 0.1511 l +0.4953 0.1506 l +0.4964 0.1505 l +0.4975 0.1521 l +0.4985 0.1509 l +0.4996 0.1504 l +0.5006 0.1706 l +0.5016 0.1768 l +0.5027 0.1505 l +0.5038 0.1505 l +0.5048 0.1520 l +0.5057 0.1507 l +0.5067 0.1507 l +0.5076 0.1508 l +0.5086 0.1523 l +0.5095 0.1504 l +0.5106 0.1515 l +0.5116 0.1509 l +0.5126 0.1505 l +0.5136 0.1508 l +0.5148 0.1505 l +0.5158 0.1505 l +0.5168 0.1506 l +0.5177 0.1513 l +0.5189 0.1507 l +0.5199 0.1528 l +0.5210 0.1503 l +0.5226 0.1513 l +0.5238 0.1913 l +0.5249 0.1695 l +0.5258 0.1646 l +0.5267 0.1800 l +0.5277 0.1779 l +0.5286 0.1725 l +0.5296 0.1663 l +0.5305 0.1807 l +0.5314 0.1759 l +0.5325 0.1679 l +0.5334 0.1868 l +0.5344 0.1894 l +0.5353 0.1868 l +0.5363 0.1832 l +0.5372 0.1764 l +0.5381 0.1652 l +0.5391 0.1609 l +0.5400 0.1629 l +0.5410 0.1624 l +0.5420 0.1621 l +0.5429 0.1584 l +0.5439 0.1612 l +0.5448 0.1625 l +0.5458 0.1674 l +0.5467 0.1677 l +0.5477 0.1666 l +0.5486 0.1751 l +0.5496 0.1836 l +0.5505 0.1754 l +0.5514 0.1752 l +0.5524 0.1912 l +0.5533 0.2012 l +0.5543 0.1783 l +0.5552 0.1657 l +0.5562 0.1638 l +0.5572 0.2070 l +0.5581 0.3169 l +0.5590 0.2994 l +0.5600 0.2873 l +0.5609 0.2292 l +0.5618 0.2302 l +0.5628 0.2834 l +0.5637 0.2996 l +0.5647 0.2724 l +0.5656 0.1817 l +0.5666 0.1813 l +0.5675 0.1530 l +0.5686 0.1564 l +0.5701 0.1963 l +0.5711 0.1927 l +0.5720 0.2055 l +0.5730 0.1830 l +0.5740 0.1737 l +0.5749 0.2144 l +0.5759 0.2206 l +0.5768 0.1699 l +0.5777 0.1605 l +0.5787 0.1575 l +0.5796 0.1575 l +0.5806 0.1875 l +0.5815 0.1680 l +0.5825 0.1521 l +0.5835 0.1511 l +0.5846 0.1539 l +0.5855 0.1514 l +0.5866 0.1506 l +0.5877 0.1505 l +0.5887 0.1508 l +0.5897 0.1507 l +0.5908 0.1506 l +0.5921 0.1503 l +0.5930 0.1530 l +0.5940 0.1506 l +0.5950 0.1544 l +0.5961 0.1514 l +0.5971 0.1545 l +0.5981 0.1505 l +0.5991 0.1505 l +0.6002 0.1505 l +0.6012 0.1510 l +0.6024 0.1803 l +0.6034 0.1711 l +0.6046 0.1517 l +0.6056 0.1505 l +0.6067 0.1514 l +0.6076 0.1527 l +0.6086 0.1524 l +0.6096 0.1508 l +0.6106 0.1503 l +0.6116 0.1508 l +0.6126 0.1514 l +0.6135 0.1504 l +0.6145 0.1506 l +0.6157 0.1505 l +0.6168 0.1505 l +0.6178 0.1506 l +0.6187 0.1520 l +0.6198 0.1521 l +0.6208 0.1512 l +0.6222 0.1501 l +0.6234 0.1514 l +0.6246 0.1949 l +0.6255 0.1649 l +0.6265 0.1662 l +0.6274 0.1713 l +0.6284 0.1755 l +0.6293 0.1765 l +0.6303 0.1722 l +0.6312 0.1843 l +0.6321 0.1770 l +0.6331 0.1701 l +0.6340 0.1753 l +0.6350 0.1881 l +0.6359 0.1881 l +0.6369 0.1886 l +0.6378 0.1789 l +0.6387 0.1713 l +0.6397 0.1640 l +0.6407 0.1644 l +0.6418 0.1624 l +0.6428 0.1623 l +0.6437 0.1587 l +0.6447 0.1655 l +0.6456 0.1586 l +0.6466 0.1672 l +0.6475 0.1662 l +0.6485 0.1650 l +0.6494 0.1679 l +0.6504 0.1852 l +0.6513 0.1854 l +0.6523 0.1801 l +0.6532 0.1848 l +0.6542 0.2064 l +0.6551 0.1986 l +0.6561 0.1692 l +0.6571 0.1668 l +0.6580 0.1847 l +0.6590 0.2886 l +0.6599 0.3022 l +0.6609 0.2971 l +0.6618 0.2518 l +0.6627 0.2163 l +0.6637 0.2662 l +0.6646 0.2424 l +0.6656 0.1857 l +0.6665 0.1723 l +0.6674 0.1771 l +0.6685 0.1508 l +0.6709 0.1888 l +0.6718 0.1794 l +0.6727 0.1825 l +0.6737 0.1825 l +0.6746 0.1717 l +0.6756 0.2029 l +0.6765 0.2048 l +0.6775 0.1686 l +0.6784 0.1616 l +0.6794 0.1545 l +0.6805 0.1711 l +0.6814 0.1669 l +0.6824 0.1601 l +0.6834 0.1512 l +0.6845 0.1514 l +0.6854 0.1515 l +0.6864 0.1508 l +0.6876 0.1507 l +0.6885 0.1507 l +0.6896 0.1505 l +0.6906 0.1506 l +0.6917 0.1509 l +0.6926 0.1505 l +0.6938 0.1517 l +0.6949 0.1508 l +0.6959 0.1511 l +0.6969 0.1516 l +0.6979 0.1520 l +0.6989 0.1505 l +0.6999 0.1504 l +0.7010 0.1505 l +0.7021 0.1506 l +0.7032 0.1824 l +0.7042 0.1721 l +0.7056 0.1506 l +0.7066 0.1528 l +0.7076 0.1511 l +0.7085 0.1511 l +0.7095 0.1513 l +0.7104 0.1511 l +0.7114 0.1504 l +0.7124 0.1505 l +0.7133 0.1514 l +0.7143 0.1509 l +0.7155 0.1505 l +0.7166 0.1504 l +0.7177 0.1506 l +0.7187 0.1506 l +0.7197 0.1513 l +0.7208 0.1514 l +0.7218 0.1512 l +0.7229 0.1501 l +0.7241 0.1513 l +0.7253 0.1966 l +0.7263 0.1666 l +0.7272 0.1629 l +0.7282 0.1784 l +0.7291 0.1721 l +0.7300 0.1687 l +0.7310 0.1681 l +0.7319 0.1833 l +0.7328 0.1790 l +0.7338 0.1684 l +0.7347 0.1875 l +0.7357 0.1879 l +0.7366 0.1868 l +0.7376 0.1792 l +0.7385 0.1763 l +0.7395 0.1620 l +0.7404 0.1604 l +0.7413 0.1607 l +0.7423 0.1629 l +0.7433 0.1601 l +0.7442 0.1584 l +0.7451 0.1683 l +0.7461 0.1708 l +0.7471 0.1749 l +0.7480 0.1728 l +0.7490 0.1657 l +0.7499 0.1601 l +0.7509 0.1691 l +0.7518 0.1738 l +0.7528 0.2051 l +0.7537 0.1811 l +0.7547 0.1693 l +0.7557 0.1655 l +0.7566 0.1670 l +0.7575 0.2742 l +0.7585 0.3076 l +0.7594 0.2930 l +0.7604 0.2999 l +0.7613 0.3038 l +0.7622 0.3130 l +0.7632 0.2624 l +0.7641 0.1652 l +0.7651 0.1797 l +0.7660 0.1874 l +0.7670 0.1599 l +0.7681 0.1669 l +0.7691 0.1538 l +0.7701 0.1514 l +0.7720 0.1842 l +0.7729 0.1942 l +0.7738 0.1967 l +0.7748 0.1729 l +0.7758 0.1711 l +0.7768 0.2054 l +0.7777 0.2122 l +0.7787 0.1644 l +0.7796 0.1601 l +0.7805 0.1542 l +0.7815 0.1552 l +0.7824 0.1639 l +0.7834 0.1586 l +0.7844 0.1518 l +0.7853 0.1513 l +0.7863 0.1511 l +0.7872 0.1522 l +0.7882 0.1507 l +0.7892 0.1506 l +0.7902 0.1506 l +0.7912 0.1510 l +0.7922 0.1506 l +0.7932 0.1511 l +0.7943 0.1507 l +0.7953 0.1508 l +0.7964 0.1510 l +0.7973 0.1511 l +0.7983 0.1509 l +0.7994 0.1508 l +0.8004 0.1513 l +0.8016 0.1504 l +0.8026 0.1506 l +0.8035 0.1508 l +0.8045 0.1884 l +0.8054 0.1656 l +0.8065 0.1506 l +0.8075 0.1506 l +0.8086 0.1509 l +0.8097 0.1507 l +0.8107 0.1525 l +0.8118 0.1504 l +0.8128 0.1504 l +0.8137 0.1509 l +0.8147 0.1510 l +0.8158 0.1506 l +0.8168 0.1507 l +0.8181 0.1506 l +0.8191 0.1524 l +0.8201 0.1505 l +0.8211 0.1507 l +0.8221 0.1504 l +0.8231 0.1515 l +0.8240 0.1504 l +0.8257 0.1512 l +0.8269 0.1951 l +0.8278 0.1670 l +0.8288 0.1678 l +0.8298 0.1717 l +0.8307 0.1751 l +0.8316 0.1770 l +0.8326 0.1674 l +0.8335 0.1777 l +0.8344 0.1767 l +0.8354 0.1710 l +0.8363 0.1773 l +0.8373 0.1818 l +0.8383 0.1862 l +0.8392 0.1778 l +0.8401 0.1795 l +0.8411 0.1729 l +0.8420 0.1638 l +0.8429 0.1642 l +0.8439 0.1615 l +0.8449 0.1591 l +0.8458 0.1650 l +0.8467 0.1629 l +0.8477 0.1653 l +0.8486 0.1621 l +0.8496 0.1645 l +0.8505 0.1647 l +0.8515 0.1661 l +0.8524 0.1783 l +0.8534 0.1746 l +0.8543 0.1732 l +0.8553 0.1772 l +0.8562 0.1749 l +0.8572 0.1703 l +0.8581 0.1690 l +0.8591 0.1670 l +0.8600 0.1651 l +0.8609 0.2649 l +0.8619 0.3107 l +0.8628 0.2696 l +0.8637 0.2814 l +0.8647 0.2310 l +0.8656 0.2629 l +0.8666 0.3241 l +0.8675 0.2852 l +0.8685 0.1794 l +0.8694 0.1829 l +0.8703 0.1531 l +0.8713 0.1514 l +0.8732 0.1966 l +0.8741 0.1983 l +0.8751 0.2067 l +0.8760 0.1798 l +0.8769 0.1796 l +0.8779 0.2203 l +0.8788 0.2257 l +0.8798 0.1575 l +0.8807 0.1592 l +0.8816 0.1535 l +0.8829 0.1962 l +0.8839 0.1649 l +0.8848 0.1538 l +0.8859 0.1508 l +0.8868 0.1532 l +0.8878 0.1526 l +0.8888 0.1505 l +0.8897 0.1509 l +0.8907 0.1508 l +0.8919 0.1506 l +0.8930 0.1511 l +0.8941 0.1506 l +0.8954 0.1508 l +0.8965 0.1526 l +0.8976 0.1526 l +0.8986 0.1523 l +0.8996 0.1512 l +0.9006 0.1529 l +0.9016 0.1506 l +0.9025 0.1510 l +0.9036 0.1505 l +0.9046 0.1625 l +0.9056 0.1840 l +0.9065 0.1554 l +0.9074 0.1512 l +0.9084 0.1507 l +0.9094 0.1523 l +0.9105 0.1516 l +0.9116 0.1526 l +0.9127 0.1506 l +0.9139 0.1505 l +0.9149 0.1513 l +0.9158 0.1506 l +0.9168 0.1505 l +0.9179 0.1504 l +0.9189 0.1507 l +0.9200 0.1514 l +0.9210 0.1506 l +0.9220 0.1506 l +0.9229 0.1523 l +0.9239 0.1513 l +0.9250 0.1501 l +0.9262 0.1512 l +0.9274 0.1918 l +0.9284 0.1694 l +0.9293 0.1635 l +0.9303 0.1769 l +0.9312 0.1809 l +0.9322 0.1769 l +0.9331 0.1728 l +0.9341 0.1828 l +0.9350 0.1766 l +0.9360 0.1698 l +0.9370 0.1775 l +0.9379 0.1830 l +0.9389 0.1829 l +0.9398 0.1870 l +0.9407 0.1787 l +0.9417 0.1713 l +0.9426 0.1646 l +0.9436 0.1640 l +0.9445 0.1593 l +0.9455 0.1652 l +0.9464 0.1587 l +0.9475 0.1657 l +0.9485 0.1631 l +0.9494 0.1595 l +0.9504 0.1717 l +0.9514 0.1691 l +0.9523 0.1675 l +0.9533 0.1783 l +0.9542 0.1787 l +0.9552 0.1747 l +0.9561 0.1839 l +0.9570 0.2014 l +0.9580 0.2027 l +0.9589 0.1732 l +0.9599 0.1667 l +0.9608 0.1675 l +0.9618 0.2893 l +0.9627 0.3256 l +0.9636 0.3032 l +0.9646 0.2303 l +0.9655 0.2337 l +0.9664 0.2597 l +0.9674 0.2803 l +0.9683 0.2790 l +0.9693 0.1901 l +0.9704 0.1777 l +0.9713 0.1549 l +0.9725 0.1515 l +0.9743 0.1987 l +0.9752 0.1909 l +0.9762 0.2018 l +0.9771 0.1938 l +0.9781 0.1709 l +0.9790 0.1900 l +0.9800 0.2314 l +0.9809 0.2136 l +0.9820 0.1641 l +0.9830 0.1563 l +0.9839 0.1526 l +0.9849 0.1942 l +0.9858 0.1666 l +0.9867 0.1533 l +0.9877 0.1504 l +0.9887 0.1532 l +0.9897 0.1522 l +0.9909 0.1506 l +0.9919 0.1507 l +0.9929 0.1509 l +0.9938 0.1506 l +0.9949 0.1505 l +0.9959 0.1505 l +0.9970 0.1508 l +0.9982 0.1515 l +0.9993 0.1517 l +1.0002 0.1530 l +1.0013 0.1520 l +1.0022 0.1547 l +1.0032 0.1507 l +1.0042 0.1503 l +1.0052 0.1511 l +1.0061 0.1508 l +1.0072 0.1913 l +1.0082 0.1600 l +1.0093 0.1506 l +1.0103 0.1505 l +1.0112 0.1515 l +1.0123 0.1524 l +1.0132 0.1515 l +1.0141 0.1509 l +1.0152 0.1513 l +1.0162 0.1504 l +1.0171 0.1507 l +1.0181 0.1505 l +1.0192 0.1509 l +1.0202 0.1509 l +1.0212 0.1507 l +1.0222 0.1507 l +1.0232 0.1505 l +1.0245 0.1510 l +1.0255 0.1504 l +1.0265 0.1521 l +1.0284 0.1513 l +1.0296 0.1973 l +1.0306 0.1676 l +1.0316 0.1648 l +1.0325 0.1767 l +1.0335 0.1775 l +1.0344 0.1753 l +1.0353 0.1732 l +1.0363 0.1819 l +1.0372 0.1800 l +1.0382 0.1679 l +1.0392 0.1786 l +1.0402 0.1828 l +1.0411 0.1913 l +1.0420 0.1896 l +1.0430 0.1769 l +1.0439 0.1636 l +1.0449 0.1657 l +1.0458 0.1628 l +1.0467 0.1655 l +1.0477 0.1593 l +1.0487 0.1685 l +1.0496 0.1673 l +1.0505 0.1654 l +1.0515 0.1736 l +1.0524 0.1681 l +1.0534 0.1614 l +1.0544 0.1748 l +1.0553 0.1764 l +1.0562 0.2068 l +1.0572 0.2025 l +1.0581 0.1750 l +1.0591 0.1680 l +1.0600 0.2192 l +1.0610 0.3104 l +1.0619 0.3128 l +1.0629 0.2829 l +1.0638 0.3009 l +1.0647 0.2999 l +1.0657 0.3040 l +1.0666 0.1875 l +1.0676 0.1651 l +1.0685 0.2618 l +1.0694 0.1704 l +1.0705 0.1675 l +1.0714 0.1581 l +1.0726 0.1514 l +1.0745 0.1945 l +1.0755 0.1941 l +1.0764 0.1979 l +1.0774 0.1766 l +1.0783 0.1778 l +1.0792 0.2066 l +1.0802 0.2136 l +1.0811 0.1899 l +1.0821 0.1608 l +1.0830 0.1567 l +1.0841 0.1568 l +1.0850 0.1809 l +1.0860 0.1650 l +1.0869 0.1525 l +1.0880 0.1508 l +1.0889 0.1536 l +1.0898 0.1515 l +1.0908 0.1505 l +1.0918 0.1510 l +1.0928 0.1506 l +1.0939 0.1507 l +1.0949 0.1504 l +1.0958 0.1509 l +1.0968 0.1505 l +1.0977 0.1519 l +1.0988 0.1506 l +1.0998 0.1537 l +1.1010 0.1509 l +1.1021 0.1512 l +1.1032 0.1522 l +1.1044 0.1503 l +1.1055 0.1510 l +1.1064 0.1660 l +1.1074 0.1878 l +1.1084 0.1506 l +1.1094 0.1505 l +1.1105 0.1508 l +1.1116 0.1521 l +1.1126 0.1514 l +1.1135 0.1519 l +1.1146 0.1506 l +1.1159 0.1504 l +1.1168 0.1514 l +1.1178 0.1513 l +1.1189 0.1507 l +1.1199 0.1506 l +1.1209 0.1505 l +1.1219 0.1506 l +1.1228 0.1510 l +1.1238 0.1510 l +1.1247 0.1523 l +1.1259 0.1506 l +1.1272 0.1501 l +1.1284 0.1516 l +1.1296 0.1923 l +1.1306 0.1683 l +1.1315 0.1652 l +1.1325 0.1782 l +1.1334 0.1740 l +1.1344 0.1746 l +1.1353 0.1683 l +1.1363 0.1837 l +1.1372 0.1776 l +1.1382 0.1648 l +s +/Font32 FFSF +[/DeviceRGB] SCS +Color6 SC +0.1447 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.2017 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1) show +GR +/Font32 FFSF +0.2572 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2) show +GR +/Font32 FFSF +0.3138 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(3) show +GR +/Font32 FFSF +0.3696 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4) show +GR +/Font32 FFSF +0.4262 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5) show +GR +/Font32 FFSF +0.4821 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(6) show +GR +/Font32 FFSF +0.5385 0.1251 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(7) show +GR +/Font32 FFSF +0.5949 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(8) show +GR +/Font32 FFSF +0.6509 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(9) show +GR +/Font32 FFSF +0.7013 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(10) show +GR +/Font32 FFSF +0.7583 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(11) show +GR +/Font32 FFSF +0.8137 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(12) show +GR +/Font32 FFSF +0.8704 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(13) show +GR +/Font32 FFSF +0.9262 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(14) show +GR +/Font32 FFSF +0.9828 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(15) show +GR +/Font32 FFSF +1.0387 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(16) show +GR +/Font32 FFSF +1.0951 0.1247 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(17) show +GR +/Font32 FFSF +0.5420 0.0951 m +GS +[0.0280 0.0000 0.0000 0.0280 0 0] CC +(Runtime \(minutes\)) show +GR +/Font32 FFSF +0.1294 0.1425 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +1.1533 0.1425 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(0) show +GR +/Font32 FFSF +0.0957 0.2062 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1000) show +GR +/Font32 FFSF +1.1533 0.2062 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(1000) show +GR +/Font32 FFSF +0.0957 0.2698 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2000) show +GR +/Font32 FFSF +1.1533 0.2698 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(2000) show +GR +/Font32 FFSF +0.0957 0.3335 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(3000) show +GR +/Font32 FFSF +1.1533 0.3335 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(3000) show +GR +/Font32 FFSF +0.0957 0.3971 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4000) show +GR +/Font32 FFSF +1.1533 0.3971 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(4000) show +GR +/Font32 FFSF +0.0957 0.4607 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5000) show +GR +/Font32 FFSF +1.1533 0.4607 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(5000) show +GR +/Font32 FFSF +0.0794 -0.0066 m +GS +[0.0000 0.0280 -0.0280 0.0000 0 0] CC +( Seeks p\ +er Second) show +GR +n +0.1500 0.1500 m +0.1500 0.4682 l +1.1433 0.4682 l +1.1433 0.1500 l +0.1500 0.1500 l +c +s +n +1.0100 0.4600 m +1.0100 0.4247 l +1.1362 0.4247 l +1.1362 0.4600 l +c +[/DeviceRGB] SCS +Color0 SC +fill +[/DeviceRGB] SCS +Color6 SC +n +1.0100 0.4600 m +1.0100 0.4247 l +1.1362 0.4247 l +1.1362 0.4600 l +1.0100 0.4600 l +c +s +/Font32 FFSF +1.0808 0.4351 m +GS +[0.0224 0.0000 0.0000 0.0224 0 0] CC +(Issue) show +GR +[/DeviceRGB] SCS +Color2 SC +n +1.0208 0.4424 m +1.0608 0.4424 l +s +%%Trailer +%%BoundingBox: 35 -5 734 581 +%%DocumentNeededResources: font Times-Italic +%%+ font Times-Roman +%%EOF diff --git a/btt/globals.h b/btt/globals.h new file mode 100644 index 0000000..d05d996 --- /dev/null +++ b/btt/globals.h @@ -0,0 +1,347 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include <string.h> +#include <time.h> + +#include "blktrace.h" +#include "rbtree.h" +#include "list.h" + +/* + * 0 == 1 blk + * 1 == 2 blks + * ... + * 1022 == 1023 blks + * 1023 == 1024 blks + * 1024 == > 1024 blks + */ +#define N_HIST_BKTS 1025 + +#define BIT_TIME(t) ((double)SECONDS(t) + ((double)NANO_SECONDS(t) / 1.0e9)) + +#define BIT_START(iop) ((iop)->t.sector) +#define BIT_END(iop) ((iop)->t.sector + ((iop)->t.bytes >> 9)) +#define IOP_READ(iop) ((iop)->t.action & BLK_TC_ACT(BLK_TC_READ)) +#define IOP_RW(iop) (IOP_READ(iop) ? 1 : 0) + +#define TO_SEC(nanosec) ((double)(nanosec) / 1.0e9) +#define TO_MSEC(nanosec) (1000.0 * TO_SEC(nanosec)) + +enum iop_type { + IOP_Q = 0, + IOP_X = 1, + IOP_A = 2, + IOP_G = 3, + IOP_M = 4, + IOP_D = 5, + IOP_C = 6, + IOP_R = 7, + IOP_I = 8, + IOP_S = 9 +}; +#define N_IOP_TYPES (IOP_S + 1) + +struct mode { + int most_seeks, nmds; + long long *modes; +}; + +struct io; +struct io_list { + struct list_head head; + struct io *iop; + int cy_users; +}; + +struct avg_info { + __u64 min, max, total; + double avg; + int n; +}; + +struct avgs_info { + struct avg_info q2q_dm; + struct avg_info q2a_dm; + struct avg_info q2c_dm; + + struct avg_info q2q; + struct avg_info q2a; + struct avg_info q2g; + struct avg_info s2g; + struct avg_info g2i; + struct avg_info q2m; + struct avg_info i2d; + struct avg_info m2d; + struct avg_info d2c; + struct avg_info q2c; + + struct avg_info blks; /* Blocks transferred */ +}; + +struct range_info { + struct list_head head; /* on: qranges OR cranges */ + __u64 start, end; +}; + +struct region_info { + struct list_head qranges; + struct list_head cranges; +}; + +struct p_info { + struct region_info regions; + struct avgs_info avgs; + __u64 last_q; + __u32 pid; + char *name; +}; + +struct stats { + __u64 rqm[2], ios[2], sec[2], wait, svctm; + double last_qu_change, last_dev_change, tot_qusz, idle_time; + int cur_qusz, cur_dev; +}; + +struct stats_t { + double n; + double rqm_s[2], ios_s[2], sec_s[2]; + double avgrq_sz, avgqu_sz, await, svctm, p_util; +}; + +struct d_info { + struct list_head all_head, hash_head; + void *heads; + struct region_info regions; + char *devmap; + void *q2q_handle, *seek_handle, *bno_dump_handle, *up_hist_handle; + void *q2d_priv, *aqd_handle; + void *q2d_plat_handle, *q2c_plat_handle, *d2c_plat_handle; + FILE *q2d_ofp, *d2c_ofp, *q2c_ofp, *pit_fp; + struct avgs_info avgs; + struct stats stats, all_stats; + __u64 last_q, n_qs, n_ds; + __u64 n_act_q, t_act_q; /* # currently active when Q comes in */ + __u32 device; + + int pre_culling; + int is_plugged, nplugs, nplugs_t; + __u64 nios_up, nios_upt; + double start_time, last_plug, plugged_time, end_time; +}; + +struct io { + struct rb_node rb_node; + struct list_head f_head, a_head; + struct d_info *dip; + struct p_info *pip; + void *pdu; + __u64 bytes_left, g_time, i_time, m_time, d_time, c_time, d_sec, c_sec; + __u64 s_time; + __u32 d_nsec, c_nsec; + + struct blk_io_trace t; + + int linked; + enum iop_type type; +}; + +/* bt_timeline.c */ + +extern char bt_timeline_version[], *devices, *exes, *input_name, *output_name; +extern char *seek_name, *iostat_name, *d2c_name, *q2c_name, *per_io_name; +extern char *bno_dump_name, *unplug_hist_name, *sps_name, *aqd_name, *q2d_name; +extern char *per_io_trees; +extern double range_delta, plat_freq; +extern FILE *rngs_ofp, *avgs_ofp, *xavgs_ofp, *iostat_ofp, *per_io_ofp; +extern FILE *msgs_ofp; +extern int verbose, done, time_bounded, output_all_data, seek_absolute; +extern int easy_parse_avgs, ignore_remaps; +extern unsigned int n_devs; +extern unsigned long n_traces; +extern struct list_head all_devs, all_procs; +extern struct avgs_info all_avgs; +extern __u64 last_q; +extern struct region_info all_regions; +extern struct list_head all_ios, free_ios; +extern __u64 iostat_interval, iostat_last_stamp; +extern time_t genesis, last_vtrace; +extern double t_astart, t_aend; +extern __u64 q_histo[N_HIST_BKTS], d_histo[N_HIST_BKTS]; + +/* args.c */ +void handle_args(int argc, char *argv[]); +void clean_args(); + +/* aqd.c */ +void *aqd_alloc(char *str); +void aqd_free(void *info); +void aqd_clean(void); +void aqd_issue(void *info, double ts); +void aqd_complete(void *info, double ts); + +/* devmap.c */ +int dev_map_read(char *fname); +char *dev_map_find(__u32 device); +void dev_map_exit(void); + +/* devs.c */ +void init_dev_heads(void); +struct d_info *dip_alloc(__u32 device, struct io *iop); +void iop_rem_dip(struct io *iop); +struct d_info *__dip_find(__u32 device); +void dip_foreach_list(struct io *iop, enum iop_type type, struct list_head *hd); +void dip_foreach(struct io *iop, enum iop_type type, + void (*fnc)(struct io *iop, struct io *this), int rm_after); +struct io *dip_find_sec(struct d_info *dip, enum iop_type type, __u64 sec); +void dip_foreach_out(void (*func)(struct d_info *, void *), void *arg); +void dip_plug(__u32 dev, double cur_time); +void dip_unplug(__u32 dev, double cur_time, __u64 nio_ups); +void dip_unplug_tm(__u32 dev, double cur_time, __u64 nio_ups); +void dip_exit(void); +void dip_cleanup(void); + +/* dip_rb.c */ +int rb_insert(struct rb_root *root, struct io *iop); +struct io *rb_find_sec(struct rb_root *root, __u64 sec); +void rb_foreach(struct rb_node *n, struct io *iop, + void (*fnc)(struct io *iop, struct io *this), + struct list_head *head); + +/* iostat.c */ +void iostat_init(void); +void iostat_getrq(struct io *iop); +void iostat_merge(struct io *iop); +void iostat_issue(struct io *iop); +void iostat_complete(struct io *d_iop, struct io *c_iop); +void iostat_check_time(__u64 stamp); +void iostat_dump_stats(__u64 stamp, int all); + +/* latency.c */ +void latency_alloc(struct d_info *dip); +void latency_clean(void); +void latency_q2d(struct d_info *dip, __u64 tstamp, __u64 latency); +void latency_d2c(struct d_info *dip, __u64 tstamp, __u64 latency); +void latency_q2c(struct d_info *dip, __u64 tstamp, __u64 latency); + +/* misc.c */ +void add_file(FILE *fp, char *oname); +void add_buf(void *buf); +char *make_dev_hdr(char *pad, size_t len, struct d_info *dip, int add_parens); +FILE *my_fopen(const char *path, const char *mode); +int my_open(const char *path, int flags); +void dbg_ping(void); +void clean_allocs(void); + +/* mmap.c */ +void setup_ifile(char *fname); +void cleanup_ifile(void); +int next_trace(struct blk_io_trace *t, void **pdu); +double pct_done(void); + +/* output.c */ +int output_avgs(FILE *ofp); +int output_ranges(FILE *ofp); + +/* proc.c */ +void process_alloc(__u32 pid, char *name); +struct p_info *find_process(__u32 pid, char *name); +void pip_update_q(struct io *iop); +void pip_foreach_out(void (*f)(struct p_info *, void *), void *arg); +void pip_exit(void); + +/* bno_dump.c */ +void *bno_dump_alloc(__u32 device); +void bno_dump_free(void *param); +void bno_dump_add(void *handle, struct io *iop); +void bno_dump_clean(void); + +/* plat.c */ +void *plat_alloc(char *str); +void plat_free(void *info); +void plat_clean(void); +void plat_x2c(void *info, __u64 ts, __u64 latency); + +/* q2d.c */ +void q2d_histo_add(void *priv, __u64 q2d); +void *q2d_alloc(void); +void q2d_free(void *priv); +void q2d_display_header(FILE *fp); +void q2d_display_dashes(FILE *fp); +void q2d_display(FILE *fp, void *priv); +int q2d_ok(void *priv); +void q2d_acc(void *a1, void *a2); + +/* seek.c */ +void *seeki_alloc(char *str); +void seeki_free(void *param); +void seek_clean(void); +void seeki_add(void *handle, struct io *iop); +double seeki_mean(void *handle); +long long seeki_nseeks(void *handle); +long long seeki_median(void *handle); +int seeki_mode(void *handle, struct mode *mp); + +/* trace.c */ +void add_trace(struct io *iop); + +/* trace_complete.c */ +void trace_complete(struct io *c_iop); + +/* trace_im.c */ +void run_im(struct io *im_iop, struct io *d_iop, struct io *c_iop); +void run_unim(struct io *im_iop, struct io *d_iop, struct io *c_iop); +int ready_im(struct io *im_iop, struct io *c_iop); +void trace_insert(struct io *i_iop); +void trace_merge(struct io *m_iop); +void trace_getrq(struct io *g_iop); +void trace_sleeprq(struct io *s_iop); + +/* trace_issue.c */ +void run_issue(struct io *d_iop, struct io *u_iop, struct io *c_iop); +void run_unissue(struct io *d_iop, struct io *u_iop, struct io *c_iop); +int ready_issue(struct io *d_iop, struct io *c_iop); +void trace_issue(struct io *d_iop); + +/* trace_plug.c */ +void trace_plug(struct io *p_iop); +void trace_unplug_io(struct io *u_iop); +void trace_unplug_timer(struct io *u_iop); + +/* trace_queue.c */ +void run_queue(struct io *q_iop, struct io *u_iop, struct io *c_iop); +int ready_queue(struct io *q_iop, struct io *c_iop); +void trace_queue(struct io *q_iop); + +/* trace_remap.c */ +void run_remap(struct io *a_iop, struct io *u_iop, struct io *c_iop); +int ready_remap(struct io *a_iop, struct io *c_iop); +void trace_remap(struct io *a_iop); + +/* trace_requeue.c */ +void trace_requeue(struct io *r_iop); + +/* unplug_hist.c */ +void *unplug_hist_alloc(__u32 device); +void unplug_hist_free(void *arg); +void unplug_hist_add(struct io *u_iop); + +#include "inlines.h" diff --git a/btt/inlines.h b/btt/inlines.h new file mode 100644 index 0000000..64b5a2c --- /dev/null +++ b/btt/inlines.h @@ -0,0 +1,383 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +static inline int remapper_dev(__u32 dev) +{ + int mjr = MAJOR(dev); + return mjr == 9 || mjr == 253 || mjr == 254; +} + +static inline void region_init(struct region_info *reg) +{ + INIT_LIST_HEAD(®->qranges); + INIT_LIST_HEAD(®->cranges); +} + +static inline void __region_exit(struct list_head *range_head) +{ + struct list_head *p, *q; + struct range_info *rip; + + list_for_each_safe(p, q, range_head) { + rip = list_entry(p, struct range_info, head); + free(rip); + } +} + +static inline void region_exit(struct region_info *reg) +{ + __region_exit(®->qranges); + __region_exit(®->cranges); +} + +static inline void update_range(struct list_head *head_p, __u64 time) +{ + struct range_info *rip; + + if (!list_empty(head_p)) { + rip = list_entry(head_p->prev, struct range_info, head); + + if (time < rip->end) + return; + + if (BIT_TIME(time - rip->end) < range_delta) { + rip->end = time; + return; + } + } + + rip = malloc(sizeof(*rip)); + rip->start = rip->end = time; + list_add_tail(&rip->head, head_p); +} + +static inline void update_qregion(struct region_info *reg, __u64 time) +{ + update_range(®->qranges, time); +} + +static inline void update_cregion(struct region_info *reg, __u64 time) +{ + update_range(®->cranges, time); +} + +static inline void avg_update(struct avg_info *ap, __u64 t) +{ + if (ap->n++ == 0) + ap->min = ap->total = ap->max = t; + else { + if (t < ap->min) + ap->min = t; + else if (t > ap->max) + ap->max = t; + ap->total += t; + } +} + +static inline void avg_update_n(struct avg_info *ap, __u64 t, int n) +{ + if (ap->n == 0) { + ap->min = ap->max = t; + ap->total = (n * t); + } else { + if (t < ap->min) + ap->min = t; + else if (t > ap->max) + ap->max = t; + ap->total += (n * t); + } + + ap->n += n; +} + +static inline void avg_unupdate(struct avg_info *ap, __u64 t) +{ + ap->n--; + ap->total -= t; +} + +static inline void update_lq(__u64 *last_q, struct avg_info *avg, __u64 time) +{ + if (*last_q != ((__u64)-1)) + avg_update(avg, (time > *last_q) ? time - *last_q : 1); + *last_q = time; +} + +static inline void dip_update_q(struct d_info *dip, struct io *iop) +{ + if (remapper_dev(dip->device)) + update_lq(&dip->last_q, &dip->avgs.q2q_dm, iop->t.time); + else + update_lq(&dip->last_q, &dip->avgs.q2q, iop->t.time); + update_qregion(&dip->regions, iop->t.time); +} + +static inline struct io *io_alloc(void) +{ + struct io *iop = malloc(sizeof(*iop)); + + memset(iop, 0, sizeof(struct io)); + list_add_tail(&iop->a_head, &all_ios); + + return iop; +} + +static inline void io_free(struct io *iop) +{ + list_del(&iop->a_head); + free(iop); +} + +static inline void io_free_all(void) +{ + struct io *iop; + struct list_head *p, *q; + + list_for_each_safe(p, q, &all_ios) { + iop = list_entry(p, struct io, a_head); + free(iop); + } +} + +static inline int io_setup(struct io *iop, enum iop_type type) +{ + iop->type = type; + iop->dip = dip_alloc(iop->t.device, iop); + if (iop->linked) { + iop->pip = find_process(iop->t.pid, NULL); + iop->bytes_left = iop->t.bytes; + } + + return iop->linked; +} + +static inline void io_release(struct io *iop) +{ + if (iop->linked) + iop_rem_dip(iop); + if (iop->pdu) + free(iop->pdu); + + io_free(iop); +} + +#define UPDATE_AVGS(_avg, _iop, _pip, _time) do { \ + avg_update(&all_avgs. _avg , _time); \ + avg_update(&_iop->dip->avgs. _avg , _time); \ + if (_pip) avg_update(&_pip->avgs. _avg , _time); \ + } while (0) + +#define UPDATE_AVGS_N(_avg, _iop, _pip, _time, _n) do { \ + avg_update_n(&all_avgs. _avg , _time, _n); \ + avg_update_n(&_iop->dip->avgs. _avg , _time, _n); \ + if (_pip) avg_update_n(&_pip->avgs. _avg , _time,_n); \ + } while (0) + +#define UNUPDATE_AVGS(_avg, _iop, _pip, _time) do { \ + avg_unupdate(&all_avgs. _avg , _time); \ + avg_unupdate(&_iop->dip->avgs. _avg , _time); \ + if (_pip) avg_unupdate(&_pip->avgs. _avg , _time); \ + } while (0) + +static inline void update_q2c(struct io *iop, __u64 c_time) +{ + if (remapper_dev(iop->dip->device)) + UPDATE_AVGS(q2c_dm, iop, iop->pip, c_time); + else + UPDATE_AVGS(q2c, iop, iop->pip, c_time); +} + +static inline void update_q2a(struct io *iop, __u64 a_time) +{ + if (remapper_dev(iop->dip->device)) + UPDATE_AVGS(q2a_dm, iop, iop->pip, a_time); + else + UPDATE_AVGS(q2a, iop, iop->pip, a_time); +} + +static inline void update_q2g(struct io *iop, __u64 g_time) +{ + UPDATE_AVGS(q2g, iop, iop->pip, g_time); +} + +static inline void update_s2g(struct io *iop, __u64 g_time) +{ + UPDATE_AVGS(s2g, iop, iop->pip, g_time); +} + +static inline void unupdate_q2g(struct io *iop, __u64 g_time) +{ + UNUPDATE_AVGS(q2g, iop, iop->pip, g_time); +} + +static inline void update_g2i(struct io *iop, __u64 i_time) +{ + UPDATE_AVGS(g2i, iop, iop->pip, i_time); +} + +static inline void unupdate_g2i(struct io *iop, __u64 i_time) +{ + UNUPDATE_AVGS(g2i, iop, iop->pip, i_time); +} + +static inline void update_q2m(struct io *iop, __u64 m_time) +{ + UPDATE_AVGS(q2m, iop, iop->pip, m_time); +} + +static inline void unupdate_q2m(struct io *iop, __u64 m_time) +{ + UNUPDATE_AVGS(q2m, iop, iop->pip, m_time); +} + +static inline void update_i2d(struct io *iop, __u64 d_time) +{ + UPDATE_AVGS(i2d, iop, iop->pip, d_time); +} + +static inline void unupdate_i2d(struct io *iop, __u64 d_time) +{ + UNUPDATE_AVGS(i2d, iop, iop->pip, d_time); +} + +static inline void update_m2d(struct io *iop, __u64 d_time) +{ + UPDATE_AVGS(m2d, iop, iop->pip, d_time); +} + +static inline void unupdate_m2d(struct io *iop, __u64 d_time) +{ + UNUPDATE_AVGS(m2d, iop, iop->pip, d_time); +} + +static inline void update_d2c(struct io *iop, __u64 c_time) +{ + UPDATE_AVGS(d2c, iop, iop->pip, c_time); +} + +static inline void update_blks(struct io *iop) +{ + __u64 nblks = iop->t.bytes >> 9; + avg_update(&all_avgs.blks, nblks); + avg_update(&iop->dip->avgs.blks, nblks); + if (iop->pip) + avg_update(&iop->pip->avgs.blks, nblks); +} + +static inline struct rb_root *__get_root(struct d_info *dip, enum iop_type type) +{ + struct rb_root *roots = dip->heads; + return &roots[type]; +} + +static inline int dip_rb_ins(struct d_info *dip, struct io *iop) +{ + return rb_insert(__get_root(dip, iop->type), iop); +} + +static inline void dip_rb_rem(struct io *iop) +{ + rb_erase(&iop->rb_node, __get_root(iop->dip, iop->type)); +} + +static inline void dip_rb_fe(struct d_info *dip, enum iop_type type, + struct io *iop, + void (*fnc)(struct io *iop, struct io *this), + struct list_head *head) +{ + rb_foreach(__get_root(dip, type)->rb_node, iop, fnc, head); +} + +static inline struct io *dip_rb_find_sec(struct d_info *dip, + enum iop_type type, __u64 sec) +{ + return rb_find_sec(__get_root(dip, type), sec); +} + +static inline __u64 tdelta(__u64 from, __u64 to) +{ + return (from < to) ? (to - from) : 1; +} + +static inline int type2c(enum iop_type type) +{ + int c; + + switch (type) { + case IOP_Q: c = 'Q'; break; + case IOP_X: c = 'X'; break; + case IOP_A: c = 'A'; break; + case IOP_I: c = 'I'; break; + case IOP_M: c = 'M'; break; + case IOP_D: c = 'D'; break; + case IOP_C: c = 'C'; break; + case IOP_R: c = 'R'; break; + case IOP_G: c = 'G'; break; + default : c = '?'; break; + } + + return c; +} + +static inline int histo_idx(__u64 nbytes) +{ + int idx = (nbytes >> 9) - 1; + return min(idx, N_HIST_BKTS-1); +} + +static inline void update_q_histo(__u64 nbytes) +{ + q_histo[histo_idx(nbytes)]++; +} + +static inline void update_d_histo(__u64 nbytes) +{ + d_histo[histo_idx(nbytes)]++; +} + +static inline struct io *io_first_list(struct list_head *head) +{ + if (list_empty(head)) + return NULL; + + return list_entry(head->next, struct io, f_head); +} + +static inline void __dump_iop(FILE *ofp, struct io *iop, int extra_nl) +{ + fprintf(ofp, "%5d.%09lu %3d,%-3d %c %10llu+%-4u\n", + (int)SECONDS(iop->t.time), + (unsigned long)NANO_SECONDS(iop->t.time), + MAJOR(iop->t.device), MINOR(iop->t.device), type2c(iop->type), + (unsigned long long)iop->t.sector, t_sec(&iop->t)); + if (extra_nl) fprintf(ofp, "\n"); +} + +static inline void __dump_iop2(FILE *ofp, struct io *a_iop, struct io *l_iop) +{ + fprintf(ofp, "%5d.%09lu %3d,%-3d %c %10llu+%-4u <- (%3d,%-3d) %10llu\n", + (int)SECONDS(a_iop->t.time), + (unsigned long)NANO_SECONDS(a_iop->t.time), + MAJOR(a_iop->t.device), MINOR(a_iop->t.device), + type2c(a_iop->type), (unsigned long long)a_iop->t.sector, + t_sec(&a_iop->t), MAJOR(l_iop->t.device), + MINOR(l_iop->t.device), (unsigned long long)l_iop->t.sector); +} diff --git a/btt/iostat.c b/btt/iostat.c new file mode 100644 index 0000000..8bcd2e5 --- /dev/null +++ b/btt/iostat.c @@ -0,0 +1,283 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include <unistd.h> +#include "globals.h" + +#define INC_STAT(dip, fld) \ + do { \ + (dip)->stats. fld ++; \ + (dip)->all_stats. fld ++; \ + } while (0) + +#define DEC_STAT(dip, fld) \ + do { \ + (dip)->stats. fld --; \ + (dip)->all_stats. fld --; \ + } while (0) + +#define ADD_STAT(dip, fld, val) \ + do { \ + __u64 __v = (val); \ + (dip)->stats. fld += __v; \ + (dip)->all_stats. fld += __v; \ + } while (0) + +#define SUB_STAT(dip, fld, val) \ + do { \ + __u64 __v = (val); \ + (dip)->stats. fld -= __v; \ + (dip)->all_stats. fld -= __v; \ + } while (0) + +__u64 last_start, iostat_last_stamp; +__u64 iostat_interval = 1000000000; +char *iostat_name = NULL; +FILE *iostat_ofp = NULL; + +static void dump_hdr(void) +{ + fprintf(iostat_ofp, "Device: rrqm/s wrqm/s r/s w/s " + "rsec/s wsec/s rkB/s wkB/s " + "avgrq-sz avgqu-sz await svctm %%util Stamp\n"); +} + +static void update_tot_qusz(struct d_info *dip, double now) +{ + dip->stats.tot_qusz += ((now - dip->stats.last_qu_change) * + dip->stats.cur_qusz); + dip->all_stats.tot_qusz += ((now - dip->all_stats.last_qu_change) * + dip->all_stats.cur_qusz); + + dip->stats.last_qu_change = dip->all_stats.last_qu_change = now; +} + +static void update_idle_time(struct d_info *dip, double now, int force) +{ + if (dip->stats.cur_dev == 0 || force) { + dip->stats.idle_time += (now - dip->stats.last_dev_change); + dip->all_stats.idle_time += + (now - dip->all_stats.last_dev_change); + } + dip->stats.last_dev_change = dip->all_stats.last_dev_change = now; +} + +void __dump_stats(__u64 stamp, int all, struct d_info *dip, struct stats_t *asp) +{ + char hdr[16]; + struct stats *sp; + double dt, nios, avgrq_sz, p_util, nrqm, await, svctm; + double now = TO_SEC(stamp); + + if (all) { + dt = (double)stamp / 1.0e9; + sp = &dip->all_stats; + } else { + dt = (double)(stamp-last_start) / 1.0e9; + sp = &dip->stats; + } + + nios = (double)(sp->ios[0] + sp->ios[1]); + nrqm = (double)(sp->rqm[0] + sp->rqm[1]); + update_idle_time(dip, now, 1); + update_tot_qusz(dip, now); + + if (nios > 0.0) { + avgrq_sz = (double)(sp->sec[0] + sp->sec[1]) / nios; + svctm = TO_MSEC(sp->svctm) / nios; + } else + avgrq_sz = svctm = 0.0; + + await = ((nios + nrqm) > 0.0) ? TO_MSEC(sp->wait) / (nios+nrqm) : 0.0; + p_util = (sp->idle_time <= dt) ? 100.0 * (1.0 - (sp->idle_time / dt)) : + 0.0; + + /* + * For AWAIT: nios should be the same as number of inserts + * and we add in nrqm (number of merges), which should give + * us the total number of IOs sent to the block IO layer. + */ + fprintf(iostat_ofp, "%-11s ", make_dev_hdr(hdr, 11, dip, 1)); + fprintf(iostat_ofp, "%8.2lf ", (double)sp->rqm[1] / dt); + fprintf(iostat_ofp, "%8.2lf ", (double)sp->rqm[0] / dt); + fprintf(iostat_ofp, "%7.2lf ", (double)sp->ios[1] / dt); + fprintf(iostat_ofp, "%7.2lf ", (double)sp->ios[0] / dt); + fprintf(iostat_ofp, "%9.2lf ", (double)sp->sec[1] / dt); + fprintf(iostat_ofp, "%9.2lf ", (double)sp->sec[0] / dt); + fprintf(iostat_ofp, "%9.2lf ", (double)(sp->sec[1] / 2) / dt); + fprintf(iostat_ofp, "%9.2lf ", (double)(sp->sec[0] / 2) / dt); + fprintf(iostat_ofp, "%8.2lf ", avgrq_sz); + fprintf(iostat_ofp, "%8.2lf ", (double)sp->tot_qusz / dt); + fprintf(iostat_ofp, "%7.2lf ", await); + fprintf(iostat_ofp, "%7.2lf ", svctm); + fprintf(iostat_ofp, "%6.2lf", p_util); + if (all) + fprintf(iostat_ofp, "%8s\n", "TOTAL"); + else { + fprintf(iostat_ofp, "%8.2lf\n", TO_SEC(stamp)); + sp->rqm[0] = sp->rqm[1] = 0; + sp->ios[0] = sp->ios[1] = 0; + sp->sec[0] = sp->sec[1] = 0; + sp->wait = sp->svctm = 0; + + sp->tot_qusz = sp->idle_time = 0.0; + } + + if (asp) { + int i; + + asp->n += 1.0; + for (i = 0; i < 2; i++) { + asp->rqm_s[i] += ((double)sp->rqm[i] / dt); + asp->ios_s[i] += ((double)sp->ios[i] / dt); + asp->sec_s[i] += ((double)sp->sec[i] / dt); + } + asp->avgrq_sz += avgrq_sz; + asp->avgqu_sz += (double)sp->tot_qusz / dt; + asp->await += await; + asp->svctm += svctm; + asp->p_util += p_util; + } +} + +static void __dump_stats_t(__u64 stamp, struct stats_t *asp, int all) +{ + if (asp->n < 2.0) return; // What's the point? + + fprintf(iostat_ofp, "%-11s ", "TOTAL"); + fprintf(iostat_ofp, "%8.2lf ", asp->rqm_s[0]); + fprintf(iostat_ofp, "%8.2lf ", asp->rqm_s[1]); + fprintf(iostat_ofp, "%7.2lf ", asp->ios_s[0]); + fprintf(iostat_ofp, "%7.2lf ", asp->ios_s[1]); + fprintf(iostat_ofp, "%9.2lf ", asp->sec_s[0]); + fprintf(iostat_ofp, "%9.2lf ", asp->sec_s[1]); + fprintf(iostat_ofp, "%9.2lf ", asp->sec_s[0] / 2.0); + fprintf(iostat_ofp, "%9.2lf ", asp->sec_s[1] / 2.0); + fprintf(iostat_ofp, "%8.2lf ", asp->avgrq_sz / asp->n); + fprintf(iostat_ofp, "%8.2lf ", asp->avgqu_sz / asp->n); + fprintf(iostat_ofp, "%7.2lf ", asp->await / asp->n); + fprintf(iostat_ofp, "%7.2lf ", asp->svctm / asp->n); + fprintf(iostat_ofp, "%6.2lf", asp->p_util / asp->n); + if (all) + fprintf(iostat_ofp, "%8s\n", "TOTAL"); + else + fprintf(iostat_ofp, "%8.2lf\n", TO_SEC(stamp)); +} + +void iostat_init(void) +{ + last_start = (__u64)-1; + if (iostat_ofp) + dump_hdr(); +} + +void iostat_dump_stats(__u64 stamp, int all) +{ + struct d_info *dip; + struct stats_t as; + + memset(&as, 0, sizeof(struct stats_t)); + if (all) + dump_hdr(); + + if (devices == NULL) { + struct list_head *p; + + __list_for_each(p, &all_devs) { + dip = list_entry(p, struct d_info, all_head); + __dump_stats(stamp, all, dip, &as); + } + } else { + int i; + unsigned int mjr, mnr; + char *p = devices; + + while (p && ((i = sscanf(p, "%u,%u", &mjr, &mnr)) == 2)) { + dip = __dip_find((__u32)((mjr << MINORBITS) | mnr)); + __dump_stats(stamp, all, dip, &as); + + p = strchr(p, ';'); + if (p) p++; + } + } + + __dump_stats_t(stamp, &as, all); + + if (!all && iostat_ofp) + fprintf(iostat_ofp, "\n"); +} + +void iostat_check_time(__u64 stamp) +{ + if (iostat_ofp) { + if (last_start == (__u64)-1) + last_start = stamp; + else if ((stamp - last_start) >= iostat_interval) { + iostat_dump_stats(stamp, 0); + last_start = stamp; + } + + iostat_last_stamp = stamp; + } +} + +void iostat_getrq(struct io *iop) +{ + update_tot_qusz(iop->dip, TO_SEC(iop->t.time)); + INC_STAT(iop->dip, cur_qusz); +} + +void iostat_merge(struct io *iop) +{ + INC_STAT(iop->dip, rqm[IOP_RW(iop)]); +} + +void iostat_issue(struct io *iop) +{ + int rw = IOP_RW(iop); + struct d_info *dip = iop->dip; + double now = TO_SEC(iop->t.time); + + INC_STAT(dip, ios[rw]); + ADD_STAT(dip, sec[rw], iop->t.bytes >> 9); + + update_idle_time(dip, now, 0); + INC_STAT(dip, cur_dev); +} + +void iostat_complete(struct io *q_iop, struct io *c_iop) +{ + double now = TO_SEC(c_iop->t.time); + struct d_info *dip = q_iop->dip; + + if (q_iop->i_time != (__u64)-1) + ADD_STAT(c_iop->dip, wait, tdelta(q_iop->i_time,c_iop->t.time)); + else if (q_iop->m_time != (__u64)-1) + ADD_STAT(c_iop->dip, wait, tdelta(q_iop->m_time,c_iop->t.time)); + + update_tot_qusz(dip, now); + DEC_STAT(dip, cur_qusz); + + update_idle_time(dip, now, 0); + DEC_STAT(dip, cur_dev); + + ADD_STAT(dip, svctm, tdelta(q_iop->t.time, c_iop->t.time)); +} diff --git a/btt/latency.c b/btt/latency.c new file mode 100644 index 0000000..e3ecc26 --- /dev/null +++ b/btt/latency.c @@ -0,0 +1,73 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static inline void latency_out(FILE *ofp, __u64 tstamp, __u64 latency) +{ + if (ofp) + fprintf(ofp, "%lf %lf\n", TO_SEC(tstamp), TO_SEC(latency)); +} + +FILE *latency_open(__u32 device, char *name, char *post) +{ + FILE *fp = NULL; + + if (name) { + int mjr, mnr; + char oname[strlen(name) + 32]; + + mjr = device >> MINORBITS; + mnr = device & ((1 << MINORBITS) - 1); + + sprintf(oname, "%s_%03d,%03d_%s.dat", name, mjr, mnr, post); + if ((fp = my_fopen(oname, "w")) == NULL) + perror(oname); + else + add_file(fp, strdup(oname)); + } + + return fp; +} + +void latency_alloc(struct d_info *dip) +{ + dip->q2d_ofp = latency_open(dip->device, q2d_name, "q2d"); + dip->d2c_ofp = latency_open(dip->device, d2c_name, "d2c"); + dip->q2c_ofp = latency_open(dip->device, q2c_name, "q2c"); +} + +void latency_q2d(struct d_info *dip, __u64 tstamp, __u64 latency) +{ + plat_x2c(dip->q2d_plat_handle, tstamp, latency); + latency_out(dip->q2d_ofp, tstamp, latency); +} + +void latency_d2c(struct d_info *dip, __u64 tstamp, __u64 latency) +{ + plat_x2c(dip->d2c_plat_handle, tstamp, latency); + latency_out(dip->d2c_ofp, tstamp, latency); +} + +void latency_q2c(struct d_info *dip, __u64 tstamp, __u64 latency) +{ + plat_x2c(dip->q2c_plat_handle, tstamp, latency); + latency_out(dip->q2c_ofp, tstamp, latency); +} diff --git a/btt/list.h b/btt/list.h new file mode 100644 index 0000000..71c4a65 --- /dev/null +++ b/btt/list.h @@ -0,0 +1,239 @@ +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +#include <stdio.h> + +#ifndef offsetof +/** + * Get offset of a member + */ +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif + +#ifndef container_of +/** + * Casts a member of a structure out to the containing structure + * @param ptr the pointer to the member. + * @param type the type of the container struct this is embedded in. + * @param member the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +#endif + +/* + * These are non-NULL pointers that will result in page faults + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +/** + * __list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + * + * This variant differs from list_for_each() in that it's the + * simplest possible list iteration code, no prefetching is done. + * Use this for code that knows the list to be very short (empty + * or 1 entry) most of the time. + */ +#define __list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop counter. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +static inline int list_len(struct list_head *head_p) +{ + struct list_head *p; + int n = 0; + + __list_for_each(p, head_p) { + n++; + } + + return n; +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/** + * list_first - Returns first entry on list, or NULL if empty + * @head: the list + */ +static inline struct list_head *list_first(const struct list_head *head) +{ + return list_empty(head) ? NULL : head->next; +} + +/** + * list_move_tail - delete from one list and add as another's tail + * @list: the entry to move + * @head: the head that will follow our entry + */ +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add_tail(list, head); +} + +static inline void __list_splice(struct list_head *list, + struct list_head *head) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; +} + +/** + * * list_splice - join two lists + * * @list: the new list to add. + * * @head: the place to add it in the first list. + * */ +static inline void list_splice(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head); +} + +/** + * list_replace - replace old entry by new one + * @old : the element to be replaced + * @new : the new element to insert + * + * If @old was empty, it will be overwritten. + */ +static inline void list_replace(struct list_head *old, + struct list_head *new) +{ + new->next = old->next; + new->next->prev = new; + new->prev = old->prev; + new->prev->next = new; +} + +static inline void list_replace_init(struct list_head *old, + struct list_head *new) +{ + list_replace(old, new); + INIT_LIST_HEAD(old); +} + +#endif diff --git a/btt/misc.c b/btt/misc.c new file mode 100644 index 0000000..0cd2e98 --- /dev/null +++ b/btt/misc.c @@ -0,0 +1,177 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <fcntl.h> + +#define INLINE_DECLARE +#include "globals.h" + +struct file_info { + struct list_head head; + FILE *ofp; + char *oname; +}; + +struct buf_info { + struct list_head head; + void *buf; +}; + +LIST_HEAD(files_to_clean); +LIST_HEAD(all_bufs); + +static void clean_files(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &files_to_clean) { + struct stat buf; + struct file_info *fip = list_entry(p, struct file_info, head); + + fclose(fip->ofp); + if (!stat(fip->oname, &buf) && (buf.st_size == 0)) + unlink(fip->oname); + + list_del(&fip->head); + free(fip->oname); + free(fip); + } +} + +static void clean_bufs(void) +{ + struct list_head *p, *q; + + list_for_each_safe(p, q, &all_bufs) { + struct buf_info *bip = list_entry(p, struct buf_info, head); + + list_del(&bip->head); + free(bip->buf); + free(bip); + } +} + +#ifndef _ANDROID_ +/* + * Due to the N(devs) parts of a lot of the output features provided + * by btt, it will fail opens on large(ish) systems. Here we try to + * keep bumping our open file limits, and if those fail, we return NULL. + * + * Root users will probably be OK with this, others... + */ +static int increase_limit(int resource, rlim_t increase) +{ + struct rlimit rlim; + int save_errno = errno; + + if (!getrlimit(resource, &rlim)) { + rlim.rlim_cur += increase; + if (rlim.rlim_cur >= rlim.rlim_max) + rlim.rlim_max = rlim.rlim_cur + increase; + + if (!setrlimit(resource, &rlim)) + return 1; + } + + errno = save_errno; + return 0; +} +#endif + +static int handle_open_failure(void) +{ + if (errno == ENFILE || errno == EMFILE) +#ifndef _ANDROID_ + return increase_limit(RLIMIT_NOFILE, 16); +#else + return -ENOSYS; +#endif + + return 0; +} + +void add_file(FILE *fp, char *oname) +{ + struct file_info *fip = malloc(sizeof(*fip)); + + fip->ofp = fp; + fip->oname = oname; + list_add_tail(&fip->head, &files_to_clean); +} + +void add_buf(void *buf) +{ + struct buf_info *bip = malloc(sizeof(*bip)); + + bip->buf = buf; + list_add_tail(&bip->head, &all_bufs); +} + +void clean_allocs(void) +{ + clean_files(); + clean_bufs(); +} + +char *make_dev_hdr(char *pad, size_t len, struct d_info *dip, int add_parens) +{ + if (dip->devmap) + snprintf(pad, len, "%s", dip->devmap); + else if (add_parens) + snprintf(pad, len, "(%3d,%3d)", + MAJOR(dip->device), MINOR(dip->device)); + else + snprintf(pad, len, "%d,%d", + MAJOR(dip->device), MINOR(dip->device)); + + return pad; +} + +FILE *my_fopen(const char *path, const char *mode) +{ + FILE *fp; + + do { + fp = fopen(path, mode); + } while (fp == NULL && handle_open_failure()); + + return fp; +} + +int my_open(const char *path, int flags) +{ + int fd; + + do { + fd = open(path, flags); + } while (fd < 0 && handle_open_failure()); + + return fd; +} + +void dbg_ping(void) {} diff --git a/btt/mmap.c b/btt/mmap.c new file mode 100644 index 0000000..9d4eb3d --- /dev/null +++ b/btt/mmap.c @@ -0,0 +1,150 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <string.h> + +#include "blktrace.h" +#include "globals.h" + +#define DEF_LEN (16 * 1024 * 1024) + +static int fd; +static void *cur_map = MAP_FAILED; +static off_t cur_min, cur, cur_max, total_size; +static size_t len; +static struct blk_io_trace *next_t; +static long pgsz; + +int data_is_native = -1; + +static inline size_t min_len(size_t a, size_t b) +{ + return a < b ? a : b; +} + +static inline size_t convert_to_cpu(struct blk_io_trace *t, + struct blk_io_trace *tp, + void **pdu) +{ + if (data_is_native == -1) + check_data_endianness(t->magic); + + if (data_is_native) + memcpy(tp, t, sizeof(*tp)); + else { + tp->magic = be32_to_cpu(t->magic); + tp->sequence = be32_to_cpu(t->sequence); + tp->time = be64_to_cpu(t->time); + tp->sector = be64_to_cpu(t->sector); + tp->bytes = be32_to_cpu(t->bytes); + tp->action = be32_to_cpu(t->action); + tp->pid = be32_to_cpu(t->pid); + tp->device = be32_to_cpu(t->device); + tp->cpu = be16_to_cpu(t->cpu); + tp->error = be16_to_cpu(t->error); + tp->pdu_len = be16_to_cpu(t->pdu_len); + } + + if (tp->pdu_len) { + *pdu = malloc(tp->pdu_len); + memcpy(*pdu, t+1, tp->pdu_len); + } else + *pdu = NULL; + + return sizeof(*tp) + tp->pdu_len; +} + +static int move_map(void) +{ + if (cur_map != MAP_FAILED) + munmap(cur_map, len); + + cur_min = (cur & ~(pgsz-1)); + len = min_len(DEF_LEN, total_size - cur_min); + if (len < sizeof(*next_t)) + return 0; + + cur_map = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, + cur_min); + if (cur_map == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + cur_max = cur_min + len; + return (cur < cur_max); +} + +void setup_ifile(char *fname) +{ + struct stat buf; + + pgsz = sysconf(_SC_PAGESIZE); + + fd = my_open(fname, O_RDONLY); + if (fd < 0) { + perror(fname); + exit(1); + } + if (fstat(fd, &buf) < 0) { + perror(fname); + exit(1); + } + total_size = buf.st_size; + + if (!move_map()) + exit(0); +} + +void cleanup_ifile(void) +{ + if (cur_map != MAP_FAILED) + munmap(cur_map, len); + close(fd); +} + +int next_trace(struct blk_io_trace *t, void **pdu) +{ + size_t this_len; + + if ((cur + 512) > cur_max) + if (!move_map()) { + cleanup_ifile(); + return 0; + } + + next_t = cur_map + (cur - cur_min); + this_len = convert_to_cpu(next_t, t, pdu); + cur += this_len; + + return 1; +} + +double pct_done(void) +{ + return 100.0 * ((double)cur / (double)total_size); +} diff --git a/btt/output.c b/btt/output.c new file mode 100644 index 0000000..8693de7 --- /dev/null +++ b/btt/output.c @@ -0,0 +1,891 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include "globals.h" + +typedef struct avg_info *ai_dip_t; +ai_dip_t dip_q2q_dm_avg(struct d_info *dip) { return &dip->avgs.q2q_dm; } +ai_dip_t dip_q2a_dm_avg(struct d_info *dip) { return &dip->avgs.q2a_dm; } +ai_dip_t dip_q2c_dm_avg(struct d_info *dip) { return &dip->avgs.q2c_dm; } + +ai_dip_t dip_q2q_avg(struct d_info *dip) { return &dip->avgs.q2q; } +ai_dip_t dip_q2c_avg(struct d_info *dip) { return &dip->avgs.q2c; } +ai_dip_t dip_q2a_avg(struct d_info *dip) { return &dip->avgs.q2a; } +ai_dip_t dip_q2g_avg(struct d_info *dip) { return &dip->avgs.q2g; } +ai_dip_t dip_s2g_avg(struct d_info *dip) { return &dip->avgs.s2g; } +ai_dip_t dip_g2i_avg(struct d_info *dip) { return &dip->avgs.g2i; } +ai_dip_t dip_q2m_avg(struct d_info *dip) { return &dip->avgs.q2m; } +ai_dip_t dip_i2d_avg(struct d_info *dip) { return &dip->avgs.i2d; } +ai_dip_t dip_d2c_avg(struct d_info *dip) { return &dip->avgs.d2c; } + +typedef struct avg_info *ai_pip_t; +ai_pip_t pip_q2q_dm_avg(struct p_info *pip) { return &pip->avgs.q2q_dm; } +ai_pip_t pip_q2a_dm_avg(struct p_info *pip) { return &pip->avgs.q2a_dm; } +ai_pip_t pip_q2c_dm_avg(struct p_info *pip) { return &pip->avgs.q2c_dm; } + +ai_pip_t pip_q2q_avg(struct p_info *pip) { return &pip->avgs.q2q; } +ai_pip_t pip_q2c_avg(struct p_info *pip) { return &pip->avgs.q2c; } +ai_pip_t pip_q2a_avg(struct p_info *pip) { return &pip->avgs.q2a; } +ai_pip_t pip_q2g_avg(struct p_info *pip) { return &pip->avgs.q2g; } +ai_pip_t pip_s2g_avg(struct p_info *pip) { return &pip->avgs.s2g; } +ai_pip_t pip_g2i_avg(struct p_info *pip) { return &pip->avgs.g2i; } +ai_pip_t pip_q2m_avg(struct p_info *pip) { return &pip->avgs.q2m; } +ai_pip_t pip_i2d_avg(struct p_info *pip) { return &pip->avgs.i2d; } +ai_pip_t pip_d2c_avg(struct p_info *pip) { return &pip->avgs.d2c; } + +void output_section_hdr(FILE *ofp, char *hdr) +{ + fprintf(ofp, "==================== "); + fprintf(ofp, "%s", hdr); + fprintf(ofp, " ====================\n\n"); +} + +void output_hdr(FILE *ofp, char *hdr) +{ + fprintf(ofp, "%15s %13s %13s %13s %11s\n", + hdr, "MIN", "AVG", "MAX", "N" ); + fprintf(ofp, "--------------- ------------- ------------- ------------- -----------\n"); +} + +void __output_avg(FILE *ofp, char *hdr, struct avg_info *ap, int do_easy) +{ + if (ap->n > 0) { + ap->avg = BIT_TIME(ap->total) / (double)ap->n; + fprintf(ofp, "%-15s %13.9f %13.9f %13.9f %11d\n", hdr, + BIT_TIME(ap->min), ap->avg, BIT_TIME(ap->max), ap->n); + + if (do_easy && easy_parse_avgs) { + fprintf(xavgs_ofp, + "%s %.9lf %.9lf %.9lf %d\n", + hdr, BIT_TIME(ap->min), ap->avg, + BIT_TIME(ap->max), ap->n); + } + } +} + +static inline char *avg2string(struct avg_info *ap, char *string) +{ + if (ap->n > 0) + sprintf(string, "%13.9f", ap->avg); + else + sprintf(string, " "); + return string; +} + +struct __oda { + FILE *ofp; + ai_dip_t (*func)(struct d_info *); +}; +void __output_dip_avg(struct d_info *dip, void *arg) +{ + struct __oda *odap = arg; + ai_dip_t ap = odap->func(dip); + if (ap->n > 0) { + char dev_info[15]; + ap->avg = BIT_TIME(ap->total) / (double)ap->n; + __output_avg(odap->ofp, make_dev_hdr(dev_info, 15, dip, 1), + ap, 0); + } +} + +void output_dip_avg(FILE *ofp, char *hdr, ai_dip_t (*func)(struct d_info *)) +{ + struct __oda oda = { .ofp = ofp, .func = func}; + output_hdr(ofp, hdr); + dip_foreach_out(__output_dip_avg, &oda); + fprintf(ofp, "\n"); +} + +struct __q2d { + FILE *ofp; + void *q2d_all; + int n; +}; +void __output_q2d_histo(struct d_info *dip, void *arg) +{ + struct __q2d *q2dp = arg; + + if (q2d_ok(dip->q2d_priv)) { + char dev_info[15]; + FILE *ofp = q2dp->ofp; + + fprintf(q2dp->ofp, "%10s | ", + make_dev_hdr(dev_info, 15, dip, 1)); + q2d_display(ofp, dip->q2d_priv); + q2d_acc(q2dp->q2d_all, dip->q2d_priv); + q2dp->n++; + } +} + +void output_q2d_histo(FILE *ofp) +{ + struct __q2d __q2d = { + .ofp = ofp, + .q2d_all = q2d_alloc(), + .n = 0 + }; + + fprintf(ofp, "%10s | ", "DEV"); + q2d_display_header(ofp); + fprintf(ofp, "--------- | "); + q2d_display_dashes(ofp); + dip_foreach_out(__output_q2d_histo, &__q2d); + + if (__q2d.n) { + fprintf(ofp, "========== | "); + q2d_display_dashes(ofp); + fprintf(ofp, "%10s | ", "AVG"); + q2d_display(ofp, __q2d.q2d_all); + fprintf(ofp, "\n"); + } + + q2d_free(__q2d.q2d_all); +} + +int n_merges = 0; +struct { + unsigned long long nq, nd, blkmin, blkmax, total; +} merge_data; +void __output_dip_merge_ratio(struct d_info *dip, void *arg) +{ + double blks_avg; + char dev_info[15]; + double ratio, q2c_n, d2c_n; + + if (dip->n_qs == 0 || dip->n_ds == 0) + return; + else if (dip->n_qs < dip->n_ds) + dip->n_qs = dip->n_ds; + + q2c_n = dip->n_qs; + d2c_n = dip->n_ds; + if (q2c_n > 0.0 && d2c_n > 0.0) { + if (q2c_n < d2c_n) + ratio = 1.0; + else + ratio = q2c_n / d2c_n; + blks_avg = (double)dip->avgs.blks.total / d2c_n; + fprintf((FILE *)arg, + "%10s | %8llu %8llu %7.1lf | %8llu %8llu %8llu %8llu\n", + make_dev_hdr(dev_info, 15, dip, 1), + (unsigned long long)dip->n_qs, + (unsigned long long)dip->n_ds, + ratio, + (unsigned long long)dip->avgs.blks.min, + (unsigned long long)blks_avg, + (unsigned long long)dip->avgs.blks.max, + (unsigned long long)dip->avgs.blks.total); + + if (easy_parse_avgs) { + fprintf(xavgs_ofp, + "DMI %s %llu %llu %.9lf %llu %llu %llu %llu\n", + make_dev_hdr(dev_info, 15, dip, 0), + (unsigned long long)dip->n_qs, + (unsigned long long)dip->n_ds, + ratio, + (unsigned long long)dip->avgs.blks.min, + (unsigned long long)blks_avg, + (unsigned long long)dip->avgs.blks.max, + (unsigned long long)dip->avgs.blks.total); + } + + if (n_merges++ == 0) { + merge_data.blkmin = dip->avgs.blks.min; + merge_data.blkmax = dip->avgs.blks.max; + } + + merge_data.nq += dip->n_qs; + merge_data.nd += dip->n_ds; + merge_data.total += dip->avgs.blks.total; + if (dip->avgs.blks.min < merge_data.blkmin) + merge_data.blkmin = dip->avgs.blks.min; + if (dip->avgs.blks.max > merge_data.blkmax) + merge_data.blkmax = dip->avgs.blks.max; + } +} + +void output_dip_merge_ratio(FILE *ofp) +{ + fprintf(ofp, "%10s | %8s %8s %7s | %8s %8s %8s %8s\n", "DEV", "#Q", "#D", "Ratio", "BLKmin", "BLKavg", "BLKmax", "Total"); + fprintf(ofp, "---------- | -------- -------- ------- | -------- -------- -------- --------\n"); + dip_foreach_out(__output_dip_merge_ratio, ofp); + if (n_merges > 1) { + fprintf(ofp, "---------- | -------- -------- ------- | -------- -------- -------- --------\n"); + fprintf(ofp, "%10s | %8s %8s %7s | %8s %8s %8s %8s\n", "DEV", "#Q", "#D", "Ratio", "BLKmin", "BLKavg", "BLKmax", "Total"); + fprintf((FILE *)ofp, + "%10s | %8llu %8llu %7.1lf | %8llu %8llu %8llu %8llu\n", + "TOTAL", merge_data.nq, merge_data.nd, + (float)merge_data.nq / (float)merge_data.nd, + merge_data.blkmin, + merge_data.total / merge_data.nd, + merge_data.blkmax, merge_data.total); + } + fprintf(ofp, "\n"); +} + +struct __ohead_data { + __u64 total; + int n; +}; + +struct ohead_data { + FILE *ofp; + struct __ohead_data q2g, g2i, q2m, i2d, d2c, q2c; +}; + +#define __update_odp(odp, dip, fld) \ + do { \ + (odp)-> fld .total += dip->avgs. fld . total; \ + (odp)-> fld .n += dip->avgs. fld . n; \ + } while (0) + +void __output_dip_prep_ohead(struct d_info *dip, void *arg) +{ + if (dip->avgs.q2c.n > 0 && dip->avgs.q2c.total > 0) { + char dev_info[15]; + struct ohead_data *odp = arg; + double q2c_total = (double)(dip->avgs.q2c.total); + + fprintf(odp->ofp, + "%10s | %8.4lf%% %8.4lf%% %8.4lf%% %8.4lf%% %8.4lf%%\n", + make_dev_hdr(dev_info, 15, dip, 1), + 100.0 * (double)(dip->avgs.q2g.total) / q2c_total, + 100.0 * (double)(dip->avgs.g2i.total) / q2c_total, + 100.0 * (double)(dip->avgs.q2m.total) / q2c_total, + 100.0 * (double)(dip->avgs.i2d.total) / q2c_total, + 100.0 * (double)(dip->avgs.d2c.total) / q2c_total); + + __update_odp(odp, dip, q2g); + __update_odp(odp, dip, g2i); + __update_odp(odp, dip, q2m); + __update_odp(odp, dip, i2d); + __update_odp(odp, dip, d2c); + __update_odp(odp, dip, q2c); + } +} + +#define OD_AVG(od, fld, q2c) \ + (od. fld .n == 0) ? (double)0.0 : \ + (100.0 * ((double)((od). fld . total) / q2c)) + +void output_dip_prep_ohead(FILE *ofp) +{ + double q2c; + struct ohead_data od; + + memset(&od, 0, sizeof(od)); + od.ofp = ofp; + + fprintf(ofp, "%10s | %9s %9s %9s %9s %9s\n", + "DEV", "Q2G", "G2I", "Q2M", "I2D", "D2C"); + fprintf(ofp, "---------- | --------- --------- --------- --------- ---------\n"); + dip_foreach_out(__output_dip_prep_ohead, &od); + + if (od.q2g.n == 0 && od.g2i.n == 0 && od.q2m.n == 0 && + od.i2d.n == 0 && od.d2c.n == 0) + goto out; + + q2c = od.q2c.total; + fprintf(ofp, "---------- | --------- --------- --------- --------- ---------\n"); + fprintf(ofp, "%10s | %8.4lf%% %8.4lf%% %8.4lf%% %8.4lf%% %8.4lf%%\n", "Overall", + OD_AVG(od, q2g, q2c), OD_AVG(od, g2i, q2c), + OD_AVG(od, q2m, q2c), OD_AVG(od, i2d, q2c), + OD_AVG(od, d2c, q2c)); + +out: + fprintf(ofp, "\n"); +} + +struct seek_mode_info { + struct seek_mode_info *next; + long long mode; + int nseeks; +}; +struct o_seek_info { + long long nseeks, median; + double mean; + struct seek_mode_info *head; +} seek_info; +int n_seeks; + +void output_seek_mode_info(FILE *ofp, struct o_seek_info *sip) +{ + struct seek_mode_info *p, *this, *new_list = NULL; + + while ((this = sip->head) != NULL) { + sip->head = this->next; + this->next = NULL; + + if (new_list == NULL || this->nseeks > new_list->nseeks) + new_list = this; + else if (this->nseeks == new_list->nseeks) { + for (p = new_list; p != NULL; p = p->next) + if (p->mode == this->mode) + break; + + if (p) + this->nseeks += p->nseeks; + else + this->next = new_list; + new_list = this; + } + } + + fprintf(ofp, "%10s | %15lld %15.1lf %15lld | %lld(%d)", + "Average", sip->nseeks, sip->mean / sip->nseeks, + sip->median / sip->nseeks, new_list->mode, new_list->nseeks); + + if (new_list->next) { + int i = 0; + for (p = new_list->next; p != NULL; p = p->next) + i++; + fprintf(ofp, "\n%10s %15s %15s %15s ...(%d more)\n", "", "", "", "", i); + } +} + +void add_seek_mode_info(struct o_seek_info *sip, struct mode *mp) +{ + int i; + long long *lp = mp->modes; + struct seek_mode_info *smip; + + n_seeks++; + for (i = 0; i < mp->nmds; i++, lp++) { + for (smip = sip->head; smip; smip = smip->next) { + if (smip->mode == *lp) { + smip->nseeks += mp->most_seeks; + break; + } + } + if (!smip) { + struct seek_mode_info *new = malloc(sizeof(*new)); + + new->next = sip->head; + sip->head = new; + new->mode = *lp; + new->nseeks = mp->most_seeks; + + add_buf(new); + } + } +} + +static void do_output_dip_seek_info(struct d_info *dip, FILE *ofp, int is_q2q) +{ + double mean; + int i, nmodes; + long long nseeks; + char dev_info[15]; + long long median; + struct mode m; + void *handle = is_q2q ? dip->q2q_handle : dip->seek_handle; + + nseeks = seeki_nseeks(handle); + if (nseeks > 0) { + mean = seeki_mean(handle); + median = seeki_median(handle); + nmodes = seeki_mode(handle, &m); + + fprintf(ofp, "%10s | %15lld %15.1lf %15lld | %lld(%d)", + make_dev_hdr(dev_info, 15, dip, 1), nseeks, mean, + median, nmodes > 0 ? m.modes[0] : 0, m.most_seeks); + if (nmodes > 2) + fprintf(ofp, "\n%10s %15s %15s %15s ...(%d more)\n", "", "", "", "", nmodes-1); + else { + for (i = 1; i < nmodes; i++) + fprintf(ofp, " %lld", m.modes[i]); + fprintf(ofp, "\n"); + } + + if (easy_parse_avgs) { + char *rec = is_q2q ? "QSK" : "DSK"; + fprintf(xavgs_ofp, + "%s %s %lld %.9lf %lld %lld %d", + rec, make_dev_hdr(dev_info, 15, dip, 0), + nseeks, mean, median, + nmodes > 0 ? m.modes[0] : 0, m.most_seeks); + for (i = 1; i < nmodes; i++) + fprintf(xavgs_ofp, " %lld", m.modes[i]); + fprintf(xavgs_ofp, "\n"); + } + + seek_info.nseeks += nseeks; + seek_info.mean += (nseeks * mean); + seek_info.median += (nseeks * median); + add_seek_mode_info(&seek_info, &m); + free(m.modes); + } +} + +void __output_dip_seek_info(struct d_info *dip, void *arg) +{ + do_output_dip_seek_info(dip, (FILE *)arg, 0); +} + +void __output_dip_q2q_seek_info(struct d_info *dip, void *arg) +{ + do_output_dip_seek_info(dip, (FILE *)arg, 1); +} + +void output_dip_seek_info(FILE *ofp) +{ + n_seeks = 1; + memset(&seek_info, 0, sizeof(seek_info)); + + fprintf(ofp, "%10s | %15s %15s %15s | %-15s\n", "DEV", "NSEEKS", + "MEAN", "MEDIAN", "MODE"); + fprintf(ofp, "---------- | --------------- --------------- --------------- | ---------------\n"); + dip_foreach_out(__output_dip_seek_info, ofp); + if (n_seeks > 1) { + fprintf(ofp, "---------- | --------------- --------------- --------------- | ---------------\n"); + fprintf(ofp, "%10s | %15s %15s %15s | %-15s\n", + "Overall", "NSEEKS", "MEAN", "MEDIAN", "MODE"); + output_seek_mode_info(ofp, &seek_info); + fprintf(ofp, "\n"); + } + fprintf(ofp, "\n"); +} + +void output_dip_q2q_seek_info(FILE *ofp) +{ + n_seeks = 1; + memset(&seek_info, 0, sizeof(seek_info)); + + fprintf(ofp, "%10s | %15s %15s %15s | %-15s\n", "DEV", "NSEEKS", + "MEAN", "MEDIAN", "MODE"); + fprintf(ofp, "---------- | --------------- --------------- --------------- | ---------------\n"); + dip_foreach_out(__output_dip_q2q_seek_info, ofp); + if (n_seeks > 1) { + fprintf(ofp, "---------- | --------------- --------------- --------------- | ---------------\n"); + fprintf(ofp, "%10s | %15s %15s %15s | %-15s\n", + "Overall", "NSEEKS", "MEAN", "MEDIAN", "MODE"); + output_seek_mode_info(ofp, &seek_info); + fprintf(ofp, "\n"); + } + fprintf(ofp, "\n"); +} + +struct __opa { + FILE *ofp; + ai_pip_t (*func)(struct p_info *); +}; + +void __output_pip_avg(struct p_info *pip, void *arg) +{ + struct __opa *opap = arg; + ai_pip_t ap = opap->func(pip); + + if (ap->n > 0) { + char proc_name[15]; + snprintf(proc_name, 15, "%s", pip->name); + + ap->avg = BIT_TIME(ap->total) / (double)ap->n; + __output_avg(opap->ofp, proc_name, ap, 0); + } +} + +void output_pip_avg(FILE *ofp, char *hdr, ai_pip_t (*func)(struct p_info *)) +{ + struct __opa opa = { .ofp = ofp, .func = func }; + + output_hdr(ofp, hdr); + pip_foreach_out(__output_pip_avg, &opa); + fprintf(ofp, "\n"); +} + +int n_plugs; +struct plug_info { + long n_plugs, n_unplugs_t; + double t_percent; +} plug_info; + +void __dip_output_plug(struct d_info *dip, void *arg) +{ + char dev_info[15]; + FILE *ofp = arg; + double delta, pct; + + if (dip->is_plugged) + dip_unplug(dip->device, dip->end_time, 0); + if ((dip->nplugs + dip->nplugs_t) > 0) { + delta = dip->end_time - dip->start_time; + pct = 100.0 * (dip->plugged_time / delta); + + fprintf(ofp, "%10s | %10d(%10d) | %13.9lf%%\n", + make_dev_hdr(dev_info, 15, dip, 1), + dip->nplugs, dip->nplugs_t, pct); + + if (easy_parse_avgs) { + fprintf(xavgs_ofp, + "PLG %s %d %d %.9lf\n", + make_dev_hdr(dev_info, 15, dip, 0), + dip->nplugs, dip->nplugs_t, pct); + } + + n_plugs++; + plug_info.n_plugs += dip->nplugs; + plug_info.n_unplugs_t += dip->nplugs_t; + plug_info.t_percent += pct; + } +} + +void __dip_output_plug_all(FILE *ofp, struct plug_info *p) +{ + fprintf(ofp, "---------- | ---------- ---------- | ----------------\n"); + fprintf(ofp, "%10s | %10s %10s | %s\n", + "Overall", "# Plugs", "# Timer Us", "% Time Q Plugged"); + fprintf(ofp, "%10s | %10ld(%10ld) | %13.9lf%%\n", "Average", + p->n_plugs / n_plugs, p->n_unplugs_t / n_plugs, + p->t_percent / n_plugs); + +} + +__u64 n_nios_uplugs, n_nios_uplugs_t; +struct nios_plug_info { + __u64 tot_nios_up, tot_nios_up_t; +} nios_plug_info; + +void __dip_output_plug_nios(struct d_info *dip, void *arg) +{ + char dev_info[15]; + FILE *ofp = arg; + double a_nios_uplug = 0.0, a_nios_uplug_t = 0.0; + + if (dip->nios_up && dip->nplugs) { + a_nios_uplug = (double)dip->nios_up / (double)dip->nplugs; + n_nios_uplugs += dip->nplugs; + nios_plug_info.tot_nios_up += dip->nios_up; + } + if (dip->nios_upt && dip->nplugs_t) { + a_nios_uplug_t = (double)dip->nios_upt / (double)dip->nplugs_t; + n_nios_uplugs_t += dip->nplugs_t; + nios_plug_info.tot_nios_up_t += dip->nios_upt; + } + + fprintf(ofp, "%10s | %10.1lf %10.1lf\n", + make_dev_hdr(dev_info, 15, dip, 1), + a_nios_uplug, a_nios_uplug_t); + + if (easy_parse_avgs) { + fprintf(xavgs_ofp, + "UPG %s %.9lf %.9lf\n", + make_dev_hdr(dev_info, 15, dip, 0), + a_nios_uplug, a_nios_uplug_t); + } +} + +void __dip_output_uplug_all(FILE *ofp, struct nios_plug_info *p) +{ + double ios_unp = 0.0, ios_unp_to = 0.0; + + if (n_nios_uplugs) + ios_unp = (double)p->tot_nios_up / (double)n_nios_uplugs; + if (n_nios_uplugs_t) + ios_unp_to = (double)p->tot_nios_up_t / (double)n_nios_uplugs_t; + + fprintf(ofp, "---------- | ---------- ----------\n"); + fprintf(ofp, "%10s | %10s %10s\n", + "Overall", "IOs/Unp", "IOs/Unp(to)"); + fprintf(ofp, "%10s | %10.1lf %10.1lf\n", + "Average", ios_unp, ios_unp_to); +} + +void output_plug_info(FILE *ofp) +{ + fprintf(ofp, "%10s | %10s %10s | %s\n", + "DEV", "# Plugs", "# Timer Us", "% Time Q Plugged"); + fprintf(ofp, "---------- | ---------- ---------- | ----------------\n"); + dip_foreach_out(__dip_output_plug, ofp); + if (n_plugs > 1) + __dip_output_plug_all(ofp, &plug_info); + fprintf(ofp, "\n"); + + fprintf(ofp, "%10s | %10s %10s\n", + "DEV", "IOs/Unp", "IOs/Unp(to)"); + fprintf(ofp, "---------- | ---------- ----------\n"); + dip_foreach_out(__dip_output_plug_nios, ofp); + if (n_nios_uplugs || n_nios_uplugs_t) + __dip_output_uplug_all(ofp, &nios_plug_info); + fprintf(ofp, "\n"); +} + +int n_actQs; +struct actQ_info { + __u64 t_qs; + __u64 t_act_qs; +} actQ_info; + +void __dip_output_actQ(struct d_info *dip, void *arg) +{ + if (dip->n_qs > 0 && !remapper_dev(dip->device)) { + char dev_info[15]; + double a_actQs = (double)dip->t_act_q / (double)dip->n_qs; + + fprintf((FILE *)arg, "%10s | %13.1lf\n", + make_dev_hdr(dev_info, 15, dip, 1), a_actQs); + + if (easy_parse_avgs) { + fprintf(xavgs_ofp, + "ARQ %s %.9lf\n", + make_dev_hdr(dev_info, 15, dip, 0), a_actQs); + } + + n_actQs++; + actQ_info.t_qs += dip->n_qs; + actQ_info.t_act_qs += dip->t_act_q; + } +} + +void __dip_output_actQ_all(FILE *ofp, struct actQ_info *p) +{ + fprintf(ofp, "---------- | -------------\n"); + fprintf(ofp, "%10s | %13s\n", "Overall", "Avgs Reqs @ Q"); + fprintf(ofp, "%10s | %13.1lf\n", "Average", + (double)p->t_act_qs / (double)p->t_qs); +} + +void output_actQ_info(FILE *ofp) +{ + fprintf(ofp, "%10s | %13s\n", "DEV", "Avg Reqs @ Q"); + fprintf(ofp, "---------- | -------------\n"); + dip_foreach_out(__dip_output_actQ, ofp); + if (n_actQs > 1) + __dip_output_actQ_all(ofp, &actQ_info); + fprintf(ofp, "\n"); +} + +void output_histos(void) +{ + int i; + FILE *ofp; + char fname[256]; + + if (output_name == NULL) return; + + sprintf(fname, "%s_qhist.dat", output_name); + ofp = my_fopen(fname, "w"); + if (!ofp) { + perror(fname); + return; + } + + fprintf(ofp, "# BTT histogram data\n"); + fprintf(ofp, "# Q buckets\n"); + for (i = 0; i < (N_HIST_BKTS-1); i++) + fprintf(ofp, "%4d %lld\n", (i+1), (long long)q_histo[i]); + fprintf(ofp, "\n# Q bucket for > %d\n%4d %lld\n", (int)N_HIST_BKTS-1, + N_HIST_BKTS-1, (long long)q_histo[N_HIST_BKTS-1]); + fclose(ofp); + + sprintf(fname, "%s_dhist.dat", output_name); + ofp = my_fopen(fname, "w"); + if (!ofp) { + perror(fname); + return; + } + fprintf(ofp, "# D buckets\n"); + for (i = 0; i < (N_HIST_BKTS-1); i++) + fprintf(ofp, "%4d %lld\n", (i+1), (long long)d_histo[i]); + fprintf(ofp, "\n# D bucket for > %d\n%4d %lld\n", (int)N_HIST_BKTS-1, + N_HIST_BKTS-1, (long long)d_histo[N_HIST_BKTS-1]); + fclose(ofp); +} + +int output_avgs(FILE *ofp) +{ + if (output_all_data) { + if (exes == NULL || *exes != '\0') { + output_section_hdr(ofp, "Per Process"); + output_pip_avg(ofp, "Q2Qdm", pip_q2q_dm_avg); + output_pip_avg(ofp, "Q2Adm", pip_q2a_dm_avg); + output_pip_avg(ofp, "Q2Cdm", pip_q2c_dm_avg); + fprintf(ofp, "\n"); + + output_pip_avg(ofp, "Q2Q", pip_q2q_avg); + output_pip_avg(ofp, "Q2A", pip_q2a_avg); + output_pip_avg(ofp, "Q2G", pip_q2g_avg); + output_pip_avg(ofp, "S2G", pip_s2g_avg); + output_pip_avg(ofp, "G2I", pip_g2i_avg); + output_pip_avg(ofp, "Q2M", pip_q2m_avg); + output_pip_avg(ofp, "I2D", pip_i2d_avg); + output_pip_avg(ofp, "D2C", pip_d2c_avg); + output_pip_avg(ofp, "Q2C", pip_q2c_avg); + } + + output_section_hdr(ofp, "Per Device"); + output_dip_avg(ofp, "Q2Qdm", dip_q2q_dm_avg); + output_dip_avg(ofp, "Q2Adm", dip_q2a_dm_avg); + output_dip_avg(ofp, "Q2Cdm", dip_q2c_dm_avg); + fprintf(ofp, "\n"); + + output_dip_avg(ofp, "Q2Q", dip_q2q_avg); + output_dip_avg(ofp, "Q2A", dip_q2a_avg); + output_dip_avg(ofp, "Q2G", dip_q2g_avg); + output_dip_avg(ofp, "S2G", dip_s2g_avg); + output_dip_avg(ofp, "G2I", dip_g2i_avg); + output_dip_avg(ofp, "Q2M", dip_q2m_avg); + output_dip_avg(ofp, "I2D", dip_i2d_avg); + output_dip_avg(ofp, "D2C", dip_d2c_avg); + output_dip_avg(ofp, "Q2C", dip_q2c_avg); + } + + output_section_hdr(ofp, "All Devices"); + output_hdr(ofp, "ALL"); + __output_avg(ofp, "Q2Qdm", &all_avgs.q2q_dm, 0); + __output_avg(ofp, "Q2Adm", &all_avgs.q2a_dm, 0); + __output_avg(ofp, "Q2Cdm", &all_avgs.q2c_dm, 0); + fprintf(ofp, "\n"); + + __output_avg(ofp, "Q2Q", &all_avgs.q2q, 1); + __output_avg(ofp, "Q2A", &all_avgs.q2a, 1); + __output_avg(ofp, "Q2G", &all_avgs.q2g, 1); + __output_avg(ofp, "S2G", &all_avgs.s2g, 1); + __output_avg(ofp, "G2I", &all_avgs.g2i, 1); + __output_avg(ofp, "Q2M", &all_avgs.q2m, 1); + __output_avg(ofp, "I2D", &all_avgs.i2d, 1); + __output_avg(ofp, "M2D", &all_avgs.m2d, 1); + __output_avg(ofp, "D2C", &all_avgs.d2c, 1); + __output_avg(ofp, "Q2C", &all_avgs.q2c, 1); + fprintf(ofp, "\n"); + + output_section_hdr(ofp, "Device Overhead"); + output_dip_prep_ohead(ofp); + + output_section_hdr(ofp, "Device Merge Information"); + output_dip_merge_ratio(ofp); + + output_section_hdr(ofp, "Device Q2Q Seek Information"); + output_dip_q2q_seek_info(ofp); + + output_section_hdr(ofp, "Device D2D Seek Information"); + output_dip_seek_info(ofp); + + output_section_hdr(ofp, "Plug Information"); + output_plug_info(ofp); + + output_section_hdr(ofp, "Active Requests At Q Information"); + output_actQ_info(ofp); + + output_histos(); + + if (output_all_data) { + output_section_hdr(ofp, "Q2D Histogram"); + output_q2d_histo(ofp); + } + + return 0; +} + +void __output_ranges(FILE *ofp, struct list_head *head_p, float base) +{ + struct range_info *rip; + struct list_head *p; + float limit = base + 0.4; + + __list_for_each(p, head_p) { + rip = list_entry(p, struct range_info, head); + fprintf(ofp, "%13.9lf %5.1f\n", BIT_TIME(rip->start), base); + fprintf(ofp, "%13.9lf %5.1f\n", BIT_TIME(rip->start), limit); + fprintf(ofp, "%13.9lf %5.1f\n", BIT_TIME(rip->end), limit); + fprintf(ofp, "%13.9lf %5.1f\n", BIT_TIME(rip->end), base); + } +} + +int output_regions(FILE *ofp, char *header, struct region_info *reg, + float base) +{ + if (list_len(®->qranges) == 0 && list_len(®->cranges) == 0) + return 0; + + fprintf(ofp, "# %16s : q activity\n", header); + __output_ranges(ofp, ®->qranges, base); + fprintf(ofp, "\n"); + + fprintf(ofp, "# %16s : c activity\n", header); + __output_ranges(ofp, ®->cranges, base + 0.5); + fprintf(ofp, "\n"); + + return 1; +} + +struct __od { + FILE *ofp; + float base; +}; +void __output_dev(struct d_info *dip, void *arg) +{ + char header[128]; + struct __od *odp = arg; + + sprintf(header, "%d,%d", MAJOR(dip->device), MINOR(dip->device)); + if (output_regions(odp->ofp, header, &dip->regions, odp->base)) + odp->base += 1.0; +} + +float output_devs(FILE *ofp, float base) +{ + struct __od od = { .ofp = ofp, .base = base }; + + fprintf(ofp, "# Per device\n" ); + dip_foreach_out(__output_dev, &od); + return od.base; +} + +static inline int exe_match(char *exe, char *name) +{ + return (exe == NULL) || (strstr(name, exe) != NULL); +} + +struct __op { + FILE *ofp; + float base; +}; +void __output_procs(struct p_info *pip, void *arg) +{ + struct __op *opp = arg; + output_regions(opp->ofp, pip->name, &pip->regions, opp->base); + opp->base += 1.0; +} + +float output_procs(FILE *ofp, float base) +{ + struct __op op = { .ofp = ofp, .base = base }; + + fprintf(ofp, "# Per process\n" ); + pip_foreach_out(__output_procs, &op); + return op.base; +} + +int output_ranges(FILE *ofp) +{ + float base = 0.0; + + fprintf(ofp, "# %s\n", "Total System"); + if (output_regions(ofp, "Total System", &all_regions, base)) + base += 1.0; + + if (n_devs > 1) + base = output_devs(ofp, base); + + base = output_procs(ofp, base); + + return 0; +} diff --git a/btt/plat.c b/btt/plat.c new file mode 100644 index 0000000..7a9bb2a --- /dev/null +++ b/btt/plat.c @@ -0,0 +1,93 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * (C) Copyright 2008 Hewlett-Packard Development Company, L.P. + * Alan D. Brunelle <alan.brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +struct plat_info { + long nl; + FILE *fp; + double first_ts, last_ts, tl; +}; + +void *plat_alloc(char *str) +{ + char *oname; + struct plat_info *pp; + + if (plat_freq <= 0.0) return NULL; + + pp = malloc(sizeof(*pp)); + pp->nl = 0; + pp->first_ts = pp->last_ts = pp->tl = -1.0; + + oname = malloc(strlen(str) + 32); + sprintf(oname, "%s.dat", str); + if ((pp->fp = my_fopen(oname, "w")) == NULL) { + perror(oname); + return NULL; + } + add_file(pp->fp, oname); + + return pp; +} + +void plat_free(void *info) +{ + struct plat_info *pp = info; + + if (pp == NULL) return; + + if (pp->first_ts != -1.0) { + double delta = pp->last_ts - pp->first_ts; + + fprintf(pp->fp, "%lf %lf\n", + pp->first_ts + (delta / 2), pp->tl / pp->nl); + } + free(info); +} + +void plat_x2c(void *info, __u64 ts, __u64 latency) +{ + double now = TO_SEC(ts); + double lat = TO_SEC(latency); + struct plat_info *pp = info; + + if (pp == NULL) return; + + if (pp->first_ts == -1.0) { + pp->first_ts = pp->last_ts = now; + pp->nl = 1; + pp->tl = lat; + } else if ((now - pp->first_ts) >= plat_freq) { + double delta = pp->last_ts - pp->first_ts; + + fprintf(pp->fp, "%lf %lf\n", + pp->first_ts + (delta / 2), pp->tl / pp->nl); + + pp->first_ts = pp->last_ts = now; + pp->nl = 1; + pp->tl = lat; + } else { + pp->last_ts = now; + pp->nl += 1; + pp->tl += lat; + } +} diff --git a/btt/proc.c b/btt/proc.c new file mode 100644 index 0000000..aac49cb --- /dev/null +++ b/btt/proc.c @@ -0,0 +1,263 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <string.h> + +#include "globals.h" + +struct pn_info { + struct rb_node rb_node; + struct p_info *pip; + union { + char *name; + __u32 pid; + } u; +}; + +struct rb_root root_pid, root_name; + +static void __foreach(struct rb_node *n, void (*f)(struct p_info *, void *), + void *arg) +{ + if (n) { + __foreach(n->rb_left, f, arg); + f(rb_entry(n, struct pn_info, rb_node)->pip, arg); + __foreach(n->rb_right, f, arg); + } +} + +static void __destroy(struct rb_node *n, int free_name, int free_pip) +{ + if (n) { + struct pn_info *pnp = rb_entry(n, struct pn_info, rb_node); + + __destroy(n->rb_left, free_name, free_pip); + __destroy(n->rb_right, free_name, free_pip); + + if (free_name) + free(pnp->u.name); + if (free_pip) { + free(pnp->pip->name); + region_exit(&pnp->pip->regions); + free(pnp->pip); + } + free(pnp); + } +} + +struct p_info * __find_process_pid(__u32 pid) +{ + struct pn_info *this; + struct rb_node *n = root_pid.rb_node; + + while (n) { + this = rb_entry(n, struct pn_info, rb_node); + if (pid < this->u.pid) + n = n->rb_left; + else if (pid > this->u.pid) + n = n->rb_right; + else + return this->pip; + } + + return NULL; +} + +struct p_info *__find_process_name(char *name) +{ + int cmp; + struct pn_info *this; + struct rb_node *n = root_name.rb_node; + + while (n) { + this = rb_entry(n, struct pn_info, rb_node); + cmp = strcmp(name, this->u.name); + if (cmp < 0) + n = n->rb_left; + else if (cmp > 0) + n = n->rb_right; + else + return this->pip; + } + + return NULL; +} + +static void insert_pid(struct p_info *that, __u32 pid) +{ + struct pn_info *this; + struct rb_node *parent = NULL; + struct rb_node **p = &root_pid.rb_node; + + while (*p) { + parent = *p; + this = rb_entry(parent, struct pn_info, rb_node); + + if (pid < this->u.pid) + p = &(*p)->rb_left; + else if (pid > this->u.pid) + p = &(*p)->rb_right; + else + return; // Already there + } + + this = malloc(sizeof(struct pn_info)); + this->u.pid = pid; + this->pip = that; + + rb_link_node(&this->rb_node, parent, p); + rb_insert_color(&this->rb_node, &root_pid); +} + +static void insert_name(struct p_info *that) +{ + int cmp; + struct pn_info *this; + struct rb_node *parent = NULL; + struct rb_node **p = &root_name.rb_node; + + while (*p) { + parent = *p; + this = rb_entry(parent, struct pn_info, rb_node); + cmp = strcmp(that->name, this->u.name); + + if (cmp < 0) + p = &(*p)->rb_left; + else if (cmp > 0) + p = &(*p)->rb_right; + else + return; // Already there... + } + + this = malloc(sizeof(struct pn_info)); + this->u.name = strdup(that->name); + this->pip = that; + + rb_link_node(&this->rb_node, parent, p); + rb_insert_color(&this->rb_node, &root_name); +} + +static void insert(struct p_info *pip) +{ + insert_pid(pip, pip->pid); + insert_name(pip); +} + +static inline struct p_info *pip_alloc(void) +{ + return memset(malloc(sizeof(struct p_info)), 0, sizeof(struct p_info)); +} + +struct p_info *find_process(__u32 pid, char *name) +{ + struct p_info *pip; + + if (pid != ((__u32)-1)) { + if ((pip = __find_process_pid(pid)) != NULL) + return pip; + else if (name) { + pip = __find_process_name(name); + + if (pip && pid != pip->pid) { + /* + * This is a process with the same name + * as another, but a different PID. + * + * We'll store a reference in the PID + * tree... + */ + insert_pid(pip, pid); + } + return pip; + } + + /* + * We're here because we have a pid, and no name, but + * we didn't find a process ... + * + * We'll craft one using the pid... + */ + + name = alloca(256); + sprintf(name, "pid%09u", pid); + process_alloc(pid, name); + return __find_process_pid(pid); + } + + return __find_process_name(name); +} + +void process_alloc(__u32 pid, char *name) +{ + struct p_info *pip = find_process(pid, name); + + if (pip == NULL) { + pip = pip_alloc(); + pip->pid = pid; + region_init(&pip->regions); + pip->last_q = (__u64)-1; + pip->name = strdup(name); + + insert(pip); + } +} + +void pip_update_q(struct io *iop) +{ + if (iop->pip) { + if (remapper_dev(iop->dip->device)) + update_lq(&iop->pip->last_q, &iop->pip->avgs.q2q_dm, + iop->t.time); + else + update_lq(&iop->pip->last_q, &iop->pip->avgs.q2q, + iop->t.time); + update_qregion(&iop->pip->regions, iop->t.time); + } +} + +void pip_foreach_out(void (*f)(struct p_info *, void *), void *arg) +{ + if (exes == NULL) + __foreach(root_name.rb_node, f, arg); + else { + struct p_info *pip; + char *exe, *p, *next, *exes_save = strdup(exes); + + p = exes_save; + while (exes_save != NULL) { + exe = exes_save; + if ((next = strchr(exes_save, ',')) != NULL) { + *next = '\0'; + exes_save = next+1; + } else + exes_save = NULL; + + pip = __find_process_name(exe); + if (pip) + f(pip, arg); + } + } +} + +void pip_exit(void) +{ + __destroy(root_pid.rb_node, 0, 0); + __destroy(root_name.rb_node, 1, 1); +} diff --git a/btt/q2d.c b/btt/q2d.c new file mode 100644 index 0000000..faeb712 --- /dev/null +++ b/btt/q2d.c @@ -0,0 +1,121 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * (C) Copyright 2007 Hewlett-Packard Development Company, L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "globals.h" + +#define Q2D_MAX_HISTO 9 +struct q2d_info { + unsigned long nhistos; + unsigned long histos[Q2D_MAX_HISTO + 1]; +}; + +void q2d_histo_add(void *priv, __u64 q2d_in) +{ + int index; + struct q2d_info *q2dp = priv; + double q2d = BIT_TIME(q2d_in); + long msec = (long)(q2d / 0.001); + + switch (msec) { + default: index = 9; break; + case 500 ... 999: index = 8; break; + case 250 ... 499: index = 7; break; + case 100 ... 249: index = 6; break; + case 75 ... 99: index = 5; break; + case 50 ... 74: index = 4; break; + case 25 ... 49: index = 3; break; + case 10 ... 24: index = 2; break; + case 5 ... 9: index = 1; break; + case 0 ... 4: index = 0; break; + } + + q2dp->histos[index]++; + q2dp->nhistos++; +} + +void *q2d_alloc(void) +{ + struct q2d_info *q2dp = malloc(sizeof(*q2dp)); + + return memset(q2dp, 0, sizeof(*q2dp)); +} + +void q2d_free(void *priv) +{ + free(priv); +} + +void q2d_display_header(FILE *fp) +{ + fprintf(fp, "%5s ", "<.005"); + fprintf(fp, "%5s ", "<.010"); + fprintf(fp, "%5s ", "<.025"); + fprintf(fp, "%5s ", "<.050"); + fprintf(fp, "%5s ", "<.075"); + fprintf(fp, "%5s ", "<.100"); + fprintf(fp, "%5s ", "<.250"); + fprintf(fp, "%5s ", "<.500"); + fprintf(fp, "%5s ", "< 1.0"); + fprintf(fp, "%5s ", ">=1.0\n"); +} + +void q2d_display_dashes(FILE *fp) +{ + int i; + + for (i = 0; i <= Q2D_MAX_HISTO; i++) + fprintf(fp, "===== "); + fprintf(fp, "\n"); +} + +void q2d_display(FILE *fp, void *priv) +{ + int i; + struct q2d_info *q2dp = priv; + double nh = (double)q2dp->nhistos; + + for (i = 0; i <= Q2D_MAX_HISTO; i++) { + double p = 100.0 * (double)q2dp->histos[i] / nh; + fprintf(fp, "%5.1lf ", p); + } + fprintf(fp, "\n"); +} + +int q2d_ok(void *priv) +{ + struct q2d_info *q2dp = priv; + + return q2dp && q2dp->nhistos > 0; +} + +void q2d_acc(void *a1, void *a2) +{ + int i; + struct q2d_info *ap = a1; + struct q2d_info *tp = a2; + + for (i = 0; i <= Q2D_MAX_HISTO; i++) + ap->histos[i] += tp->histos[i]; + ap->nhistos += tp->nhistos; +} diff --git a/btt/seek.c b/btt/seek.c new file mode 100644 index 0000000..4a03fbe --- /dev/null +++ b/btt/seek.c @@ -0,0 +1,305 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include <float.h> +#include "globals.h" + +struct seek_bkt { + struct rb_node rb_node; + long long sectors; + int nseeks; +}; + +/* Seeks per second */ +struct sps_bkt { + double t_start, t_last; + unsigned long nseeks; +}; + +struct seeki { + FILE *rfp, *wfp, *cfp, *sps_fp; + struct rb_root root; + struct sps_bkt sps; + long long tot_seeks; + double total_sectors; + long long last_start, last_end; +}; + +static FILE *seek_open(char *str, char rw) +{ + FILE *fp; + char *oname; + + if (seek_name == NULL) return NULL; + + oname = malloc(strlen(seek_name) + strlen(str) + 32); + sprintf(oname, "%s_%s_%c.dat", seek_name, str, rw); + if ((fp = my_fopen(oname, "w")) == NULL) + perror(oname); + else + add_file(fp, oname); + + return fp; +} + +static void __insert(struct rb_root *root, long long sectors) +{ + struct seek_bkt *sbp; + struct rb_node *parent = NULL; + struct rb_node **p = &root->rb_node; + + while (*p) { + parent = *p; + sbp = rb_entry(parent, struct seek_bkt, rb_node); + if (sectors < sbp->sectors) + p = &(*p)->rb_left; + else if (sectors > sbp->sectors) + p = &(*p)->rb_right; + else { + sbp->nseeks++; + return; + } + } + + sbp = malloc(sizeof(struct seek_bkt)); + sbp->nseeks = 1; + sbp->sectors = sectors; + + rb_link_node(&sbp->rb_node, parent, p); + rb_insert_color(&sbp->rb_node, root); +} + +static void __destroy(struct rb_node *n) +{ + if (n) { + struct seek_bkt *sbp = rb_entry(n, struct seek_bkt, rb_node); + + __destroy(n->rb_left); + __destroy(n->rb_right); + free(sbp); + } +} + +static void sps_emit(struct seeki *sip) +{ + double tstamp, s_p_s; + struct sps_bkt *sps = &sip->sps; + double delta = sps->t_last - sps->t_start; + + if ((sps->nseeks == 1) || (delta < DBL_EPSILON)) { + s_p_s = (double)(sps->nseeks); + tstamp = sps->t_start; + } else { + + s_p_s = (double)(sps->nseeks) / delta; + tstamp = sps->t_start + (delta / 2); + } + + fprintf(sip->sps_fp, "%15.9lf %.2lf\n", sps->t_start, s_p_s); + + sps->t_start = 0; + sps->nseeks = 0; +} + +static void sps_add(struct seeki *sip, double t) +{ + if (sip->sps_fp) { + struct sps_bkt *sps = &sip->sps; + + if (sps->nseeks != 0 && ((t - sps->t_start) >= 1.0)) + sps_emit(sip); + + sps->t_last = t; + if (sps->nseeks == 0) { + sps->t_start = t; + sps->nseeks = 1; + } else + sps->nseeks++; + } +} + +static int __median(struct rb_node *n, long long sofar, long long target, + long long *rvp) +{ + struct seek_bkt *sbp; + + sbp = rb_entry(n, struct seek_bkt, rb_node); + if ((sofar + sbp->nseeks) >= target) { + *rvp = sbp->sectors; + return 1; + } + + if (n->rb_left && __median(n->rb_left, sofar, target, rvp)) + return 1; + + if (n->rb_right && __median(n->rb_right, sofar, target, rvp)) + return 1; + + return 0; + +} + +static void __mode(struct rb_node *n, struct mode *mp) +{ + struct seek_bkt *sbp; + + if (n->rb_left) + __mode(n->rb_left, mp); + if (n->rb_right) + __mode(n->rb_right, mp); + + sbp = rb_entry(n, struct seek_bkt, rb_node); + if (mp->modes == NULL) { + mp->modes = malloc(sizeof(long long)); + mp->nmds = 0; + } else if (sbp->nseeks > mp->most_seeks) + mp->nmds = 0; + else if (sbp->nseeks == mp->most_seeks) + mp->modes = realloc(mp->modes, (mp->nmds + 1) * + sizeof(long long)); + else + return; + + mp->most_seeks = sbp->nseeks; + mp->modes[mp->nmds++] = sbp->sectors; +} + +long long seek_dist(struct seeki *sip, struct io *iop) +{ + long long dist; + long long start = BIT_START(iop), end = BIT_END(iop); + + if (seek_absolute) + dist = start - sip->last_end; + else { + /* Some overlap means no seek */ + if (((sip->last_start <= start) && (start <= sip->last_end)) || + ((sip->last_start <= end) && (end <= sip->last_end))) + dist = 0; + else if (start > sip->last_end) + dist = start - sip->last_end; + else + dist = start - sip->last_start; + + } + + sip->last_start = start; + sip->last_end = end; + return dist; +} + +void *seeki_alloc(char *str) +{ + struct seeki *sip = malloc(sizeof(struct seeki)); + + sip->rfp = seek_open(str, 'r'); + sip->wfp = seek_open(str, 'w'); + sip->cfp = seek_open(str, 'c'); + sip->tot_seeks = 0; + sip->total_sectors = 0.0; + sip->last_start = sip->last_end = 0; + memset(&sip->root, 0, sizeof(sip->root)); + + if (sps_name) { + char *oname; + + memset(&sip->sps, 0, sizeof(sip->sps)); + + oname = malloc(strlen(sps_name) + strlen(str) + 32); + sprintf(oname, "%s_%s.dat", sps_name, str); + if ((sip->sps_fp = my_fopen(oname, "w")) == NULL) + perror(oname); + else + add_file(sip->sps_fp, oname); + } else + sip->sps_fp = NULL; + + return sip; +} + +void seeki_free(void *param) +{ + struct seeki *sip = param; + + if (sip->sps_fp && sip->sps.nseeks != 0) + sps_emit(sip); + + /* + * Associated files are cleaned up by seek_clean + */ + __destroy(sip->root.rb_node); + free(sip); +} + +void seeki_add(void *handle, struct io *iop) +{ + struct seeki *sip = handle; + char rw = IOP_READ(iop) ? 'r' : 'w'; + long long dist = seek_dist(sip, iop); + double tstamp = BIT_TIME(iop->t.time); + FILE *fp = IOP_READ(iop) ? sip->rfp : sip->wfp; + + if (fp) + fprintf(fp, "%15.9lf %13lld %c\n", tstamp, dist, rw); + if (sip->cfp) + fprintf(sip->cfp, "%15.9lf %13lld %c\n", tstamp, dist, rw); + + dist = llabs(dist); + sip->tot_seeks++; + sip->total_sectors += dist; + __insert(&sip->root, dist); + + sps_add(sip, tstamp); +} + +long long seeki_nseeks(void *handle) +{ + return ((struct seeki *)handle)->tot_seeks; +} + +double seeki_mean(void *handle) +{ + struct seeki *sip = handle; + return sip->total_sectors / sip->tot_seeks; +} + +long long seeki_median(void *handle) +{ + long long rval = 0LL; + struct seeki *sip = handle; + + if (sip->root.rb_node) + (void)__median(sip->root.rb_node, 0LL, sip->tot_seeks / 2, + &rval); + + return rval; +} + +int seeki_mode(void *handle, struct mode *mp) +{ + struct seeki *sip = handle; + struct rb_root *root = &sip->root; + + memset(mp, 0, sizeof(struct mode)); + if (root->rb_node) + __mode(root->rb_node, mp); + + return mp->nmds; +} diff --git a/btt/trace.c b/btt/trace.c new file mode 100644 index 0000000..e18a887 --- /dev/null +++ b/btt/trace.c @@ -0,0 +1,105 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static void __add_trace(struct io *iop) +{ + time_t now = time(NULL); + + n_traces++; + iostat_check_time(iop->t.time); + + if (verbose && ((now - last_vtrace) > 0)) { + printf("%10lu t (%6.2lf%%)\r", n_traces, pct_done()); + if ((n_traces % 1000000) == 0) printf("\n"); + fflush(stdout); + last_vtrace = now; + } + + switch (iop->t.action & 0xffff) { + case __BLK_TA_QUEUE: trace_queue(iop); break; + case __BLK_TA_REMAP: trace_remap(iop); break; + case __BLK_TA_INSERT: trace_insert(iop); break; + case __BLK_TA_GETRQ: trace_getrq(iop); break; + case __BLK_TA_BACKMERGE: trace_merge(iop); break; + case __BLK_TA_FRONTMERGE: trace_merge(iop); break; + case __BLK_TA_REQUEUE: trace_requeue(iop); break; + case __BLK_TA_ISSUE: trace_issue(iop); break; + case __BLK_TA_COMPLETE: trace_complete(iop); break; + case __BLK_TA_PLUG: trace_plug(iop); break; + case __BLK_TA_UNPLUG_IO: trace_unplug_io(iop); break; + case __BLK_TA_UNPLUG_TIMER: trace_unplug_timer(iop); break; + case __BLK_TA_SLEEPRQ: trace_sleeprq(iop); break; + default: + io_release(iop); + return; + } +} + +static void trace_message(struct io *iop) +{ + char scratch[15]; + char msg[iop->t.pdu_len + 1]; + + if (!io_setup(iop, IOP_M)) + return; + + memcpy(msg, iop->pdu, iop->t.pdu_len); + msg[iop->t.pdu_len] = '\0'; + + fprintf(msgs_ofp, "%s %5d.%09lu %s\n", + make_dev_hdr(scratch, 15, iop->dip, 1), + (int)SECONDS(iop->t.time), + (unsigned long)NANO_SECONDS(iop->t.time), msg); +} + +void add_trace(struct io *iop) +{ + if (iop->t.action & BLK_TC_ACT(BLK_TC_NOTIFY)) { + if (iop->t.action == BLK_TN_PROCESS) { + if (iop->t.pid == 0) + process_alloc(0, "kernel"); + else { + char *slash = strchr(iop->pdu, '/'); + if (slash) + *slash = '\0'; + + process_alloc(iop->t.pid, iop->pdu); + } + } else if (iop->t.action == BLK_TN_MESSAGE) + trace_message(iop); + io_release(iop); + } else if (iop->t.action & BLK_TC_ACT(BLK_TC_PC)) { + io_release(iop); + } else { + if (time_bounded) { + if (BIT_TIME(iop->t.time) < t_astart) { + io_release(iop); + return; + } else if (BIT_TIME(iop->t.time) > t_aend) { + io_release(iop); + done = 1; + return; + } + } + __add_trace(iop); + } +} diff --git a/btt/trace_complete.c b/btt/trace_complete.c new file mode 100644 index 0000000..6f616bc --- /dev/null +++ b/btt/trace_complete.c @@ -0,0 +1,125 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static inline void __out(FILE *ofp, __u64 tm, enum iop_type type, + __u64 sec, __u32 nsec, int indent) +{ + if (tm != (__u64)-1) { + if (indent) + fprintf(ofp, " "); + fprintf(ofp, "%5d.%09lu %c %10llu+%-4u\n", + (int)SECONDS(tm), (unsigned long)NANO_SECONDS(tm), + type2c(type), (unsigned long long)sec, nsec); + } +} + +static void display_io_track(FILE *ofp, struct io *iop) +{ + fprintf(ofp, "%3d,%-3d: ", MAJOR(iop->t.device), MINOR(iop->t.device)); + __out(ofp, iop->t.time, IOP_Q, iop->t.sector, t_sec(&iop->t), 0); + + if (iop->g_time != (__u64)-1) + __out(ofp, iop->g_time, IOP_G, iop->t.sector, t_sec(&iop->t),1); + if (iop->i_time != (__u64)-1) + __out(ofp, iop->i_time, IOP_I, iop->t.sector, t_sec(&iop->t),1); + if (iop->m_time != (__u64)-1) + __out(ofp, iop->m_time, IOP_M, iop->t.sector, t_sec(&iop->t),1); + + __out(ofp, iop->d_time, IOP_D, iop->d_sec, iop->d_nsec, 1); + __out(ofp, iop->c_time, IOP_C, iop->c_sec, iop->c_nsec, 1); + fprintf(ofp, "\n"); +} + +static void handle_complete(struct io *c_iop) +{ + LIST_HEAD(head); + struct list_head *p, *q; + __u64 d_time = (__u64)-1; + FILE *pit_fp = c_iop->dip->pit_fp; + + update_blks(c_iop); + update_cregion(&all_regions, c_iop->t.time); + update_cregion(&c_iop->dip->regions, c_iop->t.time); + if (c_iop->pip) + update_cregion(&c_iop->pip->regions, c_iop->t.time); + aqd_complete(c_iop->dip->aqd_handle, BIT_TIME(c_iop->t.time)); + + dip_foreach_list(c_iop, IOP_Q, &head); + list_for_each_safe(p, q, &head) { + struct io *q_iop = list_entry(p, struct io, f_head); + __u64 q2c = tdelta(q_iop->t.time, c_iop->t.time); + + c_iop->bytes_left -= q_iop->t.bytes; + + update_q2c(q_iop, q2c); + latency_q2c(q_iop->dip, q_iop->t.time, q2c); + + if (q_iop->d_time != (__u64)-1) { + __u64 d2c = tdelta(q_iop->d_time, c_iop->t.time); + + update_d2c(q_iop, d2c); + latency_d2c(q_iop->dip, c_iop->t.time, d2c); + iostat_complete(q_iop, c_iop); + + d_time = q_iop->d_time; + } + + if (per_io_ofp) { + q_iop->c_time = c_iop->t.time; + q_iop->c_sec = c_iop->t.sector; + q_iop->c_nsec = t_sec(&c_iop->t); + display_io_track(per_io_ofp, q_iop); + } + + if (q_iop->dip->pit_fp) { + fprintf(pit_fp, "%d.%09lu ", + (int)SECONDS(q_iop->t.time), + (unsigned long)NANO_SECONDS(q_iop->t.time)); + } + + list_del(&q_iop->f_head); + io_release(q_iop); + } + + if (per_io_ofp) + fprintf(per_io_ofp, + "-----------------------------------------\n"); + + if (c_iop->dip->pit_fp) { + fprintf(pit_fp, "| %d.%09lu | %d.%09lu\n", + (int)SECONDS(d_time), + (unsigned long)NANO_SECONDS(d_time), + (int)SECONDS(c_iop->t.time), + (unsigned long)NANO_SECONDS(c_iop->t.time)); + } +} + +void trace_complete(struct io *c_iop) +{ + if (c_iop->t.bytes == 0) + return; + + if (io_setup(c_iop, IOP_C)) + handle_complete(c_iop); + + io_release(c_iop); +} diff --git a/btt/trace_im.c b/btt/trace_im.c new file mode 100644 index 0000000..49c876c --- /dev/null +++ b/btt/trace_im.c @@ -0,0 +1,107 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static void handle_g(struct io *g_iop) +{ + struct io *q_iop; + + iostat_getrq(g_iop); + + q_iop = dip_find_sec(g_iop->dip, IOP_Q, g_iop->t.sector); + if (q_iop) { + q_iop->g_time = g_iop->t.time; + update_q2g(q_iop, tdelta(q_iop->t.time, g_iop->t.time)); + if (q_iop->s_time != 0) + update_s2g(q_iop, tdelta(q_iop->s_time, g_iop->t.time)); + } +} + +static void handle_s(struct io *s_iop) +{ + struct io *q_iop = dip_find_sec(s_iop->dip, IOP_Q, s_iop->t.sector); + + if (q_iop) + q_iop->s_time = s_iop->t.time; +} + +static void handle_i(struct io *i_iop) +{ + struct io *q_iop = dip_find_sec(i_iop->dip, IOP_Q, i_iop->t.sector); + + if (q_iop) { + q_iop->i_time = i_iop->t.time; + if (q_iop->g_time != (__u64)-1) + update_g2i(q_iop, tdelta(q_iop->g_time, i_iop->t.time)); + } +} + +static void handle_m(struct io *m_iop) +{ + struct io *q_iop; + + iostat_merge(m_iop); + + q_iop = dip_find_sec(m_iop->dip, IOP_Q, m_iop->t.sector); + if (q_iop) { + q_iop->m_time = m_iop->t.time; + update_q2m(q_iop, tdelta(q_iop->t.time, m_iop->t.time)); + } + + if (m_iop->dip->n_act_q != 0) + m_iop->dip->n_act_q--; +} + +void trace_sleeprq(struct io *s_iop) +{ + if (s_iop->t.bytes == 0) + return; + if (io_setup(s_iop, IOP_S)) + handle_s(s_iop); + io_release(s_iop); +} + +void trace_getrq(struct io *g_iop) +{ + if (g_iop->t.bytes == 0) + return; + if (io_setup(g_iop, IOP_G)) + handle_g(g_iop); + io_release(g_iop); +} + +void trace_insert(struct io *i_iop) +{ + if (i_iop->t.bytes == 0) + return; + if (io_setup(i_iop, IOP_I)) + handle_i(i_iop); + io_release(i_iop); +} + +void trace_merge(struct io *m_iop) +{ + if (m_iop->t.bytes == 0) + return; + if (io_setup(m_iop, IOP_M)) + handle_m(m_iop); + io_release(m_iop); +} diff --git a/btt/trace_issue.c b/btt/trace_issue.c new file mode 100644 index 0000000..976fe1c --- /dev/null +++ b/btt/trace_issue.c @@ -0,0 +1,73 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static void handle_issue(struct io *d_iop) +{ + LIST_HEAD(head); + struct list_head *p, *q; + + if (d_iop->dip->n_act_q != 0) + d_iop->dip->n_act_q--; + + seeki_add(d_iop->dip->seek_handle, d_iop); + bno_dump_add(d_iop->dip->bno_dump_handle, d_iop); + iostat_issue(d_iop); + d_iop->dip->n_ds++; + if (!remapper_dev(d_iop->t.device)) + update_d_histo(d_iop->t.bytes); + aqd_issue(d_iop->dip->aqd_handle, BIT_TIME(d_iop->t.time)); + + dip_foreach_list(d_iop, IOP_Q, &head); + list_for_each_safe(p, q, &head) { + struct io *q_iop = list_entry(p, struct io, f_head); + + if (q_iop->i_time != (__u64)-1) + update_i2d(q_iop, tdelta(q_iop->i_time, d_iop->t.time)); + else if (q_iop->m_time != (__u64)-1) + update_m2d(q_iop, tdelta(q_iop->m_time, d_iop->t.time)); + + d_iop->bytes_left -= q_iop->t.bytes; + list_del(&q_iop->f_head); + + q_iop->d_time = d_iop->t.time; + q_iop->d_sec = d_iop->t.sector; + q_iop->d_nsec = t_sec(&d_iop->t); + + if (output_all_data) + q2d_histo_add(q_iop->dip->q2d_priv, + d_iop->t.time - q_iop->t.time); + latency_q2d(q_iop->dip, d_iop->t.time, + d_iop->t.time - q_iop->t.time); + } +} + +void trace_issue(struct io *d_iop) +{ + if (d_iop->t.bytes == 0) + return; + + if (io_setup(d_iop, IOP_D)) + handle_issue(d_iop); + + io_release(d_iop); + +} diff --git a/btt/trace_plug.c b/btt/trace_plug.c new file mode 100644 index 0000000..b1925ae --- /dev/null +++ b/btt/trace_plug.c @@ -0,0 +1,47 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2007 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static __u64 get_nio_up(struct io *u_iop) +{ + __u64 *val = u_iop->pdu; + return be64_to_cpu(*val); +} + +void trace_unplug_io(struct io *u_iop) +{ + unplug_hist_add(u_iop); + dip_unplug(u_iop->t.device, BIT_TIME(u_iop->t.time), get_nio_up(u_iop)); + io_release(u_iop); +} + +void trace_unplug_timer(struct io *ut_iop) +{ + dip_unplug_tm(ut_iop->t.device, BIT_TIME(ut_iop->t.time), + get_nio_up(ut_iop)); + io_release(ut_iop); +} + +void trace_plug(struct io *p_iop) +{ + dip_plug(p_iop->t.device, BIT_TIME(p_iop->t.time)); + io_release(p_iop); +} diff --git a/btt/trace_queue.c b/btt/trace_queue.c new file mode 100644 index 0000000..82c5760 --- /dev/null +++ b/btt/trace_queue.c @@ -0,0 +1,53 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static void handle_queue(struct io *q_iop) +{ + seeki_add(q_iop->dip->q2q_handle, q_iop); + update_qregion(&all_regions, q_iop->t.time); + dip_update_q(q_iop->dip, q_iop); + pip_update_q(q_iop); + if (remapper_dev(q_iop->t.device)) + update_lq(&last_q, &all_avgs.q2q_dm, q_iop->t.time); + else { + update_q_histo(q_iop->t.bytes); + update_lq(&last_q, &all_avgs.q2q, q_iop->t.time); + } + + q_iop->i_time = q_iop->g_time = q_iop->i_time = q_iop->m_time = + q_iop->d_time = (__u64)-1; + q_iop->dip->n_qs++; + + q_iop->dip->t_act_q += q_iop->dip->n_act_q; + q_iop->dip->n_act_q++; +} + +void trace_queue(struct io *q_iop) +{ + if (q_iop->t.bytes == 0) + return; + + if (io_setup(q_iop, IOP_Q)) + handle_queue(q_iop); + else + io_release(q_iop); +} diff --git a/btt/trace_remap.c b/btt/trace_remap.c new file mode 100644 index 0000000..560ae2b --- /dev/null +++ b/btt/trace_remap.c @@ -0,0 +1,59 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static inline void cvt_pdu_remap(struct blk_io_trace_remap *rp) +{ + rp->device_from = be32_to_cpu(rp->device_from); + rp->device_to = be32_to_cpu(rp->device_to); + rp->sector_from = be64_to_cpu(rp->sector_from); +} + +/* + * q_iop == volume device + * a_iop == underlying device + */ +void trace_remap(struct io *a_iop) +{ + struct io *q_iop; + struct d_info *q_dip; + struct blk_io_trace_remap *rp; + + if (ignore_remaps) + goto out; + + rp = a_iop->pdu; + cvt_pdu_remap(rp); + + if (!io_setup(a_iop, IOP_A)) + goto out; + + q_dip = __dip_find(rp->device_from); + if (!q_dip) + goto out; + + q_iop = dip_find_sec(q_dip, IOP_Q, rp->sector_from); + if (q_iop) + update_q2a(q_iop, tdelta(q_iop->t.time, a_iop->t.time)); + +out: + io_release(a_iop); +} diff --git a/btt/trace_requeue.c b/btt/trace_requeue.c new file mode 100644 index 0000000..f1324d9 --- /dev/null +++ b/btt/trace_requeue.c @@ -0,0 +1,35 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +static void handle_requeue(struct io *r_iop) +{ + r_iop->dip->n_qs++; + r_iop->dip->t_act_q += r_iop->dip->n_act_q; + r_iop->dip->n_act_q++; +} + +void trace_requeue(struct io *r_iop) +{ + if (io_setup(r_iop, IOP_R)) + handle_requeue(r_iop); + io_release(r_iop); +} diff --git a/btt/unplug_hist.c b/btt/unplug_hist.c new file mode 100644 index 0000000..8fd4285 --- /dev/null +++ b/btt/unplug_hist.c @@ -0,0 +1,87 @@ +/* + * blktrace output analysis: generate a timeline & gather statistics + * + * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "globals.h" + +#define BKT_WIDTH 5 +#define MAX_BKT 19 +#define EXCESS_BKT 20 +#define NBKTS (EXCESS_BKT + 1) + +struct hist_bkt { + __u32 dev; + int hist[NBKTS * sizeof(int)]; +}; + +void *unplug_hist_alloc(__u32 device) +{ + struct hist_bkt *hbp; + + if (unplug_hist_name == NULL) return NULL; + + hbp = malloc(sizeof(*hbp)); + hbp->dev = device; + memset(hbp->hist, 0, NBKTS * sizeof(int)); + + return hbp; +} + +void unplug_hist_add(struct io *u_iop) +{ + struct d_info *dip; + + dip = __dip_find(u_iop->t.device); + if (dip && dip->up_hist_handle) { + __u64 *val = u_iop->pdu; + int idx, n_unplugs = be64_to_cpu(*val); + struct hist_bkt *hbp = dip->up_hist_handle; + + idx = (n_unplugs / BKT_WIDTH); + if (idx > EXCESS_BKT) + idx = EXCESS_BKT; + + hbp->hist[idx]++; + } +} + +void unplug_hist_free(void *arg) +{ + if (arg) { + FILE *fp; + struct hist_bkt *hbp = arg; + int mjr = hbp->dev >> MINORBITS; + int mnr = hbp->dev & ((1 << MINORBITS) - 1); + char *oname = malloc(strlen(unplug_hist_name) + 32); + + sprintf(oname, "%s_%03d,%03d.dat", unplug_hist_name, mjr, mnr); + if ((fp = my_fopen(oname, "w")) != NULL) { + int i; + + for (i = 0; i < NBKTS; i++) + fprintf(fp, "%d %d\n", i, hbp->hist[i]); + fclose(fp); + + } else + perror(oname); + + free(oname); + free(hbp); + } +} diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..0be4425 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,15 @@ +DOCTMP = blktrace.log blktrace.aux blktrace.dvi + +all: blktrace.pdf + +blktrace.tex: + @touch blktrace.tex + +blktrace.pdf: blktrace.tex + @latex blktrace.tex + @latex blktrace.tex + @dvipdfm -p a4 blktrace + @rm -rf $(DOCTMP) + +clean: + -rm -f blktrace.pdf $(DOCTMP) diff --git a/doc/blkiomon.8 b/doc/blkiomon.8 new file mode 100644 index 0000000..dbed0df --- /dev/null +++ b/doc/blkiomon.8 @@ -0,0 +1,116 @@ +.TH BLKIOMON 8 "July 17, 2008" "" "" + + +.SH NAME +blkiomon \- monitor block device I/O based o blktrace data + + +.SH SYNOPSIS +.B blkiomon \-I \fIinterval\fR [ \-h \fIfile\fR ] [ \-b \fIfile\fR ] +[ \-D \fIfile\fR ] [ \-Q \fIpath_name\fR +\-q \fImsg_queue_id\fR \-m \fImsg_id\fR ] [ \-V ] +.br + + +.SH DESCRIPTION +blkiomon is a block device I/O monitor. It periodically generates per-device +request size and request latency statistics from blktrace data. It provides +histograms as well as data that can be used to calculate min, max, average +and variance. For this purpose, it consumes D and C traces read from stdin. + +There are options for binary output and human-readable output to files and +stdout. Output to a message queue is supported as well. + +There is no need to use blkparse with blkiomon. blkiomon is capable of +consuming binary output written to stdout by blktrace. + + +.SH OPTIONS + +\-I \fIinterval\fR +.br +\-\-interval=\fIinterval\fR +.RS +Set sample interval +.RE + +\-h \fIfile\fR +.br +\-\-human\-readable=\fIfile\fR +.RS +Human-readable output file. Use '\-' for stdout. +.RE + +\-b \fIfile\fR +.br +\-\-binary=\fIfile\fR +.RS +Binary output file. Use '\-' for stdout. +.RE + +\-D \fIfile\fR +.br +\-\-debug=\fIfile\fR +.RS +Output file for debugging data. Use '\-' for stdout. +.RE + +\-Q \fIpath_name\fR +.br +\-\-msg\-queue=\fIpath_name\fR +.RS +Sets \fIpath_name\fR as path name for existing message queue to be used +for binary output. +.RE + +\-q \fImsg_queue_id\fR +.br +\-\-msg\-queue\-id=\fImsg_queue_id\fR +.RS +Sets \fImsg_queue_id\fR as ID for an existing message queue to be used +for binary output. +.RE + +\-m \fImsg_id\fR +.br +\-\-msg\-id=\fImsg_id\fR +.RS +Sets \fImsg_id\fR as message identifier to be used for binary output +messages written to an existing message queue. +.RE + +\-V +.br +\-\-version +.RS +Print program version. +.RE + + +.SH EXAMPLES +To get I/O statistics for /dev/sdw every 10 seconds for a period of one hour, +use the following command: + + % blktrace /dev/sdw -a issue -a complete -w 3600 -o - | blkiomon -I 10 -h - + + +.SH AUTHORS +blkiomon and this man page were written by Martin Peschke. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + + +.SH COPYRIGHT +Copyright \(co 2008 IBM Corp. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. + + +.SH "SEE ALSO" +btrace (8), blktrace (8), blkparse (1), verify_blkparse (1), blkrawverify (1), +btt (1) + diff --git a/doc/blkparse.1 b/doc/blkparse.1 new file mode 100644 index 0000000..11dab65 --- /dev/null +++ b/doc/blkparse.1 @@ -0,0 +1,567 @@ +.TH BLKPARSE 1 "March 6, 2007" "blktrace git\-20070306202522" "" + + +.SH NAME +blkparse \- produce formatted output of event streams of block devices + + +.SH SYNOPSIS +.B blkparse [ \fIoptions\fR ] +.br + + +.SH DESCRIPTION +The \fIblkparse\fR utility will attempt to combine streams of events for +various devices on various CPUs, and produce a formatted output of the event +information. Specifically, it will take the (machine-readable) output of the +\fIblktrace\fR utility and convert it to a nicely formatted and human-readable +form. + +As with \fIblktrace\fR, some details concerning \fIblkparse\fR +will help in understanding the command line options presented below. + + +.TP 2 +\- +By default, \fIblkparse\fR expects to run in a post-processing mode; one where +the trace events have been saved by a previous run of blktrace, and blkparse +is combining event streams and dumping formatted data. + +blkparse may be run in a live manner concurrently with blktrace by specifying +\fB\-i \-\fR to blkparse, and combining it with the live option for blktrace. +An example would be: + + % blktrace \-d /dev/sda \-o \- | blkparse \-i \- + +.TP 2 +\- +You can set how many blkparse batches event reads via the \fB\-b\fR option, the +default is to handle events in batches of 512. + +.TP 2 +\- +If you have saved event traces in blktrace with different output names (via +the \fB\-o\fR option to blktrace), you must specify the same input name via the +\fB\-i\fR option. + +.TP 2 +\- +The format of the output data can be controlled via the \fB\-f\fR or \fB\-F\fR +options \-\- see OUTPUT DESCRIPTION AND FORMATTING for details. + +.PP +By default, blkparse sends formatted data to standard output. This may +be changed via the \fB\-o\fR option, or text output can be disabled via the +\fB\-O\fR option. A merged binary stream can be produced using the \fB\-d\fR +option. + + + +.SH OPTIONS + +\-b \fIbatch\fR +.br +\-\-batch={batch} +.RS +Standard input read batching +.RE + +\-i \fIfile\fR +.br +\-\-input=\fIfile\fR +.RS +Specifies base name for input files \-\- default is \fIdevice\fR.blktrace.\fIcpu\fR. + +As noted above, specifying \fB\-i \-\fR runs in live mode with blktrace +(reading data from standard in). +.RE + +\-F \fItyp,fmt\fR +.br +\-\-format=\fItyp,fmt\fR +.br +\-f \fIfmt\fR +.br +\-\-format\-spec=\fIfmt\fR +.RS +Sets output format +(See OUTPUT DESCRIPTION AND FORMATTING for details.) + +The \-f form specifies a format for all events + +The \-F form allows one to specify a format for a specific +event type. The single\-character \fItyp\fR field is one of the +action specifiers described in ACTION IDENTIFIERS. +.RE + +\-M +.br +\-\-no-msgs +.RS +When \-d is specified, this will stop messages from being output to the +file. (Can seriously reduce the size of the resultant file when using +the CFQ I/O scheduler.) +.RE + +\-h +.br +\-\-hash\-by\-name +.RS +Hash processes by name, not by PID +.RE + +\-o \fIfile\fR +.br +\-\-output=\fIfile\fR +.RS +Output file +.RE + +\-O +.br +\-\-no\-text\-output +.RS +Do \fInot\fR produce text output, used for binary (\fB\-d\fR) only +.RE + +\-d \fIfile\fR +.br +\-\-dump\-binary=\fIfile\fR +.RS +Binary output file +.RE + +\-q +.br +\-\-quiet +.RS +Quiet mode +.RE + +\-s +.br +\-\-per\-program\-stats +.RS +Displays data sorted by program +.RE + +\-t +.br +\-\-track\-ios +.RS +Display time deltas per IO +.RE + +\-w \fIspan\fR +.br +\-\-stopwatch=\fIspan\fR +.RS +Display traces for the \fIspan\fR specified \-\- where span can be: +.br +\fIend\-time\fR \-\- Display traces from time 0 through \fIend\-time\fR (in ns) +.br +or +.br +\fIstart:end\-time\fR \-\- Display traces from time \fIstart\fR +through end\-time (in ns). +.RE + +\-v +.br +\-\-verbose +.RS +More verbose marginal on marginal errors +.RE + +\-V +.br +\-\-version +.RS +Display version +.RE + + +.SH "TRACE ACTIONS" +The following trace actions are recognised: + +.HP 4 +\fBC -- complete\fR +A previously issued request has been completed. The output will detail the +sector and size of that request, as well as the success or failure of it. + +.HP 4 +\fBD -- issued\fR +A request that previously resided on the block layer queue or in the i/o +scheduler has been sent to the driver. + +.HP 4 +\fBI -- inserted\fR +A request is being sent to the i/o scheduler for addition to the internal queue +and later service by the driver. The request is fully formed at this time. + +.HP 4 +\fBQ -- queued\fR +This notes intent to queue i/o at the given location. No real requests exists +yet. + +.HP 4 +\fBB -- bounced\fR +The data pages attached to this \fIbio\fR are not reachable by the hardware +and must be bounced to a lower memory location. This causes a big slowdown in +i/o performance, since the data must be copied to/from kernel buffers. Usually +this can be fixed with using better hardware -- either a better i/o controller, +or a platform with an IOMMU. + +.HP 4 +\fBM -- back merge\fR +A previously inserted request exists that ends on the boundary of where this i/o +begins, so the i/o scheduler can merge them together. + +.HP 4 +\fBF -- front merge\fR +Same as the back merge, except this i/o ends where a previously inserted +requests starts. + +.HP 4 +\fBM --front or back merge\fR +One of the above + +.HP 4 +\fBM -- front or back merge\fR +One of the above. + +.HP 4 +\fBG -- get request\fR +To send any type of request to a block device, a \fIstruct request\fR +container must be allocated first. + +.HP 4 +\fBS -- sleep\fR +No available request structures were available, so the issuer has to wait for +one to be freed. + +.HP 4 +\fBP -- plug\fR +When i/o is queued to a previously empty block device queue, Linux will plug the +queue in anticipation of future ios being added before this data is needed. + +.HP 4 +\fBU -- unplug\fR +Some request data already queued in the device, start sending requests to the +driver. This may happen automatically if a timeout period has passed (see next +entry) or if a number of requests have been added to the queue. + +.HP 4 +\fBT -- unplug due to timer\fR +If nobody requests the i/o that was queued after plugging the queue, Linux will +automatically unplug it after a defined period has passed. + +.HP 4 +\fBX -- split\fR +On raid or device mapper setups, an incoming i/o may straddle a device or +internal zone and needs to be chopped up into smaller pieces for service. This +may indicate a performance problem due to a bad setup of that raid/dm device, +but may also just be part of normal boundary conditions. dm is notably bad at +this and will clone lots of i/o. + +.HP 4 +\fBA -- remap\fR +For stacked devices, incoming i/o is remapped to device below it in the i/o +stack. The remap action details what exactly is being remapped to what. + + + + +.SH "OUTPUT DESCRIPTION AND FORMATTING" + +The output from blkparse can be tailored for specific use -- in particular, to ease +parsing of output, and/or limit output fields to those the user wants to see. The +data for fields which can be output include: + +.IP \fBa\fR 4 +Action, a (small) string (1 or 2 characters) -- see table below for more details + +.IP \fBc\fR 4 +CPU id + +.IP \fBC\fR 4 +Command + +.IP \fBd\fR 4 +RWBS field, a (small) string (1-3 characters) -- see section below for more details + +.IP \fBD\fR 4 +7-character string containing the major and minor numbers of +the event's device (separated by a comma). + +.IP \fBe\fR 4 +Error value + +.IP \fBm\fR 4 +Minor number of event's device. + +.IP \fBM\fR 4 +Major number of event's device. + +.IP \fBn\fR 4 +Number of blocks + +.IP \fBN\fR 4 +Number of bytes + +.IP \fBp\fR 4 +Process ID + +.IP \fBP\fR 4 +Display packet data \-\- series of hexadecimal values + +.IP \fBs\fR 4 +Sequence numbers + +.IP \fBS\fR 4 +Sector number + +.IP \fBt\fR 4 +Time stamp (nanoseconds) + +.IP \fBT\fR 4 +Time stamp (seconds) + +.IP \fBu\fR 4 +Elapsed value in microseconds (\fI\-t\fR command line option) + +.IP \fBU\fR 4 +Payload unsigned integer + +.PP +Note that the user can optionally specify field display width, and optionally a +left-aligned specifier. These precede field specifiers, with a '%' character, +followed by the optional left-alignment specifier (\-) followed by the width (a +decimal number) and then the field. + +Thus, to specify the command in a 12-character field that is left aligned: + + \-f "%\-12C" + + +.SH "ACTION IDENTIFIERS" + +The following table shows the various actions which may be output: + +.IP A +IO was remapped to a different device + +.IP B +IO bounced + +.IP C +IO completion + +.IP D +IO issued to driver + +.IP F +IO front merged with request on queue + +.IP G +Get request + +.IP I +IO inserted onto request queue + +.IP M +IO back merged with request on queue + +.IP P +Plug request + +.IP Q +IO handled by request queue code + +.IP S +Sleep request + +.IP T +Unplug due to timeout + +.IP U +Unplug request + +.IP X +Split + + +.SH "RWBS DESCRIPTION" + +This is a small string containing at least one character ('R' for read, 'W' +for write, or 'D' for block discard operation), and optionally either +a 'B' (for barrier operations) or 'S' (for synchronous operations). + + +.SH "DEFAULT OUTPUT" + +The standard header (or initial fields displayed) include: + + "%D %2c %8s %5T.%9t %5p %2a %3d" + +Breaking this down: + +.IP \fB%D\fR +Displays the event's device major/minor as: %3d,%\-3d. + +.IP \fB%2c\fR +CPU ID (2-character field). + +.IP \fB%8s\fR +Sequence number + +.IP \fB%5T.%9t\fR +5-character field for the seconds portion of the time stamp and a 9-character field for the nanoseconds in the time stamp. + +.IP \fB%5p\fR +5-character field for the process ID. + +.IP \fB%2a\fR +2-character field for one of the actions. + +.IP \fB%3d\fR +3-character field for the RWBS data. + +Seeing this in action: + + 8,0 3 1 0.000000000 697 G W 223490 + 8 [kjournald] + +The header is the data in this line up to the 223490 (starting block). +The default output for all event types includes this header. + + + +.SH "DEFAULT OUTPUT PER ACTION" + +\fBC \-\- complete\fR +.RS 4 +If a payload is present, this is presented between +parenthesis following the header, followed by the error value. + +If no payload is present, the sector and number of blocks are presented +(with an intervening plus (+) character). If the \fB\-t\fR option +was specified, then the elapsed time is presented. In either case, +it is followed by the error value for the completion. +.RE + +\fBB \-\- bounced\fR +.br +\fBD \-\- issued\fR +.br +\fBI \-\- inserted\fR +.br +\fBQ \-\- queued\fR +.RS 4 +If a payload is present, the number of payload bytes +is output, followed by the payload in hexadecimal between parenthesis. + +If no payload is present, the sector and number of blocks are presented +(with an intervening plus (+) character). If the \fB\-t\fR option was +specified, then the elapsed time is presented (in parenthesis). In +either case, it is followed by the command associated with the event +(surrounded by square brackets). +.RE + +\fBF \-\- front merge\fR +.br +\fBG \-\- get request\fR +.br +\fBM \-\- back merge\fR +.br +\fBS \-\- sleep\fR +.RS 4 +The starting sector and number of blocks is output +(with an intervening plus (+) character), followed by the command +associated with the event (surrounded by square brackets). +.RE + +\fBP \-\- plug\fR +.RS 4 +The command associated with the event (surrounded by +square brackets) is output. +.RE + +\fBU \-\- unplug\fR +.br +\fBT \-\- unplug due to timer\fR +.RS 4 +The command associated with the event +(surrounded by square brackets) is output, followed by the number of +requests outstanding. +.RE + +\fBX \-\- split\fR +.RS 4 +The original starting sector followed by the new +sector (separated by a slash (/) is output, followed by the command +associated with the event (surrounded by square brackets). +.RE + +\fBA \-\- remap\fR +.RS 4 +Sector and length is output, along with the original +device and sector offset. +.RE + + +.SH EXAMPLES +To trace the i/o on the device \fI/dev/hda\fB and parse the output to human +readable form, use the following command: + + % blktrace \-d /dev/sda \-o \- | blkparse \-i \- + +(see \fIblktrace\fR (8) for more information). +This same behaviour can be achieve with the convenience script \fIbtrace\fR. +The command + + % btrace /dev/sda + +has exactly the same effect as the previous command. See \fIbtrace\fR (8) for +more information. + +To trace the i/o on a device and save the output for later processing with +\fIblkparse\fR, use \fIblktrace\fR like this: + + % blktrace /dev/sda /dev/sdb + +This will trace i/o on the devices \fI/dev/sda\fR and \fI/dev/sdb\fR and save +the recorded information in the files \fIsda\fR and \fIsdb\fR in the current +directory, for the two different devices, respectively. This trace +information can later be parsed by the \fIblkparse\fR utility: + + % blkparse sda sdb + +which will output the previously recorded tracing information in human +readable form to stdout. + + +.SH AUTHORS +\fIblkparse\fR was written by Jens Axboe, Alan D. Brunelle and Nathan Scott. This +man page was created from the \fIblktrace\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2006 Jens Axboe, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +btrace (8), blktrace (8), verify_blkparse (1), blkrawverify (1), btt (1) + diff --git a/doc/blkrawverify.1 b/doc/blkrawverify.1 new file mode 100644 index 0000000..9d3b4bc --- /dev/null +++ b/doc/blkrawverify.1 @@ -0,0 +1,47 @@ +.TH BLKRAWVERIFY 1 "March 6, 2007" "blktrace git\-20070306202522" "" + + +.SH NAME +blkrawverify \- verifies an output file produced by blkparse + + +.SH SYNOPSIS +.B blkrawverify <\fIdev\fR> [<\fIdev\fR>...] +.br + + +.SH DESCRIPTION + +The \fIblkrawverify\fR utility can be used to verify data retrieved via +\fIblktrace\fR. It will check for valid event formats, forward progressing +sequence numbers and time stamps, also does reasonable checks for other +potential issues within individual events. + +Errors found will be tracked in <\fIdev\fR>.verify.out. + + +.SH AUTHORS +\fIblkparse\fR was written by Jens Axboe, Alan D. Brunelle and Nathan Scott. This +man page was created from the \fIblktrace\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2006 Jens Axboe, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +btrace (8), blktrace (8), blkparse (1), verify_blkparse (1), btt (1) + diff --git a/doc/blktrace.8 b/doc/blktrace.8 new file mode 100644 index 0000000..58e8f90 --- /dev/null +++ b/doc/blktrace.8 @@ -0,0 +1,259 @@ +.TH BLKTRACE 8 "March 6, 2007" "blktrace git\-20070306202522" "" + + +.SH NAME +blktrace \- generate traces of the i/o traffic on block devices + + +.SH SYNOPSIS +.B blktrace \-d \fIdev\fR [ \-r \fIdebugfs_path\fR ] [ \-o \fIoutput\fR ] [\-k ] [ \-w \fItime\fR ] [ \-a \fIaction\fR ] [ \-A \fIaction_mask\fR ] [ \-v ] +.br + + +.SH DESCRIPTION +blktrace is a block layer IO tracing mechanism which provides detailed +information about request queue operations up to user space. There are three +major components: a kernel component, a utility to record the i/o trace +information for the kernel to user space, and utilities to analyse and view the +trace information. This man page describes blktrace, which records the i/o event +trace information for a specific block device to a file. + +The \fBblktrace\fR utility extracts event traces from the kernel (via +the relaying through the debug file system). Some background details +concerning the run\-time behaviour of blktrace will help to understand some +of the more arcane command line options: + +.TP 2 +\- +blktrace receives data from the kernel in buffers passed up through the +debug file system (relay). Each device being traced has a file created in +the mounted directory for the debugfs, which defaults to +\fI/sys/kernel/debug\fR \-\- this can be overridden with the \fB\-r\fR command +line argument. + +.TP 2 +\- +blktrace defaults to collecting all events that can be traced. To +limit the events being captured, you can specify one or more filter masks +via the \fB\-a\fR option. + +Alternatively, one may specify the entire mask utilising a hexadecimal +value that is version\-specific. (Requires understanding of the internal +representation of the filter mask.) + +.TP 2 +\- +As noted above, the events are passed up via a series of buffers stored +into debugfs files. The size and number of buffers can be specified via +the \fB\-b\fR and \fB\-n\fR arguments respectively. + +.TP 2 +\- +blktrace stores the extracted data into files stored in the +local directory. The format of the file names is (by default) +\fBdevice\fR.\fBblktrace\fR.\fBcpu\fR, where \fBdevice\fR is the base +device name (e.g, if we are tracing /dev/sda, the base device name would +be \fBsda\fR); and \fBcpu\fR identifies a CPU for the event stream. + +The \fBdevice\fR portion of the event file name can be changed via +the \fB\-o\fR option. + +.TP 2 +\- +blktrace may also be run concurrently with blkparse to produce +\fBlive\fR output \-\- to do this specify \fB\-o \-\fR for blktrace. + +.TP 2 +\- +The default behaviour for blktrace is to run forever until explicitly +killed by the user (via a control-C, or kill utility invocation). +There are two ways to modify this: + +.TP 5 + 1. +You may utilise the blktrace utility itself to kill +a running trace -- via the \fB\-k\fR option. + +.TP 5 + 2. +You can specify a run-time duration for blktrace via the +\fB\-w\fR option -- then blktrace will run for the specified number +of seconds, and then halt. + + +.SH OPTIONS + +\-A \fIhex-mask\fR +.br +\-\-set-mask=\fIhex-mask\fR +.RS +Set filter mask to \fIhex-mask\fR (see below for masks) +.RE + +\-a \fImask\fR +.br +\-\-act-mask=\fImask\fR +.RS +Add \fImask\fR to current filter (see below for masks) +.RE + +\-b \fIsize\fR +.br +\-\-buffer\-size=\fIsize\fR +.RS +Specifies buffer size for event extraction (scaled by 1024). The default +buffer size is 512KiB. +.RE + +\-d \fIdev\fR +.br +\-\-dev=\fIdev\fR +.RS +Adds \fIdev\fR as a device to trace +.RE + +\-I \fIfile\fR +.br +\-\-input-devs=\fIfile\fR +.RS +Adds the devices found in \fIfile\fR as devices to trace +.RE + +\-k +.br +\-\-kill +.RS +Kill on-going trace +.RE + +\-n \fInum\-sub\fR +.br +\-\-num\-sub=\fInum-sub\fR +.RS +Specifies number of buffers to use. blktrace defaults to 4 sub buffers. +.RE + +\-o \fIfile\fR +.br +\-\-output=\fIfile\fR +.RS +Prepend \fIfile\fR to output file name(s) +.RE + +\-r \fIrel-path\fR +.br +\-\-relay=\fIrel-path\fR +.RS +Specifies debugfs mount point +.RE + +\-V +.br +\-\-version +Outputs version +.RE + +\-w \fIseconds\fR +.br +\-\-stopwatch=\fIseconds\fR +.RS +Sets run time to the number of seconds specified +.RE + + +.SH FILTER MASKS +The following masks may be passed with the \fI\-a\fR command line +option, multiple filters may be combined via multiple \fI\-a\fR command +line options. + +.RS +\fIbarrier\fR: barrier attribute +.br +\fIcomplete\fR: completed by driver +.br +\fIfs\fR: requests +.br +\fIissue\fR: issued to driver +.br +\fIpc\fR: packet command events +.br +\fIqueue\fR: queue operations +.br +\fIread\fR: read traces +.br +\fIrequeue\fR: requeue operations +.br +\fIsync\fR: synchronous attribute +.br +\fIwrite\fR: write traces +.br +\fInotify\fR: trace messages +.RE + + +.SH REQUEST TYPES +blktrace distinguishes between two types of block layer requests, file system +and SCSI commands. The former are dubbed \fBfs\fR requests, the latter +\fBpc\fR requests. File system requests are normal read/write operations, i.e. +any type of read or write from a specific disk location at a given size. These +requests typically originate from a user process, but they may also be +initiated by the vm flushing dirty data to disk or the file system syncing a +super or journal block to disk. \fBpc\fR requests are SCSI commands. blktrace +sends the command data block as a payload so that blkparse can decode it. + + +.SH EXAMPLES +To trace the i/o on the device \fI/dev/hda\fR and parse the output to human +readable form, use the following command: + + % blktrace \-d /dev/sda \-o \- | blkparse \-i \- + +This same behaviour can be achieve with the convenience script \fIbtrace\fR. +The command + + % btrace /dev/sda + +has exactly the same effect as the previous command. See \fIbtrace\fR (8) for +more information. + +To trace the i/o on a device and save the output for later processing with +\fIblkparse\fR, use \fIblktrace\fR like this: + + % blktrace /dev/sda /dev/sdb + +This will trace i/o on the devices \fI/dev/sda\fR and \fI/dev/sdb\fR and save +the recorded information in the files \fIsda\fR and \fIsdb\fR in the current +directory, for the two different devices, respectively. This trace +information can later be parsed by the \fIblkparse\fR utility: + + % blkparse sda sdb + +which will output the previously recorded tracing information in human +readable form to stdout. See \fIblkparse\fR (1) for more information. + + +.SH AUTHORS +blktrace was written by Jens Axboe, Alan D. Brunelle and Nathan Scott. This +man page was created from the blktrace documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2006 Jens Axboe, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +btrace (8), blkparse (1), verify_blkparse (1), blkrawverify (1), btt (1) + diff --git a/doc/blktrace.tex b/doc/blktrace.tex new file mode 100644 index 0000000..54fe451 --- /dev/null +++ b/doc/blktrace.tex @@ -0,0 +1,814 @@ +\documentclass{article} + +% +% Copyright (C) 2005, 2006 Alan D. Brunelle <Alan.Brunelle@hp.com> +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +% + +\title{blktrace User Guide} +\author{blktrace: Jens Axboe (jens.axboe@oracle.com)\\ + User Guide: Alan D. Brunelle (Alan.Brunelle@hp.com)} +\date{27 May 2008} + +\begin{document} +\maketitle +%--------------------- +\section{\label{sec:intro}Introduction} + +blktrace is a block layer IO tracing mechanism which provides detailed +information about request queue operations up to user space. There are +three major components that are provided: + +\begin{description} + \item[Kernel patch] A patch to the Linux kernel which includes the + kernel event logging interfaces, and patches to areas within the block + layer to emit event traces. If you run a 2.6.17-rc1 or newer kernel, + you don't need to patch blktrace support as it is already included. + + \item[blktrace] A utility which transfers event traces from the kernel + into either long-term on-disk storage, or provides direct formatted + output (via blkparse). + + \item[blkparse] A utility which formats events stored in files, or when + run in \emph{live} mode directly outputs data collected by blktrace. +\end{description} + +\subsection{blktrace Download Area} + +The blktrace and blkparse utilities and associated kernel patch are provided +as part of the following git repository: + +git://git.kernel.org/pub/scm/linux/kernel/git/axboe/blktrace.git bt + +%-------------------------- +\newpage\section{\label{sec:quick-start}Quick Start Guide} + +The following sections outline some quick steps towards utilizing +blktrace. Some of the specific instructions below may need to be tailored +to your environment. + +\subsection{\label{sec:get-blktrace}Retrieving blktrace} + +As noted above, the kernel patch along with the blktrace and blkparse utilities are stored in a git repository. One simple way to get going would be: + +\begin{verbatim} +% git clone git://git.kernel.org/pub/scm/linux/kernel/git/axboe/blktrace.git bt +% cd bt +% git checkout +\end{verbatim} + +\subsection{\label{sec:patching}Patching and configuring the Linux kernel} + +A patch for a \emph{specific Linux kernel} is provided in bt/kernel (where +\emph{bt} is the name of the directory from the above git sequence). The +detailed actual patching instructions for a Linux kernel is outside the +scope of this document, but the following may be used as a sample template. +Note that you may skip this step, if you kernel is at least 2.6.17-rc1. + +As an example, bt/kernel contains blk-trace-2.6.14-rc1-git-G2, download +linux-2.6.13.tar.bz2 and patch-2.6.14-rc1.bz2 + +\begin{verbatim} +% tar xjf linux-2.6.13.tar.bz2 +% mv linux-2.6.13 linux-2.6.14-rc1 +% cd linux-2.6.14-rc1 +% bunzip2 -c ../patch-2.6.14-rc1.bz2 | patch -p1 +\end{verbatim} + +At this point you may (optionally) remove linux-2.6.13.tar.bz2 and +patch-2.6.14-rc1.bz2. + +At this point you should configure the Linux kernel for your specific +system -- again, outside the scope of this document -- and then enable +\emph{Support for tracing block io actions.} To do this, run + +\begin{verbatim} +% make menuconfig or make xconfig, or edit .config, or ... +\end{verbatim} + +and navigate through \emph{Device Drivers} and \emph{Block devices} +and then down to \emph{Support for tracing block io actions} and hit Y. + +Install the new kernel (and modules\ldots) and reboot. + +\subsection{\label{sec:mount}Mounting the debugfs file system} + +blktrace utilizes files under the debug file system, and thus must have +the mount point set up -- mounted on the directory /sys/kernel/debug. +To do this one may do either of the following: + +\begin{enumerate} + \item Manually mount after each boot: +\begin{verbatim} +% mount -t debugfs debugfs /sys/kernel/debug +\end{verbatim} + + \item Add an entry into /etc/fstab, and have it done automatically at + each boot\footnote{Note: after adding the entry to /etc/fstab, you + could then mount the directory this time only by doing: \% mount debug}: +\begin{verbatim} +debug /sys/kernel/debug debugfs default 0 0 +\end{verbatim} +\end{enumerate} + +\subsection{\label{sec:build}Build the tools} + +To build and install the tools, execute the following sequence (as root): + +\begin{verbatim} +% cd bt +% make && make install +\end{verbatim} + +\subsection{\label{sec:live-blktrace}blktrace -- live} + +Now to simply watch what is going on for a specific disk (to stop the +trace, hit control-C): + +\begin{verbatim} +% blktrace -d /dev/sda -o - | blkparse -i - + 8,0 3 1 0.000000000 697 G W 223490 + 8 [kjournald] + 8,0 3 2 0.000001829 697 P R [kjournald] + 8,0 3 3 0.000002197 697 Q W 223490 + 8 [kjournald] + 8,0 3 4 0.000005533 697 M W 223498 + 8 [kjournald] + 8,0 3 5 0.000008607 697 M W 223506 + 8 [kjournald] + 8,0 3 6 0.000011569 697 M W 223514 + 8 [kjournald] + 8,0 3 7 0.000014407 697 M W 223522 + 8 [kjournald] + 8,0 3 8 0.000017367 697 M W 223530 + 8 [kjournald] + 8,0 3 9 0.000020161 697 M W 223538 + 8 [kjournald] + 8,0 3 10 0.000024062 697 D W 223490 + 56 [kjournald] + 8,0 1 11 0.009507758 0 C W 223490 + 56 [0] + 8,0 1 12 0.009538995 697 G W 223546 + 8 [kjournald] + 8,0 1 13 0.009540033 697 P R [kjournald] + 8,0 1 14 0.009540313 697 Q W 223546 + 8 [kjournald] + 8,0 1 15 0.009542980 697 D W 223546 + 8 [kjournald] + 8,0 1 16 0.013542170 0 C W 223546 + 8 [0] +... +^C +... +CPU1 (8,0): + Reads Queued: 0, 0KiB Writes Queued: 7, 128KiB + Read Dispatches: 0, 0KiB Write Dispatches: 7, 128KiB + Reads Completed: 0, 0KiB Writes Completed: 11, 168KiB + Read Merges: 0 Write Merges: 25 + IO unplugs: 0 Timer unplugs: 0 +... +CPU3 (8,0): + Reads Queued: 0, 0KiB Writes Queued: 1, 28KiB + Read Dispatches: 0, 0KiB Write Dispatches: 1, 28KiB + Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB + Read Merges: 0 Write Merges: 6 + IO unplugs: 0 Timer unplugs: 0 + +Total (8,0): + Reads Queued: 0, 0KiB Writes Queued: 11, 168KiB + Read Dispatches: 0, 0KiB Write Dispatches: 11, 168KiB + Reads Completed: 0, 0KiB Writes Completed: 11, 168KiB + Read Merges: 0 Write Merges: 31 + IO unplugs: 0 Timer unplugs: 3 + +Events (8,0): 89 entries, 0 skips +\end{verbatim} + +A \emph{btrace} script is included in the distribution to ease live +tracing of devices. The above could also be accomplished by issuing: + +\begin{verbatim} +% btrace /dev/sda +\end{verbatim} + +By default, \emph{btrace} runs the trace in quiet mode so it will not +include statistics when you break the run. Add the \emph{-S} option to +get that dumped as well. + +\subsection{\label{sec:pc-blktrace}blktrace -- SCSI commands} + +The previous section showed typical file system io actions, but blktrace +can also show SCSI commands going in and out of the queue as submitted +by applications using the SCSI Generic (\emph{sg}) interface. + +\begin{verbatim} +% btrace /dev/cdrom +[...] + 3,0 0 25 0.004884107 13528 G R 0 + 0 [inquiry] + 3,0 0 26 0.004890361 13528 I R 56 (12 00 00 00 38 ..) [inquiry] + 3,0 0 27 0.004891223 13528 P R [inquiry] + 3,0 0 28 0.004893250 13528 D R 56 (12 00 00 00 38 ..) [inquiry] + 3,0 0 29 0.005344910 0 C R (12 00 00 00 38 ..) [0] +\end{verbatim} + +Here we see a program issuing an INQUIRY command to the CDROM device. +The program requested a read of 56 bytes of data, the CDB is included +in parenthesis after the data length. The completion event shows shows +that the command completed successfully. Tracing SCSI commands can be +very useful for debugging problems with programs talking directly to the +device. An example of that would be \emph{cdrecord} burning. + +\subsection{\label{sec:blktrace-post}blktrace -- post-processing} + +Another way to run blktrace is to have blktrace save data away for later +formatting by blkparse. This would be useful if you want to get +measurements while running specific loads. + +To do this, one would specify the device (or devices) to be watched. Then +go run you test cases. Stop the trace, and at your leisure utilize +blkparse to see the results. + +In this example, devices /dev/sdaa, /dev/sdc and /dev/sdo are used in an +LVM volume called adb3/vol. + +\begin{verbatim} +% blktrace /dev/sdaa /dev/sdc /dev/sdo & +[1] 9713 +% +% mkfs -t ext3 /dev/adb3/vol +mke2fs 1.35 (28-Feb-2004) +Filesystem label= +OS type: Linux +Block size=4096 (log=2) +Fragment size=4096 (log=2) +16793600 inodes, 33555456 blocks +1677772 blocks (5.00%) reserved for the super user +First data block=0 +Maximum filesystem blocks=4294967296 +1025 block groups +32768 blocks per group, 32768 fragments per group +16384 inodes per group +Superblock backups stored on blocks: + 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, + 4096000, 7962624, 11239424, 20480000, 23887872 + +Writing inode tables: done +Creating journal (8192 blocks): done +Writing superblocks and filesystem accounting information: done + +This filesystem will be automatically checked every 27 mounts or +180 days, whichever comes first. Use tune2fs -c or -i to override. +% +% kill -15 9713 +\end{verbatim} + +Then you could process the events later: + +\begin{verbatim} +% +% blkparse sdaa sdc sdo > events +% less events + 8,32 1 1 0.000000000 9728 G R 384 + 32 [mkfs.ext3] + 8,32 1 2 0.000001959 9728 P R [mkfs.ext3] + 8,32 1 3 0.000002446 9728 Q R 384 + 32 [mkfs.ext3] + 8,32 1 4 0.000005110 9728 D R 384 + 32 [mkfs.ext3] + 8,32 3 5 0.000200570 0 C R 384 + 32 [0] + 8,224 3 1 0.021658989 9728 G R 384 + 32 [mkfs.ext3] +... + 65,160 3 163392 41.117070504 0 C W 87469088 + 1376 [0] + 8,32 3 163374 41.122683668 0 C W 88168160 + 1376 [0] + 65,160 3 163393 41.129952433 0 C W 87905984 + 1376 [0] + 65,160 3 163394 41.130049431 0 D W 89129344 + 1376 [swapper] + 65,160 3 163395 41.130067135 0 D W 89216704 + 1376 [swapper] + 65,160 3 163396 41.130083785 0 D W 89304096 + 1376 [swapper] + 65,160 3 163397 41.130099455 0 D W 89391488 + 1376 [swapper] + 65,160 3 163398 41.130114732 0 D W 89478848 + 1376 [swapper] + 65,160 3 163399 41.130128885 0 D W 89481536 + 64 [swapper] + 8,32 3 163375 41.134758196 0 C W 86333152 + 1376 [0] + 65,160 3 163400 41.142229726 0 C W 89129344 + 1376 [0] + 65,160 3 163401 41.144952314 0 C W 89481536 + 64 [0] + 8,32 3 163376 41.147441930 0 C W 88342912 + 1376 [0] + 65,160 3 163402 41.155869604 0 C W 89478848 + 1376 [0] + 8,32 3 163377 41.159466082 0 C W 86245760 + 1376 [0] + 65,160 3 163403 41.166944976 0 C W 89216704 + 1376 [0] + 65,160 3 163404 41.178968252 0 C W 89304096 + 1376 [0] + 65,160 3 163405 41.191860173 0 C W 89391488 + 1376 [0] +... +Events (sdo): 0 entries, 0 skips + +CPU0 (65,160): + Reads Queued: 0, 0KiB Writes Queued: 9, 5,520KiB + Read Dispatches: 0, 0KiB Write Dispatches: 0, 0KiB + Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB + Read Merges: 0 Write Merges: 336 + IO unplugs: 0 Timer unplugs: 0 +CPU1 (65,160): + Reads Queued: 2,411, 38,576KiB Writes Queued: 769, 425,408KiB + Read Dispatches: 2,407, 38,512KiB Write Dispatches: 118, 61,680KiB + Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB + Read Merges: 0 Write Merges: 25,819 + IO unplugs: 0 Timer unplugs: 4 +CPU2 (65,160): + Reads Queued: 2, 32KiB Writes Queued: 18, 10,528KiB + Read Dispatches: 2, 32KiB Write Dispatches: 3, 1,344KiB + Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB + Read Merges: 0 Write Merges: 640 + IO unplugs: 0 Timer unplugs: 0 +CPU3 (65,160): + Reads Queued: 20,572, 329,152KiB Writes Queued: 594, 279,712KiB + Read Dispatches: 20,576, 329,216KiB Write Dispatches: 1,474, 740,720KiB + Reads Completed: 22,985, 367,760KiB Writes Completed: 1,390, 721,168KiB + Read Merges: 0 Write Merges: 16,888 + IO unplugs: 0 Timer unplugs: 0 + +Total (65,160): + Reads Queued: 22,985, 367,760KiB Writes Queued: 1,390, 721,168KiB + Read Dispatches: 22,985, 367,760KiB Write Dispatches: 1,595, 803,744KiB + Reads Completed: 22,985, 367,760KiB Writes Completed: 1,390, 721,168KiB + Read Merges: 0 Write Merges: 43,683 + IO unplugs: 0 Timer unplugs: 4 +... +\end{verbatim} + +%---------------------------- +\newpage\section{\label{sec:blktrace-ug}blktrace User Guide} + +The \emph{blktrace} utility extracts event traces from the kernel (via +the relaying through the debug file system). Some background details +concerning the run-time behaviour of blktrace will help to understand some +of the more arcane command line options: + +\begin{itemize} + \item blktrace receives data from the kernel in buffers passed up + through the debug file system (relay). Each device being traced has + a file created in the mounted directory for the debugfs, which defaults + to \emph{/sys/kernel/debug} -- this can be overridden with the \emph{-r} + command line argument. + + \item blktrace defaults to collecting \emph{all} events that can be + traced. To limit the events being captured, you can specify one or + more filter masks via the \emph{-a} option. + + Alternatively, one may specify the entire mask utilizing a hexadecimal + value that is version-specific. (Requires understanding of the internal + representation of the filter mask.) + + \item As noted above, the events are passed up via a series of buffers + stored into debugfs files. The size and number of buffers can be + specified via the \emph{-b} and \emph{-n} arguments respectively. + + \item blktrace stores the extracted data into files stored in the + \emph{local} directory. The format of the file names is (by default) + \emph{device}.blktrace.\emph{cpu}, where \emph{device} is the base + device name (e.g, if we are tracing /dev/sda, the base device name would + be \emph{sda}); and \emph{cpu} identifies a CPU for the event stream. + + The \emph{device} portion of the event file name can be changed via + the \emph{-o} option. + + \item blktrace may also be run concurrently with blkparse to produce + \emph{live} output -- to do this specify \emph{-o -} for blktrace. + + \item The default behaviour for blktrace is to run forever until explicitly killed by the user (via a control-C, or \emph{kill} utility invocation). There are two ways to modify this: + + \begin{enumerate} + \item You may utilize the blktrace utility itself to \emph{kill} + a running trace -- via the \emph{-k} option. + + \item You can specify a run-time duration for blktrace via the + \emph{-w} option -- then blktrace will run for the specified number + of seconds, and then halt. + \end{enumerate} +\end{itemize} + +\subsection{\label{sec:blktrace-args}Command line arguments} +\begin{tabular}{|l|l|l|}\hline +Short & Long & Description \\ \hline\hline +-A \emph{hex-mask} & --set-mask=\emph{hex-mask} & Set filter mask to \emph{hex-mask} \\ \hline +-a \emph{mask} & --act-mask=\emph{mask} & Add \emph{mask} to current filter (see below for masks) \\ \hline +-b \emph{size} & --buffer-size=\emph{size} & Specifies buffer size for event extraction (scaled by $2^{10}$) \\ \hline +-d \emph{dev} & --dev=\emph{dev} & Adds \emph{dev} as a device to trace \\ \hline +-k & --kill & Kill on-going trace \\ \hline +-n \emph{num-sub} & --num-sub=\emph{num-sub} & Specifies number of buffers to use \\ \hline +-o \emph{file} & --output=\emph{file} & Prepend \emph{file} to output file name(s) \\ \hline +-r \emph{rel-path} & --relay=\emph{rel-path} & Specifies debugfs mount point \\ \hline +-V & --version & Outputs version \\ \hline +-w \emph{seconds} & --stopwatch=\emph{seconds} & Sets run time to the number of seconds specified \\ \hline +-I \emph{devs file}& --input-devs=\emph{devs file}& Adds devices found in \emph{devs file} to list of devices to trace. \\ + & & (One device per line.) \\ \hline +\end{tabular} + +\subsubsection{\label{sec:filter-mask}Filter Masks} +The following masks may be passed with the \emph{-a} command line +option, multiple filters may be combined via multiple \emph{-a} command +line options.\smallskip + +\begin{tabular}{|l|l|}\hline +barrier & \emph{barrier} attribute \\ \hline +complete & \emph{completed} by driver \\ \hline +fs & \emph{FS} requests \\ \hline +issue & \emph{issued} to driver \\ \hline +pc & \emph{packet command} events \\ \hline +queue & \emph{queue} operations \\ \hline +read & \emph{read} traces \\ \hline +requeue & \emph{requeue} operations \\ \hline +sync & \emph{synchronous} attribute \\ \hline +write & \emph{write} traces \\ \hline +notify & \emph{notify} trace messages \\ \hline +\end{tabular} + +\subsubsection{\label{sec:request-types}Request types} +blktrace disguingishes between two types of block layer requests, +file system and scsi commands. The former are dubbed \emph{fs} +requests, the latter \emph{pc} requests. File system requests are +normal read/write operations, ie any type of read or write from a +specific disk location at a given size. These requests typically +originate from a user process, but they may also be initiated by +the vm flushing dirty data to disk or the file system syncing +a super or journal block to disk. \emph{pc} requests are SCSI +commands. blktrace sends the command data block as a payload +so that blkparse can decode it. + +%---------------------------- +\newpage\section{\label{sec:blkparse-ug}blkparse User Guide} + +The \emph{blkparse} utility will attempt to combine streams of events +for various devices on various CPUs, and produce a formatted output of +the event information. As with blktrace, some details concerning blkparse +will help in understanding the command line options presented below. + +\begin{itemize} + \item By default, blkparse expects to run in a post-processing mode + -- one where the trace events have been saved by a previous run + of blktrace, and blkparse is combining event streams and dumping + formatted data. + + blkparse \emph{may} be run in a \emph{live} manner concurrently with + blktrace by specifying \emph{-i -} to blkparse, and combining it with + the live option for blktrace. An example would be: + + \begin{verbatim} + % blktrace -d /dev/sda -o - | blkparse -i - + \end{verbatim} + + \item You can set how many blkparse batches event reads via the + \emph{-b} option, the default is to handle events in batches of 512. + + \item If you have saved event traces in blktrace with different output + names (via the \emph{-o} option to blktrace), you must specify the + same \emph{input} name via the \emph{-i} option. + + \item The format of the output data can be controlled via the \emph{-f} + or \emph{-F} options -- see section~\ref{sec:blkparse-format} for details. + + By default, blkparse sends formatted data to standard output. This may + be changed via the \emph{-o} option, or text output can be disabled + via the\emph{-O} option. A merged binary stream can be produced using + the \emph{-d} option. + +\end{itemize} + +\newpage\subsection{\label{sec:blkparse-args}Command line arguments} +\begin{tabular}{|l|l|l|}\hline +Short & Long & Description \\ \hline\hline +-b \emph{batch} & --batch={batch} & Standard input read batching \\ \hline + +-i \emph{file} & --input=\emph{file} & Specifies base name for input files -- default is \emph{device}.blktrace.\emph{cpu}. \\ + & & As noted above, specifying \emph{-i -} runs in \emph{live} mode with blktrace \\ + & & (reading data from standard in). \\ \hline + +-F \emph{typ,fmt} & --format=\emph{typ,fmt} & Sets output format \\ +-f \emph{fmt} & --format-spec=\emph{fmt} & (See section~\ref{sec:blkparse-format} for details.) \\ + & & \\ + & & The -f form specifies a format for all events \\ + & & \\ + & & The -F form allows one to specify a format for a specific \\ + & & event type. The single-character \emph{typ} field is one of the \\ + & & action specifiers in section~\ref{sec:act-table} \\ \hline + + +-m & --missing & Print missing entries\\ \hline + +-h & --hash-by-name & Hash processes by name, not by PID\\ \hline + +-o \emph{file} & --output=\emph{file} & Output file \\ \hline +-O & --no-text-output & Do \emph{not} produce text output, used for binary (-d) only \\ \hline + +-d \emph{file} & --dump-binary=\emph{file} & Binary output file \\ \hline + +-q & --quiet & Quite mode \\ \hline + +-s & --per-program-stats & Displays data sorted by program \\ \hline + +-t & --track-ios & Display time deltas per IO \\ \hline + +-w \emph{span} & --stopwatch=\emph{span} & Display traces for the \emph{span} specified -- where span can be: \\ + & & \emph{end-time} -- Display traces from time 0 through \emph{end-time} (in ns) \\ + & & or \\ + & & \emph{start:end-time} -- Display traces from time \emph{start} \\ + & & through {end-time} (in ns). \\ \hline + +-M & --no-msgs & Do not add messages to binary output file \\\hline +-v & --verbose & More verbose marginal on marginal errors \\ \hline +-V & --version & Display version \\ \hline + +\end{tabular} + +\newpage +\subsection{\label{sec:blkparse-actions}Trace actions} + +\begin{description} + \item[C -- complete] A previously issued request has been completed. + The output will detail the sector and size of that request, as well + as the success or failure of it. + + \item[D -- issued] A request that previously resided on the block layer + queue or in the io scheduler has been sent to the driver. + + \item[I -- inserted] A request is being sent to the io scheduler for + addition to the internal queue and later service by the driver. The + request is fully formed at this time. + + \item[Q -- queued] This notes intent to queue io at the given location. + No real requests exists yet. + + \item[B -- bounced] The data pages attached to this \emph{bio} are + not reachable by the hardware and must be bounced to a lower memory + location. This causes a big slowdown in io performance, since the data + must be copied to/from kernel buffers. Usually this can be fixed with + using better hardware - either a better io controller, or a platform + with an IOMMU. + + \item[m -- message] Text message generated via kernel call to + \texttt{blk\_add\_trace\_msg}. + + \item[M -- back merge] A previously inserted request exists that ends + on the boundary of where this io begins, so the io scheduler can merge + them together. + + \item[F -- front merge] Same as the back merge, except this io ends + where a previously inserted requests starts. + + \item[G -- get request] To send any type of request to a block device, + a \emph{struct request} container must be allocated first. + + \item[S -- sleep] No available request structures were available, so + the issuer has to wait for one to be freed. + + \item[P -- plug] When io is queued to a previously empty block device + queue, Linux will plug the queue in anticipation of future ios being + added before this data is needed. + + \item[U -- unplug] Some request data already queued in the device, + start sending requests to the driver. This may happen automatically + if a timeout period has passed (see next entry) or if a number of + requests have been added to the queue. + + \item[T -- unplug due to timer] If nobody requests the io that was queued + after plugging the queue, Linux will automatically unplug it after a + defined period has passed. + + \item[X -- split] On raid or device mapper setups, an incoming io may + straddle a device or internal zone and needs to be chopped up into + smaller pieces for service. This may indicate a performance problem due + to a bad setup of that raid/dm device, but may also just be part of + normal boundary conditions. dm is notably bad at this and will clone + lots of io. + + \item[A -- remap] For stacked devices, incoming io is remapped to device + below it in the io stack. The remap action details what exactly is + being remapped to what. + +\end{description} + +\subsection{\label{sec:blkparse-format}Output Description and Formatting} + +The output from blkparse can be tailored for specific use - in particular, +to ease parsing of output, and/or limit output fields to those the user +wants to see. The data for fields which can be output include: + +\smallskip +\begin{tabular}{|l|l|}\hline +Field & Description \\ +Specifier & \\ \hline\hline +\emph{a} & Action, a (small) string (1 or 2 characters) -- see table below for more details \\ \hline +\emph{c} & CPU id \\ \hline +\emph{C} & Command \\ \hline +\emph{d} & RWBS field, a (small) string (1-3 characters) -- see section below for more details \\ \hline +\emph{D} & 7-character string containing the major and minor numbers of +the event's device \\ + & (separated by a comma). \\ \hline +\emph{e} & Error value \\ \hline +\emph{m} & Minor number of event's device. \\ \hline +\emph{M} & Major number of event's device. \\ \hline +\emph{n} & Number of blocks \\ \hline +\emph{N} & Number of bytes \\ \hline +\emph{p} & Process ID \\ \hline +\emph{P} & Display packet data -- series of hexadecimal values\\ \hline +\emph{s} & Sequence numbers \\ \hline +\emph{S} & Sector number \\ \hline +\emph{t} & Time stamp (nanoseconds) \\ \hline +\emph{T} & Time stamp (seconds) \\ \hline +\emph{u} & Elapsed value in microseconds (\emph{-t} command line option) \\ \hline +\emph{U} & Payload unsigned integer \\ \hline +\end{tabular} + +Note that the user can optionally specify field display width, and +optionally a left-aligned specifier. These precede field specifiers, +with a '\%' character, followed by the optional left-alignment specifer +(-) followed by the width (a decimal number) and then the field. + +Thus, to specify the command in a 12-character field that is left aligned: + +\begin{verbatim} +-f "%-12C" +\end{verbatim} + +\newpage +\subsubsection{\label{sec:act-table}Action Table} +The following table shows the various actions which may be output. + +\begin{tabular}{|l|l|}\hline +Act & Description \\ \hline\hline +A & IO was remapped to a different device \\ \hline +B & IO bounced \\ \hline +C & IO completion \\ \hline +D & IO issued to driver \\ \hline +F & IO front merged with request on queue \\ \hline +G & Get request \\ \hline +I & IO inserted onto request queue \\ \hline +M & IO back merged with request on queue \\ \hline +P & Plug request \\ \hline +Q & IO handled by request queue code \\ \hline +S & Sleep request \\ \hline +T & Unplug due to timeout \\ \hline +U & Unplug request \\ \hline +X & Split \\ \hline +\end{tabular} + +\subsubsection{\label{sec:act-table}RWBS Description} +This is a small string containing at least one character ('R' for read, +'W' for write, or 'D' for block discard operation), and optionally either +a 'B' (for barrier operations) or 'S' (for synchronous operations). + +\subsubsection{\label{sec:default-output}Default output} + +The standard \emph{header} (or initial fields displayed) include: + +\begin{verbatim} +"%D %2c %8s %5T.%9t %5p %2a %3d " +\end{verbatim} + +Breaking this down: + +\begin{description} + \item[\%D] Displays the event's device major/minor as: \%3d,\%-3d. + \item[\%2c] CPU ID (2-character field). + \item[\%8s] Sequence number + \item[\%5T.\%9t] 5-charcter field for the seconds portion of the + time stamp and a 9-character field for the nanoseconds in the time stamp. + \item[\%5p] 5-character field for the process ID. + \item[\%2a] 2-character field for one of the actions. + \item[\%3d] 3-character field for the RWBS data. +\end{description} + +Seeing this in action: + +\begin{verbatim} + 8,0 3 1 0.000000000 697 G W 223490 + 8 [kjournald] +\end{verbatim} + +The header is the data in this line up to the 223490 (starting block). + +The default output for all event types includes this header. + +\paragraph{Default output per action} + +\begin{description} + \item[C -- complete] If a payload is present, this is presented between + parenthesis following the header, followed by the error value. + + If no payload is present, the sector and number of blocks are presented + (with an intervening plus (+) character). If the \emph{-t} option + was specified, then the elapsed time is presented. In either case, + it is followed by the error value for the completion. + + \item[D -- issued] + \item[I -- inserted] + \item[Q -- queued] + \item[B -- bounced] If a payload is present, the number of payload bytes + is output, followed by the payload in hexadecimal between parenthesis. + + If no payload is present, the sector and number of blocks are presented + (with an intervening plus (+) character). If the \emph{-t} option was + specified, then the elapsed time is presented (in parenthesis). In + either case, it is followed by the command associated with the event + (surrounded by square brackets). + + \item[M -- back merge] + \item[F -- front merge] + \item[G -- get request] + \item[S -- sleep] The starting sector and number of blocks is output + (with an intervening plus (+) character), followed by the command + associated with the event (surrounded by square brackets). + + \item[P -- plug] The command associated with the event (surrounded by + square brackets) is output. + + \item[U -- unplug] + \item[T -- unplug due to timer] The command associated with the event + (surrounded by square brackets) is output, followed by the number of + requests outstanding. + + \item[X -- split] The original starting sector followed by the new + sector (separated by a slash (/) is output, followed by the command + associated with the event (surrounded by square brackets). + + \item[A -- remap] Sector and length is output, along with the original + device and sector offset. + + \item[m -- message] The supplied message is appended to the end of + the standard header. + +\end{description} + +%------------------------------ +\newpage +\newpage\section*{\label{sec:blktrace-kg}Appendix: blktrace Kernel Guide} + +The blktrace facility provides an efficient event transfer mechanism which +supplies block IO layer state transition data via the relay +filesystem. This section provides some details as to the interfaces +blktrace utilizes in the kernel to effect this. It is good background data +to help understand some of the outputs and command-line options above. + +\subsection{blktrace.h Definitions} +Files which include $<linux/blktrace.h>$ are supplied with the following +definitions: + +\subsubsection{Trace Action Specifiers} +\begin{tabular}{|l|l|}\hline + BLK\_TA\_QUEUE & (RQ) Command queued to request\_queue. \\ + & (BIO) Command queued by elevator. \\ \hline + BLK\_TA\_BACKMERGE & Back merging elevator operation \\ \hline + BLK\_TA\_FRONTMERGE & Front merging elevator operation \\ \hline + BLK\_TA\_GETRQ & Free request retrieved. \\ \hline + BLK\_TA\_SLEEPRQ & No requests available, device unplugged. \\ \hline + BLK\_TA\_REQUEUE & Request requeued. \\ \hline + BLK\_TA\_ISSUE & Command set to driver for request\_queue. \\ \hline + BLK\_TA\_COMPLETE & Command completed by driver. \\ \hline + BLK\_TA\_PLUG & Device is plugged \\ \hline + BLK\_TA\_UNPLUG\_IO & Unplug device as IO is made available. \\ \hline + BLK\_TA\_UNPLUG\_TIMER & Unplug device after timer expired. \\ \hline + BLK\_TA\_INSERT & Insert request into queue. \\ \hline + BLK\_TA\_SPLIT & BIO split into 2 or more requests. \\ \hline + BLK\_TA\_BOUNCE & BIO was bounced \\ \hline + BLK\_TA\_REMAP & BIO was remapped \\ \hline +\end{tabular} + +%.......................................... +\subsection{blktrace.h Routines} +Files which include $<linux/blktrace.h>$ are supplied with the following +kernel routine invocable interfaces: + +\begin{description} + \item[blk\_add\_trace\_rq(struct request\_queue *q, struct request\_queue + *rq, u32 what)] + Adds a trace event describing the state change of the passed in + request\_queue. The \emph{what} parameter describes the change in + the request\_queue state, and is one of the request queue action + specifiers -- BLK\_TA\_QUEUE, BLK\_TA\_REQUEUE, BLK\_TA\_ISSUE, + or BLK\_TA\_COMPLETE. + + \item[blk\_add\_trace\_bio(struct request\_queue *q, struct bio *bio, + u32 what)] + Adds a trace event for the BIO passed in. The \emph{what} parameter + describes the action being performed on the BIO, and is one of + BLK\_TA\_BACKMERGE, BLK\_TA\_FRONTMERGE, or BLK\_TA\_QUEUE. + + \item[blk\_add\_trace\_generic(struct request\_queue *q, struct bio *bio, + int rw, u32 what)] + Adds a \emph{generic} trace event -- not one of the request queue + or BIO traces. The \emph{what} parameter describes the action being + performed on the BIO (if bio is non-NULL), and is one of + BLK\_TA\_PLUG, BLK\_TA\_GETRQ or BLK\_TA\_SLEEPRQ. + + \item[blk\_add\_trace\_pdu\_int(struct request\_queue *q, u32 what, + u32 pdu)] + Adds a trace with some payload data -- in this case, an unsigned + 32-bit entity (the \emph{pdu} parameter). The \emph{what} parameter + describes the nature of the payload, and is one of + BLK\_TA\_UNPLUG\_IO or BLK\_TA\_UNPLUG\_TIMER. + + \item[blk\_add\_trace\_remap(struct request\_queue *q, struct bio *bio, + dev\_t dev, sector\_t sector)] + Adds a trace with a remap event. \emph{dev} and \emph{sector} denote + the original device this \emph{bio} was mapped from. + + \item[blk\_add\_trace\_msg(struct request\_queue *q, char *fmt, ...)] + Adds a formatted message to the output stream. The total message + size can not exceed BLK\_TN\_MSG\_MSG characters (currently + 1024). Standard format conversions are supported (as supplied + by \texttt{vscnprintf}. + +\end{description} +\end{document} diff --git a/doc/bno_plot.1 b/doc/bno_plot.1 new file mode 100644 index 0000000..bd7eb3c --- /dev/null +++ b/doc/bno_plot.1 @@ -0,0 +1,64 @@ +.TH BNO_PLOT 1 "February 22, 2007" "blktrace git\-20080213182518" "" + + +.SH NAME +bno_plot \- generate interactive 3D plot of IO blocks and sizes + + +.SH SYNOPSIS +.B bno_plot +[ \-h | \-\-help ] +.br + [ \-v | \-\-verbose ] +.br + [ \-K | \-\-keys-below ] +.br + [ <file...> ] +.br + + +.SH DESCRIPTION + +bno_plot is a visualization tool for the block layer IO tracing tool called +blktrace(8). As noted in its documentation, blktrace +is a block layer IO tracing mechanism which provides detailed +information about request queue operations up to user space. + +bno_plot utilizes gnuplot to generate a 3D plot of the block number output from +btt. If no \fI<files>\fR are specified, it will utilize all files generated after +btt was run with \fI-B blknos\fR (meaning: all files of the form \fIblknos*[rw].dat\fR). + +The \fI-K\fR option forces bno_plot to put the keys below the graph. If it is +not specified, all keys for input files are put in the upper right corner of the +graph. If the number of devices exceed 10, then bno_plot will automatically +push the keys under the graph. + +To use this utility, the gnuplot package needs to be installed. + +To exit the plotter, enter 'quit' or ^D at the 'gnuplot> ' prompt. + +.SH AUTHORS +\fIbno_plot\fR was written by Alan D. Brunelle. This man page was created +from the \fIblktrace\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2008 Hewlett-Packard Development Company, L.P. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +btt (1), gnuplot (1), blktrace (8), blkparse (1), verify_blkparse (1), blkrawverify (1) + diff --git a/doc/btrace.8 b/doc/btrace.8 new file mode 100644 index 0000000..a1f34c2 --- /dev/null +++ b/doc/btrace.8 @@ -0,0 +1,88 @@ +.TH BTRACE 8 "March 6, 2007" "blktrace git\-20070306202522" "" + + +.SH NAME +btrace \- perform live tracing for block devices + + +.SH SYNOPSIS +.B btrace [\-s] [\-t] [\-w \fIN\fN] [\-n \fIN\fR] [\-b \fIN\fR] [\-r \fI<dbg mnt>\fR] [\-a <\fItrace\fR>...] <\fIdev\fR>... +.br + + +.SH DESCRIPTION + +The \fIbtrace\fR script provides a quick and easy way to do live tracing of +block devices. It calls \fIblktrace\fR on the specified devices +and pipes the output through \fIblkparse\fR for formatting. See blktrace (8) +for more in-depth information about how \fIblktrace\fR works. + +.SH OPTIONS + +.HP 4 +.B \-s +Displays data sorted by program (see \fIblkparse\fR (1)). + +.HP 4 +.B \-t +Displays time deltas per IO (see \fIblkparse\fR (1)). + +.HP 4 +.B \-w \fIN\fR +Sets run time to the number of seconds specified (see \fIblktrace\fR (8)). + +.HP 4 +.B \-n \fIN\fR +Specifies the number of buffers to use (see \fIblktrace\fR (8)). + +.HP 4 +.B \-b \fIN\fR +Specifies buffer size for event extraction (scaled by 1024) (see +\fIblktrace\fR (8)). + +.HP 4 +.B \-r \fI<dbg mnt>\fR +Specifies the debugfs mountpoint. + +.HP 4 +.B \-a <\fItrace\fR>... +Adds mask to current filter (see \fIblktrace\fR (8)). + +.HP 4 +.B <\fIdev\fR> +Specifies the device to trace. + + +.SH EXAMPLE +Simply running + + % btrace /dev/sda + +will show a trace of the device \fI/dev/sda\fR. + + +.SH AUTHORS +\fIblkparse\fR was written by Jens Axboe, Alan D. Brunelle and Nathan Scott. This +man page was created from the \fIblktrace\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2006 Jens Axboe, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +blktrace (8), blkparse (1), verify_blkparse (1), blkrawverify (1), btt (1) + diff --git a/doc/btrecord.8 b/doc/btrecord.8 new file mode 100644 index 0000000..c0655ab --- /dev/null +++ b/doc/btrecord.8 @@ -0,0 +1,210 @@ +.TH BTRECORD 8 "December 8, 2007" "blktrace git\-20071207142532" "" + + +.SH NAME +btrecord \- recreate IO loads recorded by blktrace + + +.SH SYNOPSIS +.B Usage: + +btrecord [ \fIoptions\fR ] <\fIdev\fR...> + + +.SH DESCRIPTION + +.P +The \fIbtrecord\fR and \fIbtreplay\fR tools provide the ability to +record and replay IOs captured by the \fIblktrace\fR utility. Attempts +are made to maintain ordering, CPU mappings and time-separation of IOs. + + +.P +The \fIblktrace\fR utility provides the ability to collect detailed +traces from the kernel for each IO processed by the block IO layer. The +traces provide a complete timeline for each IO processed, including +detailed information concerning when an IO was first received by the block +IO layer \(em indicating the device, CPU number, time stamp, IO direction, +sector number and IO size (number of sectors). Using this information, +one is able to \fBreplay\fR the IO again on the same machine or another +set up entirely. + +.P +The basic operating work-flow to replay IOs would be something like: + +.IP \- 2 + Run \fIblktrace\fR to collect traces. Here you specify the + device or devices that you wish to trace and later replay IOs upon. Note: + the only traces you are interested in are \fBQUEUE\fR requests \(em + thus, to save system resources (including storage for traces), one could + specify the \fI-a queue\fR command line option to \fIblktrace\fR. + +.IP \- 2 + While \fIblktrace\fR is running, you run the workload that you + are interested in. + +.IP \- 2 + When the work load has completed, you stop the \fIblktrace\fR + utility (thus saving all traces over the complete workload). + +.IP \- 2 + You extract the pertinent IO information from the traces saved by + \fIblktrace\fR using the \fIbtrecord\fR utility. This will parse + each trace file created by \fIblktrace\fR, and crafty IO descriptions + to be used in the next phase of the workload processing. + +.IP \- 2 + Once \fIbtrecord\fR has successfully created a series of data + files to be processed, you can run the \fIbtreplay\fR utility which + attempts to generate the same IOs seen during the sample workload phase. + + +.SH OPTIONS + +\-d <\fIdir\fR> +.br +\-\-input\-directory=<\fIdir\fR> +.RS +Set input directory. +This option requires a single parameter providing the directory +name for where input files are to be found. The default directory is the +current directory (\fI.\fR). +.RE + +\-D <\fIdir\fR> +.br +\-\-output\-directory=<\fIdir\fR> +.RS +Set output directory. +This option requires a single parameter providing the directory +name for where output files are to be found. The default directory is the +current directory (\fI.\fR). +.RE + +\-F +.br +\-\-find\-traces +.RS +Find trace files automatically +This option instructs \fIbtreplay\fR to go find all the trace files in the +directory specified (either via the \fI-d\fR option, or in the default +directory (\fI.\fR). +.RE + +\-h +.br +\-\-help +.RS +Show help and exit. +.RE + +\-V +.br +\-\-version +.RS +Show version number and exit. +.RE + +\-m <\fInanoseconds\fR> +.br +\-\-input\-base=<\fInanoseconds\fR> +.RS +The \fI\-m\fR option requires a single parameter which specifies an +amount of time (in nanoseconds) to include in any one bunch of IOs that +are to be processed. The smaller the value, the smaller the number of +IOs processed at one time \(em perhaps yielding in more realistic replay. +However, after a certain point the amount of overhead per bunch may result +in additional real replay time, thus yielding less accurate replay times. +.P +The default value is 10,000,000 nanoseconds (10 milliseconds). +.RE + +\-M <\fInum\fR> +.br +\-\-max\-pkts=<\fInum\fR> +.RS +Set maximum number of packets per bunch. +The \fI\-M\fR option requires a single parameter which specifies the +maximum number of IOs to store in a single bunch. As with the \fI\-m\fR +option, smaller values may or may not yield more accurate replay times. + +The default value is 8, with a maximum value of up to 512 being supported. +.RE + +\-o <\fIbasename\fR> +.br +\-\-output\-base=<\fIbasename\fR> +.RS +Set base name for output files. +Each output file has 3 fields: +.IP 1. 3 + Device identifier (taken directly from the device name of the + \fIblktrace\fR output file). +.IP 2. 3 + \fIbtrecord\fR base name \(em by default ``replay''. +.IP 3. 3 + The CPU number (again, taken directly from the + \fIblktrace\fR output file name). +.P +This option requires a single parameter that will override the default name +(replay), and replace it with the specified value. +.RE + +\-v +.br +\-\-verbose +.RS +Enable verbose output. +This option will output some simple statistics at the end of a successful +run. Example output is: +.nf +.P +sdab:0: 580661 pkts (tot), 126030 pkts (replay), 89809 bunches, 1.4 pkts/bunch +sdab:1: 2559775 pkts (tot), 430172 pkts (replay), 293029 bunches, 1.5 pkts/bunch +sdab:2: 653559 pkts (tot), 136522 pkts (replay), 102288 bunches, 1.3 pkts/bunch +sdab:3: 474773 pkts (tot), 117849 pkts (replay), 69572 bunches, 1.7 pkts/bunch +.fi +.P +The meaning of the columns is: +.IP 1. 3 + The first field contains the device name and CPU identifier. Thus: + \fIsdab:0:\fR means the device \fIsdab\fR and traces on CPU 0. +.IP 2. + The second field contains the total number of packets processed for each + device file. +.IP 3. + The next field shows the number of packets eligible for replay. +.IP 4. + The fourth field contains the total number of IO bunches. +.IP 5. + The last field shows the average number of IOs per bunch recorded. +.RE + + +.SH AUTHORS +\fIbtrecord\fR was written by Alan D. Brunelle. This +man page was created from the \fIbtreplay\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2007 Alan D. Brunelle, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +The full documentation for btreplay can be found in /usr/share/doc/blktrace on Debian systems. +.br +blktrace (8), blkparse (1), btreplay (8) + diff --git a/doc/btreplay.8 b/doc/btreplay.8 new file mode 100644 index 0000000..1efcd0d --- /dev/null +++ b/doc/btreplay.8 @@ -0,0 +1,233 @@ +.TH BTREPLAY 8 "December 8, 2007" "blktrace git\-20071207142532" "" + + +.SH NAME +btreplay \- recreate IO loads recorded by blktrace + + +.SH SYNOPSIS +.B btreplay [ \fIoptions\fR ] <\fIdev\fR...> + + +.SH DESCRIPTION + +.P +The \fIbtrecord\fR and \fIbtreplay\fR tools provide the ability to +record and replay IOs captured by the \fIblktrace\fR utility. Attempts +are made to maintain ordering, CPU mappings and time-separation of IOs. + + +.P +The \fIblktrace\fR utility provides the ability to collect detailed +traces from the kernel for each IO processed by the block IO layer. The +traces provide a complete timeline for each IO processed, including +detailed information concerning when an IO was first received by the block +IO layer \(em indicating the device, CPU number, time stamp, IO direction, +sector number and IO size (number of sectors). Using this information, +one is able to \fBreplay\fR the IO again on the same machine or another +set up entirely. + +.P +The basic operating work-flow to replay IOs would be something like: + +.IP \- 2 + Run \fIblktrace\fR to collect traces. Here you specify the + device or devices that you wish to trace and later replay IOs upon. Note: + the only traces you are interested in are \fBQUEUE\fR requests \(em + thus, to save system resources (including storage for traces), one could + specify the \fI-a queue\fR command line option to \fIblktrace\fR. + +.IP \- 2 + While \fIblktrace\fR is running, you run the workload that you + are interested in. + +.IP \- 2 + When the work load has completed, you stop the \fIblktrace\fR + utility (thus saving all traces over the complete workload). + +.IP \- 2 + You extract the pertinent IO information from the traces saved by + \fIblktrace\fR using the \fIbtrecord\fR utility. This will parse + each trace file created by \fIblktrace\fR, and crafty IO descriptions + to be used in the next phase of the workload processing. + +.IP \- 2 + Once \fIbtrecord\fR has successfully created a series of data + files to be processed, you can run the \fIbtreplay\fR utility which + attempts to generate the same IOs seen during the sample workload phase. + + +.SH OPTIONS + +\-c <\fInum\fR> +.br +\-\-cpus=<\fInum\fR> +.RS +Set number of CPUs to use. +.RE + +\-d <\fIdir\fR> +.br +\-\-input\-directory=<\fIdir\fR> +.RS +Set input directory. +This option requires a single parameter providing the directory +name for where input files are to be found. The default directory is the +current directory (\fI.\fR). +.RE + +\-F +.br +\-\-find\-records +.RS +Find record files automatically +This option instructs \fIbtreplay\fR to go find all the record files in the +directory specified (either via the \fI-d\fR option, or in the default +directory (\fI.\fR). +.RE + +\-h +.br +\-\-help +.RS +Show help and exit. +.RE + +\-i <\fIbasename\fR> +.br +\-\-input\-base=<\fIbasename\fR> +.RS +Set base name for input files. +Each input file has 3 fields: +.IP 1. 3 + Device identifier (taken directly from the device name of the + \fIblktrace\fR output file). +.IP 2. 3 + \fIbtrecord\fR base name \(em by default ``replay''. +.IP 3. 3 + The CPU number (again, taken directly from the + \fIblktrace\fR output file name). +.P +This option requires a single parameter that will override the default name +(replay), and replace it with the specified value. +.RE + +\-I <\fInum\fR> +.br +\-\-iterations=<\fInum\fR> +.RS +Set number of iterations to run. +This option requires a single parameter which specifies the number of times +to run through the input files. The default value is 1 +.RE + +\-M <\fIfilename\fR> +.br +\-\-map\-devs=<\fIfilename\fR> +.RS +Specify device mappings. +This option requires a single parameter which specifies the name of a +file contain device mappings. The file must be very simply managed, with +just two pieces of data per line: + +.IP \- 2 + The device name on the recorded system (with the '\fI/dev/\fR' + removed). Example: \fI/dev/sda\fR would just be \fIsda\fR. + +.IP \- 2 + The device name on the replay system to use (again, without the + '\fI/dev/\fR' path prepended). + +.P +An example file for when one would map devices \fI/dev/sda\fR and +\fI/dev/sdb\fR on the recorded system to \fIdev/sdg\fR and +\fIsdh\fR on the replay system would be: + +.nf +.IP +sda sdg +sdb sdh +.fi + +.P +The only entries in the file that are allowed are these two element lines \(em +we do not (yet?) support the notion of blank lines, or comment lines, or the +like. + +.P +The utility allows for multiple \fI-M\fR options to be +supplied on the command line. +.RE + +\-N +.br +\-\-no\-stalls +.RS +Disable pre-bunch stalls. +When specified on the command line, all pre-bunch stall indicators will be +ignored. IOs will be replayed without inter-bunch delays. +.RE + +\-v +.br +\-\-verbose +.RS +Enable verbose output. +When specified on the command line, this option instructs \fIbtreplay\fR +to store information concerning each \fBstall\fR and IO operation +performed by \fIbtreplay\fR. The name of each file so created will be +the input file name used with an extension of \fI.rep\fR appended onto +it. Thus, an input file of the name \fIsdab.replay.3\fR would generate a +verbose output file with the name \fIsdab.replay.3.rep\fR in the +directory specified for input files. +.P +In addition, \fIbtreplay\fR will also output to \fIstderr\fR the +names of the input files being processed. +.RE + +\-V +.br +\-\-version +.RS +Show version number and exit. +.RE + +\-W +.br +\-\-write-enable +.RS +Enable writing during replay. +As a precautionary measure, by default \fIbtreplay\fR will not +process \fBwrite\fR requests. In order to enable \fIbtreplay\fR to +actually \fBwrite\fR to devices one must explicitly specify the +\fI\-W\fR option. +.RE + + +.SH AUTHORS +\fIbtreplay\fR was written by Alan D. Brunelle. This +man page was created from the \fIbtreplay\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2007 Alan D. Brunelle, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +The full documentation for btreplay can be found in /usr/share/doc/blktrace on Debian systems. +.br +blktrace (8), blkparse (1), btrecord (8) + diff --git a/doc/btt.1 b/doc/btt.1 new file mode 100644 index 0000000..b9c9ee7 --- /dev/null +++ b/doc/btt.1 @@ -0,0 +1,369 @@ +.TH BTT 1 "September 29, 2007" "blktrace git\-20070910192508" "" + + +.SH NAME +btt \- analyse block i/o traces produces by blktrace + + +.SH SYNOPSIS +.B btt +.br +[ \-a | \-\-seek\-absolute ] +.br +[ \-A | \-\-all\-data ] +.br +[ \-B <\fIoutput name\fR> | \-\-dump\-blocknos=<\fIoutput name\fR> ] +.br +[ \-d <\fIseconds\fR> | \-\-range\-delta=<\fIseconds\fR> ] +.br +[ \-D <\fIdev;...\fR> | \-\-devices=<\fIdev;...\fR> ] +.br +[ \-e <\fIexe,...\fR> | \-\-exes=<\fIexe,...\fR> ] +.br +[ \-h | \-\-help ] +.br +[ \-i <\fIinput name\fR> | \-\-input\-file=<\fIinput name\fR> ] +.br +[ \-I <\fIoutput name\fR> | \-\-iostat=<\fIoutput name\fR> ] +.br +[ \-l <\fIoutput name\fR> | \-\-d2c\-latencies=<\fIoutput name\fR> ] +.br +[ \-L <\fIfreq\fR> | \-\-periodic\-latencies=<\fIfreq\fR> ] +.br +[ \-M <\fIdev map\fR> | \-\-dev\-maps=<\fIdev map\fR> +.br +[ \-o <\fIoutput name\fR> | \-\-output\-file=<\fIoutput name\fR> ] +.br +[ \-p <\fIoutput name\fR> | \-\-per\-io\-dump=<\fIoutput name\fR> ] +.br +[ \-P <\fIoutput name\fR> | \-\-per\-io\-trees=<\fIoutput name\fR> ] +.br +[ \-q <\fIoutput name\fR> | \-\-q2c\-latencies=<\fIoutput name\fR> ] +.br +[ \-Q <\fIoutput name\fR> | \-\-active\-queue\-depth=<\fIoutput name\fR> ] +.br +[ \-r | \-\-no\-remaps ] +.br +[ \-s <\fIoutput name\fR> | \-\-seeks=<\fIoutput name\fR> ] +.br +[ \-S <\fIinterval\fR> | \-\-iostat\-interval=<\fIinterval\fR> ] +.br +[ \-t <\fIsec\fR> | \-\-time\-start=<\fIsec\fR> ] +.br +[ \-T <\fIsec\fR> | \-\-time\-end=<\fIsec\fR> ] +.br +[ \-u <\fIoutput name\fR> | \-\-unplug\-hist=<\fIoutput name\fR> ] +.br +[ \-v | \-\-verbose ] +.br +[ \-V | \-\-version ] +.br +[ \-z <\fIoutput name\fR> | \-\-q2d\-latencies=<\fIoutput name\fR> ] + + +.SH DESCRIPTION + +btt is a post\-processing tool for the block layer IO tracing tool called +blktrace(8). As noted in its documentation, blktrace +is a block layer IO tracing mechanism which provides detailed +information about request queue operations up to user space. + +btt will take in binary dump data from blkparse, and analyse the events, +producing a series of output from the analysis. It will also build .dat +files containing "range data" \-\- showing things like Q activity (periods +of time while Q events are being produced), C activity (likewise for +command completions), and etc. + +Included with the distribution is a simple 3D plotting utility, +\fIbno_plot\fR, which can plot the block numbers btt outputs if the \fI-B\fR +option is specified. The display will display each IO generated, with the time +(seconds) along the X-axis, the block number (start) along the Y-axis and the +number of blocks transferred in the IO represented along the Z-axis. + + +.SH OPTIONS + +.B \-a +.br +.B \-\-seek\-absolute +.RS 4 +When specified on the command line, this directs btt to calculate +seek distances based solely upon the ending block address of one IO, +and the start of the next. By default \fBbtt\fR uses the concept +of the closeness to either the beginning or end of the previous IO. See +the Users Manual for more details about seek distances. +.RE + +.B \-A +.br +.B \-\-all\-data +.RS 4 +Normally \fBbtt\fR will not print out verbose information concerning +per-process and per-device data. If you desire that level of detail you can +specify this option. +.RE + +.B \-B <\fIoutput name\fR> +.br +.B \-\-dump\-blocknos=<\fIoutput name\fR> +.RS 4 +This option will output absolute block numbers to three files prefixed +by the specified output name: +.HP +.I prefix_device_r.dat +.br +All read block numbers are output, first column is time (seconds), second is +the block number, and the third column is the ending block number. +.HP +.I prefix_device_w.dat +.br +All write block numbers are output, first column is time (seconds), second is +the block number, and the third column is the ending block number. +.HP +.I prefix_device_c.dat +.br +All block numbers (read and write) are output, first column is time (seconds), +second is the block number, and the third column is the ending block number. +.RE + +.B \-d <\fIseconds\fR> +.br +.B \-\-range\-delta=<\fIseconds\fR> +.RS 4 +\fBbtt\fR outputs a file containing Q and C activity, the notion of active +traces simply means that there are Q or C traces occurring within a certain +period of each other. The default values is 0.1 seconds; with this option +allowing one to change that granularity. The smaller the value, the more data +points provided. +.RE + +.B \-D <\fIdev;...\fR> +.br +.B \-\-devices=<\fIdev;...\fR> +.RS 4 +Normally, \fBbtt\fR will produce data for all devices detected in the +traces parsed. With this option, one can reduce the analysis to one or more +devices provided in the string passed to this option. The device identifiers +are the major and minor number of each device, and each device identifier is +separated by a colon (:). A valid specifier for devices 8,0 and 8,8 would then +be: \fI8,0:8,8\fR. +.RE + +.B \-e <\fIexe,...\fR> +.br +.B \-\-exes=<\fIexe,...\fR> +.RS 4 +The \-e option supplies the list of executables that will have I/Os +analysed. +.RE + +.B \-h +.br +.B \-\-help +.RS 4 +Shows a short summary of possible command line option +.RE + +.B \-i <\fIinput name\fR> +.br +.B \-\-input\-file <\fIinput file\fR> +.RS 4 +Specifies the input file to analyse. This should be a trace file produced +by \fIblktrace\fR (8). +.RE + +.B \-I <\fIoutput name\fR> +.br +.B \-\-iostat=<\fIoutput name\fR> +.RS 4 +The \-I option directs btt to output iostat\-like data to the specified +file. Refer to the iostat (sysstat) documentation for details on the +data columns. +.RE + +.B \-l <\fIoutput name\fR> +.br +.B \-\-d2c\-latencies=<\fIoutput name\fR> +.RS 4 +The \-l option allows one to output per\-IO D2C latencies +respectively. The supplied argument provides the basis for the output +name for each device. +.RE + +.B \-L <\fIfreq\fR> +.br +.B \-\-periodic\-latencies=<\fIfreq\fR> +.RS 4 +The \-L option allows one to output periodic latency information for both +Q2C and D2C latencies. The frequency specified will regulate how often +an average latency is output -- a floating point value expressing seconds. +.RE + +.B \-M <\fIdev map\fR> +.br +.B \-\-dev\-maps=<\fIdev map\fR> +.RS 4 +The \-M option takes in a file generated by the provided script +(gen_disk_info.py), and allows for better output of device names. +.RE + +.B \-o <\fIoutput name\fR> +.br +.B \-\-output\-file=<\fIoutput name\fR> +.RS 4 +Specifies the output file name. +.RE + +.B \-p <\fIoutput name\fR> +.br +.B \-\-per\-io\-dump=<\fIoutput name\fR> +.RS 4 +The \-p option will generate a file that contains a list of all IO +"sequences" \- showing the parts of each IO (Q, A, I/M, D, & C). +.RE + +.B \-P <\fIoutput name\fR> +.br +.B \-\-per\-io\-trees=<\fIoutput name\fR> +.RS 4 +The \-P option will generate a file that contains a list of all IO +"sequences" \- showing only the Q, D & C operation times. The D & C +time values are separated from the Q time values with a vertical bar. +.RE + +.B \-q <\fIoutput name\fR> +.br +.B \-\-q2c\-latencies=<\fIoutput name\fR> +.RS 4 +The \-q option allows one to output per\-IO Q2C latencies +respectively. The supplied argument provides the basis for the output +name for each device. +.RE + +.B \-Q <\fIoutput name\fR> +.br +.B \-\-active\-queue\-depth=<\fIoutput name\fR> +.RS 4 +The \-Q option allows one to output data files showing the time stamp +and the depth of active commands (those issued but not completed). +.RE + +.B \-r +.br +.B \-\-no\-remaps +.RS 4 +Ignore remap traces; older kernels did not implement the full remap +PDU. +.RE + +.B \-s <\fIoutput name\fR> +.br +.B \-\-seeks=<\fIoutput name\fR> +.RS 4 +The \-s option instructs btt to output seek data, the argument provided +is the basis for file names output. There are two files per device, +read seeks and write seeks. +.RE + +.B \-S <\fIinterval\fR> +.br +.B \-\-iostat\-interval=<\fIinterval\fR> +.RS 4 +The \-S option specifies the interval to use between data +output, it defaults to once per second. +.RE + +.B \-t <\fIsec\fR> +.br +.B \-\-time\-start=<\fIsec\fR> +.br +.B \-T <\fIsec\fR> +.br +.B \-\-time\-end=<\fIsec\fR> +.RS 4 +The \-t/\-T options allow one to set a start and/or end time for analysing +\- analysing will only be done for traces after \-t's argument and before +\-T's argument. (\-t and \-T are optional, so if you specify just \-t, +analysis will occur for all traces after the time specified. Similarly, +if only \-T is specified, analysis stops after \-T's seconds.) +.RE + +.B \-u <\fIoutput name\fR> +.br +.B \-\-unplug\-hist=<\fIoutput name\fR> +.RS 4 +This option instructs \fBbtt\fR to generate a data file containing histogram +information for unplug traces on a per device basis. It shows how many +times an unplug was hit with a specified number of IOs released. There are 21 +output values into the file, as follows: + +.RS 4 +a value of 0 represents 0..4 counts +.br +a value of 1 represents 5..9 counts +.br +a value of 2 represents 10..14 counts +.br +etc, until +.br +a value of 20 represents 100+ counts +.br +.RE + +The file name(s) generated use the text string passed as an argument for +the prefix, followed by the device identifier in \fImajor,minor\fR +form, with a \fI.dat\fR extension. For example, with \fI\-u +up_hist\fR specified on the command line: \fIup_hist_008,032.dat\fR. +.RE + +.B \-V +.br +.B \-\-version +.RS 4 +Shows the version of btt. +.RE + +.B \-v +.br +.B \-\-verbose +.RS 4 +Requests a more verbose output. +.RE + +.B \-z <\fIoutput name\fR> +.br +.B \-\-q2d\-latencies=<\fIoutput name\fR> +.RS 4 +The \-z option allows one to output per\-IO Q2D latencies +respectively. The supplied argument provides the basis for the output +name for each device. +.RE + + +.SH AUTHORS +\fIbtt\fR was written by Alan D. Brunelle. This man page was created +from the \fIblktrace\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2006 Jens Axboe, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +The btt Users Guide, which can be found in /usr/share/doc/blktrace/btt.pdf +.br +bno_plot (1), blktrace (8), blkparse (1), verify_blkparse (1), blkrawverify (1), btt (1) + diff --git a/doc/verify_blkparse.1 b/doc/verify_blkparse.1 new file mode 100644 index 0000000..c209ef8 --- /dev/null +++ b/doc/verify_blkparse.1 @@ -0,0 +1,44 @@ +.TH VERIFY_BLKPARSE 1 "March 6, 2007" "blktrace git\-20070306202522" "" + + +.SH NAME +verify_blkparse \- verifies an output file produced by blkparse + + +.SH SYNOPSIS +.B verify_blkparse <\fIfilename\fR> +.br + + +.SH DESCRIPTION + +Verifies an output file from blkparse. All it does is check if the events in +the file are correctly time ordered. If an entry is found that isn't ordered, +it's dumped to stdout. + + +.SH AUTHORS +\fIblkparse\fR was written by Jens Axboe, Alan D. Brunelle and Nathan Scott. This +man page was created from the \fIblktrace\fR documentation by Bas Zoetekouw. + + +.SH "REPORTING BUGS" +Report bugs to <linux\-btrace@vger.kernel.org> + +.SH COPYRIGHT +Copyright \(co 2006 Jens Axboe, Alan D. Brunelle and Nathan Scott. +.br +This is free software. You may redistribute copies of it under the terms of +the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. +There is NO WARRANTY, to the extent permitted by law. +.br +This manual page was created for Debian by Bas Zoetekouw. It was derived from +the documentation provided by the authors and it may be used, distributed and +modified under the terms of the GNU General Public License, version 2. +.br +On Debian systems, the text of the GNU General Public License can be found in +/usr/share/common\-licenses/GPL\-2. + +.SH "SEE ALSO" +btrace (8), blktrace (8), blkparse (1), blkrawverify (1), btt (1) + @@ -0,0 +1,157 @@ +#ifndef _LINUX_JHASH_H +#define _LINUX_JHASH_H + +/* jhash.h: Jenkins hash support. + * + * Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net) + * + * http://burtleburtle.net/bob/hash/ + * + * These are the credits from Bob's sources: + * + * lookup3.c, by Bob Jenkins, May 2006, Public Domain. + * + * These are functions for producing 32-bit hashes for hash table lookup. + * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() + * are externally useful functions. Routines to test the hash are included + * if SELF_TEST is defined. You can use this free for any purpose. It's in + * the public domain. It has no warranty. + * + * Copyright (C) 2009 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * I've modified Bob's hash to be useful in the Linux kernel, and + * any bugs present are my fault. Jozsef + */ + +#define __rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) + +/* __jhash_mix - mix 3 32-bit values reversibly. */ +#define __jhash_mix(a,b,c) \ +{ \ + a -= c; a ^= __rot(c, 4); c += b; \ + b -= a; b ^= __rot(a, 6); a += c; \ + c -= b; c ^= __rot(b, 8); b += a; \ + a -= c; a ^= __rot(c,16); c += b; \ + b -= a; b ^= __rot(a,19); a += c; \ + c -= b; c ^= __rot(b, 4); b += a; \ +} + +/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */ +#define __jhash_final(a,b,c) \ +{ \ + c ^= b; c -= __rot(b,14); \ + a ^= c; a -= __rot(c,11); \ + b ^= a; b -= __rot(a,25); \ + c ^= b; c -= __rot(b,16); \ + a ^= c; a -= __rot(c,4); \ + b ^= a; b -= __rot(a,14); \ + c ^= b; c -= __rot(b,24); \ +} + +/* The golden ration: an arbitrary value */ +#define JHASH_GOLDEN_RATIO 0xdeadbeef + +/* The most generic version, hashes an arbitrary sequence + * of bytes. No alignment or length assumptions are made about + * the input key. The result depends on endianness. + */ +static inline u32 jhash(const void *key, u32 length, u32 initval) +{ + u32 a,b,c; + const u8 *k = key; + + /* Set up the internal state */ + a = b = c = JHASH_GOLDEN_RATIO + length + initval; + + /* all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) { + a += (k[0] + ((u32)k[1]<<8) + ((u32)k[2]<<16) + ((u32)k[3]<<24)); + b += (k[4] + ((u32)k[5]<<8) + ((u32)k[6]<<16) + ((u32)k[7]<<24)); + c += (k[8] + ((u32)k[9]<<8) + ((u32)k[10]<<16) + ((u32)k[11]<<24)); + __jhash_mix(a, b, c); + length -= 12; + k += 12; + } + + /* last block: affect all 32 bits of (c) */ + /* all the case statements fall through */ + switch (length) { + case 12: c += (u32)k[11]<<24; + case 11: c += (u32)k[10]<<16; + case 10: c += (u32)k[9]<<8; + case 9 : c += k[8]; + case 8 : b += (u32)k[7]<<24; + case 7 : b += (u32)k[6]<<16; + case 6 : b += (u32)k[5]<<8; + case 5 : b += k[4]; + case 4 : a += (u32)k[3]<<24; + case 3 : a += (u32)k[2]<<16; + case 2 : a += (u32)k[1]<<8; + case 1 : a += k[0]; + __jhash_final(a, b, c); + case 0 : + break; + } + + return c; +} + +/* A special optimized version that handles 1 or more of u32s. + * The length parameter here is the number of u32s in the key. + */ +static inline u32 jhash2(u32 *k, u32 length, u32 initval) +{ + u32 a, b, c; + + /* Set up the internal state */ + a = b = c = JHASH_GOLDEN_RATIO + (length<<2) + initval; + + /* handle most of the key */ + while (length > 3) { + a += k[0]; + b += k[1]; + c += k[2]; + __jhash_mix(a, b, c); + length -= 3; + k += 3; + } + + /* handle the last 3 u32's */ + /* all the case statements fall through */ + switch (length) { + case 3: c += k[2]; + case 2: b += k[1]; + case 1: a += k[0]; + __jhash_final(a, b, c); + case 0: /* case 0: nothing left to add */ + break; + } + + return c; +} + +/* A special ultra-optimized versions that knows they are hashing exactly + * 3, 2 or 1 word(s). + */ +static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval) +{ + a += JHASH_GOLDEN_RATIO + initval; + b += JHASH_GOLDEN_RATIO + initval; + c += JHASH_GOLDEN_RATIO + initval; + + __jhash_final(a, b, c); + + return c; +} + +static inline u32 jhash_2words(u32 a, u32 b, u32 initval) +{ + return jhash_3words(0, a, b, initval); +} + +static inline u32 jhash_1word(u32 a, u32 initval) +{ + return jhash_3words(0, 0, a, initval); +} + +#endif /* _LINUX_JHASH_H */ diff --git a/rbtree.c b/rbtree.c new file mode 100644 index 0000000..6ad800f --- /dev/null +++ b/rbtree.c @@ -0,0 +1,389 @@ +/* + Red Black Trees + (C) 1999 Andrea Arcangeli <andrea@suse.de> + (C) 2002 David Woodhouse <dwmw2@infradead.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + linux/lib/rbtree.c +*/ + +#include "rbtree.h" + +static void __rb_rotate_left(struct rb_node *node, struct rb_root *root) +{ + struct rb_node *right = node->rb_right; + struct rb_node *parent = rb_parent(node); + + if ((node->rb_right = right->rb_left)) + rb_set_parent(right->rb_left, node); + right->rb_left = node; + + rb_set_parent(right, parent); + + if (parent) + { + if (node == parent->rb_left) + parent->rb_left = right; + else + parent->rb_right = right; + } + else + root->rb_node = right; + rb_set_parent(node, right); +} + +static void __rb_rotate_right(struct rb_node *node, struct rb_root *root) +{ + struct rb_node *left = node->rb_left; + struct rb_node *parent = rb_parent(node); + + if ((node->rb_left = left->rb_right)) + rb_set_parent(left->rb_right, node); + left->rb_right = node; + + rb_set_parent(left, parent); + + if (parent) + { + if (node == parent->rb_right) + parent->rb_right = left; + else + parent->rb_left = left; + } + else + root->rb_node = left; + rb_set_parent(node, left); +} + +void rb_insert_color(struct rb_node *node, struct rb_root *root) +{ + struct rb_node *parent, *gparent; + + while ((parent = rb_parent(node)) && rb_is_red(parent)) + { + gparent = rb_parent(parent); + + if (parent == gparent->rb_left) + { + { + register struct rb_node *uncle = gparent->rb_right; + if (uncle && rb_is_red(uncle)) + { + rb_set_black(uncle); + rb_set_black(parent); + rb_set_red(gparent); + node = gparent; + continue; + } + } + + if (parent->rb_right == node) + { + register struct rb_node *tmp; + __rb_rotate_left(parent, root); + tmp = parent; + parent = node; + node = tmp; + } + + rb_set_black(parent); + rb_set_red(gparent); + __rb_rotate_right(gparent, root); + } else { + { + register struct rb_node *uncle = gparent->rb_left; + if (uncle && rb_is_red(uncle)) + { + rb_set_black(uncle); + rb_set_black(parent); + rb_set_red(gparent); + node = gparent; + continue; + } + } + + if (parent->rb_left == node) + { + register struct rb_node *tmp; + __rb_rotate_right(parent, root); + tmp = parent; + parent = node; + node = tmp; + } + + rb_set_black(parent); + rb_set_red(gparent); + __rb_rotate_left(gparent, root); + } + } + + rb_set_black(root->rb_node); +} + +static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, + struct rb_root *root) +{ + struct rb_node *other; + + while ((!node || rb_is_black(node)) && node != root->rb_node) + { + if (parent->rb_left == node) + { + other = parent->rb_right; + if (rb_is_red(other)) + { + rb_set_black(other); + rb_set_red(parent); + __rb_rotate_left(parent, root); + other = parent->rb_right; + } + if ((!other->rb_left || rb_is_black(other->rb_left)) && + (!other->rb_right || rb_is_black(other->rb_right))) + { + rb_set_red(other); + node = parent; + parent = rb_parent(node); + } + else + { + if (!other->rb_right || rb_is_black(other->rb_right)) + { + struct rb_node *o_left; + if ((o_left = other->rb_left)) + rb_set_black(o_left); + rb_set_red(other); + __rb_rotate_right(other, root); + other = parent->rb_right; + } + rb_set_color(other, rb_color(parent)); + rb_set_black(parent); + if (other->rb_right) + rb_set_black(other->rb_right); + __rb_rotate_left(parent, root); + node = root->rb_node; + break; + } + } + else + { + other = parent->rb_left; + if (rb_is_red(other)) + { + rb_set_black(other); + rb_set_red(parent); + __rb_rotate_right(parent, root); + other = parent->rb_left; + } + if ((!other->rb_left || rb_is_black(other->rb_left)) && + (!other->rb_right || rb_is_black(other->rb_right))) + { + rb_set_red(other); + node = parent; + parent = rb_parent(node); + } + else + { + if (!other->rb_left || rb_is_black(other->rb_left)) + { + register struct rb_node *o_right; + if ((o_right = other->rb_right)) + rb_set_black(o_right); + rb_set_red(other); + __rb_rotate_left(other, root); + other = parent->rb_left; + } + rb_set_color(other, rb_color(parent)); + rb_set_black(parent); + if (other->rb_left) + rb_set_black(other->rb_left); + __rb_rotate_right(parent, root); + node = root->rb_node; + break; + } + } + } + if (node) + rb_set_black(node); +} + +void rb_erase(struct rb_node *node, struct rb_root *root) +{ + struct rb_node *child, *parent; + int color; + + if (!node->rb_left) + child = node->rb_right; + else if (!node->rb_right) + child = node->rb_left; + else + { + struct rb_node *old = node, *left; + + node = node->rb_right; + while ((left = node->rb_left) != NULL) + node = left; + child = node->rb_right; + parent = rb_parent(node); + color = rb_color(node); + + if (child) + rb_set_parent(child, parent); + if (parent == old) { + parent->rb_right = child; + parent = node; + } else + parent->rb_left = child; + + node->rb_parent_color = old->rb_parent_color; + node->rb_right = old->rb_right; + node->rb_left = old->rb_left; + + if (rb_parent(old)) + { + if (rb_parent(old)->rb_left == old) + rb_parent(old)->rb_left = node; + else + rb_parent(old)->rb_right = node; + } else + root->rb_node = node; + + rb_set_parent(old->rb_left, node); + if (old->rb_right) + rb_set_parent(old->rb_right, node); + goto color; + } + + parent = rb_parent(node); + color = rb_color(node); + + if (child) + rb_set_parent(child, parent); + if (parent) + { + if (parent->rb_left == node) + parent->rb_left = child; + else + parent->rb_right = child; + } + else + root->rb_node = child; + + color: + if (color == RB_BLACK) + __rb_erase_color(child, parent, root); +} + +/* + * This function returns the first node (in sort order) of the tree. + */ +struct rb_node *rb_first(struct rb_root *root) +{ + struct rb_node *n; + + n = root->rb_node; + if (!n) + return NULL; + while (n->rb_left) + n = n->rb_left; + return n; +} + +struct rb_node *rb_last(struct rb_root *root) +{ + struct rb_node *n; + + n = root->rb_node; + if (!n) + return NULL; + while (n->rb_right) + n = n->rb_right; + return n; +} + +struct rb_node *rb_next(struct rb_node *node) +{ + struct rb_node *parent; + + if (rb_parent(node) == node) + return NULL; + + /* If we have a right-hand child, go down and then left as far + as we can. */ + if (node->rb_right) { + node = node->rb_right; + while (node->rb_left) + node=node->rb_left; + return node; + } + + /* No right-hand children. Everything down and left is + smaller than us, so any 'next' node must be in the general + direction of our parent. Go up the tree; any time the + ancestor is a right-hand child of its parent, keep going + up. First time it's a left-hand child of its parent, said + parent is our 'next' node. */ + while ((parent = rb_parent(node)) && node == parent->rb_right) + node = parent; + + return parent; +} + +struct rb_node *rb_prev(struct rb_node *node) +{ + struct rb_node *parent; + + if (rb_parent(node) == node) + return NULL; + + /* If we have a left-hand child, go down and then right as far + as we can. */ + if (node->rb_left) { + node = node->rb_left; + while (node->rb_right) + node=node->rb_right; + return node; + } + + /* No left-hand children. Go up till we find an ancestor which + is a right-hand child of its parent */ + while ((parent = rb_parent(node)) && node == parent->rb_left) + node = parent; + + return parent; +} + +void rb_replace_node(struct rb_node *victim, struct rb_node *new, + struct rb_root *root) +{ + struct rb_node *parent = rb_parent(victim); + + /* Set the surrounding nodes to point to the replacement */ + if (parent) { + if (victim == parent->rb_left) + parent->rb_left = new; + else + parent->rb_right = new; + } else { + root->rb_node = new; + } + if (victim->rb_left) + rb_set_parent(victim->rb_left, new); + if (victim->rb_right) + rb_set_parent(victim->rb_right, new); + + /* Copy the pointers/colour from the victim to the replacement */ + *new = *victim; +} diff --git a/rbtree.h b/rbtree.h new file mode 100644 index 0000000..4c06d98 --- /dev/null +++ b/rbtree.h @@ -0,0 +1,165 @@ +/* + Red Black Trees + (C) 1999 Andrea Arcangeli <andrea@suse.de> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + linux/include/linux/rbtree.h + + To use rbtrees you'll have to implement your own insert and search cores. + This will avoid us to use callbacks and to drop drammatically performances. + I know it's not the cleaner way, but in C (not in C++) to get + performances and genericity... + + Some example of insert and search follows here. The search is a plain + normal search over an ordered tree. The insert instead must be implemented + int two steps: as first thing the code must insert the element in + order as a red leaf in the tree, then the support library function + rb_insert_color() must be called. Such function will do the + not trivial work to rebalance the rbtree if necessary. + +----------------------------------------------------------------------- +static inline struct page * rb_search_page_cache(struct inode * inode, + unsigned long offset) +{ + struct rb_node * n = inode->i_rb_page_cache.rb_node; + struct page * page; + + while (n) + { + page = rb_entry(n, struct page, rb_page_cache); + + if (offset < page->offset) + n = n->rb_left; + else if (offset > page->offset) + n = n->rb_right; + else + return page; + } + return NULL; +} + +static inline struct page * __rb_insert_page_cache(struct inode * inode, + unsigned long offset, + struct rb_node * node) +{ + struct rb_node ** p = &inode->i_rb_page_cache.rb_node; + struct rb_node * parent = NULL; + struct page * page; + + while (*p) + { + parent = *p; + page = rb_entry(parent, struct page, rb_page_cache); + + if (offset < page->offset) + p = &(*p)->rb_left; + else if (offset > page->offset) + p = &(*p)->rb_right; + else + return page; + } + + rb_link_node(node, parent, p); + + return NULL; +} + +static inline struct page * rb_insert_page_cache(struct inode * inode, + unsigned long offset, + struct rb_node * node) +{ + struct page * ret; + if ((ret = __rb_insert_page_cache(inode, offset, node))) + goto out; + rb_insert_color(node, &inode->i_rb_page_cache); + out: + return ret; +} +----------------------------------------------------------------------- +*/ + +#ifndef _LINUX_RBTREE_H +#define _LINUX_RBTREE_H + +#include <stdlib.h> + +struct rb_node +{ + unsigned long rb_parent_color; +#define RB_RED 0 +#define RB_BLACK 1 + struct rb_node *rb_right; + struct rb_node *rb_left; +}; + +struct rb_root +{ + struct rb_node *rb_node; +}; + +#undef offsetof +#ifdef __compiler_offsetof +#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER) +#else +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~3)) +#define rb_color(r) ((r)->rb_parent_color & 1) +#define rb_is_red(r) (!rb_color(r)) +#define rb_is_black(r) rb_color(r) +#define rb_set_red(r) do { (r)->rb_parent_color &= ~1; } while (0) +#define rb_set_black(r) do { (r)->rb_parent_color |= 1; } while (0) + +static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p) +{ + rb->rb_parent_color = (rb->rb_parent_color & 3) | (unsigned long)p; +} +static inline void rb_set_color(struct rb_node *rb, int color) +{ + rb->rb_parent_color = (rb->rb_parent_color & ~1) | color; +} + +#define RB_ROOT (struct rb_root) { NULL, } +#define rb_entry(ptr, type, member) container_of(ptr, type, member) + +extern void rb_insert_color(struct rb_node *, struct rb_root *); +extern void rb_erase(struct rb_node *, struct rb_root *); + +/* Find logical next and previous nodes in a tree */ +extern struct rb_node *rb_next(struct rb_node *); +extern struct rb_node *rb_prev(struct rb_node *); +extern struct rb_node *rb_first(struct rb_root *); +extern struct rb_node *rb_last(struct rb_root *); + +/* Fast replacement of a single node without remove/rebalance/add/rebalance */ +extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, + struct rb_root *root); + +static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, + struct rb_node ** rb_link) +{ + node->rb_parent_color = (unsigned long )parent; + node->rb_left = node->rb_right = NULL; + + *rb_link = node; +} + +#endif /* _LINUX_RBTREE_H */ @@ -0,0 +1,155 @@ +/* + * Copyright IBM Corp. 2008 + * + * Author(s): Martin Peschke <mp3@de.ibm.com> + * Stefan Raspl <stefan.raspl@de.ibm.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef STATS_H +#define STATS_H + +#include <linux/types.h> +#include "blktrace.h" + +struct minmax { + __u64 min; + __u64 max; + __u64 sum; + __u64 sos; + __u64 num; +}; + +static inline void minmax_init(struct minmax *mm) +{ + mm->min = -1ULL; + mm->max = 0; + mm->sum = 0; + mm->sos = 0; + mm->num = 0; +} + +static inline void minmax_account(struct minmax *mm, __u64 value) +{ + mm->sum += value; + mm->sos += value * value; + if (value < mm->min) + mm->min = value; + if (value > mm->max) + mm->max = value; + mm->num++; +} + +static inline void minmax_merge(struct minmax *dst, struct minmax *src) +{ + dst->sum += src->sum; + dst->sos += src->sos; + if (src->min < dst->min) + dst->min = src->min; + if (src->max > dst->max) + dst->max = src->max; + dst->num += src->num; +} + +static inline void minmax_to_be(struct minmax *mm) +{ + mm->sum = cpu_to_be64(mm->sum); + mm->sos = cpu_to_be64(mm->sos); + mm->min = cpu_to_be64(mm->min); + mm->max = cpu_to_be64(mm->max); + mm->num = cpu_to_be64(mm->num); +} + +static inline double minmax_avg(struct minmax *mm) +{ + return (mm->sum / (double)mm->num); +} + +static inline double minmax_var(struct minmax *mm) +{ + double num = (double)mm->num; + + return ((mm->sos - ((mm->sum * mm->sum) / num)) / num); +} + +static inline int minmax_print(FILE *fp, const char *s, struct minmax *mm) +{ + return fprintf(fp, "%s: num %Ld, min %Ld, max %Ld, sum %Ld, squ %Ld, " + "avg %.1f, var %.1f\n", s, (unsigned long long)mm->num, + (unsigned long long)mm->min, (unsigned long long)mm->max, + (unsigned long long)mm->sum, (unsigned long long)mm->sos, + minmax_avg(mm), minmax_var(mm)); +} + +struct histlog2 { + int first; + int delta; + int num; +}; + +static inline __u64 histlog2_upper_limit(int index, struct histlog2 *h) +{ + return h->first + (index ? h->delta << (index - 1) : 0); +} + +static inline int histlog2_index(__u64 val, struct histlog2 *h) +{ + int i; + + for (i = 0; i < (h->num - 1) && val > histlog2_upper_limit(i, h); i++); + return i; +} + +static inline void histlog2_account(__u32 *bucket, __u32 val, + struct histlog2 *h) +{ + int index = histlog2_index(val, h); + bucket[index]++; +} + +static inline void histlog2_merge(struct histlog2 *h, __u32 *dst, __u32 *src) +{ + int i; + + for (i = 0; i < h->num; i++) + dst[i] += src[i]; +} + +static inline void histlog2_to_be(__u32 a[], struct histlog2 *h) +{ + int i; + + for (i = 0; i < h->num; i++) + a[i] = cpu_to_be32(a[i]); +} + +static inline void histlog2_print(FILE *fp, const char *s, __u32 a[], + struct histlog2 *h) +{ + int i; + + fprintf(fp, "%s:\n", s); + for (i = 0; i < h->num - 1; i++) { + fprintf(fp, " %10ld:%6d", + (unsigned long)(histlog2_upper_limit(i, h)), a[i]); + if (!((i + 1) % 4)) + fprintf(fp, "\n"); + } + fprintf(fp, " >%8ld:%6d\n", + (unsigned long)(histlog2_upper_limit(i - 1, h)), a[i]); +} + +#endif diff --git a/strverscmp.c b/strverscmp.c new file mode 100644 index 0000000..bd0147b --- /dev/null +++ b/strverscmp.c @@ -0,0 +1,156 @@ +/* Compare strings while treating digits characters numerically.
+ Copyright (C) 1997, 2002, 2005 Free Software Foundation, Inc.
+ This file is part of the libiberty library.
+ Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
+
+ Libiberty is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ Libiberty is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#include <ctype.h>
+
+/*
+@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2})
+The @code{strverscmp} function compares the string @var{s1} against
+@var{s2}, considering them as holding indices/version numbers. Return
+value follows the same conventions as found in the @code{strverscmp}
+function. In fact, if @var{s1} and @var{s2} contain no digits,
+@code{strverscmp} behaves like @code{strcmp}.
+
+Basically, we compare strings normally (character by character), until
+we find a digit in each string - then we enter a special comparison
+mode, where each sequence of digits is taken as a whole. If we reach the
+end of these two parts without noticing a difference, we return to the
+standard comparison mode. There are two types of numeric parts:
+"integral" and "fractional" (those begin with a '0'). The types
+of the numeric parts affect the way we sort them:
+
+@itemize @bullet
+@item
+integral/integral: we compare values as you would expect.
+
+@item
+fractional/integral: the fractional part is less than the integral one.
+Again, no surprise.
+
+@item
+fractional/fractional: the things become a bit more complex.
+If the common prefix contains only leading zeroes, the longest part is less
+than the other one; else the comparison behaves normally.
+@end itemize
+
+@smallexample
+strverscmp ("no digit", "no digit")
+ @result{} 0 // @r{same behavior as strcmp.}
+strverscmp ("item#99", "item#100")
+ @result{} <0 // @r{same prefix, but 99 < 100.}
+strverscmp ("alpha1", "alpha001")
+ @result{} >0 // @r{fractional part inferior to integral one.}
+strverscmp ("part1_f012", "part1_f01")
+ @result{} >0 // @r{two fractional parts.}
+strverscmp ("foo.009", "foo.0")
+ @result{} <0 // @r{idem, but with leading zeroes only.}
+@end smallexample
+
+This function is especially useful when dealing with filename sorting,
+because filenames frequently hold indices/version numbers.
+@end deftypefun
+
+*/
+
+/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
+ fractional parts, S_Z: idem but with leading Zeroes only */
+#define S_N 0x0
+#define S_I 0x4
+#define S_F 0x8
+#define S_Z 0xC
+
+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
+#define CMP 2
+#define LEN 3
+
+
+/* Compare S1 and S2 as strings holding indices/version numbers,
+ returning less than, equal to or greater than zero if S1 is less than,
+ equal to or greater than S2 (for more info, see the Glibc texinfo doc). */
+
+int
+strverscmp (const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+ int state;
+ int diff;
+
+ /* Symbol(s) 0 [1-9] others (padding)
+ Transition (10) 0 (01) d (00) x (11) - */
+ static const unsigned int next_state[] =
+ {
+ /* state x d 0 - */
+ /* S_N */ S_N, S_I, S_Z, S_N,
+ /* S_I */ S_N, S_I, S_I, S_I,
+ /* S_F */ S_N, S_F, S_F, S_F,
+ /* S_Z */ S_N, S_F, S_Z, S_Z
+ };
+
+ static const int result_type[] =
+ {
+ /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
+ 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
+
+ /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP,
+ +1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
+ /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP,
+ -1, CMP, CMP, CMP
+ };
+
+ if (p1 == p2)
+ return 0;
+
+ c1 = *p1++;
+ c2 = *p2++;
+ /* Hint: '0' is a digit too. */
+ state = S_N | ((c1 == '0') + (isdigit (c1) != 0));
+
+ while ((diff = c1 - c2) == 0 && c1 != '\0')
+ {
+ state = next_state[state];
+ c1 = *p1++;
+ c2 = *p2++;
+ state |= (c1 == '0') + (isdigit (c1) != 0);
+ }
+
+ state = result_type[state << 2 | (((c2 == '0') + (isdigit (c2) != 0)))];
+
+ switch (state)
+ {
+ case CMP:
+ return diff;
+
+ case LEN:
+ while (isdigit (*p1++))
+ if (!isdigit (*p2++))
+ return 1;
+
+ return isdigit (*p2) ? -1 : diff;
+
+ default:
+ return state;
+ }
+}
diff --git a/verify_blkparse.c b/verify_blkparse.c new file mode 100644 index 0000000..aae8d7c --- /dev/null +++ b/verify_blkparse.c @@ -0,0 +1,66 @@ +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> + +#define MAX_CPUS (512) + +int main(int argc, char *argv[]) +{ + double this_time, last_time; + char line[256], last_line[256], *p; + int major, minor, cpu, nr, alias; + unsigned long long total_entries; + unsigned int last_seq[MAX_CPUS], seq; + FILE *f; + + for (nr = 0; nr < MAX_CPUS; nr++) + last_seq[nr] = -1; + + if (argc < 2) { + fprintf(stderr, "%s: file\n", argv[0]); + return 1; + } + + f = fopen(argv[1], "r"); + if (!f) { + perror("fopen"); + return 1; + } + + last_time = 0; + alias = nr = 0; + total_entries = 0; + while ((p = fgets(line, sizeof(line), f)) != NULL) { + if (sscanf(p, "%3d,%3d %2d %8d %lf", &major, &minor, &cpu, &seq, &this_time) != 5) + break; + + if (this_time < last_time) { + fprintf(stdout, "last: %s", last_line); + fprintf(stdout, "this: %s", p); + nr++; + } + + last_time = this_time; + + if (cpu >= MAX_CPUS) { + fprintf(stderr, "cpu%d too large\n", cpu); + break; + } + + if (last_seq[cpu] == seq) { + fprintf(stdout, "alias on sequence %u\n", seq); + alias++; + } + + last_seq[cpu] = seq; + total_entries++; + strcpy(last_line, line); + } + + fprintf(stdout, "Events %Lu: %d unordered, %d aliases\n", total_entries, nr, alias); + fclose(f); + + return nr != 0; +} |